github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/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 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueS390X(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValueS390X_OpAdd16_0(v) 20 case OpAdd32: 21 return rewriteValueS390X_OpAdd32_0(v) 22 case OpAdd32F: 23 return rewriteValueS390X_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValueS390X_OpAdd64_0(v) 26 case OpAdd64F: 27 return rewriteValueS390X_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValueS390X_OpAdd8_0(v) 30 case OpAddPtr: 31 return rewriteValueS390X_OpAddPtr_0(v) 32 case OpAddr: 33 return rewriteValueS390X_OpAddr_0(v) 34 case OpAnd16: 35 return rewriteValueS390X_OpAnd16_0(v) 36 case OpAnd32: 37 return rewriteValueS390X_OpAnd32_0(v) 38 case OpAnd64: 39 return rewriteValueS390X_OpAnd64_0(v) 40 case OpAnd8: 41 return rewriteValueS390X_OpAnd8_0(v) 42 case OpAndB: 43 return rewriteValueS390X_OpAndB_0(v) 44 case OpAtomicAdd32: 45 return rewriteValueS390X_OpAtomicAdd32_0(v) 46 case OpAtomicAdd64: 47 return rewriteValueS390X_OpAtomicAdd64_0(v) 48 case OpAtomicCompareAndSwap32: 49 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 50 case OpAtomicCompareAndSwap64: 51 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 52 case OpAtomicExchange32: 53 return rewriteValueS390X_OpAtomicExchange32_0(v) 54 case OpAtomicExchange64: 55 return rewriteValueS390X_OpAtomicExchange64_0(v) 56 case OpAtomicLoad32: 57 return rewriteValueS390X_OpAtomicLoad32_0(v) 58 case OpAtomicLoad64: 59 return rewriteValueS390X_OpAtomicLoad64_0(v) 60 case OpAtomicLoadPtr: 61 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 62 case OpAtomicStore32: 63 return rewriteValueS390X_OpAtomicStore32_0(v) 64 case OpAtomicStore64: 65 return rewriteValueS390X_OpAtomicStore64_0(v) 66 case OpAtomicStorePtrNoWB: 67 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 68 case OpAvg64u: 69 return rewriteValueS390X_OpAvg64u_0(v) 70 case OpBitLen64: 71 return rewriteValueS390X_OpBitLen64_0(v) 72 case OpBswap32: 73 return rewriteValueS390X_OpBswap32_0(v) 74 case OpBswap64: 75 return rewriteValueS390X_OpBswap64_0(v) 76 case OpCeil: 77 return rewriteValueS390X_OpCeil_0(v) 78 case OpClosureCall: 79 return rewriteValueS390X_OpClosureCall_0(v) 80 case OpCom16: 81 return rewriteValueS390X_OpCom16_0(v) 82 case OpCom32: 83 return rewriteValueS390X_OpCom32_0(v) 84 case OpCom64: 85 return rewriteValueS390X_OpCom64_0(v) 86 case OpCom8: 87 return rewriteValueS390X_OpCom8_0(v) 88 case OpConst16: 89 return rewriteValueS390X_OpConst16_0(v) 90 case OpConst32: 91 return rewriteValueS390X_OpConst32_0(v) 92 case OpConst32F: 93 return rewriteValueS390X_OpConst32F_0(v) 94 case OpConst64: 95 return rewriteValueS390X_OpConst64_0(v) 96 case OpConst64F: 97 return rewriteValueS390X_OpConst64F_0(v) 98 case OpConst8: 99 return rewriteValueS390X_OpConst8_0(v) 100 case OpConstBool: 101 return rewriteValueS390X_OpConstBool_0(v) 102 case OpConstNil: 103 return rewriteValueS390X_OpConstNil_0(v) 104 case OpCtz32: 105 return rewriteValueS390X_OpCtz32_0(v) 106 case OpCtz32NonZero: 107 return rewriteValueS390X_OpCtz32NonZero_0(v) 108 case OpCtz64: 109 return rewriteValueS390X_OpCtz64_0(v) 110 case OpCtz64NonZero: 111 return rewriteValueS390X_OpCtz64NonZero_0(v) 112 case OpCvt32Fto32: 113 return rewriteValueS390X_OpCvt32Fto32_0(v) 114 case OpCvt32Fto64: 115 return rewriteValueS390X_OpCvt32Fto64_0(v) 116 case OpCvt32Fto64F: 117 return rewriteValueS390X_OpCvt32Fto64F_0(v) 118 case OpCvt32to32F: 119 return rewriteValueS390X_OpCvt32to32F_0(v) 120 case OpCvt32to64F: 121 return rewriteValueS390X_OpCvt32to64F_0(v) 122 case OpCvt64Fto32: 123 return rewriteValueS390X_OpCvt64Fto32_0(v) 124 case OpCvt64Fto32F: 125 return rewriteValueS390X_OpCvt64Fto32F_0(v) 126 case OpCvt64Fto64: 127 return rewriteValueS390X_OpCvt64Fto64_0(v) 128 case OpCvt64to32F: 129 return rewriteValueS390X_OpCvt64to32F_0(v) 130 case OpCvt64to64F: 131 return rewriteValueS390X_OpCvt64to64F_0(v) 132 case OpDiv16: 133 return rewriteValueS390X_OpDiv16_0(v) 134 case OpDiv16u: 135 return rewriteValueS390X_OpDiv16u_0(v) 136 case OpDiv32: 137 return rewriteValueS390X_OpDiv32_0(v) 138 case OpDiv32F: 139 return rewriteValueS390X_OpDiv32F_0(v) 140 case OpDiv32u: 141 return rewriteValueS390X_OpDiv32u_0(v) 142 case OpDiv64: 143 return rewriteValueS390X_OpDiv64_0(v) 144 case OpDiv64F: 145 return rewriteValueS390X_OpDiv64F_0(v) 146 case OpDiv64u: 147 return rewriteValueS390X_OpDiv64u_0(v) 148 case OpDiv8: 149 return rewriteValueS390X_OpDiv8_0(v) 150 case OpDiv8u: 151 return rewriteValueS390X_OpDiv8u_0(v) 152 case OpEq16: 153 return rewriteValueS390X_OpEq16_0(v) 154 case OpEq32: 155 return rewriteValueS390X_OpEq32_0(v) 156 case OpEq32F: 157 return rewriteValueS390X_OpEq32F_0(v) 158 case OpEq64: 159 return rewriteValueS390X_OpEq64_0(v) 160 case OpEq64F: 161 return rewriteValueS390X_OpEq64F_0(v) 162 case OpEq8: 163 return rewriteValueS390X_OpEq8_0(v) 164 case OpEqB: 165 return rewriteValueS390X_OpEqB_0(v) 166 case OpEqPtr: 167 return rewriteValueS390X_OpEqPtr_0(v) 168 case OpFloor: 169 return rewriteValueS390X_OpFloor_0(v) 170 case OpGeq16: 171 return rewriteValueS390X_OpGeq16_0(v) 172 case OpGeq16U: 173 return rewriteValueS390X_OpGeq16U_0(v) 174 case OpGeq32: 175 return rewriteValueS390X_OpGeq32_0(v) 176 case OpGeq32F: 177 return rewriteValueS390X_OpGeq32F_0(v) 178 case OpGeq32U: 179 return rewriteValueS390X_OpGeq32U_0(v) 180 case OpGeq64: 181 return rewriteValueS390X_OpGeq64_0(v) 182 case OpGeq64F: 183 return rewriteValueS390X_OpGeq64F_0(v) 184 case OpGeq64U: 185 return rewriteValueS390X_OpGeq64U_0(v) 186 case OpGeq8: 187 return rewriteValueS390X_OpGeq8_0(v) 188 case OpGeq8U: 189 return rewriteValueS390X_OpGeq8U_0(v) 190 case OpGetCallerPC: 191 return rewriteValueS390X_OpGetCallerPC_0(v) 192 case OpGetCallerSP: 193 return rewriteValueS390X_OpGetCallerSP_0(v) 194 case OpGetClosurePtr: 195 return rewriteValueS390X_OpGetClosurePtr_0(v) 196 case OpGetG: 197 return rewriteValueS390X_OpGetG_0(v) 198 case OpGreater16: 199 return rewriteValueS390X_OpGreater16_0(v) 200 case OpGreater16U: 201 return rewriteValueS390X_OpGreater16U_0(v) 202 case OpGreater32: 203 return rewriteValueS390X_OpGreater32_0(v) 204 case OpGreater32F: 205 return rewriteValueS390X_OpGreater32F_0(v) 206 case OpGreater32U: 207 return rewriteValueS390X_OpGreater32U_0(v) 208 case OpGreater64: 209 return rewriteValueS390X_OpGreater64_0(v) 210 case OpGreater64F: 211 return rewriteValueS390X_OpGreater64F_0(v) 212 case OpGreater64U: 213 return rewriteValueS390X_OpGreater64U_0(v) 214 case OpGreater8: 215 return rewriteValueS390X_OpGreater8_0(v) 216 case OpGreater8U: 217 return rewriteValueS390X_OpGreater8U_0(v) 218 case OpHmul32: 219 return rewriteValueS390X_OpHmul32_0(v) 220 case OpHmul32u: 221 return rewriteValueS390X_OpHmul32u_0(v) 222 case OpHmul64: 223 return rewriteValueS390X_OpHmul64_0(v) 224 case OpHmul64u: 225 return rewriteValueS390X_OpHmul64u_0(v) 226 case OpITab: 227 return rewriteValueS390X_OpITab_0(v) 228 case OpInterCall: 229 return rewriteValueS390X_OpInterCall_0(v) 230 case OpIsInBounds: 231 return rewriteValueS390X_OpIsInBounds_0(v) 232 case OpIsNonNil: 233 return rewriteValueS390X_OpIsNonNil_0(v) 234 case OpIsSliceInBounds: 235 return rewriteValueS390X_OpIsSliceInBounds_0(v) 236 case OpLeq16: 237 return rewriteValueS390X_OpLeq16_0(v) 238 case OpLeq16U: 239 return rewriteValueS390X_OpLeq16U_0(v) 240 case OpLeq32: 241 return rewriteValueS390X_OpLeq32_0(v) 242 case OpLeq32F: 243 return rewriteValueS390X_OpLeq32F_0(v) 244 case OpLeq32U: 245 return rewriteValueS390X_OpLeq32U_0(v) 246 case OpLeq64: 247 return rewriteValueS390X_OpLeq64_0(v) 248 case OpLeq64F: 249 return rewriteValueS390X_OpLeq64F_0(v) 250 case OpLeq64U: 251 return rewriteValueS390X_OpLeq64U_0(v) 252 case OpLeq8: 253 return rewriteValueS390X_OpLeq8_0(v) 254 case OpLeq8U: 255 return rewriteValueS390X_OpLeq8U_0(v) 256 case OpLess16: 257 return rewriteValueS390X_OpLess16_0(v) 258 case OpLess16U: 259 return rewriteValueS390X_OpLess16U_0(v) 260 case OpLess32: 261 return rewriteValueS390X_OpLess32_0(v) 262 case OpLess32F: 263 return rewriteValueS390X_OpLess32F_0(v) 264 case OpLess32U: 265 return rewriteValueS390X_OpLess32U_0(v) 266 case OpLess64: 267 return rewriteValueS390X_OpLess64_0(v) 268 case OpLess64F: 269 return rewriteValueS390X_OpLess64F_0(v) 270 case OpLess64U: 271 return rewriteValueS390X_OpLess64U_0(v) 272 case OpLess8: 273 return rewriteValueS390X_OpLess8_0(v) 274 case OpLess8U: 275 return rewriteValueS390X_OpLess8U_0(v) 276 case OpLoad: 277 return rewriteValueS390X_OpLoad_0(v) 278 case OpLocalAddr: 279 return rewriteValueS390X_OpLocalAddr_0(v) 280 case OpLsh16x16: 281 return rewriteValueS390X_OpLsh16x16_0(v) 282 case OpLsh16x32: 283 return rewriteValueS390X_OpLsh16x32_0(v) 284 case OpLsh16x64: 285 return rewriteValueS390X_OpLsh16x64_0(v) 286 case OpLsh16x8: 287 return rewriteValueS390X_OpLsh16x8_0(v) 288 case OpLsh32x16: 289 return rewriteValueS390X_OpLsh32x16_0(v) 290 case OpLsh32x32: 291 return rewriteValueS390X_OpLsh32x32_0(v) 292 case OpLsh32x64: 293 return rewriteValueS390X_OpLsh32x64_0(v) 294 case OpLsh32x8: 295 return rewriteValueS390X_OpLsh32x8_0(v) 296 case OpLsh64x16: 297 return rewriteValueS390X_OpLsh64x16_0(v) 298 case OpLsh64x32: 299 return rewriteValueS390X_OpLsh64x32_0(v) 300 case OpLsh64x64: 301 return rewriteValueS390X_OpLsh64x64_0(v) 302 case OpLsh64x8: 303 return rewriteValueS390X_OpLsh64x8_0(v) 304 case OpLsh8x16: 305 return rewriteValueS390X_OpLsh8x16_0(v) 306 case OpLsh8x32: 307 return rewriteValueS390X_OpLsh8x32_0(v) 308 case OpLsh8x64: 309 return rewriteValueS390X_OpLsh8x64_0(v) 310 case OpLsh8x8: 311 return rewriteValueS390X_OpLsh8x8_0(v) 312 case OpMod16: 313 return rewriteValueS390X_OpMod16_0(v) 314 case OpMod16u: 315 return rewriteValueS390X_OpMod16u_0(v) 316 case OpMod32: 317 return rewriteValueS390X_OpMod32_0(v) 318 case OpMod32u: 319 return rewriteValueS390X_OpMod32u_0(v) 320 case OpMod64: 321 return rewriteValueS390X_OpMod64_0(v) 322 case OpMod64u: 323 return rewriteValueS390X_OpMod64u_0(v) 324 case OpMod8: 325 return rewriteValueS390X_OpMod8_0(v) 326 case OpMod8u: 327 return rewriteValueS390X_OpMod8u_0(v) 328 case OpMove: 329 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 330 case OpMul16: 331 return rewriteValueS390X_OpMul16_0(v) 332 case OpMul32: 333 return rewriteValueS390X_OpMul32_0(v) 334 case OpMul32F: 335 return rewriteValueS390X_OpMul32F_0(v) 336 case OpMul64: 337 return rewriteValueS390X_OpMul64_0(v) 338 case OpMul64F: 339 return rewriteValueS390X_OpMul64F_0(v) 340 case OpMul8: 341 return rewriteValueS390X_OpMul8_0(v) 342 case OpNeg16: 343 return rewriteValueS390X_OpNeg16_0(v) 344 case OpNeg32: 345 return rewriteValueS390X_OpNeg32_0(v) 346 case OpNeg32F: 347 return rewriteValueS390X_OpNeg32F_0(v) 348 case OpNeg64: 349 return rewriteValueS390X_OpNeg64_0(v) 350 case OpNeg64F: 351 return rewriteValueS390X_OpNeg64F_0(v) 352 case OpNeg8: 353 return rewriteValueS390X_OpNeg8_0(v) 354 case OpNeq16: 355 return rewriteValueS390X_OpNeq16_0(v) 356 case OpNeq32: 357 return rewriteValueS390X_OpNeq32_0(v) 358 case OpNeq32F: 359 return rewriteValueS390X_OpNeq32F_0(v) 360 case OpNeq64: 361 return rewriteValueS390X_OpNeq64_0(v) 362 case OpNeq64F: 363 return rewriteValueS390X_OpNeq64F_0(v) 364 case OpNeq8: 365 return rewriteValueS390X_OpNeq8_0(v) 366 case OpNeqB: 367 return rewriteValueS390X_OpNeqB_0(v) 368 case OpNeqPtr: 369 return rewriteValueS390X_OpNeqPtr_0(v) 370 case OpNilCheck: 371 return rewriteValueS390X_OpNilCheck_0(v) 372 case OpNot: 373 return rewriteValueS390X_OpNot_0(v) 374 case OpOffPtr: 375 return rewriteValueS390X_OpOffPtr_0(v) 376 case OpOr16: 377 return rewriteValueS390X_OpOr16_0(v) 378 case OpOr32: 379 return rewriteValueS390X_OpOr32_0(v) 380 case OpOr64: 381 return rewriteValueS390X_OpOr64_0(v) 382 case OpOr8: 383 return rewriteValueS390X_OpOr8_0(v) 384 case OpOrB: 385 return rewriteValueS390X_OpOrB_0(v) 386 case OpPopCount16: 387 return rewriteValueS390X_OpPopCount16_0(v) 388 case OpPopCount32: 389 return rewriteValueS390X_OpPopCount32_0(v) 390 case OpPopCount64: 391 return rewriteValueS390X_OpPopCount64_0(v) 392 case OpPopCount8: 393 return rewriteValueS390X_OpPopCount8_0(v) 394 case OpRotateLeft32: 395 return rewriteValueS390X_OpRotateLeft32_0(v) 396 case OpRotateLeft64: 397 return rewriteValueS390X_OpRotateLeft64_0(v) 398 case OpRound: 399 return rewriteValueS390X_OpRound_0(v) 400 case OpRound32F: 401 return rewriteValueS390X_OpRound32F_0(v) 402 case OpRound64F: 403 return rewriteValueS390X_OpRound64F_0(v) 404 case OpRoundToEven: 405 return rewriteValueS390X_OpRoundToEven_0(v) 406 case OpRsh16Ux16: 407 return rewriteValueS390X_OpRsh16Ux16_0(v) 408 case OpRsh16Ux32: 409 return rewriteValueS390X_OpRsh16Ux32_0(v) 410 case OpRsh16Ux64: 411 return rewriteValueS390X_OpRsh16Ux64_0(v) 412 case OpRsh16Ux8: 413 return rewriteValueS390X_OpRsh16Ux8_0(v) 414 case OpRsh16x16: 415 return rewriteValueS390X_OpRsh16x16_0(v) 416 case OpRsh16x32: 417 return rewriteValueS390X_OpRsh16x32_0(v) 418 case OpRsh16x64: 419 return rewriteValueS390X_OpRsh16x64_0(v) 420 case OpRsh16x8: 421 return rewriteValueS390X_OpRsh16x8_0(v) 422 case OpRsh32Ux16: 423 return rewriteValueS390X_OpRsh32Ux16_0(v) 424 case OpRsh32Ux32: 425 return rewriteValueS390X_OpRsh32Ux32_0(v) 426 case OpRsh32Ux64: 427 return rewriteValueS390X_OpRsh32Ux64_0(v) 428 case OpRsh32Ux8: 429 return rewriteValueS390X_OpRsh32Ux8_0(v) 430 case OpRsh32x16: 431 return rewriteValueS390X_OpRsh32x16_0(v) 432 case OpRsh32x32: 433 return rewriteValueS390X_OpRsh32x32_0(v) 434 case OpRsh32x64: 435 return rewriteValueS390X_OpRsh32x64_0(v) 436 case OpRsh32x8: 437 return rewriteValueS390X_OpRsh32x8_0(v) 438 case OpRsh64Ux16: 439 return rewriteValueS390X_OpRsh64Ux16_0(v) 440 case OpRsh64Ux32: 441 return rewriteValueS390X_OpRsh64Ux32_0(v) 442 case OpRsh64Ux64: 443 return rewriteValueS390X_OpRsh64Ux64_0(v) 444 case OpRsh64Ux8: 445 return rewriteValueS390X_OpRsh64Ux8_0(v) 446 case OpRsh64x16: 447 return rewriteValueS390X_OpRsh64x16_0(v) 448 case OpRsh64x32: 449 return rewriteValueS390X_OpRsh64x32_0(v) 450 case OpRsh64x64: 451 return rewriteValueS390X_OpRsh64x64_0(v) 452 case OpRsh64x8: 453 return rewriteValueS390X_OpRsh64x8_0(v) 454 case OpRsh8Ux16: 455 return rewriteValueS390X_OpRsh8Ux16_0(v) 456 case OpRsh8Ux32: 457 return rewriteValueS390X_OpRsh8Ux32_0(v) 458 case OpRsh8Ux64: 459 return rewriteValueS390X_OpRsh8Ux64_0(v) 460 case OpRsh8Ux8: 461 return rewriteValueS390X_OpRsh8Ux8_0(v) 462 case OpRsh8x16: 463 return rewriteValueS390X_OpRsh8x16_0(v) 464 case OpRsh8x32: 465 return rewriteValueS390X_OpRsh8x32_0(v) 466 case OpRsh8x64: 467 return rewriteValueS390X_OpRsh8x64_0(v) 468 case OpRsh8x8: 469 return rewriteValueS390X_OpRsh8x8_0(v) 470 case OpS390XADD: 471 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 472 case OpS390XADDW: 473 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 474 case OpS390XADDWconst: 475 return rewriteValueS390X_OpS390XADDWconst_0(v) 476 case OpS390XADDWload: 477 return rewriteValueS390X_OpS390XADDWload_0(v) 478 case OpS390XADDconst: 479 return rewriteValueS390X_OpS390XADDconst_0(v) 480 case OpS390XADDload: 481 return rewriteValueS390X_OpS390XADDload_0(v) 482 case OpS390XAND: 483 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 484 case OpS390XANDW: 485 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 486 case OpS390XANDWconst: 487 return rewriteValueS390X_OpS390XANDWconst_0(v) 488 case OpS390XANDWload: 489 return rewriteValueS390X_OpS390XANDWload_0(v) 490 case OpS390XANDconst: 491 return rewriteValueS390X_OpS390XANDconst_0(v) 492 case OpS390XANDload: 493 return rewriteValueS390X_OpS390XANDload_0(v) 494 case OpS390XCMP: 495 return rewriteValueS390X_OpS390XCMP_0(v) 496 case OpS390XCMPU: 497 return rewriteValueS390X_OpS390XCMPU_0(v) 498 case OpS390XCMPUconst: 499 return rewriteValueS390X_OpS390XCMPUconst_0(v) || rewriteValueS390X_OpS390XCMPUconst_10(v) 500 case OpS390XCMPW: 501 return rewriteValueS390X_OpS390XCMPW_0(v) 502 case OpS390XCMPWU: 503 return rewriteValueS390X_OpS390XCMPWU_0(v) 504 case OpS390XCMPWUconst: 505 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 506 case OpS390XCMPWconst: 507 return rewriteValueS390X_OpS390XCMPWconst_0(v) 508 case OpS390XCMPconst: 509 return rewriteValueS390X_OpS390XCMPconst_0(v) || rewriteValueS390X_OpS390XCMPconst_10(v) 510 case OpS390XCPSDR: 511 return rewriteValueS390X_OpS390XCPSDR_0(v) 512 case OpS390XFADD: 513 return rewriteValueS390X_OpS390XFADD_0(v) 514 case OpS390XFADDS: 515 return rewriteValueS390X_OpS390XFADDS_0(v) 516 case OpS390XFMOVDload: 517 return rewriteValueS390X_OpS390XFMOVDload_0(v) 518 case OpS390XFMOVDloadidx: 519 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 520 case OpS390XFMOVDstore: 521 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 522 case OpS390XFMOVDstoreidx: 523 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 524 case OpS390XFMOVSload: 525 return rewriteValueS390X_OpS390XFMOVSload_0(v) 526 case OpS390XFMOVSloadidx: 527 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 528 case OpS390XFMOVSstore: 529 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 530 case OpS390XFMOVSstoreidx: 531 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 532 case OpS390XFNEG: 533 return rewriteValueS390X_OpS390XFNEG_0(v) 534 case OpS390XFNEGS: 535 return rewriteValueS390X_OpS390XFNEGS_0(v) 536 case OpS390XFSUB: 537 return rewriteValueS390X_OpS390XFSUB_0(v) 538 case OpS390XFSUBS: 539 return rewriteValueS390X_OpS390XFSUBS_0(v) 540 case OpS390XLDGR: 541 return rewriteValueS390X_OpS390XLDGR_0(v) 542 case OpS390XLEDBR: 543 return rewriteValueS390X_OpS390XLEDBR_0(v) 544 case OpS390XLGDR: 545 return rewriteValueS390X_OpS390XLGDR_0(v) 546 case OpS390XLoweredRound32F: 547 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 548 case OpS390XLoweredRound64F: 549 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 550 case OpS390XMOVBZload: 551 return rewriteValueS390X_OpS390XMOVBZload_0(v) 552 case OpS390XMOVBZloadidx: 553 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 554 case OpS390XMOVBZreg: 555 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 556 case OpS390XMOVBload: 557 return rewriteValueS390X_OpS390XMOVBload_0(v) 558 case OpS390XMOVBloadidx: 559 return rewriteValueS390X_OpS390XMOVBloadidx_0(v) 560 case OpS390XMOVBreg: 561 return rewriteValueS390X_OpS390XMOVBreg_0(v) 562 case OpS390XMOVBstore: 563 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 564 case OpS390XMOVBstoreconst: 565 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 566 case OpS390XMOVBstoreidx: 567 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 568 case OpS390XMOVDEQ: 569 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 570 case OpS390XMOVDGE: 571 return rewriteValueS390X_OpS390XMOVDGE_0(v) 572 case OpS390XMOVDGT: 573 return rewriteValueS390X_OpS390XMOVDGT_0(v) 574 case OpS390XMOVDLE: 575 return rewriteValueS390X_OpS390XMOVDLE_0(v) 576 case OpS390XMOVDLT: 577 return rewriteValueS390X_OpS390XMOVDLT_0(v) 578 case OpS390XMOVDNE: 579 return rewriteValueS390X_OpS390XMOVDNE_0(v) 580 case OpS390XMOVDaddridx: 581 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 582 case OpS390XMOVDload: 583 return rewriteValueS390X_OpS390XMOVDload_0(v) 584 case OpS390XMOVDloadidx: 585 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 586 case OpS390XMOVDnop: 587 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 588 case OpS390XMOVDreg: 589 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 590 case OpS390XMOVDstore: 591 return rewriteValueS390X_OpS390XMOVDstore_0(v) 592 case OpS390XMOVDstoreconst: 593 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 594 case OpS390XMOVDstoreidx: 595 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 596 case OpS390XMOVHBRstore: 597 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 598 case OpS390XMOVHBRstoreidx: 599 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 600 case OpS390XMOVHZload: 601 return rewriteValueS390X_OpS390XMOVHZload_0(v) 602 case OpS390XMOVHZloadidx: 603 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 604 case OpS390XMOVHZreg: 605 return rewriteValueS390X_OpS390XMOVHZreg_0(v) || rewriteValueS390X_OpS390XMOVHZreg_10(v) 606 case OpS390XMOVHload: 607 return rewriteValueS390X_OpS390XMOVHload_0(v) 608 case OpS390XMOVHloadidx: 609 return rewriteValueS390X_OpS390XMOVHloadidx_0(v) 610 case OpS390XMOVHreg: 611 return rewriteValueS390X_OpS390XMOVHreg_0(v) || rewriteValueS390X_OpS390XMOVHreg_10(v) 612 case OpS390XMOVHstore: 613 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 614 case OpS390XMOVHstoreconst: 615 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 616 case OpS390XMOVHstoreidx: 617 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 618 case OpS390XMOVWBRstore: 619 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 620 case OpS390XMOVWBRstoreidx: 621 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 622 case OpS390XMOVWZload: 623 return rewriteValueS390X_OpS390XMOVWZload_0(v) 624 case OpS390XMOVWZloadidx: 625 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 626 case OpS390XMOVWZreg: 627 return rewriteValueS390X_OpS390XMOVWZreg_0(v) || rewriteValueS390X_OpS390XMOVWZreg_10(v) 628 case OpS390XMOVWload: 629 return rewriteValueS390X_OpS390XMOVWload_0(v) 630 case OpS390XMOVWloadidx: 631 return rewriteValueS390X_OpS390XMOVWloadidx_0(v) 632 case OpS390XMOVWreg: 633 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 634 case OpS390XMOVWstore: 635 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 636 case OpS390XMOVWstoreconst: 637 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 638 case OpS390XMOVWstoreidx: 639 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 640 case OpS390XMULLD: 641 return rewriteValueS390X_OpS390XMULLD_0(v) 642 case OpS390XMULLDconst: 643 return rewriteValueS390X_OpS390XMULLDconst_0(v) 644 case OpS390XMULLDload: 645 return rewriteValueS390X_OpS390XMULLDload_0(v) 646 case OpS390XMULLW: 647 return rewriteValueS390X_OpS390XMULLW_0(v) 648 case OpS390XMULLWconst: 649 return rewriteValueS390X_OpS390XMULLWconst_0(v) 650 case OpS390XMULLWload: 651 return rewriteValueS390X_OpS390XMULLWload_0(v) 652 case OpS390XNEG: 653 return rewriteValueS390X_OpS390XNEG_0(v) 654 case OpS390XNEGW: 655 return rewriteValueS390X_OpS390XNEGW_0(v) 656 case OpS390XNOT: 657 return rewriteValueS390X_OpS390XNOT_0(v) 658 case OpS390XNOTW: 659 return rewriteValueS390X_OpS390XNOTW_0(v) 660 case OpS390XOR: 661 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) 662 case OpS390XORW: 663 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) 664 case OpS390XORWconst: 665 return rewriteValueS390X_OpS390XORWconst_0(v) 666 case OpS390XORWload: 667 return rewriteValueS390X_OpS390XORWload_0(v) 668 case OpS390XORconst: 669 return rewriteValueS390X_OpS390XORconst_0(v) 670 case OpS390XORload: 671 return rewriteValueS390X_OpS390XORload_0(v) 672 case OpS390XRLL: 673 return rewriteValueS390X_OpS390XRLL_0(v) 674 case OpS390XRLLG: 675 return rewriteValueS390X_OpS390XRLLG_0(v) 676 case OpS390XSLD: 677 return rewriteValueS390X_OpS390XSLD_0(v) || rewriteValueS390X_OpS390XSLD_10(v) 678 case OpS390XSLW: 679 return rewriteValueS390X_OpS390XSLW_0(v) || rewriteValueS390X_OpS390XSLW_10(v) 680 case OpS390XSRAD: 681 return rewriteValueS390X_OpS390XSRAD_0(v) || rewriteValueS390X_OpS390XSRAD_10(v) 682 case OpS390XSRADconst: 683 return rewriteValueS390X_OpS390XSRADconst_0(v) 684 case OpS390XSRAW: 685 return rewriteValueS390X_OpS390XSRAW_0(v) || rewriteValueS390X_OpS390XSRAW_10(v) 686 case OpS390XSRAWconst: 687 return rewriteValueS390X_OpS390XSRAWconst_0(v) 688 case OpS390XSRD: 689 return rewriteValueS390X_OpS390XSRD_0(v) || rewriteValueS390X_OpS390XSRD_10(v) 690 case OpS390XSRDconst: 691 return rewriteValueS390X_OpS390XSRDconst_0(v) 692 case OpS390XSRW: 693 return rewriteValueS390X_OpS390XSRW_0(v) || rewriteValueS390X_OpS390XSRW_10(v) 694 case OpS390XSTM2: 695 return rewriteValueS390X_OpS390XSTM2_0(v) 696 case OpS390XSTMG2: 697 return rewriteValueS390X_OpS390XSTMG2_0(v) 698 case OpS390XSUB: 699 return rewriteValueS390X_OpS390XSUB_0(v) 700 case OpS390XSUBW: 701 return rewriteValueS390X_OpS390XSUBW_0(v) 702 case OpS390XSUBWconst: 703 return rewriteValueS390X_OpS390XSUBWconst_0(v) 704 case OpS390XSUBWload: 705 return rewriteValueS390X_OpS390XSUBWload_0(v) 706 case OpS390XSUBconst: 707 return rewriteValueS390X_OpS390XSUBconst_0(v) 708 case OpS390XSUBload: 709 return rewriteValueS390X_OpS390XSUBload_0(v) 710 case OpS390XSumBytes2: 711 return rewriteValueS390X_OpS390XSumBytes2_0(v) 712 case OpS390XSumBytes4: 713 return rewriteValueS390X_OpS390XSumBytes4_0(v) 714 case OpS390XSumBytes8: 715 return rewriteValueS390X_OpS390XSumBytes8_0(v) 716 case OpS390XXOR: 717 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 718 case OpS390XXORW: 719 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 720 case OpS390XXORWconst: 721 return rewriteValueS390X_OpS390XXORWconst_0(v) 722 case OpS390XXORWload: 723 return rewriteValueS390X_OpS390XXORWload_0(v) 724 case OpS390XXORconst: 725 return rewriteValueS390X_OpS390XXORconst_0(v) 726 case OpS390XXORload: 727 return rewriteValueS390X_OpS390XXORload_0(v) 728 case OpSelect0: 729 return rewriteValueS390X_OpSelect0_0(v) 730 case OpSelect1: 731 return rewriteValueS390X_OpSelect1_0(v) 732 case OpSignExt16to32: 733 return rewriteValueS390X_OpSignExt16to32_0(v) 734 case OpSignExt16to64: 735 return rewriteValueS390X_OpSignExt16to64_0(v) 736 case OpSignExt32to64: 737 return rewriteValueS390X_OpSignExt32to64_0(v) 738 case OpSignExt8to16: 739 return rewriteValueS390X_OpSignExt8to16_0(v) 740 case OpSignExt8to32: 741 return rewriteValueS390X_OpSignExt8to32_0(v) 742 case OpSignExt8to64: 743 return rewriteValueS390X_OpSignExt8to64_0(v) 744 case OpSlicemask: 745 return rewriteValueS390X_OpSlicemask_0(v) 746 case OpSqrt: 747 return rewriteValueS390X_OpSqrt_0(v) 748 case OpStaticCall: 749 return rewriteValueS390X_OpStaticCall_0(v) 750 case OpStore: 751 return rewriteValueS390X_OpStore_0(v) 752 case OpSub16: 753 return rewriteValueS390X_OpSub16_0(v) 754 case OpSub32: 755 return rewriteValueS390X_OpSub32_0(v) 756 case OpSub32F: 757 return rewriteValueS390X_OpSub32F_0(v) 758 case OpSub64: 759 return rewriteValueS390X_OpSub64_0(v) 760 case OpSub64F: 761 return rewriteValueS390X_OpSub64F_0(v) 762 case OpSub8: 763 return rewriteValueS390X_OpSub8_0(v) 764 case OpSubPtr: 765 return rewriteValueS390X_OpSubPtr_0(v) 766 case OpTrunc: 767 return rewriteValueS390X_OpTrunc_0(v) 768 case OpTrunc16to8: 769 return rewriteValueS390X_OpTrunc16to8_0(v) 770 case OpTrunc32to16: 771 return rewriteValueS390X_OpTrunc32to16_0(v) 772 case OpTrunc32to8: 773 return rewriteValueS390X_OpTrunc32to8_0(v) 774 case OpTrunc64to16: 775 return rewriteValueS390X_OpTrunc64to16_0(v) 776 case OpTrunc64to32: 777 return rewriteValueS390X_OpTrunc64to32_0(v) 778 case OpTrunc64to8: 779 return rewriteValueS390X_OpTrunc64to8_0(v) 780 case OpWB: 781 return rewriteValueS390X_OpWB_0(v) 782 case OpXor16: 783 return rewriteValueS390X_OpXor16_0(v) 784 case OpXor32: 785 return rewriteValueS390X_OpXor32_0(v) 786 case OpXor64: 787 return rewriteValueS390X_OpXor64_0(v) 788 case OpXor8: 789 return rewriteValueS390X_OpXor8_0(v) 790 case OpZero: 791 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 792 case OpZeroExt16to32: 793 return rewriteValueS390X_OpZeroExt16to32_0(v) 794 case OpZeroExt16to64: 795 return rewriteValueS390X_OpZeroExt16to64_0(v) 796 case OpZeroExt32to64: 797 return rewriteValueS390X_OpZeroExt32to64_0(v) 798 case OpZeroExt8to16: 799 return rewriteValueS390X_OpZeroExt8to16_0(v) 800 case OpZeroExt8to32: 801 return rewriteValueS390X_OpZeroExt8to32_0(v) 802 case OpZeroExt8to64: 803 return rewriteValueS390X_OpZeroExt8to64_0(v) 804 } 805 return false 806 } 807 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 808 // match: (Add16 x y) 809 // cond: 810 // result: (ADDW x y) 811 for { 812 _ = v.Args[1] 813 x := v.Args[0] 814 y := v.Args[1] 815 v.reset(OpS390XADDW) 816 v.AddArg(x) 817 v.AddArg(y) 818 return true 819 } 820 } 821 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 822 // match: (Add32 x y) 823 // cond: 824 // result: (ADDW x y) 825 for { 826 _ = v.Args[1] 827 x := v.Args[0] 828 y := v.Args[1] 829 v.reset(OpS390XADDW) 830 v.AddArg(x) 831 v.AddArg(y) 832 return true 833 } 834 } 835 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 836 // match: (Add32F x y) 837 // cond: 838 // result: (FADDS x y) 839 for { 840 _ = v.Args[1] 841 x := v.Args[0] 842 y := v.Args[1] 843 v.reset(OpS390XFADDS) 844 v.AddArg(x) 845 v.AddArg(y) 846 return true 847 } 848 } 849 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 850 // match: (Add64 x y) 851 // cond: 852 // result: (ADD x y) 853 for { 854 _ = v.Args[1] 855 x := v.Args[0] 856 y := v.Args[1] 857 v.reset(OpS390XADD) 858 v.AddArg(x) 859 v.AddArg(y) 860 return true 861 } 862 } 863 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 864 // match: (Add64F x y) 865 // cond: 866 // result: (FADD x y) 867 for { 868 _ = v.Args[1] 869 x := v.Args[0] 870 y := v.Args[1] 871 v.reset(OpS390XFADD) 872 v.AddArg(x) 873 v.AddArg(y) 874 return true 875 } 876 } 877 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 878 // match: (Add8 x y) 879 // cond: 880 // result: (ADDW x y) 881 for { 882 _ = v.Args[1] 883 x := v.Args[0] 884 y := v.Args[1] 885 v.reset(OpS390XADDW) 886 v.AddArg(x) 887 v.AddArg(y) 888 return true 889 } 890 } 891 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 892 // match: (AddPtr x y) 893 // cond: 894 // result: (ADD x y) 895 for { 896 _ = v.Args[1] 897 x := v.Args[0] 898 y := v.Args[1] 899 v.reset(OpS390XADD) 900 v.AddArg(x) 901 v.AddArg(y) 902 return true 903 } 904 } 905 func rewriteValueS390X_OpAddr_0(v *Value) bool { 906 // match: (Addr {sym} base) 907 // cond: 908 // result: (MOVDaddr {sym} base) 909 for { 910 sym := v.Aux 911 base := v.Args[0] 912 v.reset(OpS390XMOVDaddr) 913 v.Aux = sym 914 v.AddArg(base) 915 return true 916 } 917 } 918 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 919 // match: (And16 x y) 920 // cond: 921 // result: (ANDW x y) 922 for { 923 _ = v.Args[1] 924 x := v.Args[0] 925 y := v.Args[1] 926 v.reset(OpS390XANDW) 927 v.AddArg(x) 928 v.AddArg(y) 929 return true 930 } 931 } 932 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 933 // match: (And32 x y) 934 // cond: 935 // result: (ANDW x y) 936 for { 937 _ = v.Args[1] 938 x := v.Args[0] 939 y := v.Args[1] 940 v.reset(OpS390XANDW) 941 v.AddArg(x) 942 v.AddArg(y) 943 return true 944 } 945 } 946 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 947 // match: (And64 x y) 948 // cond: 949 // result: (AND x y) 950 for { 951 _ = v.Args[1] 952 x := v.Args[0] 953 y := v.Args[1] 954 v.reset(OpS390XAND) 955 v.AddArg(x) 956 v.AddArg(y) 957 return true 958 } 959 } 960 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 961 // match: (And8 x y) 962 // cond: 963 // result: (ANDW x y) 964 for { 965 _ = v.Args[1] 966 x := v.Args[0] 967 y := v.Args[1] 968 v.reset(OpS390XANDW) 969 v.AddArg(x) 970 v.AddArg(y) 971 return true 972 } 973 } 974 func rewriteValueS390X_OpAndB_0(v *Value) bool { 975 // match: (AndB x y) 976 // cond: 977 // result: (ANDW x y) 978 for { 979 _ = v.Args[1] 980 x := v.Args[0] 981 y := v.Args[1] 982 v.reset(OpS390XANDW) 983 v.AddArg(x) 984 v.AddArg(y) 985 return true 986 } 987 } 988 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 989 b := v.Block 990 _ = b 991 typ := &b.Func.Config.Types 992 _ = typ 993 // match: (AtomicAdd32 ptr val mem) 994 // cond: 995 // result: (AddTupleFirst32 val (LAA ptr val mem)) 996 for { 997 _ = v.Args[2] 998 ptr := v.Args[0] 999 val := v.Args[1] 1000 mem := v.Args[2] 1001 v.reset(OpS390XAddTupleFirst32) 1002 v.AddArg(val) 1003 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 1004 v0.AddArg(ptr) 1005 v0.AddArg(val) 1006 v0.AddArg(mem) 1007 v.AddArg(v0) 1008 return true 1009 } 1010 } 1011 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 1012 b := v.Block 1013 _ = b 1014 typ := &b.Func.Config.Types 1015 _ = typ 1016 // match: (AtomicAdd64 ptr val mem) 1017 // cond: 1018 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 1019 for { 1020 _ = v.Args[2] 1021 ptr := v.Args[0] 1022 val := v.Args[1] 1023 mem := v.Args[2] 1024 v.reset(OpS390XAddTupleFirst64) 1025 v.AddArg(val) 1026 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 1027 v0.AddArg(ptr) 1028 v0.AddArg(val) 1029 v0.AddArg(mem) 1030 v.AddArg(v0) 1031 return true 1032 } 1033 } 1034 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 1035 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 1036 // cond: 1037 // result: (LoweredAtomicCas32 ptr old new_ mem) 1038 for { 1039 _ = v.Args[3] 1040 ptr := v.Args[0] 1041 old := v.Args[1] 1042 new_ := v.Args[2] 1043 mem := v.Args[3] 1044 v.reset(OpS390XLoweredAtomicCas32) 1045 v.AddArg(ptr) 1046 v.AddArg(old) 1047 v.AddArg(new_) 1048 v.AddArg(mem) 1049 return true 1050 } 1051 } 1052 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 1053 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 1054 // cond: 1055 // result: (LoweredAtomicCas64 ptr old new_ mem) 1056 for { 1057 _ = v.Args[3] 1058 ptr := v.Args[0] 1059 old := v.Args[1] 1060 new_ := v.Args[2] 1061 mem := v.Args[3] 1062 v.reset(OpS390XLoweredAtomicCas64) 1063 v.AddArg(ptr) 1064 v.AddArg(old) 1065 v.AddArg(new_) 1066 v.AddArg(mem) 1067 return true 1068 } 1069 } 1070 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 1071 // match: (AtomicExchange32 ptr val mem) 1072 // cond: 1073 // result: (LoweredAtomicExchange32 ptr val mem) 1074 for { 1075 _ = v.Args[2] 1076 ptr := v.Args[0] 1077 val := v.Args[1] 1078 mem := v.Args[2] 1079 v.reset(OpS390XLoweredAtomicExchange32) 1080 v.AddArg(ptr) 1081 v.AddArg(val) 1082 v.AddArg(mem) 1083 return true 1084 } 1085 } 1086 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1087 // match: (AtomicExchange64 ptr val mem) 1088 // cond: 1089 // result: (LoweredAtomicExchange64 ptr val mem) 1090 for { 1091 _ = v.Args[2] 1092 ptr := v.Args[0] 1093 val := v.Args[1] 1094 mem := v.Args[2] 1095 v.reset(OpS390XLoweredAtomicExchange64) 1096 v.AddArg(ptr) 1097 v.AddArg(val) 1098 v.AddArg(mem) 1099 return true 1100 } 1101 } 1102 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1103 // match: (AtomicLoad32 ptr mem) 1104 // cond: 1105 // result: (MOVWZatomicload ptr mem) 1106 for { 1107 _ = v.Args[1] 1108 ptr := v.Args[0] 1109 mem := v.Args[1] 1110 v.reset(OpS390XMOVWZatomicload) 1111 v.AddArg(ptr) 1112 v.AddArg(mem) 1113 return true 1114 } 1115 } 1116 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1117 // match: (AtomicLoad64 ptr mem) 1118 // cond: 1119 // result: (MOVDatomicload ptr mem) 1120 for { 1121 _ = v.Args[1] 1122 ptr := v.Args[0] 1123 mem := v.Args[1] 1124 v.reset(OpS390XMOVDatomicload) 1125 v.AddArg(ptr) 1126 v.AddArg(mem) 1127 return true 1128 } 1129 } 1130 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1131 // match: (AtomicLoadPtr ptr mem) 1132 // cond: 1133 // result: (MOVDatomicload ptr mem) 1134 for { 1135 _ = v.Args[1] 1136 ptr := v.Args[0] 1137 mem := v.Args[1] 1138 v.reset(OpS390XMOVDatomicload) 1139 v.AddArg(ptr) 1140 v.AddArg(mem) 1141 return true 1142 } 1143 } 1144 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1145 // match: (AtomicStore32 ptr val mem) 1146 // cond: 1147 // result: (MOVWatomicstore ptr val mem) 1148 for { 1149 _ = v.Args[2] 1150 ptr := v.Args[0] 1151 val := v.Args[1] 1152 mem := v.Args[2] 1153 v.reset(OpS390XMOVWatomicstore) 1154 v.AddArg(ptr) 1155 v.AddArg(val) 1156 v.AddArg(mem) 1157 return true 1158 } 1159 } 1160 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1161 // match: (AtomicStore64 ptr val mem) 1162 // cond: 1163 // result: (MOVDatomicstore ptr val mem) 1164 for { 1165 _ = v.Args[2] 1166 ptr := v.Args[0] 1167 val := v.Args[1] 1168 mem := v.Args[2] 1169 v.reset(OpS390XMOVDatomicstore) 1170 v.AddArg(ptr) 1171 v.AddArg(val) 1172 v.AddArg(mem) 1173 return true 1174 } 1175 } 1176 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1177 // match: (AtomicStorePtrNoWB ptr val mem) 1178 // cond: 1179 // result: (MOVDatomicstore ptr val mem) 1180 for { 1181 _ = v.Args[2] 1182 ptr := v.Args[0] 1183 val := v.Args[1] 1184 mem := v.Args[2] 1185 v.reset(OpS390XMOVDatomicstore) 1186 v.AddArg(ptr) 1187 v.AddArg(val) 1188 v.AddArg(mem) 1189 return true 1190 } 1191 } 1192 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1193 b := v.Block 1194 _ = b 1195 // match: (Avg64u <t> x y) 1196 // cond: 1197 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1198 for { 1199 t := v.Type 1200 _ = v.Args[1] 1201 x := v.Args[0] 1202 y := v.Args[1] 1203 v.reset(OpS390XADD) 1204 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1205 v0.AuxInt = 1 1206 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1207 v1.AddArg(x) 1208 v1.AddArg(y) 1209 v0.AddArg(v1) 1210 v.AddArg(v0) 1211 v.AddArg(y) 1212 return true 1213 } 1214 } 1215 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1216 b := v.Block 1217 _ = b 1218 typ := &b.Func.Config.Types 1219 _ = typ 1220 // match: (BitLen64 x) 1221 // cond: 1222 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1223 for { 1224 x := v.Args[0] 1225 v.reset(OpS390XSUB) 1226 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1227 v0.AuxInt = 64 1228 v.AddArg(v0) 1229 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1230 v1.AddArg(x) 1231 v.AddArg(v1) 1232 return true 1233 } 1234 } 1235 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1236 // match: (Bswap32 x) 1237 // cond: 1238 // result: (MOVWBR x) 1239 for { 1240 x := v.Args[0] 1241 v.reset(OpS390XMOVWBR) 1242 v.AddArg(x) 1243 return true 1244 } 1245 } 1246 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1247 // match: (Bswap64 x) 1248 // cond: 1249 // result: (MOVDBR x) 1250 for { 1251 x := v.Args[0] 1252 v.reset(OpS390XMOVDBR) 1253 v.AddArg(x) 1254 return true 1255 } 1256 } 1257 func rewriteValueS390X_OpCeil_0(v *Value) bool { 1258 // match: (Ceil x) 1259 // cond: 1260 // result: (FIDBR [6] x) 1261 for { 1262 x := v.Args[0] 1263 v.reset(OpS390XFIDBR) 1264 v.AuxInt = 6 1265 v.AddArg(x) 1266 return true 1267 } 1268 } 1269 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1270 // match: (ClosureCall [argwid] entry closure mem) 1271 // cond: 1272 // result: (CALLclosure [argwid] entry closure mem) 1273 for { 1274 argwid := v.AuxInt 1275 _ = v.Args[2] 1276 entry := v.Args[0] 1277 closure := v.Args[1] 1278 mem := v.Args[2] 1279 v.reset(OpS390XCALLclosure) 1280 v.AuxInt = argwid 1281 v.AddArg(entry) 1282 v.AddArg(closure) 1283 v.AddArg(mem) 1284 return true 1285 } 1286 } 1287 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1288 // match: (Com16 x) 1289 // cond: 1290 // result: (NOTW x) 1291 for { 1292 x := v.Args[0] 1293 v.reset(OpS390XNOTW) 1294 v.AddArg(x) 1295 return true 1296 } 1297 } 1298 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1299 // match: (Com32 x) 1300 // cond: 1301 // result: (NOTW x) 1302 for { 1303 x := v.Args[0] 1304 v.reset(OpS390XNOTW) 1305 v.AddArg(x) 1306 return true 1307 } 1308 } 1309 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1310 // match: (Com64 x) 1311 // cond: 1312 // result: (NOT x) 1313 for { 1314 x := v.Args[0] 1315 v.reset(OpS390XNOT) 1316 v.AddArg(x) 1317 return true 1318 } 1319 } 1320 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1321 // match: (Com8 x) 1322 // cond: 1323 // result: (NOTW x) 1324 for { 1325 x := v.Args[0] 1326 v.reset(OpS390XNOTW) 1327 v.AddArg(x) 1328 return true 1329 } 1330 } 1331 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1332 // match: (Const16 [val]) 1333 // cond: 1334 // result: (MOVDconst [val]) 1335 for { 1336 val := v.AuxInt 1337 v.reset(OpS390XMOVDconst) 1338 v.AuxInt = val 1339 return true 1340 } 1341 } 1342 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1343 // match: (Const32 [val]) 1344 // cond: 1345 // result: (MOVDconst [val]) 1346 for { 1347 val := v.AuxInt 1348 v.reset(OpS390XMOVDconst) 1349 v.AuxInt = val 1350 return true 1351 } 1352 } 1353 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1354 // match: (Const32F [val]) 1355 // cond: 1356 // result: (FMOVSconst [val]) 1357 for { 1358 val := v.AuxInt 1359 v.reset(OpS390XFMOVSconst) 1360 v.AuxInt = val 1361 return true 1362 } 1363 } 1364 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1365 // match: (Const64 [val]) 1366 // cond: 1367 // result: (MOVDconst [val]) 1368 for { 1369 val := v.AuxInt 1370 v.reset(OpS390XMOVDconst) 1371 v.AuxInt = val 1372 return true 1373 } 1374 } 1375 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1376 // match: (Const64F [val]) 1377 // cond: 1378 // result: (FMOVDconst [val]) 1379 for { 1380 val := v.AuxInt 1381 v.reset(OpS390XFMOVDconst) 1382 v.AuxInt = val 1383 return true 1384 } 1385 } 1386 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1387 // match: (Const8 [val]) 1388 // cond: 1389 // result: (MOVDconst [val]) 1390 for { 1391 val := v.AuxInt 1392 v.reset(OpS390XMOVDconst) 1393 v.AuxInt = val 1394 return true 1395 } 1396 } 1397 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1398 // match: (ConstBool [b]) 1399 // cond: 1400 // result: (MOVDconst [b]) 1401 for { 1402 b := v.AuxInt 1403 v.reset(OpS390XMOVDconst) 1404 v.AuxInt = b 1405 return true 1406 } 1407 } 1408 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1409 // match: (ConstNil) 1410 // cond: 1411 // result: (MOVDconst [0]) 1412 for { 1413 v.reset(OpS390XMOVDconst) 1414 v.AuxInt = 0 1415 return true 1416 } 1417 } 1418 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1419 b := v.Block 1420 _ = b 1421 typ := &b.Func.Config.Types 1422 _ = typ 1423 // match: (Ctz32 <t> x) 1424 // cond: 1425 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1426 for { 1427 t := v.Type 1428 x := v.Args[0] 1429 v.reset(OpS390XSUB) 1430 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1431 v0.AuxInt = 64 1432 v.AddArg(v0) 1433 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1434 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1435 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1436 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1437 v4.AuxInt = 1 1438 v4.AddArg(x) 1439 v3.AddArg(v4) 1440 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1441 v5.AddArg(x) 1442 v3.AddArg(v5) 1443 v2.AddArg(v3) 1444 v1.AddArg(v2) 1445 v.AddArg(v1) 1446 return true 1447 } 1448 } 1449 func rewriteValueS390X_OpCtz32NonZero_0(v *Value) bool { 1450 // match: (Ctz32NonZero x) 1451 // cond: 1452 // result: (Ctz32 x) 1453 for { 1454 x := v.Args[0] 1455 v.reset(OpCtz32) 1456 v.AddArg(x) 1457 return true 1458 } 1459 } 1460 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1461 b := v.Block 1462 _ = b 1463 typ := &b.Func.Config.Types 1464 _ = typ 1465 // match: (Ctz64 <t> x) 1466 // cond: 1467 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1468 for { 1469 t := v.Type 1470 x := v.Args[0] 1471 v.reset(OpS390XSUB) 1472 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1473 v0.AuxInt = 64 1474 v.AddArg(v0) 1475 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1476 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1477 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1478 v3.AuxInt = 1 1479 v3.AddArg(x) 1480 v2.AddArg(v3) 1481 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1482 v4.AddArg(x) 1483 v2.AddArg(v4) 1484 v1.AddArg(v2) 1485 v.AddArg(v1) 1486 return true 1487 } 1488 } 1489 func rewriteValueS390X_OpCtz64NonZero_0(v *Value) bool { 1490 // match: (Ctz64NonZero x) 1491 // cond: 1492 // result: (Ctz64 x) 1493 for { 1494 x := v.Args[0] 1495 v.reset(OpCtz64) 1496 v.AddArg(x) 1497 return true 1498 } 1499 } 1500 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1501 // match: (Cvt32Fto32 x) 1502 // cond: 1503 // result: (CFEBRA x) 1504 for { 1505 x := v.Args[0] 1506 v.reset(OpS390XCFEBRA) 1507 v.AddArg(x) 1508 return true 1509 } 1510 } 1511 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1512 // match: (Cvt32Fto64 x) 1513 // cond: 1514 // result: (CGEBRA x) 1515 for { 1516 x := v.Args[0] 1517 v.reset(OpS390XCGEBRA) 1518 v.AddArg(x) 1519 return true 1520 } 1521 } 1522 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1523 // match: (Cvt32Fto64F x) 1524 // cond: 1525 // result: (LDEBR x) 1526 for { 1527 x := v.Args[0] 1528 v.reset(OpS390XLDEBR) 1529 v.AddArg(x) 1530 return true 1531 } 1532 } 1533 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1534 // match: (Cvt32to32F x) 1535 // cond: 1536 // result: (CEFBRA x) 1537 for { 1538 x := v.Args[0] 1539 v.reset(OpS390XCEFBRA) 1540 v.AddArg(x) 1541 return true 1542 } 1543 } 1544 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1545 // match: (Cvt32to64F x) 1546 // cond: 1547 // result: (CDFBRA x) 1548 for { 1549 x := v.Args[0] 1550 v.reset(OpS390XCDFBRA) 1551 v.AddArg(x) 1552 return true 1553 } 1554 } 1555 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1556 // match: (Cvt64Fto32 x) 1557 // cond: 1558 // result: (CFDBRA x) 1559 for { 1560 x := v.Args[0] 1561 v.reset(OpS390XCFDBRA) 1562 v.AddArg(x) 1563 return true 1564 } 1565 } 1566 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1567 // match: (Cvt64Fto32F x) 1568 // cond: 1569 // result: (LEDBR x) 1570 for { 1571 x := v.Args[0] 1572 v.reset(OpS390XLEDBR) 1573 v.AddArg(x) 1574 return true 1575 } 1576 } 1577 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1578 // match: (Cvt64Fto64 x) 1579 // cond: 1580 // result: (CGDBRA x) 1581 for { 1582 x := v.Args[0] 1583 v.reset(OpS390XCGDBRA) 1584 v.AddArg(x) 1585 return true 1586 } 1587 } 1588 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1589 // match: (Cvt64to32F x) 1590 // cond: 1591 // result: (CEGBRA x) 1592 for { 1593 x := v.Args[0] 1594 v.reset(OpS390XCEGBRA) 1595 v.AddArg(x) 1596 return true 1597 } 1598 } 1599 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1600 // match: (Cvt64to64F x) 1601 // cond: 1602 // result: (CDGBRA x) 1603 for { 1604 x := v.Args[0] 1605 v.reset(OpS390XCDGBRA) 1606 v.AddArg(x) 1607 return true 1608 } 1609 } 1610 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1611 b := v.Block 1612 _ = b 1613 typ := &b.Func.Config.Types 1614 _ = typ 1615 // match: (Div16 x y) 1616 // cond: 1617 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1618 for { 1619 _ = v.Args[1] 1620 x := v.Args[0] 1621 y := v.Args[1] 1622 v.reset(OpS390XDIVW) 1623 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1624 v0.AddArg(x) 1625 v.AddArg(v0) 1626 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1627 v1.AddArg(y) 1628 v.AddArg(v1) 1629 return true 1630 } 1631 } 1632 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1633 b := v.Block 1634 _ = b 1635 typ := &b.Func.Config.Types 1636 _ = typ 1637 // match: (Div16u x y) 1638 // cond: 1639 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1640 for { 1641 _ = v.Args[1] 1642 x := v.Args[0] 1643 y := v.Args[1] 1644 v.reset(OpS390XDIVWU) 1645 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1646 v0.AddArg(x) 1647 v.AddArg(v0) 1648 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1649 v1.AddArg(y) 1650 v.AddArg(v1) 1651 return true 1652 } 1653 } 1654 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1655 b := v.Block 1656 _ = b 1657 typ := &b.Func.Config.Types 1658 _ = typ 1659 // match: (Div32 x y) 1660 // cond: 1661 // result: (DIVW (MOVWreg x) y) 1662 for { 1663 _ = v.Args[1] 1664 x := v.Args[0] 1665 y := v.Args[1] 1666 v.reset(OpS390XDIVW) 1667 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1668 v0.AddArg(x) 1669 v.AddArg(v0) 1670 v.AddArg(y) 1671 return true 1672 } 1673 } 1674 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1675 // match: (Div32F x y) 1676 // cond: 1677 // result: (FDIVS x y) 1678 for { 1679 _ = v.Args[1] 1680 x := v.Args[0] 1681 y := v.Args[1] 1682 v.reset(OpS390XFDIVS) 1683 v.AddArg(x) 1684 v.AddArg(y) 1685 return true 1686 } 1687 } 1688 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1689 b := v.Block 1690 _ = b 1691 typ := &b.Func.Config.Types 1692 _ = typ 1693 // match: (Div32u x y) 1694 // cond: 1695 // result: (DIVWU (MOVWZreg x) y) 1696 for { 1697 _ = v.Args[1] 1698 x := v.Args[0] 1699 y := v.Args[1] 1700 v.reset(OpS390XDIVWU) 1701 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1702 v0.AddArg(x) 1703 v.AddArg(v0) 1704 v.AddArg(y) 1705 return true 1706 } 1707 } 1708 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1709 // match: (Div64 x y) 1710 // cond: 1711 // result: (DIVD x y) 1712 for { 1713 _ = v.Args[1] 1714 x := v.Args[0] 1715 y := v.Args[1] 1716 v.reset(OpS390XDIVD) 1717 v.AddArg(x) 1718 v.AddArg(y) 1719 return true 1720 } 1721 } 1722 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1723 // match: (Div64F x y) 1724 // cond: 1725 // result: (FDIV x y) 1726 for { 1727 _ = v.Args[1] 1728 x := v.Args[0] 1729 y := v.Args[1] 1730 v.reset(OpS390XFDIV) 1731 v.AddArg(x) 1732 v.AddArg(y) 1733 return true 1734 } 1735 } 1736 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1737 // match: (Div64u x y) 1738 // cond: 1739 // result: (DIVDU x y) 1740 for { 1741 _ = v.Args[1] 1742 x := v.Args[0] 1743 y := v.Args[1] 1744 v.reset(OpS390XDIVDU) 1745 v.AddArg(x) 1746 v.AddArg(y) 1747 return true 1748 } 1749 } 1750 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1751 b := v.Block 1752 _ = b 1753 typ := &b.Func.Config.Types 1754 _ = typ 1755 // match: (Div8 x y) 1756 // cond: 1757 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1758 for { 1759 _ = v.Args[1] 1760 x := v.Args[0] 1761 y := v.Args[1] 1762 v.reset(OpS390XDIVW) 1763 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1764 v0.AddArg(x) 1765 v.AddArg(v0) 1766 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1767 v1.AddArg(y) 1768 v.AddArg(v1) 1769 return true 1770 } 1771 } 1772 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1773 b := v.Block 1774 _ = b 1775 typ := &b.Func.Config.Types 1776 _ = typ 1777 // match: (Div8u x y) 1778 // cond: 1779 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1780 for { 1781 _ = v.Args[1] 1782 x := v.Args[0] 1783 y := v.Args[1] 1784 v.reset(OpS390XDIVWU) 1785 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1786 v0.AddArg(x) 1787 v.AddArg(v0) 1788 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1789 v1.AddArg(y) 1790 v.AddArg(v1) 1791 return true 1792 } 1793 } 1794 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1795 b := v.Block 1796 _ = b 1797 typ := &b.Func.Config.Types 1798 _ = typ 1799 // match: (Eq16 x y) 1800 // cond: 1801 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 1802 for { 1803 _ = v.Args[1] 1804 x := v.Args[0] 1805 y := v.Args[1] 1806 v.reset(OpS390XMOVDEQ) 1807 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1808 v0.AuxInt = 0 1809 v.AddArg(v0) 1810 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1811 v1.AuxInt = 1 1812 v.AddArg(v1) 1813 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1814 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1815 v3.AddArg(x) 1816 v2.AddArg(v3) 1817 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1818 v4.AddArg(y) 1819 v2.AddArg(v4) 1820 v.AddArg(v2) 1821 return true 1822 } 1823 } 1824 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1825 b := v.Block 1826 _ = b 1827 typ := &b.Func.Config.Types 1828 _ = typ 1829 // match: (Eq32 x y) 1830 // cond: 1831 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1832 for { 1833 _ = v.Args[1] 1834 x := v.Args[0] 1835 y := v.Args[1] 1836 v.reset(OpS390XMOVDEQ) 1837 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1838 v0.AuxInt = 0 1839 v.AddArg(v0) 1840 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1841 v1.AuxInt = 1 1842 v.AddArg(v1) 1843 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1844 v2.AddArg(x) 1845 v2.AddArg(y) 1846 v.AddArg(v2) 1847 return true 1848 } 1849 } 1850 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1851 b := v.Block 1852 _ = b 1853 typ := &b.Func.Config.Types 1854 _ = typ 1855 // match: (Eq32F x y) 1856 // cond: 1857 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1858 for { 1859 _ = v.Args[1] 1860 x := v.Args[0] 1861 y := v.Args[1] 1862 v.reset(OpS390XMOVDEQ) 1863 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1864 v0.AuxInt = 0 1865 v.AddArg(v0) 1866 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1867 v1.AuxInt = 1 1868 v.AddArg(v1) 1869 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1870 v2.AddArg(x) 1871 v2.AddArg(y) 1872 v.AddArg(v2) 1873 return true 1874 } 1875 } 1876 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1877 b := v.Block 1878 _ = b 1879 typ := &b.Func.Config.Types 1880 _ = typ 1881 // match: (Eq64 x y) 1882 // cond: 1883 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1884 for { 1885 _ = v.Args[1] 1886 x := v.Args[0] 1887 y := v.Args[1] 1888 v.reset(OpS390XMOVDEQ) 1889 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1890 v0.AuxInt = 0 1891 v.AddArg(v0) 1892 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1893 v1.AuxInt = 1 1894 v.AddArg(v1) 1895 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1896 v2.AddArg(x) 1897 v2.AddArg(y) 1898 v.AddArg(v2) 1899 return true 1900 } 1901 } 1902 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1903 b := v.Block 1904 _ = b 1905 typ := &b.Func.Config.Types 1906 _ = typ 1907 // match: (Eq64F x y) 1908 // cond: 1909 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1910 for { 1911 _ = v.Args[1] 1912 x := v.Args[0] 1913 y := v.Args[1] 1914 v.reset(OpS390XMOVDEQ) 1915 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1916 v0.AuxInt = 0 1917 v.AddArg(v0) 1918 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1919 v1.AuxInt = 1 1920 v.AddArg(v1) 1921 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1922 v2.AddArg(x) 1923 v2.AddArg(y) 1924 v.AddArg(v2) 1925 return true 1926 } 1927 } 1928 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1929 b := v.Block 1930 _ = b 1931 typ := &b.Func.Config.Types 1932 _ = typ 1933 // match: (Eq8 x y) 1934 // cond: 1935 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 1936 for { 1937 _ = v.Args[1] 1938 x := v.Args[0] 1939 y := v.Args[1] 1940 v.reset(OpS390XMOVDEQ) 1941 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1942 v0.AuxInt = 0 1943 v.AddArg(v0) 1944 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1945 v1.AuxInt = 1 1946 v.AddArg(v1) 1947 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1948 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1949 v3.AddArg(x) 1950 v2.AddArg(v3) 1951 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1952 v4.AddArg(y) 1953 v2.AddArg(v4) 1954 v.AddArg(v2) 1955 return true 1956 } 1957 } 1958 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1959 b := v.Block 1960 _ = b 1961 typ := &b.Func.Config.Types 1962 _ = typ 1963 // match: (EqB x y) 1964 // cond: 1965 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 1966 for { 1967 _ = v.Args[1] 1968 x := v.Args[0] 1969 y := v.Args[1] 1970 v.reset(OpS390XMOVDEQ) 1971 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1972 v0.AuxInt = 0 1973 v.AddArg(v0) 1974 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1975 v1.AuxInt = 1 1976 v.AddArg(v1) 1977 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1978 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1979 v3.AddArg(x) 1980 v2.AddArg(v3) 1981 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1982 v4.AddArg(y) 1983 v2.AddArg(v4) 1984 v.AddArg(v2) 1985 return true 1986 } 1987 } 1988 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1989 b := v.Block 1990 _ = b 1991 typ := &b.Func.Config.Types 1992 _ = typ 1993 // match: (EqPtr x y) 1994 // cond: 1995 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1996 for { 1997 _ = v.Args[1] 1998 x := v.Args[0] 1999 y := v.Args[1] 2000 v.reset(OpS390XMOVDEQ) 2001 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2002 v0.AuxInt = 0 2003 v.AddArg(v0) 2004 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2005 v1.AuxInt = 1 2006 v.AddArg(v1) 2007 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2008 v2.AddArg(x) 2009 v2.AddArg(y) 2010 v.AddArg(v2) 2011 return true 2012 } 2013 } 2014 func rewriteValueS390X_OpFloor_0(v *Value) bool { 2015 // match: (Floor x) 2016 // cond: 2017 // result: (FIDBR [7] x) 2018 for { 2019 x := v.Args[0] 2020 v.reset(OpS390XFIDBR) 2021 v.AuxInt = 7 2022 v.AddArg(x) 2023 return true 2024 } 2025 } 2026 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 2027 b := v.Block 2028 _ = b 2029 typ := &b.Func.Config.Types 2030 _ = typ 2031 // match: (Geq16 x y) 2032 // cond: 2033 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2034 for { 2035 _ = v.Args[1] 2036 x := v.Args[0] 2037 y := v.Args[1] 2038 v.reset(OpS390XMOVDGE) 2039 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2040 v0.AuxInt = 0 2041 v.AddArg(v0) 2042 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2043 v1.AuxInt = 1 2044 v.AddArg(v1) 2045 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2046 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2047 v3.AddArg(x) 2048 v2.AddArg(v3) 2049 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2050 v4.AddArg(y) 2051 v2.AddArg(v4) 2052 v.AddArg(v2) 2053 return true 2054 } 2055 } 2056 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 2057 b := v.Block 2058 _ = b 2059 typ := &b.Func.Config.Types 2060 _ = typ 2061 // match: (Geq16U x y) 2062 // cond: 2063 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2064 for { 2065 _ = v.Args[1] 2066 x := v.Args[0] 2067 y := v.Args[1] 2068 v.reset(OpS390XMOVDGE) 2069 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2070 v0.AuxInt = 0 2071 v.AddArg(v0) 2072 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2073 v1.AuxInt = 1 2074 v.AddArg(v1) 2075 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2076 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2077 v3.AddArg(x) 2078 v2.AddArg(v3) 2079 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2080 v4.AddArg(y) 2081 v2.AddArg(v4) 2082 v.AddArg(v2) 2083 return true 2084 } 2085 } 2086 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 2087 b := v.Block 2088 _ = b 2089 typ := &b.Func.Config.Types 2090 _ = typ 2091 // match: (Geq32 x y) 2092 // cond: 2093 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2094 for { 2095 _ = v.Args[1] 2096 x := v.Args[0] 2097 y := v.Args[1] 2098 v.reset(OpS390XMOVDGE) 2099 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2100 v0.AuxInt = 0 2101 v.AddArg(v0) 2102 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2103 v1.AuxInt = 1 2104 v.AddArg(v1) 2105 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2106 v2.AddArg(x) 2107 v2.AddArg(y) 2108 v.AddArg(v2) 2109 return true 2110 } 2111 } 2112 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2113 b := v.Block 2114 _ = b 2115 typ := &b.Func.Config.Types 2116 _ = typ 2117 // match: (Geq32F x y) 2118 // cond: 2119 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2120 for { 2121 _ = v.Args[1] 2122 x := v.Args[0] 2123 y := v.Args[1] 2124 v.reset(OpS390XMOVDGEnoinv) 2125 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2126 v0.AuxInt = 0 2127 v.AddArg(v0) 2128 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2129 v1.AuxInt = 1 2130 v.AddArg(v1) 2131 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2132 v2.AddArg(x) 2133 v2.AddArg(y) 2134 v.AddArg(v2) 2135 return true 2136 } 2137 } 2138 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2139 b := v.Block 2140 _ = b 2141 typ := &b.Func.Config.Types 2142 _ = typ 2143 // match: (Geq32U x y) 2144 // cond: 2145 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2146 for { 2147 _ = v.Args[1] 2148 x := v.Args[0] 2149 y := v.Args[1] 2150 v.reset(OpS390XMOVDGE) 2151 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2152 v0.AuxInt = 0 2153 v.AddArg(v0) 2154 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2155 v1.AuxInt = 1 2156 v.AddArg(v1) 2157 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2158 v2.AddArg(x) 2159 v2.AddArg(y) 2160 v.AddArg(v2) 2161 return true 2162 } 2163 } 2164 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2165 b := v.Block 2166 _ = b 2167 typ := &b.Func.Config.Types 2168 _ = typ 2169 // match: (Geq64 x y) 2170 // cond: 2171 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2172 for { 2173 _ = v.Args[1] 2174 x := v.Args[0] 2175 y := v.Args[1] 2176 v.reset(OpS390XMOVDGE) 2177 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2178 v0.AuxInt = 0 2179 v.AddArg(v0) 2180 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2181 v1.AuxInt = 1 2182 v.AddArg(v1) 2183 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2184 v2.AddArg(x) 2185 v2.AddArg(y) 2186 v.AddArg(v2) 2187 return true 2188 } 2189 } 2190 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2191 b := v.Block 2192 _ = b 2193 typ := &b.Func.Config.Types 2194 _ = typ 2195 // match: (Geq64F x y) 2196 // cond: 2197 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2198 for { 2199 _ = v.Args[1] 2200 x := v.Args[0] 2201 y := v.Args[1] 2202 v.reset(OpS390XMOVDGEnoinv) 2203 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2204 v0.AuxInt = 0 2205 v.AddArg(v0) 2206 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2207 v1.AuxInt = 1 2208 v.AddArg(v1) 2209 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2210 v2.AddArg(x) 2211 v2.AddArg(y) 2212 v.AddArg(v2) 2213 return true 2214 } 2215 } 2216 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2217 b := v.Block 2218 _ = b 2219 typ := &b.Func.Config.Types 2220 _ = typ 2221 // match: (Geq64U x y) 2222 // cond: 2223 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2224 for { 2225 _ = v.Args[1] 2226 x := v.Args[0] 2227 y := v.Args[1] 2228 v.reset(OpS390XMOVDGE) 2229 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2230 v0.AuxInt = 0 2231 v.AddArg(v0) 2232 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2233 v1.AuxInt = 1 2234 v.AddArg(v1) 2235 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2236 v2.AddArg(x) 2237 v2.AddArg(y) 2238 v.AddArg(v2) 2239 return true 2240 } 2241 } 2242 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2243 b := v.Block 2244 _ = b 2245 typ := &b.Func.Config.Types 2246 _ = typ 2247 // match: (Geq8 x y) 2248 // cond: 2249 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 2250 for { 2251 _ = v.Args[1] 2252 x := v.Args[0] 2253 y := v.Args[1] 2254 v.reset(OpS390XMOVDGE) 2255 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2256 v0.AuxInt = 0 2257 v.AddArg(v0) 2258 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2259 v1.AuxInt = 1 2260 v.AddArg(v1) 2261 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2262 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2263 v3.AddArg(x) 2264 v2.AddArg(v3) 2265 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2266 v4.AddArg(y) 2267 v2.AddArg(v4) 2268 v.AddArg(v2) 2269 return true 2270 } 2271 } 2272 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2273 b := v.Block 2274 _ = b 2275 typ := &b.Func.Config.Types 2276 _ = typ 2277 // match: (Geq8U x y) 2278 // cond: 2279 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 2280 for { 2281 _ = v.Args[1] 2282 x := v.Args[0] 2283 y := v.Args[1] 2284 v.reset(OpS390XMOVDGE) 2285 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2286 v0.AuxInt = 0 2287 v.AddArg(v0) 2288 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2289 v1.AuxInt = 1 2290 v.AddArg(v1) 2291 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2292 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2293 v3.AddArg(x) 2294 v2.AddArg(v3) 2295 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2296 v4.AddArg(y) 2297 v2.AddArg(v4) 2298 v.AddArg(v2) 2299 return true 2300 } 2301 } 2302 func rewriteValueS390X_OpGetCallerPC_0(v *Value) bool { 2303 // match: (GetCallerPC) 2304 // cond: 2305 // result: (LoweredGetCallerPC) 2306 for { 2307 v.reset(OpS390XLoweredGetCallerPC) 2308 return true 2309 } 2310 } 2311 func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool { 2312 // match: (GetCallerSP) 2313 // cond: 2314 // result: (LoweredGetCallerSP) 2315 for { 2316 v.reset(OpS390XLoweredGetCallerSP) 2317 return true 2318 } 2319 } 2320 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2321 // match: (GetClosurePtr) 2322 // cond: 2323 // result: (LoweredGetClosurePtr) 2324 for { 2325 v.reset(OpS390XLoweredGetClosurePtr) 2326 return true 2327 } 2328 } 2329 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2330 // match: (GetG mem) 2331 // cond: 2332 // result: (LoweredGetG mem) 2333 for { 2334 mem := v.Args[0] 2335 v.reset(OpS390XLoweredGetG) 2336 v.AddArg(mem) 2337 return true 2338 } 2339 } 2340 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2341 b := v.Block 2342 _ = b 2343 typ := &b.Func.Config.Types 2344 _ = typ 2345 // match: (Greater16 x y) 2346 // cond: 2347 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2348 for { 2349 _ = v.Args[1] 2350 x := v.Args[0] 2351 y := v.Args[1] 2352 v.reset(OpS390XMOVDGT) 2353 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2354 v0.AuxInt = 0 2355 v.AddArg(v0) 2356 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2357 v1.AuxInt = 1 2358 v.AddArg(v1) 2359 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2360 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2361 v3.AddArg(x) 2362 v2.AddArg(v3) 2363 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2364 v4.AddArg(y) 2365 v2.AddArg(v4) 2366 v.AddArg(v2) 2367 return true 2368 } 2369 } 2370 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2371 b := v.Block 2372 _ = b 2373 typ := &b.Func.Config.Types 2374 _ = typ 2375 // match: (Greater16U x y) 2376 // cond: 2377 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2378 for { 2379 _ = v.Args[1] 2380 x := v.Args[0] 2381 y := v.Args[1] 2382 v.reset(OpS390XMOVDGT) 2383 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2384 v0.AuxInt = 0 2385 v.AddArg(v0) 2386 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2387 v1.AuxInt = 1 2388 v.AddArg(v1) 2389 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2390 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2391 v3.AddArg(x) 2392 v2.AddArg(v3) 2393 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2394 v4.AddArg(y) 2395 v2.AddArg(v4) 2396 v.AddArg(v2) 2397 return true 2398 } 2399 } 2400 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2401 b := v.Block 2402 _ = b 2403 typ := &b.Func.Config.Types 2404 _ = typ 2405 // match: (Greater32 x y) 2406 // cond: 2407 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2408 for { 2409 _ = v.Args[1] 2410 x := v.Args[0] 2411 y := v.Args[1] 2412 v.reset(OpS390XMOVDGT) 2413 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2414 v0.AuxInt = 0 2415 v.AddArg(v0) 2416 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2417 v1.AuxInt = 1 2418 v.AddArg(v1) 2419 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2420 v2.AddArg(x) 2421 v2.AddArg(y) 2422 v.AddArg(v2) 2423 return true 2424 } 2425 } 2426 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2427 b := v.Block 2428 _ = b 2429 typ := &b.Func.Config.Types 2430 _ = typ 2431 // match: (Greater32F x y) 2432 // cond: 2433 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2434 for { 2435 _ = v.Args[1] 2436 x := v.Args[0] 2437 y := v.Args[1] 2438 v.reset(OpS390XMOVDGTnoinv) 2439 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2440 v0.AuxInt = 0 2441 v.AddArg(v0) 2442 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2443 v1.AuxInt = 1 2444 v.AddArg(v1) 2445 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2446 v2.AddArg(x) 2447 v2.AddArg(y) 2448 v.AddArg(v2) 2449 return true 2450 } 2451 } 2452 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2453 b := v.Block 2454 _ = b 2455 typ := &b.Func.Config.Types 2456 _ = typ 2457 // match: (Greater32U x y) 2458 // cond: 2459 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2460 for { 2461 _ = v.Args[1] 2462 x := v.Args[0] 2463 y := v.Args[1] 2464 v.reset(OpS390XMOVDGT) 2465 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2466 v0.AuxInt = 0 2467 v.AddArg(v0) 2468 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2469 v1.AuxInt = 1 2470 v.AddArg(v1) 2471 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2472 v2.AddArg(x) 2473 v2.AddArg(y) 2474 v.AddArg(v2) 2475 return true 2476 } 2477 } 2478 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2479 b := v.Block 2480 _ = b 2481 typ := &b.Func.Config.Types 2482 _ = typ 2483 // match: (Greater64 x y) 2484 // cond: 2485 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2486 for { 2487 _ = v.Args[1] 2488 x := v.Args[0] 2489 y := v.Args[1] 2490 v.reset(OpS390XMOVDGT) 2491 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2492 v0.AuxInt = 0 2493 v.AddArg(v0) 2494 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2495 v1.AuxInt = 1 2496 v.AddArg(v1) 2497 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2498 v2.AddArg(x) 2499 v2.AddArg(y) 2500 v.AddArg(v2) 2501 return true 2502 } 2503 } 2504 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2505 b := v.Block 2506 _ = b 2507 typ := &b.Func.Config.Types 2508 _ = typ 2509 // match: (Greater64F x y) 2510 // cond: 2511 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2512 for { 2513 _ = v.Args[1] 2514 x := v.Args[0] 2515 y := v.Args[1] 2516 v.reset(OpS390XMOVDGTnoinv) 2517 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2518 v0.AuxInt = 0 2519 v.AddArg(v0) 2520 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2521 v1.AuxInt = 1 2522 v.AddArg(v1) 2523 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2524 v2.AddArg(x) 2525 v2.AddArg(y) 2526 v.AddArg(v2) 2527 return true 2528 } 2529 } 2530 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2531 b := v.Block 2532 _ = b 2533 typ := &b.Func.Config.Types 2534 _ = typ 2535 // match: (Greater64U x y) 2536 // cond: 2537 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2538 for { 2539 _ = v.Args[1] 2540 x := v.Args[0] 2541 y := v.Args[1] 2542 v.reset(OpS390XMOVDGT) 2543 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2544 v0.AuxInt = 0 2545 v.AddArg(v0) 2546 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2547 v1.AuxInt = 1 2548 v.AddArg(v1) 2549 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2550 v2.AddArg(x) 2551 v2.AddArg(y) 2552 v.AddArg(v2) 2553 return true 2554 } 2555 } 2556 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2557 b := v.Block 2558 _ = b 2559 typ := &b.Func.Config.Types 2560 _ = typ 2561 // match: (Greater8 x y) 2562 // cond: 2563 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 2564 for { 2565 _ = v.Args[1] 2566 x := v.Args[0] 2567 y := v.Args[1] 2568 v.reset(OpS390XMOVDGT) 2569 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2570 v0.AuxInt = 0 2571 v.AddArg(v0) 2572 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2573 v1.AuxInt = 1 2574 v.AddArg(v1) 2575 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2576 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2577 v3.AddArg(x) 2578 v2.AddArg(v3) 2579 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2580 v4.AddArg(y) 2581 v2.AddArg(v4) 2582 v.AddArg(v2) 2583 return true 2584 } 2585 } 2586 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2587 b := v.Block 2588 _ = b 2589 typ := &b.Func.Config.Types 2590 _ = typ 2591 // match: (Greater8U x y) 2592 // cond: 2593 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 2594 for { 2595 _ = v.Args[1] 2596 x := v.Args[0] 2597 y := v.Args[1] 2598 v.reset(OpS390XMOVDGT) 2599 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2600 v0.AuxInt = 0 2601 v.AddArg(v0) 2602 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2603 v1.AuxInt = 1 2604 v.AddArg(v1) 2605 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2606 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2607 v3.AddArg(x) 2608 v2.AddArg(v3) 2609 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2610 v4.AddArg(y) 2611 v2.AddArg(v4) 2612 v.AddArg(v2) 2613 return true 2614 } 2615 } 2616 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2617 b := v.Block 2618 _ = b 2619 typ := &b.Func.Config.Types 2620 _ = typ 2621 // match: (Hmul32 x y) 2622 // cond: 2623 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2624 for { 2625 _ = v.Args[1] 2626 x := v.Args[0] 2627 y := v.Args[1] 2628 v.reset(OpS390XSRDconst) 2629 v.AuxInt = 32 2630 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2631 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2632 v1.AddArg(x) 2633 v0.AddArg(v1) 2634 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2635 v2.AddArg(y) 2636 v0.AddArg(v2) 2637 v.AddArg(v0) 2638 return true 2639 } 2640 } 2641 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2642 b := v.Block 2643 _ = b 2644 typ := &b.Func.Config.Types 2645 _ = typ 2646 // match: (Hmul32u x y) 2647 // cond: 2648 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2649 for { 2650 _ = v.Args[1] 2651 x := v.Args[0] 2652 y := v.Args[1] 2653 v.reset(OpS390XSRDconst) 2654 v.AuxInt = 32 2655 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2656 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2657 v1.AddArg(x) 2658 v0.AddArg(v1) 2659 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2660 v2.AddArg(y) 2661 v0.AddArg(v2) 2662 v.AddArg(v0) 2663 return true 2664 } 2665 } 2666 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2667 // match: (Hmul64 x y) 2668 // cond: 2669 // result: (MULHD x y) 2670 for { 2671 _ = v.Args[1] 2672 x := v.Args[0] 2673 y := v.Args[1] 2674 v.reset(OpS390XMULHD) 2675 v.AddArg(x) 2676 v.AddArg(y) 2677 return true 2678 } 2679 } 2680 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2681 // match: (Hmul64u x y) 2682 // cond: 2683 // result: (MULHDU x y) 2684 for { 2685 _ = v.Args[1] 2686 x := v.Args[0] 2687 y := v.Args[1] 2688 v.reset(OpS390XMULHDU) 2689 v.AddArg(x) 2690 v.AddArg(y) 2691 return true 2692 } 2693 } 2694 func rewriteValueS390X_OpITab_0(v *Value) bool { 2695 // match: (ITab (Load ptr mem)) 2696 // cond: 2697 // result: (MOVDload ptr mem) 2698 for { 2699 v_0 := v.Args[0] 2700 if v_0.Op != OpLoad { 2701 break 2702 } 2703 _ = v_0.Args[1] 2704 ptr := v_0.Args[0] 2705 mem := v_0.Args[1] 2706 v.reset(OpS390XMOVDload) 2707 v.AddArg(ptr) 2708 v.AddArg(mem) 2709 return true 2710 } 2711 return false 2712 } 2713 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2714 // match: (InterCall [argwid] entry mem) 2715 // cond: 2716 // result: (CALLinter [argwid] entry mem) 2717 for { 2718 argwid := v.AuxInt 2719 _ = v.Args[1] 2720 entry := v.Args[0] 2721 mem := v.Args[1] 2722 v.reset(OpS390XCALLinter) 2723 v.AuxInt = argwid 2724 v.AddArg(entry) 2725 v.AddArg(mem) 2726 return true 2727 } 2728 } 2729 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2730 b := v.Block 2731 _ = b 2732 typ := &b.Func.Config.Types 2733 _ = typ 2734 // match: (IsInBounds idx len) 2735 // cond: 2736 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2737 for { 2738 _ = v.Args[1] 2739 idx := v.Args[0] 2740 len := v.Args[1] 2741 v.reset(OpS390XMOVDLT) 2742 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2743 v0.AuxInt = 0 2744 v.AddArg(v0) 2745 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2746 v1.AuxInt = 1 2747 v.AddArg(v1) 2748 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2749 v2.AddArg(idx) 2750 v2.AddArg(len) 2751 v.AddArg(v2) 2752 return true 2753 } 2754 } 2755 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2756 b := v.Block 2757 _ = b 2758 typ := &b.Func.Config.Types 2759 _ = typ 2760 // match: (IsNonNil p) 2761 // cond: 2762 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2763 for { 2764 p := v.Args[0] 2765 v.reset(OpS390XMOVDNE) 2766 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2767 v0.AuxInt = 0 2768 v.AddArg(v0) 2769 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2770 v1.AuxInt = 1 2771 v.AddArg(v1) 2772 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2773 v2.AuxInt = 0 2774 v2.AddArg(p) 2775 v.AddArg(v2) 2776 return true 2777 } 2778 } 2779 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2780 b := v.Block 2781 _ = b 2782 typ := &b.Func.Config.Types 2783 _ = typ 2784 // match: (IsSliceInBounds idx len) 2785 // cond: 2786 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2787 for { 2788 _ = v.Args[1] 2789 idx := v.Args[0] 2790 len := v.Args[1] 2791 v.reset(OpS390XMOVDLE) 2792 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2793 v0.AuxInt = 0 2794 v.AddArg(v0) 2795 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2796 v1.AuxInt = 1 2797 v.AddArg(v1) 2798 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2799 v2.AddArg(idx) 2800 v2.AddArg(len) 2801 v.AddArg(v2) 2802 return true 2803 } 2804 } 2805 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2806 b := v.Block 2807 _ = b 2808 typ := &b.Func.Config.Types 2809 _ = typ 2810 // match: (Leq16 x y) 2811 // cond: 2812 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2813 for { 2814 _ = v.Args[1] 2815 x := v.Args[0] 2816 y := v.Args[1] 2817 v.reset(OpS390XMOVDLE) 2818 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2819 v0.AuxInt = 0 2820 v.AddArg(v0) 2821 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2822 v1.AuxInt = 1 2823 v.AddArg(v1) 2824 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2825 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2826 v3.AddArg(x) 2827 v2.AddArg(v3) 2828 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2829 v4.AddArg(y) 2830 v2.AddArg(v4) 2831 v.AddArg(v2) 2832 return true 2833 } 2834 } 2835 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2836 b := v.Block 2837 _ = b 2838 typ := &b.Func.Config.Types 2839 _ = typ 2840 // match: (Leq16U x y) 2841 // cond: 2842 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2843 for { 2844 _ = v.Args[1] 2845 x := v.Args[0] 2846 y := v.Args[1] 2847 v.reset(OpS390XMOVDLE) 2848 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2849 v0.AuxInt = 0 2850 v.AddArg(v0) 2851 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2852 v1.AuxInt = 1 2853 v.AddArg(v1) 2854 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2855 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2856 v3.AddArg(x) 2857 v2.AddArg(v3) 2858 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2859 v4.AddArg(y) 2860 v2.AddArg(v4) 2861 v.AddArg(v2) 2862 return true 2863 } 2864 } 2865 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2866 b := v.Block 2867 _ = b 2868 typ := &b.Func.Config.Types 2869 _ = typ 2870 // match: (Leq32 x y) 2871 // cond: 2872 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2873 for { 2874 _ = v.Args[1] 2875 x := v.Args[0] 2876 y := v.Args[1] 2877 v.reset(OpS390XMOVDLE) 2878 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2879 v0.AuxInt = 0 2880 v.AddArg(v0) 2881 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2882 v1.AuxInt = 1 2883 v.AddArg(v1) 2884 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2885 v2.AddArg(x) 2886 v2.AddArg(y) 2887 v.AddArg(v2) 2888 return true 2889 } 2890 } 2891 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2892 b := v.Block 2893 _ = b 2894 typ := &b.Func.Config.Types 2895 _ = typ 2896 // match: (Leq32F x y) 2897 // cond: 2898 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2899 for { 2900 _ = v.Args[1] 2901 x := v.Args[0] 2902 y := v.Args[1] 2903 v.reset(OpS390XMOVDGEnoinv) 2904 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2905 v0.AuxInt = 0 2906 v.AddArg(v0) 2907 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2908 v1.AuxInt = 1 2909 v.AddArg(v1) 2910 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2911 v2.AddArg(y) 2912 v2.AddArg(x) 2913 v.AddArg(v2) 2914 return true 2915 } 2916 } 2917 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2918 b := v.Block 2919 _ = b 2920 typ := &b.Func.Config.Types 2921 _ = typ 2922 // match: (Leq32U x y) 2923 // cond: 2924 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2925 for { 2926 _ = v.Args[1] 2927 x := v.Args[0] 2928 y := v.Args[1] 2929 v.reset(OpS390XMOVDLE) 2930 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2931 v0.AuxInt = 0 2932 v.AddArg(v0) 2933 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2934 v1.AuxInt = 1 2935 v.AddArg(v1) 2936 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2937 v2.AddArg(x) 2938 v2.AddArg(y) 2939 v.AddArg(v2) 2940 return true 2941 } 2942 } 2943 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2944 b := v.Block 2945 _ = b 2946 typ := &b.Func.Config.Types 2947 _ = typ 2948 // match: (Leq64 x y) 2949 // cond: 2950 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2951 for { 2952 _ = v.Args[1] 2953 x := v.Args[0] 2954 y := v.Args[1] 2955 v.reset(OpS390XMOVDLE) 2956 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2957 v0.AuxInt = 0 2958 v.AddArg(v0) 2959 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2960 v1.AuxInt = 1 2961 v.AddArg(v1) 2962 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2963 v2.AddArg(x) 2964 v2.AddArg(y) 2965 v.AddArg(v2) 2966 return true 2967 } 2968 } 2969 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2970 b := v.Block 2971 _ = b 2972 typ := &b.Func.Config.Types 2973 _ = typ 2974 // match: (Leq64F x y) 2975 // cond: 2976 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2977 for { 2978 _ = v.Args[1] 2979 x := v.Args[0] 2980 y := v.Args[1] 2981 v.reset(OpS390XMOVDGEnoinv) 2982 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2983 v0.AuxInt = 0 2984 v.AddArg(v0) 2985 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2986 v1.AuxInt = 1 2987 v.AddArg(v1) 2988 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2989 v2.AddArg(y) 2990 v2.AddArg(x) 2991 v.AddArg(v2) 2992 return true 2993 } 2994 } 2995 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2996 b := v.Block 2997 _ = b 2998 typ := &b.Func.Config.Types 2999 _ = typ 3000 // match: (Leq64U x y) 3001 // cond: 3002 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3003 for { 3004 _ = v.Args[1] 3005 x := v.Args[0] 3006 y := v.Args[1] 3007 v.reset(OpS390XMOVDLE) 3008 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3009 v0.AuxInt = 0 3010 v.AddArg(v0) 3011 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3012 v1.AuxInt = 1 3013 v.AddArg(v1) 3014 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3015 v2.AddArg(x) 3016 v2.AddArg(y) 3017 v.AddArg(v2) 3018 return true 3019 } 3020 } 3021 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 3022 b := v.Block 3023 _ = b 3024 typ := &b.Func.Config.Types 3025 _ = typ 3026 // match: (Leq8 x y) 3027 // cond: 3028 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 3029 for { 3030 _ = v.Args[1] 3031 x := v.Args[0] 3032 y := v.Args[1] 3033 v.reset(OpS390XMOVDLE) 3034 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3035 v0.AuxInt = 0 3036 v.AddArg(v0) 3037 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3038 v1.AuxInt = 1 3039 v.AddArg(v1) 3040 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3041 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3042 v3.AddArg(x) 3043 v2.AddArg(v3) 3044 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3045 v4.AddArg(y) 3046 v2.AddArg(v4) 3047 v.AddArg(v2) 3048 return true 3049 } 3050 } 3051 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 3052 b := v.Block 3053 _ = b 3054 typ := &b.Func.Config.Types 3055 _ = typ 3056 // match: (Leq8U x y) 3057 // cond: 3058 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 3059 for { 3060 _ = v.Args[1] 3061 x := v.Args[0] 3062 y := v.Args[1] 3063 v.reset(OpS390XMOVDLE) 3064 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3065 v0.AuxInt = 0 3066 v.AddArg(v0) 3067 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3068 v1.AuxInt = 1 3069 v.AddArg(v1) 3070 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3071 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3072 v3.AddArg(x) 3073 v2.AddArg(v3) 3074 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3075 v4.AddArg(y) 3076 v2.AddArg(v4) 3077 v.AddArg(v2) 3078 return true 3079 } 3080 } 3081 func rewriteValueS390X_OpLess16_0(v *Value) bool { 3082 b := v.Block 3083 _ = b 3084 typ := &b.Func.Config.Types 3085 _ = typ 3086 // match: (Less16 x y) 3087 // cond: 3088 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 3089 for { 3090 _ = v.Args[1] 3091 x := v.Args[0] 3092 y := v.Args[1] 3093 v.reset(OpS390XMOVDLT) 3094 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3095 v0.AuxInt = 0 3096 v.AddArg(v0) 3097 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3098 v1.AuxInt = 1 3099 v.AddArg(v1) 3100 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3101 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3102 v3.AddArg(x) 3103 v2.AddArg(v3) 3104 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3105 v4.AddArg(y) 3106 v2.AddArg(v4) 3107 v.AddArg(v2) 3108 return true 3109 } 3110 } 3111 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 3112 b := v.Block 3113 _ = b 3114 typ := &b.Func.Config.Types 3115 _ = typ 3116 // match: (Less16U x y) 3117 // cond: 3118 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 3119 for { 3120 _ = v.Args[1] 3121 x := v.Args[0] 3122 y := v.Args[1] 3123 v.reset(OpS390XMOVDLT) 3124 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3125 v0.AuxInt = 0 3126 v.AddArg(v0) 3127 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3128 v1.AuxInt = 1 3129 v.AddArg(v1) 3130 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3131 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3132 v3.AddArg(x) 3133 v2.AddArg(v3) 3134 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3135 v4.AddArg(y) 3136 v2.AddArg(v4) 3137 v.AddArg(v2) 3138 return true 3139 } 3140 } 3141 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3142 b := v.Block 3143 _ = b 3144 typ := &b.Func.Config.Types 3145 _ = typ 3146 // match: (Less32 x y) 3147 // cond: 3148 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3149 for { 3150 _ = v.Args[1] 3151 x := v.Args[0] 3152 y := v.Args[1] 3153 v.reset(OpS390XMOVDLT) 3154 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3155 v0.AuxInt = 0 3156 v.AddArg(v0) 3157 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3158 v1.AuxInt = 1 3159 v.AddArg(v1) 3160 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3161 v2.AddArg(x) 3162 v2.AddArg(y) 3163 v.AddArg(v2) 3164 return true 3165 } 3166 } 3167 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3168 b := v.Block 3169 _ = b 3170 typ := &b.Func.Config.Types 3171 _ = typ 3172 // match: (Less32F x y) 3173 // cond: 3174 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3175 for { 3176 _ = v.Args[1] 3177 x := v.Args[0] 3178 y := v.Args[1] 3179 v.reset(OpS390XMOVDGTnoinv) 3180 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3181 v0.AuxInt = 0 3182 v.AddArg(v0) 3183 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3184 v1.AuxInt = 1 3185 v.AddArg(v1) 3186 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3187 v2.AddArg(y) 3188 v2.AddArg(x) 3189 v.AddArg(v2) 3190 return true 3191 } 3192 } 3193 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3194 b := v.Block 3195 _ = b 3196 typ := &b.Func.Config.Types 3197 _ = typ 3198 // match: (Less32U x y) 3199 // cond: 3200 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3201 for { 3202 _ = v.Args[1] 3203 x := v.Args[0] 3204 y := v.Args[1] 3205 v.reset(OpS390XMOVDLT) 3206 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3207 v0.AuxInt = 0 3208 v.AddArg(v0) 3209 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3210 v1.AuxInt = 1 3211 v.AddArg(v1) 3212 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3213 v2.AddArg(x) 3214 v2.AddArg(y) 3215 v.AddArg(v2) 3216 return true 3217 } 3218 } 3219 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3220 b := v.Block 3221 _ = b 3222 typ := &b.Func.Config.Types 3223 _ = typ 3224 // match: (Less64 x y) 3225 // cond: 3226 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3227 for { 3228 _ = v.Args[1] 3229 x := v.Args[0] 3230 y := v.Args[1] 3231 v.reset(OpS390XMOVDLT) 3232 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3233 v0.AuxInt = 0 3234 v.AddArg(v0) 3235 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3236 v1.AuxInt = 1 3237 v.AddArg(v1) 3238 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3239 v2.AddArg(x) 3240 v2.AddArg(y) 3241 v.AddArg(v2) 3242 return true 3243 } 3244 } 3245 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3246 b := v.Block 3247 _ = b 3248 typ := &b.Func.Config.Types 3249 _ = typ 3250 // match: (Less64F x y) 3251 // cond: 3252 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3253 for { 3254 _ = v.Args[1] 3255 x := v.Args[0] 3256 y := v.Args[1] 3257 v.reset(OpS390XMOVDGTnoinv) 3258 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3259 v0.AuxInt = 0 3260 v.AddArg(v0) 3261 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3262 v1.AuxInt = 1 3263 v.AddArg(v1) 3264 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3265 v2.AddArg(y) 3266 v2.AddArg(x) 3267 v.AddArg(v2) 3268 return true 3269 } 3270 } 3271 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3272 b := v.Block 3273 _ = b 3274 typ := &b.Func.Config.Types 3275 _ = typ 3276 // match: (Less64U x y) 3277 // cond: 3278 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3279 for { 3280 _ = v.Args[1] 3281 x := v.Args[0] 3282 y := v.Args[1] 3283 v.reset(OpS390XMOVDLT) 3284 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3285 v0.AuxInt = 0 3286 v.AddArg(v0) 3287 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3288 v1.AuxInt = 1 3289 v.AddArg(v1) 3290 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3291 v2.AddArg(x) 3292 v2.AddArg(y) 3293 v.AddArg(v2) 3294 return true 3295 } 3296 } 3297 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3298 b := v.Block 3299 _ = b 3300 typ := &b.Func.Config.Types 3301 _ = typ 3302 // match: (Less8 x y) 3303 // cond: 3304 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 3305 for { 3306 _ = v.Args[1] 3307 x := v.Args[0] 3308 y := v.Args[1] 3309 v.reset(OpS390XMOVDLT) 3310 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3311 v0.AuxInt = 0 3312 v.AddArg(v0) 3313 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3314 v1.AuxInt = 1 3315 v.AddArg(v1) 3316 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3317 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3318 v3.AddArg(x) 3319 v2.AddArg(v3) 3320 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3321 v4.AddArg(y) 3322 v2.AddArg(v4) 3323 v.AddArg(v2) 3324 return true 3325 } 3326 } 3327 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3328 b := v.Block 3329 _ = b 3330 typ := &b.Func.Config.Types 3331 _ = typ 3332 // match: (Less8U x y) 3333 // cond: 3334 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 3335 for { 3336 _ = v.Args[1] 3337 x := v.Args[0] 3338 y := v.Args[1] 3339 v.reset(OpS390XMOVDLT) 3340 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3341 v0.AuxInt = 0 3342 v.AddArg(v0) 3343 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3344 v1.AuxInt = 1 3345 v.AddArg(v1) 3346 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3347 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3348 v3.AddArg(x) 3349 v2.AddArg(v3) 3350 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3351 v4.AddArg(y) 3352 v2.AddArg(v4) 3353 v.AddArg(v2) 3354 return true 3355 } 3356 } 3357 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3358 // match: (Load <t> ptr mem) 3359 // cond: (is64BitInt(t) || isPtr(t)) 3360 // result: (MOVDload ptr mem) 3361 for { 3362 t := v.Type 3363 _ = v.Args[1] 3364 ptr := v.Args[0] 3365 mem := v.Args[1] 3366 if !(is64BitInt(t) || isPtr(t)) { 3367 break 3368 } 3369 v.reset(OpS390XMOVDload) 3370 v.AddArg(ptr) 3371 v.AddArg(mem) 3372 return true 3373 } 3374 // match: (Load <t> ptr mem) 3375 // cond: is32BitInt(t) && isSigned(t) 3376 // result: (MOVWload ptr mem) 3377 for { 3378 t := v.Type 3379 _ = v.Args[1] 3380 ptr := v.Args[0] 3381 mem := v.Args[1] 3382 if !(is32BitInt(t) && isSigned(t)) { 3383 break 3384 } 3385 v.reset(OpS390XMOVWload) 3386 v.AddArg(ptr) 3387 v.AddArg(mem) 3388 return true 3389 } 3390 // match: (Load <t> ptr mem) 3391 // cond: is32BitInt(t) && !isSigned(t) 3392 // result: (MOVWZload ptr mem) 3393 for { 3394 t := v.Type 3395 _ = v.Args[1] 3396 ptr := v.Args[0] 3397 mem := v.Args[1] 3398 if !(is32BitInt(t) && !isSigned(t)) { 3399 break 3400 } 3401 v.reset(OpS390XMOVWZload) 3402 v.AddArg(ptr) 3403 v.AddArg(mem) 3404 return true 3405 } 3406 // match: (Load <t> ptr mem) 3407 // cond: is16BitInt(t) && isSigned(t) 3408 // result: (MOVHload ptr mem) 3409 for { 3410 t := v.Type 3411 _ = v.Args[1] 3412 ptr := v.Args[0] 3413 mem := v.Args[1] 3414 if !(is16BitInt(t) && isSigned(t)) { 3415 break 3416 } 3417 v.reset(OpS390XMOVHload) 3418 v.AddArg(ptr) 3419 v.AddArg(mem) 3420 return true 3421 } 3422 // match: (Load <t> ptr mem) 3423 // cond: is16BitInt(t) && !isSigned(t) 3424 // result: (MOVHZload ptr mem) 3425 for { 3426 t := v.Type 3427 _ = v.Args[1] 3428 ptr := v.Args[0] 3429 mem := v.Args[1] 3430 if !(is16BitInt(t) && !isSigned(t)) { 3431 break 3432 } 3433 v.reset(OpS390XMOVHZload) 3434 v.AddArg(ptr) 3435 v.AddArg(mem) 3436 return true 3437 } 3438 // match: (Load <t> ptr mem) 3439 // cond: is8BitInt(t) && isSigned(t) 3440 // result: (MOVBload ptr mem) 3441 for { 3442 t := v.Type 3443 _ = v.Args[1] 3444 ptr := v.Args[0] 3445 mem := v.Args[1] 3446 if !(is8BitInt(t) && isSigned(t)) { 3447 break 3448 } 3449 v.reset(OpS390XMOVBload) 3450 v.AddArg(ptr) 3451 v.AddArg(mem) 3452 return true 3453 } 3454 // match: (Load <t> ptr mem) 3455 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3456 // result: (MOVBZload ptr mem) 3457 for { 3458 t := v.Type 3459 _ = v.Args[1] 3460 ptr := v.Args[0] 3461 mem := v.Args[1] 3462 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3463 break 3464 } 3465 v.reset(OpS390XMOVBZload) 3466 v.AddArg(ptr) 3467 v.AddArg(mem) 3468 return true 3469 } 3470 // match: (Load <t> ptr mem) 3471 // cond: is32BitFloat(t) 3472 // result: (FMOVSload ptr mem) 3473 for { 3474 t := v.Type 3475 _ = v.Args[1] 3476 ptr := v.Args[0] 3477 mem := v.Args[1] 3478 if !(is32BitFloat(t)) { 3479 break 3480 } 3481 v.reset(OpS390XFMOVSload) 3482 v.AddArg(ptr) 3483 v.AddArg(mem) 3484 return true 3485 } 3486 // match: (Load <t> ptr mem) 3487 // cond: is64BitFloat(t) 3488 // result: (FMOVDload ptr mem) 3489 for { 3490 t := v.Type 3491 _ = v.Args[1] 3492 ptr := v.Args[0] 3493 mem := v.Args[1] 3494 if !(is64BitFloat(t)) { 3495 break 3496 } 3497 v.reset(OpS390XFMOVDload) 3498 v.AddArg(ptr) 3499 v.AddArg(mem) 3500 return true 3501 } 3502 return false 3503 } 3504 func rewriteValueS390X_OpLocalAddr_0(v *Value) bool { 3505 // match: (LocalAddr {sym} base _) 3506 // cond: 3507 // result: (MOVDaddr {sym} base) 3508 for { 3509 sym := v.Aux 3510 _ = v.Args[1] 3511 base := v.Args[0] 3512 v.reset(OpS390XMOVDaddr) 3513 v.Aux = sym 3514 v.AddArg(base) 3515 return true 3516 } 3517 } 3518 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3519 b := v.Block 3520 _ = b 3521 typ := &b.Func.Config.Types 3522 _ = typ 3523 // match: (Lsh16x16 x y) 3524 // cond: shiftIsBounded(v) 3525 // result: (SLW x y) 3526 for { 3527 _ = v.Args[1] 3528 x := v.Args[0] 3529 y := v.Args[1] 3530 if !(shiftIsBounded(v)) { 3531 break 3532 } 3533 v.reset(OpS390XSLW) 3534 v.AddArg(x) 3535 v.AddArg(y) 3536 return true 3537 } 3538 // match: (Lsh16x16 <t> x y) 3539 // cond: 3540 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3541 for { 3542 t := v.Type 3543 _ = v.Args[1] 3544 x := v.Args[0] 3545 y := v.Args[1] 3546 v.reset(OpS390XMOVDGE) 3547 v.Type = t 3548 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3549 v0.AddArg(x) 3550 v0.AddArg(y) 3551 v.AddArg(v0) 3552 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3553 v1.AuxInt = 0 3554 v.AddArg(v1) 3555 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3556 v2.AuxInt = 64 3557 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3558 v3.AddArg(y) 3559 v2.AddArg(v3) 3560 v.AddArg(v2) 3561 return true 3562 } 3563 } 3564 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3565 b := v.Block 3566 _ = b 3567 typ := &b.Func.Config.Types 3568 _ = typ 3569 // match: (Lsh16x32 x y) 3570 // cond: shiftIsBounded(v) 3571 // result: (SLW x y) 3572 for { 3573 _ = v.Args[1] 3574 x := v.Args[0] 3575 y := v.Args[1] 3576 if !(shiftIsBounded(v)) { 3577 break 3578 } 3579 v.reset(OpS390XSLW) 3580 v.AddArg(x) 3581 v.AddArg(y) 3582 return true 3583 } 3584 // match: (Lsh16x32 <t> x y) 3585 // cond: 3586 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3587 for { 3588 t := v.Type 3589 _ = v.Args[1] 3590 x := v.Args[0] 3591 y := v.Args[1] 3592 v.reset(OpS390XMOVDGE) 3593 v.Type = t 3594 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3595 v0.AddArg(x) 3596 v0.AddArg(y) 3597 v.AddArg(v0) 3598 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3599 v1.AuxInt = 0 3600 v.AddArg(v1) 3601 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3602 v2.AuxInt = 64 3603 v2.AddArg(y) 3604 v.AddArg(v2) 3605 return true 3606 } 3607 } 3608 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3609 b := v.Block 3610 _ = b 3611 typ := &b.Func.Config.Types 3612 _ = typ 3613 // match: (Lsh16x64 x y) 3614 // cond: shiftIsBounded(v) 3615 // result: (SLW x y) 3616 for { 3617 _ = v.Args[1] 3618 x := v.Args[0] 3619 y := v.Args[1] 3620 if !(shiftIsBounded(v)) { 3621 break 3622 } 3623 v.reset(OpS390XSLW) 3624 v.AddArg(x) 3625 v.AddArg(y) 3626 return true 3627 } 3628 // match: (Lsh16x64 <t> x y) 3629 // cond: 3630 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3631 for { 3632 t := v.Type 3633 _ = v.Args[1] 3634 x := v.Args[0] 3635 y := v.Args[1] 3636 v.reset(OpS390XMOVDGE) 3637 v.Type = t 3638 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3639 v0.AddArg(x) 3640 v0.AddArg(y) 3641 v.AddArg(v0) 3642 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3643 v1.AuxInt = 0 3644 v.AddArg(v1) 3645 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3646 v2.AuxInt = 64 3647 v2.AddArg(y) 3648 v.AddArg(v2) 3649 return true 3650 } 3651 } 3652 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3653 b := v.Block 3654 _ = b 3655 typ := &b.Func.Config.Types 3656 _ = typ 3657 // match: (Lsh16x8 x y) 3658 // cond: shiftIsBounded(v) 3659 // result: (SLW x y) 3660 for { 3661 _ = v.Args[1] 3662 x := v.Args[0] 3663 y := v.Args[1] 3664 if !(shiftIsBounded(v)) { 3665 break 3666 } 3667 v.reset(OpS390XSLW) 3668 v.AddArg(x) 3669 v.AddArg(y) 3670 return true 3671 } 3672 // match: (Lsh16x8 <t> x y) 3673 // cond: 3674 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 3675 for { 3676 t := v.Type 3677 _ = v.Args[1] 3678 x := v.Args[0] 3679 y := v.Args[1] 3680 v.reset(OpS390XMOVDGE) 3681 v.Type = t 3682 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3683 v0.AddArg(x) 3684 v0.AddArg(y) 3685 v.AddArg(v0) 3686 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3687 v1.AuxInt = 0 3688 v.AddArg(v1) 3689 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3690 v2.AuxInt = 64 3691 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3692 v3.AddArg(y) 3693 v2.AddArg(v3) 3694 v.AddArg(v2) 3695 return true 3696 } 3697 } 3698 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3699 b := v.Block 3700 _ = b 3701 typ := &b.Func.Config.Types 3702 _ = typ 3703 // match: (Lsh32x16 x y) 3704 // cond: shiftIsBounded(v) 3705 // result: (SLW x y) 3706 for { 3707 _ = v.Args[1] 3708 x := v.Args[0] 3709 y := v.Args[1] 3710 if !(shiftIsBounded(v)) { 3711 break 3712 } 3713 v.reset(OpS390XSLW) 3714 v.AddArg(x) 3715 v.AddArg(y) 3716 return true 3717 } 3718 // match: (Lsh32x16 <t> x y) 3719 // cond: 3720 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3721 for { 3722 t := v.Type 3723 _ = v.Args[1] 3724 x := v.Args[0] 3725 y := v.Args[1] 3726 v.reset(OpS390XMOVDGE) 3727 v.Type = t 3728 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3729 v0.AddArg(x) 3730 v0.AddArg(y) 3731 v.AddArg(v0) 3732 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3733 v1.AuxInt = 0 3734 v.AddArg(v1) 3735 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3736 v2.AuxInt = 64 3737 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3738 v3.AddArg(y) 3739 v2.AddArg(v3) 3740 v.AddArg(v2) 3741 return true 3742 } 3743 } 3744 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3745 b := v.Block 3746 _ = b 3747 typ := &b.Func.Config.Types 3748 _ = typ 3749 // match: (Lsh32x32 x y) 3750 // cond: shiftIsBounded(v) 3751 // result: (SLW x y) 3752 for { 3753 _ = v.Args[1] 3754 x := v.Args[0] 3755 y := v.Args[1] 3756 if !(shiftIsBounded(v)) { 3757 break 3758 } 3759 v.reset(OpS390XSLW) 3760 v.AddArg(x) 3761 v.AddArg(y) 3762 return true 3763 } 3764 // match: (Lsh32x32 <t> x y) 3765 // cond: 3766 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3767 for { 3768 t := v.Type 3769 _ = v.Args[1] 3770 x := v.Args[0] 3771 y := v.Args[1] 3772 v.reset(OpS390XMOVDGE) 3773 v.Type = t 3774 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3775 v0.AddArg(x) 3776 v0.AddArg(y) 3777 v.AddArg(v0) 3778 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3779 v1.AuxInt = 0 3780 v.AddArg(v1) 3781 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3782 v2.AuxInt = 64 3783 v2.AddArg(y) 3784 v.AddArg(v2) 3785 return true 3786 } 3787 } 3788 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3789 b := v.Block 3790 _ = b 3791 typ := &b.Func.Config.Types 3792 _ = typ 3793 // match: (Lsh32x64 x y) 3794 // cond: shiftIsBounded(v) 3795 // result: (SLW x y) 3796 for { 3797 _ = v.Args[1] 3798 x := v.Args[0] 3799 y := v.Args[1] 3800 if !(shiftIsBounded(v)) { 3801 break 3802 } 3803 v.reset(OpS390XSLW) 3804 v.AddArg(x) 3805 v.AddArg(y) 3806 return true 3807 } 3808 // match: (Lsh32x64 <t> x y) 3809 // cond: 3810 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3811 for { 3812 t := v.Type 3813 _ = v.Args[1] 3814 x := v.Args[0] 3815 y := v.Args[1] 3816 v.reset(OpS390XMOVDGE) 3817 v.Type = t 3818 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3819 v0.AddArg(x) 3820 v0.AddArg(y) 3821 v.AddArg(v0) 3822 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3823 v1.AuxInt = 0 3824 v.AddArg(v1) 3825 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3826 v2.AuxInt = 64 3827 v2.AddArg(y) 3828 v.AddArg(v2) 3829 return true 3830 } 3831 } 3832 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3833 b := v.Block 3834 _ = b 3835 typ := &b.Func.Config.Types 3836 _ = typ 3837 // match: (Lsh32x8 x y) 3838 // cond: shiftIsBounded(v) 3839 // result: (SLW x y) 3840 for { 3841 _ = v.Args[1] 3842 x := v.Args[0] 3843 y := v.Args[1] 3844 if !(shiftIsBounded(v)) { 3845 break 3846 } 3847 v.reset(OpS390XSLW) 3848 v.AddArg(x) 3849 v.AddArg(y) 3850 return true 3851 } 3852 // match: (Lsh32x8 <t> x y) 3853 // cond: 3854 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 3855 for { 3856 t := v.Type 3857 _ = v.Args[1] 3858 x := v.Args[0] 3859 y := v.Args[1] 3860 v.reset(OpS390XMOVDGE) 3861 v.Type = t 3862 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3863 v0.AddArg(x) 3864 v0.AddArg(y) 3865 v.AddArg(v0) 3866 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3867 v1.AuxInt = 0 3868 v.AddArg(v1) 3869 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3870 v2.AuxInt = 64 3871 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3872 v3.AddArg(y) 3873 v2.AddArg(v3) 3874 v.AddArg(v2) 3875 return true 3876 } 3877 } 3878 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3879 b := v.Block 3880 _ = b 3881 typ := &b.Func.Config.Types 3882 _ = typ 3883 // match: (Lsh64x16 x y) 3884 // cond: shiftIsBounded(v) 3885 // result: (SLD x y) 3886 for { 3887 _ = v.Args[1] 3888 x := v.Args[0] 3889 y := v.Args[1] 3890 if !(shiftIsBounded(v)) { 3891 break 3892 } 3893 v.reset(OpS390XSLD) 3894 v.AddArg(x) 3895 v.AddArg(y) 3896 return true 3897 } 3898 // match: (Lsh64x16 <t> x y) 3899 // cond: 3900 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3901 for { 3902 t := v.Type 3903 _ = v.Args[1] 3904 x := v.Args[0] 3905 y := v.Args[1] 3906 v.reset(OpS390XMOVDGE) 3907 v.Type = t 3908 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3909 v0.AddArg(x) 3910 v0.AddArg(y) 3911 v.AddArg(v0) 3912 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3913 v1.AuxInt = 0 3914 v.AddArg(v1) 3915 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3916 v2.AuxInt = 64 3917 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3918 v3.AddArg(y) 3919 v2.AddArg(v3) 3920 v.AddArg(v2) 3921 return true 3922 } 3923 } 3924 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3925 b := v.Block 3926 _ = b 3927 typ := &b.Func.Config.Types 3928 _ = typ 3929 // match: (Lsh64x32 x y) 3930 // cond: shiftIsBounded(v) 3931 // result: (SLD x y) 3932 for { 3933 _ = v.Args[1] 3934 x := v.Args[0] 3935 y := v.Args[1] 3936 if !(shiftIsBounded(v)) { 3937 break 3938 } 3939 v.reset(OpS390XSLD) 3940 v.AddArg(x) 3941 v.AddArg(y) 3942 return true 3943 } 3944 // match: (Lsh64x32 <t> x y) 3945 // cond: 3946 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3947 for { 3948 t := v.Type 3949 _ = v.Args[1] 3950 x := v.Args[0] 3951 y := v.Args[1] 3952 v.reset(OpS390XMOVDGE) 3953 v.Type = t 3954 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3955 v0.AddArg(x) 3956 v0.AddArg(y) 3957 v.AddArg(v0) 3958 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3959 v1.AuxInt = 0 3960 v.AddArg(v1) 3961 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3962 v2.AuxInt = 64 3963 v2.AddArg(y) 3964 v.AddArg(v2) 3965 return true 3966 } 3967 } 3968 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3969 b := v.Block 3970 _ = b 3971 typ := &b.Func.Config.Types 3972 _ = typ 3973 // match: (Lsh64x64 x y) 3974 // cond: shiftIsBounded(v) 3975 // result: (SLD x y) 3976 for { 3977 _ = v.Args[1] 3978 x := v.Args[0] 3979 y := v.Args[1] 3980 if !(shiftIsBounded(v)) { 3981 break 3982 } 3983 v.reset(OpS390XSLD) 3984 v.AddArg(x) 3985 v.AddArg(y) 3986 return true 3987 } 3988 // match: (Lsh64x64 <t> x y) 3989 // cond: 3990 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3991 for { 3992 t := v.Type 3993 _ = v.Args[1] 3994 x := v.Args[0] 3995 y := v.Args[1] 3996 v.reset(OpS390XMOVDGE) 3997 v.Type = t 3998 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3999 v0.AddArg(x) 4000 v0.AddArg(y) 4001 v.AddArg(v0) 4002 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4003 v1.AuxInt = 0 4004 v.AddArg(v1) 4005 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 4006 v2.AuxInt = 64 4007 v2.AddArg(y) 4008 v.AddArg(v2) 4009 return true 4010 } 4011 } 4012 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 4013 b := v.Block 4014 _ = b 4015 typ := &b.Func.Config.Types 4016 _ = typ 4017 // match: (Lsh64x8 x y) 4018 // cond: shiftIsBounded(v) 4019 // result: (SLD x y) 4020 for { 4021 _ = v.Args[1] 4022 x := v.Args[0] 4023 y := v.Args[1] 4024 if !(shiftIsBounded(v)) { 4025 break 4026 } 4027 v.reset(OpS390XSLD) 4028 v.AddArg(x) 4029 v.AddArg(y) 4030 return true 4031 } 4032 // match: (Lsh64x8 <t> x y) 4033 // cond: 4034 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 4035 for { 4036 t := v.Type 4037 _ = v.Args[1] 4038 x := v.Args[0] 4039 y := v.Args[1] 4040 v.reset(OpS390XMOVDGE) 4041 v.Type = t 4042 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 4043 v0.AddArg(x) 4044 v0.AddArg(y) 4045 v.AddArg(v0) 4046 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4047 v1.AuxInt = 0 4048 v.AddArg(v1) 4049 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4050 v2.AuxInt = 64 4051 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4052 v3.AddArg(y) 4053 v2.AddArg(v3) 4054 v.AddArg(v2) 4055 return true 4056 } 4057 } 4058 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 4059 b := v.Block 4060 _ = b 4061 typ := &b.Func.Config.Types 4062 _ = typ 4063 // match: (Lsh8x16 x y) 4064 // cond: shiftIsBounded(v) 4065 // result: (SLW x y) 4066 for { 4067 _ = v.Args[1] 4068 x := v.Args[0] 4069 y := v.Args[1] 4070 if !(shiftIsBounded(v)) { 4071 break 4072 } 4073 v.reset(OpS390XSLW) 4074 v.AddArg(x) 4075 v.AddArg(y) 4076 return true 4077 } 4078 // match: (Lsh8x16 <t> x y) 4079 // cond: 4080 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 4081 for { 4082 t := v.Type 4083 _ = v.Args[1] 4084 x := v.Args[0] 4085 y := v.Args[1] 4086 v.reset(OpS390XMOVDGE) 4087 v.Type = t 4088 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4089 v0.AddArg(x) 4090 v0.AddArg(y) 4091 v.AddArg(v0) 4092 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4093 v1.AuxInt = 0 4094 v.AddArg(v1) 4095 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4096 v2.AuxInt = 64 4097 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4098 v3.AddArg(y) 4099 v2.AddArg(v3) 4100 v.AddArg(v2) 4101 return true 4102 } 4103 } 4104 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 4105 b := v.Block 4106 _ = b 4107 typ := &b.Func.Config.Types 4108 _ = typ 4109 // match: (Lsh8x32 x y) 4110 // cond: shiftIsBounded(v) 4111 // result: (SLW x y) 4112 for { 4113 _ = v.Args[1] 4114 x := v.Args[0] 4115 y := v.Args[1] 4116 if !(shiftIsBounded(v)) { 4117 break 4118 } 4119 v.reset(OpS390XSLW) 4120 v.AddArg(x) 4121 v.AddArg(y) 4122 return true 4123 } 4124 // match: (Lsh8x32 <t> x y) 4125 // cond: 4126 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 4127 for { 4128 t := v.Type 4129 _ = v.Args[1] 4130 x := v.Args[0] 4131 y := v.Args[1] 4132 v.reset(OpS390XMOVDGE) 4133 v.Type = t 4134 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4135 v0.AddArg(x) 4136 v0.AddArg(y) 4137 v.AddArg(v0) 4138 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4139 v1.AuxInt = 0 4140 v.AddArg(v1) 4141 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4142 v2.AuxInt = 64 4143 v2.AddArg(y) 4144 v.AddArg(v2) 4145 return true 4146 } 4147 } 4148 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 4149 b := v.Block 4150 _ = b 4151 typ := &b.Func.Config.Types 4152 _ = typ 4153 // match: (Lsh8x64 x y) 4154 // cond: shiftIsBounded(v) 4155 // result: (SLW x y) 4156 for { 4157 _ = v.Args[1] 4158 x := v.Args[0] 4159 y := v.Args[1] 4160 if !(shiftIsBounded(v)) { 4161 break 4162 } 4163 v.reset(OpS390XSLW) 4164 v.AddArg(x) 4165 v.AddArg(y) 4166 return true 4167 } 4168 // match: (Lsh8x64 <t> x y) 4169 // cond: 4170 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 4171 for { 4172 t := v.Type 4173 _ = v.Args[1] 4174 x := v.Args[0] 4175 y := v.Args[1] 4176 v.reset(OpS390XMOVDGE) 4177 v.Type = t 4178 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4179 v0.AddArg(x) 4180 v0.AddArg(y) 4181 v.AddArg(v0) 4182 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4183 v1.AuxInt = 0 4184 v.AddArg(v1) 4185 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 4186 v2.AuxInt = 64 4187 v2.AddArg(y) 4188 v.AddArg(v2) 4189 return true 4190 } 4191 } 4192 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 4193 b := v.Block 4194 _ = b 4195 typ := &b.Func.Config.Types 4196 _ = typ 4197 // match: (Lsh8x8 x y) 4198 // cond: shiftIsBounded(v) 4199 // result: (SLW x y) 4200 for { 4201 _ = v.Args[1] 4202 x := v.Args[0] 4203 y := v.Args[1] 4204 if !(shiftIsBounded(v)) { 4205 break 4206 } 4207 v.reset(OpS390XSLW) 4208 v.AddArg(x) 4209 v.AddArg(y) 4210 return true 4211 } 4212 // match: (Lsh8x8 <t> x y) 4213 // cond: 4214 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 4215 for { 4216 t := v.Type 4217 _ = v.Args[1] 4218 x := v.Args[0] 4219 y := v.Args[1] 4220 v.reset(OpS390XMOVDGE) 4221 v.Type = t 4222 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4223 v0.AddArg(x) 4224 v0.AddArg(y) 4225 v.AddArg(v0) 4226 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4227 v1.AuxInt = 0 4228 v.AddArg(v1) 4229 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4230 v2.AuxInt = 64 4231 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4232 v3.AddArg(y) 4233 v2.AddArg(v3) 4234 v.AddArg(v2) 4235 return true 4236 } 4237 } 4238 func rewriteValueS390X_OpMod16_0(v *Value) bool { 4239 b := v.Block 4240 _ = b 4241 typ := &b.Func.Config.Types 4242 _ = typ 4243 // match: (Mod16 x y) 4244 // cond: 4245 // result: (MODW (MOVHreg x) (MOVHreg y)) 4246 for { 4247 _ = v.Args[1] 4248 x := v.Args[0] 4249 y := v.Args[1] 4250 v.reset(OpS390XMODW) 4251 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4252 v0.AddArg(x) 4253 v.AddArg(v0) 4254 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4255 v1.AddArg(y) 4256 v.AddArg(v1) 4257 return true 4258 } 4259 } 4260 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 4261 b := v.Block 4262 _ = b 4263 typ := &b.Func.Config.Types 4264 _ = typ 4265 // match: (Mod16u x y) 4266 // cond: 4267 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 4268 for { 4269 _ = v.Args[1] 4270 x := v.Args[0] 4271 y := v.Args[1] 4272 v.reset(OpS390XMODWU) 4273 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4274 v0.AddArg(x) 4275 v.AddArg(v0) 4276 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4277 v1.AddArg(y) 4278 v.AddArg(v1) 4279 return true 4280 } 4281 } 4282 func rewriteValueS390X_OpMod32_0(v *Value) bool { 4283 b := v.Block 4284 _ = b 4285 typ := &b.Func.Config.Types 4286 _ = typ 4287 // match: (Mod32 x y) 4288 // cond: 4289 // result: (MODW (MOVWreg x) y) 4290 for { 4291 _ = v.Args[1] 4292 x := v.Args[0] 4293 y := v.Args[1] 4294 v.reset(OpS390XMODW) 4295 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 4296 v0.AddArg(x) 4297 v.AddArg(v0) 4298 v.AddArg(y) 4299 return true 4300 } 4301 } 4302 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 4303 b := v.Block 4304 _ = b 4305 typ := &b.Func.Config.Types 4306 _ = typ 4307 // match: (Mod32u x y) 4308 // cond: 4309 // result: (MODWU (MOVWZreg x) y) 4310 for { 4311 _ = v.Args[1] 4312 x := v.Args[0] 4313 y := v.Args[1] 4314 v.reset(OpS390XMODWU) 4315 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 4316 v0.AddArg(x) 4317 v.AddArg(v0) 4318 v.AddArg(y) 4319 return true 4320 } 4321 } 4322 func rewriteValueS390X_OpMod64_0(v *Value) bool { 4323 // match: (Mod64 x y) 4324 // cond: 4325 // result: (MODD x y) 4326 for { 4327 _ = v.Args[1] 4328 x := v.Args[0] 4329 y := v.Args[1] 4330 v.reset(OpS390XMODD) 4331 v.AddArg(x) 4332 v.AddArg(y) 4333 return true 4334 } 4335 } 4336 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 4337 // match: (Mod64u x y) 4338 // cond: 4339 // result: (MODDU x y) 4340 for { 4341 _ = v.Args[1] 4342 x := v.Args[0] 4343 y := v.Args[1] 4344 v.reset(OpS390XMODDU) 4345 v.AddArg(x) 4346 v.AddArg(y) 4347 return true 4348 } 4349 } 4350 func rewriteValueS390X_OpMod8_0(v *Value) bool { 4351 b := v.Block 4352 _ = b 4353 typ := &b.Func.Config.Types 4354 _ = typ 4355 // match: (Mod8 x y) 4356 // cond: 4357 // result: (MODW (MOVBreg x) (MOVBreg y)) 4358 for { 4359 _ = v.Args[1] 4360 x := v.Args[0] 4361 y := v.Args[1] 4362 v.reset(OpS390XMODW) 4363 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4364 v0.AddArg(x) 4365 v.AddArg(v0) 4366 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4367 v1.AddArg(y) 4368 v.AddArg(v1) 4369 return true 4370 } 4371 } 4372 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 4373 b := v.Block 4374 _ = b 4375 typ := &b.Func.Config.Types 4376 _ = typ 4377 // match: (Mod8u x y) 4378 // cond: 4379 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 4380 for { 4381 _ = v.Args[1] 4382 x := v.Args[0] 4383 y := v.Args[1] 4384 v.reset(OpS390XMODWU) 4385 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4386 v0.AddArg(x) 4387 v.AddArg(v0) 4388 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4389 v1.AddArg(y) 4390 v.AddArg(v1) 4391 return true 4392 } 4393 } 4394 func rewriteValueS390X_OpMove_0(v *Value) bool { 4395 b := v.Block 4396 _ = b 4397 typ := &b.Func.Config.Types 4398 _ = typ 4399 // match: (Move [0] _ _ mem) 4400 // cond: 4401 // result: mem 4402 for { 4403 if v.AuxInt != 0 { 4404 break 4405 } 4406 _ = v.Args[2] 4407 mem := v.Args[2] 4408 v.reset(OpCopy) 4409 v.Type = mem.Type 4410 v.AddArg(mem) 4411 return true 4412 } 4413 // match: (Move [1] dst src mem) 4414 // cond: 4415 // result: (MOVBstore dst (MOVBZload src mem) mem) 4416 for { 4417 if v.AuxInt != 1 { 4418 break 4419 } 4420 _ = v.Args[2] 4421 dst := v.Args[0] 4422 src := v.Args[1] 4423 mem := v.Args[2] 4424 v.reset(OpS390XMOVBstore) 4425 v.AddArg(dst) 4426 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4427 v0.AddArg(src) 4428 v0.AddArg(mem) 4429 v.AddArg(v0) 4430 v.AddArg(mem) 4431 return true 4432 } 4433 // match: (Move [2] dst src mem) 4434 // cond: 4435 // result: (MOVHstore dst (MOVHZload src mem) mem) 4436 for { 4437 if v.AuxInt != 2 { 4438 break 4439 } 4440 _ = v.Args[2] 4441 dst := v.Args[0] 4442 src := v.Args[1] 4443 mem := v.Args[2] 4444 v.reset(OpS390XMOVHstore) 4445 v.AddArg(dst) 4446 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4447 v0.AddArg(src) 4448 v0.AddArg(mem) 4449 v.AddArg(v0) 4450 v.AddArg(mem) 4451 return true 4452 } 4453 // match: (Move [4] dst src mem) 4454 // cond: 4455 // result: (MOVWstore dst (MOVWZload src mem) mem) 4456 for { 4457 if v.AuxInt != 4 { 4458 break 4459 } 4460 _ = v.Args[2] 4461 dst := v.Args[0] 4462 src := v.Args[1] 4463 mem := v.Args[2] 4464 v.reset(OpS390XMOVWstore) 4465 v.AddArg(dst) 4466 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4467 v0.AddArg(src) 4468 v0.AddArg(mem) 4469 v.AddArg(v0) 4470 v.AddArg(mem) 4471 return true 4472 } 4473 // match: (Move [8] dst src mem) 4474 // cond: 4475 // result: (MOVDstore dst (MOVDload src mem) mem) 4476 for { 4477 if v.AuxInt != 8 { 4478 break 4479 } 4480 _ = v.Args[2] 4481 dst := v.Args[0] 4482 src := v.Args[1] 4483 mem := v.Args[2] 4484 v.reset(OpS390XMOVDstore) 4485 v.AddArg(dst) 4486 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4487 v0.AddArg(src) 4488 v0.AddArg(mem) 4489 v.AddArg(v0) 4490 v.AddArg(mem) 4491 return true 4492 } 4493 // match: (Move [16] dst src mem) 4494 // cond: 4495 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4496 for { 4497 if v.AuxInt != 16 { 4498 break 4499 } 4500 _ = v.Args[2] 4501 dst := v.Args[0] 4502 src := v.Args[1] 4503 mem := v.Args[2] 4504 v.reset(OpS390XMOVDstore) 4505 v.AuxInt = 8 4506 v.AddArg(dst) 4507 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4508 v0.AuxInt = 8 4509 v0.AddArg(src) 4510 v0.AddArg(mem) 4511 v.AddArg(v0) 4512 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4513 v1.AddArg(dst) 4514 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4515 v2.AddArg(src) 4516 v2.AddArg(mem) 4517 v1.AddArg(v2) 4518 v1.AddArg(mem) 4519 v.AddArg(v1) 4520 return true 4521 } 4522 // match: (Move [24] dst src mem) 4523 // cond: 4524 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4525 for { 4526 if v.AuxInt != 24 { 4527 break 4528 } 4529 _ = v.Args[2] 4530 dst := v.Args[0] 4531 src := v.Args[1] 4532 mem := v.Args[2] 4533 v.reset(OpS390XMOVDstore) 4534 v.AuxInt = 16 4535 v.AddArg(dst) 4536 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4537 v0.AuxInt = 16 4538 v0.AddArg(src) 4539 v0.AddArg(mem) 4540 v.AddArg(v0) 4541 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4542 v1.AuxInt = 8 4543 v1.AddArg(dst) 4544 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4545 v2.AuxInt = 8 4546 v2.AddArg(src) 4547 v2.AddArg(mem) 4548 v1.AddArg(v2) 4549 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4550 v3.AddArg(dst) 4551 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4552 v4.AddArg(src) 4553 v4.AddArg(mem) 4554 v3.AddArg(v4) 4555 v3.AddArg(mem) 4556 v1.AddArg(v3) 4557 v.AddArg(v1) 4558 return true 4559 } 4560 // match: (Move [3] dst src mem) 4561 // cond: 4562 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4563 for { 4564 if v.AuxInt != 3 { 4565 break 4566 } 4567 _ = v.Args[2] 4568 dst := v.Args[0] 4569 src := v.Args[1] 4570 mem := v.Args[2] 4571 v.reset(OpS390XMOVBstore) 4572 v.AuxInt = 2 4573 v.AddArg(dst) 4574 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4575 v0.AuxInt = 2 4576 v0.AddArg(src) 4577 v0.AddArg(mem) 4578 v.AddArg(v0) 4579 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4580 v1.AddArg(dst) 4581 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4582 v2.AddArg(src) 4583 v2.AddArg(mem) 4584 v1.AddArg(v2) 4585 v1.AddArg(mem) 4586 v.AddArg(v1) 4587 return true 4588 } 4589 // match: (Move [5] dst src mem) 4590 // cond: 4591 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4592 for { 4593 if v.AuxInt != 5 { 4594 break 4595 } 4596 _ = v.Args[2] 4597 dst := v.Args[0] 4598 src := v.Args[1] 4599 mem := v.Args[2] 4600 v.reset(OpS390XMOVBstore) 4601 v.AuxInt = 4 4602 v.AddArg(dst) 4603 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4604 v0.AuxInt = 4 4605 v0.AddArg(src) 4606 v0.AddArg(mem) 4607 v.AddArg(v0) 4608 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4609 v1.AddArg(dst) 4610 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4611 v2.AddArg(src) 4612 v2.AddArg(mem) 4613 v1.AddArg(v2) 4614 v1.AddArg(mem) 4615 v.AddArg(v1) 4616 return true 4617 } 4618 // match: (Move [6] dst src mem) 4619 // cond: 4620 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4621 for { 4622 if v.AuxInt != 6 { 4623 break 4624 } 4625 _ = v.Args[2] 4626 dst := v.Args[0] 4627 src := v.Args[1] 4628 mem := v.Args[2] 4629 v.reset(OpS390XMOVHstore) 4630 v.AuxInt = 4 4631 v.AddArg(dst) 4632 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4633 v0.AuxInt = 4 4634 v0.AddArg(src) 4635 v0.AddArg(mem) 4636 v.AddArg(v0) 4637 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4638 v1.AddArg(dst) 4639 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4640 v2.AddArg(src) 4641 v2.AddArg(mem) 4642 v1.AddArg(v2) 4643 v1.AddArg(mem) 4644 v.AddArg(v1) 4645 return true 4646 } 4647 return false 4648 } 4649 func rewriteValueS390X_OpMove_10(v *Value) bool { 4650 b := v.Block 4651 _ = b 4652 typ := &b.Func.Config.Types 4653 _ = typ 4654 // match: (Move [7] dst src mem) 4655 // cond: 4656 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4657 for { 4658 if v.AuxInt != 7 { 4659 break 4660 } 4661 _ = v.Args[2] 4662 dst := v.Args[0] 4663 src := v.Args[1] 4664 mem := v.Args[2] 4665 v.reset(OpS390XMOVBstore) 4666 v.AuxInt = 6 4667 v.AddArg(dst) 4668 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4669 v0.AuxInt = 6 4670 v0.AddArg(src) 4671 v0.AddArg(mem) 4672 v.AddArg(v0) 4673 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4674 v1.AuxInt = 4 4675 v1.AddArg(dst) 4676 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4677 v2.AuxInt = 4 4678 v2.AddArg(src) 4679 v2.AddArg(mem) 4680 v1.AddArg(v2) 4681 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4682 v3.AddArg(dst) 4683 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4684 v4.AddArg(src) 4685 v4.AddArg(mem) 4686 v3.AddArg(v4) 4687 v3.AddArg(mem) 4688 v1.AddArg(v3) 4689 v.AddArg(v1) 4690 return true 4691 } 4692 // match: (Move [s] dst src mem) 4693 // cond: s > 0 && s <= 256 4694 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4695 for { 4696 s := v.AuxInt 4697 _ = v.Args[2] 4698 dst := v.Args[0] 4699 src := v.Args[1] 4700 mem := v.Args[2] 4701 if !(s > 0 && s <= 256) { 4702 break 4703 } 4704 v.reset(OpS390XMVC) 4705 v.AuxInt = makeValAndOff(s, 0) 4706 v.AddArg(dst) 4707 v.AddArg(src) 4708 v.AddArg(mem) 4709 return true 4710 } 4711 // match: (Move [s] dst src mem) 4712 // cond: s > 256 && s <= 512 4713 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4714 for { 4715 s := v.AuxInt 4716 _ = v.Args[2] 4717 dst := v.Args[0] 4718 src := v.Args[1] 4719 mem := v.Args[2] 4720 if !(s > 256 && s <= 512) { 4721 break 4722 } 4723 v.reset(OpS390XMVC) 4724 v.AuxInt = makeValAndOff(s-256, 256) 4725 v.AddArg(dst) 4726 v.AddArg(src) 4727 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4728 v0.AuxInt = makeValAndOff(256, 0) 4729 v0.AddArg(dst) 4730 v0.AddArg(src) 4731 v0.AddArg(mem) 4732 v.AddArg(v0) 4733 return true 4734 } 4735 // match: (Move [s] dst src mem) 4736 // cond: s > 512 && s <= 768 4737 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4738 for { 4739 s := v.AuxInt 4740 _ = v.Args[2] 4741 dst := v.Args[0] 4742 src := v.Args[1] 4743 mem := v.Args[2] 4744 if !(s > 512 && s <= 768) { 4745 break 4746 } 4747 v.reset(OpS390XMVC) 4748 v.AuxInt = makeValAndOff(s-512, 512) 4749 v.AddArg(dst) 4750 v.AddArg(src) 4751 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4752 v0.AuxInt = makeValAndOff(256, 256) 4753 v0.AddArg(dst) 4754 v0.AddArg(src) 4755 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4756 v1.AuxInt = makeValAndOff(256, 0) 4757 v1.AddArg(dst) 4758 v1.AddArg(src) 4759 v1.AddArg(mem) 4760 v0.AddArg(v1) 4761 v.AddArg(v0) 4762 return true 4763 } 4764 // match: (Move [s] dst src mem) 4765 // cond: s > 768 && s <= 1024 4766 // 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)))) 4767 for { 4768 s := v.AuxInt 4769 _ = v.Args[2] 4770 dst := v.Args[0] 4771 src := v.Args[1] 4772 mem := v.Args[2] 4773 if !(s > 768 && s <= 1024) { 4774 break 4775 } 4776 v.reset(OpS390XMVC) 4777 v.AuxInt = makeValAndOff(s-768, 768) 4778 v.AddArg(dst) 4779 v.AddArg(src) 4780 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4781 v0.AuxInt = makeValAndOff(256, 512) 4782 v0.AddArg(dst) 4783 v0.AddArg(src) 4784 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4785 v1.AuxInt = makeValAndOff(256, 256) 4786 v1.AddArg(dst) 4787 v1.AddArg(src) 4788 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4789 v2.AuxInt = makeValAndOff(256, 0) 4790 v2.AddArg(dst) 4791 v2.AddArg(src) 4792 v2.AddArg(mem) 4793 v1.AddArg(v2) 4794 v0.AddArg(v1) 4795 v.AddArg(v0) 4796 return true 4797 } 4798 // match: (Move [s] dst src mem) 4799 // cond: s > 1024 4800 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4801 for { 4802 s := v.AuxInt 4803 _ = v.Args[2] 4804 dst := v.Args[0] 4805 src := v.Args[1] 4806 mem := v.Args[2] 4807 if !(s > 1024) { 4808 break 4809 } 4810 v.reset(OpS390XLoweredMove) 4811 v.AuxInt = s % 256 4812 v.AddArg(dst) 4813 v.AddArg(src) 4814 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4815 v0.AuxInt = (s / 256) * 256 4816 v0.AddArg(src) 4817 v.AddArg(v0) 4818 v.AddArg(mem) 4819 return true 4820 } 4821 return false 4822 } 4823 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4824 // match: (Mul16 x y) 4825 // cond: 4826 // result: (MULLW x y) 4827 for { 4828 _ = v.Args[1] 4829 x := v.Args[0] 4830 y := v.Args[1] 4831 v.reset(OpS390XMULLW) 4832 v.AddArg(x) 4833 v.AddArg(y) 4834 return true 4835 } 4836 } 4837 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4838 // match: (Mul32 x y) 4839 // cond: 4840 // result: (MULLW x y) 4841 for { 4842 _ = v.Args[1] 4843 x := v.Args[0] 4844 y := v.Args[1] 4845 v.reset(OpS390XMULLW) 4846 v.AddArg(x) 4847 v.AddArg(y) 4848 return true 4849 } 4850 } 4851 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4852 // match: (Mul32F x y) 4853 // cond: 4854 // result: (FMULS x y) 4855 for { 4856 _ = v.Args[1] 4857 x := v.Args[0] 4858 y := v.Args[1] 4859 v.reset(OpS390XFMULS) 4860 v.AddArg(x) 4861 v.AddArg(y) 4862 return true 4863 } 4864 } 4865 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4866 // match: (Mul64 x y) 4867 // cond: 4868 // result: (MULLD x y) 4869 for { 4870 _ = v.Args[1] 4871 x := v.Args[0] 4872 y := v.Args[1] 4873 v.reset(OpS390XMULLD) 4874 v.AddArg(x) 4875 v.AddArg(y) 4876 return true 4877 } 4878 } 4879 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4880 // match: (Mul64F x y) 4881 // cond: 4882 // result: (FMUL x y) 4883 for { 4884 _ = v.Args[1] 4885 x := v.Args[0] 4886 y := v.Args[1] 4887 v.reset(OpS390XFMUL) 4888 v.AddArg(x) 4889 v.AddArg(y) 4890 return true 4891 } 4892 } 4893 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4894 // match: (Mul8 x y) 4895 // cond: 4896 // result: (MULLW x y) 4897 for { 4898 _ = v.Args[1] 4899 x := v.Args[0] 4900 y := v.Args[1] 4901 v.reset(OpS390XMULLW) 4902 v.AddArg(x) 4903 v.AddArg(y) 4904 return true 4905 } 4906 } 4907 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4908 // match: (Neg16 x) 4909 // cond: 4910 // result: (NEGW x) 4911 for { 4912 x := v.Args[0] 4913 v.reset(OpS390XNEGW) 4914 v.AddArg(x) 4915 return true 4916 } 4917 } 4918 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4919 // match: (Neg32 x) 4920 // cond: 4921 // result: (NEGW x) 4922 for { 4923 x := v.Args[0] 4924 v.reset(OpS390XNEGW) 4925 v.AddArg(x) 4926 return true 4927 } 4928 } 4929 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4930 // match: (Neg32F x) 4931 // cond: 4932 // result: (FNEGS x) 4933 for { 4934 x := v.Args[0] 4935 v.reset(OpS390XFNEGS) 4936 v.AddArg(x) 4937 return true 4938 } 4939 } 4940 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4941 // match: (Neg64 x) 4942 // cond: 4943 // result: (NEG x) 4944 for { 4945 x := v.Args[0] 4946 v.reset(OpS390XNEG) 4947 v.AddArg(x) 4948 return true 4949 } 4950 } 4951 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4952 // match: (Neg64F x) 4953 // cond: 4954 // result: (FNEG x) 4955 for { 4956 x := v.Args[0] 4957 v.reset(OpS390XFNEG) 4958 v.AddArg(x) 4959 return true 4960 } 4961 } 4962 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4963 // match: (Neg8 x) 4964 // cond: 4965 // result: (NEGW x) 4966 for { 4967 x := v.Args[0] 4968 v.reset(OpS390XNEGW) 4969 v.AddArg(x) 4970 return true 4971 } 4972 } 4973 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4974 b := v.Block 4975 _ = b 4976 typ := &b.Func.Config.Types 4977 _ = typ 4978 // match: (Neq16 x y) 4979 // cond: 4980 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 4981 for { 4982 _ = v.Args[1] 4983 x := v.Args[0] 4984 y := v.Args[1] 4985 v.reset(OpS390XMOVDNE) 4986 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4987 v0.AuxInt = 0 4988 v.AddArg(v0) 4989 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4990 v1.AuxInt = 1 4991 v.AddArg(v1) 4992 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4993 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4994 v3.AddArg(x) 4995 v2.AddArg(v3) 4996 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4997 v4.AddArg(y) 4998 v2.AddArg(v4) 4999 v.AddArg(v2) 5000 return true 5001 } 5002 } 5003 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 5004 b := v.Block 5005 _ = b 5006 typ := &b.Func.Config.Types 5007 _ = typ 5008 // match: (Neq32 x y) 5009 // cond: 5010 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 5011 for { 5012 _ = v.Args[1] 5013 x := v.Args[0] 5014 y := v.Args[1] 5015 v.reset(OpS390XMOVDNE) 5016 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5017 v0.AuxInt = 0 5018 v.AddArg(v0) 5019 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5020 v1.AuxInt = 1 5021 v.AddArg(v1) 5022 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5023 v2.AddArg(x) 5024 v2.AddArg(y) 5025 v.AddArg(v2) 5026 return true 5027 } 5028 } 5029 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 5030 b := v.Block 5031 _ = b 5032 typ := &b.Func.Config.Types 5033 _ = typ 5034 // match: (Neq32F x y) 5035 // cond: 5036 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 5037 for { 5038 _ = v.Args[1] 5039 x := v.Args[0] 5040 y := v.Args[1] 5041 v.reset(OpS390XMOVDNE) 5042 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5043 v0.AuxInt = 0 5044 v.AddArg(v0) 5045 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5046 v1.AuxInt = 1 5047 v.AddArg(v1) 5048 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 5049 v2.AddArg(x) 5050 v2.AddArg(y) 5051 v.AddArg(v2) 5052 return true 5053 } 5054 } 5055 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 5056 b := v.Block 5057 _ = b 5058 typ := &b.Func.Config.Types 5059 _ = typ 5060 // match: (Neq64 x y) 5061 // cond: 5062 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 5063 for { 5064 _ = v.Args[1] 5065 x := v.Args[0] 5066 y := v.Args[1] 5067 v.reset(OpS390XMOVDNE) 5068 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5069 v0.AuxInt = 0 5070 v.AddArg(v0) 5071 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5072 v1.AuxInt = 1 5073 v.AddArg(v1) 5074 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 5075 v2.AddArg(x) 5076 v2.AddArg(y) 5077 v.AddArg(v2) 5078 return true 5079 } 5080 } 5081 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 5082 b := v.Block 5083 _ = b 5084 typ := &b.Func.Config.Types 5085 _ = typ 5086 // match: (Neq64F x y) 5087 // cond: 5088 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 5089 for { 5090 _ = v.Args[1] 5091 x := v.Args[0] 5092 y := v.Args[1] 5093 v.reset(OpS390XMOVDNE) 5094 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5095 v0.AuxInt = 0 5096 v.AddArg(v0) 5097 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5098 v1.AuxInt = 1 5099 v.AddArg(v1) 5100 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 5101 v2.AddArg(x) 5102 v2.AddArg(y) 5103 v.AddArg(v2) 5104 return true 5105 } 5106 } 5107 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 5108 b := v.Block 5109 _ = b 5110 typ := &b.Func.Config.Types 5111 _ = typ 5112 // match: (Neq8 x y) 5113 // cond: 5114 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 5115 for { 5116 _ = v.Args[1] 5117 x := v.Args[0] 5118 y := v.Args[1] 5119 v.reset(OpS390XMOVDNE) 5120 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5121 v0.AuxInt = 0 5122 v.AddArg(v0) 5123 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5124 v1.AuxInt = 1 5125 v.AddArg(v1) 5126 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5127 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5128 v3.AddArg(x) 5129 v2.AddArg(v3) 5130 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5131 v4.AddArg(y) 5132 v2.AddArg(v4) 5133 v.AddArg(v2) 5134 return true 5135 } 5136 } 5137 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 5138 b := v.Block 5139 _ = b 5140 typ := &b.Func.Config.Types 5141 _ = typ 5142 // match: (NeqB x y) 5143 // cond: 5144 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 5145 for { 5146 _ = v.Args[1] 5147 x := v.Args[0] 5148 y := v.Args[1] 5149 v.reset(OpS390XMOVDNE) 5150 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5151 v0.AuxInt = 0 5152 v.AddArg(v0) 5153 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5154 v1.AuxInt = 1 5155 v.AddArg(v1) 5156 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5157 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5158 v3.AddArg(x) 5159 v2.AddArg(v3) 5160 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5161 v4.AddArg(y) 5162 v2.AddArg(v4) 5163 v.AddArg(v2) 5164 return true 5165 } 5166 } 5167 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 5168 b := v.Block 5169 _ = b 5170 typ := &b.Func.Config.Types 5171 _ = typ 5172 // match: (NeqPtr x y) 5173 // cond: 5174 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 5175 for { 5176 _ = v.Args[1] 5177 x := v.Args[0] 5178 y := v.Args[1] 5179 v.reset(OpS390XMOVDNE) 5180 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5181 v0.AuxInt = 0 5182 v.AddArg(v0) 5183 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5184 v1.AuxInt = 1 5185 v.AddArg(v1) 5186 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 5187 v2.AddArg(x) 5188 v2.AddArg(y) 5189 v.AddArg(v2) 5190 return true 5191 } 5192 } 5193 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 5194 // match: (NilCheck ptr mem) 5195 // cond: 5196 // result: (LoweredNilCheck ptr mem) 5197 for { 5198 _ = v.Args[1] 5199 ptr := v.Args[0] 5200 mem := v.Args[1] 5201 v.reset(OpS390XLoweredNilCheck) 5202 v.AddArg(ptr) 5203 v.AddArg(mem) 5204 return true 5205 } 5206 } 5207 func rewriteValueS390X_OpNot_0(v *Value) bool { 5208 // match: (Not x) 5209 // cond: 5210 // result: (XORWconst [1] x) 5211 for { 5212 x := v.Args[0] 5213 v.reset(OpS390XXORWconst) 5214 v.AuxInt = 1 5215 v.AddArg(x) 5216 return true 5217 } 5218 } 5219 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 5220 b := v.Block 5221 _ = b 5222 typ := &b.Func.Config.Types 5223 _ = typ 5224 // match: (OffPtr [off] ptr:(SP)) 5225 // cond: 5226 // result: (MOVDaddr [off] ptr) 5227 for { 5228 off := v.AuxInt 5229 ptr := v.Args[0] 5230 if ptr.Op != OpSP { 5231 break 5232 } 5233 v.reset(OpS390XMOVDaddr) 5234 v.AuxInt = off 5235 v.AddArg(ptr) 5236 return true 5237 } 5238 // match: (OffPtr [off] ptr) 5239 // cond: is32Bit(off) 5240 // result: (ADDconst [off] ptr) 5241 for { 5242 off := v.AuxInt 5243 ptr := v.Args[0] 5244 if !(is32Bit(off)) { 5245 break 5246 } 5247 v.reset(OpS390XADDconst) 5248 v.AuxInt = off 5249 v.AddArg(ptr) 5250 return true 5251 } 5252 // match: (OffPtr [off] ptr) 5253 // cond: 5254 // result: (ADD (MOVDconst [off]) ptr) 5255 for { 5256 off := v.AuxInt 5257 ptr := v.Args[0] 5258 v.reset(OpS390XADD) 5259 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5260 v0.AuxInt = off 5261 v.AddArg(v0) 5262 v.AddArg(ptr) 5263 return true 5264 } 5265 } 5266 func rewriteValueS390X_OpOr16_0(v *Value) bool { 5267 // match: (Or16 x y) 5268 // cond: 5269 // result: (ORW x y) 5270 for { 5271 _ = v.Args[1] 5272 x := v.Args[0] 5273 y := v.Args[1] 5274 v.reset(OpS390XORW) 5275 v.AddArg(x) 5276 v.AddArg(y) 5277 return true 5278 } 5279 } 5280 func rewriteValueS390X_OpOr32_0(v *Value) bool { 5281 // match: (Or32 x y) 5282 // cond: 5283 // result: (ORW x y) 5284 for { 5285 _ = v.Args[1] 5286 x := v.Args[0] 5287 y := v.Args[1] 5288 v.reset(OpS390XORW) 5289 v.AddArg(x) 5290 v.AddArg(y) 5291 return true 5292 } 5293 } 5294 func rewriteValueS390X_OpOr64_0(v *Value) bool { 5295 // match: (Or64 x y) 5296 // cond: 5297 // result: (OR x y) 5298 for { 5299 _ = v.Args[1] 5300 x := v.Args[0] 5301 y := v.Args[1] 5302 v.reset(OpS390XOR) 5303 v.AddArg(x) 5304 v.AddArg(y) 5305 return true 5306 } 5307 } 5308 func rewriteValueS390X_OpOr8_0(v *Value) bool { 5309 // match: (Or8 x y) 5310 // cond: 5311 // result: (ORW x y) 5312 for { 5313 _ = v.Args[1] 5314 x := v.Args[0] 5315 y := v.Args[1] 5316 v.reset(OpS390XORW) 5317 v.AddArg(x) 5318 v.AddArg(y) 5319 return true 5320 } 5321 } 5322 func rewriteValueS390X_OpOrB_0(v *Value) bool { 5323 // match: (OrB x y) 5324 // cond: 5325 // result: (ORW x y) 5326 for { 5327 _ = v.Args[1] 5328 x := v.Args[0] 5329 y := v.Args[1] 5330 v.reset(OpS390XORW) 5331 v.AddArg(x) 5332 v.AddArg(y) 5333 return true 5334 } 5335 } 5336 func rewriteValueS390X_OpPopCount16_0(v *Value) bool { 5337 b := v.Block 5338 _ = b 5339 typ := &b.Func.Config.Types 5340 _ = typ 5341 // match: (PopCount16 x) 5342 // cond: 5343 // result: (MOVBZreg (SumBytes2 (POPCNT <typ.UInt16> x))) 5344 for { 5345 x := v.Args[0] 5346 v.reset(OpS390XMOVBZreg) 5347 v0 := b.NewValue0(v.Pos, OpS390XSumBytes2, typ.UInt8) 5348 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt16) 5349 v1.AddArg(x) 5350 v0.AddArg(v1) 5351 v.AddArg(v0) 5352 return true 5353 } 5354 } 5355 func rewriteValueS390X_OpPopCount32_0(v *Value) bool { 5356 b := v.Block 5357 _ = b 5358 typ := &b.Func.Config.Types 5359 _ = typ 5360 // match: (PopCount32 x) 5361 // cond: 5362 // result: (MOVBZreg (SumBytes4 (POPCNT <typ.UInt32> x))) 5363 for { 5364 x := v.Args[0] 5365 v.reset(OpS390XMOVBZreg) 5366 v0 := b.NewValue0(v.Pos, OpS390XSumBytes4, typ.UInt8) 5367 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt32) 5368 v1.AddArg(x) 5369 v0.AddArg(v1) 5370 v.AddArg(v0) 5371 return true 5372 } 5373 } 5374 func rewriteValueS390X_OpPopCount64_0(v *Value) bool { 5375 b := v.Block 5376 _ = b 5377 typ := &b.Func.Config.Types 5378 _ = typ 5379 // match: (PopCount64 x) 5380 // cond: 5381 // result: (MOVBZreg (SumBytes8 (POPCNT <typ.UInt64> x))) 5382 for { 5383 x := v.Args[0] 5384 v.reset(OpS390XMOVBZreg) 5385 v0 := b.NewValue0(v.Pos, OpS390XSumBytes8, typ.UInt8) 5386 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt64) 5387 v1.AddArg(x) 5388 v0.AddArg(v1) 5389 v.AddArg(v0) 5390 return true 5391 } 5392 } 5393 func rewriteValueS390X_OpPopCount8_0(v *Value) bool { 5394 b := v.Block 5395 _ = b 5396 typ := &b.Func.Config.Types 5397 _ = typ 5398 // match: (PopCount8 x) 5399 // cond: 5400 // result: (POPCNT (MOVBZreg x)) 5401 for { 5402 x := v.Args[0] 5403 v.reset(OpS390XPOPCNT) 5404 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5405 v0.AddArg(x) 5406 v.AddArg(v0) 5407 return true 5408 } 5409 } 5410 func rewriteValueS390X_OpRotateLeft32_0(v *Value) bool { 5411 // match: (RotateLeft32 x y) 5412 // cond: 5413 // result: (RLL x y) 5414 for { 5415 _ = v.Args[1] 5416 x := v.Args[0] 5417 y := v.Args[1] 5418 v.reset(OpS390XRLL) 5419 v.AddArg(x) 5420 v.AddArg(y) 5421 return true 5422 } 5423 } 5424 func rewriteValueS390X_OpRotateLeft64_0(v *Value) bool { 5425 // match: (RotateLeft64 x y) 5426 // cond: 5427 // result: (RLLG x y) 5428 for { 5429 _ = v.Args[1] 5430 x := v.Args[0] 5431 y := v.Args[1] 5432 v.reset(OpS390XRLLG) 5433 v.AddArg(x) 5434 v.AddArg(y) 5435 return true 5436 } 5437 } 5438 func rewriteValueS390X_OpRound_0(v *Value) bool { 5439 // match: (Round x) 5440 // cond: 5441 // result: (FIDBR [1] x) 5442 for { 5443 x := v.Args[0] 5444 v.reset(OpS390XFIDBR) 5445 v.AuxInt = 1 5446 v.AddArg(x) 5447 return true 5448 } 5449 } 5450 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 5451 // match: (Round32F x) 5452 // cond: 5453 // result: (LoweredRound32F x) 5454 for { 5455 x := v.Args[0] 5456 v.reset(OpS390XLoweredRound32F) 5457 v.AddArg(x) 5458 return true 5459 } 5460 } 5461 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 5462 // match: (Round64F x) 5463 // cond: 5464 // result: (LoweredRound64F x) 5465 for { 5466 x := v.Args[0] 5467 v.reset(OpS390XLoweredRound64F) 5468 v.AddArg(x) 5469 return true 5470 } 5471 } 5472 func rewriteValueS390X_OpRoundToEven_0(v *Value) bool { 5473 // match: (RoundToEven x) 5474 // cond: 5475 // result: (FIDBR [4] x) 5476 for { 5477 x := v.Args[0] 5478 v.reset(OpS390XFIDBR) 5479 v.AuxInt = 4 5480 v.AddArg(x) 5481 return true 5482 } 5483 } 5484 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 5485 b := v.Block 5486 _ = b 5487 typ := &b.Func.Config.Types 5488 _ = typ 5489 // match: (Rsh16Ux16 x y) 5490 // cond: shiftIsBounded(v) 5491 // result: (SRW (MOVHZreg x) y) 5492 for { 5493 _ = v.Args[1] 5494 x := v.Args[0] 5495 y := v.Args[1] 5496 if !(shiftIsBounded(v)) { 5497 break 5498 } 5499 v.reset(OpS390XSRW) 5500 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5501 v0.AddArg(x) 5502 v.AddArg(v0) 5503 v.AddArg(y) 5504 return true 5505 } 5506 // match: (Rsh16Ux16 <t> x y) 5507 // cond: 5508 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 5509 for { 5510 t := v.Type 5511 _ = v.Args[1] 5512 x := v.Args[0] 5513 y := v.Args[1] 5514 v.reset(OpS390XMOVDGE) 5515 v.Type = t 5516 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5517 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5518 v1.AddArg(x) 5519 v0.AddArg(v1) 5520 v0.AddArg(y) 5521 v.AddArg(v0) 5522 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5523 v2.AuxInt = 0 5524 v.AddArg(v2) 5525 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5526 v3.AuxInt = 64 5527 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5528 v4.AddArg(y) 5529 v3.AddArg(v4) 5530 v.AddArg(v3) 5531 return true 5532 } 5533 } 5534 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 5535 b := v.Block 5536 _ = b 5537 typ := &b.Func.Config.Types 5538 _ = typ 5539 // match: (Rsh16Ux32 x y) 5540 // cond: shiftIsBounded(v) 5541 // result: (SRW (MOVHZreg x) y) 5542 for { 5543 _ = v.Args[1] 5544 x := v.Args[0] 5545 y := v.Args[1] 5546 if !(shiftIsBounded(v)) { 5547 break 5548 } 5549 v.reset(OpS390XSRW) 5550 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5551 v0.AddArg(x) 5552 v.AddArg(v0) 5553 v.AddArg(y) 5554 return true 5555 } 5556 // match: (Rsh16Ux32 <t> x y) 5557 // cond: 5558 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) 5559 for { 5560 t := v.Type 5561 _ = v.Args[1] 5562 x := v.Args[0] 5563 y := v.Args[1] 5564 v.reset(OpS390XMOVDGE) 5565 v.Type = t 5566 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5567 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5568 v1.AddArg(x) 5569 v0.AddArg(v1) 5570 v0.AddArg(y) 5571 v.AddArg(v0) 5572 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5573 v2.AuxInt = 0 5574 v.AddArg(v2) 5575 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5576 v3.AuxInt = 64 5577 v3.AddArg(y) 5578 v.AddArg(v3) 5579 return true 5580 } 5581 } 5582 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 5583 b := v.Block 5584 _ = b 5585 typ := &b.Func.Config.Types 5586 _ = typ 5587 // match: (Rsh16Ux64 x y) 5588 // cond: shiftIsBounded(v) 5589 // result: (SRW (MOVHZreg x) y) 5590 for { 5591 _ = v.Args[1] 5592 x := v.Args[0] 5593 y := v.Args[1] 5594 if !(shiftIsBounded(v)) { 5595 break 5596 } 5597 v.reset(OpS390XSRW) 5598 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5599 v0.AddArg(x) 5600 v.AddArg(v0) 5601 v.AddArg(y) 5602 return true 5603 } 5604 // match: (Rsh16Ux64 <t> x y) 5605 // cond: 5606 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) 5607 for { 5608 t := v.Type 5609 _ = v.Args[1] 5610 x := v.Args[0] 5611 y := v.Args[1] 5612 v.reset(OpS390XMOVDGE) 5613 v.Type = t 5614 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5615 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5616 v1.AddArg(x) 5617 v0.AddArg(v1) 5618 v0.AddArg(y) 5619 v.AddArg(v0) 5620 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5621 v2.AuxInt = 0 5622 v.AddArg(v2) 5623 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5624 v3.AuxInt = 64 5625 v3.AddArg(y) 5626 v.AddArg(v3) 5627 return true 5628 } 5629 } 5630 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5631 b := v.Block 5632 _ = b 5633 typ := &b.Func.Config.Types 5634 _ = typ 5635 // match: (Rsh16Ux8 x y) 5636 // cond: shiftIsBounded(v) 5637 // result: (SRW (MOVHZreg x) y) 5638 for { 5639 _ = v.Args[1] 5640 x := v.Args[0] 5641 y := v.Args[1] 5642 if !(shiftIsBounded(v)) { 5643 break 5644 } 5645 v.reset(OpS390XSRW) 5646 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5647 v0.AddArg(x) 5648 v.AddArg(v0) 5649 v.AddArg(y) 5650 return true 5651 } 5652 // match: (Rsh16Ux8 <t> x y) 5653 // cond: 5654 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 5655 for { 5656 t := v.Type 5657 _ = v.Args[1] 5658 x := v.Args[0] 5659 y := v.Args[1] 5660 v.reset(OpS390XMOVDGE) 5661 v.Type = t 5662 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5663 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5664 v1.AddArg(x) 5665 v0.AddArg(v1) 5666 v0.AddArg(y) 5667 v.AddArg(v0) 5668 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5669 v2.AuxInt = 0 5670 v.AddArg(v2) 5671 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5672 v3.AuxInt = 64 5673 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5674 v4.AddArg(y) 5675 v3.AddArg(v4) 5676 v.AddArg(v3) 5677 return true 5678 } 5679 } 5680 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5681 b := v.Block 5682 _ = b 5683 typ := &b.Func.Config.Types 5684 _ = typ 5685 // match: (Rsh16x16 x y) 5686 // cond: shiftIsBounded(v) 5687 // result: (SRAW (MOVHreg x) y) 5688 for { 5689 _ = v.Args[1] 5690 x := v.Args[0] 5691 y := v.Args[1] 5692 if !(shiftIsBounded(v)) { 5693 break 5694 } 5695 v.reset(OpS390XSRAW) 5696 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5697 v0.AddArg(x) 5698 v.AddArg(v0) 5699 v.AddArg(y) 5700 return true 5701 } 5702 // match: (Rsh16x16 x y) 5703 // cond: 5704 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 5705 for { 5706 _ = v.Args[1] 5707 x := v.Args[0] 5708 y := v.Args[1] 5709 v.reset(OpS390XSRAW) 5710 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5711 v0.AddArg(x) 5712 v.AddArg(v0) 5713 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5714 v1.AddArg(y) 5715 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5716 v2.AuxInt = 63 5717 v1.AddArg(v2) 5718 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5719 v3.AuxInt = 64 5720 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5721 v4.AddArg(y) 5722 v3.AddArg(v4) 5723 v1.AddArg(v3) 5724 v.AddArg(v1) 5725 return true 5726 } 5727 } 5728 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5729 b := v.Block 5730 _ = b 5731 typ := &b.Func.Config.Types 5732 _ = typ 5733 // match: (Rsh16x32 x y) 5734 // cond: shiftIsBounded(v) 5735 // result: (SRAW (MOVHreg x) y) 5736 for { 5737 _ = v.Args[1] 5738 x := v.Args[0] 5739 y := v.Args[1] 5740 if !(shiftIsBounded(v)) { 5741 break 5742 } 5743 v.reset(OpS390XSRAW) 5744 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5745 v0.AddArg(x) 5746 v.AddArg(v0) 5747 v.AddArg(y) 5748 return true 5749 } 5750 // match: (Rsh16x32 x y) 5751 // cond: 5752 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 5753 for { 5754 _ = v.Args[1] 5755 x := v.Args[0] 5756 y := v.Args[1] 5757 v.reset(OpS390XSRAW) 5758 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5759 v0.AddArg(x) 5760 v.AddArg(v0) 5761 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5762 v1.AddArg(y) 5763 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5764 v2.AuxInt = 63 5765 v1.AddArg(v2) 5766 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5767 v3.AuxInt = 64 5768 v3.AddArg(y) 5769 v1.AddArg(v3) 5770 v.AddArg(v1) 5771 return true 5772 } 5773 } 5774 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5775 b := v.Block 5776 _ = b 5777 typ := &b.Func.Config.Types 5778 _ = typ 5779 // match: (Rsh16x64 x y) 5780 // cond: shiftIsBounded(v) 5781 // result: (SRAW (MOVHreg x) y) 5782 for { 5783 _ = v.Args[1] 5784 x := v.Args[0] 5785 y := v.Args[1] 5786 if !(shiftIsBounded(v)) { 5787 break 5788 } 5789 v.reset(OpS390XSRAW) 5790 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5791 v0.AddArg(x) 5792 v.AddArg(v0) 5793 v.AddArg(y) 5794 return true 5795 } 5796 // match: (Rsh16x64 x y) 5797 // cond: 5798 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 5799 for { 5800 _ = v.Args[1] 5801 x := v.Args[0] 5802 y := v.Args[1] 5803 v.reset(OpS390XSRAW) 5804 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5805 v0.AddArg(x) 5806 v.AddArg(v0) 5807 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5808 v1.AddArg(y) 5809 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5810 v2.AuxInt = 63 5811 v1.AddArg(v2) 5812 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5813 v3.AuxInt = 64 5814 v3.AddArg(y) 5815 v1.AddArg(v3) 5816 v.AddArg(v1) 5817 return true 5818 } 5819 } 5820 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5821 b := v.Block 5822 _ = b 5823 typ := &b.Func.Config.Types 5824 _ = typ 5825 // match: (Rsh16x8 x y) 5826 // cond: shiftIsBounded(v) 5827 // result: (SRAW (MOVHreg x) y) 5828 for { 5829 _ = v.Args[1] 5830 x := v.Args[0] 5831 y := v.Args[1] 5832 if !(shiftIsBounded(v)) { 5833 break 5834 } 5835 v.reset(OpS390XSRAW) 5836 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5837 v0.AddArg(x) 5838 v.AddArg(v0) 5839 v.AddArg(y) 5840 return true 5841 } 5842 // match: (Rsh16x8 x y) 5843 // cond: 5844 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 5845 for { 5846 _ = v.Args[1] 5847 x := v.Args[0] 5848 y := v.Args[1] 5849 v.reset(OpS390XSRAW) 5850 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5851 v0.AddArg(x) 5852 v.AddArg(v0) 5853 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5854 v1.AddArg(y) 5855 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5856 v2.AuxInt = 63 5857 v1.AddArg(v2) 5858 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5859 v3.AuxInt = 64 5860 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5861 v4.AddArg(y) 5862 v3.AddArg(v4) 5863 v1.AddArg(v3) 5864 v.AddArg(v1) 5865 return true 5866 } 5867 } 5868 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5869 b := v.Block 5870 _ = b 5871 typ := &b.Func.Config.Types 5872 _ = typ 5873 // match: (Rsh32Ux16 x y) 5874 // cond: shiftIsBounded(v) 5875 // result: (SRW x y) 5876 for { 5877 _ = v.Args[1] 5878 x := v.Args[0] 5879 y := v.Args[1] 5880 if !(shiftIsBounded(v)) { 5881 break 5882 } 5883 v.reset(OpS390XSRW) 5884 v.AddArg(x) 5885 v.AddArg(y) 5886 return true 5887 } 5888 // match: (Rsh32Ux16 <t> x y) 5889 // cond: 5890 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 5891 for { 5892 t := v.Type 5893 _ = v.Args[1] 5894 x := v.Args[0] 5895 y := v.Args[1] 5896 v.reset(OpS390XMOVDGE) 5897 v.Type = t 5898 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5899 v0.AddArg(x) 5900 v0.AddArg(y) 5901 v.AddArg(v0) 5902 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5903 v1.AuxInt = 0 5904 v.AddArg(v1) 5905 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5906 v2.AuxInt = 64 5907 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5908 v3.AddArg(y) 5909 v2.AddArg(v3) 5910 v.AddArg(v2) 5911 return true 5912 } 5913 } 5914 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5915 b := v.Block 5916 _ = b 5917 typ := &b.Func.Config.Types 5918 _ = typ 5919 // match: (Rsh32Ux32 x y) 5920 // cond: shiftIsBounded(v) 5921 // result: (SRW x y) 5922 for { 5923 _ = v.Args[1] 5924 x := v.Args[0] 5925 y := v.Args[1] 5926 if !(shiftIsBounded(v)) { 5927 break 5928 } 5929 v.reset(OpS390XSRW) 5930 v.AddArg(x) 5931 v.AddArg(y) 5932 return true 5933 } 5934 // match: (Rsh32Ux32 <t> x y) 5935 // cond: 5936 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 5937 for { 5938 t := v.Type 5939 _ = v.Args[1] 5940 x := v.Args[0] 5941 y := v.Args[1] 5942 v.reset(OpS390XMOVDGE) 5943 v.Type = t 5944 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5945 v0.AddArg(x) 5946 v0.AddArg(y) 5947 v.AddArg(v0) 5948 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5949 v1.AuxInt = 0 5950 v.AddArg(v1) 5951 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5952 v2.AuxInt = 64 5953 v2.AddArg(y) 5954 v.AddArg(v2) 5955 return true 5956 } 5957 } 5958 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5959 b := v.Block 5960 _ = b 5961 typ := &b.Func.Config.Types 5962 _ = typ 5963 // match: (Rsh32Ux64 x y) 5964 // cond: shiftIsBounded(v) 5965 // result: (SRW x y) 5966 for { 5967 _ = v.Args[1] 5968 x := v.Args[0] 5969 y := v.Args[1] 5970 if !(shiftIsBounded(v)) { 5971 break 5972 } 5973 v.reset(OpS390XSRW) 5974 v.AddArg(x) 5975 v.AddArg(y) 5976 return true 5977 } 5978 // match: (Rsh32Ux64 <t> x y) 5979 // cond: 5980 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 5981 for { 5982 t := v.Type 5983 _ = v.Args[1] 5984 x := v.Args[0] 5985 y := v.Args[1] 5986 v.reset(OpS390XMOVDGE) 5987 v.Type = t 5988 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5989 v0.AddArg(x) 5990 v0.AddArg(y) 5991 v.AddArg(v0) 5992 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5993 v1.AuxInt = 0 5994 v.AddArg(v1) 5995 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5996 v2.AuxInt = 64 5997 v2.AddArg(y) 5998 v.AddArg(v2) 5999 return true 6000 } 6001 } 6002 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 6003 b := v.Block 6004 _ = b 6005 typ := &b.Func.Config.Types 6006 _ = typ 6007 // match: (Rsh32Ux8 x y) 6008 // cond: shiftIsBounded(v) 6009 // result: (SRW x y) 6010 for { 6011 _ = v.Args[1] 6012 x := v.Args[0] 6013 y := v.Args[1] 6014 if !(shiftIsBounded(v)) { 6015 break 6016 } 6017 v.reset(OpS390XSRW) 6018 v.AddArg(x) 6019 v.AddArg(y) 6020 return true 6021 } 6022 // match: (Rsh32Ux8 <t> x y) 6023 // cond: 6024 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6025 for { 6026 t := v.Type 6027 _ = v.Args[1] 6028 x := v.Args[0] 6029 y := v.Args[1] 6030 v.reset(OpS390XMOVDGE) 6031 v.Type = t 6032 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6033 v0.AddArg(x) 6034 v0.AddArg(y) 6035 v.AddArg(v0) 6036 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6037 v1.AuxInt = 0 6038 v.AddArg(v1) 6039 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6040 v2.AuxInt = 64 6041 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6042 v3.AddArg(y) 6043 v2.AddArg(v3) 6044 v.AddArg(v2) 6045 return true 6046 } 6047 } 6048 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 6049 b := v.Block 6050 _ = b 6051 typ := &b.Func.Config.Types 6052 _ = typ 6053 // match: (Rsh32x16 x y) 6054 // cond: shiftIsBounded(v) 6055 // result: (SRAW x y) 6056 for { 6057 _ = v.Args[1] 6058 x := v.Args[0] 6059 y := v.Args[1] 6060 if !(shiftIsBounded(v)) { 6061 break 6062 } 6063 v.reset(OpS390XSRAW) 6064 v.AddArg(x) 6065 v.AddArg(y) 6066 return true 6067 } 6068 // match: (Rsh32x16 x y) 6069 // cond: 6070 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6071 for { 6072 _ = v.Args[1] 6073 x := v.Args[0] 6074 y := v.Args[1] 6075 v.reset(OpS390XSRAW) 6076 v.AddArg(x) 6077 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6078 v0.AddArg(y) 6079 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6080 v1.AuxInt = 63 6081 v0.AddArg(v1) 6082 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6083 v2.AuxInt = 64 6084 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6085 v3.AddArg(y) 6086 v2.AddArg(v3) 6087 v0.AddArg(v2) 6088 v.AddArg(v0) 6089 return true 6090 } 6091 } 6092 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 6093 b := v.Block 6094 _ = b 6095 // match: (Rsh32x32 x y) 6096 // cond: shiftIsBounded(v) 6097 // result: (SRAW x y) 6098 for { 6099 _ = v.Args[1] 6100 x := v.Args[0] 6101 y := v.Args[1] 6102 if !(shiftIsBounded(v)) { 6103 break 6104 } 6105 v.reset(OpS390XSRAW) 6106 v.AddArg(x) 6107 v.AddArg(y) 6108 return true 6109 } 6110 // match: (Rsh32x32 x y) 6111 // cond: 6112 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6113 for { 6114 _ = v.Args[1] 6115 x := v.Args[0] 6116 y := v.Args[1] 6117 v.reset(OpS390XSRAW) 6118 v.AddArg(x) 6119 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6120 v0.AddArg(y) 6121 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6122 v1.AuxInt = 63 6123 v0.AddArg(v1) 6124 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6125 v2.AuxInt = 64 6126 v2.AddArg(y) 6127 v0.AddArg(v2) 6128 v.AddArg(v0) 6129 return true 6130 } 6131 } 6132 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 6133 b := v.Block 6134 _ = b 6135 // match: (Rsh32x64 x y) 6136 // cond: shiftIsBounded(v) 6137 // result: (SRAW x y) 6138 for { 6139 _ = v.Args[1] 6140 x := v.Args[0] 6141 y := v.Args[1] 6142 if !(shiftIsBounded(v)) { 6143 break 6144 } 6145 v.reset(OpS390XSRAW) 6146 v.AddArg(x) 6147 v.AddArg(y) 6148 return true 6149 } 6150 // match: (Rsh32x64 x y) 6151 // cond: 6152 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6153 for { 6154 _ = v.Args[1] 6155 x := v.Args[0] 6156 y := v.Args[1] 6157 v.reset(OpS390XSRAW) 6158 v.AddArg(x) 6159 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6160 v0.AddArg(y) 6161 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6162 v1.AuxInt = 63 6163 v0.AddArg(v1) 6164 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6165 v2.AuxInt = 64 6166 v2.AddArg(y) 6167 v0.AddArg(v2) 6168 v.AddArg(v0) 6169 return true 6170 } 6171 } 6172 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 6173 b := v.Block 6174 _ = b 6175 typ := &b.Func.Config.Types 6176 _ = typ 6177 // match: (Rsh32x8 x y) 6178 // cond: shiftIsBounded(v) 6179 // result: (SRAW x y) 6180 for { 6181 _ = v.Args[1] 6182 x := v.Args[0] 6183 y := v.Args[1] 6184 if !(shiftIsBounded(v)) { 6185 break 6186 } 6187 v.reset(OpS390XSRAW) 6188 v.AddArg(x) 6189 v.AddArg(y) 6190 return true 6191 } 6192 // match: (Rsh32x8 x y) 6193 // cond: 6194 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6195 for { 6196 _ = v.Args[1] 6197 x := v.Args[0] 6198 y := v.Args[1] 6199 v.reset(OpS390XSRAW) 6200 v.AddArg(x) 6201 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6202 v0.AddArg(y) 6203 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6204 v1.AuxInt = 63 6205 v0.AddArg(v1) 6206 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6207 v2.AuxInt = 64 6208 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6209 v3.AddArg(y) 6210 v2.AddArg(v3) 6211 v0.AddArg(v2) 6212 v.AddArg(v0) 6213 return true 6214 } 6215 } 6216 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 6217 b := v.Block 6218 _ = b 6219 typ := &b.Func.Config.Types 6220 _ = typ 6221 // match: (Rsh64Ux16 x y) 6222 // cond: shiftIsBounded(v) 6223 // result: (SRD x y) 6224 for { 6225 _ = v.Args[1] 6226 x := v.Args[0] 6227 y := v.Args[1] 6228 if !(shiftIsBounded(v)) { 6229 break 6230 } 6231 v.reset(OpS390XSRD) 6232 v.AddArg(x) 6233 v.AddArg(y) 6234 return true 6235 } 6236 // match: (Rsh64Ux16 <t> x y) 6237 // cond: 6238 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 6239 for { 6240 t := v.Type 6241 _ = v.Args[1] 6242 x := v.Args[0] 6243 y := v.Args[1] 6244 v.reset(OpS390XMOVDGE) 6245 v.Type = t 6246 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6247 v0.AddArg(x) 6248 v0.AddArg(y) 6249 v.AddArg(v0) 6250 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6251 v1.AuxInt = 0 6252 v.AddArg(v1) 6253 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6254 v2.AuxInt = 64 6255 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6256 v3.AddArg(y) 6257 v2.AddArg(v3) 6258 v.AddArg(v2) 6259 return true 6260 } 6261 } 6262 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 6263 b := v.Block 6264 _ = b 6265 typ := &b.Func.Config.Types 6266 _ = typ 6267 // match: (Rsh64Ux32 x y) 6268 // cond: shiftIsBounded(v) 6269 // result: (SRD x y) 6270 for { 6271 _ = v.Args[1] 6272 x := v.Args[0] 6273 y := v.Args[1] 6274 if !(shiftIsBounded(v)) { 6275 break 6276 } 6277 v.reset(OpS390XSRD) 6278 v.AddArg(x) 6279 v.AddArg(y) 6280 return true 6281 } 6282 // match: (Rsh64Ux32 <t> x y) 6283 // cond: 6284 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 6285 for { 6286 t := v.Type 6287 _ = v.Args[1] 6288 x := v.Args[0] 6289 y := v.Args[1] 6290 v.reset(OpS390XMOVDGE) 6291 v.Type = t 6292 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6293 v0.AddArg(x) 6294 v0.AddArg(y) 6295 v.AddArg(v0) 6296 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6297 v1.AuxInt = 0 6298 v.AddArg(v1) 6299 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6300 v2.AuxInt = 64 6301 v2.AddArg(y) 6302 v.AddArg(v2) 6303 return true 6304 } 6305 } 6306 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 6307 b := v.Block 6308 _ = b 6309 typ := &b.Func.Config.Types 6310 _ = typ 6311 // match: (Rsh64Ux64 x y) 6312 // cond: shiftIsBounded(v) 6313 // result: (SRD x y) 6314 for { 6315 _ = v.Args[1] 6316 x := v.Args[0] 6317 y := v.Args[1] 6318 if !(shiftIsBounded(v)) { 6319 break 6320 } 6321 v.reset(OpS390XSRD) 6322 v.AddArg(x) 6323 v.AddArg(y) 6324 return true 6325 } 6326 // match: (Rsh64Ux64 <t> x y) 6327 // cond: 6328 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 6329 for { 6330 t := v.Type 6331 _ = v.Args[1] 6332 x := v.Args[0] 6333 y := v.Args[1] 6334 v.reset(OpS390XMOVDGE) 6335 v.Type = t 6336 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6337 v0.AddArg(x) 6338 v0.AddArg(y) 6339 v.AddArg(v0) 6340 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6341 v1.AuxInt = 0 6342 v.AddArg(v1) 6343 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6344 v2.AuxInt = 64 6345 v2.AddArg(y) 6346 v.AddArg(v2) 6347 return true 6348 } 6349 } 6350 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 6351 b := v.Block 6352 _ = b 6353 typ := &b.Func.Config.Types 6354 _ = typ 6355 // match: (Rsh64Ux8 x y) 6356 // cond: shiftIsBounded(v) 6357 // result: (SRD x y) 6358 for { 6359 _ = v.Args[1] 6360 x := v.Args[0] 6361 y := v.Args[1] 6362 if !(shiftIsBounded(v)) { 6363 break 6364 } 6365 v.reset(OpS390XSRD) 6366 v.AddArg(x) 6367 v.AddArg(y) 6368 return true 6369 } 6370 // match: (Rsh64Ux8 <t> x y) 6371 // cond: 6372 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6373 for { 6374 t := v.Type 6375 _ = v.Args[1] 6376 x := v.Args[0] 6377 y := v.Args[1] 6378 v.reset(OpS390XMOVDGE) 6379 v.Type = t 6380 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6381 v0.AddArg(x) 6382 v0.AddArg(y) 6383 v.AddArg(v0) 6384 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6385 v1.AuxInt = 0 6386 v.AddArg(v1) 6387 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6388 v2.AuxInt = 64 6389 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6390 v3.AddArg(y) 6391 v2.AddArg(v3) 6392 v.AddArg(v2) 6393 return true 6394 } 6395 } 6396 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 6397 b := v.Block 6398 _ = b 6399 typ := &b.Func.Config.Types 6400 _ = typ 6401 // match: (Rsh64x16 x y) 6402 // cond: shiftIsBounded(v) 6403 // result: (SRAD x y) 6404 for { 6405 _ = v.Args[1] 6406 x := v.Args[0] 6407 y := v.Args[1] 6408 if !(shiftIsBounded(v)) { 6409 break 6410 } 6411 v.reset(OpS390XSRAD) 6412 v.AddArg(x) 6413 v.AddArg(y) 6414 return true 6415 } 6416 // match: (Rsh64x16 x y) 6417 // cond: 6418 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6419 for { 6420 _ = v.Args[1] 6421 x := v.Args[0] 6422 y := v.Args[1] 6423 v.reset(OpS390XSRAD) 6424 v.AddArg(x) 6425 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6426 v0.AddArg(y) 6427 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6428 v1.AuxInt = 63 6429 v0.AddArg(v1) 6430 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6431 v2.AuxInt = 64 6432 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6433 v3.AddArg(y) 6434 v2.AddArg(v3) 6435 v0.AddArg(v2) 6436 v.AddArg(v0) 6437 return true 6438 } 6439 } 6440 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 6441 b := v.Block 6442 _ = b 6443 // match: (Rsh64x32 x y) 6444 // cond: shiftIsBounded(v) 6445 // result: (SRAD x y) 6446 for { 6447 _ = v.Args[1] 6448 x := v.Args[0] 6449 y := v.Args[1] 6450 if !(shiftIsBounded(v)) { 6451 break 6452 } 6453 v.reset(OpS390XSRAD) 6454 v.AddArg(x) 6455 v.AddArg(y) 6456 return true 6457 } 6458 // match: (Rsh64x32 x y) 6459 // cond: 6460 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6461 for { 6462 _ = v.Args[1] 6463 x := v.Args[0] 6464 y := v.Args[1] 6465 v.reset(OpS390XSRAD) 6466 v.AddArg(x) 6467 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6468 v0.AddArg(y) 6469 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6470 v1.AuxInt = 63 6471 v0.AddArg(v1) 6472 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6473 v2.AuxInt = 64 6474 v2.AddArg(y) 6475 v0.AddArg(v2) 6476 v.AddArg(v0) 6477 return true 6478 } 6479 } 6480 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 6481 b := v.Block 6482 _ = b 6483 // match: (Rsh64x64 x y) 6484 // cond: shiftIsBounded(v) 6485 // result: (SRAD x y) 6486 for { 6487 _ = v.Args[1] 6488 x := v.Args[0] 6489 y := v.Args[1] 6490 if !(shiftIsBounded(v)) { 6491 break 6492 } 6493 v.reset(OpS390XSRAD) 6494 v.AddArg(x) 6495 v.AddArg(y) 6496 return true 6497 } 6498 // match: (Rsh64x64 x y) 6499 // cond: 6500 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6501 for { 6502 _ = v.Args[1] 6503 x := v.Args[0] 6504 y := v.Args[1] 6505 v.reset(OpS390XSRAD) 6506 v.AddArg(x) 6507 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6508 v0.AddArg(y) 6509 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6510 v1.AuxInt = 63 6511 v0.AddArg(v1) 6512 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6513 v2.AuxInt = 64 6514 v2.AddArg(y) 6515 v0.AddArg(v2) 6516 v.AddArg(v0) 6517 return true 6518 } 6519 } 6520 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 6521 b := v.Block 6522 _ = b 6523 typ := &b.Func.Config.Types 6524 _ = typ 6525 // match: (Rsh64x8 x y) 6526 // cond: shiftIsBounded(v) 6527 // result: (SRAD x y) 6528 for { 6529 _ = v.Args[1] 6530 x := v.Args[0] 6531 y := v.Args[1] 6532 if !(shiftIsBounded(v)) { 6533 break 6534 } 6535 v.reset(OpS390XSRAD) 6536 v.AddArg(x) 6537 v.AddArg(y) 6538 return true 6539 } 6540 // match: (Rsh64x8 x y) 6541 // cond: 6542 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6543 for { 6544 _ = v.Args[1] 6545 x := v.Args[0] 6546 y := v.Args[1] 6547 v.reset(OpS390XSRAD) 6548 v.AddArg(x) 6549 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6550 v0.AddArg(y) 6551 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6552 v1.AuxInt = 63 6553 v0.AddArg(v1) 6554 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6555 v2.AuxInt = 64 6556 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6557 v3.AddArg(y) 6558 v2.AddArg(v3) 6559 v0.AddArg(v2) 6560 v.AddArg(v0) 6561 return true 6562 } 6563 } 6564 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 6565 b := v.Block 6566 _ = b 6567 typ := &b.Func.Config.Types 6568 _ = typ 6569 // match: (Rsh8Ux16 x y) 6570 // cond: shiftIsBounded(v) 6571 // result: (SRW (MOVBZreg x) y) 6572 for { 6573 _ = v.Args[1] 6574 x := v.Args[0] 6575 y := v.Args[1] 6576 if !(shiftIsBounded(v)) { 6577 break 6578 } 6579 v.reset(OpS390XSRW) 6580 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6581 v0.AddArg(x) 6582 v.AddArg(v0) 6583 v.AddArg(y) 6584 return true 6585 } 6586 // match: (Rsh8Ux16 <t> x y) 6587 // cond: 6588 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 6589 for { 6590 t := v.Type 6591 _ = v.Args[1] 6592 x := v.Args[0] 6593 y := v.Args[1] 6594 v.reset(OpS390XMOVDGE) 6595 v.Type = t 6596 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6597 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6598 v1.AddArg(x) 6599 v0.AddArg(v1) 6600 v0.AddArg(y) 6601 v.AddArg(v0) 6602 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6603 v2.AuxInt = 0 6604 v.AddArg(v2) 6605 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6606 v3.AuxInt = 64 6607 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6608 v4.AddArg(y) 6609 v3.AddArg(v4) 6610 v.AddArg(v3) 6611 return true 6612 } 6613 } 6614 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 6615 b := v.Block 6616 _ = b 6617 typ := &b.Func.Config.Types 6618 _ = typ 6619 // match: (Rsh8Ux32 x y) 6620 // cond: shiftIsBounded(v) 6621 // result: (SRW (MOVBZreg x) y) 6622 for { 6623 _ = v.Args[1] 6624 x := v.Args[0] 6625 y := v.Args[1] 6626 if !(shiftIsBounded(v)) { 6627 break 6628 } 6629 v.reset(OpS390XSRW) 6630 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6631 v0.AddArg(x) 6632 v.AddArg(v0) 6633 v.AddArg(y) 6634 return true 6635 } 6636 // match: (Rsh8Ux32 <t> x y) 6637 // cond: 6638 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) 6639 for { 6640 t := v.Type 6641 _ = v.Args[1] 6642 x := v.Args[0] 6643 y := v.Args[1] 6644 v.reset(OpS390XMOVDGE) 6645 v.Type = t 6646 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6647 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6648 v1.AddArg(x) 6649 v0.AddArg(v1) 6650 v0.AddArg(y) 6651 v.AddArg(v0) 6652 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6653 v2.AuxInt = 0 6654 v.AddArg(v2) 6655 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6656 v3.AuxInt = 64 6657 v3.AddArg(y) 6658 v.AddArg(v3) 6659 return true 6660 } 6661 } 6662 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 6663 b := v.Block 6664 _ = b 6665 typ := &b.Func.Config.Types 6666 _ = typ 6667 // match: (Rsh8Ux64 x y) 6668 // cond: shiftIsBounded(v) 6669 // result: (SRW (MOVBZreg x) y) 6670 for { 6671 _ = v.Args[1] 6672 x := v.Args[0] 6673 y := v.Args[1] 6674 if !(shiftIsBounded(v)) { 6675 break 6676 } 6677 v.reset(OpS390XSRW) 6678 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6679 v0.AddArg(x) 6680 v.AddArg(v0) 6681 v.AddArg(y) 6682 return true 6683 } 6684 // match: (Rsh8Ux64 <t> x y) 6685 // cond: 6686 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) 6687 for { 6688 t := v.Type 6689 _ = v.Args[1] 6690 x := v.Args[0] 6691 y := v.Args[1] 6692 v.reset(OpS390XMOVDGE) 6693 v.Type = t 6694 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6695 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6696 v1.AddArg(x) 6697 v0.AddArg(v1) 6698 v0.AddArg(y) 6699 v.AddArg(v0) 6700 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6701 v2.AuxInt = 0 6702 v.AddArg(v2) 6703 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6704 v3.AuxInt = 64 6705 v3.AddArg(y) 6706 v.AddArg(v3) 6707 return true 6708 } 6709 } 6710 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 6711 b := v.Block 6712 _ = b 6713 typ := &b.Func.Config.Types 6714 _ = typ 6715 // match: (Rsh8Ux8 x y) 6716 // cond: shiftIsBounded(v) 6717 // result: (SRW (MOVBZreg x) y) 6718 for { 6719 _ = v.Args[1] 6720 x := v.Args[0] 6721 y := v.Args[1] 6722 if !(shiftIsBounded(v)) { 6723 break 6724 } 6725 v.reset(OpS390XSRW) 6726 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6727 v0.AddArg(x) 6728 v.AddArg(v0) 6729 v.AddArg(y) 6730 return true 6731 } 6732 // match: (Rsh8Ux8 <t> x y) 6733 // cond: 6734 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6735 for { 6736 t := v.Type 6737 _ = v.Args[1] 6738 x := v.Args[0] 6739 y := v.Args[1] 6740 v.reset(OpS390XMOVDGE) 6741 v.Type = t 6742 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6743 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6744 v1.AddArg(x) 6745 v0.AddArg(v1) 6746 v0.AddArg(y) 6747 v.AddArg(v0) 6748 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6749 v2.AuxInt = 0 6750 v.AddArg(v2) 6751 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6752 v3.AuxInt = 64 6753 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6754 v4.AddArg(y) 6755 v3.AddArg(v4) 6756 v.AddArg(v3) 6757 return true 6758 } 6759 } 6760 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 6761 b := v.Block 6762 _ = b 6763 typ := &b.Func.Config.Types 6764 _ = typ 6765 // match: (Rsh8x16 x y) 6766 // cond: shiftIsBounded(v) 6767 // result: (SRAW (MOVBreg x) y) 6768 for { 6769 _ = v.Args[1] 6770 x := v.Args[0] 6771 y := v.Args[1] 6772 if !(shiftIsBounded(v)) { 6773 break 6774 } 6775 v.reset(OpS390XSRAW) 6776 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6777 v0.AddArg(x) 6778 v.AddArg(v0) 6779 v.AddArg(y) 6780 return true 6781 } 6782 // match: (Rsh8x16 x y) 6783 // cond: 6784 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6785 for { 6786 _ = v.Args[1] 6787 x := v.Args[0] 6788 y := v.Args[1] 6789 v.reset(OpS390XSRAW) 6790 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6791 v0.AddArg(x) 6792 v.AddArg(v0) 6793 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6794 v1.AddArg(y) 6795 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6796 v2.AuxInt = 63 6797 v1.AddArg(v2) 6798 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6799 v3.AuxInt = 64 6800 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6801 v4.AddArg(y) 6802 v3.AddArg(v4) 6803 v1.AddArg(v3) 6804 v.AddArg(v1) 6805 return true 6806 } 6807 } 6808 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 6809 b := v.Block 6810 _ = b 6811 typ := &b.Func.Config.Types 6812 _ = typ 6813 // match: (Rsh8x32 x y) 6814 // cond: shiftIsBounded(v) 6815 // result: (SRAW (MOVBreg x) y) 6816 for { 6817 _ = v.Args[1] 6818 x := v.Args[0] 6819 y := v.Args[1] 6820 if !(shiftIsBounded(v)) { 6821 break 6822 } 6823 v.reset(OpS390XSRAW) 6824 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6825 v0.AddArg(x) 6826 v.AddArg(v0) 6827 v.AddArg(y) 6828 return true 6829 } 6830 // match: (Rsh8x32 x y) 6831 // cond: 6832 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6833 for { 6834 _ = v.Args[1] 6835 x := v.Args[0] 6836 y := v.Args[1] 6837 v.reset(OpS390XSRAW) 6838 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6839 v0.AddArg(x) 6840 v.AddArg(v0) 6841 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6842 v1.AddArg(y) 6843 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6844 v2.AuxInt = 63 6845 v1.AddArg(v2) 6846 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6847 v3.AuxInt = 64 6848 v3.AddArg(y) 6849 v1.AddArg(v3) 6850 v.AddArg(v1) 6851 return true 6852 } 6853 } 6854 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 6855 b := v.Block 6856 _ = b 6857 typ := &b.Func.Config.Types 6858 _ = typ 6859 // match: (Rsh8x64 x y) 6860 // cond: shiftIsBounded(v) 6861 // result: (SRAW (MOVBreg x) y) 6862 for { 6863 _ = v.Args[1] 6864 x := v.Args[0] 6865 y := v.Args[1] 6866 if !(shiftIsBounded(v)) { 6867 break 6868 } 6869 v.reset(OpS390XSRAW) 6870 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6871 v0.AddArg(x) 6872 v.AddArg(v0) 6873 v.AddArg(y) 6874 return true 6875 } 6876 // match: (Rsh8x64 x y) 6877 // cond: 6878 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6879 for { 6880 _ = v.Args[1] 6881 x := v.Args[0] 6882 y := v.Args[1] 6883 v.reset(OpS390XSRAW) 6884 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6885 v0.AddArg(x) 6886 v.AddArg(v0) 6887 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6888 v1.AddArg(y) 6889 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6890 v2.AuxInt = 63 6891 v1.AddArg(v2) 6892 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6893 v3.AuxInt = 64 6894 v3.AddArg(y) 6895 v1.AddArg(v3) 6896 v.AddArg(v1) 6897 return true 6898 } 6899 } 6900 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 6901 b := v.Block 6902 _ = b 6903 typ := &b.Func.Config.Types 6904 _ = typ 6905 // match: (Rsh8x8 x y) 6906 // cond: shiftIsBounded(v) 6907 // result: (SRAW (MOVBreg x) y) 6908 for { 6909 _ = v.Args[1] 6910 x := v.Args[0] 6911 y := v.Args[1] 6912 if !(shiftIsBounded(v)) { 6913 break 6914 } 6915 v.reset(OpS390XSRAW) 6916 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6917 v0.AddArg(x) 6918 v.AddArg(v0) 6919 v.AddArg(y) 6920 return true 6921 } 6922 // match: (Rsh8x8 x y) 6923 // cond: 6924 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6925 for { 6926 _ = v.Args[1] 6927 x := v.Args[0] 6928 y := v.Args[1] 6929 v.reset(OpS390XSRAW) 6930 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6931 v0.AddArg(x) 6932 v.AddArg(v0) 6933 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6934 v1.AddArg(y) 6935 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6936 v2.AuxInt = 63 6937 v1.AddArg(v2) 6938 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6939 v3.AuxInt = 64 6940 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6941 v4.AddArg(y) 6942 v3.AddArg(v4) 6943 v1.AddArg(v3) 6944 v.AddArg(v1) 6945 return true 6946 } 6947 } 6948 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 6949 // match: (ADD x (MOVDconst [c])) 6950 // cond: is32Bit(c) 6951 // result: (ADDconst [c] x) 6952 for { 6953 _ = v.Args[1] 6954 x := v.Args[0] 6955 v_1 := v.Args[1] 6956 if v_1.Op != OpS390XMOVDconst { 6957 break 6958 } 6959 c := v_1.AuxInt 6960 if !(is32Bit(c)) { 6961 break 6962 } 6963 v.reset(OpS390XADDconst) 6964 v.AuxInt = c 6965 v.AddArg(x) 6966 return true 6967 } 6968 // match: (ADD (MOVDconst [c]) x) 6969 // cond: is32Bit(c) 6970 // result: (ADDconst [c] x) 6971 for { 6972 _ = v.Args[1] 6973 v_0 := v.Args[0] 6974 if v_0.Op != OpS390XMOVDconst { 6975 break 6976 } 6977 c := v_0.AuxInt 6978 x := v.Args[1] 6979 if !(is32Bit(c)) { 6980 break 6981 } 6982 v.reset(OpS390XADDconst) 6983 v.AuxInt = c 6984 v.AddArg(x) 6985 return true 6986 } 6987 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 6988 // cond: d == 64-c 6989 // result: (RLLGconst [c] x) 6990 for { 6991 _ = v.Args[1] 6992 v_0 := v.Args[0] 6993 if v_0.Op != OpS390XSLDconst { 6994 break 6995 } 6996 c := v_0.AuxInt 6997 x := v_0.Args[0] 6998 v_1 := v.Args[1] 6999 if v_1.Op != OpS390XSRDconst { 7000 break 7001 } 7002 d := v_1.AuxInt 7003 if x != v_1.Args[0] { 7004 break 7005 } 7006 if !(d == 64-c) { 7007 break 7008 } 7009 v.reset(OpS390XRLLGconst) 7010 v.AuxInt = c 7011 v.AddArg(x) 7012 return true 7013 } 7014 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 7015 // cond: d == 64-c 7016 // result: (RLLGconst [c] x) 7017 for { 7018 _ = v.Args[1] 7019 v_0 := v.Args[0] 7020 if v_0.Op != OpS390XSRDconst { 7021 break 7022 } 7023 d := v_0.AuxInt 7024 x := v_0.Args[0] 7025 v_1 := v.Args[1] 7026 if v_1.Op != OpS390XSLDconst { 7027 break 7028 } 7029 c := v_1.AuxInt 7030 if x != v_1.Args[0] { 7031 break 7032 } 7033 if !(d == 64-c) { 7034 break 7035 } 7036 v.reset(OpS390XRLLGconst) 7037 v.AuxInt = c 7038 v.AddArg(x) 7039 return true 7040 } 7041 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 7042 // cond: ptr.Op != OpSB && idx.Op != OpSB 7043 // result: (MOVDaddridx [c] {s} ptr idx) 7044 for { 7045 _ = v.Args[1] 7046 idx := v.Args[0] 7047 v_1 := v.Args[1] 7048 if v_1.Op != OpS390XMOVDaddr { 7049 break 7050 } 7051 c := v_1.AuxInt 7052 s := v_1.Aux 7053 ptr := v_1.Args[0] 7054 if !(ptr.Op != OpSB && idx.Op != OpSB) { 7055 break 7056 } 7057 v.reset(OpS390XMOVDaddridx) 7058 v.AuxInt = c 7059 v.Aux = s 7060 v.AddArg(ptr) 7061 v.AddArg(idx) 7062 return true 7063 } 7064 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 7065 // cond: ptr.Op != OpSB && idx.Op != OpSB 7066 // result: (MOVDaddridx [c] {s} ptr idx) 7067 for { 7068 _ = v.Args[1] 7069 v_0 := v.Args[0] 7070 if v_0.Op != OpS390XMOVDaddr { 7071 break 7072 } 7073 c := v_0.AuxInt 7074 s := v_0.Aux 7075 ptr := v_0.Args[0] 7076 idx := v.Args[1] 7077 if !(ptr.Op != OpSB && idx.Op != OpSB) { 7078 break 7079 } 7080 v.reset(OpS390XMOVDaddridx) 7081 v.AuxInt = c 7082 v.Aux = s 7083 v.AddArg(ptr) 7084 v.AddArg(idx) 7085 return true 7086 } 7087 // match: (ADD x (NEG y)) 7088 // cond: 7089 // result: (SUB x y) 7090 for { 7091 _ = v.Args[1] 7092 x := v.Args[0] 7093 v_1 := v.Args[1] 7094 if v_1.Op != OpS390XNEG { 7095 break 7096 } 7097 y := v_1.Args[0] 7098 v.reset(OpS390XSUB) 7099 v.AddArg(x) 7100 v.AddArg(y) 7101 return true 7102 } 7103 // match: (ADD (NEG y) x) 7104 // cond: 7105 // result: (SUB x y) 7106 for { 7107 _ = v.Args[1] 7108 v_0 := v.Args[0] 7109 if v_0.Op != OpS390XNEG { 7110 break 7111 } 7112 y := v_0.Args[0] 7113 x := v.Args[1] 7114 v.reset(OpS390XSUB) 7115 v.AddArg(x) 7116 v.AddArg(y) 7117 return true 7118 } 7119 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 7120 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7121 // result: (ADDload <t> [off] {sym} x ptr mem) 7122 for { 7123 t := v.Type 7124 _ = v.Args[1] 7125 x := v.Args[0] 7126 g := v.Args[1] 7127 if g.Op != OpS390XMOVDload { 7128 break 7129 } 7130 off := g.AuxInt 7131 sym := g.Aux 7132 _ = g.Args[1] 7133 ptr := g.Args[0] 7134 mem := g.Args[1] 7135 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7136 break 7137 } 7138 v.reset(OpS390XADDload) 7139 v.Type = t 7140 v.AuxInt = off 7141 v.Aux = sym 7142 v.AddArg(x) 7143 v.AddArg(ptr) 7144 v.AddArg(mem) 7145 return true 7146 } 7147 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 7148 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7149 // result: (ADDload <t> [off] {sym} x ptr mem) 7150 for { 7151 t := v.Type 7152 _ = v.Args[1] 7153 g := v.Args[0] 7154 if g.Op != OpS390XMOVDload { 7155 break 7156 } 7157 off := g.AuxInt 7158 sym := g.Aux 7159 _ = g.Args[1] 7160 ptr := g.Args[0] 7161 mem := g.Args[1] 7162 x := v.Args[1] 7163 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7164 break 7165 } 7166 v.reset(OpS390XADDload) 7167 v.Type = t 7168 v.AuxInt = off 7169 v.Aux = sym 7170 v.AddArg(x) 7171 v.AddArg(ptr) 7172 v.AddArg(mem) 7173 return true 7174 } 7175 return false 7176 } 7177 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 7178 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 7179 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7180 // result: (ADDload <t> [off] {sym} x ptr mem) 7181 for { 7182 t := v.Type 7183 _ = v.Args[1] 7184 g := v.Args[0] 7185 if g.Op != OpS390XMOVDload { 7186 break 7187 } 7188 off := g.AuxInt 7189 sym := g.Aux 7190 _ = g.Args[1] 7191 ptr := g.Args[0] 7192 mem := g.Args[1] 7193 x := v.Args[1] 7194 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7195 break 7196 } 7197 v.reset(OpS390XADDload) 7198 v.Type = t 7199 v.AuxInt = off 7200 v.Aux = sym 7201 v.AddArg(x) 7202 v.AddArg(ptr) 7203 v.AddArg(mem) 7204 return true 7205 } 7206 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 7207 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7208 // result: (ADDload <t> [off] {sym} x ptr mem) 7209 for { 7210 t := v.Type 7211 _ = v.Args[1] 7212 x := v.Args[0] 7213 g := v.Args[1] 7214 if g.Op != OpS390XMOVDload { 7215 break 7216 } 7217 off := g.AuxInt 7218 sym := g.Aux 7219 _ = g.Args[1] 7220 ptr := g.Args[0] 7221 mem := g.Args[1] 7222 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7223 break 7224 } 7225 v.reset(OpS390XADDload) 7226 v.Type = t 7227 v.AuxInt = off 7228 v.Aux = sym 7229 v.AddArg(x) 7230 v.AddArg(ptr) 7231 v.AddArg(mem) 7232 return true 7233 } 7234 return false 7235 } 7236 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 7237 // match: (ADDW x (MOVDconst [c])) 7238 // cond: 7239 // result: (ADDWconst [int64(int32(c))] x) 7240 for { 7241 _ = v.Args[1] 7242 x := v.Args[0] 7243 v_1 := v.Args[1] 7244 if v_1.Op != OpS390XMOVDconst { 7245 break 7246 } 7247 c := v_1.AuxInt 7248 v.reset(OpS390XADDWconst) 7249 v.AuxInt = int64(int32(c)) 7250 v.AddArg(x) 7251 return true 7252 } 7253 // match: (ADDW (MOVDconst [c]) x) 7254 // cond: 7255 // result: (ADDWconst [int64(int32(c))] x) 7256 for { 7257 _ = v.Args[1] 7258 v_0 := v.Args[0] 7259 if v_0.Op != OpS390XMOVDconst { 7260 break 7261 } 7262 c := v_0.AuxInt 7263 x := v.Args[1] 7264 v.reset(OpS390XADDWconst) 7265 v.AuxInt = int64(int32(c)) 7266 v.AddArg(x) 7267 return true 7268 } 7269 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 7270 // cond: d == 32-c 7271 // result: (RLLconst [c] x) 7272 for { 7273 _ = v.Args[1] 7274 v_0 := v.Args[0] 7275 if v_0.Op != OpS390XSLWconst { 7276 break 7277 } 7278 c := v_0.AuxInt 7279 x := v_0.Args[0] 7280 v_1 := v.Args[1] 7281 if v_1.Op != OpS390XSRWconst { 7282 break 7283 } 7284 d := v_1.AuxInt 7285 if x != v_1.Args[0] { 7286 break 7287 } 7288 if !(d == 32-c) { 7289 break 7290 } 7291 v.reset(OpS390XRLLconst) 7292 v.AuxInt = c 7293 v.AddArg(x) 7294 return true 7295 } 7296 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 7297 // cond: d == 32-c 7298 // result: (RLLconst [c] x) 7299 for { 7300 _ = v.Args[1] 7301 v_0 := v.Args[0] 7302 if v_0.Op != OpS390XSRWconst { 7303 break 7304 } 7305 d := v_0.AuxInt 7306 x := v_0.Args[0] 7307 v_1 := v.Args[1] 7308 if v_1.Op != OpS390XSLWconst { 7309 break 7310 } 7311 c := v_1.AuxInt 7312 if x != v_1.Args[0] { 7313 break 7314 } 7315 if !(d == 32-c) { 7316 break 7317 } 7318 v.reset(OpS390XRLLconst) 7319 v.AuxInt = c 7320 v.AddArg(x) 7321 return true 7322 } 7323 // match: (ADDW x (NEGW y)) 7324 // cond: 7325 // result: (SUBW x y) 7326 for { 7327 _ = v.Args[1] 7328 x := v.Args[0] 7329 v_1 := v.Args[1] 7330 if v_1.Op != OpS390XNEGW { 7331 break 7332 } 7333 y := v_1.Args[0] 7334 v.reset(OpS390XSUBW) 7335 v.AddArg(x) 7336 v.AddArg(y) 7337 return true 7338 } 7339 // match: (ADDW (NEGW y) x) 7340 // cond: 7341 // result: (SUBW x y) 7342 for { 7343 _ = v.Args[1] 7344 v_0 := v.Args[0] 7345 if v_0.Op != OpS390XNEGW { 7346 break 7347 } 7348 y := v_0.Args[0] 7349 x := v.Args[1] 7350 v.reset(OpS390XSUBW) 7351 v.AddArg(x) 7352 v.AddArg(y) 7353 return true 7354 } 7355 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7356 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7357 // result: (ADDWload <t> [off] {sym} x ptr mem) 7358 for { 7359 t := v.Type 7360 _ = v.Args[1] 7361 x := v.Args[0] 7362 g := v.Args[1] 7363 if g.Op != OpS390XMOVWload { 7364 break 7365 } 7366 off := g.AuxInt 7367 sym := g.Aux 7368 _ = g.Args[1] 7369 ptr := g.Args[0] 7370 mem := g.Args[1] 7371 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7372 break 7373 } 7374 v.reset(OpS390XADDWload) 7375 v.Type = t 7376 v.AuxInt = off 7377 v.Aux = sym 7378 v.AddArg(x) 7379 v.AddArg(ptr) 7380 v.AddArg(mem) 7381 return true 7382 } 7383 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7384 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7385 // result: (ADDWload <t> [off] {sym} x ptr mem) 7386 for { 7387 t := v.Type 7388 _ = v.Args[1] 7389 g := v.Args[0] 7390 if g.Op != OpS390XMOVWload { 7391 break 7392 } 7393 off := g.AuxInt 7394 sym := g.Aux 7395 _ = g.Args[1] 7396 ptr := g.Args[0] 7397 mem := g.Args[1] 7398 x := v.Args[1] 7399 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7400 break 7401 } 7402 v.reset(OpS390XADDWload) 7403 v.Type = t 7404 v.AuxInt = off 7405 v.Aux = sym 7406 v.AddArg(x) 7407 v.AddArg(ptr) 7408 v.AddArg(mem) 7409 return true 7410 } 7411 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7412 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7413 // result: (ADDWload <t> [off] {sym} x ptr mem) 7414 for { 7415 t := v.Type 7416 _ = v.Args[1] 7417 g := v.Args[0] 7418 if g.Op != OpS390XMOVWload { 7419 break 7420 } 7421 off := g.AuxInt 7422 sym := g.Aux 7423 _ = g.Args[1] 7424 ptr := g.Args[0] 7425 mem := g.Args[1] 7426 x := v.Args[1] 7427 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7428 break 7429 } 7430 v.reset(OpS390XADDWload) 7431 v.Type = t 7432 v.AuxInt = off 7433 v.Aux = sym 7434 v.AddArg(x) 7435 v.AddArg(ptr) 7436 v.AddArg(mem) 7437 return true 7438 } 7439 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7440 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7441 // result: (ADDWload <t> [off] {sym} x ptr mem) 7442 for { 7443 t := v.Type 7444 _ = v.Args[1] 7445 x := v.Args[0] 7446 g := v.Args[1] 7447 if g.Op != OpS390XMOVWload { 7448 break 7449 } 7450 off := g.AuxInt 7451 sym := g.Aux 7452 _ = g.Args[1] 7453 ptr := g.Args[0] 7454 mem := g.Args[1] 7455 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7456 break 7457 } 7458 v.reset(OpS390XADDWload) 7459 v.Type = t 7460 v.AuxInt = off 7461 v.Aux = sym 7462 v.AddArg(x) 7463 v.AddArg(ptr) 7464 v.AddArg(mem) 7465 return true 7466 } 7467 return false 7468 } 7469 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 7470 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7471 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7472 // result: (ADDWload <t> [off] {sym} x ptr mem) 7473 for { 7474 t := v.Type 7475 _ = v.Args[1] 7476 x := v.Args[0] 7477 g := v.Args[1] 7478 if g.Op != OpS390XMOVWZload { 7479 break 7480 } 7481 off := g.AuxInt 7482 sym := g.Aux 7483 _ = g.Args[1] 7484 ptr := g.Args[0] 7485 mem := g.Args[1] 7486 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7487 break 7488 } 7489 v.reset(OpS390XADDWload) 7490 v.Type = t 7491 v.AuxInt = off 7492 v.Aux = sym 7493 v.AddArg(x) 7494 v.AddArg(ptr) 7495 v.AddArg(mem) 7496 return true 7497 } 7498 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7499 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7500 // result: (ADDWload <t> [off] {sym} x ptr mem) 7501 for { 7502 t := v.Type 7503 _ = v.Args[1] 7504 g := v.Args[0] 7505 if g.Op != OpS390XMOVWZload { 7506 break 7507 } 7508 off := g.AuxInt 7509 sym := g.Aux 7510 _ = g.Args[1] 7511 ptr := g.Args[0] 7512 mem := g.Args[1] 7513 x := v.Args[1] 7514 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7515 break 7516 } 7517 v.reset(OpS390XADDWload) 7518 v.Type = t 7519 v.AuxInt = off 7520 v.Aux = sym 7521 v.AddArg(x) 7522 v.AddArg(ptr) 7523 v.AddArg(mem) 7524 return true 7525 } 7526 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7527 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7528 // result: (ADDWload <t> [off] {sym} x ptr mem) 7529 for { 7530 t := v.Type 7531 _ = v.Args[1] 7532 g := v.Args[0] 7533 if g.Op != OpS390XMOVWZload { 7534 break 7535 } 7536 off := g.AuxInt 7537 sym := g.Aux 7538 _ = g.Args[1] 7539 ptr := g.Args[0] 7540 mem := g.Args[1] 7541 x := v.Args[1] 7542 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7543 break 7544 } 7545 v.reset(OpS390XADDWload) 7546 v.Type = t 7547 v.AuxInt = off 7548 v.Aux = sym 7549 v.AddArg(x) 7550 v.AddArg(ptr) 7551 v.AddArg(mem) 7552 return true 7553 } 7554 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7555 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7556 // result: (ADDWload <t> [off] {sym} x ptr mem) 7557 for { 7558 t := v.Type 7559 _ = v.Args[1] 7560 x := v.Args[0] 7561 g := v.Args[1] 7562 if g.Op != OpS390XMOVWZload { 7563 break 7564 } 7565 off := g.AuxInt 7566 sym := g.Aux 7567 _ = g.Args[1] 7568 ptr := g.Args[0] 7569 mem := g.Args[1] 7570 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7571 break 7572 } 7573 v.reset(OpS390XADDWload) 7574 v.Type = t 7575 v.AuxInt = off 7576 v.Aux = sym 7577 v.AddArg(x) 7578 v.AddArg(ptr) 7579 v.AddArg(mem) 7580 return true 7581 } 7582 return false 7583 } 7584 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 7585 // match: (ADDWconst [c] x) 7586 // cond: int32(c)==0 7587 // result: x 7588 for { 7589 c := v.AuxInt 7590 x := v.Args[0] 7591 if !(int32(c) == 0) { 7592 break 7593 } 7594 v.reset(OpCopy) 7595 v.Type = x.Type 7596 v.AddArg(x) 7597 return true 7598 } 7599 // match: (ADDWconst [c] (MOVDconst [d])) 7600 // cond: 7601 // result: (MOVDconst [int64(int32(c+d))]) 7602 for { 7603 c := v.AuxInt 7604 v_0 := v.Args[0] 7605 if v_0.Op != OpS390XMOVDconst { 7606 break 7607 } 7608 d := v_0.AuxInt 7609 v.reset(OpS390XMOVDconst) 7610 v.AuxInt = int64(int32(c + d)) 7611 return true 7612 } 7613 // match: (ADDWconst [c] (ADDWconst [d] x)) 7614 // cond: 7615 // result: (ADDWconst [int64(int32(c+d))] x) 7616 for { 7617 c := v.AuxInt 7618 v_0 := v.Args[0] 7619 if v_0.Op != OpS390XADDWconst { 7620 break 7621 } 7622 d := v_0.AuxInt 7623 x := v_0.Args[0] 7624 v.reset(OpS390XADDWconst) 7625 v.AuxInt = int64(int32(c + d)) 7626 v.AddArg(x) 7627 return true 7628 } 7629 return false 7630 } 7631 func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { 7632 // match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 7633 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7634 // result: (ADDWload [off1+off2] {sym} x ptr mem) 7635 for { 7636 off1 := v.AuxInt 7637 sym := v.Aux 7638 _ = v.Args[2] 7639 x := v.Args[0] 7640 v_1 := v.Args[1] 7641 if v_1.Op != OpS390XADDconst { 7642 break 7643 } 7644 off2 := v_1.AuxInt 7645 ptr := v_1.Args[0] 7646 mem := v.Args[2] 7647 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7648 break 7649 } 7650 v.reset(OpS390XADDWload) 7651 v.AuxInt = off1 + off2 7652 v.Aux = sym 7653 v.AddArg(x) 7654 v.AddArg(ptr) 7655 v.AddArg(mem) 7656 return true 7657 } 7658 // match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7659 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7660 // result: (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7661 for { 7662 o1 := v.AuxInt 7663 s1 := v.Aux 7664 _ = v.Args[2] 7665 x := v.Args[0] 7666 v_1 := v.Args[1] 7667 if v_1.Op != OpS390XMOVDaddr { 7668 break 7669 } 7670 o2 := v_1.AuxInt 7671 s2 := v_1.Aux 7672 ptr := v_1.Args[0] 7673 mem := v.Args[2] 7674 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7675 break 7676 } 7677 v.reset(OpS390XADDWload) 7678 v.AuxInt = o1 + o2 7679 v.Aux = mergeSym(s1, s2) 7680 v.AddArg(x) 7681 v.AddArg(ptr) 7682 v.AddArg(mem) 7683 return true 7684 } 7685 return false 7686 } 7687 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 7688 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 7689 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 7690 // result: (MOVDaddr [c+d] {s} x) 7691 for { 7692 c := v.AuxInt 7693 v_0 := v.Args[0] 7694 if v_0.Op != OpS390XMOVDaddr { 7695 break 7696 } 7697 d := v_0.AuxInt 7698 s := v_0.Aux 7699 x := v_0.Args[0] 7700 if x.Op != OpSB { 7701 break 7702 } 7703 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 7704 break 7705 } 7706 v.reset(OpS390XMOVDaddr) 7707 v.AuxInt = c + d 7708 v.Aux = s 7709 v.AddArg(x) 7710 return true 7711 } 7712 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 7713 // cond: x.Op != OpSB && is20Bit(c+d) 7714 // result: (MOVDaddr [c+d] {s} x) 7715 for { 7716 c := v.AuxInt 7717 v_0 := v.Args[0] 7718 if v_0.Op != OpS390XMOVDaddr { 7719 break 7720 } 7721 d := v_0.AuxInt 7722 s := v_0.Aux 7723 x := v_0.Args[0] 7724 if !(x.Op != OpSB && is20Bit(c+d)) { 7725 break 7726 } 7727 v.reset(OpS390XMOVDaddr) 7728 v.AuxInt = c + d 7729 v.Aux = s 7730 v.AddArg(x) 7731 return true 7732 } 7733 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 7734 // cond: is20Bit(c+d) 7735 // result: (MOVDaddridx [c+d] {s} x y) 7736 for { 7737 c := v.AuxInt 7738 v_0 := v.Args[0] 7739 if v_0.Op != OpS390XMOVDaddridx { 7740 break 7741 } 7742 d := v_0.AuxInt 7743 s := v_0.Aux 7744 _ = v_0.Args[1] 7745 x := v_0.Args[0] 7746 y := v_0.Args[1] 7747 if !(is20Bit(c + d)) { 7748 break 7749 } 7750 v.reset(OpS390XMOVDaddridx) 7751 v.AuxInt = c + d 7752 v.Aux = s 7753 v.AddArg(x) 7754 v.AddArg(y) 7755 return true 7756 } 7757 // match: (ADDconst [0] x) 7758 // cond: 7759 // result: x 7760 for { 7761 if v.AuxInt != 0 { 7762 break 7763 } 7764 x := v.Args[0] 7765 v.reset(OpCopy) 7766 v.Type = x.Type 7767 v.AddArg(x) 7768 return true 7769 } 7770 // match: (ADDconst [c] (MOVDconst [d])) 7771 // cond: 7772 // result: (MOVDconst [c+d]) 7773 for { 7774 c := v.AuxInt 7775 v_0 := v.Args[0] 7776 if v_0.Op != OpS390XMOVDconst { 7777 break 7778 } 7779 d := v_0.AuxInt 7780 v.reset(OpS390XMOVDconst) 7781 v.AuxInt = c + d 7782 return true 7783 } 7784 // match: (ADDconst [c] (ADDconst [d] x)) 7785 // cond: is32Bit(c+d) 7786 // result: (ADDconst [c+d] x) 7787 for { 7788 c := v.AuxInt 7789 v_0 := v.Args[0] 7790 if v_0.Op != OpS390XADDconst { 7791 break 7792 } 7793 d := v_0.AuxInt 7794 x := v_0.Args[0] 7795 if !(is32Bit(c + d)) { 7796 break 7797 } 7798 v.reset(OpS390XADDconst) 7799 v.AuxInt = c + d 7800 v.AddArg(x) 7801 return true 7802 } 7803 return false 7804 } 7805 func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { 7806 b := v.Block 7807 _ = b 7808 // match: (ADDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 7809 // cond: isSamePtr(ptr1, ptr2) 7810 // result: (ADD x (LGDR <t> y)) 7811 for { 7812 t := v.Type 7813 off := v.AuxInt 7814 sym := v.Aux 7815 _ = v.Args[2] 7816 x := v.Args[0] 7817 ptr1 := v.Args[1] 7818 v_2 := v.Args[2] 7819 if v_2.Op != OpS390XFMOVDstore { 7820 break 7821 } 7822 if v_2.AuxInt != off { 7823 break 7824 } 7825 if v_2.Aux != sym { 7826 break 7827 } 7828 _ = v_2.Args[2] 7829 ptr2 := v_2.Args[0] 7830 y := v_2.Args[1] 7831 if !(isSamePtr(ptr1, ptr2)) { 7832 break 7833 } 7834 v.reset(OpS390XADD) 7835 v.AddArg(x) 7836 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 7837 v0.AddArg(y) 7838 v.AddArg(v0) 7839 return true 7840 } 7841 // match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) 7842 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7843 // result: (ADDload [off1+off2] {sym} x ptr mem) 7844 for { 7845 off1 := v.AuxInt 7846 sym := v.Aux 7847 _ = v.Args[2] 7848 x := v.Args[0] 7849 v_1 := v.Args[1] 7850 if v_1.Op != OpS390XADDconst { 7851 break 7852 } 7853 off2 := v_1.AuxInt 7854 ptr := v_1.Args[0] 7855 mem := v.Args[2] 7856 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7857 break 7858 } 7859 v.reset(OpS390XADDload) 7860 v.AuxInt = off1 + off2 7861 v.Aux = sym 7862 v.AddArg(x) 7863 v.AddArg(ptr) 7864 v.AddArg(mem) 7865 return true 7866 } 7867 // match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7868 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7869 // result: (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7870 for { 7871 o1 := v.AuxInt 7872 s1 := v.Aux 7873 _ = v.Args[2] 7874 x := v.Args[0] 7875 v_1 := v.Args[1] 7876 if v_1.Op != OpS390XMOVDaddr { 7877 break 7878 } 7879 o2 := v_1.AuxInt 7880 s2 := v_1.Aux 7881 ptr := v_1.Args[0] 7882 mem := v.Args[2] 7883 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7884 break 7885 } 7886 v.reset(OpS390XADDload) 7887 v.AuxInt = o1 + o2 7888 v.Aux = mergeSym(s1, s2) 7889 v.AddArg(x) 7890 v.AddArg(ptr) 7891 v.AddArg(mem) 7892 return true 7893 } 7894 return false 7895 } 7896 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 7897 b := v.Block 7898 _ = b 7899 typ := &b.Func.Config.Types 7900 _ = typ 7901 // match: (AND x (MOVDconst [c])) 7902 // cond: is32Bit(c) && c < 0 7903 // result: (ANDconst [c] x) 7904 for { 7905 _ = v.Args[1] 7906 x := v.Args[0] 7907 v_1 := v.Args[1] 7908 if v_1.Op != OpS390XMOVDconst { 7909 break 7910 } 7911 c := v_1.AuxInt 7912 if !(is32Bit(c) && c < 0) { 7913 break 7914 } 7915 v.reset(OpS390XANDconst) 7916 v.AuxInt = c 7917 v.AddArg(x) 7918 return true 7919 } 7920 // match: (AND (MOVDconst [c]) x) 7921 // cond: is32Bit(c) && c < 0 7922 // result: (ANDconst [c] x) 7923 for { 7924 _ = v.Args[1] 7925 v_0 := v.Args[0] 7926 if v_0.Op != OpS390XMOVDconst { 7927 break 7928 } 7929 c := v_0.AuxInt 7930 x := v.Args[1] 7931 if !(is32Bit(c) && c < 0) { 7932 break 7933 } 7934 v.reset(OpS390XANDconst) 7935 v.AuxInt = c 7936 v.AddArg(x) 7937 return true 7938 } 7939 // match: (AND x (MOVDconst [c])) 7940 // cond: is32Bit(c) && c >= 0 7941 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x)) 7942 for { 7943 _ = v.Args[1] 7944 x := v.Args[0] 7945 v_1 := v.Args[1] 7946 if v_1.Op != OpS390XMOVDconst { 7947 break 7948 } 7949 c := v_1.AuxInt 7950 if !(is32Bit(c) && c >= 0) { 7951 break 7952 } 7953 v.reset(OpS390XMOVWZreg) 7954 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 7955 v0.AuxInt = int64(int32(c)) 7956 v0.AddArg(x) 7957 v.AddArg(v0) 7958 return true 7959 } 7960 // match: (AND (MOVDconst [c]) x) 7961 // cond: is32Bit(c) && c >= 0 7962 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x)) 7963 for { 7964 _ = v.Args[1] 7965 v_0 := v.Args[0] 7966 if v_0.Op != OpS390XMOVDconst { 7967 break 7968 } 7969 c := v_0.AuxInt 7970 x := v.Args[1] 7971 if !(is32Bit(c) && c >= 0) { 7972 break 7973 } 7974 v.reset(OpS390XMOVWZreg) 7975 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 7976 v0.AuxInt = int64(int32(c)) 7977 v0.AddArg(x) 7978 v.AddArg(v0) 7979 return true 7980 } 7981 // match: (AND x (MOVDconst [0xFF])) 7982 // cond: 7983 // result: (MOVBZreg x) 7984 for { 7985 _ = v.Args[1] 7986 x := v.Args[0] 7987 v_1 := v.Args[1] 7988 if v_1.Op != OpS390XMOVDconst { 7989 break 7990 } 7991 if v_1.AuxInt != 0xFF { 7992 break 7993 } 7994 v.reset(OpS390XMOVBZreg) 7995 v.AddArg(x) 7996 return true 7997 } 7998 // match: (AND (MOVDconst [0xFF]) x) 7999 // cond: 8000 // result: (MOVBZreg x) 8001 for { 8002 _ = v.Args[1] 8003 v_0 := v.Args[0] 8004 if v_0.Op != OpS390XMOVDconst { 8005 break 8006 } 8007 if v_0.AuxInt != 0xFF { 8008 break 8009 } 8010 x := v.Args[1] 8011 v.reset(OpS390XMOVBZreg) 8012 v.AddArg(x) 8013 return true 8014 } 8015 // match: (AND x (MOVDconst [0xFFFF])) 8016 // cond: 8017 // result: (MOVHZreg x) 8018 for { 8019 _ = v.Args[1] 8020 x := v.Args[0] 8021 v_1 := v.Args[1] 8022 if v_1.Op != OpS390XMOVDconst { 8023 break 8024 } 8025 if v_1.AuxInt != 0xFFFF { 8026 break 8027 } 8028 v.reset(OpS390XMOVHZreg) 8029 v.AddArg(x) 8030 return true 8031 } 8032 // match: (AND (MOVDconst [0xFFFF]) x) 8033 // cond: 8034 // result: (MOVHZreg x) 8035 for { 8036 _ = v.Args[1] 8037 v_0 := v.Args[0] 8038 if v_0.Op != OpS390XMOVDconst { 8039 break 8040 } 8041 if v_0.AuxInt != 0xFFFF { 8042 break 8043 } 8044 x := v.Args[1] 8045 v.reset(OpS390XMOVHZreg) 8046 v.AddArg(x) 8047 return true 8048 } 8049 // match: (AND x (MOVDconst [0xFFFFFFFF])) 8050 // cond: 8051 // result: (MOVWZreg x) 8052 for { 8053 _ = v.Args[1] 8054 x := v.Args[0] 8055 v_1 := v.Args[1] 8056 if v_1.Op != OpS390XMOVDconst { 8057 break 8058 } 8059 if v_1.AuxInt != 0xFFFFFFFF { 8060 break 8061 } 8062 v.reset(OpS390XMOVWZreg) 8063 v.AddArg(x) 8064 return true 8065 } 8066 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 8067 // cond: 8068 // result: (MOVWZreg x) 8069 for { 8070 _ = v.Args[1] 8071 v_0 := v.Args[0] 8072 if v_0.Op != OpS390XMOVDconst { 8073 break 8074 } 8075 if v_0.AuxInt != 0xFFFFFFFF { 8076 break 8077 } 8078 x := v.Args[1] 8079 v.reset(OpS390XMOVWZreg) 8080 v.AddArg(x) 8081 return true 8082 } 8083 return false 8084 } 8085 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 8086 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 8087 // cond: 8088 // result: (MOVDconst [c&d]) 8089 for { 8090 _ = v.Args[1] 8091 v_0 := v.Args[0] 8092 if v_0.Op != OpS390XMOVDconst { 8093 break 8094 } 8095 c := v_0.AuxInt 8096 v_1 := v.Args[1] 8097 if v_1.Op != OpS390XMOVDconst { 8098 break 8099 } 8100 d := v_1.AuxInt 8101 v.reset(OpS390XMOVDconst) 8102 v.AuxInt = c & d 8103 return true 8104 } 8105 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 8106 // cond: 8107 // result: (MOVDconst [c&d]) 8108 for { 8109 _ = v.Args[1] 8110 v_0 := v.Args[0] 8111 if v_0.Op != OpS390XMOVDconst { 8112 break 8113 } 8114 d := v_0.AuxInt 8115 v_1 := v.Args[1] 8116 if v_1.Op != OpS390XMOVDconst { 8117 break 8118 } 8119 c := v_1.AuxInt 8120 v.reset(OpS390XMOVDconst) 8121 v.AuxInt = c & d 8122 return true 8123 } 8124 // match: (AND x x) 8125 // cond: 8126 // result: x 8127 for { 8128 _ = v.Args[1] 8129 x := v.Args[0] 8130 if x != v.Args[1] { 8131 break 8132 } 8133 v.reset(OpCopy) 8134 v.Type = x.Type 8135 v.AddArg(x) 8136 return true 8137 } 8138 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 8139 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8140 // result: (ANDload <t> [off] {sym} x ptr mem) 8141 for { 8142 t := v.Type 8143 _ = v.Args[1] 8144 x := v.Args[0] 8145 g := v.Args[1] 8146 if g.Op != OpS390XMOVDload { 8147 break 8148 } 8149 off := g.AuxInt 8150 sym := g.Aux 8151 _ = g.Args[1] 8152 ptr := g.Args[0] 8153 mem := g.Args[1] 8154 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8155 break 8156 } 8157 v.reset(OpS390XANDload) 8158 v.Type = t 8159 v.AuxInt = off 8160 v.Aux = sym 8161 v.AddArg(x) 8162 v.AddArg(ptr) 8163 v.AddArg(mem) 8164 return true 8165 } 8166 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 8167 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8168 // result: (ANDload <t> [off] {sym} x ptr mem) 8169 for { 8170 t := v.Type 8171 _ = v.Args[1] 8172 g := v.Args[0] 8173 if g.Op != OpS390XMOVDload { 8174 break 8175 } 8176 off := g.AuxInt 8177 sym := g.Aux 8178 _ = g.Args[1] 8179 ptr := g.Args[0] 8180 mem := g.Args[1] 8181 x := v.Args[1] 8182 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8183 break 8184 } 8185 v.reset(OpS390XANDload) 8186 v.Type = t 8187 v.AuxInt = off 8188 v.Aux = sym 8189 v.AddArg(x) 8190 v.AddArg(ptr) 8191 v.AddArg(mem) 8192 return true 8193 } 8194 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 8195 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8196 // result: (ANDload <t> [off] {sym} x ptr mem) 8197 for { 8198 t := v.Type 8199 _ = v.Args[1] 8200 g := v.Args[0] 8201 if g.Op != OpS390XMOVDload { 8202 break 8203 } 8204 off := g.AuxInt 8205 sym := g.Aux 8206 _ = g.Args[1] 8207 ptr := g.Args[0] 8208 mem := g.Args[1] 8209 x := v.Args[1] 8210 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8211 break 8212 } 8213 v.reset(OpS390XANDload) 8214 v.Type = t 8215 v.AuxInt = off 8216 v.Aux = sym 8217 v.AddArg(x) 8218 v.AddArg(ptr) 8219 v.AddArg(mem) 8220 return true 8221 } 8222 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 8223 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8224 // result: (ANDload <t> [off] {sym} x ptr mem) 8225 for { 8226 t := v.Type 8227 _ = v.Args[1] 8228 x := v.Args[0] 8229 g := v.Args[1] 8230 if g.Op != OpS390XMOVDload { 8231 break 8232 } 8233 off := g.AuxInt 8234 sym := g.Aux 8235 _ = g.Args[1] 8236 ptr := g.Args[0] 8237 mem := g.Args[1] 8238 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8239 break 8240 } 8241 v.reset(OpS390XANDload) 8242 v.Type = t 8243 v.AuxInt = off 8244 v.Aux = sym 8245 v.AddArg(x) 8246 v.AddArg(ptr) 8247 v.AddArg(mem) 8248 return true 8249 } 8250 return false 8251 } 8252 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 8253 // match: (ANDW x (MOVDconst [c])) 8254 // cond: 8255 // result: (ANDWconst [int64(int32(c))] x) 8256 for { 8257 _ = v.Args[1] 8258 x := v.Args[0] 8259 v_1 := v.Args[1] 8260 if v_1.Op != OpS390XMOVDconst { 8261 break 8262 } 8263 c := v_1.AuxInt 8264 v.reset(OpS390XANDWconst) 8265 v.AuxInt = int64(int32(c)) 8266 v.AddArg(x) 8267 return true 8268 } 8269 // match: (ANDW (MOVDconst [c]) x) 8270 // cond: 8271 // result: (ANDWconst [int64(int32(c))] x) 8272 for { 8273 _ = v.Args[1] 8274 v_0 := v.Args[0] 8275 if v_0.Op != OpS390XMOVDconst { 8276 break 8277 } 8278 c := v_0.AuxInt 8279 x := v.Args[1] 8280 v.reset(OpS390XANDWconst) 8281 v.AuxInt = int64(int32(c)) 8282 v.AddArg(x) 8283 return true 8284 } 8285 // match: (ANDW x x) 8286 // cond: 8287 // result: x 8288 for { 8289 _ = v.Args[1] 8290 x := v.Args[0] 8291 if x != v.Args[1] { 8292 break 8293 } 8294 v.reset(OpCopy) 8295 v.Type = x.Type 8296 v.AddArg(x) 8297 return true 8298 } 8299 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 8300 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8301 // result: (ANDWload <t> [off] {sym} x ptr mem) 8302 for { 8303 t := v.Type 8304 _ = v.Args[1] 8305 x := v.Args[0] 8306 g := v.Args[1] 8307 if g.Op != OpS390XMOVWload { 8308 break 8309 } 8310 off := g.AuxInt 8311 sym := g.Aux 8312 _ = g.Args[1] 8313 ptr := g.Args[0] 8314 mem := g.Args[1] 8315 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8316 break 8317 } 8318 v.reset(OpS390XANDWload) 8319 v.Type = t 8320 v.AuxInt = off 8321 v.Aux = sym 8322 v.AddArg(x) 8323 v.AddArg(ptr) 8324 v.AddArg(mem) 8325 return true 8326 } 8327 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 8328 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8329 // result: (ANDWload <t> [off] {sym} x ptr mem) 8330 for { 8331 t := v.Type 8332 _ = v.Args[1] 8333 g := v.Args[0] 8334 if g.Op != OpS390XMOVWload { 8335 break 8336 } 8337 off := g.AuxInt 8338 sym := g.Aux 8339 _ = g.Args[1] 8340 ptr := g.Args[0] 8341 mem := g.Args[1] 8342 x := v.Args[1] 8343 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8344 break 8345 } 8346 v.reset(OpS390XANDWload) 8347 v.Type = t 8348 v.AuxInt = off 8349 v.Aux = sym 8350 v.AddArg(x) 8351 v.AddArg(ptr) 8352 v.AddArg(mem) 8353 return true 8354 } 8355 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 8356 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8357 // result: (ANDWload <t> [off] {sym} x ptr mem) 8358 for { 8359 t := v.Type 8360 _ = v.Args[1] 8361 g := v.Args[0] 8362 if g.Op != OpS390XMOVWload { 8363 break 8364 } 8365 off := g.AuxInt 8366 sym := g.Aux 8367 _ = g.Args[1] 8368 ptr := g.Args[0] 8369 mem := g.Args[1] 8370 x := v.Args[1] 8371 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8372 break 8373 } 8374 v.reset(OpS390XANDWload) 8375 v.Type = t 8376 v.AuxInt = off 8377 v.Aux = sym 8378 v.AddArg(x) 8379 v.AddArg(ptr) 8380 v.AddArg(mem) 8381 return true 8382 } 8383 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 8384 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8385 // result: (ANDWload <t> [off] {sym} x ptr mem) 8386 for { 8387 t := v.Type 8388 _ = v.Args[1] 8389 x := v.Args[0] 8390 g := v.Args[1] 8391 if g.Op != OpS390XMOVWload { 8392 break 8393 } 8394 off := g.AuxInt 8395 sym := g.Aux 8396 _ = g.Args[1] 8397 ptr := g.Args[0] 8398 mem := g.Args[1] 8399 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8400 break 8401 } 8402 v.reset(OpS390XANDWload) 8403 v.Type = t 8404 v.AuxInt = off 8405 v.Aux = sym 8406 v.AddArg(x) 8407 v.AddArg(ptr) 8408 v.AddArg(mem) 8409 return true 8410 } 8411 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 8412 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8413 // result: (ANDWload <t> [off] {sym} x ptr mem) 8414 for { 8415 t := v.Type 8416 _ = v.Args[1] 8417 x := v.Args[0] 8418 g := v.Args[1] 8419 if g.Op != OpS390XMOVWZload { 8420 break 8421 } 8422 off := g.AuxInt 8423 sym := g.Aux 8424 _ = g.Args[1] 8425 ptr := g.Args[0] 8426 mem := g.Args[1] 8427 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8428 break 8429 } 8430 v.reset(OpS390XANDWload) 8431 v.Type = t 8432 v.AuxInt = off 8433 v.Aux = sym 8434 v.AddArg(x) 8435 v.AddArg(ptr) 8436 v.AddArg(mem) 8437 return true 8438 } 8439 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 8440 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8441 // result: (ANDWload <t> [off] {sym} x ptr mem) 8442 for { 8443 t := v.Type 8444 _ = v.Args[1] 8445 g := v.Args[0] 8446 if g.Op != OpS390XMOVWZload { 8447 break 8448 } 8449 off := g.AuxInt 8450 sym := g.Aux 8451 _ = g.Args[1] 8452 ptr := g.Args[0] 8453 mem := g.Args[1] 8454 x := v.Args[1] 8455 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8456 break 8457 } 8458 v.reset(OpS390XANDWload) 8459 v.Type = t 8460 v.AuxInt = off 8461 v.Aux = sym 8462 v.AddArg(x) 8463 v.AddArg(ptr) 8464 v.AddArg(mem) 8465 return true 8466 } 8467 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 8468 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8469 // result: (ANDWload <t> [off] {sym} x ptr mem) 8470 for { 8471 t := v.Type 8472 _ = v.Args[1] 8473 g := v.Args[0] 8474 if g.Op != OpS390XMOVWZload { 8475 break 8476 } 8477 off := g.AuxInt 8478 sym := g.Aux 8479 _ = g.Args[1] 8480 ptr := g.Args[0] 8481 mem := g.Args[1] 8482 x := v.Args[1] 8483 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8484 break 8485 } 8486 v.reset(OpS390XANDWload) 8487 v.Type = t 8488 v.AuxInt = off 8489 v.Aux = sym 8490 v.AddArg(x) 8491 v.AddArg(ptr) 8492 v.AddArg(mem) 8493 return true 8494 } 8495 return false 8496 } 8497 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 8498 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 8499 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 8500 // result: (ANDWload <t> [off] {sym} x ptr mem) 8501 for { 8502 t := v.Type 8503 _ = v.Args[1] 8504 x := v.Args[0] 8505 g := v.Args[1] 8506 if g.Op != OpS390XMOVWZload { 8507 break 8508 } 8509 off := g.AuxInt 8510 sym := g.Aux 8511 _ = g.Args[1] 8512 ptr := g.Args[0] 8513 mem := g.Args[1] 8514 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 8515 break 8516 } 8517 v.reset(OpS390XANDWload) 8518 v.Type = t 8519 v.AuxInt = off 8520 v.Aux = sym 8521 v.AddArg(x) 8522 v.AddArg(ptr) 8523 v.AddArg(mem) 8524 return true 8525 } 8526 return false 8527 } 8528 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 8529 // match: (ANDWconst [c] (ANDWconst [d] x)) 8530 // cond: 8531 // result: (ANDWconst [c & d] x) 8532 for { 8533 c := v.AuxInt 8534 v_0 := v.Args[0] 8535 if v_0.Op != OpS390XANDWconst { 8536 break 8537 } 8538 d := v_0.AuxInt 8539 x := v_0.Args[0] 8540 v.reset(OpS390XANDWconst) 8541 v.AuxInt = c & d 8542 v.AddArg(x) 8543 return true 8544 } 8545 // match: (ANDWconst [0xFF] x) 8546 // cond: 8547 // result: (MOVBZreg x) 8548 for { 8549 if v.AuxInt != 0xFF { 8550 break 8551 } 8552 x := v.Args[0] 8553 v.reset(OpS390XMOVBZreg) 8554 v.AddArg(x) 8555 return true 8556 } 8557 // match: (ANDWconst [0xFFFF] x) 8558 // cond: 8559 // result: (MOVHZreg x) 8560 for { 8561 if v.AuxInt != 0xFFFF { 8562 break 8563 } 8564 x := v.Args[0] 8565 v.reset(OpS390XMOVHZreg) 8566 v.AddArg(x) 8567 return true 8568 } 8569 // match: (ANDWconst [c] _) 8570 // cond: int32(c)==0 8571 // result: (MOVDconst [0]) 8572 for { 8573 c := v.AuxInt 8574 if !(int32(c) == 0) { 8575 break 8576 } 8577 v.reset(OpS390XMOVDconst) 8578 v.AuxInt = 0 8579 return true 8580 } 8581 // match: (ANDWconst [c] x) 8582 // cond: int32(c)==-1 8583 // result: x 8584 for { 8585 c := v.AuxInt 8586 x := v.Args[0] 8587 if !(int32(c) == -1) { 8588 break 8589 } 8590 v.reset(OpCopy) 8591 v.Type = x.Type 8592 v.AddArg(x) 8593 return true 8594 } 8595 // match: (ANDWconst [c] (MOVDconst [d])) 8596 // cond: 8597 // result: (MOVDconst [c&d]) 8598 for { 8599 c := v.AuxInt 8600 v_0 := v.Args[0] 8601 if v_0.Op != OpS390XMOVDconst { 8602 break 8603 } 8604 d := v_0.AuxInt 8605 v.reset(OpS390XMOVDconst) 8606 v.AuxInt = c & d 8607 return true 8608 } 8609 return false 8610 } 8611 func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { 8612 // match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 8613 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 8614 // result: (ANDWload [off1+off2] {sym} x ptr mem) 8615 for { 8616 off1 := v.AuxInt 8617 sym := v.Aux 8618 _ = v.Args[2] 8619 x := v.Args[0] 8620 v_1 := v.Args[1] 8621 if v_1.Op != OpS390XADDconst { 8622 break 8623 } 8624 off2 := v_1.AuxInt 8625 ptr := v_1.Args[0] 8626 mem := v.Args[2] 8627 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 8628 break 8629 } 8630 v.reset(OpS390XANDWload) 8631 v.AuxInt = off1 + off2 8632 v.Aux = sym 8633 v.AddArg(x) 8634 v.AddArg(ptr) 8635 v.AddArg(mem) 8636 return true 8637 } 8638 // match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 8639 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 8640 // result: (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 8641 for { 8642 o1 := v.AuxInt 8643 s1 := v.Aux 8644 _ = v.Args[2] 8645 x := v.Args[0] 8646 v_1 := v.Args[1] 8647 if v_1.Op != OpS390XMOVDaddr { 8648 break 8649 } 8650 o2 := v_1.AuxInt 8651 s2 := v_1.Aux 8652 ptr := v_1.Args[0] 8653 mem := v.Args[2] 8654 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 8655 break 8656 } 8657 v.reset(OpS390XANDWload) 8658 v.AuxInt = o1 + o2 8659 v.Aux = mergeSym(s1, s2) 8660 v.AddArg(x) 8661 v.AddArg(ptr) 8662 v.AddArg(mem) 8663 return true 8664 } 8665 return false 8666 } 8667 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 8668 // match: (ANDconst [c] (ANDconst [d] x)) 8669 // cond: 8670 // result: (ANDconst [c & d] x) 8671 for { 8672 c := v.AuxInt 8673 v_0 := v.Args[0] 8674 if v_0.Op != OpS390XANDconst { 8675 break 8676 } 8677 d := v_0.AuxInt 8678 x := v_0.Args[0] 8679 v.reset(OpS390XANDconst) 8680 v.AuxInt = c & d 8681 v.AddArg(x) 8682 return true 8683 } 8684 // match: (ANDconst [0] _) 8685 // cond: 8686 // result: (MOVDconst [0]) 8687 for { 8688 if v.AuxInt != 0 { 8689 break 8690 } 8691 v.reset(OpS390XMOVDconst) 8692 v.AuxInt = 0 8693 return true 8694 } 8695 // match: (ANDconst [-1] x) 8696 // cond: 8697 // result: x 8698 for { 8699 if v.AuxInt != -1 { 8700 break 8701 } 8702 x := v.Args[0] 8703 v.reset(OpCopy) 8704 v.Type = x.Type 8705 v.AddArg(x) 8706 return true 8707 } 8708 // match: (ANDconst [c] (MOVDconst [d])) 8709 // cond: 8710 // result: (MOVDconst [c&d]) 8711 for { 8712 c := v.AuxInt 8713 v_0 := v.Args[0] 8714 if v_0.Op != OpS390XMOVDconst { 8715 break 8716 } 8717 d := v_0.AuxInt 8718 v.reset(OpS390XMOVDconst) 8719 v.AuxInt = c & d 8720 return true 8721 } 8722 return false 8723 } 8724 func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { 8725 b := v.Block 8726 _ = b 8727 // match: (ANDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 8728 // cond: isSamePtr(ptr1, ptr2) 8729 // result: (AND x (LGDR <t> y)) 8730 for { 8731 t := v.Type 8732 off := v.AuxInt 8733 sym := v.Aux 8734 _ = v.Args[2] 8735 x := v.Args[0] 8736 ptr1 := v.Args[1] 8737 v_2 := v.Args[2] 8738 if v_2.Op != OpS390XFMOVDstore { 8739 break 8740 } 8741 if v_2.AuxInt != off { 8742 break 8743 } 8744 if v_2.Aux != sym { 8745 break 8746 } 8747 _ = v_2.Args[2] 8748 ptr2 := v_2.Args[0] 8749 y := v_2.Args[1] 8750 if !(isSamePtr(ptr1, ptr2)) { 8751 break 8752 } 8753 v.reset(OpS390XAND) 8754 v.AddArg(x) 8755 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 8756 v0.AddArg(y) 8757 v.AddArg(v0) 8758 return true 8759 } 8760 // match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) 8761 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 8762 // result: (ANDload [off1+off2] {sym} x ptr mem) 8763 for { 8764 off1 := v.AuxInt 8765 sym := v.Aux 8766 _ = v.Args[2] 8767 x := v.Args[0] 8768 v_1 := v.Args[1] 8769 if v_1.Op != OpS390XADDconst { 8770 break 8771 } 8772 off2 := v_1.AuxInt 8773 ptr := v_1.Args[0] 8774 mem := v.Args[2] 8775 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 8776 break 8777 } 8778 v.reset(OpS390XANDload) 8779 v.AuxInt = off1 + off2 8780 v.Aux = sym 8781 v.AddArg(x) 8782 v.AddArg(ptr) 8783 v.AddArg(mem) 8784 return true 8785 } 8786 // match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 8787 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 8788 // result: (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 8789 for { 8790 o1 := v.AuxInt 8791 s1 := v.Aux 8792 _ = v.Args[2] 8793 x := v.Args[0] 8794 v_1 := v.Args[1] 8795 if v_1.Op != OpS390XMOVDaddr { 8796 break 8797 } 8798 o2 := v_1.AuxInt 8799 s2 := v_1.Aux 8800 ptr := v_1.Args[0] 8801 mem := v.Args[2] 8802 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 8803 break 8804 } 8805 v.reset(OpS390XANDload) 8806 v.AuxInt = o1 + o2 8807 v.Aux = mergeSym(s1, s2) 8808 v.AddArg(x) 8809 v.AddArg(ptr) 8810 v.AddArg(mem) 8811 return true 8812 } 8813 return false 8814 } 8815 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 8816 b := v.Block 8817 _ = b 8818 // match: (CMP x (MOVDconst [c])) 8819 // cond: is32Bit(c) 8820 // result: (CMPconst x [c]) 8821 for { 8822 _ = v.Args[1] 8823 x := v.Args[0] 8824 v_1 := v.Args[1] 8825 if v_1.Op != OpS390XMOVDconst { 8826 break 8827 } 8828 c := v_1.AuxInt 8829 if !(is32Bit(c)) { 8830 break 8831 } 8832 v.reset(OpS390XCMPconst) 8833 v.AuxInt = c 8834 v.AddArg(x) 8835 return true 8836 } 8837 // match: (CMP (MOVDconst [c]) x) 8838 // cond: is32Bit(c) 8839 // result: (InvertFlags (CMPconst x [c])) 8840 for { 8841 _ = v.Args[1] 8842 v_0 := v.Args[0] 8843 if v_0.Op != OpS390XMOVDconst { 8844 break 8845 } 8846 c := v_0.AuxInt 8847 x := v.Args[1] 8848 if !(is32Bit(c)) { 8849 break 8850 } 8851 v.reset(OpS390XInvertFlags) 8852 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 8853 v0.AuxInt = c 8854 v0.AddArg(x) 8855 v.AddArg(v0) 8856 return true 8857 } 8858 return false 8859 } 8860 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 8861 b := v.Block 8862 _ = b 8863 // match: (CMPU x (MOVDconst [c])) 8864 // cond: isU32Bit(c) 8865 // result: (CMPUconst x [int64(int32(c))]) 8866 for { 8867 _ = v.Args[1] 8868 x := v.Args[0] 8869 v_1 := v.Args[1] 8870 if v_1.Op != OpS390XMOVDconst { 8871 break 8872 } 8873 c := v_1.AuxInt 8874 if !(isU32Bit(c)) { 8875 break 8876 } 8877 v.reset(OpS390XCMPUconst) 8878 v.AuxInt = int64(int32(c)) 8879 v.AddArg(x) 8880 return true 8881 } 8882 // match: (CMPU (MOVDconst [c]) x) 8883 // cond: isU32Bit(c) 8884 // result: (InvertFlags (CMPUconst x [int64(int32(c))])) 8885 for { 8886 _ = v.Args[1] 8887 v_0 := v.Args[0] 8888 if v_0.Op != OpS390XMOVDconst { 8889 break 8890 } 8891 c := v_0.AuxInt 8892 x := v.Args[1] 8893 if !(isU32Bit(c)) { 8894 break 8895 } 8896 v.reset(OpS390XInvertFlags) 8897 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 8898 v0.AuxInt = int64(int32(c)) 8899 v0.AddArg(x) 8900 v.AddArg(v0) 8901 return true 8902 } 8903 return false 8904 } 8905 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 8906 // match: (CMPUconst (MOVDconst [x]) [y]) 8907 // cond: uint64(x)==uint64(y) 8908 // result: (FlagEQ) 8909 for { 8910 y := v.AuxInt 8911 v_0 := v.Args[0] 8912 if v_0.Op != OpS390XMOVDconst { 8913 break 8914 } 8915 x := v_0.AuxInt 8916 if !(uint64(x) == uint64(y)) { 8917 break 8918 } 8919 v.reset(OpS390XFlagEQ) 8920 return true 8921 } 8922 // match: (CMPUconst (MOVDconst [x]) [y]) 8923 // cond: uint64(x)<uint64(y) 8924 // result: (FlagLT) 8925 for { 8926 y := v.AuxInt 8927 v_0 := v.Args[0] 8928 if v_0.Op != OpS390XMOVDconst { 8929 break 8930 } 8931 x := v_0.AuxInt 8932 if !(uint64(x) < uint64(y)) { 8933 break 8934 } 8935 v.reset(OpS390XFlagLT) 8936 return true 8937 } 8938 // match: (CMPUconst (MOVDconst [x]) [y]) 8939 // cond: uint64(x)>uint64(y) 8940 // result: (FlagGT) 8941 for { 8942 y := v.AuxInt 8943 v_0 := v.Args[0] 8944 if v_0.Op != OpS390XMOVDconst { 8945 break 8946 } 8947 x := v_0.AuxInt 8948 if !(uint64(x) > uint64(y)) { 8949 break 8950 } 8951 v.reset(OpS390XFlagGT) 8952 return true 8953 } 8954 // match: (CMPUconst (SRDconst _ [c]) [n]) 8955 // cond: c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n) 8956 // result: (FlagLT) 8957 for { 8958 n := v.AuxInt 8959 v_0 := v.Args[0] 8960 if v_0.Op != OpS390XSRDconst { 8961 break 8962 } 8963 c := v_0.AuxInt 8964 if !(c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n)) { 8965 break 8966 } 8967 v.reset(OpS390XFlagLT) 8968 return true 8969 } 8970 // match: (CMPUconst (MOVWZreg x) [c]) 8971 // cond: 8972 // result: (CMPWUconst x [c]) 8973 for { 8974 c := v.AuxInt 8975 v_0 := v.Args[0] 8976 if v_0.Op != OpS390XMOVWZreg { 8977 break 8978 } 8979 x := v_0.Args[0] 8980 v.reset(OpS390XCMPWUconst) 8981 v.AuxInt = c 8982 v.AddArg(x) 8983 return true 8984 } 8985 // match: (CMPUconst x:(MOVHreg _) [c]) 8986 // cond: 8987 // result: (CMPWUconst x [c]) 8988 for { 8989 c := v.AuxInt 8990 x := v.Args[0] 8991 if x.Op != OpS390XMOVHreg { 8992 break 8993 } 8994 v.reset(OpS390XCMPWUconst) 8995 v.AuxInt = c 8996 v.AddArg(x) 8997 return true 8998 } 8999 // match: (CMPUconst x:(MOVHZreg _) [c]) 9000 // cond: 9001 // result: (CMPWUconst x [c]) 9002 for { 9003 c := v.AuxInt 9004 x := v.Args[0] 9005 if x.Op != OpS390XMOVHZreg { 9006 break 9007 } 9008 v.reset(OpS390XCMPWUconst) 9009 v.AuxInt = c 9010 v.AddArg(x) 9011 return true 9012 } 9013 // match: (CMPUconst x:(MOVBreg _) [c]) 9014 // cond: 9015 // result: (CMPWUconst x [c]) 9016 for { 9017 c := v.AuxInt 9018 x := v.Args[0] 9019 if x.Op != OpS390XMOVBreg { 9020 break 9021 } 9022 v.reset(OpS390XCMPWUconst) 9023 v.AuxInt = c 9024 v.AddArg(x) 9025 return true 9026 } 9027 // match: (CMPUconst x:(MOVBZreg _) [c]) 9028 // cond: 9029 // result: (CMPWUconst x [c]) 9030 for { 9031 c := v.AuxInt 9032 x := v.Args[0] 9033 if x.Op != OpS390XMOVBZreg { 9034 break 9035 } 9036 v.reset(OpS390XCMPWUconst) 9037 v.AuxInt = c 9038 v.AddArg(x) 9039 return true 9040 } 9041 // match: (CMPUconst (MOVWZreg x:(ANDWconst [m] _)) [c]) 9042 // cond: int32(m) >= 0 9043 // result: (CMPWUconst x [c]) 9044 for { 9045 c := v.AuxInt 9046 v_0 := v.Args[0] 9047 if v_0.Op != OpS390XMOVWZreg { 9048 break 9049 } 9050 x := v_0.Args[0] 9051 if x.Op != OpS390XANDWconst { 9052 break 9053 } 9054 m := x.AuxInt 9055 if !(int32(m) >= 0) { 9056 break 9057 } 9058 v.reset(OpS390XCMPWUconst) 9059 v.AuxInt = c 9060 v.AddArg(x) 9061 return true 9062 } 9063 return false 9064 } 9065 func rewriteValueS390X_OpS390XCMPUconst_10(v *Value) bool { 9066 // match: (CMPUconst (MOVWreg x:(ANDWconst [m] _)) [c]) 9067 // cond: int32(m) >= 0 9068 // result: (CMPWUconst x [c]) 9069 for { 9070 c := v.AuxInt 9071 v_0 := v.Args[0] 9072 if v_0.Op != OpS390XMOVWreg { 9073 break 9074 } 9075 x := v_0.Args[0] 9076 if x.Op != OpS390XANDWconst { 9077 break 9078 } 9079 m := x.AuxInt 9080 if !(int32(m) >= 0) { 9081 break 9082 } 9083 v.reset(OpS390XCMPWUconst) 9084 v.AuxInt = c 9085 v.AddArg(x) 9086 return true 9087 } 9088 return false 9089 } 9090 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 9091 b := v.Block 9092 _ = b 9093 // match: (CMPW x (MOVDconst [c])) 9094 // cond: 9095 // result: (CMPWconst x [int64(int32(c))]) 9096 for { 9097 _ = v.Args[1] 9098 x := v.Args[0] 9099 v_1 := v.Args[1] 9100 if v_1.Op != OpS390XMOVDconst { 9101 break 9102 } 9103 c := v_1.AuxInt 9104 v.reset(OpS390XCMPWconst) 9105 v.AuxInt = int64(int32(c)) 9106 v.AddArg(x) 9107 return true 9108 } 9109 // match: (CMPW (MOVDconst [c]) x) 9110 // cond: 9111 // result: (InvertFlags (CMPWconst x [int64(int32(c))])) 9112 for { 9113 _ = v.Args[1] 9114 v_0 := v.Args[0] 9115 if v_0.Op != OpS390XMOVDconst { 9116 break 9117 } 9118 c := v_0.AuxInt 9119 x := v.Args[1] 9120 v.reset(OpS390XInvertFlags) 9121 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 9122 v0.AuxInt = int64(int32(c)) 9123 v0.AddArg(x) 9124 v.AddArg(v0) 9125 return true 9126 } 9127 // match: (CMPW x (MOVWreg y)) 9128 // cond: 9129 // result: (CMPW x y) 9130 for { 9131 _ = v.Args[1] 9132 x := v.Args[0] 9133 v_1 := v.Args[1] 9134 if v_1.Op != OpS390XMOVWreg { 9135 break 9136 } 9137 y := v_1.Args[0] 9138 v.reset(OpS390XCMPW) 9139 v.AddArg(x) 9140 v.AddArg(y) 9141 return true 9142 } 9143 // match: (CMPW x (MOVWZreg y)) 9144 // cond: 9145 // result: (CMPW x y) 9146 for { 9147 _ = v.Args[1] 9148 x := v.Args[0] 9149 v_1 := v.Args[1] 9150 if v_1.Op != OpS390XMOVWZreg { 9151 break 9152 } 9153 y := v_1.Args[0] 9154 v.reset(OpS390XCMPW) 9155 v.AddArg(x) 9156 v.AddArg(y) 9157 return true 9158 } 9159 // match: (CMPW (MOVWreg x) y) 9160 // cond: 9161 // result: (CMPW x y) 9162 for { 9163 _ = v.Args[1] 9164 v_0 := v.Args[0] 9165 if v_0.Op != OpS390XMOVWreg { 9166 break 9167 } 9168 x := v_0.Args[0] 9169 y := v.Args[1] 9170 v.reset(OpS390XCMPW) 9171 v.AddArg(x) 9172 v.AddArg(y) 9173 return true 9174 } 9175 // match: (CMPW (MOVWZreg x) y) 9176 // cond: 9177 // result: (CMPW x y) 9178 for { 9179 _ = v.Args[1] 9180 v_0 := v.Args[0] 9181 if v_0.Op != OpS390XMOVWZreg { 9182 break 9183 } 9184 x := v_0.Args[0] 9185 y := v.Args[1] 9186 v.reset(OpS390XCMPW) 9187 v.AddArg(x) 9188 v.AddArg(y) 9189 return true 9190 } 9191 return false 9192 } 9193 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 9194 b := v.Block 9195 _ = b 9196 // match: (CMPWU x (MOVDconst [c])) 9197 // cond: 9198 // result: (CMPWUconst x [int64(int32(c))]) 9199 for { 9200 _ = v.Args[1] 9201 x := v.Args[0] 9202 v_1 := v.Args[1] 9203 if v_1.Op != OpS390XMOVDconst { 9204 break 9205 } 9206 c := v_1.AuxInt 9207 v.reset(OpS390XCMPWUconst) 9208 v.AuxInt = int64(int32(c)) 9209 v.AddArg(x) 9210 return true 9211 } 9212 // match: (CMPWU (MOVDconst [c]) x) 9213 // cond: 9214 // result: (InvertFlags (CMPWUconst x [int64(int32(c))])) 9215 for { 9216 _ = v.Args[1] 9217 v_0 := v.Args[0] 9218 if v_0.Op != OpS390XMOVDconst { 9219 break 9220 } 9221 c := v_0.AuxInt 9222 x := v.Args[1] 9223 v.reset(OpS390XInvertFlags) 9224 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 9225 v0.AuxInt = int64(int32(c)) 9226 v0.AddArg(x) 9227 v.AddArg(v0) 9228 return true 9229 } 9230 // match: (CMPWU x (MOVWreg y)) 9231 // cond: 9232 // result: (CMPWU x y) 9233 for { 9234 _ = v.Args[1] 9235 x := v.Args[0] 9236 v_1 := v.Args[1] 9237 if v_1.Op != OpS390XMOVWreg { 9238 break 9239 } 9240 y := v_1.Args[0] 9241 v.reset(OpS390XCMPWU) 9242 v.AddArg(x) 9243 v.AddArg(y) 9244 return true 9245 } 9246 // match: (CMPWU x (MOVWZreg y)) 9247 // cond: 9248 // result: (CMPWU x y) 9249 for { 9250 _ = v.Args[1] 9251 x := v.Args[0] 9252 v_1 := v.Args[1] 9253 if v_1.Op != OpS390XMOVWZreg { 9254 break 9255 } 9256 y := v_1.Args[0] 9257 v.reset(OpS390XCMPWU) 9258 v.AddArg(x) 9259 v.AddArg(y) 9260 return true 9261 } 9262 // match: (CMPWU (MOVWreg x) y) 9263 // cond: 9264 // result: (CMPWU x y) 9265 for { 9266 _ = v.Args[1] 9267 v_0 := v.Args[0] 9268 if v_0.Op != OpS390XMOVWreg { 9269 break 9270 } 9271 x := v_0.Args[0] 9272 y := v.Args[1] 9273 v.reset(OpS390XCMPWU) 9274 v.AddArg(x) 9275 v.AddArg(y) 9276 return true 9277 } 9278 // match: (CMPWU (MOVWZreg x) y) 9279 // cond: 9280 // result: (CMPWU x y) 9281 for { 9282 _ = v.Args[1] 9283 v_0 := v.Args[0] 9284 if v_0.Op != OpS390XMOVWZreg { 9285 break 9286 } 9287 x := v_0.Args[0] 9288 y := v.Args[1] 9289 v.reset(OpS390XCMPWU) 9290 v.AddArg(x) 9291 v.AddArg(y) 9292 return true 9293 } 9294 return false 9295 } 9296 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 9297 // match: (CMPWUconst (MOVDconst [x]) [y]) 9298 // cond: uint32(x)==uint32(y) 9299 // result: (FlagEQ) 9300 for { 9301 y := v.AuxInt 9302 v_0 := v.Args[0] 9303 if v_0.Op != OpS390XMOVDconst { 9304 break 9305 } 9306 x := v_0.AuxInt 9307 if !(uint32(x) == uint32(y)) { 9308 break 9309 } 9310 v.reset(OpS390XFlagEQ) 9311 return true 9312 } 9313 // match: (CMPWUconst (MOVDconst [x]) [y]) 9314 // cond: uint32(x)<uint32(y) 9315 // result: (FlagLT) 9316 for { 9317 y := v.AuxInt 9318 v_0 := v.Args[0] 9319 if v_0.Op != OpS390XMOVDconst { 9320 break 9321 } 9322 x := v_0.AuxInt 9323 if !(uint32(x) < uint32(y)) { 9324 break 9325 } 9326 v.reset(OpS390XFlagLT) 9327 return true 9328 } 9329 // match: (CMPWUconst (MOVDconst [x]) [y]) 9330 // cond: uint32(x)>uint32(y) 9331 // result: (FlagGT) 9332 for { 9333 y := v.AuxInt 9334 v_0 := v.Args[0] 9335 if v_0.Op != OpS390XMOVDconst { 9336 break 9337 } 9338 x := v_0.AuxInt 9339 if !(uint32(x) > uint32(y)) { 9340 break 9341 } 9342 v.reset(OpS390XFlagGT) 9343 return true 9344 } 9345 // match: (CMPWUconst (MOVBZreg _) [c]) 9346 // cond: 0xff < c 9347 // result: (FlagLT) 9348 for { 9349 c := v.AuxInt 9350 v_0 := v.Args[0] 9351 if v_0.Op != OpS390XMOVBZreg { 9352 break 9353 } 9354 if !(0xff < c) { 9355 break 9356 } 9357 v.reset(OpS390XFlagLT) 9358 return true 9359 } 9360 // match: (CMPWUconst (MOVHZreg _) [c]) 9361 // cond: 0xffff < c 9362 // result: (FlagLT) 9363 for { 9364 c := v.AuxInt 9365 v_0 := v.Args[0] 9366 if v_0.Op != OpS390XMOVHZreg { 9367 break 9368 } 9369 if !(0xffff < c) { 9370 break 9371 } 9372 v.reset(OpS390XFlagLT) 9373 return true 9374 } 9375 // match: (CMPWUconst (SRWconst _ [c]) [n]) 9376 // cond: c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n) 9377 // result: (FlagLT) 9378 for { 9379 n := v.AuxInt 9380 v_0 := v.Args[0] 9381 if v_0.Op != OpS390XSRWconst { 9382 break 9383 } 9384 c := v_0.AuxInt 9385 if !(c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n)) { 9386 break 9387 } 9388 v.reset(OpS390XFlagLT) 9389 return true 9390 } 9391 // match: (CMPWUconst (ANDWconst _ [m]) [n]) 9392 // cond: uint32(m) < uint32(n) 9393 // result: (FlagLT) 9394 for { 9395 n := v.AuxInt 9396 v_0 := v.Args[0] 9397 if v_0.Op != OpS390XANDWconst { 9398 break 9399 } 9400 m := v_0.AuxInt 9401 if !(uint32(m) < uint32(n)) { 9402 break 9403 } 9404 v.reset(OpS390XFlagLT) 9405 return true 9406 } 9407 // match: (CMPWUconst (MOVWreg x) [c]) 9408 // cond: 9409 // result: (CMPWUconst x [c]) 9410 for { 9411 c := v.AuxInt 9412 v_0 := v.Args[0] 9413 if v_0.Op != OpS390XMOVWreg { 9414 break 9415 } 9416 x := v_0.Args[0] 9417 v.reset(OpS390XCMPWUconst) 9418 v.AuxInt = c 9419 v.AddArg(x) 9420 return true 9421 } 9422 // match: (CMPWUconst (MOVWZreg x) [c]) 9423 // cond: 9424 // result: (CMPWUconst x [c]) 9425 for { 9426 c := v.AuxInt 9427 v_0 := v.Args[0] 9428 if v_0.Op != OpS390XMOVWZreg { 9429 break 9430 } 9431 x := v_0.Args[0] 9432 v.reset(OpS390XCMPWUconst) 9433 v.AuxInt = c 9434 v.AddArg(x) 9435 return true 9436 } 9437 return false 9438 } 9439 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 9440 // match: (CMPWconst (MOVDconst [x]) [y]) 9441 // cond: int32(x)==int32(y) 9442 // result: (FlagEQ) 9443 for { 9444 y := v.AuxInt 9445 v_0 := v.Args[0] 9446 if v_0.Op != OpS390XMOVDconst { 9447 break 9448 } 9449 x := v_0.AuxInt 9450 if !(int32(x) == int32(y)) { 9451 break 9452 } 9453 v.reset(OpS390XFlagEQ) 9454 return true 9455 } 9456 // match: (CMPWconst (MOVDconst [x]) [y]) 9457 // cond: int32(x)<int32(y) 9458 // result: (FlagLT) 9459 for { 9460 y := v.AuxInt 9461 v_0 := v.Args[0] 9462 if v_0.Op != OpS390XMOVDconst { 9463 break 9464 } 9465 x := v_0.AuxInt 9466 if !(int32(x) < int32(y)) { 9467 break 9468 } 9469 v.reset(OpS390XFlagLT) 9470 return true 9471 } 9472 // match: (CMPWconst (MOVDconst [x]) [y]) 9473 // cond: int32(x)>int32(y) 9474 // result: (FlagGT) 9475 for { 9476 y := v.AuxInt 9477 v_0 := v.Args[0] 9478 if v_0.Op != OpS390XMOVDconst { 9479 break 9480 } 9481 x := v_0.AuxInt 9482 if !(int32(x) > int32(y)) { 9483 break 9484 } 9485 v.reset(OpS390XFlagGT) 9486 return true 9487 } 9488 // match: (CMPWconst (MOVBZreg _) [c]) 9489 // cond: 0xff < c 9490 // result: (FlagLT) 9491 for { 9492 c := v.AuxInt 9493 v_0 := v.Args[0] 9494 if v_0.Op != OpS390XMOVBZreg { 9495 break 9496 } 9497 if !(0xff < c) { 9498 break 9499 } 9500 v.reset(OpS390XFlagLT) 9501 return true 9502 } 9503 // match: (CMPWconst (MOVHZreg _) [c]) 9504 // cond: 0xffff < c 9505 // result: (FlagLT) 9506 for { 9507 c := v.AuxInt 9508 v_0 := v.Args[0] 9509 if v_0.Op != OpS390XMOVHZreg { 9510 break 9511 } 9512 if !(0xffff < c) { 9513 break 9514 } 9515 v.reset(OpS390XFlagLT) 9516 return true 9517 } 9518 // match: (CMPWconst (SRWconst _ [c]) [n]) 9519 // cond: c > 0 && n < 0 9520 // result: (FlagGT) 9521 for { 9522 n := v.AuxInt 9523 v_0 := v.Args[0] 9524 if v_0.Op != OpS390XSRWconst { 9525 break 9526 } 9527 c := v_0.AuxInt 9528 if !(c > 0 && n < 0) { 9529 break 9530 } 9531 v.reset(OpS390XFlagGT) 9532 return true 9533 } 9534 // match: (CMPWconst (ANDWconst _ [m]) [n]) 9535 // cond: int32(m) >= 0 && int32(m) < int32(n) 9536 // result: (FlagLT) 9537 for { 9538 n := v.AuxInt 9539 v_0 := v.Args[0] 9540 if v_0.Op != OpS390XANDWconst { 9541 break 9542 } 9543 m := v_0.AuxInt 9544 if !(int32(m) >= 0 && int32(m) < int32(n)) { 9545 break 9546 } 9547 v.reset(OpS390XFlagLT) 9548 return true 9549 } 9550 // match: (CMPWconst x:(SRWconst _ [c]) [n]) 9551 // cond: c > 0 && n >= 0 9552 // result: (CMPWUconst x [n]) 9553 for { 9554 n := v.AuxInt 9555 x := v.Args[0] 9556 if x.Op != OpS390XSRWconst { 9557 break 9558 } 9559 c := x.AuxInt 9560 if !(c > 0 && n >= 0) { 9561 break 9562 } 9563 v.reset(OpS390XCMPWUconst) 9564 v.AuxInt = n 9565 v.AddArg(x) 9566 return true 9567 } 9568 // match: (CMPWconst (MOVWreg x) [c]) 9569 // cond: 9570 // result: (CMPWconst x [c]) 9571 for { 9572 c := v.AuxInt 9573 v_0 := v.Args[0] 9574 if v_0.Op != OpS390XMOVWreg { 9575 break 9576 } 9577 x := v_0.Args[0] 9578 v.reset(OpS390XCMPWconst) 9579 v.AuxInt = c 9580 v.AddArg(x) 9581 return true 9582 } 9583 // match: (CMPWconst (MOVWZreg x) [c]) 9584 // cond: 9585 // result: (CMPWconst x [c]) 9586 for { 9587 c := v.AuxInt 9588 v_0 := v.Args[0] 9589 if v_0.Op != OpS390XMOVWZreg { 9590 break 9591 } 9592 x := v_0.Args[0] 9593 v.reset(OpS390XCMPWconst) 9594 v.AuxInt = c 9595 v.AddArg(x) 9596 return true 9597 } 9598 return false 9599 } 9600 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 9601 // match: (CMPconst (MOVDconst [x]) [y]) 9602 // cond: x==y 9603 // result: (FlagEQ) 9604 for { 9605 y := v.AuxInt 9606 v_0 := v.Args[0] 9607 if v_0.Op != OpS390XMOVDconst { 9608 break 9609 } 9610 x := v_0.AuxInt 9611 if !(x == y) { 9612 break 9613 } 9614 v.reset(OpS390XFlagEQ) 9615 return true 9616 } 9617 // match: (CMPconst (MOVDconst [x]) [y]) 9618 // cond: x<y 9619 // result: (FlagLT) 9620 for { 9621 y := v.AuxInt 9622 v_0 := v.Args[0] 9623 if v_0.Op != OpS390XMOVDconst { 9624 break 9625 } 9626 x := v_0.AuxInt 9627 if !(x < y) { 9628 break 9629 } 9630 v.reset(OpS390XFlagLT) 9631 return true 9632 } 9633 // match: (CMPconst (MOVDconst [x]) [y]) 9634 // cond: x>y 9635 // result: (FlagGT) 9636 for { 9637 y := v.AuxInt 9638 v_0 := v.Args[0] 9639 if v_0.Op != OpS390XMOVDconst { 9640 break 9641 } 9642 x := v_0.AuxInt 9643 if !(x > y) { 9644 break 9645 } 9646 v.reset(OpS390XFlagGT) 9647 return true 9648 } 9649 // match: (CMPconst (SRDconst _ [c]) [n]) 9650 // cond: c > 0 && n < 0 9651 // result: (FlagGT) 9652 for { 9653 n := v.AuxInt 9654 v_0 := v.Args[0] 9655 if v_0.Op != OpS390XSRDconst { 9656 break 9657 } 9658 c := v_0.AuxInt 9659 if !(c > 0 && n < 0) { 9660 break 9661 } 9662 v.reset(OpS390XFlagGT) 9663 return true 9664 } 9665 // match: (CMPconst (MOVWreg x) [c]) 9666 // cond: 9667 // result: (CMPWconst x [c]) 9668 for { 9669 c := v.AuxInt 9670 v_0 := v.Args[0] 9671 if v_0.Op != OpS390XMOVWreg { 9672 break 9673 } 9674 x := v_0.Args[0] 9675 v.reset(OpS390XCMPWconst) 9676 v.AuxInt = c 9677 v.AddArg(x) 9678 return true 9679 } 9680 // match: (CMPconst x:(MOVHreg _) [c]) 9681 // cond: 9682 // result: (CMPWconst x [c]) 9683 for { 9684 c := v.AuxInt 9685 x := v.Args[0] 9686 if x.Op != OpS390XMOVHreg { 9687 break 9688 } 9689 v.reset(OpS390XCMPWconst) 9690 v.AuxInt = c 9691 v.AddArg(x) 9692 return true 9693 } 9694 // match: (CMPconst x:(MOVHZreg _) [c]) 9695 // cond: 9696 // result: (CMPWconst x [c]) 9697 for { 9698 c := v.AuxInt 9699 x := v.Args[0] 9700 if x.Op != OpS390XMOVHZreg { 9701 break 9702 } 9703 v.reset(OpS390XCMPWconst) 9704 v.AuxInt = c 9705 v.AddArg(x) 9706 return true 9707 } 9708 // match: (CMPconst x:(MOVBreg _) [c]) 9709 // cond: 9710 // result: (CMPWconst x [c]) 9711 for { 9712 c := v.AuxInt 9713 x := v.Args[0] 9714 if x.Op != OpS390XMOVBreg { 9715 break 9716 } 9717 v.reset(OpS390XCMPWconst) 9718 v.AuxInt = c 9719 v.AddArg(x) 9720 return true 9721 } 9722 // match: (CMPconst x:(MOVBZreg _) [c]) 9723 // cond: 9724 // result: (CMPWconst x [c]) 9725 for { 9726 c := v.AuxInt 9727 x := v.Args[0] 9728 if x.Op != OpS390XMOVBZreg { 9729 break 9730 } 9731 v.reset(OpS390XCMPWconst) 9732 v.AuxInt = c 9733 v.AddArg(x) 9734 return true 9735 } 9736 // match: (CMPconst (MOVWZreg x:(ANDWconst [m] _)) [c]) 9737 // cond: int32(m) >= 0 && c >= 0 9738 // result: (CMPWUconst x [c]) 9739 for { 9740 c := v.AuxInt 9741 v_0 := v.Args[0] 9742 if v_0.Op != OpS390XMOVWZreg { 9743 break 9744 } 9745 x := v_0.Args[0] 9746 if x.Op != OpS390XANDWconst { 9747 break 9748 } 9749 m := x.AuxInt 9750 if !(int32(m) >= 0 && c >= 0) { 9751 break 9752 } 9753 v.reset(OpS390XCMPWUconst) 9754 v.AuxInt = c 9755 v.AddArg(x) 9756 return true 9757 } 9758 return false 9759 } 9760 func rewriteValueS390X_OpS390XCMPconst_10(v *Value) bool { 9761 // match: (CMPconst (MOVWreg x:(ANDWconst [m] _)) [c]) 9762 // cond: int32(m) >= 0 && c >= 0 9763 // result: (CMPWUconst x [c]) 9764 for { 9765 c := v.AuxInt 9766 v_0 := v.Args[0] 9767 if v_0.Op != OpS390XMOVWreg { 9768 break 9769 } 9770 x := v_0.Args[0] 9771 if x.Op != OpS390XANDWconst { 9772 break 9773 } 9774 m := x.AuxInt 9775 if !(int32(m) >= 0 && c >= 0) { 9776 break 9777 } 9778 v.reset(OpS390XCMPWUconst) 9779 v.AuxInt = c 9780 v.AddArg(x) 9781 return true 9782 } 9783 // match: (CMPconst x:(SRDconst _ [c]) [n]) 9784 // cond: c > 0 && n >= 0 9785 // result: (CMPUconst x [n]) 9786 for { 9787 n := v.AuxInt 9788 x := v.Args[0] 9789 if x.Op != OpS390XSRDconst { 9790 break 9791 } 9792 c := x.AuxInt 9793 if !(c > 0 && n >= 0) { 9794 break 9795 } 9796 v.reset(OpS390XCMPUconst) 9797 v.AuxInt = n 9798 v.AddArg(x) 9799 return true 9800 } 9801 return false 9802 } 9803 func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool { 9804 // match: (CPSDR y (FMOVDconst [c])) 9805 // cond: c & -1<<63 == 0 9806 // result: (LPDFR y) 9807 for { 9808 _ = v.Args[1] 9809 y := v.Args[0] 9810 v_1 := v.Args[1] 9811 if v_1.Op != OpS390XFMOVDconst { 9812 break 9813 } 9814 c := v_1.AuxInt 9815 if !(c&-1<<63 == 0) { 9816 break 9817 } 9818 v.reset(OpS390XLPDFR) 9819 v.AddArg(y) 9820 return true 9821 } 9822 // match: (CPSDR y (FMOVDconst [c])) 9823 // cond: c & -1<<63 != 0 9824 // result: (LNDFR y) 9825 for { 9826 _ = v.Args[1] 9827 y := v.Args[0] 9828 v_1 := v.Args[1] 9829 if v_1.Op != OpS390XFMOVDconst { 9830 break 9831 } 9832 c := v_1.AuxInt 9833 if !(c&-1<<63 != 0) { 9834 break 9835 } 9836 v.reset(OpS390XLNDFR) 9837 v.AddArg(y) 9838 return true 9839 } 9840 return false 9841 } 9842 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 9843 // match: (FADD (FMUL y z) x) 9844 // cond: 9845 // result: (FMADD x y z) 9846 for { 9847 _ = v.Args[1] 9848 v_0 := v.Args[0] 9849 if v_0.Op != OpS390XFMUL { 9850 break 9851 } 9852 _ = v_0.Args[1] 9853 y := v_0.Args[0] 9854 z := v_0.Args[1] 9855 x := v.Args[1] 9856 v.reset(OpS390XFMADD) 9857 v.AddArg(x) 9858 v.AddArg(y) 9859 v.AddArg(z) 9860 return true 9861 } 9862 // match: (FADD x (FMUL y z)) 9863 // cond: 9864 // result: (FMADD x y z) 9865 for { 9866 _ = v.Args[1] 9867 x := v.Args[0] 9868 v_1 := v.Args[1] 9869 if v_1.Op != OpS390XFMUL { 9870 break 9871 } 9872 _ = v_1.Args[1] 9873 y := v_1.Args[0] 9874 z := v_1.Args[1] 9875 v.reset(OpS390XFMADD) 9876 v.AddArg(x) 9877 v.AddArg(y) 9878 v.AddArg(z) 9879 return true 9880 } 9881 return false 9882 } 9883 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 9884 // match: (FADDS (FMULS y z) x) 9885 // cond: 9886 // result: (FMADDS x y z) 9887 for { 9888 _ = v.Args[1] 9889 v_0 := v.Args[0] 9890 if v_0.Op != OpS390XFMULS { 9891 break 9892 } 9893 _ = v_0.Args[1] 9894 y := v_0.Args[0] 9895 z := v_0.Args[1] 9896 x := v.Args[1] 9897 v.reset(OpS390XFMADDS) 9898 v.AddArg(x) 9899 v.AddArg(y) 9900 v.AddArg(z) 9901 return true 9902 } 9903 // match: (FADDS x (FMULS y z)) 9904 // cond: 9905 // result: (FMADDS x y z) 9906 for { 9907 _ = v.Args[1] 9908 x := v.Args[0] 9909 v_1 := v.Args[1] 9910 if v_1.Op != OpS390XFMULS { 9911 break 9912 } 9913 _ = v_1.Args[1] 9914 y := v_1.Args[0] 9915 z := v_1.Args[1] 9916 v.reset(OpS390XFMADDS) 9917 v.AddArg(x) 9918 v.AddArg(y) 9919 v.AddArg(z) 9920 return true 9921 } 9922 return false 9923 } 9924 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 9925 // match: (FMOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 9926 // cond: isSamePtr(ptr1, ptr2) 9927 // result: (LDGR x) 9928 for { 9929 off := v.AuxInt 9930 sym := v.Aux 9931 _ = v.Args[1] 9932 ptr1 := v.Args[0] 9933 v_1 := v.Args[1] 9934 if v_1.Op != OpS390XMOVDstore { 9935 break 9936 } 9937 if v_1.AuxInt != off { 9938 break 9939 } 9940 if v_1.Aux != sym { 9941 break 9942 } 9943 _ = v_1.Args[2] 9944 ptr2 := v_1.Args[0] 9945 x := v_1.Args[1] 9946 if !(isSamePtr(ptr1, ptr2)) { 9947 break 9948 } 9949 v.reset(OpS390XLDGR) 9950 v.AddArg(x) 9951 return true 9952 } 9953 // match: (FMOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 9954 // cond: isSamePtr(ptr1, ptr2) 9955 // result: x 9956 for { 9957 off := v.AuxInt 9958 sym := v.Aux 9959 _ = v.Args[1] 9960 ptr1 := v.Args[0] 9961 v_1 := v.Args[1] 9962 if v_1.Op != OpS390XFMOVDstore { 9963 break 9964 } 9965 if v_1.AuxInt != off { 9966 break 9967 } 9968 if v_1.Aux != sym { 9969 break 9970 } 9971 _ = v_1.Args[2] 9972 ptr2 := v_1.Args[0] 9973 x := v_1.Args[1] 9974 if !(isSamePtr(ptr1, ptr2)) { 9975 break 9976 } 9977 v.reset(OpCopy) 9978 v.Type = x.Type 9979 v.AddArg(x) 9980 return true 9981 } 9982 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 9983 // cond: is20Bit(off1+off2) 9984 // result: (FMOVDload [off1+off2] {sym} ptr mem) 9985 for { 9986 off1 := v.AuxInt 9987 sym := v.Aux 9988 _ = v.Args[1] 9989 v_0 := v.Args[0] 9990 if v_0.Op != OpS390XADDconst { 9991 break 9992 } 9993 off2 := v_0.AuxInt 9994 ptr := v_0.Args[0] 9995 mem := v.Args[1] 9996 if !(is20Bit(off1 + off2)) { 9997 break 9998 } 9999 v.reset(OpS390XFMOVDload) 10000 v.AuxInt = off1 + off2 10001 v.Aux = sym 10002 v.AddArg(ptr) 10003 v.AddArg(mem) 10004 return true 10005 } 10006 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10007 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10008 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10009 for { 10010 off1 := v.AuxInt 10011 sym1 := v.Aux 10012 _ = v.Args[1] 10013 v_0 := v.Args[0] 10014 if v_0.Op != OpS390XMOVDaddr { 10015 break 10016 } 10017 off2 := v_0.AuxInt 10018 sym2 := v_0.Aux 10019 base := v_0.Args[0] 10020 mem := v.Args[1] 10021 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10022 break 10023 } 10024 v.reset(OpS390XFMOVDload) 10025 v.AuxInt = off1 + off2 10026 v.Aux = mergeSym(sym1, sym2) 10027 v.AddArg(base) 10028 v.AddArg(mem) 10029 return true 10030 } 10031 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10032 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10033 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10034 for { 10035 off1 := v.AuxInt 10036 sym1 := v.Aux 10037 _ = v.Args[1] 10038 v_0 := v.Args[0] 10039 if v_0.Op != OpS390XMOVDaddridx { 10040 break 10041 } 10042 off2 := v_0.AuxInt 10043 sym2 := v_0.Aux 10044 _ = v_0.Args[1] 10045 ptr := v_0.Args[0] 10046 idx := v_0.Args[1] 10047 mem := v.Args[1] 10048 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10049 break 10050 } 10051 v.reset(OpS390XFMOVDloadidx) 10052 v.AuxInt = off1 + off2 10053 v.Aux = mergeSym(sym1, sym2) 10054 v.AddArg(ptr) 10055 v.AddArg(idx) 10056 v.AddArg(mem) 10057 return true 10058 } 10059 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 10060 // cond: ptr.Op != OpSB 10061 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 10062 for { 10063 off := v.AuxInt 10064 sym := v.Aux 10065 _ = v.Args[1] 10066 v_0 := v.Args[0] 10067 if v_0.Op != OpS390XADD { 10068 break 10069 } 10070 _ = v_0.Args[1] 10071 ptr := v_0.Args[0] 10072 idx := v_0.Args[1] 10073 mem := v.Args[1] 10074 if !(ptr.Op != OpSB) { 10075 break 10076 } 10077 v.reset(OpS390XFMOVDloadidx) 10078 v.AuxInt = off 10079 v.Aux = sym 10080 v.AddArg(ptr) 10081 v.AddArg(idx) 10082 v.AddArg(mem) 10083 return true 10084 } 10085 return false 10086 } 10087 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 10088 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10089 // cond: is20Bit(c+d) 10090 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 10091 for { 10092 c := v.AuxInt 10093 sym := v.Aux 10094 _ = v.Args[2] 10095 v_0 := v.Args[0] 10096 if v_0.Op != OpS390XADDconst { 10097 break 10098 } 10099 d := v_0.AuxInt 10100 ptr := v_0.Args[0] 10101 idx := v.Args[1] 10102 mem := v.Args[2] 10103 if !(is20Bit(c + d)) { 10104 break 10105 } 10106 v.reset(OpS390XFMOVDloadidx) 10107 v.AuxInt = c + d 10108 v.Aux = sym 10109 v.AddArg(ptr) 10110 v.AddArg(idx) 10111 v.AddArg(mem) 10112 return true 10113 } 10114 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10115 // cond: is20Bit(c+d) 10116 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 10117 for { 10118 c := v.AuxInt 10119 sym := v.Aux 10120 _ = v.Args[2] 10121 ptr := v.Args[0] 10122 v_1 := v.Args[1] 10123 if v_1.Op != OpS390XADDconst { 10124 break 10125 } 10126 d := v_1.AuxInt 10127 idx := v_1.Args[0] 10128 mem := v.Args[2] 10129 if !(is20Bit(c + d)) { 10130 break 10131 } 10132 v.reset(OpS390XFMOVDloadidx) 10133 v.AuxInt = c + d 10134 v.Aux = sym 10135 v.AddArg(ptr) 10136 v.AddArg(idx) 10137 v.AddArg(mem) 10138 return true 10139 } 10140 return false 10141 } 10142 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 10143 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10144 // cond: is20Bit(off1+off2) 10145 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 10146 for { 10147 off1 := v.AuxInt 10148 sym := v.Aux 10149 _ = v.Args[2] 10150 v_0 := v.Args[0] 10151 if v_0.Op != OpS390XADDconst { 10152 break 10153 } 10154 off2 := v_0.AuxInt 10155 ptr := v_0.Args[0] 10156 val := v.Args[1] 10157 mem := v.Args[2] 10158 if !(is20Bit(off1 + off2)) { 10159 break 10160 } 10161 v.reset(OpS390XFMOVDstore) 10162 v.AuxInt = off1 + off2 10163 v.Aux = sym 10164 v.AddArg(ptr) 10165 v.AddArg(val) 10166 v.AddArg(mem) 10167 return true 10168 } 10169 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10170 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10171 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10172 for { 10173 off1 := v.AuxInt 10174 sym1 := v.Aux 10175 _ = v.Args[2] 10176 v_0 := v.Args[0] 10177 if v_0.Op != OpS390XMOVDaddr { 10178 break 10179 } 10180 off2 := v_0.AuxInt 10181 sym2 := v_0.Aux 10182 base := v_0.Args[0] 10183 val := v.Args[1] 10184 mem := v.Args[2] 10185 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10186 break 10187 } 10188 v.reset(OpS390XFMOVDstore) 10189 v.AuxInt = off1 + off2 10190 v.Aux = mergeSym(sym1, sym2) 10191 v.AddArg(base) 10192 v.AddArg(val) 10193 v.AddArg(mem) 10194 return true 10195 } 10196 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10197 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10198 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10199 for { 10200 off1 := v.AuxInt 10201 sym1 := v.Aux 10202 _ = v.Args[2] 10203 v_0 := v.Args[0] 10204 if v_0.Op != OpS390XMOVDaddridx { 10205 break 10206 } 10207 off2 := v_0.AuxInt 10208 sym2 := v_0.Aux 10209 _ = v_0.Args[1] 10210 ptr := v_0.Args[0] 10211 idx := v_0.Args[1] 10212 val := v.Args[1] 10213 mem := v.Args[2] 10214 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10215 break 10216 } 10217 v.reset(OpS390XFMOVDstoreidx) 10218 v.AuxInt = off1 + off2 10219 v.Aux = mergeSym(sym1, sym2) 10220 v.AddArg(ptr) 10221 v.AddArg(idx) 10222 v.AddArg(val) 10223 v.AddArg(mem) 10224 return true 10225 } 10226 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 10227 // cond: ptr.Op != OpSB 10228 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 10229 for { 10230 off := v.AuxInt 10231 sym := v.Aux 10232 _ = v.Args[2] 10233 v_0 := v.Args[0] 10234 if v_0.Op != OpS390XADD { 10235 break 10236 } 10237 _ = v_0.Args[1] 10238 ptr := v_0.Args[0] 10239 idx := v_0.Args[1] 10240 val := v.Args[1] 10241 mem := v.Args[2] 10242 if !(ptr.Op != OpSB) { 10243 break 10244 } 10245 v.reset(OpS390XFMOVDstoreidx) 10246 v.AuxInt = off 10247 v.Aux = sym 10248 v.AddArg(ptr) 10249 v.AddArg(idx) 10250 v.AddArg(val) 10251 v.AddArg(mem) 10252 return true 10253 } 10254 return false 10255 } 10256 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 10257 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10258 // cond: is20Bit(c+d) 10259 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 10260 for { 10261 c := v.AuxInt 10262 sym := v.Aux 10263 _ = v.Args[3] 10264 v_0 := v.Args[0] 10265 if v_0.Op != OpS390XADDconst { 10266 break 10267 } 10268 d := v_0.AuxInt 10269 ptr := v_0.Args[0] 10270 idx := v.Args[1] 10271 val := v.Args[2] 10272 mem := v.Args[3] 10273 if !(is20Bit(c + d)) { 10274 break 10275 } 10276 v.reset(OpS390XFMOVDstoreidx) 10277 v.AuxInt = c + d 10278 v.Aux = sym 10279 v.AddArg(ptr) 10280 v.AddArg(idx) 10281 v.AddArg(val) 10282 v.AddArg(mem) 10283 return true 10284 } 10285 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10286 // cond: is20Bit(c+d) 10287 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 10288 for { 10289 c := v.AuxInt 10290 sym := v.Aux 10291 _ = v.Args[3] 10292 ptr := v.Args[0] 10293 v_1 := v.Args[1] 10294 if v_1.Op != OpS390XADDconst { 10295 break 10296 } 10297 d := v_1.AuxInt 10298 idx := v_1.Args[0] 10299 val := v.Args[2] 10300 mem := v.Args[3] 10301 if !(is20Bit(c + d)) { 10302 break 10303 } 10304 v.reset(OpS390XFMOVDstoreidx) 10305 v.AuxInt = c + d 10306 v.Aux = sym 10307 v.AddArg(ptr) 10308 v.AddArg(idx) 10309 v.AddArg(val) 10310 v.AddArg(mem) 10311 return true 10312 } 10313 return false 10314 } 10315 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 10316 // match: (FMOVSload [off] {sym} ptr1 (FMOVSstore [off] {sym} ptr2 x _)) 10317 // cond: isSamePtr(ptr1, ptr2) 10318 // result: x 10319 for { 10320 off := v.AuxInt 10321 sym := v.Aux 10322 _ = v.Args[1] 10323 ptr1 := v.Args[0] 10324 v_1 := v.Args[1] 10325 if v_1.Op != OpS390XFMOVSstore { 10326 break 10327 } 10328 if v_1.AuxInt != off { 10329 break 10330 } 10331 if v_1.Aux != sym { 10332 break 10333 } 10334 _ = v_1.Args[2] 10335 ptr2 := v_1.Args[0] 10336 x := v_1.Args[1] 10337 if !(isSamePtr(ptr1, ptr2)) { 10338 break 10339 } 10340 v.reset(OpCopy) 10341 v.Type = x.Type 10342 v.AddArg(x) 10343 return true 10344 } 10345 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 10346 // cond: is20Bit(off1+off2) 10347 // result: (FMOVSload [off1+off2] {sym} ptr mem) 10348 for { 10349 off1 := v.AuxInt 10350 sym := v.Aux 10351 _ = v.Args[1] 10352 v_0 := v.Args[0] 10353 if v_0.Op != OpS390XADDconst { 10354 break 10355 } 10356 off2 := v_0.AuxInt 10357 ptr := v_0.Args[0] 10358 mem := v.Args[1] 10359 if !(is20Bit(off1 + off2)) { 10360 break 10361 } 10362 v.reset(OpS390XFMOVSload) 10363 v.AuxInt = off1 + off2 10364 v.Aux = sym 10365 v.AddArg(ptr) 10366 v.AddArg(mem) 10367 return true 10368 } 10369 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10370 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10371 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10372 for { 10373 off1 := v.AuxInt 10374 sym1 := v.Aux 10375 _ = v.Args[1] 10376 v_0 := v.Args[0] 10377 if v_0.Op != OpS390XMOVDaddr { 10378 break 10379 } 10380 off2 := v_0.AuxInt 10381 sym2 := v_0.Aux 10382 base := v_0.Args[0] 10383 mem := v.Args[1] 10384 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10385 break 10386 } 10387 v.reset(OpS390XFMOVSload) 10388 v.AuxInt = off1 + off2 10389 v.Aux = mergeSym(sym1, sym2) 10390 v.AddArg(base) 10391 v.AddArg(mem) 10392 return true 10393 } 10394 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10395 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10396 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10397 for { 10398 off1 := v.AuxInt 10399 sym1 := v.Aux 10400 _ = v.Args[1] 10401 v_0 := v.Args[0] 10402 if v_0.Op != OpS390XMOVDaddridx { 10403 break 10404 } 10405 off2 := v_0.AuxInt 10406 sym2 := v_0.Aux 10407 _ = v_0.Args[1] 10408 ptr := v_0.Args[0] 10409 idx := v_0.Args[1] 10410 mem := v.Args[1] 10411 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10412 break 10413 } 10414 v.reset(OpS390XFMOVSloadidx) 10415 v.AuxInt = off1 + off2 10416 v.Aux = mergeSym(sym1, sym2) 10417 v.AddArg(ptr) 10418 v.AddArg(idx) 10419 v.AddArg(mem) 10420 return true 10421 } 10422 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 10423 // cond: ptr.Op != OpSB 10424 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 10425 for { 10426 off := v.AuxInt 10427 sym := v.Aux 10428 _ = v.Args[1] 10429 v_0 := v.Args[0] 10430 if v_0.Op != OpS390XADD { 10431 break 10432 } 10433 _ = v_0.Args[1] 10434 ptr := v_0.Args[0] 10435 idx := v_0.Args[1] 10436 mem := v.Args[1] 10437 if !(ptr.Op != OpSB) { 10438 break 10439 } 10440 v.reset(OpS390XFMOVSloadidx) 10441 v.AuxInt = off 10442 v.Aux = sym 10443 v.AddArg(ptr) 10444 v.AddArg(idx) 10445 v.AddArg(mem) 10446 return true 10447 } 10448 return false 10449 } 10450 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 10451 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10452 // cond: is20Bit(c+d) 10453 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 10454 for { 10455 c := v.AuxInt 10456 sym := v.Aux 10457 _ = v.Args[2] 10458 v_0 := v.Args[0] 10459 if v_0.Op != OpS390XADDconst { 10460 break 10461 } 10462 d := v_0.AuxInt 10463 ptr := v_0.Args[0] 10464 idx := v.Args[1] 10465 mem := v.Args[2] 10466 if !(is20Bit(c + d)) { 10467 break 10468 } 10469 v.reset(OpS390XFMOVSloadidx) 10470 v.AuxInt = c + d 10471 v.Aux = sym 10472 v.AddArg(ptr) 10473 v.AddArg(idx) 10474 v.AddArg(mem) 10475 return true 10476 } 10477 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10478 // cond: is20Bit(c+d) 10479 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 10480 for { 10481 c := v.AuxInt 10482 sym := v.Aux 10483 _ = v.Args[2] 10484 ptr := v.Args[0] 10485 v_1 := v.Args[1] 10486 if v_1.Op != OpS390XADDconst { 10487 break 10488 } 10489 d := v_1.AuxInt 10490 idx := v_1.Args[0] 10491 mem := v.Args[2] 10492 if !(is20Bit(c + d)) { 10493 break 10494 } 10495 v.reset(OpS390XFMOVSloadidx) 10496 v.AuxInt = c + d 10497 v.Aux = sym 10498 v.AddArg(ptr) 10499 v.AddArg(idx) 10500 v.AddArg(mem) 10501 return true 10502 } 10503 return false 10504 } 10505 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 10506 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10507 // cond: is20Bit(off1+off2) 10508 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 10509 for { 10510 off1 := v.AuxInt 10511 sym := v.Aux 10512 _ = v.Args[2] 10513 v_0 := v.Args[0] 10514 if v_0.Op != OpS390XADDconst { 10515 break 10516 } 10517 off2 := v_0.AuxInt 10518 ptr := v_0.Args[0] 10519 val := v.Args[1] 10520 mem := v.Args[2] 10521 if !(is20Bit(off1 + off2)) { 10522 break 10523 } 10524 v.reset(OpS390XFMOVSstore) 10525 v.AuxInt = off1 + off2 10526 v.Aux = sym 10527 v.AddArg(ptr) 10528 v.AddArg(val) 10529 v.AddArg(mem) 10530 return true 10531 } 10532 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10533 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10534 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10535 for { 10536 off1 := v.AuxInt 10537 sym1 := v.Aux 10538 _ = v.Args[2] 10539 v_0 := v.Args[0] 10540 if v_0.Op != OpS390XMOVDaddr { 10541 break 10542 } 10543 off2 := v_0.AuxInt 10544 sym2 := v_0.Aux 10545 base := v_0.Args[0] 10546 val := v.Args[1] 10547 mem := v.Args[2] 10548 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10549 break 10550 } 10551 v.reset(OpS390XFMOVSstore) 10552 v.AuxInt = off1 + off2 10553 v.Aux = mergeSym(sym1, sym2) 10554 v.AddArg(base) 10555 v.AddArg(val) 10556 v.AddArg(mem) 10557 return true 10558 } 10559 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10560 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10561 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10562 for { 10563 off1 := v.AuxInt 10564 sym1 := v.Aux 10565 _ = v.Args[2] 10566 v_0 := v.Args[0] 10567 if v_0.Op != OpS390XMOVDaddridx { 10568 break 10569 } 10570 off2 := v_0.AuxInt 10571 sym2 := v_0.Aux 10572 _ = v_0.Args[1] 10573 ptr := v_0.Args[0] 10574 idx := v_0.Args[1] 10575 val := v.Args[1] 10576 mem := v.Args[2] 10577 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10578 break 10579 } 10580 v.reset(OpS390XFMOVSstoreidx) 10581 v.AuxInt = off1 + off2 10582 v.Aux = mergeSym(sym1, sym2) 10583 v.AddArg(ptr) 10584 v.AddArg(idx) 10585 v.AddArg(val) 10586 v.AddArg(mem) 10587 return true 10588 } 10589 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 10590 // cond: ptr.Op != OpSB 10591 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 10592 for { 10593 off := v.AuxInt 10594 sym := v.Aux 10595 _ = v.Args[2] 10596 v_0 := v.Args[0] 10597 if v_0.Op != OpS390XADD { 10598 break 10599 } 10600 _ = v_0.Args[1] 10601 ptr := v_0.Args[0] 10602 idx := v_0.Args[1] 10603 val := v.Args[1] 10604 mem := v.Args[2] 10605 if !(ptr.Op != OpSB) { 10606 break 10607 } 10608 v.reset(OpS390XFMOVSstoreidx) 10609 v.AuxInt = off 10610 v.Aux = sym 10611 v.AddArg(ptr) 10612 v.AddArg(idx) 10613 v.AddArg(val) 10614 v.AddArg(mem) 10615 return true 10616 } 10617 return false 10618 } 10619 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 10620 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10621 // cond: is20Bit(c+d) 10622 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 10623 for { 10624 c := v.AuxInt 10625 sym := v.Aux 10626 _ = v.Args[3] 10627 v_0 := v.Args[0] 10628 if v_0.Op != OpS390XADDconst { 10629 break 10630 } 10631 d := v_0.AuxInt 10632 ptr := v_0.Args[0] 10633 idx := v.Args[1] 10634 val := v.Args[2] 10635 mem := v.Args[3] 10636 if !(is20Bit(c + d)) { 10637 break 10638 } 10639 v.reset(OpS390XFMOVSstoreidx) 10640 v.AuxInt = c + d 10641 v.Aux = sym 10642 v.AddArg(ptr) 10643 v.AddArg(idx) 10644 v.AddArg(val) 10645 v.AddArg(mem) 10646 return true 10647 } 10648 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10649 // cond: is20Bit(c+d) 10650 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 10651 for { 10652 c := v.AuxInt 10653 sym := v.Aux 10654 _ = v.Args[3] 10655 ptr := v.Args[0] 10656 v_1 := v.Args[1] 10657 if v_1.Op != OpS390XADDconst { 10658 break 10659 } 10660 d := v_1.AuxInt 10661 idx := v_1.Args[0] 10662 val := v.Args[2] 10663 mem := v.Args[3] 10664 if !(is20Bit(c + d)) { 10665 break 10666 } 10667 v.reset(OpS390XFMOVSstoreidx) 10668 v.AuxInt = c + d 10669 v.Aux = sym 10670 v.AddArg(ptr) 10671 v.AddArg(idx) 10672 v.AddArg(val) 10673 v.AddArg(mem) 10674 return true 10675 } 10676 return false 10677 } 10678 func rewriteValueS390X_OpS390XFNEG_0(v *Value) bool { 10679 // match: (FNEG (LPDFR x)) 10680 // cond: 10681 // result: (LNDFR x) 10682 for { 10683 v_0 := v.Args[0] 10684 if v_0.Op != OpS390XLPDFR { 10685 break 10686 } 10687 x := v_0.Args[0] 10688 v.reset(OpS390XLNDFR) 10689 v.AddArg(x) 10690 return true 10691 } 10692 // match: (FNEG (LNDFR x)) 10693 // cond: 10694 // result: (LPDFR x) 10695 for { 10696 v_0 := v.Args[0] 10697 if v_0.Op != OpS390XLNDFR { 10698 break 10699 } 10700 x := v_0.Args[0] 10701 v.reset(OpS390XLPDFR) 10702 v.AddArg(x) 10703 return true 10704 } 10705 return false 10706 } 10707 func rewriteValueS390X_OpS390XFNEGS_0(v *Value) bool { 10708 // match: (FNEGS (LPDFR x)) 10709 // cond: 10710 // result: (LNDFR x) 10711 for { 10712 v_0 := v.Args[0] 10713 if v_0.Op != OpS390XLPDFR { 10714 break 10715 } 10716 x := v_0.Args[0] 10717 v.reset(OpS390XLNDFR) 10718 v.AddArg(x) 10719 return true 10720 } 10721 // match: (FNEGS (LNDFR x)) 10722 // cond: 10723 // result: (LPDFR x) 10724 for { 10725 v_0 := v.Args[0] 10726 if v_0.Op != OpS390XLNDFR { 10727 break 10728 } 10729 x := v_0.Args[0] 10730 v.reset(OpS390XLPDFR) 10731 v.AddArg(x) 10732 return true 10733 } 10734 return false 10735 } 10736 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 10737 // match: (FSUB (FMUL y z) x) 10738 // cond: 10739 // result: (FMSUB x y z) 10740 for { 10741 _ = v.Args[1] 10742 v_0 := v.Args[0] 10743 if v_0.Op != OpS390XFMUL { 10744 break 10745 } 10746 _ = v_0.Args[1] 10747 y := v_0.Args[0] 10748 z := v_0.Args[1] 10749 x := v.Args[1] 10750 v.reset(OpS390XFMSUB) 10751 v.AddArg(x) 10752 v.AddArg(y) 10753 v.AddArg(z) 10754 return true 10755 } 10756 return false 10757 } 10758 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 10759 // match: (FSUBS (FMULS y z) x) 10760 // cond: 10761 // result: (FMSUBS x y z) 10762 for { 10763 _ = v.Args[1] 10764 v_0 := v.Args[0] 10765 if v_0.Op != OpS390XFMULS { 10766 break 10767 } 10768 _ = v_0.Args[1] 10769 y := v_0.Args[0] 10770 z := v_0.Args[1] 10771 x := v.Args[1] 10772 v.reset(OpS390XFMSUBS) 10773 v.AddArg(x) 10774 v.AddArg(y) 10775 v.AddArg(z) 10776 return true 10777 } 10778 return false 10779 } 10780 func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { 10781 b := v.Block 10782 _ = b 10783 // match: (LDGR <t> (SRDconst [1] (SLDconst [1] x))) 10784 // cond: 10785 // result: (LPDFR (LDGR <t> x)) 10786 for { 10787 t := v.Type 10788 v_0 := v.Args[0] 10789 if v_0.Op != OpS390XSRDconst { 10790 break 10791 } 10792 if v_0.AuxInt != 1 { 10793 break 10794 } 10795 v_0_0 := v_0.Args[0] 10796 if v_0_0.Op != OpS390XSLDconst { 10797 break 10798 } 10799 if v_0_0.AuxInt != 1 { 10800 break 10801 } 10802 x := v_0_0.Args[0] 10803 v.reset(OpS390XLPDFR) 10804 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10805 v0.AddArg(x) 10806 v.AddArg(v0) 10807 return true 10808 } 10809 // match: (LDGR <t> (OR (MOVDconst [-1<<63]) x)) 10810 // cond: 10811 // result: (LNDFR (LDGR <t> x)) 10812 for { 10813 t := v.Type 10814 v_0 := v.Args[0] 10815 if v_0.Op != OpS390XOR { 10816 break 10817 } 10818 _ = v_0.Args[1] 10819 v_0_0 := v_0.Args[0] 10820 if v_0_0.Op != OpS390XMOVDconst { 10821 break 10822 } 10823 if v_0_0.AuxInt != -1<<63 { 10824 break 10825 } 10826 x := v_0.Args[1] 10827 v.reset(OpS390XLNDFR) 10828 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10829 v0.AddArg(x) 10830 v.AddArg(v0) 10831 return true 10832 } 10833 // match: (LDGR <t> (OR x (MOVDconst [-1<<63]))) 10834 // cond: 10835 // result: (LNDFR (LDGR <t> x)) 10836 for { 10837 t := v.Type 10838 v_0 := v.Args[0] 10839 if v_0.Op != OpS390XOR { 10840 break 10841 } 10842 _ = v_0.Args[1] 10843 x := v_0.Args[0] 10844 v_0_1 := v_0.Args[1] 10845 if v_0_1.Op != OpS390XMOVDconst { 10846 break 10847 } 10848 if v_0_1.AuxInt != -1<<63 { 10849 break 10850 } 10851 v.reset(OpS390XLNDFR) 10852 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10853 v0.AddArg(x) 10854 v.AddArg(v0) 10855 return true 10856 } 10857 // match: (LDGR <t> x:(ORload <t1> [off] {sym} (MOVDconst [-1<<63]) ptr mem)) 10858 // cond: x.Uses == 1 && clobber(x) 10859 // result: @x.Block (LNDFR <t> (LDGR <t> (MOVDload <t1> [off] {sym} ptr mem))) 10860 for { 10861 t := v.Type 10862 x := v.Args[0] 10863 if x.Op != OpS390XORload { 10864 break 10865 } 10866 t1 := x.Type 10867 off := x.AuxInt 10868 sym := x.Aux 10869 _ = x.Args[2] 10870 x_0 := x.Args[0] 10871 if x_0.Op != OpS390XMOVDconst { 10872 break 10873 } 10874 if x_0.AuxInt != -1<<63 { 10875 break 10876 } 10877 ptr := x.Args[1] 10878 mem := x.Args[2] 10879 if !(x.Uses == 1 && clobber(x)) { 10880 break 10881 } 10882 b = x.Block 10883 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, t) 10884 v.reset(OpCopy) 10885 v.AddArg(v0) 10886 v1 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10887 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, t1) 10888 v2.AuxInt = off 10889 v2.Aux = sym 10890 v2.AddArg(ptr) 10891 v2.AddArg(mem) 10892 v1.AddArg(v2) 10893 v0.AddArg(v1) 10894 return true 10895 } 10896 // match: (LDGR (LGDR x)) 10897 // cond: 10898 // result: x 10899 for { 10900 v_0 := v.Args[0] 10901 if v_0.Op != OpS390XLGDR { 10902 break 10903 } 10904 x := v_0.Args[0] 10905 v.reset(OpCopy) 10906 v.Type = x.Type 10907 v.AddArg(x) 10908 return true 10909 } 10910 return false 10911 } 10912 func rewriteValueS390X_OpS390XLEDBR_0(v *Value) bool { 10913 // match: (LEDBR (LPDFR (LDEBR x))) 10914 // cond: 10915 // result: (LPDFR x) 10916 for { 10917 v_0 := v.Args[0] 10918 if v_0.Op != OpS390XLPDFR { 10919 break 10920 } 10921 v_0_0 := v_0.Args[0] 10922 if v_0_0.Op != OpS390XLDEBR { 10923 break 10924 } 10925 x := v_0_0.Args[0] 10926 v.reset(OpS390XLPDFR) 10927 v.AddArg(x) 10928 return true 10929 } 10930 // match: (LEDBR (LNDFR (LDEBR x))) 10931 // cond: 10932 // result: (LNDFR x) 10933 for { 10934 v_0 := v.Args[0] 10935 if v_0.Op != OpS390XLNDFR { 10936 break 10937 } 10938 v_0_0 := v_0.Args[0] 10939 if v_0_0.Op != OpS390XLDEBR { 10940 break 10941 } 10942 x := v_0_0.Args[0] 10943 v.reset(OpS390XLNDFR) 10944 v.AddArg(x) 10945 return true 10946 } 10947 return false 10948 } 10949 func rewriteValueS390X_OpS390XLGDR_0(v *Value) bool { 10950 // match: (LGDR (LDGR x)) 10951 // cond: 10952 // result: (MOVDreg x) 10953 for { 10954 v_0 := v.Args[0] 10955 if v_0.Op != OpS390XLDGR { 10956 break 10957 } 10958 x := v_0.Args[0] 10959 v.reset(OpS390XMOVDreg) 10960 v.AddArg(x) 10961 return true 10962 } 10963 return false 10964 } 10965 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 10966 // match: (LoweredRound32F x:(FMOVSconst)) 10967 // cond: 10968 // result: x 10969 for { 10970 x := v.Args[0] 10971 if x.Op != OpS390XFMOVSconst { 10972 break 10973 } 10974 v.reset(OpCopy) 10975 v.Type = x.Type 10976 v.AddArg(x) 10977 return true 10978 } 10979 return false 10980 } 10981 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 10982 // match: (LoweredRound64F x:(FMOVDconst)) 10983 // cond: 10984 // result: x 10985 for { 10986 x := v.Args[0] 10987 if x.Op != OpS390XFMOVDconst { 10988 break 10989 } 10990 v.reset(OpCopy) 10991 v.Type = x.Type 10992 v.AddArg(x) 10993 return true 10994 } 10995 return false 10996 } 10997 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 10998 // match: (MOVBZload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 10999 // cond: isSamePtr(ptr1, ptr2) 11000 // result: (MOVBZreg x) 11001 for { 11002 off := v.AuxInt 11003 sym := v.Aux 11004 _ = v.Args[1] 11005 ptr1 := v.Args[0] 11006 v_1 := v.Args[1] 11007 if v_1.Op != OpS390XMOVBstore { 11008 break 11009 } 11010 if v_1.AuxInt != off { 11011 break 11012 } 11013 if v_1.Aux != sym { 11014 break 11015 } 11016 _ = v_1.Args[2] 11017 ptr2 := v_1.Args[0] 11018 x := v_1.Args[1] 11019 if !(isSamePtr(ptr1, ptr2)) { 11020 break 11021 } 11022 v.reset(OpS390XMOVBZreg) 11023 v.AddArg(x) 11024 return true 11025 } 11026 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 11027 // cond: is20Bit(off1+off2) 11028 // result: (MOVBZload [off1+off2] {sym} ptr mem) 11029 for { 11030 off1 := v.AuxInt 11031 sym := v.Aux 11032 _ = v.Args[1] 11033 v_0 := v.Args[0] 11034 if v_0.Op != OpS390XADDconst { 11035 break 11036 } 11037 off2 := v_0.AuxInt 11038 ptr := v_0.Args[0] 11039 mem := v.Args[1] 11040 if !(is20Bit(off1 + off2)) { 11041 break 11042 } 11043 v.reset(OpS390XMOVBZload) 11044 v.AuxInt = off1 + off2 11045 v.Aux = sym 11046 v.AddArg(ptr) 11047 v.AddArg(mem) 11048 return true 11049 } 11050 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11051 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11052 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11053 for { 11054 off1 := v.AuxInt 11055 sym1 := v.Aux 11056 _ = v.Args[1] 11057 v_0 := v.Args[0] 11058 if v_0.Op != OpS390XMOVDaddr { 11059 break 11060 } 11061 off2 := v_0.AuxInt 11062 sym2 := v_0.Aux 11063 base := v_0.Args[0] 11064 mem := v.Args[1] 11065 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11066 break 11067 } 11068 v.reset(OpS390XMOVBZload) 11069 v.AuxInt = off1 + off2 11070 v.Aux = mergeSym(sym1, sym2) 11071 v.AddArg(base) 11072 v.AddArg(mem) 11073 return true 11074 } 11075 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11076 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11077 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11078 for { 11079 off1 := v.AuxInt 11080 sym1 := v.Aux 11081 _ = v.Args[1] 11082 v_0 := v.Args[0] 11083 if v_0.Op != OpS390XMOVDaddridx { 11084 break 11085 } 11086 off2 := v_0.AuxInt 11087 sym2 := v_0.Aux 11088 _ = v_0.Args[1] 11089 ptr := v_0.Args[0] 11090 idx := v_0.Args[1] 11091 mem := v.Args[1] 11092 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11093 break 11094 } 11095 v.reset(OpS390XMOVBZloadidx) 11096 v.AuxInt = off1 + off2 11097 v.Aux = mergeSym(sym1, sym2) 11098 v.AddArg(ptr) 11099 v.AddArg(idx) 11100 v.AddArg(mem) 11101 return true 11102 } 11103 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 11104 // cond: ptr.Op != OpSB 11105 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 11106 for { 11107 off := v.AuxInt 11108 sym := v.Aux 11109 _ = v.Args[1] 11110 v_0 := v.Args[0] 11111 if v_0.Op != OpS390XADD { 11112 break 11113 } 11114 _ = v_0.Args[1] 11115 ptr := v_0.Args[0] 11116 idx := v_0.Args[1] 11117 mem := v.Args[1] 11118 if !(ptr.Op != OpSB) { 11119 break 11120 } 11121 v.reset(OpS390XMOVBZloadidx) 11122 v.AuxInt = off 11123 v.Aux = sym 11124 v.AddArg(ptr) 11125 v.AddArg(idx) 11126 v.AddArg(mem) 11127 return true 11128 } 11129 return false 11130 } 11131 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 11132 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11133 // cond: is20Bit(c+d) 11134 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11135 for { 11136 c := v.AuxInt 11137 sym := v.Aux 11138 _ = v.Args[2] 11139 v_0 := v.Args[0] 11140 if v_0.Op != OpS390XADDconst { 11141 break 11142 } 11143 d := v_0.AuxInt 11144 ptr := v_0.Args[0] 11145 idx := v.Args[1] 11146 mem := v.Args[2] 11147 if !(is20Bit(c + d)) { 11148 break 11149 } 11150 v.reset(OpS390XMOVBZloadidx) 11151 v.AuxInt = c + d 11152 v.Aux = sym 11153 v.AddArg(ptr) 11154 v.AddArg(idx) 11155 v.AddArg(mem) 11156 return true 11157 } 11158 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 11159 // cond: is20Bit(c+d) 11160 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11161 for { 11162 c := v.AuxInt 11163 sym := v.Aux 11164 _ = v.Args[2] 11165 idx := v.Args[0] 11166 v_1 := v.Args[1] 11167 if v_1.Op != OpS390XADDconst { 11168 break 11169 } 11170 d := v_1.AuxInt 11171 ptr := v_1.Args[0] 11172 mem := v.Args[2] 11173 if !(is20Bit(c + d)) { 11174 break 11175 } 11176 v.reset(OpS390XMOVBZloadidx) 11177 v.AuxInt = c + d 11178 v.Aux = sym 11179 v.AddArg(ptr) 11180 v.AddArg(idx) 11181 v.AddArg(mem) 11182 return true 11183 } 11184 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11185 // cond: is20Bit(c+d) 11186 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11187 for { 11188 c := v.AuxInt 11189 sym := v.Aux 11190 _ = v.Args[2] 11191 ptr := v.Args[0] 11192 v_1 := v.Args[1] 11193 if v_1.Op != OpS390XADDconst { 11194 break 11195 } 11196 d := v_1.AuxInt 11197 idx := v_1.Args[0] 11198 mem := v.Args[2] 11199 if !(is20Bit(c + d)) { 11200 break 11201 } 11202 v.reset(OpS390XMOVBZloadidx) 11203 v.AuxInt = c + d 11204 v.Aux = sym 11205 v.AddArg(ptr) 11206 v.AddArg(idx) 11207 v.AddArg(mem) 11208 return true 11209 } 11210 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 11211 // cond: is20Bit(c+d) 11212 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11213 for { 11214 c := v.AuxInt 11215 sym := v.Aux 11216 _ = v.Args[2] 11217 v_0 := v.Args[0] 11218 if v_0.Op != OpS390XADDconst { 11219 break 11220 } 11221 d := v_0.AuxInt 11222 idx := v_0.Args[0] 11223 ptr := v.Args[1] 11224 mem := v.Args[2] 11225 if !(is20Bit(c + d)) { 11226 break 11227 } 11228 v.reset(OpS390XMOVBZloadidx) 11229 v.AuxInt = c + d 11230 v.Aux = sym 11231 v.AddArg(ptr) 11232 v.AddArg(idx) 11233 v.AddArg(mem) 11234 return true 11235 } 11236 return false 11237 } 11238 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 11239 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 11240 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11241 // result: (MOVDreg x) 11242 for { 11243 x := v.Args[0] 11244 if x.Op != OpS390XMOVDLT { 11245 break 11246 } 11247 _ = x.Args[2] 11248 x_0 := x.Args[0] 11249 if x_0.Op != OpS390XMOVDconst { 11250 break 11251 } 11252 c := x_0.AuxInt 11253 x_1 := x.Args[1] 11254 if x_1.Op != OpS390XMOVDconst { 11255 break 11256 } 11257 d := x_1.AuxInt 11258 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11259 break 11260 } 11261 v.reset(OpS390XMOVDreg) 11262 v.AddArg(x) 11263 return true 11264 } 11265 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 11266 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11267 // result: (MOVDreg x) 11268 for { 11269 x := v.Args[0] 11270 if x.Op != OpS390XMOVDLE { 11271 break 11272 } 11273 _ = x.Args[2] 11274 x_0 := x.Args[0] 11275 if x_0.Op != OpS390XMOVDconst { 11276 break 11277 } 11278 c := x_0.AuxInt 11279 x_1 := x.Args[1] 11280 if x_1.Op != OpS390XMOVDconst { 11281 break 11282 } 11283 d := x_1.AuxInt 11284 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11285 break 11286 } 11287 v.reset(OpS390XMOVDreg) 11288 v.AddArg(x) 11289 return true 11290 } 11291 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 11292 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11293 // result: (MOVDreg x) 11294 for { 11295 x := v.Args[0] 11296 if x.Op != OpS390XMOVDGT { 11297 break 11298 } 11299 _ = x.Args[2] 11300 x_0 := x.Args[0] 11301 if x_0.Op != OpS390XMOVDconst { 11302 break 11303 } 11304 c := x_0.AuxInt 11305 x_1 := x.Args[1] 11306 if x_1.Op != OpS390XMOVDconst { 11307 break 11308 } 11309 d := x_1.AuxInt 11310 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11311 break 11312 } 11313 v.reset(OpS390XMOVDreg) 11314 v.AddArg(x) 11315 return true 11316 } 11317 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 11318 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11319 // result: (MOVDreg x) 11320 for { 11321 x := v.Args[0] 11322 if x.Op != OpS390XMOVDGE { 11323 break 11324 } 11325 _ = x.Args[2] 11326 x_0 := x.Args[0] 11327 if x_0.Op != OpS390XMOVDconst { 11328 break 11329 } 11330 c := x_0.AuxInt 11331 x_1 := x.Args[1] 11332 if x_1.Op != OpS390XMOVDconst { 11333 break 11334 } 11335 d := x_1.AuxInt 11336 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11337 break 11338 } 11339 v.reset(OpS390XMOVDreg) 11340 v.AddArg(x) 11341 return true 11342 } 11343 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 11344 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11345 // result: (MOVDreg x) 11346 for { 11347 x := v.Args[0] 11348 if x.Op != OpS390XMOVDEQ { 11349 break 11350 } 11351 _ = x.Args[2] 11352 x_0 := x.Args[0] 11353 if x_0.Op != OpS390XMOVDconst { 11354 break 11355 } 11356 c := x_0.AuxInt 11357 x_1 := x.Args[1] 11358 if x_1.Op != OpS390XMOVDconst { 11359 break 11360 } 11361 d := x_1.AuxInt 11362 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11363 break 11364 } 11365 v.reset(OpS390XMOVDreg) 11366 v.AddArg(x) 11367 return true 11368 } 11369 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 11370 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11371 // result: (MOVDreg x) 11372 for { 11373 x := v.Args[0] 11374 if x.Op != OpS390XMOVDNE { 11375 break 11376 } 11377 _ = x.Args[2] 11378 x_0 := x.Args[0] 11379 if x_0.Op != OpS390XMOVDconst { 11380 break 11381 } 11382 c := x_0.AuxInt 11383 x_1 := x.Args[1] 11384 if x_1.Op != OpS390XMOVDconst { 11385 break 11386 } 11387 d := x_1.AuxInt 11388 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11389 break 11390 } 11391 v.reset(OpS390XMOVDreg) 11392 v.AddArg(x) 11393 return true 11394 } 11395 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 11396 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11397 // result: (MOVDreg x) 11398 for { 11399 x := v.Args[0] 11400 if x.Op != OpS390XMOVDGTnoinv { 11401 break 11402 } 11403 _ = x.Args[2] 11404 x_0 := x.Args[0] 11405 if x_0.Op != OpS390XMOVDconst { 11406 break 11407 } 11408 c := x_0.AuxInt 11409 x_1 := x.Args[1] 11410 if x_1.Op != OpS390XMOVDconst { 11411 break 11412 } 11413 d := x_1.AuxInt 11414 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11415 break 11416 } 11417 v.reset(OpS390XMOVDreg) 11418 v.AddArg(x) 11419 return true 11420 } 11421 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 11422 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11423 // result: (MOVDreg x) 11424 for { 11425 x := v.Args[0] 11426 if x.Op != OpS390XMOVDGEnoinv { 11427 break 11428 } 11429 _ = x.Args[2] 11430 x_0 := x.Args[0] 11431 if x_0.Op != OpS390XMOVDconst { 11432 break 11433 } 11434 c := x_0.AuxInt 11435 x_1 := x.Args[1] 11436 if x_1.Op != OpS390XMOVDconst { 11437 break 11438 } 11439 d := x_1.AuxInt 11440 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11441 break 11442 } 11443 v.reset(OpS390XMOVDreg) 11444 v.AddArg(x) 11445 return true 11446 } 11447 // match: (MOVBZreg x:(MOVBZload _ _)) 11448 // cond: 11449 // result: (MOVDreg x) 11450 for { 11451 x := v.Args[0] 11452 if x.Op != OpS390XMOVBZload { 11453 break 11454 } 11455 _ = x.Args[1] 11456 v.reset(OpS390XMOVDreg) 11457 v.AddArg(x) 11458 return true 11459 } 11460 // match: (MOVBZreg x:(Arg <t>)) 11461 // cond: is8BitInt(t) && !isSigned(t) 11462 // result: (MOVDreg x) 11463 for { 11464 x := v.Args[0] 11465 if x.Op != OpArg { 11466 break 11467 } 11468 t := x.Type 11469 if !(is8BitInt(t) && !isSigned(t)) { 11470 break 11471 } 11472 v.reset(OpS390XMOVDreg) 11473 v.AddArg(x) 11474 return true 11475 } 11476 return false 11477 } 11478 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 11479 b := v.Block 11480 _ = b 11481 typ := &b.Func.Config.Types 11482 _ = typ 11483 // match: (MOVBZreg x:(MOVBZreg _)) 11484 // cond: 11485 // result: (MOVDreg x) 11486 for { 11487 x := v.Args[0] 11488 if x.Op != OpS390XMOVBZreg { 11489 break 11490 } 11491 v.reset(OpS390XMOVDreg) 11492 v.AddArg(x) 11493 return true 11494 } 11495 // match: (MOVBZreg (MOVBreg x)) 11496 // cond: 11497 // result: (MOVBZreg x) 11498 for { 11499 v_0 := v.Args[0] 11500 if v_0.Op != OpS390XMOVBreg { 11501 break 11502 } 11503 x := v_0.Args[0] 11504 v.reset(OpS390XMOVBZreg) 11505 v.AddArg(x) 11506 return true 11507 } 11508 // match: (MOVBZreg (MOVDconst [c])) 11509 // cond: 11510 // result: (MOVDconst [int64(uint8(c))]) 11511 for { 11512 v_0 := v.Args[0] 11513 if v_0.Op != OpS390XMOVDconst { 11514 break 11515 } 11516 c := v_0.AuxInt 11517 v.reset(OpS390XMOVDconst) 11518 v.AuxInt = int64(uint8(c)) 11519 return true 11520 } 11521 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 11522 // cond: x.Uses == 1 && clobber(x) 11523 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 11524 for { 11525 x := v.Args[0] 11526 if x.Op != OpS390XMOVBZload { 11527 break 11528 } 11529 off := x.AuxInt 11530 sym := x.Aux 11531 _ = x.Args[1] 11532 ptr := x.Args[0] 11533 mem := x.Args[1] 11534 if !(x.Uses == 1 && clobber(x)) { 11535 break 11536 } 11537 b = x.Block 11538 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 11539 v.reset(OpCopy) 11540 v.AddArg(v0) 11541 v0.AuxInt = off 11542 v0.Aux = sym 11543 v0.AddArg(ptr) 11544 v0.AddArg(mem) 11545 return true 11546 } 11547 // match: (MOVBZreg x:(MOVBload [off] {sym} ptr mem)) 11548 // cond: x.Uses == 1 && clobber(x) 11549 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 11550 for { 11551 x := v.Args[0] 11552 if x.Op != OpS390XMOVBload { 11553 break 11554 } 11555 off := x.AuxInt 11556 sym := x.Aux 11557 _ = x.Args[1] 11558 ptr := x.Args[0] 11559 mem := x.Args[1] 11560 if !(x.Uses == 1 && clobber(x)) { 11561 break 11562 } 11563 b = x.Block 11564 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 11565 v.reset(OpCopy) 11566 v.AddArg(v0) 11567 v0.AuxInt = off 11568 v0.Aux = sym 11569 v0.AddArg(ptr) 11570 v0.AddArg(mem) 11571 return true 11572 } 11573 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 11574 // cond: x.Uses == 1 && clobber(x) 11575 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 11576 for { 11577 x := v.Args[0] 11578 if x.Op != OpS390XMOVBZloadidx { 11579 break 11580 } 11581 off := x.AuxInt 11582 sym := x.Aux 11583 _ = x.Args[2] 11584 ptr := x.Args[0] 11585 idx := x.Args[1] 11586 mem := x.Args[2] 11587 if !(x.Uses == 1 && clobber(x)) { 11588 break 11589 } 11590 b = x.Block 11591 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 11592 v.reset(OpCopy) 11593 v.AddArg(v0) 11594 v0.AuxInt = off 11595 v0.Aux = sym 11596 v0.AddArg(ptr) 11597 v0.AddArg(idx) 11598 v0.AddArg(mem) 11599 return true 11600 } 11601 // match: (MOVBZreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 11602 // cond: x.Uses == 1 && clobber(x) 11603 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 11604 for { 11605 x := v.Args[0] 11606 if x.Op != OpS390XMOVBloadidx { 11607 break 11608 } 11609 off := x.AuxInt 11610 sym := x.Aux 11611 _ = x.Args[2] 11612 ptr := x.Args[0] 11613 idx := x.Args[1] 11614 mem := x.Args[2] 11615 if !(x.Uses == 1 && clobber(x)) { 11616 break 11617 } 11618 b = x.Block 11619 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 11620 v.reset(OpCopy) 11621 v.AddArg(v0) 11622 v0.AuxInt = off 11623 v0.Aux = sym 11624 v0.AddArg(ptr) 11625 v0.AddArg(idx) 11626 v0.AddArg(mem) 11627 return true 11628 } 11629 // match: (MOVBZreg (ANDWconst [m] x)) 11630 // cond: 11631 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x)) 11632 for { 11633 v_0 := v.Args[0] 11634 if v_0.Op != OpS390XANDWconst { 11635 break 11636 } 11637 m := v_0.AuxInt 11638 x := v_0.Args[0] 11639 v.reset(OpS390XMOVWZreg) 11640 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 11641 v0.AuxInt = int64(uint8(m)) 11642 v0.AddArg(x) 11643 v.AddArg(v0) 11644 return true 11645 } 11646 return false 11647 } 11648 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 11649 // match: (MOVBload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 11650 // cond: isSamePtr(ptr1, ptr2) 11651 // result: (MOVBreg x) 11652 for { 11653 off := v.AuxInt 11654 sym := v.Aux 11655 _ = v.Args[1] 11656 ptr1 := v.Args[0] 11657 v_1 := v.Args[1] 11658 if v_1.Op != OpS390XMOVBstore { 11659 break 11660 } 11661 if v_1.AuxInt != off { 11662 break 11663 } 11664 if v_1.Aux != sym { 11665 break 11666 } 11667 _ = v_1.Args[2] 11668 ptr2 := v_1.Args[0] 11669 x := v_1.Args[1] 11670 if !(isSamePtr(ptr1, ptr2)) { 11671 break 11672 } 11673 v.reset(OpS390XMOVBreg) 11674 v.AddArg(x) 11675 return true 11676 } 11677 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 11678 // cond: is20Bit(off1+off2) 11679 // result: (MOVBload [off1+off2] {sym} ptr mem) 11680 for { 11681 off1 := v.AuxInt 11682 sym := v.Aux 11683 _ = v.Args[1] 11684 v_0 := v.Args[0] 11685 if v_0.Op != OpS390XADDconst { 11686 break 11687 } 11688 off2 := v_0.AuxInt 11689 ptr := v_0.Args[0] 11690 mem := v.Args[1] 11691 if !(is20Bit(off1 + off2)) { 11692 break 11693 } 11694 v.reset(OpS390XMOVBload) 11695 v.AuxInt = off1 + off2 11696 v.Aux = sym 11697 v.AddArg(ptr) 11698 v.AddArg(mem) 11699 return true 11700 } 11701 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11702 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11703 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11704 for { 11705 off1 := v.AuxInt 11706 sym1 := v.Aux 11707 _ = v.Args[1] 11708 v_0 := v.Args[0] 11709 if v_0.Op != OpS390XMOVDaddr { 11710 break 11711 } 11712 off2 := v_0.AuxInt 11713 sym2 := v_0.Aux 11714 base := v_0.Args[0] 11715 mem := v.Args[1] 11716 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11717 break 11718 } 11719 v.reset(OpS390XMOVBload) 11720 v.AuxInt = off1 + off2 11721 v.Aux = mergeSym(sym1, sym2) 11722 v.AddArg(base) 11723 v.AddArg(mem) 11724 return true 11725 } 11726 // match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11727 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11728 // result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11729 for { 11730 off1 := v.AuxInt 11731 sym1 := v.Aux 11732 _ = v.Args[1] 11733 v_0 := v.Args[0] 11734 if v_0.Op != OpS390XMOVDaddridx { 11735 break 11736 } 11737 off2 := v_0.AuxInt 11738 sym2 := v_0.Aux 11739 _ = v_0.Args[1] 11740 ptr := v_0.Args[0] 11741 idx := v_0.Args[1] 11742 mem := v.Args[1] 11743 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11744 break 11745 } 11746 v.reset(OpS390XMOVBloadidx) 11747 v.AuxInt = off1 + off2 11748 v.Aux = mergeSym(sym1, sym2) 11749 v.AddArg(ptr) 11750 v.AddArg(idx) 11751 v.AddArg(mem) 11752 return true 11753 } 11754 // match: (MOVBload [off] {sym} (ADD ptr idx) mem) 11755 // cond: ptr.Op != OpSB 11756 // result: (MOVBloadidx [off] {sym} ptr idx mem) 11757 for { 11758 off := v.AuxInt 11759 sym := v.Aux 11760 _ = v.Args[1] 11761 v_0 := v.Args[0] 11762 if v_0.Op != OpS390XADD { 11763 break 11764 } 11765 _ = v_0.Args[1] 11766 ptr := v_0.Args[0] 11767 idx := v_0.Args[1] 11768 mem := v.Args[1] 11769 if !(ptr.Op != OpSB) { 11770 break 11771 } 11772 v.reset(OpS390XMOVBloadidx) 11773 v.AuxInt = off 11774 v.Aux = sym 11775 v.AddArg(ptr) 11776 v.AddArg(idx) 11777 v.AddArg(mem) 11778 return true 11779 } 11780 return false 11781 } 11782 func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { 11783 // match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11784 // cond: is20Bit(c+d) 11785 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11786 for { 11787 c := v.AuxInt 11788 sym := v.Aux 11789 _ = v.Args[2] 11790 v_0 := v.Args[0] 11791 if v_0.Op != OpS390XADDconst { 11792 break 11793 } 11794 d := v_0.AuxInt 11795 ptr := v_0.Args[0] 11796 idx := v.Args[1] 11797 mem := v.Args[2] 11798 if !(is20Bit(c + d)) { 11799 break 11800 } 11801 v.reset(OpS390XMOVBloadidx) 11802 v.AuxInt = c + d 11803 v.Aux = sym 11804 v.AddArg(ptr) 11805 v.AddArg(idx) 11806 v.AddArg(mem) 11807 return true 11808 } 11809 // match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 11810 // cond: is20Bit(c+d) 11811 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11812 for { 11813 c := v.AuxInt 11814 sym := v.Aux 11815 _ = v.Args[2] 11816 idx := v.Args[0] 11817 v_1 := v.Args[1] 11818 if v_1.Op != OpS390XADDconst { 11819 break 11820 } 11821 d := v_1.AuxInt 11822 ptr := v_1.Args[0] 11823 mem := v.Args[2] 11824 if !(is20Bit(c + d)) { 11825 break 11826 } 11827 v.reset(OpS390XMOVBloadidx) 11828 v.AuxInt = c + d 11829 v.Aux = sym 11830 v.AddArg(ptr) 11831 v.AddArg(idx) 11832 v.AddArg(mem) 11833 return true 11834 } 11835 // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11836 // cond: is20Bit(c+d) 11837 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11838 for { 11839 c := v.AuxInt 11840 sym := v.Aux 11841 _ = v.Args[2] 11842 ptr := v.Args[0] 11843 v_1 := v.Args[1] 11844 if v_1.Op != OpS390XADDconst { 11845 break 11846 } 11847 d := v_1.AuxInt 11848 idx := v_1.Args[0] 11849 mem := v.Args[2] 11850 if !(is20Bit(c + d)) { 11851 break 11852 } 11853 v.reset(OpS390XMOVBloadidx) 11854 v.AuxInt = c + d 11855 v.Aux = sym 11856 v.AddArg(ptr) 11857 v.AddArg(idx) 11858 v.AddArg(mem) 11859 return true 11860 } 11861 // match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 11862 // cond: is20Bit(c+d) 11863 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11864 for { 11865 c := v.AuxInt 11866 sym := v.Aux 11867 _ = v.Args[2] 11868 v_0 := v.Args[0] 11869 if v_0.Op != OpS390XADDconst { 11870 break 11871 } 11872 d := v_0.AuxInt 11873 idx := v_0.Args[0] 11874 ptr := v.Args[1] 11875 mem := v.Args[2] 11876 if !(is20Bit(c + d)) { 11877 break 11878 } 11879 v.reset(OpS390XMOVBloadidx) 11880 v.AuxInt = c + d 11881 v.Aux = sym 11882 v.AddArg(ptr) 11883 v.AddArg(idx) 11884 v.AddArg(mem) 11885 return true 11886 } 11887 return false 11888 } 11889 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 11890 b := v.Block 11891 _ = b 11892 typ := &b.Func.Config.Types 11893 _ = typ 11894 // match: (MOVBreg x:(MOVBload _ _)) 11895 // cond: 11896 // result: (MOVDreg x) 11897 for { 11898 x := v.Args[0] 11899 if x.Op != OpS390XMOVBload { 11900 break 11901 } 11902 _ = x.Args[1] 11903 v.reset(OpS390XMOVDreg) 11904 v.AddArg(x) 11905 return true 11906 } 11907 // match: (MOVBreg x:(Arg <t>)) 11908 // cond: is8BitInt(t) && isSigned(t) 11909 // result: (MOVDreg x) 11910 for { 11911 x := v.Args[0] 11912 if x.Op != OpArg { 11913 break 11914 } 11915 t := x.Type 11916 if !(is8BitInt(t) && isSigned(t)) { 11917 break 11918 } 11919 v.reset(OpS390XMOVDreg) 11920 v.AddArg(x) 11921 return true 11922 } 11923 // match: (MOVBreg x:(MOVBreg _)) 11924 // cond: 11925 // result: (MOVDreg x) 11926 for { 11927 x := v.Args[0] 11928 if x.Op != OpS390XMOVBreg { 11929 break 11930 } 11931 v.reset(OpS390XMOVDreg) 11932 v.AddArg(x) 11933 return true 11934 } 11935 // match: (MOVBreg (MOVBZreg x)) 11936 // cond: 11937 // result: (MOVBreg x) 11938 for { 11939 v_0 := v.Args[0] 11940 if v_0.Op != OpS390XMOVBZreg { 11941 break 11942 } 11943 x := v_0.Args[0] 11944 v.reset(OpS390XMOVBreg) 11945 v.AddArg(x) 11946 return true 11947 } 11948 // match: (MOVBreg (MOVDconst [c])) 11949 // cond: 11950 // result: (MOVDconst [int64(int8(c))]) 11951 for { 11952 v_0 := v.Args[0] 11953 if v_0.Op != OpS390XMOVDconst { 11954 break 11955 } 11956 c := v_0.AuxInt 11957 v.reset(OpS390XMOVDconst) 11958 v.AuxInt = int64(int8(c)) 11959 return true 11960 } 11961 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 11962 // cond: x.Uses == 1 && clobber(x) 11963 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 11964 for { 11965 x := v.Args[0] 11966 if x.Op != OpS390XMOVBZload { 11967 break 11968 } 11969 off := x.AuxInt 11970 sym := x.Aux 11971 _ = x.Args[1] 11972 ptr := x.Args[0] 11973 mem := x.Args[1] 11974 if !(x.Uses == 1 && clobber(x)) { 11975 break 11976 } 11977 b = x.Block 11978 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 11979 v.reset(OpCopy) 11980 v.AddArg(v0) 11981 v0.AuxInt = off 11982 v0.Aux = sym 11983 v0.AddArg(ptr) 11984 v0.AddArg(mem) 11985 return true 11986 } 11987 // match: (MOVBreg x:(MOVBload [off] {sym} ptr mem)) 11988 // cond: x.Uses == 1 && clobber(x) 11989 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 11990 for { 11991 x := v.Args[0] 11992 if x.Op != OpS390XMOVBload { 11993 break 11994 } 11995 off := x.AuxInt 11996 sym := x.Aux 11997 _ = x.Args[1] 11998 ptr := x.Args[0] 11999 mem := x.Args[1] 12000 if !(x.Uses == 1 && clobber(x)) { 12001 break 12002 } 12003 b = x.Block 12004 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 12005 v.reset(OpCopy) 12006 v.AddArg(v0) 12007 v0.AuxInt = off 12008 v0.Aux = sym 12009 v0.AddArg(ptr) 12010 v0.AddArg(mem) 12011 return true 12012 } 12013 // match: (MOVBreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12014 // cond: x.Uses == 1 && clobber(x) 12015 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 12016 for { 12017 x := v.Args[0] 12018 if x.Op != OpS390XMOVBZloadidx { 12019 break 12020 } 12021 off := x.AuxInt 12022 sym := x.Aux 12023 _ = x.Args[2] 12024 ptr := x.Args[0] 12025 idx := x.Args[1] 12026 mem := x.Args[2] 12027 if !(x.Uses == 1 && clobber(x)) { 12028 break 12029 } 12030 b = x.Block 12031 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 12032 v.reset(OpCopy) 12033 v.AddArg(v0) 12034 v0.AuxInt = off 12035 v0.Aux = sym 12036 v0.AddArg(ptr) 12037 v0.AddArg(idx) 12038 v0.AddArg(mem) 12039 return true 12040 } 12041 // match: (MOVBreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 12042 // cond: x.Uses == 1 && clobber(x) 12043 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 12044 for { 12045 x := v.Args[0] 12046 if x.Op != OpS390XMOVBloadidx { 12047 break 12048 } 12049 off := x.AuxInt 12050 sym := x.Aux 12051 _ = x.Args[2] 12052 ptr := x.Args[0] 12053 idx := x.Args[1] 12054 mem := x.Args[2] 12055 if !(x.Uses == 1 && clobber(x)) { 12056 break 12057 } 12058 b = x.Block 12059 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 12060 v.reset(OpCopy) 12061 v.AddArg(v0) 12062 v0.AuxInt = off 12063 v0.Aux = sym 12064 v0.AddArg(ptr) 12065 v0.AddArg(idx) 12066 v0.AddArg(mem) 12067 return true 12068 } 12069 // match: (MOVBreg (ANDWconst [m] x)) 12070 // cond: int8(m) >= 0 12071 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x)) 12072 for { 12073 v_0 := v.Args[0] 12074 if v_0.Op != OpS390XANDWconst { 12075 break 12076 } 12077 m := v_0.AuxInt 12078 x := v_0.Args[0] 12079 if !(int8(m) >= 0) { 12080 break 12081 } 12082 v.reset(OpS390XMOVWZreg) 12083 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 12084 v0.AuxInt = int64(uint8(m)) 12085 v0.AddArg(x) 12086 v.AddArg(v0) 12087 return true 12088 } 12089 return false 12090 } 12091 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 12092 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 12093 // cond: 12094 // result: (MOVBstore [off] {sym} ptr x mem) 12095 for { 12096 off := v.AuxInt 12097 sym := v.Aux 12098 _ = v.Args[2] 12099 ptr := v.Args[0] 12100 v_1 := v.Args[1] 12101 if v_1.Op != OpS390XMOVBreg { 12102 break 12103 } 12104 x := v_1.Args[0] 12105 mem := v.Args[2] 12106 v.reset(OpS390XMOVBstore) 12107 v.AuxInt = off 12108 v.Aux = sym 12109 v.AddArg(ptr) 12110 v.AddArg(x) 12111 v.AddArg(mem) 12112 return true 12113 } 12114 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 12115 // cond: 12116 // result: (MOVBstore [off] {sym} ptr x mem) 12117 for { 12118 off := v.AuxInt 12119 sym := v.Aux 12120 _ = v.Args[2] 12121 ptr := v.Args[0] 12122 v_1 := v.Args[1] 12123 if v_1.Op != OpS390XMOVBZreg { 12124 break 12125 } 12126 x := v_1.Args[0] 12127 mem := v.Args[2] 12128 v.reset(OpS390XMOVBstore) 12129 v.AuxInt = off 12130 v.Aux = sym 12131 v.AddArg(ptr) 12132 v.AddArg(x) 12133 v.AddArg(mem) 12134 return true 12135 } 12136 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 12137 // cond: is20Bit(off1+off2) 12138 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 12139 for { 12140 off1 := v.AuxInt 12141 sym := v.Aux 12142 _ = v.Args[2] 12143 v_0 := v.Args[0] 12144 if v_0.Op != OpS390XADDconst { 12145 break 12146 } 12147 off2 := v_0.AuxInt 12148 ptr := v_0.Args[0] 12149 val := v.Args[1] 12150 mem := v.Args[2] 12151 if !(is20Bit(off1 + off2)) { 12152 break 12153 } 12154 v.reset(OpS390XMOVBstore) 12155 v.AuxInt = off1 + off2 12156 v.Aux = sym 12157 v.AddArg(ptr) 12158 v.AddArg(val) 12159 v.AddArg(mem) 12160 return true 12161 } 12162 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 12163 // cond: is20Bit(off) && ptr.Op != OpSB 12164 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 12165 for { 12166 off := v.AuxInt 12167 sym := v.Aux 12168 _ = v.Args[2] 12169 ptr := v.Args[0] 12170 v_1 := v.Args[1] 12171 if v_1.Op != OpS390XMOVDconst { 12172 break 12173 } 12174 c := v_1.AuxInt 12175 mem := v.Args[2] 12176 if !(is20Bit(off) && ptr.Op != OpSB) { 12177 break 12178 } 12179 v.reset(OpS390XMOVBstoreconst) 12180 v.AuxInt = makeValAndOff(int64(int8(c)), off) 12181 v.Aux = sym 12182 v.AddArg(ptr) 12183 v.AddArg(mem) 12184 return true 12185 } 12186 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 12187 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12188 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 12189 for { 12190 off1 := v.AuxInt 12191 sym1 := v.Aux 12192 _ = v.Args[2] 12193 v_0 := v.Args[0] 12194 if v_0.Op != OpS390XMOVDaddr { 12195 break 12196 } 12197 off2 := v_0.AuxInt 12198 sym2 := v_0.Aux 12199 base := v_0.Args[0] 12200 val := v.Args[1] 12201 mem := v.Args[2] 12202 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12203 break 12204 } 12205 v.reset(OpS390XMOVBstore) 12206 v.AuxInt = off1 + off2 12207 v.Aux = mergeSym(sym1, sym2) 12208 v.AddArg(base) 12209 v.AddArg(val) 12210 v.AddArg(mem) 12211 return true 12212 } 12213 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 12214 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12215 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 12216 for { 12217 off1 := v.AuxInt 12218 sym1 := v.Aux 12219 _ = v.Args[2] 12220 v_0 := v.Args[0] 12221 if v_0.Op != OpS390XMOVDaddridx { 12222 break 12223 } 12224 off2 := v_0.AuxInt 12225 sym2 := v_0.Aux 12226 _ = v_0.Args[1] 12227 ptr := v_0.Args[0] 12228 idx := v_0.Args[1] 12229 val := v.Args[1] 12230 mem := v.Args[2] 12231 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12232 break 12233 } 12234 v.reset(OpS390XMOVBstoreidx) 12235 v.AuxInt = off1 + off2 12236 v.Aux = mergeSym(sym1, sym2) 12237 v.AddArg(ptr) 12238 v.AddArg(idx) 12239 v.AddArg(val) 12240 v.AddArg(mem) 12241 return true 12242 } 12243 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 12244 // cond: ptr.Op != OpSB 12245 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 12246 for { 12247 off := v.AuxInt 12248 sym := v.Aux 12249 _ = v.Args[2] 12250 v_0 := v.Args[0] 12251 if v_0.Op != OpS390XADD { 12252 break 12253 } 12254 _ = v_0.Args[1] 12255 ptr := v_0.Args[0] 12256 idx := v_0.Args[1] 12257 val := v.Args[1] 12258 mem := v.Args[2] 12259 if !(ptr.Op != OpSB) { 12260 break 12261 } 12262 v.reset(OpS390XMOVBstoreidx) 12263 v.AuxInt = off 12264 v.Aux = sym 12265 v.AddArg(ptr) 12266 v.AddArg(idx) 12267 v.AddArg(val) 12268 v.AddArg(mem) 12269 return true 12270 } 12271 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 12272 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12273 // result: (MOVHstore [i-1] {s} p w mem) 12274 for { 12275 i := v.AuxInt 12276 s := v.Aux 12277 _ = v.Args[2] 12278 p := v.Args[0] 12279 w := v.Args[1] 12280 x := v.Args[2] 12281 if x.Op != OpS390XMOVBstore { 12282 break 12283 } 12284 if x.AuxInt != i-1 { 12285 break 12286 } 12287 if x.Aux != s { 12288 break 12289 } 12290 _ = x.Args[2] 12291 if p != x.Args[0] { 12292 break 12293 } 12294 x_1 := x.Args[1] 12295 if x_1.Op != OpS390XSRDconst { 12296 break 12297 } 12298 if x_1.AuxInt != 8 { 12299 break 12300 } 12301 if w != x_1.Args[0] { 12302 break 12303 } 12304 mem := x.Args[2] 12305 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12306 break 12307 } 12308 v.reset(OpS390XMOVHstore) 12309 v.AuxInt = i - 1 12310 v.Aux = s 12311 v.AddArg(p) 12312 v.AddArg(w) 12313 v.AddArg(mem) 12314 return true 12315 } 12316 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 12317 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12318 // result: (MOVHstore [i-1] {s} p w0 mem) 12319 for { 12320 i := v.AuxInt 12321 s := v.Aux 12322 _ = v.Args[2] 12323 p := v.Args[0] 12324 w0 := v.Args[1] 12325 if w0.Op != OpS390XSRDconst { 12326 break 12327 } 12328 j := w0.AuxInt 12329 w := w0.Args[0] 12330 x := v.Args[2] 12331 if x.Op != OpS390XMOVBstore { 12332 break 12333 } 12334 if x.AuxInt != i-1 { 12335 break 12336 } 12337 if x.Aux != s { 12338 break 12339 } 12340 _ = x.Args[2] 12341 if p != x.Args[0] { 12342 break 12343 } 12344 x_1 := x.Args[1] 12345 if x_1.Op != OpS390XSRDconst { 12346 break 12347 } 12348 if x_1.AuxInt != j+8 { 12349 break 12350 } 12351 if w != x_1.Args[0] { 12352 break 12353 } 12354 mem := x.Args[2] 12355 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12356 break 12357 } 12358 v.reset(OpS390XMOVHstore) 12359 v.AuxInt = i - 1 12360 v.Aux = s 12361 v.AddArg(p) 12362 v.AddArg(w0) 12363 v.AddArg(mem) 12364 return true 12365 } 12366 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 12367 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12368 // result: (MOVHstore [i-1] {s} p w mem) 12369 for { 12370 i := v.AuxInt 12371 s := v.Aux 12372 _ = v.Args[2] 12373 p := v.Args[0] 12374 w := v.Args[1] 12375 x := v.Args[2] 12376 if x.Op != OpS390XMOVBstore { 12377 break 12378 } 12379 if x.AuxInt != i-1 { 12380 break 12381 } 12382 if x.Aux != s { 12383 break 12384 } 12385 _ = x.Args[2] 12386 if p != x.Args[0] { 12387 break 12388 } 12389 x_1 := x.Args[1] 12390 if x_1.Op != OpS390XSRWconst { 12391 break 12392 } 12393 if x_1.AuxInt != 8 { 12394 break 12395 } 12396 if w != x_1.Args[0] { 12397 break 12398 } 12399 mem := x.Args[2] 12400 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12401 break 12402 } 12403 v.reset(OpS390XMOVHstore) 12404 v.AuxInt = i - 1 12405 v.Aux = s 12406 v.AddArg(p) 12407 v.AddArg(w) 12408 v.AddArg(mem) 12409 return true 12410 } 12411 return false 12412 } 12413 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 12414 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 12415 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12416 // result: (MOVHstore [i-1] {s} p w0 mem) 12417 for { 12418 i := v.AuxInt 12419 s := v.Aux 12420 _ = v.Args[2] 12421 p := v.Args[0] 12422 w0 := v.Args[1] 12423 if w0.Op != OpS390XSRWconst { 12424 break 12425 } 12426 j := w0.AuxInt 12427 w := w0.Args[0] 12428 x := v.Args[2] 12429 if x.Op != OpS390XMOVBstore { 12430 break 12431 } 12432 if x.AuxInt != i-1 { 12433 break 12434 } 12435 if x.Aux != s { 12436 break 12437 } 12438 _ = x.Args[2] 12439 if p != x.Args[0] { 12440 break 12441 } 12442 x_1 := x.Args[1] 12443 if x_1.Op != OpS390XSRWconst { 12444 break 12445 } 12446 if x_1.AuxInt != j+8 { 12447 break 12448 } 12449 if w != x_1.Args[0] { 12450 break 12451 } 12452 mem := x.Args[2] 12453 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12454 break 12455 } 12456 v.reset(OpS390XMOVHstore) 12457 v.AuxInt = i - 1 12458 v.Aux = s 12459 v.AddArg(p) 12460 v.AddArg(w0) 12461 v.AddArg(mem) 12462 return true 12463 } 12464 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 12465 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12466 // result: (MOVHBRstore [i-1] {s} p w mem) 12467 for { 12468 i := v.AuxInt 12469 s := v.Aux 12470 _ = v.Args[2] 12471 p := v.Args[0] 12472 v_1 := v.Args[1] 12473 if v_1.Op != OpS390XSRDconst { 12474 break 12475 } 12476 if v_1.AuxInt != 8 { 12477 break 12478 } 12479 w := v_1.Args[0] 12480 x := v.Args[2] 12481 if x.Op != OpS390XMOVBstore { 12482 break 12483 } 12484 if x.AuxInt != i-1 { 12485 break 12486 } 12487 if x.Aux != s { 12488 break 12489 } 12490 _ = x.Args[2] 12491 if p != x.Args[0] { 12492 break 12493 } 12494 if w != x.Args[1] { 12495 break 12496 } 12497 mem := x.Args[2] 12498 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12499 break 12500 } 12501 v.reset(OpS390XMOVHBRstore) 12502 v.AuxInt = i - 1 12503 v.Aux = s 12504 v.AddArg(p) 12505 v.AddArg(w) 12506 v.AddArg(mem) 12507 return true 12508 } 12509 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 12510 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12511 // result: (MOVHBRstore [i-1] {s} p w0 mem) 12512 for { 12513 i := v.AuxInt 12514 s := v.Aux 12515 _ = v.Args[2] 12516 p := v.Args[0] 12517 v_1 := v.Args[1] 12518 if v_1.Op != OpS390XSRDconst { 12519 break 12520 } 12521 j := v_1.AuxInt 12522 w := v_1.Args[0] 12523 x := v.Args[2] 12524 if x.Op != OpS390XMOVBstore { 12525 break 12526 } 12527 if x.AuxInt != i-1 { 12528 break 12529 } 12530 if x.Aux != s { 12531 break 12532 } 12533 _ = x.Args[2] 12534 if p != x.Args[0] { 12535 break 12536 } 12537 w0 := x.Args[1] 12538 if w0.Op != OpS390XSRDconst { 12539 break 12540 } 12541 if w0.AuxInt != j-8 { 12542 break 12543 } 12544 if w != w0.Args[0] { 12545 break 12546 } 12547 mem := x.Args[2] 12548 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12549 break 12550 } 12551 v.reset(OpS390XMOVHBRstore) 12552 v.AuxInt = i - 1 12553 v.Aux = s 12554 v.AddArg(p) 12555 v.AddArg(w0) 12556 v.AddArg(mem) 12557 return true 12558 } 12559 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 12560 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12561 // result: (MOVHBRstore [i-1] {s} p w mem) 12562 for { 12563 i := v.AuxInt 12564 s := v.Aux 12565 _ = v.Args[2] 12566 p := v.Args[0] 12567 v_1 := v.Args[1] 12568 if v_1.Op != OpS390XSRWconst { 12569 break 12570 } 12571 if v_1.AuxInt != 8 { 12572 break 12573 } 12574 w := v_1.Args[0] 12575 x := v.Args[2] 12576 if x.Op != OpS390XMOVBstore { 12577 break 12578 } 12579 if x.AuxInt != i-1 { 12580 break 12581 } 12582 if x.Aux != s { 12583 break 12584 } 12585 _ = x.Args[2] 12586 if p != x.Args[0] { 12587 break 12588 } 12589 if w != x.Args[1] { 12590 break 12591 } 12592 mem := x.Args[2] 12593 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12594 break 12595 } 12596 v.reset(OpS390XMOVHBRstore) 12597 v.AuxInt = i - 1 12598 v.Aux = s 12599 v.AddArg(p) 12600 v.AddArg(w) 12601 v.AddArg(mem) 12602 return true 12603 } 12604 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 12605 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12606 // result: (MOVHBRstore [i-1] {s} p w0 mem) 12607 for { 12608 i := v.AuxInt 12609 s := v.Aux 12610 _ = v.Args[2] 12611 p := v.Args[0] 12612 v_1 := v.Args[1] 12613 if v_1.Op != OpS390XSRWconst { 12614 break 12615 } 12616 j := v_1.AuxInt 12617 w := v_1.Args[0] 12618 x := v.Args[2] 12619 if x.Op != OpS390XMOVBstore { 12620 break 12621 } 12622 if x.AuxInt != i-1 { 12623 break 12624 } 12625 if x.Aux != s { 12626 break 12627 } 12628 _ = x.Args[2] 12629 if p != x.Args[0] { 12630 break 12631 } 12632 w0 := x.Args[1] 12633 if w0.Op != OpS390XSRWconst { 12634 break 12635 } 12636 if w0.AuxInt != j-8 { 12637 break 12638 } 12639 if w != w0.Args[0] { 12640 break 12641 } 12642 mem := x.Args[2] 12643 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12644 break 12645 } 12646 v.reset(OpS390XMOVHBRstore) 12647 v.AuxInt = i - 1 12648 v.Aux = s 12649 v.AddArg(p) 12650 v.AddArg(w0) 12651 v.AddArg(mem) 12652 return true 12653 } 12654 return false 12655 } 12656 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 12657 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 12658 // cond: is20Bit(ValAndOff(sc).Off()+off) 12659 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 12660 for { 12661 sc := v.AuxInt 12662 s := v.Aux 12663 _ = v.Args[1] 12664 v_0 := v.Args[0] 12665 if v_0.Op != OpS390XADDconst { 12666 break 12667 } 12668 off := v_0.AuxInt 12669 ptr := v_0.Args[0] 12670 mem := v.Args[1] 12671 if !(is20Bit(ValAndOff(sc).Off() + off)) { 12672 break 12673 } 12674 v.reset(OpS390XMOVBstoreconst) 12675 v.AuxInt = ValAndOff(sc).add(off) 12676 v.Aux = s 12677 v.AddArg(ptr) 12678 v.AddArg(mem) 12679 return true 12680 } 12681 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 12682 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 12683 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 12684 for { 12685 sc := v.AuxInt 12686 sym1 := v.Aux 12687 _ = v.Args[1] 12688 v_0 := v.Args[0] 12689 if v_0.Op != OpS390XMOVDaddr { 12690 break 12691 } 12692 off := v_0.AuxInt 12693 sym2 := v_0.Aux 12694 ptr := v_0.Args[0] 12695 mem := v.Args[1] 12696 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 12697 break 12698 } 12699 v.reset(OpS390XMOVBstoreconst) 12700 v.AuxInt = ValAndOff(sc).add(off) 12701 v.Aux = mergeSym(sym1, sym2) 12702 v.AddArg(ptr) 12703 v.AddArg(mem) 12704 return true 12705 } 12706 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 12707 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 12708 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 12709 for { 12710 c := v.AuxInt 12711 s := v.Aux 12712 _ = v.Args[1] 12713 p := v.Args[0] 12714 x := v.Args[1] 12715 if x.Op != OpS390XMOVBstoreconst { 12716 break 12717 } 12718 a := x.AuxInt 12719 if x.Aux != s { 12720 break 12721 } 12722 _ = x.Args[1] 12723 if p != x.Args[0] { 12724 break 12725 } 12726 mem := x.Args[1] 12727 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 12728 break 12729 } 12730 v.reset(OpS390XMOVHstoreconst) 12731 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 12732 v.Aux = s 12733 v.AddArg(p) 12734 v.AddArg(mem) 12735 return true 12736 } 12737 return false 12738 } 12739 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 12740 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 12741 // cond: is20Bit(c+d) 12742 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12743 for { 12744 c := v.AuxInt 12745 sym := v.Aux 12746 _ = v.Args[3] 12747 v_0 := v.Args[0] 12748 if v_0.Op != OpS390XADDconst { 12749 break 12750 } 12751 d := v_0.AuxInt 12752 ptr := v_0.Args[0] 12753 idx := v.Args[1] 12754 val := v.Args[2] 12755 mem := v.Args[3] 12756 if !(is20Bit(c + d)) { 12757 break 12758 } 12759 v.reset(OpS390XMOVBstoreidx) 12760 v.AuxInt = c + d 12761 v.Aux = sym 12762 v.AddArg(ptr) 12763 v.AddArg(idx) 12764 v.AddArg(val) 12765 v.AddArg(mem) 12766 return true 12767 } 12768 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 12769 // cond: is20Bit(c+d) 12770 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12771 for { 12772 c := v.AuxInt 12773 sym := v.Aux 12774 _ = v.Args[3] 12775 idx := v.Args[0] 12776 v_1 := v.Args[1] 12777 if v_1.Op != OpS390XADDconst { 12778 break 12779 } 12780 d := v_1.AuxInt 12781 ptr := v_1.Args[0] 12782 val := v.Args[2] 12783 mem := v.Args[3] 12784 if !(is20Bit(c + d)) { 12785 break 12786 } 12787 v.reset(OpS390XMOVBstoreidx) 12788 v.AuxInt = c + d 12789 v.Aux = sym 12790 v.AddArg(ptr) 12791 v.AddArg(idx) 12792 v.AddArg(val) 12793 v.AddArg(mem) 12794 return true 12795 } 12796 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 12797 // cond: is20Bit(c+d) 12798 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12799 for { 12800 c := v.AuxInt 12801 sym := v.Aux 12802 _ = v.Args[3] 12803 ptr := v.Args[0] 12804 v_1 := v.Args[1] 12805 if v_1.Op != OpS390XADDconst { 12806 break 12807 } 12808 d := v_1.AuxInt 12809 idx := v_1.Args[0] 12810 val := v.Args[2] 12811 mem := v.Args[3] 12812 if !(is20Bit(c + d)) { 12813 break 12814 } 12815 v.reset(OpS390XMOVBstoreidx) 12816 v.AuxInt = c + d 12817 v.Aux = sym 12818 v.AddArg(ptr) 12819 v.AddArg(idx) 12820 v.AddArg(val) 12821 v.AddArg(mem) 12822 return true 12823 } 12824 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 12825 // cond: is20Bit(c+d) 12826 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12827 for { 12828 c := v.AuxInt 12829 sym := v.Aux 12830 _ = v.Args[3] 12831 v_0 := v.Args[0] 12832 if v_0.Op != OpS390XADDconst { 12833 break 12834 } 12835 d := v_0.AuxInt 12836 idx := v_0.Args[0] 12837 ptr := v.Args[1] 12838 val := v.Args[2] 12839 mem := v.Args[3] 12840 if !(is20Bit(c + d)) { 12841 break 12842 } 12843 v.reset(OpS390XMOVBstoreidx) 12844 v.AuxInt = c + d 12845 v.Aux = sym 12846 v.AddArg(ptr) 12847 v.AddArg(idx) 12848 v.AddArg(val) 12849 v.AddArg(mem) 12850 return true 12851 } 12852 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 12853 // cond: x.Uses == 1 && clobber(x) 12854 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12855 for { 12856 i := v.AuxInt 12857 s := v.Aux 12858 _ = v.Args[3] 12859 p := v.Args[0] 12860 idx := v.Args[1] 12861 w := v.Args[2] 12862 x := v.Args[3] 12863 if x.Op != OpS390XMOVBstoreidx { 12864 break 12865 } 12866 if x.AuxInt != i-1 { 12867 break 12868 } 12869 if x.Aux != s { 12870 break 12871 } 12872 _ = x.Args[3] 12873 if p != x.Args[0] { 12874 break 12875 } 12876 if idx != x.Args[1] { 12877 break 12878 } 12879 x_2 := x.Args[2] 12880 if x_2.Op != OpS390XSRDconst { 12881 break 12882 } 12883 if x_2.AuxInt != 8 { 12884 break 12885 } 12886 if w != x_2.Args[0] { 12887 break 12888 } 12889 mem := x.Args[3] 12890 if !(x.Uses == 1 && clobber(x)) { 12891 break 12892 } 12893 v.reset(OpS390XMOVHstoreidx) 12894 v.AuxInt = i - 1 12895 v.Aux = s 12896 v.AddArg(p) 12897 v.AddArg(idx) 12898 v.AddArg(w) 12899 v.AddArg(mem) 12900 return true 12901 } 12902 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 12903 // cond: x.Uses == 1 && clobber(x) 12904 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12905 for { 12906 i := v.AuxInt 12907 s := v.Aux 12908 _ = v.Args[3] 12909 p := v.Args[0] 12910 idx := v.Args[1] 12911 w := v.Args[2] 12912 x := v.Args[3] 12913 if x.Op != OpS390XMOVBstoreidx { 12914 break 12915 } 12916 if x.AuxInt != i-1 { 12917 break 12918 } 12919 if x.Aux != s { 12920 break 12921 } 12922 _ = x.Args[3] 12923 if idx != x.Args[0] { 12924 break 12925 } 12926 if p != x.Args[1] { 12927 break 12928 } 12929 x_2 := x.Args[2] 12930 if x_2.Op != OpS390XSRDconst { 12931 break 12932 } 12933 if x_2.AuxInt != 8 { 12934 break 12935 } 12936 if w != x_2.Args[0] { 12937 break 12938 } 12939 mem := x.Args[3] 12940 if !(x.Uses == 1 && clobber(x)) { 12941 break 12942 } 12943 v.reset(OpS390XMOVHstoreidx) 12944 v.AuxInt = i - 1 12945 v.Aux = s 12946 v.AddArg(p) 12947 v.AddArg(idx) 12948 v.AddArg(w) 12949 v.AddArg(mem) 12950 return true 12951 } 12952 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 12953 // cond: x.Uses == 1 && clobber(x) 12954 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12955 for { 12956 i := v.AuxInt 12957 s := v.Aux 12958 _ = v.Args[3] 12959 idx := v.Args[0] 12960 p := v.Args[1] 12961 w := v.Args[2] 12962 x := v.Args[3] 12963 if x.Op != OpS390XMOVBstoreidx { 12964 break 12965 } 12966 if x.AuxInt != i-1 { 12967 break 12968 } 12969 if x.Aux != s { 12970 break 12971 } 12972 _ = x.Args[3] 12973 if p != x.Args[0] { 12974 break 12975 } 12976 if idx != x.Args[1] { 12977 break 12978 } 12979 x_2 := x.Args[2] 12980 if x_2.Op != OpS390XSRDconst { 12981 break 12982 } 12983 if x_2.AuxInt != 8 { 12984 break 12985 } 12986 if w != x_2.Args[0] { 12987 break 12988 } 12989 mem := x.Args[3] 12990 if !(x.Uses == 1 && clobber(x)) { 12991 break 12992 } 12993 v.reset(OpS390XMOVHstoreidx) 12994 v.AuxInt = i - 1 12995 v.Aux = s 12996 v.AddArg(p) 12997 v.AddArg(idx) 12998 v.AddArg(w) 12999 v.AddArg(mem) 13000 return true 13001 } 13002 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 13003 // cond: x.Uses == 1 && clobber(x) 13004 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13005 for { 13006 i := v.AuxInt 13007 s := v.Aux 13008 _ = v.Args[3] 13009 idx := v.Args[0] 13010 p := v.Args[1] 13011 w := v.Args[2] 13012 x := v.Args[3] 13013 if x.Op != OpS390XMOVBstoreidx { 13014 break 13015 } 13016 if x.AuxInt != i-1 { 13017 break 13018 } 13019 if x.Aux != s { 13020 break 13021 } 13022 _ = x.Args[3] 13023 if idx != x.Args[0] { 13024 break 13025 } 13026 if p != x.Args[1] { 13027 break 13028 } 13029 x_2 := x.Args[2] 13030 if x_2.Op != OpS390XSRDconst { 13031 break 13032 } 13033 if x_2.AuxInt != 8 { 13034 break 13035 } 13036 if w != x_2.Args[0] { 13037 break 13038 } 13039 mem := x.Args[3] 13040 if !(x.Uses == 1 && clobber(x)) { 13041 break 13042 } 13043 v.reset(OpS390XMOVHstoreidx) 13044 v.AuxInt = i - 1 13045 v.Aux = s 13046 v.AddArg(p) 13047 v.AddArg(idx) 13048 v.AddArg(w) 13049 v.AddArg(mem) 13050 return true 13051 } 13052 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 13053 // cond: x.Uses == 1 && clobber(x) 13054 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13055 for { 13056 i := v.AuxInt 13057 s := v.Aux 13058 _ = v.Args[3] 13059 p := v.Args[0] 13060 idx := v.Args[1] 13061 w0 := v.Args[2] 13062 if w0.Op != OpS390XSRDconst { 13063 break 13064 } 13065 j := w0.AuxInt 13066 w := w0.Args[0] 13067 x := v.Args[3] 13068 if x.Op != OpS390XMOVBstoreidx { 13069 break 13070 } 13071 if x.AuxInt != i-1 { 13072 break 13073 } 13074 if x.Aux != s { 13075 break 13076 } 13077 _ = x.Args[3] 13078 if p != x.Args[0] { 13079 break 13080 } 13081 if idx != x.Args[1] { 13082 break 13083 } 13084 x_2 := x.Args[2] 13085 if x_2.Op != OpS390XSRDconst { 13086 break 13087 } 13088 if x_2.AuxInt != j+8 { 13089 break 13090 } 13091 if w != x_2.Args[0] { 13092 break 13093 } 13094 mem := x.Args[3] 13095 if !(x.Uses == 1 && clobber(x)) { 13096 break 13097 } 13098 v.reset(OpS390XMOVHstoreidx) 13099 v.AuxInt = i - 1 13100 v.Aux = s 13101 v.AddArg(p) 13102 v.AddArg(idx) 13103 v.AddArg(w0) 13104 v.AddArg(mem) 13105 return true 13106 } 13107 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 13108 // cond: x.Uses == 1 && clobber(x) 13109 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13110 for { 13111 i := v.AuxInt 13112 s := v.Aux 13113 _ = v.Args[3] 13114 p := v.Args[0] 13115 idx := v.Args[1] 13116 w0 := v.Args[2] 13117 if w0.Op != OpS390XSRDconst { 13118 break 13119 } 13120 j := w0.AuxInt 13121 w := w0.Args[0] 13122 x := v.Args[3] 13123 if x.Op != OpS390XMOVBstoreidx { 13124 break 13125 } 13126 if x.AuxInt != i-1 { 13127 break 13128 } 13129 if x.Aux != s { 13130 break 13131 } 13132 _ = x.Args[3] 13133 if idx != x.Args[0] { 13134 break 13135 } 13136 if p != x.Args[1] { 13137 break 13138 } 13139 x_2 := x.Args[2] 13140 if x_2.Op != OpS390XSRDconst { 13141 break 13142 } 13143 if x_2.AuxInt != j+8 { 13144 break 13145 } 13146 if w != x_2.Args[0] { 13147 break 13148 } 13149 mem := x.Args[3] 13150 if !(x.Uses == 1 && clobber(x)) { 13151 break 13152 } 13153 v.reset(OpS390XMOVHstoreidx) 13154 v.AuxInt = i - 1 13155 v.Aux = s 13156 v.AddArg(p) 13157 v.AddArg(idx) 13158 v.AddArg(w0) 13159 v.AddArg(mem) 13160 return true 13161 } 13162 return false 13163 } 13164 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 13165 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 13166 // cond: x.Uses == 1 && clobber(x) 13167 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13168 for { 13169 i := v.AuxInt 13170 s := v.Aux 13171 _ = v.Args[3] 13172 idx := v.Args[0] 13173 p := v.Args[1] 13174 w0 := v.Args[2] 13175 if w0.Op != OpS390XSRDconst { 13176 break 13177 } 13178 j := w0.AuxInt 13179 w := w0.Args[0] 13180 x := v.Args[3] 13181 if x.Op != OpS390XMOVBstoreidx { 13182 break 13183 } 13184 if x.AuxInt != i-1 { 13185 break 13186 } 13187 if x.Aux != s { 13188 break 13189 } 13190 _ = x.Args[3] 13191 if p != x.Args[0] { 13192 break 13193 } 13194 if idx != x.Args[1] { 13195 break 13196 } 13197 x_2 := x.Args[2] 13198 if x_2.Op != OpS390XSRDconst { 13199 break 13200 } 13201 if x_2.AuxInt != j+8 { 13202 break 13203 } 13204 if w != x_2.Args[0] { 13205 break 13206 } 13207 mem := x.Args[3] 13208 if !(x.Uses == 1 && clobber(x)) { 13209 break 13210 } 13211 v.reset(OpS390XMOVHstoreidx) 13212 v.AuxInt = i - 1 13213 v.Aux = s 13214 v.AddArg(p) 13215 v.AddArg(idx) 13216 v.AddArg(w0) 13217 v.AddArg(mem) 13218 return true 13219 } 13220 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 13221 // cond: x.Uses == 1 && clobber(x) 13222 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13223 for { 13224 i := v.AuxInt 13225 s := v.Aux 13226 _ = v.Args[3] 13227 idx := v.Args[0] 13228 p := v.Args[1] 13229 w0 := v.Args[2] 13230 if w0.Op != OpS390XSRDconst { 13231 break 13232 } 13233 j := w0.AuxInt 13234 w := w0.Args[0] 13235 x := v.Args[3] 13236 if x.Op != OpS390XMOVBstoreidx { 13237 break 13238 } 13239 if x.AuxInt != i-1 { 13240 break 13241 } 13242 if x.Aux != s { 13243 break 13244 } 13245 _ = x.Args[3] 13246 if idx != x.Args[0] { 13247 break 13248 } 13249 if p != x.Args[1] { 13250 break 13251 } 13252 x_2 := x.Args[2] 13253 if x_2.Op != OpS390XSRDconst { 13254 break 13255 } 13256 if x_2.AuxInt != j+8 { 13257 break 13258 } 13259 if w != x_2.Args[0] { 13260 break 13261 } 13262 mem := x.Args[3] 13263 if !(x.Uses == 1 && clobber(x)) { 13264 break 13265 } 13266 v.reset(OpS390XMOVHstoreidx) 13267 v.AuxInt = i - 1 13268 v.Aux = s 13269 v.AddArg(p) 13270 v.AddArg(idx) 13271 v.AddArg(w0) 13272 v.AddArg(mem) 13273 return true 13274 } 13275 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 13276 // cond: x.Uses == 1 && clobber(x) 13277 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13278 for { 13279 i := v.AuxInt 13280 s := v.Aux 13281 _ = v.Args[3] 13282 p := v.Args[0] 13283 idx := v.Args[1] 13284 w := v.Args[2] 13285 x := v.Args[3] 13286 if x.Op != OpS390XMOVBstoreidx { 13287 break 13288 } 13289 if x.AuxInt != i-1 { 13290 break 13291 } 13292 if x.Aux != s { 13293 break 13294 } 13295 _ = x.Args[3] 13296 if p != x.Args[0] { 13297 break 13298 } 13299 if idx != x.Args[1] { 13300 break 13301 } 13302 x_2 := x.Args[2] 13303 if x_2.Op != OpS390XSRWconst { 13304 break 13305 } 13306 if x_2.AuxInt != 8 { 13307 break 13308 } 13309 if w != x_2.Args[0] { 13310 break 13311 } 13312 mem := x.Args[3] 13313 if !(x.Uses == 1 && clobber(x)) { 13314 break 13315 } 13316 v.reset(OpS390XMOVHstoreidx) 13317 v.AuxInt = i - 1 13318 v.Aux = s 13319 v.AddArg(p) 13320 v.AddArg(idx) 13321 v.AddArg(w) 13322 v.AddArg(mem) 13323 return true 13324 } 13325 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 13326 // cond: x.Uses == 1 && clobber(x) 13327 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13328 for { 13329 i := v.AuxInt 13330 s := v.Aux 13331 _ = v.Args[3] 13332 p := v.Args[0] 13333 idx := v.Args[1] 13334 w := v.Args[2] 13335 x := v.Args[3] 13336 if x.Op != OpS390XMOVBstoreidx { 13337 break 13338 } 13339 if x.AuxInt != i-1 { 13340 break 13341 } 13342 if x.Aux != s { 13343 break 13344 } 13345 _ = x.Args[3] 13346 if idx != x.Args[0] { 13347 break 13348 } 13349 if p != x.Args[1] { 13350 break 13351 } 13352 x_2 := x.Args[2] 13353 if x_2.Op != OpS390XSRWconst { 13354 break 13355 } 13356 if x_2.AuxInt != 8 { 13357 break 13358 } 13359 if w != x_2.Args[0] { 13360 break 13361 } 13362 mem := x.Args[3] 13363 if !(x.Uses == 1 && clobber(x)) { 13364 break 13365 } 13366 v.reset(OpS390XMOVHstoreidx) 13367 v.AuxInt = i - 1 13368 v.Aux = s 13369 v.AddArg(p) 13370 v.AddArg(idx) 13371 v.AddArg(w) 13372 v.AddArg(mem) 13373 return true 13374 } 13375 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 13376 // cond: x.Uses == 1 && clobber(x) 13377 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13378 for { 13379 i := v.AuxInt 13380 s := v.Aux 13381 _ = v.Args[3] 13382 idx := v.Args[0] 13383 p := v.Args[1] 13384 w := v.Args[2] 13385 x := v.Args[3] 13386 if x.Op != OpS390XMOVBstoreidx { 13387 break 13388 } 13389 if x.AuxInt != i-1 { 13390 break 13391 } 13392 if x.Aux != s { 13393 break 13394 } 13395 _ = x.Args[3] 13396 if p != x.Args[0] { 13397 break 13398 } 13399 if idx != x.Args[1] { 13400 break 13401 } 13402 x_2 := x.Args[2] 13403 if x_2.Op != OpS390XSRWconst { 13404 break 13405 } 13406 if x_2.AuxInt != 8 { 13407 break 13408 } 13409 if w != x_2.Args[0] { 13410 break 13411 } 13412 mem := x.Args[3] 13413 if !(x.Uses == 1 && clobber(x)) { 13414 break 13415 } 13416 v.reset(OpS390XMOVHstoreidx) 13417 v.AuxInt = i - 1 13418 v.Aux = s 13419 v.AddArg(p) 13420 v.AddArg(idx) 13421 v.AddArg(w) 13422 v.AddArg(mem) 13423 return true 13424 } 13425 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 13426 // cond: x.Uses == 1 && clobber(x) 13427 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13428 for { 13429 i := v.AuxInt 13430 s := v.Aux 13431 _ = v.Args[3] 13432 idx := v.Args[0] 13433 p := v.Args[1] 13434 w := v.Args[2] 13435 x := v.Args[3] 13436 if x.Op != OpS390XMOVBstoreidx { 13437 break 13438 } 13439 if x.AuxInt != i-1 { 13440 break 13441 } 13442 if x.Aux != s { 13443 break 13444 } 13445 _ = x.Args[3] 13446 if idx != x.Args[0] { 13447 break 13448 } 13449 if p != x.Args[1] { 13450 break 13451 } 13452 x_2 := x.Args[2] 13453 if x_2.Op != OpS390XSRWconst { 13454 break 13455 } 13456 if x_2.AuxInt != 8 { 13457 break 13458 } 13459 if w != x_2.Args[0] { 13460 break 13461 } 13462 mem := x.Args[3] 13463 if !(x.Uses == 1 && clobber(x)) { 13464 break 13465 } 13466 v.reset(OpS390XMOVHstoreidx) 13467 v.AuxInt = i - 1 13468 v.Aux = s 13469 v.AddArg(p) 13470 v.AddArg(idx) 13471 v.AddArg(w) 13472 v.AddArg(mem) 13473 return true 13474 } 13475 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 13476 // cond: x.Uses == 1 && clobber(x) 13477 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13478 for { 13479 i := v.AuxInt 13480 s := v.Aux 13481 _ = v.Args[3] 13482 p := v.Args[0] 13483 idx := v.Args[1] 13484 w0 := v.Args[2] 13485 if w0.Op != OpS390XSRWconst { 13486 break 13487 } 13488 j := w0.AuxInt 13489 w := w0.Args[0] 13490 x := v.Args[3] 13491 if x.Op != OpS390XMOVBstoreidx { 13492 break 13493 } 13494 if x.AuxInt != i-1 { 13495 break 13496 } 13497 if x.Aux != s { 13498 break 13499 } 13500 _ = x.Args[3] 13501 if p != x.Args[0] { 13502 break 13503 } 13504 if idx != x.Args[1] { 13505 break 13506 } 13507 x_2 := x.Args[2] 13508 if x_2.Op != OpS390XSRWconst { 13509 break 13510 } 13511 if x_2.AuxInt != j+8 { 13512 break 13513 } 13514 if w != x_2.Args[0] { 13515 break 13516 } 13517 mem := x.Args[3] 13518 if !(x.Uses == 1 && clobber(x)) { 13519 break 13520 } 13521 v.reset(OpS390XMOVHstoreidx) 13522 v.AuxInt = i - 1 13523 v.Aux = s 13524 v.AddArg(p) 13525 v.AddArg(idx) 13526 v.AddArg(w0) 13527 v.AddArg(mem) 13528 return true 13529 } 13530 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 13531 // cond: x.Uses == 1 && clobber(x) 13532 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13533 for { 13534 i := v.AuxInt 13535 s := v.Aux 13536 _ = v.Args[3] 13537 p := v.Args[0] 13538 idx := v.Args[1] 13539 w0 := v.Args[2] 13540 if w0.Op != OpS390XSRWconst { 13541 break 13542 } 13543 j := w0.AuxInt 13544 w := w0.Args[0] 13545 x := v.Args[3] 13546 if x.Op != OpS390XMOVBstoreidx { 13547 break 13548 } 13549 if x.AuxInt != i-1 { 13550 break 13551 } 13552 if x.Aux != s { 13553 break 13554 } 13555 _ = x.Args[3] 13556 if idx != x.Args[0] { 13557 break 13558 } 13559 if p != x.Args[1] { 13560 break 13561 } 13562 x_2 := x.Args[2] 13563 if x_2.Op != OpS390XSRWconst { 13564 break 13565 } 13566 if x_2.AuxInt != j+8 { 13567 break 13568 } 13569 if w != x_2.Args[0] { 13570 break 13571 } 13572 mem := x.Args[3] 13573 if !(x.Uses == 1 && clobber(x)) { 13574 break 13575 } 13576 v.reset(OpS390XMOVHstoreidx) 13577 v.AuxInt = i - 1 13578 v.Aux = s 13579 v.AddArg(p) 13580 v.AddArg(idx) 13581 v.AddArg(w0) 13582 v.AddArg(mem) 13583 return true 13584 } 13585 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 13586 // cond: x.Uses == 1 && clobber(x) 13587 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13588 for { 13589 i := v.AuxInt 13590 s := v.Aux 13591 _ = v.Args[3] 13592 idx := v.Args[0] 13593 p := v.Args[1] 13594 w0 := v.Args[2] 13595 if w0.Op != OpS390XSRWconst { 13596 break 13597 } 13598 j := w0.AuxInt 13599 w := w0.Args[0] 13600 x := v.Args[3] 13601 if x.Op != OpS390XMOVBstoreidx { 13602 break 13603 } 13604 if x.AuxInt != i-1 { 13605 break 13606 } 13607 if x.Aux != s { 13608 break 13609 } 13610 _ = x.Args[3] 13611 if p != x.Args[0] { 13612 break 13613 } 13614 if idx != x.Args[1] { 13615 break 13616 } 13617 x_2 := x.Args[2] 13618 if x_2.Op != OpS390XSRWconst { 13619 break 13620 } 13621 if x_2.AuxInt != j+8 { 13622 break 13623 } 13624 if w != x_2.Args[0] { 13625 break 13626 } 13627 mem := x.Args[3] 13628 if !(x.Uses == 1 && clobber(x)) { 13629 break 13630 } 13631 v.reset(OpS390XMOVHstoreidx) 13632 v.AuxInt = i - 1 13633 v.Aux = s 13634 v.AddArg(p) 13635 v.AddArg(idx) 13636 v.AddArg(w0) 13637 v.AddArg(mem) 13638 return true 13639 } 13640 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 13641 // cond: x.Uses == 1 && clobber(x) 13642 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13643 for { 13644 i := v.AuxInt 13645 s := v.Aux 13646 _ = v.Args[3] 13647 idx := v.Args[0] 13648 p := v.Args[1] 13649 w0 := v.Args[2] 13650 if w0.Op != OpS390XSRWconst { 13651 break 13652 } 13653 j := w0.AuxInt 13654 w := w0.Args[0] 13655 x := v.Args[3] 13656 if x.Op != OpS390XMOVBstoreidx { 13657 break 13658 } 13659 if x.AuxInt != i-1 { 13660 break 13661 } 13662 if x.Aux != s { 13663 break 13664 } 13665 _ = x.Args[3] 13666 if idx != x.Args[0] { 13667 break 13668 } 13669 if p != x.Args[1] { 13670 break 13671 } 13672 x_2 := x.Args[2] 13673 if x_2.Op != OpS390XSRWconst { 13674 break 13675 } 13676 if x_2.AuxInt != j+8 { 13677 break 13678 } 13679 if w != x_2.Args[0] { 13680 break 13681 } 13682 mem := x.Args[3] 13683 if !(x.Uses == 1 && clobber(x)) { 13684 break 13685 } 13686 v.reset(OpS390XMOVHstoreidx) 13687 v.AuxInt = i - 1 13688 v.Aux = s 13689 v.AddArg(p) 13690 v.AddArg(idx) 13691 v.AddArg(w0) 13692 v.AddArg(mem) 13693 return true 13694 } 13695 return false 13696 } 13697 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 13698 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 13699 // cond: x.Uses == 1 && clobber(x) 13700 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13701 for { 13702 i := v.AuxInt 13703 s := v.Aux 13704 _ = v.Args[3] 13705 p := v.Args[0] 13706 idx := v.Args[1] 13707 v_2 := v.Args[2] 13708 if v_2.Op != OpS390XSRDconst { 13709 break 13710 } 13711 if v_2.AuxInt != 8 { 13712 break 13713 } 13714 w := v_2.Args[0] 13715 x := v.Args[3] 13716 if x.Op != OpS390XMOVBstoreidx { 13717 break 13718 } 13719 if x.AuxInt != i-1 { 13720 break 13721 } 13722 if x.Aux != s { 13723 break 13724 } 13725 _ = x.Args[3] 13726 if p != x.Args[0] { 13727 break 13728 } 13729 if idx != x.Args[1] { 13730 break 13731 } 13732 if w != x.Args[2] { 13733 break 13734 } 13735 mem := x.Args[3] 13736 if !(x.Uses == 1 && clobber(x)) { 13737 break 13738 } 13739 v.reset(OpS390XMOVHBRstoreidx) 13740 v.AuxInt = i - 1 13741 v.Aux = s 13742 v.AddArg(p) 13743 v.AddArg(idx) 13744 v.AddArg(w) 13745 v.AddArg(mem) 13746 return true 13747 } 13748 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 13749 // cond: x.Uses == 1 && clobber(x) 13750 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13751 for { 13752 i := v.AuxInt 13753 s := v.Aux 13754 _ = v.Args[3] 13755 p := v.Args[0] 13756 idx := v.Args[1] 13757 v_2 := v.Args[2] 13758 if v_2.Op != OpS390XSRDconst { 13759 break 13760 } 13761 if v_2.AuxInt != 8 { 13762 break 13763 } 13764 w := v_2.Args[0] 13765 x := v.Args[3] 13766 if x.Op != OpS390XMOVBstoreidx { 13767 break 13768 } 13769 if x.AuxInt != i-1 { 13770 break 13771 } 13772 if x.Aux != s { 13773 break 13774 } 13775 _ = x.Args[3] 13776 if idx != x.Args[0] { 13777 break 13778 } 13779 if p != x.Args[1] { 13780 break 13781 } 13782 if w != x.Args[2] { 13783 break 13784 } 13785 mem := x.Args[3] 13786 if !(x.Uses == 1 && clobber(x)) { 13787 break 13788 } 13789 v.reset(OpS390XMOVHBRstoreidx) 13790 v.AuxInt = i - 1 13791 v.Aux = s 13792 v.AddArg(p) 13793 v.AddArg(idx) 13794 v.AddArg(w) 13795 v.AddArg(mem) 13796 return true 13797 } 13798 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 13799 // cond: x.Uses == 1 && clobber(x) 13800 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13801 for { 13802 i := v.AuxInt 13803 s := v.Aux 13804 _ = v.Args[3] 13805 idx := v.Args[0] 13806 p := v.Args[1] 13807 v_2 := v.Args[2] 13808 if v_2.Op != OpS390XSRDconst { 13809 break 13810 } 13811 if v_2.AuxInt != 8 { 13812 break 13813 } 13814 w := v_2.Args[0] 13815 x := v.Args[3] 13816 if x.Op != OpS390XMOVBstoreidx { 13817 break 13818 } 13819 if x.AuxInt != i-1 { 13820 break 13821 } 13822 if x.Aux != s { 13823 break 13824 } 13825 _ = x.Args[3] 13826 if p != x.Args[0] { 13827 break 13828 } 13829 if idx != x.Args[1] { 13830 break 13831 } 13832 if w != x.Args[2] { 13833 break 13834 } 13835 mem := x.Args[3] 13836 if !(x.Uses == 1 && clobber(x)) { 13837 break 13838 } 13839 v.reset(OpS390XMOVHBRstoreidx) 13840 v.AuxInt = i - 1 13841 v.Aux = s 13842 v.AddArg(p) 13843 v.AddArg(idx) 13844 v.AddArg(w) 13845 v.AddArg(mem) 13846 return true 13847 } 13848 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 13849 // cond: x.Uses == 1 && clobber(x) 13850 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13851 for { 13852 i := v.AuxInt 13853 s := v.Aux 13854 _ = v.Args[3] 13855 idx := v.Args[0] 13856 p := v.Args[1] 13857 v_2 := v.Args[2] 13858 if v_2.Op != OpS390XSRDconst { 13859 break 13860 } 13861 if v_2.AuxInt != 8 { 13862 break 13863 } 13864 w := v_2.Args[0] 13865 x := v.Args[3] 13866 if x.Op != OpS390XMOVBstoreidx { 13867 break 13868 } 13869 if x.AuxInt != i-1 { 13870 break 13871 } 13872 if x.Aux != s { 13873 break 13874 } 13875 _ = x.Args[3] 13876 if idx != x.Args[0] { 13877 break 13878 } 13879 if p != x.Args[1] { 13880 break 13881 } 13882 if w != x.Args[2] { 13883 break 13884 } 13885 mem := x.Args[3] 13886 if !(x.Uses == 1 && clobber(x)) { 13887 break 13888 } 13889 v.reset(OpS390XMOVHBRstoreidx) 13890 v.AuxInt = i - 1 13891 v.Aux = s 13892 v.AddArg(p) 13893 v.AddArg(idx) 13894 v.AddArg(w) 13895 v.AddArg(mem) 13896 return true 13897 } 13898 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 13899 // cond: x.Uses == 1 && clobber(x) 13900 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 13901 for { 13902 i := v.AuxInt 13903 s := v.Aux 13904 _ = v.Args[3] 13905 p := v.Args[0] 13906 idx := v.Args[1] 13907 v_2 := v.Args[2] 13908 if v_2.Op != OpS390XSRDconst { 13909 break 13910 } 13911 j := v_2.AuxInt 13912 w := v_2.Args[0] 13913 x := v.Args[3] 13914 if x.Op != OpS390XMOVBstoreidx { 13915 break 13916 } 13917 if x.AuxInt != i-1 { 13918 break 13919 } 13920 if x.Aux != s { 13921 break 13922 } 13923 _ = x.Args[3] 13924 if p != x.Args[0] { 13925 break 13926 } 13927 if idx != x.Args[1] { 13928 break 13929 } 13930 w0 := x.Args[2] 13931 if w0.Op != OpS390XSRDconst { 13932 break 13933 } 13934 if w0.AuxInt != j-8 { 13935 break 13936 } 13937 if w != w0.Args[0] { 13938 break 13939 } 13940 mem := x.Args[3] 13941 if !(x.Uses == 1 && clobber(x)) { 13942 break 13943 } 13944 v.reset(OpS390XMOVHBRstoreidx) 13945 v.AuxInt = i - 1 13946 v.Aux = s 13947 v.AddArg(p) 13948 v.AddArg(idx) 13949 v.AddArg(w0) 13950 v.AddArg(mem) 13951 return true 13952 } 13953 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 13954 // cond: x.Uses == 1 && clobber(x) 13955 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 13956 for { 13957 i := v.AuxInt 13958 s := v.Aux 13959 _ = v.Args[3] 13960 p := v.Args[0] 13961 idx := v.Args[1] 13962 v_2 := v.Args[2] 13963 if v_2.Op != OpS390XSRDconst { 13964 break 13965 } 13966 j := v_2.AuxInt 13967 w := v_2.Args[0] 13968 x := v.Args[3] 13969 if x.Op != OpS390XMOVBstoreidx { 13970 break 13971 } 13972 if x.AuxInt != i-1 { 13973 break 13974 } 13975 if x.Aux != s { 13976 break 13977 } 13978 _ = x.Args[3] 13979 if idx != x.Args[0] { 13980 break 13981 } 13982 if p != x.Args[1] { 13983 break 13984 } 13985 w0 := x.Args[2] 13986 if w0.Op != OpS390XSRDconst { 13987 break 13988 } 13989 if w0.AuxInt != j-8 { 13990 break 13991 } 13992 if w != w0.Args[0] { 13993 break 13994 } 13995 mem := x.Args[3] 13996 if !(x.Uses == 1 && clobber(x)) { 13997 break 13998 } 13999 v.reset(OpS390XMOVHBRstoreidx) 14000 v.AuxInt = i - 1 14001 v.Aux = s 14002 v.AddArg(p) 14003 v.AddArg(idx) 14004 v.AddArg(w0) 14005 v.AddArg(mem) 14006 return true 14007 } 14008 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 14009 // cond: x.Uses == 1 && clobber(x) 14010 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14011 for { 14012 i := v.AuxInt 14013 s := v.Aux 14014 _ = v.Args[3] 14015 idx := v.Args[0] 14016 p := v.Args[1] 14017 v_2 := v.Args[2] 14018 if v_2.Op != OpS390XSRDconst { 14019 break 14020 } 14021 j := v_2.AuxInt 14022 w := v_2.Args[0] 14023 x := v.Args[3] 14024 if x.Op != OpS390XMOVBstoreidx { 14025 break 14026 } 14027 if x.AuxInt != i-1 { 14028 break 14029 } 14030 if x.Aux != s { 14031 break 14032 } 14033 _ = x.Args[3] 14034 if p != x.Args[0] { 14035 break 14036 } 14037 if idx != x.Args[1] { 14038 break 14039 } 14040 w0 := x.Args[2] 14041 if w0.Op != OpS390XSRDconst { 14042 break 14043 } 14044 if w0.AuxInt != j-8 { 14045 break 14046 } 14047 if w != w0.Args[0] { 14048 break 14049 } 14050 mem := x.Args[3] 14051 if !(x.Uses == 1 && clobber(x)) { 14052 break 14053 } 14054 v.reset(OpS390XMOVHBRstoreidx) 14055 v.AuxInt = i - 1 14056 v.Aux = s 14057 v.AddArg(p) 14058 v.AddArg(idx) 14059 v.AddArg(w0) 14060 v.AddArg(mem) 14061 return true 14062 } 14063 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 14064 // cond: x.Uses == 1 && clobber(x) 14065 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14066 for { 14067 i := v.AuxInt 14068 s := v.Aux 14069 _ = v.Args[3] 14070 idx := v.Args[0] 14071 p := v.Args[1] 14072 v_2 := v.Args[2] 14073 if v_2.Op != OpS390XSRDconst { 14074 break 14075 } 14076 j := v_2.AuxInt 14077 w := v_2.Args[0] 14078 x := v.Args[3] 14079 if x.Op != OpS390XMOVBstoreidx { 14080 break 14081 } 14082 if x.AuxInt != i-1 { 14083 break 14084 } 14085 if x.Aux != s { 14086 break 14087 } 14088 _ = x.Args[3] 14089 if idx != x.Args[0] { 14090 break 14091 } 14092 if p != x.Args[1] { 14093 break 14094 } 14095 w0 := x.Args[2] 14096 if w0.Op != OpS390XSRDconst { 14097 break 14098 } 14099 if w0.AuxInt != j-8 { 14100 break 14101 } 14102 if w != w0.Args[0] { 14103 break 14104 } 14105 mem := x.Args[3] 14106 if !(x.Uses == 1 && clobber(x)) { 14107 break 14108 } 14109 v.reset(OpS390XMOVHBRstoreidx) 14110 v.AuxInt = i - 1 14111 v.Aux = s 14112 v.AddArg(p) 14113 v.AddArg(idx) 14114 v.AddArg(w0) 14115 v.AddArg(mem) 14116 return true 14117 } 14118 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 14119 // cond: x.Uses == 1 && clobber(x) 14120 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14121 for { 14122 i := v.AuxInt 14123 s := v.Aux 14124 _ = v.Args[3] 14125 p := v.Args[0] 14126 idx := v.Args[1] 14127 v_2 := v.Args[2] 14128 if v_2.Op != OpS390XSRWconst { 14129 break 14130 } 14131 if v_2.AuxInt != 8 { 14132 break 14133 } 14134 w := v_2.Args[0] 14135 x := v.Args[3] 14136 if x.Op != OpS390XMOVBstoreidx { 14137 break 14138 } 14139 if x.AuxInt != i-1 { 14140 break 14141 } 14142 if x.Aux != s { 14143 break 14144 } 14145 _ = x.Args[3] 14146 if p != x.Args[0] { 14147 break 14148 } 14149 if idx != x.Args[1] { 14150 break 14151 } 14152 if w != x.Args[2] { 14153 break 14154 } 14155 mem := x.Args[3] 14156 if !(x.Uses == 1 && clobber(x)) { 14157 break 14158 } 14159 v.reset(OpS390XMOVHBRstoreidx) 14160 v.AuxInt = i - 1 14161 v.Aux = s 14162 v.AddArg(p) 14163 v.AddArg(idx) 14164 v.AddArg(w) 14165 v.AddArg(mem) 14166 return true 14167 } 14168 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 14169 // cond: x.Uses == 1 && clobber(x) 14170 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14171 for { 14172 i := v.AuxInt 14173 s := v.Aux 14174 _ = v.Args[3] 14175 p := v.Args[0] 14176 idx := v.Args[1] 14177 v_2 := v.Args[2] 14178 if v_2.Op != OpS390XSRWconst { 14179 break 14180 } 14181 if v_2.AuxInt != 8 { 14182 break 14183 } 14184 w := v_2.Args[0] 14185 x := v.Args[3] 14186 if x.Op != OpS390XMOVBstoreidx { 14187 break 14188 } 14189 if x.AuxInt != i-1 { 14190 break 14191 } 14192 if x.Aux != s { 14193 break 14194 } 14195 _ = x.Args[3] 14196 if idx != x.Args[0] { 14197 break 14198 } 14199 if p != x.Args[1] { 14200 break 14201 } 14202 if w != x.Args[2] { 14203 break 14204 } 14205 mem := x.Args[3] 14206 if !(x.Uses == 1 && clobber(x)) { 14207 break 14208 } 14209 v.reset(OpS390XMOVHBRstoreidx) 14210 v.AuxInt = i - 1 14211 v.Aux = s 14212 v.AddArg(p) 14213 v.AddArg(idx) 14214 v.AddArg(w) 14215 v.AddArg(mem) 14216 return true 14217 } 14218 return false 14219 } 14220 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 14221 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 14222 // cond: x.Uses == 1 && clobber(x) 14223 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14224 for { 14225 i := v.AuxInt 14226 s := v.Aux 14227 _ = v.Args[3] 14228 idx := v.Args[0] 14229 p := v.Args[1] 14230 v_2 := v.Args[2] 14231 if v_2.Op != OpS390XSRWconst { 14232 break 14233 } 14234 if v_2.AuxInt != 8 { 14235 break 14236 } 14237 w := v_2.Args[0] 14238 x := v.Args[3] 14239 if x.Op != OpS390XMOVBstoreidx { 14240 break 14241 } 14242 if x.AuxInt != i-1 { 14243 break 14244 } 14245 if x.Aux != s { 14246 break 14247 } 14248 _ = x.Args[3] 14249 if p != x.Args[0] { 14250 break 14251 } 14252 if idx != x.Args[1] { 14253 break 14254 } 14255 if w != x.Args[2] { 14256 break 14257 } 14258 mem := x.Args[3] 14259 if !(x.Uses == 1 && clobber(x)) { 14260 break 14261 } 14262 v.reset(OpS390XMOVHBRstoreidx) 14263 v.AuxInt = i - 1 14264 v.Aux = s 14265 v.AddArg(p) 14266 v.AddArg(idx) 14267 v.AddArg(w) 14268 v.AddArg(mem) 14269 return true 14270 } 14271 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 14272 // cond: x.Uses == 1 && clobber(x) 14273 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14274 for { 14275 i := v.AuxInt 14276 s := v.Aux 14277 _ = v.Args[3] 14278 idx := v.Args[0] 14279 p := v.Args[1] 14280 v_2 := v.Args[2] 14281 if v_2.Op != OpS390XSRWconst { 14282 break 14283 } 14284 if v_2.AuxInt != 8 { 14285 break 14286 } 14287 w := v_2.Args[0] 14288 x := v.Args[3] 14289 if x.Op != OpS390XMOVBstoreidx { 14290 break 14291 } 14292 if x.AuxInt != i-1 { 14293 break 14294 } 14295 if x.Aux != s { 14296 break 14297 } 14298 _ = x.Args[3] 14299 if idx != x.Args[0] { 14300 break 14301 } 14302 if p != x.Args[1] { 14303 break 14304 } 14305 if w != x.Args[2] { 14306 break 14307 } 14308 mem := x.Args[3] 14309 if !(x.Uses == 1 && clobber(x)) { 14310 break 14311 } 14312 v.reset(OpS390XMOVHBRstoreidx) 14313 v.AuxInt = i - 1 14314 v.Aux = s 14315 v.AddArg(p) 14316 v.AddArg(idx) 14317 v.AddArg(w) 14318 v.AddArg(mem) 14319 return true 14320 } 14321 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 14322 // cond: x.Uses == 1 && clobber(x) 14323 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14324 for { 14325 i := v.AuxInt 14326 s := v.Aux 14327 _ = v.Args[3] 14328 p := v.Args[0] 14329 idx := v.Args[1] 14330 v_2 := v.Args[2] 14331 if v_2.Op != OpS390XSRWconst { 14332 break 14333 } 14334 j := v_2.AuxInt 14335 w := v_2.Args[0] 14336 x := v.Args[3] 14337 if x.Op != OpS390XMOVBstoreidx { 14338 break 14339 } 14340 if x.AuxInt != i-1 { 14341 break 14342 } 14343 if x.Aux != s { 14344 break 14345 } 14346 _ = x.Args[3] 14347 if p != x.Args[0] { 14348 break 14349 } 14350 if idx != x.Args[1] { 14351 break 14352 } 14353 w0 := x.Args[2] 14354 if w0.Op != OpS390XSRWconst { 14355 break 14356 } 14357 if w0.AuxInt != j-8 { 14358 break 14359 } 14360 if w != w0.Args[0] { 14361 break 14362 } 14363 mem := x.Args[3] 14364 if !(x.Uses == 1 && clobber(x)) { 14365 break 14366 } 14367 v.reset(OpS390XMOVHBRstoreidx) 14368 v.AuxInt = i - 1 14369 v.Aux = s 14370 v.AddArg(p) 14371 v.AddArg(idx) 14372 v.AddArg(w0) 14373 v.AddArg(mem) 14374 return true 14375 } 14376 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 14377 // cond: x.Uses == 1 && clobber(x) 14378 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14379 for { 14380 i := v.AuxInt 14381 s := v.Aux 14382 _ = v.Args[3] 14383 p := v.Args[0] 14384 idx := v.Args[1] 14385 v_2 := v.Args[2] 14386 if v_2.Op != OpS390XSRWconst { 14387 break 14388 } 14389 j := v_2.AuxInt 14390 w := v_2.Args[0] 14391 x := v.Args[3] 14392 if x.Op != OpS390XMOVBstoreidx { 14393 break 14394 } 14395 if x.AuxInt != i-1 { 14396 break 14397 } 14398 if x.Aux != s { 14399 break 14400 } 14401 _ = x.Args[3] 14402 if idx != x.Args[0] { 14403 break 14404 } 14405 if p != x.Args[1] { 14406 break 14407 } 14408 w0 := x.Args[2] 14409 if w0.Op != OpS390XSRWconst { 14410 break 14411 } 14412 if w0.AuxInt != j-8 { 14413 break 14414 } 14415 if w != w0.Args[0] { 14416 break 14417 } 14418 mem := x.Args[3] 14419 if !(x.Uses == 1 && clobber(x)) { 14420 break 14421 } 14422 v.reset(OpS390XMOVHBRstoreidx) 14423 v.AuxInt = i - 1 14424 v.Aux = s 14425 v.AddArg(p) 14426 v.AddArg(idx) 14427 v.AddArg(w0) 14428 v.AddArg(mem) 14429 return true 14430 } 14431 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 14432 // cond: x.Uses == 1 && clobber(x) 14433 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14434 for { 14435 i := v.AuxInt 14436 s := v.Aux 14437 _ = v.Args[3] 14438 idx := v.Args[0] 14439 p := v.Args[1] 14440 v_2 := v.Args[2] 14441 if v_2.Op != OpS390XSRWconst { 14442 break 14443 } 14444 j := v_2.AuxInt 14445 w := v_2.Args[0] 14446 x := v.Args[3] 14447 if x.Op != OpS390XMOVBstoreidx { 14448 break 14449 } 14450 if x.AuxInt != i-1 { 14451 break 14452 } 14453 if x.Aux != s { 14454 break 14455 } 14456 _ = x.Args[3] 14457 if p != x.Args[0] { 14458 break 14459 } 14460 if idx != x.Args[1] { 14461 break 14462 } 14463 w0 := x.Args[2] 14464 if w0.Op != OpS390XSRWconst { 14465 break 14466 } 14467 if w0.AuxInt != j-8 { 14468 break 14469 } 14470 if w != w0.Args[0] { 14471 break 14472 } 14473 mem := x.Args[3] 14474 if !(x.Uses == 1 && clobber(x)) { 14475 break 14476 } 14477 v.reset(OpS390XMOVHBRstoreidx) 14478 v.AuxInt = i - 1 14479 v.Aux = s 14480 v.AddArg(p) 14481 v.AddArg(idx) 14482 v.AddArg(w0) 14483 v.AddArg(mem) 14484 return true 14485 } 14486 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 14487 // cond: x.Uses == 1 && clobber(x) 14488 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14489 for { 14490 i := v.AuxInt 14491 s := v.Aux 14492 _ = v.Args[3] 14493 idx := v.Args[0] 14494 p := v.Args[1] 14495 v_2 := v.Args[2] 14496 if v_2.Op != OpS390XSRWconst { 14497 break 14498 } 14499 j := v_2.AuxInt 14500 w := v_2.Args[0] 14501 x := v.Args[3] 14502 if x.Op != OpS390XMOVBstoreidx { 14503 break 14504 } 14505 if x.AuxInt != i-1 { 14506 break 14507 } 14508 if x.Aux != s { 14509 break 14510 } 14511 _ = x.Args[3] 14512 if idx != x.Args[0] { 14513 break 14514 } 14515 if p != x.Args[1] { 14516 break 14517 } 14518 w0 := x.Args[2] 14519 if w0.Op != OpS390XSRWconst { 14520 break 14521 } 14522 if w0.AuxInt != j-8 { 14523 break 14524 } 14525 if w != w0.Args[0] { 14526 break 14527 } 14528 mem := x.Args[3] 14529 if !(x.Uses == 1 && clobber(x)) { 14530 break 14531 } 14532 v.reset(OpS390XMOVHBRstoreidx) 14533 v.AuxInt = i - 1 14534 v.Aux = s 14535 v.AddArg(p) 14536 v.AddArg(idx) 14537 v.AddArg(w0) 14538 v.AddArg(mem) 14539 return true 14540 } 14541 return false 14542 } 14543 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 14544 // match: (MOVDEQ x y (InvertFlags cmp)) 14545 // cond: 14546 // result: (MOVDEQ x y cmp) 14547 for { 14548 _ = v.Args[2] 14549 x := v.Args[0] 14550 y := v.Args[1] 14551 v_2 := v.Args[2] 14552 if v_2.Op != OpS390XInvertFlags { 14553 break 14554 } 14555 cmp := v_2.Args[0] 14556 v.reset(OpS390XMOVDEQ) 14557 v.AddArg(x) 14558 v.AddArg(y) 14559 v.AddArg(cmp) 14560 return true 14561 } 14562 // match: (MOVDEQ _ x (FlagEQ)) 14563 // cond: 14564 // result: x 14565 for { 14566 _ = v.Args[2] 14567 x := v.Args[1] 14568 v_2 := v.Args[2] 14569 if v_2.Op != OpS390XFlagEQ { 14570 break 14571 } 14572 v.reset(OpCopy) 14573 v.Type = x.Type 14574 v.AddArg(x) 14575 return true 14576 } 14577 // match: (MOVDEQ y _ (FlagLT)) 14578 // cond: 14579 // result: y 14580 for { 14581 _ = v.Args[2] 14582 y := v.Args[0] 14583 v_2 := v.Args[2] 14584 if v_2.Op != OpS390XFlagLT { 14585 break 14586 } 14587 v.reset(OpCopy) 14588 v.Type = y.Type 14589 v.AddArg(y) 14590 return true 14591 } 14592 // match: (MOVDEQ y _ (FlagGT)) 14593 // cond: 14594 // result: y 14595 for { 14596 _ = v.Args[2] 14597 y := v.Args[0] 14598 v_2 := v.Args[2] 14599 if v_2.Op != OpS390XFlagGT { 14600 break 14601 } 14602 v.reset(OpCopy) 14603 v.Type = y.Type 14604 v.AddArg(y) 14605 return true 14606 } 14607 return false 14608 } 14609 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 14610 // match: (MOVDGE x y (InvertFlags cmp)) 14611 // cond: 14612 // result: (MOVDLE x y cmp) 14613 for { 14614 _ = v.Args[2] 14615 x := v.Args[0] 14616 y := v.Args[1] 14617 v_2 := v.Args[2] 14618 if v_2.Op != OpS390XInvertFlags { 14619 break 14620 } 14621 cmp := v_2.Args[0] 14622 v.reset(OpS390XMOVDLE) 14623 v.AddArg(x) 14624 v.AddArg(y) 14625 v.AddArg(cmp) 14626 return true 14627 } 14628 // match: (MOVDGE _ x (FlagEQ)) 14629 // cond: 14630 // result: x 14631 for { 14632 _ = v.Args[2] 14633 x := v.Args[1] 14634 v_2 := v.Args[2] 14635 if v_2.Op != OpS390XFlagEQ { 14636 break 14637 } 14638 v.reset(OpCopy) 14639 v.Type = x.Type 14640 v.AddArg(x) 14641 return true 14642 } 14643 // match: (MOVDGE y _ (FlagLT)) 14644 // cond: 14645 // result: y 14646 for { 14647 _ = v.Args[2] 14648 y := v.Args[0] 14649 v_2 := v.Args[2] 14650 if v_2.Op != OpS390XFlagLT { 14651 break 14652 } 14653 v.reset(OpCopy) 14654 v.Type = y.Type 14655 v.AddArg(y) 14656 return true 14657 } 14658 // match: (MOVDGE _ x (FlagGT)) 14659 // cond: 14660 // result: x 14661 for { 14662 _ = v.Args[2] 14663 x := v.Args[1] 14664 v_2 := v.Args[2] 14665 if v_2.Op != OpS390XFlagGT { 14666 break 14667 } 14668 v.reset(OpCopy) 14669 v.Type = x.Type 14670 v.AddArg(x) 14671 return true 14672 } 14673 return false 14674 } 14675 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 14676 // match: (MOVDGT x y (InvertFlags cmp)) 14677 // cond: 14678 // result: (MOVDLT x y cmp) 14679 for { 14680 _ = v.Args[2] 14681 x := v.Args[0] 14682 y := v.Args[1] 14683 v_2 := v.Args[2] 14684 if v_2.Op != OpS390XInvertFlags { 14685 break 14686 } 14687 cmp := v_2.Args[0] 14688 v.reset(OpS390XMOVDLT) 14689 v.AddArg(x) 14690 v.AddArg(y) 14691 v.AddArg(cmp) 14692 return true 14693 } 14694 // match: (MOVDGT y _ (FlagEQ)) 14695 // cond: 14696 // result: y 14697 for { 14698 _ = v.Args[2] 14699 y := v.Args[0] 14700 v_2 := v.Args[2] 14701 if v_2.Op != OpS390XFlagEQ { 14702 break 14703 } 14704 v.reset(OpCopy) 14705 v.Type = y.Type 14706 v.AddArg(y) 14707 return true 14708 } 14709 // match: (MOVDGT y _ (FlagLT)) 14710 // cond: 14711 // result: y 14712 for { 14713 _ = v.Args[2] 14714 y := v.Args[0] 14715 v_2 := v.Args[2] 14716 if v_2.Op != OpS390XFlagLT { 14717 break 14718 } 14719 v.reset(OpCopy) 14720 v.Type = y.Type 14721 v.AddArg(y) 14722 return true 14723 } 14724 // match: (MOVDGT _ x (FlagGT)) 14725 // cond: 14726 // result: x 14727 for { 14728 _ = v.Args[2] 14729 x := v.Args[1] 14730 v_2 := v.Args[2] 14731 if v_2.Op != OpS390XFlagGT { 14732 break 14733 } 14734 v.reset(OpCopy) 14735 v.Type = x.Type 14736 v.AddArg(x) 14737 return true 14738 } 14739 return false 14740 } 14741 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 14742 // match: (MOVDLE x y (InvertFlags cmp)) 14743 // cond: 14744 // result: (MOVDGE x y cmp) 14745 for { 14746 _ = v.Args[2] 14747 x := v.Args[0] 14748 y := v.Args[1] 14749 v_2 := v.Args[2] 14750 if v_2.Op != OpS390XInvertFlags { 14751 break 14752 } 14753 cmp := v_2.Args[0] 14754 v.reset(OpS390XMOVDGE) 14755 v.AddArg(x) 14756 v.AddArg(y) 14757 v.AddArg(cmp) 14758 return true 14759 } 14760 // match: (MOVDLE _ x (FlagEQ)) 14761 // cond: 14762 // result: x 14763 for { 14764 _ = v.Args[2] 14765 x := v.Args[1] 14766 v_2 := v.Args[2] 14767 if v_2.Op != OpS390XFlagEQ { 14768 break 14769 } 14770 v.reset(OpCopy) 14771 v.Type = x.Type 14772 v.AddArg(x) 14773 return true 14774 } 14775 // match: (MOVDLE _ x (FlagLT)) 14776 // cond: 14777 // result: x 14778 for { 14779 _ = v.Args[2] 14780 x := v.Args[1] 14781 v_2 := v.Args[2] 14782 if v_2.Op != OpS390XFlagLT { 14783 break 14784 } 14785 v.reset(OpCopy) 14786 v.Type = x.Type 14787 v.AddArg(x) 14788 return true 14789 } 14790 // match: (MOVDLE y _ (FlagGT)) 14791 // cond: 14792 // result: y 14793 for { 14794 _ = v.Args[2] 14795 y := v.Args[0] 14796 v_2 := v.Args[2] 14797 if v_2.Op != OpS390XFlagGT { 14798 break 14799 } 14800 v.reset(OpCopy) 14801 v.Type = y.Type 14802 v.AddArg(y) 14803 return true 14804 } 14805 return false 14806 } 14807 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 14808 // match: (MOVDLT x y (InvertFlags cmp)) 14809 // cond: 14810 // result: (MOVDGT x y cmp) 14811 for { 14812 _ = v.Args[2] 14813 x := v.Args[0] 14814 y := v.Args[1] 14815 v_2 := v.Args[2] 14816 if v_2.Op != OpS390XInvertFlags { 14817 break 14818 } 14819 cmp := v_2.Args[0] 14820 v.reset(OpS390XMOVDGT) 14821 v.AddArg(x) 14822 v.AddArg(y) 14823 v.AddArg(cmp) 14824 return true 14825 } 14826 // match: (MOVDLT y _ (FlagEQ)) 14827 // cond: 14828 // result: y 14829 for { 14830 _ = v.Args[2] 14831 y := v.Args[0] 14832 v_2 := v.Args[2] 14833 if v_2.Op != OpS390XFlagEQ { 14834 break 14835 } 14836 v.reset(OpCopy) 14837 v.Type = y.Type 14838 v.AddArg(y) 14839 return true 14840 } 14841 // match: (MOVDLT _ x (FlagLT)) 14842 // cond: 14843 // result: x 14844 for { 14845 _ = v.Args[2] 14846 x := v.Args[1] 14847 v_2 := v.Args[2] 14848 if v_2.Op != OpS390XFlagLT { 14849 break 14850 } 14851 v.reset(OpCopy) 14852 v.Type = x.Type 14853 v.AddArg(x) 14854 return true 14855 } 14856 // match: (MOVDLT y _ (FlagGT)) 14857 // cond: 14858 // result: y 14859 for { 14860 _ = v.Args[2] 14861 y := v.Args[0] 14862 v_2 := v.Args[2] 14863 if v_2.Op != OpS390XFlagGT { 14864 break 14865 } 14866 v.reset(OpCopy) 14867 v.Type = y.Type 14868 v.AddArg(y) 14869 return true 14870 } 14871 return false 14872 } 14873 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 14874 // match: (MOVDNE x y (InvertFlags cmp)) 14875 // cond: 14876 // result: (MOVDNE x y cmp) 14877 for { 14878 _ = v.Args[2] 14879 x := v.Args[0] 14880 y := v.Args[1] 14881 v_2 := v.Args[2] 14882 if v_2.Op != OpS390XInvertFlags { 14883 break 14884 } 14885 cmp := v_2.Args[0] 14886 v.reset(OpS390XMOVDNE) 14887 v.AddArg(x) 14888 v.AddArg(y) 14889 v.AddArg(cmp) 14890 return true 14891 } 14892 // match: (MOVDNE y _ (FlagEQ)) 14893 // cond: 14894 // result: y 14895 for { 14896 _ = v.Args[2] 14897 y := v.Args[0] 14898 v_2 := v.Args[2] 14899 if v_2.Op != OpS390XFlagEQ { 14900 break 14901 } 14902 v.reset(OpCopy) 14903 v.Type = y.Type 14904 v.AddArg(y) 14905 return true 14906 } 14907 // match: (MOVDNE _ x (FlagLT)) 14908 // cond: 14909 // result: x 14910 for { 14911 _ = v.Args[2] 14912 x := v.Args[1] 14913 v_2 := v.Args[2] 14914 if v_2.Op != OpS390XFlagLT { 14915 break 14916 } 14917 v.reset(OpCopy) 14918 v.Type = x.Type 14919 v.AddArg(x) 14920 return true 14921 } 14922 // match: (MOVDNE _ x (FlagGT)) 14923 // cond: 14924 // result: x 14925 for { 14926 _ = v.Args[2] 14927 x := v.Args[1] 14928 v_2 := v.Args[2] 14929 if v_2.Op != OpS390XFlagGT { 14930 break 14931 } 14932 v.reset(OpCopy) 14933 v.Type = x.Type 14934 v.AddArg(x) 14935 return true 14936 } 14937 return false 14938 } 14939 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 14940 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 14941 // cond: is20Bit(c+d) && x.Op != OpSB 14942 // result: (MOVDaddridx [c+d] {s} x y) 14943 for { 14944 c := v.AuxInt 14945 s := v.Aux 14946 _ = v.Args[1] 14947 v_0 := v.Args[0] 14948 if v_0.Op != OpS390XADDconst { 14949 break 14950 } 14951 d := v_0.AuxInt 14952 x := v_0.Args[0] 14953 y := v.Args[1] 14954 if !(is20Bit(c+d) && x.Op != OpSB) { 14955 break 14956 } 14957 v.reset(OpS390XMOVDaddridx) 14958 v.AuxInt = c + d 14959 v.Aux = s 14960 v.AddArg(x) 14961 v.AddArg(y) 14962 return true 14963 } 14964 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 14965 // cond: is20Bit(c+d) && y.Op != OpSB 14966 // result: (MOVDaddridx [c+d] {s} x y) 14967 for { 14968 c := v.AuxInt 14969 s := v.Aux 14970 _ = v.Args[1] 14971 x := v.Args[0] 14972 v_1 := v.Args[1] 14973 if v_1.Op != OpS390XADDconst { 14974 break 14975 } 14976 d := v_1.AuxInt 14977 y := v_1.Args[0] 14978 if !(is20Bit(c+d) && y.Op != OpSB) { 14979 break 14980 } 14981 v.reset(OpS390XMOVDaddridx) 14982 v.AuxInt = c + d 14983 v.Aux = s 14984 v.AddArg(x) 14985 v.AddArg(y) 14986 return true 14987 } 14988 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 14989 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 14990 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 14991 for { 14992 off1 := v.AuxInt 14993 sym1 := v.Aux 14994 _ = v.Args[1] 14995 v_0 := v.Args[0] 14996 if v_0.Op != OpS390XMOVDaddr { 14997 break 14998 } 14999 off2 := v_0.AuxInt 15000 sym2 := v_0.Aux 15001 x := v_0.Args[0] 15002 y := v.Args[1] 15003 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 15004 break 15005 } 15006 v.reset(OpS390XMOVDaddridx) 15007 v.AuxInt = off1 + off2 15008 v.Aux = mergeSym(sym1, sym2) 15009 v.AddArg(x) 15010 v.AddArg(y) 15011 return true 15012 } 15013 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 15014 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 15015 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 15016 for { 15017 off1 := v.AuxInt 15018 sym1 := v.Aux 15019 _ = v.Args[1] 15020 x := v.Args[0] 15021 v_1 := v.Args[1] 15022 if v_1.Op != OpS390XMOVDaddr { 15023 break 15024 } 15025 off2 := v_1.AuxInt 15026 sym2 := v_1.Aux 15027 y := v_1.Args[0] 15028 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 15029 break 15030 } 15031 v.reset(OpS390XMOVDaddridx) 15032 v.AuxInt = off1 + off2 15033 v.Aux = mergeSym(sym1, sym2) 15034 v.AddArg(x) 15035 v.AddArg(y) 15036 return true 15037 } 15038 return false 15039 } 15040 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 15041 // match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 15042 // cond: isSamePtr(ptr1, ptr2) 15043 // result: (MOVDreg x) 15044 for { 15045 off := v.AuxInt 15046 sym := v.Aux 15047 _ = v.Args[1] 15048 ptr1 := v.Args[0] 15049 v_1 := v.Args[1] 15050 if v_1.Op != OpS390XMOVDstore { 15051 break 15052 } 15053 if v_1.AuxInt != off { 15054 break 15055 } 15056 if v_1.Aux != sym { 15057 break 15058 } 15059 _ = v_1.Args[2] 15060 ptr2 := v_1.Args[0] 15061 x := v_1.Args[1] 15062 if !(isSamePtr(ptr1, ptr2)) { 15063 break 15064 } 15065 v.reset(OpS390XMOVDreg) 15066 v.AddArg(x) 15067 return true 15068 } 15069 // match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 15070 // cond: isSamePtr(ptr1, ptr2) 15071 // result: (LGDR x) 15072 for { 15073 off := v.AuxInt 15074 sym := v.Aux 15075 _ = v.Args[1] 15076 ptr1 := v.Args[0] 15077 v_1 := v.Args[1] 15078 if v_1.Op != OpS390XFMOVDstore { 15079 break 15080 } 15081 if v_1.AuxInt != off { 15082 break 15083 } 15084 if v_1.Aux != sym { 15085 break 15086 } 15087 _ = v_1.Args[2] 15088 ptr2 := v_1.Args[0] 15089 x := v_1.Args[1] 15090 if !(isSamePtr(ptr1, ptr2)) { 15091 break 15092 } 15093 v.reset(OpS390XLGDR) 15094 v.AddArg(x) 15095 return true 15096 } 15097 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 15098 // cond: is20Bit(off1+off2) 15099 // result: (MOVDload [off1+off2] {sym} ptr mem) 15100 for { 15101 off1 := v.AuxInt 15102 sym := v.Aux 15103 _ = v.Args[1] 15104 v_0 := v.Args[0] 15105 if v_0.Op != OpS390XADDconst { 15106 break 15107 } 15108 off2 := v_0.AuxInt 15109 ptr := v_0.Args[0] 15110 mem := v.Args[1] 15111 if !(is20Bit(off1 + off2)) { 15112 break 15113 } 15114 v.reset(OpS390XMOVDload) 15115 v.AuxInt = off1 + off2 15116 v.Aux = sym 15117 v.AddArg(ptr) 15118 v.AddArg(mem) 15119 return true 15120 } 15121 // match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 15122 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 15123 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 15124 for { 15125 off1 := v.AuxInt 15126 sym1 := v.Aux 15127 _ = v.Args[1] 15128 v_0 := v.Args[0] 15129 if v_0.Op != OpS390XMOVDaddr { 15130 break 15131 } 15132 t := v_0.Type 15133 off2 := v_0.AuxInt 15134 sym2 := v_0.Aux 15135 base := v_0.Args[0] 15136 mem := v.Args[1] 15137 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 15138 break 15139 } 15140 v.reset(OpS390XMOVDload) 15141 v.AuxInt = off1 + off2 15142 v.Aux = mergeSym(sym1, sym2) 15143 v.AddArg(base) 15144 v.AddArg(mem) 15145 return true 15146 } 15147 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 15148 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15149 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 15150 for { 15151 off1 := v.AuxInt 15152 sym1 := v.Aux 15153 _ = v.Args[1] 15154 v_0 := v.Args[0] 15155 if v_0.Op != OpS390XMOVDaddridx { 15156 break 15157 } 15158 off2 := v_0.AuxInt 15159 sym2 := v_0.Aux 15160 _ = v_0.Args[1] 15161 ptr := v_0.Args[0] 15162 idx := v_0.Args[1] 15163 mem := v.Args[1] 15164 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15165 break 15166 } 15167 v.reset(OpS390XMOVDloadidx) 15168 v.AuxInt = off1 + off2 15169 v.Aux = mergeSym(sym1, sym2) 15170 v.AddArg(ptr) 15171 v.AddArg(idx) 15172 v.AddArg(mem) 15173 return true 15174 } 15175 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 15176 // cond: ptr.Op != OpSB 15177 // result: (MOVDloadidx [off] {sym} ptr idx mem) 15178 for { 15179 off := v.AuxInt 15180 sym := v.Aux 15181 _ = v.Args[1] 15182 v_0 := v.Args[0] 15183 if v_0.Op != OpS390XADD { 15184 break 15185 } 15186 _ = v_0.Args[1] 15187 ptr := v_0.Args[0] 15188 idx := v_0.Args[1] 15189 mem := v.Args[1] 15190 if !(ptr.Op != OpSB) { 15191 break 15192 } 15193 v.reset(OpS390XMOVDloadidx) 15194 v.AuxInt = off 15195 v.Aux = sym 15196 v.AddArg(ptr) 15197 v.AddArg(idx) 15198 v.AddArg(mem) 15199 return true 15200 } 15201 return false 15202 } 15203 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 15204 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 15205 // cond: is20Bit(c+d) 15206 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15207 for { 15208 c := v.AuxInt 15209 sym := v.Aux 15210 _ = v.Args[2] 15211 v_0 := v.Args[0] 15212 if v_0.Op != OpS390XADDconst { 15213 break 15214 } 15215 d := v_0.AuxInt 15216 ptr := v_0.Args[0] 15217 idx := v.Args[1] 15218 mem := v.Args[2] 15219 if !(is20Bit(c + d)) { 15220 break 15221 } 15222 v.reset(OpS390XMOVDloadidx) 15223 v.AuxInt = c + d 15224 v.Aux = sym 15225 v.AddArg(ptr) 15226 v.AddArg(idx) 15227 v.AddArg(mem) 15228 return true 15229 } 15230 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 15231 // cond: is20Bit(c+d) 15232 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15233 for { 15234 c := v.AuxInt 15235 sym := v.Aux 15236 _ = v.Args[2] 15237 idx := v.Args[0] 15238 v_1 := v.Args[1] 15239 if v_1.Op != OpS390XADDconst { 15240 break 15241 } 15242 d := v_1.AuxInt 15243 ptr := v_1.Args[0] 15244 mem := v.Args[2] 15245 if !(is20Bit(c + d)) { 15246 break 15247 } 15248 v.reset(OpS390XMOVDloadidx) 15249 v.AuxInt = c + d 15250 v.Aux = sym 15251 v.AddArg(ptr) 15252 v.AddArg(idx) 15253 v.AddArg(mem) 15254 return true 15255 } 15256 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 15257 // cond: is20Bit(c+d) 15258 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15259 for { 15260 c := v.AuxInt 15261 sym := v.Aux 15262 _ = v.Args[2] 15263 ptr := v.Args[0] 15264 v_1 := v.Args[1] 15265 if v_1.Op != OpS390XADDconst { 15266 break 15267 } 15268 d := v_1.AuxInt 15269 idx := v_1.Args[0] 15270 mem := v.Args[2] 15271 if !(is20Bit(c + d)) { 15272 break 15273 } 15274 v.reset(OpS390XMOVDloadidx) 15275 v.AuxInt = c + d 15276 v.Aux = sym 15277 v.AddArg(ptr) 15278 v.AddArg(idx) 15279 v.AddArg(mem) 15280 return true 15281 } 15282 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 15283 // cond: is20Bit(c+d) 15284 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15285 for { 15286 c := v.AuxInt 15287 sym := v.Aux 15288 _ = v.Args[2] 15289 v_0 := v.Args[0] 15290 if v_0.Op != OpS390XADDconst { 15291 break 15292 } 15293 d := v_0.AuxInt 15294 idx := v_0.Args[0] 15295 ptr := v.Args[1] 15296 mem := v.Args[2] 15297 if !(is20Bit(c + d)) { 15298 break 15299 } 15300 v.reset(OpS390XMOVDloadidx) 15301 v.AuxInt = c + d 15302 v.Aux = sym 15303 v.AddArg(ptr) 15304 v.AddArg(idx) 15305 v.AddArg(mem) 15306 return true 15307 } 15308 return false 15309 } 15310 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 15311 b := v.Block 15312 _ = b 15313 // match: (MOVDnop <t> x) 15314 // cond: t.Compare(x.Type) == types.CMPeq 15315 // result: x 15316 for { 15317 t := v.Type 15318 x := v.Args[0] 15319 if !(t.Compare(x.Type) == types.CMPeq) { 15320 break 15321 } 15322 v.reset(OpCopy) 15323 v.Type = x.Type 15324 v.AddArg(x) 15325 return true 15326 } 15327 // match: (MOVDnop (MOVDconst [c])) 15328 // cond: 15329 // result: (MOVDconst [c]) 15330 for { 15331 v_0 := v.Args[0] 15332 if v_0.Op != OpS390XMOVDconst { 15333 break 15334 } 15335 c := v_0.AuxInt 15336 v.reset(OpS390XMOVDconst) 15337 v.AuxInt = c 15338 return true 15339 } 15340 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 15341 // cond: x.Uses == 1 && clobber(x) 15342 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 15343 for { 15344 t := v.Type 15345 x := v.Args[0] 15346 if x.Op != OpS390XMOVBZload { 15347 break 15348 } 15349 off := x.AuxInt 15350 sym := x.Aux 15351 _ = x.Args[1] 15352 ptr := x.Args[0] 15353 mem := x.Args[1] 15354 if !(x.Uses == 1 && clobber(x)) { 15355 break 15356 } 15357 b = x.Block 15358 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 15359 v.reset(OpCopy) 15360 v.AddArg(v0) 15361 v0.AuxInt = off 15362 v0.Aux = sym 15363 v0.AddArg(ptr) 15364 v0.AddArg(mem) 15365 return true 15366 } 15367 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 15368 // cond: x.Uses == 1 && clobber(x) 15369 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 15370 for { 15371 t := v.Type 15372 x := v.Args[0] 15373 if x.Op != OpS390XMOVBload { 15374 break 15375 } 15376 off := x.AuxInt 15377 sym := x.Aux 15378 _ = x.Args[1] 15379 ptr := x.Args[0] 15380 mem := x.Args[1] 15381 if !(x.Uses == 1 && clobber(x)) { 15382 break 15383 } 15384 b = x.Block 15385 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 15386 v.reset(OpCopy) 15387 v.AddArg(v0) 15388 v0.AuxInt = off 15389 v0.Aux = sym 15390 v0.AddArg(ptr) 15391 v0.AddArg(mem) 15392 return true 15393 } 15394 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 15395 // cond: x.Uses == 1 && clobber(x) 15396 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 15397 for { 15398 t := v.Type 15399 x := v.Args[0] 15400 if x.Op != OpS390XMOVHZload { 15401 break 15402 } 15403 off := x.AuxInt 15404 sym := x.Aux 15405 _ = x.Args[1] 15406 ptr := x.Args[0] 15407 mem := x.Args[1] 15408 if !(x.Uses == 1 && clobber(x)) { 15409 break 15410 } 15411 b = x.Block 15412 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 15413 v.reset(OpCopy) 15414 v.AddArg(v0) 15415 v0.AuxInt = off 15416 v0.Aux = sym 15417 v0.AddArg(ptr) 15418 v0.AddArg(mem) 15419 return true 15420 } 15421 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 15422 // cond: x.Uses == 1 && clobber(x) 15423 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 15424 for { 15425 t := v.Type 15426 x := v.Args[0] 15427 if x.Op != OpS390XMOVHload { 15428 break 15429 } 15430 off := x.AuxInt 15431 sym := x.Aux 15432 _ = x.Args[1] 15433 ptr := x.Args[0] 15434 mem := x.Args[1] 15435 if !(x.Uses == 1 && clobber(x)) { 15436 break 15437 } 15438 b = x.Block 15439 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 15440 v.reset(OpCopy) 15441 v.AddArg(v0) 15442 v0.AuxInt = off 15443 v0.Aux = sym 15444 v0.AddArg(ptr) 15445 v0.AddArg(mem) 15446 return true 15447 } 15448 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 15449 // cond: x.Uses == 1 && clobber(x) 15450 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 15451 for { 15452 t := v.Type 15453 x := v.Args[0] 15454 if x.Op != OpS390XMOVWZload { 15455 break 15456 } 15457 off := x.AuxInt 15458 sym := x.Aux 15459 _ = x.Args[1] 15460 ptr := x.Args[0] 15461 mem := x.Args[1] 15462 if !(x.Uses == 1 && clobber(x)) { 15463 break 15464 } 15465 b = x.Block 15466 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 15467 v.reset(OpCopy) 15468 v.AddArg(v0) 15469 v0.AuxInt = off 15470 v0.Aux = sym 15471 v0.AddArg(ptr) 15472 v0.AddArg(mem) 15473 return true 15474 } 15475 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 15476 // cond: x.Uses == 1 && clobber(x) 15477 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 15478 for { 15479 t := v.Type 15480 x := v.Args[0] 15481 if x.Op != OpS390XMOVWload { 15482 break 15483 } 15484 off := x.AuxInt 15485 sym := x.Aux 15486 _ = x.Args[1] 15487 ptr := x.Args[0] 15488 mem := x.Args[1] 15489 if !(x.Uses == 1 && clobber(x)) { 15490 break 15491 } 15492 b = x.Block 15493 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 15494 v.reset(OpCopy) 15495 v.AddArg(v0) 15496 v0.AuxInt = off 15497 v0.Aux = sym 15498 v0.AddArg(ptr) 15499 v0.AddArg(mem) 15500 return true 15501 } 15502 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 15503 // cond: x.Uses == 1 && clobber(x) 15504 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 15505 for { 15506 t := v.Type 15507 x := v.Args[0] 15508 if x.Op != OpS390XMOVDload { 15509 break 15510 } 15511 off := x.AuxInt 15512 sym := x.Aux 15513 _ = x.Args[1] 15514 ptr := x.Args[0] 15515 mem := x.Args[1] 15516 if !(x.Uses == 1 && clobber(x)) { 15517 break 15518 } 15519 b = x.Block 15520 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 15521 v.reset(OpCopy) 15522 v.AddArg(v0) 15523 v0.AuxInt = off 15524 v0.Aux = sym 15525 v0.AddArg(ptr) 15526 v0.AddArg(mem) 15527 return true 15528 } 15529 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 15530 // cond: x.Uses == 1 && clobber(x) 15531 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 15532 for { 15533 t := v.Type 15534 x := v.Args[0] 15535 if x.Op != OpS390XMOVBZloadidx { 15536 break 15537 } 15538 off := x.AuxInt 15539 sym := x.Aux 15540 _ = x.Args[2] 15541 ptr := x.Args[0] 15542 idx := x.Args[1] 15543 mem := x.Args[2] 15544 if !(x.Uses == 1 && clobber(x)) { 15545 break 15546 } 15547 b = x.Block 15548 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 15549 v.reset(OpCopy) 15550 v.AddArg(v0) 15551 v0.AuxInt = off 15552 v0.Aux = sym 15553 v0.AddArg(ptr) 15554 v0.AddArg(idx) 15555 v0.AddArg(mem) 15556 return true 15557 } 15558 return false 15559 } 15560 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 15561 b := v.Block 15562 _ = b 15563 // match: (MOVDnop <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 15564 // cond: x.Uses == 1 && clobber(x) 15565 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 15566 for { 15567 t := v.Type 15568 x := v.Args[0] 15569 if x.Op != OpS390XMOVBloadidx { 15570 break 15571 } 15572 off := x.AuxInt 15573 sym := x.Aux 15574 _ = x.Args[2] 15575 ptr := x.Args[0] 15576 idx := x.Args[1] 15577 mem := x.Args[2] 15578 if !(x.Uses == 1 && clobber(x)) { 15579 break 15580 } 15581 b = x.Block 15582 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 15583 v.reset(OpCopy) 15584 v.AddArg(v0) 15585 v0.AuxInt = off 15586 v0.Aux = sym 15587 v0.AddArg(ptr) 15588 v0.AddArg(idx) 15589 v0.AddArg(mem) 15590 return true 15591 } 15592 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 15593 // cond: x.Uses == 1 && clobber(x) 15594 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 15595 for { 15596 t := v.Type 15597 x := v.Args[0] 15598 if x.Op != OpS390XMOVHZloadidx { 15599 break 15600 } 15601 off := x.AuxInt 15602 sym := x.Aux 15603 _ = x.Args[2] 15604 ptr := x.Args[0] 15605 idx := x.Args[1] 15606 mem := x.Args[2] 15607 if !(x.Uses == 1 && clobber(x)) { 15608 break 15609 } 15610 b = x.Block 15611 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 15612 v.reset(OpCopy) 15613 v.AddArg(v0) 15614 v0.AuxInt = off 15615 v0.Aux = sym 15616 v0.AddArg(ptr) 15617 v0.AddArg(idx) 15618 v0.AddArg(mem) 15619 return true 15620 } 15621 // match: (MOVDnop <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 15622 // cond: x.Uses == 1 && clobber(x) 15623 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 15624 for { 15625 t := v.Type 15626 x := v.Args[0] 15627 if x.Op != OpS390XMOVHloadidx { 15628 break 15629 } 15630 off := x.AuxInt 15631 sym := x.Aux 15632 _ = x.Args[2] 15633 ptr := x.Args[0] 15634 idx := x.Args[1] 15635 mem := x.Args[2] 15636 if !(x.Uses == 1 && clobber(x)) { 15637 break 15638 } 15639 b = x.Block 15640 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 15641 v.reset(OpCopy) 15642 v.AddArg(v0) 15643 v0.AuxInt = off 15644 v0.Aux = sym 15645 v0.AddArg(ptr) 15646 v0.AddArg(idx) 15647 v0.AddArg(mem) 15648 return true 15649 } 15650 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 15651 // cond: x.Uses == 1 && clobber(x) 15652 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 15653 for { 15654 t := v.Type 15655 x := v.Args[0] 15656 if x.Op != OpS390XMOVWZloadidx { 15657 break 15658 } 15659 off := x.AuxInt 15660 sym := x.Aux 15661 _ = x.Args[2] 15662 ptr := x.Args[0] 15663 idx := x.Args[1] 15664 mem := x.Args[2] 15665 if !(x.Uses == 1 && clobber(x)) { 15666 break 15667 } 15668 b = x.Block 15669 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 15670 v.reset(OpCopy) 15671 v.AddArg(v0) 15672 v0.AuxInt = off 15673 v0.Aux = sym 15674 v0.AddArg(ptr) 15675 v0.AddArg(idx) 15676 v0.AddArg(mem) 15677 return true 15678 } 15679 // match: (MOVDnop <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 15680 // cond: x.Uses == 1 && clobber(x) 15681 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 15682 for { 15683 t := v.Type 15684 x := v.Args[0] 15685 if x.Op != OpS390XMOVWloadidx { 15686 break 15687 } 15688 off := x.AuxInt 15689 sym := x.Aux 15690 _ = x.Args[2] 15691 ptr := x.Args[0] 15692 idx := x.Args[1] 15693 mem := x.Args[2] 15694 if !(x.Uses == 1 && clobber(x)) { 15695 break 15696 } 15697 b = x.Block 15698 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 15699 v.reset(OpCopy) 15700 v.AddArg(v0) 15701 v0.AuxInt = off 15702 v0.Aux = sym 15703 v0.AddArg(ptr) 15704 v0.AddArg(idx) 15705 v0.AddArg(mem) 15706 return true 15707 } 15708 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 15709 // cond: x.Uses == 1 && clobber(x) 15710 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 15711 for { 15712 t := v.Type 15713 x := v.Args[0] 15714 if x.Op != OpS390XMOVDloadidx { 15715 break 15716 } 15717 off := x.AuxInt 15718 sym := x.Aux 15719 _ = x.Args[2] 15720 ptr := x.Args[0] 15721 idx := x.Args[1] 15722 mem := x.Args[2] 15723 if !(x.Uses == 1 && clobber(x)) { 15724 break 15725 } 15726 b = x.Block 15727 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 15728 v.reset(OpCopy) 15729 v.AddArg(v0) 15730 v0.AuxInt = off 15731 v0.Aux = sym 15732 v0.AddArg(ptr) 15733 v0.AddArg(idx) 15734 v0.AddArg(mem) 15735 return true 15736 } 15737 return false 15738 } 15739 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 15740 b := v.Block 15741 _ = b 15742 // match: (MOVDreg <t> x) 15743 // cond: t.Compare(x.Type) == types.CMPeq 15744 // result: x 15745 for { 15746 t := v.Type 15747 x := v.Args[0] 15748 if !(t.Compare(x.Type) == types.CMPeq) { 15749 break 15750 } 15751 v.reset(OpCopy) 15752 v.Type = x.Type 15753 v.AddArg(x) 15754 return true 15755 } 15756 // match: (MOVDreg (MOVDconst [c])) 15757 // cond: 15758 // result: (MOVDconst [c]) 15759 for { 15760 v_0 := v.Args[0] 15761 if v_0.Op != OpS390XMOVDconst { 15762 break 15763 } 15764 c := v_0.AuxInt 15765 v.reset(OpS390XMOVDconst) 15766 v.AuxInt = c 15767 return true 15768 } 15769 // match: (MOVDreg x) 15770 // cond: x.Uses == 1 15771 // result: (MOVDnop x) 15772 for { 15773 x := v.Args[0] 15774 if !(x.Uses == 1) { 15775 break 15776 } 15777 v.reset(OpS390XMOVDnop) 15778 v.AddArg(x) 15779 return true 15780 } 15781 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 15782 // cond: x.Uses == 1 && clobber(x) 15783 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 15784 for { 15785 t := v.Type 15786 x := v.Args[0] 15787 if x.Op != OpS390XMOVBZload { 15788 break 15789 } 15790 off := x.AuxInt 15791 sym := x.Aux 15792 _ = x.Args[1] 15793 ptr := x.Args[0] 15794 mem := x.Args[1] 15795 if !(x.Uses == 1 && clobber(x)) { 15796 break 15797 } 15798 b = x.Block 15799 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 15800 v.reset(OpCopy) 15801 v.AddArg(v0) 15802 v0.AuxInt = off 15803 v0.Aux = sym 15804 v0.AddArg(ptr) 15805 v0.AddArg(mem) 15806 return true 15807 } 15808 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 15809 // cond: x.Uses == 1 && clobber(x) 15810 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 15811 for { 15812 t := v.Type 15813 x := v.Args[0] 15814 if x.Op != OpS390XMOVBload { 15815 break 15816 } 15817 off := x.AuxInt 15818 sym := x.Aux 15819 _ = x.Args[1] 15820 ptr := x.Args[0] 15821 mem := x.Args[1] 15822 if !(x.Uses == 1 && clobber(x)) { 15823 break 15824 } 15825 b = x.Block 15826 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 15827 v.reset(OpCopy) 15828 v.AddArg(v0) 15829 v0.AuxInt = off 15830 v0.Aux = sym 15831 v0.AddArg(ptr) 15832 v0.AddArg(mem) 15833 return true 15834 } 15835 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 15836 // cond: x.Uses == 1 && clobber(x) 15837 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 15838 for { 15839 t := v.Type 15840 x := v.Args[0] 15841 if x.Op != OpS390XMOVHZload { 15842 break 15843 } 15844 off := x.AuxInt 15845 sym := x.Aux 15846 _ = x.Args[1] 15847 ptr := x.Args[0] 15848 mem := x.Args[1] 15849 if !(x.Uses == 1 && clobber(x)) { 15850 break 15851 } 15852 b = x.Block 15853 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 15854 v.reset(OpCopy) 15855 v.AddArg(v0) 15856 v0.AuxInt = off 15857 v0.Aux = sym 15858 v0.AddArg(ptr) 15859 v0.AddArg(mem) 15860 return true 15861 } 15862 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 15863 // cond: x.Uses == 1 && clobber(x) 15864 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 15865 for { 15866 t := v.Type 15867 x := v.Args[0] 15868 if x.Op != OpS390XMOVHload { 15869 break 15870 } 15871 off := x.AuxInt 15872 sym := x.Aux 15873 _ = x.Args[1] 15874 ptr := x.Args[0] 15875 mem := x.Args[1] 15876 if !(x.Uses == 1 && clobber(x)) { 15877 break 15878 } 15879 b = x.Block 15880 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 15881 v.reset(OpCopy) 15882 v.AddArg(v0) 15883 v0.AuxInt = off 15884 v0.Aux = sym 15885 v0.AddArg(ptr) 15886 v0.AddArg(mem) 15887 return true 15888 } 15889 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 15890 // cond: x.Uses == 1 && clobber(x) 15891 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 15892 for { 15893 t := v.Type 15894 x := v.Args[0] 15895 if x.Op != OpS390XMOVWZload { 15896 break 15897 } 15898 off := x.AuxInt 15899 sym := x.Aux 15900 _ = x.Args[1] 15901 ptr := x.Args[0] 15902 mem := x.Args[1] 15903 if !(x.Uses == 1 && clobber(x)) { 15904 break 15905 } 15906 b = x.Block 15907 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 15908 v.reset(OpCopy) 15909 v.AddArg(v0) 15910 v0.AuxInt = off 15911 v0.Aux = sym 15912 v0.AddArg(ptr) 15913 v0.AddArg(mem) 15914 return true 15915 } 15916 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 15917 // cond: x.Uses == 1 && clobber(x) 15918 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 15919 for { 15920 t := v.Type 15921 x := v.Args[0] 15922 if x.Op != OpS390XMOVWload { 15923 break 15924 } 15925 off := x.AuxInt 15926 sym := x.Aux 15927 _ = x.Args[1] 15928 ptr := x.Args[0] 15929 mem := x.Args[1] 15930 if !(x.Uses == 1 && clobber(x)) { 15931 break 15932 } 15933 b = x.Block 15934 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 15935 v.reset(OpCopy) 15936 v.AddArg(v0) 15937 v0.AuxInt = off 15938 v0.Aux = sym 15939 v0.AddArg(ptr) 15940 v0.AddArg(mem) 15941 return true 15942 } 15943 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 15944 // cond: x.Uses == 1 && clobber(x) 15945 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 15946 for { 15947 t := v.Type 15948 x := v.Args[0] 15949 if x.Op != OpS390XMOVDload { 15950 break 15951 } 15952 off := x.AuxInt 15953 sym := x.Aux 15954 _ = x.Args[1] 15955 ptr := x.Args[0] 15956 mem := x.Args[1] 15957 if !(x.Uses == 1 && clobber(x)) { 15958 break 15959 } 15960 b = x.Block 15961 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 15962 v.reset(OpCopy) 15963 v.AddArg(v0) 15964 v0.AuxInt = off 15965 v0.Aux = sym 15966 v0.AddArg(ptr) 15967 v0.AddArg(mem) 15968 return true 15969 } 15970 return false 15971 } 15972 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 15973 b := v.Block 15974 _ = b 15975 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 15976 // cond: x.Uses == 1 && clobber(x) 15977 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 15978 for { 15979 t := v.Type 15980 x := v.Args[0] 15981 if x.Op != OpS390XMOVBZloadidx { 15982 break 15983 } 15984 off := x.AuxInt 15985 sym := x.Aux 15986 _ = x.Args[2] 15987 ptr := x.Args[0] 15988 idx := x.Args[1] 15989 mem := x.Args[2] 15990 if !(x.Uses == 1 && clobber(x)) { 15991 break 15992 } 15993 b = x.Block 15994 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 15995 v.reset(OpCopy) 15996 v.AddArg(v0) 15997 v0.AuxInt = off 15998 v0.Aux = sym 15999 v0.AddArg(ptr) 16000 v0.AddArg(idx) 16001 v0.AddArg(mem) 16002 return true 16003 } 16004 // match: (MOVDreg <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 16005 // cond: x.Uses == 1 && clobber(x) 16006 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 16007 for { 16008 t := v.Type 16009 x := v.Args[0] 16010 if x.Op != OpS390XMOVBloadidx { 16011 break 16012 } 16013 off := x.AuxInt 16014 sym := x.Aux 16015 _ = x.Args[2] 16016 ptr := x.Args[0] 16017 idx := x.Args[1] 16018 mem := x.Args[2] 16019 if !(x.Uses == 1 && clobber(x)) { 16020 break 16021 } 16022 b = x.Block 16023 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 16024 v.reset(OpCopy) 16025 v.AddArg(v0) 16026 v0.AuxInt = off 16027 v0.Aux = sym 16028 v0.AddArg(ptr) 16029 v0.AddArg(idx) 16030 v0.AddArg(mem) 16031 return true 16032 } 16033 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 16034 // cond: x.Uses == 1 && clobber(x) 16035 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 16036 for { 16037 t := v.Type 16038 x := v.Args[0] 16039 if x.Op != OpS390XMOVHZloadidx { 16040 break 16041 } 16042 off := x.AuxInt 16043 sym := x.Aux 16044 _ = x.Args[2] 16045 ptr := x.Args[0] 16046 idx := x.Args[1] 16047 mem := x.Args[2] 16048 if !(x.Uses == 1 && clobber(x)) { 16049 break 16050 } 16051 b = x.Block 16052 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 16053 v.reset(OpCopy) 16054 v.AddArg(v0) 16055 v0.AuxInt = off 16056 v0.Aux = sym 16057 v0.AddArg(ptr) 16058 v0.AddArg(idx) 16059 v0.AddArg(mem) 16060 return true 16061 } 16062 // match: (MOVDreg <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 16063 // cond: x.Uses == 1 && clobber(x) 16064 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 16065 for { 16066 t := v.Type 16067 x := v.Args[0] 16068 if x.Op != OpS390XMOVHloadidx { 16069 break 16070 } 16071 off := x.AuxInt 16072 sym := x.Aux 16073 _ = x.Args[2] 16074 ptr := x.Args[0] 16075 idx := x.Args[1] 16076 mem := x.Args[2] 16077 if !(x.Uses == 1 && clobber(x)) { 16078 break 16079 } 16080 b = x.Block 16081 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 16082 v.reset(OpCopy) 16083 v.AddArg(v0) 16084 v0.AuxInt = off 16085 v0.Aux = sym 16086 v0.AddArg(ptr) 16087 v0.AddArg(idx) 16088 v0.AddArg(mem) 16089 return true 16090 } 16091 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 16092 // cond: x.Uses == 1 && clobber(x) 16093 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 16094 for { 16095 t := v.Type 16096 x := v.Args[0] 16097 if x.Op != OpS390XMOVWZloadidx { 16098 break 16099 } 16100 off := x.AuxInt 16101 sym := x.Aux 16102 _ = x.Args[2] 16103 ptr := x.Args[0] 16104 idx := x.Args[1] 16105 mem := x.Args[2] 16106 if !(x.Uses == 1 && clobber(x)) { 16107 break 16108 } 16109 b = x.Block 16110 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 16111 v.reset(OpCopy) 16112 v.AddArg(v0) 16113 v0.AuxInt = off 16114 v0.Aux = sym 16115 v0.AddArg(ptr) 16116 v0.AddArg(idx) 16117 v0.AddArg(mem) 16118 return true 16119 } 16120 // match: (MOVDreg <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 16121 // cond: x.Uses == 1 && clobber(x) 16122 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 16123 for { 16124 t := v.Type 16125 x := v.Args[0] 16126 if x.Op != OpS390XMOVWloadidx { 16127 break 16128 } 16129 off := x.AuxInt 16130 sym := x.Aux 16131 _ = x.Args[2] 16132 ptr := x.Args[0] 16133 idx := x.Args[1] 16134 mem := x.Args[2] 16135 if !(x.Uses == 1 && clobber(x)) { 16136 break 16137 } 16138 b = x.Block 16139 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 16140 v.reset(OpCopy) 16141 v.AddArg(v0) 16142 v0.AuxInt = off 16143 v0.Aux = sym 16144 v0.AddArg(ptr) 16145 v0.AddArg(idx) 16146 v0.AddArg(mem) 16147 return true 16148 } 16149 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 16150 // cond: x.Uses == 1 && clobber(x) 16151 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 16152 for { 16153 t := v.Type 16154 x := v.Args[0] 16155 if x.Op != OpS390XMOVDloadidx { 16156 break 16157 } 16158 off := x.AuxInt 16159 sym := x.Aux 16160 _ = x.Args[2] 16161 ptr := x.Args[0] 16162 idx := x.Args[1] 16163 mem := x.Args[2] 16164 if !(x.Uses == 1 && clobber(x)) { 16165 break 16166 } 16167 b = x.Block 16168 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 16169 v.reset(OpCopy) 16170 v.AddArg(v0) 16171 v0.AuxInt = off 16172 v0.Aux = sym 16173 v0.AddArg(ptr) 16174 v0.AddArg(idx) 16175 v0.AddArg(mem) 16176 return true 16177 } 16178 return false 16179 } 16180 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 16181 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 16182 // cond: is20Bit(off1+off2) 16183 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 16184 for { 16185 off1 := v.AuxInt 16186 sym := v.Aux 16187 _ = v.Args[2] 16188 v_0 := v.Args[0] 16189 if v_0.Op != OpS390XADDconst { 16190 break 16191 } 16192 off2 := v_0.AuxInt 16193 ptr := v_0.Args[0] 16194 val := v.Args[1] 16195 mem := v.Args[2] 16196 if !(is20Bit(off1 + off2)) { 16197 break 16198 } 16199 v.reset(OpS390XMOVDstore) 16200 v.AuxInt = off1 + off2 16201 v.Aux = sym 16202 v.AddArg(ptr) 16203 v.AddArg(val) 16204 v.AddArg(mem) 16205 return true 16206 } 16207 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 16208 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 16209 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 16210 for { 16211 off := v.AuxInt 16212 sym := v.Aux 16213 _ = v.Args[2] 16214 ptr := v.Args[0] 16215 v_1 := v.Args[1] 16216 if v_1.Op != OpS390XMOVDconst { 16217 break 16218 } 16219 c := v_1.AuxInt 16220 mem := v.Args[2] 16221 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 16222 break 16223 } 16224 v.reset(OpS390XMOVDstoreconst) 16225 v.AuxInt = makeValAndOff(c, off) 16226 v.Aux = sym 16227 v.AddArg(ptr) 16228 v.AddArg(mem) 16229 return true 16230 } 16231 // match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 16232 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 16233 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 16234 for { 16235 off1 := v.AuxInt 16236 sym1 := v.Aux 16237 _ = v.Args[2] 16238 v_0 := v.Args[0] 16239 if v_0.Op != OpS390XMOVDaddr { 16240 break 16241 } 16242 t := v_0.Type 16243 off2 := v_0.AuxInt 16244 sym2 := v_0.Aux 16245 base := v_0.Args[0] 16246 val := v.Args[1] 16247 mem := v.Args[2] 16248 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 16249 break 16250 } 16251 v.reset(OpS390XMOVDstore) 16252 v.AuxInt = off1 + off2 16253 v.Aux = mergeSym(sym1, sym2) 16254 v.AddArg(base) 16255 v.AddArg(val) 16256 v.AddArg(mem) 16257 return true 16258 } 16259 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 16260 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16261 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 16262 for { 16263 off1 := v.AuxInt 16264 sym1 := v.Aux 16265 _ = v.Args[2] 16266 v_0 := v.Args[0] 16267 if v_0.Op != OpS390XMOVDaddridx { 16268 break 16269 } 16270 off2 := v_0.AuxInt 16271 sym2 := v_0.Aux 16272 _ = v_0.Args[1] 16273 ptr := v_0.Args[0] 16274 idx := v_0.Args[1] 16275 val := v.Args[1] 16276 mem := v.Args[2] 16277 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16278 break 16279 } 16280 v.reset(OpS390XMOVDstoreidx) 16281 v.AuxInt = off1 + off2 16282 v.Aux = mergeSym(sym1, sym2) 16283 v.AddArg(ptr) 16284 v.AddArg(idx) 16285 v.AddArg(val) 16286 v.AddArg(mem) 16287 return true 16288 } 16289 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 16290 // cond: ptr.Op != OpSB 16291 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 16292 for { 16293 off := v.AuxInt 16294 sym := v.Aux 16295 _ = v.Args[2] 16296 v_0 := v.Args[0] 16297 if v_0.Op != OpS390XADD { 16298 break 16299 } 16300 _ = v_0.Args[1] 16301 ptr := v_0.Args[0] 16302 idx := v_0.Args[1] 16303 val := v.Args[1] 16304 mem := v.Args[2] 16305 if !(ptr.Op != OpSB) { 16306 break 16307 } 16308 v.reset(OpS390XMOVDstoreidx) 16309 v.AuxInt = off 16310 v.Aux = sym 16311 v.AddArg(ptr) 16312 v.AddArg(idx) 16313 v.AddArg(val) 16314 v.AddArg(mem) 16315 return true 16316 } 16317 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 16318 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 16319 // result: (STMG2 [i-8] {s} p w0 w1 mem) 16320 for { 16321 i := v.AuxInt 16322 s := v.Aux 16323 _ = v.Args[2] 16324 p := v.Args[0] 16325 w1 := v.Args[1] 16326 x := v.Args[2] 16327 if x.Op != OpS390XMOVDstore { 16328 break 16329 } 16330 if x.AuxInt != i-8 { 16331 break 16332 } 16333 if x.Aux != s { 16334 break 16335 } 16336 _ = x.Args[2] 16337 if p != x.Args[0] { 16338 break 16339 } 16340 w0 := x.Args[1] 16341 mem := x.Args[2] 16342 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 16343 break 16344 } 16345 v.reset(OpS390XSTMG2) 16346 v.AuxInt = i - 8 16347 v.Aux = s 16348 v.AddArg(p) 16349 v.AddArg(w0) 16350 v.AddArg(w1) 16351 v.AddArg(mem) 16352 return true 16353 } 16354 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 16355 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 16356 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 16357 for { 16358 i := v.AuxInt 16359 s := v.Aux 16360 _ = v.Args[2] 16361 p := v.Args[0] 16362 w2 := v.Args[1] 16363 x := v.Args[2] 16364 if x.Op != OpS390XSTMG2 { 16365 break 16366 } 16367 if x.AuxInt != i-16 { 16368 break 16369 } 16370 if x.Aux != s { 16371 break 16372 } 16373 _ = x.Args[3] 16374 if p != x.Args[0] { 16375 break 16376 } 16377 w0 := x.Args[1] 16378 w1 := x.Args[2] 16379 mem := x.Args[3] 16380 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 16381 break 16382 } 16383 v.reset(OpS390XSTMG3) 16384 v.AuxInt = i - 16 16385 v.Aux = s 16386 v.AddArg(p) 16387 v.AddArg(w0) 16388 v.AddArg(w1) 16389 v.AddArg(w2) 16390 v.AddArg(mem) 16391 return true 16392 } 16393 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 16394 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 16395 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 16396 for { 16397 i := v.AuxInt 16398 s := v.Aux 16399 _ = v.Args[2] 16400 p := v.Args[0] 16401 w3 := v.Args[1] 16402 x := v.Args[2] 16403 if x.Op != OpS390XSTMG3 { 16404 break 16405 } 16406 if x.AuxInt != i-24 { 16407 break 16408 } 16409 if x.Aux != s { 16410 break 16411 } 16412 _ = x.Args[4] 16413 if p != x.Args[0] { 16414 break 16415 } 16416 w0 := x.Args[1] 16417 w1 := x.Args[2] 16418 w2 := x.Args[3] 16419 mem := x.Args[4] 16420 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 16421 break 16422 } 16423 v.reset(OpS390XSTMG4) 16424 v.AuxInt = i - 24 16425 v.Aux = s 16426 v.AddArg(p) 16427 v.AddArg(w0) 16428 v.AddArg(w1) 16429 v.AddArg(w2) 16430 v.AddArg(w3) 16431 v.AddArg(mem) 16432 return true 16433 } 16434 return false 16435 } 16436 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 16437 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 16438 // cond: isU12Bit(ValAndOff(sc).Off()+off) 16439 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 16440 for { 16441 sc := v.AuxInt 16442 s := v.Aux 16443 _ = v.Args[1] 16444 v_0 := v.Args[0] 16445 if v_0.Op != OpS390XADDconst { 16446 break 16447 } 16448 off := v_0.AuxInt 16449 ptr := v_0.Args[0] 16450 mem := v.Args[1] 16451 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 16452 break 16453 } 16454 v.reset(OpS390XMOVDstoreconst) 16455 v.AuxInt = ValAndOff(sc).add(off) 16456 v.Aux = s 16457 v.AddArg(ptr) 16458 v.AddArg(mem) 16459 return true 16460 } 16461 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 16462 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 16463 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 16464 for { 16465 sc := v.AuxInt 16466 sym1 := v.Aux 16467 _ = v.Args[1] 16468 v_0 := v.Args[0] 16469 if v_0.Op != OpS390XMOVDaddr { 16470 break 16471 } 16472 off := v_0.AuxInt 16473 sym2 := v_0.Aux 16474 ptr := v_0.Args[0] 16475 mem := v.Args[1] 16476 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 16477 break 16478 } 16479 v.reset(OpS390XMOVDstoreconst) 16480 v.AuxInt = ValAndOff(sc).add(off) 16481 v.Aux = mergeSym(sym1, sym2) 16482 v.AddArg(ptr) 16483 v.AddArg(mem) 16484 return true 16485 } 16486 return false 16487 } 16488 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 16489 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 16490 // cond: is20Bit(c+d) 16491 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16492 for { 16493 c := v.AuxInt 16494 sym := v.Aux 16495 _ = v.Args[3] 16496 v_0 := v.Args[0] 16497 if v_0.Op != OpS390XADDconst { 16498 break 16499 } 16500 d := v_0.AuxInt 16501 ptr := v_0.Args[0] 16502 idx := v.Args[1] 16503 val := v.Args[2] 16504 mem := v.Args[3] 16505 if !(is20Bit(c + d)) { 16506 break 16507 } 16508 v.reset(OpS390XMOVDstoreidx) 16509 v.AuxInt = c + d 16510 v.Aux = sym 16511 v.AddArg(ptr) 16512 v.AddArg(idx) 16513 v.AddArg(val) 16514 v.AddArg(mem) 16515 return true 16516 } 16517 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 16518 // cond: is20Bit(c+d) 16519 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16520 for { 16521 c := v.AuxInt 16522 sym := v.Aux 16523 _ = v.Args[3] 16524 idx := v.Args[0] 16525 v_1 := v.Args[1] 16526 if v_1.Op != OpS390XADDconst { 16527 break 16528 } 16529 d := v_1.AuxInt 16530 ptr := v_1.Args[0] 16531 val := v.Args[2] 16532 mem := v.Args[3] 16533 if !(is20Bit(c + d)) { 16534 break 16535 } 16536 v.reset(OpS390XMOVDstoreidx) 16537 v.AuxInt = c + d 16538 v.Aux = sym 16539 v.AddArg(ptr) 16540 v.AddArg(idx) 16541 v.AddArg(val) 16542 v.AddArg(mem) 16543 return true 16544 } 16545 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 16546 // cond: is20Bit(c+d) 16547 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16548 for { 16549 c := v.AuxInt 16550 sym := v.Aux 16551 _ = v.Args[3] 16552 ptr := v.Args[0] 16553 v_1 := v.Args[1] 16554 if v_1.Op != OpS390XADDconst { 16555 break 16556 } 16557 d := v_1.AuxInt 16558 idx := v_1.Args[0] 16559 val := v.Args[2] 16560 mem := v.Args[3] 16561 if !(is20Bit(c + d)) { 16562 break 16563 } 16564 v.reset(OpS390XMOVDstoreidx) 16565 v.AuxInt = c + d 16566 v.Aux = sym 16567 v.AddArg(ptr) 16568 v.AddArg(idx) 16569 v.AddArg(val) 16570 v.AddArg(mem) 16571 return true 16572 } 16573 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 16574 // cond: is20Bit(c+d) 16575 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16576 for { 16577 c := v.AuxInt 16578 sym := v.Aux 16579 _ = v.Args[3] 16580 v_0 := v.Args[0] 16581 if v_0.Op != OpS390XADDconst { 16582 break 16583 } 16584 d := v_0.AuxInt 16585 idx := v_0.Args[0] 16586 ptr := v.Args[1] 16587 val := v.Args[2] 16588 mem := v.Args[3] 16589 if !(is20Bit(c + d)) { 16590 break 16591 } 16592 v.reset(OpS390XMOVDstoreidx) 16593 v.AuxInt = c + d 16594 v.Aux = sym 16595 v.AddArg(ptr) 16596 v.AddArg(idx) 16597 v.AddArg(val) 16598 v.AddArg(mem) 16599 return true 16600 } 16601 return false 16602 } 16603 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 16604 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 16605 // cond: x.Uses == 1 && clobber(x) 16606 // result: (MOVWBRstore [i-2] {s} p w mem) 16607 for { 16608 i := v.AuxInt 16609 s := v.Aux 16610 _ = v.Args[2] 16611 p := v.Args[0] 16612 v_1 := v.Args[1] 16613 if v_1.Op != OpS390XSRDconst { 16614 break 16615 } 16616 if v_1.AuxInt != 16 { 16617 break 16618 } 16619 w := v_1.Args[0] 16620 x := v.Args[2] 16621 if x.Op != OpS390XMOVHBRstore { 16622 break 16623 } 16624 if x.AuxInt != i-2 { 16625 break 16626 } 16627 if x.Aux != s { 16628 break 16629 } 16630 _ = x.Args[2] 16631 if p != x.Args[0] { 16632 break 16633 } 16634 if w != x.Args[1] { 16635 break 16636 } 16637 mem := x.Args[2] 16638 if !(x.Uses == 1 && clobber(x)) { 16639 break 16640 } 16641 v.reset(OpS390XMOVWBRstore) 16642 v.AuxInt = i - 2 16643 v.Aux = s 16644 v.AddArg(p) 16645 v.AddArg(w) 16646 v.AddArg(mem) 16647 return true 16648 } 16649 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 16650 // cond: x.Uses == 1 && clobber(x) 16651 // result: (MOVWBRstore [i-2] {s} p w0 mem) 16652 for { 16653 i := v.AuxInt 16654 s := v.Aux 16655 _ = v.Args[2] 16656 p := v.Args[0] 16657 v_1 := v.Args[1] 16658 if v_1.Op != OpS390XSRDconst { 16659 break 16660 } 16661 j := v_1.AuxInt 16662 w := v_1.Args[0] 16663 x := v.Args[2] 16664 if x.Op != OpS390XMOVHBRstore { 16665 break 16666 } 16667 if x.AuxInt != i-2 { 16668 break 16669 } 16670 if x.Aux != s { 16671 break 16672 } 16673 _ = x.Args[2] 16674 if p != x.Args[0] { 16675 break 16676 } 16677 w0 := x.Args[1] 16678 if w0.Op != OpS390XSRDconst { 16679 break 16680 } 16681 if w0.AuxInt != j-16 { 16682 break 16683 } 16684 if w != w0.Args[0] { 16685 break 16686 } 16687 mem := x.Args[2] 16688 if !(x.Uses == 1 && clobber(x)) { 16689 break 16690 } 16691 v.reset(OpS390XMOVWBRstore) 16692 v.AuxInt = i - 2 16693 v.Aux = s 16694 v.AddArg(p) 16695 v.AddArg(w0) 16696 v.AddArg(mem) 16697 return true 16698 } 16699 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 16700 // cond: x.Uses == 1 && clobber(x) 16701 // result: (MOVWBRstore [i-2] {s} p w mem) 16702 for { 16703 i := v.AuxInt 16704 s := v.Aux 16705 _ = v.Args[2] 16706 p := v.Args[0] 16707 v_1 := v.Args[1] 16708 if v_1.Op != OpS390XSRWconst { 16709 break 16710 } 16711 if v_1.AuxInt != 16 { 16712 break 16713 } 16714 w := v_1.Args[0] 16715 x := v.Args[2] 16716 if x.Op != OpS390XMOVHBRstore { 16717 break 16718 } 16719 if x.AuxInt != i-2 { 16720 break 16721 } 16722 if x.Aux != s { 16723 break 16724 } 16725 _ = x.Args[2] 16726 if p != x.Args[0] { 16727 break 16728 } 16729 if w != x.Args[1] { 16730 break 16731 } 16732 mem := x.Args[2] 16733 if !(x.Uses == 1 && clobber(x)) { 16734 break 16735 } 16736 v.reset(OpS390XMOVWBRstore) 16737 v.AuxInt = i - 2 16738 v.Aux = s 16739 v.AddArg(p) 16740 v.AddArg(w) 16741 v.AddArg(mem) 16742 return true 16743 } 16744 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 16745 // cond: x.Uses == 1 && clobber(x) 16746 // result: (MOVWBRstore [i-2] {s} p w0 mem) 16747 for { 16748 i := v.AuxInt 16749 s := v.Aux 16750 _ = v.Args[2] 16751 p := v.Args[0] 16752 v_1 := v.Args[1] 16753 if v_1.Op != OpS390XSRWconst { 16754 break 16755 } 16756 j := v_1.AuxInt 16757 w := v_1.Args[0] 16758 x := v.Args[2] 16759 if x.Op != OpS390XMOVHBRstore { 16760 break 16761 } 16762 if x.AuxInt != i-2 { 16763 break 16764 } 16765 if x.Aux != s { 16766 break 16767 } 16768 _ = x.Args[2] 16769 if p != x.Args[0] { 16770 break 16771 } 16772 w0 := x.Args[1] 16773 if w0.Op != OpS390XSRWconst { 16774 break 16775 } 16776 if w0.AuxInt != j-16 { 16777 break 16778 } 16779 if w != w0.Args[0] { 16780 break 16781 } 16782 mem := x.Args[2] 16783 if !(x.Uses == 1 && clobber(x)) { 16784 break 16785 } 16786 v.reset(OpS390XMOVWBRstore) 16787 v.AuxInt = i - 2 16788 v.Aux = s 16789 v.AddArg(p) 16790 v.AddArg(w0) 16791 v.AddArg(mem) 16792 return true 16793 } 16794 return false 16795 } 16796 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 16797 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 16798 // cond: x.Uses == 1 && clobber(x) 16799 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16800 for { 16801 i := v.AuxInt 16802 s := v.Aux 16803 _ = v.Args[3] 16804 p := v.Args[0] 16805 idx := v.Args[1] 16806 v_2 := v.Args[2] 16807 if v_2.Op != OpS390XSRDconst { 16808 break 16809 } 16810 if v_2.AuxInt != 16 { 16811 break 16812 } 16813 w := v_2.Args[0] 16814 x := v.Args[3] 16815 if x.Op != OpS390XMOVHBRstoreidx { 16816 break 16817 } 16818 if x.AuxInt != i-2 { 16819 break 16820 } 16821 if x.Aux != s { 16822 break 16823 } 16824 _ = x.Args[3] 16825 if p != x.Args[0] { 16826 break 16827 } 16828 if idx != x.Args[1] { 16829 break 16830 } 16831 if w != x.Args[2] { 16832 break 16833 } 16834 mem := x.Args[3] 16835 if !(x.Uses == 1 && clobber(x)) { 16836 break 16837 } 16838 v.reset(OpS390XMOVWBRstoreidx) 16839 v.AuxInt = i - 2 16840 v.Aux = s 16841 v.AddArg(p) 16842 v.AddArg(idx) 16843 v.AddArg(w) 16844 v.AddArg(mem) 16845 return true 16846 } 16847 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 16848 // cond: x.Uses == 1 && clobber(x) 16849 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16850 for { 16851 i := v.AuxInt 16852 s := v.Aux 16853 _ = v.Args[3] 16854 p := v.Args[0] 16855 idx := v.Args[1] 16856 v_2 := v.Args[2] 16857 if v_2.Op != OpS390XSRDconst { 16858 break 16859 } 16860 if v_2.AuxInt != 16 { 16861 break 16862 } 16863 w := v_2.Args[0] 16864 x := v.Args[3] 16865 if x.Op != OpS390XMOVHBRstoreidx { 16866 break 16867 } 16868 if x.AuxInt != i-2 { 16869 break 16870 } 16871 if x.Aux != s { 16872 break 16873 } 16874 _ = x.Args[3] 16875 if idx != x.Args[0] { 16876 break 16877 } 16878 if p != x.Args[1] { 16879 break 16880 } 16881 if w != x.Args[2] { 16882 break 16883 } 16884 mem := x.Args[3] 16885 if !(x.Uses == 1 && clobber(x)) { 16886 break 16887 } 16888 v.reset(OpS390XMOVWBRstoreidx) 16889 v.AuxInt = i - 2 16890 v.Aux = s 16891 v.AddArg(p) 16892 v.AddArg(idx) 16893 v.AddArg(w) 16894 v.AddArg(mem) 16895 return true 16896 } 16897 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 16898 // cond: x.Uses == 1 && clobber(x) 16899 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16900 for { 16901 i := v.AuxInt 16902 s := v.Aux 16903 _ = v.Args[3] 16904 idx := v.Args[0] 16905 p := v.Args[1] 16906 v_2 := v.Args[2] 16907 if v_2.Op != OpS390XSRDconst { 16908 break 16909 } 16910 if v_2.AuxInt != 16 { 16911 break 16912 } 16913 w := v_2.Args[0] 16914 x := v.Args[3] 16915 if x.Op != OpS390XMOVHBRstoreidx { 16916 break 16917 } 16918 if x.AuxInt != i-2 { 16919 break 16920 } 16921 if x.Aux != s { 16922 break 16923 } 16924 _ = x.Args[3] 16925 if p != x.Args[0] { 16926 break 16927 } 16928 if idx != x.Args[1] { 16929 break 16930 } 16931 if w != x.Args[2] { 16932 break 16933 } 16934 mem := x.Args[3] 16935 if !(x.Uses == 1 && clobber(x)) { 16936 break 16937 } 16938 v.reset(OpS390XMOVWBRstoreidx) 16939 v.AuxInt = i - 2 16940 v.Aux = s 16941 v.AddArg(p) 16942 v.AddArg(idx) 16943 v.AddArg(w) 16944 v.AddArg(mem) 16945 return true 16946 } 16947 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 16948 // cond: x.Uses == 1 && clobber(x) 16949 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16950 for { 16951 i := v.AuxInt 16952 s := v.Aux 16953 _ = v.Args[3] 16954 idx := v.Args[0] 16955 p := v.Args[1] 16956 v_2 := v.Args[2] 16957 if v_2.Op != OpS390XSRDconst { 16958 break 16959 } 16960 if v_2.AuxInt != 16 { 16961 break 16962 } 16963 w := v_2.Args[0] 16964 x := v.Args[3] 16965 if x.Op != OpS390XMOVHBRstoreidx { 16966 break 16967 } 16968 if x.AuxInt != i-2 { 16969 break 16970 } 16971 if x.Aux != s { 16972 break 16973 } 16974 _ = x.Args[3] 16975 if idx != x.Args[0] { 16976 break 16977 } 16978 if p != x.Args[1] { 16979 break 16980 } 16981 if w != x.Args[2] { 16982 break 16983 } 16984 mem := x.Args[3] 16985 if !(x.Uses == 1 && clobber(x)) { 16986 break 16987 } 16988 v.reset(OpS390XMOVWBRstoreidx) 16989 v.AuxInt = i - 2 16990 v.Aux = s 16991 v.AddArg(p) 16992 v.AddArg(idx) 16993 v.AddArg(w) 16994 v.AddArg(mem) 16995 return true 16996 } 16997 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 16998 // cond: x.Uses == 1 && clobber(x) 16999 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17000 for { 17001 i := v.AuxInt 17002 s := v.Aux 17003 _ = v.Args[3] 17004 p := v.Args[0] 17005 idx := v.Args[1] 17006 v_2 := v.Args[2] 17007 if v_2.Op != OpS390XSRDconst { 17008 break 17009 } 17010 j := v_2.AuxInt 17011 w := v_2.Args[0] 17012 x := v.Args[3] 17013 if x.Op != OpS390XMOVHBRstoreidx { 17014 break 17015 } 17016 if x.AuxInt != i-2 { 17017 break 17018 } 17019 if x.Aux != s { 17020 break 17021 } 17022 _ = x.Args[3] 17023 if p != x.Args[0] { 17024 break 17025 } 17026 if idx != x.Args[1] { 17027 break 17028 } 17029 w0 := x.Args[2] 17030 if w0.Op != OpS390XSRDconst { 17031 break 17032 } 17033 if w0.AuxInt != j-16 { 17034 break 17035 } 17036 if w != w0.Args[0] { 17037 break 17038 } 17039 mem := x.Args[3] 17040 if !(x.Uses == 1 && clobber(x)) { 17041 break 17042 } 17043 v.reset(OpS390XMOVWBRstoreidx) 17044 v.AuxInt = i - 2 17045 v.Aux = s 17046 v.AddArg(p) 17047 v.AddArg(idx) 17048 v.AddArg(w0) 17049 v.AddArg(mem) 17050 return true 17051 } 17052 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 17053 // cond: x.Uses == 1 && clobber(x) 17054 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17055 for { 17056 i := v.AuxInt 17057 s := v.Aux 17058 _ = v.Args[3] 17059 p := v.Args[0] 17060 idx := v.Args[1] 17061 v_2 := v.Args[2] 17062 if v_2.Op != OpS390XSRDconst { 17063 break 17064 } 17065 j := v_2.AuxInt 17066 w := v_2.Args[0] 17067 x := v.Args[3] 17068 if x.Op != OpS390XMOVHBRstoreidx { 17069 break 17070 } 17071 if x.AuxInt != i-2 { 17072 break 17073 } 17074 if x.Aux != s { 17075 break 17076 } 17077 _ = x.Args[3] 17078 if idx != x.Args[0] { 17079 break 17080 } 17081 if p != x.Args[1] { 17082 break 17083 } 17084 w0 := x.Args[2] 17085 if w0.Op != OpS390XSRDconst { 17086 break 17087 } 17088 if w0.AuxInt != j-16 { 17089 break 17090 } 17091 if w != w0.Args[0] { 17092 break 17093 } 17094 mem := x.Args[3] 17095 if !(x.Uses == 1 && clobber(x)) { 17096 break 17097 } 17098 v.reset(OpS390XMOVWBRstoreidx) 17099 v.AuxInt = i - 2 17100 v.Aux = s 17101 v.AddArg(p) 17102 v.AddArg(idx) 17103 v.AddArg(w0) 17104 v.AddArg(mem) 17105 return true 17106 } 17107 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 17108 // cond: x.Uses == 1 && clobber(x) 17109 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17110 for { 17111 i := v.AuxInt 17112 s := v.Aux 17113 _ = v.Args[3] 17114 idx := v.Args[0] 17115 p := v.Args[1] 17116 v_2 := v.Args[2] 17117 if v_2.Op != OpS390XSRDconst { 17118 break 17119 } 17120 j := v_2.AuxInt 17121 w := v_2.Args[0] 17122 x := v.Args[3] 17123 if x.Op != OpS390XMOVHBRstoreidx { 17124 break 17125 } 17126 if x.AuxInt != i-2 { 17127 break 17128 } 17129 if x.Aux != s { 17130 break 17131 } 17132 _ = x.Args[3] 17133 if p != x.Args[0] { 17134 break 17135 } 17136 if idx != x.Args[1] { 17137 break 17138 } 17139 w0 := x.Args[2] 17140 if w0.Op != OpS390XSRDconst { 17141 break 17142 } 17143 if w0.AuxInt != j-16 { 17144 break 17145 } 17146 if w != w0.Args[0] { 17147 break 17148 } 17149 mem := x.Args[3] 17150 if !(x.Uses == 1 && clobber(x)) { 17151 break 17152 } 17153 v.reset(OpS390XMOVWBRstoreidx) 17154 v.AuxInt = i - 2 17155 v.Aux = s 17156 v.AddArg(p) 17157 v.AddArg(idx) 17158 v.AddArg(w0) 17159 v.AddArg(mem) 17160 return true 17161 } 17162 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 17163 // cond: x.Uses == 1 && clobber(x) 17164 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17165 for { 17166 i := v.AuxInt 17167 s := v.Aux 17168 _ = v.Args[3] 17169 idx := v.Args[0] 17170 p := v.Args[1] 17171 v_2 := v.Args[2] 17172 if v_2.Op != OpS390XSRDconst { 17173 break 17174 } 17175 j := v_2.AuxInt 17176 w := v_2.Args[0] 17177 x := v.Args[3] 17178 if x.Op != OpS390XMOVHBRstoreidx { 17179 break 17180 } 17181 if x.AuxInt != i-2 { 17182 break 17183 } 17184 if x.Aux != s { 17185 break 17186 } 17187 _ = x.Args[3] 17188 if idx != x.Args[0] { 17189 break 17190 } 17191 if p != x.Args[1] { 17192 break 17193 } 17194 w0 := x.Args[2] 17195 if w0.Op != OpS390XSRDconst { 17196 break 17197 } 17198 if w0.AuxInt != j-16 { 17199 break 17200 } 17201 if w != w0.Args[0] { 17202 break 17203 } 17204 mem := x.Args[3] 17205 if !(x.Uses == 1 && clobber(x)) { 17206 break 17207 } 17208 v.reset(OpS390XMOVWBRstoreidx) 17209 v.AuxInt = i - 2 17210 v.Aux = s 17211 v.AddArg(p) 17212 v.AddArg(idx) 17213 v.AddArg(w0) 17214 v.AddArg(mem) 17215 return true 17216 } 17217 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 17218 // cond: x.Uses == 1 && clobber(x) 17219 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17220 for { 17221 i := v.AuxInt 17222 s := v.Aux 17223 _ = v.Args[3] 17224 p := v.Args[0] 17225 idx := v.Args[1] 17226 v_2 := v.Args[2] 17227 if v_2.Op != OpS390XSRWconst { 17228 break 17229 } 17230 if v_2.AuxInt != 16 { 17231 break 17232 } 17233 w := v_2.Args[0] 17234 x := v.Args[3] 17235 if x.Op != OpS390XMOVHBRstoreidx { 17236 break 17237 } 17238 if x.AuxInt != i-2 { 17239 break 17240 } 17241 if x.Aux != s { 17242 break 17243 } 17244 _ = x.Args[3] 17245 if p != x.Args[0] { 17246 break 17247 } 17248 if idx != x.Args[1] { 17249 break 17250 } 17251 if w != x.Args[2] { 17252 break 17253 } 17254 mem := x.Args[3] 17255 if !(x.Uses == 1 && clobber(x)) { 17256 break 17257 } 17258 v.reset(OpS390XMOVWBRstoreidx) 17259 v.AuxInt = i - 2 17260 v.Aux = s 17261 v.AddArg(p) 17262 v.AddArg(idx) 17263 v.AddArg(w) 17264 v.AddArg(mem) 17265 return true 17266 } 17267 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 17268 // cond: x.Uses == 1 && clobber(x) 17269 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17270 for { 17271 i := v.AuxInt 17272 s := v.Aux 17273 _ = v.Args[3] 17274 p := v.Args[0] 17275 idx := v.Args[1] 17276 v_2 := v.Args[2] 17277 if v_2.Op != OpS390XSRWconst { 17278 break 17279 } 17280 if v_2.AuxInt != 16 { 17281 break 17282 } 17283 w := v_2.Args[0] 17284 x := v.Args[3] 17285 if x.Op != OpS390XMOVHBRstoreidx { 17286 break 17287 } 17288 if x.AuxInt != i-2 { 17289 break 17290 } 17291 if x.Aux != s { 17292 break 17293 } 17294 _ = x.Args[3] 17295 if idx != x.Args[0] { 17296 break 17297 } 17298 if p != x.Args[1] { 17299 break 17300 } 17301 if w != x.Args[2] { 17302 break 17303 } 17304 mem := x.Args[3] 17305 if !(x.Uses == 1 && clobber(x)) { 17306 break 17307 } 17308 v.reset(OpS390XMOVWBRstoreidx) 17309 v.AuxInt = i - 2 17310 v.Aux = s 17311 v.AddArg(p) 17312 v.AddArg(idx) 17313 v.AddArg(w) 17314 v.AddArg(mem) 17315 return true 17316 } 17317 return false 17318 } 17319 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 17320 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 17321 // cond: x.Uses == 1 && clobber(x) 17322 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17323 for { 17324 i := v.AuxInt 17325 s := v.Aux 17326 _ = v.Args[3] 17327 idx := v.Args[0] 17328 p := v.Args[1] 17329 v_2 := v.Args[2] 17330 if v_2.Op != OpS390XSRWconst { 17331 break 17332 } 17333 if v_2.AuxInt != 16 { 17334 break 17335 } 17336 w := v_2.Args[0] 17337 x := v.Args[3] 17338 if x.Op != OpS390XMOVHBRstoreidx { 17339 break 17340 } 17341 if x.AuxInt != i-2 { 17342 break 17343 } 17344 if x.Aux != s { 17345 break 17346 } 17347 _ = x.Args[3] 17348 if p != x.Args[0] { 17349 break 17350 } 17351 if idx != x.Args[1] { 17352 break 17353 } 17354 if w != x.Args[2] { 17355 break 17356 } 17357 mem := x.Args[3] 17358 if !(x.Uses == 1 && clobber(x)) { 17359 break 17360 } 17361 v.reset(OpS390XMOVWBRstoreidx) 17362 v.AuxInt = i - 2 17363 v.Aux = s 17364 v.AddArg(p) 17365 v.AddArg(idx) 17366 v.AddArg(w) 17367 v.AddArg(mem) 17368 return true 17369 } 17370 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 17371 // cond: x.Uses == 1 && clobber(x) 17372 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17373 for { 17374 i := v.AuxInt 17375 s := v.Aux 17376 _ = v.Args[3] 17377 idx := v.Args[0] 17378 p := v.Args[1] 17379 v_2 := v.Args[2] 17380 if v_2.Op != OpS390XSRWconst { 17381 break 17382 } 17383 if v_2.AuxInt != 16 { 17384 break 17385 } 17386 w := v_2.Args[0] 17387 x := v.Args[3] 17388 if x.Op != OpS390XMOVHBRstoreidx { 17389 break 17390 } 17391 if x.AuxInt != i-2 { 17392 break 17393 } 17394 if x.Aux != s { 17395 break 17396 } 17397 _ = x.Args[3] 17398 if idx != x.Args[0] { 17399 break 17400 } 17401 if p != x.Args[1] { 17402 break 17403 } 17404 if w != x.Args[2] { 17405 break 17406 } 17407 mem := x.Args[3] 17408 if !(x.Uses == 1 && clobber(x)) { 17409 break 17410 } 17411 v.reset(OpS390XMOVWBRstoreidx) 17412 v.AuxInt = i - 2 17413 v.Aux = s 17414 v.AddArg(p) 17415 v.AddArg(idx) 17416 v.AddArg(w) 17417 v.AddArg(mem) 17418 return true 17419 } 17420 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 17421 // cond: x.Uses == 1 && clobber(x) 17422 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17423 for { 17424 i := v.AuxInt 17425 s := v.Aux 17426 _ = v.Args[3] 17427 p := v.Args[0] 17428 idx := v.Args[1] 17429 v_2 := v.Args[2] 17430 if v_2.Op != OpS390XSRWconst { 17431 break 17432 } 17433 j := v_2.AuxInt 17434 w := v_2.Args[0] 17435 x := v.Args[3] 17436 if x.Op != OpS390XMOVHBRstoreidx { 17437 break 17438 } 17439 if x.AuxInt != i-2 { 17440 break 17441 } 17442 if x.Aux != s { 17443 break 17444 } 17445 _ = x.Args[3] 17446 if p != x.Args[0] { 17447 break 17448 } 17449 if idx != x.Args[1] { 17450 break 17451 } 17452 w0 := x.Args[2] 17453 if w0.Op != OpS390XSRWconst { 17454 break 17455 } 17456 if w0.AuxInt != j-16 { 17457 break 17458 } 17459 if w != w0.Args[0] { 17460 break 17461 } 17462 mem := x.Args[3] 17463 if !(x.Uses == 1 && clobber(x)) { 17464 break 17465 } 17466 v.reset(OpS390XMOVWBRstoreidx) 17467 v.AuxInt = i - 2 17468 v.Aux = s 17469 v.AddArg(p) 17470 v.AddArg(idx) 17471 v.AddArg(w0) 17472 v.AddArg(mem) 17473 return true 17474 } 17475 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 17476 // cond: x.Uses == 1 && clobber(x) 17477 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17478 for { 17479 i := v.AuxInt 17480 s := v.Aux 17481 _ = v.Args[3] 17482 p := v.Args[0] 17483 idx := v.Args[1] 17484 v_2 := v.Args[2] 17485 if v_2.Op != OpS390XSRWconst { 17486 break 17487 } 17488 j := v_2.AuxInt 17489 w := v_2.Args[0] 17490 x := v.Args[3] 17491 if x.Op != OpS390XMOVHBRstoreidx { 17492 break 17493 } 17494 if x.AuxInt != i-2 { 17495 break 17496 } 17497 if x.Aux != s { 17498 break 17499 } 17500 _ = x.Args[3] 17501 if idx != x.Args[0] { 17502 break 17503 } 17504 if p != x.Args[1] { 17505 break 17506 } 17507 w0 := x.Args[2] 17508 if w0.Op != OpS390XSRWconst { 17509 break 17510 } 17511 if w0.AuxInt != j-16 { 17512 break 17513 } 17514 if w != w0.Args[0] { 17515 break 17516 } 17517 mem := x.Args[3] 17518 if !(x.Uses == 1 && clobber(x)) { 17519 break 17520 } 17521 v.reset(OpS390XMOVWBRstoreidx) 17522 v.AuxInt = i - 2 17523 v.Aux = s 17524 v.AddArg(p) 17525 v.AddArg(idx) 17526 v.AddArg(w0) 17527 v.AddArg(mem) 17528 return true 17529 } 17530 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 17531 // cond: x.Uses == 1 && clobber(x) 17532 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17533 for { 17534 i := v.AuxInt 17535 s := v.Aux 17536 _ = v.Args[3] 17537 idx := v.Args[0] 17538 p := v.Args[1] 17539 v_2 := v.Args[2] 17540 if v_2.Op != OpS390XSRWconst { 17541 break 17542 } 17543 j := v_2.AuxInt 17544 w := v_2.Args[0] 17545 x := v.Args[3] 17546 if x.Op != OpS390XMOVHBRstoreidx { 17547 break 17548 } 17549 if x.AuxInt != i-2 { 17550 break 17551 } 17552 if x.Aux != s { 17553 break 17554 } 17555 _ = x.Args[3] 17556 if p != x.Args[0] { 17557 break 17558 } 17559 if idx != x.Args[1] { 17560 break 17561 } 17562 w0 := x.Args[2] 17563 if w0.Op != OpS390XSRWconst { 17564 break 17565 } 17566 if w0.AuxInt != j-16 { 17567 break 17568 } 17569 if w != w0.Args[0] { 17570 break 17571 } 17572 mem := x.Args[3] 17573 if !(x.Uses == 1 && clobber(x)) { 17574 break 17575 } 17576 v.reset(OpS390XMOVWBRstoreidx) 17577 v.AuxInt = i - 2 17578 v.Aux = s 17579 v.AddArg(p) 17580 v.AddArg(idx) 17581 v.AddArg(w0) 17582 v.AddArg(mem) 17583 return true 17584 } 17585 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 17586 // cond: x.Uses == 1 && clobber(x) 17587 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17588 for { 17589 i := v.AuxInt 17590 s := v.Aux 17591 _ = v.Args[3] 17592 idx := v.Args[0] 17593 p := v.Args[1] 17594 v_2 := v.Args[2] 17595 if v_2.Op != OpS390XSRWconst { 17596 break 17597 } 17598 j := v_2.AuxInt 17599 w := v_2.Args[0] 17600 x := v.Args[3] 17601 if x.Op != OpS390XMOVHBRstoreidx { 17602 break 17603 } 17604 if x.AuxInt != i-2 { 17605 break 17606 } 17607 if x.Aux != s { 17608 break 17609 } 17610 _ = x.Args[3] 17611 if idx != x.Args[0] { 17612 break 17613 } 17614 if p != x.Args[1] { 17615 break 17616 } 17617 w0 := x.Args[2] 17618 if w0.Op != OpS390XSRWconst { 17619 break 17620 } 17621 if w0.AuxInt != j-16 { 17622 break 17623 } 17624 if w != w0.Args[0] { 17625 break 17626 } 17627 mem := x.Args[3] 17628 if !(x.Uses == 1 && clobber(x)) { 17629 break 17630 } 17631 v.reset(OpS390XMOVWBRstoreidx) 17632 v.AuxInt = i - 2 17633 v.Aux = s 17634 v.AddArg(p) 17635 v.AddArg(idx) 17636 v.AddArg(w0) 17637 v.AddArg(mem) 17638 return true 17639 } 17640 return false 17641 } 17642 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 17643 // match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 17644 // cond: isSamePtr(ptr1, ptr2) 17645 // result: (MOVHZreg x) 17646 for { 17647 off := v.AuxInt 17648 sym := v.Aux 17649 _ = v.Args[1] 17650 ptr1 := v.Args[0] 17651 v_1 := v.Args[1] 17652 if v_1.Op != OpS390XMOVHstore { 17653 break 17654 } 17655 if v_1.AuxInt != off { 17656 break 17657 } 17658 if v_1.Aux != sym { 17659 break 17660 } 17661 _ = v_1.Args[2] 17662 ptr2 := v_1.Args[0] 17663 x := v_1.Args[1] 17664 if !(isSamePtr(ptr1, ptr2)) { 17665 break 17666 } 17667 v.reset(OpS390XMOVHZreg) 17668 v.AddArg(x) 17669 return true 17670 } 17671 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 17672 // cond: is20Bit(off1+off2) 17673 // result: (MOVHZload [off1+off2] {sym} ptr mem) 17674 for { 17675 off1 := v.AuxInt 17676 sym := v.Aux 17677 _ = v.Args[1] 17678 v_0 := v.Args[0] 17679 if v_0.Op != OpS390XADDconst { 17680 break 17681 } 17682 off2 := v_0.AuxInt 17683 ptr := v_0.Args[0] 17684 mem := v.Args[1] 17685 if !(is20Bit(off1 + off2)) { 17686 break 17687 } 17688 v.reset(OpS390XMOVHZload) 17689 v.AuxInt = off1 + off2 17690 v.Aux = sym 17691 v.AddArg(ptr) 17692 v.AddArg(mem) 17693 return true 17694 } 17695 // match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17696 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 17697 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17698 for { 17699 off1 := v.AuxInt 17700 sym1 := v.Aux 17701 _ = v.Args[1] 17702 v_0 := v.Args[0] 17703 if v_0.Op != OpS390XMOVDaddr { 17704 break 17705 } 17706 t := v_0.Type 17707 off2 := v_0.AuxInt 17708 sym2 := v_0.Aux 17709 base := v_0.Args[0] 17710 mem := v.Args[1] 17711 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 17712 break 17713 } 17714 v.reset(OpS390XMOVHZload) 17715 v.AuxInt = off1 + off2 17716 v.Aux = mergeSym(sym1, sym2) 17717 v.AddArg(base) 17718 v.AddArg(mem) 17719 return true 17720 } 17721 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 17722 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17723 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 17724 for { 17725 off1 := v.AuxInt 17726 sym1 := v.Aux 17727 _ = v.Args[1] 17728 v_0 := v.Args[0] 17729 if v_0.Op != OpS390XMOVDaddridx { 17730 break 17731 } 17732 off2 := v_0.AuxInt 17733 sym2 := v_0.Aux 17734 _ = v_0.Args[1] 17735 ptr := v_0.Args[0] 17736 idx := v_0.Args[1] 17737 mem := v.Args[1] 17738 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17739 break 17740 } 17741 v.reset(OpS390XMOVHZloadidx) 17742 v.AuxInt = off1 + off2 17743 v.Aux = mergeSym(sym1, sym2) 17744 v.AddArg(ptr) 17745 v.AddArg(idx) 17746 v.AddArg(mem) 17747 return true 17748 } 17749 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 17750 // cond: ptr.Op != OpSB 17751 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 17752 for { 17753 off := v.AuxInt 17754 sym := v.Aux 17755 _ = v.Args[1] 17756 v_0 := v.Args[0] 17757 if v_0.Op != OpS390XADD { 17758 break 17759 } 17760 _ = v_0.Args[1] 17761 ptr := v_0.Args[0] 17762 idx := v_0.Args[1] 17763 mem := v.Args[1] 17764 if !(ptr.Op != OpSB) { 17765 break 17766 } 17767 v.reset(OpS390XMOVHZloadidx) 17768 v.AuxInt = off 17769 v.Aux = sym 17770 v.AddArg(ptr) 17771 v.AddArg(idx) 17772 v.AddArg(mem) 17773 return true 17774 } 17775 return false 17776 } 17777 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 17778 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 17779 // cond: is20Bit(c+d) 17780 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17781 for { 17782 c := v.AuxInt 17783 sym := v.Aux 17784 _ = v.Args[2] 17785 v_0 := v.Args[0] 17786 if v_0.Op != OpS390XADDconst { 17787 break 17788 } 17789 d := v_0.AuxInt 17790 ptr := v_0.Args[0] 17791 idx := v.Args[1] 17792 mem := v.Args[2] 17793 if !(is20Bit(c + d)) { 17794 break 17795 } 17796 v.reset(OpS390XMOVHZloadidx) 17797 v.AuxInt = c + d 17798 v.Aux = sym 17799 v.AddArg(ptr) 17800 v.AddArg(idx) 17801 v.AddArg(mem) 17802 return true 17803 } 17804 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 17805 // cond: is20Bit(c+d) 17806 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17807 for { 17808 c := v.AuxInt 17809 sym := v.Aux 17810 _ = v.Args[2] 17811 idx := v.Args[0] 17812 v_1 := v.Args[1] 17813 if v_1.Op != OpS390XADDconst { 17814 break 17815 } 17816 d := v_1.AuxInt 17817 ptr := v_1.Args[0] 17818 mem := v.Args[2] 17819 if !(is20Bit(c + d)) { 17820 break 17821 } 17822 v.reset(OpS390XMOVHZloadidx) 17823 v.AuxInt = c + d 17824 v.Aux = sym 17825 v.AddArg(ptr) 17826 v.AddArg(idx) 17827 v.AddArg(mem) 17828 return true 17829 } 17830 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 17831 // cond: is20Bit(c+d) 17832 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17833 for { 17834 c := v.AuxInt 17835 sym := v.Aux 17836 _ = v.Args[2] 17837 ptr := v.Args[0] 17838 v_1 := v.Args[1] 17839 if v_1.Op != OpS390XADDconst { 17840 break 17841 } 17842 d := v_1.AuxInt 17843 idx := v_1.Args[0] 17844 mem := v.Args[2] 17845 if !(is20Bit(c + d)) { 17846 break 17847 } 17848 v.reset(OpS390XMOVHZloadidx) 17849 v.AuxInt = c + d 17850 v.Aux = sym 17851 v.AddArg(ptr) 17852 v.AddArg(idx) 17853 v.AddArg(mem) 17854 return true 17855 } 17856 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 17857 // cond: is20Bit(c+d) 17858 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17859 for { 17860 c := v.AuxInt 17861 sym := v.Aux 17862 _ = v.Args[2] 17863 v_0 := v.Args[0] 17864 if v_0.Op != OpS390XADDconst { 17865 break 17866 } 17867 d := v_0.AuxInt 17868 idx := v_0.Args[0] 17869 ptr := v.Args[1] 17870 mem := v.Args[2] 17871 if !(is20Bit(c + d)) { 17872 break 17873 } 17874 v.reset(OpS390XMOVHZloadidx) 17875 v.AuxInt = c + d 17876 v.Aux = sym 17877 v.AddArg(ptr) 17878 v.AddArg(idx) 17879 v.AddArg(mem) 17880 return true 17881 } 17882 return false 17883 } 17884 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 17885 b := v.Block 17886 _ = b 17887 // match: (MOVHZreg x:(MOVBZload _ _)) 17888 // cond: 17889 // result: (MOVDreg x) 17890 for { 17891 x := v.Args[0] 17892 if x.Op != OpS390XMOVBZload { 17893 break 17894 } 17895 _ = x.Args[1] 17896 v.reset(OpS390XMOVDreg) 17897 v.AddArg(x) 17898 return true 17899 } 17900 // match: (MOVHZreg x:(MOVHZload _ _)) 17901 // cond: 17902 // result: (MOVDreg x) 17903 for { 17904 x := v.Args[0] 17905 if x.Op != OpS390XMOVHZload { 17906 break 17907 } 17908 _ = x.Args[1] 17909 v.reset(OpS390XMOVDreg) 17910 v.AddArg(x) 17911 return true 17912 } 17913 // match: (MOVHZreg x:(Arg <t>)) 17914 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 17915 // result: (MOVDreg x) 17916 for { 17917 x := v.Args[0] 17918 if x.Op != OpArg { 17919 break 17920 } 17921 t := x.Type 17922 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 17923 break 17924 } 17925 v.reset(OpS390XMOVDreg) 17926 v.AddArg(x) 17927 return true 17928 } 17929 // match: (MOVHZreg x:(MOVBZreg _)) 17930 // cond: 17931 // result: (MOVDreg x) 17932 for { 17933 x := v.Args[0] 17934 if x.Op != OpS390XMOVBZreg { 17935 break 17936 } 17937 v.reset(OpS390XMOVDreg) 17938 v.AddArg(x) 17939 return true 17940 } 17941 // match: (MOVHZreg x:(MOVHZreg _)) 17942 // cond: 17943 // result: (MOVDreg x) 17944 for { 17945 x := v.Args[0] 17946 if x.Op != OpS390XMOVHZreg { 17947 break 17948 } 17949 v.reset(OpS390XMOVDreg) 17950 v.AddArg(x) 17951 return true 17952 } 17953 // match: (MOVHZreg (MOVHreg x)) 17954 // cond: 17955 // result: (MOVHZreg x) 17956 for { 17957 v_0 := v.Args[0] 17958 if v_0.Op != OpS390XMOVHreg { 17959 break 17960 } 17961 x := v_0.Args[0] 17962 v.reset(OpS390XMOVHZreg) 17963 v.AddArg(x) 17964 return true 17965 } 17966 // match: (MOVHZreg (MOVDconst [c])) 17967 // cond: 17968 // result: (MOVDconst [int64(uint16(c))]) 17969 for { 17970 v_0 := v.Args[0] 17971 if v_0.Op != OpS390XMOVDconst { 17972 break 17973 } 17974 c := v_0.AuxInt 17975 v.reset(OpS390XMOVDconst) 17976 v.AuxInt = int64(uint16(c)) 17977 return true 17978 } 17979 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 17980 // cond: x.Uses == 1 && clobber(x) 17981 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 17982 for { 17983 x := v.Args[0] 17984 if x.Op != OpS390XMOVHZload { 17985 break 17986 } 17987 off := x.AuxInt 17988 sym := x.Aux 17989 _ = x.Args[1] 17990 ptr := x.Args[0] 17991 mem := x.Args[1] 17992 if !(x.Uses == 1 && clobber(x)) { 17993 break 17994 } 17995 b = x.Block 17996 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 17997 v.reset(OpCopy) 17998 v.AddArg(v0) 17999 v0.AuxInt = off 18000 v0.Aux = sym 18001 v0.AddArg(ptr) 18002 v0.AddArg(mem) 18003 return true 18004 } 18005 // match: (MOVHZreg x:(MOVHload [off] {sym} ptr mem)) 18006 // cond: x.Uses == 1 && clobber(x) 18007 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 18008 for { 18009 x := v.Args[0] 18010 if x.Op != OpS390XMOVHload { 18011 break 18012 } 18013 off := x.AuxInt 18014 sym := x.Aux 18015 _ = x.Args[1] 18016 ptr := x.Args[0] 18017 mem := x.Args[1] 18018 if !(x.Uses == 1 && clobber(x)) { 18019 break 18020 } 18021 b = x.Block 18022 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 18023 v.reset(OpCopy) 18024 v.AddArg(v0) 18025 v0.AuxInt = off 18026 v0.Aux = sym 18027 v0.AddArg(ptr) 18028 v0.AddArg(mem) 18029 return true 18030 } 18031 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 18032 // cond: x.Uses == 1 && clobber(x) 18033 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 18034 for { 18035 x := v.Args[0] 18036 if x.Op != OpS390XMOVHZloadidx { 18037 break 18038 } 18039 off := x.AuxInt 18040 sym := x.Aux 18041 _ = x.Args[2] 18042 ptr := x.Args[0] 18043 idx := x.Args[1] 18044 mem := x.Args[2] 18045 if !(x.Uses == 1 && clobber(x)) { 18046 break 18047 } 18048 b = x.Block 18049 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 18050 v.reset(OpCopy) 18051 v.AddArg(v0) 18052 v0.AuxInt = off 18053 v0.Aux = sym 18054 v0.AddArg(ptr) 18055 v0.AddArg(idx) 18056 v0.AddArg(mem) 18057 return true 18058 } 18059 return false 18060 } 18061 func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { 18062 b := v.Block 18063 _ = b 18064 typ := &b.Func.Config.Types 18065 _ = typ 18066 // match: (MOVHZreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 18067 // cond: x.Uses == 1 && clobber(x) 18068 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 18069 for { 18070 x := v.Args[0] 18071 if x.Op != OpS390XMOVHloadidx { 18072 break 18073 } 18074 off := x.AuxInt 18075 sym := x.Aux 18076 _ = x.Args[2] 18077 ptr := x.Args[0] 18078 idx := x.Args[1] 18079 mem := x.Args[2] 18080 if !(x.Uses == 1 && clobber(x)) { 18081 break 18082 } 18083 b = x.Block 18084 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 18085 v.reset(OpCopy) 18086 v.AddArg(v0) 18087 v0.AuxInt = off 18088 v0.Aux = sym 18089 v0.AddArg(ptr) 18090 v0.AddArg(idx) 18091 v0.AddArg(mem) 18092 return true 18093 } 18094 // match: (MOVHZreg (ANDWconst [m] x)) 18095 // cond: 18096 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(uint16(m))] x)) 18097 for { 18098 v_0 := v.Args[0] 18099 if v_0.Op != OpS390XANDWconst { 18100 break 18101 } 18102 m := v_0.AuxInt 18103 x := v_0.Args[0] 18104 v.reset(OpS390XMOVWZreg) 18105 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 18106 v0.AuxInt = int64(uint16(m)) 18107 v0.AddArg(x) 18108 v.AddArg(v0) 18109 return true 18110 } 18111 return false 18112 } 18113 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 18114 // match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 18115 // cond: isSamePtr(ptr1, ptr2) 18116 // result: (MOVHreg x) 18117 for { 18118 off := v.AuxInt 18119 sym := v.Aux 18120 _ = v.Args[1] 18121 ptr1 := v.Args[0] 18122 v_1 := v.Args[1] 18123 if v_1.Op != OpS390XMOVHstore { 18124 break 18125 } 18126 if v_1.AuxInt != off { 18127 break 18128 } 18129 if v_1.Aux != sym { 18130 break 18131 } 18132 _ = v_1.Args[2] 18133 ptr2 := v_1.Args[0] 18134 x := v_1.Args[1] 18135 if !(isSamePtr(ptr1, ptr2)) { 18136 break 18137 } 18138 v.reset(OpS390XMOVHreg) 18139 v.AddArg(x) 18140 return true 18141 } 18142 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 18143 // cond: is20Bit(off1+off2) 18144 // result: (MOVHload [off1+off2] {sym} ptr mem) 18145 for { 18146 off1 := v.AuxInt 18147 sym := v.Aux 18148 _ = v.Args[1] 18149 v_0 := v.Args[0] 18150 if v_0.Op != OpS390XADDconst { 18151 break 18152 } 18153 off2 := v_0.AuxInt 18154 ptr := v_0.Args[0] 18155 mem := v.Args[1] 18156 if !(is20Bit(off1 + off2)) { 18157 break 18158 } 18159 v.reset(OpS390XMOVHload) 18160 v.AuxInt = off1 + off2 18161 v.Aux = sym 18162 v.AddArg(ptr) 18163 v.AddArg(mem) 18164 return true 18165 } 18166 // match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 18167 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 18168 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 18169 for { 18170 off1 := v.AuxInt 18171 sym1 := v.Aux 18172 _ = v.Args[1] 18173 v_0 := v.Args[0] 18174 if v_0.Op != OpS390XMOVDaddr { 18175 break 18176 } 18177 t := v_0.Type 18178 off2 := v_0.AuxInt 18179 sym2 := v_0.Aux 18180 base := v_0.Args[0] 18181 mem := v.Args[1] 18182 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 18183 break 18184 } 18185 v.reset(OpS390XMOVHload) 18186 v.AuxInt = off1 + off2 18187 v.Aux = mergeSym(sym1, sym2) 18188 v.AddArg(base) 18189 v.AddArg(mem) 18190 return true 18191 } 18192 // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 18193 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 18194 // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 18195 for { 18196 off1 := v.AuxInt 18197 sym1 := v.Aux 18198 _ = v.Args[1] 18199 v_0 := v.Args[0] 18200 if v_0.Op != OpS390XMOVDaddridx { 18201 break 18202 } 18203 off2 := v_0.AuxInt 18204 sym2 := v_0.Aux 18205 _ = v_0.Args[1] 18206 ptr := v_0.Args[0] 18207 idx := v_0.Args[1] 18208 mem := v.Args[1] 18209 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 18210 break 18211 } 18212 v.reset(OpS390XMOVHloadidx) 18213 v.AuxInt = off1 + off2 18214 v.Aux = mergeSym(sym1, sym2) 18215 v.AddArg(ptr) 18216 v.AddArg(idx) 18217 v.AddArg(mem) 18218 return true 18219 } 18220 // match: (MOVHload [off] {sym} (ADD ptr idx) mem) 18221 // cond: ptr.Op != OpSB 18222 // result: (MOVHloadidx [off] {sym} ptr idx mem) 18223 for { 18224 off := v.AuxInt 18225 sym := v.Aux 18226 _ = v.Args[1] 18227 v_0 := v.Args[0] 18228 if v_0.Op != OpS390XADD { 18229 break 18230 } 18231 _ = v_0.Args[1] 18232 ptr := v_0.Args[0] 18233 idx := v_0.Args[1] 18234 mem := v.Args[1] 18235 if !(ptr.Op != OpSB) { 18236 break 18237 } 18238 v.reset(OpS390XMOVHloadidx) 18239 v.AuxInt = off 18240 v.Aux = sym 18241 v.AddArg(ptr) 18242 v.AddArg(idx) 18243 v.AddArg(mem) 18244 return true 18245 } 18246 return false 18247 } 18248 func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { 18249 // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 18250 // cond: is20Bit(c+d) 18251 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18252 for { 18253 c := v.AuxInt 18254 sym := v.Aux 18255 _ = v.Args[2] 18256 v_0 := v.Args[0] 18257 if v_0.Op != OpS390XADDconst { 18258 break 18259 } 18260 d := v_0.AuxInt 18261 ptr := v_0.Args[0] 18262 idx := v.Args[1] 18263 mem := v.Args[2] 18264 if !(is20Bit(c + d)) { 18265 break 18266 } 18267 v.reset(OpS390XMOVHloadidx) 18268 v.AuxInt = c + d 18269 v.Aux = sym 18270 v.AddArg(ptr) 18271 v.AddArg(idx) 18272 v.AddArg(mem) 18273 return true 18274 } 18275 // match: (MOVHloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 18276 // cond: is20Bit(c+d) 18277 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18278 for { 18279 c := v.AuxInt 18280 sym := v.Aux 18281 _ = v.Args[2] 18282 idx := v.Args[0] 18283 v_1 := v.Args[1] 18284 if v_1.Op != OpS390XADDconst { 18285 break 18286 } 18287 d := v_1.AuxInt 18288 ptr := v_1.Args[0] 18289 mem := v.Args[2] 18290 if !(is20Bit(c + d)) { 18291 break 18292 } 18293 v.reset(OpS390XMOVHloadidx) 18294 v.AuxInt = c + d 18295 v.Aux = sym 18296 v.AddArg(ptr) 18297 v.AddArg(idx) 18298 v.AddArg(mem) 18299 return true 18300 } 18301 // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 18302 // cond: is20Bit(c+d) 18303 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18304 for { 18305 c := v.AuxInt 18306 sym := v.Aux 18307 _ = v.Args[2] 18308 ptr := v.Args[0] 18309 v_1 := v.Args[1] 18310 if v_1.Op != OpS390XADDconst { 18311 break 18312 } 18313 d := v_1.AuxInt 18314 idx := v_1.Args[0] 18315 mem := v.Args[2] 18316 if !(is20Bit(c + d)) { 18317 break 18318 } 18319 v.reset(OpS390XMOVHloadidx) 18320 v.AuxInt = c + d 18321 v.Aux = sym 18322 v.AddArg(ptr) 18323 v.AddArg(idx) 18324 v.AddArg(mem) 18325 return true 18326 } 18327 // match: (MOVHloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 18328 // cond: is20Bit(c+d) 18329 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18330 for { 18331 c := v.AuxInt 18332 sym := v.Aux 18333 _ = v.Args[2] 18334 v_0 := v.Args[0] 18335 if v_0.Op != OpS390XADDconst { 18336 break 18337 } 18338 d := v_0.AuxInt 18339 idx := v_0.Args[0] 18340 ptr := v.Args[1] 18341 mem := v.Args[2] 18342 if !(is20Bit(c + d)) { 18343 break 18344 } 18345 v.reset(OpS390XMOVHloadidx) 18346 v.AuxInt = c + d 18347 v.Aux = sym 18348 v.AddArg(ptr) 18349 v.AddArg(idx) 18350 v.AddArg(mem) 18351 return true 18352 } 18353 return false 18354 } 18355 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 18356 b := v.Block 18357 _ = b 18358 // match: (MOVHreg x:(MOVBload _ _)) 18359 // cond: 18360 // result: (MOVDreg x) 18361 for { 18362 x := v.Args[0] 18363 if x.Op != OpS390XMOVBload { 18364 break 18365 } 18366 _ = x.Args[1] 18367 v.reset(OpS390XMOVDreg) 18368 v.AddArg(x) 18369 return true 18370 } 18371 // match: (MOVHreg x:(MOVBZload _ _)) 18372 // cond: 18373 // result: (MOVDreg x) 18374 for { 18375 x := v.Args[0] 18376 if x.Op != OpS390XMOVBZload { 18377 break 18378 } 18379 _ = x.Args[1] 18380 v.reset(OpS390XMOVDreg) 18381 v.AddArg(x) 18382 return true 18383 } 18384 // match: (MOVHreg x:(MOVHload _ _)) 18385 // cond: 18386 // result: (MOVDreg x) 18387 for { 18388 x := v.Args[0] 18389 if x.Op != OpS390XMOVHload { 18390 break 18391 } 18392 _ = x.Args[1] 18393 v.reset(OpS390XMOVDreg) 18394 v.AddArg(x) 18395 return true 18396 } 18397 // match: (MOVHreg x:(Arg <t>)) 18398 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 18399 // result: (MOVDreg x) 18400 for { 18401 x := v.Args[0] 18402 if x.Op != OpArg { 18403 break 18404 } 18405 t := x.Type 18406 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 18407 break 18408 } 18409 v.reset(OpS390XMOVDreg) 18410 v.AddArg(x) 18411 return true 18412 } 18413 // match: (MOVHreg x:(MOVBreg _)) 18414 // cond: 18415 // result: (MOVDreg x) 18416 for { 18417 x := v.Args[0] 18418 if x.Op != OpS390XMOVBreg { 18419 break 18420 } 18421 v.reset(OpS390XMOVDreg) 18422 v.AddArg(x) 18423 return true 18424 } 18425 // match: (MOVHreg x:(MOVBZreg _)) 18426 // cond: 18427 // result: (MOVDreg x) 18428 for { 18429 x := v.Args[0] 18430 if x.Op != OpS390XMOVBZreg { 18431 break 18432 } 18433 v.reset(OpS390XMOVDreg) 18434 v.AddArg(x) 18435 return true 18436 } 18437 // match: (MOVHreg x:(MOVHreg _)) 18438 // cond: 18439 // result: (MOVDreg x) 18440 for { 18441 x := v.Args[0] 18442 if x.Op != OpS390XMOVHreg { 18443 break 18444 } 18445 v.reset(OpS390XMOVDreg) 18446 v.AddArg(x) 18447 return true 18448 } 18449 // match: (MOVHreg (MOVHZreg x)) 18450 // cond: 18451 // result: (MOVHreg x) 18452 for { 18453 v_0 := v.Args[0] 18454 if v_0.Op != OpS390XMOVHZreg { 18455 break 18456 } 18457 x := v_0.Args[0] 18458 v.reset(OpS390XMOVHreg) 18459 v.AddArg(x) 18460 return true 18461 } 18462 // match: (MOVHreg (MOVDconst [c])) 18463 // cond: 18464 // result: (MOVDconst [int64(int16(c))]) 18465 for { 18466 v_0 := v.Args[0] 18467 if v_0.Op != OpS390XMOVDconst { 18468 break 18469 } 18470 c := v_0.AuxInt 18471 v.reset(OpS390XMOVDconst) 18472 v.AuxInt = int64(int16(c)) 18473 return true 18474 } 18475 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 18476 // cond: x.Uses == 1 && clobber(x) 18477 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 18478 for { 18479 x := v.Args[0] 18480 if x.Op != OpS390XMOVHZload { 18481 break 18482 } 18483 off := x.AuxInt 18484 sym := x.Aux 18485 _ = x.Args[1] 18486 ptr := x.Args[0] 18487 mem := x.Args[1] 18488 if !(x.Uses == 1 && clobber(x)) { 18489 break 18490 } 18491 b = x.Block 18492 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 18493 v.reset(OpCopy) 18494 v.AddArg(v0) 18495 v0.AuxInt = off 18496 v0.Aux = sym 18497 v0.AddArg(ptr) 18498 v0.AddArg(mem) 18499 return true 18500 } 18501 return false 18502 } 18503 func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { 18504 b := v.Block 18505 _ = b 18506 typ := &b.Func.Config.Types 18507 _ = typ 18508 // match: (MOVHreg x:(MOVHload [off] {sym} ptr mem)) 18509 // cond: x.Uses == 1 && clobber(x) 18510 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 18511 for { 18512 x := v.Args[0] 18513 if x.Op != OpS390XMOVHload { 18514 break 18515 } 18516 off := x.AuxInt 18517 sym := x.Aux 18518 _ = x.Args[1] 18519 ptr := x.Args[0] 18520 mem := x.Args[1] 18521 if !(x.Uses == 1 && clobber(x)) { 18522 break 18523 } 18524 b = x.Block 18525 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 18526 v.reset(OpCopy) 18527 v.AddArg(v0) 18528 v0.AuxInt = off 18529 v0.Aux = sym 18530 v0.AddArg(ptr) 18531 v0.AddArg(mem) 18532 return true 18533 } 18534 // match: (MOVHreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 18535 // cond: x.Uses == 1 && clobber(x) 18536 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 18537 for { 18538 x := v.Args[0] 18539 if x.Op != OpS390XMOVHZloadidx { 18540 break 18541 } 18542 off := x.AuxInt 18543 sym := x.Aux 18544 _ = x.Args[2] 18545 ptr := x.Args[0] 18546 idx := x.Args[1] 18547 mem := x.Args[2] 18548 if !(x.Uses == 1 && clobber(x)) { 18549 break 18550 } 18551 b = x.Block 18552 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 18553 v.reset(OpCopy) 18554 v.AddArg(v0) 18555 v0.AuxInt = off 18556 v0.Aux = sym 18557 v0.AddArg(ptr) 18558 v0.AddArg(idx) 18559 v0.AddArg(mem) 18560 return true 18561 } 18562 // match: (MOVHreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 18563 // cond: x.Uses == 1 && clobber(x) 18564 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 18565 for { 18566 x := v.Args[0] 18567 if x.Op != OpS390XMOVHloadidx { 18568 break 18569 } 18570 off := x.AuxInt 18571 sym := x.Aux 18572 _ = x.Args[2] 18573 ptr := x.Args[0] 18574 idx := x.Args[1] 18575 mem := x.Args[2] 18576 if !(x.Uses == 1 && clobber(x)) { 18577 break 18578 } 18579 b = x.Block 18580 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 18581 v.reset(OpCopy) 18582 v.AddArg(v0) 18583 v0.AuxInt = off 18584 v0.Aux = sym 18585 v0.AddArg(ptr) 18586 v0.AddArg(idx) 18587 v0.AddArg(mem) 18588 return true 18589 } 18590 // match: (MOVHreg (ANDWconst [m] x)) 18591 // cond: int16(m) >= 0 18592 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(uint16(m))] x)) 18593 for { 18594 v_0 := v.Args[0] 18595 if v_0.Op != OpS390XANDWconst { 18596 break 18597 } 18598 m := v_0.AuxInt 18599 x := v_0.Args[0] 18600 if !(int16(m) >= 0) { 18601 break 18602 } 18603 v.reset(OpS390XMOVWZreg) 18604 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 18605 v0.AuxInt = int64(uint16(m)) 18606 v0.AddArg(x) 18607 v.AddArg(v0) 18608 return true 18609 } 18610 return false 18611 } 18612 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 18613 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 18614 // cond: 18615 // result: (MOVHstore [off] {sym} ptr x mem) 18616 for { 18617 off := v.AuxInt 18618 sym := v.Aux 18619 _ = v.Args[2] 18620 ptr := v.Args[0] 18621 v_1 := v.Args[1] 18622 if v_1.Op != OpS390XMOVHreg { 18623 break 18624 } 18625 x := v_1.Args[0] 18626 mem := v.Args[2] 18627 v.reset(OpS390XMOVHstore) 18628 v.AuxInt = off 18629 v.Aux = sym 18630 v.AddArg(ptr) 18631 v.AddArg(x) 18632 v.AddArg(mem) 18633 return true 18634 } 18635 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 18636 // cond: 18637 // result: (MOVHstore [off] {sym} ptr x mem) 18638 for { 18639 off := v.AuxInt 18640 sym := v.Aux 18641 _ = v.Args[2] 18642 ptr := v.Args[0] 18643 v_1 := v.Args[1] 18644 if v_1.Op != OpS390XMOVHZreg { 18645 break 18646 } 18647 x := v_1.Args[0] 18648 mem := v.Args[2] 18649 v.reset(OpS390XMOVHstore) 18650 v.AuxInt = off 18651 v.Aux = sym 18652 v.AddArg(ptr) 18653 v.AddArg(x) 18654 v.AddArg(mem) 18655 return true 18656 } 18657 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 18658 // cond: is20Bit(off1+off2) 18659 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 18660 for { 18661 off1 := v.AuxInt 18662 sym := v.Aux 18663 _ = v.Args[2] 18664 v_0 := v.Args[0] 18665 if v_0.Op != OpS390XADDconst { 18666 break 18667 } 18668 off2 := v_0.AuxInt 18669 ptr := v_0.Args[0] 18670 val := v.Args[1] 18671 mem := v.Args[2] 18672 if !(is20Bit(off1 + off2)) { 18673 break 18674 } 18675 v.reset(OpS390XMOVHstore) 18676 v.AuxInt = off1 + off2 18677 v.Aux = sym 18678 v.AddArg(ptr) 18679 v.AddArg(val) 18680 v.AddArg(mem) 18681 return true 18682 } 18683 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 18684 // cond: isU12Bit(off) && ptr.Op != OpSB 18685 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 18686 for { 18687 off := v.AuxInt 18688 sym := v.Aux 18689 _ = v.Args[2] 18690 ptr := v.Args[0] 18691 v_1 := v.Args[1] 18692 if v_1.Op != OpS390XMOVDconst { 18693 break 18694 } 18695 c := v_1.AuxInt 18696 mem := v.Args[2] 18697 if !(isU12Bit(off) && ptr.Op != OpSB) { 18698 break 18699 } 18700 v.reset(OpS390XMOVHstoreconst) 18701 v.AuxInt = makeValAndOff(int64(int16(c)), off) 18702 v.Aux = sym 18703 v.AddArg(ptr) 18704 v.AddArg(mem) 18705 return true 18706 } 18707 // match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 18708 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 18709 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 18710 for { 18711 off1 := v.AuxInt 18712 sym1 := v.Aux 18713 _ = v.Args[2] 18714 v_0 := v.Args[0] 18715 if v_0.Op != OpS390XMOVDaddr { 18716 break 18717 } 18718 t := v_0.Type 18719 off2 := v_0.AuxInt 18720 sym2 := v_0.Aux 18721 base := v_0.Args[0] 18722 val := v.Args[1] 18723 mem := v.Args[2] 18724 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 18725 break 18726 } 18727 v.reset(OpS390XMOVHstore) 18728 v.AuxInt = off1 + off2 18729 v.Aux = mergeSym(sym1, sym2) 18730 v.AddArg(base) 18731 v.AddArg(val) 18732 v.AddArg(mem) 18733 return true 18734 } 18735 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 18736 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 18737 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 18738 for { 18739 off1 := v.AuxInt 18740 sym1 := v.Aux 18741 _ = v.Args[2] 18742 v_0 := v.Args[0] 18743 if v_0.Op != OpS390XMOVDaddridx { 18744 break 18745 } 18746 off2 := v_0.AuxInt 18747 sym2 := v_0.Aux 18748 _ = v_0.Args[1] 18749 ptr := v_0.Args[0] 18750 idx := v_0.Args[1] 18751 val := v.Args[1] 18752 mem := v.Args[2] 18753 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 18754 break 18755 } 18756 v.reset(OpS390XMOVHstoreidx) 18757 v.AuxInt = off1 + off2 18758 v.Aux = mergeSym(sym1, sym2) 18759 v.AddArg(ptr) 18760 v.AddArg(idx) 18761 v.AddArg(val) 18762 v.AddArg(mem) 18763 return true 18764 } 18765 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 18766 // cond: ptr.Op != OpSB 18767 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 18768 for { 18769 off := v.AuxInt 18770 sym := v.Aux 18771 _ = v.Args[2] 18772 v_0 := v.Args[0] 18773 if v_0.Op != OpS390XADD { 18774 break 18775 } 18776 _ = v_0.Args[1] 18777 ptr := v_0.Args[0] 18778 idx := v_0.Args[1] 18779 val := v.Args[1] 18780 mem := v.Args[2] 18781 if !(ptr.Op != OpSB) { 18782 break 18783 } 18784 v.reset(OpS390XMOVHstoreidx) 18785 v.AuxInt = off 18786 v.Aux = sym 18787 v.AddArg(ptr) 18788 v.AddArg(idx) 18789 v.AddArg(val) 18790 v.AddArg(mem) 18791 return true 18792 } 18793 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 18794 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18795 // result: (MOVWstore [i-2] {s} p w mem) 18796 for { 18797 i := v.AuxInt 18798 s := v.Aux 18799 _ = v.Args[2] 18800 p := v.Args[0] 18801 w := v.Args[1] 18802 x := v.Args[2] 18803 if x.Op != OpS390XMOVHstore { 18804 break 18805 } 18806 if x.AuxInt != i-2 { 18807 break 18808 } 18809 if x.Aux != s { 18810 break 18811 } 18812 _ = x.Args[2] 18813 if p != x.Args[0] { 18814 break 18815 } 18816 x_1 := x.Args[1] 18817 if x_1.Op != OpS390XSRDconst { 18818 break 18819 } 18820 if x_1.AuxInt != 16 { 18821 break 18822 } 18823 if w != x_1.Args[0] { 18824 break 18825 } 18826 mem := x.Args[2] 18827 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18828 break 18829 } 18830 v.reset(OpS390XMOVWstore) 18831 v.AuxInt = i - 2 18832 v.Aux = s 18833 v.AddArg(p) 18834 v.AddArg(w) 18835 v.AddArg(mem) 18836 return true 18837 } 18838 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 18839 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18840 // result: (MOVWstore [i-2] {s} p w0 mem) 18841 for { 18842 i := v.AuxInt 18843 s := v.Aux 18844 _ = v.Args[2] 18845 p := v.Args[0] 18846 w0 := v.Args[1] 18847 if w0.Op != OpS390XSRDconst { 18848 break 18849 } 18850 j := w0.AuxInt 18851 w := w0.Args[0] 18852 x := v.Args[2] 18853 if x.Op != OpS390XMOVHstore { 18854 break 18855 } 18856 if x.AuxInt != i-2 { 18857 break 18858 } 18859 if x.Aux != s { 18860 break 18861 } 18862 _ = x.Args[2] 18863 if p != x.Args[0] { 18864 break 18865 } 18866 x_1 := x.Args[1] 18867 if x_1.Op != OpS390XSRDconst { 18868 break 18869 } 18870 if x_1.AuxInt != j+16 { 18871 break 18872 } 18873 if w != x_1.Args[0] { 18874 break 18875 } 18876 mem := x.Args[2] 18877 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18878 break 18879 } 18880 v.reset(OpS390XMOVWstore) 18881 v.AuxInt = i - 2 18882 v.Aux = s 18883 v.AddArg(p) 18884 v.AddArg(w0) 18885 v.AddArg(mem) 18886 return true 18887 } 18888 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 18889 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18890 // result: (MOVWstore [i-2] {s} p w mem) 18891 for { 18892 i := v.AuxInt 18893 s := v.Aux 18894 _ = v.Args[2] 18895 p := v.Args[0] 18896 w := v.Args[1] 18897 x := v.Args[2] 18898 if x.Op != OpS390XMOVHstore { 18899 break 18900 } 18901 if x.AuxInt != i-2 { 18902 break 18903 } 18904 if x.Aux != s { 18905 break 18906 } 18907 _ = x.Args[2] 18908 if p != x.Args[0] { 18909 break 18910 } 18911 x_1 := x.Args[1] 18912 if x_1.Op != OpS390XSRWconst { 18913 break 18914 } 18915 if x_1.AuxInt != 16 { 18916 break 18917 } 18918 if w != x_1.Args[0] { 18919 break 18920 } 18921 mem := x.Args[2] 18922 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18923 break 18924 } 18925 v.reset(OpS390XMOVWstore) 18926 v.AuxInt = i - 2 18927 v.Aux = s 18928 v.AddArg(p) 18929 v.AddArg(w) 18930 v.AddArg(mem) 18931 return true 18932 } 18933 return false 18934 } 18935 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 18936 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 18937 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18938 // result: (MOVWstore [i-2] {s} p w0 mem) 18939 for { 18940 i := v.AuxInt 18941 s := v.Aux 18942 _ = v.Args[2] 18943 p := v.Args[0] 18944 w0 := v.Args[1] 18945 if w0.Op != OpS390XSRWconst { 18946 break 18947 } 18948 j := w0.AuxInt 18949 w := w0.Args[0] 18950 x := v.Args[2] 18951 if x.Op != OpS390XMOVHstore { 18952 break 18953 } 18954 if x.AuxInt != i-2 { 18955 break 18956 } 18957 if x.Aux != s { 18958 break 18959 } 18960 _ = x.Args[2] 18961 if p != x.Args[0] { 18962 break 18963 } 18964 x_1 := x.Args[1] 18965 if x_1.Op != OpS390XSRWconst { 18966 break 18967 } 18968 if x_1.AuxInt != j+16 { 18969 break 18970 } 18971 if w != x_1.Args[0] { 18972 break 18973 } 18974 mem := x.Args[2] 18975 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18976 break 18977 } 18978 v.reset(OpS390XMOVWstore) 18979 v.AuxInt = i - 2 18980 v.Aux = s 18981 v.AddArg(p) 18982 v.AddArg(w0) 18983 v.AddArg(mem) 18984 return true 18985 } 18986 return false 18987 } 18988 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 18989 b := v.Block 18990 _ = b 18991 typ := &b.Func.Config.Types 18992 _ = typ 18993 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 18994 // cond: isU12Bit(ValAndOff(sc).Off()+off) 18995 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 18996 for { 18997 sc := v.AuxInt 18998 s := v.Aux 18999 _ = v.Args[1] 19000 v_0 := v.Args[0] 19001 if v_0.Op != OpS390XADDconst { 19002 break 19003 } 19004 off := v_0.AuxInt 19005 ptr := v_0.Args[0] 19006 mem := v.Args[1] 19007 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 19008 break 19009 } 19010 v.reset(OpS390XMOVHstoreconst) 19011 v.AuxInt = ValAndOff(sc).add(off) 19012 v.Aux = s 19013 v.AddArg(ptr) 19014 v.AddArg(mem) 19015 return true 19016 } 19017 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 19018 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 19019 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 19020 for { 19021 sc := v.AuxInt 19022 sym1 := v.Aux 19023 _ = v.Args[1] 19024 v_0 := v.Args[0] 19025 if v_0.Op != OpS390XMOVDaddr { 19026 break 19027 } 19028 off := v_0.AuxInt 19029 sym2 := v_0.Aux 19030 ptr := v_0.Args[0] 19031 mem := v.Args[1] 19032 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 19033 break 19034 } 19035 v.reset(OpS390XMOVHstoreconst) 19036 v.AuxInt = ValAndOff(sc).add(off) 19037 v.Aux = mergeSym(sym1, sym2) 19038 v.AddArg(ptr) 19039 v.AddArg(mem) 19040 return true 19041 } 19042 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 19043 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 19044 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 19045 for { 19046 c := v.AuxInt 19047 s := v.Aux 19048 _ = v.Args[1] 19049 p := v.Args[0] 19050 x := v.Args[1] 19051 if x.Op != OpS390XMOVHstoreconst { 19052 break 19053 } 19054 a := x.AuxInt 19055 if x.Aux != s { 19056 break 19057 } 19058 _ = x.Args[1] 19059 if p != x.Args[0] { 19060 break 19061 } 19062 mem := x.Args[1] 19063 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 19064 break 19065 } 19066 v.reset(OpS390XMOVWstore) 19067 v.AuxInt = ValAndOff(a).Off() 19068 v.Aux = s 19069 v.AddArg(p) 19070 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 19071 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 19072 v.AddArg(v0) 19073 v.AddArg(mem) 19074 return true 19075 } 19076 return false 19077 } 19078 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 19079 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 19080 // cond: is20Bit(c+d) 19081 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19082 for { 19083 c := v.AuxInt 19084 sym := v.Aux 19085 _ = v.Args[3] 19086 v_0 := v.Args[0] 19087 if v_0.Op != OpS390XADDconst { 19088 break 19089 } 19090 d := v_0.AuxInt 19091 ptr := v_0.Args[0] 19092 idx := v.Args[1] 19093 val := v.Args[2] 19094 mem := v.Args[3] 19095 if !(is20Bit(c + d)) { 19096 break 19097 } 19098 v.reset(OpS390XMOVHstoreidx) 19099 v.AuxInt = c + d 19100 v.Aux = sym 19101 v.AddArg(ptr) 19102 v.AddArg(idx) 19103 v.AddArg(val) 19104 v.AddArg(mem) 19105 return true 19106 } 19107 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 19108 // cond: is20Bit(c+d) 19109 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19110 for { 19111 c := v.AuxInt 19112 sym := v.Aux 19113 _ = v.Args[3] 19114 idx := v.Args[0] 19115 v_1 := v.Args[1] 19116 if v_1.Op != OpS390XADDconst { 19117 break 19118 } 19119 d := v_1.AuxInt 19120 ptr := v_1.Args[0] 19121 val := v.Args[2] 19122 mem := v.Args[3] 19123 if !(is20Bit(c + d)) { 19124 break 19125 } 19126 v.reset(OpS390XMOVHstoreidx) 19127 v.AuxInt = c + d 19128 v.Aux = sym 19129 v.AddArg(ptr) 19130 v.AddArg(idx) 19131 v.AddArg(val) 19132 v.AddArg(mem) 19133 return true 19134 } 19135 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 19136 // cond: is20Bit(c+d) 19137 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19138 for { 19139 c := v.AuxInt 19140 sym := v.Aux 19141 _ = v.Args[3] 19142 ptr := v.Args[0] 19143 v_1 := v.Args[1] 19144 if v_1.Op != OpS390XADDconst { 19145 break 19146 } 19147 d := v_1.AuxInt 19148 idx := v_1.Args[0] 19149 val := v.Args[2] 19150 mem := v.Args[3] 19151 if !(is20Bit(c + d)) { 19152 break 19153 } 19154 v.reset(OpS390XMOVHstoreidx) 19155 v.AuxInt = c + d 19156 v.Aux = sym 19157 v.AddArg(ptr) 19158 v.AddArg(idx) 19159 v.AddArg(val) 19160 v.AddArg(mem) 19161 return true 19162 } 19163 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 19164 // cond: is20Bit(c+d) 19165 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19166 for { 19167 c := v.AuxInt 19168 sym := v.Aux 19169 _ = v.Args[3] 19170 v_0 := v.Args[0] 19171 if v_0.Op != OpS390XADDconst { 19172 break 19173 } 19174 d := v_0.AuxInt 19175 idx := v_0.Args[0] 19176 ptr := v.Args[1] 19177 val := v.Args[2] 19178 mem := v.Args[3] 19179 if !(is20Bit(c + d)) { 19180 break 19181 } 19182 v.reset(OpS390XMOVHstoreidx) 19183 v.AuxInt = c + d 19184 v.Aux = sym 19185 v.AddArg(ptr) 19186 v.AddArg(idx) 19187 v.AddArg(val) 19188 v.AddArg(mem) 19189 return true 19190 } 19191 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 19192 // cond: x.Uses == 1 && clobber(x) 19193 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19194 for { 19195 i := v.AuxInt 19196 s := v.Aux 19197 _ = v.Args[3] 19198 p := v.Args[0] 19199 idx := v.Args[1] 19200 w := v.Args[2] 19201 x := v.Args[3] 19202 if x.Op != OpS390XMOVHstoreidx { 19203 break 19204 } 19205 if x.AuxInt != i-2 { 19206 break 19207 } 19208 if x.Aux != s { 19209 break 19210 } 19211 _ = x.Args[3] 19212 if p != x.Args[0] { 19213 break 19214 } 19215 if idx != x.Args[1] { 19216 break 19217 } 19218 x_2 := x.Args[2] 19219 if x_2.Op != OpS390XSRDconst { 19220 break 19221 } 19222 if x_2.AuxInt != 16 { 19223 break 19224 } 19225 if w != x_2.Args[0] { 19226 break 19227 } 19228 mem := x.Args[3] 19229 if !(x.Uses == 1 && clobber(x)) { 19230 break 19231 } 19232 v.reset(OpS390XMOVWstoreidx) 19233 v.AuxInt = i - 2 19234 v.Aux = s 19235 v.AddArg(p) 19236 v.AddArg(idx) 19237 v.AddArg(w) 19238 v.AddArg(mem) 19239 return true 19240 } 19241 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 19242 // cond: x.Uses == 1 && clobber(x) 19243 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19244 for { 19245 i := v.AuxInt 19246 s := v.Aux 19247 _ = v.Args[3] 19248 p := v.Args[0] 19249 idx := v.Args[1] 19250 w := v.Args[2] 19251 x := v.Args[3] 19252 if x.Op != OpS390XMOVHstoreidx { 19253 break 19254 } 19255 if x.AuxInt != i-2 { 19256 break 19257 } 19258 if x.Aux != s { 19259 break 19260 } 19261 _ = x.Args[3] 19262 if idx != x.Args[0] { 19263 break 19264 } 19265 if p != x.Args[1] { 19266 break 19267 } 19268 x_2 := x.Args[2] 19269 if x_2.Op != OpS390XSRDconst { 19270 break 19271 } 19272 if x_2.AuxInt != 16 { 19273 break 19274 } 19275 if w != x_2.Args[0] { 19276 break 19277 } 19278 mem := x.Args[3] 19279 if !(x.Uses == 1 && clobber(x)) { 19280 break 19281 } 19282 v.reset(OpS390XMOVWstoreidx) 19283 v.AuxInt = i - 2 19284 v.Aux = s 19285 v.AddArg(p) 19286 v.AddArg(idx) 19287 v.AddArg(w) 19288 v.AddArg(mem) 19289 return true 19290 } 19291 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 19292 // cond: x.Uses == 1 && clobber(x) 19293 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19294 for { 19295 i := v.AuxInt 19296 s := v.Aux 19297 _ = v.Args[3] 19298 idx := v.Args[0] 19299 p := v.Args[1] 19300 w := v.Args[2] 19301 x := v.Args[3] 19302 if x.Op != OpS390XMOVHstoreidx { 19303 break 19304 } 19305 if x.AuxInt != i-2 { 19306 break 19307 } 19308 if x.Aux != s { 19309 break 19310 } 19311 _ = x.Args[3] 19312 if p != x.Args[0] { 19313 break 19314 } 19315 if idx != x.Args[1] { 19316 break 19317 } 19318 x_2 := x.Args[2] 19319 if x_2.Op != OpS390XSRDconst { 19320 break 19321 } 19322 if x_2.AuxInt != 16 { 19323 break 19324 } 19325 if w != x_2.Args[0] { 19326 break 19327 } 19328 mem := x.Args[3] 19329 if !(x.Uses == 1 && clobber(x)) { 19330 break 19331 } 19332 v.reset(OpS390XMOVWstoreidx) 19333 v.AuxInt = i - 2 19334 v.Aux = s 19335 v.AddArg(p) 19336 v.AddArg(idx) 19337 v.AddArg(w) 19338 v.AddArg(mem) 19339 return true 19340 } 19341 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 19342 // cond: x.Uses == 1 && clobber(x) 19343 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19344 for { 19345 i := v.AuxInt 19346 s := v.Aux 19347 _ = v.Args[3] 19348 idx := v.Args[0] 19349 p := v.Args[1] 19350 w := v.Args[2] 19351 x := v.Args[3] 19352 if x.Op != OpS390XMOVHstoreidx { 19353 break 19354 } 19355 if x.AuxInt != i-2 { 19356 break 19357 } 19358 if x.Aux != s { 19359 break 19360 } 19361 _ = x.Args[3] 19362 if idx != x.Args[0] { 19363 break 19364 } 19365 if p != x.Args[1] { 19366 break 19367 } 19368 x_2 := x.Args[2] 19369 if x_2.Op != OpS390XSRDconst { 19370 break 19371 } 19372 if x_2.AuxInt != 16 { 19373 break 19374 } 19375 if w != x_2.Args[0] { 19376 break 19377 } 19378 mem := x.Args[3] 19379 if !(x.Uses == 1 && clobber(x)) { 19380 break 19381 } 19382 v.reset(OpS390XMOVWstoreidx) 19383 v.AuxInt = i - 2 19384 v.Aux = s 19385 v.AddArg(p) 19386 v.AddArg(idx) 19387 v.AddArg(w) 19388 v.AddArg(mem) 19389 return true 19390 } 19391 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 19392 // cond: x.Uses == 1 && clobber(x) 19393 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19394 for { 19395 i := v.AuxInt 19396 s := v.Aux 19397 _ = v.Args[3] 19398 p := v.Args[0] 19399 idx := v.Args[1] 19400 w0 := v.Args[2] 19401 if w0.Op != OpS390XSRDconst { 19402 break 19403 } 19404 j := w0.AuxInt 19405 w := w0.Args[0] 19406 x := v.Args[3] 19407 if x.Op != OpS390XMOVHstoreidx { 19408 break 19409 } 19410 if x.AuxInt != i-2 { 19411 break 19412 } 19413 if x.Aux != s { 19414 break 19415 } 19416 _ = x.Args[3] 19417 if p != x.Args[0] { 19418 break 19419 } 19420 if idx != x.Args[1] { 19421 break 19422 } 19423 x_2 := x.Args[2] 19424 if x_2.Op != OpS390XSRDconst { 19425 break 19426 } 19427 if x_2.AuxInt != j+16 { 19428 break 19429 } 19430 if w != x_2.Args[0] { 19431 break 19432 } 19433 mem := x.Args[3] 19434 if !(x.Uses == 1 && clobber(x)) { 19435 break 19436 } 19437 v.reset(OpS390XMOVWstoreidx) 19438 v.AuxInt = i - 2 19439 v.Aux = s 19440 v.AddArg(p) 19441 v.AddArg(idx) 19442 v.AddArg(w0) 19443 v.AddArg(mem) 19444 return true 19445 } 19446 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 19447 // cond: x.Uses == 1 && clobber(x) 19448 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19449 for { 19450 i := v.AuxInt 19451 s := v.Aux 19452 _ = v.Args[3] 19453 p := v.Args[0] 19454 idx := v.Args[1] 19455 w0 := v.Args[2] 19456 if w0.Op != OpS390XSRDconst { 19457 break 19458 } 19459 j := w0.AuxInt 19460 w := w0.Args[0] 19461 x := v.Args[3] 19462 if x.Op != OpS390XMOVHstoreidx { 19463 break 19464 } 19465 if x.AuxInt != i-2 { 19466 break 19467 } 19468 if x.Aux != s { 19469 break 19470 } 19471 _ = x.Args[3] 19472 if idx != x.Args[0] { 19473 break 19474 } 19475 if p != x.Args[1] { 19476 break 19477 } 19478 x_2 := x.Args[2] 19479 if x_2.Op != OpS390XSRDconst { 19480 break 19481 } 19482 if x_2.AuxInt != j+16 { 19483 break 19484 } 19485 if w != x_2.Args[0] { 19486 break 19487 } 19488 mem := x.Args[3] 19489 if !(x.Uses == 1 && clobber(x)) { 19490 break 19491 } 19492 v.reset(OpS390XMOVWstoreidx) 19493 v.AuxInt = i - 2 19494 v.Aux = s 19495 v.AddArg(p) 19496 v.AddArg(idx) 19497 v.AddArg(w0) 19498 v.AddArg(mem) 19499 return true 19500 } 19501 return false 19502 } 19503 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 19504 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 19505 // cond: x.Uses == 1 && clobber(x) 19506 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19507 for { 19508 i := v.AuxInt 19509 s := v.Aux 19510 _ = v.Args[3] 19511 idx := v.Args[0] 19512 p := v.Args[1] 19513 w0 := v.Args[2] 19514 if w0.Op != OpS390XSRDconst { 19515 break 19516 } 19517 j := w0.AuxInt 19518 w := w0.Args[0] 19519 x := v.Args[3] 19520 if x.Op != OpS390XMOVHstoreidx { 19521 break 19522 } 19523 if x.AuxInt != i-2 { 19524 break 19525 } 19526 if x.Aux != s { 19527 break 19528 } 19529 _ = x.Args[3] 19530 if p != x.Args[0] { 19531 break 19532 } 19533 if idx != x.Args[1] { 19534 break 19535 } 19536 x_2 := x.Args[2] 19537 if x_2.Op != OpS390XSRDconst { 19538 break 19539 } 19540 if x_2.AuxInt != j+16 { 19541 break 19542 } 19543 if w != x_2.Args[0] { 19544 break 19545 } 19546 mem := x.Args[3] 19547 if !(x.Uses == 1 && clobber(x)) { 19548 break 19549 } 19550 v.reset(OpS390XMOVWstoreidx) 19551 v.AuxInt = i - 2 19552 v.Aux = s 19553 v.AddArg(p) 19554 v.AddArg(idx) 19555 v.AddArg(w0) 19556 v.AddArg(mem) 19557 return true 19558 } 19559 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 19560 // cond: x.Uses == 1 && clobber(x) 19561 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19562 for { 19563 i := v.AuxInt 19564 s := v.Aux 19565 _ = v.Args[3] 19566 idx := v.Args[0] 19567 p := v.Args[1] 19568 w0 := v.Args[2] 19569 if w0.Op != OpS390XSRDconst { 19570 break 19571 } 19572 j := w0.AuxInt 19573 w := w0.Args[0] 19574 x := v.Args[3] 19575 if x.Op != OpS390XMOVHstoreidx { 19576 break 19577 } 19578 if x.AuxInt != i-2 { 19579 break 19580 } 19581 if x.Aux != s { 19582 break 19583 } 19584 _ = x.Args[3] 19585 if idx != x.Args[0] { 19586 break 19587 } 19588 if p != x.Args[1] { 19589 break 19590 } 19591 x_2 := x.Args[2] 19592 if x_2.Op != OpS390XSRDconst { 19593 break 19594 } 19595 if x_2.AuxInt != j+16 { 19596 break 19597 } 19598 if w != x_2.Args[0] { 19599 break 19600 } 19601 mem := x.Args[3] 19602 if !(x.Uses == 1 && clobber(x)) { 19603 break 19604 } 19605 v.reset(OpS390XMOVWstoreidx) 19606 v.AuxInt = i - 2 19607 v.Aux = s 19608 v.AddArg(p) 19609 v.AddArg(idx) 19610 v.AddArg(w0) 19611 v.AddArg(mem) 19612 return true 19613 } 19614 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 19615 // cond: x.Uses == 1 && clobber(x) 19616 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19617 for { 19618 i := v.AuxInt 19619 s := v.Aux 19620 _ = v.Args[3] 19621 p := v.Args[0] 19622 idx := v.Args[1] 19623 w := v.Args[2] 19624 x := v.Args[3] 19625 if x.Op != OpS390XMOVHstoreidx { 19626 break 19627 } 19628 if x.AuxInt != i-2 { 19629 break 19630 } 19631 if x.Aux != s { 19632 break 19633 } 19634 _ = x.Args[3] 19635 if p != x.Args[0] { 19636 break 19637 } 19638 if idx != x.Args[1] { 19639 break 19640 } 19641 x_2 := x.Args[2] 19642 if x_2.Op != OpS390XSRWconst { 19643 break 19644 } 19645 if x_2.AuxInt != 16 { 19646 break 19647 } 19648 if w != x_2.Args[0] { 19649 break 19650 } 19651 mem := x.Args[3] 19652 if !(x.Uses == 1 && clobber(x)) { 19653 break 19654 } 19655 v.reset(OpS390XMOVWstoreidx) 19656 v.AuxInt = i - 2 19657 v.Aux = s 19658 v.AddArg(p) 19659 v.AddArg(idx) 19660 v.AddArg(w) 19661 v.AddArg(mem) 19662 return true 19663 } 19664 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 19665 // cond: x.Uses == 1 && clobber(x) 19666 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19667 for { 19668 i := v.AuxInt 19669 s := v.Aux 19670 _ = v.Args[3] 19671 p := v.Args[0] 19672 idx := v.Args[1] 19673 w := v.Args[2] 19674 x := v.Args[3] 19675 if x.Op != OpS390XMOVHstoreidx { 19676 break 19677 } 19678 if x.AuxInt != i-2 { 19679 break 19680 } 19681 if x.Aux != s { 19682 break 19683 } 19684 _ = x.Args[3] 19685 if idx != x.Args[0] { 19686 break 19687 } 19688 if p != x.Args[1] { 19689 break 19690 } 19691 x_2 := x.Args[2] 19692 if x_2.Op != OpS390XSRWconst { 19693 break 19694 } 19695 if x_2.AuxInt != 16 { 19696 break 19697 } 19698 if w != x_2.Args[0] { 19699 break 19700 } 19701 mem := x.Args[3] 19702 if !(x.Uses == 1 && clobber(x)) { 19703 break 19704 } 19705 v.reset(OpS390XMOVWstoreidx) 19706 v.AuxInt = i - 2 19707 v.Aux = s 19708 v.AddArg(p) 19709 v.AddArg(idx) 19710 v.AddArg(w) 19711 v.AddArg(mem) 19712 return true 19713 } 19714 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 19715 // cond: x.Uses == 1 && clobber(x) 19716 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19717 for { 19718 i := v.AuxInt 19719 s := v.Aux 19720 _ = v.Args[3] 19721 idx := v.Args[0] 19722 p := v.Args[1] 19723 w := v.Args[2] 19724 x := v.Args[3] 19725 if x.Op != OpS390XMOVHstoreidx { 19726 break 19727 } 19728 if x.AuxInt != i-2 { 19729 break 19730 } 19731 if x.Aux != s { 19732 break 19733 } 19734 _ = x.Args[3] 19735 if p != x.Args[0] { 19736 break 19737 } 19738 if idx != x.Args[1] { 19739 break 19740 } 19741 x_2 := x.Args[2] 19742 if x_2.Op != OpS390XSRWconst { 19743 break 19744 } 19745 if x_2.AuxInt != 16 { 19746 break 19747 } 19748 if w != x_2.Args[0] { 19749 break 19750 } 19751 mem := x.Args[3] 19752 if !(x.Uses == 1 && clobber(x)) { 19753 break 19754 } 19755 v.reset(OpS390XMOVWstoreidx) 19756 v.AuxInt = i - 2 19757 v.Aux = s 19758 v.AddArg(p) 19759 v.AddArg(idx) 19760 v.AddArg(w) 19761 v.AddArg(mem) 19762 return true 19763 } 19764 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 19765 // cond: x.Uses == 1 && clobber(x) 19766 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19767 for { 19768 i := v.AuxInt 19769 s := v.Aux 19770 _ = v.Args[3] 19771 idx := v.Args[0] 19772 p := v.Args[1] 19773 w := v.Args[2] 19774 x := v.Args[3] 19775 if x.Op != OpS390XMOVHstoreidx { 19776 break 19777 } 19778 if x.AuxInt != i-2 { 19779 break 19780 } 19781 if x.Aux != s { 19782 break 19783 } 19784 _ = x.Args[3] 19785 if idx != x.Args[0] { 19786 break 19787 } 19788 if p != x.Args[1] { 19789 break 19790 } 19791 x_2 := x.Args[2] 19792 if x_2.Op != OpS390XSRWconst { 19793 break 19794 } 19795 if x_2.AuxInt != 16 { 19796 break 19797 } 19798 if w != x_2.Args[0] { 19799 break 19800 } 19801 mem := x.Args[3] 19802 if !(x.Uses == 1 && clobber(x)) { 19803 break 19804 } 19805 v.reset(OpS390XMOVWstoreidx) 19806 v.AuxInt = i - 2 19807 v.Aux = s 19808 v.AddArg(p) 19809 v.AddArg(idx) 19810 v.AddArg(w) 19811 v.AddArg(mem) 19812 return true 19813 } 19814 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 19815 // cond: x.Uses == 1 && clobber(x) 19816 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19817 for { 19818 i := v.AuxInt 19819 s := v.Aux 19820 _ = v.Args[3] 19821 p := v.Args[0] 19822 idx := v.Args[1] 19823 w0 := v.Args[2] 19824 if w0.Op != OpS390XSRWconst { 19825 break 19826 } 19827 j := w0.AuxInt 19828 w := w0.Args[0] 19829 x := v.Args[3] 19830 if x.Op != OpS390XMOVHstoreidx { 19831 break 19832 } 19833 if x.AuxInt != i-2 { 19834 break 19835 } 19836 if x.Aux != s { 19837 break 19838 } 19839 _ = x.Args[3] 19840 if p != x.Args[0] { 19841 break 19842 } 19843 if idx != x.Args[1] { 19844 break 19845 } 19846 x_2 := x.Args[2] 19847 if x_2.Op != OpS390XSRWconst { 19848 break 19849 } 19850 if x_2.AuxInt != j+16 { 19851 break 19852 } 19853 if w != x_2.Args[0] { 19854 break 19855 } 19856 mem := x.Args[3] 19857 if !(x.Uses == 1 && clobber(x)) { 19858 break 19859 } 19860 v.reset(OpS390XMOVWstoreidx) 19861 v.AuxInt = i - 2 19862 v.Aux = s 19863 v.AddArg(p) 19864 v.AddArg(idx) 19865 v.AddArg(w0) 19866 v.AddArg(mem) 19867 return true 19868 } 19869 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 19870 // cond: x.Uses == 1 && clobber(x) 19871 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19872 for { 19873 i := v.AuxInt 19874 s := v.Aux 19875 _ = v.Args[3] 19876 p := v.Args[0] 19877 idx := v.Args[1] 19878 w0 := v.Args[2] 19879 if w0.Op != OpS390XSRWconst { 19880 break 19881 } 19882 j := w0.AuxInt 19883 w := w0.Args[0] 19884 x := v.Args[3] 19885 if x.Op != OpS390XMOVHstoreidx { 19886 break 19887 } 19888 if x.AuxInt != i-2 { 19889 break 19890 } 19891 if x.Aux != s { 19892 break 19893 } 19894 _ = x.Args[3] 19895 if idx != x.Args[0] { 19896 break 19897 } 19898 if p != x.Args[1] { 19899 break 19900 } 19901 x_2 := x.Args[2] 19902 if x_2.Op != OpS390XSRWconst { 19903 break 19904 } 19905 if x_2.AuxInt != j+16 { 19906 break 19907 } 19908 if w != x_2.Args[0] { 19909 break 19910 } 19911 mem := x.Args[3] 19912 if !(x.Uses == 1 && clobber(x)) { 19913 break 19914 } 19915 v.reset(OpS390XMOVWstoreidx) 19916 v.AuxInt = i - 2 19917 v.Aux = s 19918 v.AddArg(p) 19919 v.AddArg(idx) 19920 v.AddArg(w0) 19921 v.AddArg(mem) 19922 return true 19923 } 19924 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 19925 // cond: x.Uses == 1 && clobber(x) 19926 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19927 for { 19928 i := v.AuxInt 19929 s := v.Aux 19930 _ = v.Args[3] 19931 idx := v.Args[0] 19932 p := v.Args[1] 19933 w0 := v.Args[2] 19934 if w0.Op != OpS390XSRWconst { 19935 break 19936 } 19937 j := w0.AuxInt 19938 w := w0.Args[0] 19939 x := v.Args[3] 19940 if x.Op != OpS390XMOVHstoreidx { 19941 break 19942 } 19943 if x.AuxInt != i-2 { 19944 break 19945 } 19946 if x.Aux != s { 19947 break 19948 } 19949 _ = x.Args[3] 19950 if p != x.Args[0] { 19951 break 19952 } 19953 if idx != x.Args[1] { 19954 break 19955 } 19956 x_2 := x.Args[2] 19957 if x_2.Op != OpS390XSRWconst { 19958 break 19959 } 19960 if x_2.AuxInt != j+16 { 19961 break 19962 } 19963 if w != x_2.Args[0] { 19964 break 19965 } 19966 mem := x.Args[3] 19967 if !(x.Uses == 1 && clobber(x)) { 19968 break 19969 } 19970 v.reset(OpS390XMOVWstoreidx) 19971 v.AuxInt = i - 2 19972 v.Aux = s 19973 v.AddArg(p) 19974 v.AddArg(idx) 19975 v.AddArg(w0) 19976 v.AddArg(mem) 19977 return true 19978 } 19979 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 19980 // cond: x.Uses == 1 && clobber(x) 19981 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19982 for { 19983 i := v.AuxInt 19984 s := v.Aux 19985 _ = v.Args[3] 19986 idx := v.Args[0] 19987 p := v.Args[1] 19988 w0 := v.Args[2] 19989 if w0.Op != OpS390XSRWconst { 19990 break 19991 } 19992 j := w0.AuxInt 19993 w := w0.Args[0] 19994 x := v.Args[3] 19995 if x.Op != OpS390XMOVHstoreidx { 19996 break 19997 } 19998 if x.AuxInt != i-2 { 19999 break 20000 } 20001 if x.Aux != s { 20002 break 20003 } 20004 _ = x.Args[3] 20005 if idx != x.Args[0] { 20006 break 20007 } 20008 if p != x.Args[1] { 20009 break 20010 } 20011 x_2 := x.Args[2] 20012 if x_2.Op != OpS390XSRWconst { 20013 break 20014 } 20015 if x_2.AuxInt != j+16 { 20016 break 20017 } 20018 if w != x_2.Args[0] { 20019 break 20020 } 20021 mem := x.Args[3] 20022 if !(x.Uses == 1 && clobber(x)) { 20023 break 20024 } 20025 v.reset(OpS390XMOVWstoreidx) 20026 v.AuxInt = i - 2 20027 v.Aux = s 20028 v.AddArg(p) 20029 v.AddArg(idx) 20030 v.AddArg(w0) 20031 v.AddArg(mem) 20032 return true 20033 } 20034 return false 20035 } 20036 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 20037 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 20038 // cond: x.Uses == 1 && clobber(x) 20039 // result: (MOVDBRstore [i-4] {s} p w mem) 20040 for { 20041 i := v.AuxInt 20042 s := v.Aux 20043 _ = v.Args[2] 20044 p := v.Args[0] 20045 v_1 := v.Args[1] 20046 if v_1.Op != OpS390XSRDconst { 20047 break 20048 } 20049 if v_1.AuxInt != 32 { 20050 break 20051 } 20052 w := v_1.Args[0] 20053 x := v.Args[2] 20054 if x.Op != OpS390XMOVWBRstore { 20055 break 20056 } 20057 if x.AuxInt != i-4 { 20058 break 20059 } 20060 if x.Aux != s { 20061 break 20062 } 20063 _ = x.Args[2] 20064 if p != x.Args[0] { 20065 break 20066 } 20067 if w != x.Args[1] { 20068 break 20069 } 20070 mem := x.Args[2] 20071 if !(x.Uses == 1 && clobber(x)) { 20072 break 20073 } 20074 v.reset(OpS390XMOVDBRstore) 20075 v.AuxInt = i - 4 20076 v.Aux = s 20077 v.AddArg(p) 20078 v.AddArg(w) 20079 v.AddArg(mem) 20080 return true 20081 } 20082 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 20083 // cond: x.Uses == 1 && clobber(x) 20084 // result: (MOVDBRstore [i-4] {s} p w0 mem) 20085 for { 20086 i := v.AuxInt 20087 s := v.Aux 20088 _ = v.Args[2] 20089 p := v.Args[0] 20090 v_1 := v.Args[1] 20091 if v_1.Op != OpS390XSRDconst { 20092 break 20093 } 20094 j := v_1.AuxInt 20095 w := v_1.Args[0] 20096 x := v.Args[2] 20097 if x.Op != OpS390XMOVWBRstore { 20098 break 20099 } 20100 if x.AuxInt != i-4 { 20101 break 20102 } 20103 if x.Aux != s { 20104 break 20105 } 20106 _ = x.Args[2] 20107 if p != x.Args[0] { 20108 break 20109 } 20110 w0 := x.Args[1] 20111 if w0.Op != OpS390XSRDconst { 20112 break 20113 } 20114 if w0.AuxInt != j-32 { 20115 break 20116 } 20117 if w != w0.Args[0] { 20118 break 20119 } 20120 mem := x.Args[2] 20121 if !(x.Uses == 1 && clobber(x)) { 20122 break 20123 } 20124 v.reset(OpS390XMOVDBRstore) 20125 v.AuxInt = i - 4 20126 v.Aux = s 20127 v.AddArg(p) 20128 v.AddArg(w0) 20129 v.AddArg(mem) 20130 return true 20131 } 20132 return false 20133 } 20134 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 20135 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 20136 // cond: x.Uses == 1 && clobber(x) 20137 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20138 for { 20139 i := v.AuxInt 20140 s := v.Aux 20141 _ = v.Args[3] 20142 p := v.Args[0] 20143 idx := v.Args[1] 20144 v_2 := v.Args[2] 20145 if v_2.Op != OpS390XSRDconst { 20146 break 20147 } 20148 if v_2.AuxInt != 32 { 20149 break 20150 } 20151 w := v_2.Args[0] 20152 x := v.Args[3] 20153 if x.Op != OpS390XMOVWBRstoreidx { 20154 break 20155 } 20156 if x.AuxInt != i-4 { 20157 break 20158 } 20159 if x.Aux != s { 20160 break 20161 } 20162 _ = x.Args[3] 20163 if p != x.Args[0] { 20164 break 20165 } 20166 if idx != x.Args[1] { 20167 break 20168 } 20169 if w != x.Args[2] { 20170 break 20171 } 20172 mem := x.Args[3] 20173 if !(x.Uses == 1 && clobber(x)) { 20174 break 20175 } 20176 v.reset(OpS390XMOVDBRstoreidx) 20177 v.AuxInt = i - 4 20178 v.Aux = s 20179 v.AddArg(p) 20180 v.AddArg(idx) 20181 v.AddArg(w) 20182 v.AddArg(mem) 20183 return true 20184 } 20185 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 20186 // cond: x.Uses == 1 && clobber(x) 20187 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20188 for { 20189 i := v.AuxInt 20190 s := v.Aux 20191 _ = v.Args[3] 20192 p := v.Args[0] 20193 idx := v.Args[1] 20194 v_2 := v.Args[2] 20195 if v_2.Op != OpS390XSRDconst { 20196 break 20197 } 20198 if v_2.AuxInt != 32 { 20199 break 20200 } 20201 w := v_2.Args[0] 20202 x := v.Args[3] 20203 if x.Op != OpS390XMOVWBRstoreidx { 20204 break 20205 } 20206 if x.AuxInt != i-4 { 20207 break 20208 } 20209 if x.Aux != s { 20210 break 20211 } 20212 _ = x.Args[3] 20213 if idx != x.Args[0] { 20214 break 20215 } 20216 if p != x.Args[1] { 20217 break 20218 } 20219 if w != x.Args[2] { 20220 break 20221 } 20222 mem := x.Args[3] 20223 if !(x.Uses == 1 && clobber(x)) { 20224 break 20225 } 20226 v.reset(OpS390XMOVDBRstoreidx) 20227 v.AuxInt = i - 4 20228 v.Aux = s 20229 v.AddArg(p) 20230 v.AddArg(idx) 20231 v.AddArg(w) 20232 v.AddArg(mem) 20233 return true 20234 } 20235 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 20236 // cond: x.Uses == 1 && clobber(x) 20237 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20238 for { 20239 i := v.AuxInt 20240 s := v.Aux 20241 _ = v.Args[3] 20242 idx := v.Args[0] 20243 p := v.Args[1] 20244 v_2 := v.Args[2] 20245 if v_2.Op != OpS390XSRDconst { 20246 break 20247 } 20248 if v_2.AuxInt != 32 { 20249 break 20250 } 20251 w := v_2.Args[0] 20252 x := v.Args[3] 20253 if x.Op != OpS390XMOVWBRstoreidx { 20254 break 20255 } 20256 if x.AuxInt != i-4 { 20257 break 20258 } 20259 if x.Aux != s { 20260 break 20261 } 20262 _ = x.Args[3] 20263 if p != x.Args[0] { 20264 break 20265 } 20266 if idx != x.Args[1] { 20267 break 20268 } 20269 if w != x.Args[2] { 20270 break 20271 } 20272 mem := x.Args[3] 20273 if !(x.Uses == 1 && clobber(x)) { 20274 break 20275 } 20276 v.reset(OpS390XMOVDBRstoreidx) 20277 v.AuxInt = i - 4 20278 v.Aux = s 20279 v.AddArg(p) 20280 v.AddArg(idx) 20281 v.AddArg(w) 20282 v.AddArg(mem) 20283 return true 20284 } 20285 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 20286 // cond: x.Uses == 1 && clobber(x) 20287 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20288 for { 20289 i := v.AuxInt 20290 s := v.Aux 20291 _ = v.Args[3] 20292 idx := v.Args[0] 20293 p := v.Args[1] 20294 v_2 := v.Args[2] 20295 if v_2.Op != OpS390XSRDconst { 20296 break 20297 } 20298 if v_2.AuxInt != 32 { 20299 break 20300 } 20301 w := v_2.Args[0] 20302 x := v.Args[3] 20303 if x.Op != OpS390XMOVWBRstoreidx { 20304 break 20305 } 20306 if x.AuxInt != i-4 { 20307 break 20308 } 20309 if x.Aux != s { 20310 break 20311 } 20312 _ = x.Args[3] 20313 if idx != x.Args[0] { 20314 break 20315 } 20316 if p != x.Args[1] { 20317 break 20318 } 20319 if w != x.Args[2] { 20320 break 20321 } 20322 mem := x.Args[3] 20323 if !(x.Uses == 1 && clobber(x)) { 20324 break 20325 } 20326 v.reset(OpS390XMOVDBRstoreidx) 20327 v.AuxInt = i - 4 20328 v.Aux = s 20329 v.AddArg(p) 20330 v.AddArg(idx) 20331 v.AddArg(w) 20332 v.AddArg(mem) 20333 return true 20334 } 20335 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 20336 // cond: x.Uses == 1 && clobber(x) 20337 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20338 for { 20339 i := v.AuxInt 20340 s := v.Aux 20341 _ = v.Args[3] 20342 p := v.Args[0] 20343 idx := v.Args[1] 20344 v_2 := v.Args[2] 20345 if v_2.Op != OpS390XSRDconst { 20346 break 20347 } 20348 j := v_2.AuxInt 20349 w := v_2.Args[0] 20350 x := v.Args[3] 20351 if x.Op != OpS390XMOVWBRstoreidx { 20352 break 20353 } 20354 if x.AuxInt != i-4 { 20355 break 20356 } 20357 if x.Aux != s { 20358 break 20359 } 20360 _ = x.Args[3] 20361 if p != x.Args[0] { 20362 break 20363 } 20364 if idx != x.Args[1] { 20365 break 20366 } 20367 w0 := x.Args[2] 20368 if w0.Op != OpS390XSRDconst { 20369 break 20370 } 20371 if w0.AuxInt != j-32 { 20372 break 20373 } 20374 if w != w0.Args[0] { 20375 break 20376 } 20377 mem := x.Args[3] 20378 if !(x.Uses == 1 && clobber(x)) { 20379 break 20380 } 20381 v.reset(OpS390XMOVDBRstoreidx) 20382 v.AuxInt = i - 4 20383 v.Aux = s 20384 v.AddArg(p) 20385 v.AddArg(idx) 20386 v.AddArg(w0) 20387 v.AddArg(mem) 20388 return true 20389 } 20390 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 20391 // cond: x.Uses == 1 && clobber(x) 20392 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20393 for { 20394 i := v.AuxInt 20395 s := v.Aux 20396 _ = v.Args[3] 20397 p := v.Args[0] 20398 idx := v.Args[1] 20399 v_2 := v.Args[2] 20400 if v_2.Op != OpS390XSRDconst { 20401 break 20402 } 20403 j := v_2.AuxInt 20404 w := v_2.Args[0] 20405 x := v.Args[3] 20406 if x.Op != OpS390XMOVWBRstoreidx { 20407 break 20408 } 20409 if x.AuxInt != i-4 { 20410 break 20411 } 20412 if x.Aux != s { 20413 break 20414 } 20415 _ = x.Args[3] 20416 if idx != x.Args[0] { 20417 break 20418 } 20419 if p != x.Args[1] { 20420 break 20421 } 20422 w0 := x.Args[2] 20423 if w0.Op != OpS390XSRDconst { 20424 break 20425 } 20426 if w0.AuxInt != j-32 { 20427 break 20428 } 20429 if w != w0.Args[0] { 20430 break 20431 } 20432 mem := x.Args[3] 20433 if !(x.Uses == 1 && clobber(x)) { 20434 break 20435 } 20436 v.reset(OpS390XMOVDBRstoreidx) 20437 v.AuxInt = i - 4 20438 v.Aux = s 20439 v.AddArg(p) 20440 v.AddArg(idx) 20441 v.AddArg(w0) 20442 v.AddArg(mem) 20443 return true 20444 } 20445 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 20446 // cond: x.Uses == 1 && clobber(x) 20447 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20448 for { 20449 i := v.AuxInt 20450 s := v.Aux 20451 _ = v.Args[3] 20452 idx := v.Args[0] 20453 p := v.Args[1] 20454 v_2 := v.Args[2] 20455 if v_2.Op != OpS390XSRDconst { 20456 break 20457 } 20458 j := v_2.AuxInt 20459 w := v_2.Args[0] 20460 x := v.Args[3] 20461 if x.Op != OpS390XMOVWBRstoreidx { 20462 break 20463 } 20464 if x.AuxInt != i-4 { 20465 break 20466 } 20467 if x.Aux != s { 20468 break 20469 } 20470 _ = x.Args[3] 20471 if p != x.Args[0] { 20472 break 20473 } 20474 if idx != x.Args[1] { 20475 break 20476 } 20477 w0 := x.Args[2] 20478 if w0.Op != OpS390XSRDconst { 20479 break 20480 } 20481 if w0.AuxInt != j-32 { 20482 break 20483 } 20484 if w != w0.Args[0] { 20485 break 20486 } 20487 mem := x.Args[3] 20488 if !(x.Uses == 1 && clobber(x)) { 20489 break 20490 } 20491 v.reset(OpS390XMOVDBRstoreidx) 20492 v.AuxInt = i - 4 20493 v.Aux = s 20494 v.AddArg(p) 20495 v.AddArg(idx) 20496 v.AddArg(w0) 20497 v.AddArg(mem) 20498 return true 20499 } 20500 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 20501 // cond: x.Uses == 1 && clobber(x) 20502 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20503 for { 20504 i := v.AuxInt 20505 s := v.Aux 20506 _ = v.Args[3] 20507 idx := v.Args[0] 20508 p := v.Args[1] 20509 v_2 := v.Args[2] 20510 if v_2.Op != OpS390XSRDconst { 20511 break 20512 } 20513 j := v_2.AuxInt 20514 w := v_2.Args[0] 20515 x := v.Args[3] 20516 if x.Op != OpS390XMOVWBRstoreidx { 20517 break 20518 } 20519 if x.AuxInt != i-4 { 20520 break 20521 } 20522 if x.Aux != s { 20523 break 20524 } 20525 _ = x.Args[3] 20526 if idx != x.Args[0] { 20527 break 20528 } 20529 if p != x.Args[1] { 20530 break 20531 } 20532 w0 := x.Args[2] 20533 if w0.Op != OpS390XSRDconst { 20534 break 20535 } 20536 if w0.AuxInt != j-32 { 20537 break 20538 } 20539 if w != w0.Args[0] { 20540 break 20541 } 20542 mem := x.Args[3] 20543 if !(x.Uses == 1 && clobber(x)) { 20544 break 20545 } 20546 v.reset(OpS390XMOVDBRstoreidx) 20547 v.AuxInt = i - 4 20548 v.Aux = s 20549 v.AddArg(p) 20550 v.AddArg(idx) 20551 v.AddArg(w0) 20552 v.AddArg(mem) 20553 return true 20554 } 20555 return false 20556 } 20557 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 20558 // match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 20559 // cond: isSamePtr(ptr1, ptr2) 20560 // result: (MOVWZreg x) 20561 for { 20562 off := v.AuxInt 20563 sym := v.Aux 20564 _ = v.Args[1] 20565 ptr1 := v.Args[0] 20566 v_1 := v.Args[1] 20567 if v_1.Op != OpS390XMOVWstore { 20568 break 20569 } 20570 if v_1.AuxInt != off { 20571 break 20572 } 20573 if v_1.Aux != sym { 20574 break 20575 } 20576 _ = v_1.Args[2] 20577 ptr2 := v_1.Args[0] 20578 x := v_1.Args[1] 20579 if !(isSamePtr(ptr1, ptr2)) { 20580 break 20581 } 20582 v.reset(OpS390XMOVWZreg) 20583 v.AddArg(x) 20584 return true 20585 } 20586 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 20587 // cond: is20Bit(off1+off2) 20588 // result: (MOVWZload [off1+off2] {sym} ptr mem) 20589 for { 20590 off1 := v.AuxInt 20591 sym := v.Aux 20592 _ = v.Args[1] 20593 v_0 := v.Args[0] 20594 if v_0.Op != OpS390XADDconst { 20595 break 20596 } 20597 off2 := v_0.AuxInt 20598 ptr := v_0.Args[0] 20599 mem := v.Args[1] 20600 if !(is20Bit(off1 + off2)) { 20601 break 20602 } 20603 v.reset(OpS390XMOVWZload) 20604 v.AuxInt = off1 + off2 20605 v.Aux = sym 20606 v.AddArg(ptr) 20607 v.AddArg(mem) 20608 return true 20609 } 20610 // match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 20611 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 20612 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 20613 for { 20614 off1 := v.AuxInt 20615 sym1 := v.Aux 20616 _ = v.Args[1] 20617 v_0 := v.Args[0] 20618 if v_0.Op != OpS390XMOVDaddr { 20619 break 20620 } 20621 t := v_0.Type 20622 off2 := v_0.AuxInt 20623 sym2 := v_0.Aux 20624 base := v_0.Args[0] 20625 mem := v.Args[1] 20626 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 20627 break 20628 } 20629 v.reset(OpS390XMOVWZload) 20630 v.AuxInt = off1 + off2 20631 v.Aux = mergeSym(sym1, sym2) 20632 v.AddArg(base) 20633 v.AddArg(mem) 20634 return true 20635 } 20636 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 20637 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 20638 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 20639 for { 20640 off1 := v.AuxInt 20641 sym1 := v.Aux 20642 _ = v.Args[1] 20643 v_0 := v.Args[0] 20644 if v_0.Op != OpS390XMOVDaddridx { 20645 break 20646 } 20647 off2 := v_0.AuxInt 20648 sym2 := v_0.Aux 20649 _ = v_0.Args[1] 20650 ptr := v_0.Args[0] 20651 idx := v_0.Args[1] 20652 mem := v.Args[1] 20653 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 20654 break 20655 } 20656 v.reset(OpS390XMOVWZloadidx) 20657 v.AuxInt = off1 + off2 20658 v.Aux = mergeSym(sym1, sym2) 20659 v.AddArg(ptr) 20660 v.AddArg(idx) 20661 v.AddArg(mem) 20662 return true 20663 } 20664 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 20665 // cond: ptr.Op != OpSB 20666 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 20667 for { 20668 off := v.AuxInt 20669 sym := v.Aux 20670 _ = v.Args[1] 20671 v_0 := v.Args[0] 20672 if v_0.Op != OpS390XADD { 20673 break 20674 } 20675 _ = v_0.Args[1] 20676 ptr := v_0.Args[0] 20677 idx := v_0.Args[1] 20678 mem := v.Args[1] 20679 if !(ptr.Op != OpSB) { 20680 break 20681 } 20682 v.reset(OpS390XMOVWZloadidx) 20683 v.AuxInt = off 20684 v.Aux = sym 20685 v.AddArg(ptr) 20686 v.AddArg(idx) 20687 v.AddArg(mem) 20688 return true 20689 } 20690 return false 20691 } 20692 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 20693 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 20694 // cond: is20Bit(c+d) 20695 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20696 for { 20697 c := v.AuxInt 20698 sym := v.Aux 20699 _ = v.Args[2] 20700 v_0 := v.Args[0] 20701 if v_0.Op != OpS390XADDconst { 20702 break 20703 } 20704 d := v_0.AuxInt 20705 ptr := v_0.Args[0] 20706 idx := v.Args[1] 20707 mem := v.Args[2] 20708 if !(is20Bit(c + d)) { 20709 break 20710 } 20711 v.reset(OpS390XMOVWZloadidx) 20712 v.AuxInt = c + d 20713 v.Aux = sym 20714 v.AddArg(ptr) 20715 v.AddArg(idx) 20716 v.AddArg(mem) 20717 return true 20718 } 20719 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 20720 // cond: is20Bit(c+d) 20721 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20722 for { 20723 c := v.AuxInt 20724 sym := v.Aux 20725 _ = v.Args[2] 20726 idx := v.Args[0] 20727 v_1 := v.Args[1] 20728 if v_1.Op != OpS390XADDconst { 20729 break 20730 } 20731 d := v_1.AuxInt 20732 ptr := v_1.Args[0] 20733 mem := v.Args[2] 20734 if !(is20Bit(c + d)) { 20735 break 20736 } 20737 v.reset(OpS390XMOVWZloadidx) 20738 v.AuxInt = c + d 20739 v.Aux = sym 20740 v.AddArg(ptr) 20741 v.AddArg(idx) 20742 v.AddArg(mem) 20743 return true 20744 } 20745 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 20746 // cond: is20Bit(c+d) 20747 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20748 for { 20749 c := v.AuxInt 20750 sym := v.Aux 20751 _ = v.Args[2] 20752 ptr := v.Args[0] 20753 v_1 := v.Args[1] 20754 if v_1.Op != OpS390XADDconst { 20755 break 20756 } 20757 d := v_1.AuxInt 20758 idx := v_1.Args[0] 20759 mem := v.Args[2] 20760 if !(is20Bit(c + d)) { 20761 break 20762 } 20763 v.reset(OpS390XMOVWZloadidx) 20764 v.AuxInt = c + d 20765 v.Aux = sym 20766 v.AddArg(ptr) 20767 v.AddArg(idx) 20768 v.AddArg(mem) 20769 return true 20770 } 20771 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 20772 // cond: is20Bit(c+d) 20773 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20774 for { 20775 c := v.AuxInt 20776 sym := v.Aux 20777 _ = v.Args[2] 20778 v_0 := v.Args[0] 20779 if v_0.Op != OpS390XADDconst { 20780 break 20781 } 20782 d := v_0.AuxInt 20783 idx := v_0.Args[0] 20784 ptr := v.Args[1] 20785 mem := v.Args[2] 20786 if !(is20Bit(c + d)) { 20787 break 20788 } 20789 v.reset(OpS390XMOVWZloadidx) 20790 v.AuxInt = c + d 20791 v.Aux = sym 20792 v.AddArg(ptr) 20793 v.AddArg(idx) 20794 v.AddArg(mem) 20795 return true 20796 } 20797 return false 20798 } 20799 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 20800 b := v.Block 20801 _ = b 20802 // match: (MOVWZreg x:(MOVBZload _ _)) 20803 // cond: 20804 // result: (MOVDreg x) 20805 for { 20806 x := v.Args[0] 20807 if x.Op != OpS390XMOVBZload { 20808 break 20809 } 20810 _ = x.Args[1] 20811 v.reset(OpS390XMOVDreg) 20812 v.AddArg(x) 20813 return true 20814 } 20815 // match: (MOVWZreg x:(MOVHZload _ _)) 20816 // cond: 20817 // result: (MOVDreg x) 20818 for { 20819 x := v.Args[0] 20820 if x.Op != OpS390XMOVHZload { 20821 break 20822 } 20823 _ = x.Args[1] 20824 v.reset(OpS390XMOVDreg) 20825 v.AddArg(x) 20826 return true 20827 } 20828 // match: (MOVWZreg x:(MOVWZload _ _)) 20829 // cond: 20830 // result: (MOVDreg x) 20831 for { 20832 x := v.Args[0] 20833 if x.Op != OpS390XMOVWZload { 20834 break 20835 } 20836 _ = x.Args[1] 20837 v.reset(OpS390XMOVDreg) 20838 v.AddArg(x) 20839 return true 20840 } 20841 // match: (MOVWZreg x:(Arg <t>)) 20842 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 20843 // result: (MOVDreg x) 20844 for { 20845 x := v.Args[0] 20846 if x.Op != OpArg { 20847 break 20848 } 20849 t := x.Type 20850 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 20851 break 20852 } 20853 v.reset(OpS390XMOVDreg) 20854 v.AddArg(x) 20855 return true 20856 } 20857 // match: (MOVWZreg x:(MOVBZreg _)) 20858 // cond: 20859 // result: (MOVDreg x) 20860 for { 20861 x := v.Args[0] 20862 if x.Op != OpS390XMOVBZreg { 20863 break 20864 } 20865 v.reset(OpS390XMOVDreg) 20866 v.AddArg(x) 20867 return true 20868 } 20869 // match: (MOVWZreg x:(MOVHZreg _)) 20870 // cond: 20871 // result: (MOVDreg x) 20872 for { 20873 x := v.Args[0] 20874 if x.Op != OpS390XMOVHZreg { 20875 break 20876 } 20877 v.reset(OpS390XMOVDreg) 20878 v.AddArg(x) 20879 return true 20880 } 20881 // match: (MOVWZreg x:(MOVWZreg _)) 20882 // cond: 20883 // result: (MOVDreg x) 20884 for { 20885 x := v.Args[0] 20886 if x.Op != OpS390XMOVWZreg { 20887 break 20888 } 20889 v.reset(OpS390XMOVDreg) 20890 v.AddArg(x) 20891 return true 20892 } 20893 // match: (MOVWZreg (MOVWreg x)) 20894 // cond: 20895 // result: (MOVWZreg x) 20896 for { 20897 v_0 := v.Args[0] 20898 if v_0.Op != OpS390XMOVWreg { 20899 break 20900 } 20901 x := v_0.Args[0] 20902 v.reset(OpS390XMOVWZreg) 20903 v.AddArg(x) 20904 return true 20905 } 20906 // match: (MOVWZreg (MOVDconst [c])) 20907 // cond: 20908 // result: (MOVDconst [int64(uint32(c))]) 20909 for { 20910 v_0 := v.Args[0] 20911 if v_0.Op != OpS390XMOVDconst { 20912 break 20913 } 20914 c := v_0.AuxInt 20915 v.reset(OpS390XMOVDconst) 20916 v.AuxInt = int64(uint32(c)) 20917 return true 20918 } 20919 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 20920 // cond: x.Uses == 1 && clobber(x) 20921 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 20922 for { 20923 x := v.Args[0] 20924 if x.Op != OpS390XMOVWZload { 20925 break 20926 } 20927 off := x.AuxInt 20928 sym := x.Aux 20929 _ = x.Args[1] 20930 ptr := x.Args[0] 20931 mem := x.Args[1] 20932 if !(x.Uses == 1 && clobber(x)) { 20933 break 20934 } 20935 b = x.Block 20936 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 20937 v.reset(OpCopy) 20938 v.AddArg(v0) 20939 v0.AuxInt = off 20940 v0.Aux = sym 20941 v0.AddArg(ptr) 20942 v0.AddArg(mem) 20943 return true 20944 } 20945 return false 20946 } 20947 func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { 20948 b := v.Block 20949 _ = b 20950 // match: (MOVWZreg x:(MOVWload [off] {sym} ptr mem)) 20951 // cond: x.Uses == 1 && clobber(x) 20952 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 20953 for { 20954 x := v.Args[0] 20955 if x.Op != OpS390XMOVWload { 20956 break 20957 } 20958 off := x.AuxInt 20959 sym := x.Aux 20960 _ = x.Args[1] 20961 ptr := x.Args[0] 20962 mem := x.Args[1] 20963 if !(x.Uses == 1 && clobber(x)) { 20964 break 20965 } 20966 b = x.Block 20967 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 20968 v.reset(OpCopy) 20969 v.AddArg(v0) 20970 v0.AuxInt = off 20971 v0.Aux = sym 20972 v0.AddArg(ptr) 20973 v0.AddArg(mem) 20974 return true 20975 } 20976 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 20977 // cond: x.Uses == 1 && clobber(x) 20978 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 20979 for { 20980 x := v.Args[0] 20981 if x.Op != OpS390XMOVWZloadidx { 20982 break 20983 } 20984 off := x.AuxInt 20985 sym := x.Aux 20986 _ = x.Args[2] 20987 ptr := x.Args[0] 20988 idx := x.Args[1] 20989 mem := x.Args[2] 20990 if !(x.Uses == 1 && clobber(x)) { 20991 break 20992 } 20993 b = x.Block 20994 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 20995 v.reset(OpCopy) 20996 v.AddArg(v0) 20997 v0.AuxInt = off 20998 v0.Aux = sym 20999 v0.AddArg(ptr) 21000 v0.AddArg(idx) 21001 v0.AddArg(mem) 21002 return true 21003 } 21004 // match: (MOVWZreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 21005 // cond: x.Uses == 1 && clobber(x) 21006 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 21007 for { 21008 x := v.Args[0] 21009 if x.Op != OpS390XMOVWloadidx { 21010 break 21011 } 21012 off := x.AuxInt 21013 sym := x.Aux 21014 _ = x.Args[2] 21015 ptr := x.Args[0] 21016 idx := x.Args[1] 21017 mem := x.Args[2] 21018 if !(x.Uses == 1 && clobber(x)) { 21019 break 21020 } 21021 b = x.Block 21022 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 21023 v.reset(OpCopy) 21024 v.AddArg(v0) 21025 v0.AuxInt = off 21026 v0.Aux = sym 21027 v0.AddArg(ptr) 21028 v0.AddArg(idx) 21029 v0.AddArg(mem) 21030 return true 21031 } 21032 return false 21033 } 21034 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 21035 // match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 21036 // cond: isSamePtr(ptr1, ptr2) 21037 // result: (MOVWreg x) 21038 for { 21039 off := v.AuxInt 21040 sym := v.Aux 21041 _ = v.Args[1] 21042 ptr1 := v.Args[0] 21043 v_1 := v.Args[1] 21044 if v_1.Op != OpS390XMOVWstore { 21045 break 21046 } 21047 if v_1.AuxInt != off { 21048 break 21049 } 21050 if v_1.Aux != sym { 21051 break 21052 } 21053 _ = v_1.Args[2] 21054 ptr2 := v_1.Args[0] 21055 x := v_1.Args[1] 21056 if !(isSamePtr(ptr1, ptr2)) { 21057 break 21058 } 21059 v.reset(OpS390XMOVWreg) 21060 v.AddArg(x) 21061 return true 21062 } 21063 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 21064 // cond: is20Bit(off1+off2) 21065 // result: (MOVWload [off1+off2] {sym} ptr mem) 21066 for { 21067 off1 := v.AuxInt 21068 sym := v.Aux 21069 _ = v.Args[1] 21070 v_0 := v.Args[0] 21071 if v_0.Op != OpS390XADDconst { 21072 break 21073 } 21074 off2 := v_0.AuxInt 21075 ptr := v_0.Args[0] 21076 mem := v.Args[1] 21077 if !(is20Bit(off1 + off2)) { 21078 break 21079 } 21080 v.reset(OpS390XMOVWload) 21081 v.AuxInt = off1 + off2 21082 v.Aux = sym 21083 v.AddArg(ptr) 21084 v.AddArg(mem) 21085 return true 21086 } 21087 // match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 21088 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 21089 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 21090 for { 21091 off1 := v.AuxInt 21092 sym1 := v.Aux 21093 _ = v.Args[1] 21094 v_0 := v.Args[0] 21095 if v_0.Op != OpS390XMOVDaddr { 21096 break 21097 } 21098 t := v_0.Type 21099 off2 := v_0.AuxInt 21100 sym2 := v_0.Aux 21101 base := v_0.Args[0] 21102 mem := v.Args[1] 21103 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 21104 break 21105 } 21106 v.reset(OpS390XMOVWload) 21107 v.AuxInt = off1 + off2 21108 v.Aux = mergeSym(sym1, sym2) 21109 v.AddArg(base) 21110 v.AddArg(mem) 21111 return true 21112 } 21113 // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 21114 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 21115 // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 21116 for { 21117 off1 := v.AuxInt 21118 sym1 := v.Aux 21119 _ = v.Args[1] 21120 v_0 := v.Args[0] 21121 if v_0.Op != OpS390XMOVDaddridx { 21122 break 21123 } 21124 off2 := v_0.AuxInt 21125 sym2 := v_0.Aux 21126 _ = v_0.Args[1] 21127 ptr := v_0.Args[0] 21128 idx := v_0.Args[1] 21129 mem := v.Args[1] 21130 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 21131 break 21132 } 21133 v.reset(OpS390XMOVWloadidx) 21134 v.AuxInt = off1 + off2 21135 v.Aux = mergeSym(sym1, sym2) 21136 v.AddArg(ptr) 21137 v.AddArg(idx) 21138 v.AddArg(mem) 21139 return true 21140 } 21141 // match: (MOVWload [off] {sym} (ADD ptr idx) mem) 21142 // cond: ptr.Op != OpSB 21143 // result: (MOVWloadidx [off] {sym} ptr idx mem) 21144 for { 21145 off := v.AuxInt 21146 sym := v.Aux 21147 _ = v.Args[1] 21148 v_0 := v.Args[0] 21149 if v_0.Op != OpS390XADD { 21150 break 21151 } 21152 _ = v_0.Args[1] 21153 ptr := v_0.Args[0] 21154 idx := v_0.Args[1] 21155 mem := v.Args[1] 21156 if !(ptr.Op != OpSB) { 21157 break 21158 } 21159 v.reset(OpS390XMOVWloadidx) 21160 v.AuxInt = off 21161 v.Aux = sym 21162 v.AddArg(ptr) 21163 v.AddArg(idx) 21164 v.AddArg(mem) 21165 return true 21166 } 21167 return false 21168 } 21169 func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { 21170 // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 21171 // cond: is20Bit(c+d) 21172 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21173 for { 21174 c := v.AuxInt 21175 sym := v.Aux 21176 _ = v.Args[2] 21177 v_0 := v.Args[0] 21178 if v_0.Op != OpS390XADDconst { 21179 break 21180 } 21181 d := v_0.AuxInt 21182 ptr := v_0.Args[0] 21183 idx := v.Args[1] 21184 mem := v.Args[2] 21185 if !(is20Bit(c + d)) { 21186 break 21187 } 21188 v.reset(OpS390XMOVWloadidx) 21189 v.AuxInt = c + d 21190 v.Aux = sym 21191 v.AddArg(ptr) 21192 v.AddArg(idx) 21193 v.AddArg(mem) 21194 return true 21195 } 21196 // match: (MOVWloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 21197 // cond: is20Bit(c+d) 21198 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21199 for { 21200 c := v.AuxInt 21201 sym := v.Aux 21202 _ = v.Args[2] 21203 idx := v.Args[0] 21204 v_1 := v.Args[1] 21205 if v_1.Op != OpS390XADDconst { 21206 break 21207 } 21208 d := v_1.AuxInt 21209 ptr := v_1.Args[0] 21210 mem := v.Args[2] 21211 if !(is20Bit(c + d)) { 21212 break 21213 } 21214 v.reset(OpS390XMOVWloadidx) 21215 v.AuxInt = c + d 21216 v.Aux = sym 21217 v.AddArg(ptr) 21218 v.AddArg(idx) 21219 v.AddArg(mem) 21220 return true 21221 } 21222 // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 21223 // cond: is20Bit(c+d) 21224 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21225 for { 21226 c := v.AuxInt 21227 sym := v.Aux 21228 _ = v.Args[2] 21229 ptr := v.Args[0] 21230 v_1 := v.Args[1] 21231 if v_1.Op != OpS390XADDconst { 21232 break 21233 } 21234 d := v_1.AuxInt 21235 idx := v_1.Args[0] 21236 mem := v.Args[2] 21237 if !(is20Bit(c + d)) { 21238 break 21239 } 21240 v.reset(OpS390XMOVWloadidx) 21241 v.AuxInt = c + d 21242 v.Aux = sym 21243 v.AddArg(ptr) 21244 v.AddArg(idx) 21245 v.AddArg(mem) 21246 return true 21247 } 21248 // match: (MOVWloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 21249 // cond: is20Bit(c+d) 21250 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21251 for { 21252 c := v.AuxInt 21253 sym := v.Aux 21254 _ = v.Args[2] 21255 v_0 := v.Args[0] 21256 if v_0.Op != OpS390XADDconst { 21257 break 21258 } 21259 d := v_0.AuxInt 21260 idx := v_0.Args[0] 21261 ptr := v.Args[1] 21262 mem := v.Args[2] 21263 if !(is20Bit(c + d)) { 21264 break 21265 } 21266 v.reset(OpS390XMOVWloadidx) 21267 v.AuxInt = c + d 21268 v.Aux = sym 21269 v.AddArg(ptr) 21270 v.AddArg(idx) 21271 v.AddArg(mem) 21272 return true 21273 } 21274 return false 21275 } 21276 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 21277 // match: (MOVWreg x:(MOVBload _ _)) 21278 // cond: 21279 // result: (MOVDreg x) 21280 for { 21281 x := v.Args[0] 21282 if x.Op != OpS390XMOVBload { 21283 break 21284 } 21285 _ = x.Args[1] 21286 v.reset(OpS390XMOVDreg) 21287 v.AddArg(x) 21288 return true 21289 } 21290 // match: (MOVWreg x:(MOVBZload _ _)) 21291 // cond: 21292 // result: (MOVDreg x) 21293 for { 21294 x := v.Args[0] 21295 if x.Op != OpS390XMOVBZload { 21296 break 21297 } 21298 _ = x.Args[1] 21299 v.reset(OpS390XMOVDreg) 21300 v.AddArg(x) 21301 return true 21302 } 21303 // match: (MOVWreg x:(MOVHload _ _)) 21304 // cond: 21305 // result: (MOVDreg x) 21306 for { 21307 x := v.Args[0] 21308 if x.Op != OpS390XMOVHload { 21309 break 21310 } 21311 _ = x.Args[1] 21312 v.reset(OpS390XMOVDreg) 21313 v.AddArg(x) 21314 return true 21315 } 21316 // match: (MOVWreg x:(MOVHZload _ _)) 21317 // cond: 21318 // result: (MOVDreg x) 21319 for { 21320 x := v.Args[0] 21321 if x.Op != OpS390XMOVHZload { 21322 break 21323 } 21324 _ = x.Args[1] 21325 v.reset(OpS390XMOVDreg) 21326 v.AddArg(x) 21327 return true 21328 } 21329 // match: (MOVWreg x:(MOVWload _ _)) 21330 // cond: 21331 // result: (MOVDreg x) 21332 for { 21333 x := v.Args[0] 21334 if x.Op != OpS390XMOVWload { 21335 break 21336 } 21337 _ = x.Args[1] 21338 v.reset(OpS390XMOVDreg) 21339 v.AddArg(x) 21340 return true 21341 } 21342 // match: (MOVWreg x:(Arg <t>)) 21343 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 21344 // result: (MOVDreg x) 21345 for { 21346 x := v.Args[0] 21347 if x.Op != OpArg { 21348 break 21349 } 21350 t := x.Type 21351 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 21352 break 21353 } 21354 v.reset(OpS390XMOVDreg) 21355 v.AddArg(x) 21356 return true 21357 } 21358 // match: (MOVWreg x:(MOVBreg _)) 21359 // cond: 21360 // result: (MOVDreg x) 21361 for { 21362 x := v.Args[0] 21363 if x.Op != OpS390XMOVBreg { 21364 break 21365 } 21366 v.reset(OpS390XMOVDreg) 21367 v.AddArg(x) 21368 return true 21369 } 21370 // match: (MOVWreg x:(MOVBZreg _)) 21371 // cond: 21372 // result: (MOVDreg x) 21373 for { 21374 x := v.Args[0] 21375 if x.Op != OpS390XMOVBZreg { 21376 break 21377 } 21378 v.reset(OpS390XMOVDreg) 21379 v.AddArg(x) 21380 return true 21381 } 21382 // match: (MOVWreg x:(MOVHreg _)) 21383 // cond: 21384 // result: (MOVDreg x) 21385 for { 21386 x := v.Args[0] 21387 if x.Op != OpS390XMOVHreg { 21388 break 21389 } 21390 v.reset(OpS390XMOVDreg) 21391 v.AddArg(x) 21392 return true 21393 } 21394 // match: (MOVWreg x:(MOVHZreg _)) 21395 // cond: 21396 // result: (MOVDreg x) 21397 for { 21398 x := v.Args[0] 21399 if x.Op != OpS390XMOVHZreg { 21400 break 21401 } 21402 v.reset(OpS390XMOVDreg) 21403 v.AddArg(x) 21404 return true 21405 } 21406 return false 21407 } 21408 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 21409 b := v.Block 21410 _ = b 21411 // match: (MOVWreg x:(MOVWreg _)) 21412 // cond: 21413 // result: (MOVDreg x) 21414 for { 21415 x := v.Args[0] 21416 if x.Op != OpS390XMOVWreg { 21417 break 21418 } 21419 v.reset(OpS390XMOVDreg) 21420 v.AddArg(x) 21421 return true 21422 } 21423 // match: (MOVWreg (MOVWZreg x)) 21424 // cond: 21425 // result: (MOVWreg x) 21426 for { 21427 v_0 := v.Args[0] 21428 if v_0.Op != OpS390XMOVWZreg { 21429 break 21430 } 21431 x := v_0.Args[0] 21432 v.reset(OpS390XMOVWreg) 21433 v.AddArg(x) 21434 return true 21435 } 21436 // match: (MOVWreg (MOVDconst [c])) 21437 // cond: 21438 // result: (MOVDconst [int64(int32(c))]) 21439 for { 21440 v_0 := v.Args[0] 21441 if v_0.Op != OpS390XMOVDconst { 21442 break 21443 } 21444 c := v_0.AuxInt 21445 v.reset(OpS390XMOVDconst) 21446 v.AuxInt = int64(int32(c)) 21447 return true 21448 } 21449 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 21450 // cond: x.Uses == 1 && clobber(x) 21451 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 21452 for { 21453 x := v.Args[0] 21454 if x.Op != OpS390XMOVWZload { 21455 break 21456 } 21457 off := x.AuxInt 21458 sym := x.Aux 21459 _ = x.Args[1] 21460 ptr := x.Args[0] 21461 mem := x.Args[1] 21462 if !(x.Uses == 1 && clobber(x)) { 21463 break 21464 } 21465 b = x.Block 21466 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 21467 v.reset(OpCopy) 21468 v.AddArg(v0) 21469 v0.AuxInt = off 21470 v0.Aux = sym 21471 v0.AddArg(ptr) 21472 v0.AddArg(mem) 21473 return true 21474 } 21475 // match: (MOVWreg x:(MOVWload [off] {sym} ptr mem)) 21476 // cond: x.Uses == 1 && clobber(x) 21477 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 21478 for { 21479 x := v.Args[0] 21480 if x.Op != OpS390XMOVWload { 21481 break 21482 } 21483 off := x.AuxInt 21484 sym := x.Aux 21485 _ = x.Args[1] 21486 ptr := x.Args[0] 21487 mem := x.Args[1] 21488 if !(x.Uses == 1 && clobber(x)) { 21489 break 21490 } 21491 b = x.Block 21492 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 21493 v.reset(OpCopy) 21494 v.AddArg(v0) 21495 v0.AuxInt = off 21496 v0.Aux = sym 21497 v0.AddArg(ptr) 21498 v0.AddArg(mem) 21499 return true 21500 } 21501 // match: (MOVWreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 21502 // cond: x.Uses == 1 && clobber(x) 21503 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 21504 for { 21505 x := v.Args[0] 21506 if x.Op != OpS390XMOVWZloadidx { 21507 break 21508 } 21509 off := x.AuxInt 21510 sym := x.Aux 21511 _ = x.Args[2] 21512 ptr := x.Args[0] 21513 idx := x.Args[1] 21514 mem := x.Args[2] 21515 if !(x.Uses == 1 && clobber(x)) { 21516 break 21517 } 21518 b = x.Block 21519 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 21520 v.reset(OpCopy) 21521 v.AddArg(v0) 21522 v0.AuxInt = off 21523 v0.Aux = sym 21524 v0.AddArg(ptr) 21525 v0.AddArg(idx) 21526 v0.AddArg(mem) 21527 return true 21528 } 21529 // match: (MOVWreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 21530 // cond: x.Uses == 1 && clobber(x) 21531 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 21532 for { 21533 x := v.Args[0] 21534 if x.Op != OpS390XMOVWloadidx { 21535 break 21536 } 21537 off := x.AuxInt 21538 sym := x.Aux 21539 _ = x.Args[2] 21540 ptr := x.Args[0] 21541 idx := x.Args[1] 21542 mem := x.Args[2] 21543 if !(x.Uses == 1 && clobber(x)) { 21544 break 21545 } 21546 b = x.Block 21547 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 21548 v.reset(OpCopy) 21549 v.AddArg(v0) 21550 v0.AuxInt = off 21551 v0.Aux = sym 21552 v0.AddArg(ptr) 21553 v0.AddArg(idx) 21554 v0.AddArg(mem) 21555 return true 21556 } 21557 return false 21558 } 21559 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 21560 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 21561 // cond: 21562 // result: (MOVWstore [off] {sym} ptr x mem) 21563 for { 21564 off := v.AuxInt 21565 sym := v.Aux 21566 _ = v.Args[2] 21567 ptr := v.Args[0] 21568 v_1 := v.Args[1] 21569 if v_1.Op != OpS390XMOVWreg { 21570 break 21571 } 21572 x := v_1.Args[0] 21573 mem := v.Args[2] 21574 v.reset(OpS390XMOVWstore) 21575 v.AuxInt = off 21576 v.Aux = sym 21577 v.AddArg(ptr) 21578 v.AddArg(x) 21579 v.AddArg(mem) 21580 return true 21581 } 21582 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 21583 // cond: 21584 // result: (MOVWstore [off] {sym} ptr x mem) 21585 for { 21586 off := v.AuxInt 21587 sym := v.Aux 21588 _ = v.Args[2] 21589 ptr := v.Args[0] 21590 v_1 := v.Args[1] 21591 if v_1.Op != OpS390XMOVWZreg { 21592 break 21593 } 21594 x := v_1.Args[0] 21595 mem := v.Args[2] 21596 v.reset(OpS390XMOVWstore) 21597 v.AuxInt = off 21598 v.Aux = sym 21599 v.AddArg(ptr) 21600 v.AddArg(x) 21601 v.AddArg(mem) 21602 return true 21603 } 21604 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 21605 // cond: is20Bit(off1+off2) 21606 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 21607 for { 21608 off1 := v.AuxInt 21609 sym := v.Aux 21610 _ = v.Args[2] 21611 v_0 := v.Args[0] 21612 if v_0.Op != OpS390XADDconst { 21613 break 21614 } 21615 off2 := v_0.AuxInt 21616 ptr := v_0.Args[0] 21617 val := v.Args[1] 21618 mem := v.Args[2] 21619 if !(is20Bit(off1 + off2)) { 21620 break 21621 } 21622 v.reset(OpS390XMOVWstore) 21623 v.AuxInt = off1 + off2 21624 v.Aux = sym 21625 v.AddArg(ptr) 21626 v.AddArg(val) 21627 v.AddArg(mem) 21628 return true 21629 } 21630 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 21631 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 21632 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 21633 for { 21634 off := v.AuxInt 21635 sym := v.Aux 21636 _ = v.Args[2] 21637 ptr := v.Args[0] 21638 v_1 := v.Args[1] 21639 if v_1.Op != OpS390XMOVDconst { 21640 break 21641 } 21642 c := v_1.AuxInt 21643 mem := v.Args[2] 21644 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 21645 break 21646 } 21647 v.reset(OpS390XMOVWstoreconst) 21648 v.AuxInt = makeValAndOff(int64(int32(c)), off) 21649 v.Aux = sym 21650 v.AddArg(ptr) 21651 v.AddArg(mem) 21652 return true 21653 } 21654 // match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 21655 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 21656 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 21657 for { 21658 off1 := v.AuxInt 21659 sym1 := v.Aux 21660 _ = v.Args[2] 21661 v_0 := v.Args[0] 21662 if v_0.Op != OpS390XMOVDaddr { 21663 break 21664 } 21665 t := v_0.Type 21666 off2 := v_0.AuxInt 21667 sym2 := v_0.Aux 21668 base := v_0.Args[0] 21669 val := v.Args[1] 21670 mem := v.Args[2] 21671 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 21672 break 21673 } 21674 v.reset(OpS390XMOVWstore) 21675 v.AuxInt = off1 + off2 21676 v.Aux = mergeSym(sym1, sym2) 21677 v.AddArg(base) 21678 v.AddArg(val) 21679 v.AddArg(mem) 21680 return true 21681 } 21682 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 21683 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 21684 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 21685 for { 21686 off1 := v.AuxInt 21687 sym1 := v.Aux 21688 _ = v.Args[2] 21689 v_0 := v.Args[0] 21690 if v_0.Op != OpS390XMOVDaddridx { 21691 break 21692 } 21693 off2 := v_0.AuxInt 21694 sym2 := v_0.Aux 21695 _ = v_0.Args[1] 21696 ptr := v_0.Args[0] 21697 idx := v_0.Args[1] 21698 val := v.Args[1] 21699 mem := v.Args[2] 21700 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 21701 break 21702 } 21703 v.reset(OpS390XMOVWstoreidx) 21704 v.AuxInt = off1 + off2 21705 v.Aux = mergeSym(sym1, sym2) 21706 v.AddArg(ptr) 21707 v.AddArg(idx) 21708 v.AddArg(val) 21709 v.AddArg(mem) 21710 return true 21711 } 21712 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 21713 // cond: ptr.Op != OpSB 21714 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 21715 for { 21716 off := v.AuxInt 21717 sym := v.Aux 21718 _ = v.Args[2] 21719 v_0 := v.Args[0] 21720 if v_0.Op != OpS390XADD { 21721 break 21722 } 21723 _ = v_0.Args[1] 21724 ptr := v_0.Args[0] 21725 idx := v_0.Args[1] 21726 val := v.Args[1] 21727 mem := v.Args[2] 21728 if !(ptr.Op != OpSB) { 21729 break 21730 } 21731 v.reset(OpS390XMOVWstoreidx) 21732 v.AuxInt = off 21733 v.Aux = sym 21734 v.AddArg(ptr) 21735 v.AddArg(idx) 21736 v.AddArg(val) 21737 v.AddArg(mem) 21738 return true 21739 } 21740 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 21741 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 21742 // result: (MOVDstore [i-4] {s} p w mem) 21743 for { 21744 i := v.AuxInt 21745 s := v.Aux 21746 _ = v.Args[2] 21747 p := v.Args[0] 21748 v_1 := v.Args[1] 21749 if v_1.Op != OpS390XSRDconst { 21750 break 21751 } 21752 if v_1.AuxInt != 32 { 21753 break 21754 } 21755 w := v_1.Args[0] 21756 x := v.Args[2] 21757 if x.Op != OpS390XMOVWstore { 21758 break 21759 } 21760 if x.AuxInt != i-4 { 21761 break 21762 } 21763 if x.Aux != s { 21764 break 21765 } 21766 _ = x.Args[2] 21767 if p != x.Args[0] { 21768 break 21769 } 21770 if w != x.Args[1] { 21771 break 21772 } 21773 mem := x.Args[2] 21774 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 21775 break 21776 } 21777 v.reset(OpS390XMOVDstore) 21778 v.AuxInt = i - 4 21779 v.Aux = s 21780 v.AddArg(p) 21781 v.AddArg(w) 21782 v.AddArg(mem) 21783 return true 21784 } 21785 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 21786 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 21787 // result: (MOVDstore [i-4] {s} p w0 mem) 21788 for { 21789 i := v.AuxInt 21790 s := v.Aux 21791 _ = v.Args[2] 21792 p := v.Args[0] 21793 w0 := v.Args[1] 21794 if w0.Op != OpS390XSRDconst { 21795 break 21796 } 21797 j := w0.AuxInt 21798 w := w0.Args[0] 21799 x := v.Args[2] 21800 if x.Op != OpS390XMOVWstore { 21801 break 21802 } 21803 if x.AuxInt != i-4 { 21804 break 21805 } 21806 if x.Aux != s { 21807 break 21808 } 21809 _ = x.Args[2] 21810 if p != x.Args[0] { 21811 break 21812 } 21813 x_1 := x.Args[1] 21814 if x_1.Op != OpS390XSRDconst { 21815 break 21816 } 21817 if x_1.AuxInt != j+32 { 21818 break 21819 } 21820 if w != x_1.Args[0] { 21821 break 21822 } 21823 mem := x.Args[2] 21824 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 21825 break 21826 } 21827 v.reset(OpS390XMOVDstore) 21828 v.AuxInt = i - 4 21829 v.Aux = s 21830 v.AddArg(p) 21831 v.AddArg(w0) 21832 v.AddArg(mem) 21833 return true 21834 } 21835 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 21836 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 21837 // result: (STM2 [i-4] {s} p w0 w1 mem) 21838 for { 21839 i := v.AuxInt 21840 s := v.Aux 21841 _ = v.Args[2] 21842 p := v.Args[0] 21843 w1 := v.Args[1] 21844 x := v.Args[2] 21845 if x.Op != OpS390XMOVWstore { 21846 break 21847 } 21848 if x.AuxInt != i-4 { 21849 break 21850 } 21851 if x.Aux != s { 21852 break 21853 } 21854 _ = x.Args[2] 21855 if p != x.Args[0] { 21856 break 21857 } 21858 w0 := x.Args[1] 21859 mem := x.Args[2] 21860 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 21861 break 21862 } 21863 v.reset(OpS390XSTM2) 21864 v.AuxInt = i - 4 21865 v.Aux = s 21866 v.AddArg(p) 21867 v.AddArg(w0) 21868 v.AddArg(w1) 21869 v.AddArg(mem) 21870 return true 21871 } 21872 return false 21873 } 21874 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 21875 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 21876 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 21877 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 21878 for { 21879 i := v.AuxInt 21880 s := v.Aux 21881 _ = v.Args[2] 21882 p := v.Args[0] 21883 w2 := v.Args[1] 21884 x := v.Args[2] 21885 if x.Op != OpS390XSTM2 { 21886 break 21887 } 21888 if x.AuxInt != i-8 { 21889 break 21890 } 21891 if x.Aux != s { 21892 break 21893 } 21894 _ = x.Args[3] 21895 if p != x.Args[0] { 21896 break 21897 } 21898 w0 := x.Args[1] 21899 w1 := x.Args[2] 21900 mem := x.Args[3] 21901 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 21902 break 21903 } 21904 v.reset(OpS390XSTM3) 21905 v.AuxInt = i - 8 21906 v.Aux = s 21907 v.AddArg(p) 21908 v.AddArg(w0) 21909 v.AddArg(w1) 21910 v.AddArg(w2) 21911 v.AddArg(mem) 21912 return true 21913 } 21914 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 21915 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 21916 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 21917 for { 21918 i := v.AuxInt 21919 s := v.Aux 21920 _ = v.Args[2] 21921 p := v.Args[0] 21922 w3 := v.Args[1] 21923 x := v.Args[2] 21924 if x.Op != OpS390XSTM3 { 21925 break 21926 } 21927 if x.AuxInt != i-12 { 21928 break 21929 } 21930 if x.Aux != s { 21931 break 21932 } 21933 _ = x.Args[4] 21934 if p != x.Args[0] { 21935 break 21936 } 21937 w0 := x.Args[1] 21938 w1 := x.Args[2] 21939 w2 := x.Args[3] 21940 mem := x.Args[4] 21941 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 21942 break 21943 } 21944 v.reset(OpS390XSTM4) 21945 v.AuxInt = i - 12 21946 v.Aux = s 21947 v.AddArg(p) 21948 v.AddArg(w0) 21949 v.AddArg(w1) 21950 v.AddArg(w2) 21951 v.AddArg(w3) 21952 v.AddArg(mem) 21953 return true 21954 } 21955 return false 21956 } 21957 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 21958 b := v.Block 21959 _ = b 21960 typ := &b.Func.Config.Types 21961 _ = typ 21962 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 21963 // cond: isU12Bit(ValAndOff(sc).Off()+off) 21964 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 21965 for { 21966 sc := v.AuxInt 21967 s := v.Aux 21968 _ = v.Args[1] 21969 v_0 := v.Args[0] 21970 if v_0.Op != OpS390XADDconst { 21971 break 21972 } 21973 off := v_0.AuxInt 21974 ptr := v_0.Args[0] 21975 mem := v.Args[1] 21976 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 21977 break 21978 } 21979 v.reset(OpS390XMOVWstoreconst) 21980 v.AuxInt = ValAndOff(sc).add(off) 21981 v.Aux = s 21982 v.AddArg(ptr) 21983 v.AddArg(mem) 21984 return true 21985 } 21986 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 21987 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 21988 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 21989 for { 21990 sc := v.AuxInt 21991 sym1 := v.Aux 21992 _ = v.Args[1] 21993 v_0 := v.Args[0] 21994 if v_0.Op != OpS390XMOVDaddr { 21995 break 21996 } 21997 off := v_0.AuxInt 21998 sym2 := v_0.Aux 21999 ptr := v_0.Args[0] 22000 mem := v.Args[1] 22001 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 22002 break 22003 } 22004 v.reset(OpS390XMOVWstoreconst) 22005 v.AuxInt = ValAndOff(sc).add(off) 22006 v.Aux = mergeSym(sym1, sym2) 22007 v.AddArg(ptr) 22008 v.AddArg(mem) 22009 return true 22010 } 22011 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 22012 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 22013 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 22014 for { 22015 c := v.AuxInt 22016 s := v.Aux 22017 _ = v.Args[1] 22018 p := v.Args[0] 22019 x := v.Args[1] 22020 if x.Op != OpS390XMOVWstoreconst { 22021 break 22022 } 22023 a := x.AuxInt 22024 if x.Aux != s { 22025 break 22026 } 22027 _ = x.Args[1] 22028 if p != x.Args[0] { 22029 break 22030 } 22031 mem := x.Args[1] 22032 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 22033 break 22034 } 22035 v.reset(OpS390XMOVDstore) 22036 v.AuxInt = ValAndOff(a).Off() 22037 v.Aux = s 22038 v.AddArg(p) 22039 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 22040 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 22041 v.AddArg(v0) 22042 v.AddArg(mem) 22043 return true 22044 } 22045 return false 22046 } 22047 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 22048 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 22049 // cond: is20Bit(c+d) 22050 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22051 for { 22052 c := v.AuxInt 22053 sym := v.Aux 22054 _ = v.Args[3] 22055 v_0 := v.Args[0] 22056 if v_0.Op != OpS390XADDconst { 22057 break 22058 } 22059 d := v_0.AuxInt 22060 ptr := v_0.Args[0] 22061 idx := v.Args[1] 22062 val := v.Args[2] 22063 mem := v.Args[3] 22064 if !(is20Bit(c + d)) { 22065 break 22066 } 22067 v.reset(OpS390XMOVWstoreidx) 22068 v.AuxInt = c + d 22069 v.Aux = sym 22070 v.AddArg(ptr) 22071 v.AddArg(idx) 22072 v.AddArg(val) 22073 v.AddArg(mem) 22074 return true 22075 } 22076 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 22077 // cond: is20Bit(c+d) 22078 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22079 for { 22080 c := v.AuxInt 22081 sym := v.Aux 22082 _ = v.Args[3] 22083 idx := v.Args[0] 22084 v_1 := v.Args[1] 22085 if v_1.Op != OpS390XADDconst { 22086 break 22087 } 22088 d := v_1.AuxInt 22089 ptr := v_1.Args[0] 22090 val := v.Args[2] 22091 mem := v.Args[3] 22092 if !(is20Bit(c + d)) { 22093 break 22094 } 22095 v.reset(OpS390XMOVWstoreidx) 22096 v.AuxInt = c + d 22097 v.Aux = sym 22098 v.AddArg(ptr) 22099 v.AddArg(idx) 22100 v.AddArg(val) 22101 v.AddArg(mem) 22102 return true 22103 } 22104 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 22105 // cond: is20Bit(c+d) 22106 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22107 for { 22108 c := v.AuxInt 22109 sym := v.Aux 22110 _ = v.Args[3] 22111 ptr := v.Args[0] 22112 v_1 := v.Args[1] 22113 if v_1.Op != OpS390XADDconst { 22114 break 22115 } 22116 d := v_1.AuxInt 22117 idx := v_1.Args[0] 22118 val := v.Args[2] 22119 mem := v.Args[3] 22120 if !(is20Bit(c + d)) { 22121 break 22122 } 22123 v.reset(OpS390XMOVWstoreidx) 22124 v.AuxInt = c + d 22125 v.Aux = sym 22126 v.AddArg(ptr) 22127 v.AddArg(idx) 22128 v.AddArg(val) 22129 v.AddArg(mem) 22130 return true 22131 } 22132 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 22133 // cond: is20Bit(c+d) 22134 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22135 for { 22136 c := v.AuxInt 22137 sym := v.Aux 22138 _ = v.Args[3] 22139 v_0 := v.Args[0] 22140 if v_0.Op != OpS390XADDconst { 22141 break 22142 } 22143 d := v_0.AuxInt 22144 idx := v_0.Args[0] 22145 ptr := v.Args[1] 22146 val := v.Args[2] 22147 mem := v.Args[3] 22148 if !(is20Bit(c + d)) { 22149 break 22150 } 22151 v.reset(OpS390XMOVWstoreidx) 22152 v.AuxInt = c + d 22153 v.Aux = sym 22154 v.AddArg(ptr) 22155 v.AddArg(idx) 22156 v.AddArg(val) 22157 v.AddArg(mem) 22158 return true 22159 } 22160 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 22161 // cond: x.Uses == 1 && clobber(x) 22162 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22163 for { 22164 i := v.AuxInt 22165 s := v.Aux 22166 _ = v.Args[3] 22167 p := v.Args[0] 22168 idx := v.Args[1] 22169 w := v.Args[2] 22170 x := v.Args[3] 22171 if x.Op != OpS390XMOVWstoreidx { 22172 break 22173 } 22174 if x.AuxInt != i-4 { 22175 break 22176 } 22177 if x.Aux != s { 22178 break 22179 } 22180 _ = x.Args[3] 22181 if p != x.Args[0] { 22182 break 22183 } 22184 if idx != x.Args[1] { 22185 break 22186 } 22187 x_2 := x.Args[2] 22188 if x_2.Op != OpS390XSRDconst { 22189 break 22190 } 22191 if x_2.AuxInt != 32 { 22192 break 22193 } 22194 if w != x_2.Args[0] { 22195 break 22196 } 22197 mem := x.Args[3] 22198 if !(x.Uses == 1 && clobber(x)) { 22199 break 22200 } 22201 v.reset(OpS390XMOVDstoreidx) 22202 v.AuxInt = i - 4 22203 v.Aux = s 22204 v.AddArg(p) 22205 v.AddArg(idx) 22206 v.AddArg(w) 22207 v.AddArg(mem) 22208 return true 22209 } 22210 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 22211 // cond: x.Uses == 1 && clobber(x) 22212 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22213 for { 22214 i := v.AuxInt 22215 s := v.Aux 22216 _ = v.Args[3] 22217 p := v.Args[0] 22218 idx := v.Args[1] 22219 w := v.Args[2] 22220 x := v.Args[3] 22221 if x.Op != OpS390XMOVWstoreidx { 22222 break 22223 } 22224 if x.AuxInt != i-4 { 22225 break 22226 } 22227 if x.Aux != s { 22228 break 22229 } 22230 _ = x.Args[3] 22231 if idx != x.Args[0] { 22232 break 22233 } 22234 if p != x.Args[1] { 22235 break 22236 } 22237 x_2 := x.Args[2] 22238 if x_2.Op != OpS390XSRDconst { 22239 break 22240 } 22241 if x_2.AuxInt != 32 { 22242 break 22243 } 22244 if w != x_2.Args[0] { 22245 break 22246 } 22247 mem := x.Args[3] 22248 if !(x.Uses == 1 && clobber(x)) { 22249 break 22250 } 22251 v.reset(OpS390XMOVDstoreidx) 22252 v.AuxInt = i - 4 22253 v.Aux = s 22254 v.AddArg(p) 22255 v.AddArg(idx) 22256 v.AddArg(w) 22257 v.AddArg(mem) 22258 return true 22259 } 22260 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 22261 // cond: x.Uses == 1 && clobber(x) 22262 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22263 for { 22264 i := v.AuxInt 22265 s := v.Aux 22266 _ = v.Args[3] 22267 idx := v.Args[0] 22268 p := v.Args[1] 22269 w := v.Args[2] 22270 x := v.Args[3] 22271 if x.Op != OpS390XMOVWstoreidx { 22272 break 22273 } 22274 if x.AuxInt != i-4 { 22275 break 22276 } 22277 if x.Aux != s { 22278 break 22279 } 22280 _ = x.Args[3] 22281 if p != x.Args[0] { 22282 break 22283 } 22284 if idx != x.Args[1] { 22285 break 22286 } 22287 x_2 := x.Args[2] 22288 if x_2.Op != OpS390XSRDconst { 22289 break 22290 } 22291 if x_2.AuxInt != 32 { 22292 break 22293 } 22294 if w != x_2.Args[0] { 22295 break 22296 } 22297 mem := x.Args[3] 22298 if !(x.Uses == 1 && clobber(x)) { 22299 break 22300 } 22301 v.reset(OpS390XMOVDstoreidx) 22302 v.AuxInt = i - 4 22303 v.Aux = s 22304 v.AddArg(p) 22305 v.AddArg(idx) 22306 v.AddArg(w) 22307 v.AddArg(mem) 22308 return true 22309 } 22310 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 22311 // cond: x.Uses == 1 && clobber(x) 22312 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22313 for { 22314 i := v.AuxInt 22315 s := v.Aux 22316 _ = v.Args[3] 22317 idx := v.Args[0] 22318 p := v.Args[1] 22319 w := v.Args[2] 22320 x := v.Args[3] 22321 if x.Op != OpS390XMOVWstoreidx { 22322 break 22323 } 22324 if x.AuxInt != i-4 { 22325 break 22326 } 22327 if x.Aux != s { 22328 break 22329 } 22330 _ = x.Args[3] 22331 if idx != x.Args[0] { 22332 break 22333 } 22334 if p != x.Args[1] { 22335 break 22336 } 22337 x_2 := x.Args[2] 22338 if x_2.Op != OpS390XSRDconst { 22339 break 22340 } 22341 if x_2.AuxInt != 32 { 22342 break 22343 } 22344 if w != x_2.Args[0] { 22345 break 22346 } 22347 mem := x.Args[3] 22348 if !(x.Uses == 1 && clobber(x)) { 22349 break 22350 } 22351 v.reset(OpS390XMOVDstoreidx) 22352 v.AuxInt = i - 4 22353 v.Aux = s 22354 v.AddArg(p) 22355 v.AddArg(idx) 22356 v.AddArg(w) 22357 v.AddArg(mem) 22358 return true 22359 } 22360 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 22361 // cond: x.Uses == 1 && clobber(x) 22362 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22363 for { 22364 i := v.AuxInt 22365 s := v.Aux 22366 _ = v.Args[3] 22367 p := v.Args[0] 22368 idx := v.Args[1] 22369 w0 := v.Args[2] 22370 if w0.Op != OpS390XSRDconst { 22371 break 22372 } 22373 j := w0.AuxInt 22374 w := w0.Args[0] 22375 x := v.Args[3] 22376 if x.Op != OpS390XMOVWstoreidx { 22377 break 22378 } 22379 if x.AuxInt != i-4 { 22380 break 22381 } 22382 if x.Aux != s { 22383 break 22384 } 22385 _ = x.Args[3] 22386 if p != x.Args[0] { 22387 break 22388 } 22389 if idx != x.Args[1] { 22390 break 22391 } 22392 x_2 := x.Args[2] 22393 if x_2.Op != OpS390XSRDconst { 22394 break 22395 } 22396 if x_2.AuxInt != j+32 { 22397 break 22398 } 22399 if w != x_2.Args[0] { 22400 break 22401 } 22402 mem := x.Args[3] 22403 if !(x.Uses == 1 && clobber(x)) { 22404 break 22405 } 22406 v.reset(OpS390XMOVDstoreidx) 22407 v.AuxInt = i - 4 22408 v.Aux = s 22409 v.AddArg(p) 22410 v.AddArg(idx) 22411 v.AddArg(w0) 22412 v.AddArg(mem) 22413 return true 22414 } 22415 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 22416 // cond: x.Uses == 1 && clobber(x) 22417 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22418 for { 22419 i := v.AuxInt 22420 s := v.Aux 22421 _ = v.Args[3] 22422 p := v.Args[0] 22423 idx := v.Args[1] 22424 w0 := v.Args[2] 22425 if w0.Op != OpS390XSRDconst { 22426 break 22427 } 22428 j := w0.AuxInt 22429 w := w0.Args[0] 22430 x := v.Args[3] 22431 if x.Op != OpS390XMOVWstoreidx { 22432 break 22433 } 22434 if x.AuxInt != i-4 { 22435 break 22436 } 22437 if x.Aux != s { 22438 break 22439 } 22440 _ = x.Args[3] 22441 if idx != x.Args[0] { 22442 break 22443 } 22444 if p != x.Args[1] { 22445 break 22446 } 22447 x_2 := x.Args[2] 22448 if x_2.Op != OpS390XSRDconst { 22449 break 22450 } 22451 if x_2.AuxInt != j+32 { 22452 break 22453 } 22454 if w != x_2.Args[0] { 22455 break 22456 } 22457 mem := x.Args[3] 22458 if !(x.Uses == 1 && clobber(x)) { 22459 break 22460 } 22461 v.reset(OpS390XMOVDstoreidx) 22462 v.AuxInt = i - 4 22463 v.Aux = s 22464 v.AddArg(p) 22465 v.AddArg(idx) 22466 v.AddArg(w0) 22467 v.AddArg(mem) 22468 return true 22469 } 22470 return false 22471 } 22472 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 22473 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 22474 // cond: x.Uses == 1 && clobber(x) 22475 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22476 for { 22477 i := v.AuxInt 22478 s := v.Aux 22479 _ = v.Args[3] 22480 idx := v.Args[0] 22481 p := v.Args[1] 22482 w0 := v.Args[2] 22483 if w0.Op != OpS390XSRDconst { 22484 break 22485 } 22486 j := w0.AuxInt 22487 w := w0.Args[0] 22488 x := v.Args[3] 22489 if x.Op != OpS390XMOVWstoreidx { 22490 break 22491 } 22492 if x.AuxInt != i-4 { 22493 break 22494 } 22495 if x.Aux != s { 22496 break 22497 } 22498 _ = x.Args[3] 22499 if p != x.Args[0] { 22500 break 22501 } 22502 if idx != x.Args[1] { 22503 break 22504 } 22505 x_2 := x.Args[2] 22506 if x_2.Op != OpS390XSRDconst { 22507 break 22508 } 22509 if x_2.AuxInt != j+32 { 22510 break 22511 } 22512 if w != x_2.Args[0] { 22513 break 22514 } 22515 mem := x.Args[3] 22516 if !(x.Uses == 1 && clobber(x)) { 22517 break 22518 } 22519 v.reset(OpS390XMOVDstoreidx) 22520 v.AuxInt = i - 4 22521 v.Aux = s 22522 v.AddArg(p) 22523 v.AddArg(idx) 22524 v.AddArg(w0) 22525 v.AddArg(mem) 22526 return true 22527 } 22528 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 22529 // cond: x.Uses == 1 && clobber(x) 22530 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22531 for { 22532 i := v.AuxInt 22533 s := v.Aux 22534 _ = v.Args[3] 22535 idx := v.Args[0] 22536 p := v.Args[1] 22537 w0 := v.Args[2] 22538 if w0.Op != OpS390XSRDconst { 22539 break 22540 } 22541 j := w0.AuxInt 22542 w := w0.Args[0] 22543 x := v.Args[3] 22544 if x.Op != OpS390XMOVWstoreidx { 22545 break 22546 } 22547 if x.AuxInt != i-4 { 22548 break 22549 } 22550 if x.Aux != s { 22551 break 22552 } 22553 _ = x.Args[3] 22554 if idx != x.Args[0] { 22555 break 22556 } 22557 if p != x.Args[1] { 22558 break 22559 } 22560 x_2 := x.Args[2] 22561 if x_2.Op != OpS390XSRDconst { 22562 break 22563 } 22564 if x_2.AuxInt != j+32 { 22565 break 22566 } 22567 if w != x_2.Args[0] { 22568 break 22569 } 22570 mem := x.Args[3] 22571 if !(x.Uses == 1 && clobber(x)) { 22572 break 22573 } 22574 v.reset(OpS390XMOVDstoreidx) 22575 v.AuxInt = i - 4 22576 v.Aux = s 22577 v.AddArg(p) 22578 v.AddArg(idx) 22579 v.AddArg(w0) 22580 v.AddArg(mem) 22581 return true 22582 } 22583 return false 22584 } 22585 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 22586 // match: (MULLD x (MOVDconst [c])) 22587 // cond: is32Bit(c) 22588 // result: (MULLDconst [c] x) 22589 for { 22590 _ = v.Args[1] 22591 x := v.Args[0] 22592 v_1 := v.Args[1] 22593 if v_1.Op != OpS390XMOVDconst { 22594 break 22595 } 22596 c := v_1.AuxInt 22597 if !(is32Bit(c)) { 22598 break 22599 } 22600 v.reset(OpS390XMULLDconst) 22601 v.AuxInt = c 22602 v.AddArg(x) 22603 return true 22604 } 22605 // match: (MULLD (MOVDconst [c]) x) 22606 // cond: is32Bit(c) 22607 // result: (MULLDconst [c] x) 22608 for { 22609 _ = v.Args[1] 22610 v_0 := v.Args[0] 22611 if v_0.Op != OpS390XMOVDconst { 22612 break 22613 } 22614 c := v_0.AuxInt 22615 x := v.Args[1] 22616 if !(is32Bit(c)) { 22617 break 22618 } 22619 v.reset(OpS390XMULLDconst) 22620 v.AuxInt = c 22621 v.AddArg(x) 22622 return true 22623 } 22624 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 22625 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22626 // result: (MULLDload <t> [off] {sym} x ptr mem) 22627 for { 22628 t := v.Type 22629 _ = v.Args[1] 22630 x := v.Args[0] 22631 g := v.Args[1] 22632 if g.Op != OpS390XMOVDload { 22633 break 22634 } 22635 off := g.AuxInt 22636 sym := g.Aux 22637 _ = g.Args[1] 22638 ptr := g.Args[0] 22639 mem := g.Args[1] 22640 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22641 break 22642 } 22643 v.reset(OpS390XMULLDload) 22644 v.Type = t 22645 v.AuxInt = off 22646 v.Aux = sym 22647 v.AddArg(x) 22648 v.AddArg(ptr) 22649 v.AddArg(mem) 22650 return true 22651 } 22652 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 22653 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22654 // result: (MULLDload <t> [off] {sym} x ptr mem) 22655 for { 22656 t := v.Type 22657 _ = v.Args[1] 22658 g := v.Args[0] 22659 if g.Op != OpS390XMOVDload { 22660 break 22661 } 22662 off := g.AuxInt 22663 sym := g.Aux 22664 _ = g.Args[1] 22665 ptr := g.Args[0] 22666 mem := g.Args[1] 22667 x := v.Args[1] 22668 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22669 break 22670 } 22671 v.reset(OpS390XMULLDload) 22672 v.Type = t 22673 v.AuxInt = off 22674 v.Aux = sym 22675 v.AddArg(x) 22676 v.AddArg(ptr) 22677 v.AddArg(mem) 22678 return true 22679 } 22680 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 22681 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22682 // result: (MULLDload <t> [off] {sym} x ptr mem) 22683 for { 22684 t := v.Type 22685 _ = v.Args[1] 22686 g := v.Args[0] 22687 if g.Op != OpS390XMOVDload { 22688 break 22689 } 22690 off := g.AuxInt 22691 sym := g.Aux 22692 _ = g.Args[1] 22693 ptr := g.Args[0] 22694 mem := g.Args[1] 22695 x := v.Args[1] 22696 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22697 break 22698 } 22699 v.reset(OpS390XMULLDload) 22700 v.Type = t 22701 v.AuxInt = off 22702 v.Aux = sym 22703 v.AddArg(x) 22704 v.AddArg(ptr) 22705 v.AddArg(mem) 22706 return true 22707 } 22708 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 22709 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22710 // result: (MULLDload <t> [off] {sym} x ptr mem) 22711 for { 22712 t := v.Type 22713 _ = v.Args[1] 22714 x := v.Args[0] 22715 g := v.Args[1] 22716 if g.Op != OpS390XMOVDload { 22717 break 22718 } 22719 off := g.AuxInt 22720 sym := g.Aux 22721 _ = g.Args[1] 22722 ptr := g.Args[0] 22723 mem := g.Args[1] 22724 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22725 break 22726 } 22727 v.reset(OpS390XMULLDload) 22728 v.Type = t 22729 v.AuxInt = off 22730 v.Aux = sym 22731 v.AddArg(x) 22732 v.AddArg(ptr) 22733 v.AddArg(mem) 22734 return true 22735 } 22736 return false 22737 } 22738 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 22739 b := v.Block 22740 _ = b 22741 // match: (MULLDconst [-1] x) 22742 // cond: 22743 // result: (NEG x) 22744 for { 22745 if v.AuxInt != -1 { 22746 break 22747 } 22748 x := v.Args[0] 22749 v.reset(OpS390XNEG) 22750 v.AddArg(x) 22751 return true 22752 } 22753 // match: (MULLDconst [0] _) 22754 // cond: 22755 // result: (MOVDconst [0]) 22756 for { 22757 if v.AuxInt != 0 { 22758 break 22759 } 22760 v.reset(OpS390XMOVDconst) 22761 v.AuxInt = 0 22762 return true 22763 } 22764 // match: (MULLDconst [1] x) 22765 // cond: 22766 // result: x 22767 for { 22768 if v.AuxInt != 1 { 22769 break 22770 } 22771 x := v.Args[0] 22772 v.reset(OpCopy) 22773 v.Type = x.Type 22774 v.AddArg(x) 22775 return true 22776 } 22777 // match: (MULLDconst [c] x) 22778 // cond: isPowerOfTwo(c) 22779 // result: (SLDconst [log2(c)] x) 22780 for { 22781 c := v.AuxInt 22782 x := v.Args[0] 22783 if !(isPowerOfTwo(c)) { 22784 break 22785 } 22786 v.reset(OpS390XSLDconst) 22787 v.AuxInt = log2(c) 22788 v.AddArg(x) 22789 return true 22790 } 22791 // match: (MULLDconst [c] x) 22792 // cond: isPowerOfTwo(c+1) && c >= 15 22793 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 22794 for { 22795 c := v.AuxInt 22796 x := v.Args[0] 22797 if !(isPowerOfTwo(c+1) && c >= 15) { 22798 break 22799 } 22800 v.reset(OpS390XSUB) 22801 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22802 v0.AuxInt = log2(c + 1) 22803 v0.AddArg(x) 22804 v.AddArg(v0) 22805 v.AddArg(x) 22806 return true 22807 } 22808 // match: (MULLDconst [c] x) 22809 // cond: isPowerOfTwo(c-1) && c >= 17 22810 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 22811 for { 22812 c := v.AuxInt 22813 x := v.Args[0] 22814 if !(isPowerOfTwo(c-1) && c >= 17) { 22815 break 22816 } 22817 v.reset(OpS390XADD) 22818 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22819 v0.AuxInt = log2(c - 1) 22820 v0.AddArg(x) 22821 v.AddArg(v0) 22822 v.AddArg(x) 22823 return true 22824 } 22825 // match: (MULLDconst [c] (MOVDconst [d])) 22826 // cond: 22827 // result: (MOVDconst [c*d]) 22828 for { 22829 c := v.AuxInt 22830 v_0 := v.Args[0] 22831 if v_0.Op != OpS390XMOVDconst { 22832 break 22833 } 22834 d := v_0.AuxInt 22835 v.reset(OpS390XMOVDconst) 22836 v.AuxInt = c * d 22837 return true 22838 } 22839 return false 22840 } 22841 func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { 22842 b := v.Block 22843 _ = b 22844 // match: (MULLDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 22845 // cond: isSamePtr(ptr1, ptr2) 22846 // result: (MULLD x (LGDR <t> y)) 22847 for { 22848 t := v.Type 22849 off := v.AuxInt 22850 sym := v.Aux 22851 _ = v.Args[2] 22852 x := v.Args[0] 22853 ptr1 := v.Args[1] 22854 v_2 := v.Args[2] 22855 if v_2.Op != OpS390XFMOVDstore { 22856 break 22857 } 22858 if v_2.AuxInt != off { 22859 break 22860 } 22861 if v_2.Aux != sym { 22862 break 22863 } 22864 _ = v_2.Args[2] 22865 ptr2 := v_2.Args[0] 22866 y := v_2.Args[1] 22867 if !(isSamePtr(ptr1, ptr2)) { 22868 break 22869 } 22870 v.reset(OpS390XMULLD) 22871 v.AddArg(x) 22872 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 22873 v0.AddArg(y) 22874 v.AddArg(v0) 22875 return true 22876 } 22877 // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) 22878 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 22879 // result: (MULLDload [off1+off2] {sym} x ptr mem) 22880 for { 22881 off1 := v.AuxInt 22882 sym := v.Aux 22883 _ = v.Args[2] 22884 x := v.Args[0] 22885 v_1 := v.Args[1] 22886 if v_1.Op != OpS390XADDconst { 22887 break 22888 } 22889 off2 := v_1.AuxInt 22890 ptr := v_1.Args[0] 22891 mem := v.Args[2] 22892 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 22893 break 22894 } 22895 v.reset(OpS390XMULLDload) 22896 v.AuxInt = off1 + off2 22897 v.Aux = sym 22898 v.AddArg(x) 22899 v.AddArg(ptr) 22900 v.AddArg(mem) 22901 return true 22902 } 22903 // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 22904 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 22905 // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 22906 for { 22907 o1 := v.AuxInt 22908 s1 := v.Aux 22909 _ = v.Args[2] 22910 x := v.Args[0] 22911 v_1 := v.Args[1] 22912 if v_1.Op != OpS390XMOVDaddr { 22913 break 22914 } 22915 o2 := v_1.AuxInt 22916 s2 := v_1.Aux 22917 ptr := v_1.Args[0] 22918 mem := v.Args[2] 22919 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 22920 break 22921 } 22922 v.reset(OpS390XMULLDload) 22923 v.AuxInt = o1 + o2 22924 v.Aux = mergeSym(s1, s2) 22925 v.AddArg(x) 22926 v.AddArg(ptr) 22927 v.AddArg(mem) 22928 return true 22929 } 22930 return false 22931 } 22932 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 22933 // match: (MULLW x (MOVDconst [c])) 22934 // cond: 22935 // result: (MULLWconst [int64(int32(c))] x) 22936 for { 22937 _ = v.Args[1] 22938 x := v.Args[0] 22939 v_1 := v.Args[1] 22940 if v_1.Op != OpS390XMOVDconst { 22941 break 22942 } 22943 c := v_1.AuxInt 22944 v.reset(OpS390XMULLWconst) 22945 v.AuxInt = int64(int32(c)) 22946 v.AddArg(x) 22947 return true 22948 } 22949 // match: (MULLW (MOVDconst [c]) x) 22950 // cond: 22951 // result: (MULLWconst [int64(int32(c))] x) 22952 for { 22953 _ = v.Args[1] 22954 v_0 := v.Args[0] 22955 if v_0.Op != OpS390XMOVDconst { 22956 break 22957 } 22958 c := v_0.AuxInt 22959 x := v.Args[1] 22960 v.reset(OpS390XMULLWconst) 22961 v.AuxInt = int64(int32(c)) 22962 v.AddArg(x) 22963 return true 22964 } 22965 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 22966 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22967 // result: (MULLWload <t> [off] {sym} x ptr mem) 22968 for { 22969 t := v.Type 22970 _ = v.Args[1] 22971 x := v.Args[0] 22972 g := v.Args[1] 22973 if g.Op != OpS390XMOVWload { 22974 break 22975 } 22976 off := g.AuxInt 22977 sym := g.Aux 22978 _ = g.Args[1] 22979 ptr := g.Args[0] 22980 mem := g.Args[1] 22981 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22982 break 22983 } 22984 v.reset(OpS390XMULLWload) 22985 v.Type = t 22986 v.AuxInt = off 22987 v.Aux = sym 22988 v.AddArg(x) 22989 v.AddArg(ptr) 22990 v.AddArg(mem) 22991 return true 22992 } 22993 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 22994 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22995 // result: (MULLWload <t> [off] {sym} x ptr mem) 22996 for { 22997 t := v.Type 22998 _ = v.Args[1] 22999 g := v.Args[0] 23000 if g.Op != OpS390XMOVWload { 23001 break 23002 } 23003 off := g.AuxInt 23004 sym := g.Aux 23005 _ = g.Args[1] 23006 ptr := g.Args[0] 23007 mem := g.Args[1] 23008 x := v.Args[1] 23009 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23010 break 23011 } 23012 v.reset(OpS390XMULLWload) 23013 v.Type = t 23014 v.AuxInt = off 23015 v.Aux = sym 23016 v.AddArg(x) 23017 v.AddArg(ptr) 23018 v.AddArg(mem) 23019 return true 23020 } 23021 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 23022 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23023 // result: (MULLWload <t> [off] {sym} x ptr mem) 23024 for { 23025 t := v.Type 23026 _ = v.Args[1] 23027 g := v.Args[0] 23028 if g.Op != OpS390XMOVWload { 23029 break 23030 } 23031 off := g.AuxInt 23032 sym := g.Aux 23033 _ = g.Args[1] 23034 ptr := g.Args[0] 23035 mem := g.Args[1] 23036 x := v.Args[1] 23037 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23038 break 23039 } 23040 v.reset(OpS390XMULLWload) 23041 v.Type = t 23042 v.AuxInt = off 23043 v.Aux = sym 23044 v.AddArg(x) 23045 v.AddArg(ptr) 23046 v.AddArg(mem) 23047 return true 23048 } 23049 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 23050 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23051 // result: (MULLWload <t> [off] {sym} x ptr mem) 23052 for { 23053 t := v.Type 23054 _ = v.Args[1] 23055 x := v.Args[0] 23056 g := v.Args[1] 23057 if g.Op != OpS390XMOVWload { 23058 break 23059 } 23060 off := g.AuxInt 23061 sym := g.Aux 23062 _ = g.Args[1] 23063 ptr := g.Args[0] 23064 mem := g.Args[1] 23065 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23066 break 23067 } 23068 v.reset(OpS390XMULLWload) 23069 v.Type = t 23070 v.AuxInt = off 23071 v.Aux = sym 23072 v.AddArg(x) 23073 v.AddArg(ptr) 23074 v.AddArg(mem) 23075 return true 23076 } 23077 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 23078 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23079 // result: (MULLWload <t> [off] {sym} x ptr mem) 23080 for { 23081 t := v.Type 23082 _ = v.Args[1] 23083 x := v.Args[0] 23084 g := v.Args[1] 23085 if g.Op != OpS390XMOVWZload { 23086 break 23087 } 23088 off := g.AuxInt 23089 sym := g.Aux 23090 _ = g.Args[1] 23091 ptr := g.Args[0] 23092 mem := g.Args[1] 23093 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23094 break 23095 } 23096 v.reset(OpS390XMULLWload) 23097 v.Type = t 23098 v.AuxInt = off 23099 v.Aux = sym 23100 v.AddArg(x) 23101 v.AddArg(ptr) 23102 v.AddArg(mem) 23103 return true 23104 } 23105 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 23106 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23107 // result: (MULLWload <t> [off] {sym} x ptr mem) 23108 for { 23109 t := v.Type 23110 _ = v.Args[1] 23111 g := v.Args[0] 23112 if g.Op != OpS390XMOVWZload { 23113 break 23114 } 23115 off := g.AuxInt 23116 sym := g.Aux 23117 _ = g.Args[1] 23118 ptr := g.Args[0] 23119 mem := g.Args[1] 23120 x := v.Args[1] 23121 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23122 break 23123 } 23124 v.reset(OpS390XMULLWload) 23125 v.Type = t 23126 v.AuxInt = off 23127 v.Aux = sym 23128 v.AddArg(x) 23129 v.AddArg(ptr) 23130 v.AddArg(mem) 23131 return true 23132 } 23133 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 23134 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23135 // result: (MULLWload <t> [off] {sym} x ptr mem) 23136 for { 23137 t := v.Type 23138 _ = v.Args[1] 23139 g := v.Args[0] 23140 if g.Op != OpS390XMOVWZload { 23141 break 23142 } 23143 off := g.AuxInt 23144 sym := g.Aux 23145 _ = g.Args[1] 23146 ptr := g.Args[0] 23147 mem := g.Args[1] 23148 x := v.Args[1] 23149 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23150 break 23151 } 23152 v.reset(OpS390XMULLWload) 23153 v.Type = t 23154 v.AuxInt = off 23155 v.Aux = sym 23156 v.AddArg(x) 23157 v.AddArg(ptr) 23158 v.AddArg(mem) 23159 return true 23160 } 23161 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 23162 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23163 // result: (MULLWload <t> [off] {sym} x ptr mem) 23164 for { 23165 t := v.Type 23166 _ = v.Args[1] 23167 x := v.Args[0] 23168 g := v.Args[1] 23169 if g.Op != OpS390XMOVWZload { 23170 break 23171 } 23172 off := g.AuxInt 23173 sym := g.Aux 23174 _ = g.Args[1] 23175 ptr := g.Args[0] 23176 mem := g.Args[1] 23177 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23178 break 23179 } 23180 v.reset(OpS390XMULLWload) 23181 v.Type = t 23182 v.AuxInt = off 23183 v.Aux = sym 23184 v.AddArg(x) 23185 v.AddArg(ptr) 23186 v.AddArg(mem) 23187 return true 23188 } 23189 return false 23190 } 23191 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 23192 b := v.Block 23193 _ = b 23194 // match: (MULLWconst [-1] x) 23195 // cond: 23196 // result: (NEGW x) 23197 for { 23198 if v.AuxInt != -1 { 23199 break 23200 } 23201 x := v.Args[0] 23202 v.reset(OpS390XNEGW) 23203 v.AddArg(x) 23204 return true 23205 } 23206 // match: (MULLWconst [0] _) 23207 // cond: 23208 // result: (MOVDconst [0]) 23209 for { 23210 if v.AuxInt != 0 { 23211 break 23212 } 23213 v.reset(OpS390XMOVDconst) 23214 v.AuxInt = 0 23215 return true 23216 } 23217 // match: (MULLWconst [1] x) 23218 // cond: 23219 // result: x 23220 for { 23221 if v.AuxInt != 1 { 23222 break 23223 } 23224 x := v.Args[0] 23225 v.reset(OpCopy) 23226 v.Type = x.Type 23227 v.AddArg(x) 23228 return true 23229 } 23230 // match: (MULLWconst [c] x) 23231 // cond: isPowerOfTwo(c) 23232 // result: (SLWconst [log2(c)] x) 23233 for { 23234 c := v.AuxInt 23235 x := v.Args[0] 23236 if !(isPowerOfTwo(c)) { 23237 break 23238 } 23239 v.reset(OpS390XSLWconst) 23240 v.AuxInt = log2(c) 23241 v.AddArg(x) 23242 return true 23243 } 23244 // match: (MULLWconst [c] x) 23245 // cond: isPowerOfTwo(c+1) && c >= 15 23246 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 23247 for { 23248 c := v.AuxInt 23249 x := v.Args[0] 23250 if !(isPowerOfTwo(c+1) && c >= 15) { 23251 break 23252 } 23253 v.reset(OpS390XSUBW) 23254 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 23255 v0.AuxInt = log2(c + 1) 23256 v0.AddArg(x) 23257 v.AddArg(v0) 23258 v.AddArg(x) 23259 return true 23260 } 23261 // match: (MULLWconst [c] x) 23262 // cond: isPowerOfTwo(c-1) && c >= 17 23263 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 23264 for { 23265 c := v.AuxInt 23266 x := v.Args[0] 23267 if !(isPowerOfTwo(c-1) && c >= 17) { 23268 break 23269 } 23270 v.reset(OpS390XADDW) 23271 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 23272 v0.AuxInt = log2(c - 1) 23273 v0.AddArg(x) 23274 v.AddArg(v0) 23275 v.AddArg(x) 23276 return true 23277 } 23278 // match: (MULLWconst [c] (MOVDconst [d])) 23279 // cond: 23280 // result: (MOVDconst [int64(int32(c*d))]) 23281 for { 23282 c := v.AuxInt 23283 v_0 := v.Args[0] 23284 if v_0.Op != OpS390XMOVDconst { 23285 break 23286 } 23287 d := v_0.AuxInt 23288 v.reset(OpS390XMOVDconst) 23289 v.AuxInt = int64(int32(c * d)) 23290 return true 23291 } 23292 return false 23293 } 23294 func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { 23295 // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) 23296 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 23297 // result: (MULLWload [off1+off2] {sym} x ptr mem) 23298 for { 23299 off1 := v.AuxInt 23300 sym := v.Aux 23301 _ = v.Args[2] 23302 x := v.Args[0] 23303 v_1 := v.Args[1] 23304 if v_1.Op != OpS390XADDconst { 23305 break 23306 } 23307 off2 := v_1.AuxInt 23308 ptr := v_1.Args[0] 23309 mem := v.Args[2] 23310 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 23311 break 23312 } 23313 v.reset(OpS390XMULLWload) 23314 v.AuxInt = off1 + off2 23315 v.Aux = sym 23316 v.AddArg(x) 23317 v.AddArg(ptr) 23318 v.AddArg(mem) 23319 return true 23320 } 23321 // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 23322 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 23323 // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 23324 for { 23325 o1 := v.AuxInt 23326 s1 := v.Aux 23327 _ = v.Args[2] 23328 x := v.Args[0] 23329 v_1 := v.Args[1] 23330 if v_1.Op != OpS390XMOVDaddr { 23331 break 23332 } 23333 o2 := v_1.AuxInt 23334 s2 := v_1.Aux 23335 ptr := v_1.Args[0] 23336 mem := v.Args[2] 23337 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 23338 break 23339 } 23340 v.reset(OpS390XMULLWload) 23341 v.AuxInt = o1 + o2 23342 v.Aux = mergeSym(s1, s2) 23343 v.AddArg(x) 23344 v.AddArg(ptr) 23345 v.AddArg(mem) 23346 return true 23347 } 23348 return false 23349 } 23350 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 23351 // match: (NEG (MOVDconst [c])) 23352 // cond: 23353 // result: (MOVDconst [-c]) 23354 for { 23355 v_0 := v.Args[0] 23356 if v_0.Op != OpS390XMOVDconst { 23357 break 23358 } 23359 c := v_0.AuxInt 23360 v.reset(OpS390XMOVDconst) 23361 v.AuxInt = -c 23362 return true 23363 } 23364 // match: (NEG (ADDconst [c] (NEG x))) 23365 // cond: c != -(1<<31) 23366 // result: (ADDconst [-c] x) 23367 for { 23368 v_0 := v.Args[0] 23369 if v_0.Op != OpS390XADDconst { 23370 break 23371 } 23372 c := v_0.AuxInt 23373 v_0_0 := v_0.Args[0] 23374 if v_0_0.Op != OpS390XNEG { 23375 break 23376 } 23377 x := v_0_0.Args[0] 23378 if !(c != -(1 << 31)) { 23379 break 23380 } 23381 v.reset(OpS390XADDconst) 23382 v.AuxInt = -c 23383 v.AddArg(x) 23384 return true 23385 } 23386 return false 23387 } 23388 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 23389 // match: (NEGW (MOVDconst [c])) 23390 // cond: 23391 // result: (MOVDconst [int64(int32(-c))]) 23392 for { 23393 v_0 := v.Args[0] 23394 if v_0.Op != OpS390XMOVDconst { 23395 break 23396 } 23397 c := v_0.AuxInt 23398 v.reset(OpS390XMOVDconst) 23399 v.AuxInt = int64(int32(-c)) 23400 return true 23401 } 23402 return false 23403 } 23404 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 23405 b := v.Block 23406 _ = b 23407 typ := &b.Func.Config.Types 23408 _ = typ 23409 // match: (NOT x) 23410 // cond: true 23411 // result: (XOR (MOVDconst [-1]) x) 23412 for { 23413 x := v.Args[0] 23414 if !(true) { 23415 break 23416 } 23417 v.reset(OpS390XXOR) 23418 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 23419 v0.AuxInt = -1 23420 v.AddArg(v0) 23421 v.AddArg(x) 23422 return true 23423 } 23424 return false 23425 } 23426 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 23427 // match: (NOTW x) 23428 // cond: true 23429 // result: (XORWconst [-1] x) 23430 for { 23431 x := v.Args[0] 23432 if !(true) { 23433 break 23434 } 23435 v.reset(OpS390XXORWconst) 23436 v.AuxInt = -1 23437 v.AddArg(x) 23438 return true 23439 } 23440 return false 23441 } 23442 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 23443 b := v.Block 23444 _ = b 23445 // match: (OR x (MOVDconst [c])) 23446 // cond: isU32Bit(c) 23447 // result: (ORconst [c] x) 23448 for { 23449 _ = v.Args[1] 23450 x := v.Args[0] 23451 v_1 := v.Args[1] 23452 if v_1.Op != OpS390XMOVDconst { 23453 break 23454 } 23455 c := v_1.AuxInt 23456 if !(isU32Bit(c)) { 23457 break 23458 } 23459 v.reset(OpS390XORconst) 23460 v.AuxInt = c 23461 v.AddArg(x) 23462 return true 23463 } 23464 // match: (OR (MOVDconst [c]) x) 23465 // cond: isU32Bit(c) 23466 // result: (ORconst [c] x) 23467 for { 23468 _ = v.Args[1] 23469 v_0 := v.Args[0] 23470 if v_0.Op != OpS390XMOVDconst { 23471 break 23472 } 23473 c := v_0.AuxInt 23474 x := v.Args[1] 23475 if !(isU32Bit(c)) { 23476 break 23477 } 23478 v.reset(OpS390XORconst) 23479 v.AuxInt = c 23480 v.AddArg(x) 23481 return true 23482 } 23483 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 23484 // cond: d == 64-c 23485 // result: (RLLGconst [c] x) 23486 for { 23487 _ = v.Args[1] 23488 v_0 := v.Args[0] 23489 if v_0.Op != OpS390XSLDconst { 23490 break 23491 } 23492 c := v_0.AuxInt 23493 x := v_0.Args[0] 23494 v_1 := v.Args[1] 23495 if v_1.Op != OpS390XSRDconst { 23496 break 23497 } 23498 d := v_1.AuxInt 23499 if x != v_1.Args[0] { 23500 break 23501 } 23502 if !(d == 64-c) { 23503 break 23504 } 23505 v.reset(OpS390XRLLGconst) 23506 v.AuxInt = c 23507 v.AddArg(x) 23508 return true 23509 } 23510 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 23511 // cond: d == 64-c 23512 // result: (RLLGconst [c] x) 23513 for { 23514 _ = v.Args[1] 23515 v_0 := v.Args[0] 23516 if v_0.Op != OpS390XSRDconst { 23517 break 23518 } 23519 d := v_0.AuxInt 23520 x := v_0.Args[0] 23521 v_1 := v.Args[1] 23522 if v_1.Op != OpS390XSLDconst { 23523 break 23524 } 23525 c := v_1.AuxInt 23526 if x != v_1.Args[0] { 23527 break 23528 } 23529 if !(d == 64-c) { 23530 break 23531 } 23532 v.reset(OpS390XRLLGconst) 23533 v.AuxInt = c 23534 v.AddArg(x) 23535 return true 23536 } 23537 // match: (OR (MOVDconst [-1<<63]) (LGDR <t> x)) 23538 // cond: 23539 // result: (LGDR <t> (LNDFR <x.Type> x)) 23540 for { 23541 _ = v.Args[1] 23542 v_0 := v.Args[0] 23543 if v_0.Op != OpS390XMOVDconst { 23544 break 23545 } 23546 if v_0.AuxInt != -1<<63 { 23547 break 23548 } 23549 v_1 := v.Args[1] 23550 if v_1.Op != OpS390XLGDR { 23551 break 23552 } 23553 t := v_1.Type 23554 x := v_1.Args[0] 23555 v.reset(OpS390XLGDR) 23556 v.Type = t 23557 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 23558 v0.AddArg(x) 23559 v.AddArg(v0) 23560 return true 23561 } 23562 // match: (OR (LGDR <t> x) (MOVDconst [-1<<63])) 23563 // cond: 23564 // result: (LGDR <t> (LNDFR <x.Type> x)) 23565 for { 23566 _ = v.Args[1] 23567 v_0 := v.Args[0] 23568 if v_0.Op != OpS390XLGDR { 23569 break 23570 } 23571 t := v_0.Type 23572 x := v_0.Args[0] 23573 v_1 := v.Args[1] 23574 if v_1.Op != OpS390XMOVDconst { 23575 break 23576 } 23577 if v_1.AuxInt != -1<<63 { 23578 break 23579 } 23580 v.reset(OpS390XLGDR) 23581 v.Type = t 23582 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 23583 v0.AddArg(x) 23584 v.AddArg(v0) 23585 return true 23586 } 23587 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR <t> y))) 23588 // cond: 23589 // result: (LGDR (CPSDR <t> y x)) 23590 for { 23591 _ = v.Args[1] 23592 v_0 := v.Args[0] 23593 if v_0.Op != OpS390XSLDconst { 23594 break 23595 } 23596 if v_0.AuxInt != 63 { 23597 break 23598 } 23599 v_0_0 := v_0.Args[0] 23600 if v_0_0.Op != OpS390XSRDconst { 23601 break 23602 } 23603 if v_0_0.AuxInt != 63 { 23604 break 23605 } 23606 v_0_0_0 := v_0_0.Args[0] 23607 if v_0_0_0.Op != OpS390XLGDR { 23608 break 23609 } 23610 x := v_0_0_0.Args[0] 23611 v_1 := v.Args[1] 23612 if v_1.Op != OpS390XLGDR { 23613 break 23614 } 23615 v_1_0 := v_1.Args[0] 23616 if v_1_0.Op != OpS390XLPDFR { 23617 break 23618 } 23619 t := v_1_0.Type 23620 y := v_1_0.Args[0] 23621 v.reset(OpS390XLGDR) 23622 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 23623 v0.AddArg(y) 23624 v0.AddArg(x) 23625 v.AddArg(v0) 23626 return true 23627 } 23628 // match: (OR (LGDR (LPDFR <t> y)) (SLDconst [63] (SRDconst [63] (LGDR x)))) 23629 // cond: 23630 // result: (LGDR (CPSDR <t> y x)) 23631 for { 23632 _ = v.Args[1] 23633 v_0 := v.Args[0] 23634 if v_0.Op != OpS390XLGDR { 23635 break 23636 } 23637 v_0_0 := v_0.Args[0] 23638 if v_0_0.Op != OpS390XLPDFR { 23639 break 23640 } 23641 t := v_0_0.Type 23642 y := v_0_0.Args[0] 23643 v_1 := v.Args[1] 23644 if v_1.Op != OpS390XSLDconst { 23645 break 23646 } 23647 if v_1.AuxInt != 63 { 23648 break 23649 } 23650 v_1_0 := v_1.Args[0] 23651 if v_1_0.Op != OpS390XSRDconst { 23652 break 23653 } 23654 if v_1_0.AuxInt != 63 { 23655 break 23656 } 23657 v_1_0_0 := v_1_0.Args[0] 23658 if v_1_0_0.Op != OpS390XLGDR { 23659 break 23660 } 23661 x := v_1_0_0.Args[0] 23662 v.reset(OpS390XLGDR) 23663 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 23664 v0.AddArg(y) 23665 v0.AddArg(x) 23666 v.AddArg(v0) 23667 return true 23668 } 23669 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) 23670 // cond: c & -1<<63 == 0 23671 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 23672 for { 23673 _ = v.Args[1] 23674 v_0 := v.Args[0] 23675 if v_0.Op != OpS390XSLDconst { 23676 break 23677 } 23678 if v_0.AuxInt != 63 { 23679 break 23680 } 23681 v_0_0 := v_0.Args[0] 23682 if v_0_0.Op != OpS390XSRDconst { 23683 break 23684 } 23685 if v_0_0.AuxInt != 63 { 23686 break 23687 } 23688 v_0_0_0 := v_0_0.Args[0] 23689 if v_0_0_0.Op != OpS390XLGDR { 23690 break 23691 } 23692 x := v_0_0_0.Args[0] 23693 v_1 := v.Args[1] 23694 if v_1.Op != OpS390XMOVDconst { 23695 break 23696 } 23697 c := v_1.AuxInt 23698 if !(c&-1<<63 == 0) { 23699 break 23700 } 23701 v.reset(OpS390XLGDR) 23702 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 23703 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 23704 v1.AuxInt = c 23705 v0.AddArg(v1) 23706 v0.AddArg(x) 23707 v.AddArg(v0) 23708 return true 23709 } 23710 // match: (OR (MOVDconst [c]) (SLDconst [63] (SRDconst [63] (LGDR x)))) 23711 // cond: c & -1<<63 == 0 23712 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 23713 for { 23714 _ = v.Args[1] 23715 v_0 := v.Args[0] 23716 if v_0.Op != OpS390XMOVDconst { 23717 break 23718 } 23719 c := v_0.AuxInt 23720 v_1 := v.Args[1] 23721 if v_1.Op != OpS390XSLDconst { 23722 break 23723 } 23724 if v_1.AuxInt != 63 { 23725 break 23726 } 23727 v_1_0 := v_1.Args[0] 23728 if v_1_0.Op != OpS390XSRDconst { 23729 break 23730 } 23731 if v_1_0.AuxInt != 63 { 23732 break 23733 } 23734 v_1_0_0 := v_1_0.Args[0] 23735 if v_1_0_0.Op != OpS390XLGDR { 23736 break 23737 } 23738 x := v_1_0_0.Args[0] 23739 if !(c&-1<<63 == 0) { 23740 break 23741 } 23742 v.reset(OpS390XLGDR) 23743 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 23744 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 23745 v1.AuxInt = c 23746 v0.AddArg(v1) 23747 v0.AddArg(x) 23748 v.AddArg(v0) 23749 return true 23750 } 23751 return false 23752 } 23753 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 23754 b := v.Block 23755 _ = b 23756 typ := &b.Func.Config.Types 23757 _ = typ 23758 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 23759 // cond: 23760 // result: (MOVDconst [c|d]) 23761 for { 23762 _ = v.Args[1] 23763 v_0 := v.Args[0] 23764 if v_0.Op != OpS390XMOVDconst { 23765 break 23766 } 23767 c := v_0.AuxInt 23768 v_1 := v.Args[1] 23769 if v_1.Op != OpS390XMOVDconst { 23770 break 23771 } 23772 d := v_1.AuxInt 23773 v.reset(OpS390XMOVDconst) 23774 v.AuxInt = c | d 23775 return true 23776 } 23777 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 23778 // cond: 23779 // result: (MOVDconst [c|d]) 23780 for { 23781 _ = v.Args[1] 23782 v_0 := v.Args[0] 23783 if v_0.Op != OpS390XMOVDconst { 23784 break 23785 } 23786 d := v_0.AuxInt 23787 v_1 := v.Args[1] 23788 if v_1.Op != OpS390XMOVDconst { 23789 break 23790 } 23791 c := v_1.AuxInt 23792 v.reset(OpS390XMOVDconst) 23793 v.AuxInt = c | d 23794 return true 23795 } 23796 // match: (OR x x) 23797 // cond: 23798 // result: x 23799 for { 23800 _ = v.Args[1] 23801 x := v.Args[0] 23802 if x != v.Args[1] { 23803 break 23804 } 23805 v.reset(OpCopy) 23806 v.Type = x.Type 23807 v.AddArg(x) 23808 return true 23809 } 23810 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 23811 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23812 // result: (ORload <t> [off] {sym} x ptr mem) 23813 for { 23814 t := v.Type 23815 _ = v.Args[1] 23816 x := v.Args[0] 23817 g := v.Args[1] 23818 if g.Op != OpS390XMOVDload { 23819 break 23820 } 23821 off := g.AuxInt 23822 sym := g.Aux 23823 _ = g.Args[1] 23824 ptr := g.Args[0] 23825 mem := g.Args[1] 23826 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23827 break 23828 } 23829 v.reset(OpS390XORload) 23830 v.Type = t 23831 v.AuxInt = off 23832 v.Aux = sym 23833 v.AddArg(x) 23834 v.AddArg(ptr) 23835 v.AddArg(mem) 23836 return true 23837 } 23838 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 23839 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23840 // result: (ORload <t> [off] {sym} x ptr mem) 23841 for { 23842 t := v.Type 23843 _ = v.Args[1] 23844 g := v.Args[0] 23845 if g.Op != OpS390XMOVDload { 23846 break 23847 } 23848 off := g.AuxInt 23849 sym := g.Aux 23850 _ = g.Args[1] 23851 ptr := g.Args[0] 23852 mem := g.Args[1] 23853 x := v.Args[1] 23854 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23855 break 23856 } 23857 v.reset(OpS390XORload) 23858 v.Type = t 23859 v.AuxInt = off 23860 v.Aux = sym 23861 v.AddArg(x) 23862 v.AddArg(ptr) 23863 v.AddArg(mem) 23864 return true 23865 } 23866 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 23867 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23868 // result: (ORload <t> [off] {sym} x ptr mem) 23869 for { 23870 t := v.Type 23871 _ = v.Args[1] 23872 g := v.Args[0] 23873 if g.Op != OpS390XMOVDload { 23874 break 23875 } 23876 off := g.AuxInt 23877 sym := g.Aux 23878 _ = g.Args[1] 23879 ptr := g.Args[0] 23880 mem := g.Args[1] 23881 x := v.Args[1] 23882 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23883 break 23884 } 23885 v.reset(OpS390XORload) 23886 v.Type = t 23887 v.AuxInt = off 23888 v.Aux = sym 23889 v.AddArg(x) 23890 v.AddArg(ptr) 23891 v.AddArg(mem) 23892 return true 23893 } 23894 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 23895 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 23896 // result: (ORload <t> [off] {sym} x ptr mem) 23897 for { 23898 t := v.Type 23899 _ = v.Args[1] 23900 x := v.Args[0] 23901 g := v.Args[1] 23902 if g.Op != OpS390XMOVDload { 23903 break 23904 } 23905 off := g.AuxInt 23906 sym := g.Aux 23907 _ = g.Args[1] 23908 ptr := g.Args[0] 23909 mem := g.Args[1] 23910 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 23911 break 23912 } 23913 v.reset(OpS390XORload) 23914 v.Type = t 23915 v.AuxInt = off 23916 v.Aux = sym 23917 v.AddArg(x) 23918 v.AddArg(ptr) 23919 v.AddArg(mem) 23920 return true 23921 } 23922 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 23923 // 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) 23924 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 23925 for { 23926 _ = v.Args[1] 23927 x1 := v.Args[0] 23928 if x1.Op != OpS390XMOVBZload { 23929 break 23930 } 23931 i1 := x1.AuxInt 23932 s := x1.Aux 23933 _ = x1.Args[1] 23934 p := x1.Args[0] 23935 mem := x1.Args[1] 23936 sh := v.Args[1] 23937 if sh.Op != OpS390XSLDconst { 23938 break 23939 } 23940 if sh.AuxInt != 8 { 23941 break 23942 } 23943 x0 := sh.Args[0] 23944 if x0.Op != OpS390XMOVBZload { 23945 break 23946 } 23947 i0 := x0.AuxInt 23948 if x0.Aux != s { 23949 break 23950 } 23951 _ = x0.Args[1] 23952 if p != x0.Args[0] { 23953 break 23954 } 23955 if mem != x0.Args[1] { 23956 break 23957 } 23958 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)) { 23959 break 23960 } 23961 b = mergePoint(b, x0, x1) 23962 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 23963 v.reset(OpCopy) 23964 v.AddArg(v0) 23965 v0.AuxInt = i0 23966 v0.Aux = s 23967 v0.AddArg(p) 23968 v0.AddArg(mem) 23969 return true 23970 } 23971 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 23972 // 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) 23973 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 23974 for { 23975 _ = v.Args[1] 23976 sh := v.Args[0] 23977 if sh.Op != OpS390XSLDconst { 23978 break 23979 } 23980 if sh.AuxInt != 8 { 23981 break 23982 } 23983 x0 := sh.Args[0] 23984 if x0.Op != OpS390XMOVBZload { 23985 break 23986 } 23987 i0 := x0.AuxInt 23988 s := x0.Aux 23989 _ = x0.Args[1] 23990 p := x0.Args[0] 23991 mem := x0.Args[1] 23992 x1 := v.Args[1] 23993 if x1.Op != OpS390XMOVBZload { 23994 break 23995 } 23996 i1 := x1.AuxInt 23997 if x1.Aux != s { 23998 break 23999 } 24000 _ = x1.Args[1] 24001 if p != x1.Args[0] { 24002 break 24003 } 24004 if mem != x1.Args[1] { 24005 break 24006 } 24007 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)) { 24008 break 24009 } 24010 b = mergePoint(b, x0, x1) 24011 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 24012 v.reset(OpCopy) 24013 v.AddArg(v0) 24014 v0.AuxInt = i0 24015 v0.Aux = s 24016 v0.AddArg(p) 24017 v0.AddArg(mem) 24018 return true 24019 } 24020 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 24021 // 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) 24022 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 24023 for { 24024 _ = v.Args[1] 24025 x1 := v.Args[0] 24026 if x1.Op != OpS390XMOVHZload { 24027 break 24028 } 24029 i1 := x1.AuxInt 24030 s := x1.Aux 24031 _ = x1.Args[1] 24032 p := x1.Args[0] 24033 mem := x1.Args[1] 24034 sh := v.Args[1] 24035 if sh.Op != OpS390XSLDconst { 24036 break 24037 } 24038 if sh.AuxInt != 16 { 24039 break 24040 } 24041 x0 := sh.Args[0] 24042 if x0.Op != OpS390XMOVHZload { 24043 break 24044 } 24045 i0 := x0.AuxInt 24046 if x0.Aux != s { 24047 break 24048 } 24049 _ = x0.Args[1] 24050 if p != x0.Args[0] { 24051 break 24052 } 24053 if mem != x0.Args[1] { 24054 break 24055 } 24056 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)) { 24057 break 24058 } 24059 b = mergePoint(b, x0, x1) 24060 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24061 v.reset(OpCopy) 24062 v.AddArg(v0) 24063 v0.AuxInt = i0 24064 v0.Aux = s 24065 v0.AddArg(p) 24066 v0.AddArg(mem) 24067 return true 24068 } 24069 return false 24070 } 24071 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 24072 b := v.Block 24073 _ = b 24074 typ := &b.Func.Config.Types 24075 _ = typ 24076 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 24077 // 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) 24078 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 24079 for { 24080 _ = v.Args[1] 24081 sh := v.Args[0] 24082 if sh.Op != OpS390XSLDconst { 24083 break 24084 } 24085 if sh.AuxInt != 16 { 24086 break 24087 } 24088 x0 := sh.Args[0] 24089 if x0.Op != OpS390XMOVHZload { 24090 break 24091 } 24092 i0 := x0.AuxInt 24093 s := x0.Aux 24094 _ = x0.Args[1] 24095 p := x0.Args[0] 24096 mem := x0.Args[1] 24097 x1 := v.Args[1] 24098 if x1.Op != OpS390XMOVHZload { 24099 break 24100 } 24101 i1 := x1.AuxInt 24102 if x1.Aux != s { 24103 break 24104 } 24105 _ = x1.Args[1] 24106 if p != x1.Args[0] { 24107 break 24108 } 24109 if mem != x1.Args[1] { 24110 break 24111 } 24112 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)) { 24113 break 24114 } 24115 b = mergePoint(b, x0, x1) 24116 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24117 v.reset(OpCopy) 24118 v.AddArg(v0) 24119 v0.AuxInt = i0 24120 v0.Aux = s 24121 v0.AddArg(p) 24122 v0.AddArg(mem) 24123 return true 24124 } 24125 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 24126 // 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) 24127 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 24128 for { 24129 _ = v.Args[1] 24130 x1 := v.Args[0] 24131 if x1.Op != OpS390XMOVWZload { 24132 break 24133 } 24134 i1 := x1.AuxInt 24135 s := x1.Aux 24136 _ = x1.Args[1] 24137 p := x1.Args[0] 24138 mem := x1.Args[1] 24139 sh := v.Args[1] 24140 if sh.Op != OpS390XSLDconst { 24141 break 24142 } 24143 if sh.AuxInt != 32 { 24144 break 24145 } 24146 x0 := sh.Args[0] 24147 if x0.Op != OpS390XMOVWZload { 24148 break 24149 } 24150 i0 := x0.AuxInt 24151 if x0.Aux != s { 24152 break 24153 } 24154 _ = x0.Args[1] 24155 if p != x0.Args[0] { 24156 break 24157 } 24158 if mem != x0.Args[1] { 24159 break 24160 } 24161 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)) { 24162 break 24163 } 24164 b = mergePoint(b, x0, x1) 24165 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 24166 v.reset(OpCopy) 24167 v.AddArg(v0) 24168 v0.AuxInt = i0 24169 v0.Aux = s 24170 v0.AddArg(p) 24171 v0.AddArg(mem) 24172 return true 24173 } 24174 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 24175 // 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) 24176 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 24177 for { 24178 _ = v.Args[1] 24179 sh := v.Args[0] 24180 if sh.Op != OpS390XSLDconst { 24181 break 24182 } 24183 if sh.AuxInt != 32 { 24184 break 24185 } 24186 x0 := sh.Args[0] 24187 if x0.Op != OpS390XMOVWZload { 24188 break 24189 } 24190 i0 := x0.AuxInt 24191 s := x0.Aux 24192 _ = x0.Args[1] 24193 p := x0.Args[0] 24194 mem := x0.Args[1] 24195 x1 := v.Args[1] 24196 if x1.Op != OpS390XMOVWZload { 24197 break 24198 } 24199 i1 := x1.AuxInt 24200 if x1.Aux != s { 24201 break 24202 } 24203 _ = x1.Args[1] 24204 if p != x1.Args[0] { 24205 break 24206 } 24207 if mem != x1.Args[1] { 24208 break 24209 } 24210 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)) { 24211 break 24212 } 24213 b = mergePoint(b, x0, x1) 24214 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 24215 v.reset(OpCopy) 24216 v.AddArg(v0) 24217 v0.AuxInt = i0 24218 v0.Aux = s 24219 v0.AddArg(p) 24220 v0.AddArg(mem) 24221 return true 24222 } 24223 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 24224 // 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) 24225 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24226 for { 24227 _ = v.Args[1] 24228 s0 := v.Args[0] 24229 if s0.Op != OpS390XSLDconst { 24230 break 24231 } 24232 j0 := s0.AuxInt 24233 x0 := s0.Args[0] 24234 if x0.Op != OpS390XMOVBZload { 24235 break 24236 } 24237 i0 := x0.AuxInt 24238 s := x0.Aux 24239 _ = x0.Args[1] 24240 p := x0.Args[0] 24241 mem := x0.Args[1] 24242 or := v.Args[1] 24243 if or.Op != OpS390XOR { 24244 break 24245 } 24246 _ = or.Args[1] 24247 s1 := or.Args[0] 24248 if s1.Op != OpS390XSLDconst { 24249 break 24250 } 24251 j1 := s1.AuxInt 24252 x1 := s1.Args[0] 24253 if x1.Op != OpS390XMOVBZload { 24254 break 24255 } 24256 i1 := x1.AuxInt 24257 if x1.Aux != s { 24258 break 24259 } 24260 _ = x1.Args[1] 24261 if p != x1.Args[0] { 24262 break 24263 } 24264 if mem != x1.Args[1] { 24265 break 24266 } 24267 y := or.Args[1] 24268 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)) { 24269 break 24270 } 24271 b = mergePoint(b, x0, x1) 24272 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24273 v.reset(OpCopy) 24274 v.AddArg(v0) 24275 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24276 v1.AuxInt = j1 24277 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 24278 v2.AuxInt = i0 24279 v2.Aux = s 24280 v2.AddArg(p) 24281 v2.AddArg(mem) 24282 v1.AddArg(v2) 24283 v0.AddArg(v1) 24284 v0.AddArg(y) 24285 return true 24286 } 24287 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 24288 // 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) 24289 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24290 for { 24291 _ = v.Args[1] 24292 s0 := v.Args[0] 24293 if s0.Op != OpS390XSLDconst { 24294 break 24295 } 24296 j0 := s0.AuxInt 24297 x0 := s0.Args[0] 24298 if x0.Op != OpS390XMOVBZload { 24299 break 24300 } 24301 i0 := x0.AuxInt 24302 s := x0.Aux 24303 _ = x0.Args[1] 24304 p := x0.Args[0] 24305 mem := x0.Args[1] 24306 or := v.Args[1] 24307 if or.Op != OpS390XOR { 24308 break 24309 } 24310 _ = or.Args[1] 24311 y := or.Args[0] 24312 s1 := or.Args[1] 24313 if s1.Op != OpS390XSLDconst { 24314 break 24315 } 24316 j1 := s1.AuxInt 24317 x1 := s1.Args[0] 24318 if x1.Op != OpS390XMOVBZload { 24319 break 24320 } 24321 i1 := x1.AuxInt 24322 if x1.Aux != s { 24323 break 24324 } 24325 _ = x1.Args[1] 24326 if p != x1.Args[0] { 24327 break 24328 } 24329 if mem != x1.Args[1] { 24330 break 24331 } 24332 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)) { 24333 break 24334 } 24335 b = mergePoint(b, x0, x1) 24336 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24337 v.reset(OpCopy) 24338 v.AddArg(v0) 24339 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24340 v1.AuxInt = j1 24341 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 24342 v2.AuxInt = i0 24343 v2.Aux = s 24344 v2.AddArg(p) 24345 v2.AddArg(mem) 24346 v1.AddArg(v2) 24347 v0.AddArg(v1) 24348 v0.AddArg(y) 24349 return true 24350 } 24351 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 24352 // 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) 24353 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24354 for { 24355 _ = v.Args[1] 24356 or := v.Args[0] 24357 if or.Op != OpS390XOR { 24358 break 24359 } 24360 _ = or.Args[1] 24361 s1 := or.Args[0] 24362 if s1.Op != OpS390XSLDconst { 24363 break 24364 } 24365 j1 := s1.AuxInt 24366 x1 := s1.Args[0] 24367 if x1.Op != OpS390XMOVBZload { 24368 break 24369 } 24370 i1 := x1.AuxInt 24371 s := x1.Aux 24372 _ = x1.Args[1] 24373 p := x1.Args[0] 24374 mem := x1.Args[1] 24375 y := or.Args[1] 24376 s0 := v.Args[1] 24377 if s0.Op != OpS390XSLDconst { 24378 break 24379 } 24380 j0 := s0.AuxInt 24381 x0 := s0.Args[0] 24382 if x0.Op != OpS390XMOVBZload { 24383 break 24384 } 24385 i0 := x0.AuxInt 24386 if x0.Aux != s { 24387 break 24388 } 24389 _ = x0.Args[1] 24390 if p != x0.Args[0] { 24391 break 24392 } 24393 if mem != x0.Args[1] { 24394 break 24395 } 24396 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)) { 24397 break 24398 } 24399 b = mergePoint(b, x0, x1) 24400 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24401 v.reset(OpCopy) 24402 v.AddArg(v0) 24403 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24404 v1.AuxInt = j1 24405 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 24406 v2.AuxInt = i0 24407 v2.Aux = s 24408 v2.AddArg(p) 24409 v2.AddArg(mem) 24410 v1.AddArg(v2) 24411 v0.AddArg(v1) 24412 v0.AddArg(y) 24413 return true 24414 } 24415 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 24416 // 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) 24417 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24418 for { 24419 _ = v.Args[1] 24420 or := v.Args[0] 24421 if or.Op != OpS390XOR { 24422 break 24423 } 24424 _ = or.Args[1] 24425 y := or.Args[0] 24426 s1 := or.Args[1] 24427 if s1.Op != OpS390XSLDconst { 24428 break 24429 } 24430 j1 := s1.AuxInt 24431 x1 := s1.Args[0] 24432 if x1.Op != OpS390XMOVBZload { 24433 break 24434 } 24435 i1 := x1.AuxInt 24436 s := x1.Aux 24437 _ = x1.Args[1] 24438 p := x1.Args[0] 24439 mem := x1.Args[1] 24440 s0 := v.Args[1] 24441 if s0.Op != OpS390XSLDconst { 24442 break 24443 } 24444 j0 := s0.AuxInt 24445 x0 := s0.Args[0] 24446 if x0.Op != OpS390XMOVBZload { 24447 break 24448 } 24449 i0 := x0.AuxInt 24450 if x0.Aux != s { 24451 break 24452 } 24453 _ = x0.Args[1] 24454 if p != x0.Args[0] { 24455 break 24456 } 24457 if mem != x0.Args[1] { 24458 break 24459 } 24460 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)) { 24461 break 24462 } 24463 b = mergePoint(b, x0, x1) 24464 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24465 v.reset(OpCopy) 24466 v.AddArg(v0) 24467 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24468 v1.AuxInt = j1 24469 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 24470 v2.AuxInt = i0 24471 v2.Aux = s 24472 v2.AddArg(p) 24473 v2.AddArg(mem) 24474 v1.AddArg(v2) 24475 v0.AddArg(v1) 24476 v0.AddArg(y) 24477 return true 24478 } 24479 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 24480 // 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) 24481 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24482 for { 24483 _ = v.Args[1] 24484 s0 := v.Args[0] 24485 if s0.Op != OpS390XSLDconst { 24486 break 24487 } 24488 j0 := s0.AuxInt 24489 x0 := s0.Args[0] 24490 if x0.Op != OpS390XMOVHZload { 24491 break 24492 } 24493 i0 := x0.AuxInt 24494 s := x0.Aux 24495 _ = x0.Args[1] 24496 p := x0.Args[0] 24497 mem := x0.Args[1] 24498 or := v.Args[1] 24499 if or.Op != OpS390XOR { 24500 break 24501 } 24502 _ = or.Args[1] 24503 s1 := or.Args[0] 24504 if s1.Op != OpS390XSLDconst { 24505 break 24506 } 24507 j1 := s1.AuxInt 24508 x1 := s1.Args[0] 24509 if x1.Op != OpS390XMOVHZload { 24510 break 24511 } 24512 i1 := x1.AuxInt 24513 if x1.Aux != s { 24514 break 24515 } 24516 _ = x1.Args[1] 24517 if p != x1.Args[0] { 24518 break 24519 } 24520 if mem != x1.Args[1] { 24521 break 24522 } 24523 y := or.Args[1] 24524 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)) { 24525 break 24526 } 24527 b = mergePoint(b, x0, x1) 24528 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24529 v.reset(OpCopy) 24530 v.AddArg(v0) 24531 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24532 v1.AuxInt = j1 24533 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24534 v2.AuxInt = i0 24535 v2.Aux = s 24536 v2.AddArg(p) 24537 v2.AddArg(mem) 24538 v1.AddArg(v2) 24539 v0.AddArg(v1) 24540 v0.AddArg(y) 24541 return true 24542 } 24543 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 24544 // 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) 24545 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24546 for { 24547 _ = v.Args[1] 24548 s0 := v.Args[0] 24549 if s0.Op != OpS390XSLDconst { 24550 break 24551 } 24552 j0 := s0.AuxInt 24553 x0 := s0.Args[0] 24554 if x0.Op != OpS390XMOVHZload { 24555 break 24556 } 24557 i0 := x0.AuxInt 24558 s := x0.Aux 24559 _ = x0.Args[1] 24560 p := x0.Args[0] 24561 mem := x0.Args[1] 24562 or := v.Args[1] 24563 if or.Op != OpS390XOR { 24564 break 24565 } 24566 _ = or.Args[1] 24567 y := or.Args[0] 24568 s1 := or.Args[1] 24569 if s1.Op != OpS390XSLDconst { 24570 break 24571 } 24572 j1 := s1.AuxInt 24573 x1 := s1.Args[0] 24574 if x1.Op != OpS390XMOVHZload { 24575 break 24576 } 24577 i1 := x1.AuxInt 24578 if x1.Aux != s { 24579 break 24580 } 24581 _ = x1.Args[1] 24582 if p != x1.Args[0] { 24583 break 24584 } 24585 if mem != x1.Args[1] { 24586 break 24587 } 24588 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)) { 24589 break 24590 } 24591 b = mergePoint(b, x0, x1) 24592 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24593 v.reset(OpCopy) 24594 v.AddArg(v0) 24595 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24596 v1.AuxInt = j1 24597 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24598 v2.AuxInt = i0 24599 v2.Aux = s 24600 v2.AddArg(p) 24601 v2.AddArg(mem) 24602 v1.AddArg(v2) 24603 v0.AddArg(v1) 24604 v0.AddArg(y) 24605 return true 24606 } 24607 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 24608 // 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) 24609 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24610 for { 24611 _ = v.Args[1] 24612 or := v.Args[0] 24613 if or.Op != OpS390XOR { 24614 break 24615 } 24616 _ = or.Args[1] 24617 s1 := or.Args[0] 24618 if s1.Op != OpS390XSLDconst { 24619 break 24620 } 24621 j1 := s1.AuxInt 24622 x1 := s1.Args[0] 24623 if x1.Op != OpS390XMOVHZload { 24624 break 24625 } 24626 i1 := x1.AuxInt 24627 s := x1.Aux 24628 _ = x1.Args[1] 24629 p := x1.Args[0] 24630 mem := x1.Args[1] 24631 y := or.Args[1] 24632 s0 := v.Args[1] 24633 if s0.Op != OpS390XSLDconst { 24634 break 24635 } 24636 j0 := s0.AuxInt 24637 x0 := s0.Args[0] 24638 if x0.Op != OpS390XMOVHZload { 24639 break 24640 } 24641 i0 := x0.AuxInt 24642 if x0.Aux != s { 24643 break 24644 } 24645 _ = x0.Args[1] 24646 if p != x0.Args[0] { 24647 break 24648 } 24649 if mem != x0.Args[1] { 24650 break 24651 } 24652 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)) { 24653 break 24654 } 24655 b = mergePoint(b, x0, x1) 24656 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24657 v.reset(OpCopy) 24658 v.AddArg(v0) 24659 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24660 v1.AuxInt = j1 24661 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24662 v2.AuxInt = i0 24663 v2.Aux = s 24664 v2.AddArg(p) 24665 v2.AddArg(mem) 24666 v1.AddArg(v2) 24667 v0.AddArg(v1) 24668 v0.AddArg(y) 24669 return true 24670 } 24671 return false 24672 } 24673 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 24674 b := v.Block 24675 _ = b 24676 typ := &b.Func.Config.Types 24677 _ = typ 24678 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 24679 // 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) 24680 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24681 for { 24682 _ = v.Args[1] 24683 or := v.Args[0] 24684 if or.Op != OpS390XOR { 24685 break 24686 } 24687 _ = or.Args[1] 24688 y := or.Args[0] 24689 s1 := or.Args[1] 24690 if s1.Op != OpS390XSLDconst { 24691 break 24692 } 24693 j1 := s1.AuxInt 24694 x1 := s1.Args[0] 24695 if x1.Op != OpS390XMOVHZload { 24696 break 24697 } 24698 i1 := x1.AuxInt 24699 s := x1.Aux 24700 _ = x1.Args[1] 24701 p := x1.Args[0] 24702 mem := x1.Args[1] 24703 s0 := v.Args[1] 24704 if s0.Op != OpS390XSLDconst { 24705 break 24706 } 24707 j0 := s0.AuxInt 24708 x0 := s0.Args[0] 24709 if x0.Op != OpS390XMOVHZload { 24710 break 24711 } 24712 i0 := x0.AuxInt 24713 if x0.Aux != s { 24714 break 24715 } 24716 _ = x0.Args[1] 24717 if p != x0.Args[0] { 24718 break 24719 } 24720 if mem != x0.Args[1] { 24721 break 24722 } 24723 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)) { 24724 break 24725 } 24726 b = mergePoint(b, x0, x1) 24727 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24728 v.reset(OpCopy) 24729 v.AddArg(v0) 24730 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24731 v1.AuxInt = j1 24732 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 24733 v2.AuxInt = i0 24734 v2.Aux = s 24735 v2.AddArg(p) 24736 v2.AddArg(mem) 24737 v1.AddArg(v2) 24738 v0.AddArg(v1) 24739 v0.AddArg(y) 24740 return true 24741 } 24742 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 24743 // 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) 24744 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24745 for { 24746 _ = v.Args[1] 24747 x1 := v.Args[0] 24748 if x1.Op != OpS390XMOVBZloadidx { 24749 break 24750 } 24751 i1 := x1.AuxInt 24752 s := x1.Aux 24753 _ = x1.Args[2] 24754 p := x1.Args[0] 24755 idx := x1.Args[1] 24756 mem := x1.Args[2] 24757 sh := v.Args[1] 24758 if sh.Op != OpS390XSLDconst { 24759 break 24760 } 24761 if sh.AuxInt != 8 { 24762 break 24763 } 24764 x0 := sh.Args[0] 24765 if x0.Op != OpS390XMOVBZloadidx { 24766 break 24767 } 24768 i0 := x0.AuxInt 24769 if x0.Aux != s { 24770 break 24771 } 24772 _ = x0.Args[2] 24773 if p != x0.Args[0] { 24774 break 24775 } 24776 if idx != x0.Args[1] { 24777 break 24778 } 24779 if mem != x0.Args[2] { 24780 break 24781 } 24782 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)) { 24783 break 24784 } 24785 b = mergePoint(b, x0, x1) 24786 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24787 v.reset(OpCopy) 24788 v.AddArg(v0) 24789 v0.AuxInt = i0 24790 v0.Aux = s 24791 v0.AddArg(p) 24792 v0.AddArg(idx) 24793 v0.AddArg(mem) 24794 return true 24795 } 24796 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 24797 // 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) 24798 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24799 for { 24800 _ = v.Args[1] 24801 x1 := v.Args[0] 24802 if x1.Op != OpS390XMOVBZloadidx { 24803 break 24804 } 24805 i1 := x1.AuxInt 24806 s := x1.Aux 24807 _ = x1.Args[2] 24808 idx := x1.Args[0] 24809 p := x1.Args[1] 24810 mem := x1.Args[2] 24811 sh := v.Args[1] 24812 if sh.Op != OpS390XSLDconst { 24813 break 24814 } 24815 if sh.AuxInt != 8 { 24816 break 24817 } 24818 x0 := sh.Args[0] 24819 if x0.Op != OpS390XMOVBZloadidx { 24820 break 24821 } 24822 i0 := x0.AuxInt 24823 if x0.Aux != s { 24824 break 24825 } 24826 _ = x0.Args[2] 24827 if p != x0.Args[0] { 24828 break 24829 } 24830 if idx != x0.Args[1] { 24831 break 24832 } 24833 if mem != x0.Args[2] { 24834 break 24835 } 24836 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)) { 24837 break 24838 } 24839 b = mergePoint(b, x0, x1) 24840 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24841 v.reset(OpCopy) 24842 v.AddArg(v0) 24843 v0.AuxInt = i0 24844 v0.Aux = s 24845 v0.AddArg(p) 24846 v0.AddArg(idx) 24847 v0.AddArg(mem) 24848 return true 24849 } 24850 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 24851 // 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) 24852 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24853 for { 24854 _ = v.Args[1] 24855 x1 := v.Args[0] 24856 if x1.Op != OpS390XMOVBZloadidx { 24857 break 24858 } 24859 i1 := x1.AuxInt 24860 s := x1.Aux 24861 _ = x1.Args[2] 24862 p := x1.Args[0] 24863 idx := x1.Args[1] 24864 mem := x1.Args[2] 24865 sh := v.Args[1] 24866 if sh.Op != OpS390XSLDconst { 24867 break 24868 } 24869 if sh.AuxInt != 8 { 24870 break 24871 } 24872 x0 := sh.Args[0] 24873 if x0.Op != OpS390XMOVBZloadidx { 24874 break 24875 } 24876 i0 := x0.AuxInt 24877 if x0.Aux != s { 24878 break 24879 } 24880 _ = x0.Args[2] 24881 if idx != x0.Args[0] { 24882 break 24883 } 24884 if p != x0.Args[1] { 24885 break 24886 } 24887 if mem != x0.Args[2] { 24888 break 24889 } 24890 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)) { 24891 break 24892 } 24893 b = mergePoint(b, x0, x1) 24894 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24895 v.reset(OpCopy) 24896 v.AddArg(v0) 24897 v0.AuxInt = i0 24898 v0.Aux = s 24899 v0.AddArg(p) 24900 v0.AddArg(idx) 24901 v0.AddArg(mem) 24902 return true 24903 } 24904 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 24905 // 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) 24906 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24907 for { 24908 _ = v.Args[1] 24909 x1 := v.Args[0] 24910 if x1.Op != OpS390XMOVBZloadidx { 24911 break 24912 } 24913 i1 := x1.AuxInt 24914 s := x1.Aux 24915 _ = x1.Args[2] 24916 idx := x1.Args[0] 24917 p := x1.Args[1] 24918 mem := x1.Args[2] 24919 sh := v.Args[1] 24920 if sh.Op != OpS390XSLDconst { 24921 break 24922 } 24923 if sh.AuxInt != 8 { 24924 break 24925 } 24926 x0 := sh.Args[0] 24927 if x0.Op != OpS390XMOVBZloadidx { 24928 break 24929 } 24930 i0 := x0.AuxInt 24931 if x0.Aux != s { 24932 break 24933 } 24934 _ = x0.Args[2] 24935 if idx != x0.Args[0] { 24936 break 24937 } 24938 if p != x0.Args[1] { 24939 break 24940 } 24941 if mem != x0.Args[2] { 24942 break 24943 } 24944 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)) { 24945 break 24946 } 24947 b = mergePoint(b, x0, x1) 24948 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24949 v.reset(OpCopy) 24950 v.AddArg(v0) 24951 v0.AuxInt = i0 24952 v0.Aux = s 24953 v0.AddArg(p) 24954 v0.AddArg(idx) 24955 v0.AddArg(mem) 24956 return true 24957 } 24958 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 24959 // 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) 24960 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24961 for { 24962 _ = v.Args[1] 24963 sh := v.Args[0] 24964 if sh.Op != OpS390XSLDconst { 24965 break 24966 } 24967 if sh.AuxInt != 8 { 24968 break 24969 } 24970 x0 := sh.Args[0] 24971 if x0.Op != OpS390XMOVBZloadidx { 24972 break 24973 } 24974 i0 := x0.AuxInt 24975 s := x0.Aux 24976 _ = x0.Args[2] 24977 p := x0.Args[0] 24978 idx := x0.Args[1] 24979 mem := x0.Args[2] 24980 x1 := v.Args[1] 24981 if x1.Op != OpS390XMOVBZloadidx { 24982 break 24983 } 24984 i1 := x1.AuxInt 24985 if x1.Aux != s { 24986 break 24987 } 24988 _ = x1.Args[2] 24989 if p != x1.Args[0] { 24990 break 24991 } 24992 if idx != x1.Args[1] { 24993 break 24994 } 24995 if mem != x1.Args[2] { 24996 break 24997 } 24998 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)) { 24999 break 25000 } 25001 b = mergePoint(b, x0, x1) 25002 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25003 v.reset(OpCopy) 25004 v.AddArg(v0) 25005 v0.AuxInt = i0 25006 v0.Aux = s 25007 v0.AddArg(p) 25008 v0.AddArg(idx) 25009 v0.AddArg(mem) 25010 return true 25011 } 25012 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 25013 // 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) 25014 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25015 for { 25016 _ = v.Args[1] 25017 sh := v.Args[0] 25018 if sh.Op != OpS390XSLDconst { 25019 break 25020 } 25021 if sh.AuxInt != 8 { 25022 break 25023 } 25024 x0 := sh.Args[0] 25025 if x0.Op != OpS390XMOVBZloadidx { 25026 break 25027 } 25028 i0 := x0.AuxInt 25029 s := x0.Aux 25030 _ = x0.Args[2] 25031 idx := x0.Args[0] 25032 p := x0.Args[1] 25033 mem := x0.Args[2] 25034 x1 := v.Args[1] 25035 if x1.Op != OpS390XMOVBZloadidx { 25036 break 25037 } 25038 i1 := x1.AuxInt 25039 if x1.Aux != s { 25040 break 25041 } 25042 _ = x1.Args[2] 25043 if p != x1.Args[0] { 25044 break 25045 } 25046 if idx != x1.Args[1] { 25047 break 25048 } 25049 if mem != x1.Args[2] { 25050 break 25051 } 25052 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)) { 25053 break 25054 } 25055 b = mergePoint(b, x0, x1) 25056 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25057 v.reset(OpCopy) 25058 v.AddArg(v0) 25059 v0.AuxInt = i0 25060 v0.Aux = s 25061 v0.AddArg(p) 25062 v0.AddArg(idx) 25063 v0.AddArg(mem) 25064 return true 25065 } 25066 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 25067 // 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) 25068 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25069 for { 25070 _ = v.Args[1] 25071 sh := v.Args[0] 25072 if sh.Op != OpS390XSLDconst { 25073 break 25074 } 25075 if sh.AuxInt != 8 { 25076 break 25077 } 25078 x0 := sh.Args[0] 25079 if x0.Op != OpS390XMOVBZloadidx { 25080 break 25081 } 25082 i0 := x0.AuxInt 25083 s := x0.Aux 25084 _ = x0.Args[2] 25085 p := x0.Args[0] 25086 idx := x0.Args[1] 25087 mem := x0.Args[2] 25088 x1 := v.Args[1] 25089 if x1.Op != OpS390XMOVBZloadidx { 25090 break 25091 } 25092 i1 := x1.AuxInt 25093 if x1.Aux != s { 25094 break 25095 } 25096 _ = x1.Args[2] 25097 if idx != x1.Args[0] { 25098 break 25099 } 25100 if p != x1.Args[1] { 25101 break 25102 } 25103 if mem != x1.Args[2] { 25104 break 25105 } 25106 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)) { 25107 break 25108 } 25109 b = mergePoint(b, x0, x1) 25110 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25111 v.reset(OpCopy) 25112 v.AddArg(v0) 25113 v0.AuxInt = i0 25114 v0.Aux = s 25115 v0.AddArg(p) 25116 v0.AddArg(idx) 25117 v0.AddArg(mem) 25118 return true 25119 } 25120 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 25121 // 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) 25122 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25123 for { 25124 _ = v.Args[1] 25125 sh := v.Args[0] 25126 if sh.Op != OpS390XSLDconst { 25127 break 25128 } 25129 if sh.AuxInt != 8 { 25130 break 25131 } 25132 x0 := sh.Args[0] 25133 if x0.Op != OpS390XMOVBZloadidx { 25134 break 25135 } 25136 i0 := x0.AuxInt 25137 s := x0.Aux 25138 _ = x0.Args[2] 25139 idx := x0.Args[0] 25140 p := x0.Args[1] 25141 mem := x0.Args[2] 25142 x1 := v.Args[1] 25143 if x1.Op != OpS390XMOVBZloadidx { 25144 break 25145 } 25146 i1 := x1.AuxInt 25147 if x1.Aux != s { 25148 break 25149 } 25150 _ = x1.Args[2] 25151 if idx != x1.Args[0] { 25152 break 25153 } 25154 if p != x1.Args[1] { 25155 break 25156 } 25157 if mem != x1.Args[2] { 25158 break 25159 } 25160 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)) { 25161 break 25162 } 25163 b = mergePoint(b, x0, x1) 25164 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25165 v.reset(OpCopy) 25166 v.AddArg(v0) 25167 v0.AuxInt = i0 25168 v0.Aux = s 25169 v0.AddArg(p) 25170 v0.AddArg(idx) 25171 v0.AddArg(mem) 25172 return true 25173 } 25174 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 25175 // 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) 25176 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25177 for { 25178 _ = v.Args[1] 25179 x1 := v.Args[0] 25180 if x1.Op != OpS390XMOVHZloadidx { 25181 break 25182 } 25183 i1 := x1.AuxInt 25184 s := x1.Aux 25185 _ = x1.Args[2] 25186 p := x1.Args[0] 25187 idx := x1.Args[1] 25188 mem := x1.Args[2] 25189 sh := v.Args[1] 25190 if sh.Op != OpS390XSLDconst { 25191 break 25192 } 25193 if sh.AuxInt != 16 { 25194 break 25195 } 25196 x0 := sh.Args[0] 25197 if x0.Op != OpS390XMOVHZloadidx { 25198 break 25199 } 25200 i0 := x0.AuxInt 25201 if x0.Aux != s { 25202 break 25203 } 25204 _ = x0.Args[2] 25205 if p != x0.Args[0] { 25206 break 25207 } 25208 if idx != x0.Args[1] { 25209 break 25210 } 25211 if mem != x0.Args[2] { 25212 break 25213 } 25214 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)) { 25215 break 25216 } 25217 b = mergePoint(b, x0, x1) 25218 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25219 v.reset(OpCopy) 25220 v.AddArg(v0) 25221 v0.AuxInt = i0 25222 v0.Aux = s 25223 v0.AddArg(p) 25224 v0.AddArg(idx) 25225 v0.AddArg(mem) 25226 return true 25227 } 25228 return false 25229 } 25230 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 25231 b := v.Block 25232 _ = b 25233 typ := &b.Func.Config.Types 25234 _ = typ 25235 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 25236 // 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) 25237 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25238 for { 25239 _ = v.Args[1] 25240 x1 := v.Args[0] 25241 if x1.Op != OpS390XMOVHZloadidx { 25242 break 25243 } 25244 i1 := x1.AuxInt 25245 s := x1.Aux 25246 _ = x1.Args[2] 25247 idx := x1.Args[0] 25248 p := x1.Args[1] 25249 mem := x1.Args[2] 25250 sh := v.Args[1] 25251 if sh.Op != OpS390XSLDconst { 25252 break 25253 } 25254 if sh.AuxInt != 16 { 25255 break 25256 } 25257 x0 := sh.Args[0] 25258 if x0.Op != OpS390XMOVHZloadidx { 25259 break 25260 } 25261 i0 := x0.AuxInt 25262 if x0.Aux != s { 25263 break 25264 } 25265 _ = x0.Args[2] 25266 if p != x0.Args[0] { 25267 break 25268 } 25269 if idx != x0.Args[1] { 25270 break 25271 } 25272 if mem != x0.Args[2] { 25273 break 25274 } 25275 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)) { 25276 break 25277 } 25278 b = mergePoint(b, x0, x1) 25279 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25280 v.reset(OpCopy) 25281 v.AddArg(v0) 25282 v0.AuxInt = i0 25283 v0.Aux = s 25284 v0.AddArg(p) 25285 v0.AddArg(idx) 25286 v0.AddArg(mem) 25287 return true 25288 } 25289 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 25290 // 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) 25291 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25292 for { 25293 _ = v.Args[1] 25294 x1 := v.Args[0] 25295 if x1.Op != OpS390XMOVHZloadidx { 25296 break 25297 } 25298 i1 := x1.AuxInt 25299 s := x1.Aux 25300 _ = x1.Args[2] 25301 p := x1.Args[0] 25302 idx := x1.Args[1] 25303 mem := x1.Args[2] 25304 sh := v.Args[1] 25305 if sh.Op != OpS390XSLDconst { 25306 break 25307 } 25308 if sh.AuxInt != 16 { 25309 break 25310 } 25311 x0 := sh.Args[0] 25312 if x0.Op != OpS390XMOVHZloadidx { 25313 break 25314 } 25315 i0 := x0.AuxInt 25316 if x0.Aux != s { 25317 break 25318 } 25319 _ = x0.Args[2] 25320 if idx != x0.Args[0] { 25321 break 25322 } 25323 if p != x0.Args[1] { 25324 break 25325 } 25326 if mem != x0.Args[2] { 25327 break 25328 } 25329 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)) { 25330 break 25331 } 25332 b = mergePoint(b, x0, x1) 25333 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25334 v.reset(OpCopy) 25335 v.AddArg(v0) 25336 v0.AuxInt = i0 25337 v0.Aux = s 25338 v0.AddArg(p) 25339 v0.AddArg(idx) 25340 v0.AddArg(mem) 25341 return true 25342 } 25343 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 25344 // 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) 25345 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25346 for { 25347 _ = v.Args[1] 25348 x1 := v.Args[0] 25349 if x1.Op != OpS390XMOVHZloadidx { 25350 break 25351 } 25352 i1 := x1.AuxInt 25353 s := x1.Aux 25354 _ = x1.Args[2] 25355 idx := x1.Args[0] 25356 p := x1.Args[1] 25357 mem := x1.Args[2] 25358 sh := v.Args[1] 25359 if sh.Op != OpS390XSLDconst { 25360 break 25361 } 25362 if sh.AuxInt != 16 { 25363 break 25364 } 25365 x0 := sh.Args[0] 25366 if x0.Op != OpS390XMOVHZloadidx { 25367 break 25368 } 25369 i0 := x0.AuxInt 25370 if x0.Aux != s { 25371 break 25372 } 25373 _ = x0.Args[2] 25374 if idx != x0.Args[0] { 25375 break 25376 } 25377 if p != x0.Args[1] { 25378 break 25379 } 25380 if mem != x0.Args[2] { 25381 break 25382 } 25383 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)) { 25384 break 25385 } 25386 b = mergePoint(b, x0, x1) 25387 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25388 v.reset(OpCopy) 25389 v.AddArg(v0) 25390 v0.AuxInt = i0 25391 v0.Aux = s 25392 v0.AddArg(p) 25393 v0.AddArg(idx) 25394 v0.AddArg(mem) 25395 return true 25396 } 25397 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 25398 // 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) 25399 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25400 for { 25401 _ = v.Args[1] 25402 sh := v.Args[0] 25403 if sh.Op != OpS390XSLDconst { 25404 break 25405 } 25406 if sh.AuxInt != 16 { 25407 break 25408 } 25409 x0 := sh.Args[0] 25410 if x0.Op != OpS390XMOVHZloadidx { 25411 break 25412 } 25413 i0 := x0.AuxInt 25414 s := x0.Aux 25415 _ = x0.Args[2] 25416 p := x0.Args[0] 25417 idx := x0.Args[1] 25418 mem := x0.Args[2] 25419 x1 := v.Args[1] 25420 if x1.Op != OpS390XMOVHZloadidx { 25421 break 25422 } 25423 i1 := x1.AuxInt 25424 if x1.Aux != s { 25425 break 25426 } 25427 _ = x1.Args[2] 25428 if p != x1.Args[0] { 25429 break 25430 } 25431 if idx != x1.Args[1] { 25432 break 25433 } 25434 if mem != x1.Args[2] { 25435 break 25436 } 25437 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)) { 25438 break 25439 } 25440 b = mergePoint(b, x0, x1) 25441 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25442 v.reset(OpCopy) 25443 v.AddArg(v0) 25444 v0.AuxInt = i0 25445 v0.Aux = s 25446 v0.AddArg(p) 25447 v0.AddArg(idx) 25448 v0.AddArg(mem) 25449 return true 25450 } 25451 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 25452 // 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) 25453 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25454 for { 25455 _ = v.Args[1] 25456 sh := v.Args[0] 25457 if sh.Op != OpS390XSLDconst { 25458 break 25459 } 25460 if sh.AuxInt != 16 { 25461 break 25462 } 25463 x0 := sh.Args[0] 25464 if x0.Op != OpS390XMOVHZloadidx { 25465 break 25466 } 25467 i0 := x0.AuxInt 25468 s := x0.Aux 25469 _ = x0.Args[2] 25470 idx := x0.Args[0] 25471 p := x0.Args[1] 25472 mem := x0.Args[2] 25473 x1 := v.Args[1] 25474 if x1.Op != OpS390XMOVHZloadidx { 25475 break 25476 } 25477 i1 := x1.AuxInt 25478 if x1.Aux != s { 25479 break 25480 } 25481 _ = x1.Args[2] 25482 if p != x1.Args[0] { 25483 break 25484 } 25485 if idx != x1.Args[1] { 25486 break 25487 } 25488 if mem != x1.Args[2] { 25489 break 25490 } 25491 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)) { 25492 break 25493 } 25494 b = mergePoint(b, x0, x1) 25495 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25496 v.reset(OpCopy) 25497 v.AddArg(v0) 25498 v0.AuxInt = i0 25499 v0.Aux = s 25500 v0.AddArg(p) 25501 v0.AddArg(idx) 25502 v0.AddArg(mem) 25503 return true 25504 } 25505 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 25506 // 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) 25507 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25508 for { 25509 _ = v.Args[1] 25510 sh := v.Args[0] 25511 if sh.Op != OpS390XSLDconst { 25512 break 25513 } 25514 if sh.AuxInt != 16 { 25515 break 25516 } 25517 x0 := sh.Args[0] 25518 if x0.Op != OpS390XMOVHZloadidx { 25519 break 25520 } 25521 i0 := x0.AuxInt 25522 s := x0.Aux 25523 _ = x0.Args[2] 25524 p := x0.Args[0] 25525 idx := x0.Args[1] 25526 mem := x0.Args[2] 25527 x1 := v.Args[1] 25528 if x1.Op != OpS390XMOVHZloadidx { 25529 break 25530 } 25531 i1 := x1.AuxInt 25532 if x1.Aux != s { 25533 break 25534 } 25535 _ = x1.Args[2] 25536 if idx != x1.Args[0] { 25537 break 25538 } 25539 if p != x1.Args[1] { 25540 break 25541 } 25542 if mem != x1.Args[2] { 25543 break 25544 } 25545 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)) { 25546 break 25547 } 25548 b = mergePoint(b, x0, x1) 25549 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25550 v.reset(OpCopy) 25551 v.AddArg(v0) 25552 v0.AuxInt = i0 25553 v0.Aux = s 25554 v0.AddArg(p) 25555 v0.AddArg(idx) 25556 v0.AddArg(mem) 25557 return true 25558 } 25559 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 25560 // 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) 25561 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25562 for { 25563 _ = v.Args[1] 25564 sh := v.Args[0] 25565 if sh.Op != OpS390XSLDconst { 25566 break 25567 } 25568 if sh.AuxInt != 16 { 25569 break 25570 } 25571 x0 := sh.Args[0] 25572 if x0.Op != OpS390XMOVHZloadidx { 25573 break 25574 } 25575 i0 := x0.AuxInt 25576 s := x0.Aux 25577 _ = x0.Args[2] 25578 idx := x0.Args[0] 25579 p := x0.Args[1] 25580 mem := x0.Args[2] 25581 x1 := v.Args[1] 25582 if x1.Op != OpS390XMOVHZloadidx { 25583 break 25584 } 25585 i1 := x1.AuxInt 25586 if x1.Aux != s { 25587 break 25588 } 25589 _ = x1.Args[2] 25590 if idx != x1.Args[0] { 25591 break 25592 } 25593 if p != x1.Args[1] { 25594 break 25595 } 25596 if mem != x1.Args[2] { 25597 break 25598 } 25599 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)) { 25600 break 25601 } 25602 b = mergePoint(b, x0, x1) 25603 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25604 v.reset(OpCopy) 25605 v.AddArg(v0) 25606 v0.AuxInt = i0 25607 v0.Aux = s 25608 v0.AddArg(p) 25609 v0.AddArg(idx) 25610 v0.AddArg(mem) 25611 return true 25612 } 25613 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 25614 // 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) 25615 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25616 for { 25617 _ = v.Args[1] 25618 x1 := v.Args[0] 25619 if x1.Op != OpS390XMOVWZloadidx { 25620 break 25621 } 25622 i1 := x1.AuxInt 25623 s := x1.Aux 25624 _ = x1.Args[2] 25625 p := x1.Args[0] 25626 idx := x1.Args[1] 25627 mem := x1.Args[2] 25628 sh := v.Args[1] 25629 if sh.Op != OpS390XSLDconst { 25630 break 25631 } 25632 if sh.AuxInt != 32 { 25633 break 25634 } 25635 x0 := sh.Args[0] 25636 if x0.Op != OpS390XMOVWZloadidx { 25637 break 25638 } 25639 i0 := x0.AuxInt 25640 if x0.Aux != s { 25641 break 25642 } 25643 _ = x0.Args[2] 25644 if p != x0.Args[0] { 25645 break 25646 } 25647 if idx != x0.Args[1] { 25648 break 25649 } 25650 if mem != x0.Args[2] { 25651 break 25652 } 25653 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)) { 25654 break 25655 } 25656 b = mergePoint(b, x0, x1) 25657 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25658 v.reset(OpCopy) 25659 v.AddArg(v0) 25660 v0.AuxInt = i0 25661 v0.Aux = s 25662 v0.AddArg(p) 25663 v0.AddArg(idx) 25664 v0.AddArg(mem) 25665 return true 25666 } 25667 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 25668 // 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) 25669 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25670 for { 25671 _ = v.Args[1] 25672 x1 := v.Args[0] 25673 if x1.Op != OpS390XMOVWZloadidx { 25674 break 25675 } 25676 i1 := x1.AuxInt 25677 s := x1.Aux 25678 _ = x1.Args[2] 25679 idx := x1.Args[0] 25680 p := x1.Args[1] 25681 mem := x1.Args[2] 25682 sh := v.Args[1] 25683 if sh.Op != OpS390XSLDconst { 25684 break 25685 } 25686 if sh.AuxInt != 32 { 25687 break 25688 } 25689 x0 := sh.Args[0] 25690 if x0.Op != OpS390XMOVWZloadidx { 25691 break 25692 } 25693 i0 := x0.AuxInt 25694 if x0.Aux != s { 25695 break 25696 } 25697 _ = x0.Args[2] 25698 if p != x0.Args[0] { 25699 break 25700 } 25701 if idx != x0.Args[1] { 25702 break 25703 } 25704 if mem != x0.Args[2] { 25705 break 25706 } 25707 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)) { 25708 break 25709 } 25710 b = mergePoint(b, x0, x1) 25711 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25712 v.reset(OpCopy) 25713 v.AddArg(v0) 25714 v0.AuxInt = i0 25715 v0.Aux = s 25716 v0.AddArg(p) 25717 v0.AddArg(idx) 25718 v0.AddArg(mem) 25719 return true 25720 } 25721 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 25722 // 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) 25723 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25724 for { 25725 _ = v.Args[1] 25726 x1 := v.Args[0] 25727 if x1.Op != OpS390XMOVWZloadidx { 25728 break 25729 } 25730 i1 := x1.AuxInt 25731 s := x1.Aux 25732 _ = x1.Args[2] 25733 p := x1.Args[0] 25734 idx := x1.Args[1] 25735 mem := x1.Args[2] 25736 sh := v.Args[1] 25737 if sh.Op != OpS390XSLDconst { 25738 break 25739 } 25740 if sh.AuxInt != 32 { 25741 break 25742 } 25743 x0 := sh.Args[0] 25744 if x0.Op != OpS390XMOVWZloadidx { 25745 break 25746 } 25747 i0 := x0.AuxInt 25748 if x0.Aux != s { 25749 break 25750 } 25751 _ = x0.Args[2] 25752 if idx != x0.Args[0] { 25753 break 25754 } 25755 if p != x0.Args[1] { 25756 break 25757 } 25758 if mem != x0.Args[2] { 25759 break 25760 } 25761 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)) { 25762 break 25763 } 25764 b = mergePoint(b, x0, x1) 25765 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25766 v.reset(OpCopy) 25767 v.AddArg(v0) 25768 v0.AuxInt = i0 25769 v0.Aux = s 25770 v0.AddArg(p) 25771 v0.AddArg(idx) 25772 v0.AddArg(mem) 25773 return true 25774 } 25775 return false 25776 } 25777 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 25778 b := v.Block 25779 _ = b 25780 typ := &b.Func.Config.Types 25781 _ = typ 25782 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 25783 // 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) 25784 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25785 for { 25786 _ = v.Args[1] 25787 x1 := v.Args[0] 25788 if x1.Op != OpS390XMOVWZloadidx { 25789 break 25790 } 25791 i1 := x1.AuxInt 25792 s := x1.Aux 25793 _ = x1.Args[2] 25794 idx := x1.Args[0] 25795 p := x1.Args[1] 25796 mem := x1.Args[2] 25797 sh := v.Args[1] 25798 if sh.Op != OpS390XSLDconst { 25799 break 25800 } 25801 if sh.AuxInt != 32 { 25802 break 25803 } 25804 x0 := sh.Args[0] 25805 if x0.Op != OpS390XMOVWZloadidx { 25806 break 25807 } 25808 i0 := x0.AuxInt 25809 if x0.Aux != s { 25810 break 25811 } 25812 _ = x0.Args[2] 25813 if idx != x0.Args[0] { 25814 break 25815 } 25816 if p != x0.Args[1] { 25817 break 25818 } 25819 if mem != x0.Args[2] { 25820 break 25821 } 25822 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)) { 25823 break 25824 } 25825 b = mergePoint(b, x0, x1) 25826 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25827 v.reset(OpCopy) 25828 v.AddArg(v0) 25829 v0.AuxInt = i0 25830 v0.Aux = s 25831 v0.AddArg(p) 25832 v0.AddArg(idx) 25833 v0.AddArg(mem) 25834 return true 25835 } 25836 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 25837 // 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) 25838 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25839 for { 25840 _ = v.Args[1] 25841 sh := v.Args[0] 25842 if sh.Op != OpS390XSLDconst { 25843 break 25844 } 25845 if sh.AuxInt != 32 { 25846 break 25847 } 25848 x0 := sh.Args[0] 25849 if x0.Op != OpS390XMOVWZloadidx { 25850 break 25851 } 25852 i0 := x0.AuxInt 25853 s := x0.Aux 25854 _ = x0.Args[2] 25855 p := x0.Args[0] 25856 idx := x0.Args[1] 25857 mem := x0.Args[2] 25858 x1 := v.Args[1] 25859 if x1.Op != OpS390XMOVWZloadidx { 25860 break 25861 } 25862 i1 := x1.AuxInt 25863 if x1.Aux != s { 25864 break 25865 } 25866 _ = x1.Args[2] 25867 if p != x1.Args[0] { 25868 break 25869 } 25870 if idx != x1.Args[1] { 25871 break 25872 } 25873 if mem != x1.Args[2] { 25874 break 25875 } 25876 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)) { 25877 break 25878 } 25879 b = mergePoint(b, x0, x1) 25880 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25881 v.reset(OpCopy) 25882 v.AddArg(v0) 25883 v0.AuxInt = i0 25884 v0.Aux = s 25885 v0.AddArg(p) 25886 v0.AddArg(idx) 25887 v0.AddArg(mem) 25888 return true 25889 } 25890 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 25891 // 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) 25892 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25893 for { 25894 _ = v.Args[1] 25895 sh := v.Args[0] 25896 if sh.Op != OpS390XSLDconst { 25897 break 25898 } 25899 if sh.AuxInt != 32 { 25900 break 25901 } 25902 x0 := sh.Args[0] 25903 if x0.Op != OpS390XMOVWZloadidx { 25904 break 25905 } 25906 i0 := x0.AuxInt 25907 s := x0.Aux 25908 _ = x0.Args[2] 25909 idx := x0.Args[0] 25910 p := x0.Args[1] 25911 mem := x0.Args[2] 25912 x1 := v.Args[1] 25913 if x1.Op != OpS390XMOVWZloadidx { 25914 break 25915 } 25916 i1 := x1.AuxInt 25917 if x1.Aux != s { 25918 break 25919 } 25920 _ = x1.Args[2] 25921 if p != x1.Args[0] { 25922 break 25923 } 25924 if idx != x1.Args[1] { 25925 break 25926 } 25927 if mem != x1.Args[2] { 25928 break 25929 } 25930 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)) { 25931 break 25932 } 25933 b = mergePoint(b, x0, x1) 25934 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25935 v.reset(OpCopy) 25936 v.AddArg(v0) 25937 v0.AuxInt = i0 25938 v0.Aux = s 25939 v0.AddArg(p) 25940 v0.AddArg(idx) 25941 v0.AddArg(mem) 25942 return true 25943 } 25944 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 25945 // 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) 25946 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25947 for { 25948 _ = v.Args[1] 25949 sh := v.Args[0] 25950 if sh.Op != OpS390XSLDconst { 25951 break 25952 } 25953 if sh.AuxInt != 32 { 25954 break 25955 } 25956 x0 := sh.Args[0] 25957 if x0.Op != OpS390XMOVWZloadidx { 25958 break 25959 } 25960 i0 := x0.AuxInt 25961 s := x0.Aux 25962 _ = x0.Args[2] 25963 p := x0.Args[0] 25964 idx := x0.Args[1] 25965 mem := x0.Args[2] 25966 x1 := v.Args[1] 25967 if x1.Op != OpS390XMOVWZloadidx { 25968 break 25969 } 25970 i1 := x1.AuxInt 25971 if x1.Aux != s { 25972 break 25973 } 25974 _ = x1.Args[2] 25975 if idx != x1.Args[0] { 25976 break 25977 } 25978 if p != x1.Args[1] { 25979 break 25980 } 25981 if mem != x1.Args[2] { 25982 break 25983 } 25984 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)) { 25985 break 25986 } 25987 b = mergePoint(b, x0, x1) 25988 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25989 v.reset(OpCopy) 25990 v.AddArg(v0) 25991 v0.AuxInt = i0 25992 v0.Aux = s 25993 v0.AddArg(p) 25994 v0.AddArg(idx) 25995 v0.AddArg(mem) 25996 return true 25997 } 25998 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 25999 // 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) 26000 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 26001 for { 26002 _ = v.Args[1] 26003 sh := v.Args[0] 26004 if sh.Op != OpS390XSLDconst { 26005 break 26006 } 26007 if sh.AuxInt != 32 { 26008 break 26009 } 26010 x0 := sh.Args[0] 26011 if x0.Op != OpS390XMOVWZloadidx { 26012 break 26013 } 26014 i0 := x0.AuxInt 26015 s := x0.Aux 26016 _ = x0.Args[2] 26017 idx := x0.Args[0] 26018 p := x0.Args[1] 26019 mem := x0.Args[2] 26020 x1 := v.Args[1] 26021 if x1.Op != OpS390XMOVWZloadidx { 26022 break 26023 } 26024 i1 := x1.AuxInt 26025 if x1.Aux != s { 26026 break 26027 } 26028 _ = x1.Args[2] 26029 if idx != x1.Args[0] { 26030 break 26031 } 26032 if p != x1.Args[1] { 26033 break 26034 } 26035 if mem != x1.Args[2] { 26036 break 26037 } 26038 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)) { 26039 break 26040 } 26041 b = mergePoint(b, x0, x1) 26042 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 26043 v.reset(OpCopy) 26044 v.AddArg(v0) 26045 v0.AuxInt = i0 26046 v0.Aux = s 26047 v0.AddArg(p) 26048 v0.AddArg(idx) 26049 v0.AddArg(mem) 26050 return true 26051 } 26052 // 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)) 26053 // 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) 26054 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26055 for { 26056 _ = v.Args[1] 26057 s0 := v.Args[0] 26058 if s0.Op != OpS390XSLDconst { 26059 break 26060 } 26061 j0 := s0.AuxInt 26062 x0 := s0.Args[0] 26063 if x0.Op != OpS390XMOVBZloadidx { 26064 break 26065 } 26066 i0 := x0.AuxInt 26067 s := x0.Aux 26068 _ = x0.Args[2] 26069 p := x0.Args[0] 26070 idx := x0.Args[1] 26071 mem := x0.Args[2] 26072 or := v.Args[1] 26073 if or.Op != OpS390XOR { 26074 break 26075 } 26076 _ = or.Args[1] 26077 s1 := or.Args[0] 26078 if s1.Op != OpS390XSLDconst { 26079 break 26080 } 26081 j1 := s1.AuxInt 26082 x1 := s1.Args[0] 26083 if x1.Op != OpS390XMOVBZloadidx { 26084 break 26085 } 26086 i1 := x1.AuxInt 26087 if x1.Aux != s { 26088 break 26089 } 26090 _ = x1.Args[2] 26091 if p != x1.Args[0] { 26092 break 26093 } 26094 if idx != x1.Args[1] { 26095 break 26096 } 26097 if mem != x1.Args[2] { 26098 break 26099 } 26100 y := or.Args[1] 26101 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)) { 26102 break 26103 } 26104 b = mergePoint(b, x0, x1) 26105 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26106 v.reset(OpCopy) 26107 v.AddArg(v0) 26108 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26109 v1.AuxInt = j1 26110 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26111 v2.AuxInt = i0 26112 v2.Aux = s 26113 v2.AddArg(p) 26114 v2.AddArg(idx) 26115 v2.AddArg(mem) 26116 v1.AddArg(v2) 26117 v0.AddArg(v1) 26118 v0.AddArg(y) 26119 return true 26120 } 26121 // 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)) 26122 // 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) 26123 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26124 for { 26125 _ = v.Args[1] 26126 s0 := v.Args[0] 26127 if s0.Op != OpS390XSLDconst { 26128 break 26129 } 26130 j0 := s0.AuxInt 26131 x0 := s0.Args[0] 26132 if x0.Op != OpS390XMOVBZloadidx { 26133 break 26134 } 26135 i0 := x0.AuxInt 26136 s := x0.Aux 26137 _ = x0.Args[2] 26138 idx := x0.Args[0] 26139 p := x0.Args[1] 26140 mem := x0.Args[2] 26141 or := v.Args[1] 26142 if or.Op != OpS390XOR { 26143 break 26144 } 26145 _ = or.Args[1] 26146 s1 := or.Args[0] 26147 if s1.Op != OpS390XSLDconst { 26148 break 26149 } 26150 j1 := s1.AuxInt 26151 x1 := s1.Args[0] 26152 if x1.Op != OpS390XMOVBZloadidx { 26153 break 26154 } 26155 i1 := x1.AuxInt 26156 if x1.Aux != s { 26157 break 26158 } 26159 _ = x1.Args[2] 26160 if p != x1.Args[0] { 26161 break 26162 } 26163 if idx != x1.Args[1] { 26164 break 26165 } 26166 if mem != x1.Args[2] { 26167 break 26168 } 26169 y := or.Args[1] 26170 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)) { 26171 break 26172 } 26173 b = mergePoint(b, x0, x1) 26174 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26175 v.reset(OpCopy) 26176 v.AddArg(v0) 26177 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26178 v1.AuxInt = j1 26179 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26180 v2.AuxInt = i0 26181 v2.Aux = s 26182 v2.AddArg(p) 26183 v2.AddArg(idx) 26184 v2.AddArg(mem) 26185 v1.AddArg(v2) 26186 v0.AddArg(v1) 26187 v0.AddArg(y) 26188 return true 26189 } 26190 // 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)) 26191 // 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) 26192 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26193 for { 26194 _ = v.Args[1] 26195 s0 := v.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 _ = x0.Args[2] 26207 p := x0.Args[0] 26208 idx := x0.Args[1] 26209 mem := x0.Args[2] 26210 or := v.Args[1] 26211 if or.Op != OpS390XOR { 26212 break 26213 } 26214 _ = or.Args[1] 26215 s1 := or.Args[0] 26216 if s1.Op != OpS390XSLDconst { 26217 break 26218 } 26219 j1 := s1.AuxInt 26220 x1 := s1.Args[0] 26221 if x1.Op != OpS390XMOVBZloadidx { 26222 break 26223 } 26224 i1 := x1.AuxInt 26225 if x1.Aux != s { 26226 break 26227 } 26228 _ = x1.Args[2] 26229 if idx != x1.Args[0] { 26230 break 26231 } 26232 if p != x1.Args[1] { 26233 break 26234 } 26235 if mem != x1.Args[2] { 26236 break 26237 } 26238 y := or.Args[1] 26239 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)) { 26240 break 26241 } 26242 b = mergePoint(b, x0, x1) 26243 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26244 v.reset(OpCopy) 26245 v.AddArg(v0) 26246 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26247 v1.AuxInt = j1 26248 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26249 v2.AuxInt = i0 26250 v2.Aux = s 26251 v2.AddArg(p) 26252 v2.AddArg(idx) 26253 v2.AddArg(mem) 26254 v1.AddArg(v2) 26255 v0.AddArg(v1) 26256 v0.AddArg(y) 26257 return true 26258 } 26259 // 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)) 26260 // 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) 26261 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26262 for { 26263 _ = v.Args[1] 26264 s0 := v.Args[0] 26265 if s0.Op != OpS390XSLDconst { 26266 break 26267 } 26268 j0 := s0.AuxInt 26269 x0 := s0.Args[0] 26270 if x0.Op != OpS390XMOVBZloadidx { 26271 break 26272 } 26273 i0 := x0.AuxInt 26274 s := x0.Aux 26275 _ = x0.Args[2] 26276 idx := x0.Args[0] 26277 p := x0.Args[1] 26278 mem := x0.Args[2] 26279 or := v.Args[1] 26280 if or.Op != OpS390XOR { 26281 break 26282 } 26283 _ = or.Args[1] 26284 s1 := or.Args[0] 26285 if s1.Op != OpS390XSLDconst { 26286 break 26287 } 26288 j1 := s1.AuxInt 26289 x1 := s1.Args[0] 26290 if x1.Op != OpS390XMOVBZloadidx { 26291 break 26292 } 26293 i1 := x1.AuxInt 26294 if x1.Aux != s { 26295 break 26296 } 26297 _ = x1.Args[2] 26298 if idx != x1.Args[0] { 26299 break 26300 } 26301 if p != x1.Args[1] { 26302 break 26303 } 26304 if mem != x1.Args[2] { 26305 break 26306 } 26307 y := or.Args[1] 26308 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)) { 26309 break 26310 } 26311 b = mergePoint(b, x0, x1) 26312 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26313 v.reset(OpCopy) 26314 v.AddArg(v0) 26315 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26316 v1.AuxInt = j1 26317 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26318 v2.AuxInt = i0 26319 v2.Aux = s 26320 v2.AddArg(p) 26321 v2.AddArg(idx) 26322 v2.AddArg(mem) 26323 v1.AddArg(v2) 26324 v0.AddArg(v1) 26325 v0.AddArg(y) 26326 return true 26327 } 26328 // 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)))) 26329 // 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) 26330 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26331 for { 26332 _ = v.Args[1] 26333 s0 := v.Args[0] 26334 if s0.Op != OpS390XSLDconst { 26335 break 26336 } 26337 j0 := s0.AuxInt 26338 x0 := s0.Args[0] 26339 if x0.Op != OpS390XMOVBZloadidx { 26340 break 26341 } 26342 i0 := x0.AuxInt 26343 s := x0.Aux 26344 _ = x0.Args[2] 26345 p := x0.Args[0] 26346 idx := x0.Args[1] 26347 mem := x0.Args[2] 26348 or := v.Args[1] 26349 if or.Op != OpS390XOR { 26350 break 26351 } 26352 _ = or.Args[1] 26353 y := or.Args[0] 26354 s1 := or.Args[1] 26355 if s1.Op != OpS390XSLDconst { 26356 break 26357 } 26358 j1 := s1.AuxInt 26359 x1 := s1.Args[0] 26360 if x1.Op != OpS390XMOVBZloadidx { 26361 break 26362 } 26363 i1 := x1.AuxInt 26364 if x1.Aux != s { 26365 break 26366 } 26367 _ = x1.Args[2] 26368 if p != x1.Args[0] { 26369 break 26370 } 26371 if idx != x1.Args[1] { 26372 break 26373 } 26374 if mem != x1.Args[2] { 26375 break 26376 } 26377 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)) { 26378 break 26379 } 26380 b = mergePoint(b, x0, x1) 26381 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26382 v.reset(OpCopy) 26383 v.AddArg(v0) 26384 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26385 v1.AuxInt = j1 26386 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26387 v2.AuxInt = i0 26388 v2.Aux = s 26389 v2.AddArg(p) 26390 v2.AddArg(idx) 26391 v2.AddArg(mem) 26392 v1.AddArg(v2) 26393 v0.AddArg(v1) 26394 v0.AddArg(y) 26395 return true 26396 } 26397 return false 26398 } 26399 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 26400 b := v.Block 26401 _ = b 26402 typ := &b.Func.Config.Types 26403 _ = typ 26404 // 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)))) 26405 // 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) 26406 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26407 for { 26408 _ = v.Args[1] 26409 s0 := v.Args[0] 26410 if s0.Op != OpS390XSLDconst { 26411 break 26412 } 26413 j0 := s0.AuxInt 26414 x0 := s0.Args[0] 26415 if x0.Op != OpS390XMOVBZloadidx { 26416 break 26417 } 26418 i0 := x0.AuxInt 26419 s := x0.Aux 26420 _ = x0.Args[2] 26421 idx := x0.Args[0] 26422 p := x0.Args[1] 26423 mem := x0.Args[2] 26424 or := v.Args[1] 26425 if or.Op != OpS390XOR { 26426 break 26427 } 26428 _ = or.Args[1] 26429 y := or.Args[0] 26430 s1 := or.Args[1] 26431 if s1.Op != OpS390XSLDconst { 26432 break 26433 } 26434 j1 := s1.AuxInt 26435 x1 := s1.Args[0] 26436 if x1.Op != OpS390XMOVBZloadidx { 26437 break 26438 } 26439 i1 := x1.AuxInt 26440 if x1.Aux != s { 26441 break 26442 } 26443 _ = x1.Args[2] 26444 if p != x1.Args[0] { 26445 break 26446 } 26447 if idx != x1.Args[1] { 26448 break 26449 } 26450 if mem != x1.Args[2] { 26451 break 26452 } 26453 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)) { 26454 break 26455 } 26456 b = mergePoint(b, x0, x1) 26457 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26458 v.reset(OpCopy) 26459 v.AddArg(v0) 26460 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26461 v1.AuxInt = j1 26462 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26463 v2.AuxInt = i0 26464 v2.Aux = s 26465 v2.AddArg(p) 26466 v2.AddArg(idx) 26467 v2.AddArg(mem) 26468 v1.AddArg(v2) 26469 v0.AddArg(v1) 26470 v0.AddArg(y) 26471 return true 26472 } 26473 // 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)))) 26474 // 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) 26475 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26476 for { 26477 _ = v.Args[1] 26478 s0 := v.Args[0] 26479 if s0.Op != OpS390XSLDconst { 26480 break 26481 } 26482 j0 := s0.AuxInt 26483 x0 := s0.Args[0] 26484 if x0.Op != OpS390XMOVBZloadidx { 26485 break 26486 } 26487 i0 := x0.AuxInt 26488 s := x0.Aux 26489 _ = x0.Args[2] 26490 p := x0.Args[0] 26491 idx := x0.Args[1] 26492 mem := x0.Args[2] 26493 or := v.Args[1] 26494 if or.Op != OpS390XOR { 26495 break 26496 } 26497 _ = or.Args[1] 26498 y := or.Args[0] 26499 s1 := or.Args[1] 26500 if s1.Op != OpS390XSLDconst { 26501 break 26502 } 26503 j1 := s1.AuxInt 26504 x1 := s1.Args[0] 26505 if x1.Op != OpS390XMOVBZloadidx { 26506 break 26507 } 26508 i1 := x1.AuxInt 26509 if x1.Aux != s { 26510 break 26511 } 26512 _ = x1.Args[2] 26513 if idx != x1.Args[0] { 26514 break 26515 } 26516 if p != x1.Args[1] { 26517 break 26518 } 26519 if mem != x1.Args[2] { 26520 break 26521 } 26522 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)) { 26523 break 26524 } 26525 b = mergePoint(b, x0, x1) 26526 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26527 v.reset(OpCopy) 26528 v.AddArg(v0) 26529 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26530 v1.AuxInt = j1 26531 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26532 v2.AuxInt = i0 26533 v2.Aux = s 26534 v2.AddArg(p) 26535 v2.AddArg(idx) 26536 v2.AddArg(mem) 26537 v1.AddArg(v2) 26538 v0.AddArg(v1) 26539 v0.AddArg(y) 26540 return true 26541 } 26542 // 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)))) 26543 // 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) 26544 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26545 for { 26546 _ = v.Args[1] 26547 s0 := v.Args[0] 26548 if s0.Op != OpS390XSLDconst { 26549 break 26550 } 26551 j0 := s0.AuxInt 26552 x0 := s0.Args[0] 26553 if x0.Op != OpS390XMOVBZloadidx { 26554 break 26555 } 26556 i0 := x0.AuxInt 26557 s := x0.Aux 26558 _ = x0.Args[2] 26559 idx := x0.Args[0] 26560 p := x0.Args[1] 26561 mem := x0.Args[2] 26562 or := v.Args[1] 26563 if or.Op != OpS390XOR { 26564 break 26565 } 26566 _ = or.Args[1] 26567 y := or.Args[0] 26568 s1 := or.Args[1] 26569 if s1.Op != OpS390XSLDconst { 26570 break 26571 } 26572 j1 := s1.AuxInt 26573 x1 := s1.Args[0] 26574 if x1.Op != OpS390XMOVBZloadidx { 26575 break 26576 } 26577 i1 := x1.AuxInt 26578 if x1.Aux != s { 26579 break 26580 } 26581 _ = x1.Args[2] 26582 if idx != x1.Args[0] { 26583 break 26584 } 26585 if p != x1.Args[1] { 26586 break 26587 } 26588 if mem != x1.Args[2] { 26589 break 26590 } 26591 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)) { 26592 break 26593 } 26594 b = mergePoint(b, x0, x1) 26595 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26596 v.reset(OpCopy) 26597 v.AddArg(v0) 26598 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26599 v1.AuxInt = j1 26600 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26601 v2.AuxInt = i0 26602 v2.Aux = s 26603 v2.AddArg(p) 26604 v2.AddArg(idx) 26605 v2.AddArg(mem) 26606 v1.AddArg(v2) 26607 v0.AddArg(v1) 26608 v0.AddArg(y) 26609 return true 26610 } 26611 // 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))) 26612 // 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) 26613 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26614 for { 26615 _ = v.Args[1] 26616 or := v.Args[0] 26617 if or.Op != OpS390XOR { 26618 break 26619 } 26620 _ = or.Args[1] 26621 s1 := or.Args[0] 26622 if s1.Op != OpS390XSLDconst { 26623 break 26624 } 26625 j1 := s1.AuxInt 26626 x1 := s1.Args[0] 26627 if x1.Op != OpS390XMOVBZloadidx { 26628 break 26629 } 26630 i1 := x1.AuxInt 26631 s := x1.Aux 26632 _ = x1.Args[2] 26633 p := x1.Args[0] 26634 idx := x1.Args[1] 26635 mem := x1.Args[2] 26636 y := or.Args[1] 26637 s0 := v.Args[1] 26638 if s0.Op != OpS390XSLDconst { 26639 break 26640 } 26641 j0 := s0.AuxInt 26642 x0 := s0.Args[0] 26643 if x0.Op != OpS390XMOVBZloadidx { 26644 break 26645 } 26646 i0 := x0.AuxInt 26647 if x0.Aux != s { 26648 break 26649 } 26650 _ = x0.Args[2] 26651 if p != x0.Args[0] { 26652 break 26653 } 26654 if idx != x0.Args[1] { 26655 break 26656 } 26657 if mem != x0.Args[2] { 26658 break 26659 } 26660 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)) { 26661 break 26662 } 26663 b = mergePoint(b, x0, x1) 26664 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26665 v.reset(OpCopy) 26666 v.AddArg(v0) 26667 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26668 v1.AuxInt = j1 26669 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26670 v2.AuxInt = i0 26671 v2.Aux = s 26672 v2.AddArg(p) 26673 v2.AddArg(idx) 26674 v2.AddArg(mem) 26675 v1.AddArg(v2) 26676 v0.AddArg(v1) 26677 v0.AddArg(y) 26678 return true 26679 } 26680 // 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))) 26681 // 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) 26682 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26683 for { 26684 _ = v.Args[1] 26685 or := v.Args[0] 26686 if or.Op != OpS390XOR { 26687 break 26688 } 26689 _ = or.Args[1] 26690 s1 := or.Args[0] 26691 if s1.Op != OpS390XSLDconst { 26692 break 26693 } 26694 j1 := s1.AuxInt 26695 x1 := s1.Args[0] 26696 if x1.Op != OpS390XMOVBZloadidx { 26697 break 26698 } 26699 i1 := x1.AuxInt 26700 s := x1.Aux 26701 _ = x1.Args[2] 26702 idx := x1.Args[0] 26703 p := x1.Args[1] 26704 mem := x1.Args[2] 26705 y := or.Args[1] 26706 s0 := v.Args[1] 26707 if s0.Op != OpS390XSLDconst { 26708 break 26709 } 26710 j0 := s0.AuxInt 26711 x0 := s0.Args[0] 26712 if x0.Op != OpS390XMOVBZloadidx { 26713 break 26714 } 26715 i0 := x0.AuxInt 26716 if x0.Aux != s { 26717 break 26718 } 26719 _ = x0.Args[2] 26720 if p != x0.Args[0] { 26721 break 26722 } 26723 if idx != x0.Args[1] { 26724 break 26725 } 26726 if mem != x0.Args[2] { 26727 break 26728 } 26729 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)) { 26730 break 26731 } 26732 b = mergePoint(b, x0, x1) 26733 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26734 v.reset(OpCopy) 26735 v.AddArg(v0) 26736 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26737 v1.AuxInt = j1 26738 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26739 v2.AuxInt = i0 26740 v2.Aux = s 26741 v2.AddArg(p) 26742 v2.AddArg(idx) 26743 v2.AddArg(mem) 26744 v1.AddArg(v2) 26745 v0.AddArg(v1) 26746 v0.AddArg(y) 26747 return true 26748 } 26749 // 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))) 26750 // 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) 26751 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26752 for { 26753 _ = v.Args[1] 26754 or := v.Args[0] 26755 if or.Op != OpS390XOR { 26756 break 26757 } 26758 _ = or.Args[1] 26759 y := or.Args[0] 26760 s1 := or.Args[1] 26761 if s1.Op != OpS390XSLDconst { 26762 break 26763 } 26764 j1 := s1.AuxInt 26765 x1 := s1.Args[0] 26766 if x1.Op != OpS390XMOVBZloadidx { 26767 break 26768 } 26769 i1 := x1.AuxInt 26770 s := x1.Aux 26771 _ = x1.Args[2] 26772 p := x1.Args[0] 26773 idx := x1.Args[1] 26774 mem := x1.Args[2] 26775 s0 := v.Args[1] 26776 if s0.Op != OpS390XSLDconst { 26777 break 26778 } 26779 j0 := s0.AuxInt 26780 x0 := s0.Args[0] 26781 if x0.Op != OpS390XMOVBZloadidx { 26782 break 26783 } 26784 i0 := x0.AuxInt 26785 if x0.Aux != s { 26786 break 26787 } 26788 _ = x0.Args[2] 26789 if p != x0.Args[0] { 26790 break 26791 } 26792 if idx != x0.Args[1] { 26793 break 26794 } 26795 if mem != x0.Args[2] { 26796 break 26797 } 26798 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)) { 26799 break 26800 } 26801 b = mergePoint(b, x0, x1) 26802 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26803 v.reset(OpCopy) 26804 v.AddArg(v0) 26805 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26806 v1.AuxInt = j1 26807 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26808 v2.AuxInt = i0 26809 v2.Aux = s 26810 v2.AddArg(p) 26811 v2.AddArg(idx) 26812 v2.AddArg(mem) 26813 v1.AddArg(v2) 26814 v0.AddArg(v1) 26815 v0.AddArg(y) 26816 return true 26817 } 26818 // 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))) 26819 // 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) 26820 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26821 for { 26822 _ = v.Args[1] 26823 or := v.Args[0] 26824 if or.Op != OpS390XOR { 26825 break 26826 } 26827 _ = or.Args[1] 26828 y := or.Args[0] 26829 s1 := or.Args[1] 26830 if s1.Op != OpS390XSLDconst { 26831 break 26832 } 26833 j1 := s1.AuxInt 26834 x1 := s1.Args[0] 26835 if x1.Op != OpS390XMOVBZloadidx { 26836 break 26837 } 26838 i1 := x1.AuxInt 26839 s := x1.Aux 26840 _ = x1.Args[2] 26841 idx := x1.Args[0] 26842 p := x1.Args[1] 26843 mem := x1.Args[2] 26844 s0 := v.Args[1] 26845 if s0.Op != OpS390XSLDconst { 26846 break 26847 } 26848 j0 := s0.AuxInt 26849 x0 := s0.Args[0] 26850 if x0.Op != OpS390XMOVBZloadidx { 26851 break 26852 } 26853 i0 := x0.AuxInt 26854 if x0.Aux != s { 26855 break 26856 } 26857 _ = x0.Args[2] 26858 if p != x0.Args[0] { 26859 break 26860 } 26861 if idx != x0.Args[1] { 26862 break 26863 } 26864 if mem != x0.Args[2] { 26865 break 26866 } 26867 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)) { 26868 break 26869 } 26870 b = mergePoint(b, x0, x1) 26871 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26872 v.reset(OpCopy) 26873 v.AddArg(v0) 26874 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26875 v1.AuxInt = j1 26876 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26877 v2.AuxInt = i0 26878 v2.Aux = s 26879 v2.AddArg(p) 26880 v2.AddArg(idx) 26881 v2.AddArg(mem) 26882 v1.AddArg(v2) 26883 v0.AddArg(v1) 26884 v0.AddArg(y) 26885 return true 26886 } 26887 // 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))) 26888 // 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) 26889 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26890 for { 26891 _ = v.Args[1] 26892 or := v.Args[0] 26893 if or.Op != OpS390XOR { 26894 break 26895 } 26896 _ = or.Args[1] 26897 s1 := or.Args[0] 26898 if s1.Op != OpS390XSLDconst { 26899 break 26900 } 26901 j1 := s1.AuxInt 26902 x1 := s1.Args[0] 26903 if x1.Op != OpS390XMOVBZloadidx { 26904 break 26905 } 26906 i1 := x1.AuxInt 26907 s := x1.Aux 26908 _ = x1.Args[2] 26909 p := x1.Args[0] 26910 idx := x1.Args[1] 26911 mem := x1.Args[2] 26912 y := or.Args[1] 26913 s0 := v.Args[1] 26914 if s0.Op != OpS390XSLDconst { 26915 break 26916 } 26917 j0 := s0.AuxInt 26918 x0 := s0.Args[0] 26919 if x0.Op != OpS390XMOVBZloadidx { 26920 break 26921 } 26922 i0 := x0.AuxInt 26923 if x0.Aux != s { 26924 break 26925 } 26926 _ = x0.Args[2] 26927 if idx != x0.Args[0] { 26928 break 26929 } 26930 if p != x0.Args[1] { 26931 break 26932 } 26933 if mem != x0.Args[2] { 26934 break 26935 } 26936 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)) { 26937 break 26938 } 26939 b = mergePoint(b, x0, x1) 26940 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26941 v.reset(OpCopy) 26942 v.AddArg(v0) 26943 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26944 v1.AuxInt = j1 26945 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26946 v2.AuxInt = i0 26947 v2.Aux = s 26948 v2.AddArg(p) 26949 v2.AddArg(idx) 26950 v2.AddArg(mem) 26951 v1.AddArg(v2) 26952 v0.AddArg(v1) 26953 v0.AddArg(y) 26954 return true 26955 } 26956 // 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))) 26957 // 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) 26958 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26959 for { 26960 _ = v.Args[1] 26961 or := v.Args[0] 26962 if or.Op != OpS390XOR { 26963 break 26964 } 26965 _ = or.Args[1] 26966 s1 := or.Args[0] 26967 if s1.Op != OpS390XSLDconst { 26968 break 26969 } 26970 j1 := s1.AuxInt 26971 x1 := s1.Args[0] 26972 if x1.Op != OpS390XMOVBZloadidx { 26973 break 26974 } 26975 i1 := x1.AuxInt 26976 s := x1.Aux 26977 _ = x1.Args[2] 26978 idx := x1.Args[0] 26979 p := x1.Args[1] 26980 mem := x1.Args[2] 26981 y := or.Args[1] 26982 s0 := v.Args[1] 26983 if s0.Op != OpS390XSLDconst { 26984 break 26985 } 26986 j0 := s0.AuxInt 26987 x0 := s0.Args[0] 26988 if x0.Op != OpS390XMOVBZloadidx { 26989 break 26990 } 26991 i0 := x0.AuxInt 26992 if x0.Aux != s { 26993 break 26994 } 26995 _ = x0.Args[2] 26996 if idx != x0.Args[0] { 26997 break 26998 } 26999 if p != x0.Args[1] { 27000 break 27001 } 27002 if mem != x0.Args[2] { 27003 break 27004 } 27005 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)) { 27006 break 27007 } 27008 b = mergePoint(b, x0, x1) 27009 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27010 v.reset(OpCopy) 27011 v.AddArg(v0) 27012 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27013 v1.AuxInt = j1 27014 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27015 v2.AuxInt = i0 27016 v2.Aux = s 27017 v2.AddArg(p) 27018 v2.AddArg(idx) 27019 v2.AddArg(mem) 27020 v1.AddArg(v2) 27021 v0.AddArg(v1) 27022 v0.AddArg(y) 27023 return true 27024 } 27025 // 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))) 27026 // 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) 27027 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 27028 for { 27029 _ = v.Args[1] 27030 or := v.Args[0] 27031 if or.Op != OpS390XOR { 27032 break 27033 } 27034 _ = or.Args[1] 27035 y := or.Args[0] 27036 s1 := or.Args[1] 27037 if s1.Op != OpS390XSLDconst { 27038 break 27039 } 27040 j1 := s1.AuxInt 27041 x1 := s1.Args[0] 27042 if x1.Op != OpS390XMOVBZloadidx { 27043 break 27044 } 27045 i1 := x1.AuxInt 27046 s := x1.Aux 27047 _ = x1.Args[2] 27048 p := x1.Args[0] 27049 idx := x1.Args[1] 27050 mem := x1.Args[2] 27051 s0 := v.Args[1] 27052 if s0.Op != OpS390XSLDconst { 27053 break 27054 } 27055 j0 := s0.AuxInt 27056 x0 := s0.Args[0] 27057 if x0.Op != OpS390XMOVBZloadidx { 27058 break 27059 } 27060 i0 := x0.AuxInt 27061 if x0.Aux != s { 27062 break 27063 } 27064 _ = x0.Args[2] 27065 if idx != x0.Args[0] { 27066 break 27067 } 27068 if p != x0.Args[1] { 27069 break 27070 } 27071 if mem != x0.Args[2] { 27072 break 27073 } 27074 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)) { 27075 break 27076 } 27077 b = mergePoint(b, x0, x1) 27078 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27079 v.reset(OpCopy) 27080 v.AddArg(v0) 27081 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27082 v1.AuxInt = j1 27083 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27084 v2.AuxInt = i0 27085 v2.Aux = s 27086 v2.AddArg(p) 27087 v2.AddArg(idx) 27088 v2.AddArg(mem) 27089 v1.AddArg(v2) 27090 v0.AddArg(v1) 27091 v0.AddArg(y) 27092 return true 27093 } 27094 return false 27095 } 27096 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 27097 b := v.Block 27098 _ = b 27099 typ := &b.Func.Config.Types 27100 _ = typ 27101 // 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))) 27102 // 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) 27103 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 27104 for { 27105 _ = v.Args[1] 27106 or := v.Args[0] 27107 if or.Op != OpS390XOR { 27108 break 27109 } 27110 _ = or.Args[1] 27111 y := or.Args[0] 27112 s1 := or.Args[1] 27113 if s1.Op != OpS390XSLDconst { 27114 break 27115 } 27116 j1 := s1.AuxInt 27117 x1 := s1.Args[0] 27118 if x1.Op != OpS390XMOVBZloadidx { 27119 break 27120 } 27121 i1 := x1.AuxInt 27122 s := x1.Aux 27123 _ = x1.Args[2] 27124 idx := x1.Args[0] 27125 p := x1.Args[1] 27126 mem := x1.Args[2] 27127 s0 := v.Args[1] 27128 if s0.Op != OpS390XSLDconst { 27129 break 27130 } 27131 j0 := s0.AuxInt 27132 x0 := s0.Args[0] 27133 if x0.Op != OpS390XMOVBZloadidx { 27134 break 27135 } 27136 i0 := x0.AuxInt 27137 if x0.Aux != s { 27138 break 27139 } 27140 _ = x0.Args[2] 27141 if idx != x0.Args[0] { 27142 break 27143 } 27144 if p != x0.Args[1] { 27145 break 27146 } 27147 if mem != x0.Args[2] { 27148 break 27149 } 27150 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)) { 27151 break 27152 } 27153 b = mergePoint(b, x0, x1) 27154 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27155 v.reset(OpCopy) 27156 v.AddArg(v0) 27157 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27158 v1.AuxInt = j1 27159 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27160 v2.AuxInt = i0 27161 v2.Aux = s 27162 v2.AddArg(p) 27163 v2.AddArg(idx) 27164 v2.AddArg(mem) 27165 v1.AddArg(v2) 27166 v0.AddArg(v1) 27167 v0.AddArg(y) 27168 return true 27169 } 27170 // 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)) 27171 // 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) 27172 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27173 for { 27174 _ = v.Args[1] 27175 s0 := v.Args[0] 27176 if s0.Op != OpS390XSLDconst { 27177 break 27178 } 27179 j0 := s0.AuxInt 27180 x0 := s0.Args[0] 27181 if x0.Op != OpS390XMOVHZloadidx { 27182 break 27183 } 27184 i0 := x0.AuxInt 27185 s := x0.Aux 27186 _ = x0.Args[2] 27187 p := x0.Args[0] 27188 idx := x0.Args[1] 27189 mem := x0.Args[2] 27190 or := v.Args[1] 27191 if or.Op != OpS390XOR { 27192 break 27193 } 27194 _ = or.Args[1] 27195 s1 := or.Args[0] 27196 if s1.Op != OpS390XSLDconst { 27197 break 27198 } 27199 j1 := s1.AuxInt 27200 x1 := s1.Args[0] 27201 if x1.Op != OpS390XMOVHZloadidx { 27202 break 27203 } 27204 i1 := x1.AuxInt 27205 if x1.Aux != s { 27206 break 27207 } 27208 _ = x1.Args[2] 27209 if p != x1.Args[0] { 27210 break 27211 } 27212 if idx != x1.Args[1] { 27213 break 27214 } 27215 if mem != x1.Args[2] { 27216 break 27217 } 27218 y := or.Args[1] 27219 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)) { 27220 break 27221 } 27222 b = mergePoint(b, x0, x1) 27223 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27224 v.reset(OpCopy) 27225 v.AddArg(v0) 27226 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27227 v1.AuxInt = j1 27228 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27229 v2.AuxInt = i0 27230 v2.Aux = s 27231 v2.AddArg(p) 27232 v2.AddArg(idx) 27233 v2.AddArg(mem) 27234 v1.AddArg(v2) 27235 v0.AddArg(v1) 27236 v0.AddArg(y) 27237 return true 27238 } 27239 // 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)) 27240 // 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) 27241 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27242 for { 27243 _ = v.Args[1] 27244 s0 := v.Args[0] 27245 if s0.Op != OpS390XSLDconst { 27246 break 27247 } 27248 j0 := s0.AuxInt 27249 x0 := s0.Args[0] 27250 if x0.Op != OpS390XMOVHZloadidx { 27251 break 27252 } 27253 i0 := x0.AuxInt 27254 s := x0.Aux 27255 _ = x0.Args[2] 27256 idx := x0.Args[0] 27257 p := x0.Args[1] 27258 mem := x0.Args[2] 27259 or := v.Args[1] 27260 if or.Op != OpS390XOR { 27261 break 27262 } 27263 _ = or.Args[1] 27264 s1 := or.Args[0] 27265 if s1.Op != OpS390XSLDconst { 27266 break 27267 } 27268 j1 := s1.AuxInt 27269 x1 := s1.Args[0] 27270 if x1.Op != OpS390XMOVHZloadidx { 27271 break 27272 } 27273 i1 := x1.AuxInt 27274 if x1.Aux != s { 27275 break 27276 } 27277 _ = x1.Args[2] 27278 if p != x1.Args[0] { 27279 break 27280 } 27281 if idx != x1.Args[1] { 27282 break 27283 } 27284 if mem != x1.Args[2] { 27285 break 27286 } 27287 y := or.Args[1] 27288 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)) { 27289 break 27290 } 27291 b = mergePoint(b, x0, x1) 27292 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27293 v.reset(OpCopy) 27294 v.AddArg(v0) 27295 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27296 v1.AuxInt = j1 27297 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27298 v2.AuxInt = i0 27299 v2.Aux = s 27300 v2.AddArg(p) 27301 v2.AddArg(idx) 27302 v2.AddArg(mem) 27303 v1.AddArg(v2) 27304 v0.AddArg(v1) 27305 v0.AddArg(y) 27306 return true 27307 } 27308 // 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)) 27309 // 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) 27310 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27311 for { 27312 _ = v.Args[1] 27313 s0 := v.Args[0] 27314 if s0.Op != OpS390XSLDconst { 27315 break 27316 } 27317 j0 := s0.AuxInt 27318 x0 := s0.Args[0] 27319 if x0.Op != OpS390XMOVHZloadidx { 27320 break 27321 } 27322 i0 := x0.AuxInt 27323 s := x0.Aux 27324 _ = x0.Args[2] 27325 p := x0.Args[0] 27326 idx := x0.Args[1] 27327 mem := x0.Args[2] 27328 or := v.Args[1] 27329 if or.Op != OpS390XOR { 27330 break 27331 } 27332 _ = or.Args[1] 27333 s1 := or.Args[0] 27334 if s1.Op != OpS390XSLDconst { 27335 break 27336 } 27337 j1 := s1.AuxInt 27338 x1 := s1.Args[0] 27339 if x1.Op != OpS390XMOVHZloadidx { 27340 break 27341 } 27342 i1 := x1.AuxInt 27343 if x1.Aux != s { 27344 break 27345 } 27346 _ = x1.Args[2] 27347 if idx != x1.Args[0] { 27348 break 27349 } 27350 if p != x1.Args[1] { 27351 break 27352 } 27353 if mem != x1.Args[2] { 27354 break 27355 } 27356 y := or.Args[1] 27357 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)) { 27358 break 27359 } 27360 b = mergePoint(b, x0, x1) 27361 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27362 v.reset(OpCopy) 27363 v.AddArg(v0) 27364 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27365 v1.AuxInt = j1 27366 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27367 v2.AuxInt = i0 27368 v2.Aux = s 27369 v2.AddArg(p) 27370 v2.AddArg(idx) 27371 v2.AddArg(mem) 27372 v1.AddArg(v2) 27373 v0.AddArg(v1) 27374 v0.AddArg(y) 27375 return true 27376 } 27377 // 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)) 27378 // 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) 27379 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27380 for { 27381 _ = v.Args[1] 27382 s0 := v.Args[0] 27383 if s0.Op != OpS390XSLDconst { 27384 break 27385 } 27386 j0 := s0.AuxInt 27387 x0 := s0.Args[0] 27388 if x0.Op != OpS390XMOVHZloadidx { 27389 break 27390 } 27391 i0 := x0.AuxInt 27392 s := x0.Aux 27393 _ = x0.Args[2] 27394 idx := x0.Args[0] 27395 p := x0.Args[1] 27396 mem := x0.Args[2] 27397 or := v.Args[1] 27398 if or.Op != OpS390XOR { 27399 break 27400 } 27401 _ = or.Args[1] 27402 s1 := or.Args[0] 27403 if s1.Op != OpS390XSLDconst { 27404 break 27405 } 27406 j1 := s1.AuxInt 27407 x1 := s1.Args[0] 27408 if x1.Op != OpS390XMOVHZloadidx { 27409 break 27410 } 27411 i1 := x1.AuxInt 27412 if x1.Aux != s { 27413 break 27414 } 27415 _ = x1.Args[2] 27416 if idx != x1.Args[0] { 27417 break 27418 } 27419 if p != x1.Args[1] { 27420 break 27421 } 27422 if mem != x1.Args[2] { 27423 break 27424 } 27425 y := or.Args[1] 27426 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)) { 27427 break 27428 } 27429 b = mergePoint(b, x0, x1) 27430 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27431 v.reset(OpCopy) 27432 v.AddArg(v0) 27433 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27434 v1.AuxInt = j1 27435 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27436 v2.AuxInt = i0 27437 v2.Aux = s 27438 v2.AddArg(p) 27439 v2.AddArg(idx) 27440 v2.AddArg(mem) 27441 v1.AddArg(v2) 27442 v0.AddArg(v1) 27443 v0.AddArg(y) 27444 return true 27445 } 27446 // 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)))) 27447 // 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) 27448 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27449 for { 27450 _ = v.Args[1] 27451 s0 := v.Args[0] 27452 if s0.Op != OpS390XSLDconst { 27453 break 27454 } 27455 j0 := s0.AuxInt 27456 x0 := s0.Args[0] 27457 if x0.Op != OpS390XMOVHZloadidx { 27458 break 27459 } 27460 i0 := x0.AuxInt 27461 s := x0.Aux 27462 _ = x0.Args[2] 27463 p := x0.Args[0] 27464 idx := x0.Args[1] 27465 mem := x0.Args[2] 27466 or := v.Args[1] 27467 if or.Op != OpS390XOR { 27468 break 27469 } 27470 _ = or.Args[1] 27471 y := or.Args[0] 27472 s1 := or.Args[1] 27473 if s1.Op != OpS390XSLDconst { 27474 break 27475 } 27476 j1 := s1.AuxInt 27477 x1 := s1.Args[0] 27478 if x1.Op != OpS390XMOVHZloadidx { 27479 break 27480 } 27481 i1 := x1.AuxInt 27482 if x1.Aux != s { 27483 break 27484 } 27485 _ = x1.Args[2] 27486 if p != x1.Args[0] { 27487 break 27488 } 27489 if idx != x1.Args[1] { 27490 break 27491 } 27492 if mem != x1.Args[2] { 27493 break 27494 } 27495 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)) { 27496 break 27497 } 27498 b = mergePoint(b, x0, x1) 27499 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27500 v.reset(OpCopy) 27501 v.AddArg(v0) 27502 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27503 v1.AuxInt = j1 27504 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27505 v2.AuxInt = i0 27506 v2.Aux = s 27507 v2.AddArg(p) 27508 v2.AddArg(idx) 27509 v2.AddArg(mem) 27510 v1.AddArg(v2) 27511 v0.AddArg(v1) 27512 v0.AddArg(y) 27513 return true 27514 } 27515 // 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)))) 27516 // 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) 27517 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27518 for { 27519 _ = v.Args[1] 27520 s0 := v.Args[0] 27521 if s0.Op != OpS390XSLDconst { 27522 break 27523 } 27524 j0 := s0.AuxInt 27525 x0 := s0.Args[0] 27526 if x0.Op != OpS390XMOVHZloadidx { 27527 break 27528 } 27529 i0 := x0.AuxInt 27530 s := x0.Aux 27531 _ = x0.Args[2] 27532 idx := x0.Args[0] 27533 p := x0.Args[1] 27534 mem := x0.Args[2] 27535 or := v.Args[1] 27536 if or.Op != OpS390XOR { 27537 break 27538 } 27539 _ = or.Args[1] 27540 y := or.Args[0] 27541 s1 := or.Args[1] 27542 if s1.Op != OpS390XSLDconst { 27543 break 27544 } 27545 j1 := s1.AuxInt 27546 x1 := s1.Args[0] 27547 if x1.Op != OpS390XMOVHZloadidx { 27548 break 27549 } 27550 i1 := x1.AuxInt 27551 if x1.Aux != s { 27552 break 27553 } 27554 _ = x1.Args[2] 27555 if p != x1.Args[0] { 27556 break 27557 } 27558 if idx != x1.Args[1] { 27559 break 27560 } 27561 if mem != x1.Args[2] { 27562 break 27563 } 27564 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)) { 27565 break 27566 } 27567 b = mergePoint(b, x0, x1) 27568 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27569 v.reset(OpCopy) 27570 v.AddArg(v0) 27571 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27572 v1.AuxInt = j1 27573 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27574 v2.AuxInt = i0 27575 v2.Aux = s 27576 v2.AddArg(p) 27577 v2.AddArg(idx) 27578 v2.AddArg(mem) 27579 v1.AddArg(v2) 27580 v0.AddArg(v1) 27581 v0.AddArg(y) 27582 return true 27583 } 27584 // 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)))) 27585 // 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) 27586 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27587 for { 27588 _ = v.Args[1] 27589 s0 := v.Args[0] 27590 if s0.Op != OpS390XSLDconst { 27591 break 27592 } 27593 j0 := s0.AuxInt 27594 x0 := s0.Args[0] 27595 if x0.Op != OpS390XMOVHZloadidx { 27596 break 27597 } 27598 i0 := x0.AuxInt 27599 s := x0.Aux 27600 _ = x0.Args[2] 27601 p := x0.Args[0] 27602 idx := x0.Args[1] 27603 mem := x0.Args[2] 27604 or := v.Args[1] 27605 if or.Op != OpS390XOR { 27606 break 27607 } 27608 _ = or.Args[1] 27609 y := or.Args[0] 27610 s1 := or.Args[1] 27611 if s1.Op != OpS390XSLDconst { 27612 break 27613 } 27614 j1 := s1.AuxInt 27615 x1 := s1.Args[0] 27616 if x1.Op != OpS390XMOVHZloadidx { 27617 break 27618 } 27619 i1 := x1.AuxInt 27620 if x1.Aux != s { 27621 break 27622 } 27623 _ = x1.Args[2] 27624 if idx != x1.Args[0] { 27625 break 27626 } 27627 if p != x1.Args[1] { 27628 break 27629 } 27630 if mem != x1.Args[2] { 27631 break 27632 } 27633 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)) { 27634 break 27635 } 27636 b = mergePoint(b, x0, x1) 27637 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27638 v.reset(OpCopy) 27639 v.AddArg(v0) 27640 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27641 v1.AuxInt = j1 27642 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27643 v2.AuxInt = i0 27644 v2.Aux = s 27645 v2.AddArg(p) 27646 v2.AddArg(idx) 27647 v2.AddArg(mem) 27648 v1.AddArg(v2) 27649 v0.AddArg(v1) 27650 v0.AddArg(y) 27651 return true 27652 } 27653 // 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)))) 27654 // 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) 27655 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27656 for { 27657 _ = v.Args[1] 27658 s0 := v.Args[0] 27659 if s0.Op != OpS390XSLDconst { 27660 break 27661 } 27662 j0 := s0.AuxInt 27663 x0 := s0.Args[0] 27664 if x0.Op != OpS390XMOVHZloadidx { 27665 break 27666 } 27667 i0 := x0.AuxInt 27668 s := x0.Aux 27669 _ = x0.Args[2] 27670 idx := x0.Args[0] 27671 p := x0.Args[1] 27672 mem := x0.Args[2] 27673 or := v.Args[1] 27674 if or.Op != OpS390XOR { 27675 break 27676 } 27677 _ = or.Args[1] 27678 y := or.Args[0] 27679 s1 := or.Args[1] 27680 if s1.Op != OpS390XSLDconst { 27681 break 27682 } 27683 j1 := s1.AuxInt 27684 x1 := s1.Args[0] 27685 if x1.Op != OpS390XMOVHZloadidx { 27686 break 27687 } 27688 i1 := x1.AuxInt 27689 if x1.Aux != s { 27690 break 27691 } 27692 _ = x1.Args[2] 27693 if idx != x1.Args[0] { 27694 break 27695 } 27696 if p != x1.Args[1] { 27697 break 27698 } 27699 if mem != x1.Args[2] { 27700 break 27701 } 27702 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)) { 27703 break 27704 } 27705 b = mergePoint(b, x0, x1) 27706 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27707 v.reset(OpCopy) 27708 v.AddArg(v0) 27709 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27710 v1.AuxInt = j1 27711 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27712 v2.AuxInt = i0 27713 v2.Aux = s 27714 v2.AddArg(p) 27715 v2.AddArg(idx) 27716 v2.AddArg(mem) 27717 v1.AddArg(v2) 27718 v0.AddArg(v1) 27719 v0.AddArg(y) 27720 return true 27721 } 27722 // 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))) 27723 // 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) 27724 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27725 for { 27726 _ = v.Args[1] 27727 or := v.Args[0] 27728 if or.Op != OpS390XOR { 27729 break 27730 } 27731 _ = or.Args[1] 27732 s1 := or.Args[0] 27733 if s1.Op != OpS390XSLDconst { 27734 break 27735 } 27736 j1 := s1.AuxInt 27737 x1 := s1.Args[0] 27738 if x1.Op != OpS390XMOVHZloadidx { 27739 break 27740 } 27741 i1 := x1.AuxInt 27742 s := x1.Aux 27743 _ = x1.Args[2] 27744 p := x1.Args[0] 27745 idx := x1.Args[1] 27746 mem := x1.Args[2] 27747 y := or.Args[1] 27748 s0 := v.Args[1] 27749 if s0.Op != OpS390XSLDconst { 27750 break 27751 } 27752 j0 := s0.AuxInt 27753 x0 := s0.Args[0] 27754 if x0.Op != OpS390XMOVHZloadidx { 27755 break 27756 } 27757 i0 := x0.AuxInt 27758 if x0.Aux != s { 27759 break 27760 } 27761 _ = x0.Args[2] 27762 if p != x0.Args[0] { 27763 break 27764 } 27765 if idx != x0.Args[1] { 27766 break 27767 } 27768 if mem != x0.Args[2] { 27769 break 27770 } 27771 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)) { 27772 break 27773 } 27774 b = mergePoint(b, x0, x1) 27775 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27776 v.reset(OpCopy) 27777 v.AddArg(v0) 27778 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27779 v1.AuxInt = j1 27780 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27781 v2.AuxInt = i0 27782 v2.Aux = s 27783 v2.AddArg(p) 27784 v2.AddArg(idx) 27785 v2.AddArg(mem) 27786 v1.AddArg(v2) 27787 v0.AddArg(v1) 27788 v0.AddArg(y) 27789 return true 27790 } 27791 return false 27792 } 27793 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 27794 b := v.Block 27795 _ = b 27796 typ := &b.Func.Config.Types 27797 _ = typ 27798 // 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))) 27799 // 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) 27800 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27801 for { 27802 _ = v.Args[1] 27803 or := v.Args[0] 27804 if or.Op != OpS390XOR { 27805 break 27806 } 27807 _ = or.Args[1] 27808 s1 := or.Args[0] 27809 if s1.Op != OpS390XSLDconst { 27810 break 27811 } 27812 j1 := s1.AuxInt 27813 x1 := s1.Args[0] 27814 if x1.Op != OpS390XMOVHZloadidx { 27815 break 27816 } 27817 i1 := x1.AuxInt 27818 s := x1.Aux 27819 _ = x1.Args[2] 27820 idx := x1.Args[0] 27821 p := x1.Args[1] 27822 mem := x1.Args[2] 27823 y := or.Args[1] 27824 s0 := v.Args[1] 27825 if s0.Op != OpS390XSLDconst { 27826 break 27827 } 27828 j0 := s0.AuxInt 27829 x0 := s0.Args[0] 27830 if x0.Op != OpS390XMOVHZloadidx { 27831 break 27832 } 27833 i0 := x0.AuxInt 27834 if x0.Aux != s { 27835 break 27836 } 27837 _ = x0.Args[2] 27838 if p != x0.Args[0] { 27839 break 27840 } 27841 if idx != x0.Args[1] { 27842 break 27843 } 27844 if mem != x0.Args[2] { 27845 break 27846 } 27847 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)) { 27848 break 27849 } 27850 b = mergePoint(b, x0, x1) 27851 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27852 v.reset(OpCopy) 27853 v.AddArg(v0) 27854 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27855 v1.AuxInt = j1 27856 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27857 v2.AuxInt = i0 27858 v2.Aux = s 27859 v2.AddArg(p) 27860 v2.AddArg(idx) 27861 v2.AddArg(mem) 27862 v1.AddArg(v2) 27863 v0.AddArg(v1) 27864 v0.AddArg(y) 27865 return true 27866 } 27867 // 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))) 27868 // 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) 27869 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27870 for { 27871 _ = v.Args[1] 27872 or := v.Args[0] 27873 if or.Op != OpS390XOR { 27874 break 27875 } 27876 _ = or.Args[1] 27877 y := or.Args[0] 27878 s1 := or.Args[1] 27879 if s1.Op != OpS390XSLDconst { 27880 break 27881 } 27882 j1 := s1.AuxInt 27883 x1 := s1.Args[0] 27884 if x1.Op != OpS390XMOVHZloadidx { 27885 break 27886 } 27887 i1 := x1.AuxInt 27888 s := x1.Aux 27889 _ = x1.Args[2] 27890 p := x1.Args[0] 27891 idx := x1.Args[1] 27892 mem := x1.Args[2] 27893 s0 := v.Args[1] 27894 if s0.Op != OpS390XSLDconst { 27895 break 27896 } 27897 j0 := s0.AuxInt 27898 x0 := s0.Args[0] 27899 if x0.Op != OpS390XMOVHZloadidx { 27900 break 27901 } 27902 i0 := x0.AuxInt 27903 if x0.Aux != s { 27904 break 27905 } 27906 _ = x0.Args[2] 27907 if p != x0.Args[0] { 27908 break 27909 } 27910 if idx != x0.Args[1] { 27911 break 27912 } 27913 if mem != x0.Args[2] { 27914 break 27915 } 27916 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)) { 27917 break 27918 } 27919 b = mergePoint(b, x0, x1) 27920 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27921 v.reset(OpCopy) 27922 v.AddArg(v0) 27923 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27924 v1.AuxInt = j1 27925 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27926 v2.AuxInt = i0 27927 v2.Aux = s 27928 v2.AddArg(p) 27929 v2.AddArg(idx) 27930 v2.AddArg(mem) 27931 v1.AddArg(v2) 27932 v0.AddArg(v1) 27933 v0.AddArg(y) 27934 return true 27935 } 27936 // 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))) 27937 // 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) 27938 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27939 for { 27940 _ = v.Args[1] 27941 or := v.Args[0] 27942 if or.Op != OpS390XOR { 27943 break 27944 } 27945 _ = or.Args[1] 27946 y := or.Args[0] 27947 s1 := or.Args[1] 27948 if s1.Op != OpS390XSLDconst { 27949 break 27950 } 27951 j1 := s1.AuxInt 27952 x1 := s1.Args[0] 27953 if x1.Op != OpS390XMOVHZloadidx { 27954 break 27955 } 27956 i1 := x1.AuxInt 27957 s := x1.Aux 27958 _ = x1.Args[2] 27959 idx := x1.Args[0] 27960 p := x1.Args[1] 27961 mem := x1.Args[2] 27962 s0 := v.Args[1] 27963 if s0.Op != OpS390XSLDconst { 27964 break 27965 } 27966 j0 := s0.AuxInt 27967 x0 := s0.Args[0] 27968 if x0.Op != OpS390XMOVHZloadidx { 27969 break 27970 } 27971 i0 := x0.AuxInt 27972 if x0.Aux != s { 27973 break 27974 } 27975 _ = x0.Args[2] 27976 if p != x0.Args[0] { 27977 break 27978 } 27979 if idx != x0.Args[1] { 27980 break 27981 } 27982 if mem != x0.Args[2] { 27983 break 27984 } 27985 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)) { 27986 break 27987 } 27988 b = mergePoint(b, x0, x1) 27989 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27990 v.reset(OpCopy) 27991 v.AddArg(v0) 27992 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27993 v1.AuxInt = j1 27994 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27995 v2.AuxInt = i0 27996 v2.Aux = s 27997 v2.AddArg(p) 27998 v2.AddArg(idx) 27999 v2.AddArg(mem) 28000 v1.AddArg(v2) 28001 v0.AddArg(v1) 28002 v0.AddArg(y) 28003 return true 28004 } 28005 // 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))) 28006 // 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) 28007 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28008 for { 28009 _ = v.Args[1] 28010 or := v.Args[0] 28011 if or.Op != OpS390XOR { 28012 break 28013 } 28014 _ = or.Args[1] 28015 s1 := or.Args[0] 28016 if s1.Op != OpS390XSLDconst { 28017 break 28018 } 28019 j1 := s1.AuxInt 28020 x1 := s1.Args[0] 28021 if x1.Op != OpS390XMOVHZloadidx { 28022 break 28023 } 28024 i1 := x1.AuxInt 28025 s := x1.Aux 28026 _ = x1.Args[2] 28027 p := x1.Args[0] 28028 idx := x1.Args[1] 28029 mem := x1.Args[2] 28030 y := or.Args[1] 28031 s0 := v.Args[1] 28032 if s0.Op != OpS390XSLDconst { 28033 break 28034 } 28035 j0 := s0.AuxInt 28036 x0 := s0.Args[0] 28037 if x0.Op != OpS390XMOVHZloadidx { 28038 break 28039 } 28040 i0 := x0.AuxInt 28041 if x0.Aux != s { 28042 break 28043 } 28044 _ = x0.Args[2] 28045 if idx != x0.Args[0] { 28046 break 28047 } 28048 if p != x0.Args[1] { 28049 break 28050 } 28051 if mem != x0.Args[2] { 28052 break 28053 } 28054 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)) { 28055 break 28056 } 28057 b = mergePoint(b, x0, x1) 28058 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28059 v.reset(OpCopy) 28060 v.AddArg(v0) 28061 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28062 v1.AuxInt = j1 28063 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28064 v2.AuxInt = i0 28065 v2.Aux = s 28066 v2.AddArg(p) 28067 v2.AddArg(idx) 28068 v2.AddArg(mem) 28069 v1.AddArg(v2) 28070 v0.AddArg(v1) 28071 v0.AddArg(y) 28072 return true 28073 } 28074 // 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))) 28075 // 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) 28076 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28077 for { 28078 _ = v.Args[1] 28079 or := v.Args[0] 28080 if or.Op != OpS390XOR { 28081 break 28082 } 28083 _ = or.Args[1] 28084 s1 := or.Args[0] 28085 if s1.Op != OpS390XSLDconst { 28086 break 28087 } 28088 j1 := s1.AuxInt 28089 x1 := s1.Args[0] 28090 if x1.Op != OpS390XMOVHZloadidx { 28091 break 28092 } 28093 i1 := x1.AuxInt 28094 s := x1.Aux 28095 _ = x1.Args[2] 28096 idx := x1.Args[0] 28097 p := x1.Args[1] 28098 mem := x1.Args[2] 28099 y := or.Args[1] 28100 s0 := v.Args[1] 28101 if s0.Op != OpS390XSLDconst { 28102 break 28103 } 28104 j0 := s0.AuxInt 28105 x0 := s0.Args[0] 28106 if x0.Op != OpS390XMOVHZloadidx { 28107 break 28108 } 28109 i0 := x0.AuxInt 28110 if x0.Aux != s { 28111 break 28112 } 28113 _ = x0.Args[2] 28114 if idx != x0.Args[0] { 28115 break 28116 } 28117 if p != x0.Args[1] { 28118 break 28119 } 28120 if mem != x0.Args[2] { 28121 break 28122 } 28123 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)) { 28124 break 28125 } 28126 b = mergePoint(b, x0, x1) 28127 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28128 v.reset(OpCopy) 28129 v.AddArg(v0) 28130 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28131 v1.AuxInt = j1 28132 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28133 v2.AuxInt = i0 28134 v2.Aux = s 28135 v2.AddArg(p) 28136 v2.AddArg(idx) 28137 v2.AddArg(mem) 28138 v1.AddArg(v2) 28139 v0.AddArg(v1) 28140 v0.AddArg(y) 28141 return true 28142 } 28143 // 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))) 28144 // 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) 28145 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28146 for { 28147 _ = v.Args[1] 28148 or := v.Args[0] 28149 if or.Op != OpS390XOR { 28150 break 28151 } 28152 _ = or.Args[1] 28153 y := or.Args[0] 28154 s1 := or.Args[1] 28155 if s1.Op != OpS390XSLDconst { 28156 break 28157 } 28158 j1 := s1.AuxInt 28159 x1 := s1.Args[0] 28160 if x1.Op != OpS390XMOVHZloadidx { 28161 break 28162 } 28163 i1 := x1.AuxInt 28164 s := x1.Aux 28165 _ = x1.Args[2] 28166 p := x1.Args[0] 28167 idx := x1.Args[1] 28168 mem := x1.Args[2] 28169 s0 := v.Args[1] 28170 if s0.Op != OpS390XSLDconst { 28171 break 28172 } 28173 j0 := s0.AuxInt 28174 x0 := s0.Args[0] 28175 if x0.Op != OpS390XMOVHZloadidx { 28176 break 28177 } 28178 i0 := x0.AuxInt 28179 if x0.Aux != s { 28180 break 28181 } 28182 _ = x0.Args[2] 28183 if idx != x0.Args[0] { 28184 break 28185 } 28186 if p != x0.Args[1] { 28187 break 28188 } 28189 if mem != x0.Args[2] { 28190 break 28191 } 28192 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)) { 28193 break 28194 } 28195 b = mergePoint(b, x0, x1) 28196 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28197 v.reset(OpCopy) 28198 v.AddArg(v0) 28199 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28200 v1.AuxInt = j1 28201 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28202 v2.AuxInt = i0 28203 v2.Aux = s 28204 v2.AddArg(p) 28205 v2.AddArg(idx) 28206 v2.AddArg(mem) 28207 v1.AddArg(v2) 28208 v0.AddArg(v1) 28209 v0.AddArg(y) 28210 return true 28211 } 28212 // 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))) 28213 // 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) 28214 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28215 for { 28216 _ = v.Args[1] 28217 or := v.Args[0] 28218 if or.Op != OpS390XOR { 28219 break 28220 } 28221 _ = or.Args[1] 28222 y := or.Args[0] 28223 s1 := or.Args[1] 28224 if s1.Op != OpS390XSLDconst { 28225 break 28226 } 28227 j1 := s1.AuxInt 28228 x1 := s1.Args[0] 28229 if x1.Op != OpS390XMOVHZloadidx { 28230 break 28231 } 28232 i1 := x1.AuxInt 28233 s := x1.Aux 28234 _ = x1.Args[2] 28235 idx := x1.Args[0] 28236 p := x1.Args[1] 28237 mem := x1.Args[2] 28238 s0 := v.Args[1] 28239 if s0.Op != OpS390XSLDconst { 28240 break 28241 } 28242 j0 := s0.AuxInt 28243 x0 := s0.Args[0] 28244 if x0.Op != OpS390XMOVHZloadidx { 28245 break 28246 } 28247 i0 := x0.AuxInt 28248 if x0.Aux != s { 28249 break 28250 } 28251 _ = x0.Args[2] 28252 if idx != x0.Args[0] { 28253 break 28254 } 28255 if p != x0.Args[1] { 28256 break 28257 } 28258 if mem != x0.Args[2] { 28259 break 28260 } 28261 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)) { 28262 break 28263 } 28264 b = mergePoint(b, x0, x1) 28265 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28266 v.reset(OpCopy) 28267 v.AddArg(v0) 28268 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28269 v1.AuxInt = j1 28270 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28271 v2.AuxInt = i0 28272 v2.Aux = s 28273 v2.AddArg(p) 28274 v2.AddArg(idx) 28275 v2.AddArg(mem) 28276 v1.AddArg(v2) 28277 v0.AddArg(v1) 28278 v0.AddArg(y) 28279 return true 28280 } 28281 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 28282 // 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) 28283 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 28284 for { 28285 _ = v.Args[1] 28286 x0 := v.Args[0] 28287 if x0.Op != OpS390XMOVBZload { 28288 break 28289 } 28290 i0 := x0.AuxInt 28291 s := x0.Aux 28292 _ = x0.Args[1] 28293 p := x0.Args[0] 28294 mem := x0.Args[1] 28295 sh := v.Args[1] 28296 if sh.Op != OpS390XSLDconst { 28297 break 28298 } 28299 if sh.AuxInt != 8 { 28300 break 28301 } 28302 x1 := sh.Args[0] 28303 if x1.Op != OpS390XMOVBZload { 28304 break 28305 } 28306 i1 := x1.AuxInt 28307 if x1.Aux != s { 28308 break 28309 } 28310 _ = x1.Args[1] 28311 if p != x1.Args[0] { 28312 break 28313 } 28314 if mem != x1.Args[1] { 28315 break 28316 } 28317 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)) { 28318 break 28319 } 28320 b = mergePoint(b, x0, x1) 28321 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28322 v.reset(OpCopy) 28323 v.AddArg(v0) 28324 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28325 v1.AuxInt = i0 28326 v1.Aux = s 28327 v1.AddArg(p) 28328 v1.AddArg(mem) 28329 v0.AddArg(v1) 28330 return true 28331 } 28332 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 28333 // 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) 28334 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 28335 for { 28336 _ = v.Args[1] 28337 sh := v.Args[0] 28338 if sh.Op != OpS390XSLDconst { 28339 break 28340 } 28341 if sh.AuxInt != 8 { 28342 break 28343 } 28344 x1 := sh.Args[0] 28345 if x1.Op != OpS390XMOVBZload { 28346 break 28347 } 28348 i1 := x1.AuxInt 28349 s := x1.Aux 28350 _ = x1.Args[1] 28351 p := x1.Args[0] 28352 mem := x1.Args[1] 28353 x0 := v.Args[1] 28354 if x0.Op != OpS390XMOVBZload { 28355 break 28356 } 28357 i0 := x0.AuxInt 28358 if x0.Aux != s { 28359 break 28360 } 28361 _ = x0.Args[1] 28362 if p != x0.Args[0] { 28363 break 28364 } 28365 if mem != x0.Args[1] { 28366 break 28367 } 28368 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)) { 28369 break 28370 } 28371 b = mergePoint(b, x0, x1) 28372 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28373 v.reset(OpCopy) 28374 v.AddArg(v0) 28375 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28376 v1.AuxInt = i0 28377 v1.Aux = s 28378 v1.AddArg(p) 28379 v1.AddArg(mem) 28380 v0.AddArg(v1) 28381 return true 28382 } 28383 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 28384 // 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) 28385 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 28386 for { 28387 _ = v.Args[1] 28388 r0 := v.Args[0] 28389 if r0.Op != OpS390XMOVHZreg { 28390 break 28391 } 28392 x0 := r0.Args[0] 28393 if x0.Op != OpS390XMOVHBRload { 28394 break 28395 } 28396 i0 := x0.AuxInt 28397 s := x0.Aux 28398 _ = x0.Args[1] 28399 p := x0.Args[0] 28400 mem := x0.Args[1] 28401 sh := v.Args[1] 28402 if sh.Op != OpS390XSLDconst { 28403 break 28404 } 28405 if sh.AuxInt != 16 { 28406 break 28407 } 28408 r1 := sh.Args[0] 28409 if r1.Op != OpS390XMOVHZreg { 28410 break 28411 } 28412 x1 := r1.Args[0] 28413 if x1.Op != OpS390XMOVHBRload { 28414 break 28415 } 28416 i1 := x1.AuxInt 28417 if x1.Aux != s { 28418 break 28419 } 28420 _ = x1.Args[1] 28421 if p != x1.Args[0] { 28422 break 28423 } 28424 if mem != x1.Args[1] { 28425 break 28426 } 28427 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)) { 28428 break 28429 } 28430 b = mergePoint(b, x0, x1) 28431 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28432 v.reset(OpCopy) 28433 v.AddArg(v0) 28434 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 28435 v1.AuxInt = i0 28436 v1.Aux = s 28437 v1.AddArg(p) 28438 v1.AddArg(mem) 28439 v0.AddArg(v1) 28440 return true 28441 } 28442 return false 28443 } 28444 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 28445 b := v.Block 28446 _ = b 28447 typ := &b.Func.Config.Types 28448 _ = typ 28449 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 28450 // 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) 28451 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 28452 for { 28453 _ = v.Args[1] 28454 sh := v.Args[0] 28455 if sh.Op != OpS390XSLDconst { 28456 break 28457 } 28458 if sh.AuxInt != 16 { 28459 break 28460 } 28461 r1 := sh.Args[0] 28462 if r1.Op != OpS390XMOVHZreg { 28463 break 28464 } 28465 x1 := r1.Args[0] 28466 if x1.Op != OpS390XMOVHBRload { 28467 break 28468 } 28469 i1 := x1.AuxInt 28470 s := x1.Aux 28471 _ = x1.Args[1] 28472 p := x1.Args[0] 28473 mem := x1.Args[1] 28474 r0 := v.Args[1] 28475 if r0.Op != OpS390XMOVHZreg { 28476 break 28477 } 28478 x0 := r0.Args[0] 28479 if x0.Op != OpS390XMOVHBRload { 28480 break 28481 } 28482 i0 := x0.AuxInt 28483 if x0.Aux != s { 28484 break 28485 } 28486 _ = x0.Args[1] 28487 if p != x0.Args[0] { 28488 break 28489 } 28490 if mem != x0.Args[1] { 28491 break 28492 } 28493 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)) { 28494 break 28495 } 28496 b = mergePoint(b, x0, x1) 28497 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28498 v.reset(OpCopy) 28499 v.AddArg(v0) 28500 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 28501 v1.AuxInt = i0 28502 v1.Aux = s 28503 v1.AddArg(p) 28504 v1.AddArg(mem) 28505 v0.AddArg(v1) 28506 return true 28507 } 28508 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 28509 // 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) 28510 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 28511 for { 28512 _ = v.Args[1] 28513 r0 := v.Args[0] 28514 if r0.Op != OpS390XMOVWZreg { 28515 break 28516 } 28517 x0 := r0.Args[0] 28518 if x0.Op != OpS390XMOVWBRload { 28519 break 28520 } 28521 i0 := x0.AuxInt 28522 s := x0.Aux 28523 _ = x0.Args[1] 28524 p := x0.Args[0] 28525 mem := x0.Args[1] 28526 sh := v.Args[1] 28527 if sh.Op != OpS390XSLDconst { 28528 break 28529 } 28530 if sh.AuxInt != 32 { 28531 break 28532 } 28533 r1 := sh.Args[0] 28534 if r1.Op != OpS390XMOVWZreg { 28535 break 28536 } 28537 x1 := r1.Args[0] 28538 if x1.Op != OpS390XMOVWBRload { 28539 break 28540 } 28541 i1 := x1.AuxInt 28542 if x1.Aux != s { 28543 break 28544 } 28545 _ = x1.Args[1] 28546 if p != x1.Args[0] { 28547 break 28548 } 28549 if mem != x1.Args[1] { 28550 break 28551 } 28552 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)) { 28553 break 28554 } 28555 b = mergePoint(b, x0, x1) 28556 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 28557 v.reset(OpCopy) 28558 v.AddArg(v0) 28559 v0.AuxInt = i0 28560 v0.Aux = s 28561 v0.AddArg(p) 28562 v0.AddArg(mem) 28563 return true 28564 } 28565 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 28566 // 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) 28567 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 28568 for { 28569 _ = v.Args[1] 28570 sh := v.Args[0] 28571 if sh.Op != OpS390XSLDconst { 28572 break 28573 } 28574 if sh.AuxInt != 32 { 28575 break 28576 } 28577 r1 := sh.Args[0] 28578 if r1.Op != OpS390XMOVWZreg { 28579 break 28580 } 28581 x1 := r1.Args[0] 28582 if x1.Op != OpS390XMOVWBRload { 28583 break 28584 } 28585 i1 := x1.AuxInt 28586 s := x1.Aux 28587 _ = x1.Args[1] 28588 p := x1.Args[0] 28589 mem := x1.Args[1] 28590 r0 := v.Args[1] 28591 if r0.Op != OpS390XMOVWZreg { 28592 break 28593 } 28594 x0 := r0.Args[0] 28595 if x0.Op != OpS390XMOVWBRload { 28596 break 28597 } 28598 i0 := x0.AuxInt 28599 if x0.Aux != s { 28600 break 28601 } 28602 _ = x0.Args[1] 28603 if p != x0.Args[0] { 28604 break 28605 } 28606 if mem != x0.Args[1] { 28607 break 28608 } 28609 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)) { 28610 break 28611 } 28612 b = mergePoint(b, x0, x1) 28613 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 28614 v.reset(OpCopy) 28615 v.AddArg(v0) 28616 v0.AuxInt = i0 28617 v0.Aux = s 28618 v0.AddArg(p) 28619 v0.AddArg(mem) 28620 return true 28621 } 28622 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 28623 // 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) 28624 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28625 for { 28626 _ = v.Args[1] 28627 s1 := v.Args[0] 28628 if s1.Op != OpS390XSLDconst { 28629 break 28630 } 28631 j1 := s1.AuxInt 28632 x1 := s1.Args[0] 28633 if x1.Op != OpS390XMOVBZload { 28634 break 28635 } 28636 i1 := x1.AuxInt 28637 s := x1.Aux 28638 _ = x1.Args[1] 28639 p := x1.Args[0] 28640 mem := x1.Args[1] 28641 or := v.Args[1] 28642 if or.Op != OpS390XOR { 28643 break 28644 } 28645 _ = or.Args[1] 28646 s0 := or.Args[0] 28647 if s0.Op != OpS390XSLDconst { 28648 break 28649 } 28650 j0 := s0.AuxInt 28651 x0 := s0.Args[0] 28652 if x0.Op != OpS390XMOVBZload { 28653 break 28654 } 28655 i0 := x0.AuxInt 28656 if x0.Aux != s { 28657 break 28658 } 28659 _ = x0.Args[1] 28660 if p != x0.Args[0] { 28661 break 28662 } 28663 if mem != x0.Args[1] { 28664 break 28665 } 28666 y := or.Args[1] 28667 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)) { 28668 break 28669 } 28670 b = mergePoint(b, x0, x1) 28671 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28672 v.reset(OpCopy) 28673 v.AddArg(v0) 28674 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28675 v1.AuxInt = j0 28676 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28677 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28678 v3.AuxInt = i0 28679 v3.Aux = s 28680 v3.AddArg(p) 28681 v3.AddArg(mem) 28682 v2.AddArg(v3) 28683 v1.AddArg(v2) 28684 v0.AddArg(v1) 28685 v0.AddArg(y) 28686 return true 28687 } 28688 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 28689 // 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) 28690 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28691 for { 28692 _ = v.Args[1] 28693 s1 := v.Args[0] 28694 if s1.Op != OpS390XSLDconst { 28695 break 28696 } 28697 j1 := s1.AuxInt 28698 x1 := s1.Args[0] 28699 if x1.Op != OpS390XMOVBZload { 28700 break 28701 } 28702 i1 := x1.AuxInt 28703 s := x1.Aux 28704 _ = x1.Args[1] 28705 p := x1.Args[0] 28706 mem := x1.Args[1] 28707 or := v.Args[1] 28708 if or.Op != OpS390XOR { 28709 break 28710 } 28711 _ = or.Args[1] 28712 y := or.Args[0] 28713 s0 := or.Args[1] 28714 if s0.Op != OpS390XSLDconst { 28715 break 28716 } 28717 j0 := s0.AuxInt 28718 x0 := s0.Args[0] 28719 if x0.Op != OpS390XMOVBZload { 28720 break 28721 } 28722 i0 := x0.AuxInt 28723 if x0.Aux != s { 28724 break 28725 } 28726 _ = x0.Args[1] 28727 if p != x0.Args[0] { 28728 break 28729 } 28730 if mem != x0.Args[1] { 28731 break 28732 } 28733 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)) { 28734 break 28735 } 28736 b = mergePoint(b, x0, x1) 28737 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28738 v.reset(OpCopy) 28739 v.AddArg(v0) 28740 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28741 v1.AuxInt = j0 28742 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28743 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28744 v3.AuxInt = i0 28745 v3.Aux = s 28746 v3.AddArg(p) 28747 v3.AddArg(mem) 28748 v2.AddArg(v3) 28749 v1.AddArg(v2) 28750 v0.AddArg(v1) 28751 v0.AddArg(y) 28752 return true 28753 } 28754 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 28755 // 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) 28756 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28757 for { 28758 _ = v.Args[1] 28759 or := v.Args[0] 28760 if or.Op != OpS390XOR { 28761 break 28762 } 28763 _ = or.Args[1] 28764 s0 := or.Args[0] 28765 if s0.Op != OpS390XSLDconst { 28766 break 28767 } 28768 j0 := s0.AuxInt 28769 x0 := s0.Args[0] 28770 if x0.Op != OpS390XMOVBZload { 28771 break 28772 } 28773 i0 := x0.AuxInt 28774 s := x0.Aux 28775 _ = x0.Args[1] 28776 p := x0.Args[0] 28777 mem := x0.Args[1] 28778 y := or.Args[1] 28779 s1 := v.Args[1] 28780 if s1.Op != OpS390XSLDconst { 28781 break 28782 } 28783 j1 := s1.AuxInt 28784 x1 := s1.Args[0] 28785 if x1.Op != OpS390XMOVBZload { 28786 break 28787 } 28788 i1 := x1.AuxInt 28789 if x1.Aux != s { 28790 break 28791 } 28792 _ = x1.Args[1] 28793 if p != x1.Args[0] { 28794 break 28795 } 28796 if mem != x1.Args[1] { 28797 break 28798 } 28799 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)) { 28800 break 28801 } 28802 b = mergePoint(b, x0, x1) 28803 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28804 v.reset(OpCopy) 28805 v.AddArg(v0) 28806 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28807 v1.AuxInt = j0 28808 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28809 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28810 v3.AuxInt = i0 28811 v3.Aux = s 28812 v3.AddArg(p) 28813 v3.AddArg(mem) 28814 v2.AddArg(v3) 28815 v1.AddArg(v2) 28816 v0.AddArg(v1) 28817 v0.AddArg(y) 28818 return true 28819 } 28820 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 28821 // 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) 28822 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28823 for { 28824 _ = v.Args[1] 28825 or := v.Args[0] 28826 if or.Op != OpS390XOR { 28827 break 28828 } 28829 _ = or.Args[1] 28830 y := or.Args[0] 28831 s0 := or.Args[1] 28832 if s0.Op != OpS390XSLDconst { 28833 break 28834 } 28835 j0 := s0.AuxInt 28836 x0 := s0.Args[0] 28837 if x0.Op != OpS390XMOVBZload { 28838 break 28839 } 28840 i0 := x0.AuxInt 28841 s := x0.Aux 28842 _ = x0.Args[1] 28843 p := x0.Args[0] 28844 mem := x0.Args[1] 28845 s1 := v.Args[1] 28846 if s1.Op != OpS390XSLDconst { 28847 break 28848 } 28849 j1 := s1.AuxInt 28850 x1 := s1.Args[0] 28851 if x1.Op != OpS390XMOVBZload { 28852 break 28853 } 28854 i1 := x1.AuxInt 28855 if x1.Aux != s { 28856 break 28857 } 28858 _ = x1.Args[1] 28859 if p != x1.Args[0] { 28860 break 28861 } 28862 if mem != x1.Args[1] { 28863 break 28864 } 28865 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)) { 28866 break 28867 } 28868 b = mergePoint(b, x0, x1) 28869 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28870 v.reset(OpCopy) 28871 v.AddArg(v0) 28872 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28873 v1.AuxInt = j0 28874 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 28875 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 28876 v3.AuxInt = i0 28877 v3.Aux = s 28878 v3.AddArg(p) 28879 v3.AddArg(mem) 28880 v2.AddArg(v3) 28881 v1.AddArg(v2) 28882 v0.AddArg(v1) 28883 v0.AddArg(y) 28884 return true 28885 } 28886 // 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)) 28887 // 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) 28888 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 28889 for { 28890 _ = v.Args[1] 28891 s1 := v.Args[0] 28892 if s1.Op != OpS390XSLDconst { 28893 break 28894 } 28895 j1 := s1.AuxInt 28896 r1 := s1.Args[0] 28897 if r1.Op != OpS390XMOVHZreg { 28898 break 28899 } 28900 x1 := r1.Args[0] 28901 if x1.Op != OpS390XMOVHBRload { 28902 break 28903 } 28904 i1 := x1.AuxInt 28905 s := x1.Aux 28906 _ = x1.Args[1] 28907 p := x1.Args[0] 28908 mem := x1.Args[1] 28909 or := v.Args[1] 28910 if or.Op != OpS390XOR { 28911 break 28912 } 28913 _ = or.Args[1] 28914 s0 := or.Args[0] 28915 if s0.Op != OpS390XSLDconst { 28916 break 28917 } 28918 j0 := s0.AuxInt 28919 r0 := s0.Args[0] 28920 if r0.Op != OpS390XMOVHZreg { 28921 break 28922 } 28923 x0 := r0.Args[0] 28924 if x0.Op != OpS390XMOVHBRload { 28925 break 28926 } 28927 i0 := x0.AuxInt 28928 if x0.Aux != s { 28929 break 28930 } 28931 _ = x0.Args[1] 28932 if p != x0.Args[0] { 28933 break 28934 } 28935 if mem != x0.Args[1] { 28936 break 28937 } 28938 y := or.Args[1] 28939 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)) { 28940 break 28941 } 28942 b = mergePoint(b, x0, x1) 28943 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28944 v.reset(OpCopy) 28945 v.AddArg(v0) 28946 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28947 v1.AuxInt = j0 28948 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28949 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 28950 v3.AuxInt = i0 28951 v3.Aux = s 28952 v3.AddArg(p) 28953 v3.AddArg(mem) 28954 v2.AddArg(v3) 28955 v1.AddArg(v2) 28956 v0.AddArg(v1) 28957 v0.AddArg(y) 28958 return true 28959 } 28960 // 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))))) 28961 // 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) 28962 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 28963 for { 28964 _ = v.Args[1] 28965 s1 := v.Args[0] 28966 if s1.Op != OpS390XSLDconst { 28967 break 28968 } 28969 j1 := s1.AuxInt 28970 r1 := s1.Args[0] 28971 if r1.Op != OpS390XMOVHZreg { 28972 break 28973 } 28974 x1 := r1.Args[0] 28975 if x1.Op != OpS390XMOVHBRload { 28976 break 28977 } 28978 i1 := x1.AuxInt 28979 s := x1.Aux 28980 _ = x1.Args[1] 28981 p := x1.Args[0] 28982 mem := x1.Args[1] 28983 or := v.Args[1] 28984 if or.Op != OpS390XOR { 28985 break 28986 } 28987 _ = or.Args[1] 28988 y := or.Args[0] 28989 s0 := or.Args[1] 28990 if s0.Op != OpS390XSLDconst { 28991 break 28992 } 28993 j0 := s0.AuxInt 28994 r0 := s0.Args[0] 28995 if r0.Op != OpS390XMOVHZreg { 28996 break 28997 } 28998 x0 := r0.Args[0] 28999 if x0.Op != OpS390XMOVHBRload { 29000 break 29001 } 29002 i0 := x0.AuxInt 29003 if x0.Aux != s { 29004 break 29005 } 29006 _ = x0.Args[1] 29007 if p != x0.Args[0] { 29008 break 29009 } 29010 if mem != x0.Args[1] { 29011 break 29012 } 29013 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)) { 29014 break 29015 } 29016 b = mergePoint(b, x0, x1) 29017 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29018 v.reset(OpCopy) 29019 v.AddArg(v0) 29020 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29021 v1.AuxInt = j0 29022 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29023 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 29024 v3.AuxInt = i0 29025 v3.Aux = s 29026 v3.AddArg(p) 29027 v3.AddArg(mem) 29028 v2.AddArg(v3) 29029 v1.AddArg(v2) 29030 v0.AddArg(v1) 29031 v0.AddArg(y) 29032 return true 29033 } 29034 // 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)))) 29035 // 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) 29036 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 29037 for { 29038 _ = v.Args[1] 29039 or := v.Args[0] 29040 if or.Op != OpS390XOR { 29041 break 29042 } 29043 _ = or.Args[1] 29044 s0 := or.Args[0] 29045 if s0.Op != OpS390XSLDconst { 29046 break 29047 } 29048 j0 := s0.AuxInt 29049 r0 := s0.Args[0] 29050 if r0.Op != OpS390XMOVHZreg { 29051 break 29052 } 29053 x0 := r0.Args[0] 29054 if x0.Op != OpS390XMOVHBRload { 29055 break 29056 } 29057 i0 := x0.AuxInt 29058 s := x0.Aux 29059 _ = x0.Args[1] 29060 p := x0.Args[0] 29061 mem := x0.Args[1] 29062 y := or.Args[1] 29063 s1 := v.Args[1] 29064 if s1.Op != OpS390XSLDconst { 29065 break 29066 } 29067 j1 := s1.AuxInt 29068 r1 := s1.Args[0] 29069 if r1.Op != OpS390XMOVHZreg { 29070 break 29071 } 29072 x1 := r1.Args[0] 29073 if x1.Op != OpS390XMOVHBRload { 29074 break 29075 } 29076 i1 := x1.AuxInt 29077 if x1.Aux != s { 29078 break 29079 } 29080 _ = x1.Args[1] 29081 if p != x1.Args[0] { 29082 break 29083 } 29084 if mem != x1.Args[1] { 29085 break 29086 } 29087 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)) { 29088 break 29089 } 29090 b = mergePoint(b, x0, x1) 29091 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29092 v.reset(OpCopy) 29093 v.AddArg(v0) 29094 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29095 v1.AuxInt = j0 29096 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29097 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 29098 v3.AuxInt = i0 29099 v3.Aux = s 29100 v3.AddArg(p) 29101 v3.AddArg(mem) 29102 v2.AddArg(v3) 29103 v1.AddArg(v2) 29104 v0.AddArg(v1) 29105 v0.AddArg(y) 29106 return true 29107 } 29108 return false 29109 } 29110 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 29111 b := v.Block 29112 _ = b 29113 typ := &b.Func.Config.Types 29114 _ = typ 29115 // 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)))) 29116 // 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) 29117 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 29118 for { 29119 _ = v.Args[1] 29120 or := v.Args[0] 29121 if or.Op != OpS390XOR { 29122 break 29123 } 29124 _ = or.Args[1] 29125 y := or.Args[0] 29126 s0 := or.Args[1] 29127 if s0.Op != OpS390XSLDconst { 29128 break 29129 } 29130 j0 := s0.AuxInt 29131 r0 := s0.Args[0] 29132 if r0.Op != OpS390XMOVHZreg { 29133 break 29134 } 29135 x0 := r0.Args[0] 29136 if x0.Op != OpS390XMOVHBRload { 29137 break 29138 } 29139 i0 := x0.AuxInt 29140 s := x0.Aux 29141 _ = x0.Args[1] 29142 p := x0.Args[0] 29143 mem := x0.Args[1] 29144 s1 := v.Args[1] 29145 if s1.Op != OpS390XSLDconst { 29146 break 29147 } 29148 j1 := s1.AuxInt 29149 r1 := s1.Args[0] 29150 if r1.Op != OpS390XMOVHZreg { 29151 break 29152 } 29153 x1 := r1.Args[0] 29154 if x1.Op != OpS390XMOVHBRload { 29155 break 29156 } 29157 i1 := x1.AuxInt 29158 if x1.Aux != s { 29159 break 29160 } 29161 _ = x1.Args[1] 29162 if p != x1.Args[0] { 29163 break 29164 } 29165 if mem != x1.Args[1] { 29166 break 29167 } 29168 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)) { 29169 break 29170 } 29171 b = mergePoint(b, x0, x1) 29172 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29173 v.reset(OpCopy) 29174 v.AddArg(v0) 29175 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29176 v1.AuxInt = j0 29177 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29178 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 29179 v3.AuxInt = i0 29180 v3.Aux = s 29181 v3.AddArg(p) 29182 v3.AddArg(mem) 29183 v2.AddArg(v3) 29184 v1.AddArg(v2) 29185 v0.AddArg(v1) 29186 v0.AddArg(y) 29187 return true 29188 } 29189 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 29190 // 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) 29191 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29192 for { 29193 _ = v.Args[1] 29194 x0 := v.Args[0] 29195 if x0.Op != OpS390XMOVBZloadidx { 29196 break 29197 } 29198 i0 := x0.AuxInt 29199 s := x0.Aux 29200 _ = x0.Args[2] 29201 p := x0.Args[0] 29202 idx := x0.Args[1] 29203 mem := x0.Args[2] 29204 sh := v.Args[1] 29205 if sh.Op != OpS390XSLDconst { 29206 break 29207 } 29208 if sh.AuxInt != 8 { 29209 break 29210 } 29211 x1 := sh.Args[0] 29212 if x1.Op != OpS390XMOVBZloadidx { 29213 break 29214 } 29215 i1 := x1.AuxInt 29216 if x1.Aux != s { 29217 break 29218 } 29219 _ = x1.Args[2] 29220 if p != x1.Args[0] { 29221 break 29222 } 29223 if idx != x1.Args[1] { 29224 break 29225 } 29226 if mem != x1.Args[2] { 29227 break 29228 } 29229 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)) { 29230 break 29231 } 29232 b = mergePoint(b, x0, x1) 29233 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29234 v.reset(OpCopy) 29235 v.AddArg(v0) 29236 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29237 v1.AuxInt = i0 29238 v1.Aux = s 29239 v1.AddArg(p) 29240 v1.AddArg(idx) 29241 v1.AddArg(mem) 29242 v0.AddArg(v1) 29243 return true 29244 } 29245 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 29246 // 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) 29247 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29248 for { 29249 _ = v.Args[1] 29250 x0 := v.Args[0] 29251 if x0.Op != OpS390XMOVBZloadidx { 29252 break 29253 } 29254 i0 := x0.AuxInt 29255 s := x0.Aux 29256 _ = x0.Args[2] 29257 idx := x0.Args[0] 29258 p := x0.Args[1] 29259 mem := x0.Args[2] 29260 sh := v.Args[1] 29261 if sh.Op != OpS390XSLDconst { 29262 break 29263 } 29264 if sh.AuxInt != 8 { 29265 break 29266 } 29267 x1 := sh.Args[0] 29268 if x1.Op != OpS390XMOVBZloadidx { 29269 break 29270 } 29271 i1 := x1.AuxInt 29272 if x1.Aux != s { 29273 break 29274 } 29275 _ = x1.Args[2] 29276 if p != x1.Args[0] { 29277 break 29278 } 29279 if idx != x1.Args[1] { 29280 break 29281 } 29282 if mem != x1.Args[2] { 29283 break 29284 } 29285 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)) { 29286 break 29287 } 29288 b = mergePoint(b, x0, x1) 29289 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29290 v.reset(OpCopy) 29291 v.AddArg(v0) 29292 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29293 v1.AuxInt = i0 29294 v1.Aux = s 29295 v1.AddArg(p) 29296 v1.AddArg(idx) 29297 v1.AddArg(mem) 29298 v0.AddArg(v1) 29299 return true 29300 } 29301 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 29302 // 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) 29303 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29304 for { 29305 _ = v.Args[1] 29306 x0 := v.Args[0] 29307 if x0.Op != OpS390XMOVBZloadidx { 29308 break 29309 } 29310 i0 := x0.AuxInt 29311 s := x0.Aux 29312 _ = x0.Args[2] 29313 p := x0.Args[0] 29314 idx := x0.Args[1] 29315 mem := x0.Args[2] 29316 sh := v.Args[1] 29317 if sh.Op != OpS390XSLDconst { 29318 break 29319 } 29320 if sh.AuxInt != 8 { 29321 break 29322 } 29323 x1 := sh.Args[0] 29324 if x1.Op != OpS390XMOVBZloadidx { 29325 break 29326 } 29327 i1 := x1.AuxInt 29328 if x1.Aux != s { 29329 break 29330 } 29331 _ = x1.Args[2] 29332 if idx != x1.Args[0] { 29333 break 29334 } 29335 if p != x1.Args[1] { 29336 break 29337 } 29338 if mem != x1.Args[2] { 29339 break 29340 } 29341 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)) { 29342 break 29343 } 29344 b = mergePoint(b, x0, x1) 29345 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29346 v.reset(OpCopy) 29347 v.AddArg(v0) 29348 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29349 v1.AuxInt = i0 29350 v1.Aux = s 29351 v1.AddArg(p) 29352 v1.AddArg(idx) 29353 v1.AddArg(mem) 29354 v0.AddArg(v1) 29355 return true 29356 } 29357 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 29358 // 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) 29359 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29360 for { 29361 _ = v.Args[1] 29362 x0 := v.Args[0] 29363 if x0.Op != OpS390XMOVBZloadidx { 29364 break 29365 } 29366 i0 := x0.AuxInt 29367 s := x0.Aux 29368 _ = x0.Args[2] 29369 idx := x0.Args[0] 29370 p := x0.Args[1] 29371 mem := x0.Args[2] 29372 sh := v.Args[1] 29373 if sh.Op != OpS390XSLDconst { 29374 break 29375 } 29376 if sh.AuxInt != 8 { 29377 break 29378 } 29379 x1 := sh.Args[0] 29380 if x1.Op != OpS390XMOVBZloadidx { 29381 break 29382 } 29383 i1 := x1.AuxInt 29384 if x1.Aux != s { 29385 break 29386 } 29387 _ = x1.Args[2] 29388 if idx != x1.Args[0] { 29389 break 29390 } 29391 if p != x1.Args[1] { 29392 break 29393 } 29394 if mem != x1.Args[2] { 29395 break 29396 } 29397 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)) { 29398 break 29399 } 29400 b = mergePoint(b, x0, x1) 29401 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29402 v.reset(OpCopy) 29403 v.AddArg(v0) 29404 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29405 v1.AuxInt = i0 29406 v1.Aux = s 29407 v1.AddArg(p) 29408 v1.AddArg(idx) 29409 v1.AddArg(mem) 29410 v0.AddArg(v1) 29411 return true 29412 } 29413 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 29414 // 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) 29415 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29416 for { 29417 _ = v.Args[1] 29418 sh := v.Args[0] 29419 if sh.Op != OpS390XSLDconst { 29420 break 29421 } 29422 if sh.AuxInt != 8 { 29423 break 29424 } 29425 x1 := sh.Args[0] 29426 if x1.Op != OpS390XMOVBZloadidx { 29427 break 29428 } 29429 i1 := x1.AuxInt 29430 s := x1.Aux 29431 _ = x1.Args[2] 29432 p := x1.Args[0] 29433 idx := x1.Args[1] 29434 mem := x1.Args[2] 29435 x0 := v.Args[1] 29436 if x0.Op != OpS390XMOVBZloadidx { 29437 break 29438 } 29439 i0 := x0.AuxInt 29440 if x0.Aux != s { 29441 break 29442 } 29443 _ = x0.Args[2] 29444 if p != x0.Args[0] { 29445 break 29446 } 29447 if idx != x0.Args[1] { 29448 break 29449 } 29450 if mem != x0.Args[2] { 29451 break 29452 } 29453 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)) { 29454 break 29455 } 29456 b = mergePoint(b, x0, x1) 29457 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29458 v.reset(OpCopy) 29459 v.AddArg(v0) 29460 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29461 v1.AuxInt = i0 29462 v1.Aux = s 29463 v1.AddArg(p) 29464 v1.AddArg(idx) 29465 v1.AddArg(mem) 29466 v0.AddArg(v1) 29467 return true 29468 } 29469 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 29470 // 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) 29471 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29472 for { 29473 _ = v.Args[1] 29474 sh := v.Args[0] 29475 if sh.Op != OpS390XSLDconst { 29476 break 29477 } 29478 if sh.AuxInt != 8 { 29479 break 29480 } 29481 x1 := sh.Args[0] 29482 if x1.Op != OpS390XMOVBZloadidx { 29483 break 29484 } 29485 i1 := x1.AuxInt 29486 s := x1.Aux 29487 _ = x1.Args[2] 29488 idx := x1.Args[0] 29489 p := x1.Args[1] 29490 mem := x1.Args[2] 29491 x0 := v.Args[1] 29492 if x0.Op != OpS390XMOVBZloadidx { 29493 break 29494 } 29495 i0 := x0.AuxInt 29496 if x0.Aux != s { 29497 break 29498 } 29499 _ = x0.Args[2] 29500 if p != x0.Args[0] { 29501 break 29502 } 29503 if idx != x0.Args[1] { 29504 break 29505 } 29506 if mem != x0.Args[2] { 29507 break 29508 } 29509 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)) { 29510 break 29511 } 29512 b = mergePoint(b, x0, x1) 29513 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29514 v.reset(OpCopy) 29515 v.AddArg(v0) 29516 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29517 v1.AuxInt = i0 29518 v1.Aux = s 29519 v1.AddArg(p) 29520 v1.AddArg(idx) 29521 v1.AddArg(mem) 29522 v0.AddArg(v1) 29523 return true 29524 } 29525 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 29526 // 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) 29527 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29528 for { 29529 _ = v.Args[1] 29530 sh := v.Args[0] 29531 if sh.Op != OpS390XSLDconst { 29532 break 29533 } 29534 if sh.AuxInt != 8 { 29535 break 29536 } 29537 x1 := sh.Args[0] 29538 if x1.Op != OpS390XMOVBZloadidx { 29539 break 29540 } 29541 i1 := x1.AuxInt 29542 s := x1.Aux 29543 _ = x1.Args[2] 29544 p := x1.Args[0] 29545 idx := x1.Args[1] 29546 mem := x1.Args[2] 29547 x0 := v.Args[1] 29548 if x0.Op != OpS390XMOVBZloadidx { 29549 break 29550 } 29551 i0 := x0.AuxInt 29552 if x0.Aux != s { 29553 break 29554 } 29555 _ = x0.Args[2] 29556 if idx != x0.Args[0] { 29557 break 29558 } 29559 if p != x0.Args[1] { 29560 break 29561 } 29562 if mem != x0.Args[2] { 29563 break 29564 } 29565 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)) { 29566 break 29567 } 29568 b = mergePoint(b, x0, x1) 29569 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29570 v.reset(OpCopy) 29571 v.AddArg(v0) 29572 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29573 v1.AuxInt = i0 29574 v1.Aux = s 29575 v1.AddArg(p) 29576 v1.AddArg(idx) 29577 v1.AddArg(mem) 29578 v0.AddArg(v1) 29579 return true 29580 } 29581 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 29582 // 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) 29583 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29584 for { 29585 _ = v.Args[1] 29586 sh := v.Args[0] 29587 if sh.Op != OpS390XSLDconst { 29588 break 29589 } 29590 if sh.AuxInt != 8 { 29591 break 29592 } 29593 x1 := sh.Args[0] 29594 if x1.Op != OpS390XMOVBZloadidx { 29595 break 29596 } 29597 i1 := x1.AuxInt 29598 s := x1.Aux 29599 _ = x1.Args[2] 29600 idx := x1.Args[0] 29601 p := x1.Args[1] 29602 mem := x1.Args[2] 29603 x0 := v.Args[1] 29604 if x0.Op != OpS390XMOVBZloadidx { 29605 break 29606 } 29607 i0 := x0.AuxInt 29608 if x0.Aux != s { 29609 break 29610 } 29611 _ = x0.Args[2] 29612 if idx != x0.Args[0] { 29613 break 29614 } 29615 if p != x0.Args[1] { 29616 break 29617 } 29618 if mem != x0.Args[2] { 29619 break 29620 } 29621 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)) { 29622 break 29623 } 29624 b = mergePoint(b, x0, x1) 29625 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29626 v.reset(OpCopy) 29627 v.AddArg(v0) 29628 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29629 v1.AuxInt = i0 29630 v1.Aux = s 29631 v1.AddArg(p) 29632 v1.AddArg(idx) 29633 v1.AddArg(mem) 29634 v0.AddArg(v1) 29635 return true 29636 } 29637 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 29638 // 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) 29639 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29640 for { 29641 _ = v.Args[1] 29642 r0 := v.Args[0] 29643 if r0.Op != OpS390XMOVHZreg { 29644 break 29645 } 29646 x0 := r0.Args[0] 29647 if x0.Op != OpS390XMOVHBRloadidx { 29648 break 29649 } 29650 i0 := x0.AuxInt 29651 s := x0.Aux 29652 _ = x0.Args[2] 29653 p := x0.Args[0] 29654 idx := x0.Args[1] 29655 mem := x0.Args[2] 29656 sh := v.Args[1] 29657 if sh.Op != OpS390XSLDconst { 29658 break 29659 } 29660 if sh.AuxInt != 16 { 29661 break 29662 } 29663 r1 := sh.Args[0] 29664 if r1.Op != OpS390XMOVHZreg { 29665 break 29666 } 29667 x1 := r1.Args[0] 29668 if x1.Op != OpS390XMOVHBRloadidx { 29669 break 29670 } 29671 i1 := x1.AuxInt 29672 if x1.Aux != s { 29673 break 29674 } 29675 _ = x1.Args[2] 29676 if p != x1.Args[0] { 29677 break 29678 } 29679 if idx != x1.Args[1] { 29680 break 29681 } 29682 if mem != x1.Args[2] { 29683 break 29684 } 29685 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)) { 29686 break 29687 } 29688 b = mergePoint(b, x0, x1) 29689 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29690 v.reset(OpCopy) 29691 v.AddArg(v0) 29692 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29693 v1.AuxInt = i0 29694 v1.Aux = s 29695 v1.AddArg(p) 29696 v1.AddArg(idx) 29697 v1.AddArg(mem) 29698 v0.AddArg(v1) 29699 return true 29700 } 29701 return false 29702 } 29703 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 29704 b := v.Block 29705 _ = b 29706 typ := &b.Func.Config.Types 29707 _ = typ 29708 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 29709 // 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) 29710 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29711 for { 29712 _ = v.Args[1] 29713 r0 := v.Args[0] 29714 if r0.Op != OpS390XMOVHZreg { 29715 break 29716 } 29717 x0 := r0.Args[0] 29718 if x0.Op != OpS390XMOVHBRloadidx { 29719 break 29720 } 29721 i0 := x0.AuxInt 29722 s := x0.Aux 29723 _ = x0.Args[2] 29724 idx := x0.Args[0] 29725 p := x0.Args[1] 29726 mem := x0.Args[2] 29727 sh := v.Args[1] 29728 if sh.Op != OpS390XSLDconst { 29729 break 29730 } 29731 if sh.AuxInt != 16 { 29732 break 29733 } 29734 r1 := sh.Args[0] 29735 if r1.Op != OpS390XMOVHZreg { 29736 break 29737 } 29738 x1 := r1.Args[0] 29739 if x1.Op != OpS390XMOVHBRloadidx { 29740 break 29741 } 29742 i1 := x1.AuxInt 29743 if x1.Aux != s { 29744 break 29745 } 29746 _ = x1.Args[2] 29747 if p != x1.Args[0] { 29748 break 29749 } 29750 if idx != x1.Args[1] { 29751 break 29752 } 29753 if mem != x1.Args[2] { 29754 break 29755 } 29756 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)) { 29757 break 29758 } 29759 b = mergePoint(b, x0, x1) 29760 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29761 v.reset(OpCopy) 29762 v.AddArg(v0) 29763 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29764 v1.AuxInt = i0 29765 v1.Aux = s 29766 v1.AddArg(p) 29767 v1.AddArg(idx) 29768 v1.AddArg(mem) 29769 v0.AddArg(v1) 29770 return true 29771 } 29772 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 29773 // 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) 29774 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29775 for { 29776 _ = v.Args[1] 29777 r0 := v.Args[0] 29778 if r0.Op != OpS390XMOVHZreg { 29779 break 29780 } 29781 x0 := r0.Args[0] 29782 if x0.Op != OpS390XMOVHBRloadidx { 29783 break 29784 } 29785 i0 := x0.AuxInt 29786 s := x0.Aux 29787 _ = x0.Args[2] 29788 p := x0.Args[0] 29789 idx := x0.Args[1] 29790 mem := x0.Args[2] 29791 sh := v.Args[1] 29792 if sh.Op != OpS390XSLDconst { 29793 break 29794 } 29795 if sh.AuxInt != 16 { 29796 break 29797 } 29798 r1 := sh.Args[0] 29799 if r1.Op != OpS390XMOVHZreg { 29800 break 29801 } 29802 x1 := r1.Args[0] 29803 if x1.Op != OpS390XMOVHBRloadidx { 29804 break 29805 } 29806 i1 := x1.AuxInt 29807 if x1.Aux != s { 29808 break 29809 } 29810 _ = x1.Args[2] 29811 if idx != x1.Args[0] { 29812 break 29813 } 29814 if p != x1.Args[1] { 29815 break 29816 } 29817 if mem != x1.Args[2] { 29818 break 29819 } 29820 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)) { 29821 break 29822 } 29823 b = mergePoint(b, x0, x1) 29824 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29825 v.reset(OpCopy) 29826 v.AddArg(v0) 29827 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29828 v1.AuxInt = i0 29829 v1.Aux = s 29830 v1.AddArg(p) 29831 v1.AddArg(idx) 29832 v1.AddArg(mem) 29833 v0.AddArg(v1) 29834 return true 29835 } 29836 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 29837 // 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) 29838 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29839 for { 29840 _ = v.Args[1] 29841 r0 := v.Args[0] 29842 if r0.Op != OpS390XMOVHZreg { 29843 break 29844 } 29845 x0 := r0.Args[0] 29846 if x0.Op != OpS390XMOVHBRloadidx { 29847 break 29848 } 29849 i0 := x0.AuxInt 29850 s := x0.Aux 29851 _ = x0.Args[2] 29852 idx := x0.Args[0] 29853 p := x0.Args[1] 29854 mem := x0.Args[2] 29855 sh := v.Args[1] 29856 if sh.Op != OpS390XSLDconst { 29857 break 29858 } 29859 if sh.AuxInt != 16 { 29860 break 29861 } 29862 r1 := sh.Args[0] 29863 if r1.Op != OpS390XMOVHZreg { 29864 break 29865 } 29866 x1 := r1.Args[0] 29867 if x1.Op != OpS390XMOVHBRloadidx { 29868 break 29869 } 29870 i1 := x1.AuxInt 29871 if x1.Aux != s { 29872 break 29873 } 29874 _ = x1.Args[2] 29875 if idx != x1.Args[0] { 29876 break 29877 } 29878 if p != x1.Args[1] { 29879 break 29880 } 29881 if mem != x1.Args[2] { 29882 break 29883 } 29884 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)) { 29885 break 29886 } 29887 b = mergePoint(b, x0, x1) 29888 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29889 v.reset(OpCopy) 29890 v.AddArg(v0) 29891 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29892 v1.AuxInt = i0 29893 v1.Aux = s 29894 v1.AddArg(p) 29895 v1.AddArg(idx) 29896 v1.AddArg(mem) 29897 v0.AddArg(v1) 29898 return true 29899 } 29900 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 29901 // 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) 29902 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29903 for { 29904 _ = v.Args[1] 29905 sh := v.Args[0] 29906 if sh.Op != OpS390XSLDconst { 29907 break 29908 } 29909 if sh.AuxInt != 16 { 29910 break 29911 } 29912 r1 := sh.Args[0] 29913 if r1.Op != OpS390XMOVHZreg { 29914 break 29915 } 29916 x1 := r1.Args[0] 29917 if x1.Op != OpS390XMOVHBRloadidx { 29918 break 29919 } 29920 i1 := x1.AuxInt 29921 s := x1.Aux 29922 _ = x1.Args[2] 29923 p := x1.Args[0] 29924 idx := x1.Args[1] 29925 mem := x1.Args[2] 29926 r0 := v.Args[1] 29927 if r0.Op != OpS390XMOVHZreg { 29928 break 29929 } 29930 x0 := r0.Args[0] 29931 if x0.Op != OpS390XMOVHBRloadidx { 29932 break 29933 } 29934 i0 := x0.AuxInt 29935 if x0.Aux != s { 29936 break 29937 } 29938 _ = x0.Args[2] 29939 if p != x0.Args[0] { 29940 break 29941 } 29942 if idx != x0.Args[1] { 29943 break 29944 } 29945 if mem != x0.Args[2] { 29946 break 29947 } 29948 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)) { 29949 break 29950 } 29951 b = mergePoint(b, x0, x1) 29952 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29953 v.reset(OpCopy) 29954 v.AddArg(v0) 29955 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29956 v1.AuxInt = i0 29957 v1.Aux = s 29958 v1.AddArg(p) 29959 v1.AddArg(idx) 29960 v1.AddArg(mem) 29961 v0.AddArg(v1) 29962 return true 29963 } 29964 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 29965 // 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) 29966 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29967 for { 29968 _ = v.Args[1] 29969 sh := v.Args[0] 29970 if sh.Op != OpS390XSLDconst { 29971 break 29972 } 29973 if sh.AuxInt != 16 { 29974 break 29975 } 29976 r1 := sh.Args[0] 29977 if r1.Op != OpS390XMOVHZreg { 29978 break 29979 } 29980 x1 := r1.Args[0] 29981 if x1.Op != OpS390XMOVHBRloadidx { 29982 break 29983 } 29984 i1 := x1.AuxInt 29985 s := x1.Aux 29986 _ = x1.Args[2] 29987 idx := x1.Args[0] 29988 p := x1.Args[1] 29989 mem := x1.Args[2] 29990 r0 := v.Args[1] 29991 if r0.Op != OpS390XMOVHZreg { 29992 break 29993 } 29994 x0 := r0.Args[0] 29995 if x0.Op != OpS390XMOVHBRloadidx { 29996 break 29997 } 29998 i0 := x0.AuxInt 29999 if x0.Aux != s { 30000 break 30001 } 30002 _ = x0.Args[2] 30003 if p != x0.Args[0] { 30004 break 30005 } 30006 if idx != x0.Args[1] { 30007 break 30008 } 30009 if mem != x0.Args[2] { 30010 break 30011 } 30012 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)) { 30013 break 30014 } 30015 b = mergePoint(b, x0, x1) 30016 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30017 v.reset(OpCopy) 30018 v.AddArg(v0) 30019 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30020 v1.AuxInt = i0 30021 v1.Aux = s 30022 v1.AddArg(p) 30023 v1.AddArg(idx) 30024 v1.AddArg(mem) 30025 v0.AddArg(v1) 30026 return true 30027 } 30028 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 30029 // 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) 30030 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 30031 for { 30032 _ = v.Args[1] 30033 sh := v.Args[0] 30034 if sh.Op != OpS390XSLDconst { 30035 break 30036 } 30037 if sh.AuxInt != 16 { 30038 break 30039 } 30040 r1 := sh.Args[0] 30041 if r1.Op != OpS390XMOVHZreg { 30042 break 30043 } 30044 x1 := r1.Args[0] 30045 if x1.Op != OpS390XMOVHBRloadidx { 30046 break 30047 } 30048 i1 := x1.AuxInt 30049 s := x1.Aux 30050 _ = x1.Args[2] 30051 p := x1.Args[0] 30052 idx := x1.Args[1] 30053 mem := x1.Args[2] 30054 r0 := v.Args[1] 30055 if r0.Op != OpS390XMOVHZreg { 30056 break 30057 } 30058 x0 := r0.Args[0] 30059 if x0.Op != OpS390XMOVHBRloadidx { 30060 break 30061 } 30062 i0 := x0.AuxInt 30063 if x0.Aux != s { 30064 break 30065 } 30066 _ = x0.Args[2] 30067 if idx != x0.Args[0] { 30068 break 30069 } 30070 if p != x0.Args[1] { 30071 break 30072 } 30073 if mem != x0.Args[2] { 30074 break 30075 } 30076 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)) { 30077 break 30078 } 30079 b = mergePoint(b, x0, x1) 30080 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30081 v.reset(OpCopy) 30082 v.AddArg(v0) 30083 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30084 v1.AuxInt = i0 30085 v1.Aux = s 30086 v1.AddArg(p) 30087 v1.AddArg(idx) 30088 v1.AddArg(mem) 30089 v0.AddArg(v1) 30090 return true 30091 } 30092 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 30093 // 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) 30094 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 30095 for { 30096 _ = v.Args[1] 30097 sh := v.Args[0] 30098 if sh.Op != OpS390XSLDconst { 30099 break 30100 } 30101 if sh.AuxInt != 16 { 30102 break 30103 } 30104 r1 := sh.Args[0] 30105 if r1.Op != OpS390XMOVHZreg { 30106 break 30107 } 30108 x1 := r1.Args[0] 30109 if x1.Op != OpS390XMOVHBRloadidx { 30110 break 30111 } 30112 i1 := x1.AuxInt 30113 s := x1.Aux 30114 _ = x1.Args[2] 30115 idx := x1.Args[0] 30116 p := x1.Args[1] 30117 mem := x1.Args[2] 30118 r0 := v.Args[1] 30119 if r0.Op != OpS390XMOVHZreg { 30120 break 30121 } 30122 x0 := r0.Args[0] 30123 if x0.Op != OpS390XMOVHBRloadidx { 30124 break 30125 } 30126 i0 := x0.AuxInt 30127 if x0.Aux != s { 30128 break 30129 } 30130 _ = x0.Args[2] 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+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)) { 30141 break 30142 } 30143 b = mergePoint(b, x0, x1) 30144 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30145 v.reset(OpCopy) 30146 v.AddArg(v0) 30147 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30148 v1.AuxInt = i0 30149 v1.Aux = s 30150 v1.AddArg(p) 30151 v1.AddArg(idx) 30152 v1.AddArg(mem) 30153 v0.AddArg(v1) 30154 return true 30155 } 30156 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 30157 // 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) 30158 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30159 for { 30160 _ = v.Args[1] 30161 r0 := v.Args[0] 30162 if r0.Op != OpS390XMOVWZreg { 30163 break 30164 } 30165 x0 := r0.Args[0] 30166 if x0.Op != OpS390XMOVWBRloadidx { 30167 break 30168 } 30169 i0 := x0.AuxInt 30170 s := x0.Aux 30171 _ = x0.Args[2] 30172 p := x0.Args[0] 30173 idx := x0.Args[1] 30174 mem := x0.Args[2] 30175 sh := v.Args[1] 30176 if sh.Op != OpS390XSLDconst { 30177 break 30178 } 30179 if sh.AuxInt != 32 { 30180 break 30181 } 30182 r1 := sh.Args[0] 30183 if r1.Op != OpS390XMOVWZreg { 30184 break 30185 } 30186 x1 := r1.Args[0] 30187 if x1.Op != OpS390XMOVWBRloadidx { 30188 break 30189 } 30190 i1 := x1.AuxInt 30191 if x1.Aux != s { 30192 break 30193 } 30194 _ = x1.Args[2] 30195 if p != x1.Args[0] { 30196 break 30197 } 30198 if idx != x1.Args[1] { 30199 break 30200 } 30201 if mem != x1.Args[2] { 30202 break 30203 } 30204 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)) { 30205 break 30206 } 30207 b = mergePoint(b, x0, x1) 30208 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30209 v.reset(OpCopy) 30210 v.AddArg(v0) 30211 v0.AuxInt = i0 30212 v0.Aux = s 30213 v0.AddArg(p) 30214 v0.AddArg(idx) 30215 v0.AddArg(mem) 30216 return true 30217 } 30218 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 30219 // 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) 30220 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30221 for { 30222 _ = v.Args[1] 30223 r0 := v.Args[0] 30224 if r0.Op != OpS390XMOVWZreg { 30225 break 30226 } 30227 x0 := r0.Args[0] 30228 if x0.Op != OpS390XMOVWBRloadidx { 30229 break 30230 } 30231 i0 := x0.AuxInt 30232 s := x0.Aux 30233 _ = x0.Args[2] 30234 idx := x0.Args[0] 30235 p := x0.Args[1] 30236 mem := x0.Args[2] 30237 sh := v.Args[1] 30238 if sh.Op != OpS390XSLDconst { 30239 break 30240 } 30241 if sh.AuxInt != 32 { 30242 break 30243 } 30244 r1 := sh.Args[0] 30245 if r1.Op != OpS390XMOVWZreg { 30246 break 30247 } 30248 x1 := r1.Args[0] 30249 if x1.Op != OpS390XMOVWBRloadidx { 30250 break 30251 } 30252 i1 := x1.AuxInt 30253 if x1.Aux != s { 30254 break 30255 } 30256 _ = x1.Args[2] 30257 if p != x1.Args[0] { 30258 break 30259 } 30260 if idx != x1.Args[1] { 30261 break 30262 } 30263 if mem != x1.Args[2] { 30264 break 30265 } 30266 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)) { 30267 break 30268 } 30269 b = mergePoint(b, x0, x1) 30270 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30271 v.reset(OpCopy) 30272 v.AddArg(v0) 30273 v0.AuxInt = i0 30274 v0.Aux = s 30275 v0.AddArg(p) 30276 v0.AddArg(idx) 30277 v0.AddArg(mem) 30278 return true 30279 } 30280 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 30281 // 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) 30282 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30283 for { 30284 _ = v.Args[1] 30285 r0 := v.Args[0] 30286 if r0.Op != OpS390XMOVWZreg { 30287 break 30288 } 30289 x0 := r0.Args[0] 30290 if x0.Op != OpS390XMOVWBRloadidx { 30291 break 30292 } 30293 i0 := x0.AuxInt 30294 s := x0.Aux 30295 _ = x0.Args[2] 30296 p := x0.Args[0] 30297 idx := x0.Args[1] 30298 mem := x0.Args[2] 30299 sh := v.Args[1] 30300 if sh.Op != OpS390XSLDconst { 30301 break 30302 } 30303 if sh.AuxInt != 32 { 30304 break 30305 } 30306 r1 := sh.Args[0] 30307 if r1.Op != OpS390XMOVWZreg { 30308 break 30309 } 30310 x1 := r1.Args[0] 30311 if x1.Op != OpS390XMOVWBRloadidx { 30312 break 30313 } 30314 i1 := x1.AuxInt 30315 if x1.Aux != s { 30316 break 30317 } 30318 _ = x1.Args[2] 30319 if idx != x1.Args[0] { 30320 break 30321 } 30322 if p != x1.Args[1] { 30323 break 30324 } 30325 if mem != x1.Args[2] { 30326 break 30327 } 30328 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)) { 30329 break 30330 } 30331 b = mergePoint(b, x0, x1) 30332 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30333 v.reset(OpCopy) 30334 v.AddArg(v0) 30335 v0.AuxInt = i0 30336 v0.Aux = s 30337 v0.AddArg(p) 30338 v0.AddArg(idx) 30339 v0.AddArg(mem) 30340 return true 30341 } 30342 return false 30343 } 30344 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 30345 b := v.Block 30346 _ = b 30347 typ := &b.Func.Config.Types 30348 _ = typ 30349 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 30350 // 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) 30351 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30352 for { 30353 _ = v.Args[1] 30354 r0 := v.Args[0] 30355 if r0.Op != OpS390XMOVWZreg { 30356 break 30357 } 30358 x0 := r0.Args[0] 30359 if x0.Op != OpS390XMOVWBRloadidx { 30360 break 30361 } 30362 i0 := x0.AuxInt 30363 s := x0.Aux 30364 _ = x0.Args[2] 30365 idx := x0.Args[0] 30366 p := x0.Args[1] 30367 mem := x0.Args[2] 30368 sh := v.Args[1] 30369 if sh.Op != OpS390XSLDconst { 30370 break 30371 } 30372 if sh.AuxInt != 32 { 30373 break 30374 } 30375 r1 := sh.Args[0] 30376 if r1.Op != OpS390XMOVWZreg { 30377 break 30378 } 30379 x1 := r1.Args[0] 30380 if x1.Op != OpS390XMOVWBRloadidx { 30381 break 30382 } 30383 i1 := x1.AuxInt 30384 if x1.Aux != s { 30385 break 30386 } 30387 _ = x1.Args[2] 30388 if idx != x1.Args[0] { 30389 break 30390 } 30391 if p != x1.Args[1] { 30392 break 30393 } 30394 if mem != x1.Args[2] { 30395 break 30396 } 30397 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)) { 30398 break 30399 } 30400 b = mergePoint(b, x0, x1) 30401 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30402 v.reset(OpCopy) 30403 v.AddArg(v0) 30404 v0.AuxInt = i0 30405 v0.Aux = s 30406 v0.AddArg(p) 30407 v0.AddArg(idx) 30408 v0.AddArg(mem) 30409 return true 30410 } 30411 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 30412 // 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) 30413 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30414 for { 30415 _ = v.Args[1] 30416 sh := v.Args[0] 30417 if sh.Op != OpS390XSLDconst { 30418 break 30419 } 30420 if sh.AuxInt != 32 { 30421 break 30422 } 30423 r1 := sh.Args[0] 30424 if r1.Op != OpS390XMOVWZreg { 30425 break 30426 } 30427 x1 := r1.Args[0] 30428 if x1.Op != OpS390XMOVWBRloadidx { 30429 break 30430 } 30431 i1 := x1.AuxInt 30432 s := x1.Aux 30433 _ = x1.Args[2] 30434 p := x1.Args[0] 30435 idx := x1.Args[1] 30436 mem := x1.Args[2] 30437 r0 := v.Args[1] 30438 if r0.Op != OpS390XMOVWZreg { 30439 break 30440 } 30441 x0 := r0.Args[0] 30442 if x0.Op != OpS390XMOVWBRloadidx { 30443 break 30444 } 30445 i0 := x0.AuxInt 30446 if x0.Aux != s { 30447 break 30448 } 30449 _ = x0.Args[2] 30450 if p != x0.Args[0] { 30451 break 30452 } 30453 if idx != x0.Args[1] { 30454 break 30455 } 30456 if mem != x0.Args[2] { 30457 break 30458 } 30459 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)) { 30460 break 30461 } 30462 b = mergePoint(b, x0, x1) 30463 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30464 v.reset(OpCopy) 30465 v.AddArg(v0) 30466 v0.AuxInt = i0 30467 v0.Aux = s 30468 v0.AddArg(p) 30469 v0.AddArg(idx) 30470 v0.AddArg(mem) 30471 return true 30472 } 30473 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 30474 // 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) 30475 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30476 for { 30477 _ = v.Args[1] 30478 sh := v.Args[0] 30479 if sh.Op != OpS390XSLDconst { 30480 break 30481 } 30482 if sh.AuxInt != 32 { 30483 break 30484 } 30485 r1 := sh.Args[0] 30486 if r1.Op != OpS390XMOVWZreg { 30487 break 30488 } 30489 x1 := r1.Args[0] 30490 if x1.Op != OpS390XMOVWBRloadidx { 30491 break 30492 } 30493 i1 := x1.AuxInt 30494 s := x1.Aux 30495 _ = x1.Args[2] 30496 idx := x1.Args[0] 30497 p := x1.Args[1] 30498 mem := x1.Args[2] 30499 r0 := v.Args[1] 30500 if r0.Op != OpS390XMOVWZreg { 30501 break 30502 } 30503 x0 := r0.Args[0] 30504 if x0.Op != OpS390XMOVWBRloadidx { 30505 break 30506 } 30507 i0 := x0.AuxInt 30508 if x0.Aux != s { 30509 break 30510 } 30511 _ = x0.Args[2] 30512 if p != x0.Args[0] { 30513 break 30514 } 30515 if idx != x0.Args[1] { 30516 break 30517 } 30518 if mem != x0.Args[2] { 30519 break 30520 } 30521 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)) { 30522 break 30523 } 30524 b = mergePoint(b, x0, x1) 30525 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30526 v.reset(OpCopy) 30527 v.AddArg(v0) 30528 v0.AuxInt = i0 30529 v0.Aux = s 30530 v0.AddArg(p) 30531 v0.AddArg(idx) 30532 v0.AddArg(mem) 30533 return true 30534 } 30535 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 30536 // 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) 30537 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30538 for { 30539 _ = v.Args[1] 30540 sh := v.Args[0] 30541 if sh.Op != OpS390XSLDconst { 30542 break 30543 } 30544 if sh.AuxInt != 32 { 30545 break 30546 } 30547 r1 := sh.Args[0] 30548 if r1.Op != OpS390XMOVWZreg { 30549 break 30550 } 30551 x1 := r1.Args[0] 30552 if x1.Op != OpS390XMOVWBRloadidx { 30553 break 30554 } 30555 i1 := x1.AuxInt 30556 s := x1.Aux 30557 _ = x1.Args[2] 30558 p := x1.Args[0] 30559 idx := x1.Args[1] 30560 mem := x1.Args[2] 30561 r0 := v.Args[1] 30562 if r0.Op != OpS390XMOVWZreg { 30563 break 30564 } 30565 x0 := r0.Args[0] 30566 if x0.Op != OpS390XMOVWBRloadidx { 30567 break 30568 } 30569 i0 := x0.AuxInt 30570 if x0.Aux != s { 30571 break 30572 } 30573 _ = x0.Args[2] 30574 if idx != x0.Args[0] { 30575 break 30576 } 30577 if p != x0.Args[1] { 30578 break 30579 } 30580 if mem != x0.Args[2] { 30581 break 30582 } 30583 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)) { 30584 break 30585 } 30586 b = mergePoint(b, x0, x1) 30587 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30588 v.reset(OpCopy) 30589 v.AddArg(v0) 30590 v0.AuxInt = i0 30591 v0.Aux = s 30592 v0.AddArg(p) 30593 v0.AddArg(idx) 30594 v0.AddArg(mem) 30595 return true 30596 } 30597 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 30598 // 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) 30599 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30600 for { 30601 _ = v.Args[1] 30602 sh := v.Args[0] 30603 if sh.Op != OpS390XSLDconst { 30604 break 30605 } 30606 if sh.AuxInt != 32 { 30607 break 30608 } 30609 r1 := sh.Args[0] 30610 if r1.Op != OpS390XMOVWZreg { 30611 break 30612 } 30613 x1 := r1.Args[0] 30614 if x1.Op != OpS390XMOVWBRloadidx { 30615 break 30616 } 30617 i1 := x1.AuxInt 30618 s := x1.Aux 30619 _ = x1.Args[2] 30620 idx := x1.Args[0] 30621 p := x1.Args[1] 30622 mem := x1.Args[2] 30623 r0 := v.Args[1] 30624 if r0.Op != OpS390XMOVWZreg { 30625 break 30626 } 30627 x0 := r0.Args[0] 30628 if x0.Op != OpS390XMOVWBRloadidx { 30629 break 30630 } 30631 i0 := x0.AuxInt 30632 if x0.Aux != s { 30633 break 30634 } 30635 _ = x0.Args[2] 30636 if idx != x0.Args[0] { 30637 break 30638 } 30639 if p != x0.Args[1] { 30640 break 30641 } 30642 if mem != x0.Args[2] { 30643 break 30644 } 30645 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)) { 30646 break 30647 } 30648 b = mergePoint(b, x0, x1) 30649 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30650 v.reset(OpCopy) 30651 v.AddArg(v0) 30652 v0.AuxInt = i0 30653 v0.Aux = s 30654 v0.AddArg(p) 30655 v0.AddArg(idx) 30656 v0.AddArg(mem) 30657 return true 30658 } 30659 // 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)) 30660 // 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) 30661 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30662 for { 30663 _ = v.Args[1] 30664 s1 := v.Args[0] 30665 if s1.Op != OpS390XSLDconst { 30666 break 30667 } 30668 j1 := s1.AuxInt 30669 x1 := s1.Args[0] 30670 if x1.Op != OpS390XMOVBZloadidx { 30671 break 30672 } 30673 i1 := x1.AuxInt 30674 s := x1.Aux 30675 _ = x1.Args[2] 30676 p := x1.Args[0] 30677 idx := x1.Args[1] 30678 mem := x1.Args[2] 30679 or := v.Args[1] 30680 if or.Op != OpS390XOR { 30681 break 30682 } 30683 _ = or.Args[1] 30684 s0 := or.Args[0] 30685 if s0.Op != OpS390XSLDconst { 30686 break 30687 } 30688 j0 := s0.AuxInt 30689 x0 := s0.Args[0] 30690 if x0.Op != OpS390XMOVBZloadidx { 30691 break 30692 } 30693 i0 := x0.AuxInt 30694 if x0.Aux != s { 30695 break 30696 } 30697 _ = x0.Args[2] 30698 if p != x0.Args[0] { 30699 break 30700 } 30701 if idx != x0.Args[1] { 30702 break 30703 } 30704 if mem != x0.Args[2] { 30705 break 30706 } 30707 y := or.Args[1] 30708 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)) { 30709 break 30710 } 30711 b = mergePoint(b, x0, x1) 30712 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30713 v.reset(OpCopy) 30714 v.AddArg(v0) 30715 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30716 v1.AuxInt = j0 30717 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30718 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30719 v3.AuxInt = i0 30720 v3.Aux = s 30721 v3.AddArg(p) 30722 v3.AddArg(idx) 30723 v3.AddArg(mem) 30724 v2.AddArg(v3) 30725 v1.AddArg(v2) 30726 v0.AddArg(v1) 30727 v0.AddArg(y) 30728 return true 30729 } 30730 // 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)) 30731 // 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) 30732 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30733 for { 30734 _ = v.Args[1] 30735 s1 := v.Args[0] 30736 if s1.Op != OpS390XSLDconst { 30737 break 30738 } 30739 j1 := s1.AuxInt 30740 x1 := s1.Args[0] 30741 if x1.Op != OpS390XMOVBZloadidx { 30742 break 30743 } 30744 i1 := x1.AuxInt 30745 s := x1.Aux 30746 _ = x1.Args[2] 30747 idx := x1.Args[0] 30748 p := x1.Args[1] 30749 mem := x1.Args[2] 30750 or := v.Args[1] 30751 if or.Op != OpS390XOR { 30752 break 30753 } 30754 _ = or.Args[1] 30755 s0 := or.Args[0] 30756 if s0.Op != OpS390XSLDconst { 30757 break 30758 } 30759 j0 := s0.AuxInt 30760 x0 := s0.Args[0] 30761 if x0.Op != OpS390XMOVBZloadidx { 30762 break 30763 } 30764 i0 := x0.AuxInt 30765 if x0.Aux != s { 30766 break 30767 } 30768 _ = x0.Args[2] 30769 if p != x0.Args[0] { 30770 break 30771 } 30772 if idx != x0.Args[1] { 30773 break 30774 } 30775 if mem != x0.Args[2] { 30776 break 30777 } 30778 y := or.Args[1] 30779 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)) { 30780 break 30781 } 30782 b = mergePoint(b, x0, x1) 30783 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30784 v.reset(OpCopy) 30785 v.AddArg(v0) 30786 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30787 v1.AuxInt = j0 30788 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30789 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30790 v3.AuxInt = i0 30791 v3.Aux = s 30792 v3.AddArg(p) 30793 v3.AddArg(idx) 30794 v3.AddArg(mem) 30795 v2.AddArg(v3) 30796 v1.AddArg(v2) 30797 v0.AddArg(v1) 30798 v0.AddArg(y) 30799 return true 30800 } 30801 // 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)) 30802 // 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) 30803 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30804 for { 30805 _ = v.Args[1] 30806 s1 := v.Args[0] 30807 if s1.Op != OpS390XSLDconst { 30808 break 30809 } 30810 j1 := s1.AuxInt 30811 x1 := s1.Args[0] 30812 if x1.Op != OpS390XMOVBZloadidx { 30813 break 30814 } 30815 i1 := x1.AuxInt 30816 s := x1.Aux 30817 _ = x1.Args[2] 30818 p := x1.Args[0] 30819 idx := x1.Args[1] 30820 mem := x1.Args[2] 30821 or := v.Args[1] 30822 if or.Op != OpS390XOR { 30823 break 30824 } 30825 _ = or.Args[1] 30826 s0 := or.Args[0] 30827 if s0.Op != OpS390XSLDconst { 30828 break 30829 } 30830 j0 := s0.AuxInt 30831 x0 := s0.Args[0] 30832 if x0.Op != OpS390XMOVBZloadidx { 30833 break 30834 } 30835 i0 := x0.AuxInt 30836 if x0.Aux != s { 30837 break 30838 } 30839 _ = x0.Args[2] 30840 if idx != x0.Args[0] { 30841 break 30842 } 30843 if p != x0.Args[1] { 30844 break 30845 } 30846 if mem != x0.Args[2] { 30847 break 30848 } 30849 y := or.Args[1] 30850 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)) { 30851 break 30852 } 30853 b = mergePoint(b, x0, x1) 30854 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30855 v.reset(OpCopy) 30856 v.AddArg(v0) 30857 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30858 v1.AuxInt = j0 30859 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30860 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30861 v3.AuxInt = i0 30862 v3.Aux = s 30863 v3.AddArg(p) 30864 v3.AddArg(idx) 30865 v3.AddArg(mem) 30866 v2.AddArg(v3) 30867 v1.AddArg(v2) 30868 v0.AddArg(v1) 30869 v0.AddArg(y) 30870 return true 30871 } 30872 // 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)) 30873 // 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) 30874 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30875 for { 30876 _ = v.Args[1] 30877 s1 := v.Args[0] 30878 if s1.Op != OpS390XSLDconst { 30879 break 30880 } 30881 j1 := s1.AuxInt 30882 x1 := s1.Args[0] 30883 if x1.Op != OpS390XMOVBZloadidx { 30884 break 30885 } 30886 i1 := x1.AuxInt 30887 s := x1.Aux 30888 _ = x1.Args[2] 30889 idx := x1.Args[0] 30890 p := x1.Args[1] 30891 mem := x1.Args[2] 30892 or := v.Args[1] 30893 if or.Op != OpS390XOR { 30894 break 30895 } 30896 _ = or.Args[1] 30897 s0 := or.Args[0] 30898 if s0.Op != OpS390XSLDconst { 30899 break 30900 } 30901 j0 := s0.AuxInt 30902 x0 := s0.Args[0] 30903 if x0.Op != OpS390XMOVBZloadidx { 30904 break 30905 } 30906 i0 := x0.AuxInt 30907 if x0.Aux != s { 30908 break 30909 } 30910 _ = x0.Args[2] 30911 if idx != x0.Args[0] { 30912 break 30913 } 30914 if p != x0.Args[1] { 30915 break 30916 } 30917 if mem != x0.Args[2] { 30918 break 30919 } 30920 y := or.Args[1] 30921 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)) { 30922 break 30923 } 30924 b = mergePoint(b, x0, x1) 30925 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30926 v.reset(OpCopy) 30927 v.AddArg(v0) 30928 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30929 v1.AuxInt = j0 30930 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30931 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30932 v3.AuxInt = i0 30933 v3.Aux = s 30934 v3.AddArg(p) 30935 v3.AddArg(idx) 30936 v3.AddArg(mem) 30937 v2.AddArg(v3) 30938 v1.AddArg(v2) 30939 v0.AddArg(v1) 30940 v0.AddArg(y) 30941 return true 30942 } 30943 // 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)))) 30944 // 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) 30945 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30946 for { 30947 _ = v.Args[1] 30948 s1 := v.Args[0] 30949 if s1.Op != OpS390XSLDconst { 30950 break 30951 } 30952 j1 := s1.AuxInt 30953 x1 := s1.Args[0] 30954 if x1.Op != OpS390XMOVBZloadidx { 30955 break 30956 } 30957 i1 := x1.AuxInt 30958 s := x1.Aux 30959 _ = x1.Args[2] 30960 p := x1.Args[0] 30961 idx := x1.Args[1] 30962 mem := x1.Args[2] 30963 or := v.Args[1] 30964 if or.Op != OpS390XOR { 30965 break 30966 } 30967 _ = or.Args[1] 30968 y := or.Args[0] 30969 s0 := or.Args[1] 30970 if s0.Op != OpS390XSLDconst { 30971 break 30972 } 30973 j0 := s0.AuxInt 30974 x0 := s0.Args[0] 30975 if x0.Op != OpS390XMOVBZloadidx { 30976 break 30977 } 30978 i0 := x0.AuxInt 30979 if x0.Aux != s { 30980 break 30981 } 30982 _ = x0.Args[2] 30983 if p != x0.Args[0] { 30984 break 30985 } 30986 if idx != x0.Args[1] { 30987 break 30988 } 30989 if mem != x0.Args[2] { 30990 break 30991 } 30992 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)) { 30993 break 30994 } 30995 b = mergePoint(b, x0, x1) 30996 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30997 v.reset(OpCopy) 30998 v.AddArg(v0) 30999 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31000 v1.AuxInt = j0 31001 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31002 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31003 v3.AuxInt = i0 31004 v3.Aux = s 31005 v3.AddArg(p) 31006 v3.AddArg(idx) 31007 v3.AddArg(mem) 31008 v2.AddArg(v3) 31009 v1.AddArg(v2) 31010 v0.AddArg(v1) 31011 v0.AddArg(y) 31012 return true 31013 } 31014 return false 31015 } 31016 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 31017 b := v.Block 31018 _ = b 31019 typ := &b.Func.Config.Types 31020 _ = typ 31021 // 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)))) 31022 // 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) 31023 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31024 for { 31025 _ = v.Args[1] 31026 s1 := v.Args[0] 31027 if s1.Op != OpS390XSLDconst { 31028 break 31029 } 31030 j1 := s1.AuxInt 31031 x1 := s1.Args[0] 31032 if x1.Op != OpS390XMOVBZloadidx { 31033 break 31034 } 31035 i1 := x1.AuxInt 31036 s := x1.Aux 31037 _ = x1.Args[2] 31038 idx := x1.Args[0] 31039 p := x1.Args[1] 31040 mem := x1.Args[2] 31041 or := v.Args[1] 31042 if or.Op != OpS390XOR { 31043 break 31044 } 31045 _ = or.Args[1] 31046 y := or.Args[0] 31047 s0 := or.Args[1] 31048 if s0.Op != OpS390XSLDconst { 31049 break 31050 } 31051 j0 := s0.AuxInt 31052 x0 := s0.Args[0] 31053 if x0.Op != OpS390XMOVBZloadidx { 31054 break 31055 } 31056 i0 := x0.AuxInt 31057 if x0.Aux != s { 31058 break 31059 } 31060 _ = x0.Args[2] 31061 if p != x0.Args[0] { 31062 break 31063 } 31064 if idx != x0.Args[1] { 31065 break 31066 } 31067 if mem != x0.Args[2] { 31068 break 31069 } 31070 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)) { 31071 break 31072 } 31073 b = mergePoint(b, x0, x1) 31074 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31075 v.reset(OpCopy) 31076 v.AddArg(v0) 31077 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31078 v1.AuxInt = j0 31079 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31080 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31081 v3.AuxInt = i0 31082 v3.Aux = s 31083 v3.AddArg(p) 31084 v3.AddArg(idx) 31085 v3.AddArg(mem) 31086 v2.AddArg(v3) 31087 v1.AddArg(v2) 31088 v0.AddArg(v1) 31089 v0.AddArg(y) 31090 return true 31091 } 31092 // 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)))) 31093 // 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) 31094 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31095 for { 31096 _ = v.Args[1] 31097 s1 := v.Args[0] 31098 if s1.Op != OpS390XSLDconst { 31099 break 31100 } 31101 j1 := s1.AuxInt 31102 x1 := s1.Args[0] 31103 if x1.Op != OpS390XMOVBZloadidx { 31104 break 31105 } 31106 i1 := x1.AuxInt 31107 s := x1.Aux 31108 _ = x1.Args[2] 31109 p := x1.Args[0] 31110 idx := x1.Args[1] 31111 mem := x1.Args[2] 31112 or := v.Args[1] 31113 if or.Op != OpS390XOR { 31114 break 31115 } 31116 _ = or.Args[1] 31117 y := or.Args[0] 31118 s0 := or.Args[1] 31119 if s0.Op != OpS390XSLDconst { 31120 break 31121 } 31122 j0 := s0.AuxInt 31123 x0 := s0.Args[0] 31124 if x0.Op != OpS390XMOVBZloadidx { 31125 break 31126 } 31127 i0 := x0.AuxInt 31128 if x0.Aux != s { 31129 break 31130 } 31131 _ = x0.Args[2] 31132 if idx != x0.Args[0] { 31133 break 31134 } 31135 if p != x0.Args[1] { 31136 break 31137 } 31138 if mem != x0.Args[2] { 31139 break 31140 } 31141 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)) { 31142 break 31143 } 31144 b = mergePoint(b, x0, x1) 31145 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31146 v.reset(OpCopy) 31147 v.AddArg(v0) 31148 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31149 v1.AuxInt = j0 31150 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31151 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31152 v3.AuxInt = i0 31153 v3.Aux = s 31154 v3.AddArg(p) 31155 v3.AddArg(idx) 31156 v3.AddArg(mem) 31157 v2.AddArg(v3) 31158 v1.AddArg(v2) 31159 v0.AddArg(v1) 31160 v0.AddArg(y) 31161 return true 31162 } 31163 // 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)))) 31164 // 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) 31165 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31166 for { 31167 _ = v.Args[1] 31168 s1 := v.Args[0] 31169 if s1.Op != OpS390XSLDconst { 31170 break 31171 } 31172 j1 := s1.AuxInt 31173 x1 := s1.Args[0] 31174 if x1.Op != OpS390XMOVBZloadidx { 31175 break 31176 } 31177 i1 := x1.AuxInt 31178 s := x1.Aux 31179 _ = x1.Args[2] 31180 idx := x1.Args[0] 31181 p := x1.Args[1] 31182 mem := x1.Args[2] 31183 or := v.Args[1] 31184 if or.Op != OpS390XOR { 31185 break 31186 } 31187 _ = or.Args[1] 31188 y := or.Args[0] 31189 s0 := or.Args[1] 31190 if s0.Op != OpS390XSLDconst { 31191 break 31192 } 31193 j0 := s0.AuxInt 31194 x0 := s0.Args[0] 31195 if x0.Op != OpS390XMOVBZloadidx { 31196 break 31197 } 31198 i0 := x0.AuxInt 31199 if x0.Aux != s { 31200 break 31201 } 31202 _ = x0.Args[2] 31203 if idx != x0.Args[0] { 31204 break 31205 } 31206 if p != x0.Args[1] { 31207 break 31208 } 31209 if mem != x0.Args[2] { 31210 break 31211 } 31212 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)) { 31213 break 31214 } 31215 b = mergePoint(b, x0, x1) 31216 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31217 v.reset(OpCopy) 31218 v.AddArg(v0) 31219 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31220 v1.AuxInt = j0 31221 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31222 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31223 v3.AuxInt = i0 31224 v3.Aux = s 31225 v3.AddArg(p) 31226 v3.AddArg(idx) 31227 v3.AddArg(mem) 31228 v2.AddArg(v3) 31229 v1.AddArg(v2) 31230 v0.AddArg(v1) 31231 v0.AddArg(y) 31232 return true 31233 } 31234 // 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))) 31235 // 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) 31236 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31237 for { 31238 _ = v.Args[1] 31239 or := v.Args[0] 31240 if or.Op != OpS390XOR { 31241 break 31242 } 31243 _ = or.Args[1] 31244 s0 := or.Args[0] 31245 if s0.Op != OpS390XSLDconst { 31246 break 31247 } 31248 j0 := s0.AuxInt 31249 x0 := s0.Args[0] 31250 if x0.Op != OpS390XMOVBZloadidx { 31251 break 31252 } 31253 i0 := x0.AuxInt 31254 s := x0.Aux 31255 _ = x0.Args[2] 31256 p := x0.Args[0] 31257 idx := x0.Args[1] 31258 mem := x0.Args[2] 31259 y := or.Args[1] 31260 s1 := v.Args[1] 31261 if s1.Op != OpS390XSLDconst { 31262 break 31263 } 31264 j1 := s1.AuxInt 31265 x1 := s1.Args[0] 31266 if x1.Op != OpS390XMOVBZloadidx { 31267 break 31268 } 31269 i1 := x1.AuxInt 31270 if x1.Aux != s { 31271 break 31272 } 31273 _ = x1.Args[2] 31274 if p != x1.Args[0] { 31275 break 31276 } 31277 if idx != x1.Args[1] { 31278 break 31279 } 31280 if mem != x1.Args[2] { 31281 break 31282 } 31283 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)) { 31284 break 31285 } 31286 b = mergePoint(b, x0, x1) 31287 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31288 v.reset(OpCopy) 31289 v.AddArg(v0) 31290 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31291 v1.AuxInt = j0 31292 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31293 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31294 v3.AuxInt = i0 31295 v3.Aux = s 31296 v3.AddArg(p) 31297 v3.AddArg(idx) 31298 v3.AddArg(mem) 31299 v2.AddArg(v3) 31300 v1.AddArg(v2) 31301 v0.AddArg(v1) 31302 v0.AddArg(y) 31303 return true 31304 } 31305 // 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))) 31306 // 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) 31307 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31308 for { 31309 _ = v.Args[1] 31310 or := v.Args[0] 31311 if or.Op != OpS390XOR { 31312 break 31313 } 31314 _ = or.Args[1] 31315 s0 := or.Args[0] 31316 if s0.Op != OpS390XSLDconst { 31317 break 31318 } 31319 j0 := s0.AuxInt 31320 x0 := s0.Args[0] 31321 if x0.Op != OpS390XMOVBZloadidx { 31322 break 31323 } 31324 i0 := x0.AuxInt 31325 s := x0.Aux 31326 _ = x0.Args[2] 31327 idx := x0.Args[0] 31328 p := x0.Args[1] 31329 mem := x0.Args[2] 31330 y := or.Args[1] 31331 s1 := v.Args[1] 31332 if s1.Op != OpS390XSLDconst { 31333 break 31334 } 31335 j1 := s1.AuxInt 31336 x1 := s1.Args[0] 31337 if x1.Op != OpS390XMOVBZloadidx { 31338 break 31339 } 31340 i1 := x1.AuxInt 31341 if x1.Aux != s { 31342 break 31343 } 31344 _ = x1.Args[2] 31345 if p != x1.Args[0] { 31346 break 31347 } 31348 if idx != x1.Args[1] { 31349 break 31350 } 31351 if mem != x1.Args[2] { 31352 break 31353 } 31354 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)) { 31355 break 31356 } 31357 b = mergePoint(b, x0, x1) 31358 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31359 v.reset(OpCopy) 31360 v.AddArg(v0) 31361 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31362 v1.AuxInt = j0 31363 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31364 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31365 v3.AuxInt = i0 31366 v3.Aux = s 31367 v3.AddArg(p) 31368 v3.AddArg(idx) 31369 v3.AddArg(mem) 31370 v2.AddArg(v3) 31371 v1.AddArg(v2) 31372 v0.AddArg(v1) 31373 v0.AddArg(y) 31374 return true 31375 } 31376 // 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))) 31377 // 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) 31378 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31379 for { 31380 _ = v.Args[1] 31381 or := v.Args[0] 31382 if or.Op != OpS390XOR { 31383 break 31384 } 31385 _ = or.Args[1] 31386 y := or.Args[0] 31387 s0 := or.Args[1] 31388 if s0.Op != OpS390XSLDconst { 31389 break 31390 } 31391 j0 := s0.AuxInt 31392 x0 := s0.Args[0] 31393 if x0.Op != OpS390XMOVBZloadidx { 31394 break 31395 } 31396 i0 := x0.AuxInt 31397 s := x0.Aux 31398 _ = x0.Args[2] 31399 p := x0.Args[0] 31400 idx := x0.Args[1] 31401 mem := x0.Args[2] 31402 s1 := v.Args[1] 31403 if s1.Op != OpS390XSLDconst { 31404 break 31405 } 31406 j1 := s1.AuxInt 31407 x1 := s1.Args[0] 31408 if x1.Op != OpS390XMOVBZloadidx { 31409 break 31410 } 31411 i1 := x1.AuxInt 31412 if x1.Aux != s { 31413 break 31414 } 31415 _ = x1.Args[2] 31416 if p != x1.Args[0] { 31417 break 31418 } 31419 if idx != x1.Args[1] { 31420 break 31421 } 31422 if mem != x1.Args[2] { 31423 break 31424 } 31425 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)) { 31426 break 31427 } 31428 b = mergePoint(b, x0, x1) 31429 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31430 v.reset(OpCopy) 31431 v.AddArg(v0) 31432 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31433 v1.AuxInt = j0 31434 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31435 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31436 v3.AuxInt = i0 31437 v3.Aux = s 31438 v3.AddArg(p) 31439 v3.AddArg(idx) 31440 v3.AddArg(mem) 31441 v2.AddArg(v3) 31442 v1.AddArg(v2) 31443 v0.AddArg(v1) 31444 v0.AddArg(y) 31445 return true 31446 } 31447 // 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))) 31448 // 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) 31449 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31450 for { 31451 _ = v.Args[1] 31452 or := v.Args[0] 31453 if or.Op != OpS390XOR { 31454 break 31455 } 31456 _ = or.Args[1] 31457 y := or.Args[0] 31458 s0 := or.Args[1] 31459 if s0.Op != OpS390XSLDconst { 31460 break 31461 } 31462 j0 := s0.AuxInt 31463 x0 := s0.Args[0] 31464 if x0.Op != OpS390XMOVBZloadidx { 31465 break 31466 } 31467 i0 := x0.AuxInt 31468 s := x0.Aux 31469 _ = x0.Args[2] 31470 idx := x0.Args[0] 31471 p := x0.Args[1] 31472 mem := x0.Args[2] 31473 s1 := v.Args[1] 31474 if s1.Op != OpS390XSLDconst { 31475 break 31476 } 31477 j1 := s1.AuxInt 31478 x1 := s1.Args[0] 31479 if x1.Op != OpS390XMOVBZloadidx { 31480 break 31481 } 31482 i1 := x1.AuxInt 31483 if x1.Aux != s { 31484 break 31485 } 31486 _ = x1.Args[2] 31487 if p != x1.Args[0] { 31488 break 31489 } 31490 if idx != x1.Args[1] { 31491 break 31492 } 31493 if mem != x1.Args[2] { 31494 break 31495 } 31496 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)) { 31497 break 31498 } 31499 b = mergePoint(b, x0, x1) 31500 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31501 v.reset(OpCopy) 31502 v.AddArg(v0) 31503 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31504 v1.AuxInt = j0 31505 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31506 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31507 v3.AuxInt = i0 31508 v3.Aux = s 31509 v3.AddArg(p) 31510 v3.AddArg(idx) 31511 v3.AddArg(mem) 31512 v2.AddArg(v3) 31513 v1.AddArg(v2) 31514 v0.AddArg(v1) 31515 v0.AddArg(y) 31516 return true 31517 } 31518 // 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))) 31519 // 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) 31520 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31521 for { 31522 _ = v.Args[1] 31523 or := v.Args[0] 31524 if or.Op != OpS390XOR { 31525 break 31526 } 31527 _ = or.Args[1] 31528 s0 := or.Args[0] 31529 if s0.Op != OpS390XSLDconst { 31530 break 31531 } 31532 j0 := s0.AuxInt 31533 x0 := s0.Args[0] 31534 if x0.Op != OpS390XMOVBZloadidx { 31535 break 31536 } 31537 i0 := x0.AuxInt 31538 s := x0.Aux 31539 _ = x0.Args[2] 31540 p := x0.Args[0] 31541 idx := x0.Args[1] 31542 mem := x0.Args[2] 31543 y := or.Args[1] 31544 s1 := v.Args[1] 31545 if s1.Op != OpS390XSLDconst { 31546 break 31547 } 31548 j1 := s1.AuxInt 31549 x1 := s1.Args[0] 31550 if x1.Op != OpS390XMOVBZloadidx { 31551 break 31552 } 31553 i1 := x1.AuxInt 31554 if x1.Aux != s { 31555 break 31556 } 31557 _ = x1.Args[2] 31558 if idx != x1.Args[0] { 31559 break 31560 } 31561 if p != x1.Args[1] { 31562 break 31563 } 31564 if mem != x1.Args[2] { 31565 break 31566 } 31567 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)) { 31568 break 31569 } 31570 b = mergePoint(b, x0, x1) 31571 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31572 v.reset(OpCopy) 31573 v.AddArg(v0) 31574 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31575 v1.AuxInt = j0 31576 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31577 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31578 v3.AuxInt = i0 31579 v3.Aux = s 31580 v3.AddArg(p) 31581 v3.AddArg(idx) 31582 v3.AddArg(mem) 31583 v2.AddArg(v3) 31584 v1.AddArg(v2) 31585 v0.AddArg(v1) 31586 v0.AddArg(y) 31587 return true 31588 } 31589 // 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))) 31590 // 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) 31591 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31592 for { 31593 _ = v.Args[1] 31594 or := v.Args[0] 31595 if or.Op != OpS390XOR { 31596 break 31597 } 31598 _ = or.Args[1] 31599 s0 := or.Args[0] 31600 if s0.Op != OpS390XSLDconst { 31601 break 31602 } 31603 j0 := s0.AuxInt 31604 x0 := s0.Args[0] 31605 if x0.Op != OpS390XMOVBZloadidx { 31606 break 31607 } 31608 i0 := x0.AuxInt 31609 s := x0.Aux 31610 _ = x0.Args[2] 31611 idx := x0.Args[0] 31612 p := x0.Args[1] 31613 mem := x0.Args[2] 31614 y := or.Args[1] 31615 s1 := v.Args[1] 31616 if s1.Op != OpS390XSLDconst { 31617 break 31618 } 31619 j1 := s1.AuxInt 31620 x1 := s1.Args[0] 31621 if x1.Op != OpS390XMOVBZloadidx { 31622 break 31623 } 31624 i1 := x1.AuxInt 31625 if x1.Aux != s { 31626 break 31627 } 31628 _ = x1.Args[2] 31629 if idx != x1.Args[0] { 31630 break 31631 } 31632 if p != x1.Args[1] { 31633 break 31634 } 31635 if mem != x1.Args[2] { 31636 break 31637 } 31638 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)) { 31639 break 31640 } 31641 b = mergePoint(b, x0, x1) 31642 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31643 v.reset(OpCopy) 31644 v.AddArg(v0) 31645 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31646 v1.AuxInt = j0 31647 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31648 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31649 v3.AuxInt = i0 31650 v3.Aux = s 31651 v3.AddArg(p) 31652 v3.AddArg(idx) 31653 v3.AddArg(mem) 31654 v2.AddArg(v3) 31655 v1.AddArg(v2) 31656 v0.AddArg(v1) 31657 v0.AddArg(y) 31658 return true 31659 } 31660 // 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))) 31661 // 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) 31662 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31663 for { 31664 _ = v.Args[1] 31665 or := v.Args[0] 31666 if or.Op != OpS390XOR { 31667 break 31668 } 31669 _ = or.Args[1] 31670 y := or.Args[0] 31671 s0 := or.Args[1] 31672 if s0.Op != OpS390XSLDconst { 31673 break 31674 } 31675 j0 := s0.AuxInt 31676 x0 := s0.Args[0] 31677 if x0.Op != OpS390XMOVBZloadidx { 31678 break 31679 } 31680 i0 := x0.AuxInt 31681 s := x0.Aux 31682 _ = x0.Args[2] 31683 p := x0.Args[0] 31684 idx := x0.Args[1] 31685 mem := x0.Args[2] 31686 s1 := v.Args[1] 31687 if s1.Op != OpS390XSLDconst { 31688 break 31689 } 31690 j1 := s1.AuxInt 31691 x1 := s1.Args[0] 31692 if x1.Op != OpS390XMOVBZloadidx { 31693 break 31694 } 31695 i1 := x1.AuxInt 31696 if x1.Aux != s { 31697 break 31698 } 31699 _ = x1.Args[2] 31700 if idx != x1.Args[0] { 31701 break 31702 } 31703 if p != x1.Args[1] { 31704 break 31705 } 31706 if mem != x1.Args[2] { 31707 break 31708 } 31709 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)) { 31710 break 31711 } 31712 b = mergePoint(b, x0, x1) 31713 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31714 v.reset(OpCopy) 31715 v.AddArg(v0) 31716 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31717 v1.AuxInt = j0 31718 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31719 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31720 v3.AuxInt = i0 31721 v3.Aux = s 31722 v3.AddArg(p) 31723 v3.AddArg(idx) 31724 v3.AddArg(mem) 31725 v2.AddArg(v3) 31726 v1.AddArg(v2) 31727 v0.AddArg(v1) 31728 v0.AddArg(y) 31729 return true 31730 } 31731 return false 31732 } 31733 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 31734 b := v.Block 31735 _ = b 31736 typ := &b.Func.Config.Types 31737 _ = typ 31738 // 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))) 31739 // 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) 31740 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31741 for { 31742 _ = v.Args[1] 31743 or := v.Args[0] 31744 if or.Op != OpS390XOR { 31745 break 31746 } 31747 _ = or.Args[1] 31748 y := or.Args[0] 31749 s0 := or.Args[1] 31750 if s0.Op != OpS390XSLDconst { 31751 break 31752 } 31753 j0 := s0.AuxInt 31754 x0 := s0.Args[0] 31755 if x0.Op != OpS390XMOVBZloadidx { 31756 break 31757 } 31758 i0 := x0.AuxInt 31759 s := x0.Aux 31760 _ = x0.Args[2] 31761 idx := x0.Args[0] 31762 p := x0.Args[1] 31763 mem := x0.Args[2] 31764 s1 := v.Args[1] 31765 if s1.Op != OpS390XSLDconst { 31766 break 31767 } 31768 j1 := s1.AuxInt 31769 x1 := s1.Args[0] 31770 if x1.Op != OpS390XMOVBZloadidx { 31771 break 31772 } 31773 i1 := x1.AuxInt 31774 if x1.Aux != s { 31775 break 31776 } 31777 _ = x1.Args[2] 31778 if idx != x1.Args[0] { 31779 break 31780 } 31781 if p != x1.Args[1] { 31782 break 31783 } 31784 if mem != x1.Args[2] { 31785 break 31786 } 31787 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)) { 31788 break 31789 } 31790 b = mergePoint(b, x0, x1) 31791 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31792 v.reset(OpCopy) 31793 v.AddArg(v0) 31794 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31795 v1.AuxInt = j0 31796 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31797 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31798 v3.AuxInt = i0 31799 v3.Aux = s 31800 v3.AddArg(p) 31801 v3.AddArg(idx) 31802 v3.AddArg(mem) 31803 v2.AddArg(v3) 31804 v1.AddArg(v2) 31805 v0.AddArg(v1) 31806 v0.AddArg(y) 31807 return true 31808 } 31809 // 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)) 31810 // 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) 31811 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31812 for { 31813 _ = v.Args[1] 31814 s1 := v.Args[0] 31815 if s1.Op != OpS390XSLDconst { 31816 break 31817 } 31818 j1 := s1.AuxInt 31819 r1 := s1.Args[0] 31820 if r1.Op != OpS390XMOVHZreg { 31821 break 31822 } 31823 x1 := r1.Args[0] 31824 if x1.Op != OpS390XMOVHBRloadidx { 31825 break 31826 } 31827 i1 := x1.AuxInt 31828 s := x1.Aux 31829 _ = x1.Args[2] 31830 p := x1.Args[0] 31831 idx := x1.Args[1] 31832 mem := x1.Args[2] 31833 or := v.Args[1] 31834 if or.Op != OpS390XOR { 31835 break 31836 } 31837 _ = or.Args[1] 31838 s0 := or.Args[0] 31839 if s0.Op != OpS390XSLDconst { 31840 break 31841 } 31842 j0 := s0.AuxInt 31843 r0 := s0.Args[0] 31844 if r0.Op != OpS390XMOVHZreg { 31845 break 31846 } 31847 x0 := r0.Args[0] 31848 if x0.Op != OpS390XMOVHBRloadidx { 31849 break 31850 } 31851 i0 := x0.AuxInt 31852 if x0.Aux != s { 31853 break 31854 } 31855 _ = x0.Args[2] 31856 if p != x0.Args[0] { 31857 break 31858 } 31859 if idx != x0.Args[1] { 31860 break 31861 } 31862 if mem != x0.Args[2] { 31863 break 31864 } 31865 y := or.Args[1] 31866 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)) { 31867 break 31868 } 31869 b = mergePoint(b, x0, x1) 31870 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31871 v.reset(OpCopy) 31872 v.AddArg(v0) 31873 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31874 v1.AuxInt = j0 31875 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31876 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31877 v3.AuxInt = i0 31878 v3.Aux = s 31879 v3.AddArg(p) 31880 v3.AddArg(idx) 31881 v3.AddArg(mem) 31882 v2.AddArg(v3) 31883 v1.AddArg(v2) 31884 v0.AddArg(v1) 31885 v0.AddArg(y) 31886 return true 31887 } 31888 // 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)) 31889 // 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) 31890 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31891 for { 31892 _ = v.Args[1] 31893 s1 := v.Args[0] 31894 if s1.Op != OpS390XSLDconst { 31895 break 31896 } 31897 j1 := s1.AuxInt 31898 r1 := s1.Args[0] 31899 if r1.Op != OpS390XMOVHZreg { 31900 break 31901 } 31902 x1 := r1.Args[0] 31903 if x1.Op != OpS390XMOVHBRloadidx { 31904 break 31905 } 31906 i1 := x1.AuxInt 31907 s := x1.Aux 31908 _ = x1.Args[2] 31909 idx := x1.Args[0] 31910 p := x1.Args[1] 31911 mem := x1.Args[2] 31912 or := v.Args[1] 31913 if or.Op != OpS390XOR { 31914 break 31915 } 31916 _ = or.Args[1] 31917 s0 := or.Args[0] 31918 if s0.Op != OpS390XSLDconst { 31919 break 31920 } 31921 j0 := s0.AuxInt 31922 r0 := s0.Args[0] 31923 if r0.Op != OpS390XMOVHZreg { 31924 break 31925 } 31926 x0 := r0.Args[0] 31927 if x0.Op != OpS390XMOVHBRloadidx { 31928 break 31929 } 31930 i0 := x0.AuxInt 31931 if x0.Aux != s { 31932 break 31933 } 31934 _ = x0.Args[2] 31935 if p != x0.Args[0] { 31936 break 31937 } 31938 if idx != x0.Args[1] { 31939 break 31940 } 31941 if mem != x0.Args[2] { 31942 break 31943 } 31944 y := or.Args[1] 31945 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)) { 31946 break 31947 } 31948 b = mergePoint(b, x0, x1) 31949 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31950 v.reset(OpCopy) 31951 v.AddArg(v0) 31952 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31953 v1.AuxInt = j0 31954 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31955 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31956 v3.AuxInt = i0 31957 v3.Aux = s 31958 v3.AddArg(p) 31959 v3.AddArg(idx) 31960 v3.AddArg(mem) 31961 v2.AddArg(v3) 31962 v1.AddArg(v2) 31963 v0.AddArg(v1) 31964 v0.AddArg(y) 31965 return true 31966 } 31967 // 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)) 31968 // 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) 31969 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31970 for { 31971 _ = v.Args[1] 31972 s1 := v.Args[0] 31973 if s1.Op != OpS390XSLDconst { 31974 break 31975 } 31976 j1 := s1.AuxInt 31977 r1 := s1.Args[0] 31978 if r1.Op != OpS390XMOVHZreg { 31979 break 31980 } 31981 x1 := r1.Args[0] 31982 if x1.Op != OpS390XMOVHBRloadidx { 31983 break 31984 } 31985 i1 := x1.AuxInt 31986 s := x1.Aux 31987 _ = x1.Args[2] 31988 p := x1.Args[0] 31989 idx := x1.Args[1] 31990 mem := x1.Args[2] 31991 or := v.Args[1] 31992 if or.Op != OpS390XOR { 31993 break 31994 } 31995 _ = or.Args[1] 31996 s0 := or.Args[0] 31997 if s0.Op != OpS390XSLDconst { 31998 break 31999 } 32000 j0 := s0.AuxInt 32001 r0 := s0.Args[0] 32002 if r0.Op != OpS390XMOVHZreg { 32003 break 32004 } 32005 x0 := r0.Args[0] 32006 if x0.Op != OpS390XMOVHBRloadidx { 32007 break 32008 } 32009 i0 := x0.AuxInt 32010 if x0.Aux != s { 32011 break 32012 } 32013 _ = x0.Args[2] 32014 if idx != x0.Args[0] { 32015 break 32016 } 32017 if p != x0.Args[1] { 32018 break 32019 } 32020 if mem != x0.Args[2] { 32021 break 32022 } 32023 y := or.Args[1] 32024 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)) { 32025 break 32026 } 32027 b = mergePoint(b, x0, x1) 32028 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32029 v.reset(OpCopy) 32030 v.AddArg(v0) 32031 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32032 v1.AuxInt = j0 32033 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32034 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32035 v3.AuxInt = i0 32036 v3.Aux = s 32037 v3.AddArg(p) 32038 v3.AddArg(idx) 32039 v3.AddArg(mem) 32040 v2.AddArg(v3) 32041 v1.AddArg(v2) 32042 v0.AddArg(v1) 32043 v0.AddArg(y) 32044 return true 32045 } 32046 // 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)) 32047 // 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) 32048 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32049 for { 32050 _ = v.Args[1] 32051 s1 := v.Args[0] 32052 if s1.Op != OpS390XSLDconst { 32053 break 32054 } 32055 j1 := s1.AuxInt 32056 r1 := s1.Args[0] 32057 if r1.Op != OpS390XMOVHZreg { 32058 break 32059 } 32060 x1 := r1.Args[0] 32061 if x1.Op != OpS390XMOVHBRloadidx { 32062 break 32063 } 32064 i1 := x1.AuxInt 32065 s := x1.Aux 32066 _ = x1.Args[2] 32067 idx := x1.Args[0] 32068 p := x1.Args[1] 32069 mem := x1.Args[2] 32070 or := v.Args[1] 32071 if or.Op != OpS390XOR { 32072 break 32073 } 32074 _ = or.Args[1] 32075 s0 := or.Args[0] 32076 if s0.Op != OpS390XSLDconst { 32077 break 32078 } 32079 j0 := s0.AuxInt 32080 r0 := s0.Args[0] 32081 if r0.Op != OpS390XMOVHZreg { 32082 break 32083 } 32084 x0 := r0.Args[0] 32085 if x0.Op != OpS390XMOVHBRloadidx { 32086 break 32087 } 32088 i0 := x0.AuxInt 32089 if x0.Aux != s { 32090 break 32091 } 32092 _ = x0.Args[2] 32093 if idx != x0.Args[0] { 32094 break 32095 } 32096 if p != x0.Args[1] { 32097 break 32098 } 32099 if mem != x0.Args[2] { 32100 break 32101 } 32102 y := or.Args[1] 32103 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)) { 32104 break 32105 } 32106 b = mergePoint(b, x0, x1) 32107 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32108 v.reset(OpCopy) 32109 v.AddArg(v0) 32110 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32111 v1.AuxInt = j0 32112 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32113 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32114 v3.AuxInt = i0 32115 v3.Aux = s 32116 v3.AddArg(p) 32117 v3.AddArg(idx) 32118 v3.AddArg(mem) 32119 v2.AddArg(v3) 32120 v1.AddArg(v2) 32121 v0.AddArg(v1) 32122 v0.AddArg(y) 32123 return true 32124 } 32125 // 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))))) 32126 // 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) 32127 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32128 for { 32129 _ = v.Args[1] 32130 s1 := v.Args[0] 32131 if s1.Op != OpS390XSLDconst { 32132 break 32133 } 32134 j1 := s1.AuxInt 32135 r1 := s1.Args[0] 32136 if r1.Op != OpS390XMOVHZreg { 32137 break 32138 } 32139 x1 := r1.Args[0] 32140 if x1.Op != OpS390XMOVHBRloadidx { 32141 break 32142 } 32143 i1 := x1.AuxInt 32144 s := x1.Aux 32145 _ = x1.Args[2] 32146 p := x1.Args[0] 32147 idx := x1.Args[1] 32148 mem := x1.Args[2] 32149 or := v.Args[1] 32150 if or.Op != OpS390XOR { 32151 break 32152 } 32153 _ = or.Args[1] 32154 y := or.Args[0] 32155 s0 := or.Args[1] 32156 if s0.Op != OpS390XSLDconst { 32157 break 32158 } 32159 j0 := s0.AuxInt 32160 r0 := s0.Args[0] 32161 if r0.Op != OpS390XMOVHZreg { 32162 break 32163 } 32164 x0 := r0.Args[0] 32165 if x0.Op != OpS390XMOVHBRloadidx { 32166 break 32167 } 32168 i0 := x0.AuxInt 32169 if x0.Aux != s { 32170 break 32171 } 32172 _ = x0.Args[2] 32173 if p != x0.Args[0] { 32174 break 32175 } 32176 if idx != x0.Args[1] { 32177 break 32178 } 32179 if mem != x0.Args[2] { 32180 break 32181 } 32182 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)) { 32183 break 32184 } 32185 b = mergePoint(b, x0, x1) 32186 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32187 v.reset(OpCopy) 32188 v.AddArg(v0) 32189 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32190 v1.AuxInt = j0 32191 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32192 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32193 v3.AuxInt = i0 32194 v3.Aux = s 32195 v3.AddArg(p) 32196 v3.AddArg(idx) 32197 v3.AddArg(mem) 32198 v2.AddArg(v3) 32199 v1.AddArg(v2) 32200 v0.AddArg(v1) 32201 v0.AddArg(y) 32202 return true 32203 } 32204 // 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))))) 32205 // 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) 32206 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32207 for { 32208 _ = v.Args[1] 32209 s1 := v.Args[0] 32210 if s1.Op != OpS390XSLDconst { 32211 break 32212 } 32213 j1 := s1.AuxInt 32214 r1 := s1.Args[0] 32215 if r1.Op != OpS390XMOVHZreg { 32216 break 32217 } 32218 x1 := r1.Args[0] 32219 if x1.Op != OpS390XMOVHBRloadidx { 32220 break 32221 } 32222 i1 := x1.AuxInt 32223 s := x1.Aux 32224 _ = x1.Args[2] 32225 idx := x1.Args[0] 32226 p := x1.Args[1] 32227 mem := x1.Args[2] 32228 or := v.Args[1] 32229 if or.Op != OpS390XOR { 32230 break 32231 } 32232 _ = or.Args[1] 32233 y := or.Args[0] 32234 s0 := or.Args[1] 32235 if s0.Op != OpS390XSLDconst { 32236 break 32237 } 32238 j0 := s0.AuxInt 32239 r0 := s0.Args[0] 32240 if r0.Op != OpS390XMOVHZreg { 32241 break 32242 } 32243 x0 := r0.Args[0] 32244 if x0.Op != OpS390XMOVHBRloadidx { 32245 break 32246 } 32247 i0 := x0.AuxInt 32248 if x0.Aux != s { 32249 break 32250 } 32251 _ = x0.Args[2] 32252 if p != x0.Args[0] { 32253 break 32254 } 32255 if idx != x0.Args[1] { 32256 break 32257 } 32258 if mem != x0.Args[2] { 32259 break 32260 } 32261 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)) { 32262 break 32263 } 32264 b = mergePoint(b, x0, x1) 32265 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32266 v.reset(OpCopy) 32267 v.AddArg(v0) 32268 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32269 v1.AuxInt = j0 32270 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32271 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32272 v3.AuxInt = i0 32273 v3.Aux = s 32274 v3.AddArg(p) 32275 v3.AddArg(idx) 32276 v3.AddArg(mem) 32277 v2.AddArg(v3) 32278 v1.AddArg(v2) 32279 v0.AddArg(v1) 32280 v0.AddArg(y) 32281 return true 32282 } 32283 // 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))))) 32284 // 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) 32285 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32286 for { 32287 _ = v.Args[1] 32288 s1 := v.Args[0] 32289 if s1.Op != OpS390XSLDconst { 32290 break 32291 } 32292 j1 := s1.AuxInt 32293 r1 := s1.Args[0] 32294 if r1.Op != OpS390XMOVHZreg { 32295 break 32296 } 32297 x1 := r1.Args[0] 32298 if x1.Op != OpS390XMOVHBRloadidx { 32299 break 32300 } 32301 i1 := x1.AuxInt 32302 s := x1.Aux 32303 _ = x1.Args[2] 32304 p := x1.Args[0] 32305 idx := x1.Args[1] 32306 mem := x1.Args[2] 32307 or := v.Args[1] 32308 if or.Op != OpS390XOR { 32309 break 32310 } 32311 _ = or.Args[1] 32312 y := or.Args[0] 32313 s0 := or.Args[1] 32314 if s0.Op != OpS390XSLDconst { 32315 break 32316 } 32317 j0 := s0.AuxInt 32318 r0 := s0.Args[0] 32319 if r0.Op != OpS390XMOVHZreg { 32320 break 32321 } 32322 x0 := r0.Args[0] 32323 if x0.Op != OpS390XMOVHBRloadidx { 32324 break 32325 } 32326 i0 := x0.AuxInt 32327 if x0.Aux != s { 32328 break 32329 } 32330 _ = x0.Args[2] 32331 if idx != x0.Args[0] { 32332 break 32333 } 32334 if p != x0.Args[1] { 32335 break 32336 } 32337 if mem != x0.Args[2] { 32338 break 32339 } 32340 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)) { 32341 break 32342 } 32343 b = mergePoint(b, x0, x1) 32344 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32345 v.reset(OpCopy) 32346 v.AddArg(v0) 32347 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32348 v1.AuxInt = j0 32349 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32350 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32351 v3.AuxInt = i0 32352 v3.Aux = s 32353 v3.AddArg(p) 32354 v3.AddArg(idx) 32355 v3.AddArg(mem) 32356 v2.AddArg(v3) 32357 v1.AddArg(v2) 32358 v0.AddArg(v1) 32359 v0.AddArg(y) 32360 return true 32361 } 32362 // 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))))) 32363 // 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) 32364 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32365 for { 32366 _ = v.Args[1] 32367 s1 := v.Args[0] 32368 if s1.Op != OpS390XSLDconst { 32369 break 32370 } 32371 j1 := s1.AuxInt 32372 r1 := s1.Args[0] 32373 if r1.Op != OpS390XMOVHZreg { 32374 break 32375 } 32376 x1 := r1.Args[0] 32377 if x1.Op != OpS390XMOVHBRloadidx { 32378 break 32379 } 32380 i1 := x1.AuxInt 32381 s := x1.Aux 32382 _ = x1.Args[2] 32383 idx := x1.Args[0] 32384 p := x1.Args[1] 32385 mem := x1.Args[2] 32386 or := v.Args[1] 32387 if or.Op != OpS390XOR { 32388 break 32389 } 32390 _ = or.Args[1] 32391 y := or.Args[0] 32392 s0 := or.Args[1] 32393 if s0.Op != OpS390XSLDconst { 32394 break 32395 } 32396 j0 := s0.AuxInt 32397 r0 := s0.Args[0] 32398 if r0.Op != OpS390XMOVHZreg { 32399 break 32400 } 32401 x0 := r0.Args[0] 32402 if x0.Op != OpS390XMOVHBRloadidx { 32403 break 32404 } 32405 i0 := x0.AuxInt 32406 if x0.Aux != s { 32407 break 32408 } 32409 _ = x0.Args[2] 32410 if idx != x0.Args[0] { 32411 break 32412 } 32413 if p != x0.Args[1] { 32414 break 32415 } 32416 if mem != x0.Args[2] { 32417 break 32418 } 32419 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)) { 32420 break 32421 } 32422 b = mergePoint(b, x0, x1) 32423 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32424 v.reset(OpCopy) 32425 v.AddArg(v0) 32426 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32427 v1.AuxInt = j0 32428 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32429 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32430 v3.AuxInt = i0 32431 v3.Aux = s 32432 v3.AddArg(p) 32433 v3.AddArg(idx) 32434 v3.AddArg(mem) 32435 v2.AddArg(v3) 32436 v1.AddArg(v2) 32437 v0.AddArg(v1) 32438 v0.AddArg(y) 32439 return true 32440 } 32441 // 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)))) 32442 // 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) 32443 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32444 for { 32445 _ = v.Args[1] 32446 or := v.Args[0] 32447 if or.Op != OpS390XOR { 32448 break 32449 } 32450 _ = or.Args[1] 32451 s0 := or.Args[0] 32452 if s0.Op != OpS390XSLDconst { 32453 break 32454 } 32455 j0 := s0.AuxInt 32456 r0 := s0.Args[0] 32457 if r0.Op != OpS390XMOVHZreg { 32458 break 32459 } 32460 x0 := r0.Args[0] 32461 if x0.Op != OpS390XMOVHBRloadidx { 32462 break 32463 } 32464 i0 := x0.AuxInt 32465 s := x0.Aux 32466 _ = x0.Args[2] 32467 p := x0.Args[0] 32468 idx := x0.Args[1] 32469 mem := x0.Args[2] 32470 y := or.Args[1] 32471 s1 := v.Args[1] 32472 if s1.Op != OpS390XSLDconst { 32473 break 32474 } 32475 j1 := s1.AuxInt 32476 r1 := s1.Args[0] 32477 if r1.Op != OpS390XMOVHZreg { 32478 break 32479 } 32480 x1 := r1.Args[0] 32481 if x1.Op != OpS390XMOVHBRloadidx { 32482 break 32483 } 32484 i1 := x1.AuxInt 32485 if x1.Aux != s { 32486 break 32487 } 32488 _ = x1.Args[2] 32489 if p != x1.Args[0] { 32490 break 32491 } 32492 if idx != x1.Args[1] { 32493 break 32494 } 32495 if mem != x1.Args[2] { 32496 break 32497 } 32498 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)) { 32499 break 32500 } 32501 b = mergePoint(b, x0, x1) 32502 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32503 v.reset(OpCopy) 32504 v.AddArg(v0) 32505 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32506 v1.AuxInt = j0 32507 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32508 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32509 v3.AuxInt = i0 32510 v3.Aux = s 32511 v3.AddArg(p) 32512 v3.AddArg(idx) 32513 v3.AddArg(mem) 32514 v2.AddArg(v3) 32515 v1.AddArg(v2) 32516 v0.AddArg(v1) 32517 v0.AddArg(y) 32518 return true 32519 } 32520 return false 32521 } 32522 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 32523 b := v.Block 32524 _ = b 32525 typ := &b.Func.Config.Types 32526 _ = typ 32527 // 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)))) 32528 // 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) 32529 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32530 for { 32531 _ = v.Args[1] 32532 or := v.Args[0] 32533 if or.Op != OpS390XOR { 32534 break 32535 } 32536 _ = or.Args[1] 32537 s0 := or.Args[0] 32538 if s0.Op != OpS390XSLDconst { 32539 break 32540 } 32541 j0 := s0.AuxInt 32542 r0 := s0.Args[0] 32543 if r0.Op != OpS390XMOVHZreg { 32544 break 32545 } 32546 x0 := r0.Args[0] 32547 if x0.Op != OpS390XMOVHBRloadidx { 32548 break 32549 } 32550 i0 := x0.AuxInt 32551 s := x0.Aux 32552 _ = x0.Args[2] 32553 idx := x0.Args[0] 32554 p := x0.Args[1] 32555 mem := x0.Args[2] 32556 y := or.Args[1] 32557 s1 := v.Args[1] 32558 if s1.Op != OpS390XSLDconst { 32559 break 32560 } 32561 j1 := s1.AuxInt 32562 r1 := s1.Args[0] 32563 if r1.Op != OpS390XMOVHZreg { 32564 break 32565 } 32566 x1 := r1.Args[0] 32567 if x1.Op != OpS390XMOVHBRloadidx { 32568 break 32569 } 32570 i1 := x1.AuxInt 32571 if x1.Aux != s { 32572 break 32573 } 32574 _ = x1.Args[2] 32575 if p != x1.Args[0] { 32576 break 32577 } 32578 if idx != x1.Args[1] { 32579 break 32580 } 32581 if mem != x1.Args[2] { 32582 break 32583 } 32584 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)) { 32585 break 32586 } 32587 b = mergePoint(b, x0, x1) 32588 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32589 v.reset(OpCopy) 32590 v.AddArg(v0) 32591 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32592 v1.AuxInt = j0 32593 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32594 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32595 v3.AuxInt = i0 32596 v3.Aux = s 32597 v3.AddArg(p) 32598 v3.AddArg(idx) 32599 v3.AddArg(mem) 32600 v2.AddArg(v3) 32601 v1.AddArg(v2) 32602 v0.AddArg(v1) 32603 v0.AddArg(y) 32604 return true 32605 } 32606 // 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)))) 32607 // 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) 32608 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32609 for { 32610 _ = v.Args[1] 32611 or := v.Args[0] 32612 if or.Op != OpS390XOR { 32613 break 32614 } 32615 _ = or.Args[1] 32616 y := or.Args[0] 32617 s0 := or.Args[1] 32618 if s0.Op != OpS390XSLDconst { 32619 break 32620 } 32621 j0 := s0.AuxInt 32622 r0 := s0.Args[0] 32623 if r0.Op != OpS390XMOVHZreg { 32624 break 32625 } 32626 x0 := r0.Args[0] 32627 if x0.Op != OpS390XMOVHBRloadidx { 32628 break 32629 } 32630 i0 := x0.AuxInt 32631 s := x0.Aux 32632 _ = x0.Args[2] 32633 p := x0.Args[0] 32634 idx := x0.Args[1] 32635 mem := x0.Args[2] 32636 s1 := v.Args[1] 32637 if s1.Op != OpS390XSLDconst { 32638 break 32639 } 32640 j1 := s1.AuxInt 32641 r1 := s1.Args[0] 32642 if r1.Op != OpS390XMOVHZreg { 32643 break 32644 } 32645 x1 := r1.Args[0] 32646 if x1.Op != OpS390XMOVHBRloadidx { 32647 break 32648 } 32649 i1 := x1.AuxInt 32650 if x1.Aux != s { 32651 break 32652 } 32653 _ = x1.Args[2] 32654 if p != x1.Args[0] { 32655 break 32656 } 32657 if idx != x1.Args[1] { 32658 break 32659 } 32660 if mem != x1.Args[2] { 32661 break 32662 } 32663 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)) { 32664 break 32665 } 32666 b = mergePoint(b, x0, x1) 32667 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32668 v.reset(OpCopy) 32669 v.AddArg(v0) 32670 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32671 v1.AuxInt = j0 32672 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32673 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32674 v3.AuxInt = i0 32675 v3.Aux = s 32676 v3.AddArg(p) 32677 v3.AddArg(idx) 32678 v3.AddArg(mem) 32679 v2.AddArg(v3) 32680 v1.AddArg(v2) 32681 v0.AddArg(v1) 32682 v0.AddArg(y) 32683 return true 32684 } 32685 // 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)))) 32686 // 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) 32687 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32688 for { 32689 _ = v.Args[1] 32690 or := v.Args[0] 32691 if or.Op != OpS390XOR { 32692 break 32693 } 32694 _ = or.Args[1] 32695 y := or.Args[0] 32696 s0 := or.Args[1] 32697 if s0.Op != OpS390XSLDconst { 32698 break 32699 } 32700 j0 := s0.AuxInt 32701 r0 := s0.Args[0] 32702 if r0.Op != OpS390XMOVHZreg { 32703 break 32704 } 32705 x0 := r0.Args[0] 32706 if x0.Op != OpS390XMOVHBRloadidx { 32707 break 32708 } 32709 i0 := x0.AuxInt 32710 s := x0.Aux 32711 _ = x0.Args[2] 32712 idx := x0.Args[0] 32713 p := x0.Args[1] 32714 mem := x0.Args[2] 32715 s1 := v.Args[1] 32716 if s1.Op != OpS390XSLDconst { 32717 break 32718 } 32719 j1 := s1.AuxInt 32720 r1 := s1.Args[0] 32721 if r1.Op != OpS390XMOVHZreg { 32722 break 32723 } 32724 x1 := r1.Args[0] 32725 if x1.Op != OpS390XMOVHBRloadidx { 32726 break 32727 } 32728 i1 := x1.AuxInt 32729 if x1.Aux != s { 32730 break 32731 } 32732 _ = x1.Args[2] 32733 if p != x1.Args[0] { 32734 break 32735 } 32736 if idx != x1.Args[1] { 32737 break 32738 } 32739 if mem != x1.Args[2] { 32740 break 32741 } 32742 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)) { 32743 break 32744 } 32745 b = mergePoint(b, x0, x1) 32746 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32747 v.reset(OpCopy) 32748 v.AddArg(v0) 32749 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32750 v1.AuxInt = j0 32751 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32752 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32753 v3.AuxInt = i0 32754 v3.Aux = s 32755 v3.AddArg(p) 32756 v3.AddArg(idx) 32757 v3.AddArg(mem) 32758 v2.AddArg(v3) 32759 v1.AddArg(v2) 32760 v0.AddArg(v1) 32761 v0.AddArg(y) 32762 return true 32763 } 32764 // 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)))) 32765 // 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) 32766 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32767 for { 32768 _ = v.Args[1] 32769 or := v.Args[0] 32770 if or.Op != OpS390XOR { 32771 break 32772 } 32773 _ = or.Args[1] 32774 s0 := or.Args[0] 32775 if s0.Op != OpS390XSLDconst { 32776 break 32777 } 32778 j0 := s0.AuxInt 32779 r0 := s0.Args[0] 32780 if r0.Op != OpS390XMOVHZreg { 32781 break 32782 } 32783 x0 := r0.Args[0] 32784 if x0.Op != OpS390XMOVHBRloadidx { 32785 break 32786 } 32787 i0 := x0.AuxInt 32788 s := x0.Aux 32789 _ = x0.Args[2] 32790 p := x0.Args[0] 32791 idx := x0.Args[1] 32792 mem := x0.Args[2] 32793 y := or.Args[1] 32794 s1 := v.Args[1] 32795 if s1.Op != OpS390XSLDconst { 32796 break 32797 } 32798 j1 := s1.AuxInt 32799 r1 := s1.Args[0] 32800 if r1.Op != OpS390XMOVHZreg { 32801 break 32802 } 32803 x1 := r1.Args[0] 32804 if x1.Op != OpS390XMOVHBRloadidx { 32805 break 32806 } 32807 i1 := x1.AuxInt 32808 if x1.Aux != s { 32809 break 32810 } 32811 _ = x1.Args[2] 32812 if idx != x1.Args[0] { 32813 break 32814 } 32815 if p != x1.Args[1] { 32816 break 32817 } 32818 if mem != x1.Args[2] { 32819 break 32820 } 32821 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)) { 32822 break 32823 } 32824 b = mergePoint(b, x0, x1) 32825 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32826 v.reset(OpCopy) 32827 v.AddArg(v0) 32828 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32829 v1.AuxInt = j0 32830 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32831 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32832 v3.AuxInt = i0 32833 v3.Aux = s 32834 v3.AddArg(p) 32835 v3.AddArg(idx) 32836 v3.AddArg(mem) 32837 v2.AddArg(v3) 32838 v1.AddArg(v2) 32839 v0.AddArg(v1) 32840 v0.AddArg(y) 32841 return true 32842 } 32843 // 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)))) 32844 // 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) 32845 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32846 for { 32847 _ = v.Args[1] 32848 or := v.Args[0] 32849 if or.Op != OpS390XOR { 32850 break 32851 } 32852 _ = or.Args[1] 32853 s0 := or.Args[0] 32854 if s0.Op != OpS390XSLDconst { 32855 break 32856 } 32857 j0 := s0.AuxInt 32858 r0 := s0.Args[0] 32859 if r0.Op != OpS390XMOVHZreg { 32860 break 32861 } 32862 x0 := r0.Args[0] 32863 if x0.Op != OpS390XMOVHBRloadidx { 32864 break 32865 } 32866 i0 := x0.AuxInt 32867 s := x0.Aux 32868 _ = x0.Args[2] 32869 idx := x0.Args[0] 32870 p := x0.Args[1] 32871 mem := x0.Args[2] 32872 y := or.Args[1] 32873 s1 := v.Args[1] 32874 if s1.Op != OpS390XSLDconst { 32875 break 32876 } 32877 j1 := s1.AuxInt 32878 r1 := s1.Args[0] 32879 if r1.Op != OpS390XMOVHZreg { 32880 break 32881 } 32882 x1 := r1.Args[0] 32883 if x1.Op != OpS390XMOVHBRloadidx { 32884 break 32885 } 32886 i1 := x1.AuxInt 32887 if x1.Aux != s { 32888 break 32889 } 32890 _ = x1.Args[2] 32891 if idx != x1.Args[0] { 32892 break 32893 } 32894 if p != x1.Args[1] { 32895 break 32896 } 32897 if mem != x1.Args[2] { 32898 break 32899 } 32900 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)) { 32901 break 32902 } 32903 b = mergePoint(b, x0, x1) 32904 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32905 v.reset(OpCopy) 32906 v.AddArg(v0) 32907 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32908 v1.AuxInt = j0 32909 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32910 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32911 v3.AuxInt = i0 32912 v3.Aux = s 32913 v3.AddArg(p) 32914 v3.AddArg(idx) 32915 v3.AddArg(mem) 32916 v2.AddArg(v3) 32917 v1.AddArg(v2) 32918 v0.AddArg(v1) 32919 v0.AddArg(y) 32920 return true 32921 } 32922 // 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)))) 32923 // 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) 32924 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32925 for { 32926 _ = v.Args[1] 32927 or := v.Args[0] 32928 if or.Op != OpS390XOR { 32929 break 32930 } 32931 _ = or.Args[1] 32932 y := or.Args[0] 32933 s0 := or.Args[1] 32934 if s0.Op != OpS390XSLDconst { 32935 break 32936 } 32937 j0 := s0.AuxInt 32938 r0 := s0.Args[0] 32939 if r0.Op != OpS390XMOVHZreg { 32940 break 32941 } 32942 x0 := r0.Args[0] 32943 if x0.Op != OpS390XMOVHBRloadidx { 32944 break 32945 } 32946 i0 := x0.AuxInt 32947 s := x0.Aux 32948 _ = x0.Args[2] 32949 p := x0.Args[0] 32950 idx := x0.Args[1] 32951 mem := x0.Args[2] 32952 s1 := v.Args[1] 32953 if s1.Op != OpS390XSLDconst { 32954 break 32955 } 32956 j1 := s1.AuxInt 32957 r1 := s1.Args[0] 32958 if r1.Op != OpS390XMOVHZreg { 32959 break 32960 } 32961 x1 := r1.Args[0] 32962 if x1.Op != OpS390XMOVHBRloadidx { 32963 break 32964 } 32965 i1 := x1.AuxInt 32966 if x1.Aux != s { 32967 break 32968 } 32969 _ = x1.Args[2] 32970 if idx != x1.Args[0] { 32971 break 32972 } 32973 if p != x1.Args[1] { 32974 break 32975 } 32976 if mem != x1.Args[2] { 32977 break 32978 } 32979 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)) { 32980 break 32981 } 32982 b = mergePoint(b, x0, x1) 32983 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32984 v.reset(OpCopy) 32985 v.AddArg(v0) 32986 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32987 v1.AuxInt = j0 32988 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32989 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32990 v3.AuxInt = i0 32991 v3.Aux = s 32992 v3.AddArg(p) 32993 v3.AddArg(idx) 32994 v3.AddArg(mem) 32995 v2.AddArg(v3) 32996 v1.AddArg(v2) 32997 v0.AddArg(v1) 32998 v0.AddArg(y) 32999 return true 33000 } 33001 // 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)))) 33002 // 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) 33003 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 33004 for { 33005 _ = v.Args[1] 33006 or := v.Args[0] 33007 if or.Op != OpS390XOR { 33008 break 33009 } 33010 _ = or.Args[1] 33011 y := or.Args[0] 33012 s0 := or.Args[1] 33013 if s0.Op != OpS390XSLDconst { 33014 break 33015 } 33016 j0 := s0.AuxInt 33017 r0 := s0.Args[0] 33018 if r0.Op != OpS390XMOVHZreg { 33019 break 33020 } 33021 x0 := r0.Args[0] 33022 if x0.Op != OpS390XMOVHBRloadidx { 33023 break 33024 } 33025 i0 := x0.AuxInt 33026 s := x0.Aux 33027 _ = x0.Args[2] 33028 idx := x0.Args[0] 33029 p := x0.Args[1] 33030 mem := x0.Args[2] 33031 s1 := v.Args[1] 33032 if s1.Op != OpS390XSLDconst { 33033 break 33034 } 33035 j1 := s1.AuxInt 33036 r1 := s1.Args[0] 33037 if r1.Op != OpS390XMOVHZreg { 33038 break 33039 } 33040 x1 := r1.Args[0] 33041 if x1.Op != OpS390XMOVHBRloadidx { 33042 break 33043 } 33044 i1 := x1.AuxInt 33045 if x1.Aux != s { 33046 break 33047 } 33048 _ = x1.Args[2] 33049 if idx != x1.Args[0] { 33050 break 33051 } 33052 if p != x1.Args[1] { 33053 break 33054 } 33055 if mem != x1.Args[2] { 33056 break 33057 } 33058 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)) { 33059 break 33060 } 33061 b = mergePoint(b, x0, x1) 33062 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 33063 v.reset(OpCopy) 33064 v.AddArg(v0) 33065 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 33066 v1.AuxInt = j0 33067 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 33068 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33069 v3.AuxInt = i0 33070 v3.Aux = s 33071 v3.AddArg(p) 33072 v3.AddArg(idx) 33073 v3.AddArg(mem) 33074 v2.AddArg(v3) 33075 v1.AddArg(v2) 33076 v0.AddArg(v1) 33077 v0.AddArg(y) 33078 return true 33079 } 33080 return false 33081 } 33082 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 33083 // match: (ORW x (MOVDconst [c])) 33084 // cond: 33085 // result: (ORWconst [int64(int32(c))] x) 33086 for { 33087 _ = v.Args[1] 33088 x := v.Args[0] 33089 v_1 := v.Args[1] 33090 if v_1.Op != OpS390XMOVDconst { 33091 break 33092 } 33093 c := v_1.AuxInt 33094 v.reset(OpS390XORWconst) 33095 v.AuxInt = int64(int32(c)) 33096 v.AddArg(x) 33097 return true 33098 } 33099 // match: (ORW (MOVDconst [c]) x) 33100 // cond: 33101 // result: (ORWconst [int64(int32(c))] x) 33102 for { 33103 _ = v.Args[1] 33104 v_0 := v.Args[0] 33105 if v_0.Op != OpS390XMOVDconst { 33106 break 33107 } 33108 c := v_0.AuxInt 33109 x := v.Args[1] 33110 v.reset(OpS390XORWconst) 33111 v.AuxInt = int64(int32(c)) 33112 v.AddArg(x) 33113 return true 33114 } 33115 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 33116 // cond: d == 32-c 33117 // result: (RLLconst [c] x) 33118 for { 33119 _ = v.Args[1] 33120 v_0 := v.Args[0] 33121 if v_0.Op != OpS390XSLWconst { 33122 break 33123 } 33124 c := v_0.AuxInt 33125 x := v_0.Args[0] 33126 v_1 := v.Args[1] 33127 if v_1.Op != OpS390XSRWconst { 33128 break 33129 } 33130 d := v_1.AuxInt 33131 if x != v_1.Args[0] { 33132 break 33133 } 33134 if !(d == 32-c) { 33135 break 33136 } 33137 v.reset(OpS390XRLLconst) 33138 v.AuxInt = c 33139 v.AddArg(x) 33140 return true 33141 } 33142 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 33143 // cond: d == 32-c 33144 // result: (RLLconst [c] x) 33145 for { 33146 _ = v.Args[1] 33147 v_0 := v.Args[0] 33148 if v_0.Op != OpS390XSRWconst { 33149 break 33150 } 33151 d := v_0.AuxInt 33152 x := v_0.Args[0] 33153 v_1 := v.Args[1] 33154 if v_1.Op != OpS390XSLWconst { 33155 break 33156 } 33157 c := v_1.AuxInt 33158 if x != v_1.Args[0] { 33159 break 33160 } 33161 if !(d == 32-c) { 33162 break 33163 } 33164 v.reset(OpS390XRLLconst) 33165 v.AuxInt = c 33166 v.AddArg(x) 33167 return true 33168 } 33169 // match: (ORW x x) 33170 // cond: 33171 // result: x 33172 for { 33173 _ = v.Args[1] 33174 x := v.Args[0] 33175 if x != v.Args[1] { 33176 break 33177 } 33178 v.reset(OpCopy) 33179 v.Type = x.Type 33180 v.AddArg(x) 33181 return true 33182 } 33183 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33184 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33185 // result: (ORWload <t> [off] {sym} x ptr mem) 33186 for { 33187 t := v.Type 33188 _ = v.Args[1] 33189 x := v.Args[0] 33190 g := v.Args[1] 33191 if g.Op != OpS390XMOVWload { 33192 break 33193 } 33194 off := g.AuxInt 33195 sym := g.Aux 33196 _ = g.Args[1] 33197 ptr := g.Args[0] 33198 mem := g.Args[1] 33199 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33200 break 33201 } 33202 v.reset(OpS390XORWload) 33203 v.Type = t 33204 v.AuxInt = off 33205 v.Aux = sym 33206 v.AddArg(x) 33207 v.AddArg(ptr) 33208 v.AddArg(mem) 33209 return true 33210 } 33211 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33212 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33213 // result: (ORWload <t> [off] {sym} x ptr mem) 33214 for { 33215 t := v.Type 33216 _ = v.Args[1] 33217 g := v.Args[0] 33218 if g.Op != OpS390XMOVWload { 33219 break 33220 } 33221 off := g.AuxInt 33222 sym := g.Aux 33223 _ = g.Args[1] 33224 ptr := g.Args[0] 33225 mem := g.Args[1] 33226 x := v.Args[1] 33227 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33228 break 33229 } 33230 v.reset(OpS390XORWload) 33231 v.Type = t 33232 v.AuxInt = off 33233 v.Aux = sym 33234 v.AddArg(x) 33235 v.AddArg(ptr) 33236 v.AddArg(mem) 33237 return true 33238 } 33239 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33240 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33241 // result: (ORWload <t> [off] {sym} x ptr mem) 33242 for { 33243 t := v.Type 33244 _ = v.Args[1] 33245 g := v.Args[0] 33246 if g.Op != OpS390XMOVWload { 33247 break 33248 } 33249 off := g.AuxInt 33250 sym := g.Aux 33251 _ = g.Args[1] 33252 ptr := g.Args[0] 33253 mem := g.Args[1] 33254 x := v.Args[1] 33255 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33256 break 33257 } 33258 v.reset(OpS390XORWload) 33259 v.Type = t 33260 v.AuxInt = off 33261 v.Aux = sym 33262 v.AddArg(x) 33263 v.AddArg(ptr) 33264 v.AddArg(mem) 33265 return true 33266 } 33267 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33268 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33269 // result: (ORWload <t> [off] {sym} x ptr mem) 33270 for { 33271 t := v.Type 33272 _ = v.Args[1] 33273 x := v.Args[0] 33274 g := v.Args[1] 33275 if g.Op != OpS390XMOVWload { 33276 break 33277 } 33278 off := g.AuxInt 33279 sym := g.Aux 33280 _ = g.Args[1] 33281 ptr := g.Args[0] 33282 mem := g.Args[1] 33283 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33284 break 33285 } 33286 v.reset(OpS390XORWload) 33287 v.Type = t 33288 v.AuxInt = off 33289 v.Aux = sym 33290 v.AddArg(x) 33291 v.AddArg(ptr) 33292 v.AddArg(mem) 33293 return true 33294 } 33295 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33296 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33297 // result: (ORWload <t> [off] {sym} x ptr mem) 33298 for { 33299 t := v.Type 33300 _ = v.Args[1] 33301 x := v.Args[0] 33302 g := v.Args[1] 33303 if g.Op != OpS390XMOVWZload { 33304 break 33305 } 33306 off := g.AuxInt 33307 sym := g.Aux 33308 _ = g.Args[1] 33309 ptr := g.Args[0] 33310 mem := g.Args[1] 33311 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33312 break 33313 } 33314 v.reset(OpS390XORWload) 33315 v.Type = t 33316 v.AuxInt = off 33317 v.Aux = sym 33318 v.AddArg(x) 33319 v.AddArg(ptr) 33320 v.AddArg(mem) 33321 return true 33322 } 33323 return false 33324 } 33325 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 33326 b := v.Block 33327 _ = b 33328 typ := &b.Func.Config.Types 33329 _ = typ 33330 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33331 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33332 // result: (ORWload <t> [off] {sym} x ptr mem) 33333 for { 33334 t := v.Type 33335 _ = v.Args[1] 33336 g := v.Args[0] 33337 if g.Op != OpS390XMOVWZload { 33338 break 33339 } 33340 off := g.AuxInt 33341 sym := g.Aux 33342 _ = g.Args[1] 33343 ptr := g.Args[0] 33344 mem := g.Args[1] 33345 x := v.Args[1] 33346 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33347 break 33348 } 33349 v.reset(OpS390XORWload) 33350 v.Type = t 33351 v.AuxInt = off 33352 v.Aux = sym 33353 v.AddArg(x) 33354 v.AddArg(ptr) 33355 v.AddArg(mem) 33356 return true 33357 } 33358 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33359 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33360 // result: (ORWload <t> [off] {sym} x ptr mem) 33361 for { 33362 t := v.Type 33363 _ = v.Args[1] 33364 g := v.Args[0] 33365 if g.Op != OpS390XMOVWZload { 33366 break 33367 } 33368 off := g.AuxInt 33369 sym := g.Aux 33370 _ = g.Args[1] 33371 ptr := g.Args[0] 33372 mem := g.Args[1] 33373 x := v.Args[1] 33374 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33375 break 33376 } 33377 v.reset(OpS390XORWload) 33378 v.Type = t 33379 v.AuxInt = off 33380 v.Aux = sym 33381 v.AddArg(x) 33382 v.AddArg(ptr) 33383 v.AddArg(mem) 33384 return true 33385 } 33386 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33387 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33388 // result: (ORWload <t> [off] {sym} x ptr mem) 33389 for { 33390 t := v.Type 33391 _ = v.Args[1] 33392 x := v.Args[0] 33393 g := v.Args[1] 33394 if g.Op != OpS390XMOVWZload { 33395 break 33396 } 33397 off := g.AuxInt 33398 sym := g.Aux 33399 _ = g.Args[1] 33400 ptr := g.Args[0] 33401 mem := g.Args[1] 33402 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33403 break 33404 } 33405 v.reset(OpS390XORWload) 33406 v.Type = t 33407 v.AuxInt = off 33408 v.Aux = sym 33409 v.AddArg(x) 33410 v.AddArg(ptr) 33411 v.AddArg(mem) 33412 return true 33413 } 33414 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 33415 // 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) 33416 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 33417 for { 33418 _ = v.Args[1] 33419 x1 := v.Args[0] 33420 if x1.Op != OpS390XMOVBZload { 33421 break 33422 } 33423 i1 := x1.AuxInt 33424 s := x1.Aux 33425 _ = x1.Args[1] 33426 p := x1.Args[0] 33427 mem := x1.Args[1] 33428 sh := v.Args[1] 33429 if sh.Op != OpS390XSLWconst { 33430 break 33431 } 33432 if sh.AuxInt != 8 { 33433 break 33434 } 33435 x0 := sh.Args[0] 33436 if x0.Op != OpS390XMOVBZload { 33437 break 33438 } 33439 i0 := x0.AuxInt 33440 if x0.Aux != s { 33441 break 33442 } 33443 _ = x0.Args[1] 33444 if p != x0.Args[0] { 33445 break 33446 } 33447 if mem != x0.Args[1] { 33448 break 33449 } 33450 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)) { 33451 break 33452 } 33453 b = mergePoint(b, x0, x1) 33454 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33455 v.reset(OpCopy) 33456 v.AddArg(v0) 33457 v0.AuxInt = i0 33458 v0.Aux = s 33459 v0.AddArg(p) 33460 v0.AddArg(mem) 33461 return true 33462 } 33463 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 33464 // 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) 33465 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 33466 for { 33467 _ = v.Args[1] 33468 sh := v.Args[0] 33469 if sh.Op != OpS390XSLWconst { 33470 break 33471 } 33472 if sh.AuxInt != 8 { 33473 break 33474 } 33475 x0 := sh.Args[0] 33476 if x0.Op != OpS390XMOVBZload { 33477 break 33478 } 33479 i0 := x0.AuxInt 33480 s := x0.Aux 33481 _ = x0.Args[1] 33482 p := x0.Args[0] 33483 mem := x0.Args[1] 33484 x1 := v.Args[1] 33485 if x1.Op != OpS390XMOVBZload { 33486 break 33487 } 33488 i1 := x1.AuxInt 33489 if x1.Aux != s { 33490 break 33491 } 33492 _ = x1.Args[1] 33493 if p != x1.Args[0] { 33494 break 33495 } 33496 if mem != x1.Args[1] { 33497 break 33498 } 33499 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)) { 33500 break 33501 } 33502 b = mergePoint(b, x0, x1) 33503 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33504 v.reset(OpCopy) 33505 v.AddArg(v0) 33506 v0.AuxInt = i0 33507 v0.Aux = s 33508 v0.AddArg(p) 33509 v0.AddArg(mem) 33510 return true 33511 } 33512 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 33513 // 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) 33514 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 33515 for { 33516 _ = v.Args[1] 33517 x1 := v.Args[0] 33518 if x1.Op != OpS390XMOVHZload { 33519 break 33520 } 33521 i1 := x1.AuxInt 33522 s := x1.Aux 33523 _ = x1.Args[1] 33524 p := x1.Args[0] 33525 mem := x1.Args[1] 33526 sh := v.Args[1] 33527 if sh.Op != OpS390XSLWconst { 33528 break 33529 } 33530 if sh.AuxInt != 16 { 33531 break 33532 } 33533 x0 := sh.Args[0] 33534 if x0.Op != OpS390XMOVHZload { 33535 break 33536 } 33537 i0 := x0.AuxInt 33538 if x0.Aux != s { 33539 break 33540 } 33541 _ = x0.Args[1] 33542 if p != x0.Args[0] { 33543 break 33544 } 33545 if mem != x0.Args[1] { 33546 break 33547 } 33548 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)) { 33549 break 33550 } 33551 b = mergePoint(b, x0, x1) 33552 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 33553 v.reset(OpCopy) 33554 v.AddArg(v0) 33555 v0.AuxInt = i0 33556 v0.Aux = s 33557 v0.AddArg(p) 33558 v0.AddArg(mem) 33559 return true 33560 } 33561 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 33562 // 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) 33563 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 33564 for { 33565 _ = v.Args[1] 33566 sh := v.Args[0] 33567 if sh.Op != OpS390XSLWconst { 33568 break 33569 } 33570 if sh.AuxInt != 16 { 33571 break 33572 } 33573 x0 := sh.Args[0] 33574 if x0.Op != OpS390XMOVHZload { 33575 break 33576 } 33577 i0 := x0.AuxInt 33578 s := x0.Aux 33579 _ = x0.Args[1] 33580 p := x0.Args[0] 33581 mem := x0.Args[1] 33582 x1 := v.Args[1] 33583 if x1.Op != OpS390XMOVHZload { 33584 break 33585 } 33586 i1 := x1.AuxInt 33587 if x1.Aux != s { 33588 break 33589 } 33590 _ = x1.Args[1] 33591 if p != x1.Args[0] { 33592 break 33593 } 33594 if mem != x1.Args[1] { 33595 break 33596 } 33597 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)) { 33598 break 33599 } 33600 b = mergePoint(b, x0, x1) 33601 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 33602 v.reset(OpCopy) 33603 v.AddArg(v0) 33604 v0.AuxInt = i0 33605 v0.Aux = s 33606 v0.AddArg(p) 33607 v0.AddArg(mem) 33608 return true 33609 } 33610 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 33611 // 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) 33612 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33613 for { 33614 _ = v.Args[1] 33615 s0 := v.Args[0] 33616 if s0.Op != OpS390XSLWconst { 33617 break 33618 } 33619 j0 := s0.AuxInt 33620 x0 := s0.Args[0] 33621 if x0.Op != OpS390XMOVBZload { 33622 break 33623 } 33624 i0 := x0.AuxInt 33625 s := x0.Aux 33626 _ = x0.Args[1] 33627 p := x0.Args[0] 33628 mem := x0.Args[1] 33629 or := v.Args[1] 33630 if or.Op != OpS390XORW { 33631 break 33632 } 33633 _ = or.Args[1] 33634 s1 := or.Args[0] 33635 if s1.Op != OpS390XSLWconst { 33636 break 33637 } 33638 j1 := s1.AuxInt 33639 x1 := s1.Args[0] 33640 if x1.Op != OpS390XMOVBZload { 33641 break 33642 } 33643 i1 := x1.AuxInt 33644 if x1.Aux != s { 33645 break 33646 } 33647 _ = x1.Args[1] 33648 if p != x1.Args[0] { 33649 break 33650 } 33651 if mem != x1.Args[1] { 33652 break 33653 } 33654 y := or.Args[1] 33655 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)) { 33656 break 33657 } 33658 b = mergePoint(b, x0, x1) 33659 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33660 v.reset(OpCopy) 33661 v.AddArg(v0) 33662 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33663 v1.AuxInt = j1 33664 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33665 v2.AuxInt = i0 33666 v2.Aux = s 33667 v2.AddArg(p) 33668 v2.AddArg(mem) 33669 v1.AddArg(v2) 33670 v0.AddArg(v1) 33671 v0.AddArg(y) 33672 return true 33673 } 33674 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 33675 // 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) 33676 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33677 for { 33678 _ = v.Args[1] 33679 s0 := v.Args[0] 33680 if s0.Op != OpS390XSLWconst { 33681 break 33682 } 33683 j0 := s0.AuxInt 33684 x0 := s0.Args[0] 33685 if x0.Op != OpS390XMOVBZload { 33686 break 33687 } 33688 i0 := x0.AuxInt 33689 s := x0.Aux 33690 _ = x0.Args[1] 33691 p := x0.Args[0] 33692 mem := x0.Args[1] 33693 or := v.Args[1] 33694 if or.Op != OpS390XORW { 33695 break 33696 } 33697 _ = or.Args[1] 33698 y := or.Args[0] 33699 s1 := or.Args[1] 33700 if s1.Op != OpS390XSLWconst { 33701 break 33702 } 33703 j1 := s1.AuxInt 33704 x1 := s1.Args[0] 33705 if x1.Op != OpS390XMOVBZload { 33706 break 33707 } 33708 i1 := x1.AuxInt 33709 if x1.Aux != s { 33710 break 33711 } 33712 _ = x1.Args[1] 33713 if p != x1.Args[0] { 33714 break 33715 } 33716 if mem != x1.Args[1] { 33717 break 33718 } 33719 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)) { 33720 break 33721 } 33722 b = mergePoint(b, x0, x1) 33723 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33724 v.reset(OpCopy) 33725 v.AddArg(v0) 33726 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33727 v1.AuxInt = j1 33728 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33729 v2.AuxInt = i0 33730 v2.Aux = s 33731 v2.AddArg(p) 33732 v2.AddArg(mem) 33733 v1.AddArg(v2) 33734 v0.AddArg(v1) 33735 v0.AddArg(y) 33736 return true 33737 } 33738 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 33739 // 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) 33740 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33741 for { 33742 _ = v.Args[1] 33743 or := v.Args[0] 33744 if or.Op != OpS390XORW { 33745 break 33746 } 33747 _ = or.Args[1] 33748 s1 := or.Args[0] 33749 if s1.Op != OpS390XSLWconst { 33750 break 33751 } 33752 j1 := s1.AuxInt 33753 x1 := s1.Args[0] 33754 if x1.Op != OpS390XMOVBZload { 33755 break 33756 } 33757 i1 := x1.AuxInt 33758 s := x1.Aux 33759 _ = x1.Args[1] 33760 p := x1.Args[0] 33761 mem := x1.Args[1] 33762 y := or.Args[1] 33763 s0 := v.Args[1] 33764 if s0.Op != OpS390XSLWconst { 33765 break 33766 } 33767 j0 := s0.AuxInt 33768 x0 := s0.Args[0] 33769 if x0.Op != OpS390XMOVBZload { 33770 break 33771 } 33772 i0 := x0.AuxInt 33773 if x0.Aux != s { 33774 break 33775 } 33776 _ = x0.Args[1] 33777 if p != x0.Args[0] { 33778 break 33779 } 33780 if mem != x0.Args[1] { 33781 break 33782 } 33783 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)) { 33784 break 33785 } 33786 b = mergePoint(b, x0, x1) 33787 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33788 v.reset(OpCopy) 33789 v.AddArg(v0) 33790 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33791 v1.AuxInt = j1 33792 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33793 v2.AuxInt = i0 33794 v2.Aux = s 33795 v2.AddArg(p) 33796 v2.AddArg(mem) 33797 v1.AddArg(v2) 33798 v0.AddArg(v1) 33799 v0.AddArg(y) 33800 return true 33801 } 33802 return false 33803 } 33804 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 33805 b := v.Block 33806 _ = b 33807 typ := &b.Func.Config.Types 33808 _ = typ 33809 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 33810 // 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) 33811 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33812 for { 33813 _ = v.Args[1] 33814 or := v.Args[0] 33815 if or.Op != OpS390XORW { 33816 break 33817 } 33818 _ = or.Args[1] 33819 y := or.Args[0] 33820 s1 := or.Args[1] 33821 if s1.Op != OpS390XSLWconst { 33822 break 33823 } 33824 j1 := s1.AuxInt 33825 x1 := s1.Args[0] 33826 if x1.Op != OpS390XMOVBZload { 33827 break 33828 } 33829 i1 := x1.AuxInt 33830 s := x1.Aux 33831 _ = x1.Args[1] 33832 p := x1.Args[0] 33833 mem := x1.Args[1] 33834 s0 := v.Args[1] 33835 if s0.Op != OpS390XSLWconst { 33836 break 33837 } 33838 j0 := s0.AuxInt 33839 x0 := s0.Args[0] 33840 if x0.Op != OpS390XMOVBZload { 33841 break 33842 } 33843 i0 := x0.AuxInt 33844 if x0.Aux != s { 33845 break 33846 } 33847 _ = x0.Args[1] 33848 if p != x0.Args[0] { 33849 break 33850 } 33851 if mem != x0.Args[1] { 33852 break 33853 } 33854 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)) { 33855 break 33856 } 33857 b = mergePoint(b, x0, x1) 33858 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33859 v.reset(OpCopy) 33860 v.AddArg(v0) 33861 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33862 v1.AuxInt = j1 33863 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 33864 v2.AuxInt = i0 33865 v2.Aux = s 33866 v2.AddArg(p) 33867 v2.AddArg(mem) 33868 v1.AddArg(v2) 33869 v0.AddArg(v1) 33870 v0.AddArg(y) 33871 return true 33872 } 33873 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 33874 // 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) 33875 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33876 for { 33877 _ = v.Args[1] 33878 x1 := v.Args[0] 33879 if x1.Op != OpS390XMOVBZloadidx { 33880 break 33881 } 33882 i1 := x1.AuxInt 33883 s := x1.Aux 33884 _ = x1.Args[2] 33885 p := x1.Args[0] 33886 idx := x1.Args[1] 33887 mem := x1.Args[2] 33888 sh := v.Args[1] 33889 if sh.Op != OpS390XSLWconst { 33890 break 33891 } 33892 if sh.AuxInt != 8 { 33893 break 33894 } 33895 x0 := sh.Args[0] 33896 if x0.Op != OpS390XMOVBZloadidx { 33897 break 33898 } 33899 i0 := x0.AuxInt 33900 if x0.Aux != s { 33901 break 33902 } 33903 _ = x0.Args[2] 33904 if p != x0.Args[0] { 33905 break 33906 } 33907 if idx != x0.Args[1] { 33908 break 33909 } 33910 if mem != x0.Args[2] { 33911 break 33912 } 33913 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)) { 33914 break 33915 } 33916 b = mergePoint(b, x0, x1) 33917 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33918 v.reset(OpCopy) 33919 v.AddArg(v0) 33920 v0.AuxInt = i0 33921 v0.Aux = s 33922 v0.AddArg(p) 33923 v0.AddArg(idx) 33924 v0.AddArg(mem) 33925 return true 33926 } 33927 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 33928 // 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) 33929 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33930 for { 33931 _ = v.Args[1] 33932 x1 := v.Args[0] 33933 if x1.Op != OpS390XMOVBZloadidx { 33934 break 33935 } 33936 i1 := x1.AuxInt 33937 s := x1.Aux 33938 _ = x1.Args[2] 33939 idx := x1.Args[0] 33940 p := x1.Args[1] 33941 mem := x1.Args[2] 33942 sh := v.Args[1] 33943 if sh.Op != OpS390XSLWconst { 33944 break 33945 } 33946 if sh.AuxInt != 8 { 33947 break 33948 } 33949 x0 := sh.Args[0] 33950 if x0.Op != OpS390XMOVBZloadidx { 33951 break 33952 } 33953 i0 := x0.AuxInt 33954 if x0.Aux != s { 33955 break 33956 } 33957 _ = x0.Args[2] 33958 if p != x0.Args[0] { 33959 break 33960 } 33961 if idx != x0.Args[1] { 33962 break 33963 } 33964 if mem != x0.Args[2] { 33965 break 33966 } 33967 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)) { 33968 break 33969 } 33970 b = mergePoint(b, x0, x1) 33971 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33972 v.reset(OpCopy) 33973 v.AddArg(v0) 33974 v0.AuxInt = i0 33975 v0.Aux = s 33976 v0.AddArg(p) 33977 v0.AddArg(idx) 33978 v0.AddArg(mem) 33979 return true 33980 } 33981 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 33982 // 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) 33983 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33984 for { 33985 _ = v.Args[1] 33986 x1 := v.Args[0] 33987 if x1.Op != OpS390XMOVBZloadidx { 33988 break 33989 } 33990 i1 := x1.AuxInt 33991 s := x1.Aux 33992 _ = x1.Args[2] 33993 p := x1.Args[0] 33994 idx := x1.Args[1] 33995 mem := x1.Args[2] 33996 sh := v.Args[1] 33997 if sh.Op != OpS390XSLWconst { 33998 break 33999 } 34000 if sh.AuxInt != 8 { 34001 break 34002 } 34003 x0 := sh.Args[0] 34004 if x0.Op != OpS390XMOVBZloadidx { 34005 break 34006 } 34007 i0 := x0.AuxInt 34008 if x0.Aux != s { 34009 break 34010 } 34011 _ = x0.Args[2] 34012 if idx != x0.Args[0] { 34013 break 34014 } 34015 if p != x0.Args[1] { 34016 break 34017 } 34018 if mem != x0.Args[2] { 34019 break 34020 } 34021 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)) { 34022 break 34023 } 34024 b = mergePoint(b, x0, x1) 34025 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34026 v.reset(OpCopy) 34027 v.AddArg(v0) 34028 v0.AuxInt = i0 34029 v0.Aux = s 34030 v0.AddArg(p) 34031 v0.AddArg(idx) 34032 v0.AddArg(mem) 34033 return true 34034 } 34035 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 34036 // 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) 34037 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34038 for { 34039 _ = v.Args[1] 34040 x1 := v.Args[0] 34041 if x1.Op != OpS390XMOVBZloadidx { 34042 break 34043 } 34044 i1 := x1.AuxInt 34045 s := x1.Aux 34046 _ = x1.Args[2] 34047 idx := x1.Args[0] 34048 p := x1.Args[1] 34049 mem := x1.Args[2] 34050 sh := v.Args[1] 34051 if sh.Op != OpS390XSLWconst { 34052 break 34053 } 34054 if sh.AuxInt != 8 { 34055 break 34056 } 34057 x0 := sh.Args[0] 34058 if x0.Op != OpS390XMOVBZloadidx { 34059 break 34060 } 34061 i0 := x0.AuxInt 34062 if x0.Aux != s { 34063 break 34064 } 34065 _ = x0.Args[2] 34066 if idx != x0.Args[0] { 34067 break 34068 } 34069 if p != x0.Args[1] { 34070 break 34071 } 34072 if mem != x0.Args[2] { 34073 break 34074 } 34075 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)) { 34076 break 34077 } 34078 b = mergePoint(b, x0, x1) 34079 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34080 v.reset(OpCopy) 34081 v.AddArg(v0) 34082 v0.AuxInt = i0 34083 v0.Aux = s 34084 v0.AddArg(p) 34085 v0.AddArg(idx) 34086 v0.AddArg(mem) 34087 return true 34088 } 34089 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 34090 // 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) 34091 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34092 for { 34093 _ = v.Args[1] 34094 sh := v.Args[0] 34095 if sh.Op != OpS390XSLWconst { 34096 break 34097 } 34098 if sh.AuxInt != 8 { 34099 break 34100 } 34101 x0 := sh.Args[0] 34102 if x0.Op != OpS390XMOVBZloadidx { 34103 break 34104 } 34105 i0 := x0.AuxInt 34106 s := x0.Aux 34107 _ = x0.Args[2] 34108 p := x0.Args[0] 34109 idx := x0.Args[1] 34110 mem := x0.Args[2] 34111 x1 := v.Args[1] 34112 if x1.Op != OpS390XMOVBZloadidx { 34113 break 34114 } 34115 i1 := x1.AuxInt 34116 if x1.Aux != s { 34117 break 34118 } 34119 _ = x1.Args[2] 34120 if p != x1.Args[0] { 34121 break 34122 } 34123 if idx != x1.Args[1] { 34124 break 34125 } 34126 if mem != x1.Args[2] { 34127 break 34128 } 34129 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)) { 34130 break 34131 } 34132 b = mergePoint(b, x0, x1) 34133 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34134 v.reset(OpCopy) 34135 v.AddArg(v0) 34136 v0.AuxInt = i0 34137 v0.Aux = s 34138 v0.AddArg(p) 34139 v0.AddArg(idx) 34140 v0.AddArg(mem) 34141 return true 34142 } 34143 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 34144 // 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) 34145 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34146 for { 34147 _ = v.Args[1] 34148 sh := v.Args[0] 34149 if sh.Op != OpS390XSLWconst { 34150 break 34151 } 34152 if sh.AuxInt != 8 { 34153 break 34154 } 34155 x0 := sh.Args[0] 34156 if x0.Op != OpS390XMOVBZloadidx { 34157 break 34158 } 34159 i0 := x0.AuxInt 34160 s := x0.Aux 34161 _ = x0.Args[2] 34162 idx := x0.Args[0] 34163 p := x0.Args[1] 34164 mem := x0.Args[2] 34165 x1 := v.Args[1] 34166 if x1.Op != OpS390XMOVBZloadidx { 34167 break 34168 } 34169 i1 := x1.AuxInt 34170 if x1.Aux != s { 34171 break 34172 } 34173 _ = x1.Args[2] 34174 if p != x1.Args[0] { 34175 break 34176 } 34177 if idx != x1.Args[1] { 34178 break 34179 } 34180 if mem != x1.Args[2] { 34181 break 34182 } 34183 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)) { 34184 break 34185 } 34186 b = mergePoint(b, x0, x1) 34187 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34188 v.reset(OpCopy) 34189 v.AddArg(v0) 34190 v0.AuxInt = i0 34191 v0.Aux = s 34192 v0.AddArg(p) 34193 v0.AddArg(idx) 34194 v0.AddArg(mem) 34195 return true 34196 } 34197 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 34198 // 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) 34199 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34200 for { 34201 _ = v.Args[1] 34202 sh := v.Args[0] 34203 if sh.Op != OpS390XSLWconst { 34204 break 34205 } 34206 if sh.AuxInt != 8 { 34207 break 34208 } 34209 x0 := sh.Args[0] 34210 if x0.Op != OpS390XMOVBZloadidx { 34211 break 34212 } 34213 i0 := x0.AuxInt 34214 s := x0.Aux 34215 _ = x0.Args[2] 34216 p := x0.Args[0] 34217 idx := x0.Args[1] 34218 mem := x0.Args[2] 34219 x1 := v.Args[1] 34220 if x1.Op != OpS390XMOVBZloadidx { 34221 break 34222 } 34223 i1 := x1.AuxInt 34224 if x1.Aux != s { 34225 break 34226 } 34227 _ = x1.Args[2] 34228 if idx != x1.Args[0] { 34229 break 34230 } 34231 if p != x1.Args[1] { 34232 break 34233 } 34234 if mem != x1.Args[2] { 34235 break 34236 } 34237 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)) { 34238 break 34239 } 34240 b = mergePoint(b, x0, x1) 34241 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34242 v.reset(OpCopy) 34243 v.AddArg(v0) 34244 v0.AuxInt = i0 34245 v0.Aux = s 34246 v0.AddArg(p) 34247 v0.AddArg(idx) 34248 v0.AddArg(mem) 34249 return true 34250 } 34251 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 34252 // 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) 34253 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34254 for { 34255 _ = v.Args[1] 34256 sh := v.Args[0] 34257 if sh.Op != OpS390XSLWconst { 34258 break 34259 } 34260 if sh.AuxInt != 8 { 34261 break 34262 } 34263 x0 := sh.Args[0] 34264 if x0.Op != OpS390XMOVBZloadidx { 34265 break 34266 } 34267 i0 := x0.AuxInt 34268 s := x0.Aux 34269 _ = x0.Args[2] 34270 idx := x0.Args[0] 34271 p := x0.Args[1] 34272 mem := x0.Args[2] 34273 x1 := v.Args[1] 34274 if x1.Op != OpS390XMOVBZloadidx { 34275 break 34276 } 34277 i1 := x1.AuxInt 34278 if x1.Aux != s { 34279 break 34280 } 34281 _ = x1.Args[2] 34282 if idx != x1.Args[0] { 34283 break 34284 } 34285 if p != x1.Args[1] { 34286 break 34287 } 34288 if mem != x1.Args[2] { 34289 break 34290 } 34291 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)) { 34292 break 34293 } 34294 b = mergePoint(b, x0, x1) 34295 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34296 v.reset(OpCopy) 34297 v.AddArg(v0) 34298 v0.AuxInt = i0 34299 v0.Aux = s 34300 v0.AddArg(p) 34301 v0.AddArg(idx) 34302 v0.AddArg(mem) 34303 return true 34304 } 34305 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 34306 // 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) 34307 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34308 for { 34309 _ = v.Args[1] 34310 x1 := v.Args[0] 34311 if x1.Op != OpS390XMOVHZloadidx { 34312 break 34313 } 34314 i1 := x1.AuxInt 34315 s := x1.Aux 34316 _ = x1.Args[2] 34317 p := x1.Args[0] 34318 idx := x1.Args[1] 34319 mem := x1.Args[2] 34320 sh := v.Args[1] 34321 if sh.Op != OpS390XSLWconst { 34322 break 34323 } 34324 if sh.AuxInt != 16 { 34325 break 34326 } 34327 x0 := sh.Args[0] 34328 if x0.Op != OpS390XMOVHZloadidx { 34329 break 34330 } 34331 i0 := x0.AuxInt 34332 if x0.Aux != s { 34333 break 34334 } 34335 _ = x0.Args[2] 34336 if p != x0.Args[0] { 34337 break 34338 } 34339 if idx != x0.Args[1] { 34340 break 34341 } 34342 if mem != x0.Args[2] { 34343 break 34344 } 34345 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)) { 34346 break 34347 } 34348 b = mergePoint(b, x0, x1) 34349 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34350 v.reset(OpCopy) 34351 v.AddArg(v0) 34352 v0.AuxInt = i0 34353 v0.Aux = s 34354 v0.AddArg(p) 34355 v0.AddArg(idx) 34356 v0.AddArg(mem) 34357 return true 34358 } 34359 return false 34360 } 34361 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 34362 b := v.Block 34363 _ = b 34364 typ := &b.Func.Config.Types 34365 _ = typ 34366 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 34367 // 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) 34368 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34369 for { 34370 _ = v.Args[1] 34371 x1 := v.Args[0] 34372 if x1.Op != OpS390XMOVHZloadidx { 34373 break 34374 } 34375 i1 := x1.AuxInt 34376 s := x1.Aux 34377 _ = x1.Args[2] 34378 idx := x1.Args[0] 34379 p := x1.Args[1] 34380 mem := x1.Args[2] 34381 sh := v.Args[1] 34382 if sh.Op != OpS390XSLWconst { 34383 break 34384 } 34385 if sh.AuxInt != 16 { 34386 break 34387 } 34388 x0 := sh.Args[0] 34389 if x0.Op != OpS390XMOVHZloadidx { 34390 break 34391 } 34392 i0 := x0.AuxInt 34393 if x0.Aux != s { 34394 break 34395 } 34396 _ = x0.Args[2] 34397 if p != x0.Args[0] { 34398 break 34399 } 34400 if idx != x0.Args[1] { 34401 break 34402 } 34403 if mem != x0.Args[2] { 34404 break 34405 } 34406 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)) { 34407 break 34408 } 34409 b = mergePoint(b, x0, x1) 34410 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34411 v.reset(OpCopy) 34412 v.AddArg(v0) 34413 v0.AuxInt = i0 34414 v0.Aux = s 34415 v0.AddArg(p) 34416 v0.AddArg(idx) 34417 v0.AddArg(mem) 34418 return true 34419 } 34420 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 34421 // 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) 34422 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34423 for { 34424 _ = v.Args[1] 34425 x1 := v.Args[0] 34426 if x1.Op != OpS390XMOVHZloadidx { 34427 break 34428 } 34429 i1 := x1.AuxInt 34430 s := x1.Aux 34431 _ = x1.Args[2] 34432 p := x1.Args[0] 34433 idx := x1.Args[1] 34434 mem := x1.Args[2] 34435 sh := v.Args[1] 34436 if sh.Op != OpS390XSLWconst { 34437 break 34438 } 34439 if sh.AuxInt != 16 { 34440 break 34441 } 34442 x0 := sh.Args[0] 34443 if x0.Op != OpS390XMOVHZloadidx { 34444 break 34445 } 34446 i0 := x0.AuxInt 34447 if x0.Aux != s { 34448 break 34449 } 34450 _ = x0.Args[2] 34451 if idx != x0.Args[0] { 34452 break 34453 } 34454 if p != x0.Args[1] { 34455 break 34456 } 34457 if mem != x0.Args[2] { 34458 break 34459 } 34460 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)) { 34461 break 34462 } 34463 b = mergePoint(b, x0, x1) 34464 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34465 v.reset(OpCopy) 34466 v.AddArg(v0) 34467 v0.AuxInt = i0 34468 v0.Aux = s 34469 v0.AddArg(p) 34470 v0.AddArg(idx) 34471 v0.AddArg(mem) 34472 return true 34473 } 34474 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 34475 // 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) 34476 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34477 for { 34478 _ = v.Args[1] 34479 x1 := v.Args[0] 34480 if x1.Op != OpS390XMOVHZloadidx { 34481 break 34482 } 34483 i1 := x1.AuxInt 34484 s := x1.Aux 34485 _ = x1.Args[2] 34486 idx := x1.Args[0] 34487 p := x1.Args[1] 34488 mem := x1.Args[2] 34489 sh := v.Args[1] 34490 if sh.Op != OpS390XSLWconst { 34491 break 34492 } 34493 if sh.AuxInt != 16 { 34494 break 34495 } 34496 x0 := sh.Args[0] 34497 if x0.Op != OpS390XMOVHZloadidx { 34498 break 34499 } 34500 i0 := x0.AuxInt 34501 if x0.Aux != s { 34502 break 34503 } 34504 _ = x0.Args[2] 34505 if idx != x0.Args[0] { 34506 break 34507 } 34508 if p != x0.Args[1] { 34509 break 34510 } 34511 if mem != x0.Args[2] { 34512 break 34513 } 34514 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)) { 34515 break 34516 } 34517 b = mergePoint(b, x0, x1) 34518 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34519 v.reset(OpCopy) 34520 v.AddArg(v0) 34521 v0.AuxInt = i0 34522 v0.Aux = s 34523 v0.AddArg(p) 34524 v0.AddArg(idx) 34525 v0.AddArg(mem) 34526 return true 34527 } 34528 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 34529 // 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) 34530 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34531 for { 34532 _ = v.Args[1] 34533 sh := v.Args[0] 34534 if sh.Op != OpS390XSLWconst { 34535 break 34536 } 34537 if sh.AuxInt != 16 { 34538 break 34539 } 34540 x0 := sh.Args[0] 34541 if x0.Op != OpS390XMOVHZloadidx { 34542 break 34543 } 34544 i0 := x0.AuxInt 34545 s := x0.Aux 34546 _ = x0.Args[2] 34547 p := x0.Args[0] 34548 idx := x0.Args[1] 34549 mem := x0.Args[2] 34550 x1 := v.Args[1] 34551 if x1.Op != OpS390XMOVHZloadidx { 34552 break 34553 } 34554 i1 := x1.AuxInt 34555 if x1.Aux != s { 34556 break 34557 } 34558 _ = x1.Args[2] 34559 if p != x1.Args[0] { 34560 break 34561 } 34562 if idx != x1.Args[1] { 34563 break 34564 } 34565 if mem != x1.Args[2] { 34566 break 34567 } 34568 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)) { 34569 break 34570 } 34571 b = mergePoint(b, x0, x1) 34572 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34573 v.reset(OpCopy) 34574 v.AddArg(v0) 34575 v0.AuxInt = i0 34576 v0.Aux = s 34577 v0.AddArg(p) 34578 v0.AddArg(idx) 34579 v0.AddArg(mem) 34580 return true 34581 } 34582 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 34583 // 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) 34584 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34585 for { 34586 _ = v.Args[1] 34587 sh := v.Args[0] 34588 if sh.Op != OpS390XSLWconst { 34589 break 34590 } 34591 if sh.AuxInt != 16 { 34592 break 34593 } 34594 x0 := sh.Args[0] 34595 if x0.Op != OpS390XMOVHZloadidx { 34596 break 34597 } 34598 i0 := x0.AuxInt 34599 s := x0.Aux 34600 _ = x0.Args[2] 34601 idx := x0.Args[0] 34602 p := x0.Args[1] 34603 mem := x0.Args[2] 34604 x1 := v.Args[1] 34605 if x1.Op != OpS390XMOVHZloadidx { 34606 break 34607 } 34608 i1 := x1.AuxInt 34609 if x1.Aux != s { 34610 break 34611 } 34612 _ = x1.Args[2] 34613 if p != x1.Args[0] { 34614 break 34615 } 34616 if idx != x1.Args[1] { 34617 break 34618 } 34619 if mem != x1.Args[2] { 34620 break 34621 } 34622 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)) { 34623 break 34624 } 34625 b = mergePoint(b, x0, x1) 34626 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34627 v.reset(OpCopy) 34628 v.AddArg(v0) 34629 v0.AuxInt = i0 34630 v0.Aux = s 34631 v0.AddArg(p) 34632 v0.AddArg(idx) 34633 v0.AddArg(mem) 34634 return true 34635 } 34636 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 34637 // 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) 34638 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34639 for { 34640 _ = v.Args[1] 34641 sh := v.Args[0] 34642 if sh.Op != OpS390XSLWconst { 34643 break 34644 } 34645 if sh.AuxInt != 16 { 34646 break 34647 } 34648 x0 := sh.Args[0] 34649 if x0.Op != OpS390XMOVHZloadidx { 34650 break 34651 } 34652 i0 := x0.AuxInt 34653 s := x0.Aux 34654 _ = x0.Args[2] 34655 p := x0.Args[0] 34656 idx := x0.Args[1] 34657 mem := x0.Args[2] 34658 x1 := v.Args[1] 34659 if x1.Op != OpS390XMOVHZloadidx { 34660 break 34661 } 34662 i1 := x1.AuxInt 34663 if x1.Aux != s { 34664 break 34665 } 34666 _ = x1.Args[2] 34667 if idx != x1.Args[0] { 34668 break 34669 } 34670 if p != x1.Args[1] { 34671 break 34672 } 34673 if mem != x1.Args[2] { 34674 break 34675 } 34676 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)) { 34677 break 34678 } 34679 b = mergePoint(b, x0, x1) 34680 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34681 v.reset(OpCopy) 34682 v.AddArg(v0) 34683 v0.AuxInt = i0 34684 v0.Aux = s 34685 v0.AddArg(p) 34686 v0.AddArg(idx) 34687 v0.AddArg(mem) 34688 return true 34689 } 34690 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 34691 // 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) 34692 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34693 for { 34694 _ = v.Args[1] 34695 sh := v.Args[0] 34696 if sh.Op != OpS390XSLWconst { 34697 break 34698 } 34699 if sh.AuxInt != 16 { 34700 break 34701 } 34702 x0 := sh.Args[0] 34703 if x0.Op != OpS390XMOVHZloadidx { 34704 break 34705 } 34706 i0 := x0.AuxInt 34707 s := x0.Aux 34708 _ = x0.Args[2] 34709 idx := x0.Args[0] 34710 p := x0.Args[1] 34711 mem := x0.Args[2] 34712 x1 := v.Args[1] 34713 if x1.Op != OpS390XMOVHZloadidx { 34714 break 34715 } 34716 i1 := x1.AuxInt 34717 if x1.Aux != s { 34718 break 34719 } 34720 _ = x1.Args[2] 34721 if idx != x1.Args[0] { 34722 break 34723 } 34724 if p != x1.Args[1] { 34725 break 34726 } 34727 if mem != x1.Args[2] { 34728 break 34729 } 34730 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)) { 34731 break 34732 } 34733 b = mergePoint(b, x0, x1) 34734 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34735 v.reset(OpCopy) 34736 v.AddArg(v0) 34737 v0.AuxInt = i0 34738 v0.Aux = s 34739 v0.AddArg(p) 34740 v0.AddArg(idx) 34741 v0.AddArg(mem) 34742 return true 34743 } 34744 // 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)) 34745 // 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) 34746 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34747 for { 34748 _ = v.Args[1] 34749 s0 := v.Args[0] 34750 if s0.Op != OpS390XSLWconst { 34751 break 34752 } 34753 j0 := s0.AuxInt 34754 x0 := s0.Args[0] 34755 if x0.Op != OpS390XMOVBZloadidx { 34756 break 34757 } 34758 i0 := x0.AuxInt 34759 s := x0.Aux 34760 _ = x0.Args[2] 34761 p := x0.Args[0] 34762 idx := x0.Args[1] 34763 mem := x0.Args[2] 34764 or := v.Args[1] 34765 if or.Op != OpS390XORW { 34766 break 34767 } 34768 _ = or.Args[1] 34769 s1 := or.Args[0] 34770 if s1.Op != OpS390XSLWconst { 34771 break 34772 } 34773 j1 := s1.AuxInt 34774 x1 := s1.Args[0] 34775 if x1.Op != OpS390XMOVBZloadidx { 34776 break 34777 } 34778 i1 := x1.AuxInt 34779 if x1.Aux != s { 34780 break 34781 } 34782 _ = x1.Args[2] 34783 if p != x1.Args[0] { 34784 break 34785 } 34786 if idx != x1.Args[1] { 34787 break 34788 } 34789 if mem != x1.Args[2] { 34790 break 34791 } 34792 y := or.Args[1] 34793 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)) { 34794 break 34795 } 34796 b = mergePoint(b, x0, x1) 34797 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34798 v.reset(OpCopy) 34799 v.AddArg(v0) 34800 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34801 v1.AuxInt = j1 34802 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34803 v2.AuxInt = i0 34804 v2.Aux = s 34805 v2.AddArg(p) 34806 v2.AddArg(idx) 34807 v2.AddArg(mem) 34808 v1.AddArg(v2) 34809 v0.AddArg(v1) 34810 v0.AddArg(y) 34811 return true 34812 } 34813 // 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)) 34814 // 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) 34815 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34816 for { 34817 _ = v.Args[1] 34818 s0 := v.Args[0] 34819 if s0.Op != OpS390XSLWconst { 34820 break 34821 } 34822 j0 := s0.AuxInt 34823 x0 := s0.Args[0] 34824 if x0.Op != OpS390XMOVBZloadidx { 34825 break 34826 } 34827 i0 := x0.AuxInt 34828 s := x0.Aux 34829 _ = x0.Args[2] 34830 idx := x0.Args[0] 34831 p := x0.Args[1] 34832 mem := x0.Args[2] 34833 or := v.Args[1] 34834 if or.Op != OpS390XORW { 34835 break 34836 } 34837 _ = or.Args[1] 34838 s1 := or.Args[0] 34839 if s1.Op != OpS390XSLWconst { 34840 break 34841 } 34842 j1 := s1.AuxInt 34843 x1 := s1.Args[0] 34844 if x1.Op != OpS390XMOVBZloadidx { 34845 break 34846 } 34847 i1 := x1.AuxInt 34848 if x1.Aux != s { 34849 break 34850 } 34851 _ = x1.Args[2] 34852 if p != x1.Args[0] { 34853 break 34854 } 34855 if idx != x1.Args[1] { 34856 break 34857 } 34858 if mem != x1.Args[2] { 34859 break 34860 } 34861 y := or.Args[1] 34862 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)) { 34863 break 34864 } 34865 b = mergePoint(b, x0, x1) 34866 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34867 v.reset(OpCopy) 34868 v.AddArg(v0) 34869 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34870 v1.AuxInt = j1 34871 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34872 v2.AuxInt = i0 34873 v2.Aux = s 34874 v2.AddArg(p) 34875 v2.AddArg(idx) 34876 v2.AddArg(mem) 34877 v1.AddArg(v2) 34878 v0.AddArg(v1) 34879 v0.AddArg(y) 34880 return true 34881 } 34882 // 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)) 34883 // 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) 34884 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34885 for { 34886 _ = v.Args[1] 34887 s0 := v.Args[0] 34888 if s0.Op != OpS390XSLWconst { 34889 break 34890 } 34891 j0 := s0.AuxInt 34892 x0 := s0.Args[0] 34893 if x0.Op != OpS390XMOVBZloadidx { 34894 break 34895 } 34896 i0 := x0.AuxInt 34897 s := x0.Aux 34898 _ = x0.Args[2] 34899 p := x0.Args[0] 34900 idx := x0.Args[1] 34901 mem := x0.Args[2] 34902 or := v.Args[1] 34903 if or.Op != OpS390XORW { 34904 break 34905 } 34906 _ = or.Args[1] 34907 s1 := or.Args[0] 34908 if s1.Op != OpS390XSLWconst { 34909 break 34910 } 34911 j1 := s1.AuxInt 34912 x1 := s1.Args[0] 34913 if x1.Op != OpS390XMOVBZloadidx { 34914 break 34915 } 34916 i1 := x1.AuxInt 34917 if x1.Aux != s { 34918 break 34919 } 34920 _ = x1.Args[2] 34921 if idx != x1.Args[0] { 34922 break 34923 } 34924 if p != x1.Args[1] { 34925 break 34926 } 34927 if mem != x1.Args[2] { 34928 break 34929 } 34930 y := or.Args[1] 34931 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)) { 34932 break 34933 } 34934 b = mergePoint(b, x0, x1) 34935 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34936 v.reset(OpCopy) 34937 v.AddArg(v0) 34938 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34939 v1.AuxInt = j1 34940 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34941 v2.AuxInt = i0 34942 v2.Aux = s 34943 v2.AddArg(p) 34944 v2.AddArg(idx) 34945 v2.AddArg(mem) 34946 v1.AddArg(v2) 34947 v0.AddArg(v1) 34948 v0.AddArg(y) 34949 return true 34950 } 34951 return false 34952 } 34953 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 34954 b := v.Block 34955 _ = b 34956 typ := &b.Func.Config.Types 34957 _ = typ 34958 // 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)) 34959 // 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) 34960 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34961 for { 34962 _ = v.Args[1] 34963 s0 := v.Args[0] 34964 if s0.Op != OpS390XSLWconst { 34965 break 34966 } 34967 j0 := s0.AuxInt 34968 x0 := s0.Args[0] 34969 if x0.Op != OpS390XMOVBZloadidx { 34970 break 34971 } 34972 i0 := x0.AuxInt 34973 s := x0.Aux 34974 _ = x0.Args[2] 34975 idx := x0.Args[0] 34976 p := x0.Args[1] 34977 mem := x0.Args[2] 34978 or := v.Args[1] 34979 if or.Op != OpS390XORW { 34980 break 34981 } 34982 _ = or.Args[1] 34983 s1 := or.Args[0] 34984 if s1.Op != OpS390XSLWconst { 34985 break 34986 } 34987 j1 := s1.AuxInt 34988 x1 := s1.Args[0] 34989 if x1.Op != OpS390XMOVBZloadidx { 34990 break 34991 } 34992 i1 := x1.AuxInt 34993 if x1.Aux != s { 34994 break 34995 } 34996 _ = x1.Args[2] 34997 if idx != x1.Args[0] { 34998 break 34999 } 35000 if p != x1.Args[1] { 35001 break 35002 } 35003 if mem != x1.Args[2] { 35004 break 35005 } 35006 y := or.Args[1] 35007 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)) { 35008 break 35009 } 35010 b = mergePoint(b, x0, x1) 35011 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35012 v.reset(OpCopy) 35013 v.AddArg(v0) 35014 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35015 v1.AuxInt = j1 35016 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35017 v2.AuxInt = i0 35018 v2.Aux = s 35019 v2.AddArg(p) 35020 v2.AddArg(idx) 35021 v2.AddArg(mem) 35022 v1.AddArg(v2) 35023 v0.AddArg(v1) 35024 v0.AddArg(y) 35025 return true 35026 } 35027 // 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)))) 35028 // 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) 35029 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35030 for { 35031 _ = v.Args[1] 35032 s0 := v.Args[0] 35033 if s0.Op != OpS390XSLWconst { 35034 break 35035 } 35036 j0 := s0.AuxInt 35037 x0 := s0.Args[0] 35038 if x0.Op != OpS390XMOVBZloadidx { 35039 break 35040 } 35041 i0 := x0.AuxInt 35042 s := x0.Aux 35043 _ = x0.Args[2] 35044 p := x0.Args[0] 35045 idx := x0.Args[1] 35046 mem := x0.Args[2] 35047 or := v.Args[1] 35048 if or.Op != OpS390XORW { 35049 break 35050 } 35051 _ = or.Args[1] 35052 y := or.Args[0] 35053 s1 := or.Args[1] 35054 if s1.Op != OpS390XSLWconst { 35055 break 35056 } 35057 j1 := s1.AuxInt 35058 x1 := s1.Args[0] 35059 if x1.Op != OpS390XMOVBZloadidx { 35060 break 35061 } 35062 i1 := x1.AuxInt 35063 if x1.Aux != s { 35064 break 35065 } 35066 _ = x1.Args[2] 35067 if p != x1.Args[0] { 35068 break 35069 } 35070 if idx != x1.Args[1] { 35071 break 35072 } 35073 if mem != x1.Args[2] { 35074 break 35075 } 35076 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)) { 35077 break 35078 } 35079 b = mergePoint(b, x0, x1) 35080 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35081 v.reset(OpCopy) 35082 v.AddArg(v0) 35083 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35084 v1.AuxInt = j1 35085 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35086 v2.AuxInt = i0 35087 v2.Aux = s 35088 v2.AddArg(p) 35089 v2.AddArg(idx) 35090 v2.AddArg(mem) 35091 v1.AddArg(v2) 35092 v0.AddArg(v1) 35093 v0.AddArg(y) 35094 return true 35095 } 35096 // 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)))) 35097 // 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) 35098 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35099 for { 35100 _ = v.Args[1] 35101 s0 := v.Args[0] 35102 if s0.Op != OpS390XSLWconst { 35103 break 35104 } 35105 j0 := s0.AuxInt 35106 x0 := s0.Args[0] 35107 if x0.Op != OpS390XMOVBZloadidx { 35108 break 35109 } 35110 i0 := x0.AuxInt 35111 s := x0.Aux 35112 _ = x0.Args[2] 35113 idx := x0.Args[0] 35114 p := x0.Args[1] 35115 mem := x0.Args[2] 35116 or := v.Args[1] 35117 if or.Op != OpS390XORW { 35118 break 35119 } 35120 _ = or.Args[1] 35121 y := or.Args[0] 35122 s1 := or.Args[1] 35123 if s1.Op != OpS390XSLWconst { 35124 break 35125 } 35126 j1 := s1.AuxInt 35127 x1 := s1.Args[0] 35128 if x1.Op != OpS390XMOVBZloadidx { 35129 break 35130 } 35131 i1 := x1.AuxInt 35132 if x1.Aux != s { 35133 break 35134 } 35135 _ = x1.Args[2] 35136 if p != x1.Args[0] { 35137 break 35138 } 35139 if idx != x1.Args[1] { 35140 break 35141 } 35142 if mem != x1.Args[2] { 35143 break 35144 } 35145 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)) { 35146 break 35147 } 35148 b = mergePoint(b, x0, x1) 35149 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35150 v.reset(OpCopy) 35151 v.AddArg(v0) 35152 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35153 v1.AuxInt = j1 35154 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35155 v2.AuxInt = i0 35156 v2.Aux = s 35157 v2.AddArg(p) 35158 v2.AddArg(idx) 35159 v2.AddArg(mem) 35160 v1.AddArg(v2) 35161 v0.AddArg(v1) 35162 v0.AddArg(y) 35163 return true 35164 } 35165 // 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)))) 35166 // 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) 35167 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35168 for { 35169 _ = v.Args[1] 35170 s0 := v.Args[0] 35171 if s0.Op != OpS390XSLWconst { 35172 break 35173 } 35174 j0 := s0.AuxInt 35175 x0 := s0.Args[0] 35176 if x0.Op != OpS390XMOVBZloadidx { 35177 break 35178 } 35179 i0 := x0.AuxInt 35180 s := x0.Aux 35181 _ = x0.Args[2] 35182 p := x0.Args[0] 35183 idx := x0.Args[1] 35184 mem := x0.Args[2] 35185 or := v.Args[1] 35186 if or.Op != OpS390XORW { 35187 break 35188 } 35189 _ = or.Args[1] 35190 y := or.Args[0] 35191 s1 := or.Args[1] 35192 if s1.Op != OpS390XSLWconst { 35193 break 35194 } 35195 j1 := s1.AuxInt 35196 x1 := s1.Args[0] 35197 if x1.Op != OpS390XMOVBZloadidx { 35198 break 35199 } 35200 i1 := x1.AuxInt 35201 if x1.Aux != s { 35202 break 35203 } 35204 _ = x1.Args[2] 35205 if idx != x1.Args[0] { 35206 break 35207 } 35208 if p != x1.Args[1] { 35209 break 35210 } 35211 if mem != x1.Args[2] { 35212 break 35213 } 35214 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)) { 35215 break 35216 } 35217 b = mergePoint(b, x0, x1) 35218 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35219 v.reset(OpCopy) 35220 v.AddArg(v0) 35221 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35222 v1.AuxInt = j1 35223 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35224 v2.AuxInt = i0 35225 v2.Aux = s 35226 v2.AddArg(p) 35227 v2.AddArg(idx) 35228 v2.AddArg(mem) 35229 v1.AddArg(v2) 35230 v0.AddArg(v1) 35231 v0.AddArg(y) 35232 return true 35233 } 35234 // 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)))) 35235 // 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) 35236 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35237 for { 35238 _ = v.Args[1] 35239 s0 := v.Args[0] 35240 if s0.Op != OpS390XSLWconst { 35241 break 35242 } 35243 j0 := s0.AuxInt 35244 x0 := s0.Args[0] 35245 if x0.Op != OpS390XMOVBZloadidx { 35246 break 35247 } 35248 i0 := x0.AuxInt 35249 s := x0.Aux 35250 _ = x0.Args[2] 35251 idx := x0.Args[0] 35252 p := x0.Args[1] 35253 mem := x0.Args[2] 35254 or := v.Args[1] 35255 if or.Op != OpS390XORW { 35256 break 35257 } 35258 _ = or.Args[1] 35259 y := or.Args[0] 35260 s1 := or.Args[1] 35261 if s1.Op != OpS390XSLWconst { 35262 break 35263 } 35264 j1 := s1.AuxInt 35265 x1 := s1.Args[0] 35266 if x1.Op != OpS390XMOVBZloadidx { 35267 break 35268 } 35269 i1 := x1.AuxInt 35270 if x1.Aux != s { 35271 break 35272 } 35273 _ = x1.Args[2] 35274 if idx != x1.Args[0] { 35275 break 35276 } 35277 if p != x1.Args[1] { 35278 break 35279 } 35280 if mem != x1.Args[2] { 35281 break 35282 } 35283 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)) { 35284 break 35285 } 35286 b = mergePoint(b, x0, x1) 35287 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35288 v.reset(OpCopy) 35289 v.AddArg(v0) 35290 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35291 v1.AuxInt = j1 35292 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35293 v2.AuxInt = i0 35294 v2.Aux = s 35295 v2.AddArg(p) 35296 v2.AddArg(idx) 35297 v2.AddArg(mem) 35298 v1.AddArg(v2) 35299 v0.AddArg(v1) 35300 v0.AddArg(y) 35301 return true 35302 } 35303 // 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))) 35304 // 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) 35305 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35306 for { 35307 _ = v.Args[1] 35308 or := v.Args[0] 35309 if or.Op != OpS390XORW { 35310 break 35311 } 35312 _ = or.Args[1] 35313 s1 := or.Args[0] 35314 if s1.Op != OpS390XSLWconst { 35315 break 35316 } 35317 j1 := s1.AuxInt 35318 x1 := s1.Args[0] 35319 if x1.Op != OpS390XMOVBZloadidx { 35320 break 35321 } 35322 i1 := x1.AuxInt 35323 s := x1.Aux 35324 _ = x1.Args[2] 35325 p := x1.Args[0] 35326 idx := x1.Args[1] 35327 mem := x1.Args[2] 35328 y := or.Args[1] 35329 s0 := v.Args[1] 35330 if s0.Op != OpS390XSLWconst { 35331 break 35332 } 35333 j0 := s0.AuxInt 35334 x0 := s0.Args[0] 35335 if x0.Op != OpS390XMOVBZloadidx { 35336 break 35337 } 35338 i0 := x0.AuxInt 35339 if x0.Aux != s { 35340 break 35341 } 35342 _ = x0.Args[2] 35343 if p != x0.Args[0] { 35344 break 35345 } 35346 if idx != x0.Args[1] { 35347 break 35348 } 35349 if mem != x0.Args[2] { 35350 break 35351 } 35352 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)) { 35353 break 35354 } 35355 b = mergePoint(b, x0, x1) 35356 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35357 v.reset(OpCopy) 35358 v.AddArg(v0) 35359 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35360 v1.AuxInt = j1 35361 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35362 v2.AuxInt = i0 35363 v2.Aux = s 35364 v2.AddArg(p) 35365 v2.AddArg(idx) 35366 v2.AddArg(mem) 35367 v1.AddArg(v2) 35368 v0.AddArg(v1) 35369 v0.AddArg(y) 35370 return true 35371 } 35372 // 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))) 35373 // 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) 35374 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35375 for { 35376 _ = v.Args[1] 35377 or := v.Args[0] 35378 if or.Op != OpS390XORW { 35379 break 35380 } 35381 _ = or.Args[1] 35382 s1 := or.Args[0] 35383 if s1.Op != OpS390XSLWconst { 35384 break 35385 } 35386 j1 := s1.AuxInt 35387 x1 := s1.Args[0] 35388 if x1.Op != OpS390XMOVBZloadidx { 35389 break 35390 } 35391 i1 := x1.AuxInt 35392 s := x1.Aux 35393 _ = x1.Args[2] 35394 idx := x1.Args[0] 35395 p := x1.Args[1] 35396 mem := x1.Args[2] 35397 y := or.Args[1] 35398 s0 := v.Args[1] 35399 if s0.Op != OpS390XSLWconst { 35400 break 35401 } 35402 j0 := s0.AuxInt 35403 x0 := s0.Args[0] 35404 if x0.Op != OpS390XMOVBZloadidx { 35405 break 35406 } 35407 i0 := x0.AuxInt 35408 if x0.Aux != s { 35409 break 35410 } 35411 _ = x0.Args[2] 35412 if p != x0.Args[0] { 35413 break 35414 } 35415 if idx != x0.Args[1] { 35416 break 35417 } 35418 if mem != x0.Args[2] { 35419 break 35420 } 35421 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)) { 35422 break 35423 } 35424 b = mergePoint(b, x0, x1) 35425 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35426 v.reset(OpCopy) 35427 v.AddArg(v0) 35428 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35429 v1.AuxInt = j1 35430 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35431 v2.AuxInt = i0 35432 v2.Aux = s 35433 v2.AddArg(p) 35434 v2.AddArg(idx) 35435 v2.AddArg(mem) 35436 v1.AddArg(v2) 35437 v0.AddArg(v1) 35438 v0.AddArg(y) 35439 return true 35440 } 35441 // 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))) 35442 // 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) 35443 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35444 for { 35445 _ = v.Args[1] 35446 or := v.Args[0] 35447 if or.Op != OpS390XORW { 35448 break 35449 } 35450 _ = or.Args[1] 35451 y := or.Args[0] 35452 s1 := or.Args[1] 35453 if s1.Op != OpS390XSLWconst { 35454 break 35455 } 35456 j1 := s1.AuxInt 35457 x1 := s1.Args[0] 35458 if x1.Op != OpS390XMOVBZloadidx { 35459 break 35460 } 35461 i1 := x1.AuxInt 35462 s := x1.Aux 35463 _ = x1.Args[2] 35464 p := x1.Args[0] 35465 idx := x1.Args[1] 35466 mem := x1.Args[2] 35467 s0 := v.Args[1] 35468 if s0.Op != OpS390XSLWconst { 35469 break 35470 } 35471 j0 := s0.AuxInt 35472 x0 := s0.Args[0] 35473 if x0.Op != OpS390XMOVBZloadidx { 35474 break 35475 } 35476 i0 := x0.AuxInt 35477 if x0.Aux != s { 35478 break 35479 } 35480 _ = x0.Args[2] 35481 if p != x0.Args[0] { 35482 break 35483 } 35484 if idx != x0.Args[1] { 35485 break 35486 } 35487 if mem != x0.Args[2] { 35488 break 35489 } 35490 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)) { 35491 break 35492 } 35493 b = mergePoint(b, x0, x1) 35494 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35495 v.reset(OpCopy) 35496 v.AddArg(v0) 35497 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35498 v1.AuxInt = j1 35499 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35500 v2.AuxInt = i0 35501 v2.Aux = s 35502 v2.AddArg(p) 35503 v2.AddArg(idx) 35504 v2.AddArg(mem) 35505 v1.AddArg(v2) 35506 v0.AddArg(v1) 35507 v0.AddArg(y) 35508 return true 35509 } 35510 // 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))) 35511 // 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) 35512 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35513 for { 35514 _ = v.Args[1] 35515 or := v.Args[0] 35516 if or.Op != OpS390XORW { 35517 break 35518 } 35519 _ = or.Args[1] 35520 y := or.Args[0] 35521 s1 := or.Args[1] 35522 if s1.Op != OpS390XSLWconst { 35523 break 35524 } 35525 j1 := s1.AuxInt 35526 x1 := s1.Args[0] 35527 if x1.Op != OpS390XMOVBZloadidx { 35528 break 35529 } 35530 i1 := x1.AuxInt 35531 s := x1.Aux 35532 _ = x1.Args[2] 35533 idx := x1.Args[0] 35534 p := x1.Args[1] 35535 mem := x1.Args[2] 35536 s0 := v.Args[1] 35537 if s0.Op != OpS390XSLWconst { 35538 break 35539 } 35540 j0 := s0.AuxInt 35541 x0 := s0.Args[0] 35542 if x0.Op != OpS390XMOVBZloadidx { 35543 break 35544 } 35545 i0 := x0.AuxInt 35546 if x0.Aux != s { 35547 break 35548 } 35549 _ = x0.Args[2] 35550 if p != x0.Args[0] { 35551 break 35552 } 35553 if idx != x0.Args[1] { 35554 break 35555 } 35556 if mem != x0.Args[2] { 35557 break 35558 } 35559 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)) { 35560 break 35561 } 35562 b = mergePoint(b, x0, x1) 35563 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35564 v.reset(OpCopy) 35565 v.AddArg(v0) 35566 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35567 v1.AuxInt = j1 35568 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35569 v2.AuxInt = i0 35570 v2.Aux = s 35571 v2.AddArg(p) 35572 v2.AddArg(idx) 35573 v2.AddArg(mem) 35574 v1.AddArg(v2) 35575 v0.AddArg(v1) 35576 v0.AddArg(y) 35577 return true 35578 } 35579 // 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))) 35580 // 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) 35581 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35582 for { 35583 _ = v.Args[1] 35584 or := v.Args[0] 35585 if or.Op != OpS390XORW { 35586 break 35587 } 35588 _ = or.Args[1] 35589 s1 := or.Args[0] 35590 if s1.Op != OpS390XSLWconst { 35591 break 35592 } 35593 j1 := s1.AuxInt 35594 x1 := s1.Args[0] 35595 if x1.Op != OpS390XMOVBZloadidx { 35596 break 35597 } 35598 i1 := x1.AuxInt 35599 s := x1.Aux 35600 _ = x1.Args[2] 35601 p := x1.Args[0] 35602 idx := x1.Args[1] 35603 mem := x1.Args[2] 35604 y := or.Args[1] 35605 s0 := v.Args[1] 35606 if s0.Op != OpS390XSLWconst { 35607 break 35608 } 35609 j0 := s0.AuxInt 35610 x0 := s0.Args[0] 35611 if x0.Op != OpS390XMOVBZloadidx { 35612 break 35613 } 35614 i0 := x0.AuxInt 35615 if x0.Aux != s { 35616 break 35617 } 35618 _ = x0.Args[2] 35619 if idx != x0.Args[0] { 35620 break 35621 } 35622 if p != x0.Args[1] { 35623 break 35624 } 35625 if mem != x0.Args[2] { 35626 break 35627 } 35628 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)) { 35629 break 35630 } 35631 b = mergePoint(b, x0, x1) 35632 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35633 v.reset(OpCopy) 35634 v.AddArg(v0) 35635 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35636 v1.AuxInt = j1 35637 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35638 v2.AuxInt = i0 35639 v2.Aux = s 35640 v2.AddArg(p) 35641 v2.AddArg(idx) 35642 v2.AddArg(mem) 35643 v1.AddArg(v2) 35644 v0.AddArg(v1) 35645 v0.AddArg(y) 35646 return true 35647 } 35648 return false 35649 } 35650 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 35651 b := v.Block 35652 _ = b 35653 typ := &b.Func.Config.Types 35654 _ = typ 35655 // 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))) 35656 // 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) 35657 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35658 for { 35659 _ = v.Args[1] 35660 or := v.Args[0] 35661 if or.Op != OpS390XORW { 35662 break 35663 } 35664 _ = or.Args[1] 35665 s1 := or.Args[0] 35666 if s1.Op != OpS390XSLWconst { 35667 break 35668 } 35669 j1 := s1.AuxInt 35670 x1 := s1.Args[0] 35671 if x1.Op != OpS390XMOVBZloadidx { 35672 break 35673 } 35674 i1 := x1.AuxInt 35675 s := x1.Aux 35676 _ = x1.Args[2] 35677 idx := x1.Args[0] 35678 p := x1.Args[1] 35679 mem := x1.Args[2] 35680 y := or.Args[1] 35681 s0 := v.Args[1] 35682 if s0.Op != OpS390XSLWconst { 35683 break 35684 } 35685 j0 := s0.AuxInt 35686 x0 := s0.Args[0] 35687 if x0.Op != OpS390XMOVBZloadidx { 35688 break 35689 } 35690 i0 := x0.AuxInt 35691 if x0.Aux != s { 35692 break 35693 } 35694 _ = x0.Args[2] 35695 if idx != x0.Args[0] { 35696 break 35697 } 35698 if p != x0.Args[1] { 35699 break 35700 } 35701 if mem != x0.Args[2] { 35702 break 35703 } 35704 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)) { 35705 break 35706 } 35707 b = mergePoint(b, x0, x1) 35708 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35709 v.reset(OpCopy) 35710 v.AddArg(v0) 35711 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35712 v1.AuxInt = j1 35713 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35714 v2.AuxInt = i0 35715 v2.Aux = s 35716 v2.AddArg(p) 35717 v2.AddArg(idx) 35718 v2.AddArg(mem) 35719 v1.AddArg(v2) 35720 v0.AddArg(v1) 35721 v0.AddArg(y) 35722 return true 35723 } 35724 // 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))) 35725 // 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) 35726 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35727 for { 35728 _ = v.Args[1] 35729 or := v.Args[0] 35730 if or.Op != OpS390XORW { 35731 break 35732 } 35733 _ = or.Args[1] 35734 y := or.Args[0] 35735 s1 := or.Args[1] 35736 if s1.Op != OpS390XSLWconst { 35737 break 35738 } 35739 j1 := s1.AuxInt 35740 x1 := s1.Args[0] 35741 if x1.Op != OpS390XMOVBZloadidx { 35742 break 35743 } 35744 i1 := x1.AuxInt 35745 s := x1.Aux 35746 _ = x1.Args[2] 35747 p := x1.Args[0] 35748 idx := x1.Args[1] 35749 mem := x1.Args[2] 35750 s0 := v.Args[1] 35751 if s0.Op != OpS390XSLWconst { 35752 break 35753 } 35754 j0 := s0.AuxInt 35755 x0 := s0.Args[0] 35756 if x0.Op != OpS390XMOVBZloadidx { 35757 break 35758 } 35759 i0 := x0.AuxInt 35760 if x0.Aux != s { 35761 break 35762 } 35763 _ = x0.Args[2] 35764 if idx != x0.Args[0] { 35765 break 35766 } 35767 if p != x0.Args[1] { 35768 break 35769 } 35770 if mem != x0.Args[2] { 35771 break 35772 } 35773 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)) { 35774 break 35775 } 35776 b = mergePoint(b, x0, x1) 35777 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35778 v.reset(OpCopy) 35779 v.AddArg(v0) 35780 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35781 v1.AuxInt = j1 35782 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35783 v2.AuxInt = i0 35784 v2.Aux = s 35785 v2.AddArg(p) 35786 v2.AddArg(idx) 35787 v2.AddArg(mem) 35788 v1.AddArg(v2) 35789 v0.AddArg(v1) 35790 v0.AddArg(y) 35791 return true 35792 } 35793 // 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))) 35794 // 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) 35795 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35796 for { 35797 _ = v.Args[1] 35798 or := v.Args[0] 35799 if or.Op != OpS390XORW { 35800 break 35801 } 35802 _ = or.Args[1] 35803 y := or.Args[0] 35804 s1 := or.Args[1] 35805 if s1.Op != OpS390XSLWconst { 35806 break 35807 } 35808 j1 := s1.AuxInt 35809 x1 := s1.Args[0] 35810 if x1.Op != OpS390XMOVBZloadidx { 35811 break 35812 } 35813 i1 := x1.AuxInt 35814 s := x1.Aux 35815 _ = x1.Args[2] 35816 idx := x1.Args[0] 35817 p := x1.Args[1] 35818 mem := x1.Args[2] 35819 s0 := v.Args[1] 35820 if s0.Op != OpS390XSLWconst { 35821 break 35822 } 35823 j0 := s0.AuxInt 35824 x0 := s0.Args[0] 35825 if x0.Op != OpS390XMOVBZloadidx { 35826 break 35827 } 35828 i0 := x0.AuxInt 35829 if x0.Aux != s { 35830 break 35831 } 35832 _ = x0.Args[2] 35833 if idx != x0.Args[0] { 35834 break 35835 } 35836 if p != x0.Args[1] { 35837 break 35838 } 35839 if mem != x0.Args[2] { 35840 break 35841 } 35842 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)) { 35843 break 35844 } 35845 b = mergePoint(b, x0, x1) 35846 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35847 v.reset(OpCopy) 35848 v.AddArg(v0) 35849 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35850 v1.AuxInt = j1 35851 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35852 v2.AuxInt = i0 35853 v2.Aux = s 35854 v2.AddArg(p) 35855 v2.AddArg(idx) 35856 v2.AddArg(mem) 35857 v1.AddArg(v2) 35858 v0.AddArg(v1) 35859 v0.AddArg(y) 35860 return true 35861 } 35862 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 35863 // 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) 35864 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 35865 for { 35866 _ = v.Args[1] 35867 x0 := v.Args[0] 35868 if x0.Op != OpS390XMOVBZload { 35869 break 35870 } 35871 i0 := x0.AuxInt 35872 s := x0.Aux 35873 _ = x0.Args[1] 35874 p := x0.Args[0] 35875 mem := x0.Args[1] 35876 sh := v.Args[1] 35877 if sh.Op != OpS390XSLWconst { 35878 break 35879 } 35880 if sh.AuxInt != 8 { 35881 break 35882 } 35883 x1 := sh.Args[0] 35884 if x1.Op != OpS390XMOVBZload { 35885 break 35886 } 35887 i1 := x1.AuxInt 35888 if x1.Aux != s { 35889 break 35890 } 35891 _ = x1.Args[1] 35892 if p != x1.Args[0] { 35893 break 35894 } 35895 if mem != x1.Args[1] { 35896 break 35897 } 35898 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)) { 35899 break 35900 } 35901 b = mergePoint(b, x0, x1) 35902 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35903 v.reset(OpCopy) 35904 v.AddArg(v0) 35905 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 35906 v1.AuxInt = i0 35907 v1.Aux = s 35908 v1.AddArg(p) 35909 v1.AddArg(mem) 35910 v0.AddArg(v1) 35911 return true 35912 } 35913 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 35914 // 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) 35915 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 35916 for { 35917 _ = v.Args[1] 35918 sh := v.Args[0] 35919 if sh.Op != OpS390XSLWconst { 35920 break 35921 } 35922 if sh.AuxInt != 8 { 35923 break 35924 } 35925 x1 := sh.Args[0] 35926 if x1.Op != OpS390XMOVBZload { 35927 break 35928 } 35929 i1 := x1.AuxInt 35930 s := x1.Aux 35931 _ = x1.Args[1] 35932 p := x1.Args[0] 35933 mem := x1.Args[1] 35934 x0 := v.Args[1] 35935 if x0.Op != OpS390XMOVBZload { 35936 break 35937 } 35938 i0 := x0.AuxInt 35939 if x0.Aux != s { 35940 break 35941 } 35942 _ = x0.Args[1] 35943 if p != x0.Args[0] { 35944 break 35945 } 35946 if mem != x0.Args[1] { 35947 break 35948 } 35949 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)) { 35950 break 35951 } 35952 b = mergePoint(b, x0, x1) 35953 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35954 v.reset(OpCopy) 35955 v.AddArg(v0) 35956 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 35957 v1.AuxInt = i0 35958 v1.Aux = s 35959 v1.AddArg(p) 35960 v1.AddArg(mem) 35961 v0.AddArg(v1) 35962 return true 35963 } 35964 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 35965 // 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) 35966 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 35967 for { 35968 _ = v.Args[1] 35969 r0 := v.Args[0] 35970 if r0.Op != OpS390XMOVHZreg { 35971 break 35972 } 35973 x0 := r0.Args[0] 35974 if x0.Op != OpS390XMOVHBRload { 35975 break 35976 } 35977 i0 := x0.AuxInt 35978 s := x0.Aux 35979 _ = x0.Args[1] 35980 p := x0.Args[0] 35981 mem := x0.Args[1] 35982 sh := v.Args[1] 35983 if sh.Op != OpS390XSLWconst { 35984 break 35985 } 35986 if sh.AuxInt != 16 { 35987 break 35988 } 35989 r1 := sh.Args[0] 35990 if r1.Op != OpS390XMOVHZreg { 35991 break 35992 } 35993 x1 := r1.Args[0] 35994 if x1.Op != OpS390XMOVHBRload { 35995 break 35996 } 35997 i1 := x1.AuxInt 35998 if x1.Aux != s { 35999 break 36000 } 36001 _ = x1.Args[1] 36002 if p != x1.Args[0] { 36003 break 36004 } 36005 if mem != x1.Args[1] { 36006 break 36007 } 36008 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)) { 36009 break 36010 } 36011 b = mergePoint(b, x0, x1) 36012 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 36013 v.reset(OpCopy) 36014 v.AddArg(v0) 36015 v0.AuxInt = i0 36016 v0.Aux = s 36017 v0.AddArg(p) 36018 v0.AddArg(mem) 36019 return true 36020 } 36021 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 36022 // 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) 36023 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 36024 for { 36025 _ = v.Args[1] 36026 sh := v.Args[0] 36027 if sh.Op != OpS390XSLWconst { 36028 break 36029 } 36030 if sh.AuxInt != 16 { 36031 break 36032 } 36033 r1 := sh.Args[0] 36034 if r1.Op != OpS390XMOVHZreg { 36035 break 36036 } 36037 x1 := r1.Args[0] 36038 if x1.Op != OpS390XMOVHBRload { 36039 break 36040 } 36041 i1 := x1.AuxInt 36042 s := x1.Aux 36043 _ = x1.Args[1] 36044 p := x1.Args[0] 36045 mem := x1.Args[1] 36046 r0 := v.Args[1] 36047 if r0.Op != OpS390XMOVHZreg { 36048 break 36049 } 36050 x0 := r0.Args[0] 36051 if x0.Op != OpS390XMOVHBRload { 36052 break 36053 } 36054 i0 := x0.AuxInt 36055 if x0.Aux != s { 36056 break 36057 } 36058 _ = x0.Args[1] 36059 if p != x0.Args[0] { 36060 break 36061 } 36062 if mem != x0.Args[1] { 36063 break 36064 } 36065 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)) { 36066 break 36067 } 36068 b = mergePoint(b, x0, x1) 36069 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 36070 v.reset(OpCopy) 36071 v.AddArg(v0) 36072 v0.AuxInt = i0 36073 v0.Aux = s 36074 v0.AddArg(p) 36075 v0.AddArg(mem) 36076 return true 36077 } 36078 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 36079 // 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) 36080 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36081 for { 36082 _ = v.Args[1] 36083 s1 := v.Args[0] 36084 if s1.Op != OpS390XSLWconst { 36085 break 36086 } 36087 j1 := s1.AuxInt 36088 x1 := s1.Args[0] 36089 if x1.Op != OpS390XMOVBZload { 36090 break 36091 } 36092 i1 := x1.AuxInt 36093 s := x1.Aux 36094 _ = x1.Args[1] 36095 p := x1.Args[0] 36096 mem := x1.Args[1] 36097 or := v.Args[1] 36098 if or.Op != OpS390XORW { 36099 break 36100 } 36101 _ = or.Args[1] 36102 s0 := or.Args[0] 36103 if s0.Op != OpS390XSLWconst { 36104 break 36105 } 36106 j0 := s0.AuxInt 36107 x0 := s0.Args[0] 36108 if x0.Op != OpS390XMOVBZload { 36109 break 36110 } 36111 i0 := x0.AuxInt 36112 if x0.Aux != s { 36113 break 36114 } 36115 _ = x0.Args[1] 36116 if p != x0.Args[0] { 36117 break 36118 } 36119 if mem != x0.Args[1] { 36120 break 36121 } 36122 y := or.Args[1] 36123 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)) { 36124 break 36125 } 36126 b = mergePoint(b, x0, x1) 36127 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36128 v.reset(OpCopy) 36129 v.AddArg(v0) 36130 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36131 v1.AuxInt = j0 36132 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36133 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 36134 v3.AuxInt = i0 36135 v3.Aux = s 36136 v3.AddArg(p) 36137 v3.AddArg(mem) 36138 v2.AddArg(v3) 36139 v1.AddArg(v2) 36140 v0.AddArg(v1) 36141 v0.AddArg(y) 36142 return true 36143 } 36144 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 36145 // 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) 36146 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36147 for { 36148 _ = v.Args[1] 36149 s1 := v.Args[0] 36150 if s1.Op != OpS390XSLWconst { 36151 break 36152 } 36153 j1 := s1.AuxInt 36154 x1 := s1.Args[0] 36155 if x1.Op != OpS390XMOVBZload { 36156 break 36157 } 36158 i1 := x1.AuxInt 36159 s := x1.Aux 36160 _ = x1.Args[1] 36161 p := x1.Args[0] 36162 mem := x1.Args[1] 36163 or := v.Args[1] 36164 if or.Op != OpS390XORW { 36165 break 36166 } 36167 _ = or.Args[1] 36168 y := or.Args[0] 36169 s0 := or.Args[1] 36170 if s0.Op != OpS390XSLWconst { 36171 break 36172 } 36173 j0 := s0.AuxInt 36174 x0 := s0.Args[0] 36175 if x0.Op != OpS390XMOVBZload { 36176 break 36177 } 36178 i0 := x0.AuxInt 36179 if x0.Aux != s { 36180 break 36181 } 36182 _ = x0.Args[1] 36183 if p != x0.Args[0] { 36184 break 36185 } 36186 if mem != x0.Args[1] { 36187 break 36188 } 36189 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)) { 36190 break 36191 } 36192 b = mergePoint(b, x0, x1) 36193 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36194 v.reset(OpCopy) 36195 v.AddArg(v0) 36196 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36197 v1.AuxInt = j0 36198 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36199 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 36200 v3.AuxInt = i0 36201 v3.Aux = s 36202 v3.AddArg(p) 36203 v3.AddArg(mem) 36204 v2.AddArg(v3) 36205 v1.AddArg(v2) 36206 v0.AddArg(v1) 36207 v0.AddArg(y) 36208 return true 36209 } 36210 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 36211 // 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) 36212 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36213 for { 36214 _ = v.Args[1] 36215 or := v.Args[0] 36216 if or.Op != OpS390XORW { 36217 break 36218 } 36219 _ = or.Args[1] 36220 s0 := or.Args[0] 36221 if s0.Op != OpS390XSLWconst { 36222 break 36223 } 36224 j0 := s0.AuxInt 36225 x0 := s0.Args[0] 36226 if x0.Op != OpS390XMOVBZload { 36227 break 36228 } 36229 i0 := x0.AuxInt 36230 s := x0.Aux 36231 _ = x0.Args[1] 36232 p := x0.Args[0] 36233 mem := x0.Args[1] 36234 y := or.Args[1] 36235 s1 := v.Args[1] 36236 if s1.Op != OpS390XSLWconst { 36237 break 36238 } 36239 j1 := s1.AuxInt 36240 x1 := s1.Args[0] 36241 if x1.Op != OpS390XMOVBZload { 36242 break 36243 } 36244 i1 := x1.AuxInt 36245 if x1.Aux != s { 36246 break 36247 } 36248 _ = x1.Args[1] 36249 if p != x1.Args[0] { 36250 break 36251 } 36252 if mem != x1.Args[1] { 36253 break 36254 } 36255 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)) { 36256 break 36257 } 36258 b = mergePoint(b, x0, x1) 36259 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36260 v.reset(OpCopy) 36261 v.AddArg(v0) 36262 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36263 v1.AuxInt = j0 36264 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36265 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 36266 v3.AuxInt = i0 36267 v3.Aux = s 36268 v3.AddArg(p) 36269 v3.AddArg(mem) 36270 v2.AddArg(v3) 36271 v1.AddArg(v2) 36272 v0.AddArg(v1) 36273 v0.AddArg(y) 36274 return true 36275 } 36276 return false 36277 } 36278 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 36279 b := v.Block 36280 _ = b 36281 typ := &b.Func.Config.Types 36282 _ = typ 36283 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 36284 // 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) 36285 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36286 for { 36287 _ = v.Args[1] 36288 or := v.Args[0] 36289 if or.Op != OpS390XORW { 36290 break 36291 } 36292 _ = or.Args[1] 36293 y := or.Args[0] 36294 s0 := or.Args[1] 36295 if s0.Op != OpS390XSLWconst { 36296 break 36297 } 36298 j0 := s0.AuxInt 36299 x0 := s0.Args[0] 36300 if x0.Op != OpS390XMOVBZload { 36301 break 36302 } 36303 i0 := x0.AuxInt 36304 s := x0.Aux 36305 _ = x0.Args[1] 36306 p := x0.Args[0] 36307 mem := x0.Args[1] 36308 s1 := v.Args[1] 36309 if s1.Op != OpS390XSLWconst { 36310 break 36311 } 36312 j1 := s1.AuxInt 36313 x1 := s1.Args[0] 36314 if x1.Op != OpS390XMOVBZload { 36315 break 36316 } 36317 i1 := x1.AuxInt 36318 if x1.Aux != s { 36319 break 36320 } 36321 _ = x1.Args[1] 36322 if p != x1.Args[0] { 36323 break 36324 } 36325 if mem != x1.Args[1] { 36326 break 36327 } 36328 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)) { 36329 break 36330 } 36331 b = mergePoint(b, x0, x1) 36332 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36333 v.reset(OpCopy) 36334 v.AddArg(v0) 36335 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36336 v1.AuxInt = j0 36337 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36338 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 36339 v3.AuxInt = i0 36340 v3.Aux = s 36341 v3.AddArg(p) 36342 v3.AddArg(mem) 36343 v2.AddArg(v3) 36344 v1.AddArg(v2) 36345 v0.AddArg(v1) 36346 v0.AddArg(y) 36347 return true 36348 } 36349 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 36350 // 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) 36351 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36352 for { 36353 _ = v.Args[1] 36354 x0 := v.Args[0] 36355 if x0.Op != OpS390XMOVBZloadidx { 36356 break 36357 } 36358 i0 := x0.AuxInt 36359 s := x0.Aux 36360 _ = x0.Args[2] 36361 p := x0.Args[0] 36362 idx := x0.Args[1] 36363 mem := x0.Args[2] 36364 sh := v.Args[1] 36365 if sh.Op != OpS390XSLWconst { 36366 break 36367 } 36368 if sh.AuxInt != 8 { 36369 break 36370 } 36371 x1 := sh.Args[0] 36372 if x1.Op != OpS390XMOVBZloadidx { 36373 break 36374 } 36375 i1 := x1.AuxInt 36376 if x1.Aux != s { 36377 break 36378 } 36379 _ = x1.Args[2] 36380 if p != x1.Args[0] { 36381 break 36382 } 36383 if idx != x1.Args[1] { 36384 break 36385 } 36386 if mem != x1.Args[2] { 36387 break 36388 } 36389 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)) { 36390 break 36391 } 36392 b = mergePoint(b, x0, x1) 36393 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36394 v.reset(OpCopy) 36395 v.AddArg(v0) 36396 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36397 v1.AuxInt = i0 36398 v1.Aux = s 36399 v1.AddArg(p) 36400 v1.AddArg(idx) 36401 v1.AddArg(mem) 36402 v0.AddArg(v1) 36403 return true 36404 } 36405 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 36406 // 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) 36407 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36408 for { 36409 _ = v.Args[1] 36410 x0 := v.Args[0] 36411 if x0.Op != OpS390XMOVBZloadidx { 36412 break 36413 } 36414 i0 := x0.AuxInt 36415 s := x0.Aux 36416 _ = x0.Args[2] 36417 idx := x0.Args[0] 36418 p := x0.Args[1] 36419 mem := x0.Args[2] 36420 sh := v.Args[1] 36421 if sh.Op != OpS390XSLWconst { 36422 break 36423 } 36424 if sh.AuxInt != 8 { 36425 break 36426 } 36427 x1 := sh.Args[0] 36428 if x1.Op != OpS390XMOVBZloadidx { 36429 break 36430 } 36431 i1 := x1.AuxInt 36432 if x1.Aux != s { 36433 break 36434 } 36435 _ = x1.Args[2] 36436 if p != x1.Args[0] { 36437 break 36438 } 36439 if idx != x1.Args[1] { 36440 break 36441 } 36442 if mem != x1.Args[2] { 36443 break 36444 } 36445 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)) { 36446 break 36447 } 36448 b = mergePoint(b, x0, x1) 36449 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36450 v.reset(OpCopy) 36451 v.AddArg(v0) 36452 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36453 v1.AuxInt = i0 36454 v1.Aux = s 36455 v1.AddArg(p) 36456 v1.AddArg(idx) 36457 v1.AddArg(mem) 36458 v0.AddArg(v1) 36459 return true 36460 } 36461 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 36462 // 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) 36463 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36464 for { 36465 _ = v.Args[1] 36466 x0 := v.Args[0] 36467 if x0.Op != OpS390XMOVBZloadidx { 36468 break 36469 } 36470 i0 := x0.AuxInt 36471 s := x0.Aux 36472 _ = x0.Args[2] 36473 p := x0.Args[0] 36474 idx := x0.Args[1] 36475 mem := x0.Args[2] 36476 sh := v.Args[1] 36477 if sh.Op != OpS390XSLWconst { 36478 break 36479 } 36480 if sh.AuxInt != 8 { 36481 break 36482 } 36483 x1 := sh.Args[0] 36484 if x1.Op != OpS390XMOVBZloadidx { 36485 break 36486 } 36487 i1 := x1.AuxInt 36488 if x1.Aux != s { 36489 break 36490 } 36491 _ = x1.Args[2] 36492 if idx != x1.Args[0] { 36493 break 36494 } 36495 if p != x1.Args[1] { 36496 break 36497 } 36498 if mem != x1.Args[2] { 36499 break 36500 } 36501 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)) { 36502 break 36503 } 36504 b = mergePoint(b, x0, x1) 36505 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36506 v.reset(OpCopy) 36507 v.AddArg(v0) 36508 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36509 v1.AuxInt = i0 36510 v1.Aux = s 36511 v1.AddArg(p) 36512 v1.AddArg(idx) 36513 v1.AddArg(mem) 36514 v0.AddArg(v1) 36515 return true 36516 } 36517 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 36518 // 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) 36519 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36520 for { 36521 _ = v.Args[1] 36522 x0 := v.Args[0] 36523 if x0.Op != OpS390XMOVBZloadidx { 36524 break 36525 } 36526 i0 := x0.AuxInt 36527 s := x0.Aux 36528 _ = x0.Args[2] 36529 idx := x0.Args[0] 36530 p := x0.Args[1] 36531 mem := x0.Args[2] 36532 sh := v.Args[1] 36533 if sh.Op != OpS390XSLWconst { 36534 break 36535 } 36536 if sh.AuxInt != 8 { 36537 break 36538 } 36539 x1 := sh.Args[0] 36540 if x1.Op != OpS390XMOVBZloadidx { 36541 break 36542 } 36543 i1 := x1.AuxInt 36544 if x1.Aux != s { 36545 break 36546 } 36547 _ = x1.Args[2] 36548 if idx != x1.Args[0] { 36549 break 36550 } 36551 if p != x1.Args[1] { 36552 break 36553 } 36554 if mem != x1.Args[2] { 36555 break 36556 } 36557 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)) { 36558 break 36559 } 36560 b = mergePoint(b, x0, x1) 36561 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36562 v.reset(OpCopy) 36563 v.AddArg(v0) 36564 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36565 v1.AuxInt = i0 36566 v1.Aux = s 36567 v1.AddArg(p) 36568 v1.AddArg(idx) 36569 v1.AddArg(mem) 36570 v0.AddArg(v1) 36571 return true 36572 } 36573 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 36574 // 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) 36575 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36576 for { 36577 _ = v.Args[1] 36578 sh := v.Args[0] 36579 if sh.Op != OpS390XSLWconst { 36580 break 36581 } 36582 if sh.AuxInt != 8 { 36583 break 36584 } 36585 x1 := sh.Args[0] 36586 if x1.Op != OpS390XMOVBZloadidx { 36587 break 36588 } 36589 i1 := x1.AuxInt 36590 s := x1.Aux 36591 _ = x1.Args[2] 36592 p := x1.Args[0] 36593 idx := x1.Args[1] 36594 mem := x1.Args[2] 36595 x0 := v.Args[1] 36596 if x0.Op != OpS390XMOVBZloadidx { 36597 break 36598 } 36599 i0 := x0.AuxInt 36600 if x0.Aux != s { 36601 break 36602 } 36603 _ = x0.Args[2] 36604 if p != x0.Args[0] { 36605 break 36606 } 36607 if idx != x0.Args[1] { 36608 break 36609 } 36610 if mem != x0.Args[2] { 36611 break 36612 } 36613 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)) { 36614 break 36615 } 36616 b = mergePoint(b, x0, x1) 36617 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36618 v.reset(OpCopy) 36619 v.AddArg(v0) 36620 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36621 v1.AuxInt = i0 36622 v1.Aux = s 36623 v1.AddArg(p) 36624 v1.AddArg(idx) 36625 v1.AddArg(mem) 36626 v0.AddArg(v1) 36627 return true 36628 } 36629 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 36630 // 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) 36631 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36632 for { 36633 _ = v.Args[1] 36634 sh := v.Args[0] 36635 if sh.Op != OpS390XSLWconst { 36636 break 36637 } 36638 if sh.AuxInt != 8 { 36639 break 36640 } 36641 x1 := sh.Args[0] 36642 if x1.Op != OpS390XMOVBZloadidx { 36643 break 36644 } 36645 i1 := x1.AuxInt 36646 s := x1.Aux 36647 _ = x1.Args[2] 36648 idx := x1.Args[0] 36649 p := x1.Args[1] 36650 mem := x1.Args[2] 36651 x0 := v.Args[1] 36652 if x0.Op != OpS390XMOVBZloadidx { 36653 break 36654 } 36655 i0 := x0.AuxInt 36656 if x0.Aux != s { 36657 break 36658 } 36659 _ = x0.Args[2] 36660 if p != x0.Args[0] { 36661 break 36662 } 36663 if idx != x0.Args[1] { 36664 break 36665 } 36666 if mem != x0.Args[2] { 36667 break 36668 } 36669 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)) { 36670 break 36671 } 36672 b = mergePoint(b, x0, x1) 36673 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36674 v.reset(OpCopy) 36675 v.AddArg(v0) 36676 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36677 v1.AuxInt = i0 36678 v1.Aux = s 36679 v1.AddArg(p) 36680 v1.AddArg(idx) 36681 v1.AddArg(mem) 36682 v0.AddArg(v1) 36683 return true 36684 } 36685 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 36686 // 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) 36687 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36688 for { 36689 _ = v.Args[1] 36690 sh := v.Args[0] 36691 if sh.Op != OpS390XSLWconst { 36692 break 36693 } 36694 if sh.AuxInt != 8 { 36695 break 36696 } 36697 x1 := sh.Args[0] 36698 if x1.Op != OpS390XMOVBZloadidx { 36699 break 36700 } 36701 i1 := x1.AuxInt 36702 s := x1.Aux 36703 _ = x1.Args[2] 36704 p := x1.Args[0] 36705 idx := x1.Args[1] 36706 mem := x1.Args[2] 36707 x0 := v.Args[1] 36708 if x0.Op != OpS390XMOVBZloadidx { 36709 break 36710 } 36711 i0 := x0.AuxInt 36712 if x0.Aux != s { 36713 break 36714 } 36715 _ = x0.Args[2] 36716 if idx != x0.Args[0] { 36717 break 36718 } 36719 if p != x0.Args[1] { 36720 break 36721 } 36722 if mem != x0.Args[2] { 36723 break 36724 } 36725 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)) { 36726 break 36727 } 36728 b = mergePoint(b, x0, x1) 36729 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36730 v.reset(OpCopy) 36731 v.AddArg(v0) 36732 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36733 v1.AuxInt = i0 36734 v1.Aux = s 36735 v1.AddArg(p) 36736 v1.AddArg(idx) 36737 v1.AddArg(mem) 36738 v0.AddArg(v1) 36739 return true 36740 } 36741 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 36742 // 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) 36743 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36744 for { 36745 _ = v.Args[1] 36746 sh := v.Args[0] 36747 if sh.Op != OpS390XSLWconst { 36748 break 36749 } 36750 if sh.AuxInt != 8 { 36751 break 36752 } 36753 x1 := sh.Args[0] 36754 if x1.Op != OpS390XMOVBZloadidx { 36755 break 36756 } 36757 i1 := x1.AuxInt 36758 s := x1.Aux 36759 _ = x1.Args[2] 36760 idx := x1.Args[0] 36761 p := x1.Args[1] 36762 mem := x1.Args[2] 36763 x0 := v.Args[1] 36764 if x0.Op != OpS390XMOVBZloadidx { 36765 break 36766 } 36767 i0 := x0.AuxInt 36768 if x0.Aux != s { 36769 break 36770 } 36771 _ = x0.Args[2] 36772 if idx != x0.Args[0] { 36773 break 36774 } 36775 if p != x0.Args[1] { 36776 break 36777 } 36778 if mem != x0.Args[2] { 36779 break 36780 } 36781 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)) { 36782 break 36783 } 36784 b = mergePoint(b, x0, x1) 36785 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36786 v.reset(OpCopy) 36787 v.AddArg(v0) 36788 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36789 v1.AuxInt = i0 36790 v1.Aux = s 36791 v1.AddArg(p) 36792 v1.AddArg(idx) 36793 v1.AddArg(mem) 36794 v0.AddArg(v1) 36795 return true 36796 } 36797 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 36798 // 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) 36799 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36800 for { 36801 _ = v.Args[1] 36802 r0 := v.Args[0] 36803 if r0.Op != OpS390XMOVHZreg { 36804 break 36805 } 36806 x0 := r0.Args[0] 36807 if x0.Op != OpS390XMOVHBRloadidx { 36808 break 36809 } 36810 i0 := x0.AuxInt 36811 s := x0.Aux 36812 _ = x0.Args[2] 36813 p := x0.Args[0] 36814 idx := x0.Args[1] 36815 mem := x0.Args[2] 36816 sh := v.Args[1] 36817 if sh.Op != OpS390XSLWconst { 36818 break 36819 } 36820 if sh.AuxInt != 16 { 36821 break 36822 } 36823 r1 := sh.Args[0] 36824 if r1.Op != OpS390XMOVHZreg { 36825 break 36826 } 36827 x1 := r1.Args[0] 36828 if x1.Op != OpS390XMOVHBRloadidx { 36829 break 36830 } 36831 i1 := x1.AuxInt 36832 if x1.Aux != s { 36833 break 36834 } 36835 _ = x1.Args[2] 36836 if p != x1.Args[0] { 36837 break 36838 } 36839 if idx != x1.Args[1] { 36840 break 36841 } 36842 if mem != x1.Args[2] { 36843 break 36844 } 36845 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)) { 36846 break 36847 } 36848 b = mergePoint(b, x0, x1) 36849 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36850 v.reset(OpCopy) 36851 v.AddArg(v0) 36852 v0.AuxInt = i0 36853 v0.Aux = s 36854 v0.AddArg(p) 36855 v0.AddArg(idx) 36856 v0.AddArg(mem) 36857 return true 36858 } 36859 return false 36860 } 36861 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 36862 b := v.Block 36863 _ = b 36864 typ := &b.Func.Config.Types 36865 _ = typ 36866 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 36867 // 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) 36868 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36869 for { 36870 _ = v.Args[1] 36871 r0 := v.Args[0] 36872 if r0.Op != OpS390XMOVHZreg { 36873 break 36874 } 36875 x0 := r0.Args[0] 36876 if x0.Op != OpS390XMOVHBRloadidx { 36877 break 36878 } 36879 i0 := x0.AuxInt 36880 s := x0.Aux 36881 _ = x0.Args[2] 36882 idx := x0.Args[0] 36883 p := x0.Args[1] 36884 mem := x0.Args[2] 36885 sh := v.Args[1] 36886 if sh.Op != OpS390XSLWconst { 36887 break 36888 } 36889 if sh.AuxInt != 16 { 36890 break 36891 } 36892 r1 := sh.Args[0] 36893 if r1.Op != OpS390XMOVHZreg { 36894 break 36895 } 36896 x1 := r1.Args[0] 36897 if x1.Op != OpS390XMOVHBRloadidx { 36898 break 36899 } 36900 i1 := x1.AuxInt 36901 if x1.Aux != s { 36902 break 36903 } 36904 _ = x1.Args[2] 36905 if p != x1.Args[0] { 36906 break 36907 } 36908 if idx != x1.Args[1] { 36909 break 36910 } 36911 if mem != x1.Args[2] { 36912 break 36913 } 36914 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)) { 36915 break 36916 } 36917 b = mergePoint(b, x0, x1) 36918 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36919 v.reset(OpCopy) 36920 v.AddArg(v0) 36921 v0.AuxInt = i0 36922 v0.Aux = s 36923 v0.AddArg(p) 36924 v0.AddArg(idx) 36925 v0.AddArg(mem) 36926 return true 36927 } 36928 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 36929 // 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) 36930 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36931 for { 36932 _ = v.Args[1] 36933 r0 := v.Args[0] 36934 if r0.Op != OpS390XMOVHZreg { 36935 break 36936 } 36937 x0 := r0.Args[0] 36938 if x0.Op != OpS390XMOVHBRloadidx { 36939 break 36940 } 36941 i0 := x0.AuxInt 36942 s := x0.Aux 36943 _ = x0.Args[2] 36944 p := x0.Args[0] 36945 idx := x0.Args[1] 36946 mem := x0.Args[2] 36947 sh := v.Args[1] 36948 if sh.Op != OpS390XSLWconst { 36949 break 36950 } 36951 if sh.AuxInt != 16 { 36952 break 36953 } 36954 r1 := sh.Args[0] 36955 if r1.Op != OpS390XMOVHZreg { 36956 break 36957 } 36958 x1 := r1.Args[0] 36959 if x1.Op != OpS390XMOVHBRloadidx { 36960 break 36961 } 36962 i1 := x1.AuxInt 36963 if x1.Aux != s { 36964 break 36965 } 36966 _ = x1.Args[2] 36967 if idx != x1.Args[0] { 36968 break 36969 } 36970 if p != x1.Args[1] { 36971 break 36972 } 36973 if mem != x1.Args[2] { 36974 break 36975 } 36976 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)) { 36977 break 36978 } 36979 b = mergePoint(b, x0, x1) 36980 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36981 v.reset(OpCopy) 36982 v.AddArg(v0) 36983 v0.AuxInt = i0 36984 v0.Aux = s 36985 v0.AddArg(p) 36986 v0.AddArg(idx) 36987 v0.AddArg(mem) 36988 return true 36989 } 36990 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 36991 // 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) 36992 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36993 for { 36994 _ = v.Args[1] 36995 r0 := v.Args[0] 36996 if r0.Op != OpS390XMOVHZreg { 36997 break 36998 } 36999 x0 := r0.Args[0] 37000 if x0.Op != OpS390XMOVHBRloadidx { 37001 break 37002 } 37003 i0 := x0.AuxInt 37004 s := x0.Aux 37005 _ = x0.Args[2] 37006 idx := x0.Args[0] 37007 p := x0.Args[1] 37008 mem := x0.Args[2] 37009 sh := v.Args[1] 37010 if sh.Op != OpS390XSLWconst { 37011 break 37012 } 37013 if sh.AuxInt != 16 { 37014 break 37015 } 37016 r1 := sh.Args[0] 37017 if r1.Op != OpS390XMOVHZreg { 37018 break 37019 } 37020 x1 := r1.Args[0] 37021 if x1.Op != OpS390XMOVHBRloadidx { 37022 break 37023 } 37024 i1 := x1.AuxInt 37025 if x1.Aux != s { 37026 break 37027 } 37028 _ = x1.Args[2] 37029 if idx != x1.Args[0] { 37030 break 37031 } 37032 if p != x1.Args[1] { 37033 break 37034 } 37035 if mem != x1.Args[2] { 37036 break 37037 } 37038 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)) { 37039 break 37040 } 37041 b = mergePoint(b, x0, x1) 37042 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37043 v.reset(OpCopy) 37044 v.AddArg(v0) 37045 v0.AuxInt = i0 37046 v0.Aux = s 37047 v0.AddArg(p) 37048 v0.AddArg(idx) 37049 v0.AddArg(mem) 37050 return true 37051 } 37052 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 37053 // 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) 37054 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37055 for { 37056 _ = v.Args[1] 37057 sh := v.Args[0] 37058 if sh.Op != OpS390XSLWconst { 37059 break 37060 } 37061 if sh.AuxInt != 16 { 37062 break 37063 } 37064 r1 := sh.Args[0] 37065 if r1.Op != OpS390XMOVHZreg { 37066 break 37067 } 37068 x1 := r1.Args[0] 37069 if x1.Op != OpS390XMOVHBRloadidx { 37070 break 37071 } 37072 i1 := x1.AuxInt 37073 s := x1.Aux 37074 _ = x1.Args[2] 37075 p := x1.Args[0] 37076 idx := x1.Args[1] 37077 mem := x1.Args[2] 37078 r0 := v.Args[1] 37079 if r0.Op != OpS390XMOVHZreg { 37080 break 37081 } 37082 x0 := r0.Args[0] 37083 if x0.Op != OpS390XMOVHBRloadidx { 37084 break 37085 } 37086 i0 := x0.AuxInt 37087 if x0.Aux != s { 37088 break 37089 } 37090 _ = x0.Args[2] 37091 if p != x0.Args[0] { 37092 break 37093 } 37094 if idx != x0.Args[1] { 37095 break 37096 } 37097 if mem != x0.Args[2] { 37098 break 37099 } 37100 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)) { 37101 break 37102 } 37103 b = mergePoint(b, x0, x1) 37104 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37105 v.reset(OpCopy) 37106 v.AddArg(v0) 37107 v0.AuxInt = i0 37108 v0.Aux = s 37109 v0.AddArg(p) 37110 v0.AddArg(idx) 37111 v0.AddArg(mem) 37112 return true 37113 } 37114 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 37115 // 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) 37116 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37117 for { 37118 _ = v.Args[1] 37119 sh := v.Args[0] 37120 if sh.Op != OpS390XSLWconst { 37121 break 37122 } 37123 if sh.AuxInt != 16 { 37124 break 37125 } 37126 r1 := sh.Args[0] 37127 if r1.Op != OpS390XMOVHZreg { 37128 break 37129 } 37130 x1 := r1.Args[0] 37131 if x1.Op != OpS390XMOVHBRloadidx { 37132 break 37133 } 37134 i1 := x1.AuxInt 37135 s := x1.Aux 37136 _ = x1.Args[2] 37137 idx := x1.Args[0] 37138 p := x1.Args[1] 37139 mem := x1.Args[2] 37140 r0 := v.Args[1] 37141 if r0.Op != OpS390XMOVHZreg { 37142 break 37143 } 37144 x0 := r0.Args[0] 37145 if x0.Op != OpS390XMOVHBRloadidx { 37146 break 37147 } 37148 i0 := x0.AuxInt 37149 if x0.Aux != s { 37150 break 37151 } 37152 _ = x0.Args[2] 37153 if p != x0.Args[0] { 37154 break 37155 } 37156 if idx != x0.Args[1] { 37157 break 37158 } 37159 if mem != x0.Args[2] { 37160 break 37161 } 37162 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)) { 37163 break 37164 } 37165 b = mergePoint(b, x0, x1) 37166 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37167 v.reset(OpCopy) 37168 v.AddArg(v0) 37169 v0.AuxInt = i0 37170 v0.Aux = s 37171 v0.AddArg(p) 37172 v0.AddArg(idx) 37173 v0.AddArg(mem) 37174 return true 37175 } 37176 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 37177 // 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) 37178 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37179 for { 37180 _ = v.Args[1] 37181 sh := v.Args[0] 37182 if sh.Op != OpS390XSLWconst { 37183 break 37184 } 37185 if sh.AuxInt != 16 { 37186 break 37187 } 37188 r1 := sh.Args[0] 37189 if r1.Op != OpS390XMOVHZreg { 37190 break 37191 } 37192 x1 := r1.Args[0] 37193 if x1.Op != OpS390XMOVHBRloadidx { 37194 break 37195 } 37196 i1 := x1.AuxInt 37197 s := x1.Aux 37198 _ = x1.Args[2] 37199 p := x1.Args[0] 37200 idx := x1.Args[1] 37201 mem := x1.Args[2] 37202 r0 := v.Args[1] 37203 if r0.Op != OpS390XMOVHZreg { 37204 break 37205 } 37206 x0 := r0.Args[0] 37207 if x0.Op != OpS390XMOVHBRloadidx { 37208 break 37209 } 37210 i0 := x0.AuxInt 37211 if x0.Aux != s { 37212 break 37213 } 37214 _ = x0.Args[2] 37215 if idx != x0.Args[0] { 37216 break 37217 } 37218 if p != x0.Args[1] { 37219 break 37220 } 37221 if mem != x0.Args[2] { 37222 break 37223 } 37224 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)) { 37225 break 37226 } 37227 b = mergePoint(b, x0, x1) 37228 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37229 v.reset(OpCopy) 37230 v.AddArg(v0) 37231 v0.AuxInt = i0 37232 v0.Aux = s 37233 v0.AddArg(p) 37234 v0.AddArg(idx) 37235 v0.AddArg(mem) 37236 return true 37237 } 37238 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 37239 // 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) 37240 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37241 for { 37242 _ = v.Args[1] 37243 sh := v.Args[0] 37244 if sh.Op != OpS390XSLWconst { 37245 break 37246 } 37247 if sh.AuxInt != 16 { 37248 break 37249 } 37250 r1 := sh.Args[0] 37251 if r1.Op != OpS390XMOVHZreg { 37252 break 37253 } 37254 x1 := r1.Args[0] 37255 if x1.Op != OpS390XMOVHBRloadidx { 37256 break 37257 } 37258 i1 := x1.AuxInt 37259 s := x1.Aux 37260 _ = x1.Args[2] 37261 idx := x1.Args[0] 37262 p := x1.Args[1] 37263 mem := x1.Args[2] 37264 r0 := v.Args[1] 37265 if r0.Op != OpS390XMOVHZreg { 37266 break 37267 } 37268 x0 := r0.Args[0] 37269 if x0.Op != OpS390XMOVHBRloadidx { 37270 break 37271 } 37272 i0 := x0.AuxInt 37273 if x0.Aux != s { 37274 break 37275 } 37276 _ = x0.Args[2] 37277 if idx != x0.Args[0] { 37278 break 37279 } 37280 if p != x0.Args[1] { 37281 break 37282 } 37283 if mem != x0.Args[2] { 37284 break 37285 } 37286 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)) { 37287 break 37288 } 37289 b = mergePoint(b, x0, x1) 37290 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37291 v.reset(OpCopy) 37292 v.AddArg(v0) 37293 v0.AuxInt = i0 37294 v0.Aux = s 37295 v0.AddArg(p) 37296 v0.AddArg(idx) 37297 v0.AddArg(mem) 37298 return true 37299 } 37300 // 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)) 37301 // 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) 37302 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37303 for { 37304 _ = v.Args[1] 37305 s1 := v.Args[0] 37306 if s1.Op != OpS390XSLWconst { 37307 break 37308 } 37309 j1 := s1.AuxInt 37310 x1 := s1.Args[0] 37311 if x1.Op != OpS390XMOVBZloadidx { 37312 break 37313 } 37314 i1 := x1.AuxInt 37315 s := x1.Aux 37316 _ = x1.Args[2] 37317 p := x1.Args[0] 37318 idx := x1.Args[1] 37319 mem := x1.Args[2] 37320 or := v.Args[1] 37321 if or.Op != OpS390XORW { 37322 break 37323 } 37324 _ = or.Args[1] 37325 s0 := or.Args[0] 37326 if s0.Op != OpS390XSLWconst { 37327 break 37328 } 37329 j0 := s0.AuxInt 37330 x0 := s0.Args[0] 37331 if x0.Op != OpS390XMOVBZloadidx { 37332 break 37333 } 37334 i0 := x0.AuxInt 37335 if x0.Aux != s { 37336 break 37337 } 37338 _ = x0.Args[2] 37339 if p != x0.Args[0] { 37340 break 37341 } 37342 if idx != x0.Args[1] { 37343 break 37344 } 37345 if mem != x0.Args[2] { 37346 break 37347 } 37348 y := or.Args[1] 37349 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)) { 37350 break 37351 } 37352 b = mergePoint(b, x0, x1) 37353 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37354 v.reset(OpCopy) 37355 v.AddArg(v0) 37356 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37357 v1.AuxInt = j0 37358 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37359 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37360 v3.AuxInt = i0 37361 v3.Aux = s 37362 v3.AddArg(p) 37363 v3.AddArg(idx) 37364 v3.AddArg(mem) 37365 v2.AddArg(v3) 37366 v1.AddArg(v2) 37367 v0.AddArg(v1) 37368 v0.AddArg(y) 37369 return true 37370 } 37371 // 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)) 37372 // 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) 37373 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37374 for { 37375 _ = v.Args[1] 37376 s1 := v.Args[0] 37377 if s1.Op != OpS390XSLWconst { 37378 break 37379 } 37380 j1 := s1.AuxInt 37381 x1 := s1.Args[0] 37382 if x1.Op != OpS390XMOVBZloadidx { 37383 break 37384 } 37385 i1 := x1.AuxInt 37386 s := x1.Aux 37387 _ = x1.Args[2] 37388 idx := x1.Args[0] 37389 p := x1.Args[1] 37390 mem := x1.Args[2] 37391 or := v.Args[1] 37392 if or.Op != OpS390XORW { 37393 break 37394 } 37395 _ = or.Args[1] 37396 s0 := or.Args[0] 37397 if s0.Op != OpS390XSLWconst { 37398 break 37399 } 37400 j0 := s0.AuxInt 37401 x0 := s0.Args[0] 37402 if x0.Op != OpS390XMOVBZloadidx { 37403 break 37404 } 37405 i0 := x0.AuxInt 37406 if x0.Aux != s { 37407 break 37408 } 37409 _ = x0.Args[2] 37410 if p != x0.Args[0] { 37411 break 37412 } 37413 if idx != x0.Args[1] { 37414 break 37415 } 37416 if mem != x0.Args[2] { 37417 break 37418 } 37419 y := or.Args[1] 37420 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)) { 37421 break 37422 } 37423 b = mergePoint(b, x0, x1) 37424 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37425 v.reset(OpCopy) 37426 v.AddArg(v0) 37427 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37428 v1.AuxInt = j0 37429 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37430 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37431 v3.AuxInt = i0 37432 v3.Aux = s 37433 v3.AddArg(p) 37434 v3.AddArg(idx) 37435 v3.AddArg(mem) 37436 v2.AddArg(v3) 37437 v1.AddArg(v2) 37438 v0.AddArg(v1) 37439 v0.AddArg(y) 37440 return true 37441 } 37442 // 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)) 37443 // 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) 37444 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37445 for { 37446 _ = v.Args[1] 37447 s1 := v.Args[0] 37448 if s1.Op != OpS390XSLWconst { 37449 break 37450 } 37451 j1 := s1.AuxInt 37452 x1 := s1.Args[0] 37453 if x1.Op != OpS390XMOVBZloadidx { 37454 break 37455 } 37456 i1 := x1.AuxInt 37457 s := x1.Aux 37458 _ = x1.Args[2] 37459 p := x1.Args[0] 37460 idx := x1.Args[1] 37461 mem := x1.Args[2] 37462 or := v.Args[1] 37463 if or.Op != OpS390XORW { 37464 break 37465 } 37466 _ = or.Args[1] 37467 s0 := or.Args[0] 37468 if s0.Op != OpS390XSLWconst { 37469 break 37470 } 37471 j0 := s0.AuxInt 37472 x0 := s0.Args[0] 37473 if x0.Op != OpS390XMOVBZloadidx { 37474 break 37475 } 37476 i0 := x0.AuxInt 37477 if x0.Aux != s { 37478 break 37479 } 37480 _ = x0.Args[2] 37481 if idx != x0.Args[0] { 37482 break 37483 } 37484 if p != x0.Args[1] { 37485 break 37486 } 37487 if mem != x0.Args[2] { 37488 break 37489 } 37490 y := or.Args[1] 37491 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)) { 37492 break 37493 } 37494 b = mergePoint(b, x0, x1) 37495 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37496 v.reset(OpCopy) 37497 v.AddArg(v0) 37498 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37499 v1.AuxInt = j0 37500 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37501 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37502 v3.AuxInt = i0 37503 v3.Aux = s 37504 v3.AddArg(p) 37505 v3.AddArg(idx) 37506 v3.AddArg(mem) 37507 v2.AddArg(v3) 37508 v1.AddArg(v2) 37509 v0.AddArg(v1) 37510 v0.AddArg(y) 37511 return true 37512 } 37513 return false 37514 } 37515 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 37516 b := v.Block 37517 _ = b 37518 typ := &b.Func.Config.Types 37519 _ = typ 37520 // 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)) 37521 // 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) 37522 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37523 for { 37524 _ = v.Args[1] 37525 s1 := v.Args[0] 37526 if s1.Op != OpS390XSLWconst { 37527 break 37528 } 37529 j1 := s1.AuxInt 37530 x1 := s1.Args[0] 37531 if x1.Op != OpS390XMOVBZloadidx { 37532 break 37533 } 37534 i1 := x1.AuxInt 37535 s := x1.Aux 37536 _ = x1.Args[2] 37537 idx := x1.Args[0] 37538 p := x1.Args[1] 37539 mem := x1.Args[2] 37540 or := v.Args[1] 37541 if or.Op != OpS390XORW { 37542 break 37543 } 37544 _ = or.Args[1] 37545 s0 := or.Args[0] 37546 if s0.Op != OpS390XSLWconst { 37547 break 37548 } 37549 j0 := s0.AuxInt 37550 x0 := s0.Args[0] 37551 if x0.Op != OpS390XMOVBZloadidx { 37552 break 37553 } 37554 i0 := x0.AuxInt 37555 if x0.Aux != s { 37556 break 37557 } 37558 _ = x0.Args[2] 37559 if idx != x0.Args[0] { 37560 break 37561 } 37562 if p != x0.Args[1] { 37563 break 37564 } 37565 if mem != x0.Args[2] { 37566 break 37567 } 37568 y := or.Args[1] 37569 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)) { 37570 break 37571 } 37572 b = mergePoint(b, x0, x1) 37573 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37574 v.reset(OpCopy) 37575 v.AddArg(v0) 37576 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37577 v1.AuxInt = j0 37578 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37579 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37580 v3.AuxInt = i0 37581 v3.Aux = s 37582 v3.AddArg(p) 37583 v3.AddArg(idx) 37584 v3.AddArg(mem) 37585 v2.AddArg(v3) 37586 v1.AddArg(v2) 37587 v0.AddArg(v1) 37588 v0.AddArg(y) 37589 return true 37590 } 37591 // 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)))) 37592 // 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) 37593 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37594 for { 37595 _ = v.Args[1] 37596 s1 := v.Args[0] 37597 if s1.Op != OpS390XSLWconst { 37598 break 37599 } 37600 j1 := s1.AuxInt 37601 x1 := s1.Args[0] 37602 if x1.Op != OpS390XMOVBZloadidx { 37603 break 37604 } 37605 i1 := x1.AuxInt 37606 s := x1.Aux 37607 _ = x1.Args[2] 37608 p := x1.Args[0] 37609 idx := x1.Args[1] 37610 mem := x1.Args[2] 37611 or := v.Args[1] 37612 if or.Op != OpS390XORW { 37613 break 37614 } 37615 _ = or.Args[1] 37616 y := or.Args[0] 37617 s0 := or.Args[1] 37618 if s0.Op != OpS390XSLWconst { 37619 break 37620 } 37621 j0 := s0.AuxInt 37622 x0 := s0.Args[0] 37623 if x0.Op != OpS390XMOVBZloadidx { 37624 break 37625 } 37626 i0 := x0.AuxInt 37627 if x0.Aux != s { 37628 break 37629 } 37630 _ = x0.Args[2] 37631 if p != x0.Args[0] { 37632 break 37633 } 37634 if idx != x0.Args[1] { 37635 break 37636 } 37637 if mem != x0.Args[2] { 37638 break 37639 } 37640 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)) { 37641 break 37642 } 37643 b = mergePoint(b, x0, x1) 37644 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37645 v.reset(OpCopy) 37646 v.AddArg(v0) 37647 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37648 v1.AuxInt = j0 37649 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37650 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37651 v3.AuxInt = i0 37652 v3.Aux = s 37653 v3.AddArg(p) 37654 v3.AddArg(idx) 37655 v3.AddArg(mem) 37656 v2.AddArg(v3) 37657 v1.AddArg(v2) 37658 v0.AddArg(v1) 37659 v0.AddArg(y) 37660 return true 37661 } 37662 // 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)))) 37663 // 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) 37664 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37665 for { 37666 _ = v.Args[1] 37667 s1 := v.Args[0] 37668 if s1.Op != OpS390XSLWconst { 37669 break 37670 } 37671 j1 := s1.AuxInt 37672 x1 := s1.Args[0] 37673 if x1.Op != OpS390XMOVBZloadidx { 37674 break 37675 } 37676 i1 := x1.AuxInt 37677 s := x1.Aux 37678 _ = x1.Args[2] 37679 idx := x1.Args[0] 37680 p := x1.Args[1] 37681 mem := x1.Args[2] 37682 or := v.Args[1] 37683 if or.Op != OpS390XORW { 37684 break 37685 } 37686 _ = or.Args[1] 37687 y := or.Args[0] 37688 s0 := or.Args[1] 37689 if s0.Op != OpS390XSLWconst { 37690 break 37691 } 37692 j0 := s0.AuxInt 37693 x0 := s0.Args[0] 37694 if x0.Op != OpS390XMOVBZloadidx { 37695 break 37696 } 37697 i0 := x0.AuxInt 37698 if x0.Aux != s { 37699 break 37700 } 37701 _ = x0.Args[2] 37702 if p != x0.Args[0] { 37703 break 37704 } 37705 if idx != x0.Args[1] { 37706 break 37707 } 37708 if mem != x0.Args[2] { 37709 break 37710 } 37711 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)) { 37712 break 37713 } 37714 b = mergePoint(b, x0, x1) 37715 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37716 v.reset(OpCopy) 37717 v.AddArg(v0) 37718 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37719 v1.AuxInt = j0 37720 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37721 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37722 v3.AuxInt = i0 37723 v3.Aux = s 37724 v3.AddArg(p) 37725 v3.AddArg(idx) 37726 v3.AddArg(mem) 37727 v2.AddArg(v3) 37728 v1.AddArg(v2) 37729 v0.AddArg(v1) 37730 v0.AddArg(y) 37731 return true 37732 } 37733 // 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)))) 37734 // 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) 37735 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37736 for { 37737 _ = v.Args[1] 37738 s1 := v.Args[0] 37739 if s1.Op != OpS390XSLWconst { 37740 break 37741 } 37742 j1 := s1.AuxInt 37743 x1 := s1.Args[0] 37744 if x1.Op != OpS390XMOVBZloadidx { 37745 break 37746 } 37747 i1 := x1.AuxInt 37748 s := x1.Aux 37749 _ = x1.Args[2] 37750 p := x1.Args[0] 37751 idx := x1.Args[1] 37752 mem := x1.Args[2] 37753 or := v.Args[1] 37754 if or.Op != OpS390XORW { 37755 break 37756 } 37757 _ = or.Args[1] 37758 y := or.Args[0] 37759 s0 := or.Args[1] 37760 if s0.Op != OpS390XSLWconst { 37761 break 37762 } 37763 j0 := s0.AuxInt 37764 x0 := s0.Args[0] 37765 if x0.Op != OpS390XMOVBZloadidx { 37766 break 37767 } 37768 i0 := x0.AuxInt 37769 if x0.Aux != s { 37770 break 37771 } 37772 _ = x0.Args[2] 37773 if idx != x0.Args[0] { 37774 break 37775 } 37776 if p != x0.Args[1] { 37777 break 37778 } 37779 if mem != x0.Args[2] { 37780 break 37781 } 37782 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)) { 37783 break 37784 } 37785 b = mergePoint(b, x0, x1) 37786 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37787 v.reset(OpCopy) 37788 v.AddArg(v0) 37789 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37790 v1.AuxInt = j0 37791 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37792 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37793 v3.AuxInt = i0 37794 v3.Aux = s 37795 v3.AddArg(p) 37796 v3.AddArg(idx) 37797 v3.AddArg(mem) 37798 v2.AddArg(v3) 37799 v1.AddArg(v2) 37800 v0.AddArg(v1) 37801 v0.AddArg(y) 37802 return true 37803 } 37804 // 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)))) 37805 // 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) 37806 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37807 for { 37808 _ = v.Args[1] 37809 s1 := v.Args[0] 37810 if s1.Op != OpS390XSLWconst { 37811 break 37812 } 37813 j1 := s1.AuxInt 37814 x1 := s1.Args[0] 37815 if x1.Op != OpS390XMOVBZloadidx { 37816 break 37817 } 37818 i1 := x1.AuxInt 37819 s := x1.Aux 37820 _ = x1.Args[2] 37821 idx := x1.Args[0] 37822 p := x1.Args[1] 37823 mem := x1.Args[2] 37824 or := v.Args[1] 37825 if or.Op != OpS390XORW { 37826 break 37827 } 37828 _ = or.Args[1] 37829 y := or.Args[0] 37830 s0 := or.Args[1] 37831 if s0.Op != OpS390XSLWconst { 37832 break 37833 } 37834 j0 := s0.AuxInt 37835 x0 := s0.Args[0] 37836 if x0.Op != OpS390XMOVBZloadidx { 37837 break 37838 } 37839 i0 := x0.AuxInt 37840 if x0.Aux != s { 37841 break 37842 } 37843 _ = x0.Args[2] 37844 if idx != x0.Args[0] { 37845 break 37846 } 37847 if p != x0.Args[1] { 37848 break 37849 } 37850 if mem != x0.Args[2] { 37851 break 37852 } 37853 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)) { 37854 break 37855 } 37856 b = mergePoint(b, x0, x1) 37857 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37858 v.reset(OpCopy) 37859 v.AddArg(v0) 37860 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37861 v1.AuxInt = j0 37862 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37863 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37864 v3.AuxInt = i0 37865 v3.Aux = s 37866 v3.AddArg(p) 37867 v3.AddArg(idx) 37868 v3.AddArg(mem) 37869 v2.AddArg(v3) 37870 v1.AddArg(v2) 37871 v0.AddArg(v1) 37872 v0.AddArg(y) 37873 return true 37874 } 37875 // 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))) 37876 // 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) 37877 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37878 for { 37879 _ = v.Args[1] 37880 or := v.Args[0] 37881 if or.Op != OpS390XORW { 37882 break 37883 } 37884 _ = or.Args[1] 37885 s0 := or.Args[0] 37886 if s0.Op != OpS390XSLWconst { 37887 break 37888 } 37889 j0 := s0.AuxInt 37890 x0 := s0.Args[0] 37891 if x0.Op != OpS390XMOVBZloadidx { 37892 break 37893 } 37894 i0 := x0.AuxInt 37895 s := x0.Aux 37896 _ = x0.Args[2] 37897 p := x0.Args[0] 37898 idx := x0.Args[1] 37899 mem := x0.Args[2] 37900 y := or.Args[1] 37901 s1 := v.Args[1] 37902 if s1.Op != OpS390XSLWconst { 37903 break 37904 } 37905 j1 := s1.AuxInt 37906 x1 := s1.Args[0] 37907 if x1.Op != OpS390XMOVBZloadidx { 37908 break 37909 } 37910 i1 := x1.AuxInt 37911 if x1.Aux != s { 37912 break 37913 } 37914 _ = x1.Args[2] 37915 if p != x1.Args[0] { 37916 break 37917 } 37918 if idx != x1.Args[1] { 37919 break 37920 } 37921 if mem != x1.Args[2] { 37922 break 37923 } 37924 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)) { 37925 break 37926 } 37927 b = mergePoint(b, x0, x1) 37928 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37929 v.reset(OpCopy) 37930 v.AddArg(v0) 37931 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37932 v1.AuxInt = j0 37933 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37934 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37935 v3.AuxInt = i0 37936 v3.Aux = s 37937 v3.AddArg(p) 37938 v3.AddArg(idx) 37939 v3.AddArg(mem) 37940 v2.AddArg(v3) 37941 v1.AddArg(v2) 37942 v0.AddArg(v1) 37943 v0.AddArg(y) 37944 return true 37945 } 37946 // 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))) 37947 // 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) 37948 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37949 for { 37950 _ = v.Args[1] 37951 or := v.Args[0] 37952 if or.Op != OpS390XORW { 37953 break 37954 } 37955 _ = or.Args[1] 37956 s0 := or.Args[0] 37957 if s0.Op != OpS390XSLWconst { 37958 break 37959 } 37960 j0 := s0.AuxInt 37961 x0 := s0.Args[0] 37962 if x0.Op != OpS390XMOVBZloadidx { 37963 break 37964 } 37965 i0 := x0.AuxInt 37966 s := x0.Aux 37967 _ = x0.Args[2] 37968 idx := x0.Args[0] 37969 p := x0.Args[1] 37970 mem := x0.Args[2] 37971 y := or.Args[1] 37972 s1 := v.Args[1] 37973 if s1.Op != OpS390XSLWconst { 37974 break 37975 } 37976 j1 := s1.AuxInt 37977 x1 := s1.Args[0] 37978 if x1.Op != OpS390XMOVBZloadidx { 37979 break 37980 } 37981 i1 := x1.AuxInt 37982 if x1.Aux != s { 37983 break 37984 } 37985 _ = x1.Args[2] 37986 if p != x1.Args[0] { 37987 break 37988 } 37989 if idx != x1.Args[1] { 37990 break 37991 } 37992 if mem != x1.Args[2] { 37993 break 37994 } 37995 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)) { 37996 break 37997 } 37998 b = mergePoint(b, x0, x1) 37999 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38000 v.reset(OpCopy) 38001 v.AddArg(v0) 38002 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38003 v1.AuxInt = j0 38004 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38005 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38006 v3.AuxInt = i0 38007 v3.Aux = s 38008 v3.AddArg(p) 38009 v3.AddArg(idx) 38010 v3.AddArg(mem) 38011 v2.AddArg(v3) 38012 v1.AddArg(v2) 38013 v0.AddArg(v1) 38014 v0.AddArg(y) 38015 return true 38016 } 38017 // 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))) 38018 // 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) 38019 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38020 for { 38021 _ = v.Args[1] 38022 or := v.Args[0] 38023 if or.Op != OpS390XORW { 38024 break 38025 } 38026 _ = or.Args[1] 38027 y := or.Args[0] 38028 s0 := or.Args[1] 38029 if s0.Op != OpS390XSLWconst { 38030 break 38031 } 38032 j0 := s0.AuxInt 38033 x0 := s0.Args[0] 38034 if x0.Op != OpS390XMOVBZloadidx { 38035 break 38036 } 38037 i0 := x0.AuxInt 38038 s := x0.Aux 38039 _ = x0.Args[2] 38040 p := x0.Args[0] 38041 idx := x0.Args[1] 38042 mem := x0.Args[2] 38043 s1 := v.Args[1] 38044 if s1.Op != OpS390XSLWconst { 38045 break 38046 } 38047 j1 := s1.AuxInt 38048 x1 := s1.Args[0] 38049 if x1.Op != OpS390XMOVBZloadidx { 38050 break 38051 } 38052 i1 := x1.AuxInt 38053 if x1.Aux != s { 38054 break 38055 } 38056 _ = x1.Args[2] 38057 if p != x1.Args[0] { 38058 break 38059 } 38060 if idx != x1.Args[1] { 38061 break 38062 } 38063 if mem != x1.Args[2] { 38064 break 38065 } 38066 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)) { 38067 break 38068 } 38069 b = mergePoint(b, x0, x1) 38070 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38071 v.reset(OpCopy) 38072 v.AddArg(v0) 38073 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38074 v1.AuxInt = j0 38075 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38076 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38077 v3.AuxInt = i0 38078 v3.Aux = s 38079 v3.AddArg(p) 38080 v3.AddArg(idx) 38081 v3.AddArg(mem) 38082 v2.AddArg(v3) 38083 v1.AddArg(v2) 38084 v0.AddArg(v1) 38085 v0.AddArg(y) 38086 return true 38087 } 38088 // 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))) 38089 // 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) 38090 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38091 for { 38092 _ = v.Args[1] 38093 or := v.Args[0] 38094 if or.Op != OpS390XORW { 38095 break 38096 } 38097 _ = or.Args[1] 38098 y := or.Args[0] 38099 s0 := or.Args[1] 38100 if s0.Op != OpS390XSLWconst { 38101 break 38102 } 38103 j0 := s0.AuxInt 38104 x0 := s0.Args[0] 38105 if x0.Op != OpS390XMOVBZloadidx { 38106 break 38107 } 38108 i0 := x0.AuxInt 38109 s := x0.Aux 38110 _ = x0.Args[2] 38111 idx := x0.Args[0] 38112 p := x0.Args[1] 38113 mem := x0.Args[2] 38114 s1 := v.Args[1] 38115 if s1.Op != OpS390XSLWconst { 38116 break 38117 } 38118 j1 := s1.AuxInt 38119 x1 := s1.Args[0] 38120 if x1.Op != OpS390XMOVBZloadidx { 38121 break 38122 } 38123 i1 := x1.AuxInt 38124 if x1.Aux != s { 38125 break 38126 } 38127 _ = x1.Args[2] 38128 if p != x1.Args[0] { 38129 break 38130 } 38131 if idx != x1.Args[1] { 38132 break 38133 } 38134 if mem != x1.Args[2] { 38135 break 38136 } 38137 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)) { 38138 break 38139 } 38140 b = mergePoint(b, x0, x1) 38141 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38142 v.reset(OpCopy) 38143 v.AddArg(v0) 38144 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38145 v1.AuxInt = j0 38146 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38147 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38148 v3.AuxInt = i0 38149 v3.Aux = s 38150 v3.AddArg(p) 38151 v3.AddArg(idx) 38152 v3.AddArg(mem) 38153 v2.AddArg(v3) 38154 v1.AddArg(v2) 38155 v0.AddArg(v1) 38156 v0.AddArg(y) 38157 return true 38158 } 38159 // 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))) 38160 // 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) 38161 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38162 for { 38163 _ = v.Args[1] 38164 or := v.Args[0] 38165 if or.Op != OpS390XORW { 38166 break 38167 } 38168 _ = or.Args[1] 38169 s0 := or.Args[0] 38170 if s0.Op != OpS390XSLWconst { 38171 break 38172 } 38173 j0 := s0.AuxInt 38174 x0 := s0.Args[0] 38175 if x0.Op != OpS390XMOVBZloadidx { 38176 break 38177 } 38178 i0 := x0.AuxInt 38179 s := x0.Aux 38180 _ = x0.Args[2] 38181 p := x0.Args[0] 38182 idx := x0.Args[1] 38183 mem := x0.Args[2] 38184 y := or.Args[1] 38185 s1 := v.Args[1] 38186 if s1.Op != OpS390XSLWconst { 38187 break 38188 } 38189 j1 := s1.AuxInt 38190 x1 := s1.Args[0] 38191 if x1.Op != OpS390XMOVBZloadidx { 38192 break 38193 } 38194 i1 := x1.AuxInt 38195 if x1.Aux != s { 38196 break 38197 } 38198 _ = x1.Args[2] 38199 if idx != x1.Args[0] { 38200 break 38201 } 38202 if p != x1.Args[1] { 38203 break 38204 } 38205 if mem != x1.Args[2] { 38206 break 38207 } 38208 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)) { 38209 break 38210 } 38211 b = mergePoint(b, x0, x1) 38212 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38213 v.reset(OpCopy) 38214 v.AddArg(v0) 38215 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38216 v1.AuxInt = j0 38217 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38218 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38219 v3.AuxInt = i0 38220 v3.Aux = s 38221 v3.AddArg(p) 38222 v3.AddArg(idx) 38223 v3.AddArg(mem) 38224 v2.AddArg(v3) 38225 v1.AddArg(v2) 38226 v0.AddArg(v1) 38227 v0.AddArg(y) 38228 return true 38229 } 38230 return false 38231 } 38232 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 38233 b := v.Block 38234 _ = b 38235 typ := &b.Func.Config.Types 38236 _ = typ 38237 // 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))) 38238 // 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) 38239 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38240 for { 38241 _ = v.Args[1] 38242 or := v.Args[0] 38243 if or.Op != OpS390XORW { 38244 break 38245 } 38246 _ = or.Args[1] 38247 s0 := or.Args[0] 38248 if s0.Op != OpS390XSLWconst { 38249 break 38250 } 38251 j0 := s0.AuxInt 38252 x0 := s0.Args[0] 38253 if x0.Op != OpS390XMOVBZloadidx { 38254 break 38255 } 38256 i0 := x0.AuxInt 38257 s := x0.Aux 38258 _ = x0.Args[2] 38259 idx := x0.Args[0] 38260 p := x0.Args[1] 38261 mem := x0.Args[2] 38262 y := or.Args[1] 38263 s1 := v.Args[1] 38264 if s1.Op != OpS390XSLWconst { 38265 break 38266 } 38267 j1 := s1.AuxInt 38268 x1 := s1.Args[0] 38269 if x1.Op != OpS390XMOVBZloadidx { 38270 break 38271 } 38272 i1 := x1.AuxInt 38273 if x1.Aux != s { 38274 break 38275 } 38276 _ = x1.Args[2] 38277 if idx != x1.Args[0] { 38278 break 38279 } 38280 if p != x1.Args[1] { 38281 break 38282 } 38283 if mem != x1.Args[2] { 38284 break 38285 } 38286 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)) { 38287 break 38288 } 38289 b = mergePoint(b, x0, x1) 38290 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38291 v.reset(OpCopy) 38292 v.AddArg(v0) 38293 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38294 v1.AuxInt = j0 38295 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38296 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38297 v3.AuxInt = i0 38298 v3.Aux = s 38299 v3.AddArg(p) 38300 v3.AddArg(idx) 38301 v3.AddArg(mem) 38302 v2.AddArg(v3) 38303 v1.AddArg(v2) 38304 v0.AddArg(v1) 38305 v0.AddArg(y) 38306 return true 38307 } 38308 // 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))) 38309 // 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) 38310 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38311 for { 38312 _ = v.Args[1] 38313 or := v.Args[0] 38314 if or.Op != OpS390XORW { 38315 break 38316 } 38317 _ = or.Args[1] 38318 y := or.Args[0] 38319 s0 := or.Args[1] 38320 if s0.Op != OpS390XSLWconst { 38321 break 38322 } 38323 j0 := s0.AuxInt 38324 x0 := s0.Args[0] 38325 if x0.Op != OpS390XMOVBZloadidx { 38326 break 38327 } 38328 i0 := x0.AuxInt 38329 s := x0.Aux 38330 _ = x0.Args[2] 38331 p := x0.Args[0] 38332 idx := x0.Args[1] 38333 mem := x0.Args[2] 38334 s1 := v.Args[1] 38335 if s1.Op != OpS390XSLWconst { 38336 break 38337 } 38338 j1 := s1.AuxInt 38339 x1 := s1.Args[0] 38340 if x1.Op != OpS390XMOVBZloadidx { 38341 break 38342 } 38343 i1 := x1.AuxInt 38344 if x1.Aux != s { 38345 break 38346 } 38347 _ = x1.Args[2] 38348 if idx != x1.Args[0] { 38349 break 38350 } 38351 if p != x1.Args[1] { 38352 break 38353 } 38354 if mem != x1.Args[2] { 38355 break 38356 } 38357 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)) { 38358 break 38359 } 38360 b = mergePoint(b, x0, x1) 38361 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38362 v.reset(OpCopy) 38363 v.AddArg(v0) 38364 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38365 v1.AuxInt = j0 38366 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38367 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38368 v3.AuxInt = i0 38369 v3.Aux = s 38370 v3.AddArg(p) 38371 v3.AddArg(idx) 38372 v3.AddArg(mem) 38373 v2.AddArg(v3) 38374 v1.AddArg(v2) 38375 v0.AddArg(v1) 38376 v0.AddArg(y) 38377 return true 38378 } 38379 // 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))) 38380 // 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) 38381 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38382 for { 38383 _ = v.Args[1] 38384 or := v.Args[0] 38385 if or.Op != OpS390XORW { 38386 break 38387 } 38388 _ = or.Args[1] 38389 y := or.Args[0] 38390 s0 := or.Args[1] 38391 if s0.Op != OpS390XSLWconst { 38392 break 38393 } 38394 j0 := s0.AuxInt 38395 x0 := s0.Args[0] 38396 if x0.Op != OpS390XMOVBZloadidx { 38397 break 38398 } 38399 i0 := x0.AuxInt 38400 s := x0.Aux 38401 _ = x0.Args[2] 38402 idx := x0.Args[0] 38403 p := x0.Args[1] 38404 mem := x0.Args[2] 38405 s1 := v.Args[1] 38406 if s1.Op != OpS390XSLWconst { 38407 break 38408 } 38409 j1 := s1.AuxInt 38410 x1 := s1.Args[0] 38411 if x1.Op != OpS390XMOVBZloadidx { 38412 break 38413 } 38414 i1 := x1.AuxInt 38415 if x1.Aux != s { 38416 break 38417 } 38418 _ = x1.Args[2] 38419 if idx != x1.Args[0] { 38420 break 38421 } 38422 if p != x1.Args[1] { 38423 break 38424 } 38425 if mem != x1.Args[2] { 38426 break 38427 } 38428 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)) { 38429 break 38430 } 38431 b = mergePoint(b, x0, x1) 38432 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38433 v.reset(OpCopy) 38434 v.AddArg(v0) 38435 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38436 v1.AuxInt = j0 38437 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38438 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38439 v3.AuxInt = i0 38440 v3.Aux = s 38441 v3.AddArg(p) 38442 v3.AddArg(idx) 38443 v3.AddArg(mem) 38444 v2.AddArg(v3) 38445 v1.AddArg(v2) 38446 v0.AddArg(v1) 38447 v0.AddArg(y) 38448 return true 38449 } 38450 return false 38451 } 38452 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 38453 // match: (ORWconst [c] x) 38454 // cond: int32(c)==0 38455 // result: x 38456 for { 38457 c := v.AuxInt 38458 x := v.Args[0] 38459 if !(int32(c) == 0) { 38460 break 38461 } 38462 v.reset(OpCopy) 38463 v.Type = x.Type 38464 v.AddArg(x) 38465 return true 38466 } 38467 // match: (ORWconst [c] _) 38468 // cond: int32(c)==-1 38469 // result: (MOVDconst [-1]) 38470 for { 38471 c := v.AuxInt 38472 if !(int32(c) == -1) { 38473 break 38474 } 38475 v.reset(OpS390XMOVDconst) 38476 v.AuxInt = -1 38477 return true 38478 } 38479 // match: (ORWconst [c] (MOVDconst [d])) 38480 // cond: 38481 // result: (MOVDconst [c|d]) 38482 for { 38483 c := v.AuxInt 38484 v_0 := v.Args[0] 38485 if v_0.Op != OpS390XMOVDconst { 38486 break 38487 } 38488 d := v_0.AuxInt 38489 v.reset(OpS390XMOVDconst) 38490 v.AuxInt = c | d 38491 return true 38492 } 38493 return false 38494 } 38495 func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { 38496 // match: (ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 38497 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38498 // result: (ORWload [off1+off2] {sym} x ptr mem) 38499 for { 38500 off1 := v.AuxInt 38501 sym := v.Aux 38502 _ = v.Args[2] 38503 x := v.Args[0] 38504 v_1 := v.Args[1] 38505 if v_1.Op != OpS390XADDconst { 38506 break 38507 } 38508 off2 := v_1.AuxInt 38509 ptr := v_1.Args[0] 38510 mem := v.Args[2] 38511 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38512 break 38513 } 38514 v.reset(OpS390XORWload) 38515 v.AuxInt = off1 + off2 38516 v.Aux = sym 38517 v.AddArg(x) 38518 v.AddArg(ptr) 38519 v.AddArg(mem) 38520 return true 38521 } 38522 // match: (ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38523 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38524 // result: (ORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38525 for { 38526 o1 := v.AuxInt 38527 s1 := v.Aux 38528 _ = v.Args[2] 38529 x := v.Args[0] 38530 v_1 := v.Args[1] 38531 if v_1.Op != OpS390XMOVDaddr { 38532 break 38533 } 38534 o2 := v_1.AuxInt 38535 s2 := v_1.Aux 38536 ptr := v_1.Args[0] 38537 mem := v.Args[2] 38538 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38539 break 38540 } 38541 v.reset(OpS390XORWload) 38542 v.AuxInt = o1 + o2 38543 v.Aux = mergeSym(s1, s2) 38544 v.AddArg(x) 38545 v.AddArg(ptr) 38546 v.AddArg(mem) 38547 return true 38548 } 38549 return false 38550 } 38551 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 38552 // match: (ORconst [0] x) 38553 // cond: 38554 // result: x 38555 for { 38556 if v.AuxInt != 0 { 38557 break 38558 } 38559 x := v.Args[0] 38560 v.reset(OpCopy) 38561 v.Type = x.Type 38562 v.AddArg(x) 38563 return true 38564 } 38565 // match: (ORconst [-1] _) 38566 // cond: 38567 // result: (MOVDconst [-1]) 38568 for { 38569 if v.AuxInt != -1 { 38570 break 38571 } 38572 v.reset(OpS390XMOVDconst) 38573 v.AuxInt = -1 38574 return true 38575 } 38576 // match: (ORconst [c] (MOVDconst [d])) 38577 // cond: 38578 // result: (MOVDconst [c|d]) 38579 for { 38580 c := v.AuxInt 38581 v_0 := v.Args[0] 38582 if v_0.Op != OpS390XMOVDconst { 38583 break 38584 } 38585 d := v_0.AuxInt 38586 v.reset(OpS390XMOVDconst) 38587 v.AuxInt = c | d 38588 return true 38589 } 38590 return false 38591 } 38592 func rewriteValueS390X_OpS390XORload_0(v *Value) bool { 38593 b := v.Block 38594 _ = b 38595 // match: (ORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 38596 // cond: isSamePtr(ptr1, ptr2) 38597 // result: (OR x (LGDR <t> y)) 38598 for { 38599 t := v.Type 38600 off := v.AuxInt 38601 sym := v.Aux 38602 _ = v.Args[2] 38603 x := v.Args[0] 38604 ptr1 := v.Args[1] 38605 v_2 := v.Args[2] 38606 if v_2.Op != OpS390XFMOVDstore { 38607 break 38608 } 38609 if v_2.AuxInt != off { 38610 break 38611 } 38612 if v_2.Aux != sym { 38613 break 38614 } 38615 _ = v_2.Args[2] 38616 ptr2 := v_2.Args[0] 38617 y := v_2.Args[1] 38618 if !(isSamePtr(ptr1, ptr2)) { 38619 break 38620 } 38621 v.reset(OpS390XOR) 38622 v.AddArg(x) 38623 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 38624 v0.AddArg(y) 38625 v.AddArg(v0) 38626 return true 38627 } 38628 // match: (ORload [off1] {sym} x (ADDconst [off2] ptr) mem) 38629 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38630 // result: (ORload [off1+off2] {sym} x ptr mem) 38631 for { 38632 off1 := v.AuxInt 38633 sym := v.Aux 38634 _ = v.Args[2] 38635 x := v.Args[0] 38636 v_1 := v.Args[1] 38637 if v_1.Op != OpS390XADDconst { 38638 break 38639 } 38640 off2 := v_1.AuxInt 38641 ptr := v_1.Args[0] 38642 mem := v.Args[2] 38643 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38644 break 38645 } 38646 v.reset(OpS390XORload) 38647 v.AuxInt = off1 + off2 38648 v.Aux = sym 38649 v.AddArg(x) 38650 v.AddArg(ptr) 38651 v.AddArg(mem) 38652 return true 38653 } 38654 // match: (ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38655 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38656 // result: (ORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38657 for { 38658 o1 := v.AuxInt 38659 s1 := v.Aux 38660 _ = v.Args[2] 38661 x := v.Args[0] 38662 v_1 := v.Args[1] 38663 if v_1.Op != OpS390XMOVDaddr { 38664 break 38665 } 38666 o2 := v_1.AuxInt 38667 s2 := v_1.Aux 38668 ptr := v_1.Args[0] 38669 mem := v.Args[2] 38670 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38671 break 38672 } 38673 v.reset(OpS390XORload) 38674 v.AuxInt = o1 + o2 38675 v.Aux = mergeSym(s1, s2) 38676 v.AddArg(x) 38677 v.AddArg(ptr) 38678 v.AddArg(mem) 38679 return true 38680 } 38681 return false 38682 } 38683 func rewriteValueS390X_OpS390XRLL_0(v *Value) bool { 38684 // match: (RLL x (MOVDconst [c])) 38685 // cond: 38686 // result: (RLLconst x [c&31]) 38687 for { 38688 _ = v.Args[1] 38689 x := v.Args[0] 38690 v_1 := v.Args[1] 38691 if v_1.Op != OpS390XMOVDconst { 38692 break 38693 } 38694 c := v_1.AuxInt 38695 v.reset(OpS390XRLLconst) 38696 v.AuxInt = c & 31 38697 v.AddArg(x) 38698 return true 38699 } 38700 return false 38701 } 38702 func rewriteValueS390X_OpS390XRLLG_0(v *Value) bool { 38703 // match: (RLLG x (MOVDconst [c])) 38704 // cond: 38705 // result: (RLLGconst x [c&63]) 38706 for { 38707 _ = v.Args[1] 38708 x := v.Args[0] 38709 v_1 := v.Args[1] 38710 if v_1.Op != OpS390XMOVDconst { 38711 break 38712 } 38713 c := v_1.AuxInt 38714 v.reset(OpS390XRLLGconst) 38715 v.AuxInt = c & 63 38716 v.AddArg(x) 38717 return true 38718 } 38719 return false 38720 } 38721 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 38722 b := v.Block 38723 _ = b 38724 typ := &b.Func.Config.Types 38725 _ = typ 38726 // match: (SLD x (MOVDconst [c])) 38727 // cond: 38728 // result: (SLDconst x [c&63]) 38729 for { 38730 _ = v.Args[1] 38731 x := v.Args[0] 38732 v_1 := v.Args[1] 38733 if v_1.Op != OpS390XMOVDconst { 38734 break 38735 } 38736 c := v_1.AuxInt 38737 v.reset(OpS390XSLDconst) 38738 v.AuxInt = c & 63 38739 v.AddArg(x) 38740 return true 38741 } 38742 // match: (SLD x (AND (MOVDconst [c]) y)) 38743 // cond: 38744 // result: (SLD x (ANDWconst <typ.UInt32> [c&63] y)) 38745 for { 38746 _ = v.Args[1] 38747 x := v.Args[0] 38748 v_1 := v.Args[1] 38749 if v_1.Op != OpS390XAND { 38750 break 38751 } 38752 _ = v_1.Args[1] 38753 v_1_0 := v_1.Args[0] 38754 if v_1_0.Op != OpS390XMOVDconst { 38755 break 38756 } 38757 c := v_1_0.AuxInt 38758 y := v_1.Args[1] 38759 v.reset(OpS390XSLD) 38760 v.AddArg(x) 38761 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38762 v0.AuxInt = c & 63 38763 v0.AddArg(y) 38764 v.AddArg(v0) 38765 return true 38766 } 38767 // match: (SLD x (AND y (MOVDconst [c]))) 38768 // cond: 38769 // result: (SLD x (ANDWconst <typ.UInt32> [c&63] y)) 38770 for { 38771 _ = v.Args[1] 38772 x := v.Args[0] 38773 v_1 := v.Args[1] 38774 if v_1.Op != OpS390XAND { 38775 break 38776 } 38777 _ = v_1.Args[1] 38778 y := v_1.Args[0] 38779 v_1_1 := v_1.Args[1] 38780 if v_1_1.Op != OpS390XMOVDconst { 38781 break 38782 } 38783 c := v_1_1.AuxInt 38784 v.reset(OpS390XSLD) 38785 v.AddArg(x) 38786 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38787 v0.AuxInt = c & 63 38788 v0.AddArg(y) 38789 v.AddArg(v0) 38790 return true 38791 } 38792 // match: (SLD x (ANDWconst [c] y)) 38793 // cond: c&63 == 63 38794 // result: (SLD x y) 38795 for { 38796 _ = v.Args[1] 38797 x := v.Args[0] 38798 v_1 := v.Args[1] 38799 if v_1.Op != OpS390XANDWconst { 38800 break 38801 } 38802 c := v_1.AuxInt 38803 y := v_1.Args[0] 38804 if !(c&63 == 63) { 38805 break 38806 } 38807 v.reset(OpS390XSLD) 38808 v.AddArg(x) 38809 v.AddArg(y) 38810 return true 38811 } 38812 // match: (SLD x (MOVDreg y)) 38813 // cond: 38814 // result: (SLD x y) 38815 for { 38816 _ = v.Args[1] 38817 x := v.Args[0] 38818 v_1 := v.Args[1] 38819 if v_1.Op != OpS390XMOVDreg { 38820 break 38821 } 38822 y := v_1.Args[0] 38823 v.reset(OpS390XSLD) 38824 v.AddArg(x) 38825 v.AddArg(y) 38826 return true 38827 } 38828 // match: (SLD x (MOVWreg y)) 38829 // cond: 38830 // result: (SLD x y) 38831 for { 38832 _ = v.Args[1] 38833 x := v.Args[0] 38834 v_1 := v.Args[1] 38835 if v_1.Op != OpS390XMOVWreg { 38836 break 38837 } 38838 y := v_1.Args[0] 38839 v.reset(OpS390XSLD) 38840 v.AddArg(x) 38841 v.AddArg(y) 38842 return true 38843 } 38844 // match: (SLD x (MOVHreg y)) 38845 // cond: 38846 // result: (SLD x y) 38847 for { 38848 _ = v.Args[1] 38849 x := v.Args[0] 38850 v_1 := v.Args[1] 38851 if v_1.Op != OpS390XMOVHreg { 38852 break 38853 } 38854 y := v_1.Args[0] 38855 v.reset(OpS390XSLD) 38856 v.AddArg(x) 38857 v.AddArg(y) 38858 return true 38859 } 38860 // match: (SLD x (MOVBreg y)) 38861 // cond: 38862 // result: (SLD x y) 38863 for { 38864 _ = v.Args[1] 38865 x := v.Args[0] 38866 v_1 := v.Args[1] 38867 if v_1.Op != OpS390XMOVBreg { 38868 break 38869 } 38870 y := v_1.Args[0] 38871 v.reset(OpS390XSLD) 38872 v.AddArg(x) 38873 v.AddArg(y) 38874 return true 38875 } 38876 // match: (SLD x (MOVWZreg y)) 38877 // cond: 38878 // result: (SLD x y) 38879 for { 38880 _ = v.Args[1] 38881 x := v.Args[0] 38882 v_1 := v.Args[1] 38883 if v_1.Op != OpS390XMOVWZreg { 38884 break 38885 } 38886 y := v_1.Args[0] 38887 v.reset(OpS390XSLD) 38888 v.AddArg(x) 38889 v.AddArg(y) 38890 return true 38891 } 38892 // match: (SLD x (MOVHZreg y)) 38893 // cond: 38894 // result: (SLD x y) 38895 for { 38896 _ = v.Args[1] 38897 x := v.Args[0] 38898 v_1 := v.Args[1] 38899 if v_1.Op != OpS390XMOVHZreg { 38900 break 38901 } 38902 y := v_1.Args[0] 38903 v.reset(OpS390XSLD) 38904 v.AddArg(x) 38905 v.AddArg(y) 38906 return true 38907 } 38908 return false 38909 } 38910 func rewriteValueS390X_OpS390XSLD_10(v *Value) bool { 38911 // match: (SLD x (MOVBZreg y)) 38912 // cond: 38913 // result: (SLD x y) 38914 for { 38915 _ = v.Args[1] 38916 x := v.Args[0] 38917 v_1 := v.Args[1] 38918 if v_1.Op != OpS390XMOVBZreg { 38919 break 38920 } 38921 y := v_1.Args[0] 38922 v.reset(OpS390XSLD) 38923 v.AddArg(x) 38924 v.AddArg(y) 38925 return true 38926 } 38927 return false 38928 } 38929 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 38930 b := v.Block 38931 _ = b 38932 typ := &b.Func.Config.Types 38933 _ = typ 38934 // match: (SLW x (MOVDconst [c])) 38935 // cond: 38936 // result: (SLWconst x [c&63]) 38937 for { 38938 _ = v.Args[1] 38939 x := v.Args[0] 38940 v_1 := v.Args[1] 38941 if v_1.Op != OpS390XMOVDconst { 38942 break 38943 } 38944 c := v_1.AuxInt 38945 v.reset(OpS390XSLWconst) 38946 v.AuxInt = c & 63 38947 v.AddArg(x) 38948 return true 38949 } 38950 // match: (SLW x (AND (MOVDconst [c]) y)) 38951 // cond: 38952 // result: (SLW x (ANDWconst <typ.UInt32> [c&63] y)) 38953 for { 38954 _ = v.Args[1] 38955 x := v.Args[0] 38956 v_1 := v.Args[1] 38957 if v_1.Op != OpS390XAND { 38958 break 38959 } 38960 _ = v_1.Args[1] 38961 v_1_0 := v_1.Args[0] 38962 if v_1_0.Op != OpS390XMOVDconst { 38963 break 38964 } 38965 c := v_1_0.AuxInt 38966 y := v_1.Args[1] 38967 v.reset(OpS390XSLW) 38968 v.AddArg(x) 38969 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38970 v0.AuxInt = c & 63 38971 v0.AddArg(y) 38972 v.AddArg(v0) 38973 return true 38974 } 38975 // match: (SLW x (AND y (MOVDconst [c]))) 38976 // cond: 38977 // result: (SLW x (ANDWconst <typ.UInt32> [c&63] y)) 38978 for { 38979 _ = v.Args[1] 38980 x := v.Args[0] 38981 v_1 := v.Args[1] 38982 if v_1.Op != OpS390XAND { 38983 break 38984 } 38985 _ = v_1.Args[1] 38986 y := v_1.Args[0] 38987 v_1_1 := v_1.Args[1] 38988 if v_1_1.Op != OpS390XMOVDconst { 38989 break 38990 } 38991 c := v_1_1.AuxInt 38992 v.reset(OpS390XSLW) 38993 v.AddArg(x) 38994 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38995 v0.AuxInt = c & 63 38996 v0.AddArg(y) 38997 v.AddArg(v0) 38998 return true 38999 } 39000 // match: (SLW x (ANDWconst [c] y)) 39001 // cond: c&63 == 63 39002 // result: (SLW x y) 39003 for { 39004 _ = v.Args[1] 39005 x := v.Args[0] 39006 v_1 := v.Args[1] 39007 if v_1.Op != OpS390XANDWconst { 39008 break 39009 } 39010 c := v_1.AuxInt 39011 y := v_1.Args[0] 39012 if !(c&63 == 63) { 39013 break 39014 } 39015 v.reset(OpS390XSLW) 39016 v.AddArg(x) 39017 v.AddArg(y) 39018 return true 39019 } 39020 // match: (SLW x (MOVDreg y)) 39021 // cond: 39022 // result: (SLW x y) 39023 for { 39024 _ = v.Args[1] 39025 x := v.Args[0] 39026 v_1 := v.Args[1] 39027 if v_1.Op != OpS390XMOVDreg { 39028 break 39029 } 39030 y := v_1.Args[0] 39031 v.reset(OpS390XSLW) 39032 v.AddArg(x) 39033 v.AddArg(y) 39034 return true 39035 } 39036 // match: (SLW x (MOVWreg y)) 39037 // cond: 39038 // result: (SLW x y) 39039 for { 39040 _ = v.Args[1] 39041 x := v.Args[0] 39042 v_1 := v.Args[1] 39043 if v_1.Op != OpS390XMOVWreg { 39044 break 39045 } 39046 y := v_1.Args[0] 39047 v.reset(OpS390XSLW) 39048 v.AddArg(x) 39049 v.AddArg(y) 39050 return true 39051 } 39052 // match: (SLW x (MOVHreg y)) 39053 // cond: 39054 // result: (SLW x y) 39055 for { 39056 _ = v.Args[1] 39057 x := v.Args[0] 39058 v_1 := v.Args[1] 39059 if v_1.Op != OpS390XMOVHreg { 39060 break 39061 } 39062 y := v_1.Args[0] 39063 v.reset(OpS390XSLW) 39064 v.AddArg(x) 39065 v.AddArg(y) 39066 return true 39067 } 39068 // match: (SLW x (MOVBreg y)) 39069 // cond: 39070 // result: (SLW x y) 39071 for { 39072 _ = v.Args[1] 39073 x := v.Args[0] 39074 v_1 := v.Args[1] 39075 if v_1.Op != OpS390XMOVBreg { 39076 break 39077 } 39078 y := v_1.Args[0] 39079 v.reset(OpS390XSLW) 39080 v.AddArg(x) 39081 v.AddArg(y) 39082 return true 39083 } 39084 // match: (SLW x (MOVWZreg y)) 39085 // cond: 39086 // result: (SLW x y) 39087 for { 39088 _ = v.Args[1] 39089 x := v.Args[0] 39090 v_1 := v.Args[1] 39091 if v_1.Op != OpS390XMOVWZreg { 39092 break 39093 } 39094 y := v_1.Args[0] 39095 v.reset(OpS390XSLW) 39096 v.AddArg(x) 39097 v.AddArg(y) 39098 return true 39099 } 39100 // match: (SLW x (MOVHZreg y)) 39101 // cond: 39102 // result: (SLW x y) 39103 for { 39104 _ = v.Args[1] 39105 x := v.Args[0] 39106 v_1 := v.Args[1] 39107 if v_1.Op != OpS390XMOVHZreg { 39108 break 39109 } 39110 y := v_1.Args[0] 39111 v.reset(OpS390XSLW) 39112 v.AddArg(x) 39113 v.AddArg(y) 39114 return true 39115 } 39116 return false 39117 } 39118 func rewriteValueS390X_OpS390XSLW_10(v *Value) bool { 39119 // match: (SLW x (MOVBZreg y)) 39120 // cond: 39121 // result: (SLW x y) 39122 for { 39123 _ = v.Args[1] 39124 x := v.Args[0] 39125 v_1 := v.Args[1] 39126 if v_1.Op != OpS390XMOVBZreg { 39127 break 39128 } 39129 y := v_1.Args[0] 39130 v.reset(OpS390XSLW) 39131 v.AddArg(x) 39132 v.AddArg(y) 39133 return true 39134 } 39135 return false 39136 } 39137 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 39138 b := v.Block 39139 _ = b 39140 typ := &b.Func.Config.Types 39141 _ = typ 39142 // match: (SRAD x (MOVDconst [c])) 39143 // cond: 39144 // result: (SRADconst x [c&63]) 39145 for { 39146 _ = v.Args[1] 39147 x := v.Args[0] 39148 v_1 := v.Args[1] 39149 if v_1.Op != OpS390XMOVDconst { 39150 break 39151 } 39152 c := v_1.AuxInt 39153 v.reset(OpS390XSRADconst) 39154 v.AuxInt = c & 63 39155 v.AddArg(x) 39156 return true 39157 } 39158 // match: (SRAD x (AND (MOVDconst [c]) y)) 39159 // cond: 39160 // result: (SRAD x (ANDWconst <typ.UInt32> [c&63] y)) 39161 for { 39162 _ = v.Args[1] 39163 x := v.Args[0] 39164 v_1 := v.Args[1] 39165 if v_1.Op != OpS390XAND { 39166 break 39167 } 39168 _ = v_1.Args[1] 39169 v_1_0 := v_1.Args[0] 39170 if v_1_0.Op != OpS390XMOVDconst { 39171 break 39172 } 39173 c := v_1_0.AuxInt 39174 y := v_1.Args[1] 39175 v.reset(OpS390XSRAD) 39176 v.AddArg(x) 39177 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39178 v0.AuxInt = c & 63 39179 v0.AddArg(y) 39180 v.AddArg(v0) 39181 return true 39182 } 39183 // match: (SRAD x (AND y (MOVDconst [c]))) 39184 // cond: 39185 // result: (SRAD x (ANDWconst <typ.UInt32> [c&63] y)) 39186 for { 39187 _ = v.Args[1] 39188 x := v.Args[0] 39189 v_1 := v.Args[1] 39190 if v_1.Op != OpS390XAND { 39191 break 39192 } 39193 _ = v_1.Args[1] 39194 y := v_1.Args[0] 39195 v_1_1 := v_1.Args[1] 39196 if v_1_1.Op != OpS390XMOVDconst { 39197 break 39198 } 39199 c := v_1_1.AuxInt 39200 v.reset(OpS390XSRAD) 39201 v.AddArg(x) 39202 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39203 v0.AuxInt = c & 63 39204 v0.AddArg(y) 39205 v.AddArg(v0) 39206 return true 39207 } 39208 // match: (SRAD x (ANDWconst [c] y)) 39209 // cond: c&63 == 63 39210 // result: (SRAD x y) 39211 for { 39212 _ = v.Args[1] 39213 x := v.Args[0] 39214 v_1 := v.Args[1] 39215 if v_1.Op != OpS390XANDWconst { 39216 break 39217 } 39218 c := v_1.AuxInt 39219 y := v_1.Args[0] 39220 if !(c&63 == 63) { 39221 break 39222 } 39223 v.reset(OpS390XSRAD) 39224 v.AddArg(x) 39225 v.AddArg(y) 39226 return true 39227 } 39228 // match: (SRAD x (MOVDreg y)) 39229 // cond: 39230 // result: (SRAD x y) 39231 for { 39232 _ = v.Args[1] 39233 x := v.Args[0] 39234 v_1 := v.Args[1] 39235 if v_1.Op != OpS390XMOVDreg { 39236 break 39237 } 39238 y := v_1.Args[0] 39239 v.reset(OpS390XSRAD) 39240 v.AddArg(x) 39241 v.AddArg(y) 39242 return true 39243 } 39244 // match: (SRAD x (MOVWreg y)) 39245 // cond: 39246 // result: (SRAD x y) 39247 for { 39248 _ = v.Args[1] 39249 x := v.Args[0] 39250 v_1 := v.Args[1] 39251 if v_1.Op != OpS390XMOVWreg { 39252 break 39253 } 39254 y := v_1.Args[0] 39255 v.reset(OpS390XSRAD) 39256 v.AddArg(x) 39257 v.AddArg(y) 39258 return true 39259 } 39260 // match: (SRAD x (MOVHreg y)) 39261 // cond: 39262 // result: (SRAD x y) 39263 for { 39264 _ = v.Args[1] 39265 x := v.Args[0] 39266 v_1 := v.Args[1] 39267 if v_1.Op != OpS390XMOVHreg { 39268 break 39269 } 39270 y := v_1.Args[0] 39271 v.reset(OpS390XSRAD) 39272 v.AddArg(x) 39273 v.AddArg(y) 39274 return true 39275 } 39276 // match: (SRAD x (MOVBreg y)) 39277 // cond: 39278 // result: (SRAD x y) 39279 for { 39280 _ = v.Args[1] 39281 x := v.Args[0] 39282 v_1 := v.Args[1] 39283 if v_1.Op != OpS390XMOVBreg { 39284 break 39285 } 39286 y := v_1.Args[0] 39287 v.reset(OpS390XSRAD) 39288 v.AddArg(x) 39289 v.AddArg(y) 39290 return true 39291 } 39292 // match: (SRAD x (MOVWZreg y)) 39293 // cond: 39294 // result: (SRAD x y) 39295 for { 39296 _ = v.Args[1] 39297 x := v.Args[0] 39298 v_1 := v.Args[1] 39299 if v_1.Op != OpS390XMOVWZreg { 39300 break 39301 } 39302 y := v_1.Args[0] 39303 v.reset(OpS390XSRAD) 39304 v.AddArg(x) 39305 v.AddArg(y) 39306 return true 39307 } 39308 // match: (SRAD x (MOVHZreg y)) 39309 // cond: 39310 // result: (SRAD x y) 39311 for { 39312 _ = v.Args[1] 39313 x := v.Args[0] 39314 v_1 := v.Args[1] 39315 if v_1.Op != OpS390XMOVHZreg { 39316 break 39317 } 39318 y := v_1.Args[0] 39319 v.reset(OpS390XSRAD) 39320 v.AddArg(x) 39321 v.AddArg(y) 39322 return true 39323 } 39324 return false 39325 } 39326 func rewriteValueS390X_OpS390XSRAD_10(v *Value) bool { 39327 // match: (SRAD x (MOVBZreg y)) 39328 // cond: 39329 // result: (SRAD x y) 39330 for { 39331 _ = v.Args[1] 39332 x := v.Args[0] 39333 v_1 := v.Args[1] 39334 if v_1.Op != OpS390XMOVBZreg { 39335 break 39336 } 39337 y := v_1.Args[0] 39338 v.reset(OpS390XSRAD) 39339 v.AddArg(x) 39340 v.AddArg(y) 39341 return true 39342 } 39343 return false 39344 } 39345 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 39346 // match: (SRADconst [c] (MOVDconst [d])) 39347 // cond: 39348 // result: (MOVDconst [d>>uint64(c)]) 39349 for { 39350 c := v.AuxInt 39351 v_0 := v.Args[0] 39352 if v_0.Op != OpS390XMOVDconst { 39353 break 39354 } 39355 d := v_0.AuxInt 39356 v.reset(OpS390XMOVDconst) 39357 v.AuxInt = d >> uint64(c) 39358 return true 39359 } 39360 return false 39361 } 39362 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 39363 b := v.Block 39364 _ = b 39365 typ := &b.Func.Config.Types 39366 _ = typ 39367 // match: (SRAW x (MOVDconst [c])) 39368 // cond: 39369 // result: (SRAWconst x [c&63]) 39370 for { 39371 _ = v.Args[1] 39372 x := v.Args[0] 39373 v_1 := v.Args[1] 39374 if v_1.Op != OpS390XMOVDconst { 39375 break 39376 } 39377 c := v_1.AuxInt 39378 v.reset(OpS390XSRAWconst) 39379 v.AuxInt = c & 63 39380 v.AddArg(x) 39381 return true 39382 } 39383 // match: (SRAW x (AND (MOVDconst [c]) y)) 39384 // cond: 39385 // result: (SRAW x (ANDWconst <typ.UInt32> [c&63] y)) 39386 for { 39387 _ = v.Args[1] 39388 x := v.Args[0] 39389 v_1 := v.Args[1] 39390 if v_1.Op != OpS390XAND { 39391 break 39392 } 39393 _ = v_1.Args[1] 39394 v_1_0 := v_1.Args[0] 39395 if v_1_0.Op != OpS390XMOVDconst { 39396 break 39397 } 39398 c := v_1_0.AuxInt 39399 y := v_1.Args[1] 39400 v.reset(OpS390XSRAW) 39401 v.AddArg(x) 39402 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39403 v0.AuxInt = c & 63 39404 v0.AddArg(y) 39405 v.AddArg(v0) 39406 return true 39407 } 39408 // match: (SRAW x (AND y (MOVDconst [c]))) 39409 // cond: 39410 // result: (SRAW x (ANDWconst <typ.UInt32> [c&63] y)) 39411 for { 39412 _ = v.Args[1] 39413 x := v.Args[0] 39414 v_1 := v.Args[1] 39415 if v_1.Op != OpS390XAND { 39416 break 39417 } 39418 _ = v_1.Args[1] 39419 y := v_1.Args[0] 39420 v_1_1 := v_1.Args[1] 39421 if v_1_1.Op != OpS390XMOVDconst { 39422 break 39423 } 39424 c := v_1_1.AuxInt 39425 v.reset(OpS390XSRAW) 39426 v.AddArg(x) 39427 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39428 v0.AuxInt = c & 63 39429 v0.AddArg(y) 39430 v.AddArg(v0) 39431 return true 39432 } 39433 // match: (SRAW x (ANDWconst [c] y)) 39434 // cond: c&63 == 63 39435 // result: (SRAW x y) 39436 for { 39437 _ = v.Args[1] 39438 x := v.Args[0] 39439 v_1 := v.Args[1] 39440 if v_1.Op != OpS390XANDWconst { 39441 break 39442 } 39443 c := v_1.AuxInt 39444 y := v_1.Args[0] 39445 if !(c&63 == 63) { 39446 break 39447 } 39448 v.reset(OpS390XSRAW) 39449 v.AddArg(x) 39450 v.AddArg(y) 39451 return true 39452 } 39453 // match: (SRAW x (MOVDreg y)) 39454 // cond: 39455 // result: (SRAW x y) 39456 for { 39457 _ = v.Args[1] 39458 x := v.Args[0] 39459 v_1 := v.Args[1] 39460 if v_1.Op != OpS390XMOVDreg { 39461 break 39462 } 39463 y := v_1.Args[0] 39464 v.reset(OpS390XSRAW) 39465 v.AddArg(x) 39466 v.AddArg(y) 39467 return true 39468 } 39469 // match: (SRAW x (MOVWreg y)) 39470 // cond: 39471 // result: (SRAW x y) 39472 for { 39473 _ = v.Args[1] 39474 x := v.Args[0] 39475 v_1 := v.Args[1] 39476 if v_1.Op != OpS390XMOVWreg { 39477 break 39478 } 39479 y := v_1.Args[0] 39480 v.reset(OpS390XSRAW) 39481 v.AddArg(x) 39482 v.AddArg(y) 39483 return true 39484 } 39485 // match: (SRAW x (MOVHreg y)) 39486 // cond: 39487 // result: (SRAW x y) 39488 for { 39489 _ = v.Args[1] 39490 x := v.Args[0] 39491 v_1 := v.Args[1] 39492 if v_1.Op != OpS390XMOVHreg { 39493 break 39494 } 39495 y := v_1.Args[0] 39496 v.reset(OpS390XSRAW) 39497 v.AddArg(x) 39498 v.AddArg(y) 39499 return true 39500 } 39501 // match: (SRAW x (MOVBreg y)) 39502 // cond: 39503 // result: (SRAW x y) 39504 for { 39505 _ = v.Args[1] 39506 x := v.Args[0] 39507 v_1 := v.Args[1] 39508 if v_1.Op != OpS390XMOVBreg { 39509 break 39510 } 39511 y := v_1.Args[0] 39512 v.reset(OpS390XSRAW) 39513 v.AddArg(x) 39514 v.AddArg(y) 39515 return true 39516 } 39517 // match: (SRAW x (MOVWZreg y)) 39518 // cond: 39519 // result: (SRAW x y) 39520 for { 39521 _ = v.Args[1] 39522 x := v.Args[0] 39523 v_1 := v.Args[1] 39524 if v_1.Op != OpS390XMOVWZreg { 39525 break 39526 } 39527 y := v_1.Args[0] 39528 v.reset(OpS390XSRAW) 39529 v.AddArg(x) 39530 v.AddArg(y) 39531 return true 39532 } 39533 // match: (SRAW x (MOVHZreg y)) 39534 // cond: 39535 // result: (SRAW x y) 39536 for { 39537 _ = v.Args[1] 39538 x := v.Args[0] 39539 v_1 := v.Args[1] 39540 if v_1.Op != OpS390XMOVHZreg { 39541 break 39542 } 39543 y := v_1.Args[0] 39544 v.reset(OpS390XSRAW) 39545 v.AddArg(x) 39546 v.AddArg(y) 39547 return true 39548 } 39549 return false 39550 } 39551 func rewriteValueS390X_OpS390XSRAW_10(v *Value) bool { 39552 // match: (SRAW x (MOVBZreg y)) 39553 // cond: 39554 // result: (SRAW x y) 39555 for { 39556 _ = v.Args[1] 39557 x := v.Args[0] 39558 v_1 := v.Args[1] 39559 if v_1.Op != OpS390XMOVBZreg { 39560 break 39561 } 39562 y := v_1.Args[0] 39563 v.reset(OpS390XSRAW) 39564 v.AddArg(x) 39565 v.AddArg(y) 39566 return true 39567 } 39568 return false 39569 } 39570 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 39571 // match: (SRAWconst [c] (MOVDconst [d])) 39572 // cond: 39573 // result: (MOVDconst [int64(int32(d))>>uint64(c)]) 39574 for { 39575 c := v.AuxInt 39576 v_0 := v.Args[0] 39577 if v_0.Op != OpS390XMOVDconst { 39578 break 39579 } 39580 d := v_0.AuxInt 39581 v.reset(OpS390XMOVDconst) 39582 v.AuxInt = int64(int32(d)) >> uint64(c) 39583 return true 39584 } 39585 return false 39586 } 39587 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 39588 b := v.Block 39589 _ = b 39590 typ := &b.Func.Config.Types 39591 _ = typ 39592 // match: (SRD x (MOVDconst [c])) 39593 // cond: 39594 // result: (SRDconst x [c&63]) 39595 for { 39596 _ = v.Args[1] 39597 x := v.Args[0] 39598 v_1 := v.Args[1] 39599 if v_1.Op != OpS390XMOVDconst { 39600 break 39601 } 39602 c := v_1.AuxInt 39603 v.reset(OpS390XSRDconst) 39604 v.AuxInt = c & 63 39605 v.AddArg(x) 39606 return true 39607 } 39608 // match: (SRD x (AND (MOVDconst [c]) y)) 39609 // cond: 39610 // result: (SRD x (ANDWconst <typ.UInt32> [c&63] y)) 39611 for { 39612 _ = v.Args[1] 39613 x := v.Args[0] 39614 v_1 := v.Args[1] 39615 if v_1.Op != OpS390XAND { 39616 break 39617 } 39618 _ = v_1.Args[1] 39619 v_1_0 := v_1.Args[0] 39620 if v_1_0.Op != OpS390XMOVDconst { 39621 break 39622 } 39623 c := v_1_0.AuxInt 39624 y := v_1.Args[1] 39625 v.reset(OpS390XSRD) 39626 v.AddArg(x) 39627 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39628 v0.AuxInt = c & 63 39629 v0.AddArg(y) 39630 v.AddArg(v0) 39631 return true 39632 } 39633 // match: (SRD x (AND y (MOVDconst [c]))) 39634 // cond: 39635 // result: (SRD x (ANDWconst <typ.UInt32> [c&63] y)) 39636 for { 39637 _ = v.Args[1] 39638 x := v.Args[0] 39639 v_1 := v.Args[1] 39640 if v_1.Op != OpS390XAND { 39641 break 39642 } 39643 _ = v_1.Args[1] 39644 y := v_1.Args[0] 39645 v_1_1 := v_1.Args[1] 39646 if v_1_1.Op != OpS390XMOVDconst { 39647 break 39648 } 39649 c := v_1_1.AuxInt 39650 v.reset(OpS390XSRD) 39651 v.AddArg(x) 39652 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39653 v0.AuxInt = c & 63 39654 v0.AddArg(y) 39655 v.AddArg(v0) 39656 return true 39657 } 39658 // match: (SRD x (ANDWconst [c] y)) 39659 // cond: c&63 == 63 39660 // result: (SRD x y) 39661 for { 39662 _ = v.Args[1] 39663 x := v.Args[0] 39664 v_1 := v.Args[1] 39665 if v_1.Op != OpS390XANDWconst { 39666 break 39667 } 39668 c := v_1.AuxInt 39669 y := v_1.Args[0] 39670 if !(c&63 == 63) { 39671 break 39672 } 39673 v.reset(OpS390XSRD) 39674 v.AddArg(x) 39675 v.AddArg(y) 39676 return true 39677 } 39678 // match: (SRD x (MOVDreg y)) 39679 // cond: 39680 // result: (SRD x y) 39681 for { 39682 _ = v.Args[1] 39683 x := v.Args[0] 39684 v_1 := v.Args[1] 39685 if v_1.Op != OpS390XMOVDreg { 39686 break 39687 } 39688 y := v_1.Args[0] 39689 v.reset(OpS390XSRD) 39690 v.AddArg(x) 39691 v.AddArg(y) 39692 return true 39693 } 39694 // match: (SRD x (MOVWreg y)) 39695 // cond: 39696 // result: (SRD x y) 39697 for { 39698 _ = v.Args[1] 39699 x := v.Args[0] 39700 v_1 := v.Args[1] 39701 if v_1.Op != OpS390XMOVWreg { 39702 break 39703 } 39704 y := v_1.Args[0] 39705 v.reset(OpS390XSRD) 39706 v.AddArg(x) 39707 v.AddArg(y) 39708 return true 39709 } 39710 // match: (SRD x (MOVHreg y)) 39711 // cond: 39712 // result: (SRD x y) 39713 for { 39714 _ = v.Args[1] 39715 x := v.Args[0] 39716 v_1 := v.Args[1] 39717 if v_1.Op != OpS390XMOVHreg { 39718 break 39719 } 39720 y := v_1.Args[0] 39721 v.reset(OpS390XSRD) 39722 v.AddArg(x) 39723 v.AddArg(y) 39724 return true 39725 } 39726 // match: (SRD x (MOVBreg y)) 39727 // cond: 39728 // result: (SRD x y) 39729 for { 39730 _ = v.Args[1] 39731 x := v.Args[0] 39732 v_1 := v.Args[1] 39733 if v_1.Op != OpS390XMOVBreg { 39734 break 39735 } 39736 y := v_1.Args[0] 39737 v.reset(OpS390XSRD) 39738 v.AddArg(x) 39739 v.AddArg(y) 39740 return true 39741 } 39742 // match: (SRD x (MOVWZreg y)) 39743 // cond: 39744 // result: (SRD x y) 39745 for { 39746 _ = v.Args[1] 39747 x := v.Args[0] 39748 v_1 := v.Args[1] 39749 if v_1.Op != OpS390XMOVWZreg { 39750 break 39751 } 39752 y := v_1.Args[0] 39753 v.reset(OpS390XSRD) 39754 v.AddArg(x) 39755 v.AddArg(y) 39756 return true 39757 } 39758 // match: (SRD x (MOVHZreg y)) 39759 // cond: 39760 // result: (SRD x y) 39761 for { 39762 _ = v.Args[1] 39763 x := v.Args[0] 39764 v_1 := v.Args[1] 39765 if v_1.Op != OpS390XMOVHZreg { 39766 break 39767 } 39768 y := v_1.Args[0] 39769 v.reset(OpS390XSRD) 39770 v.AddArg(x) 39771 v.AddArg(y) 39772 return true 39773 } 39774 return false 39775 } 39776 func rewriteValueS390X_OpS390XSRD_10(v *Value) bool { 39777 // match: (SRD x (MOVBZreg y)) 39778 // cond: 39779 // result: (SRD x y) 39780 for { 39781 _ = v.Args[1] 39782 x := v.Args[0] 39783 v_1 := v.Args[1] 39784 if v_1.Op != OpS390XMOVBZreg { 39785 break 39786 } 39787 y := v_1.Args[0] 39788 v.reset(OpS390XSRD) 39789 v.AddArg(x) 39790 v.AddArg(y) 39791 return true 39792 } 39793 return false 39794 } 39795 func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool { 39796 b := v.Block 39797 _ = b 39798 // match: (SRDconst [1] (SLDconst [1] (LGDR <t> x))) 39799 // cond: 39800 // result: (LGDR <t> (LPDFR <x.Type> x)) 39801 for { 39802 if v.AuxInt != 1 { 39803 break 39804 } 39805 v_0 := v.Args[0] 39806 if v_0.Op != OpS390XSLDconst { 39807 break 39808 } 39809 if v_0.AuxInt != 1 { 39810 break 39811 } 39812 v_0_0 := v_0.Args[0] 39813 if v_0_0.Op != OpS390XLGDR { 39814 break 39815 } 39816 t := v_0_0.Type 39817 x := v_0_0.Args[0] 39818 v.reset(OpS390XLGDR) 39819 v.Type = t 39820 v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) 39821 v0.AddArg(x) 39822 v.AddArg(v0) 39823 return true 39824 } 39825 return false 39826 } 39827 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 39828 b := v.Block 39829 _ = b 39830 typ := &b.Func.Config.Types 39831 _ = typ 39832 // match: (SRW x (MOVDconst [c])) 39833 // cond: 39834 // result: (SRWconst x [c&63]) 39835 for { 39836 _ = v.Args[1] 39837 x := v.Args[0] 39838 v_1 := v.Args[1] 39839 if v_1.Op != OpS390XMOVDconst { 39840 break 39841 } 39842 c := v_1.AuxInt 39843 v.reset(OpS390XSRWconst) 39844 v.AuxInt = c & 63 39845 v.AddArg(x) 39846 return true 39847 } 39848 // match: (SRW x (AND (MOVDconst [c]) y)) 39849 // cond: 39850 // result: (SRW x (ANDWconst <typ.UInt32> [c&63] y)) 39851 for { 39852 _ = v.Args[1] 39853 x := v.Args[0] 39854 v_1 := v.Args[1] 39855 if v_1.Op != OpS390XAND { 39856 break 39857 } 39858 _ = v_1.Args[1] 39859 v_1_0 := v_1.Args[0] 39860 if v_1_0.Op != OpS390XMOVDconst { 39861 break 39862 } 39863 c := v_1_0.AuxInt 39864 y := v_1.Args[1] 39865 v.reset(OpS390XSRW) 39866 v.AddArg(x) 39867 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39868 v0.AuxInt = c & 63 39869 v0.AddArg(y) 39870 v.AddArg(v0) 39871 return true 39872 } 39873 // match: (SRW x (AND y (MOVDconst [c]))) 39874 // cond: 39875 // result: (SRW x (ANDWconst <typ.UInt32> [c&63] y)) 39876 for { 39877 _ = v.Args[1] 39878 x := v.Args[0] 39879 v_1 := v.Args[1] 39880 if v_1.Op != OpS390XAND { 39881 break 39882 } 39883 _ = v_1.Args[1] 39884 y := v_1.Args[0] 39885 v_1_1 := v_1.Args[1] 39886 if v_1_1.Op != OpS390XMOVDconst { 39887 break 39888 } 39889 c := v_1_1.AuxInt 39890 v.reset(OpS390XSRW) 39891 v.AddArg(x) 39892 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39893 v0.AuxInt = c & 63 39894 v0.AddArg(y) 39895 v.AddArg(v0) 39896 return true 39897 } 39898 // match: (SRW x (ANDWconst [c] y)) 39899 // cond: c&63 == 63 39900 // result: (SRW x y) 39901 for { 39902 _ = v.Args[1] 39903 x := v.Args[0] 39904 v_1 := v.Args[1] 39905 if v_1.Op != OpS390XANDWconst { 39906 break 39907 } 39908 c := v_1.AuxInt 39909 y := v_1.Args[0] 39910 if !(c&63 == 63) { 39911 break 39912 } 39913 v.reset(OpS390XSRW) 39914 v.AddArg(x) 39915 v.AddArg(y) 39916 return true 39917 } 39918 // match: (SRW x (MOVDreg y)) 39919 // cond: 39920 // result: (SRW x y) 39921 for { 39922 _ = v.Args[1] 39923 x := v.Args[0] 39924 v_1 := v.Args[1] 39925 if v_1.Op != OpS390XMOVDreg { 39926 break 39927 } 39928 y := v_1.Args[0] 39929 v.reset(OpS390XSRW) 39930 v.AddArg(x) 39931 v.AddArg(y) 39932 return true 39933 } 39934 // match: (SRW x (MOVWreg y)) 39935 // cond: 39936 // result: (SRW x y) 39937 for { 39938 _ = v.Args[1] 39939 x := v.Args[0] 39940 v_1 := v.Args[1] 39941 if v_1.Op != OpS390XMOVWreg { 39942 break 39943 } 39944 y := v_1.Args[0] 39945 v.reset(OpS390XSRW) 39946 v.AddArg(x) 39947 v.AddArg(y) 39948 return true 39949 } 39950 // match: (SRW x (MOVHreg y)) 39951 // cond: 39952 // result: (SRW x y) 39953 for { 39954 _ = v.Args[1] 39955 x := v.Args[0] 39956 v_1 := v.Args[1] 39957 if v_1.Op != OpS390XMOVHreg { 39958 break 39959 } 39960 y := v_1.Args[0] 39961 v.reset(OpS390XSRW) 39962 v.AddArg(x) 39963 v.AddArg(y) 39964 return true 39965 } 39966 // match: (SRW x (MOVBreg y)) 39967 // cond: 39968 // result: (SRW x y) 39969 for { 39970 _ = v.Args[1] 39971 x := v.Args[0] 39972 v_1 := v.Args[1] 39973 if v_1.Op != OpS390XMOVBreg { 39974 break 39975 } 39976 y := v_1.Args[0] 39977 v.reset(OpS390XSRW) 39978 v.AddArg(x) 39979 v.AddArg(y) 39980 return true 39981 } 39982 // match: (SRW x (MOVWZreg y)) 39983 // cond: 39984 // result: (SRW x y) 39985 for { 39986 _ = v.Args[1] 39987 x := v.Args[0] 39988 v_1 := v.Args[1] 39989 if v_1.Op != OpS390XMOVWZreg { 39990 break 39991 } 39992 y := v_1.Args[0] 39993 v.reset(OpS390XSRW) 39994 v.AddArg(x) 39995 v.AddArg(y) 39996 return true 39997 } 39998 // match: (SRW x (MOVHZreg y)) 39999 // cond: 40000 // result: (SRW x y) 40001 for { 40002 _ = v.Args[1] 40003 x := v.Args[0] 40004 v_1 := v.Args[1] 40005 if v_1.Op != OpS390XMOVHZreg { 40006 break 40007 } 40008 y := v_1.Args[0] 40009 v.reset(OpS390XSRW) 40010 v.AddArg(x) 40011 v.AddArg(y) 40012 return true 40013 } 40014 return false 40015 } 40016 func rewriteValueS390X_OpS390XSRW_10(v *Value) bool { 40017 // match: (SRW x (MOVBZreg y)) 40018 // cond: 40019 // result: (SRW x y) 40020 for { 40021 _ = v.Args[1] 40022 x := v.Args[0] 40023 v_1 := v.Args[1] 40024 if v_1.Op != OpS390XMOVBZreg { 40025 break 40026 } 40027 y := v_1.Args[0] 40028 v.reset(OpS390XSRW) 40029 v.AddArg(x) 40030 v.AddArg(y) 40031 return true 40032 } 40033 return false 40034 } 40035 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 40036 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 40037 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 40038 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 40039 for { 40040 i := v.AuxInt 40041 s := v.Aux 40042 _ = v.Args[3] 40043 p := v.Args[0] 40044 w2 := v.Args[1] 40045 w3 := v.Args[2] 40046 x := v.Args[3] 40047 if x.Op != OpS390XSTM2 { 40048 break 40049 } 40050 if x.AuxInt != i-8 { 40051 break 40052 } 40053 if x.Aux != s { 40054 break 40055 } 40056 _ = x.Args[3] 40057 if p != x.Args[0] { 40058 break 40059 } 40060 w0 := x.Args[1] 40061 w1 := x.Args[2] 40062 mem := x.Args[3] 40063 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 40064 break 40065 } 40066 v.reset(OpS390XSTM4) 40067 v.AuxInt = i - 8 40068 v.Aux = s 40069 v.AddArg(p) 40070 v.AddArg(w0) 40071 v.AddArg(w1) 40072 v.AddArg(w2) 40073 v.AddArg(w3) 40074 v.AddArg(mem) 40075 return true 40076 } 40077 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 40078 // cond: 40079 // result: (MOVDstore [i] {s} p x mem) 40080 for { 40081 i := v.AuxInt 40082 s := v.Aux 40083 _ = v.Args[3] 40084 p := v.Args[0] 40085 v_1 := v.Args[1] 40086 if v_1.Op != OpS390XSRDconst { 40087 break 40088 } 40089 if v_1.AuxInt != 32 { 40090 break 40091 } 40092 x := v_1.Args[0] 40093 if x != v.Args[2] { 40094 break 40095 } 40096 mem := v.Args[3] 40097 v.reset(OpS390XMOVDstore) 40098 v.AuxInt = i 40099 v.Aux = s 40100 v.AddArg(p) 40101 v.AddArg(x) 40102 v.AddArg(mem) 40103 return true 40104 } 40105 return false 40106 } 40107 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 40108 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 40109 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 40110 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 40111 for { 40112 i := v.AuxInt 40113 s := v.Aux 40114 _ = v.Args[3] 40115 p := v.Args[0] 40116 w2 := v.Args[1] 40117 w3 := v.Args[2] 40118 x := v.Args[3] 40119 if x.Op != OpS390XSTMG2 { 40120 break 40121 } 40122 if x.AuxInt != i-16 { 40123 break 40124 } 40125 if x.Aux != s { 40126 break 40127 } 40128 _ = x.Args[3] 40129 if p != x.Args[0] { 40130 break 40131 } 40132 w0 := x.Args[1] 40133 w1 := x.Args[2] 40134 mem := x.Args[3] 40135 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 40136 break 40137 } 40138 v.reset(OpS390XSTMG4) 40139 v.AuxInt = i - 16 40140 v.Aux = s 40141 v.AddArg(p) 40142 v.AddArg(w0) 40143 v.AddArg(w1) 40144 v.AddArg(w2) 40145 v.AddArg(w3) 40146 v.AddArg(mem) 40147 return true 40148 } 40149 return false 40150 } 40151 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 40152 b := v.Block 40153 _ = b 40154 // match: (SUB x (MOVDconst [c])) 40155 // cond: is32Bit(c) 40156 // result: (SUBconst x [c]) 40157 for { 40158 _ = v.Args[1] 40159 x := v.Args[0] 40160 v_1 := v.Args[1] 40161 if v_1.Op != OpS390XMOVDconst { 40162 break 40163 } 40164 c := v_1.AuxInt 40165 if !(is32Bit(c)) { 40166 break 40167 } 40168 v.reset(OpS390XSUBconst) 40169 v.AuxInt = c 40170 v.AddArg(x) 40171 return true 40172 } 40173 // match: (SUB (MOVDconst [c]) x) 40174 // cond: is32Bit(c) 40175 // result: (NEG (SUBconst <v.Type> x [c])) 40176 for { 40177 _ = v.Args[1] 40178 v_0 := v.Args[0] 40179 if v_0.Op != OpS390XMOVDconst { 40180 break 40181 } 40182 c := v_0.AuxInt 40183 x := v.Args[1] 40184 if !(is32Bit(c)) { 40185 break 40186 } 40187 v.reset(OpS390XNEG) 40188 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 40189 v0.AuxInt = c 40190 v0.AddArg(x) 40191 v.AddArg(v0) 40192 return true 40193 } 40194 // match: (SUB x x) 40195 // cond: 40196 // result: (MOVDconst [0]) 40197 for { 40198 _ = v.Args[1] 40199 x := v.Args[0] 40200 if x != v.Args[1] { 40201 break 40202 } 40203 v.reset(OpS390XMOVDconst) 40204 v.AuxInt = 0 40205 return true 40206 } 40207 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 40208 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40209 // result: (SUBload <t> [off] {sym} x ptr mem) 40210 for { 40211 t := v.Type 40212 _ = v.Args[1] 40213 x := v.Args[0] 40214 g := v.Args[1] 40215 if g.Op != OpS390XMOVDload { 40216 break 40217 } 40218 off := g.AuxInt 40219 sym := g.Aux 40220 _ = g.Args[1] 40221 ptr := g.Args[0] 40222 mem := g.Args[1] 40223 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40224 break 40225 } 40226 v.reset(OpS390XSUBload) 40227 v.Type = t 40228 v.AuxInt = off 40229 v.Aux = sym 40230 v.AddArg(x) 40231 v.AddArg(ptr) 40232 v.AddArg(mem) 40233 return true 40234 } 40235 return false 40236 } 40237 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 40238 b := v.Block 40239 _ = b 40240 // match: (SUBW x (MOVDconst [c])) 40241 // cond: 40242 // result: (SUBWconst x [int64(int32(c))]) 40243 for { 40244 _ = v.Args[1] 40245 x := v.Args[0] 40246 v_1 := v.Args[1] 40247 if v_1.Op != OpS390XMOVDconst { 40248 break 40249 } 40250 c := v_1.AuxInt 40251 v.reset(OpS390XSUBWconst) 40252 v.AuxInt = int64(int32(c)) 40253 v.AddArg(x) 40254 return true 40255 } 40256 // match: (SUBW (MOVDconst [c]) x) 40257 // cond: 40258 // result: (NEGW (SUBWconst <v.Type> x [int64(int32(c))])) 40259 for { 40260 _ = v.Args[1] 40261 v_0 := v.Args[0] 40262 if v_0.Op != OpS390XMOVDconst { 40263 break 40264 } 40265 c := v_0.AuxInt 40266 x := v.Args[1] 40267 v.reset(OpS390XNEGW) 40268 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 40269 v0.AuxInt = int64(int32(c)) 40270 v0.AddArg(x) 40271 v.AddArg(v0) 40272 return true 40273 } 40274 // match: (SUBW x x) 40275 // cond: 40276 // result: (MOVDconst [0]) 40277 for { 40278 _ = v.Args[1] 40279 x := v.Args[0] 40280 if x != v.Args[1] { 40281 break 40282 } 40283 v.reset(OpS390XMOVDconst) 40284 v.AuxInt = 0 40285 return true 40286 } 40287 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 40288 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40289 // result: (SUBWload <t> [off] {sym} x ptr mem) 40290 for { 40291 t := v.Type 40292 _ = v.Args[1] 40293 x := v.Args[0] 40294 g := v.Args[1] 40295 if g.Op != OpS390XMOVWload { 40296 break 40297 } 40298 off := g.AuxInt 40299 sym := g.Aux 40300 _ = g.Args[1] 40301 ptr := g.Args[0] 40302 mem := g.Args[1] 40303 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40304 break 40305 } 40306 v.reset(OpS390XSUBWload) 40307 v.Type = t 40308 v.AuxInt = off 40309 v.Aux = sym 40310 v.AddArg(x) 40311 v.AddArg(ptr) 40312 v.AddArg(mem) 40313 return true 40314 } 40315 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 40316 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40317 // result: (SUBWload <t> [off] {sym} x ptr mem) 40318 for { 40319 t := v.Type 40320 _ = v.Args[1] 40321 x := v.Args[0] 40322 g := v.Args[1] 40323 if g.Op != OpS390XMOVWZload { 40324 break 40325 } 40326 off := g.AuxInt 40327 sym := g.Aux 40328 _ = g.Args[1] 40329 ptr := g.Args[0] 40330 mem := g.Args[1] 40331 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40332 break 40333 } 40334 v.reset(OpS390XSUBWload) 40335 v.Type = t 40336 v.AuxInt = off 40337 v.Aux = sym 40338 v.AddArg(x) 40339 v.AddArg(ptr) 40340 v.AddArg(mem) 40341 return true 40342 } 40343 return false 40344 } 40345 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 40346 // match: (SUBWconst [c] x) 40347 // cond: int32(c) == 0 40348 // result: x 40349 for { 40350 c := v.AuxInt 40351 x := v.Args[0] 40352 if !(int32(c) == 0) { 40353 break 40354 } 40355 v.reset(OpCopy) 40356 v.Type = x.Type 40357 v.AddArg(x) 40358 return true 40359 } 40360 // match: (SUBWconst [c] x) 40361 // cond: 40362 // result: (ADDWconst [int64(int32(-c))] x) 40363 for { 40364 c := v.AuxInt 40365 x := v.Args[0] 40366 v.reset(OpS390XADDWconst) 40367 v.AuxInt = int64(int32(-c)) 40368 v.AddArg(x) 40369 return true 40370 } 40371 } 40372 func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { 40373 // match: (SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) 40374 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 40375 // result: (SUBWload [off1+off2] {sym} x ptr mem) 40376 for { 40377 off1 := v.AuxInt 40378 sym := v.Aux 40379 _ = v.Args[2] 40380 x := v.Args[0] 40381 v_1 := v.Args[1] 40382 if v_1.Op != OpS390XADDconst { 40383 break 40384 } 40385 off2 := v_1.AuxInt 40386 ptr := v_1.Args[0] 40387 mem := v.Args[2] 40388 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 40389 break 40390 } 40391 v.reset(OpS390XSUBWload) 40392 v.AuxInt = off1 + off2 40393 v.Aux = sym 40394 v.AddArg(x) 40395 v.AddArg(ptr) 40396 v.AddArg(mem) 40397 return true 40398 } 40399 // match: (SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 40400 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 40401 // result: (SUBWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 40402 for { 40403 o1 := v.AuxInt 40404 s1 := v.Aux 40405 _ = v.Args[2] 40406 x := v.Args[0] 40407 v_1 := v.Args[1] 40408 if v_1.Op != OpS390XMOVDaddr { 40409 break 40410 } 40411 o2 := v_1.AuxInt 40412 s2 := v_1.Aux 40413 ptr := v_1.Args[0] 40414 mem := v.Args[2] 40415 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 40416 break 40417 } 40418 v.reset(OpS390XSUBWload) 40419 v.AuxInt = o1 + o2 40420 v.Aux = mergeSym(s1, s2) 40421 v.AddArg(x) 40422 v.AddArg(ptr) 40423 v.AddArg(mem) 40424 return true 40425 } 40426 return false 40427 } 40428 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 40429 // match: (SUBconst [0] x) 40430 // cond: 40431 // result: x 40432 for { 40433 if v.AuxInt != 0 { 40434 break 40435 } 40436 x := v.Args[0] 40437 v.reset(OpCopy) 40438 v.Type = x.Type 40439 v.AddArg(x) 40440 return true 40441 } 40442 // match: (SUBconst [c] x) 40443 // cond: c != -(1<<31) 40444 // result: (ADDconst [-c] x) 40445 for { 40446 c := v.AuxInt 40447 x := v.Args[0] 40448 if !(c != -(1 << 31)) { 40449 break 40450 } 40451 v.reset(OpS390XADDconst) 40452 v.AuxInt = -c 40453 v.AddArg(x) 40454 return true 40455 } 40456 // match: (SUBconst (MOVDconst [d]) [c]) 40457 // cond: 40458 // result: (MOVDconst [d-c]) 40459 for { 40460 c := v.AuxInt 40461 v_0 := v.Args[0] 40462 if v_0.Op != OpS390XMOVDconst { 40463 break 40464 } 40465 d := v_0.AuxInt 40466 v.reset(OpS390XMOVDconst) 40467 v.AuxInt = d - c 40468 return true 40469 } 40470 // match: (SUBconst (SUBconst x [d]) [c]) 40471 // cond: is32Bit(-c-d) 40472 // result: (ADDconst [-c-d] x) 40473 for { 40474 c := v.AuxInt 40475 v_0 := v.Args[0] 40476 if v_0.Op != OpS390XSUBconst { 40477 break 40478 } 40479 d := v_0.AuxInt 40480 x := v_0.Args[0] 40481 if !(is32Bit(-c - d)) { 40482 break 40483 } 40484 v.reset(OpS390XADDconst) 40485 v.AuxInt = -c - d 40486 v.AddArg(x) 40487 return true 40488 } 40489 return false 40490 } 40491 func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { 40492 b := v.Block 40493 _ = b 40494 // match: (SUBload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 40495 // cond: isSamePtr(ptr1, ptr2) 40496 // result: (SUB x (LGDR <t> y)) 40497 for { 40498 t := v.Type 40499 off := v.AuxInt 40500 sym := v.Aux 40501 _ = v.Args[2] 40502 x := v.Args[0] 40503 ptr1 := v.Args[1] 40504 v_2 := v.Args[2] 40505 if v_2.Op != OpS390XFMOVDstore { 40506 break 40507 } 40508 if v_2.AuxInt != off { 40509 break 40510 } 40511 if v_2.Aux != sym { 40512 break 40513 } 40514 _ = v_2.Args[2] 40515 ptr2 := v_2.Args[0] 40516 y := v_2.Args[1] 40517 if !(isSamePtr(ptr1, ptr2)) { 40518 break 40519 } 40520 v.reset(OpS390XSUB) 40521 v.AddArg(x) 40522 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 40523 v0.AddArg(y) 40524 v.AddArg(v0) 40525 return true 40526 } 40527 // match: (SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) 40528 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 40529 // result: (SUBload [off1+off2] {sym} x ptr mem) 40530 for { 40531 off1 := v.AuxInt 40532 sym := v.Aux 40533 _ = v.Args[2] 40534 x := v.Args[0] 40535 v_1 := v.Args[1] 40536 if v_1.Op != OpS390XADDconst { 40537 break 40538 } 40539 off2 := v_1.AuxInt 40540 ptr := v_1.Args[0] 40541 mem := v.Args[2] 40542 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 40543 break 40544 } 40545 v.reset(OpS390XSUBload) 40546 v.AuxInt = off1 + off2 40547 v.Aux = sym 40548 v.AddArg(x) 40549 v.AddArg(ptr) 40550 v.AddArg(mem) 40551 return true 40552 } 40553 // match: (SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 40554 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 40555 // result: (SUBload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 40556 for { 40557 o1 := v.AuxInt 40558 s1 := v.Aux 40559 _ = v.Args[2] 40560 x := v.Args[0] 40561 v_1 := v.Args[1] 40562 if v_1.Op != OpS390XMOVDaddr { 40563 break 40564 } 40565 o2 := v_1.AuxInt 40566 s2 := v_1.Aux 40567 ptr := v_1.Args[0] 40568 mem := v.Args[2] 40569 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 40570 break 40571 } 40572 v.reset(OpS390XSUBload) 40573 v.AuxInt = o1 + o2 40574 v.Aux = mergeSym(s1, s2) 40575 v.AddArg(x) 40576 v.AddArg(ptr) 40577 v.AddArg(mem) 40578 return true 40579 } 40580 return false 40581 } 40582 func rewriteValueS390X_OpS390XSumBytes2_0(v *Value) bool { 40583 b := v.Block 40584 _ = b 40585 typ := &b.Func.Config.Types 40586 _ = typ 40587 // match: (SumBytes2 x) 40588 // cond: 40589 // result: (ADDW (SRWconst <typ.UInt8> x [8]) x) 40590 for { 40591 x := v.Args[0] 40592 v.reset(OpS390XADDW) 40593 v0 := b.NewValue0(v.Pos, OpS390XSRWconst, typ.UInt8) 40594 v0.AuxInt = 8 40595 v0.AddArg(x) 40596 v.AddArg(v0) 40597 v.AddArg(x) 40598 return true 40599 } 40600 } 40601 func rewriteValueS390X_OpS390XSumBytes4_0(v *Value) bool { 40602 b := v.Block 40603 _ = b 40604 typ := &b.Func.Config.Types 40605 _ = typ 40606 // match: (SumBytes4 x) 40607 // cond: 40608 // result: (SumBytes2 (ADDW <typ.UInt16> (SRWconst <typ.UInt16> x [16]) x)) 40609 for { 40610 x := v.Args[0] 40611 v.reset(OpS390XSumBytes2) 40612 v0 := b.NewValue0(v.Pos, OpS390XADDW, typ.UInt16) 40613 v1 := b.NewValue0(v.Pos, OpS390XSRWconst, typ.UInt16) 40614 v1.AuxInt = 16 40615 v1.AddArg(x) 40616 v0.AddArg(v1) 40617 v0.AddArg(x) 40618 v.AddArg(v0) 40619 return true 40620 } 40621 } 40622 func rewriteValueS390X_OpS390XSumBytes8_0(v *Value) bool { 40623 b := v.Block 40624 _ = b 40625 typ := &b.Func.Config.Types 40626 _ = typ 40627 // match: (SumBytes8 x) 40628 // cond: 40629 // result: (SumBytes4 (ADDW <typ.UInt32> (SRDconst <typ.UInt32> x [32]) x)) 40630 for { 40631 x := v.Args[0] 40632 v.reset(OpS390XSumBytes4) 40633 v0 := b.NewValue0(v.Pos, OpS390XADDW, typ.UInt32) 40634 v1 := b.NewValue0(v.Pos, OpS390XSRDconst, typ.UInt32) 40635 v1.AuxInt = 32 40636 v1.AddArg(x) 40637 v0.AddArg(v1) 40638 v0.AddArg(x) 40639 v.AddArg(v0) 40640 return true 40641 } 40642 } 40643 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 40644 // match: (XOR x (MOVDconst [c])) 40645 // cond: isU32Bit(c) 40646 // result: (XORconst [c] x) 40647 for { 40648 _ = v.Args[1] 40649 x := v.Args[0] 40650 v_1 := v.Args[1] 40651 if v_1.Op != OpS390XMOVDconst { 40652 break 40653 } 40654 c := v_1.AuxInt 40655 if !(isU32Bit(c)) { 40656 break 40657 } 40658 v.reset(OpS390XXORconst) 40659 v.AuxInt = c 40660 v.AddArg(x) 40661 return true 40662 } 40663 // match: (XOR (MOVDconst [c]) x) 40664 // cond: isU32Bit(c) 40665 // result: (XORconst [c] x) 40666 for { 40667 _ = v.Args[1] 40668 v_0 := v.Args[0] 40669 if v_0.Op != OpS390XMOVDconst { 40670 break 40671 } 40672 c := v_0.AuxInt 40673 x := v.Args[1] 40674 if !(isU32Bit(c)) { 40675 break 40676 } 40677 v.reset(OpS390XXORconst) 40678 v.AuxInt = c 40679 v.AddArg(x) 40680 return true 40681 } 40682 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 40683 // cond: d == 64-c 40684 // result: (RLLGconst [c] x) 40685 for { 40686 _ = v.Args[1] 40687 v_0 := v.Args[0] 40688 if v_0.Op != OpS390XSLDconst { 40689 break 40690 } 40691 c := v_0.AuxInt 40692 x := v_0.Args[0] 40693 v_1 := v.Args[1] 40694 if v_1.Op != OpS390XSRDconst { 40695 break 40696 } 40697 d := v_1.AuxInt 40698 if x != v_1.Args[0] { 40699 break 40700 } 40701 if !(d == 64-c) { 40702 break 40703 } 40704 v.reset(OpS390XRLLGconst) 40705 v.AuxInt = c 40706 v.AddArg(x) 40707 return true 40708 } 40709 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 40710 // cond: d == 64-c 40711 // result: (RLLGconst [c] x) 40712 for { 40713 _ = v.Args[1] 40714 v_0 := v.Args[0] 40715 if v_0.Op != OpS390XSRDconst { 40716 break 40717 } 40718 d := v_0.AuxInt 40719 x := v_0.Args[0] 40720 v_1 := v.Args[1] 40721 if v_1.Op != OpS390XSLDconst { 40722 break 40723 } 40724 c := v_1.AuxInt 40725 if x != v_1.Args[0] { 40726 break 40727 } 40728 if !(d == 64-c) { 40729 break 40730 } 40731 v.reset(OpS390XRLLGconst) 40732 v.AuxInt = c 40733 v.AddArg(x) 40734 return true 40735 } 40736 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 40737 // cond: 40738 // result: (MOVDconst [c^d]) 40739 for { 40740 _ = v.Args[1] 40741 v_0 := v.Args[0] 40742 if v_0.Op != OpS390XMOVDconst { 40743 break 40744 } 40745 c := v_0.AuxInt 40746 v_1 := v.Args[1] 40747 if v_1.Op != OpS390XMOVDconst { 40748 break 40749 } 40750 d := v_1.AuxInt 40751 v.reset(OpS390XMOVDconst) 40752 v.AuxInt = c ^ d 40753 return true 40754 } 40755 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 40756 // cond: 40757 // result: (MOVDconst [c^d]) 40758 for { 40759 _ = v.Args[1] 40760 v_0 := v.Args[0] 40761 if v_0.Op != OpS390XMOVDconst { 40762 break 40763 } 40764 d := v_0.AuxInt 40765 v_1 := v.Args[1] 40766 if v_1.Op != OpS390XMOVDconst { 40767 break 40768 } 40769 c := v_1.AuxInt 40770 v.reset(OpS390XMOVDconst) 40771 v.AuxInt = c ^ d 40772 return true 40773 } 40774 // match: (XOR x x) 40775 // cond: 40776 // result: (MOVDconst [0]) 40777 for { 40778 _ = v.Args[1] 40779 x := v.Args[0] 40780 if x != v.Args[1] { 40781 break 40782 } 40783 v.reset(OpS390XMOVDconst) 40784 v.AuxInt = 0 40785 return true 40786 } 40787 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 40788 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40789 // result: (XORload <t> [off] {sym} x ptr mem) 40790 for { 40791 t := v.Type 40792 _ = v.Args[1] 40793 x := v.Args[0] 40794 g := v.Args[1] 40795 if g.Op != OpS390XMOVDload { 40796 break 40797 } 40798 off := g.AuxInt 40799 sym := g.Aux 40800 _ = g.Args[1] 40801 ptr := g.Args[0] 40802 mem := g.Args[1] 40803 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40804 break 40805 } 40806 v.reset(OpS390XXORload) 40807 v.Type = t 40808 v.AuxInt = off 40809 v.Aux = sym 40810 v.AddArg(x) 40811 v.AddArg(ptr) 40812 v.AddArg(mem) 40813 return true 40814 } 40815 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 40816 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40817 // result: (XORload <t> [off] {sym} x ptr mem) 40818 for { 40819 t := v.Type 40820 _ = v.Args[1] 40821 g := v.Args[0] 40822 if g.Op != OpS390XMOVDload { 40823 break 40824 } 40825 off := g.AuxInt 40826 sym := g.Aux 40827 _ = g.Args[1] 40828 ptr := g.Args[0] 40829 mem := g.Args[1] 40830 x := v.Args[1] 40831 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40832 break 40833 } 40834 v.reset(OpS390XXORload) 40835 v.Type = t 40836 v.AuxInt = off 40837 v.Aux = sym 40838 v.AddArg(x) 40839 v.AddArg(ptr) 40840 v.AddArg(mem) 40841 return true 40842 } 40843 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 40844 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40845 // result: (XORload <t> [off] {sym} x ptr mem) 40846 for { 40847 t := v.Type 40848 _ = v.Args[1] 40849 g := v.Args[0] 40850 if g.Op != OpS390XMOVDload { 40851 break 40852 } 40853 off := g.AuxInt 40854 sym := g.Aux 40855 _ = g.Args[1] 40856 ptr := g.Args[0] 40857 mem := g.Args[1] 40858 x := v.Args[1] 40859 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40860 break 40861 } 40862 v.reset(OpS390XXORload) 40863 v.Type = t 40864 v.AuxInt = off 40865 v.Aux = sym 40866 v.AddArg(x) 40867 v.AddArg(ptr) 40868 v.AddArg(mem) 40869 return true 40870 } 40871 return false 40872 } 40873 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 40874 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 40875 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 40876 // result: (XORload <t> [off] {sym} x ptr mem) 40877 for { 40878 t := v.Type 40879 _ = v.Args[1] 40880 x := v.Args[0] 40881 g := v.Args[1] 40882 if g.Op != OpS390XMOVDload { 40883 break 40884 } 40885 off := g.AuxInt 40886 sym := g.Aux 40887 _ = g.Args[1] 40888 ptr := g.Args[0] 40889 mem := g.Args[1] 40890 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 40891 break 40892 } 40893 v.reset(OpS390XXORload) 40894 v.Type = t 40895 v.AuxInt = off 40896 v.Aux = sym 40897 v.AddArg(x) 40898 v.AddArg(ptr) 40899 v.AddArg(mem) 40900 return true 40901 } 40902 return false 40903 } 40904 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 40905 // match: (XORW x (MOVDconst [c])) 40906 // cond: 40907 // result: (XORWconst [int64(int32(c))] x) 40908 for { 40909 _ = v.Args[1] 40910 x := v.Args[0] 40911 v_1 := v.Args[1] 40912 if v_1.Op != OpS390XMOVDconst { 40913 break 40914 } 40915 c := v_1.AuxInt 40916 v.reset(OpS390XXORWconst) 40917 v.AuxInt = int64(int32(c)) 40918 v.AddArg(x) 40919 return true 40920 } 40921 // match: (XORW (MOVDconst [c]) x) 40922 // cond: 40923 // result: (XORWconst [int64(int32(c))] x) 40924 for { 40925 _ = v.Args[1] 40926 v_0 := v.Args[0] 40927 if v_0.Op != OpS390XMOVDconst { 40928 break 40929 } 40930 c := v_0.AuxInt 40931 x := v.Args[1] 40932 v.reset(OpS390XXORWconst) 40933 v.AuxInt = int64(int32(c)) 40934 v.AddArg(x) 40935 return true 40936 } 40937 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 40938 // cond: d == 32-c 40939 // result: (RLLconst [c] x) 40940 for { 40941 _ = v.Args[1] 40942 v_0 := v.Args[0] 40943 if v_0.Op != OpS390XSLWconst { 40944 break 40945 } 40946 c := v_0.AuxInt 40947 x := v_0.Args[0] 40948 v_1 := v.Args[1] 40949 if v_1.Op != OpS390XSRWconst { 40950 break 40951 } 40952 d := v_1.AuxInt 40953 if x != v_1.Args[0] { 40954 break 40955 } 40956 if !(d == 32-c) { 40957 break 40958 } 40959 v.reset(OpS390XRLLconst) 40960 v.AuxInt = c 40961 v.AddArg(x) 40962 return true 40963 } 40964 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 40965 // cond: d == 32-c 40966 // result: (RLLconst [c] x) 40967 for { 40968 _ = v.Args[1] 40969 v_0 := v.Args[0] 40970 if v_0.Op != OpS390XSRWconst { 40971 break 40972 } 40973 d := v_0.AuxInt 40974 x := v_0.Args[0] 40975 v_1 := v.Args[1] 40976 if v_1.Op != OpS390XSLWconst { 40977 break 40978 } 40979 c := v_1.AuxInt 40980 if x != v_1.Args[0] { 40981 break 40982 } 40983 if !(d == 32-c) { 40984 break 40985 } 40986 v.reset(OpS390XRLLconst) 40987 v.AuxInt = c 40988 v.AddArg(x) 40989 return true 40990 } 40991 // match: (XORW x x) 40992 // cond: 40993 // result: (MOVDconst [0]) 40994 for { 40995 _ = v.Args[1] 40996 x := v.Args[0] 40997 if x != v.Args[1] { 40998 break 40999 } 41000 v.reset(OpS390XMOVDconst) 41001 v.AuxInt = 0 41002 return true 41003 } 41004 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 41005 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41006 // result: (XORWload <t> [off] {sym} x ptr mem) 41007 for { 41008 t := v.Type 41009 _ = v.Args[1] 41010 x := v.Args[0] 41011 g := v.Args[1] 41012 if g.Op != OpS390XMOVWload { 41013 break 41014 } 41015 off := g.AuxInt 41016 sym := g.Aux 41017 _ = g.Args[1] 41018 ptr := g.Args[0] 41019 mem := g.Args[1] 41020 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41021 break 41022 } 41023 v.reset(OpS390XXORWload) 41024 v.Type = t 41025 v.AuxInt = off 41026 v.Aux = sym 41027 v.AddArg(x) 41028 v.AddArg(ptr) 41029 v.AddArg(mem) 41030 return true 41031 } 41032 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 41033 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41034 // result: (XORWload <t> [off] {sym} x ptr mem) 41035 for { 41036 t := v.Type 41037 _ = v.Args[1] 41038 g := v.Args[0] 41039 if g.Op != OpS390XMOVWload { 41040 break 41041 } 41042 off := g.AuxInt 41043 sym := g.Aux 41044 _ = g.Args[1] 41045 ptr := g.Args[0] 41046 mem := g.Args[1] 41047 x := v.Args[1] 41048 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41049 break 41050 } 41051 v.reset(OpS390XXORWload) 41052 v.Type = t 41053 v.AuxInt = off 41054 v.Aux = sym 41055 v.AddArg(x) 41056 v.AddArg(ptr) 41057 v.AddArg(mem) 41058 return true 41059 } 41060 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 41061 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41062 // result: (XORWload <t> [off] {sym} x ptr mem) 41063 for { 41064 t := v.Type 41065 _ = v.Args[1] 41066 g := v.Args[0] 41067 if g.Op != OpS390XMOVWload { 41068 break 41069 } 41070 off := g.AuxInt 41071 sym := g.Aux 41072 _ = g.Args[1] 41073 ptr := g.Args[0] 41074 mem := g.Args[1] 41075 x := v.Args[1] 41076 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41077 break 41078 } 41079 v.reset(OpS390XXORWload) 41080 v.Type = t 41081 v.AuxInt = off 41082 v.Aux = sym 41083 v.AddArg(x) 41084 v.AddArg(ptr) 41085 v.AddArg(mem) 41086 return true 41087 } 41088 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 41089 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41090 // result: (XORWload <t> [off] {sym} x ptr mem) 41091 for { 41092 t := v.Type 41093 _ = v.Args[1] 41094 x := v.Args[0] 41095 g := v.Args[1] 41096 if g.Op != OpS390XMOVWload { 41097 break 41098 } 41099 off := g.AuxInt 41100 sym := g.Aux 41101 _ = g.Args[1] 41102 ptr := g.Args[0] 41103 mem := g.Args[1] 41104 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41105 break 41106 } 41107 v.reset(OpS390XXORWload) 41108 v.Type = t 41109 v.AuxInt = off 41110 v.Aux = sym 41111 v.AddArg(x) 41112 v.AddArg(ptr) 41113 v.AddArg(mem) 41114 return true 41115 } 41116 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 41117 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41118 // result: (XORWload <t> [off] {sym} x ptr mem) 41119 for { 41120 t := v.Type 41121 _ = v.Args[1] 41122 x := v.Args[0] 41123 g := v.Args[1] 41124 if g.Op != OpS390XMOVWZload { 41125 break 41126 } 41127 off := g.AuxInt 41128 sym := g.Aux 41129 _ = g.Args[1] 41130 ptr := g.Args[0] 41131 mem := g.Args[1] 41132 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41133 break 41134 } 41135 v.reset(OpS390XXORWload) 41136 v.Type = t 41137 v.AuxInt = off 41138 v.Aux = sym 41139 v.AddArg(x) 41140 v.AddArg(ptr) 41141 v.AddArg(mem) 41142 return true 41143 } 41144 return false 41145 } 41146 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 41147 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 41148 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41149 // result: (XORWload <t> [off] {sym} x ptr mem) 41150 for { 41151 t := v.Type 41152 _ = v.Args[1] 41153 g := v.Args[0] 41154 if g.Op != OpS390XMOVWZload { 41155 break 41156 } 41157 off := g.AuxInt 41158 sym := g.Aux 41159 _ = g.Args[1] 41160 ptr := g.Args[0] 41161 mem := g.Args[1] 41162 x := v.Args[1] 41163 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41164 break 41165 } 41166 v.reset(OpS390XXORWload) 41167 v.Type = t 41168 v.AuxInt = off 41169 v.Aux = sym 41170 v.AddArg(x) 41171 v.AddArg(ptr) 41172 v.AddArg(mem) 41173 return true 41174 } 41175 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 41176 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41177 // result: (XORWload <t> [off] {sym} x ptr mem) 41178 for { 41179 t := v.Type 41180 _ = v.Args[1] 41181 g := v.Args[0] 41182 if g.Op != OpS390XMOVWZload { 41183 break 41184 } 41185 off := g.AuxInt 41186 sym := g.Aux 41187 _ = g.Args[1] 41188 ptr := g.Args[0] 41189 mem := g.Args[1] 41190 x := v.Args[1] 41191 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41192 break 41193 } 41194 v.reset(OpS390XXORWload) 41195 v.Type = t 41196 v.AuxInt = off 41197 v.Aux = sym 41198 v.AddArg(x) 41199 v.AddArg(ptr) 41200 v.AddArg(mem) 41201 return true 41202 } 41203 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 41204 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 41205 // result: (XORWload <t> [off] {sym} x ptr mem) 41206 for { 41207 t := v.Type 41208 _ = v.Args[1] 41209 x := v.Args[0] 41210 g := v.Args[1] 41211 if g.Op != OpS390XMOVWZload { 41212 break 41213 } 41214 off := g.AuxInt 41215 sym := g.Aux 41216 _ = g.Args[1] 41217 ptr := g.Args[0] 41218 mem := g.Args[1] 41219 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 41220 break 41221 } 41222 v.reset(OpS390XXORWload) 41223 v.Type = t 41224 v.AuxInt = off 41225 v.Aux = sym 41226 v.AddArg(x) 41227 v.AddArg(ptr) 41228 v.AddArg(mem) 41229 return true 41230 } 41231 return false 41232 } 41233 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 41234 // match: (XORWconst [c] x) 41235 // cond: int32(c)==0 41236 // result: x 41237 for { 41238 c := v.AuxInt 41239 x := v.Args[0] 41240 if !(int32(c) == 0) { 41241 break 41242 } 41243 v.reset(OpCopy) 41244 v.Type = x.Type 41245 v.AddArg(x) 41246 return true 41247 } 41248 // match: (XORWconst [c] (MOVDconst [d])) 41249 // cond: 41250 // result: (MOVDconst [c^d]) 41251 for { 41252 c := v.AuxInt 41253 v_0 := v.Args[0] 41254 if v_0.Op != OpS390XMOVDconst { 41255 break 41256 } 41257 d := v_0.AuxInt 41258 v.reset(OpS390XMOVDconst) 41259 v.AuxInt = c ^ d 41260 return true 41261 } 41262 return false 41263 } 41264 func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { 41265 // match: (XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 41266 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 41267 // result: (XORWload [off1+off2] {sym} x ptr mem) 41268 for { 41269 off1 := v.AuxInt 41270 sym := v.Aux 41271 _ = v.Args[2] 41272 x := v.Args[0] 41273 v_1 := v.Args[1] 41274 if v_1.Op != OpS390XADDconst { 41275 break 41276 } 41277 off2 := v_1.AuxInt 41278 ptr := v_1.Args[0] 41279 mem := v.Args[2] 41280 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 41281 break 41282 } 41283 v.reset(OpS390XXORWload) 41284 v.AuxInt = off1 + off2 41285 v.Aux = sym 41286 v.AddArg(x) 41287 v.AddArg(ptr) 41288 v.AddArg(mem) 41289 return true 41290 } 41291 // match: (XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 41292 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 41293 // result: (XORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 41294 for { 41295 o1 := v.AuxInt 41296 s1 := v.Aux 41297 _ = v.Args[2] 41298 x := v.Args[0] 41299 v_1 := v.Args[1] 41300 if v_1.Op != OpS390XMOVDaddr { 41301 break 41302 } 41303 o2 := v_1.AuxInt 41304 s2 := v_1.Aux 41305 ptr := v_1.Args[0] 41306 mem := v.Args[2] 41307 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 41308 break 41309 } 41310 v.reset(OpS390XXORWload) 41311 v.AuxInt = o1 + o2 41312 v.Aux = mergeSym(s1, s2) 41313 v.AddArg(x) 41314 v.AddArg(ptr) 41315 v.AddArg(mem) 41316 return true 41317 } 41318 return false 41319 } 41320 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 41321 // match: (XORconst [0] x) 41322 // cond: 41323 // result: x 41324 for { 41325 if v.AuxInt != 0 { 41326 break 41327 } 41328 x := v.Args[0] 41329 v.reset(OpCopy) 41330 v.Type = x.Type 41331 v.AddArg(x) 41332 return true 41333 } 41334 // match: (XORconst [c] (MOVDconst [d])) 41335 // cond: 41336 // result: (MOVDconst [c^d]) 41337 for { 41338 c := v.AuxInt 41339 v_0 := v.Args[0] 41340 if v_0.Op != OpS390XMOVDconst { 41341 break 41342 } 41343 d := v_0.AuxInt 41344 v.reset(OpS390XMOVDconst) 41345 v.AuxInt = c ^ d 41346 return true 41347 } 41348 return false 41349 } 41350 func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { 41351 b := v.Block 41352 _ = b 41353 // match: (XORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 41354 // cond: isSamePtr(ptr1, ptr2) 41355 // result: (XOR x (LGDR <t> y)) 41356 for { 41357 t := v.Type 41358 off := v.AuxInt 41359 sym := v.Aux 41360 _ = v.Args[2] 41361 x := v.Args[0] 41362 ptr1 := v.Args[1] 41363 v_2 := v.Args[2] 41364 if v_2.Op != OpS390XFMOVDstore { 41365 break 41366 } 41367 if v_2.AuxInt != off { 41368 break 41369 } 41370 if v_2.Aux != sym { 41371 break 41372 } 41373 _ = v_2.Args[2] 41374 ptr2 := v_2.Args[0] 41375 y := v_2.Args[1] 41376 if !(isSamePtr(ptr1, ptr2)) { 41377 break 41378 } 41379 v.reset(OpS390XXOR) 41380 v.AddArg(x) 41381 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 41382 v0.AddArg(y) 41383 v.AddArg(v0) 41384 return true 41385 } 41386 // match: (XORload [off1] {sym} x (ADDconst [off2] ptr) mem) 41387 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 41388 // result: (XORload [off1+off2] {sym} x ptr mem) 41389 for { 41390 off1 := v.AuxInt 41391 sym := v.Aux 41392 _ = v.Args[2] 41393 x := v.Args[0] 41394 v_1 := v.Args[1] 41395 if v_1.Op != OpS390XADDconst { 41396 break 41397 } 41398 off2 := v_1.AuxInt 41399 ptr := v_1.Args[0] 41400 mem := v.Args[2] 41401 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 41402 break 41403 } 41404 v.reset(OpS390XXORload) 41405 v.AuxInt = off1 + off2 41406 v.Aux = sym 41407 v.AddArg(x) 41408 v.AddArg(ptr) 41409 v.AddArg(mem) 41410 return true 41411 } 41412 // match: (XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 41413 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 41414 // result: (XORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 41415 for { 41416 o1 := v.AuxInt 41417 s1 := v.Aux 41418 _ = v.Args[2] 41419 x := v.Args[0] 41420 v_1 := v.Args[1] 41421 if v_1.Op != OpS390XMOVDaddr { 41422 break 41423 } 41424 o2 := v_1.AuxInt 41425 s2 := v_1.Aux 41426 ptr := v_1.Args[0] 41427 mem := v.Args[2] 41428 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 41429 break 41430 } 41431 v.reset(OpS390XXORload) 41432 v.AuxInt = o1 + o2 41433 v.Aux = mergeSym(s1, s2) 41434 v.AddArg(x) 41435 v.AddArg(ptr) 41436 v.AddArg(mem) 41437 return true 41438 } 41439 return false 41440 } 41441 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 41442 b := v.Block 41443 _ = b 41444 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 41445 // cond: 41446 // result: (ADDW val (Select0 <t> tuple)) 41447 for { 41448 t := v.Type 41449 v_0 := v.Args[0] 41450 if v_0.Op != OpS390XAddTupleFirst32 { 41451 break 41452 } 41453 _ = v_0.Args[1] 41454 val := v_0.Args[0] 41455 tuple := v_0.Args[1] 41456 v.reset(OpS390XADDW) 41457 v.AddArg(val) 41458 v0 := b.NewValue0(v.Pos, OpSelect0, t) 41459 v0.AddArg(tuple) 41460 v.AddArg(v0) 41461 return true 41462 } 41463 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 41464 // cond: 41465 // result: (ADD val (Select0 <t> tuple)) 41466 for { 41467 t := v.Type 41468 v_0 := v.Args[0] 41469 if v_0.Op != OpS390XAddTupleFirst64 { 41470 break 41471 } 41472 _ = v_0.Args[1] 41473 val := v_0.Args[0] 41474 tuple := v_0.Args[1] 41475 v.reset(OpS390XADD) 41476 v.AddArg(val) 41477 v0 := b.NewValue0(v.Pos, OpSelect0, t) 41478 v0.AddArg(tuple) 41479 v.AddArg(v0) 41480 return true 41481 } 41482 return false 41483 } 41484 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 41485 // match: (Select1 (AddTupleFirst32 _ tuple)) 41486 // cond: 41487 // result: (Select1 tuple) 41488 for { 41489 v_0 := v.Args[0] 41490 if v_0.Op != OpS390XAddTupleFirst32 { 41491 break 41492 } 41493 _ = v_0.Args[1] 41494 tuple := v_0.Args[1] 41495 v.reset(OpSelect1) 41496 v.AddArg(tuple) 41497 return true 41498 } 41499 // match: (Select1 (AddTupleFirst64 _ tuple)) 41500 // cond: 41501 // result: (Select1 tuple) 41502 for { 41503 v_0 := v.Args[0] 41504 if v_0.Op != OpS390XAddTupleFirst64 { 41505 break 41506 } 41507 _ = v_0.Args[1] 41508 tuple := v_0.Args[1] 41509 v.reset(OpSelect1) 41510 v.AddArg(tuple) 41511 return true 41512 } 41513 return false 41514 } 41515 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 41516 // match: (SignExt16to32 x) 41517 // cond: 41518 // result: (MOVHreg x) 41519 for { 41520 x := v.Args[0] 41521 v.reset(OpS390XMOVHreg) 41522 v.AddArg(x) 41523 return true 41524 } 41525 } 41526 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 41527 // match: (SignExt16to64 x) 41528 // cond: 41529 // result: (MOVHreg x) 41530 for { 41531 x := v.Args[0] 41532 v.reset(OpS390XMOVHreg) 41533 v.AddArg(x) 41534 return true 41535 } 41536 } 41537 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 41538 // match: (SignExt32to64 x) 41539 // cond: 41540 // result: (MOVWreg x) 41541 for { 41542 x := v.Args[0] 41543 v.reset(OpS390XMOVWreg) 41544 v.AddArg(x) 41545 return true 41546 } 41547 } 41548 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 41549 // match: (SignExt8to16 x) 41550 // cond: 41551 // result: (MOVBreg x) 41552 for { 41553 x := v.Args[0] 41554 v.reset(OpS390XMOVBreg) 41555 v.AddArg(x) 41556 return true 41557 } 41558 } 41559 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 41560 // match: (SignExt8to32 x) 41561 // cond: 41562 // result: (MOVBreg x) 41563 for { 41564 x := v.Args[0] 41565 v.reset(OpS390XMOVBreg) 41566 v.AddArg(x) 41567 return true 41568 } 41569 } 41570 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 41571 // match: (SignExt8to64 x) 41572 // cond: 41573 // result: (MOVBreg x) 41574 for { 41575 x := v.Args[0] 41576 v.reset(OpS390XMOVBreg) 41577 v.AddArg(x) 41578 return true 41579 } 41580 } 41581 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 41582 b := v.Block 41583 _ = b 41584 // match: (Slicemask <t> x) 41585 // cond: 41586 // result: (SRADconst (NEG <t> x) [63]) 41587 for { 41588 t := v.Type 41589 x := v.Args[0] 41590 v.reset(OpS390XSRADconst) 41591 v.AuxInt = 63 41592 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 41593 v0.AddArg(x) 41594 v.AddArg(v0) 41595 return true 41596 } 41597 } 41598 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 41599 // match: (Sqrt x) 41600 // cond: 41601 // result: (FSQRT x) 41602 for { 41603 x := v.Args[0] 41604 v.reset(OpS390XFSQRT) 41605 v.AddArg(x) 41606 return true 41607 } 41608 } 41609 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 41610 // match: (StaticCall [argwid] {target} mem) 41611 // cond: 41612 // result: (CALLstatic [argwid] {target} mem) 41613 for { 41614 argwid := v.AuxInt 41615 target := v.Aux 41616 mem := v.Args[0] 41617 v.reset(OpS390XCALLstatic) 41618 v.AuxInt = argwid 41619 v.Aux = target 41620 v.AddArg(mem) 41621 return true 41622 } 41623 } 41624 func rewriteValueS390X_OpStore_0(v *Value) bool { 41625 // match: (Store {t} ptr val mem) 41626 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 41627 // result: (FMOVDstore ptr val mem) 41628 for { 41629 t := v.Aux 41630 _ = v.Args[2] 41631 ptr := v.Args[0] 41632 val := v.Args[1] 41633 mem := v.Args[2] 41634 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 41635 break 41636 } 41637 v.reset(OpS390XFMOVDstore) 41638 v.AddArg(ptr) 41639 v.AddArg(val) 41640 v.AddArg(mem) 41641 return true 41642 } 41643 // match: (Store {t} ptr val mem) 41644 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 41645 // result: (FMOVSstore ptr val mem) 41646 for { 41647 t := v.Aux 41648 _ = v.Args[2] 41649 ptr := v.Args[0] 41650 val := v.Args[1] 41651 mem := v.Args[2] 41652 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 41653 break 41654 } 41655 v.reset(OpS390XFMOVSstore) 41656 v.AddArg(ptr) 41657 v.AddArg(val) 41658 v.AddArg(mem) 41659 return true 41660 } 41661 // match: (Store {t} ptr val mem) 41662 // cond: t.(*types.Type).Size() == 8 41663 // result: (MOVDstore ptr val mem) 41664 for { 41665 t := v.Aux 41666 _ = v.Args[2] 41667 ptr := v.Args[0] 41668 val := v.Args[1] 41669 mem := v.Args[2] 41670 if !(t.(*types.Type).Size() == 8) { 41671 break 41672 } 41673 v.reset(OpS390XMOVDstore) 41674 v.AddArg(ptr) 41675 v.AddArg(val) 41676 v.AddArg(mem) 41677 return true 41678 } 41679 // match: (Store {t} ptr val mem) 41680 // cond: t.(*types.Type).Size() == 4 41681 // result: (MOVWstore ptr val mem) 41682 for { 41683 t := v.Aux 41684 _ = v.Args[2] 41685 ptr := v.Args[0] 41686 val := v.Args[1] 41687 mem := v.Args[2] 41688 if !(t.(*types.Type).Size() == 4) { 41689 break 41690 } 41691 v.reset(OpS390XMOVWstore) 41692 v.AddArg(ptr) 41693 v.AddArg(val) 41694 v.AddArg(mem) 41695 return true 41696 } 41697 // match: (Store {t} ptr val mem) 41698 // cond: t.(*types.Type).Size() == 2 41699 // result: (MOVHstore ptr val mem) 41700 for { 41701 t := v.Aux 41702 _ = v.Args[2] 41703 ptr := v.Args[0] 41704 val := v.Args[1] 41705 mem := v.Args[2] 41706 if !(t.(*types.Type).Size() == 2) { 41707 break 41708 } 41709 v.reset(OpS390XMOVHstore) 41710 v.AddArg(ptr) 41711 v.AddArg(val) 41712 v.AddArg(mem) 41713 return true 41714 } 41715 // match: (Store {t} ptr val mem) 41716 // cond: t.(*types.Type).Size() == 1 41717 // result: (MOVBstore ptr val mem) 41718 for { 41719 t := v.Aux 41720 _ = v.Args[2] 41721 ptr := v.Args[0] 41722 val := v.Args[1] 41723 mem := v.Args[2] 41724 if !(t.(*types.Type).Size() == 1) { 41725 break 41726 } 41727 v.reset(OpS390XMOVBstore) 41728 v.AddArg(ptr) 41729 v.AddArg(val) 41730 v.AddArg(mem) 41731 return true 41732 } 41733 return false 41734 } 41735 func rewriteValueS390X_OpSub16_0(v *Value) bool { 41736 // match: (Sub16 x y) 41737 // cond: 41738 // result: (SUBW x y) 41739 for { 41740 _ = v.Args[1] 41741 x := v.Args[0] 41742 y := v.Args[1] 41743 v.reset(OpS390XSUBW) 41744 v.AddArg(x) 41745 v.AddArg(y) 41746 return true 41747 } 41748 } 41749 func rewriteValueS390X_OpSub32_0(v *Value) bool { 41750 // match: (Sub32 x y) 41751 // cond: 41752 // result: (SUBW x y) 41753 for { 41754 _ = v.Args[1] 41755 x := v.Args[0] 41756 y := v.Args[1] 41757 v.reset(OpS390XSUBW) 41758 v.AddArg(x) 41759 v.AddArg(y) 41760 return true 41761 } 41762 } 41763 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 41764 // match: (Sub32F x y) 41765 // cond: 41766 // result: (FSUBS x y) 41767 for { 41768 _ = v.Args[1] 41769 x := v.Args[0] 41770 y := v.Args[1] 41771 v.reset(OpS390XFSUBS) 41772 v.AddArg(x) 41773 v.AddArg(y) 41774 return true 41775 } 41776 } 41777 func rewriteValueS390X_OpSub64_0(v *Value) bool { 41778 // match: (Sub64 x y) 41779 // cond: 41780 // result: (SUB x y) 41781 for { 41782 _ = v.Args[1] 41783 x := v.Args[0] 41784 y := v.Args[1] 41785 v.reset(OpS390XSUB) 41786 v.AddArg(x) 41787 v.AddArg(y) 41788 return true 41789 } 41790 } 41791 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 41792 // match: (Sub64F x y) 41793 // cond: 41794 // result: (FSUB x y) 41795 for { 41796 _ = v.Args[1] 41797 x := v.Args[0] 41798 y := v.Args[1] 41799 v.reset(OpS390XFSUB) 41800 v.AddArg(x) 41801 v.AddArg(y) 41802 return true 41803 } 41804 } 41805 func rewriteValueS390X_OpSub8_0(v *Value) bool { 41806 // match: (Sub8 x y) 41807 // cond: 41808 // result: (SUBW x y) 41809 for { 41810 _ = v.Args[1] 41811 x := v.Args[0] 41812 y := v.Args[1] 41813 v.reset(OpS390XSUBW) 41814 v.AddArg(x) 41815 v.AddArg(y) 41816 return true 41817 } 41818 } 41819 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 41820 // match: (SubPtr x y) 41821 // cond: 41822 // result: (SUB x y) 41823 for { 41824 _ = v.Args[1] 41825 x := v.Args[0] 41826 y := v.Args[1] 41827 v.reset(OpS390XSUB) 41828 v.AddArg(x) 41829 v.AddArg(y) 41830 return true 41831 } 41832 } 41833 func rewriteValueS390X_OpTrunc_0(v *Value) bool { 41834 // match: (Trunc x) 41835 // cond: 41836 // result: (FIDBR [5] x) 41837 for { 41838 x := v.Args[0] 41839 v.reset(OpS390XFIDBR) 41840 v.AuxInt = 5 41841 v.AddArg(x) 41842 return true 41843 } 41844 } 41845 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 41846 // match: (Trunc16to8 x) 41847 // cond: 41848 // result: x 41849 for { 41850 x := v.Args[0] 41851 v.reset(OpCopy) 41852 v.Type = x.Type 41853 v.AddArg(x) 41854 return true 41855 } 41856 } 41857 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 41858 // match: (Trunc32to16 x) 41859 // cond: 41860 // result: x 41861 for { 41862 x := v.Args[0] 41863 v.reset(OpCopy) 41864 v.Type = x.Type 41865 v.AddArg(x) 41866 return true 41867 } 41868 } 41869 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 41870 // match: (Trunc32to8 x) 41871 // cond: 41872 // result: x 41873 for { 41874 x := v.Args[0] 41875 v.reset(OpCopy) 41876 v.Type = x.Type 41877 v.AddArg(x) 41878 return true 41879 } 41880 } 41881 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 41882 // match: (Trunc64to16 x) 41883 // cond: 41884 // result: x 41885 for { 41886 x := v.Args[0] 41887 v.reset(OpCopy) 41888 v.Type = x.Type 41889 v.AddArg(x) 41890 return true 41891 } 41892 } 41893 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 41894 // match: (Trunc64to32 x) 41895 // cond: 41896 // result: x 41897 for { 41898 x := v.Args[0] 41899 v.reset(OpCopy) 41900 v.Type = x.Type 41901 v.AddArg(x) 41902 return true 41903 } 41904 } 41905 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 41906 // match: (Trunc64to8 x) 41907 // cond: 41908 // result: x 41909 for { 41910 x := v.Args[0] 41911 v.reset(OpCopy) 41912 v.Type = x.Type 41913 v.AddArg(x) 41914 return true 41915 } 41916 } 41917 func rewriteValueS390X_OpWB_0(v *Value) bool { 41918 // match: (WB {fn} destptr srcptr mem) 41919 // cond: 41920 // result: (LoweredWB {fn} destptr srcptr mem) 41921 for { 41922 fn := v.Aux 41923 _ = v.Args[2] 41924 destptr := v.Args[0] 41925 srcptr := v.Args[1] 41926 mem := v.Args[2] 41927 v.reset(OpS390XLoweredWB) 41928 v.Aux = fn 41929 v.AddArg(destptr) 41930 v.AddArg(srcptr) 41931 v.AddArg(mem) 41932 return true 41933 } 41934 } 41935 func rewriteValueS390X_OpXor16_0(v *Value) bool { 41936 // match: (Xor16 x y) 41937 // cond: 41938 // result: (XORW x y) 41939 for { 41940 _ = v.Args[1] 41941 x := v.Args[0] 41942 y := v.Args[1] 41943 v.reset(OpS390XXORW) 41944 v.AddArg(x) 41945 v.AddArg(y) 41946 return true 41947 } 41948 } 41949 func rewriteValueS390X_OpXor32_0(v *Value) bool { 41950 // match: (Xor32 x y) 41951 // cond: 41952 // result: (XORW x y) 41953 for { 41954 _ = v.Args[1] 41955 x := v.Args[0] 41956 y := v.Args[1] 41957 v.reset(OpS390XXORW) 41958 v.AddArg(x) 41959 v.AddArg(y) 41960 return true 41961 } 41962 } 41963 func rewriteValueS390X_OpXor64_0(v *Value) bool { 41964 // match: (Xor64 x y) 41965 // cond: 41966 // result: (XOR x y) 41967 for { 41968 _ = v.Args[1] 41969 x := v.Args[0] 41970 y := v.Args[1] 41971 v.reset(OpS390XXOR) 41972 v.AddArg(x) 41973 v.AddArg(y) 41974 return true 41975 } 41976 } 41977 func rewriteValueS390X_OpXor8_0(v *Value) bool { 41978 // match: (Xor8 x y) 41979 // cond: 41980 // result: (XORW x y) 41981 for { 41982 _ = v.Args[1] 41983 x := v.Args[0] 41984 y := v.Args[1] 41985 v.reset(OpS390XXORW) 41986 v.AddArg(x) 41987 v.AddArg(y) 41988 return true 41989 } 41990 } 41991 func rewriteValueS390X_OpZero_0(v *Value) bool { 41992 b := v.Block 41993 _ = b 41994 // match: (Zero [0] _ mem) 41995 // cond: 41996 // result: mem 41997 for { 41998 if v.AuxInt != 0 { 41999 break 42000 } 42001 _ = v.Args[1] 42002 mem := v.Args[1] 42003 v.reset(OpCopy) 42004 v.Type = mem.Type 42005 v.AddArg(mem) 42006 return true 42007 } 42008 // match: (Zero [1] destptr mem) 42009 // cond: 42010 // result: (MOVBstoreconst [0] destptr mem) 42011 for { 42012 if v.AuxInt != 1 { 42013 break 42014 } 42015 _ = v.Args[1] 42016 destptr := v.Args[0] 42017 mem := v.Args[1] 42018 v.reset(OpS390XMOVBstoreconst) 42019 v.AuxInt = 0 42020 v.AddArg(destptr) 42021 v.AddArg(mem) 42022 return true 42023 } 42024 // match: (Zero [2] destptr mem) 42025 // cond: 42026 // result: (MOVHstoreconst [0] destptr mem) 42027 for { 42028 if v.AuxInt != 2 { 42029 break 42030 } 42031 _ = v.Args[1] 42032 destptr := v.Args[0] 42033 mem := v.Args[1] 42034 v.reset(OpS390XMOVHstoreconst) 42035 v.AuxInt = 0 42036 v.AddArg(destptr) 42037 v.AddArg(mem) 42038 return true 42039 } 42040 // match: (Zero [4] destptr mem) 42041 // cond: 42042 // result: (MOVWstoreconst [0] destptr mem) 42043 for { 42044 if v.AuxInt != 4 { 42045 break 42046 } 42047 _ = v.Args[1] 42048 destptr := v.Args[0] 42049 mem := v.Args[1] 42050 v.reset(OpS390XMOVWstoreconst) 42051 v.AuxInt = 0 42052 v.AddArg(destptr) 42053 v.AddArg(mem) 42054 return true 42055 } 42056 // match: (Zero [8] destptr mem) 42057 // cond: 42058 // result: (MOVDstoreconst [0] destptr mem) 42059 for { 42060 if v.AuxInt != 8 { 42061 break 42062 } 42063 _ = v.Args[1] 42064 destptr := v.Args[0] 42065 mem := v.Args[1] 42066 v.reset(OpS390XMOVDstoreconst) 42067 v.AuxInt = 0 42068 v.AddArg(destptr) 42069 v.AddArg(mem) 42070 return true 42071 } 42072 // match: (Zero [3] destptr mem) 42073 // cond: 42074 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 42075 for { 42076 if v.AuxInt != 3 { 42077 break 42078 } 42079 _ = v.Args[1] 42080 destptr := v.Args[0] 42081 mem := v.Args[1] 42082 v.reset(OpS390XMOVBstoreconst) 42083 v.AuxInt = makeValAndOff(0, 2) 42084 v.AddArg(destptr) 42085 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 42086 v0.AuxInt = 0 42087 v0.AddArg(destptr) 42088 v0.AddArg(mem) 42089 v.AddArg(v0) 42090 return true 42091 } 42092 // match: (Zero [5] destptr mem) 42093 // cond: 42094 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 42095 for { 42096 if v.AuxInt != 5 { 42097 break 42098 } 42099 _ = v.Args[1] 42100 destptr := v.Args[0] 42101 mem := v.Args[1] 42102 v.reset(OpS390XMOVBstoreconst) 42103 v.AuxInt = makeValAndOff(0, 4) 42104 v.AddArg(destptr) 42105 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42106 v0.AuxInt = 0 42107 v0.AddArg(destptr) 42108 v0.AddArg(mem) 42109 v.AddArg(v0) 42110 return true 42111 } 42112 // match: (Zero [6] destptr mem) 42113 // cond: 42114 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 42115 for { 42116 if v.AuxInt != 6 { 42117 break 42118 } 42119 _ = v.Args[1] 42120 destptr := v.Args[0] 42121 mem := v.Args[1] 42122 v.reset(OpS390XMOVHstoreconst) 42123 v.AuxInt = makeValAndOff(0, 4) 42124 v.AddArg(destptr) 42125 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42126 v0.AuxInt = 0 42127 v0.AddArg(destptr) 42128 v0.AddArg(mem) 42129 v.AddArg(v0) 42130 return true 42131 } 42132 // match: (Zero [7] destptr mem) 42133 // cond: 42134 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 42135 for { 42136 if v.AuxInt != 7 { 42137 break 42138 } 42139 _ = v.Args[1] 42140 destptr := v.Args[0] 42141 mem := v.Args[1] 42142 v.reset(OpS390XMOVWstoreconst) 42143 v.AuxInt = makeValAndOff(0, 3) 42144 v.AddArg(destptr) 42145 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42146 v0.AuxInt = 0 42147 v0.AddArg(destptr) 42148 v0.AddArg(mem) 42149 v.AddArg(v0) 42150 return true 42151 } 42152 // match: (Zero [s] destptr mem) 42153 // cond: s > 0 && s <= 1024 42154 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 42155 for { 42156 s := v.AuxInt 42157 _ = v.Args[1] 42158 destptr := v.Args[0] 42159 mem := v.Args[1] 42160 if !(s > 0 && s <= 1024) { 42161 break 42162 } 42163 v.reset(OpS390XCLEAR) 42164 v.AuxInt = makeValAndOff(s, 0) 42165 v.AddArg(destptr) 42166 v.AddArg(mem) 42167 return true 42168 } 42169 return false 42170 } 42171 func rewriteValueS390X_OpZero_10(v *Value) bool { 42172 b := v.Block 42173 _ = b 42174 // match: (Zero [s] destptr mem) 42175 // cond: s > 1024 42176 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 42177 for { 42178 s := v.AuxInt 42179 _ = v.Args[1] 42180 destptr := v.Args[0] 42181 mem := v.Args[1] 42182 if !(s > 1024) { 42183 break 42184 } 42185 v.reset(OpS390XLoweredZero) 42186 v.AuxInt = s % 256 42187 v.AddArg(destptr) 42188 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 42189 v0.AuxInt = (s / 256) * 256 42190 v0.AddArg(destptr) 42191 v.AddArg(v0) 42192 v.AddArg(mem) 42193 return true 42194 } 42195 return false 42196 } 42197 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 42198 // match: (ZeroExt16to32 x) 42199 // cond: 42200 // result: (MOVHZreg x) 42201 for { 42202 x := v.Args[0] 42203 v.reset(OpS390XMOVHZreg) 42204 v.AddArg(x) 42205 return true 42206 } 42207 } 42208 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 42209 // match: (ZeroExt16to64 x) 42210 // cond: 42211 // result: (MOVHZreg x) 42212 for { 42213 x := v.Args[0] 42214 v.reset(OpS390XMOVHZreg) 42215 v.AddArg(x) 42216 return true 42217 } 42218 } 42219 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 42220 // match: (ZeroExt32to64 x) 42221 // cond: 42222 // result: (MOVWZreg x) 42223 for { 42224 x := v.Args[0] 42225 v.reset(OpS390XMOVWZreg) 42226 v.AddArg(x) 42227 return true 42228 } 42229 } 42230 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 42231 // match: (ZeroExt8to16 x) 42232 // cond: 42233 // result: (MOVBZreg x) 42234 for { 42235 x := v.Args[0] 42236 v.reset(OpS390XMOVBZreg) 42237 v.AddArg(x) 42238 return true 42239 } 42240 } 42241 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 42242 // match: (ZeroExt8to32 x) 42243 // cond: 42244 // result: (MOVBZreg x) 42245 for { 42246 x := v.Args[0] 42247 v.reset(OpS390XMOVBZreg) 42248 v.AddArg(x) 42249 return true 42250 } 42251 } 42252 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 42253 // match: (ZeroExt8to64 x) 42254 // cond: 42255 // result: (MOVBZreg x) 42256 for { 42257 x := v.Args[0] 42258 v.reset(OpS390XMOVBZreg) 42259 v.AddArg(x) 42260 return true 42261 } 42262 } 42263 func rewriteBlockS390X(b *Block) bool { 42264 config := b.Func.Config 42265 _ = config 42266 fe := b.Func.fe 42267 _ = fe 42268 typ := &config.Types 42269 _ = typ 42270 switch b.Kind { 42271 case BlockS390XEQ: 42272 // match: (EQ (InvertFlags cmp) yes no) 42273 // cond: 42274 // result: (EQ cmp yes no) 42275 for { 42276 v := b.Control 42277 if v.Op != OpS390XInvertFlags { 42278 break 42279 } 42280 cmp := v.Args[0] 42281 b.Kind = BlockS390XEQ 42282 b.SetControl(cmp) 42283 b.Aux = nil 42284 return true 42285 } 42286 // match: (EQ (FlagEQ) yes no) 42287 // cond: 42288 // result: (First nil yes no) 42289 for { 42290 v := b.Control 42291 if v.Op != OpS390XFlagEQ { 42292 break 42293 } 42294 b.Kind = BlockFirst 42295 b.SetControl(nil) 42296 b.Aux = nil 42297 return true 42298 } 42299 // match: (EQ (FlagLT) yes no) 42300 // cond: 42301 // result: (First nil no yes) 42302 for { 42303 v := b.Control 42304 if v.Op != OpS390XFlagLT { 42305 break 42306 } 42307 b.Kind = BlockFirst 42308 b.SetControl(nil) 42309 b.Aux = nil 42310 b.swapSuccessors() 42311 return true 42312 } 42313 // match: (EQ (FlagGT) yes no) 42314 // cond: 42315 // result: (First nil no yes) 42316 for { 42317 v := b.Control 42318 if v.Op != OpS390XFlagGT { 42319 break 42320 } 42321 b.Kind = BlockFirst 42322 b.SetControl(nil) 42323 b.Aux = nil 42324 b.swapSuccessors() 42325 return true 42326 } 42327 case BlockS390XGE: 42328 // match: (GE (InvertFlags cmp) yes no) 42329 // cond: 42330 // result: (LE cmp yes no) 42331 for { 42332 v := b.Control 42333 if v.Op != OpS390XInvertFlags { 42334 break 42335 } 42336 cmp := v.Args[0] 42337 b.Kind = BlockS390XLE 42338 b.SetControl(cmp) 42339 b.Aux = nil 42340 return true 42341 } 42342 // match: (GE (FlagEQ) yes no) 42343 // cond: 42344 // result: (First nil yes no) 42345 for { 42346 v := b.Control 42347 if v.Op != OpS390XFlagEQ { 42348 break 42349 } 42350 b.Kind = BlockFirst 42351 b.SetControl(nil) 42352 b.Aux = nil 42353 return true 42354 } 42355 // match: (GE (FlagLT) yes no) 42356 // cond: 42357 // result: (First nil no yes) 42358 for { 42359 v := b.Control 42360 if v.Op != OpS390XFlagLT { 42361 break 42362 } 42363 b.Kind = BlockFirst 42364 b.SetControl(nil) 42365 b.Aux = nil 42366 b.swapSuccessors() 42367 return true 42368 } 42369 // match: (GE (FlagGT) yes no) 42370 // cond: 42371 // result: (First nil yes no) 42372 for { 42373 v := b.Control 42374 if v.Op != OpS390XFlagGT { 42375 break 42376 } 42377 b.Kind = BlockFirst 42378 b.SetControl(nil) 42379 b.Aux = nil 42380 return true 42381 } 42382 case BlockS390XGT: 42383 // match: (GT (InvertFlags cmp) yes no) 42384 // cond: 42385 // result: (LT cmp yes no) 42386 for { 42387 v := b.Control 42388 if v.Op != OpS390XInvertFlags { 42389 break 42390 } 42391 cmp := v.Args[0] 42392 b.Kind = BlockS390XLT 42393 b.SetControl(cmp) 42394 b.Aux = nil 42395 return true 42396 } 42397 // match: (GT (FlagEQ) yes no) 42398 // cond: 42399 // result: (First nil no yes) 42400 for { 42401 v := b.Control 42402 if v.Op != OpS390XFlagEQ { 42403 break 42404 } 42405 b.Kind = BlockFirst 42406 b.SetControl(nil) 42407 b.Aux = nil 42408 b.swapSuccessors() 42409 return true 42410 } 42411 // match: (GT (FlagLT) yes no) 42412 // cond: 42413 // result: (First nil no yes) 42414 for { 42415 v := b.Control 42416 if v.Op != OpS390XFlagLT { 42417 break 42418 } 42419 b.Kind = BlockFirst 42420 b.SetControl(nil) 42421 b.Aux = nil 42422 b.swapSuccessors() 42423 return true 42424 } 42425 // match: (GT (FlagGT) yes no) 42426 // cond: 42427 // result: (First nil yes no) 42428 for { 42429 v := b.Control 42430 if v.Op != OpS390XFlagGT { 42431 break 42432 } 42433 b.Kind = BlockFirst 42434 b.SetControl(nil) 42435 b.Aux = nil 42436 return true 42437 } 42438 case BlockIf: 42439 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42440 // cond: 42441 // result: (LT cmp yes no) 42442 for { 42443 v := b.Control 42444 if v.Op != OpS390XMOVDLT { 42445 break 42446 } 42447 _ = v.Args[2] 42448 v_0 := v.Args[0] 42449 if v_0.Op != OpS390XMOVDconst { 42450 break 42451 } 42452 if v_0.AuxInt != 0 { 42453 break 42454 } 42455 v_1 := v.Args[1] 42456 if v_1.Op != OpS390XMOVDconst { 42457 break 42458 } 42459 if v_1.AuxInt != 1 { 42460 break 42461 } 42462 cmp := v.Args[2] 42463 b.Kind = BlockS390XLT 42464 b.SetControl(cmp) 42465 b.Aux = nil 42466 return true 42467 } 42468 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42469 // cond: 42470 // result: (LE cmp yes no) 42471 for { 42472 v := b.Control 42473 if v.Op != OpS390XMOVDLE { 42474 break 42475 } 42476 _ = v.Args[2] 42477 v_0 := v.Args[0] 42478 if v_0.Op != OpS390XMOVDconst { 42479 break 42480 } 42481 if v_0.AuxInt != 0 { 42482 break 42483 } 42484 v_1 := v.Args[1] 42485 if v_1.Op != OpS390XMOVDconst { 42486 break 42487 } 42488 if v_1.AuxInt != 1 { 42489 break 42490 } 42491 cmp := v.Args[2] 42492 b.Kind = BlockS390XLE 42493 b.SetControl(cmp) 42494 b.Aux = nil 42495 return true 42496 } 42497 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42498 // cond: 42499 // result: (GT cmp yes no) 42500 for { 42501 v := b.Control 42502 if v.Op != OpS390XMOVDGT { 42503 break 42504 } 42505 _ = v.Args[2] 42506 v_0 := v.Args[0] 42507 if v_0.Op != OpS390XMOVDconst { 42508 break 42509 } 42510 if v_0.AuxInt != 0 { 42511 break 42512 } 42513 v_1 := v.Args[1] 42514 if v_1.Op != OpS390XMOVDconst { 42515 break 42516 } 42517 if v_1.AuxInt != 1 { 42518 break 42519 } 42520 cmp := v.Args[2] 42521 b.Kind = BlockS390XGT 42522 b.SetControl(cmp) 42523 b.Aux = nil 42524 return true 42525 } 42526 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42527 // cond: 42528 // result: (GE cmp yes no) 42529 for { 42530 v := b.Control 42531 if v.Op != OpS390XMOVDGE { 42532 break 42533 } 42534 _ = v.Args[2] 42535 v_0 := v.Args[0] 42536 if v_0.Op != OpS390XMOVDconst { 42537 break 42538 } 42539 if v_0.AuxInt != 0 { 42540 break 42541 } 42542 v_1 := v.Args[1] 42543 if v_1.Op != OpS390XMOVDconst { 42544 break 42545 } 42546 if v_1.AuxInt != 1 { 42547 break 42548 } 42549 cmp := v.Args[2] 42550 b.Kind = BlockS390XGE 42551 b.SetControl(cmp) 42552 b.Aux = nil 42553 return true 42554 } 42555 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42556 // cond: 42557 // result: (EQ cmp yes no) 42558 for { 42559 v := b.Control 42560 if v.Op != OpS390XMOVDEQ { 42561 break 42562 } 42563 _ = v.Args[2] 42564 v_0 := v.Args[0] 42565 if v_0.Op != OpS390XMOVDconst { 42566 break 42567 } 42568 if v_0.AuxInt != 0 { 42569 break 42570 } 42571 v_1 := v.Args[1] 42572 if v_1.Op != OpS390XMOVDconst { 42573 break 42574 } 42575 if v_1.AuxInt != 1 { 42576 break 42577 } 42578 cmp := v.Args[2] 42579 b.Kind = BlockS390XEQ 42580 b.SetControl(cmp) 42581 b.Aux = nil 42582 return true 42583 } 42584 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42585 // cond: 42586 // result: (NE cmp yes no) 42587 for { 42588 v := b.Control 42589 if v.Op != OpS390XMOVDNE { 42590 break 42591 } 42592 _ = v.Args[2] 42593 v_0 := v.Args[0] 42594 if v_0.Op != OpS390XMOVDconst { 42595 break 42596 } 42597 if v_0.AuxInt != 0 { 42598 break 42599 } 42600 v_1 := v.Args[1] 42601 if v_1.Op != OpS390XMOVDconst { 42602 break 42603 } 42604 if v_1.AuxInt != 1 { 42605 break 42606 } 42607 cmp := v.Args[2] 42608 b.Kind = BlockS390XNE 42609 b.SetControl(cmp) 42610 b.Aux = nil 42611 return true 42612 } 42613 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42614 // cond: 42615 // result: (GTF cmp yes no) 42616 for { 42617 v := b.Control 42618 if v.Op != OpS390XMOVDGTnoinv { 42619 break 42620 } 42621 _ = v.Args[2] 42622 v_0 := v.Args[0] 42623 if v_0.Op != OpS390XMOVDconst { 42624 break 42625 } 42626 if v_0.AuxInt != 0 { 42627 break 42628 } 42629 v_1 := v.Args[1] 42630 if v_1.Op != OpS390XMOVDconst { 42631 break 42632 } 42633 if v_1.AuxInt != 1 { 42634 break 42635 } 42636 cmp := v.Args[2] 42637 b.Kind = BlockS390XGTF 42638 b.SetControl(cmp) 42639 b.Aux = nil 42640 return true 42641 } 42642 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42643 // cond: 42644 // result: (GEF cmp yes no) 42645 for { 42646 v := b.Control 42647 if v.Op != OpS390XMOVDGEnoinv { 42648 break 42649 } 42650 _ = v.Args[2] 42651 v_0 := v.Args[0] 42652 if v_0.Op != OpS390XMOVDconst { 42653 break 42654 } 42655 if v_0.AuxInt != 0 { 42656 break 42657 } 42658 v_1 := v.Args[1] 42659 if v_1.Op != OpS390XMOVDconst { 42660 break 42661 } 42662 if v_1.AuxInt != 1 { 42663 break 42664 } 42665 cmp := v.Args[2] 42666 b.Kind = BlockS390XGEF 42667 b.SetControl(cmp) 42668 b.Aux = nil 42669 return true 42670 } 42671 // match: (If cond yes no) 42672 // cond: 42673 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 42674 for { 42675 v := b.Control 42676 _ = v 42677 cond := b.Control 42678 b.Kind = BlockS390XNE 42679 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 42680 v0.AuxInt = 0 42681 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 42682 v1.AddArg(cond) 42683 v0.AddArg(v1) 42684 b.SetControl(v0) 42685 b.Aux = nil 42686 return true 42687 } 42688 case BlockS390XLE: 42689 // match: (LE (InvertFlags cmp) yes no) 42690 // cond: 42691 // result: (GE cmp yes no) 42692 for { 42693 v := b.Control 42694 if v.Op != OpS390XInvertFlags { 42695 break 42696 } 42697 cmp := v.Args[0] 42698 b.Kind = BlockS390XGE 42699 b.SetControl(cmp) 42700 b.Aux = nil 42701 return true 42702 } 42703 // match: (LE (FlagEQ) yes no) 42704 // cond: 42705 // result: (First nil yes no) 42706 for { 42707 v := b.Control 42708 if v.Op != OpS390XFlagEQ { 42709 break 42710 } 42711 b.Kind = BlockFirst 42712 b.SetControl(nil) 42713 b.Aux = nil 42714 return true 42715 } 42716 // match: (LE (FlagLT) yes no) 42717 // cond: 42718 // result: (First nil yes no) 42719 for { 42720 v := b.Control 42721 if v.Op != OpS390XFlagLT { 42722 break 42723 } 42724 b.Kind = BlockFirst 42725 b.SetControl(nil) 42726 b.Aux = nil 42727 return true 42728 } 42729 // match: (LE (FlagGT) yes no) 42730 // cond: 42731 // result: (First nil no yes) 42732 for { 42733 v := b.Control 42734 if v.Op != OpS390XFlagGT { 42735 break 42736 } 42737 b.Kind = BlockFirst 42738 b.SetControl(nil) 42739 b.Aux = nil 42740 b.swapSuccessors() 42741 return true 42742 } 42743 case BlockS390XLT: 42744 // match: (LT (InvertFlags cmp) yes no) 42745 // cond: 42746 // result: (GT cmp yes no) 42747 for { 42748 v := b.Control 42749 if v.Op != OpS390XInvertFlags { 42750 break 42751 } 42752 cmp := v.Args[0] 42753 b.Kind = BlockS390XGT 42754 b.SetControl(cmp) 42755 b.Aux = nil 42756 return true 42757 } 42758 // match: (LT (FlagEQ) yes no) 42759 // cond: 42760 // result: (First nil no yes) 42761 for { 42762 v := b.Control 42763 if v.Op != OpS390XFlagEQ { 42764 break 42765 } 42766 b.Kind = BlockFirst 42767 b.SetControl(nil) 42768 b.Aux = nil 42769 b.swapSuccessors() 42770 return true 42771 } 42772 // match: (LT (FlagLT) yes no) 42773 // cond: 42774 // result: (First nil yes no) 42775 for { 42776 v := b.Control 42777 if v.Op != OpS390XFlagLT { 42778 break 42779 } 42780 b.Kind = BlockFirst 42781 b.SetControl(nil) 42782 b.Aux = nil 42783 return true 42784 } 42785 // match: (LT (FlagGT) yes no) 42786 // cond: 42787 // result: (First nil no yes) 42788 for { 42789 v := b.Control 42790 if v.Op != OpS390XFlagGT { 42791 break 42792 } 42793 b.Kind = BlockFirst 42794 b.SetControl(nil) 42795 b.Aux = nil 42796 b.swapSuccessors() 42797 return true 42798 } 42799 case BlockS390XNE: 42800 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42801 // cond: 42802 // result: (LT cmp yes no) 42803 for { 42804 v := b.Control 42805 if v.Op != OpS390XCMPWconst { 42806 break 42807 } 42808 if v.AuxInt != 0 { 42809 break 42810 } 42811 v_0 := v.Args[0] 42812 if v_0.Op != OpS390XMOVDLT { 42813 break 42814 } 42815 _ = v_0.Args[2] 42816 v_0_0 := v_0.Args[0] 42817 if v_0_0.Op != OpS390XMOVDconst { 42818 break 42819 } 42820 if v_0_0.AuxInt != 0 { 42821 break 42822 } 42823 v_0_1 := v_0.Args[1] 42824 if v_0_1.Op != OpS390XMOVDconst { 42825 break 42826 } 42827 if v_0_1.AuxInt != 1 { 42828 break 42829 } 42830 cmp := v_0.Args[2] 42831 b.Kind = BlockS390XLT 42832 b.SetControl(cmp) 42833 b.Aux = nil 42834 return true 42835 } 42836 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42837 // cond: 42838 // result: (LE cmp yes no) 42839 for { 42840 v := b.Control 42841 if v.Op != OpS390XCMPWconst { 42842 break 42843 } 42844 if v.AuxInt != 0 { 42845 break 42846 } 42847 v_0 := v.Args[0] 42848 if v_0.Op != OpS390XMOVDLE { 42849 break 42850 } 42851 _ = v_0.Args[2] 42852 v_0_0 := v_0.Args[0] 42853 if v_0_0.Op != OpS390XMOVDconst { 42854 break 42855 } 42856 if v_0_0.AuxInt != 0 { 42857 break 42858 } 42859 v_0_1 := v_0.Args[1] 42860 if v_0_1.Op != OpS390XMOVDconst { 42861 break 42862 } 42863 if v_0_1.AuxInt != 1 { 42864 break 42865 } 42866 cmp := v_0.Args[2] 42867 b.Kind = BlockS390XLE 42868 b.SetControl(cmp) 42869 b.Aux = nil 42870 return true 42871 } 42872 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42873 // cond: 42874 // result: (GT cmp yes no) 42875 for { 42876 v := b.Control 42877 if v.Op != OpS390XCMPWconst { 42878 break 42879 } 42880 if v.AuxInt != 0 { 42881 break 42882 } 42883 v_0 := v.Args[0] 42884 if v_0.Op != OpS390XMOVDGT { 42885 break 42886 } 42887 _ = v_0.Args[2] 42888 v_0_0 := v_0.Args[0] 42889 if v_0_0.Op != OpS390XMOVDconst { 42890 break 42891 } 42892 if v_0_0.AuxInt != 0 { 42893 break 42894 } 42895 v_0_1 := v_0.Args[1] 42896 if v_0_1.Op != OpS390XMOVDconst { 42897 break 42898 } 42899 if v_0_1.AuxInt != 1 { 42900 break 42901 } 42902 cmp := v_0.Args[2] 42903 b.Kind = BlockS390XGT 42904 b.SetControl(cmp) 42905 b.Aux = nil 42906 return true 42907 } 42908 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42909 // cond: 42910 // result: (GE cmp yes no) 42911 for { 42912 v := b.Control 42913 if v.Op != OpS390XCMPWconst { 42914 break 42915 } 42916 if v.AuxInt != 0 { 42917 break 42918 } 42919 v_0 := v.Args[0] 42920 if v_0.Op != OpS390XMOVDGE { 42921 break 42922 } 42923 _ = v_0.Args[2] 42924 v_0_0 := v_0.Args[0] 42925 if v_0_0.Op != OpS390XMOVDconst { 42926 break 42927 } 42928 if v_0_0.AuxInt != 0 { 42929 break 42930 } 42931 v_0_1 := v_0.Args[1] 42932 if v_0_1.Op != OpS390XMOVDconst { 42933 break 42934 } 42935 if v_0_1.AuxInt != 1 { 42936 break 42937 } 42938 cmp := v_0.Args[2] 42939 b.Kind = BlockS390XGE 42940 b.SetControl(cmp) 42941 b.Aux = nil 42942 return true 42943 } 42944 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42945 // cond: 42946 // result: (EQ cmp yes no) 42947 for { 42948 v := b.Control 42949 if v.Op != OpS390XCMPWconst { 42950 break 42951 } 42952 if v.AuxInt != 0 { 42953 break 42954 } 42955 v_0 := v.Args[0] 42956 if v_0.Op != OpS390XMOVDEQ { 42957 break 42958 } 42959 _ = v_0.Args[2] 42960 v_0_0 := v_0.Args[0] 42961 if v_0_0.Op != OpS390XMOVDconst { 42962 break 42963 } 42964 if v_0_0.AuxInt != 0 { 42965 break 42966 } 42967 v_0_1 := v_0.Args[1] 42968 if v_0_1.Op != OpS390XMOVDconst { 42969 break 42970 } 42971 if v_0_1.AuxInt != 1 { 42972 break 42973 } 42974 cmp := v_0.Args[2] 42975 b.Kind = BlockS390XEQ 42976 b.SetControl(cmp) 42977 b.Aux = nil 42978 return true 42979 } 42980 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42981 // cond: 42982 // result: (NE cmp yes no) 42983 for { 42984 v := b.Control 42985 if v.Op != OpS390XCMPWconst { 42986 break 42987 } 42988 if v.AuxInt != 0 { 42989 break 42990 } 42991 v_0 := v.Args[0] 42992 if v_0.Op != OpS390XMOVDNE { 42993 break 42994 } 42995 _ = v_0.Args[2] 42996 v_0_0 := v_0.Args[0] 42997 if v_0_0.Op != OpS390XMOVDconst { 42998 break 42999 } 43000 if v_0_0.AuxInt != 0 { 43001 break 43002 } 43003 v_0_1 := v_0.Args[1] 43004 if v_0_1.Op != OpS390XMOVDconst { 43005 break 43006 } 43007 if v_0_1.AuxInt != 1 { 43008 break 43009 } 43010 cmp := v_0.Args[2] 43011 b.Kind = BlockS390XNE 43012 b.SetControl(cmp) 43013 b.Aux = nil 43014 return true 43015 } 43016 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 43017 // cond: 43018 // result: (GTF cmp yes no) 43019 for { 43020 v := b.Control 43021 if v.Op != OpS390XCMPWconst { 43022 break 43023 } 43024 if v.AuxInt != 0 { 43025 break 43026 } 43027 v_0 := v.Args[0] 43028 if v_0.Op != OpS390XMOVDGTnoinv { 43029 break 43030 } 43031 _ = v_0.Args[2] 43032 v_0_0 := v_0.Args[0] 43033 if v_0_0.Op != OpS390XMOVDconst { 43034 break 43035 } 43036 if v_0_0.AuxInt != 0 { 43037 break 43038 } 43039 v_0_1 := v_0.Args[1] 43040 if v_0_1.Op != OpS390XMOVDconst { 43041 break 43042 } 43043 if v_0_1.AuxInt != 1 { 43044 break 43045 } 43046 cmp := v_0.Args[2] 43047 b.Kind = BlockS390XGTF 43048 b.SetControl(cmp) 43049 b.Aux = nil 43050 return true 43051 } 43052 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 43053 // cond: 43054 // result: (GEF cmp yes no) 43055 for { 43056 v := b.Control 43057 if v.Op != OpS390XCMPWconst { 43058 break 43059 } 43060 if v.AuxInt != 0 { 43061 break 43062 } 43063 v_0 := v.Args[0] 43064 if v_0.Op != OpS390XMOVDGEnoinv { 43065 break 43066 } 43067 _ = v_0.Args[2] 43068 v_0_0 := v_0.Args[0] 43069 if v_0_0.Op != OpS390XMOVDconst { 43070 break 43071 } 43072 if v_0_0.AuxInt != 0 { 43073 break 43074 } 43075 v_0_1 := v_0.Args[1] 43076 if v_0_1.Op != OpS390XMOVDconst { 43077 break 43078 } 43079 if v_0_1.AuxInt != 1 { 43080 break 43081 } 43082 cmp := v_0.Args[2] 43083 b.Kind = BlockS390XGEF 43084 b.SetControl(cmp) 43085 b.Aux = nil 43086 return true 43087 } 43088 // match: (NE (InvertFlags cmp) yes no) 43089 // cond: 43090 // result: (NE cmp yes no) 43091 for { 43092 v := b.Control 43093 if v.Op != OpS390XInvertFlags { 43094 break 43095 } 43096 cmp := v.Args[0] 43097 b.Kind = BlockS390XNE 43098 b.SetControl(cmp) 43099 b.Aux = nil 43100 return true 43101 } 43102 // match: (NE (FlagEQ) yes no) 43103 // cond: 43104 // result: (First nil no yes) 43105 for { 43106 v := b.Control 43107 if v.Op != OpS390XFlagEQ { 43108 break 43109 } 43110 b.Kind = BlockFirst 43111 b.SetControl(nil) 43112 b.Aux = nil 43113 b.swapSuccessors() 43114 return true 43115 } 43116 // match: (NE (FlagLT) yes no) 43117 // cond: 43118 // result: (First nil yes no) 43119 for { 43120 v := b.Control 43121 if v.Op != OpS390XFlagLT { 43122 break 43123 } 43124 b.Kind = BlockFirst 43125 b.SetControl(nil) 43126 b.Aux = nil 43127 return true 43128 } 43129 // match: (NE (FlagGT) yes no) 43130 // cond: 43131 // result: (First nil yes no) 43132 for { 43133 v := b.Control 43134 if v.Op != OpS390XFlagGT { 43135 break 43136 } 43137 b.Kind = BlockFirst 43138 b.SetControl(nil) 43139 b.Aux = nil 43140 return true 43141 } 43142 } 43143 return false 43144 }