github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/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 "fmt" 7 import "math" 8 import "cmd/internal/obj" 9 import "cmd/internal/objabi" 10 import "cmd/compile/internal/types" 11 12 var _ = fmt.Println // in case not otherwise used 13 var _ = math.MinInt8 // in case not otherwise used 14 var _ = obj.ANOP // in case not otherwise used 15 var _ = objabi.GOROOT // in case not otherwise used 16 var _ = types.TypeMem // in case not otherwise used 17 18 func rewriteValueS390X(v *Value) bool { 19 switch v.Op { 20 case OpAdd16: 21 return rewriteValueS390X_OpAdd16_0(v) 22 case OpAdd32: 23 return rewriteValueS390X_OpAdd32_0(v) 24 case OpAdd32F: 25 return rewriteValueS390X_OpAdd32F_0(v) 26 case OpAdd64: 27 return rewriteValueS390X_OpAdd64_0(v) 28 case OpAdd64F: 29 return rewriteValueS390X_OpAdd64F_0(v) 30 case OpAdd8: 31 return rewriteValueS390X_OpAdd8_0(v) 32 case OpAddPtr: 33 return rewriteValueS390X_OpAddPtr_0(v) 34 case OpAddr: 35 return rewriteValueS390X_OpAddr_0(v) 36 case OpAnd16: 37 return rewriteValueS390X_OpAnd16_0(v) 38 case OpAnd32: 39 return rewriteValueS390X_OpAnd32_0(v) 40 case OpAnd64: 41 return rewriteValueS390X_OpAnd64_0(v) 42 case OpAnd8: 43 return rewriteValueS390X_OpAnd8_0(v) 44 case OpAndB: 45 return rewriteValueS390X_OpAndB_0(v) 46 case OpAtomicAdd32: 47 return rewriteValueS390X_OpAtomicAdd32_0(v) 48 case OpAtomicAdd64: 49 return rewriteValueS390X_OpAtomicAdd64_0(v) 50 case OpAtomicCompareAndSwap32: 51 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 52 case OpAtomicCompareAndSwap64: 53 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 54 case OpAtomicExchange32: 55 return rewriteValueS390X_OpAtomicExchange32_0(v) 56 case OpAtomicExchange64: 57 return rewriteValueS390X_OpAtomicExchange64_0(v) 58 case OpAtomicLoad32: 59 return rewriteValueS390X_OpAtomicLoad32_0(v) 60 case OpAtomicLoad64: 61 return rewriteValueS390X_OpAtomicLoad64_0(v) 62 case OpAtomicLoadPtr: 63 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 64 case OpAtomicStore32: 65 return rewriteValueS390X_OpAtomicStore32_0(v) 66 case OpAtomicStore64: 67 return rewriteValueS390X_OpAtomicStore64_0(v) 68 case OpAtomicStorePtrNoWB: 69 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 70 case OpAvg64u: 71 return rewriteValueS390X_OpAvg64u_0(v) 72 case OpBitLen64: 73 return rewriteValueS390X_OpBitLen64_0(v) 74 case OpBswap32: 75 return rewriteValueS390X_OpBswap32_0(v) 76 case OpBswap64: 77 return rewriteValueS390X_OpBswap64_0(v) 78 case OpCeil: 79 return rewriteValueS390X_OpCeil_0(v) 80 case OpClosureCall: 81 return rewriteValueS390X_OpClosureCall_0(v) 82 case OpCom16: 83 return rewriteValueS390X_OpCom16_0(v) 84 case OpCom32: 85 return rewriteValueS390X_OpCom32_0(v) 86 case OpCom64: 87 return rewriteValueS390X_OpCom64_0(v) 88 case OpCom8: 89 return rewriteValueS390X_OpCom8_0(v) 90 case OpConst16: 91 return rewriteValueS390X_OpConst16_0(v) 92 case OpConst32: 93 return rewriteValueS390X_OpConst32_0(v) 94 case OpConst32F: 95 return rewriteValueS390X_OpConst32F_0(v) 96 case OpConst64: 97 return rewriteValueS390X_OpConst64_0(v) 98 case OpConst64F: 99 return rewriteValueS390X_OpConst64F_0(v) 100 case OpConst8: 101 return rewriteValueS390X_OpConst8_0(v) 102 case OpConstBool: 103 return rewriteValueS390X_OpConstBool_0(v) 104 case OpConstNil: 105 return rewriteValueS390X_OpConstNil_0(v) 106 case OpCtz32: 107 return rewriteValueS390X_OpCtz32_0(v) 108 case OpCtz32NonZero: 109 return rewriteValueS390X_OpCtz32NonZero_0(v) 110 case OpCtz64: 111 return rewriteValueS390X_OpCtz64_0(v) 112 case OpCtz64NonZero: 113 return rewriteValueS390X_OpCtz64NonZero_0(v) 114 case OpCvt32Fto32: 115 return rewriteValueS390X_OpCvt32Fto32_0(v) 116 case OpCvt32Fto64: 117 return rewriteValueS390X_OpCvt32Fto64_0(v) 118 case OpCvt32Fto64F: 119 return rewriteValueS390X_OpCvt32Fto64F_0(v) 120 case OpCvt32to32F: 121 return rewriteValueS390X_OpCvt32to32F_0(v) 122 case OpCvt32to64F: 123 return rewriteValueS390X_OpCvt32to64F_0(v) 124 case OpCvt64Fto32: 125 return rewriteValueS390X_OpCvt64Fto32_0(v) 126 case OpCvt64Fto32F: 127 return rewriteValueS390X_OpCvt64Fto32F_0(v) 128 case OpCvt64Fto64: 129 return rewriteValueS390X_OpCvt64Fto64_0(v) 130 case OpCvt64to32F: 131 return rewriteValueS390X_OpCvt64to32F_0(v) 132 case OpCvt64to64F: 133 return rewriteValueS390X_OpCvt64to64F_0(v) 134 case OpDiv16: 135 return rewriteValueS390X_OpDiv16_0(v) 136 case OpDiv16u: 137 return rewriteValueS390X_OpDiv16u_0(v) 138 case OpDiv32: 139 return rewriteValueS390X_OpDiv32_0(v) 140 case OpDiv32F: 141 return rewriteValueS390X_OpDiv32F_0(v) 142 case OpDiv32u: 143 return rewriteValueS390X_OpDiv32u_0(v) 144 case OpDiv64: 145 return rewriteValueS390X_OpDiv64_0(v) 146 case OpDiv64F: 147 return rewriteValueS390X_OpDiv64F_0(v) 148 case OpDiv64u: 149 return rewriteValueS390X_OpDiv64u_0(v) 150 case OpDiv8: 151 return rewriteValueS390X_OpDiv8_0(v) 152 case OpDiv8u: 153 return rewriteValueS390X_OpDiv8u_0(v) 154 case OpEq16: 155 return rewriteValueS390X_OpEq16_0(v) 156 case OpEq32: 157 return rewriteValueS390X_OpEq32_0(v) 158 case OpEq32F: 159 return rewriteValueS390X_OpEq32F_0(v) 160 case OpEq64: 161 return rewriteValueS390X_OpEq64_0(v) 162 case OpEq64F: 163 return rewriteValueS390X_OpEq64F_0(v) 164 case OpEq8: 165 return rewriteValueS390X_OpEq8_0(v) 166 case OpEqB: 167 return rewriteValueS390X_OpEqB_0(v) 168 case OpEqPtr: 169 return rewriteValueS390X_OpEqPtr_0(v) 170 case OpFloor: 171 return rewriteValueS390X_OpFloor_0(v) 172 case OpGeq16: 173 return rewriteValueS390X_OpGeq16_0(v) 174 case OpGeq16U: 175 return rewriteValueS390X_OpGeq16U_0(v) 176 case OpGeq32: 177 return rewriteValueS390X_OpGeq32_0(v) 178 case OpGeq32F: 179 return rewriteValueS390X_OpGeq32F_0(v) 180 case OpGeq32U: 181 return rewriteValueS390X_OpGeq32U_0(v) 182 case OpGeq64: 183 return rewriteValueS390X_OpGeq64_0(v) 184 case OpGeq64F: 185 return rewriteValueS390X_OpGeq64F_0(v) 186 case OpGeq64U: 187 return rewriteValueS390X_OpGeq64U_0(v) 188 case OpGeq8: 189 return rewriteValueS390X_OpGeq8_0(v) 190 case OpGeq8U: 191 return rewriteValueS390X_OpGeq8U_0(v) 192 case OpGetCallerPC: 193 return rewriteValueS390X_OpGetCallerPC_0(v) 194 case OpGetCallerSP: 195 return rewriteValueS390X_OpGetCallerSP_0(v) 196 case OpGetClosurePtr: 197 return rewriteValueS390X_OpGetClosurePtr_0(v) 198 case OpGetG: 199 return rewriteValueS390X_OpGetG_0(v) 200 case OpGreater16: 201 return rewriteValueS390X_OpGreater16_0(v) 202 case OpGreater16U: 203 return rewriteValueS390X_OpGreater16U_0(v) 204 case OpGreater32: 205 return rewriteValueS390X_OpGreater32_0(v) 206 case OpGreater32F: 207 return rewriteValueS390X_OpGreater32F_0(v) 208 case OpGreater32U: 209 return rewriteValueS390X_OpGreater32U_0(v) 210 case OpGreater64: 211 return rewriteValueS390X_OpGreater64_0(v) 212 case OpGreater64F: 213 return rewriteValueS390X_OpGreater64F_0(v) 214 case OpGreater64U: 215 return rewriteValueS390X_OpGreater64U_0(v) 216 case OpGreater8: 217 return rewriteValueS390X_OpGreater8_0(v) 218 case OpGreater8U: 219 return rewriteValueS390X_OpGreater8U_0(v) 220 case OpHmul32: 221 return rewriteValueS390X_OpHmul32_0(v) 222 case OpHmul32u: 223 return rewriteValueS390X_OpHmul32u_0(v) 224 case OpHmul64: 225 return rewriteValueS390X_OpHmul64_0(v) 226 case OpHmul64u: 227 return rewriteValueS390X_OpHmul64u_0(v) 228 case OpITab: 229 return rewriteValueS390X_OpITab_0(v) 230 case OpInterCall: 231 return rewriteValueS390X_OpInterCall_0(v) 232 case OpIsInBounds: 233 return rewriteValueS390X_OpIsInBounds_0(v) 234 case OpIsNonNil: 235 return rewriteValueS390X_OpIsNonNil_0(v) 236 case OpIsSliceInBounds: 237 return rewriteValueS390X_OpIsSliceInBounds_0(v) 238 case OpLeq16: 239 return rewriteValueS390X_OpLeq16_0(v) 240 case OpLeq16U: 241 return rewriteValueS390X_OpLeq16U_0(v) 242 case OpLeq32: 243 return rewriteValueS390X_OpLeq32_0(v) 244 case OpLeq32F: 245 return rewriteValueS390X_OpLeq32F_0(v) 246 case OpLeq32U: 247 return rewriteValueS390X_OpLeq32U_0(v) 248 case OpLeq64: 249 return rewriteValueS390X_OpLeq64_0(v) 250 case OpLeq64F: 251 return rewriteValueS390X_OpLeq64F_0(v) 252 case OpLeq64U: 253 return rewriteValueS390X_OpLeq64U_0(v) 254 case OpLeq8: 255 return rewriteValueS390X_OpLeq8_0(v) 256 case OpLeq8U: 257 return rewriteValueS390X_OpLeq8U_0(v) 258 case OpLess16: 259 return rewriteValueS390X_OpLess16_0(v) 260 case OpLess16U: 261 return rewriteValueS390X_OpLess16U_0(v) 262 case OpLess32: 263 return rewriteValueS390X_OpLess32_0(v) 264 case OpLess32F: 265 return rewriteValueS390X_OpLess32F_0(v) 266 case OpLess32U: 267 return rewriteValueS390X_OpLess32U_0(v) 268 case OpLess64: 269 return rewriteValueS390X_OpLess64_0(v) 270 case OpLess64F: 271 return rewriteValueS390X_OpLess64F_0(v) 272 case OpLess64U: 273 return rewriteValueS390X_OpLess64U_0(v) 274 case OpLess8: 275 return rewriteValueS390X_OpLess8_0(v) 276 case OpLess8U: 277 return rewriteValueS390X_OpLess8U_0(v) 278 case OpLoad: 279 return rewriteValueS390X_OpLoad_0(v) 280 case OpLocalAddr: 281 return rewriteValueS390X_OpLocalAddr_0(v) 282 case OpLsh16x16: 283 return rewriteValueS390X_OpLsh16x16_0(v) 284 case OpLsh16x32: 285 return rewriteValueS390X_OpLsh16x32_0(v) 286 case OpLsh16x64: 287 return rewriteValueS390X_OpLsh16x64_0(v) 288 case OpLsh16x8: 289 return rewriteValueS390X_OpLsh16x8_0(v) 290 case OpLsh32x16: 291 return rewriteValueS390X_OpLsh32x16_0(v) 292 case OpLsh32x32: 293 return rewriteValueS390X_OpLsh32x32_0(v) 294 case OpLsh32x64: 295 return rewriteValueS390X_OpLsh32x64_0(v) 296 case OpLsh32x8: 297 return rewriteValueS390X_OpLsh32x8_0(v) 298 case OpLsh64x16: 299 return rewriteValueS390X_OpLsh64x16_0(v) 300 case OpLsh64x32: 301 return rewriteValueS390X_OpLsh64x32_0(v) 302 case OpLsh64x64: 303 return rewriteValueS390X_OpLsh64x64_0(v) 304 case OpLsh64x8: 305 return rewriteValueS390X_OpLsh64x8_0(v) 306 case OpLsh8x16: 307 return rewriteValueS390X_OpLsh8x16_0(v) 308 case OpLsh8x32: 309 return rewriteValueS390X_OpLsh8x32_0(v) 310 case OpLsh8x64: 311 return rewriteValueS390X_OpLsh8x64_0(v) 312 case OpLsh8x8: 313 return rewriteValueS390X_OpLsh8x8_0(v) 314 case OpMod16: 315 return rewriteValueS390X_OpMod16_0(v) 316 case OpMod16u: 317 return rewriteValueS390X_OpMod16u_0(v) 318 case OpMod32: 319 return rewriteValueS390X_OpMod32_0(v) 320 case OpMod32u: 321 return rewriteValueS390X_OpMod32u_0(v) 322 case OpMod64: 323 return rewriteValueS390X_OpMod64_0(v) 324 case OpMod64u: 325 return rewriteValueS390X_OpMod64u_0(v) 326 case OpMod8: 327 return rewriteValueS390X_OpMod8_0(v) 328 case OpMod8u: 329 return rewriteValueS390X_OpMod8u_0(v) 330 case OpMove: 331 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 332 case OpMul16: 333 return rewriteValueS390X_OpMul16_0(v) 334 case OpMul32: 335 return rewriteValueS390X_OpMul32_0(v) 336 case OpMul32F: 337 return rewriteValueS390X_OpMul32F_0(v) 338 case OpMul64: 339 return rewriteValueS390X_OpMul64_0(v) 340 case OpMul64F: 341 return rewriteValueS390X_OpMul64F_0(v) 342 case OpMul8: 343 return rewriteValueS390X_OpMul8_0(v) 344 case OpNeg16: 345 return rewriteValueS390X_OpNeg16_0(v) 346 case OpNeg32: 347 return rewriteValueS390X_OpNeg32_0(v) 348 case OpNeg32F: 349 return rewriteValueS390X_OpNeg32F_0(v) 350 case OpNeg64: 351 return rewriteValueS390X_OpNeg64_0(v) 352 case OpNeg64F: 353 return rewriteValueS390X_OpNeg64F_0(v) 354 case OpNeg8: 355 return rewriteValueS390X_OpNeg8_0(v) 356 case OpNeq16: 357 return rewriteValueS390X_OpNeq16_0(v) 358 case OpNeq32: 359 return rewriteValueS390X_OpNeq32_0(v) 360 case OpNeq32F: 361 return rewriteValueS390X_OpNeq32F_0(v) 362 case OpNeq64: 363 return rewriteValueS390X_OpNeq64_0(v) 364 case OpNeq64F: 365 return rewriteValueS390X_OpNeq64F_0(v) 366 case OpNeq8: 367 return rewriteValueS390X_OpNeq8_0(v) 368 case OpNeqB: 369 return rewriteValueS390X_OpNeqB_0(v) 370 case OpNeqPtr: 371 return rewriteValueS390X_OpNeqPtr_0(v) 372 case OpNilCheck: 373 return rewriteValueS390X_OpNilCheck_0(v) 374 case OpNot: 375 return rewriteValueS390X_OpNot_0(v) 376 case OpOffPtr: 377 return rewriteValueS390X_OpOffPtr_0(v) 378 case OpOr16: 379 return rewriteValueS390X_OpOr16_0(v) 380 case OpOr32: 381 return rewriteValueS390X_OpOr32_0(v) 382 case OpOr64: 383 return rewriteValueS390X_OpOr64_0(v) 384 case OpOr8: 385 return rewriteValueS390X_OpOr8_0(v) 386 case OpOrB: 387 return rewriteValueS390X_OpOrB_0(v) 388 case OpPopCount16: 389 return rewriteValueS390X_OpPopCount16_0(v) 390 case OpPopCount32: 391 return rewriteValueS390X_OpPopCount32_0(v) 392 case OpPopCount64: 393 return rewriteValueS390X_OpPopCount64_0(v) 394 case OpPopCount8: 395 return rewriteValueS390X_OpPopCount8_0(v) 396 case OpRotateLeft32: 397 return rewriteValueS390X_OpRotateLeft32_0(v) 398 case OpRotateLeft64: 399 return rewriteValueS390X_OpRotateLeft64_0(v) 400 case OpRound: 401 return rewriteValueS390X_OpRound_0(v) 402 case OpRound32F: 403 return rewriteValueS390X_OpRound32F_0(v) 404 case OpRound64F: 405 return rewriteValueS390X_OpRound64F_0(v) 406 case OpRoundToEven: 407 return rewriteValueS390X_OpRoundToEven_0(v) 408 case OpRsh16Ux16: 409 return rewriteValueS390X_OpRsh16Ux16_0(v) 410 case OpRsh16Ux32: 411 return rewriteValueS390X_OpRsh16Ux32_0(v) 412 case OpRsh16Ux64: 413 return rewriteValueS390X_OpRsh16Ux64_0(v) 414 case OpRsh16Ux8: 415 return rewriteValueS390X_OpRsh16Ux8_0(v) 416 case OpRsh16x16: 417 return rewriteValueS390X_OpRsh16x16_0(v) 418 case OpRsh16x32: 419 return rewriteValueS390X_OpRsh16x32_0(v) 420 case OpRsh16x64: 421 return rewriteValueS390X_OpRsh16x64_0(v) 422 case OpRsh16x8: 423 return rewriteValueS390X_OpRsh16x8_0(v) 424 case OpRsh32Ux16: 425 return rewriteValueS390X_OpRsh32Ux16_0(v) 426 case OpRsh32Ux32: 427 return rewriteValueS390X_OpRsh32Ux32_0(v) 428 case OpRsh32Ux64: 429 return rewriteValueS390X_OpRsh32Ux64_0(v) 430 case OpRsh32Ux8: 431 return rewriteValueS390X_OpRsh32Ux8_0(v) 432 case OpRsh32x16: 433 return rewriteValueS390X_OpRsh32x16_0(v) 434 case OpRsh32x32: 435 return rewriteValueS390X_OpRsh32x32_0(v) 436 case OpRsh32x64: 437 return rewriteValueS390X_OpRsh32x64_0(v) 438 case OpRsh32x8: 439 return rewriteValueS390X_OpRsh32x8_0(v) 440 case OpRsh64Ux16: 441 return rewriteValueS390X_OpRsh64Ux16_0(v) 442 case OpRsh64Ux32: 443 return rewriteValueS390X_OpRsh64Ux32_0(v) 444 case OpRsh64Ux64: 445 return rewriteValueS390X_OpRsh64Ux64_0(v) 446 case OpRsh64Ux8: 447 return rewriteValueS390X_OpRsh64Ux8_0(v) 448 case OpRsh64x16: 449 return rewriteValueS390X_OpRsh64x16_0(v) 450 case OpRsh64x32: 451 return rewriteValueS390X_OpRsh64x32_0(v) 452 case OpRsh64x64: 453 return rewriteValueS390X_OpRsh64x64_0(v) 454 case OpRsh64x8: 455 return rewriteValueS390X_OpRsh64x8_0(v) 456 case OpRsh8Ux16: 457 return rewriteValueS390X_OpRsh8Ux16_0(v) 458 case OpRsh8Ux32: 459 return rewriteValueS390X_OpRsh8Ux32_0(v) 460 case OpRsh8Ux64: 461 return rewriteValueS390X_OpRsh8Ux64_0(v) 462 case OpRsh8Ux8: 463 return rewriteValueS390X_OpRsh8Ux8_0(v) 464 case OpRsh8x16: 465 return rewriteValueS390X_OpRsh8x16_0(v) 466 case OpRsh8x32: 467 return rewriteValueS390X_OpRsh8x32_0(v) 468 case OpRsh8x64: 469 return rewriteValueS390X_OpRsh8x64_0(v) 470 case OpRsh8x8: 471 return rewriteValueS390X_OpRsh8x8_0(v) 472 case OpS390XADD: 473 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 474 case OpS390XADDW: 475 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 476 case OpS390XADDWconst: 477 return rewriteValueS390X_OpS390XADDWconst_0(v) 478 case OpS390XADDWload: 479 return rewriteValueS390X_OpS390XADDWload_0(v) 480 case OpS390XADDconst: 481 return rewriteValueS390X_OpS390XADDconst_0(v) 482 case OpS390XADDload: 483 return rewriteValueS390X_OpS390XADDload_0(v) 484 case OpS390XAND: 485 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 486 case OpS390XANDW: 487 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 488 case OpS390XANDWconst: 489 return rewriteValueS390X_OpS390XANDWconst_0(v) 490 case OpS390XANDWload: 491 return rewriteValueS390X_OpS390XANDWload_0(v) 492 case OpS390XANDconst: 493 return rewriteValueS390X_OpS390XANDconst_0(v) 494 case OpS390XANDload: 495 return rewriteValueS390X_OpS390XANDload_0(v) 496 case OpS390XCMP: 497 return rewriteValueS390X_OpS390XCMP_0(v) 498 case OpS390XCMPU: 499 return rewriteValueS390X_OpS390XCMPU_0(v) 500 case OpS390XCMPUconst: 501 return rewriteValueS390X_OpS390XCMPUconst_0(v) || rewriteValueS390X_OpS390XCMPUconst_10(v) 502 case OpS390XCMPW: 503 return rewriteValueS390X_OpS390XCMPW_0(v) 504 case OpS390XCMPWU: 505 return rewriteValueS390X_OpS390XCMPWU_0(v) 506 case OpS390XCMPWUconst: 507 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 508 case OpS390XCMPWconst: 509 return rewriteValueS390X_OpS390XCMPWconst_0(v) 510 case OpS390XCMPconst: 511 return rewriteValueS390X_OpS390XCMPconst_0(v) || rewriteValueS390X_OpS390XCMPconst_10(v) 512 case OpS390XCPSDR: 513 return rewriteValueS390X_OpS390XCPSDR_0(v) 514 case OpS390XFADD: 515 return rewriteValueS390X_OpS390XFADD_0(v) 516 case OpS390XFADDS: 517 return rewriteValueS390X_OpS390XFADDS_0(v) 518 case OpS390XFMOVDload: 519 return rewriteValueS390X_OpS390XFMOVDload_0(v) 520 case OpS390XFMOVDloadidx: 521 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 522 case OpS390XFMOVDstore: 523 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 524 case OpS390XFMOVDstoreidx: 525 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 526 case OpS390XFMOVSload: 527 return rewriteValueS390X_OpS390XFMOVSload_0(v) 528 case OpS390XFMOVSloadidx: 529 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 530 case OpS390XFMOVSstore: 531 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 532 case OpS390XFMOVSstoreidx: 533 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 534 case OpS390XFNEG: 535 return rewriteValueS390X_OpS390XFNEG_0(v) 536 case OpS390XFNEGS: 537 return rewriteValueS390X_OpS390XFNEGS_0(v) 538 case OpS390XFSUB: 539 return rewriteValueS390X_OpS390XFSUB_0(v) 540 case OpS390XFSUBS: 541 return rewriteValueS390X_OpS390XFSUBS_0(v) 542 case OpS390XLDGR: 543 return rewriteValueS390X_OpS390XLDGR_0(v) 544 case OpS390XLEDBR: 545 return rewriteValueS390X_OpS390XLEDBR_0(v) 546 case OpS390XLGDR: 547 return rewriteValueS390X_OpS390XLGDR_0(v) 548 case OpS390XLoweredRound32F: 549 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 550 case OpS390XLoweredRound64F: 551 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 552 case OpS390XMOVBZload: 553 return rewriteValueS390X_OpS390XMOVBZload_0(v) 554 case OpS390XMOVBZloadidx: 555 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 556 case OpS390XMOVBZreg: 557 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 558 case OpS390XMOVBload: 559 return rewriteValueS390X_OpS390XMOVBload_0(v) 560 case OpS390XMOVBloadidx: 561 return rewriteValueS390X_OpS390XMOVBloadidx_0(v) 562 case OpS390XMOVBreg: 563 return rewriteValueS390X_OpS390XMOVBreg_0(v) 564 case OpS390XMOVBstore: 565 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 566 case OpS390XMOVBstoreconst: 567 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 568 case OpS390XMOVBstoreidx: 569 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 570 case OpS390XMOVDEQ: 571 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 572 case OpS390XMOVDGE: 573 return rewriteValueS390X_OpS390XMOVDGE_0(v) 574 case OpS390XMOVDGT: 575 return rewriteValueS390X_OpS390XMOVDGT_0(v) 576 case OpS390XMOVDLE: 577 return rewriteValueS390X_OpS390XMOVDLE_0(v) 578 case OpS390XMOVDLT: 579 return rewriteValueS390X_OpS390XMOVDLT_0(v) 580 case OpS390XMOVDNE: 581 return rewriteValueS390X_OpS390XMOVDNE_0(v) 582 case OpS390XMOVDaddridx: 583 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 584 case OpS390XMOVDload: 585 return rewriteValueS390X_OpS390XMOVDload_0(v) 586 case OpS390XMOVDloadidx: 587 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 588 case OpS390XMOVDnop: 589 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 590 case OpS390XMOVDreg: 591 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 592 case OpS390XMOVDstore: 593 return rewriteValueS390X_OpS390XMOVDstore_0(v) 594 case OpS390XMOVDstoreconst: 595 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 596 case OpS390XMOVDstoreidx: 597 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 598 case OpS390XMOVHBRstore: 599 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 600 case OpS390XMOVHBRstoreidx: 601 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 602 case OpS390XMOVHZload: 603 return rewriteValueS390X_OpS390XMOVHZload_0(v) 604 case OpS390XMOVHZloadidx: 605 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 606 case OpS390XMOVHZreg: 607 return rewriteValueS390X_OpS390XMOVHZreg_0(v) || rewriteValueS390X_OpS390XMOVHZreg_10(v) 608 case OpS390XMOVHload: 609 return rewriteValueS390X_OpS390XMOVHload_0(v) 610 case OpS390XMOVHloadidx: 611 return rewriteValueS390X_OpS390XMOVHloadidx_0(v) 612 case OpS390XMOVHreg: 613 return rewriteValueS390X_OpS390XMOVHreg_0(v) || rewriteValueS390X_OpS390XMOVHreg_10(v) 614 case OpS390XMOVHstore: 615 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 616 case OpS390XMOVHstoreconst: 617 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 618 case OpS390XMOVHstoreidx: 619 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 620 case OpS390XMOVWBRstore: 621 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 622 case OpS390XMOVWBRstoreidx: 623 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 624 case OpS390XMOVWZload: 625 return rewriteValueS390X_OpS390XMOVWZload_0(v) 626 case OpS390XMOVWZloadidx: 627 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 628 case OpS390XMOVWZreg: 629 return rewriteValueS390X_OpS390XMOVWZreg_0(v) || rewriteValueS390X_OpS390XMOVWZreg_10(v) 630 case OpS390XMOVWload: 631 return rewriteValueS390X_OpS390XMOVWload_0(v) 632 case OpS390XMOVWloadidx: 633 return rewriteValueS390X_OpS390XMOVWloadidx_0(v) 634 case OpS390XMOVWreg: 635 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 636 case OpS390XMOVWstore: 637 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 638 case OpS390XMOVWstoreconst: 639 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 640 case OpS390XMOVWstoreidx: 641 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 642 case OpS390XMULLD: 643 return rewriteValueS390X_OpS390XMULLD_0(v) 644 case OpS390XMULLDconst: 645 return rewriteValueS390X_OpS390XMULLDconst_0(v) 646 case OpS390XMULLDload: 647 return rewriteValueS390X_OpS390XMULLDload_0(v) 648 case OpS390XMULLW: 649 return rewriteValueS390X_OpS390XMULLW_0(v) 650 case OpS390XMULLWconst: 651 return rewriteValueS390X_OpS390XMULLWconst_0(v) 652 case OpS390XMULLWload: 653 return rewriteValueS390X_OpS390XMULLWload_0(v) 654 case OpS390XNEG: 655 return rewriteValueS390X_OpS390XNEG_0(v) 656 case OpS390XNEGW: 657 return rewriteValueS390X_OpS390XNEGW_0(v) 658 case OpS390XNOT: 659 return rewriteValueS390X_OpS390XNOT_0(v) 660 case OpS390XNOTW: 661 return rewriteValueS390X_OpS390XNOTW_0(v) 662 case OpS390XOR: 663 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) 664 case OpS390XORW: 665 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) 666 case OpS390XORWconst: 667 return rewriteValueS390X_OpS390XORWconst_0(v) 668 case OpS390XORWload: 669 return rewriteValueS390X_OpS390XORWload_0(v) 670 case OpS390XORconst: 671 return rewriteValueS390X_OpS390XORconst_0(v) 672 case OpS390XORload: 673 return rewriteValueS390X_OpS390XORload_0(v) 674 case OpS390XRLL: 675 return rewriteValueS390X_OpS390XRLL_0(v) 676 case OpS390XRLLG: 677 return rewriteValueS390X_OpS390XRLLG_0(v) 678 case OpS390XSLD: 679 return rewriteValueS390X_OpS390XSLD_0(v) || rewriteValueS390X_OpS390XSLD_10(v) 680 case OpS390XSLW: 681 return rewriteValueS390X_OpS390XSLW_0(v) || rewriteValueS390X_OpS390XSLW_10(v) 682 case OpS390XSRAD: 683 return rewriteValueS390X_OpS390XSRAD_0(v) || rewriteValueS390X_OpS390XSRAD_10(v) 684 case OpS390XSRADconst: 685 return rewriteValueS390X_OpS390XSRADconst_0(v) 686 case OpS390XSRAW: 687 return rewriteValueS390X_OpS390XSRAW_0(v) || rewriteValueS390X_OpS390XSRAW_10(v) 688 case OpS390XSRAWconst: 689 return rewriteValueS390X_OpS390XSRAWconst_0(v) 690 case OpS390XSRD: 691 return rewriteValueS390X_OpS390XSRD_0(v) || rewriteValueS390X_OpS390XSRD_10(v) 692 case OpS390XSRDconst: 693 return rewriteValueS390X_OpS390XSRDconst_0(v) 694 case OpS390XSRW: 695 return rewriteValueS390X_OpS390XSRW_0(v) || rewriteValueS390X_OpS390XSRW_10(v) 696 case OpS390XSTM2: 697 return rewriteValueS390X_OpS390XSTM2_0(v) 698 case OpS390XSTMG2: 699 return rewriteValueS390X_OpS390XSTMG2_0(v) 700 case OpS390XSUB: 701 return rewriteValueS390X_OpS390XSUB_0(v) 702 case OpS390XSUBW: 703 return rewriteValueS390X_OpS390XSUBW_0(v) 704 case OpS390XSUBWconst: 705 return rewriteValueS390X_OpS390XSUBWconst_0(v) 706 case OpS390XSUBWload: 707 return rewriteValueS390X_OpS390XSUBWload_0(v) 708 case OpS390XSUBconst: 709 return rewriteValueS390X_OpS390XSUBconst_0(v) 710 case OpS390XSUBload: 711 return rewriteValueS390X_OpS390XSUBload_0(v) 712 case OpS390XSumBytes2: 713 return rewriteValueS390X_OpS390XSumBytes2_0(v) 714 case OpS390XSumBytes4: 715 return rewriteValueS390X_OpS390XSumBytes4_0(v) 716 case OpS390XSumBytes8: 717 return rewriteValueS390X_OpS390XSumBytes8_0(v) 718 case OpS390XXOR: 719 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 720 case OpS390XXORW: 721 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 722 case OpS390XXORWconst: 723 return rewriteValueS390X_OpS390XXORWconst_0(v) 724 case OpS390XXORWload: 725 return rewriteValueS390X_OpS390XXORWload_0(v) 726 case OpS390XXORconst: 727 return rewriteValueS390X_OpS390XXORconst_0(v) 728 case OpS390XXORload: 729 return rewriteValueS390X_OpS390XXORload_0(v) 730 case OpSelect0: 731 return rewriteValueS390X_OpSelect0_0(v) 732 case OpSelect1: 733 return rewriteValueS390X_OpSelect1_0(v) 734 case OpSignExt16to32: 735 return rewriteValueS390X_OpSignExt16to32_0(v) 736 case OpSignExt16to64: 737 return rewriteValueS390X_OpSignExt16to64_0(v) 738 case OpSignExt32to64: 739 return rewriteValueS390X_OpSignExt32to64_0(v) 740 case OpSignExt8to16: 741 return rewriteValueS390X_OpSignExt8to16_0(v) 742 case OpSignExt8to32: 743 return rewriteValueS390X_OpSignExt8to32_0(v) 744 case OpSignExt8to64: 745 return rewriteValueS390X_OpSignExt8to64_0(v) 746 case OpSlicemask: 747 return rewriteValueS390X_OpSlicemask_0(v) 748 case OpSqrt: 749 return rewriteValueS390X_OpSqrt_0(v) 750 case OpStaticCall: 751 return rewriteValueS390X_OpStaticCall_0(v) 752 case OpStore: 753 return rewriteValueS390X_OpStore_0(v) 754 case OpSub16: 755 return rewriteValueS390X_OpSub16_0(v) 756 case OpSub32: 757 return rewriteValueS390X_OpSub32_0(v) 758 case OpSub32F: 759 return rewriteValueS390X_OpSub32F_0(v) 760 case OpSub64: 761 return rewriteValueS390X_OpSub64_0(v) 762 case OpSub64F: 763 return rewriteValueS390X_OpSub64F_0(v) 764 case OpSub8: 765 return rewriteValueS390X_OpSub8_0(v) 766 case OpSubPtr: 767 return rewriteValueS390X_OpSubPtr_0(v) 768 case OpTrunc: 769 return rewriteValueS390X_OpTrunc_0(v) 770 case OpTrunc16to8: 771 return rewriteValueS390X_OpTrunc16to8_0(v) 772 case OpTrunc32to16: 773 return rewriteValueS390X_OpTrunc32to16_0(v) 774 case OpTrunc32to8: 775 return rewriteValueS390X_OpTrunc32to8_0(v) 776 case OpTrunc64to16: 777 return rewriteValueS390X_OpTrunc64to16_0(v) 778 case OpTrunc64to32: 779 return rewriteValueS390X_OpTrunc64to32_0(v) 780 case OpTrunc64to8: 781 return rewriteValueS390X_OpTrunc64to8_0(v) 782 case OpWB: 783 return rewriteValueS390X_OpWB_0(v) 784 case OpXor16: 785 return rewriteValueS390X_OpXor16_0(v) 786 case OpXor32: 787 return rewriteValueS390X_OpXor32_0(v) 788 case OpXor64: 789 return rewriteValueS390X_OpXor64_0(v) 790 case OpXor8: 791 return rewriteValueS390X_OpXor8_0(v) 792 case OpZero: 793 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 794 case OpZeroExt16to32: 795 return rewriteValueS390X_OpZeroExt16to32_0(v) 796 case OpZeroExt16to64: 797 return rewriteValueS390X_OpZeroExt16to64_0(v) 798 case OpZeroExt32to64: 799 return rewriteValueS390X_OpZeroExt32to64_0(v) 800 case OpZeroExt8to16: 801 return rewriteValueS390X_OpZeroExt8to16_0(v) 802 case OpZeroExt8to32: 803 return rewriteValueS390X_OpZeroExt8to32_0(v) 804 case OpZeroExt8to64: 805 return rewriteValueS390X_OpZeroExt8to64_0(v) 806 } 807 return false 808 } 809 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 810 // match: (Add16 x y) 811 // cond: 812 // result: (ADDW x y) 813 for { 814 _ = v.Args[1] 815 x := v.Args[0] 816 y := v.Args[1] 817 v.reset(OpS390XADDW) 818 v.AddArg(x) 819 v.AddArg(y) 820 return true 821 } 822 } 823 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 824 // match: (Add32 x y) 825 // cond: 826 // result: (ADDW x y) 827 for { 828 _ = v.Args[1] 829 x := v.Args[0] 830 y := v.Args[1] 831 v.reset(OpS390XADDW) 832 v.AddArg(x) 833 v.AddArg(y) 834 return true 835 } 836 } 837 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 838 // match: (Add32F x y) 839 // cond: 840 // result: (FADDS x y) 841 for { 842 _ = v.Args[1] 843 x := v.Args[0] 844 y := v.Args[1] 845 v.reset(OpS390XFADDS) 846 v.AddArg(x) 847 v.AddArg(y) 848 return true 849 } 850 } 851 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 852 // match: (Add64 x y) 853 // cond: 854 // result: (ADD x y) 855 for { 856 _ = v.Args[1] 857 x := v.Args[0] 858 y := v.Args[1] 859 v.reset(OpS390XADD) 860 v.AddArg(x) 861 v.AddArg(y) 862 return true 863 } 864 } 865 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 866 // match: (Add64F x y) 867 // cond: 868 // result: (FADD x y) 869 for { 870 _ = v.Args[1] 871 x := v.Args[0] 872 y := v.Args[1] 873 v.reset(OpS390XFADD) 874 v.AddArg(x) 875 v.AddArg(y) 876 return true 877 } 878 } 879 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 880 // match: (Add8 x y) 881 // cond: 882 // result: (ADDW x y) 883 for { 884 _ = v.Args[1] 885 x := v.Args[0] 886 y := v.Args[1] 887 v.reset(OpS390XADDW) 888 v.AddArg(x) 889 v.AddArg(y) 890 return true 891 } 892 } 893 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 894 // match: (AddPtr x y) 895 // cond: 896 // result: (ADD x y) 897 for { 898 _ = v.Args[1] 899 x := v.Args[0] 900 y := v.Args[1] 901 v.reset(OpS390XADD) 902 v.AddArg(x) 903 v.AddArg(y) 904 return true 905 } 906 } 907 func rewriteValueS390X_OpAddr_0(v *Value) bool { 908 // match: (Addr {sym} base) 909 // cond: 910 // result: (MOVDaddr {sym} base) 911 for { 912 sym := v.Aux 913 base := v.Args[0] 914 v.reset(OpS390XMOVDaddr) 915 v.Aux = sym 916 v.AddArg(base) 917 return true 918 } 919 } 920 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 921 // match: (And16 x y) 922 // cond: 923 // result: (ANDW x y) 924 for { 925 _ = v.Args[1] 926 x := v.Args[0] 927 y := v.Args[1] 928 v.reset(OpS390XANDW) 929 v.AddArg(x) 930 v.AddArg(y) 931 return true 932 } 933 } 934 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 935 // match: (And32 x y) 936 // cond: 937 // result: (ANDW x y) 938 for { 939 _ = v.Args[1] 940 x := v.Args[0] 941 y := v.Args[1] 942 v.reset(OpS390XANDW) 943 v.AddArg(x) 944 v.AddArg(y) 945 return true 946 } 947 } 948 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 949 // match: (And64 x y) 950 // cond: 951 // result: (AND x y) 952 for { 953 _ = v.Args[1] 954 x := v.Args[0] 955 y := v.Args[1] 956 v.reset(OpS390XAND) 957 v.AddArg(x) 958 v.AddArg(y) 959 return true 960 } 961 } 962 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 963 // match: (And8 x y) 964 // cond: 965 // result: (ANDW x y) 966 for { 967 _ = v.Args[1] 968 x := v.Args[0] 969 y := v.Args[1] 970 v.reset(OpS390XANDW) 971 v.AddArg(x) 972 v.AddArg(y) 973 return true 974 } 975 } 976 func rewriteValueS390X_OpAndB_0(v *Value) bool { 977 // match: (AndB x y) 978 // cond: 979 // result: (ANDW x y) 980 for { 981 _ = v.Args[1] 982 x := v.Args[0] 983 y := v.Args[1] 984 v.reset(OpS390XANDW) 985 v.AddArg(x) 986 v.AddArg(y) 987 return true 988 } 989 } 990 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 991 b := v.Block 992 _ = b 993 typ := &b.Func.Config.Types 994 _ = typ 995 // match: (AtomicAdd32 ptr val mem) 996 // cond: 997 // result: (AddTupleFirst32 val (LAA ptr val mem)) 998 for { 999 _ = v.Args[2] 1000 ptr := v.Args[0] 1001 val := v.Args[1] 1002 mem := v.Args[2] 1003 v.reset(OpS390XAddTupleFirst32) 1004 v.AddArg(val) 1005 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 1006 v0.AddArg(ptr) 1007 v0.AddArg(val) 1008 v0.AddArg(mem) 1009 v.AddArg(v0) 1010 return true 1011 } 1012 } 1013 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 1014 b := v.Block 1015 _ = b 1016 typ := &b.Func.Config.Types 1017 _ = typ 1018 // match: (AtomicAdd64 ptr val mem) 1019 // cond: 1020 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 1021 for { 1022 _ = v.Args[2] 1023 ptr := v.Args[0] 1024 val := v.Args[1] 1025 mem := v.Args[2] 1026 v.reset(OpS390XAddTupleFirst64) 1027 v.AddArg(val) 1028 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 1029 v0.AddArg(ptr) 1030 v0.AddArg(val) 1031 v0.AddArg(mem) 1032 v.AddArg(v0) 1033 return true 1034 } 1035 } 1036 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 1037 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 1038 // cond: 1039 // result: (LoweredAtomicCas32 ptr old new_ mem) 1040 for { 1041 _ = v.Args[3] 1042 ptr := v.Args[0] 1043 old := v.Args[1] 1044 new_ := v.Args[2] 1045 mem := v.Args[3] 1046 v.reset(OpS390XLoweredAtomicCas32) 1047 v.AddArg(ptr) 1048 v.AddArg(old) 1049 v.AddArg(new_) 1050 v.AddArg(mem) 1051 return true 1052 } 1053 } 1054 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 1055 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 1056 // cond: 1057 // result: (LoweredAtomicCas64 ptr old new_ mem) 1058 for { 1059 _ = v.Args[3] 1060 ptr := v.Args[0] 1061 old := v.Args[1] 1062 new_ := v.Args[2] 1063 mem := v.Args[3] 1064 v.reset(OpS390XLoweredAtomicCas64) 1065 v.AddArg(ptr) 1066 v.AddArg(old) 1067 v.AddArg(new_) 1068 v.AddArg(mem) 1069 return true 1070 } 1071 } 1072 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 1073 // match: (AtomicExchange32 ptr val mem) 1074 // cond: 1075 // result: (LoweredAtomicExchange32 ptr val mem) 1076 for { 1077 _ = v.Args[2] 1078 ptr := v.Args[0] 1079 val := v.Args[1] 1080 mem := v.Args[2] 1081 v.reset(OpS390XLoweredAtomicExchange32) 1082 v.AddArg(ptr) 1083 v.AddArg(val) 1084 v.AddArg(mem) 1085 return true 1086 } 1087 } 1088 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1089 // match: (AtomicExchange64 ptr val mem) 1090 // cond: 1091 // result: (LoweredAtomicExchange64 ptr val mem) 1092 for { 1093 _ = v.Args[2] 1094 ptr := v.Args[0] 1095 val := v.Args[1] 1096 mem := v.Args[2] 1097 v.reset(OpS390XLoweredAtomicExchange64) 1098 v.AddArg(ptr) 1099 v.AddArg(val) 1100 v.AddArg(mem) 1101 return true 1102 } 1103 } 1104 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1105 // match: (AtomicLoad32 ptr mem) 1106 // cond: 1107 // result: (MOVWZatomicload ptr mem) 1108 for { 1109 _ = v.Args[1] 1110 ptr := v.Args[0] 1111 mem := v.Args[1] 1112 v.reset(OpS390XMOVWZatomicload) 1113 v.AddArg(ptr) 1114 v.AddArg(mem) 1115 return true 1116 } 1117 } 1118 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1119 // match: (AtomicLoad64 ptr mem) 1120 // cond: 1121 // result: (MOVDatomicload ptr mem) 1122 for { 1123 _ = v.Args[1] 1124 ptr := v.Args[0] 1125 mem := v.Args[1] 1126 v.reset(OpS390XMOVDatomicload) 1127 v.AddArg(ptr) 1128 v.AddArg(mem) 1129 return true 1130 } 1131 } 1132 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1133 // match: (AtomicLoadPtr ptr mem) 1134 // cond: 1135 // result: (MOVDatomicload ptr mem) 1136 for { 1137 _ = v.Args[1] 1138 ptr := v.Args[0] 1139 mem := v.Args[1] 1140 v.reset(OpS390XMOVDatomicload) 1141 v.AddArg(ptr) 1142 v.AddArg(mem) 1143 return true 1144 } 1145 } 1146 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1147 // match: (AtomicStore32 ptr val mem) 1148 // cond: 1149 // result: (MOVWatomicstore ptr val mem) 1150 for { 1151 _ = v.Args[2] 1152 ptr := v.Args[0] 1153 val := v.Args[1] 1154 mem := v.Args[2] 1155 v.reset(OpS390XMOVWatomicstore) 1156 v.AddArg(ptr) 1157 v.AddArg(val) 1158 v.AddArg(mem) 1159 return true 1160 } 1161 } 1162 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1163 // match: (AtomicStore64 ptr val mem) 1164 // cond: 1165 // result: (MOVDatomicstore ptr val mem) 1166 for { 1167 _ = v.Args[2] 1168 ptr := v.Args[0] 1169 val := v.Args[1] 1170 mem := v.Args[2] 1171 v.reset(OpS390XMOVDatomicstore) 1172 v.AddArg(ptr) 1173 v.AddArg(val) 1174 v.AddArg(mem) 1175 return true 1176 } 1177 } 1178 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1179 // match: (AtomicStorePtrNoWB ptr val mem) 1180 // cond: 1181 // result: (MOVDatomicstore ptr val mem) 1182 for { 1183 _ = v.Args[2] 1184 ptr := v.Args[0] 1185 val := v.Args[1] 1186 mem := v.Args[2] 1187 v.reset(OpS390XMOVDatomicstore) 1188 v.AddArg(ptr) 1189 v.AddArg(val) 1190 v.AddArg(mem) 1191 return true 1192 } 1193 } 1194 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1195 b := v.Block 1196 _ = b 1197 // match: (Avg64u <t> x y) 1198 // cond: 1199 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1200 for { 1201 t := v.Type 1202 _ = v.Args[1] 1203 x := v.Args[0] 1204 y := v.Args[1] 1205 v.reset(OpS390XADD) 1206 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1207 v0.AuxInt = 1 1208 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1209 v1.AddArg(x) 1210 v1.AddArg(y) 1211 v0.AddArg(v1) 1212 v.AddArg(v0) 1213 v.AddArg(y) 1214 return true 1215 } 1216 } 1217 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1218 b := v.Block 1219 _ = b 1220 typ := &b.Func.Config.Types 1221 _ = typ 1222 // match: (BitLen64 x) 1223 // cond: 1224 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1225 for { 1226 x := v.Args[0] 1227 v.reset(OpS390XSUB) 1228 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1229 v0.AuxInt = 64 1230 v.AddArg(v0) 1231 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1232 v1.AddArg(x) 1233 v.AddArg(v1) 1234 return true 1235 } 1236 } 1237 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1238 // match: (Bswap32 x) 1239 // cond: 1240 // result: (MOVWBR x) 1241 for { 1242 x := v.Args[0] 1243 v.reset(OpS390XMOVWBR) 1244 v.AddArg(x) 1245 return true 1246 } 1247 } 1248 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1249 // match: (Bswap64 x) 1250 // cond: 1251 // result: (MOVDBR x) 1252 for { 1253 x := v.Args[0] 1254 v.reset(OpS390XMOVDBR) 1255 v.AddArg(x) 1256 return true 1257 } 1258 } 1259 func rewriteValueS390X_OpCeil_0(v *Value) bool { 1260 // match: (Ceil x) 1261 // cond: 1262 // result: (FIDBR [6] x) 1263 for { 1264 x := v.Args[0] 1265 v.reset(OpS390XFIDBR) 1266 v.AuxInt = 6 1267 v.AddArg(x) 1268 return true 1269 } 1270 } 1271 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1272 // match: (ClosureCall [argwid] entry closure mem) 1273 // cond: 1274 // result: (CALLclosure [argwid] entry closure mem) 1275 for { 1276 argwid := v.AuxInt 1277 _ = v.Args[2] 1278 entry := v.Args[0] 1279 closure := v.Args[1] 1280 mem := v.Args[2] 1281 v.reset(OpS390XCALLclosure) 1282 v.AuxInt = argwid 1283 v.AddArg(entry) 1284 v.AddArg(closure) 1285 v.AddArg(mem) 1286 return true 1287 } 1288 } 1289 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1290 // match: (Com16 x) 1291 // cond: 1292 // result: (NOTW x) 1293 for { 1294 x := v.Args[0] 1295 v.reset(OpS390XNOTW) 1296 v.AddArg(x) 1297 return true 1298 } 1299 } 1300 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1301 // match: (Com32 x) 1302 // cond: 1303 // result: (NOTW x) 1304 for { 1305 x := v.Args[0] 1306 v.reset(OpS390XNOTW) 1307 v.AddArg(x) 1308 return true 1309 } 1310 } 1311 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1312 // match: (Com64 x) 1313 // cond: 1314 // result: (NOT x) 1315 for { 1316 x := v.Args[0] 1317 v.reset(OpS390XNOT) 1318 v.AddArg(x) 1319 return true 1320 } 1321 } 1322 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1323 // match: (Com8 x) 1324 // cond: 1325 // result: (NOTW x) 1326 for { 1327 x := v.Args[0] 1328 v.reset(OpS390XNOTW) 1329 v.AddArg(x) 1330 return true 1331 } 1332 } 1333 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1334 // match: (Const16 [val]) 1335 // cond: 1336 // result: (MOVDconst [val]) 1337 for { 1338 val := v.AuxInt 1339 v.reset(OpS390XMOVDconst) 1340 v.AuxInt = val 1341 return true 1342 } 1343 } 1344 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1345 // match: (Const32 [val]) 1346 // cond: 1347 // result: (MOVDconst [val]) 1348 for { 1349 val := v.AuxInt 1350 v.reset(OpS390XMOVDconst) 1351 v.AuxInt = val 1352 return true 1353 } 1354 } 1355 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1356 // match: (Const32F [val]) 1357 // cond: 1358 // result: (FMOVSconst [val]) 1359 for { 1360 val := v.AuxInt 1361 v.reset(OpS390XFMOVSconst) 1362 v.AuxInt = val 1363 return true 1364 } 1365 } 1366 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1367 // match: (Const64 [val]) 1368 // cond: 1369 // result: (MOVDconst [val]) 1370 for { 1371 val := v.AuxInt 1372 v.reset(OpS390XMOVDconst) 1373 v.AuxInt = val 1374 return true 1375 } 1376 } 1377 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1378 // match: (Const64F [val]) 1379 // cond: 1380 // result: (FMOVDconst [val]) 1381 for { 1382 val := v.AuxInt 1383 v.reset(OpS390XFMOVDconst) 1384 v.AuxInt = val 1385 return true 1386 } 1387 } 1388 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1389 // match: (Const8 [val]) 1390 // cond: 1391 // result: (MOVDconst [val]) 1392 for { 1393 val := v.AuxInt 1394 v.reset(OpS390XMOVDconst) 1395 v.AuxInt = val 1396 return true 1397 } 1398 } 1399 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1400 // match: (ConstBool [b]) 1401 // cond: 1402 // result: (MOVDconst [b]) 1403 for { 1404 b := v.AuxInt 1405 v.reset(OpS390XMOVDconst) 1406 v.AuxInt = b 1407 return true 1408 } 1409 } 1410 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1411 // match: (ConstNil) 1412 // cond: 1413 // result: (MOVDconst [0]) 1414 for { 1415 v.reset(OpS390XMOVDconst) 1416 v.AuxInt = 0 1417 return true 1418 } 1419 } 1420 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1421 b := v.Block 1422 _ = b 1423 typ := &b.Func.Config.Types 1424 _ = typ 1425 // match: (Ctz32 <t> x) 1426 // cond: 1427 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1428 for { 1429 t := v.Type 1430 x := v.Args[0] 1431 v.reset(OpS390XSUB) 1432 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1433 v0.AuxInt = 64 1434 v.AddArg(v0) 1435 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1436 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1437 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1438 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1439 v4.AuxInt = 1 1440 v4.AddArg(x) 1441 v3.AddArg(v4) 1442 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1443 v5.AddArg(x) 1444 v3.AddArg(v5) 1445 v2.AddArg(v3) 1446 v1.AddArg(v2) 1447 v.AddArg(v1) 1448 return true 1449 } 1450 } 1451 func rewriteValueS390X_OpCtz32NonZero_0(v *Value) bool { 1452 // match: (Ctz32NonZero x) 1453 // cond: 1454 // result: (Ctz32 x) 1455 for { 1456 x := v.Args[0] 1457 v.reset(OpCtz32) 1458 v.AddArg(x) 1459 return true 1460 } 1461 } 1462 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1463 b := v.Block 1464 _ = b 1465 typ := &b.Func.Config.Types 1466 _ = typ 1467 // match: (Ctz64 <t> x) 1468 // cond: 1469 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1470 for { 1471 t := v.Type 1472 x := v.Args[0] 1473 v.reset(OpS390XSUB) 1474 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1475 v0.AuxInt = 64 1476 v.AddArg(v0) 1477 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1478 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1479 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1480 v3.AuxInt = 1 1481 v3.AddArg(x) 1482 v2.AddArg(v3) 1483 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1484 v4.AddArg(x) 1485 v2.AddArg(v4) 1486 v1.AddArg(v2) 1487 v.AddArg(v1) 1488 return true 1489 } 1490 } 1491 func rewriteValueS390X_OpCtz64NonZero_0(v *Value) bool { 1492 // match: (Ctz64NonZero x) 1493 // cond: 1494 // result: (Ctz64 x) 1495 for { 1496 x := v.Args[0] 1497 v.reset(OpCtz64) 1498 v.AddArg(x) 1499 return true 1500 } 1501 } 1502 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1503 // match: (Cvt32Fto32 x) 1504 // cond: 1505 // result: (CFEBRA x) 1506 for { 1507 x := v.Args[0] 1508 v.reset(OpS390XCFEBRA) 1509 v.AddArg(x) 1510 return true 1511 } 1512 } 1513 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1514 // match: (Cvt32Fto64 x) 1515 // cond: 1516 // result: (CGEBRA x) 1517 for { 1518 x := v.Args[0] 1519 v.reset(OpS390XCGEBRA) 1520 v.AddArg(x) 1521 return true 1522 } 1523 } 1524 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1525 // match: (Cvt32Fto64F x) 1526 // cond: 1527 // result: (LDEBR x) 1528 for { 1529 x := v.Args[0] 1530 v.reset(OpS390XLDEBR) 1531 v.AddArg(x) 1532 return true 1533 } 1534 } 1535 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1536 // match: (Cvt32to32F x) 1537 // cond: 1538 // result: (CEFBRA x) 1539 for { 1540 x := v.Args[0] 1541 v.reset(OpS390XCEFBRA) 1542 v.AddArg(x) 1543 return true 1544 } 1545 } 1546 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1547 // match: (Cvt32to64F x) 1548 // cond: 1549 // result: (CDFBRA x) 1550 for { 1551 x := v.Args[0] 1552 v.reset(OpS390XCDFBRA) 1553 v.AddArg(x) 1554 return true 1555 } 1556 } 1557 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1558 // match: (Cvt64Fto32 x) 1559 // cond: 1560 // result: (CFDBRA x) 1561 for { 1562 x := v.Args[0] 1563 v.reset(OpS390XCFDBRA) 1564 v.AddArg(x) 1565 return true 1566 } 1567 } 1568 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1569 // match: (Cvt64Fto32F x) 1570 // cond: 1571 // result: (LEDBR x) 1572 for { 1573 x := v.Args[0] 1574 v.reset(OpS390XLEDBR) 1575 v.AddArg(x) 1576 return true 1577 } 1578 } 1579 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1580 // match: (Cvt64Fto64 x) 1581 // cond: 1582 // result: (CGDBRA x) 1583 for { 1584 x := v.Args[0] 1585 v.reset(OpS390XCGDBRA) 1586 v.AddArg(x) 1587 return true 1588 } 1589 } 1590 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1591 // match: (Cvt64to32F x) 1592 // cond: 1593 // result: (CEGBRA x) 1594 for { 1595 x := v.Args[0] 1596 v.reset(OpS390XCEGBRA) 1597 v.AddArg(x) 1598 return true 1599 } 1600 } 1601 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1602 // match: (Cvt64to64F x) 1603 // cond: 1604 // result: (CDGBRA x) 1605 for { 1606 x := v.Args[0] 1607 v.reset(OpS390XCDGBRA) 1608 v.AddArg(x) 1609 return true 1610 } 1611 } 1612 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1613 b := v.Block 1614 _ = b 1615 typ := &b.Func.Config.Types 1616 _ = typ 1617 // match: (Div16 x y) 1618 // cond: 1619 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1620 for { 1621 _ = v.Args[1] 1622 x := v.Args[0] 1623 y := v.Args[1] 1624 v.reset(OpS390XDIVW) 1625 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1626 v0.AddArg(x) 1627 v.AddArg(v0) 1628 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1629 v1.AddArg(y) 1630 v.AddArg(v1) 1631 return true 1632 } 1633 } 1634 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1635 b := v.Block 1636 _ = b 1637 typ := &b.Func.Config.Types 1638 _ = typ 1639 // match: (Div16u x y) 1640 // cond: 1641 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1642 for { 1643 _ = v.Args[1] 1644 x := v.Args[0] 1645 y := v.Args[1] 1646 v.reset(OpS390XDIVWU) 1647 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1648 v0.AddArg(x) 1649 v.AddArg(v0) 1650 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1651 v1.AddArg(y) 1652 v.AddArg(v1) 1653 return true 1654 } 1655 } 1656 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1657 b := v.Block 1658 _ = b 1659 typ := &b.Func.Config.Types 1660 _ = typ 1661 // match: (Div32 x y) 1662 // cond: 1663 // result: (DIVW (MOVWreg x) y) 1664 for { 1665 _ = v.Args[1] 1666 x := v.Args[0] 1667 y := v.Args[1] 1668 v.reset(OpS390XDIVW) 1669 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1670 v0.AddArg(x) 1671 v.AddArg(v0) 1672 v.AddArg(y) 1673 return true 1674 } 1675 } 1676 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1677 // match: (Div32F x y) 1678 // cond: 1679 // result: (FDIVS x y) 1680 for { 1681 _ = v.Args[1] 1682 x := v.Args[0] 1683 y := v.Args[1] 1684 v.reset(OpS390XFDIVS) 1685 v.AddArg(x) 1686 v.AddArg(y) 1687 return true 1688 } 1689 } 1690 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1691 b := v.Block 1692 _ = b 1693 typ := &b.Func.Config.Types 1694 _ = typ 1695 // match: (Div32u x y) 1696 // cond: 1697 // result: (DIVWU (MOVWZreg x) y) 1698 for { 1699 _ = v.Args[1] 1700 x := v.Args[0] 1701 y := v.Args[1] 1702 v.reset(OpS390XDIVWU) 1703 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1704 v0.AddArg(x) 1705 v.AddArg(v0) 1706 v.AddArg(y) 1707 return true 1708 } 1709 } 1710 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1711 // match: (Div64 x y) 1712 // cond: 1713 // result: (DIVD x y) 1714 for { 1715 _ = v.Args[1] 1716 x := v.Args[0] 1717 y := v.Args[1] 1718 v.reset(OpS390XDIVD) 1719 v.AddArg(x) 1720 v.AddArg(y) 1721 return true 1722 } 1723 } 1724 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1725 // match: (Div64F x y) 1726 // cond: 1727 // result: (FDIV x y) 1728 for { 1729 _ = v.Args[1] 1730 x := v.Args[0] 1731 y := v.Args[1] 1732 v.reset(OpS390XFDIV) 1733 v.AddArg(x) 1734 v.AddArg(y) 1735 return true 1736 } 1737 } 1738 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1739 // match: (Div64u x y) 1740 // cond: 1741 // result: (DIVDU x y) 1742 for { 1743 _ = v.Args[1] 1744 x := v.Args[0] 1745 y := v.Args[1] 1746 v.reset(OpS390XDIVDU) 1747 v.AddArg(x) 1748 v.AddArg(y) 1749 return true 1750 } 1751 } 1752 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1753 b := v.Block 1754 _ = b 1755 typ := &b.Func.Config.Types 1756 _ = typ 1757 // match: (Div8 x y) 1758 // cond: 1759 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1760 for { 1761 _ = v.Args[1] 1762 x := v.Args[0] 1763 y := v.Args[1] 1764 v.reset(OpS390XDIVW) 1765 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1766 v0.AddArg(x) 1767 v.AddArg(v0) 1768 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1769 v1.AddArg(y) 1770 v.AddArg(v1) 1771 return true 1772 } 1773 } 1774 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1775 b := v.Block 1776 _ = b 1777 typ := &b.Func.Config.Types 1778 _ = typ 1779 // match: (Div8u x y) 1780 // cond: 1781 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1782 for { 1783 _ = v.Args[1] 1784 x := v.Args[0] 1785 y := v.Args[1] 1786 v.reset(OpS390XDIVWU) 1787 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1788 v0.AddArg(x) 1789 v.AddArg(v0) 1790 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1791 v1.AddArg(y) 1792 v.AddArg(v1) 1793 return true 1794 } 1795 } 1796 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1797 b := v.Block 1798 _ = b 1799 typ := &b.Func.Config.Types 1800 _ = typ 1801 // match: (Eq16 x y) 1802 // cond: 1803 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 1804 for { 1805 _ = v.Args[1] 1806 x := v.Args[0] 1807 y := v.Args[1] 1808 v.reset(OpS390XMOVDEQ) 1809 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1810 v0.AuxInt = 0 1811 v.AddArg(v0) 1812 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1813 v1.AuxInt = 1 1814 v.AddArg(v1) 1815 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1816 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1817 v3.AddArg(x) 1818 v2.AddArg(v3) 1819 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1820 v4.AddArg(y) 1821 v2.AddArg(v4) 1822 v.AddArg(v2) 1823 return true 1824 } 1825 } 1826 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1827 b := v.Block 1828 _ = b 1829 typ := &b.Func.Config.Types 1830 _ = typ 1831 // match: (Eq32 x y) 1832 // cond: 1833 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1834 for { 1835 _ = v.Args[1] 1836 x := v.Args[0] 1837 y := v.Args[1] 1838 v.reset(OpS390XMOVDEQ) 1839 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1840 v0.AuxInt = 0 1841 v.AddArg(v0) 1842 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1843 v1.AuxInt = 1 1844 v.AddArg(v1) 1845 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1846 v2.AddArg(x) 1847 v2.AddArg(y) 1848 v.AddArg(v2) 1849 return true 1850 } 1851 } 1852 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1853 b := v.Block 1854 _ = b 1855 typ := &b.Func.Config.Types 1856 _ = typ 1857 // match: (Eq32F x y) 1858 // cond: 1859 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1860 for { 1861 _ = v.Args[1] 1862 x := v.Args[0] 1863 y := v.Args[1] 1864 v.reset(OpS390XMOVDEQ) 1865 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1866 v0.AuxInt = 0 1867 v.AddArg(v0) 1868 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1869 v1.AuxInt = 1 1870 v.AddArg(v1) 1871 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1872 v2.AddArg(x) 1873 v2.AddArg(y) 1874 v.AddArg(v2) 1875 return true 1876 } 1877 } 1878 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1879 b := v.Block 1880 _ = b 1881 typ := &b.Func.Config.Types 1882 _ = typ 1883 // match: (Eq64 x y) 1884 // cond: 1885 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1886 for { 1887 _ = v.Args[1] 1888 x := v.Args[0] 1889 y := v.Args[1] 1890 v.reset(OpS390XMOVDEQ) 1891 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1892 v0.AuxInt = 0 1893 v.AddArg(v0) 1894 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1895 v1.AuxInt = 1 1896 v.AddArg(v1) 1897 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1898 v2.AddArg(x) 1899 v2.AddArg(y) 1900 v.AddArg(v2) 1901 return true 1902 } 1903 } 1904 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1905 b := v.Block 1906 _ = b 1907 typ := &b.Func.Config.Types 1908 _ = typ 1909 // match: (Eq64F x y) 1910 // cond: 1911 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1912 for { 1913 _ = v.Args[1] 1914 x := v.Args[0] 1915 y := v.Args[1] 1916 v.reset(OpS390XMOVDEQ) 1917 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1918 v0.AuxInt = 0 1919 v.AddArg(v0) 1920 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1921 v1.AuxInt = 1 1922 v.AddArg(v1) 1923 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1924 v2.AddArg(x) 1925 v2.AddArg(y) 1926 v.AddArg(v2) 1927 return true 1928 } 1929 } 1930 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1931 b := v.Block 1932 _ = b 1933 typ := &b.Func.Config.Types 1934 _ = typ 1935 // match: (Eq8 x y) 1936 // cond: 1937 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 1938 for { 1939 _ = v.Args[1] 1940 x := v.Args[0] 1941 y := v.Args[1] 1942 v.reset(OpS390XMOVDEQ) 1943 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1944 v0.AuxInt = 0 1945 v.AddArg(v0) 1946 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1947 v1.AuxInt = 1 1948 v.AddArg(v1) 1949 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1950 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1951 v3.AddArg(x) 1952 v2.AddArg(v3) 1953 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1954 v4.AddArg(y) 1955 v2.AddArg(v4) 1956 v.AddArg(v2) 1957 return true 1958 } 1959 } 1960 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1961 b := v.Block 1962 _ = b 1963 typ := &b.Func.Config.Types 1964 _ = typ 1965 // match: (EqB x y) 1966 // cond: 1967 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 1968 for { 1969 _ = v.Args[1] 1970 x := v.Args[0] 1971 y := v.Args[1] 1972 v.reset(OpS390XMOVDEQ) 1973 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1974 v0.AuxInt = 0 1975 v.AddArg(v0) 1976 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1977 v1.AuxInt = 1 1978 v.AddArg(v1) 1979 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1980 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1981 v3.AddArg(x) 1982 v2.AddArg(v3) 1983 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1984 v4.AddArg(y) 1985 v2.AddArg(v4) 1986 v.AddArg(v2) 1987 return true 1988 } 1989 } 1990 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1991 b := v.Block 1992 _ = b 1993 typ := &b.Func.Config.Types 1994 _ = typ 1995 // match: (EqPtr x y) 1996 // cond: 1997 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1998 for { 1999 _ = v.Args[1] 2000 x := v.Args[0] 2001 y := v.Args[1] 2002 v.reset(OpS390XMOVDEQ) 2003 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2004 v0.AuxInt = 0 2005 v.AddArg(v0) 2006 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2007 v1.AuxInt = 1 2008 v.AddArg(v1) 2009 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2010 v2.AddArg(x) 2011 v2.AddArg(y) 2012 v.AddArg(v2) 2013 return true 2014 } 2015 } 2016 func rewriteValueS390X_OpFloor_0(v *Value) bool { 2017 // match: (Floor x) 2018 // cond: 2019 // result: (FIDBR [7] x) 2020 for { 2021 x := v.Args[0] 2022 v.reset(OpS390XFIDBR) 2023 v.AuxInt = 7 2024 v.AddArg(x) 2025 return true 2026 } 2027 } 2028 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 2029 b := v.Block 2030 _ = b 2031 typ := &b.Func.Config.Types 2032 _ = typ 2033 // match: (Geq16 x y) 2034 // cond: 2035 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2036 for { 2037 _ = v.Args[1] 2038 x := v.Args[0] 2039 y := v.Args[1] 2040 v.reset(OpS390XMOVDGE) 2041 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2042 v0.AuxInt = 0 2043 v.AddArg(v0) 2044 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2045 v1.AuxInt = 1 2046 v.AddArg(v1) 2047 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2048 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2049 v3.AddArg(x) 2050 v2.AddArg(v3) 2051 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2052 v4.AddArg(y) 2053 v2.AddArg(v4) 2054 v.AddArg(v2) 2055 return true 2056 } 2057 } 2058 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 2059 b := v.Block 2060 _ = b 2061 typ := &b.Func.Config.Types 2062 _ = typ 2063 // match: (Geq16U x y) 2064 // cond: 2065 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2066 for { 2067 _ = v.Args[1] 2068 x := v.Args[0] 2069 y := v.Args[1] 2070 v.reset(OpS390XMOVDGE) 2071 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2072 v0.AuxInt = 0 2073 v.AddArg(v0) 2074 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2075 v1.AuxInt = 1 2076 v.AddArg(v1) 2077 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2078 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2079 v3.AddArg(x) 2080 v2.AddArg(v3) 2081 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2082 v4.AddArg(y) 2083 v2.AddArg(v4) 2084 v.AddArg(v2) 2085 return true 2086 } 2087 } 2088 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 2089 b := v.Block 2090 _ = b 2091 typ := &b.Func.Config.Types 2092 _ = typ 2093 // match: (Geq32 x y) 2094 // cond: 2095 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2096 for { 2097 _ = v.Args[1] 2098 x := v.Args[0] 2099 y := v.Args[1] 2100 v.reset(OpS390XMOVDGE) 2101 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2102 v0.AuxInt = 0 2103 v.AddArg(v0) 2104 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2105 v1.AuxInt = 1 2106 v.AddArg(v1) 2107 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2108 v2.AddArg(x) 2109 v2.AddArg(y) 2110 v.AddArg(v2) 2111 return true 2112 } 2113 } 2114 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2115 b := v.Block 2116 _ = b 2117 typ := &b.Func.Config.Types 2118 _ = typ 2119 // match: (Geq32F x y) 2120 // cond: 2121 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2122 for { 2123 _ = v.Args[1] 2124 x := v.Args[0] 2125 y := v.Args[1] 2126 v.reset(OpS390XMOVDGEnoinv) 2127 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2128 v0.AuxInt = 0 2129 v.AddArg(v0) 2130 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2131 v1.AuxInt = 1 2132 v.AddArg(v1) 2133 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2134 v2.AddArg(x) 2135 v2.AddArg(y) 2136 v.AddArg(v2) 2137 return true 2138 } 2139 } 2140 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2141 b := v.Block 2142 _ = b 2143 typ := &b.Func.Config.Types 2144 _ = typ 2145 // match: (Geq32U x y) 2146 // cond: 2147 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2148 for { 2149 _ = v.Args[1] 2150 x := v.Args[0] 2151 y := v.Args[1] 2152 v.reset(OpS390XMOVDGE) 2153 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2154 v0.AuxInt = 0 2155 v.AddArg(v0) 2156 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2157 v1.AuxInt = 1 2158 v.AddArg(v1) 2159 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2160 v2.AddArg(x) 2161 v2.AddArg(y) 2162 v.AddArg(v2) 2163 return true 2164 } 2165 } 2166 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2167 b := v.Block 2168 _ = b 2169 typ := &b.Func.Config.Types 2170 _ = typ 2171 // match: (Geq64 x y) 2172 // cond: 2173 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2174 for { 2175 _ = v.Args[1] 2176 x := v.Args[0] 2177 y := v.Args[1] 2178 v.reset(OpS390XMOVDGE) 2179 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2180 v0.AuxInt = 0 2181 v.AddArg(v0) 2182 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2183 v1.AuxInt = 1 2184 v.AddArg(v1) 2185 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2186 v2.AddArg(x) 2187 v2.AddArg(y) 2188 v.AddArg(v2) 2189 return true 2190 } 2191 } 2192 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2193 b := v.Block 2194 _ = b 2195 typ := &b.Func.Config.Types 2196 _ = typ 2197 // match: (Geq64F x y) 2198 // cond: 2199 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2200 for { 2201 _ = v.Args[1] 2202 x := v.Args[0] 2203 y := v.Args[1] 2204 v.reset(OpS390XMOVDGEnoinv) 2205 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2206 v0.AuxInt = 0 2207 v.AddArg(v0) 2208 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2209 v1.AuxInt = 1 2210 v.AddArg(v1) 2211 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2212 v2.AddArg(x) 2213 v2.AddArg(y) 2214 v.AddArg(v2) 2215 return true 2216 } 2217 } 2218 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2219 b := v.Block 2220 _ = b 2221 typ := &b.Func.Config.Types 2222 _ = typ 2223 // match: (Geq64U x y) 2224 // cond: 2225 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2226 for { 2227 _ = v.Args[1] 2228 x := v.Args[0] 2229 y := v.Args[1] 2230 v.reset(OpS390XMOVDGE) 2231 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2232 v0.AuxInt = 0 2233 v.AddArg(v0) 2234 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2235 v1.AuxInt = 1 2236 v.AddArg(v1) 2237 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2238 v2.AddArg(x) 2239 v2.AddArg(y) 2240 v.AddArg(v2) 2241 return true 2242 } 2243 } 2244 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2245 b := v.Block 2246 _ = b 2247 typ := &b.Func.Config.Types 2248 _ = typ 2249 // match: (Geq8 x y) 2250 // cond: 2251 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 2252 for { 2253 _ = v.Args[1] 2254 x := v.Args[0] 2255 y := v.Args[1] 2256 v.reset(OpS390XMOVDGE) 2257 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2258 v0.AuxInt = 0 2259 v.AddArg(v0) 2260 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2261 v1.AuxInt = 1 2262 v.AddArg(v1) 2263 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2264 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2265 v3.AddArg(x) 2266 v2.AddArg(v3) 2267 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2268 v4.AddArg(y) 2269 v2.AddArg(v4) 2270 v.AddArg(v2) 2271 return true 2272 } 2273 } 2274 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2275 b := v.Block 2276 _ = b 2277 typ := &b.Func.Config.Types 2278 _ = typ 2279 // match: (Geq8U x y) 2280 // cond: 2281 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 2282 for { 2283 _ = v.Args[1] 2284 x := v.Args[0] 2285 y := v.Args[1] 2286 v.reset(OpS390XMOVDGE) 2287 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2288 v0.AuxInt = 0 2289 v.AddArg(v0) 2290 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2291 v1.AuxInt = 1 2292 v.AddArg(v1) 2293 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2294 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2295 v3.AddArg(x) 2296 v2.AddArg(v3) 2297 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2298 v4.AddArg(y) 2299 v2.AddArg(v4) 2300 v.AddArg(v2) 2301 return true 2302 } 2303 } 2304 func rewriteValueS390X_OpGetCallerPC_0(v *Value) bool { 2305 // match: (GetCallerPC) 2306 // cond: 2307 // result: (LoweredGetCallerPC) 2308 for { 2309 v.reset(OpS390XLoweredGetCallerPC) 2310 return true 2311 } 2312 } 2313 func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool { 2314 // match: (GetCallerSP) 2315 // cond: 2316 // result: (LoweredGetCallerSP) 2317 for { 2318 v.reset(OpS390XLoweredGetCallerSP) 2319 return true 2320 } 2321 } 2322 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2323 // match: (GetClosurePtr) 2324 // cond: 2325 // result: (LoweredGetClosurePtr) 2326 for { 2327 v.reset(OpS390XLoweredGetClosurePtr) 2328 return true 2329 } 2330 } 2331 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2332 // match: (GetG mem) 2333 // cond: 2334 // result: (LoweredGetG mem) 2335 for { 2336 mem := v.Args[0] 2337 v.reset(OpS390XLoweredGetG) 2338 v.AddArg(mem) 2339 return true 2340 } 2341 } 2342 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2343 b := v.Block 2344 _ = b 2345 typ := &b.Func.Config.Types 2346 _ = typ 2347 // match: (Greater16 x y) 2348 // cond: 2349 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2350 for { 2351 _ = v.Args[1] 2352 x := v.Args[0] 2353 y := v.Args[1] 2354 v.reset(OpS390XMOVDGT) 2355 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2356 v0.AuxInt = 0 2357 v.AddArg(v0) 2358 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2359 v1.AuxInt = 1 2360 v.AddArg(v1) 2361 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2362 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2363 v3.AddArg(x) 2364 v2.AddArg(v3) 2365 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2366 v4.AddArg(y) 2367 v2.AddArg(v4) 2368 v.AddArg(v2) 2369 return true 2370 } 2371 } 2372 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2373 b := v.Block 2374 _ = b 2375 typ := &b.Func.Config.Types 2376 _ = typ 2377 // match: (Greater16U x y) 2378 // cond: 2379 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2380 for { 2381 _ = v.Args[1] 2382 x := v.Args[0] 2383 y := v.Args[1] 2384 v.reset(OpS390XMOVDGT) 2385 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2386 v0.AuxInt = 0 2387 v.AddArg(v0) 2388 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2389 v1.AuxInt = 1 2390 v.AddArg(v1) 2391 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2392 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2393 v3.AddArg(x) 2394 v2.AddArg(v3) 2395 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2396 v4.AddArg(y) 2397 v2.AddArg(v4) 2398 v.AddArg(v2) 2399 return true 2400 } 2401 } 2402 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2403 b := v.Block 2404 _ = b 2405 typ := &b.Func.Config.Types 2406 _ = typ 2407 // match: (Greater32 x y) 2408 // cond: 2409 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2410 for { 2411 _ = v.Args[1] 2412 x := v.Args[0] 2413 y := v.Args[1] 2414 v.reset(OpS390XMOVDGT) 2415 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2416 v0.AuxInt = 0 2417 v.AddArg(v0) 2418 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2419 v1.AuxInt = 1 2420 v.AddArg(v1) 2421 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2422 v2.AddArg(x) 2423 v2.AddArg(y) 2424 v.AddArg(v2) 2425 return true 2426 } 2427 } 2428 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2429 b := v.Block 2430 _ = b 2431 typ := &b.Func.Config.Types 2432 _ = typ 2433 // match: (Greater32F x y) 2434 // cond: 2435 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2436 for { 2437 _ = v.Args[1] 2438 x := v.Args[0] 2439 y := v.Args[1] 2440 v.reset(OpS390XMOVDGTnoinv) 2441 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2442 v0.AuxInt = 0 2443 v.AddArg(v0) 2444 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2445 v1.AuxInt = 1 2446 v.AddArg(v1) 2447 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2448 v2.AddArg(x) 2449 v2.AddArg(y) 2450 v.AddArg(v2) 2451 return true 2452 } 2453 } 2454 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2455 b := v.Block 2456 _ = b 2457 typ := &b.Func.Config.Types 2458 _ = typ 2459 // match: (Greater32U x y) 2460 // cond: 2461 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2462 for { 2463 _ = v.Args[1] 2464 x := v.Args[0] 2465 y := v.Args[1] 2466 v.reset(OpS390XMOVDGT) 2467 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2468 v0.AuxInt = 0 2469 v.AddArg(v0) 2470 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2471 v1.AuxInt = 1 2472 v.AddArg(v1) 2473 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2474 v2.AddArg(x) 2475 v2.AddArg(y) 2476 v.AddArg(v2) 2477 return true 2478 } 2479 } 2480 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2481 b := v.Block 2482 _ = b 2483 typ := &b.Func.Config.Types 2484 _ = typ 2485 // match: (Greater64 x y) 2486 // cond: 2487 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2488 for { 2489 _ = v.Args[1] 2490 x := v.Args[0] 2491 y := v.Args[1] 2492 v.reset(OpS390XMOVDGT) 2493 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2494 v0.AuxInt = 0 2495 v.AddArg(v0) 2496 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2497 v1.AuxInt = 1 2498 v.AddArg(v1) 2499 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2500 v2.AddArg(x) 2501 v2.AddArg(y) 2502 v.AddArg(v2) 2503 return true 2504 } 2505 } 2506 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2507 b := v.Block 2508 _ = b 2509 typ := &b.Func.Config.Types 2510 _ = typ 2511 // match: (Greater64F x y) 2512 // cond: 2513 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2514 for { 2515 _ = v.Args[1] 2516 x := v.Args[0] 2517 y := v.Args[1] 2518 v.reset(OpS390XMOVDGTnoinv) 2519 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2520 v0.AuxInt = 0 2521 v.AddArg(v0) 2522 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2523 v1.AuxInt = 1 2524 v.AddArg(v1) 2525 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2526 v2.AddArg(x) 2527 v2.AddArg(y) 2528 v.AddArg(v2) 2529 return true 2530 } 2531 } 2532 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2533 b := v.Block 2534 _ = b 2535 typ := &b.Func.Config.Types 2536 _ = typ 2537 // match: (Greater64U x y) 2538 // cond: 2539 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2540 for { 2541 _ = v.Args[1] 2542 x := v.Args[0] 2543 y := v.Args[1] 2544 v.reset(OpS390XMOVDGT) 2545 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2546 v0.AuxInt = 0 2547 v.AddArg(v0) 2548 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2549 v1.AuxInt = 1 2550 v.AddArg(v1) 2551 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2552 v2.AddArg(x) 2553 v2.AddArg(y) 2554 v.AddArg(v2) 2555 return true 2556 } 2557 } 2558 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2559 b := v.Block 2560 _ = b 2561 typ := &b.Func.Config.Types 2562 _ = typ 2563 // match: (Greater8 x y) 2564 // cond: 2565 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 2566 for { 2567 _ = v.Args[1] 2568 x := v.Args[0] 2569 y := v.Args[1] 2570 v.reset(OpS390XMOVDGT) 2571 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2572 v0.AuxInt = 0 2573 v.AddArg(v0) 2574 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2575 v1.AuxInt = 1 2576 v.AddArg(v1) 2577 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2578 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2579 v3.AddArg(x) 2580 v2.AddArg(v3) 2581 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2582 v4.AddArg(y) 2583 v2.AddArg(v4) 2584 v.AddArg(v2) 2585 return true 2586 } 2587 } 2588 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2589 b := v.Block 2590 _ = b 2591 typ := &b.Func.Config.Types 2592 _ = typ 2593 // match: (Greater8U x y) 2594 // cond: 2595 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 2596 for { 2597 _ = v.Args[1] 2598 x := v.Args[0] 2599 y := v.Args[1] 2600 v.reset(OpS390XMOVDGT) 2601 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2602 v0.AuxInt = 0 2603 v.AddArg(v0) 2604 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2605 v1.AuxInt = 1 2606 v.AddArg(v1) 2607 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2608 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2609 v3.AddArg(x) 2610 v2.AddArg(v3) 2611 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2612 v4.AddArg(y) 2613 v2.AddArg(v4) 2614 v.AddArg(v2) 2615 return true 2616 } 2617 } 2618 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2619 b := v.Block 2620 _ = b 2621 typ := &b.Func.Config.Types 2622 _ = typ 2623 // match: (Hmul32 x y) 2624 // cond: 2625 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2626 for { 2627 _ = v.Args[1] 2628 x := v.Args[0] 2629 y := v.Args[1] 2630 v.reset(OpS390XSRDconst) 2631 v.AuxInt = 32 2632 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2633 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2634 v1.AddArg(x) 2635 v0.AddArg(v1) 2636 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2637 v2.AddArg(y) 2638 v0.AddArg(v2) 2639 v.AddArg(v0) 2640 return true 2641 } 2642 } 2643 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2644 b := v.Block 2645 _ = b 2646 typ := &b.Func.Config.Types 2647 _ = typ 2648 // match: (Hmul32u x y) 2649 // cond: 2650 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2651 for { 2652 _ = v.Args[1] 2653 x := v.Args[0] 2654 y := v.Args[1] 2655 v.reset(OpS390XSRDconst) 2656 v.AuxInt = 32 2657 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2658 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2659 v1.AddArg(x) 2660 v0.AddArg(v1) 2661 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2662 v2.AddArg(y) 2663 v0.AddArg(v2) 2664 v.AddArg(v0) 2665 return true 2666 } 2667 } 2668 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2669 // match: (Hmul64 x y) 2670 // cond: 2671 // result: (MULHD x y) 2672 for { 2673 _ = v.Args[1] 2674 x := v.Args[0] 2675 y := v.Args[1] 2676 v.reset(OpS390XMULHD) 2677 v.AddArg(x) 2678 v.AddArg(y) 2679 return true 2680 } 2681 } 2682 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2683 // match: (Hmul64u x y) 2684 // cond: 2685 // result: (MULHDU x y) 2686 for { 2687 _ = v.Args[1] 2688 x := v.Args[0] 2689 y := v.Args[1] 2690 v.reset(OpS390XMULHDU) 2691 v.AddArg(x) 2692 v.AddArg(y) 2693 return true 2694 } 2695 } 2696 func rewriteValueS390X_OpITab_0(v *Value) bool { 2697 // match: (ITab (Load ptr mem)) 2698 // cond: 2699 // result: (MOVDload ptr mem) 2700 for { 2701 v_0 := v.Args[0] 2702 if v_0.Op != OpLoad { 2703 break 2704 } 2705 _ = v_0.Args[1] 2706 ptr := v_0.Args[0] 2707 mem := v_0.Args[1] 2708 v.reset(OpS390XMOVDload) 2709 v.AddArg(ptr) 2710 v.AddArg(mem) 2711 return true 2712 } 2713 return false 2714 } 2715 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2716 // match: (InterCall [argwid] entry mem) 2717 // cond: 2718 // result: (CALLinter [argwid] entry mem) 2719 for { 2720 argwid := v.AuxInt 2721 _ = v.Args[1] 2722 entry := v.Args[0] 2723 mem := v.Args[1] 2724 v.reset(OpS390XCALLinter) 2725 v.AuxInt = argwid 2726 v.AddArg(entry) 2727 v.AddArg(mem) 2728 return true 2729 } 2730 } 2731 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2732 b := v.Block 2733 _ = b 2734 typ := &b.Func.Config.Types 2735 _ = typ 2736 // match: (IsInBounds idx len) 2737 // cond: 2738 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2739 for { 2740 _ = v.Args[1] 2741 idx := v.Args[0] 2742 len := v.Args[1] 2743 v.reset(OpS390XMOVDLT) 2744 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2745 v0.AuxInt = 0 2746 v.AddArg(v0) 2747 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2748 v1.AuxInt = 1 2749 v.AddArg(v1) 2750 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2751 v2.AddArg(idx) 2752 v2.AddArg(len) 2753 v.AddArg(v2) 2754 return true 2755 } 2756 } 2757 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2758 b := v.Block 2759 _ = b 2760 typ := &b.Func.Config.Types 2761 _ = typ 2762 // match: (IsNonNil p) 2763 // cond: 2764 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2765 for { 2766 p := v.Args[0] 2767 v.reset(OpS390XMOVDNE) 2768 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2769 v0.AuxInt = 0 2770 v.AddArg(v0) 2771 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2772 v1.AuxInt = 1 2773 v.AddArg(v1) 2774 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2775 v2.AuxInt = 0 2776 v2.AddArg(p) 2777 v.AddArg(v2) 2778 return true 2779 } 2780 } 2781 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2782 b := v.Block 2783 _ = b 2784 typ := &b.Func.Config.Types 2785 _ = typ 2786 // match: (IsSliceInBounds idx len) 2787 // cond: 2788 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2789 for { 2790 _ = v.Args[1] 2791 idx := v.Args[0] 2792 len := v.Args[1] 2793 v.reset(OpS390XMOVDLE) 2794 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2795 v0.AuxInt = 0 2796 v.AddArg(v0) 2797 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2798 v1.AuxInt = 1 2799 v.AddArg(v1) 2800 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2801 v2.AddArg(idx) 2802 v2.AddArg(len) 2803 v.AddArg(v2) 2804 return true 2805 } 2806 } 2807 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2808 b := v.Block 2809 _ = b 2810 typ := &b.Func.Config.Types 2811 _ = typ 2812 // match: (Leq16 x y) 2813 // cond: 2814 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 2815 for { 2816 _ = v.Args[1] 2817 x := v.Args[0] 2818 y := v.Args[1] 2819 v.reset(OpS390XMOVDLE) 2820 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2821 v0.AuxInt = 0 2822 v.AddArg(v0) 2823 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2824 v1.AuxInt = 1 2825 v.AddArg(v1) 2826 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2827 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2828 v3.AddArg(x) 2829 v2.AddArg(v3) 2830 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2831 v4.AddArg(y) 2832 v2.AddArg(v4) 2833 v.AddArg(v2) 2834 return true 2835 } 2836 } 2837 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2838 b := v.Block 2839 _ = b 2840 typ := &b.Func.Config.Types 2841 _ = typ 2842 // match: (Leq16U x y) 2843 // cond: 2844 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 2845 for { 2846 _ = v.Args[1] 2847 x := v.Args[0] 2848 y := v.Args[1] 2849 v.reset(OpS390XMOVDLE) 2850 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2851 v0.AuxInt = 0 2852 v.AddArg(v0) 2853 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2854 v1.AuxInt = 1 2855 v.AddArg(v1) 2856 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2857 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2858 v3.AddArg(x) 2859 v2.AddArg(v3) 2860 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2861 v4.AddArg(y) 2862 v2.AddArg(v4) 2863 v.AddArg(v2) 2864 return true 2865 } 2866 } 2867 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2868 b := v.Block 2869 _ = b 2870 typ := &b.Func.Config.Types 2871 _ = typ 2872 // match: (Leq32 x y) 2873 // cond: 2874 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2875 for { 2876 _ = v.Args[1] 2877 x := v.Args[0] 2878 y := v.Args[1] 2879 v.reset(OpS390XMOVDLE) 2880 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2881 v0.AuxInt = 0 2882 v.AddArg(v0) 2883 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2884 v1.AuxInt = 1 2885 v.AddArg(v1) 2886 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2887 v2.AddArg(x) 2888 v2.AddArg(y) 2889 v.AddArg(v2) 2890 return true 2891 } 2892 } 2893 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2894 b := v.Block 2895 _ = b 2896 typ := &b.Func.Config.Types 2897 _ = typ 2898 // match: (Leq32F x y) 2899 // cond: 2900 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2901 for { 2902 _ = v.Args[1] 2903 x := v.Args[0] 2904 y := v.Args[1] 2905 v.reset(OpS390XMOVDGEnoinv) 2906 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2907 v0.AuxInt = 0 2908 v.AddArg(v0) 2909 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2910 v1.AuxInt = 1 2911 v.AddArg(v1) 2912 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2913 v2.AddArg(y) 2914 v2.AddArg(x) 2915 v.AddArg(v2) 2916 return true 2917 } 2918 } 2919 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2920 b := v.Block 2921 _ = b 2922 typ := &b.Func.Config.Types 2923 _ = typ 2924 // match: (Leq32U x y) 2925 // cond: 2926 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2927 for { 2928 _ = v.Args[1] 2929 x := v.Args[0] 2930 y := v.Args[1] 2931 v.reset(OpS390XMOVDLE) 2932 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2933 v0.AuxInt = 0 2934 v.AddArg(v0) 2935 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2936 v1.AuxInt = 1 2937 v.AddArg(v1) 2938 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2939 v2.AddArg(x) 2940 v2.AddArg(y) 2941 v.AddArg(v2) 2942 return true 2943 } 2944 } 2945 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2946 b := v.Block 2947 _ = b 2948 typ := &b.Func.Config.Types 2949 _ = typ 2950 // match: (Leq64 x y) 2951 // cond: 2952 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2953 for { 2954 _ = v.Args[1] 2955 x := v.Args[0] 2956 y := v.Args[1] 2957 v.reset(OpS390XMOVDLE) 2958 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2959 v0.AuxInt = 0 2960 v.AddArg(v0) 2961 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2962 v1.AuxInt = 1 2963 v.AddArg(v1) 2964 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2965 v2.AddArg(x) 2966 v2.AddArg(y) 2967 v.AddArg(v2) 2968 return true 2969 } 2970 } 2971 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2972 b := v.Block 2973 _ = b 2974 typ := &b.Func.Config.Types 2975 _ = typ 2976 // match: (Leq64F x y) 2977 // cond: 2978 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2979 for { 2980 _ = v.Args[1] 2981 x := v.Args[0] 2982 y := v.Args[1] 2983 v.reset(OpS390XMOVDGEnoinv) 2984 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2985 v0.AuxInt = 0 2986 v.AddArg(v0) 2987 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2988 v1.AuxInt = 1 2989 v.AddArg(v1) 2990 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2991 v2.AddArg(y) 2992 v2.AddArg(x) 2993 v.AddArg(v2) 2994 return true 2995 } 2996 } 2997 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2998 b := v.Block 2999 _ = b 3000 typ := &b.Func.Config.Types 3001 _ = typ 3002 // match: (Leq64U x y) 3003 // cond: 3004 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3005 for { 3006 _ = v.Args[1] 3007 x := v.Args[0] 3008 y := v.Args[1] 3009 v.reset(OpS390XMOVDLE) 3010 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3011 v0.AuxInt = 0 3012 v.AddArg(v0) 3013 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3014 v1.AuxInt = 1 3015 v.AddArg(v1) 3016 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3017 v2.AddArg(x) 3018 v2.AddArg(y) 3019 v.AddArg(v2) 3020 return true 3021 } 3022 } 3023 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 3024 b := v.Block 3025 _ = b 3026 typ := &b.Func.Config.Types 3027 _ = typ 3028 // match: (Leq8 x y) 3029 // cond: 3030 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 3031 for { 3032 _ = v.Args[1] 3033 x := v.Args[0] 3034 y := v.Args[1] 3035 v.reset(OpS390XMOVDLE) 3036 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3037 v0.AuxInt = 0 3038 v.AddArg(v0) 3039 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3040 v1.AuxInt = 1 3041 v.AddArg(v1) 3042 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3043 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3044 v3.AddArg(x) 3045 v2.AddArg(v3) 3046 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3047 v4.AddArg(y) 3048 v2.AddArg(v4) 3049 v.AddArg(v2) 3050 return true 3051 } 3052 } 3053 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 3054 b := v.Block 3055 _ = b 3056 typ := &b.Func.Config.Types 3057 _ = typ 3058 // match: (Leq8U x y) 3059 // cond: 3060 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 3061 for { 3062 _ = v.Args[1] 3063 x := v.Args[0] 3064 y := v.Args[1] 3065 v.reset(OpS390XMOVDLE) 3066 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3067 v0.AuxInt = 0 3068 v.AddArg(v0) 3069 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3070 v1.AuxInt = 1 3071 v.AddArg(v1) 3072 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3073 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3074 v3.AddArg(x) 3075 v2.AddArg(v3) 3076 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3077 v4.AddArg(y) 3078 v2.AddArg(v4) 3079 v.AddArg(v2) 3080 return true 3081 } 3082 } 3083 func rewriteValueS390X_OpLess16_0(v *Value) bool { 3084 b := v.Block 3085 _ = b 3086 typ := &b.Func.Config.Types 3087 _ = typ 3088 // match: (Less16 x y) 3089 // cond: 3090 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 3091 for { 3092 _ = v.Args[1] 3093 x := v.Args[0] 3094 y := v.Args[1] 3095 v.reset(OpS390XMOVDLT) 3096 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3097 v0.AuxInt = 0 3098 v.AddArg(v0) 3099 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3100 v1.AuxInt = 1 3101 v.AddArg(v1) 3102 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3103 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3104 v3.AddArg(x) 3105 v2.AddArg(v3) 3106 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3107 v4.AddArg(y) 3108 v2.AddArg(v4) 3109 v.AddArg(v2) 3110 return true 3111 } 3112 } 3113 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 3114 b := v.Block 3115 _ = b 3116 typ := &b.Func.Config.Types 3117 _ = typ 3118 // match: (Less16U x y) 3119 // cond: 3120 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) 3121 for { 3122 _ = v.Args[1] 3123 x := v.Args[0] 3124 y := v.Args[1] 3125 v.reset(OpS390XMOVDLT) 3126 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3127 v0.AuxInt = 0 3128 v.AddArg(v0) 3129 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3130 v1.AuxInt = 1 3131 v.AddArg(v1) 3132 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3133 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3134 v3.AddArg(x) 3135 v2.AddArg(v3) 3136 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3137 v4.AddArg(y) 3138 v2.AddArg(v4) 3139 v.AddArg(v2) 3140 return true 3141 } 3142 } 3143 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3144 b := v.Block 3145 _ = b 3146 typ := &b.Func.Config.Types 3147 _ = typ 3148 // match: (Less32 x y) 3149 // cond: 3150 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3151 for { 3152 _ = v.Args[1] 3153 x := v.Args[0] 3154 y := v.Args[1] 3155 v.reset(OpS390XMOVDLT) 3156 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3157 v0.AuxInt = 0 3158 v.AddArg(v0) 3159 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3160 v1.AuxInt = 1 3161 v.AddArg(v1) 3162 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3163 v2.AddArg(x) 3164 v2.AddArg(y) 3165 v.AddArg(v2) 3166 return true 3167 } 3168 } 3169 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3170 b := v.Block 3171 _ = b 3172 typ := &b.Func.Config.Types 3173 _ = typ 3174 // match: (Less32F x y) 3175 // cond: 3176 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3177 for { 3178 _ = v.Args[1] 3179 x := v.Args[0] 3180 y := v.Args[1] 3181 v.reset(OpS390XMOVDGTnoinv) 3182 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3183 v0.AuxInt = 0 3184 v.AddArg(v0) 3185 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3186 v1.AuxInt = 1 3187 v.AddArg(v1) 3188 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3189 v2.AddArg(y) 3190 v2.AddArg(x) 3191 v.AddArg(v2) 3192 return true 3193 } 3194 } 3195 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3196 b := v.Block 3197 _ = b 3198 typ := &b.Func.Config.Types 3199 _ = typ 3200 // match: (Less32U x y) 3201 // cond: 3202 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3203 for { 3204 _ = v.Args[1] 3205 x := v.Args[0] 3206 y := v.Args[1] 3207 v.reset(OpS390XMOVDLT) 3208 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3209 v0.AuxInt = 0 3210 v.AddArg(v0) 3211 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3212 v1.AuxInt = 1 3213 v.AddArg(v1) 3214 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3215 v2.AddArg(x) 3216 v2.AddArg(y) 3217 v.AddArg(v2) 3218 return true 3219 } 3220 } 3221 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3222 b := v.Block 3223 _ = b 3224 typ := &b.Func.Config.Types 3225 _ = typ 3226 // match: (Less64 x y) 3227 // cond: 3228 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3229 for { 3230 _ = v.Args[1] 3231 x := v.Args[0] 3232 y := v.Args[1] 3233 v.reset(OpS390XMOVDLT) 3234 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3235 v0.AuxInt = 0 3236 v.AddArg(v0) 3237 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3238 v1.AuxInt = 1 3239 v.AddArg(v1) 3240 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3241 v2.AddArg(x) 3242 v2.AddArg(y) 3243 v.AddArg(v2) 3244 return true 3245 } 3246 } 3247 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3248 b := v.Block 3249 _ = b 3250 typ := &b.Func.Config.Types 3251 _ = typ 3252 // match: (Less64F x y) 3253 // cond: 3254 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3255 for { 3256 _ = v.Args[1] 3257 x := v.Args[0] 3258 y := v.Args[1] 3259 v.reset(OpS390XMOVDGTnoinv) 3260 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3261 v0.AuxInt = 0 3262 v.AddArg(v0) 3263 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3264 v1.AuxInt = 1 3265 v.AddArg(v1) 3266 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3267 v2.AddArg(y) 3268 v2.AddArg(x) 3269 v.AddArg(v2) 3270 return true 3271 } 3272 } 3273 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3274 b := v.Block 3275 _ = b 3276 typ := &b.Func.Config.Types 3277 _ = typ 3278 // match: (Less64U x y) 3279 // cond: 3280 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3281 for { 3282 _ = v.Args[1] 3283 x := v.Args[0] 3284 y := v.Args[1] 3285 v.reset(OpS390XMOVDLT) 3286 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3287 v0.AuxInt = 0 3288 v.AddArg(v0) 3289 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3290 v1.AuxInt = 1 3291 v.AddArg(v1) 3292 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3293 v2.AddArg(x) 3294 v2.AddArg(y) 3295 v.AddArg(v2) 3296 return true 3297 } 3298 } 3299 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3300 b := v.Block 3301 _ = b 3302 typ := &b.Func.Config.Types 3303 _ = typ 3304 // match: (Less8 x y) 3305 // cond: 3306 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 3307 for { 3308 _ = v.Args[1] 3309 x := v.Args[0] 3310 y := v.Args[1] 3311 v.reset(OpS390XMOVDLT) 3312 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3313 v0.AuxInt = 0 3314 v.AddArg(v0) 3315 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3316 v1.AuxInt = 1 3317 v.AddArg(v1) 3318 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3319 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3320 v3.AddArg(x) 3321 v2.AddArg(v3) 3322 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3323 v4.AddArg(y) 3324 v2.AddArg(v4) 3325 v.AddArg(v2) 3326 return true 3327 } 3328 } 3329 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3330 b := v.Block 3331 _ = b 3332 typ := &b.Func.Config.Types 3333 _ = typ 3334 // match: (Less8U x y) 3335 // cond: 3336 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) 3337 for { 3338 _ = v.Args[1] 3339 x := v.Args[0] 3340 y := v.Args[1] 3341 v.reset(OpS390XMOVDLT) 3342 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3343 v0.AuxInt = 0 3344 v.AddArg(v0) 3345 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3346 v1.AuxInt = 1 3347 v.AddArg(v1) 3348 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3349 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3350 v3.AddArg(x) 3351 v2.AddArg(v3) 3352 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3353 v4.AddArg(y) 3354 v2.AddArg(v4) 3355 v.AddArg(v2) 3356 return true 3357 } 3358 } 3359 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3360 // match: (Load <t> ptr mem) 3361 // cond: (is64BitInt(t) || isPtr(t)) 3362 // result: (MOVDload ptr mem) 3363 for { 3364 t := v.Type 3365 _ = v.Args[1] 3366 ptr := v.Args[0] 3367 mem := v.Args[1] 3368 if !(is64BitInt(t) || isPtr(t)) { 3369 break 3370 } 3371 v.reset(OpS390XMOVDload) 3372 v.AddArg(ptr) 3373 v.AddArg(mem) 3374 return true 3375 } 3376 // match: (Load <t> ptr mem) 3377 // cond: is32BitInt(t) && isSigned(t) 3378 // result: (MOVWload ptr mem) 3379 for { 3380 t := v.Type 3381 _ = v.Args[1] 3382 ptr := v.Args[0] 3383 mem := v.Args[1] 3384 if !(is32BitInt(t) && isSigned(t)) { 3385 break 3386 } 3387 v.reset(OpS390XMOVWload) 3388 v.AddArg(ptr) 3389 v.AddArg(mem) 3390 return true 3391 } 3392 // match: (Load <t> ptr mem) 3393 // cond: is32BitInt(t) && !isSigned(t) 3394 // result: (MOVWZload ptr mem) 3395 for { 3396 t := v.Type 3397 _ = v.Args[1] 3398 ptr := v.Args[0] 3399 mem := v.Args[1] 3400 if !(is32BitInt(t) && !isSigned(t)) { 3401 break 3402 } 3403 v.reset(OpS390XMOVWZload) 3404 v.AddArg(ptr) 3405 v.AddArg(mem) 3406 return true 3407 } 3408 // match: (Load <t> ptr mem) 3409 // cond: is16BitInt(t) && isSigned(t) 3410 // result: (MOVHload ptr mem) 3411 for { 3412 t := v.Type 3413 _ = v.Args[1] 3414 ptr := v.Args[0] 3415 mem := v.Args[1] 3416 if !(is16BitInt(t) && isSigned(t)) { 3417 break 3418 } 3419 v.reset(OpS390XMOVHload) 3420 v.AddArg(ptr) 3421 v.AddArg(mem) 3422 return true 3423 } 3424 // match: (Load <t> ptr mem) 3425 // cond: is16BitInt(t) && !isSigned(t) 3426 // result: (MOVHZload ptr mem) 3427 for { 3428 t := v.Type 3429 _ = v.Args[1] 3430 ptr := v.Args[0] 3431 mem := v.Args[1] 3432 if !(is16BitInt(t) && !isSigned(t)) { 3433 break 3434 } 3435 v.reset(OpS390XMOVHZload) 3436 v.AddArg(ptr) 3437 v.AddArg(mem) 3438 return true 3439 } 3440 // match: (Load <t> ptr mem) 3441 // cond: is8BitInt(t) && isSigned(t) 3442 // result: (MOVBload ptr mem) 3443 for { 3444 t := v.Type 3445 _ = v.Args[1] 3446 ptr := v.Args[0] 3447 mem := v.Args[1] 3448 if !(is8BitInt(t) && isSigned(t)) { 3449 break 3450 } 3451 v.reset(OpS390XMOVBload) 3452 v.AddArg(ptr) 3453 v.AddArg(mem) 3454 return true 3455 } 3456 // match: (Load <t> ptr mem) 3457 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3458 // result: (MOVBZload ptr mem) 3459 for { 3460 t := v.Type 3461 _ = v.Args[1] 3462 ptr := v.Args[0] 3463 mem := v.Args[1] 3464 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3465 break 3466 } 3467 v.reset(OpS390XMOVBZload) 3468 v.AddArg(ptr) 3469 v.AddArg(mem) 3470 return true 3471 } 3472 // match: (Load <t> ptr mem) 3473 // cond: is32BitFloat(t) 3474 // result: (FMOVSload ptr mem) 3475 for { 3476 t := v.Type 3477 _ = v.Args[1] 3478 ptr := v.Args[0] 3479 mem := v.Args[1] 3480 if !(is32BitFloat(t)) { 3481 break 3482 } 3483 v.reset(OpS390XFMOVSload) 3484 v.AddArg(ptr) 3485 v.AddArg(mem) 3486 return true 3487 } 3488 // match: (Load <t> ptr mem) 3489 // cond: is64BitFloat(t) 3490 // result: (FMOVDload ptr mem) 3491 for { 3492 t := v.Type 3493 _ = v.Args[1] 3494 ptr := v.Args[0] 3495 mem := v.Args[1] 3496 if !(is64BitFloat(t)) { 3497 break 3498 } 3499 v.reset(OpS390XFMOVDload) 3500 v.AddArg(ptr) 3501 v.AddArg(mem) 3502 return true 3503 } 3504 return false 3505 } 3506 func rewriteValueS390X_OpLocalAddr_0(v *Value) bool { 3507 // match: (LocalAddr {sym} base _) 3508 // cond: 3509 // result: (MOVDaddr {sym} base) 3510 for { 3511 sym := v.Aux 3512 _ = v.Args[1] 3513 base := v.Args[0] 3514 v.reset(OpS390XMOVDaddr) 3515 v.Aux = sym 3516 v.AddArg(base) 3517 return true 3518 } 3519 } 3520 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3521 b := v.Block 3522 _ = b 3523 typ := &b.Func.Config.Types 3524 _ = typ 3525 // match: (Lsh16x16 x y) 3526 // cond: shiftIsBounded(v) 3527 // result: (SLW x y) 3528 for { 3529 _ = v.Args[1] 3530 x := v.Args[0] 3531 y := v.Args[1] 3532 if !(shiftIsBounded(v)) { 3533 break 3534 } 3535 v.reset(OpS390XSLW) 3536 v.AddArg(x) 3537 v.AddArg(y) 3538 return true 3539 } 3540 // match: (Lsh16x16 <t> x y) 3541 // cond: 3542 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3543 for { 3544 t := v.Type 3545 _ = v.Args[1] 3546 x := v.Args[0] 3547 y := v.Args[1] 3548 v.reset(OpS390XMOVDGE) 3549 v.Type = t 3550 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3551 v0.AddArg(x) 3552 v0.AddArg(y) 3553 v.AddArg(v0) 3554 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3555 v1.AuxInt = 0 3556 v.AddArg(v1) 3557 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3558 v2.AuxInt = 64 3559 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3560 v3.AddArg(y) 3561 v2.AddArg(v3) 3562 v.AddArg(v2) 3563 return true 3564 } 3565 } 3566 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3567 b := v.Block 3568 _ = b 3569 typ := &b.Func.Config.Types 3570 _ = typ 3571 // match: (Lsh16x32 x y) 3572 // cond: shiftIsBounded(v) 3573 // result: (SLW x y) 3574 for { 3575 _ = v.Args[1] 3576 x := v.Args[0] 3577 y := v.Args[1] 3578 if !(shiftIsBounded(v)) { 3579 break 3580 } 3581 v.reset(OpS390XSLW) 3582 v.AddArg(x) 3583 v.AddArg(y) 3584 return true 3585 } 3586 // match: (Lsh16x32 <t> x y) 3587 // cond: 3588 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3589 for { 3590 t := v.Type 3591 _ = v.Args[1] 3592 x := v.Args[0] 3593 y := v.Args[1] 3594 v.reset(OpS390XMOVDGE) 3595 v.Type = t 3596 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3597 v0.AddArg(x) 3598 v0.AddArg(y) 3599 v.AddArg(v0) 3600 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3601 v1.AuxInt = 0 3602 v.AddArg(v1) 3603 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3604 v2.AuxInt = 64 3605 v2.AddArg(y) 3606 v.AddArg(v2) 3607 return true 3608 } 3609 } 3610 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3611 b := v.Block 3612 _ = b 3613 typ := &b.Func.Config.Types 3614 _ = typ 3615 // match: (Lsh16x64 x y) 3616 // cond: shiftIsBounded(v) 3617 // result: (SLW x y) 3618 for { 3619 _ = v.Args[1] 3620 x := v.Args[0] 3621 y := v.Args[1] 3622 if !(shiftIsBounded(v)) { 3623 break 3624 } 3625 v.reset(OpS390XSLW) 3626 v.AddArg(x) 3627 v.AddArg(y) 3628 return true 3629 } 3630 // match: (Lsh16x64 <t> x y) 3631 // cond: 3632 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3633 for { 3634 t := v.Type 3635 _ = v.Args[1] 3636 x := v.Args[0] 3637 y := v.Args[1] 3638 v.reset(OpS390XMOVDGE) 3639 v.Type = t 3640 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3641 v0.AddArg(x) 3642 v0.AddArg(y) 3643 v.AddArg(v0) 3644 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3645 v1.AuxInt = 0 3646 v.AddArg(v1) 3647 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3648 v2.AuxInt = 64 3649 v2.AddArg(y) 3650 v.AddArg(v2) 3651 return true 3652 } 3653 } 3654 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3655 b := v.Block 3656 _ = b 3657 typ := &b.Func.Config.Types 3658 _ = typ 3659 // match: (Lsh16x8 x y) 3660 // cond: shiftIsBounded(v) 3661 // result: (SLW x y) 3662 for { 3663 _ = v.Args[1] 3664 x := v.Args[0] 3665 y := v.Args[1] 3666 if !(shiftIsBounded(v)) { 3667 break 3668 } 3669 v.reset(OpS390XSLW) 3670 v.AddArg(x) 3671 v.AddArg(y) 3672 return true 3673 } 3674 // match: (Lsh16x8 <t> x y) 3675 // cond: 3676 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 3677 for { 3678 t := v.Type 3679 _ = v.Args[1] 3680 x := v.Args[0] 3681 y := v.Args[1] 3682 v.reset(OpS390XMOVDGE) 3683 v.Type = t 3684 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3685 v0.AddArg(x) 3686 v0.AddArg(y) 3687 v.AddArg(v0) 3688 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3689 v1.AuxInt = 0 3690 v.AddArg(v1) 3691 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3692 v2.AuxInt = 64 3693 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3694 v3.AddArg(y) 3695 v2.AddArg(v3) 3696 v.AddArg(v2) 3697 return true 3698 } 3699 } 3700 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3701 b := v.Block 3702 _ = b 3703 typ := &b.Func.Config.Types 3704 _ = typ 3705 // match: (Lsh32x16 x y) 3706 // cond: shiftIsBounded(v) 3707 // result: (SLW x y) 3708 for { 3709 _ = v.Args[1] 3710 x := v.Args[0] 3711 y := v.Args[1] 3712 if !(shiftIsBounded(v)) { 3713 break 3714 } 3715 v.reset(OpS390XSLW) 3716 v.AddArg(x) 3717 v.AddArg(y) 3718 return true 3719 } 3720 // match: (Lsh32x16 <t> x y) 3721 // cond: 3722 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3723 for { 3724 t := v.Type 3725 _ = v.Args[1] 3726 x := v.Args[0] 3727 y := v.Args[1] 3728 v.reset(OpS390XMOVDGE) 3729 v.Type = t 3730 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3731 v0.AddArg(x) 3732 v0.AddArg(y) 3733 v.AddArg(v0) 3734 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3735 v1.AuxInt = 0 3736 v.AddArg(v1) 3737 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3738 v2.AuxInt = 64 3739 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3740 v3.AddArg(y) 3741 v2.AddArg(v3) 3742 v.AddArg(v2) 3743 return true 3744 } 3745 } 3746 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3747 b := v.Block 3748 _ = b 3749 typ := &b.Func.Config.Types 3750 _ = typ 3751 // match: (Lsh32x32 x y) 3752 // cond: shiftIsBounded(v) 3753 // result: (SLW x y) 3754 for { 3755 _ = v.Args[1] 3756 x := v.Args[0] 3757 y := v.Args[1] 3758 if !(shiftIsBounded(v)) { 3759 break 3760 } 3761 v.reset(OpS390XSLW) 3762 v.AddArg(x) 3763 v.AddArg(y) 3764 return true 3765 } 3766 // match: (Lsh32x32 <t> x y) 3767 // cond: 3768 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3769 for { 3770 t := v.Type 3771 _ = v.Args[1] 3772 x := v.Args[0] 3773 y := v.Args[1] 3774 v.reset(OpS390XMOVDGE) 3775 v.Type = t 3776 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3777 v0.AddArg(x) 3778 v0.AddArg(y) 3779 v.AddArg(v0) 3780 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3781 v1.AuxInt = 0 3782 v.AddArg(v1) 3783 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3784 v2.AuxInt = 64 3785 v2.AddArg(y) 3786 v.AddArg(v2) 3787 return true 3788 } 3789 } 3790 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3791 b := v.Block 3792 _ = b 3793 typ := &b.Func.Config.Types 3794 _ = typ 3795 // match: (Lsh32x64 x y) 3796 // cond: shiftIsBounded(v) 3797 // result: (SLW x y) 3798 for { 3799 _ = v.Args[1] 3800 x := v.Args[0] 3801 y := v.Args[1] 3802 if !(shiftIsBounded(v)) { 3803 break 3804 } 3805 v.reset(OpS390XSLW) 3806 v.AddArg(x) 3807 v.AddArg(y) 3808 return true 3809 } 3810 // match: (Lsh32x64 <t> x y) 3811 // cond: 3812 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3813 for { 3814 t := v.Type 3815 _ = v.Args[1] 3816 x := v.Args[0] 3817 y := v.Args[1] 3818 v.reset(OpS390XMOVDGE) 3819 v.Type = t 3820 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3821 v0.AddArg(x) 3822 v0.AddArg(y) 3823 v.AddArg(v0) 3824 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3825 v1.AuxInt = 0 3826 v.AddArg(v1) 3827 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3828 v2.AuxInt = 64 3829 v2.AddArg(y) 3830 v.AddArg(v2) 3831 return true 3832 } 3833 } 3834 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3835 b := v.Block 3836 _ = b 3837 typ := &b.Func.Config.Types 3838 _ = typ 3839 // match: (Lsh32x8 x y) 3840 // cond: shiftIsBounded(v) 3841 // result: (SLW x y) 3842 for { 3843 _ = v.Args[1] 3844 x := v.Args[0] 3845 y := v.Args[1] 3846 if !(shiftIsBounded(v)) { 3847 break 3848 } 3849 v.reset(OpS390XSLW) 3850 v.AddArg(x) 3851 v.AddArg(y) 3852 return true 3853 } 3854 // match: (Lsh32x8 <t> x y) 3855 // cond: 3856 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 3857 for { 3858 t := v.Type 3859 _ = v.Args[1] 3860 x := v.Args[0] 3861 y := v.Args[1] 3862 v.reset(OpS390XMOVDGE) 3863 v.Type = t 3864 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3865 v0.AddArg(x) 3866 v0.AddArg(y) 3867 v.AddArg(v0) 3868 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3869 v1.AuxInt = 0 3870 v.AddArg(v1) 3871 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3872 v2.AuxInt = 64 3873 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3874 v3.AddArg(y) 3875 v2.AddArg(v3) 3876 v.AddArg(v2) 3877 return true 3878 } 3879 } 3880 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3881 b := v.Block 3882 _ = b 3883 typ := &b.Func.Config.Types 3884 _ = typ 3885 // match: (Lsh64x16 x y) 3886 // cond: shiftIsBounded(v) 3887 // result: (SLD x y) 3888 for { 3889 _ = v.Args[1] 3890 x := v.Args[0] 3891 y := v.Args[1] 3892 if !(shiftIsBounded(v)) { 3893 break 3894 } 3895 v.reset(OpS390XSLD) 3896 v.AddArg(x) 3897 v.AddArg(y) 3898 return true 3899 } 3900 // match: (Lsh64x16 <t> x y) 3901 // cond: 3902 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 3903 for { 3904 t := v.Type 3905 _ = v.Args[1] 3906 x := v.Args[0] 3907 y := v.Args[1] 3908 v.reset(OpS390XMOVDGE) 3909 v.Type = t 3910 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3911 v0.AddArg(x) 3912 v0.AddArg(y) 3913 v.AddArg(v0) 3914 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3915 v1.AuxInt = 0 3916 v.AddArg(v1) 3917 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3918 v2.AuxInt = 64 3919 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3920 v3.AddArg(y) 3921 v2.AddArg(v3) 3922 v.AddArg(v2) 3923 return true 3924 } 3925 } 3926 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3927 b := v.Block 3928 _ = b 3929 typ := &b.Func.Config.Types 3930 _ = typ 3931 // match: (Lsh64x32 x y) 3932 // cond: shiftIsBounded(v) 3933 // result: (SLD x y) 3934 for { 3935 _ = v.Args[1] 3936 x := v.Args[0] 3937 y := v.Args[1] 3938 if !(shiftIsBounded(v)) { 3939 break 3940 } 3941 v.reset(OpS390XSLD) 3942 v.AddArg(x) 3943 v.AddArg(y) 3944 return true 3945 } 3946 // match: (Lsh64x32 <t> x y) 3947 // cond: 3948 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 3949 for { 3950 t := v.Type 3951 _ = v.Args[1] 3952 x := v.Args[0] 3953 y := v.Args[1] 3954 v.reset(OpS390XMOVDGE) 3955 v.Type = t 3956 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3957 v0.AddArg(x) 3958 v0.AddArg(y) 3959 v.AddArg(v0) 3960 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3961 v1.AuxInt = 0 3962 v.AddArg(v1) 3963 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3964 v2.AuxInt = 64 3965 v2.AddArg(y) 3966 v.AddArg(v2) 3967 return true 3968 } 3969 } 3970 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3971 b := v.Block 3972 _ = b 3973 typ := &b.Func.Config.Types 3974 _ = typ 3975 // match: (Lsh64x64 x y) 3976 // cond: shiftIsBounded(v) 3977 // result: (SLD x y) 3978 for { 3979 _ = v.Args[1] 3980 x := v.Args[0] 3981 y := v.Args[1] 3982 if !(shiftIsBounded(v)) { 3983 break 3984 } 3985 v.reset(OpS390XSLD) 3986 v.AddArg(x) 3987 v.AddArg(y) 3988 return true 3989 } 3990 // match: (Lsh64x64 <t> x y) 3991 // cond: 3992 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 3993 for { 3994 t := v.Type 3995 _ = v.Args[1] 3996 x := v.Args[0] 3997 y := v.Args[1] 3998 v.reset(OpS390XMOVDGE) 3999 v.Type = t 4000 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 4001 v0.AddArg(x) 4002 v0.AddArg(y) 4003 v.AddArg(v0) 4004 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4005 v1.AuxInt = 0 4006 v.AddArg(v1) 4007 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 4008 v2.AuxInt = 64 4009 v2.AddArg(y) 4010 v.AddArg(v2) 4011 return true 4012 } 4013 } 4014 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 4015 b := v.Block 4016 _ = b 4017 typ := &b.Func.Config.Types 4018 _ = typ 4019 // match: (Lsh64x8 x y) 4020 // cond: shiftIsBounded(v) 4021 // result: (SLD x y) 4022 for { 4023 _ = v.Args[1] 4024 x := v.Args[0] 4025 y := v.Args[1] 4026 if !(shiftIsBounded(v)) { 4027 break 4028 } 4029 v.reset(OpS390XSLD) 4030 v.AddArg(x) 4031 v.AddArg(y) 4032 return true 4033 } 4034 // match: (Lsh64x8 <t> x y) 4035 // cond: 4036 // result: (MOVDGE <t> (SLD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 4037 for { 4038 t := v.Type 4039 _ = v.Args[1] 4040 x := v.Args[0] 4041 y := v.Args[1] 4042 v.reset(OpS390XMOVDGE) 4043 v.Type = t 4044 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 4045 v0.AddArg(x) 4046 v0.AddArg(y) 4047 v.AddArg(v0) 4048 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4049 v1.AuxInt = 0 4050 v.AddArg(v1) 4051 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4052 v2.AuxInt = 64 4053 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4054 v3.AddArg(y) 4055 v2.AddArg(v3) 4056 v.AddArg(v2) 4057 return true 4058 } 4059 } 4060 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 4061 b := v.Block 4062 _ = b 4063 typ := &b.Func.Config.Types 4064 _ = typ 4065 // match: (Lsh8x16 x y) 4066 // cond: shiftIsBounded(v) 4067 // result: (SLW x y) 4068 for { 4069 _ = v.Args[1] 4070 x := v.Args[0] 4071 y := v.Args[1] 4072 if !(shiftIsBounded(v)) { 4073 break 4074 } 4075 v.reset(OpS390XSLW) 4076 v.AddArg(x) 4077 v.AddArg(y) 4078 return true 4079 } 4080 // match: (Lsh8x16 <t> x y) 4081 // cond: 4082 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 4083 for { 4084 t := v.Type 4085 _ = v.Args[1] 4086 x := v.Args[0] 4087 y := v.Args[1] 4088 v.reset(OpS390XMOVDGE) 4089 v.Type = t 4090 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4091 v0.AddArg(x) 4092 v0.AddArg(y) 4093 v.AddArg(v0) 4094 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4095 v1.AuxInt = 0 4096 v.AddArg(v1) 4097 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4098 v2.AuxInt = 64 4099 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4100 v3.AddArg(y) 4101 v2.AddArg(v3) 4102 v.AddArg(v2) 4103 return true 4104 } 4105 } 4106 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 4107 b := v.Block 4108 _ = b 4109 typ := &b.Func.Config.Types 4110 _ = typ 4111 // match: (Lsh8x32 x y) 4112 // cond: shiftIsBounded(v) 4113 // result: (SLW x y) 4114 for { 4115 _ = v.Args[1] 4116 x := v.Args[0] 4117 y := v.Args[1] 4118 if !(shiftIsBounded(v)) { 4119 break 4120 } 4121 v.reset(OpS390XSLW) 4122 v.AddArg(x) 4123 v.AddArg(y) 4124 return true 4125 } 4126 // match: (Lsh8x32 <t> x y) 4127 // cond: 4128 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 4129 for { 4130 t := v.Type 4131 _ = v.Args[1] 4132 x := v.Args[0] 4133 y := v.Args[1] 4134 v.reset(OpS390XMOVDGE) 4135 v.Type = t 4136 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4137 v0.AddArg(x) 4138 v0.AddArg(y) 4139 v.AddArg(v0) 4140 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4141 v1.AuxInt = 0 4142 v.AddArg(v1) 4143 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4144 v2.AuxInt = 64 4145 v2.AddArg(y) 4146 v.AddArg(v2) 4147 return true 4148 } 4149 } 4150 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 4151 b := v.Block 4152 _ = b 4153 typ := &b.Func.Config.Types 4154 _ = typ 4155 // match: (Lsh8x64 x y) 4156 // cond: shiftIsBounded(v) 4157 // result: (SLW x y) 4158 for { 4159 _ = v.Args[1] 4160 x := v.Args[0] 4161 y := v.Args[1] 4162 if !(shiftIsBounded(v)) { 4163 break 4164 } 4165 v.reset(OpS390XSLW) 4166 v.AddArg(x) 4167 v.AddArg(y) 4168 return true 4169 } 4170 // match: (Lsh8x64 <t> x y) 4171 // cond: 4172 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 4173 for { 4174 t := v.Type 4175 _ = v.Args[1] 4176 x := v.Args[0] 4177 y := v.Args[1] 4178 v.reset(OpS390XMOVDGE) 4179 v.Type = t 4180 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4181 v0.AddArg(x) 4182 v0.AddArg(y) 4183 v.AddArg(v0) 4184 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4185 v1.AuxInt = 0 4186 v.AddArg(v1) 4187 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 4188 v2.AuxInt = 64 4189 v2.AddArg(y) 4190 v.AddArg(v2) 4191 return true 4192 } 4193 } 4194 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 4195 b := v.Block 4196 _ = b 4197 typ := &b.Func.Config.Types 4198 _ = typ 4199 // match: (Lsh8x8 x y) 4200 // cond: shiftIsBounded(v) 4201 // result: (SLW x y) 4202 for { 4203 _ = v.Args[1] 4204 x := v.Args[0] 4205 y := v.Args[1] 4206 if !(shiftIsBounded(v)) { 4207 break 4208 } 4209 v.reset(OpS390XSLW) 4210 v.AddArg(x) 4211 v.AddArg(y) 4212 return true 4213 } 4214 // match: (Lsh8x8 <t> x y) 4215 // cond: 4216 // result: (MOVDGE <t> (SLW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 4217 for { 4218 t := v.Type 4219 _ = v.Args[1] 4220 x := v.Args[0] 4221 y := v.Args[1] 4222 v.reset(OpS390XMOVDGE) 4223 v.Type = t 4224 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 4225 v0.AddArg(x) 4226 v0.AddArg(y) 4227 v.AddArg(v0) 4228 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4229 v1.AuxInt = 0 4230 v.AddArg(v1) 4231 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4232 v2.AuxInt = 64 4233 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4234 v3.AddArg(y) 4235 v2.AddArg(v3) 4236 v.AddArg(v2) 4237 return true 4238 } 4239 } 4240 func rewriteValueS390X_OpMod16_0(v *Value) bool { 4241 b := v.Block 4242 _ = b 4243 typ := &b.Func.Config.Types 4244 _ = typ 4245 // match: (Mod16 x y) 4246 // cond: 4247 // result: (MODW (MOVHreg x) (MOVHreg y)) 4248 for { 4249 _ = v.Args[1] 4250 x := v.Args[0] 4251 y := v.Args[1] 4252 v.reset(OpS390XMODW) 4253 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4254 v0.AddArg(x) 4255 v.AddArg(v0) 4256 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4257 v1.AddArg(y) 4258 v.AddArg(v1) 4259 return true 4260 } 4261 } 4262 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 4263 b := v.Block 4264 _ = b 4265 typ := &b.Func.Config.Types 4266 _ = typ 4267 // match: (Mod16u x y) 4268 // cond: 4269 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 4270 for { 4271 _ = v.Args[1] 4272 x := v.Args[0] 4273 y := v.Args[1] 4274 v.reset(OpS390XMODWU) 4275 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4276 v0.AddArg(x) 4277 v.AddArg(v0) 4278 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4279 v1.AddArg(y) 4280 v.AddArg(v1) 4281 return true 4282 } 4283 } 4284 func rewriteValueS390X_OpMod32_0(v *Value) bool { 4285 b := v.Block 4286 _ = b 4287 typ := &b.Func.Config.Types 4288 _ = typ 4289 // match: (Mod32 x y) 4290 // cond: 4291 // result: (MODW (MOVWreg x) y) 4292 for { 4293 _ = v.Args[1] 4294 x := v.Args[0] 4295 y := v.Args[1] 4296 v.reset(OpS390XMODW) 4297 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 4298 v0.AddArg(x) 4299 v.AddArg(v0) 4300 v.AddArg(y) 4301 return true 4302 } 4303 } 4304 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 4305 b := v.Block 4306 _ = b 4307 typ := &b.Func.Config.Types 4308 _ = typ 4309 // match: (Mod32u x y) 4310 // cond: 4311 // result: (MODWU (MOVWZreg x) y) 4312 for { 4313 _ = v.Args[1] 4314 x := v.Args[0] 4315 y := v.Args[1] 4316 v.reset(OpS390XMODWU) 4317 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 4318 v0.AddArg(x) 4319 v.AddArg(v0) 4320 v.AddArg(y) 4321 return true 4322 } 4323 } 4324 func rewriteValueS390X_OpMod64_0(v *Value) bool { 4325 // match: (Mod64 x y) 4326 // cond: 4327 // result: (MODD x y) 4328 for { 4329 _ = v.Args[1] 4330 x := v.Args[0] 4331 y := v.Args[1] 4332 v.reset(OpS390XMODD) 4333 v.AddArg(x) 4334 v.AddArg(y) 4335 return true 4336 } 4337 } 4338 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 4339 // match: (Mod64u x y) 4340 // cond: 4341 // result: (MODDU x y) 4342 for { 4343 _ = v.Args[1] 4344 x := v.Args[0] 4345 y := v.Args[1] 4346 v.reset(OpS390XMODDU) 4347 v.AddArg(x) 4348 v.AddArg(y) 4349 return true 4350 } 4351 } 4352 func rewriteValueS390X_OpMod8_0(v *Value) bool { 4353 b := v.Block 4354 _ = b 4355 typ := &b.Func.Config.Types 4356 _ = typ 4357 // match: (Mod8 x y) 4358 // cond: 4359 // result: (MODW (MOVBreg x) (MOVBreg y)) 4360 for { 4361 _ = v.Args[1] 4362 x := v.Args[0] 4363 y := v.Args[1] 4364 v.reset(OpS390XMODW) 4365 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4366 v0.AddArg(x) 4367 v.AddArg(v0) 4368 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4369 v1.AddArg(y) 4370 v.AddArg(v1) 4371 return true 4372 } 4373 } 4374 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 4375 b := v.Block 4376 _ = b 4377 typ := &b.Func.Config.Types 4378 _ = typ 4379 // match: (Mod8u x y) 4380 // cond: 4381 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 4382 for { 4383 _ = v.Args[1] 4384 x := v.Args[0] 4385 y := v.Args[1] 4386 v.reset(OpS390XMODWU) 4387 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4388 v0.AddArg(x) 4389 v.AddArg(v0) 4390 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4391 v1.AddArg(y) 4392 v.AddArg(v1) 4393 return true 4394 } 4395 } 4396 func rewriteValueS390X_OpMove_0(v *Value) bool { 4397 b := v.Block 4398 _ = b 4399 typ := &b.Func.Config.Types 4400 _ = typ 4401 // match: (Move [0] _ _ mem) 4402 // cond: 4403 // result: mem 4404 for { 4405 if v.AuxInt != 0 { 4406 break 4407 } 4408 _ = v.Args[2] 4409 mem := v.Args[2] 4410 v.reset(OpCopy) 4411 v.Type = mem.Type 4412 v.AddArg(mem) 4413 return true 4414 } 4415 // match: (Move [1] dst src mem) 4416 // cond: 4417 // result: (MOVBstore dst (MOVBZload src mem) mem) 4418 for { 4419 if v.AuxInt != 1 { 4420 break 4421 } 4422 _ = v.Args[2] 4423 dst := v.Args[0] 4424 src := v.Args[1] 4425 mem := v.Args[2] 4426 v.reset(OpS390XMOVBstore) 4427 v.AddArg(dst) 4428 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4429 v0.AddArg(src) 4430 v0.AddArg(mem) 4431 v.AddArg(v0) 4432 v.AddArg(mem) 4433 return true 4434 } 4435 // match: (Move [2] dst src mem) 4436 // cond: 4437 // result: (MOVHstore dst (MOVHZload src mem) mem) 4438 for { 4439 if v.AuxInt != 2 { 4440 break 4441 } 4442 _ = v.Args[2] 4443 dst := v.Args[0] 4444 src := v.Args[1] 4445 mem := v.Args[2] 4446 v.reset(OpS390XMOVHstore) 4447 v.AddArg(dst) 4448 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4449 v0.AddArg(src) 4450 v0.AddArg(mem) 4451 v.AddArg(v0) 4452 v.AddArg(mem) 4453 return true 4454 } 4455 // match: (Move [4] dst src mem) 4456 // cond: 4457 // result: (MOVWstore dst (MOVWZload src mem) mem) 4458 for { 4459 if v.AuxInt != 4 { 4460 break 4461 } 4462 _ = v.Args[2] 4463 dst := v.Args[0] 4464 src := v.Args[1] 4465 mem := v.Args[2] 4466 v.reset(OpS390XMOVWstore) 4467 v.AddArg(dst) 4468 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4469 v0.AddArg(src) 4470 v0.AddArg(mem) 4471 v.AddArg(v0) 4472 v.AddArg(mem) 4473 return true 4474 } 4475 // match: (Move [8] dst src mem) 4476 // cond: 4477 // result: (MOVDstore dst (MOVDload src mem) mem) 4478 for { 4479 if v.AuxInt != 8 { 4480 break 4481 } 4482 _ = v.Args[2] 4483 dst := v.Args[0] 4484 src := v.Args[1] 4485 mem := v.Args[2] 4486 v.reset(OpS390XMOVDstore) 4487 v.AddArg(dst) 4488 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4489 v0.AddArg(src) 4490 v0.AddArg(mem) 4491 v.AddArg(v0) 4492 v.AddArg(mem) 4493 return true 4494 } 4495 // match: (Move [16] dst src mem) 4496 // cond: 4497 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4498 for { 4499 if v.AuxInt != 16 { 4500 break 4501 } 4502 _ = v.Args[2] 4503 dst := v.Args[0] 4504 src := v.Args[1] 4505 mem := v.Args[2] 4506 v.reset(OpS390XMOVDstore) 4507 v.AuxInt = 8 4508 v.AddArg(dst) 4509 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4510 v0.AuxInt = 8 4511 v0.AddArg(src) 4512 v0.AddArg(mem) 4513 v.AddArg(v0) 4514 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4515 v1.AddArg(dst) 4516 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4517 v2.AddArg(src) 4518 v2.AddArg(mem) 4519 v1.AddArg(v2) 4520 v1.AddArg(mem) 4521 v.AddArg(v1) 4522 return true 4523 } 4524 // match: (Move [24] dst src mem) 4525 // cond: 4526 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4527 for { 4528 if v.AuxInt != 24 { 4529 break 4530 } 4531 _ = v.Args[2] 4532 dst := v.Args[0] 4533 src := v.Args[1] 4534 mem := v.Args[2] 4535 v.reset(OpS390XMOVDstore) 4536 v.AuxInt = 16 4537 v.AddArg(dst) 4538 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4539 v0.AuxInt = 16 4540 v0.AddArg(src) 4541 v0.AddArg(mem) 4542 v.AddArg(v0) 4543 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4544 v1.AuxInt = 8 4545 v1.AddArg(dst) 4546 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4547 v2.AuxInt = 8 4548 v2.AddArg(src) 4549 v2.AddArg(mem) 4550 v1.AddArg(v2) 4551 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4552 v3.AddArg(dst) 4553 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4554 v4.AddArg(src) 4555 v4.AddArg(mem) 4556 v3.AddArg(v4) 4557 v3.AddArg(mem) 4558 v1.AddArg(v3) 4559 v.AddArg(v1) 4560 return true 4561 } 4562 // match: (Move [3] dst src mem) 4563 // cond: 4564 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4565 for { 4566 if v.AuxInt != 3 { 4567 break 4568 } 4569 _ = v.Args[2] 4570 dst := v.Args[0] 4571 src := v.Args[1] 4572 mem := v.Args[2] 4573 v.reset(OpS390XMOVBstore) 4574 v.AuxInt = 2 4575 v.AddArg(dst) 4576 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4577 v0.AuxInt = 2 4578 v0.AddArg(src) 4579 v0.AddArg(mem) 4580 v.AddArg(v0) 4581 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4582 v1.AddArg(dst) 4583 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4584 v2.AddArg(src) 4585 v2.AddArg(mem) 4586 v1.AddArg(v2) 4587 v1.AddArg(mem) 4588 v.AddArg(v1) 4589 return true 4590 } 4591 // match: (Move [5] dst src mem) 4592 // cond: 4593 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4594 for { 4595 if v.AuxInt != 5 { 4596 break 4597 } 4598 _ = v.Args[2] 4599 dst := v.Args[0] 4600 src := v.Args[1] 4601 mem := v.Args[2] 4602 v.reset(OpS390XMOVBstore) 4603 v.AuxInt = 4 4604 v.AddArg(dst) 4605 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4606 v0.AuxInt = 4 4607 v0.AddArg(src) 4608 v0.AddArg(mem) 4609 v.AddArg(v0) 4610 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4611 v1.AddArg(dst) 4612 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4613 v2.AddArg(src) 4614 v2.AddArg(mem) 4615 v1.AddArg(v2) 4616 v1.AddArg(mem) 4617 v.AddArg(v1) 4618 return true 4619 } 4620 // match: (Move [6] dst src mem) 4621 // cond: 4622 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4623 for { 4624 if v.AuxInt != 6 { 4625 break 4626 } 4627 _ = v.Args[2] 4628 dst := v.Args[0] 4629 src := v.Args[1] 4630 mem := v.Args[2] 4631 v.reset(OpS390XMOVHstore) 4632 v.AuxInt = 4 4633 v.AddArg(dst) 4634 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4635 v0.AuxInt = 4 4636 v0.AddArg(src) 4637 v0.AddArg(mem) 4638 v.AddArg(v0) 4639 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4640 v1.AddArg(dst) 4641 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4642 v2.AddArg(src) 4643 v2.AddArg(mem) 4644 v1.AddArg(v2) 4645 v1.AddArg(mem) 4646 v.AddArg(v1) 4647 return true 4648 } 4649 return false 4650 } 4651 func rewriteValueS390X_OpMove_10(v *Value) bool { 4652 b := v.Block 4653 _ = b 4654 typ := &b.Func.Config.Types 4655 _ = typ 4656 // match: (Move [7] dst src mem) 4657 // cond: 4658 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4659 for { 4660 if v.AuxInt != 7 { 4661 break 4662 } 4663 _ = v.Args[2] 4664 dst := v.Args[0] 4665 src := v.Args[1] 4666 mem := v.Args[2] 4667 v.reset(OpS390XMOVBstore) 4668 v.AuxInt = 6 4669 v.AddArg(dst) 4670 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4671 v0.AuxInt = 6 4672 v0.AddArg(src) 4673 v0.AddArg(mem) 4674 v.AddArg(v0) 4675 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4676 v1.AuxInt = 4 4677 v1.AddArg(dst) 4678 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4679 v2.AuxInt = 4 4680 v2.AddArg(src) 4681 v2.AddArg(mem) 4682 v1.AddArg(v2) 4683 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4684 v3.AddArg(dst) 4685 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4686 v4.AddArg(src) 4687 v4.AddArg(mem) 4688 v3.AddArg(v4) 4689 v3.AddArg(mem) 4690 v1.AddArg(v3) 4691 v.AddArg(v1) 4692 return true 4693 } 4694 // match: (Move [s] dst src mem) 4695 // cond: s > 0 && s <= 256 4696 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4697 for { 4698 s := v.AuxInt 4699 _ = v.Args[2] 4700 dst := v.Args[0] 4701 src := v.Args[1] 4702 mem := v.Args[2] 4703 if !(s > 0 && s <= 256) { 4704 break 4705 } 4706 v.reset(OpS390XMVC) 4707 v.AuxInt = makeValAndOff(s, 0) 4708 v.AddArg(dst) 4709 v.AddArg(src) 4710 v.AddArg(mem) 4711 return true 4712 } 4713 // match: (Move [s] dst src mem) 4714 // cond: s > 256 && s <= 512 4715 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4716 for { 4717 s := v.AuxInt 4718 _ = v.Args[2] 4719 dst := v.Args[0] 4720 src := v.Args[1] 4721 mem := v.Args[2] 4722 if !(s > 256 && s <= 512) { 4723 break 4724 } 4725 v.reset(OpS390XMVC) 4726 v.AuxInt = makeValAndOff(s-256, 256) 4727 v.AddArg(dst) 4728 v.AddArg(src) 4729 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4730 v0.AuxInt = makeValAndOff(256, 0) 4731 v0.AddArg(dst) 4732 v0.AddArg(src) 4733 v0.AddArg(mem) 4734 v.AddArg(v0) 4735 return true 4736 } 4737 // match: (Move [s] dst src mem) 4738 // cond: s > 512 && s <= 768 4739 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4740 for { 4741 s := v.AuxInt 4742 _ = v.Args[2] 4743 dst := v.Args[0] 4744 src := v.Args[1] 4745 mem := v.Args[2] 4746 if !(s > 512 && s <= 768) { 4747 break 4748 } 4749 v.reset(OpS390XMVC) 4750 v.AuxInt = makeValAndOff(s-512, 512) 4751 v.AddArg(dst) 4752 v.AddArg(src) 4753 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4754 v0.AuxInt = makeValAndOff(256, 256) 4755 v0.AddArg(dst) 4756 v0.AddArg(src) 4757 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4758 v1.AuxInt = makeValAndOff(256, 0) 4759 v1.AddArg(dst) 4760 v1.AddArg(src) 4761 v1.AddArg(mem) 4762 v0.AddArg(v1) 4763 v.AddArg(v0) 4764 return true 4765 } 4766 // match: (Move [s] dst src mem) 4767 // cond: s > 768 && s <= 1024 4768 // 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)))) 4769 for { 4770 s := v.AuxInt 4771 _ = v.Args[2] 4772 dst := v.Args[0] 4773 src := v.Args[1] 4774 mem := v.Args[2] 4775 if !(s > 768 && s <= 1024) { 4776 break 4777 } 4778 v.reset(OpS390XMVC) 4779 v.AuxInt = makeValAndOff(s-768, 768) 4780 v.AddArg(dst) 4781 v.AddArg(src) 4782 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4783 v0.AuxInt = makeValAndOff(256, 512) 4784 v0.AddArg(dst) 4785 v0.AddArg(src) 4786 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4787 v1.AuxInt = makeValAndOff(256, 256) 4788 v1.AddArg(dst) 4789 v1.AddArg(src) 4790 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4791 v2.AuxInt = makeValAndOff(256, 0) 4792 v2.AddArg(dst) 4793 v2.AddArg(src) 4794 v2.AddArg(mem) 4795 v1.AddArg(v2) 4796 v0.AddArg(v1) 4797 v.AddArg(v0) 4798 return true 4799 } 4800 // match: (Move [s] dst src mem) 4801 // cond: s > 1024 4802 // result: (LoweredMove [s%256] dst src (ADD <src.Type> src (MOVDconst [(s/256)*256])) mem) 4803 for { 4804 s := v.AuxInt 4805 _ = v.Args[2] 4806 dst := v.Args[0] 4807 src := v.Args[1] 4808 mem := v.Args[2] 4809 if !(s > 1024) { 4810 break 4811 } 4812 v.reset(OpS390XLoweredMove) 4813 v.AuxInt = s % 256 4814 v.AddArg(dst) 4815 v.AddArg(src) 4816 v0 := b.NewValue0(v.Pos, OpS390XADD, src.Type) 4817 v0.AddArg(src) 4818 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4819 v1.AuxInt = (s / 256) * 256 4820 v0.AddArg(v1) 4821 v.AddArg(v0) 4822 v.AddArg(mem) 4823 return true 4824 } 4825 return false 4826 } 4827 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4828 // match: (Mul16 x y) 4829 // cond: 4830 // result: (MULLW x y) 4831 for { 4832 _ = v.Args[1] 4833 x := v.Args[0] 4834 y := v.Args[1] 4835 v.reset(OpS390XMULLW) 4836 v.AddArg(x) 4837 v.AddArg(y) 4838 return true 4839 } 4840 } 4841 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4842 // match: (Mul32 x y) 4843 // cond: 4844 // result: (MULLW x y) 4845 for { 4846 _ = v.Args[1] 4847 x := v.Args[0] 4848 y := v.Args[1] 4849 v.reset(OpS390XMULLW) 4850 v.AddArg(x) 4851 v.AddArg(y) 4852 return true 4853 } 4854 } 4855 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4856 // match: (Mul32F x y) 4857 // cond: 4858 // result: (FMULS x y) 4859 for { 4860 _ = v.Args[1] 4861 x := v.Args[0] 4862 y := v.Args[1] 4863 v.reset(OpS390XFMULS) 4864 v.AddArg(x) 4865 v.AddArg(y) 4866 return true 4867 } 4868 } 4869 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4870 // match: (Mul64 x y) 4871 // cond: 4872 // result: (MULLD x y) 4873 for { 4874 _ = v.Args[1] 4875 x := v.Args[0] 4876 y := v.Args[1] 4877 v.reset(OpS390XMULLD) 4878 v.AddArg(x) 4879 v.AddArg(y) 4880 return true 4881 } 4882 } 4883 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4884 // match: (Mul64F x y) 4885 // cond: 4886 // result: (FMUL x y) 4887 for { 4888 _ = v.Args[1] 4889 x := v.Args[0] 4890 y := v.Args[1] 4891 v.reset(OpS390XFMUL) 4892 v.AddArg(x) 4893 v.AddArg(y) 4894 return true 4895 } 4896 } 4897 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4898 // match: (Mul8 x y) 4899 // cond: 4900 // result: (MULLW x y) 4901 for { 4902 _ = v.Args[1] 4903 x := v.Args[0] 4904 y := v.Args[1] 4905 v.reset(OpS390XMULLW) 4906 v.AddArg(x) 4907 v.AddArg(y) 4908 return true 4909 } 4910 } 4911 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4912 // match: (Neg16 x) 4913 // cond: 4914 // result: (NEGW x) 4915 for { 4916 x := v.Args[0] 4917 v.reset(OpS390XNEGW) 4918 v.AddArg(x) 4919 return true 4920 } 4921 } 4922 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4923 // match: (Neg32 x) 4924 // cond: 4925 // result: (NEGW x) 4926 for { 4927 x := v.Args[0] 4928 v.reset(OpS390XNEGW) 4929 v.AddArg(x) 4930 return true 4931 } 4932 } 4933 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4934 // match: (Neg32F x) 4935 // cond: 4936 // result: (FNEGS x) 4937 for { 4938 x := v.Args[0] 4939 v.reset(OpS390XFNEGS) 4940 v.AddArg(x) 4941 return true 4942 } 4943 } 4944 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4945 // match: (Neg64 x) 4946 // cond: 4947 // result: (NEG x) 4948 for { 4949 x := v.Args[0] 4950 v.reset(OpS390XNEG) 4951 v.AddArg(x) 4952 return true 4953 } 4954 } 4955 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4956 // match: (Neg64F x) 4957 // cond: 4958 // result: (FNEG x) 4959 for { 4960 x := v.Args[0] 4961 v.reset(OpS390XFNEG) 4962 v.AddArg(x) 4963 return true 4964 } 4965 } 4966 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4967 // match: (Neg8 x) 4968 // cond: 4969 // result: (NEGW x) 4970 for { 4971 x := v.Args[0] 4972 v.reset(OpS390XNEGW) 4973 v.AddArg(x) 4974 return true 4975 } 4976 } 4977 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4978 b := v.Block 4979 _ = b 4980 typ := &b.Func.Config.Types 4981 _ = typ 4982 // match: (Neq16 x y) 4983 // cond: 4984 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) 4985 for { 4986 _ = v.Args[1] 4987 x := v.Args[0] 4988 y := v.Args[1] 4989 v.reset(OpS390XMOVDNE) 4990 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4991 v0.AuxInt = 0 4992 v.AddArg(v0) 4993 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4994 v1.AuxInt = 1 4995 v.AddArg(v1) 4996 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4997 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4998 v3.AddArg(x) 4999 v2.AddArg(v3) 5000 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5001 v4.AddArg(y) 5002 v2.AddArg(v4) 5003 v.AddArg(v2) 5004 return true 5005 } 5006 } 5007 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 5008 b := v.Block 5009 _ = b 5010 typ := &b.Func.Config.Types 5011 _ = typ 5012 // match: (Neq32 x y) 5013 // cond: 5014 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 5015 for { 5016 _ = v.Args[1] 5017 x := v.Args[0] 5018 y := v.Args[1] 5019 v.reset(OpS390XMOVDNE) 5020 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5021 v0.AuxInt = 0 5022 v.AddArg(v0) 5023 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5024 v1.AuxInt = 1 5025 v.AddArg(v1) 5026 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5027 v2.AddArg(x) 5028 v2.AddArg(y) 5029 v.AddArg(v2) 5030 return true 5031 } 5032 } 5033 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 5034 b := v.Block 5035 _ = b 5036 typ := &b.Func.Config.Types 5037 _ = typ 5038 // match: (Neq32F x y) 5039 // cond: 5040 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 5041 for { 5042 _ = v.Args[1] 5043 x := v.Args[0] 5044 y := v.Args[1] 5045 v.reset(OpS390XMOVDNE) 5046 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5047 v0.AuxInt = 0 5048 v.AddArg(v0) 5049 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5050 v1.AuxInt = 1 5051 v.AddArg(v1) 5052 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 5053 v2.AddArg(x) 5054 v2.AddArg(y) 5055 v.AddArg(v2) 5056 return true 5057 } 5058 } 5059 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 5060 b := v.Block 5061 _ = b 5062 typ := &b.Func.Config.Types 5063 _ = typ 5064 // match: (Neq64 x y) 5065 // cond: 5066 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 5067 for { 5068 _ = v.Args[1] 5069 x := v.Args[0] 5070 y := v.Args[1] 5071 v.reset(OpS390XMOVDNE) 5072 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5073 v0.AuxInt = 0 5074 v.AddArg(v0) 5075 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5076 v1.AuxInt = 1 5077 v.AddArg(v1) 5078 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 5079 v2.AddArg(x) 5080 v2.AddArg(y) 5081 v.AddArg(v2) 5082 return true 5083 } 5084 } 5085 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 5086 b := v.Block 5087 _ = b 5088 typ := &b.Func.Config.Types 5089 _ = typ 5090 // match: (Neq64F x y) 5091 // cond: 5092 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 5093 for { 5094 _ = v.Args[1] 5095 x := v.Args[0] 5096 y := v.Args[1] 5097 v.reset(OpS390XMOVDNE) 5098 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5099 v0.AuxInt = 0 5100 v.AddArg(v0) 5101 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5102 v1.AuxInt = 1 5103 v.AddArg(v1) 5104 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 5105 v2.AddArg(x) 5106 v2.AddArg(y) 5107 v.AddArg(v2) 5108 return true 5109 } 5110 } 5111 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 5112 b := v.Block 5113 _ = b 5114 typ := &b.Func.Config.Types 5115 _ = typ 5116 // match: (Neq8 x y) 5117 // cond: 5118 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 5119 for { 5120 _ = v.Args[1] 5121 x := v.Args[0] 5122 y := v.Args[1] 5123 v.reset(OpS390XMOVDNE) 5124 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5125 v0.AuxInt = 0 5126 v.AddArg(v0) 5127 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5128 v1.AuxInt = 1 5129 v.AddArg(v1) 5130 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5131 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5132 v3.AddArg(x) 5133 v2.AddArg(v3) 5134 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5135 v4.AddArg(y) 5136 v2.AddArg(v4) 5137 v.AddArg(v2) 5138 return true 5139 } 5140 } 5141 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 5142 b := v.Block 5143 _ = b 5144 typ := &b.Func.Config.Types 5145 _ = typ 5146 // match: (NeqB x y) 5147 // cond: 5148 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) 5149 for { 5150 _ = v.Args[1] 5151 x := v.Args[0] 5152 y := v.Args[1] 5153 v.reset(OpS390XMOVDNE) 5154 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5155 v0.AuxInt = 0 5156 v.AddArg(v0) 5157 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5158 v1.AuxInt = 1 5159 v.AddArg(v1) 5160 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 5161 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5162 v3.AddArg(x) 5163 v2.AddArg(v3) 5164 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5165 v4.AddArg(y) 5166 v2.AddArg(v4) 5167 v.AddArg(v2) 5168 return true 5169 } 5170 } 5171 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 5172 b := v.Block 5173 _ = b 5174 typ := &b.Func.Config.Types 5175 _ = typ 5176 // match: (NeqPtr x y) 5177 // cond: 5178 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 5179 for { 5180 _ = v.Args[1] 5181 x := v.Args[0] 5182 y := v.Args[1] 5183 v.reset(OpS390XMOVDNE) 5184 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5185 v0.AuxInt = 0 5186 v.AddArg(v0) 5187 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5188 v1.AuxInt = 1 5189 v.AddArg(v1) 5190 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 5191 v2.AddArg(x) 5192 v2.AddArg(y) 5193 v.AddArg(v2) 5194 return true 5195 } 5196 } 5197 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 5198 // match: (NilCheck ptr mem) 5199 // cond: 5200 // result: (LoweredNilCheck ptr mem) 5201 for { 5202 _ = v.Args[1] 5203 ptr := v.Args[0] 5204 mem := v.Args[1] 5205 v.reset(OpS390XLoweredNilCheck) 5206 v.AddArg(ptr) 5207 v.AddArg(mem) 5208 return true 5209 } 5210 } 5211 func rewriteValueS390X_OpNot_0(v *Value) bool { 5212 // match: (Not x) 5213 // cond: 5214 // result: (XORWconst [1] x) 5215 for { 5216 x := v.Args[0] 5217 v.reset(OpS390XXORWconst) 5218 v.AuxInt = 1 5219 v.AddArg(x) 5220 return true 5221 } 5222 } 5223 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 5224 b := v.Block 5225 _ = b 5226 typ := &b.Func.Config.Types 5227 _ = typ 5228 // match: (OffPtr [off] ptr:(SP)) 5229 // cond: 5230 // result: (MOVDaddr [off] ptr) 5231 for { 5232 off := v.AuxInt 5233 ptr := v.Args[0] 5234 if ptr.Op != OpSP { 5235 break 5236 } 5237 v.reset(OpS390XMOVDaddr) 5238 v.AuxInt = off 5239 v.AddArg(ptr) 5240 return true 5241 } 5242 // match: (OffPtr [off] ptr) 5243 // cond: is32Bit(off) 5244 // result: (ADDconst [off] ptr) 5245 for { 5246 off := v.AuxInt 5247 ptr := v.Args[0] 5248 if !(is32Bit(off)) { 5249 break 5250 } 5251 v.reset(OpS390XADDconst) 5252 v.AuxInt = off 5253 v.AddArg(ptr) 5254 return true 5255 } 5256 // match: (OffPtr [off] ptr) 5257 // cond: 5258 // result: (ADD (MOVDconst [off]) ptr) 5259 for { 5260 off := v.AuxInt 5261 ptr := v.Args[0] 5262 v.reset(OpS390XADD) 5263 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5264 v0.AuxInt = off 5265 v.AddArg(v0) 5266 v.AddArg(ptr) 5267 return true 5268 } 5269 } 5270 func rewriteValueS390X_OpOr16_0(v *Value) bool { 5271 // match: (Or16 x y) 5272 // cond: 5273 // result: (ORW x y) 5274 for { 5275 _ = v.Args[1] 5276 x := v.Args[0] 5277 y := v.Args[1] 5278 v.reset(OpS390XORW) 5279 v.AddArg(x) 5280 v.AddArg(y) 5281 return true 5282 } 5283 } 5284 func rewriteValueS390X_OpOr32_0(v *Value) bool { 5285 // match: (Or32 x y) 5286 // cond: 5287 // result: (ORW x y) 5288 for { 5289 _ = v.Args[1] 5290 x := v.Args[0] 5291 y := v.Args[1] 5292 v.reset(OpS390XORW) 5293 v.AddArg(x) 5294 v.AddArg(y) 5295 return true 5296 } 5297 } 5298 func rewriteValueS390X_OpOr64_0(v *Value) bool { 5299 // match: (Or64 x y) 5300 // cond: 5301 // result: (OR x y) 5302 for { 5303 _ = v.Args[1] 5304 x := v.Args[0] 5305 y := v.Args[1] 5306 v.reset(OpS390XOR) 5307 v.AddArg(x) 5308 v.AddArg(y) 5309 return true 5310 } 5311 } 5312 func rewriteValueS390X_OpOr8_0(v *Value) bool { 5313 // match: (Or8 x y) 5314 // cond: 5315 // result: (ORW x y) 5316 for { 5317 _ = v.Args[1] 5318 x := v.Args[0] 5319 y := v.Args[1] 5320 v.reset(OpS390XORW) 5321 v.AddArg(x) 5322 v.AddArg(y) 5323 return true 5324 } 5325 } 5326 func rewriteValueS390X_OpOrB_0(v *Value) bool { 5327 // match: (OrB x y) 5328 // cond: 5329 // result: (ORW x y) 5330 for { 5331 _ = v.Args[1] 5332 x := v.Args[0] 5333 y := v.Args[1] 5334 v.reset(OpS390XORW) 5335 v.AddArg(x) 5336 v.AddArg(y) 5337 return true 5338 } 5339 } 5340 func rewriteValueS390X_OpPopCount16_0(v *Value) bool { 5341 b := v.Block 5342 _ = b 5343 typ := &b.Func.Config.Types 5344 _ = typ 5345 // match: (PopCount16 x) 5346 // cond: 5347 // result: (MOVBZreg (SumBytes2 (POPCNT <typ.UInt16> x))) 5348 for { 5349 x := v.Args[0] 5350 v.reset(OpS390XMOVBZreg) 5351 v0 := b.NewValue0(v.Pos, OpS390XSumBytes2, typ.UInt8) 5352 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt16) 5353 v1.AddArg(x) 5354 v0.AddArg(v1) 5355 v.AddArg(v0) 5356 return true 5357 } 5358 } 5359 func rewriteValueS390X_OpPopCount32_0(v *Value) bool { 5360 b := v.Block 5361 _ = b 5362 typ := &b.Func.Config.Types 5363 _ = typ 5364 // match: (PopCount32 x) 5365 // cond: 5366 // result: (MOVBZreg (SumBytes4 (POPCNT <typ.UInt32> x))) 5367 for { 5368 x := v.Args[0] 5369 v.reset(OpS390XMOVBZreg) 5370 v0 := b.NewValue0(v.Pos, OpS390XSumBytes4, typ.UInt8) 5371 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt32) 5372 v1.AddArg(x) 5373 v0.AddArg(v1) 5374 v.AddArg(v0) 5375 return true 5376 } 5377 } 5378 func rewriteValueS390X_OpPopCount64_0(v *Value) bool { 5379 b := v.Block 5380 _ = b 5381 typ := &b.Func.Config.Types 5382 _ = typ 5383 // match: (PopCount64 x) 5384 // cond: 5385 // result: (MOVBZreg (SumBytes8 (POPCNT <typ.UInt64> x))) 5386 for { 5387 x := v.Args[0] 5388 v.reset(OpS390XMOVBZreg) 5389 v0 := b.NewValue0(v.Pos, OpS390XSumBytes8, typ.UInt8) 5390 v1 := b.NewValue0(v.Pos, OpS390XPOPCNT, typ.UInt64) 5391 v1.AddArg(x) 5392 v0.AddArg(v1) 5393 v.AddArg(v0) 5394 return true 5395 } 5396 } 5397 func rewriteValueS390X_OpPopCount8_0(v *Value) bool { 5398 b := v.Block 5399 _ = b 5400 typ := &b.Func.Config.Types 5401 _ = typ 5402 // match: (PopCount8 x) 5403 // cond: 5404 // result: (POPCNT (MOVBZreg x)) 5405 for { 5406 x := v.Args[0] 5407 v.reset(OpS390XPOPCNT) 5408 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5409 v0.AddArg(x) 5410 v.AddArg(v0) 5411 return true 5412 } 5413 } 5414 func rewriteValueS390X_OpRotateLeft32_0(v *Value) bool { 5415 // match: (RotateLeft32 x y) 5416 // cond: 5417 // result: (RLL x y) 5418 for { 5419 _ = v.Args[1] 5420 x := v.Args[0] 5421 y := v.Args[1] 5422 v.reset(OpS390XRLL) 5423 v.AddArg(x) 5424 v.AddArg(y) 5425 return true 5426 } 5427 } 5428 func rewriteValueS390X_OpRotateLeft64_0(v *Value) bool { 5429 // match: (RotateLeft64 x y) 5430 // cond: 5431 // result: (RLLG x y) 5432 for { 5433 _ = v.Args[1] 5434 x := v.Args[0] 5435 y := v.Args[1] 5436 v.reset(OpS390XRLLG) 5437 v.AddArg(x) 5438 v.AddArg(y) 5439 return true 5440 } 5441 } 5442 func rewriteValueS390X_OpRound_0(v *Value) bool { 5443 // match: (Round x) 5444 // cond: 5445 // result: (FIDBR [1] x) 5446 for { 5447 x := v.Args[0] 5448 v.reset(OpS390XFIDBR) 5449 v.AuxInt = 1 5450 v.AddArg(x) 5451 return true 5452 } 5453 } 5454 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 5455 // match: (Round32F x) 5456 // cond: 5457 // result: (LoweredRound32F x) 5458 for { 5459 x := v.Args[0] 5460 v.reset(OpS390XLoweredRound32F) 5461 v.AddArg(x) 5462 return true 5463 } 5464 } 5465 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 5466 // match: (Round64F x) 5467 // cond: 5468 // result: (LoweredRound64F x) 5469 for { 5470 x := v.Args[0] 5471 v.reset(OpS390XLoweredRound64F) 5472 v.AddArg(x) 5473 return true 5474 } 5475 } 5476 func rewriteValueS390X_OpRoundToEven_0(v *Value) bool { 5477 // match: (RoundToEven x) 5478 // cond: 5479 // result: (FIDBR [4] x) 5480 for { 5481 x := v.Args[0] 5482 v.reset(OpS390XFIDBR) 5483 v.AuxInt = 4 5484 v.AddArg(x) 5485 return true 5486 } 5487 } 5488 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 5489 b := v.Block 5490 _ = b 5491 typ := &b.Func.Config.Types 5492 _ = typ 5493 // match: (Rsh16Ux16 x y) 5494 // cond: shiftIsBounded(v) 5495 // result: (SRW (MOVHZreg x) y) 5496 for { 5497 _ = v.Args[1] 5498 x := v.Args[0] 5499 y := v.Args[1] 5500 if !(shiftIsBounded(v)) { 5501 break 5502 } 5503 v.reset(OpS390XSRW) 5504 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5505 v0.AddArg(x) 5506 v.AddArg(v0) 5507 v.AddArg(y) 5508 return true 5509 } 5510 // match: (Rsh16Ux16 <t> x y) 5511 // cond: 5512 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 5513 for { 5514 t := v.Type 5515 _ = v.Args[1] 5516 x := v.Args[0] 5517 y := v.Args[1] 5518 v.reset(OpS390XMOVDGE) 5519 v.Type = t 5520 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5521 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5522 v1.AddArg(x) 5523 v0.AddArg(v1) 5524 v0.AddArg(y) 5525 v.AddArg(v0) 5526 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5527 v2.AuxInt = 0 5528 v.AddArg(v2) 5529 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5530 v3.AuxInt = 64 5531 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5532 v4.AddArg(y) 5533 v3.AddArg(v4) 5534 v.AddArg(v3) 5535 return true 5536 } 5537 } 5538 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 5539 b := v.Block 5540 _ = b 5541 typ := &b.Func.Config.Types 5542 _ = typ 5543 // match: (Rsh16Ux32 x y) 5544 // cond: shiftIsBounded(v) 5545 // result: (SRW (MOVHZreg x) y) 5546 for { 5547 _ = v.Args[1] 5548 x := v.Args[0] 5549 y := v.Args[1] 5550 if !(shiftIsBounded(v)) { 5551 break 5552 } 5553 v.reset(OpS390XSRW) 5554 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5555 v0.AddArg(x) 5556 v.AddArg(v0) 5557 v.AddArg(y) 5558 return true 5559 } 5560 // match: (Rsh16Ux32 <t> x y) 5561 // cond: 5562 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) 5563 for { 5564 t := v.Type 5565 _ = v.Args[1] 5566 x := v.Args[0] 5567 y := v.Args[1] 5568 v.reset(OpS390XMOVDGE) 5569 v.Type = t 5570 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5571 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5572 v1.AddArg(x) 5573 v0.AddArg(v1) 5574 v0.AddArg(y) 5575 v.AddArg(v0) 5576 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5577 v2.AuxInt = 0 5578 v.AddArg(v2) 5579 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5580 v3.AuxInt = 64 5581 v3.AddArg(y) 5582 v.AddArg(v3) 5583 return true 5584 } 5585 } 5586 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 5587 b := v.Block 5588 _ = b 5589 typ := &b.Func.Config.Types 5590 _ = typ 5591 // match: (Rsh16Ux64 x y) 5592 // cond: shiftIsBounded(v) 5593 // result: (SRW (MOVHZreg x) y) 5594 for { 5595 _ = v.Args[1] 5596 x := v.Args[0] 5597 y := v.Args[1] 5598 if !(shiftIsBounded(v)) { 5599 break 5600 } 5601 v.reset(OpS390XSRW) 5602 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5603 v0.AddArg(x) 5604 v.AddArg(v0) 5605 v.AddArg(y) 5606 return true 5607 } 5608 // match: (Rsh16Ux64 <t> x y) 5609 // cond: 5610 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) 5611 for { 5612 t := v.Type 5613 _ = v.Args[1] 5614 x := v.Args[0] 5615 y := v.Args[1] 5616 v.reset(OpS390XMOVDGE) 5617 v.Type = t 5618 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5619 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5620 v1.AddArg(x) 5621 v0.AddArg(v1) 5622 v0.AddArg(y) 5623 v.AddArg(v0) 5624 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5625 v2.AuxInt = 0 5626 v.AddArg(v2) 5627 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5628 v3.AuxInt = 64 5629 v3.AddArg(y) 5630 v.AddArg(v3) 5631 return true 5632 } 5633 } 5634 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5635 b := v.Block 5636 _ = b 5637 typ := &b.Func.Config.Types 5638 _ = typ 5639 // match: (Rsh16Ux8 x y) 5640 // cond: shiftIsBounded(v) 5641 // result: (SRW (MOVHZreg x) y) 5642 for { 5643 _ = v.Args[1] 5644 x := v.Args[0] 5645 y := v.Args[1] 5646 if !(shiftIsBounded(v)) { 5647 break 5648 } 5649 v.reset(OpS390XSRW) 5650 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5651 v0.AddArg(x) 5652 v.AddArg(v0) 5653 v.AddArg(y) 5654 return true 5655 } 5656 // match: (Rsh16Ux8 <t> x y) 5657 // cond: 5658 // result: (MOVDGE <t> (SRW <t> (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 5659 for { 5660 t := v.Type 5661 _ = v.Args[1] 5662 x := v.Args[0] 5663 y := v.Args[1] 5664 v.reset(OpS390XMOVDGE) 5665 v.Type = t 5666 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5667 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5668 v1.AddArg(x) 5669 v0.AddArg(v1) 5670 v0.AddArg(y) 5671 v.AddArg(v0) 5672 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5673 v2.AuxInt = 0 5674 v.AddArg(v2) 5675 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5676 v3.AuxInt = 64 5677 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5678 v4.AddArg(y) 5679 v3.AddArg(v4) 5680 v.AddArg(v3) 5681 return true 5682 } 5683 } 5684 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5685 b := v.Block 5686 _ = b 5687 typ := &b.Func.Config.Types 5688 _ = typ 5689 // match: (Rsh16x16 x y) 5690 // cond: shiftIsBounded(v) 5691 // result: (SRAW (MOVHreg x) y) 5692 for { 5693 _ = v.Args[1] 5694 x := v.Args[0] 5695 y := v.Args[1] 5696 if !(shiftIsBounded(v)) { 5697 break 5698 } 5699 v.reset(OpS390XSRAW) 5700 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5701 v0.AddArg(x) 5702 v.AddArg(v0) 5703 v.AddArg(y) 5704 return true 5705 } 5706 // match: (Rsh16x16 x y) 5707 // cond: 5708 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 5709 for { 5710 _ = v.Args[1] 5711 x := v.Args[0] 5712 y := v.Args[1] 5713 v.reset(OpS390XSRAW) 5714 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5715 v0.AddArg(x) 5716 v.AddArg(v0) 5717 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5718 v1.AddArg(y) 5719 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5720 v2.AuxInt = 63 5721 v1.AddArg(v2) 5722 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5723 v3.AuxInt = 64 5724 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5725 v4.AddArg(y) 5726 v3.AddArg(v4) 5727 v1.AddArg(v3) 5728 v.AddArg(v1) 5729 return true 5730 } 5731 } 5732 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5733 b := v.Block 5734 _ = b 5735 typ := &b.Func.Config.Types 5736 _ = typ 5737 // match: (Rsh16x32 x y) 5738 // cond: shiftIsBounded(v) 5739 // result: (SRAW (MOVHreg x) y) 5740 for { 5741 _ = v.Args[1] 5742 x := v.Args[0] 5743 y := v.Args[1] 5744 if !(shiftIsBounded(v)) { 5745 break 5746 } 5747 v.reset(OpS390XSRAW) 5748 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5749 v0.AddArg(x) 5750 v.AddArg(v0) 5751 v.AddArg(y) 5752 return true 5753 } 5754 // match: (Rsh16x32 x y) 5755 // cond: 5756 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 5757 for { 5758 _ = v.Args[1] 5759 x := v.Args[0] 5760 y := v.Args[1] 5761 v.reset(OpS390XSRAW) 5762 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5763 v0.AddArg(x) 5764 v.AddArg(v0) 5765 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5766 v1.AddArg(y) 5767 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5768 v2.AuxInt = 63 5769 v1.AddArg(v2) 5770 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5771 v3.AuxInt = 64 5772 v3.AddArg(y) 5773 v1.AddArg(v3) 5774 v.AddArg(v1) 5775 return true 5776 } 5777 } 5778 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5779 b := v.Block 5780 _ = b 5781 typ := &b.Func.Config.Types 5782 _ = typ 5783 // match: (Rsh16x64 x y) 5784 // cond: shiftIsBounded(v) 5785 // result: (SRAW (MOVHreg x) y) 5786 for { 5787 _ = v.Args[1] 5788 x := v.Args[0] 5789 y := v.Args[1] 5790 if !(shiftIsBounded(v)) { 5791 break 5792 } 5793 v.reset(OpS390XSRAW) 5794 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5795 v0.AddArg(x) 5796 v.AddArg(v0) 5797 v.AddArg(y) 5798 return true 5799 } 5800 // match: (Rsh16x64 x y) 5801 // cond: 5802 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 5803 for { 5804 _ = v.Args[1] 5805 x := v.Args[0] 5806 y := v.Args[1] 5807 v.reset(OpS390XSRAW) 5808 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5809 v0.AddArg(x) 5810 v.AddArg(v0) 5811 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5812 v1.AddArg(y) 5813 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5814 v2.AuxInt = 63 5815 v1.AddArg(v2) 5816 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5817 v3.AuxInt = 64 5818 v3.AddArg(y) 5819 v1.AddArg(v3) 5820 v.AddArg(v1) 5821 return true 5822 } 5823 } 5824 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5825 b := v.Block 5826 _ = b 5827 typ := &b.Func.Config.Types 5828 _ = typ 5829 // match: (Rsh16x8 x y) 5830 // cond: shiftIsBounded(v) 5831 // result: (SRAW (MOVHreg x) y) 5832 for { 5833 _ = v.Args[1] 5834 x := v.Args[0] 5835 y := v.Args[1] 5836 if !(shiftIsBounded(v)) { 5837 break 5838 } 5839 v.reset(OpS390XSRAW) 5840 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5841 v0.AddArg(x) 5842 v.AddArg(v0) 5843 v.AddArg(y) 5844 return true 5845 } 5846 // match: (Rsh16x8 x y) 5847 // cond: 5848 // result: (SRAW (MOVHreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 5849 for { 5850 _ = v.Args[1] 5851 x := v.Args[0] 5852 y := v.Args[1] 5853 v.reset(OpS390XSRAW) 5854 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5855 v0.AddArg(x) 5856 v.AddArg(v0) 5857 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 5858 v1.AddArg(y) 5859 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 5860 v2.AuxInt = 63 5861 v1.AddArg(v2) 5862 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5863 v3.AuxInt = 64 5864 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5865 v4.AddArg(y) 5866 v3.AddArg(v4) 5867 v1.AddArg(v3) 5868 v.AddArg(v1) 5869 return true 5870 } 5871 } 5872 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5873 b := v.Block 5874 _ = b 5875 typ := &b.Func.Config.Types 5876 _ = typ 5877 // match: (Rsh32Ux16 x y) 5878 // cond: shiftIsBounded(v) 5879 // result: (SRW x y) 5880 for { 5881 _ = v.Args[1] 5882 x := v.Args[0] 5883 y := v.Args[1] 5884 if !(shiftIsBounded(v)) { 5885 break 5886 } 5887 v.reset(OpS390XSRW) 5888 v.AddArg(x) 5889 v.AddArg(y) 5890 return true 5891 } 5892 // match: (Rsh32Ux16 <t> x y) 5893 // cond: 5894 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 5895 for { 5896 t := v.Type 5897 _ = v.Args[1] 5898 x := v.Args[0] 5899 y := v.Args[1] 5900 v.reset(OpS390XMOVDGE) 5901 v.Type = t 5902 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5903 v0.AddArg(x) 5904 v0.AddArg(y) 5905 v.AddArg(v0) 5906 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5907 v1.AuxInt = 0 5908 v.AddArg(v1) 5909 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5910 v2.AuxInt = 64 5911 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5912 v3.AddArg(y) 5913 v2.AddArg(v3) 5914 v.AddArg(v2) 5915 return true 5916 } 5917 } 5918 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5919 b := v.Block 5920 _ = b 5921 typ := &b.Func.Config.Types 5922 _ = typ 5923 // match: (Rsh32Ux32 x y) 5924 // cond: shiftIsBounded(v) 5925 // result: (SRW x y) 5926 for { 5927 _ = v.Args[1] 5928 x := v.Args[0] 5929 y := v.Args[1] 5930 if !(shiftIsBounded(v)) { 5931 break 5932 } 5933 v.reset(OpS390XSRW) 5934 v.AddArg(x) 5935 v.AddArg(y) 5936 return true 5937 } 5938 // match: (Rsh32Ux32 <t> x y) 5939 // cond: 5940 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 5941 for { 5942 t := v.Type 5943 _ = v.Args[1] 5944 x := v.Args[0] 5945 y := v.Args[1] 5946 v.reset(OpS390XMOVDGE) 5947 v.Type = t 5948 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5949 v0.AddArg(x) 5950 v0.AddArg(y) 5951 v.AddArg(v0) 5952 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5953 v1.AuxInt = 0 5954 v.AddArg(v1) 5955 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5956 v2.AuxInt = 64 5957 v2.AddArg(y) 5958 v.AddArg(v2) 5959 return true 5960 } 5961 } 5962 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5963 b := v.Block 5964 _ = b 5965 typ := &b.Func.Config.Types 5966 _ = typ 5967 // match: (Rsh32Ux64 x y) 5968 // cond: shiftIsBounded(v) 5969 // result: (SRW x y) 5970 for { 5971 _ = v.Args[1] 5972 x := v.Args[0] 5973 y := v.Args[1] 5974 if !(shiftIsBounded(v)) { 5975 break 5976 } 5977 v.reset(OpS390XSRW) 5978 v.AddArg(x) 5979 v.AddArg(y) 5980 return true 5981 } 5982 // match: (Rsh32Ux64 <t> x y) 5983 // cond: 5984 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 5985 for { 5986 t := v.Type 5987 _ = v.Args[1] 5988 x := v.Args[0] 5989 y := v.Args[1] 5990 v.reset(OpS390XMOVDGE) 5991 v.Type = t 5992 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5993 v0.AddArg(x) 5994 v0.AddArg(y) 5995 v.AddArg(v0) 5996 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 5997 v1.AuxInt = 0 5998 v.AddArg(v1) 5999 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6000 v2.AuxInt = 64 6001 v2.AddArg(y) 6002 v.AddArg(v2) 6003 return true 6004 } 6005 } 6006 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 6007 b := v.Block 6008 _ = b 6009 typ := &b.Func.Config.Types 6010 _ = typ 6011 // match: (Rsh32Ux8 x y) 6012 // cond: shiftIsBounded(v) 6013 // result: (SRW x y) 6014 for { 6015 _ = v.Args[1] 6016 x := v.Args[0] 6017 y := v.Args[1] 6018 if !(shiftIsBounded(v)) { 6019 break 6020 } 6021 v.reset(OpS390XSRW) 6022 v.AddArg(x) 6023 v.AddArg(y) 6024 return true 6025 } 6026 // match: (Rsh32Ux8 <t> x y) 6027 // cond: 6028 // result: (MOVDGE <t> (SRW <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6029 for { 6030 t := v.Type 6031 _ = v.Args[1] 6032 x := v.Args[0] 6033 y := v.Args[1] 6034 v.reset(OpS390XMOVDGE) 6035 v.Type = t 6036 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6037 v0.AddArg(x) 6038 v0.AddArg(y) 6039 v.AddArg(v0) 6040 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6041 v1.AuxInt = 0 6042 v.AddArg(v1) 6043 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6044 v2.AuxInt = 64 6045 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6046 v3.AddArg(y) 6047 v2.AddArg(v3) 6048 v.AddArg(v2) 6049 return true 6050 } 6051 } 6052 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 6053 b := v.Block 6054 _ = b 6055 typ := &b.Func.Config.Types 6056 _ = typ 6057 // match: (Rsh32x16 x y) 6058 // cond: shiftIsBounded(v) 6059 // result: (SRAW x y) 6060 for { 6061 _ = v.Args[1] 6062 x := v.Args[0] 6063 y := v.Args[1] 6064 if !(shiftIsBounded(v)) { 6065 break 6066 } 6067 v.reset(OpS390XSRAW) 6068 v.AddArg(x) 6069 v.AddArg(y) 6070 return true 6071 } 6072 // match: (Rsh32x16 x y) 6073 // cond: 6074 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6075 for { 6076 _ = v.Args[1] 6077 x := v.Args[0] 6078 y := v.Args[1] 6079 v.reset(OpS390XSRAW) 6080 v.AddArg(x) 6081 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6082 v0.AddArg(y) 6083 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6084 v1.AuxInt = 63 6085 v0.AddArg(v1) 6086 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6087 v2.AuxInt = 64 6088 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6089 v3.AddArg(y) 6090 v2.AddArg(v3) 6091 v0.AddArg(v2) 6092 v.AddArg(v0) 6093 return true 6094 } 6095 } 6096 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 6097 b := v.Block 6098 _ = b 6099 // match: (Rsh32x32 x y) 6100 // cond: shiftIsBounded(v) 6101 // result: (SRAW x y) 6102 for { 6103 _ = v.Args[1] 6104 x := v.Args[0] 6105 y := v.Args[1] 6106 if !(shiftIsBounded(v)) { 6107 break 6108 } 6109 v.reset(OpS390XSRAW) 6110 v.AddArg(x) 6111 v.AddArg(y) 6112 return true 6113 } 6114 // match: (Rsh32x32 x y) 6115 // cond: 6116 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6117 for { 6118 _ = v.Args[1] 6119 x := v.Args[0] 6120 y := v.Args[1] 6121 v.reset(OpS390XSRAW) 6122 v.AddArg(x) 6123 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6124 v0.AddArg(y) 6125 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6126 v1.AuxInt = 63 6127 v0.AddArg(v1) 6128 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6129 v2.AuxInt = 64 6130 v2.AddArg(y) 6131 v0.AddArg(v2) 6132 v.AddArg(v0) 6133 return true 6134 } 6135 } 6136 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 6137 b := v.Block 6138 _ = b 6139 // match: (Rsh32x64 x y) 6140 // cond: shiftIsBounded(v) 6141 // result: (SRAW x y) 6142 for { 6143 _ = v.Args[1] 6144 x := v.Args[0] 6145 y := v.Args[1] 6146 if !(shiftIsBounded(v)) { 6147 break 6148 } 6149 v.reset(OpS390XSRAW) 6150 v.AddArg(x) 6151 v.AddArg(y) 6152 return true 6153 } 6154 // match: (Rsh32x64 x y) 6155 // cond: 6156 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6157 for { 6158 _ = v.Args[1] 6159 x := v.Args[0] 6160 y := v.Args[1] 6161 v.reset(OpS390XSRAW) 6162 v.AddArg(x) 6163 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6164 v0.AddArg(y) 6165 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6166 v1.AuxInt = 63 6167 v0.AddArg(v1) 6168 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6169 v2.AuxInt = 64 6170 v2.AddArg(y) 6171 v0.AddArg(v2) 6172 v.AddArg(v0) 6173 return true 6174 } 6175 } 6176 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 6177 b := v.Block 6178 _ = b 6179 typ := &b.Func.Config.Types 6180 _ = typ 6181 // match: (Rsh32x8 x y) 6182 // cond: shiftIsBounded(v) 6183 // result: (SRAW x y) 6184 for { 6185 _ = v.Args[1] 6186 x := v.Args[0] 6187 y := v.Args[1] 6188 if !(shiftIsBounded(v)) { 6189 break 6190 } 6191 v.reset(OpS390XSRAW) 6192 v.AddArg(x) 6193 v.AddArg(y) 6194 return true 6195 } 6196 // match: (Rsh32x8 x y) 6197 // cond: 6198 // result: (SRAW x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6199 for { 6200 _ = v.Args[1] 6201 x := v.Args[0] 6202 y := v.Args[1] 6203 v.reset(OpS390XSRAW) 6204 v.AddArg(x) 6205 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6206 v0.AddArg(y) 6207 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6208 v1.AuxInt = 63 6209 v0.AddArg(v1) 6210 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6211 v2.AuxInt = 64 6212 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6213 v3.AddArg(y) 6214 v2.AddArg(v3) 6215 v0.AddArg(v2) 6216 v.AddArg(v0) 6217 return true 6218 } 6219 } 6220 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 6221 b := v.Block 6222 _ = b 6223 typ := &b.Func.Config.Types 6224 _ = typ 6225 // match: (Rsh64Ux16 x y) 6226 // cond: shiftIsBounded(v) 6227 // result: (SRD x y) 6228 for { 6229 _ = v.Args[1] 6230 x := v.Args[0] 6231 y := v.Args[1] 6232 if !(shiftIsBounded(v)) { 6233 break 6234 } 6235 v.reset(OpS390XSRD) 6236 v.AddArg(x) 6237 v.AddArg(y) 6238 return true 6239 } 6240 // match: (Rsh64Ux16 <t> x y) 6241 // cond: 6242 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 6243 for { 6244 t := v.Type 6245 _ = v.Args[1] 6246 x := v.Args[0] 6247 y := v.Args[1] 6248 v.reset(OpS390XMOVDGE) 6249 v.Type = t 6250 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6251 v0.AddArg(x) 6252 v0.AddArg(y) 6253 v.AddArg(v0) 6254 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6255 v1.AuxInt = 0 6256 v.AddArg(v1) 6257 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6258 v2.AuxInt = 64 6259 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6260 v3.AddArg(y) 6261 v2.AddArg(v3) 6262 v.AddArg(v2) 6263 return true 6264 } 6265 } 6266 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 6267 b := v.Block 6268 _ = b 6269 typ := &b.Func.Config.Types 6270 _ = typ 6271 // match: (Rsh64Ux32 x y) 6272 // cond: shiftIsBounded(v) 6273 // result: (SRD x y) 6274 for { 6275 _ = v.Args[1] 6276 x := v.Args[0] 6277 y := v.Args[1] 6278 if !(shiftIsBounded(v)) { 6279 break 6280 } 6281 v.reset(OpS390XSRD) 6282 v.AddArg(x) 6283 v.AddArg(y) 6284 return true 6285 } 6286 // match: (Rsh64Ux32 <t> x y) 6287 // cond: 6288 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst y [64])) 6289 for { 6290 t := v.Type 6291 _ = v.Args[1] 6292 x := v.Args[0] 6293 y := v.Args[1] 6294 v.reset(OpS390XMOVDGE) 6295 v.Type = t 6296 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6297 v0.AddArg(x) 6298 v0.AddArg(y) 6299 v.AddArg(v0) 6300 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6301 v1.AuxInt = 0 6302 v.AddArg(v1) 6303 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6304 v2.AuxInt = 64 6305 v2.AddArg(y) 6306 v.AddArg(v2) 6307 return true 6308 } 6309 } 6310 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 6311 b := v.Block 6312 _ = b 6313 typ := &b.Func.Config.Types 6314 _ = typ 6315 // match: (Rsh64Ux64 x y) 6316 // cond: shiftIsBounded(v) 6317 // result: (SRD x y) 6318 for { 6319 _ = v.Args[1] 6320 x := v.Args[0] 6321 y := v.Args[1] 6322 if !(shiftIsBounded(v)) { 6323 break 6324 } 6325 v.reset(OpS390XSRD) 6326 v.AddArg(x) 6327 v.AddArg(y) 6328 return true 6329 } 6330 // match: (Rsh64Ux64 <t> x y) 6331 // cond: 6332 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPUconst y [64])) 6333 for { 6334 t := v.Type 6335 _ = v.Args[1] 6336 x := v.Args[0] 6337 y := v.Args[1] 6338 v.reset(OpS390XMOVDGE) 6339 v.Type = t 6340 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6341 v0.AddArg(x) 6342 v0.AddArg(y) 6343 v.AddArg(v0) 6344 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6345 v1.AuxInt = 0 6346 v.AddArg(v1) 6347 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6348 v2.AuxInt = 64 6349 v2.AddArg(y) 6350 v.AddArg(v2) 6351 return true 6352 } 6353 } 6354 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 6355 b := v.Block 6356 _ = b 6357 typ := &b.Func.Config.Types 6358 _ = typ 6359 // match: (Rsh64Ux8 x y) 6360 // cond: shiftIsBounded(v) 6361 // result: (SRD x y) 6362 for { 6363 _ = v.Args[1] 6364 x := v.Args[0] 6365 y := v.Args[1] 6366 if !(shiftIsBounded(v)) { 6367 break 6368 } 6369 v.reset(OpS390XSRD) 6370 v.AddArg(x) 6371 v.AddArg(y) 6372 return true 6373 } 6374 // match: (Rsh64Ux8 <t> x y) 6375 // cond: 6376 // result: (MOVDGE <t> (SRD <t> x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6377 for { 6378 t := v.Type 6379 _ = v.Args[1] 6380 x := v.Args[0] 6381 y := v.Args[1] 6382 v.reset(OpS390XMOVDGE) 6383 v.Type = t 6384 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 6385 v0.AddArg(x) 6386 v0.AddArg(y) 6387 v.AddArg(v0) 6388 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6389 v1.AuxInt = 0 6390 v.AddArg(v1) 6391 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6392 v2.AuxInt = 64 6393 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6394 v3.AddArg(y) 6395 v2.AddArg(v3) 6396 v.AddArg(v2) 6397 return true 6398 } 6399 } 6400 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 6401 b := v.Block 6402 _ = b 6403 typ := &b.Func.Config.Types 6404 _ = typ 6405 // match: (Rsh64x16 x y) 6406 // cond: shiftIsBounded(v) 6407 // result: (SRAD x y) 6408 for { 6409 _ = v.Args[1] 6410 x := v.Args[0] 6411 y := v.Args[1] 6412 if !(shiftIsBounded(v)) { 6413 break 6414 } 6415 v.reset(OpS390XSRAD) 6416 v.AddArg(x) 6417 v.AddArg(y) 6418 return true 6419 } 6420 // match: (Rsh64x16 x y) 6421 // cond: 6422 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6423 for { 6424 _ = v.Args[1] 6425 x := v.Args[0] 6426 y := v.Args[1] 6427 v.reset(OpS390XSRAD) 6428 v.AddArg(x) 6429 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6430 v0.AddArg(y) 6431 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6432 v1.AuxInt = 63 6433 v0.AddArg(v1) 6434 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6435 v2.AuxInt = 64 6436 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6437 v3.AddArg(y) 6438 v2.AddArg(v3) 6439 v0.AddArg(v2) 6440 v.AddArg(v0) 6441 return true 6442 } 6443 } 6444 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 6445 b := v.Block 6446 _ = b 6447 // match: (Rsh64x32 x y) 6448 // cond: shiftIsBounded(v) 6449 // result: (SRAD x y) 6450 for { 6451 _ = v.Args[1] 6452 x := v.Args[0] 6453 y := v.Args[1] 6454 if !(shiftIsBounded(v)) { 6455 break 6456 } 6457 v.reset(OpS390XSRAD) 6458 v.AddArg(x) 6459 v.AddArg(y) 6460 return true 6461 } 6462 // match: (Rsh64x32 x y) 6463 // cond: 6464 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6465 for { 6466 _ = v.Args[1] 6467 x := v.Args[0] 6468 y := v.Args[1] 6469 v.reset(OpS390XSRAD) 6470 v.AddArg(x) 6471 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6472 v0.AddArg(y) 6473 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6474 v1.AuxInt = 63 6475 v0.AddArg(v1) 6476 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6477 v2.AuxInt = 64 6478 v2.AddArg(y) 6479 v0.AddArg(v2) 6480 v.AddArg(v0) 6481 return true 6482 } 6483 } 6484 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 6485 b := v.Block 6486 _ = b 6487 // match: (Rsh64x64 x y) 6488 // cond: shiftIsBounded(v) 6489 // result: (SRAD x y) 6490 for { 6491 _ = v.Args[1] 6492 x := v.Args[0] 6493 y := v.Args[1] 6494 if !(shiftIsBounded(v)) { 6495 break 6496 } 6497 v.reset(OpS390XSRAD) 6498 v.AddArg(x) 6499 v.AddArg(y) 6500 return true 6501 } 6502 // match: (Rsh64x64 x y) 6503 // cond: 6504 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6505 for { 6506 _ = v.Args[1] 6507 x := v.Args[0] 6508 y := v.Args[1] 6509 v.reset(OpS390XSRAD) 6510 v.AddArg(x) 6511 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6512 v0.AddArg(y) 6513 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6514 v1.AuxInt = 63 6515 v0.AddArg(v1) 6516 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6517 v2.AuxInt = 64 6518 v2.AddArg(y) 6519 v0.AddArg(v2) 6520 v.AddArg(v0) 6521 return true 6522 } 6523 } 6524 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 6525 b := v.Block 6526 _ = b 6527 typ := &b.Func.Config.Types 6528 _ = typ 6529 // match: (Rsh64x8 x y) 6530 // cond: shiftIsBounded(v) 6531 // result: (SRAD x y) 6532 for { 6533 _ = v.Args[1] 6534 x := v.Args[0] 6535 y := v.Args[1] 6536 if !(shiftIsBounded(v)) { 6537 break 6538 } 6539 v.reset(OpS390XSRAD) 6540 v.AddArg(x) 6541 v.AddArg(y) 6542 return true 6543 } 6544 // match: (Rsh64x8 x y) 6545 // cond: 6546 // result: (SRAD x (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6547 for { 6548 _ = v.Args[1] 6549 x := v.Args[0] 6550 y := v.Args[1] 6551 v.reset(OpS390XSRAD) 6552 v.AddArg(x) 6553 v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6554 v0.AddArg(y) 6555 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6556 v1.AuxInt = 63 6557 v0.AddArg(v1) 6558 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6559 v2.AuxInt = 64 6560 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6561 v3.AddArg(y) 6562 v2.AddArg(v3) 6563 v0.AddArg(v2) 6564 v.AddArg(v0) 6565 return true 6566 } 6567 } 6568 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 6569 b := v.Block 6570 _ = b 6571 typ := &b.Func.Config.Types 6572 _ = typ 6573 // match: (Rsh8Ux16 x y) 6574 // cond: shiftIsBounded(v) 6575 // result: (SRW (MOVBZreg x) y) 6576 for { 6577 _ = v.Args[1] 6578 x := v.Args[0] 6579 y := v.Args[1] 6580 if !(shiftIsBounded(v)) { 6581 break 6582 } 6583 v.reset(OpS390XSRW) 6584 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6585 v0.AddArg(x) 6586 v.AddArg(v0) 6587 v.AddArg(y) 6588 return true 6589 } 6590 // match: (Rsh8Ux16 <t> x y) 6591 // cond: 6592 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) 6593 for { 6594 t := v.Type 6595 _ = v.Args[1] 6596 x := v.Args[0] 6597 y := v.Args[1] 6598 v.reset(OpS390XMOVDGE) 6599 v.Type = t 6600 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6601 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6602 v1.AddArg(x) 6603 v0.AddArg(v1) 6604 v0.AddArg(y) 6605 v.AddArg(v0) 6606 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6607 v2.AuxInt = 0 6608 v.AddArg(v2) 6609 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6610 v3.AuxInt = 64 6611 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6612 v4.AddArg(y) 6613 v3.AddArg(v4) 6614 v.AddArg(v3) 6615 return true 6616 } 6617 } 6618 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 6619 b := v.Block 6620 _ = b 6621 typ := &b.Func.Config.Types 6622 _ = typ 6623 // match: (Rsh8Ux32 x y) 6624 // cond: shiftIsBounded(v) 6625 // result: (SRW (MOVBZreg x) y) 6626 for { 6627 _ = v.Args[1] 6628 x := v.Args[0] 6629 y := v.Args[1] 6630 if !(shiftIsBounded(v)) { 6631 break 6632 } 6633 v.reset(OpS390XSRW) 6634 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6635 v0.AddArg(x) 6636 v.AddArg(v0) 6637 v.AddArg(y) 6638 return true 6639 } 6640 // match: (Rsh8Ux32 <t> x y) 6641 // cond: 6642 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) 6643 for { 6644 t := v.Type 6645 _ = v.Args[1] 6646 x := v.Args[0] 6647 y := v.Args[1] 6648 v.reset(OpS390XMOVDGE) 6649 v.Type = t 6650 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6651 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6652 v1.AddArg(x) 6653 v0.AddArg(v1) 6654 v0.AddArg(y) 6655 v.AddArg(v0) 6656 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6657 v2.AuxInt = 0 6658 v.AddArg(v2) 6659 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6660 v3.AuxInt = 64 6661 v3.AddArg(y) 6662 v.AddArg(v3) 6663 return true 6664 } 6665 } 6666 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 6667 b := v.Block 6668 _ = b 6669 typ := &b.Func.Config.Types 6670 _ = typ 6671 // match: (Rsh8Ux64 x y) 6672 // cond: shiftIsBounded(v) 6673 // result: (SRW (MOVBZreg x) y) 6674 for { 6675 _ = v.Args[1] 6676 x := v.Args[0] 6677 y := v.Args[1] 6678 if !(shiftIsBounded(v)) { 6679 break 6680 } 6681 v.reset(OpS390XSRW) 6682 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6683 v0.AddArg(x) 6684 v.AddArg(v0) 6685 v.AddArg(y) 6686 return true 6687 } 6688 // match: (Rsh8Ux64 <t> x y) 6689 // cond: 6690 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) 6691 for { 6692 t := v.Type 6693 _ = v.Args[1] 6694 x := v.Args[0] 6695 y := v.Args[1] 6696 v.reset(OpS390XMOVDGE) 6697 v.Type = t 6698 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6699 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6700 v1.AddArg(x) 6701 v0.AddArg(v1) 6702 v0.AddArg(y) 6703 v.AddArg(v0) 6704 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6705 v2.AuxInt = 0 6706 v.AddArg(v2) 6707 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6708 v3.AuxInt = 64 6709 v3.AddArg(y) 6710 v.AddArg(v3) 6711 return true 6712 } 6713 } 6714 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 6715 b := v.Block 6716 _ = b 6717 typ := &b.Func.Config.Types 6718 _ = typ 6719 // match: (Rsh8Ux8 x y) 6720 // cond: shiftIsBounded(v) 6721 // result: (SRW (MOVBZreg x) y) 6722 for { 6723 _ = v.Args[1] 6724 x := v.Args[0] 6725 y := v.Args[1] 6726 if !(shiftIsBounded(v)) { 6727 break 6728 } 6729 v.reset(OpS390XSRW) 6730 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6731 v0.AddArg(x) 6732 v.AddArg(v0) 6733 v.AddArg(y) 6734 return true 6735 } 6736 // match: (Rsh8Ux8 <t> x y) 6737 // cond: 6738 // result: (MOVDGE <t> (SRW <t> (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) 6739 for { 6740 t := v.Type 6741 _ = v.Args[1] 6742 x := v.Args[0] 6743 y := v.Args[1] 6744 v.reset(OpS390XMOVDGE) 6745 v.Type = t 6746 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 6747 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6748 v1.AddArg(x) 6749 v0.AddArg(v1) 6750 v0.AddArg(y) 6751 v.AddArg(v0) 6752 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 6753 v2.AuxInt = 0 6754 v.AddArg(v2) 6755 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6756 v3.AuxInt = 64 6757 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6758 v4.AddArg(y) 6759 v3.AddArg(v4) 6760 v.AddArg(v3) 6761 return true 6762 } 6763 } 6764 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 6765 b := v.Block 6766 _ = b 6767 typ := &b.Func.Config.Types 6768 _ = typ 6769 // match: (Rsh8x16 x y) 6770 // cond: shiftIsBounded(v) 6771 // result: (SRAW (MOVBreg x) y) 6772 for { 6773 _ = v.Args[1] 6774 x := v.Args[0] 6775 y := v.Args[1] 6776 if !(shiftIsBounded(v)) { 6777 break 6778 } 6779 v.reset(OpS390XSRAW) 6780 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6781 v0.AddArg(x) 6782 v.AddArg(v0) 6783 v.AddArg(y) 6784 return true 6785 } 6786 // match: (Rsh8x16 x y) 6787 // cond: 6788 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVHZreg y) [64]))) 6789 for { 6790 _ = v.Args[1] 6791 x := v.Args[0] 6792 y := v.Args[1] 6793 v.reset(OpS390XSRAW) 6794 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6795 v0.AddArg(x) 6796 v.AddArg(v0) 6797 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6798 v1.AddArg(y) 6799 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6800 v2.AuxInt = 63 6801 v1.AddArg(v2) 6802 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6803 v3.AuxInt = 64 6804 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 6805 v4.AddArg(y) 6806 v3.AddArg(v4) 6807 v1.AddArg(v3) 6808 v.AddArg(v1) 6809 return true 6810 } 6811 } 6812 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 6813 b := v.Block 6814 _ = b 6815 typ := &b.Func.Config.Types 6816 _ = typ 6817 // match: (Rsh8x32 x y) 6818 // cond: shiftIsBounded(v) 6819 // result: (SRAW (MOVBreg x) y) 6820 for { 6821 _ = v.Args[1] 6822 x := v.Args[0] 6823 y := v.Args[1] 6824 if !(shiftIsBounded(v)) { 6825 break 6826 } 6827 v.reset(OpS390XSRAW) 6828 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6829 v0.AddArg(x) 6830 v.AddArg(v0) 6831 v.AddArg(y) 6832 return true 6833 } 6834 // match: (Rsh8x32 x y) 6835 // cond: 6836 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst y [64]))) 6837 for { 6838 _ = v.Args[1] 6839 x := v.Args[0] 6840 y := v.Args[1] 6841 v.reset(OpS390XSRAW) 6842 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6843 v0.AddArg(x) 6844 v.AddArg(v0) 6845 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6846 v1.AddArg(y) 6847 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6848 v2.AuxInt = 63 6849 v1.AddArg(v2) 6850 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6851 v3.AuxInt = 64 6852 v3.AddArg(y) 6853 v1.AddArg(v3) 6854 v.AddArg(v1) 6855 return true 6856 } 6857 } 6858 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 6859 b := v.Block 6860 _ = b 6861 typ := &b.Func.Config.Types 6862 _ = typ 6863 // match: (Rsh8x64 x y) 6864 // cond: shiftIsBounded(v) 6865 // result: (SRAW (MOVBreg x) y) 6866 for { 6867 _ = v.Args[1] 6868 x := v.Args[0] 6869 y := v.Args[1] 6870 if !(shiftIsBounded(v)) { 6871 break 6872 } 6873 v.reset(OpS390XSRAW) 6874 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6875 v0.AddArg(x) 6876 v.AddArg(v0) 6877 v.AddArg(y) 6878 return true 6879 } 6880 // match: (Rsh8x64 x y) 6881 // cond: 6882 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPUconst y [64]))) 6883 for { 6884 _ = v.Args[1] 6885 x := v.Args[0] 6886 y := v.Args[1] 6887 v.reset(OpS390XSRAW) 6888 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6889 v0.AddArg(x) 6890 v.AddArg(v0) 6891 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6892 v1.AddArg(y) 6893 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6894 v2.AuxInt = 63 6895 v1.AddArg(v2) 6896 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 6897 v3.AuxInt = 64 6898 v3.AddArg(y) 6899 v1.AddArg(v3) 6900 v.AddArg(v1) 6901 return true 6902 } 6903 } 6904 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 6905 b := v.Block 6906 _ = b 6907 typ := &b.Func.Config.Types 6908 _ = typ 6909 // match: (Rsh8x8 x y) 6910 // cond: shiftIsBounded(v) 6911 // result: (SRAW (MOVBreg x) y) 6912 for { 6913 _ = v.Args[1] 6914 x := v.Args[0] 6915 y := v.Args[1] 6916 if !(shiftIsBounded(v)) { 6917 break 6918 } 6919 v.reset(OpS390XSRAW) 6920 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6921 v0.AddArg(x) 6922 v.AddArg(v0) 6923 v.AddArg(y) 6924 return true 6925 } 6926 // match: (Rsh8x8 x y) 6927 // cond: 6928 // result: (SRAW (MOVBreg x) (MOVDGE <y.Type> y (MOVDconst <y.Type> [63]) (CMPWUconst (MOVBZreg y) [64]))) 6929 for { 6930 _ = v.Args[1] 6931 x := v.Args[0] 6932 y := v.Args[1] 6933 v.reset(OpS390XSRAW) 6934 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 6935 v0.AddArg(x) 6936 v.AddArg(v0) 6937 v1 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) 6938 v1.AddArg(y) 6939 v2 := b.NewValue0(v.Pos, OpS390XMOVDconst, y.Type) 6940 v2.AuxInt = 63 6941 v1.AddArg(v2) 6942 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6943 v3.AuxInt = 64 6944 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6945 v4.AddArg(y) 6946 v3.AddArg(v4) 6947 v1.AddArg(v3) 6948 v.AddArg(v1) 6949 return true 6950 } 6951 } 6952 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 6953 // match: (ADD x (MOVDconst [c])) 6954 // cond: is32Bit(c) 6955 // result: (ADDconst [c] x) 6956 for { 6957 _ = v.Args[1] 6958 x := v.Args[0] 6959 v_1 := v.Args[1] 6960 if v_1.Op != OpS390XMOVDconst { 6961 break 6962 } 6963 c := v_1.AuxInt 6964 if !(is32Bit(c)) { 6965 break 6966 } 6967 v.reset(OpS390XADDconst) 6968 v.AuxInt = c 6969 v.AddArg(x) 6970 return true 6971 } 6972 // match: (ADD (MOVDconst [c]) x) 6973 // cond: is32Bit(c) 6974 // result: (ADDconst [c] x) 6975 for { 6976 _ = v.Args[1] 6977 v_0 := v.Args[0] 6978 if v_0.Op != OpS390XMOVDconst { 6979 break 6980 } 6981 c := v_0.AuxInt 6982 x := v.Args[1] 6983 if !(is32Bit(c)) { 6984 break 6985 } 6986 v.reset(OpS390XADDconst) 6987 v.AuxInt = c 6988 v.AddArg(x) 6989 return true 6990 } 6991 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 6992 // cond: d == 64-c 6993 // result: (RLLGconst [c] x) 6994 for { 6995 _ = v.Args[1] 6996 v_0 := v.Args[0] 6997 if v_0.Op != OpS390XSLDconst { 6998 break 6999 } 7000 c := v_0.AuxInt 7001 x := v_0.Args[0] 7002 v_1 := v.Args[1] 7003 if v_1.Op != OpS390XSRDconst { 7004 break 7005 } 7006 d := v_1.AuxInt 7007 if x != v_1.Args[0] { 7008 break 7009 } 7010 if !(d == 64-c) { 7011 break 7012 } 7013 v.reset(OpS390XRLLGconst) 7014 v.AuxInt = c 7015 v.AddArg(x) 7016 return true 7017 } 7018 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 7019 // cond: d == 64-c 7020 // result: (RLLGconst [c] x) 7021 for { 7022 _ = v.Args[1] 7023 v_0 := v.Args[0] 7024 if v_0.Op != OpS390XSRDconst { 7025 break 7026 } 7027 d := v_0.AuxInt 7028 x := v_0.Args[0] 7029 v_1 := v.Args[1] 7030 if v_1.Op != OpS390XSLDconst { 7031 break 7032 } 7033 c := v_1.AuxInt 7034 if x != v_1.Args[0] { 7035 break 7036 } 7037 if !(d == 64-c) { 7038 break 7039 } 7040 v.reset(OpS390XRLLGconst) 7041 v.AuxInt = c 7042 v.AddArg(x) 7043 return true 7044 } 7045 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 7046 // cond: ptr.Op != OpSB && idx.Op != OpSB 7047 // result: (MOVDaddridx [c] {s} ptr idx) 7048 for { 7049 _ = v.Args[1] 7050 idx := v.Args[0] 7051 v_1 := v.Args[1] 7052 if v_1.Op != OpS390XMOVDaddr { 7053 break 7054 } 7055 c := v_1.AuxInt 7056 s := v_1.Aux 7057 ptr := v_1.Args[0] 7058 if !(ptr.Op != OpSB && idx.Op != OpSB) { 7059 break 7060 } 7061 v.reset(OpS390XMOVDaddridx) 7062 v.AuxInt = c 7063 v.Aux = s 7064 v.AddArg(ptr) 7065 v.AddArg(idx) 7066 return true 7067 } 7068 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 7069 // cond: ptr.Op != OpSB && idx.Op != OpSB 7070 // result: (MOVDaddridx [c] {s} ptr idx) 7071 for { 7072 _ = v.Args[1] 7073 v_0 := v.Args[0] 7074 if v_0.Op != OpS390XMOVDaddr { 7075 break 7076 } 7077 c := v_0.AuxInt 7078 s := v_0.Aux 7079 ptr := v_0.Args[0] 7080 idx := v.Args[1] 7081 if !(ptr.Op != OpSB && idx.Op != OpSB) { 7082 break 7083 } 7084 v.reset(OpS390XMOVDaddridx) 7085 v.AuxInt = c 7086 v.Aux = s 7087 v.AddArg(ptr) 7088 v.AddArg(idx) 7089 return true 7090 } 7091 // match: (ADD x (NEG y)) 7092 // cond: 7093 // result: (SUB x y) 7094 for { 7095 _ = v.Args[1] 7096 x := v.Args[0] 7097 v_1 := v.Args[1] 7098 if v_1.Op != OpS390XNEG { 7099 break 7100 } 7101 y := v_1.Args[0] 7102 v.reset(OpS390XSUB) 7103 v.AddArg(x) 7104 v.AddArg(y) 7105 return true 7106 } 7107 // match: (ADD (NEG y) x) 7108 // cond: 7109 // result: (SUB x y) 7110 for { 7111 _ = v.Args[1] 7112 v_0 := v.Args[0] 7113 if v_0.Op != OpS390XNEG { 7114 break 7115 } 7116 y := v_0.Args[0] 7117 x := v.Args[1] 7118 v.reset(OpS390XSUB) 7119 v.AddArg(x) 7120 v.AddArg(y) 7121 return true 7122 } 7123 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 7124 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7125 // result: (ADDload <t> [off] {sym} x ptr mem) 7126 for { 7127 t := v.Type 7128 _ = v.Args[1] 7129 x := v.Args[0] 7130 g := v.Args[1] 7131 if g.Op != OpS390XMOVDload { 7132 break 7133 } 7134 off := g.AuxInt 7135 sym := g.Aux 7136 _ = g.Args[1] 7137 ptr := g.Args[0] 7138 mem := g.Args[1] 7139 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7140 break 7141 } 7142 v.reset(OpS390XADDload) 7143 v.Type = t 7144 v.AuxInt = off 7145 v.Aux = sym 7146 v.AddArg(x) 7147 v.AddArg(ptr) 7148 v.AddArg(mem) 7149 return true 7150 } 7151 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 7152 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7153 // result: (ADDload <t> [off] {sym} x ptr mem) 7154 for { 7155 t := v.Type 7156 _ = v.Args[1] 7157 g := v.Args[0] 7158 if g.Op != OpS390XMOVDload { 7159 break 7160 } 7161 off := g.AuxInt 7162 sym := g.Aux 7163 _ = g.Args[1] 7164 ptr := g.Args[0] 7165 mem := g.Args[1] 7166 x := v.Args[1] 7167 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7168 break 7169 } 7170 v.reset(OpS390XADDload) 7171 v.Type = t 7172 v.AuxInt = off 7173 v.Aux = sym 7174 v.AddArg(x) 7175 v.AddArg(ptr) 7176 v.AddArg(mem) 7177 return true 7178 } 7179 return false 7180 } 7181 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 7182 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 7183 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7184 // result: (ADDload <t> [off] {sym} x ptr mem) 7185 for { 7186 t := v.Type 7187 _ = v.Args[1] 7188 g := v.Args[0] 7189 if g.Op != OpS390XMOVDload { 7190 break 7191 } 7192 off := g.AuxInt 7193 sym := g.Aux 7194 _ = g.Args[1] 7195 ptr := g.Args[0] 7196 mem := g.Args[1] 7197 x := v.Args[1] 7198 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7199 break 7200 } 7201 v.reset(OpS390XADDload) 7202 v.Type = t 7203 v.AuxInt = off 7204 v.Aux = sym 7205 v.AddArg(x) 7206 v.AddArg(ptr) 7207 v.AddArg(mem) 7208 return true 7209 } 7210 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 7211 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7212 // result: (ADDload <t> [off] {sym} x ptr mem) 7213 for { 7214 t := v.Type 7215 _ = v.Args[1] 7216 x := v.Args[0] 7217 g := v.Args[1] 7218 if g.Op != OpS390XMOVDload { 7219 break 7220 } 7221 off := g.AuxInt 7222 sym := g.Aux 7223 _ = g.Args[1] 7224 ptr := g.Args[0] 7225 mem := g.Args[1] 7226 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7227 break 7228 } 7229 v.reset(OpS390XADDload) 7230 v.Type = t 7231 v.AuxInt = off 7232 v.Aux = sym 7233 v.AddArg(x) 7234 v.AddArg(ptr) 7235 v.AddArg(mem) 7236 return true 7237 } 7238 return false 7239 } 7240 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 7241 // match: (ADDW x (MOVDconst [c])) 7242 // cond: 7243 // result: (ADDWconst [int64(int32(c))] x) 7244 for { 7245 _ = v.Args[1] 7246 x := v.Args[0] 7247 v_1 := v.Args[1] 7248 if v_1.Op != OpS390XMOVDconst { 7249 break 7250 } 7251 c := v_1.AuxInt 7252 v.reset(OpS390XADDWconst) 7253 v.AuxInt = int64(int32(c)) 7254 v.AddArg(x) 7255 return true 7256 } 7257 // match: (ADDW (MOVDconst [c]) x) 7258 // cond: 7259 // result: (ADDWconst [int64(int32(c))] x) 7260 for { 7261 _ = v.Args[1] 7262 v_0 := v.Args[0] 7263 if v_0.Op != OpS390XMOVDconst { 7264 break 7265 } 7266 c := v_0.AuxInt 7267 x := v.Args[1] 7268 v.reset(OpS390XADDWconst) 7269 v.AuxInt = int64(int32(c)) 7270 v.AddArg(x) 7271 return true 7272 } 7273 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 7274 // cond: d == 32-c 7275 // result: (RLLconst [c] x) 7276 for { 7277 _ = v.Args[1] 7278 v_0 := v.Args[0] 7279 if v_0.Op != OpS390XSLWconst { 7280 break 7281 } 7282 c := v_0.AuxInt 7283 x := v_0.Args[0] 7284 v_1 := v.Args[1] 7285 if v_1.Op != OpS390XSRWconst { 7286 break 7287 } 7288 d := v_1.AuxInt 7289 if x != v_1.Args[0] { 7290 break 7291 } 7292 if !(d == 32-c) { 7293 break 7294 } 7295 v.reset(OpS390XRLLconst) 7296 v.AuxInt = c 7297 v.AddArg(x) 7298 return true 7299 } 7300 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 7301 // cond: d == 32-c 7302 // result: (RLLconst [c] x) 7303 for { 7304 _ = v.Args[1] 7305 v_0 := v.Args[0] 7306 if v_0.Op != OpS390XSRWconst { 7307 break 7308 } 7309 d := v_0.AuxInt 7310 x := v_0.Args[0] 7311 v_1 := v.Args[1] 7312 if v_1.Op != OpS390XSLWconst { 7313 break 7314 } 7315 c := v_1.AuxInt 7316 if x != v_1.Args[0] { 7317 break 7318 } 7319 if !(d == 32-c) { 7320 break 7321 } 7322 v.reset(OpS390XRLLconst) 7323 v.AuxInt = c 7324 v.AddArg(x) 7325 return true 7326 } 7327 // match: (ADDW x (NEGW y)) 7328 // cond: 7329 // result: (SUBW x y) 7330 for { 7331 _ = v.Args[1] 7332 x := v.Args[0] 7333 v_1 := v.Args[1] 7334 if v_1.Op != OpS390XNEGW { 7335 break 7336 } 7337 y := v_1.Args[0] 7338 v.reset(OpS390XSUBW) 7339 v.AddArg(x) 7340 v.AddArg(y) 7341 return true 7342 } 7343 // match: (ADDW (NEGW y) x) 7344 // cond: 7345 // result: (SUBW x y) 7346 for { 7347 _ = v.Args[1] 7348 v_0 := v.Args[0] 7349 if v_0.Op != OpS390XNEGW { 7350 break 7351 } 7352 y := v_0.Args[0] 7353 x := v.Args[1] 7354 v.reset(OpS390XSUBW) 7355 v.AddArg(x) 7356 v.AddArg(y) 7357 return true 7358 } 7359 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7360 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7361 // result: (ADDWload <t> [off] {sym} x ptr mem) 7362 for { 7363 t := v.Type 7364 _ = v.Args[1] 7365 x := v.Args[0] 7366 g := v.Args[1] 7367 if g.Op != OpS390XMOVWload { 7368 break 7369 } 7370 off := g.AuxInt 7371 sym := g.Aux 7372 _ = g.Args[1] 7373 ptr := g.Args[0] 7374 mem := g.Args[1] 7375 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7376 break 7377 } 7378 v.reset(OpS390XADDWload) 7379 v.Type = t 7380 v.AuxInt = off 7381 v.Aux = sym 7382 v.AddArg(x) 7383 v.AddArg(ptr) 7384 v.AddArg(mem) 7385 return true 7386 } 7387 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7388 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7389 // result: (ADDWload <t> [off] {sym} x ptr mem) 7390 for { 7391 t := v.Type 7392 _ = v.Args[1] 7393 g := v.Args[0] 7394 if g.Op != OpS390XMOVWload { 7395 break 7396 } 7397 off := g.AuxInt 7398 sym := g.Aux 7399 _ = g.Args[1] 7400 ptr := g.Args[0] 7401 mem := g.Args[1] 7402 x := v.Args[1] 7403 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7404 break 7405 } 7406 v.reset(OpS390XADDWload) 7407 v.Type = t 7408 v.AuxInt = off 7409 v.Aux = sym 7410 v.AddArg(x) 7411 v.AddArg(ptr) 7412 v.AddArg(mem) 7413 return true 7414 } 7415 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7416 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7417 // result: (ADDWload <t> [off] {sym} x ptr mem) 7418 for { 7419 t := v.Type 7420 _ = v.Args[1] 7421 g := v.Args[0] 7422 if g.Op != OpS390XMOVWload { 7423 break 7424 } 7425 off := g.AuxInt 7426 sym := g.Aux 7427 _ = g.Args[1] 7428 ptr := g.Args[0] 7429 mem := g.Args[1] 7430 x := v.Args[1] 7431 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7432 break 7433 } 7434 v.reset(OpS390XADDWload) 7435 v.Type = t 7436 v.AuxInt = off 7437 v.Aux = sym 7438 v.AddArg(x) 7439 v.AddArg(ptr) 7440 v.AddArg(mem) 7441 return true 7442 } 7443 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7444 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7445 // result: (ADDWload <t> [off] {sym} x ptr mem) 7446 for { 7447 t := v.Type 7448 _ = v.Args[1] 7449 x := v.Args[0] 7450 g := v.Args[1] 7451 if g.Op != OpS390XMOVWload { 7452 break 7453 } 7454 off := g.AuxInt 7455 sym := g.Aux 7456 _ = g.Args[1] 7457 ptr := g.Args[0] 7458 mem := g.Args[1] 7459 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7460 break 7461 } 7462 v.reset(OpS390XADDWload) 7463 v.Type = t 7464 v.AuxInt = off 7465 v.Aux = sym 7466 v.AddArg(x) 7467 v.AddArg(ptr) 7468 v.AddArg(mem) 7469 return true 7470 } 7471 return false 7472 } 7473 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 7474 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7475 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7476 // result: (ADDWload <t> [off] {sym} x ptr mem) 7477 for { 7478 t := v.Type 7479 _ = v.Args[1] 7480 x := v.Args[0] 7481 g := v.Args[1] 7482 if g.Op != OpS390XMOVWZload { 7483 break 7484 } 7485 off := g.AuxInt 7486 sym := g.Aux 7487 _ = g.Args[1] 7488 ptr := g.Args[0] 7489 mem := g.Args[1] 7490 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7491 break 7492 } 7493 v.reset(OpS390XADDWload) 7494 v.Type = t 7495 v.AuxInt = off 7496 v.Aux = sym 7497 v.AddArg(x) 7498 v.AddArg(ptr) 7499 v.AddArg(mem) 7500 return true 7501 } 7502 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7503 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7504 // result: (ADDWload <t> [off] {sym} x ptr mem) 7505 for { 7506 t := v.Type 7507 _ = v.Args[1] 7508 g := v.Args[0] 7509 if g.Op != OpS390XMOVWZload { 7510 break 7511 } 7512 off := g.AuxInt 7513 sym := g.Aux 7514 _ = g.Args[1] 7515 ptr := g.Args[0] 7516 mem := g.Args[1] 7517 x := v.Args[1] 7518 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7519 break 7520 } 7521 v.reset(OpS390XADDWload) 7522 v.Type = t 7523 v.AuxInt = off 7524 v.Aux = sym 7525 v.AddArg(x) 7526 v.AddArg(ptr) 7527 v.AddArg(mem) 7528 return true 7529 } 7530 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7531 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7532 // result: (ADDWload <t> [off] {sym} x ptr mem) 7533 for { 7534 t := v.Type 7535 _ = v.Args[1] 7536 g := v.Args[0] 7537 if g.Op != OpS390XMOVWZload { 7538 break 7539 } 7540 off := g.AuxInt 7541 sym := g.Aux 7542 _ = g.Args[1] 7543 ptr := g.Args[0] 7544 mem := g.Args[1] 7545 x := v.Args[1] 7546 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7547 break 7548 } 7549 v.reset(OpS390XADDWload) 7550 v.Type = t 7551 v.AuxInt = off 7552 v.Aux = sym 7553 v.AddArg(x) 7554 v.AddArg(ptr) 7555 v.AddArg(mem) 7556 return true 7557 } 7558 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7559 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 7560 // result: (ADDWload <t> [off] {sym} x ptr mem) 7561 for { 7562 t := v.Type 7563 _ = v.Args[1] 7564 x := v.Args[0] 7565 g := v.Args[1] 7566 if g.Op != OpS390XMOVWZload { 7567 break 7568 } 7569 off := g.AuxInt 7570 sym := g.Aux 7571 _ = g.Args[1] 7572 ptr := g.Args[0] 7573 mem := g.Args[1] 7574 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 7575 break 7576 } 7577 v.reset(OpS390XADDWload) 7578 v.Type = t 7579 v.AuxInt = off 7580 v.Aux = sym 7581 v.AddArg(x) 7582 v.AddArg(ptr) 7583 v.AddArg(mem) 7584 return true 7585 } 7586 return false 7587 } 7588 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 7589 // match: (ADDWconst [c] x) 7590 // cond: int32(c)==0 7591 // result: x 7592 for { 7593 c := v.AuxInt 7594 x := v.Args[0] 7595 if !(int32(c) == 0) { 7596 break 7597 } 7598 v.reset(OpCopy) 7599 v.Type = x.Type 7600 v.AddArg(x) 7601 return true 7602 } 7603 // match: (ADDWconst [c] (MOVDconst [d])) 7604 // cond: 7605 // result: (MOVDconst [int64(int32(c+d))]) 7606 for { 7607 c := v.AuxInt 7608 v_0 := v.Args[0] 7609 if v_0.Op != OpS390XMOVDconst { 7610 break 7611 } 7612 d := v_0.AuxInt 7613 v.reset(OpS390XMOVDconst) 7614 v.AuxInt = int64(int32(c + d)) 7615 return true 7616 } 7617 // match: (ADDWconst [c] (ADDWconst [d] x)) 7618 // cond: 7619 // result: (ADDWconst [int64(int32(c+d))] x) 7620 for { 7621 c := v.AuxInt 7622 v_0 := v.Args[0] 7623 if v_0.Op != OpS390XADDWconst { 7624 break 7625 } 7626 d := v_0.AuxInt 7627 x := v_0.Args[0] 7628 v.reset(OpS390XADDWconst) 7629 v.AuxInt = int64(int32(c + d)) 7630 v.AddArg(x) 7631 return true 7632 } 7633 return false 7634 } 7635 func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { 7636 // match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 7637 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7638 // result: (ADDWload [off1+off2] {sym} x ptr mem) 7639 for { 7640 off1 := v.AuxInt 7641 sym := v.Aux 7642 _ = v.Args[2] 7643 x := v.Args[0] 7644 v_1 := v.Args[1] 7645 if v_1.Op != OpS390XADDconst { 7646 break 7647 } 7648 off2 := v_1.AuxInt 7649 ptr := v_1.Args[0] 7650 mem := v.Args[2] 7651 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7652 break 7653 } 7654 v.reset(OpS390XADDWload) 7655 v.AuxInt = off1 + off2 7656 v.Aux = sym 7657 v.AddArg(x) 7658 v.AddArg(ptr) 7659 v.AddArg(mem) 7660 return true 7661 } 7662 // match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7663 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7664 // result: (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7665 for { 7666 o1 := v.AuxInt 7667 s1 := v.Aux 7668 _ = v.Args[2] 7669 x := v.Args[0] 7670 v_1 := v.Args[1] 7671 if v_1.Op != OpS390XMOVDaddr { 7672 break 7673 } 7674 o2 := v_1.AuxInt 7675 s2 := v_1.Aux 7676 ptr := v_1.Args[0] 7677 mem := v.Args[2] 7678 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7679 break 7680 } 7681 v.reset(OpS390XADDWload) 7682 v.AuxInt = o1 + o2 7683 v.Aux = mergeSym(s1, s2) 7684 v.AddArg(x) 7685 v.AddArg(ptr) 7686 v.AddArg(mem) 7687 return true 7688 } 7689 return false 7690 } 7691 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 7692 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 7693 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 7694 // result: (MOVDaddr [c+d] {s} x) 7695 for { 7696 c := v.AuxInt 7697 v_0 := v.Args[0] 7698 if v_0.Op != OpS390XMOVDaddr { 7699 break 7700 } 7701 d := v_0.AuxInt 7702 s := v_0.Aux 7703 x := v_0.Args[0] 7704 if x.Op != OpSB { 7705 break 7706 } 7707 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 7708 break 7709 } 7710 v.reset(OpS390XMOVDaddr) 7711 v.AuxInt = c + d 7712 v.Aux = s 7713 v.AddArg(x) 7714 return true 7715 } 7716 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 7717 // cond: x.Op != OpSB && is20Bit(c+d) 7718 // result: (MOVDaddr [c+d] {s} x) 7719 for { 7720 c := v.AuxInt 7721 v_0 := v.Args[0] 7722 if v_0.Op != OpS390XMOVDaddr { 7723 break 7724 } 7725 d := v_0.AuxInt 7726 s := v_0.Aux 7727 x := v_0.Args[0] 7728 if !(x.Op != OpSB && is20Bit(c+d)) { 7729 break 7730 } 7731 v.reset(OpS390XMOVDaddr) 7732 v.AuxInt = c + d 7733 v.Aux = s 7734 v.AddArg(x) 7735 return true 7736 } 7737 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 7738 // cond: is20Bit(c+d) 7739 // result: (MOVDaddridx [c+d] {s} x y) 7740 for { 7741 c := v.AuxInt 7742 v_0 := v.Args[0] 7743 if v_0.Op != OpS390XMOVDaddridx { 7744 break 7745 } 7746 d := v_0.AuxInt 7747 s := v_0.Aux 7748 _ = v_0.Args[1] 7749 x := v_0.Args[0] 7750 y := v_0.Args[1] 7751 if !(is20Bit(c + d)) { 7752 break 7753 } 7754 v.reset(OpS390XMOVDaddridx) 7755 v.AuxInt = c + d 7756 v.Aux = s 7757 v.AddArg(x) 7758 v.AddArg(y) 7759 return true 7760 } 7761 // match: (ADDconst [0] x) 7762 // cond: 7763 // result: x 7764 for { 7765 if v.AuxInt != 0 { 7766 break 7767 } 7768 x := v.Args[0] 7769 v.reset(OpCopy) 7770 v.Type = x.Type 7771 v.AddArg(x) 7772 return true 7773 } 7774 // match: (ADDconst [c] (MOVDconst [d])) 7775 // cond: 7776 // result: (MOVDconst [c+d]) 7777 for { 7778 c := v.AuxInt 7779 v_0 := v.Args[0] 7780 if v_0.Op != OpS390XMOVDconst { 7781 break 7782 } 7783 d := v_0.AuxInt 7784 v.reset(OpS390XMOVDconst) 7785 v.AuxInt = c + d 7786 return true 7787 } 7788 // match: (ADDconst [c] (ADDconst [d] x)) 7789 // cond: is32Bit(c+d) 7790 // result: (ADDconst [c+d] x) 7791 for { 7792 c := v.AuxInt 7793 v_0 := v.Args[0] 7794 if v_0.Op != OpS390XADDconst { 7795 break 7796 } 7797 d := v_0.AuxInt 7798 x := v_0.Args[0] 7799 if !(is32Bit(c + d)) { 7800 break 7801 } 7802 v.reset(OpS390XADDconst) 7803 v.AuxInt = c + d 7804 v.AddArg(x) 7805 return true 7806 } 7807 return false 7808 } 7809 func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { 7810 b := v.Block 7811 _ = b 7812 // match: (ADDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 7813 // cond: isSamePtr(ptr1, ptr2) 7814 // result: (ADD x (LGDR <t> y)) 7815 for { 7816 t := v.Type 7817 off := v.AuxInt 7818 sym := v.Aux 7819 _ = v.Args[2] 7820 x := v.Args[0] 7821 ptr1 := v.Args[1] 7822 v_2 := v.Args[2] 7823 if v_2.Op != OpS390XFMOVDstore { 7824 break 7825 } 7826 if v_2.AuxInt != off { 7827 break 7828 } 7829 if v_2.Aux != sym { 7830 break 7831 } 7832 _ = v_2.Args[2] 7833 ptr2 := v_2.Args[0] 7834 y := v_2.Args[1] 7835 if !(isSamePtr(ptr1, ptr2)) { 7836 break 7837 } 7838 v.reset(OpS390XADD) 7839 v.AddArg(x) 7840 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 7841 v0.AddArg(y) 7842 v.AddArg(v0) 7843 return true 7844 } 7845 // match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) 7846 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7847 // result: (ADDload [off1+off2] {sym} x ptr mem) 7848 for { 7849 off1 := v.AuxInt 7850 sym := v.Aux 7851 _ = v.Args[2] 7852 x := v.Args[0] 7853 v_1 := v.Args[1] 7854 if v_1.Op != OpS390XADDconst { 7855 break 7856 } 7857 off2 := v_1.AuxInt 7858 ptr := v_1.Args[0] 7859 mem := v.Args[2] 7860 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7861 break 7862 } 7863 v.reset(OpS390XADDload) 7864 v.AuxInt = off1 + off2 7865 v.Aux = sym 7866 v.AddArg(x) 7867 v.AddArg(ptr) 7868 v.AddArg(mem) 7869 return true 7870 } 7871 // match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7872 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7873 // result: (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7874 for { 7875 o1 := v.AuxInt 7876 s1 := v.Aux 7877 _ = v.Args[2] 7878 x := v.Args[0] 7879 v_1 := v.Args[1] 7880 if v_1.Op != OpS390XMOVDaddr { 7881 break 7882 } 7883 o2 := v_1.AuxInt 7884 s2 := v_1.Aux 7885 ptr := v_1.Args[0] 7886 mem := v.Args[2] 7887 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7888 break 7889 } 7890 v.reset(OpS390XADDload) 7891 v.AuxInt = o1 + o2 7892 v.Aux = mergeSym(s1, s2) 7893 v.AddArg(x) 7894 v.AddArg(ptr) 7895 v.AddArg(mem) 7896 return true 7897 } 7898 return false 7899 } 7900 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 7901 b := v.Block 7902 _ = b 7903 typ := &b.Func.Config.Types 7904 _ = typ 7905 // match: (AND x (MOVDconst [c])) 7906 // cond: is32Bit(c) && c < 0 7907 // result: (ANDconst [c] x) 7908 for { 7909 _ = v.Args[1] 7910 x := v.Args[0] 7911 v_1 := v.Args[1] 7912 if v_1.Op != OpS390XMOVDconst { 7913 break 7914 } 7915 c := v_1.AuxInt 7916 if !(is32Bit(c) && c < 0) { 7917 break 7918 } 7919 v.reset(OpS390XANDconst) 7920 v.AuxInt = c 7921 v.AddArg(x) 7922 return true 7923 } 7924 // match: (AND (MOVDconst [c]) x) 7925 // cond: is32Bit(c) && c < 0 7926 // result: (ANDconst [c] x) 7927 for { 7928 _ = v.Args[1] 7929 v_0 := v.Args[0] 7930 if v_0.Op != OpS390XMOVDconst { 7931 break 7932 } 7933 c := v_0.AuxInt 7934 x := v.Args[1] 7935 if !(is32Bit(c) && c < 0) { 7936 break 7937 } 7938 v.reset(OpS390XANDconst) 7939 v.AuxInt = c 7940 v.AddArg(x) 7941 return true 7942 } 7943 // match: (AND x (MOVDconst [c])) 7944 // cond: is32Bit(c) && c >= 0 7945 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x)) 7946 for { 7947 _ = v.Args[1] 7948 x := v.Args[0] 7949 v_1 := v.Args[1] 7950 if v_1.Op != OpS390XMOVDconst { 7951 break 7952 } 7953 c := v_1.AuxInt 7954 if !(is32Bit(c) && c >= 0) { 7955 break 7956 } 7957 v.reset(OpS390XMOVWZreg) 7958 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 7959 v0.AuxInt = int64(int32(c)) 7960 v0.AddArg(x) 7961 v.AddArg(v0) 7962 return true 7963 } 7964 // match: (AND (MOVDconst [c]) x) 7965 // cond: is32Bit(c) && c >= 0 7966 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(int32(c))] x)) 7967 for { 7968 _ = v.Args[1] 7969 v_0 := v.Args[0] 7970 if v_0.Op != OpS390XMOVDconst { 7971 break 7972 } 7973 c := v_0.AuxInt 7974 x := v.Args[1] 7975 if !(is32Bit(c) && c >= 0) { 7976 break 7977 } 7978 v.reset(OpS390XMOVWZreg) 7979 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 7980 v0.AuxInt = int64(int32(c)) 7981 v0.AddArg(x) 7982 v.AddArg(v0) 7983 return true 7984 } 7985 // match: (AND x (MOVDconst [0xFF])) 7986 // cond: 7987 // result: (MOVBZreg x) 7988 for { 7989 _ = v.Args[1] 7990 x := v.Args[0] 7991 v_1 := v.Args[1] 7992 if v_1.Op != OpS390XMOVDconst { 7993 break 7994 } 7995 if v_1.AuxInt != 0xFF { 7996 break 7997 } 7998 v.reset(OpS390XMOVBZreg) 7999 v.AddArg(x) 8000 return true 8001 } 8002 // match: (AND (MOVDconst [0xFF]) x) 8003 // cond: 8004 // result: (MOVBZreg x) 8005 for { 8006 _ = v.Args[1] 8007 v_0 := v.Args[0] 8008 if v_0.Op != OpS390XMOVDconst { 8009 break 8010 } 8011 if v_0.AuxInt != 0xFF { 8012 break 8013 } 8014 x := v.Args[1] 8015 v.reset(OpS390XMOVBZreg) 8016 v.AddArg(x) 8017 return true 8018 } 8019 // match: (AND x (MOVDconst [0xFFFF])) 8020 // cond: 8021 // result: (MOVHZreg x) 8022 for { 8023 _ = v.Args[1] 8024 x := v.Args[0] 8025 v_1 := v.Args[1] 8026 if v_1.Op != OpS390XMOVDconst { 8027 break 8028 } 8029 if v_1.AuxInt != 0xFFFF { 8030 break 8031 } 8032 v.reset(OpS390XMOVHZreg) 8033 v.AddArg(x) 8034 return true 8035 } 8036 // match: (AND (MOVDconst [0xFFFF]) x) 8037 // cond: 8038 // result: (MOVHZreg x) 8039 for { 8040 _ = v.Args[1] 8041 v_0 := v.Args[0] 8042 if v_0.Op != OpS390XMOVDconst { 8043 break 8044 } 8045 if v_0.AuxInt != 0xFFFF { 8046 break 8047 } 8048 x := v.Args[1] 8049 v.reset(OpS390XMOVHZreg) 8050 v.AddArg(x) 8051 return true 8052 } 8053 // match: (AND x (MOVDconst [0xFFFFFFFF])) 8054 // cond: 8055 // result: (MOVWZreg x) 8056 for { 8057 _ = v.Args[1] 8058 x := v.Args[0] 8059 v_1 := v.Args[1] 8060 if v_1.Op != OpS390XMOVDconst { 8061 break 8062 } 8063 if v_1.AuxInt != 0xFFFFFFFF { 8064 break 8065 } 8066 v.reset(OpS390XMOVWZreg) 8067 v.AddArg(x) 8068 return true 8069 } 8070 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 8071 // cond: 8072 // result: (MOVWZreg x) 8073 for { 8074 _ = v.Args[1] 8075 v_0 := v.Args[0] 8076 if v_0.Op != OpS390XMOVDconst { 8077 break 8078 } 8079 if v_0.AuxInt != 0xFFFFFFFF { 8080 break 8081 } 8082 x := v.Args[1] 8083 v.reset(OpS390XMOVWZreg) 8084 v.AddArg(x) 8085 return true 8086 } 8087 return false 8088 } 8089 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 8090 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 8091 // cond: 8092 // result: (MOVDconst [c&d]) 8093 for { 8094 _ = v.Args[1] 8095 v_0 := v.Args[0] 8096 if v_0.Op != OpS390XMOVDconst { 8097 break 8098 } 8099 c := v_0.AuxInt 8100 v_1 := v.Args[1] 8101 if v_1.Op != OpS390XMOVDconst { 8102 break 8103 } 8104 d := v_1.AuxInt 8105 v.reset(OpS390XMOVDconst) 8106 v.AuxInt = c & d 8107 return true 8108 } 8109 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 8110 // cond: 8111 // result: (MOVDconst [c&d]) 8112 for { 8113 _ = v.Args[1] 8114 v_0 := v.Args[0] 8115 if v_0.Op != OpS390XMOVDconst { 8116 break 8117 } 8118 d := v_0.AuxInt 8119 v_1 := v.Args[1] 8120 if v_1.Op != OpS390XMOVDconst { 8121 break 8122 } 8123 c := v_1.AuxInt 8124 v.reset(OpS390XMOVDconst) 8125 v.AuxInt = c & d 8126 return true 8127 } 8128 // match: (AND x x) 8129 // cond: 8130 // result: x 8131 for { 8132 _ = v.Args[1] 8133 x := v.Args[0] 8134 if x != v.Args[1] { 8135 break 8136 } 8137 v.reset(OpCopy) 8138 v.Type = x.Type 8139 v.AddArg(x) 8140 return true 8141 } 8142 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 8143 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8144 // result: (ANDload <t> [off] {sym} x ptr mem) 8145 for { 8146 t := v.Type 8147 _ = v.Args[1] 8148 x := v.Args[0] 8149 g := v.Args[1] 8150 if g.Op != OpS390XMOVDload { 8151 break 8152 } 8153 off := g.AuxInt 8154 sym := g.Aux 8155 _ = g.Args[1] 8156 ptr := g.Args[0] 8157 mem := g.Args[1] 8158 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8159 break 8160 } 8161 v.reset(OpS390XANDload) 8162 v.Type = t 8163 v.AuxInt = off 8164 v.Aux = sym 8165 v.AddArg(x) 8166 v.AddArg(ptr) 8167 v.AddArg(mem) 8168 return true 8169 } 8170 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 8171 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8172 // result: (ANDload <t> [off] {sym} x ptr mem) 8173 for { 8174 t := v.Type 8175 _ = v.Args[1] 8176 g := v.Args[0] 8177 if g.Op != OpS390XMOVDload { 8178 break 8179 } 8180 off := g.AuxInt 8181 sym := g.Aux 8182 _ = g.Args[1] 8183 ptr := g.Args[0] 8184 mem := g.Args[1] 8185 x := v.Args[1] 8186 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8187 break 8188 } 8189 v.reset(OpS390XANDload) 8190 v.Type = t 8191 v.AuxInt = off 8192 v.Aux = sym 8193 v.AddArg(x) 8194 v.AddArg(ptr) 8195 v.AddArg(mem) 8196 return true 8197 } 8198 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 8199 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8200 // result: (ANDload <t> [off] {sym} x ptr mem) 8201 for { 8202 t := v.Type 8203 _ = v.Args[1] 8204 g := v.Args[0] 8205 if g.Op != OpS390XMOVDload { 8206 break 8207 } 8208 off := g.AuxInt 8209 sym := g.Aux 8210 _ = g.Args[1] 8211 ptr := g.Args[0] 8212 mem := g.Args[1] 8213 x := v.Args[1] 8214 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8215 break 8216 } 8217 v.reset(OpS390XANDload) 8218 v.Type = t 8219 v.AuxInt = off 8220 v.Aux = sym 8221 v.AddArg(x) 8222 v.AddArg(ptr) 8223 v.AddArg(mem) 8224 return true 8225 } 8226 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 8227 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8228 // result: (ANDload <t> [off] {sym} x ptr mem) 8229 for { 8230 t := v.Type 8231 _ = v.Args[1] 8232 x := v.Args[0] 8233 g := v.Args[1] 8234 if g.Op != OpS390XMOVDload { 8235 break 8236 } 8237 off := g.AuxInt 8238 sym := g.Aux 8239 _ = g.Args[1] 8240 ptr := g.Args[0] 8241 mem := g.Args[1] 8242 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8243 break 8244 } 8245 v.reset(OpS390XANDload) 8246 v.Type = t 8247 v.AuxInt = off 8248 v.Aux = sym 8249 v.AddArg(x) 8250 v.AddArg(ptr) 8251 v.AddArg(mem) 8252 return true 8253 } 8254 return false 8255 } 8256 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 8257 // match: (ANDW x (MOVDconst [c])) 8258 // cond: 8259 // result: (ANDWconst [int64(int32(c))] x) 8260 for { 8261 _ = v.Args[1] 8262 x := v.Args[0] 8263 v_1 := v.Args[1] 8264 if v_1.Op != OpS390XMOVDconst { 8265 break 8266 } 8267 c := v_1.AuxInt 8268 v.reset(OpS390XANDWconst) 8269 v.AuxInt = int64(int32(c)) 8270 v.AddArg(x) 8271 return true 8272 } 8273 // match: (ANDW (MOVDconst [c]) x) 8274 // cond: 8275 // result: (ANDWconst [int64(int32(c))] x) 8276 for { 8277 _ = v.Args[1] 8278 v_0 := v.Args[0] 8279 if v_0.Op != OpS390XMOVDconst { 8280 break 8281 } 8282 c := v_0.AuxInt 8283 x := v.Args[1] 8284 v.reset(OpS390XANDWconst) 8285 v.AuxInt = int64(int32(c)) 8286 v.AddArg(x) 8287 return true 8288 } 8289 // match: (ANDW x x) 8290 // cond: 8291 // result: x 8292 for { 8293 _ = v.Args[1] 8294 x := v.Args[0] 8295 if x != v.Args[1] { 8296 break 8297 } 8298 v.reset(OpCopy) 8299 v.Type = x.Type 8300 v.AddArg(x) 8301 return true 8302 } 8303 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 8304 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8305 // result: (ANDWload <t> [off] {sym} x ptr mem) 8306 for { 8307 t := v.Type 8308 _ = v.Args[1] 8309 x := v.Args[0] 8310 g := v.Args[1] 8311 if g.Op != OpS390XMOVWload { 8312 break 8313 } 8314 off := g.AuxInt 8315 sym := g.Aux 8316 _ = g.Args[1] 8317 ptr := g.Args[0] 8318 mem := g.Args[1] 8319 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8320 break 8321 } 8322 v.reset(OpS390XANDWload) 8323 v.Type = t 8324 v.AuxInt = off 8325 v.Aux = sym 8326 v.AddArg(x) 8327 v.AddArg(ptr) 8328 v.AddArg(mem) 8329 return true 8330 } 8331 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 8332 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8333 // result: (ANDWload <t> [off] {sym} x ptr mem) 8334 for { 8335 t := v.Type 8336 _ = v.Args[1] 8337 g := v.Args[0] 8338 if g.Op != OpS390XMOVWload { 8339 break 8340 } 8341 off := g.AuxInt 8342 sym := g.Aux 8343 _ = g.Args[1] 8344 ptr := g.Args[0] 8345 mem := g.Args[1] 8346 x := v.Args[1] 8347 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8348 break 8349 } 8350 v.reset(OpS390XANDWload) 8351 v.Type = t 8352 v.AuxInt = off 8353 v.Aux = sym 8354 v.AddArg(x) 8355 v.AddArg(ptr) 8356 v.AddArg(mem) 8357 return true 8358 } 8359 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 8360 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8361 // result: (ANDWload <t> [off] {sym} x ptr mem) 8362 for { 8363 t := v.Type 8364 _ = v.Args[1] 8365 g := v.Args[0] 8366 if g.Op != OpS390XMOVWload { 8367 break 8368 } 8369 off := g.AuxInt 8370 sym := g.Aux 8371 _ = g.Args[1] 8372 ptr := g.Args[0] 8373 mem := g.Args[1] 8374 x := v.Args[1] 8375 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8376 break 8377 } 8378 v.reset(OpS390XANDWload) 8379 v.Type = t 8380 v.AuxInt = off 8381 v.Aux = sym 8382 v.AddArg(x) 8383 v.AddArg(ptr) 8384 v.AddArg(mem) 8385 return true 8386 } 8387 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 8388 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8389 // result: (ANDWload <t> [off] {sym} x ptr mem) 8390 for { 8391 t := v.Type 8392 _ = v.Args[1] 8393 x := v.Args[0] 8394 g := v.Args[1] 8395 if g.Op != OpS390XMOVWload { 8396 break 8397 } 8398 off := g.AuxInt 8399 sym := g.Aux 8400 _ = g.Args[1] 8401 ptr := g.Args[0] 8402 mem := g.Args[1] 8403 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8404 break 8405 } 8406 v.reset(OpS390XANDWload) 8407 v.Type = t 8408 v.AuxInt = off 8409 v.Aux = sym 8410 v.AddArg(x) 8411 v.AddArg(ptr) 8412 v.AddArg(mem) 8413 return true 8414 } 8415 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 8416 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8417 // result: (ANDWload <t> [off] {sym} x ptr mem) 8418 for { 8419 t := v.Type 8420 _ = v.Args[1] 8421 x := v.Args[0] 8422 g := v.Args[1] 8423 if g.Op != OpS390XMOVWZload { 8424 break 8425 } 8426 off := g.AuxInt 8427 sym := g.Aux 8428 _ = g.Args[1] 8429 ptr := g.Args[0] 8430 mem := g.Args[1] 8431 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8432 break 8433 } 8434 v.reset(OpS390XANDWload) 8435 v.Type = t 8436 v.AuxInt = off 8437 v.Aux = sym 8438 v.AddArg(x) 8439 v.AddArg(ptr) 8440 v.AddArg(mem) 8441 return true 8442 } 8443 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 8444 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8445 // result: (ANDWload <t> [off] {sym} x ptr mem) 8446 for { 8447 t := v.Type 8448 _ = v.Args[1] 8449 g := v.Args[0] 8450 if g.Op != OpS390XMOVWZload { 8451 break 8452 } 8453 off := g.AuxInt 8454 sym := g.Aux 8455 _ = g.Args[1] 8456 ptr := g.Args[0] 8457 mem := g.Args[1] 8458 x := v.Args[1] 8459 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8460 break 8461 } 8462 v.reset(OpS390XANDWload) 8463 v.Type = t 8464 v.AuxInt = off 8465 v.Aux = sym 8466 v.AddArg(x) 8467 v.AddArg(ptr) 8468 v.AddArg(mem) 8469 return true 8470 } 8471 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 8472 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8473 // result: (ANDWload <t> [off] {sym} x ptr mem) 8474 for { 8475 t := v.Type 8476 _ = v.Args[1] 8477 g := v.Args[0] 8478 if g.Op != OpS390XMOVWZload { 8479 break 8480 } 8481 off := g.AuxInt 8482 sym := g.Aux 8483 _ = g.Args[1] 8484 ptr := g.Args[0] 8485 mem := g.Args[1] 8486 x := v.Args[1] 8487 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8488 break 8489 } 8490 v.reset(OpS390XANDWload) 8491 v.Type = t 8492 v.AuxInt = off 8493 v.Aux = sym 8494 v.AddArg(x) 8495 v.AddArg(ptr) 8496 v.AddArg(mem) 8497 return true 8498 } 8499 return false 8500 } 8501 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 8502 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 8503 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 8504 // result: (ANDWload <t> [off] {sym} x ptr mem) 8505 for { 8506 t := v.Type 8507 _ = v.Args[1] 8508 x := v.Args[0] 8509 g := v.Args[1] 8510 if g.Op != OpS390XMOVWZload { 8511 break 8512 } 8513 off := g.AuxInt 8514 sym := g.Aux 8515 _ = g.Args[1] 8516 ptr := g.Args[0] 8517 mem := g.Args[1] 8518 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 8519 break 8520 } 8521 v.reset(OpS390XANDWload) 8522 v.Type = t 8523 v.AuxInt = off 8524 v.Aux = sym 8525 v.AddArg(x) 8526 v.AddArg(ptr) 8527 v.AddArg(mem) 8528 return true 8529 } 8530 return false 8531 } 8532 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 8533 // match: (ANDWconst [c] (ANDWconst [d] x)) 8534 // cond: 8535 // result: (ANDWconst [c & d] x) 8536 for { 8537 c := v.AuxInt 8538 v_0 := v.Args[0] 8539 if v_0.Op != OpS390XANDWconst { 8540 break 8541 } 8542 d := v_0.AuxInt 8543 x := v_0.Args[0] 8544 v.reset(OpS390XANDWconst) 8545 v.AuxInt = c & d 8546 v.AddArg(x) 8547 return true 8548 } 8549 // match: (ANDWconst [0xFF] x) 8550 // cond: 8551 // result: (MOVBZreg x) 8552 for { 8553 if v.AuxInt != 0xFF { 8554 break 8555 } 8556 x := v.Args[0] 8557 v.reset(OpS390XMOVBZreg) 8558 v.AddArg(x) 8559 return true 8560 } 8561 // match: (ANDWconst [0xFFFF] x) 8562 // cond: 8563 // result: (MOVHZreg x) 8564 for { 8565 if v.AuxInt != 0xFFFF { 8566 break 8567 } 8568 x := v.Args[0] 8569 v.reset(OpS390XMOVHZreg) 8570 v.AddArg(x) 8571 return true 8572 } 8573 // match: (ANDWconst [c] _) 8574 // cond: int32(c)==0 8575 // result: (MOVDconst [0]) 8576 for { 8577 c := v.AuxInt 8578 if !(int32(c) == 0) { 8579 break 8580 } 8581 v.reset(OpS390XMOVDconst) 8582 v.AuxInt = 0 8583 return true 8584 } 8585 // match: (ANDWconst [c] x) 8586 // cond: int32(c)==-1 8587 // result: x 8588 for { 8589 c := v.AuxInt 8590 x := v.Args[0] 8591 if !(int32(c) == -1) { 8592 break 8593 } 8594 v.reset(OpCopy) 8595 v.Type = x.Type 8596 v.AddArg(x) 8597 return true 8598 } 8599 // match: (ANDWconst [c] (MOVDconst [d])) 8600 // cond: 8601 // result: (MOVDconst [c&d]) 8602 for { 8603 c := v.AuxInt 8604 v_0 := v.Args[0] 8605 if v_0.Op != OpS390XMOVDconst { 8606 break 8607 } 8608 d := v_0.AuxInt 8609 v.reset(OpS390XMOVDconst) 8610 v.AuxInt = c & d 8611 return true 8612 } 8613 return false 8614 } 8615 func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { 8616 // match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 8617 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 8618 // result: (ANDWload [off1+off2] {sym} x ptr mem) 8619 for { 8620 off1 := v.AuxInt 8621 sym := v.Aux 8622 _ = v.Args[2] 8623 x := v.Args[0] 8624 v_1 := v.Args[1] 8625 if v_1.Op != OpS390XADDconst { 8626 break 8627 } 8628 off2 := v_1.AuxInt 8629 ptr := v_1.Args[0] 8630 mem := v.Args[2] 8631 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 8632 break 8633 } 8634 v.reset(OpS390XANDWload) 8635 v.AuxInt = off1 + off2 8636 v.Aux = sym 8637 v.AddArg(x) 8638 v.AddArg(ptr) 8639 v.AddArg(mem) 8640 return true 8641 } 8642 // match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 8643 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 8644 // result: (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 8645 for { 8646 o1 := v.AuxInt 8647 s1 := v.Aux 8648 _ = v.Args[2] 8649 x := v.Args[0] 8650 v_1 := v.Args[1] 8651 if v_1.Op != OpS390XMOVDaddr { 8652 break 8653 } 8654 o2 := v_1.AuxInt 8655 s2 := v_1.Aux 8656 ptr := v_1.Args[0] 8657 mem := v.Args[2] 8658 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 8659 break 8660 } 8661 v.reset(OpS390XANDWload) 8662 v.AuxInt = o1 + o2 8663 v.Aux = mergeSym(s1, s2) 8664 v.AddArg(x) 8665 v.AddArg(ptr) 8666 v.AddArg(mem) 8667 return true 8668 } 8669 return false 8670 } 8671 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 8672 // match: (ANDconst [c] (ANDconst [d] x)) 8673 // cond: 8674 // result: (ANDconst [c & d] x) 8675 for { 8676 c := v.AuxInt 8677 v_0 := v.Args[0] 8678 if v_0.Op != OpS390XANDconst { 8679 break 8680 } 8681 d := v_0.AuxInt 8682 x := v_0.Args[0] 8683 v.reset(OpS390XANDconst) 8684 v.AuxInt = c & d 8685 v.AddArg(x) 8686 return true 8687 } 8688 // match: (ANDconst [0] _) 8689 // cond: 8690 // result: (MOVDconst [0]) 8691 for { 8692 if v.AuxInt != 0 { 8693 break 8694 } 8695 v.reset(OpS390XMOVDconst) 8696 v.AuxInt = 0 8697 return true 8698 } 8699 // match: (ANDconst [-1] x) 8700 // cond: 8701 // result: x 8702 for { 8703 if v.AuxInt != -1 { 8704 break 8705 } 8706 x := v.Args[0] 8707 v.reset(OpCopy) 8708 v.Type = x.Type 8709 v.AddArg(x) 8710 return true 8711 } 8712 // match: (ANDconst [c] (MOVDconst [d])) 8713 // cond: 8714 // result: (MOVDconst [c&d]) 8715 for { 8716 c := v.AuxInt 8717 v_0 := v.Args[0] 8718 if v_0.Op != OpS390XMOVDconst { 8719 break 8720 } 8721 d := v_0.AuxInt 8722 v.reset(OpS390XMOVDconst) 8723 v.AuxInt = c & d 8724 return true 8725 } 8726 return false 8727 } 8728 func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { 8729 b := v.Block 8730 _ = b 8731 // match: (ANDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 8732 // cond: isSamePtr(ptr1, ptr2) 8733 // result: (AND x (LGDR <t> y)) 8734 for { 8735 t := v.Type 8736 off := v.AuxInt 8737 sym := v.Aux 8738 _ = v.Args[2] 8739 x := v.Args[0] 8740 ptr1 := v.Args[1] 8741 v_2 := v.Args[2] 8742 if v_2.Op != OpS390XFMOVDstore { 8743 break 8744 } 8745 if v_2.AuxInt != off { 8746 break 8747 } 8748 if v_2.Aux != sym { 8749 break 8750 } 8751 _ = v_2.Args[2] 8752 ptr2 := v_2.Args[0] 8753 y := v_2.Args[1] 8754 if !(isSamePtr(ptr1, ptr2)) { 8755 break 8756 } 8757 v.reset(OpS390XAND) 8758 v.AddArg(x) 8759 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 8760 v0.AddArg(y) 8761 v.AddArg(v0) 8762 return true 8763 } 8764 // match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) 8765 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 8766 // result: (ANDload [off1+off2] {sym} x ptr mem) 8767 for { 8768 off1 := v.AuxInt 8769 sym := v.Aux 8770 _ = v.Args[2] 8771 x := v.Args[0] 8772 v_1 := v.Args[1] 8773 if v_1.Op != OpS390XADDconst { 8774 break 8775 } 8776 off2 := v_1.AuxInt 8777 ptr := v_1.Args[0] 8778 mem := v.Args[2] 8779 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 8780 break 8781 } 8782 v.reset(OpS390XANDload) 8783 v.AuxInt = off1 + off2 8784 v.Aux = sym 8785 v.AddArg(x) 8786 v.AddArg(ptr) 8787 v.AddArg(mem) 8788 return true 8789 } 8790 // match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 8791 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 8792 // result: (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 8793 for { 8794 o1 := v.AuxInt 8795 s1 := v.Aux 8796 _ = v.Args[2] 8797 x := v.Args[0] 8798 v_1 := v.Args[1] 8799 if v_1.Op != OpS390XMOVDaddr { 8800 break 8801 } 8802 o2 := v_1.AuxInt 8803 s2 := v_1.Aux 8804 ptr := v_1.Args[0] 8805 mem := v.Args[2] 8806 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 8807 break 8808 } 8809 v.reset(OpS390XANDload) 8810 v.AuxInt = o1 + o2 8811 v.Aux = mergeSym(s1, s2) 8812 v.AddArg(x) 8813 v.AddArg(ptr) 8814 v.AddArg(mem) 8815 return true 8816 } 8817 return false 8818 } 8819 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 8820 b := v.Block 8821 _ = b 8822 // match: (CMP x (MOVDconst [c])) 8823 // cond: is32Bit(c) 8824 // result: (CMPconst x [c]) 8825 for { 8826 _ = v.Args[1] 8827 x := v.Args[0] 8828 v_1 := v.Args[1] 8829 if v_1.Op != OpS390XMOVDconst { 8830 break 8831 } 8832 c := v_1.AuxInt 8833 if !(is32Bit(c)) { 8834 break 8835 } 8836 v.reset(OpS390XCMPconst) 8837 v.AuxInt = c 8838 v.AddArg(x) 8839 return true 8840 } 8841 // match: (CMP (MOVDconst [c]) x) 8842 // cond: is32Bit(c) 8843 // result: (InvertFlags (CMPconst x [c])) 8844 for { 8845 _ = v.Args[1] 8846 v_0 := v.Args[0] 8847 if v_0.Op != OpS390XMOVDconst { 8848 break 8849 } 8850 c := v_0.AuxInt 8851 x := v.Args[1] 8852 if !(is32Bit(c)) { 8853 break 8854 } 8855 v.reset(OpS390XInvertFlags) 8856 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 8857 v0.AuxInt = c 8858 v0.AddArg(x) 8859 v.AddArg(v0) 8860 return true 8861 } 8862 return false 8863 } 8864 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 8865 b := v.Block 8866 _ = b 8867 // match: (CMPU x (MOVDconst [c])) 8868 // cond: isU32Bit(c) 8869 // result: (CMPUconst x [int64(int32(c))]) 8870 for { 8871 _ = v.Args[1] 8872 x := v.Args[0] 8873 v_1 := v.Args[1] 8874 if v_1.Op != OpS390XMOVDconst { 8875 break 8876 } 8877 c := v_1.AuxInt 8878 if !(isU32Bit(c)) { 8879 break 8880 } 8881 v.reset(OpS390XCMPUconst) 8882 v.AuxInt = int64(int32(c)) 8883 v.AddArg(x) 8884 return true 8885 } 8886 // match: (CMPU (MOVDconst [c]) x) 8887 // cond: isU32Bit(c) 8888 // result: (InvertFlags (CMPUconst x [int64(int32(c))])) 8889 for { 8890 _ = v.Args[1] 8891 v_0 := v.Args[0] 8892 if v_0.Op != OpS390XMOVDconst { 8893 break 8894 } 8895 c := v_0.AuxInt 8896 x := v.Args[1] 8897 if !(isU32Bit(c)) { 8898 break 8899 } 8900 v.reset(OpS390XInvertFlags) 8901 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 8902 v0.AuxInt = int64(int32(c)) 8903 v0.AddArg(x) 8904 v.AddArg(v0) 8905 return true 8906 } 8907 return false 8908 } 8909 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 8910 // match: (CMPUconst (MOVDconst [x]) [y]) 8911 // cond: uint64(x)==uint64(y) 8912 // result: (FlagEQ) 8913 for { 8914 y := v.AuxInt 8915 v_0 := v.Args[0] 8916 if v_0.Op != OpS390XMOVDconst { 8917 break 8918 } 8919 x := v_0.AuxInt 8920 if !(uint64(x) == uint64(y)) { 8921 break 8922 } 8923 v.reset(OpS390XFlagEQ) 8924 return true 8925 } 8926 // match: (CMPUconst (MOVDconst [x]) [y]) 8927 // cond: uint64(x)<uint64(y) 8928 // result: (FlagLT) 8929 for { 8930 y := v.AuxInt 8931 v_0 := v.Args[0] 8932 if v_0.Op != OpS390XMOVDconst { 8933 break 8934 } 8935 x := v_0.AuxInt 8936 if !(uint64(x) < uint64(y)) { 8937 break 8938 } 8939 v.reset(OpS390XFlagLT) 8940 return true 8941 } 8942 // match: (CMPUconst (MOVDconst [x]) [y]) 8943 // cond: uint64(x)>uint64(y) 8944 // result: (FlagGT) 8945 for { 8946 y := v.AuxInt 8947 v_0 := v.Args[0] 8948 if v_0.Op != OpS390XMOVDconst { 8949 break 8950 } 8951 x := v_0.AuxInt 8952 if !(uint64(x) > uint64(y)) { 8953 break 8954 } 8955 v.reset(OpS390XFlagGT) 8956 return true 8957 } 8958 // match: (CMPUconst (SRDconst _ [c]) [n]) 8959 // cond: c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n) 8960 // result: (FlagLT) 8961 for { 8962 n := v.AuxInt 8963 v_0 := v.Args[0] 8964 if v_0.Op != OpS390XSRDconst { 8965 break 8966 } 8967 c := v_0.AuxInt 8968 if !(c > 0 && c < 64 && (1<<uint(64-c)) <= uint64(n)) { 8969 break 8970 } 8971 v.reset(OpS390XFlagLT) 8972 return true 8973 } 8974 // match: (CMPUconst (MOVWZreg x) [c]) 8975 // cond: 8976 // result: (CMPWUconst x [c]) 8977 for { 8978 c := v.AuxInt 8979 v_0 := v.Args[0] 8980 if v_0.Op != OpS390XMOVWZreg { 8981 break 8982 } 8983 x := v_0.Args[0] 8984 v.reset(OpS390XCMPWUconst) 8985 v.AuxInt = c 8986 v.AddArg(x) 8987 return true 8988 } 8989 // match: (CMPUconst x:(MOVHreg _) [c]) 8990 // cond: 8991 // result: (CMPWUconst x [c]) 8992 for { 8993 c := v.AuxInt 8994 x := v.Args[0] 8995 if x.Op != OpS390XMOVHreg { 8996 break 8997 } 8998 v.reset(OpS390XCMPWUconst) 8999 v.AuxInt = c 9000 v.AddArg(x) 9001 return true 9002 } 9003 // match: (CMPUconst x:(MOVHZreg _) [c]) 9004 // cond: 9005 // result: (CMPWUconst x [c]) 9006 for { 9007 c := v.AuxInt 9008 x := v.Args[0] 9009 if x.Op != OpS390XMOVHZreg { 9010 break 9011 } 9012 v.reset(OpS390XCMPWUconst) 9013 v.AuxInt = c 9014 v.AddArg(x) 9015 return true 9016 } 9017 // match: (CMPUconst x:(MOVBreg _) [c]) 9018 // cond: 9019 // result: (CMPWUconst x [c]) 9020 for { 9021 c := v.AuxInt 9022 x := v.Args[0] 9023 if x.Op != OpS390XMOVBreg { 9024 break 9025 } 9026 v.reset(OpS390XCMPWUconst) 9027 v.AuxInt = c 9028 v.AddArg(x) 9029 return true 9030 } 9031 // match: (CMPUconst x:(MOVBZreg _) [c]) 9032 // cond: 9033 // result: (CMPWUconst x [c]) 9034 for { 9035 c := v.AuxInt 9036 x := v.Args[0] 9037 if x.Op != OpS390XMOVBZreg { 9038 break 9039 } 9040 v.reset(OpS390XCMPWUconst) 9041 v.AuxInt = c 9042 v.AddArg(x) 9043 return true 9044 } 9045 // match: (CMPUconst (MOVWZreg x:(ANDWconst [m] _)) [c]) 9046 // cond: int32(m) >= 0 9047 // result: (CMPWUconst x [c]) 9048 for { 9049 c := v.AuxInt 9050 v_0 := v.Args[0] 9051 if v_0.Op != OpS390XMOVWZreg { 9052 break 9053 } 9054 x := v_0.Args[0] 9055 if x.Op != OpS390XANDWconst { 9056 break 9057 } 9058 m := x.AuxInt 9059 if !(int32(m) >= 0) { 9060 break 9061 } 9062 v.reset(OpS390XCMPWUconst) 9063 v.AuxInt = c 9064 v.AddArg(x) 9065 return true 9066 } 9067 return false 9068 } 9069 func rewriteValueS390X_OpS390XCMPUconst_10(v *Value) bool { 9070 // match: (CMPUconst (MOVWreg x:(ANDWconst [m] _)) [c]) 9071 // cond: int32(m) >= 0 9072 // result: (CMPWUconst x [c]) 9073 for { 9074 c := v.AuxInt 9075 v_0 := v.Args[0] 9076 if v_0.Op != OpS390XMOVWreg { 9077 break 9078 } 9079 x := v_0.Args[0] 9080 if x.Op != OpS390XANDWconst { 9081 break 9082 } 9083 m := x.AuxInt 9084 if !(int32(m) >= 0) { 9085 break 9086 } 9087 v.reset(OpS390XCMPWUconst) 9088 v.AuxInt = c 9089 v.AddArg(x) 9090 return true 9091 } 9092 return false 9093 } 9094 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 9095 b := v.Block 9096 _ = b 9097 // match: (CMPW x (MOVDconst [c])) 9098 // cond: 9099 // result: (CMPWconst x [int64(int32(c))]) 9100 for { 9101 _ = v.Args[1] 9102 x := v.Args[0] 9103 v_1 := v.Args[1] 9104 if v_1.Op != OpS390XMOVDconst { 9105 break 9106 } 9107 c := v_1.AuxInt 9108 v.reset(OpS390XCMPWconst) 9109 v.AuxInt = int64(int32(c)) 9110 v.AddArg(x) 9111 return true 9112 } 9113 // match: (CMPW (MOVDconst [c]) x) 9114 // cond: 9115 // result: (InvertFlags (CMPWconst x [int64(int32(c))])) 9116 for { 9117 _ = v.Args[1] 9118 v_0 := v.Args[0] 9119 if v_0.Op != OpS390XMOVDconst { 9120 break 9121 } 9122 c := v_0.AuxInt 9123 x := v.Args[1] 9124 v.reset(OpS390XInvertFlags) 9125 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 9126 v0.AuxInt = int64(int32(c)) 9127 v0.AddArg(x) 9128 v.AddArg(v0) 9129 return true 9130 } 9131 // match: (CMPW x (MOVWreg y)) 9132 // cond: 9133 // result: (CMPW x y) 9134 for { 9135 _ = v.Args[1] 9136 x := v.Args[0] 9137 v_1 := v.Args[1] 9138 if v_1.Op != OpS390XMOVWreg { 9139 break 9140 } 9141 y := v_1.Args[0] 9142 v.reset(OpS390XCMPW) 9143 v.AddArg(x) 9144 v.AddArg(y) 9145 return true 9146 } 9147 // match: (CMPW x (MOVWZreg y)) 9148 // cond: 9149 // result: (CMPW x y) 9150 for { 9151 _ = v.Args[1] 9152 x := v.Args[0] 9153 v_1 := v.Args[1] 9154 if v_1.Op != OpS390XMOVWZreg { 9155 break 9156 } 9157 y := v_1.Args[0] 9158 v.reset(OpS390XCMPW) 9159 v.AddArg(x) 9160 v.AddArg(y) 9161 return true 9162 } 9163 // match: (CMPW (MOVWreg x) y) 9164 // cond: 9165 // result: (CMPW x y) 9166 for { 9167 _ = v.Args[1] 9168 v_0 := v.Args[0] 9169 if v_0.Op != OpS390XMOVWreg { 9170 break 9171 } 9172 x := v_0.Args[0] 9173 y := v.Args[1] 9174 v.reset(OpS390XCMPW) 9175 v.AddArg(x) 9176 v.AddArg(y) 9177 return true 9178 } 9179 // match: (CMPW (MOVWZreg x) y) 9180 // cond: 9181 // result: (CMPW x y) 9182 for { 9183 _ = v.Args[1] 9184 v_0 := v.Args[0] 9185 if v_0.Op != OpS390XMOVWZreg { 9186 break 9187 } 9188 x := v_0.Args[0] 9189 y := v.Args[1] 9190 v.reset(OpS390XCMPW) 9191 v.AddArg(x) 9192 v.AddArg(y) 9193 return true 9194 } 9195 return false 9196 } 9197 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 9198 b := v.Block 9199 _ = b 9200 // match: (CMPWU x (MOVDconst [c])) 9201 // cond: 9202 // result: (CMPWUconst x [int64(int32(c))]) 9203 for { 9204 _ = v.Args[1] 9205 x := v.Args[0] 9206 v_1 := v.Args[1] 9207 if v_1.Op != OpS390XMOVDconst { 9208 break 9209 } 9210 c := v_1.AuxInt 9211 v.reset(OpS390XCMPWUconst) 9212 v.AuxInt = int64(int32(c)) 9213 v.AddArg(x) 9214 return true 9215 } 9216 // match: (CMPWU (MOVDconst [c]) x) 9217 // cond: 9218 // result: (InvertFlags (CMPWUconst x [int64(int32(c))])) 9219 for { 9220 _ = v.Args[1] 9221 v_0 := v.Args[0] 9222 if v_0.Op != OpS390XMOVDconst { 9223 break 9224 } 9225 c := v_0.AuxInt 9226 x := v.Args[1] 9227 v.reset(OpS390XInvertFlags) 9228 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 9229 v0.AuxInt = int64(int32(c)) 9230 v0.AddArg(x) 9231 v.AddArg(v0) 9232 return true 9233 } 9234 // match: (CMPWU x (MOVWreg y)) 9235 // cond: 9236 // result: (CMPWU x y) 9237 for { 9238 _ = v.Args[1] 9239 x := v.Args[0] 9240 v_1 := v.Args[1] 9241 if v_1.Op != OpS390XMOVWreg { 9242 break 9243 } 9244 y := v_1.Args[0] 9245 v.reset(OpS390XCMPWU) 9246 v.AddArg(x) 9247 v.AddArg(y) 9248 return true 9249 } 9250 // match: (CMPWU x (MOVWZreg y)) 9251 // cond: 9252 // result: (CMPWU x y) 9253 for { 9254 _ = v.Args[1] 9255 x := v.Args[0] 9256 v_1 := v.Args[1] 9257 if v_1.Op != OpS390XMOVWZreg { 9258 break 9259 } 9260 y := v_1.Args[0] 9261 v.reset(OpS390XCMPWU) 9262 v.AddArg(x) 9263 v.AddArg(y) 9264 return true 9265 } 9266 // match: (CMPWU (MOVWreg x) y) 9267 // cond: 9268 // result: (CMPWU x y) 9269 for { 9270 _ = v.Args[1] 9271 v_0 := v.Args[0] 9272 if v_0.Op != OpS390XMOVWreg { 9273 break 9274 } 9275 x := v_0.Args[0] 9276 y := v.Args[1] 9277 v.reset(OpS390XCMPWU) 9278 v.AddArg(x) 9279 v.AddArg(y) 9280 return true 9281 } 9282 // match: (CMPWU (MOVWZreg x) y) 9283 // cond: 9284 // result: (CMPWU x y) 9285 for { 9286 _ = v.Args[1] 9287 v_0 := v.Args[0] 9288 if v_0.Op != OpS390XMOVWZreg { 9289 break 9290 } 9291 x := v_0.Args[0] 9292 y := v.Args[1] 9293 v.reset(OpS390XCMPWU) 9294 v.AddArg(x) 9295 v.AddArg(y) 9296 return true 9297 } 9298 return false 9299 } 9300 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 9301 // match: (CMPWUconst (MOVDconst [x]) [y]) 9302 // cond: uint32(x)==uint32(y) 9303 // result: (FlagEQ) 9304 for { 9305 y := v.AuxInt 9306 v_0 := v.Args[0] 9307 if v_0.Op != OpS390XMOVDconst { 9308 break 9309 } 9310 x := v_0.AuxInt 9311 if !(uint32(x) == uint32(y)) { 9312 break 9313 } 9314 v.reset(OpS390XFlagEQ) 9315 return true 9316 } 9317 // match: (CMPWUconst (MOVDconst [x]) [y]) 9318 // cond: uint32(x)<uint32(y) 9319 // result: (FlagLT) 9320 for { 9321 y := v.AuxInt 9322 v_0 := v.Args[0] 9323 if v_0.Op != OpS390XMOVDconst { 9324 break 9325 } 9326 x := v_0.AuxInt 9327 if !(uint32(x) < uint32(y)) { 9328 break 9329 } 9330 v.reset(OpS390XFlagLT) 9331 return true 9332 } 9333 // match: (CMPWUconst (MOVDconst [x]) [y]) 9334 // cond: uint32(x)>uint32(y) 9335 // result: (FlagGT) 9336 for { 9337 y := v.AuxInt 9338 v_0 := v.Args[0] 9339 if v_0.Op != OpS390XMOVDconst { 9340 break 9341 } 9342 x := v_0.AuxInt 9343 if !(uint32(x) > uint32(y)) { 9344 break 9345 } 9346 v.reset(OpS390XFlagGT) 9347 return true 9348 } 9349 // match: (CMPWUconst (MOVBZreg _) [c]) 9350 // cond: 0xff < c 9351 // result: (FlagLT) 9352 for { 9353 c := v.AuxInt 9354 v_0 := v.Args[0] 9355 if v_0.Op != OpS390XMOVBZreg { 9356 break 9357 } 9358 if !(0xff < c) { 9359 break 9360 } 9361 v.reset(OpS390XFlagLT) 9362 return true 9363 } 9364 // match: (CMPWUconst (MOVHZreg _) [c]) 9365 // cond: 0xffff < c 9366 // result: (FlagLT) 9367 for { 9368 c := v.AuxInt 9369 v_0 := v.Args[0] 9370 if v_0.Op != OpS390XMOVHZreg { 9371 break 9372 } 9373 if !(0xffff < c) { 9374 break 9375 } 9376 v.reset(OpS390XFlagLT) 9377 return true 9378 } 9379 // match: (CMPWUconst (SRWconst _ [c]) [n]) 9380 // cond: c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n) 9381 // result: (FlagLT) 9382 for { 9383 n := v.AuxInt 9384 v_0 := v.Args[0] 9385 if v_0.Op != OpS390XSRWconst { 9386 break 9387 } 9388 c := v_0.AuxInt 9389 if !(c > 0 && c < 32 && (1<<uint(32-c)) <= uint32(n)) { 9390 break 9391 } 9392 v.reset(OpS390XFlagLT) 9393 return true 9394 } 9395 // match: (CMPWUconst (ANDWconst _ [m]) [n]) 9396 // cond: uint32(m) < uint32(n) 9397 // result: (FlagLT) 9398 for { 9399 n := v.AuxInt 9400 v_0 := v.Args[0] 9401 if v_0.Op != OpS390XANDWconst { 9402 break 9403 } 9404 m := v_0.AuxInt 9405 if !(uint32(m) < uint32(n)) { 9406 break 9407 } 9408 v.reset(OpS390XFlagLT) 9409 return true 9410 } 9411 // match: (CMPWUconst (MOVWreg x) [c]) 9412 // cond: 9413 // result: (CMPWUconst x [c]) 9414 for { 9415 c := v.AuxInt 9416 v_0 := v.Args[0] 9417 if v_0.Op != OpS390XMOVWreg { 9418 break 9419 } 9420 x := v_0.Args[0] 9421 v.reset(OpS390XCMPWUconst) 9422 v.AuxInt = c 9423 v.AddArg(x) 9424 return true 9425 } 9426 // match: (CMPWUconst (MOVWZreg x) [c]) 9427 // cond: 9428 // result: (CMPWUconst x [c]) 9429 for { 9430 c := v.AuxInt 9431 v_0 := v.Args[0] 9432 if v_0.Op != OpS390XMOVWZreg { 9433 break 9434 } 9435 x := v_0.Args[0] 9436 v.reset(OpS390XCMPWUconst) 9437 v.AuxInt = c 9438 v.AddArg(x) 9439 return true 9440 } 9441 return false 9442 } 9443 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 9444 // match: (CMPWconst (MOVDconst [x]) [y]) 9445 // cond: int32(x)==int32(y) 9446 // result: (FlagEQ) 9447 for { 9448 y := v.AuxInt 9449 v_0 := v.Args[0] 9450 if v_0.Op != OpS390XMOVDconst { 9451 break 9452 } 9453 x := v_0.AuxInt 9454 if !(int32(x) == int32(y)) { 9455 break 9456 } 9457 v.reset(OpS390XFlagEQ) 9458 return true 9459 } 9460 // match: (CMPWconst (MOVDconst [x]) [y]) 9461 // cond: int32(x)<int32(y) 9462 // result: (FlagLT) 9463 for { 9464 y := v.AuxInt 9465 v_0 := v.Args[0] 9466 if v_0.Op != OpS390XMOVDconst { 9467 break 9468 } 9469 x := v_0.AuxInt 9470 if !(int32(x) < int32(y)) { 9471 break 9472 } 9473 v.reset(OpS390XFlagLT) 9474 return true 9475 } 9476 // match: (CMPWconst (MOVDconst [x]) [y]) 9477 // cond: int32(x)>int32(y) 9478 // result: (FlagGT) 9479 for { 9480 y := v.AuxInt 9481 v_0 := v.Args[0] 9482 if v_0.Op != OpS390XMOVDconst { 9483 break 9484 } 9485 x := v_0.AuxInt 9486 if !(int32(x) > int32(y)) { 9487 break 9488 } 9489 v.reset(OpS390XFlagGT) 9490 return true 9491 } 9492 // match: (CMPWconst (MOVBZreg _) [c]) 9493 // cond: 0xff < c 9494 // result: (FlagLT) 9495 for { 9496 c := v.AuxInt 9497 v_0 := v.Args[0] 9498 if v_0.Op != OpS390XMOVBZreg { 9499 break 9500 } 9501 if !(0xff < c) { 9502 break 9503 } 9504 v.reset(OpS390XFlagLT) 9505 return true 9506 } 9507 // match: (CMPWconst (MOVHZreg _) [c]) 9508 // cond: 0xffff < c 9509 // result: (FlagLT) 9510 for { 9511 c := v.AuxInt 9512 v_0 := v.Args[0] 9513 if v_0.Op != OpS390XMOVHZreg { 9514 break 9515 } 9516 if !(0xffff < c) { 9517 break 9518 } 9519 v.reset(OpS390XFlagLT) 9520 return true 9521 } 9522 // match: (CMPWconst (SRWconst _ [c]) [n]) 9523 // cond: c > 0 && n < 0 9524 // result: (FlagGT) 9525 for { 9526 n := v.AuxInt 9527 v_0 := v.Args[0] 9528 if v_0.Op != OpS390XSRWconst { 9529 break 9530 } 9531 c := v_0.AuxInt 9532 if !(c > 0 && n < 0) { 9533 break 9534 } 9535 v.reset(OpS390XFlagGT) 9536 return true 9537 } 9538 // match: (CMPWconst (ANDWconst _ [m]) [n]) 9539 // cond: int32(m) >= 0 && int32(m) < int32(n) 9540 // result: (FlagLT) 9541 for { 9542 n := v.AuxInt 9543 v_0 := v.Args[0] 9544 if v_0.Op != OpS390XANDWconst { 9545 break 9546 } 9547 m := v_0.AuxInt 9548 if !(int32(m) >= 0 && int32(m) < int32(n)) { 9549 break 9550 } 9551 v.reset(OpS390XFlagLT) 9552 return true 9553 } 9554 // match: (CMPWconst x:(SRWconst _ [c]) [n]) 9555 // cond: c > 0 && n >= 0 9556 // result: (CMPWUconst x [n]) 9557 for { 9558 n := v.AuxInt 9559 x := v.Args[0] 9560 if x.Op != OpS390XSRWconst { 9561 break 9562 } 9563 c := x.AuxInt 9564 if !(c > 0 && n >= 0) { 9565 break 9566 } 9567 v.reset(OpS390XCMPWUconst) 9568 v.AuxInt = n 9569 v.AddArg(x) 9570 return true 9571 } 9572 // match: (CMPWconst (MOVWreg x) [c]) 9573 // cond: 9574 // result: (CMPWconst x [c]) 9575 for { 9576 c := v.AuxInt 9577 v_0 := v.Args[0] 9578 if v_0.Op != OpS390XMOVWreg { 9579 break 9580 } 9581 x := v_0.Args[0] 9582 v.reset(OpS390XCMPWconst) 9583 v.AuxInt = c 9584 v.AddArg(x) 9585 return true 9586 } 9587 // match: (CMPWconst (MOVWZreg x) [c]) 9588 // cond: 9589 // result: (CMPWconst x [c]) 9590 for { 9591 c := v.AuxInt 9592 v_0 := v.Args[0] 9593 if v_0.Op != OpS390XMOVWZreg { 9594 break 9595 } 9596 x := v_0.Args[0] 9597 v.reset(OpS390XCMPWconst) 9598 v.AuxInt = c 9599 v.AddArg(x) 9600 return true 9601 } 9602 return false 9603 } 9604 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 9605 // match: (CMPconst (MOVDconst [x]) [y]) 9606 // cond: x==y 9607 // result: (FlagEQ) 9608 for { 9609 y := v.AuxInt 9610 v_0 := v.Args[0] 9611 if v_0.Op != OpS390XMOVDconst { 9612 break 9613 } 9614 x := v_0.AuxInt 9615 if !(x == y) { 9616 break 9617 } 9618 v.reset(OpS390XFlagEQ) 9619 return true 9620 } 9621 // match: (CMPconst (MOVDconst [x]) [y]) 9622 // cond: x<y 9623 // result: (FlagLT) 9624 for { 9625 y := v.AuxInt 9626 v_0 := v.Args[0] 9627 if v_0.Op != OpS390XMOVDconst { 9628 break 9629 } 9630 x := v_0.AuxInt 9631 if !(x < y) { 9632 break 9633 } 9634 v.reset(OpS390XFlagLT) 9635 return true 9636 } 9637 // match: (CMPconst (MOVDconst [x]) [y]) 9638 // cond: x>y 9639 // result: (FlagGT) 9640 for { 9641 y := v.AuxInt 9642 v_0 := v.Args[0] 9643 if v_0.Op != OpS390XMOVDconst { 9644 break 9645 } 9646 x := v_0.AuxInt 9647 if !(x > y) { 9648 break 9649 } 9650 v.reset(OpS390XFlagGT) 9651 return true 9652 } 9653 // match: (CMPconst (SRDconst _ [c]) [n]) 9654 // cond: c > 0 && n < 0 9655 // result: (FlagGT) 9656 for { 9657 n := v.AuxInt 9658 v_0 := v.Args[0] 9659 if v_0.Op != OpS390XSRDconst { 9660 break 9661 } 9662 c := v_0.AuxInt 9663 if !(c > 0 && n < 0) { 9664 break 9665 } 9666 v.reset(OpS390XFlagGT) 9667 return true 9668 } 9669 // match: (CMPconst (MOVWreg x) [c]) 9670 // cond: 9671 // result: (CMPWconst x [c]) 9672 for { 9673 c := v.AuxInt 9674 v_0 := v.Args[0] 9675 if v_0.Op != OpS390XMOVWreg { 9676 break 9677 } 9678 x := v_0.Args[0] 9679 v.reset(OpS390XCMPWconst) 9680 v.AuxInt = c 9681 v.AddArg(x) 9682 return true 9683 } 9684 // match: (CMPconst x:(MOVHreg _) [c]) 9685 // cond: 9686 // result: (CMPWconst x [c]) 9687 for { 9688 c := v.AuxInt 9689 x := v.Args[0] 9690 if x.Op != OpS390XMOVHreg { 9691 break 9692 } 9693 v.reset(OpS390XCMPWconst) 9694 v.AuxInt = c 9695 v.AddArg(x) 9696 return true 9697 } 9698 // match: (CMPconst x:(MOVHZreg _) [c]) 9699 // cond: 9700 // result: (CMPWconst x [c]) 9701 for { 9702 c := v.AuxInt 9703 x := v.Args[0] 9704 if x.Op != OpS390XMOVHZreg { 9705 break 9706 } 9707 v.reset(OpS390XCMPWconst) 9708 v.AuxInt = c 9709 v.AddArg(x) 9710 return true 9711 } 9712 // match: (CMPconst x:(MOVBreg _) [c]) 9713 // cond: 9714 // result: (CMPWconst x [c]) 9715 for { 9716 c := v.AuxInt 9717 x := v.Args[0] 9718 if x.Op != OpS390XMOVBreg { 9719 break 9720 } 9721 v.reset(OpS390XCMPWconst) 9722 v.AuxInt = c 9723 v.AddArg(x) 9724 return true 9725 } 9726 // match: (CMPconst x:(MOVBZreg _) [c]) 9727 // cond: 9728 // result: (CMPWconst x [c]) 9729 for { 9730 c := v.AuxInt 9731 x := v.Args[0] 9732 if x.Op != OpS390XMOVBZreg { 9733 break 9734 } 9735 v.reset(OpS390XCMPWconst) 9736 v.AuxInt = c 9737 v.AddArg(x) 9738 return true 9739 } 9740 // match: (CMPconst (MOVWZreg x:(ANDWconst [m] _)) [c]) 9741 // cond: int32(m) >= 0 && c >= 0 9742 // result: (CMPWUconst x [c]) 9743 for { 9744 c := v.AuxInt 9745 v_0 := v.Args[0] 9746 if v_0.Op != OpS390XMOVWZreg { 9747 break 9748 } 9749 x := v_0.Args[0] 9750 if x.Op != OpS390XANDWconst { 9751 break 9752 } 9753 m := x.AuxInt 9754 if !(int32(m) >= 0 && c >= 0) { 9755 break 9756 } 9757 v.reset(OpS390XCMPWUconst) 9758 v.AuxInt = c 9759 v.AddArg(x) 9760 return true 9761 } 9762 return false 9763 } 9764 func rewriteValueS390X_OpS390XCMPconst_10(v *Value) bool { 9765 // match: (CMPconst (MOVWreg x:(ANDWconst [m] _)) [c]) 9766 // cond: int32(m) >= 0 && c >= 0 9767 // result: (CMPWUconst x [c]) 9768 for { 9769 c := v.AuxInt 9770 v_0 := v.Args[0] 9771 if v_0.Op != OpS390XMOVWreg { 9772 break 9773 } 9774 x := v_0.Args[0] 9775 if x.Op != OpS390XANDWconst { 9776 break 9777 } 9778 m := x.AuxInt 9779 if !(int32(m) >= 0 && c >= 0) { 9780 break 9781 } 9782 v.reset(OpS390XCMPWUconst) 9783 v.AuxInt = c 9784 v.AddArg(x) 9785 return true 9786 } 9787 // match: (CMPconst x:(SRDconst _ [c]) [n]) 9788 // cond: c > 0 && n >= 0 9789 // result: (CMPUconst x [n]) 9790 for { 9791 n := v.AuxInt 9792 x := v.Args[0] 9793 if x.Op != OpS390XSRDconst { 9794 break 9795 } 9796 c := x.AuxInt 9797 if !(c > 0 && n >= 0) { 9798 break 9799 } 9800 v.reset(OpS390XCMPUconst) 9801 v.AuxInt = n 9802 v.AddArg(x) 9803 return true 9804 } 9805 return false 9806 } 9807 func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool { 9808 // match: (CPSDR y (FMOVDconst [c])) 9809 // cond: c & -1<<63 == 0 9810 // result: (LPDFR y) 9811 for { 9812 _ = v.Args[1] 9813 y := v.Args[0] 9814 v_1 := v.Args[1] 9815 if v_1.Op != OpS390XFMOVDconst { 9816 break 9817 } 9818 c := v_1.AuxInt 9819 if !(c&-1<<63 == 0) { 9820 break 9821 } 9822 v.reset(OpS390XLPDFR) 9823 v.AddArg(y) 9824 return true 9825 } 9826 // match: (CPSDR y (FMOVDconst [c])) 9827 // cond: c & -1<<63 != 0 9828 // result: (LNDFR y) 9829 for { 9830 _ = v.Args[1] 9831 y := v.Args[0] 9832 v_1 := v.Args[1] 9833 if v_1.Op != OpS390XFMOVDconst { 9834 break 9835 } 9836 c := v_1.AuxInt 9837 if !(c&-1<<63 != 0) { 9838 break 9839 } 9840 v.reset(OpS390XLNDFR) 9841 v.AddArg(y) 9842 return true 9843 } 9844 return false 9845 } 9846 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 9847 // match: (FADD (FMUL y z) x) 9848 // cond: 9849 // result: (FMADD x y z) 9850 for { 9851 _ = v.Args[1] 9852 v_0 := v.Args[0] 9853 if v_0.Op != OpS390XFMUL { 9854 break 9855 } 9856 _ = v_0.Args[1] 9857 y := v_0.Args[0] 9858 z := v_0.Args[1] 9859 x := v.Args[1] 9860 v.reset(OpS390XFMADD) 9861 v.AddArg(x) 9862 v.AddArg(y) 9863 v.AddArg(z) 9864 return true 9865 } 9866 // match: (FADD x (FMUL y z)) 9867 // cond: 9868 // result: (FMADD x y z) 9869 for { 9870 _ = v.Args[1] 9871 x := v.Args[0] 9872 v_1 := v.Args[1] 9873 if v_1.Op != OpS390XFMUL { 9874 break 9875 } 9876 _ = v_1.Args[1] 9877 y := v_1.Args[0] 9878 z := v_1.Args[1] 9879 v.reset(OpS390XFMADD) 9880 v.AddArg(x) 9881 v.AddArg(y) 9882 v.AddArg(z) 9883 return true 9884 } 9885 return false 9886 } 9887 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 9888 // match: (FADDS (FMULS y z) x) 9889 // cond: 9890 // result: (FMADDS x y z) 9891 for { 9892 _ = v.Args[1] 9893 v_0 := v.Args[0] 9894 if v_0.Op != OpS390XFMULS { 9895 break 9896 } 9897 _ = v_0.Args[1] 9898 y := v_0.Args[0] 9899 z := v_0.Args[1] 9900 x := v.Args[1] 9901 v.reset(OpS390XFMADDS) 9902 v.AddArg(x) 9903 v.AddArg(y) 9904 v.AddArg(z) 9905 return true 9906 } 9907 // match: (FADDS x (FMULS y z)) 9908 // cond: 9909 // result: (FMADDS x y z) 9910 for { 9911 _ = v.Args[1] 9912 x := v.Args[0] 9913 v_1 := v.Args[1] 9914 if v_1.Op != OpS390XFMULS { 9915 break 9916 } 9917 _ = v_1.Args[1] 9918 y := v_1.Args[0] 9919 z := v_1.Args[1] 9920 v.reset(OpS390XFMADDS) 9921 v.AddArg(x) 9922 v.AddArg(y) 9923 v.AddArg(z) 9924 return true 9925 } 9926 return false 9927 } 9928 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 9929 // match: (FMOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 9930 // cond: isSamePtr(ptr1, ptr2) 9931 // result: (LDGR x) 9932 for { 9933 off := v.AuxInt 9934 sym := v.Aux 9935 _ = v.Args[1] 9936 ptr1 := v.Args[0] 9937 v_1 := v.Args[1] 9938 if v_1.Op != OpS390XMOVDstore { 9939 break 9940 } 9941 if v_1.AuxInt != off { 9942 break 9943 } 9944 if v_1.Aux != sym { 9945 break 9946 } 9947 _ = v_1.Args[2] 9948 ptr2 := v_1.Args[0] 9949 x := v_1.Args[1] 9950 if !(isSamePtr(ptr1, ptr2)) { 9951 break 9952 } 9953 v.reset(OpS390XLDGR) 9954 v.AddArg(x) 9955 return true 9956 } 9957 // match: (FMOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 9958 // cond: isSamePtr(ptr1, ptr2) 9959 // result: x 9960 for { 9961 off := v.AuxInt 9962 sym := v.Aux 9963 _ = v.Args[1] 9964 ptr1 := v.Args[0] 9965 v_1 := v.Args[1] 9966 if v_1.Op != OpS390XFMOVDstore { 9967 break 9968 } 9969 if v_1.AuxInt != off { 9970 break 9971 } 9972 if v_1.Aux != sym { 9973 break 9974 } 9975 _ = v_1.Args[2] 9976 ptr2 := v_1.Args[0] 9977 x := v_1.Args[1] 9978 if !(isSamePtr(ptr1, ptr2)) { 9979 break 9980 } 9981 v.reset(OpCopy) 9982 v.Type = x.Type 9983 v.AddArg(x) 9984 return true 9985 } 9986 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 9987 // cond: is20Bit(off1+off2) 9988 // result: (FMOVDload [off1+off2] {sym} ptr mem) 9989 for { 9990 off1 := v.AuxInt 9991 sym := v.Aux 9992 _ = v.Args[1] 9993 v_0 := v.Args[0] 9994 if v_0.Op != OpS390XADDconst { 9995 break 9996 } 9997 off2 := v_0.AuxInt 9998 ptr := v_0.Args[0] 9999 mem := v.Args[1] 10000 if !(is20Bit(off1 + off2)) { 10001 break 10002 } 10003 v.reset(OpS390XFMOVDload) 10004 v.AuxInt = off1 + off2 10005 v.Aux = sym 10006 v.AddArg(ptr) 10007 v.AddArg(mem) 10008 return true 10009 } 10010 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10011 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10012 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10013 for { 10014 off1 := v.AuxInt 10015 sym1 := v.Aux 10016 _ = v.Args[1] 10017 v_0 := v.Args[0] 10018 if v_0.Op != OpS390XMOVDaddr { 10019 break 10020 } 10021 off2 := v_0.AuxInt 10022 sym2 := v_0.Aux 10023 base := v_0.Args[0] 10024 mem := v.Args[1] 10025 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10026 break 10027 } 10028 v.reset(OpS390XFMOVDload) 10029 v.AuxInt = off1 + off2 10030 v.Aux = mergeSym(sym1, sym2) 10031 v.AddArg(base) 10032 v.AddArg(mem) 10033 return true 10034 } 10035 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10036 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10037 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10038 for { 10039 off1 := v.AuxInt 10040 sym1 := v.Aux 10041 _ = v.Args[1] 10042 v_0 := v.Args[0] 10043 if v_0.Op != OpS390XMOVDaddridx { 10044 break 10045 } 10046 off2 := v_0.AuxInt 10047 sym2 := v_0.Aux 10048 _ = v_0.Args[1] 10049 ptr := v_0.Args[0] 10050 idx := v_0.Args[1] 10051 mem := v.Args[1] 10052 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10053 break 10054 } 10055 v.reset(OpS390XFMOVDloadidx) 10056 v.AuxInt = off1 + off2 10057 v.Aux = mergeSym(sym1, sym2) 10058 v.AddArg(ptr) 10059 v.AddArg(idx) 10060 v.AddArg(mem) 10061 return true 10062 } 10063 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 10064 // cond: ptr.Op != OpSB 10065 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 10066 for { 10067 off := v.AuxInt 10068 sym := v.Aux 10069 _ = v.Args[1] 10070 v_0 := v.Args[0] 10071 if v_0.Op != OpS390XADD { 10072 break 10073 } 10074 _ = v_0.Args[1] 10075 ptr := v_0.Args[0] 10076 idx := v_0.Args[1] 10077 mem := v.Args[1] 10078 if !(ptr.Op != OpSB) { 10079 break 10080 } 10081 v.reset(OpS390XFMOVDloadidx) 10082 v.AuxInt = off 10083 v.Aux = sym 10084 v.AddArg(ptr) 10085 v.AddArg(idx) 10086 v.AddArg(mem) 10087 return true 10088 } 10089 return false 10090 } 10091 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 10092 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10093 // cond: is20Bit(c+d) 10094 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 10095 for { 10096 c := v.AuxInt 10097 sym := v.Aux 10098 _ = v.Args[2] 10099 v_0 := v.Args[0] 10100 if v_0.Op != OpS390XADDconst { 10101 break 10102 } 10103 d := v_0.AuxInt 10104 ptr := v_0.Args[0] 10105 idx := v.Args[1] 10106 mem := v.Args[2] 10107 if !(is20Bit(c + d)) { 10108 break 10109 } 10110 v.reset(OpS390XFMOVDloadidx) 10111 v.AuxInt = c + d 10112 v.Aux = sym 10113 v.AddArg(ptr) 10114 v.AddArg(idx) 10115 v.AddArg(mem) 10116 return true 10117 } 10118 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10119 // cond: is20Bit(c+d) 10120 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 10121 for { 10122 c := v.AuxInt 10123 sym := v.Aux 10124 _ = v.Args[2] 10125 ptr := v.Args[0] 10126 v_1 := v.Args[1] 10127 if v_1.Op != OpS390XADDconst { 10128 break 10129 } 10130 d := v_1.AuxInt 10131 idx := v_1.Args[0] 10132 mem := v.Args[2] 10133 if !(is20Bit(c + d)) { 10134 break 10135 } 10136 v.reset(OpS390XFMOVDloadidx) 10137 v.AuxInt = c + d 10138 v.Aux = sym 10139 v.AddArg(ptr) 10140 v.AddArg(idx) 10141 v.AddArg(mem) 10142 return true 10143 } 10144 return false 10145 } 10146 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 10147 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10148 // cond: is20Bit(off1+off2) 10149 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 10150 for { 10151 off1 := v.AuxInt 10152 sym := v.Aux 10153 _ = v.Args[2] 10154 v_0 := v.Args[0] 10155 if v_0.Op != OpS390XADDconst { 10156 break 10157 } 10158 off2 := v_0.AuxInt 10159 ptr := v_0.Args[0] 10160 val := v.Args[1] 10161 mem := v.Args[2] 10162 if !(is20Bit(off1 + off2)) { 10163 break 10164 } 10165 v.reset(OpS390XFMOVDstore) 10166 v.AuxInt = off1 + off2 10167 v.Aux = sym 10168 v.AddArg(ptr) 10169 v.AddArg(val) 10170 v.AddArg(mem) 10171 return true 10172 } 10173 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10174 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10175 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10176 for { 10177 off1 := v.AuxInt 10178 sym1 := v.Aux 10179 _ = v.Args[2] 10180 v_0 := v.Args[0] 10181 if v_0.Op != OpS390XMOVDaddr { 10182 break 10183 } 10184 off2 := v_0.AuxInt 10185 sym2 := v_0.Aux 10186 base := v_0.Args[0] 10187 val := v.Args[1] 10188 mem := v.Args[2] 10189 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10190 break 10191 } 10192 v.reset(OpS390XFMOVDstore) 10193 v.AuxInt = off1 + off2 10194 v.Aux = mergeSym(sym1, sym2) 10195 v.AddArg(base) 10196 v.AddArg(val) 10197 v.AddArg(mem) 10198 return true 10199 } 10200 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10201 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10202 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10203 for { 10204 off1 := v.AuxInt 10205 sym1 := v.Aux 10206 _ = v.Args[2] 10207 v_0 := v.Args[0] 10208 if v_0.Op != OpS390XMOVDaddridx { 10209 break 10210 } 10211 off2 := v_0.AuxInt 10212 sym2 := v_0.Aux 10213 _ = v_0.Args[1] 10214 ptr := v_0.Args[0] 10215 idx := v_0.Args[1] 10216 val := v.Args[1] 10217 mem := v.Args[2] 10218 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10219 break 10220 } 10221 v.reset(OpS390XFMOVDstoreidx) 10222 v.AuxInt = off1 + off2 10223 v.Aux = mergeSym(sym1, sym2) 10224 v.AddArg(ptr) 10225 v.AddArg(idx) 10226 v.AddArg(val) 10227 v.AddArg(mem) 10228 return true 10229 } 10230 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 10231 // cond: ptr.Op != OpSB 10232 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 10233 for { 10234 off := v.AuxInt 10235 sym := v.Aux 10236 _ = v.Args[2] 10237 v_0 := v.Args[0] 10238 if v_0.Op != OpS390XADD { 10239 break 10240 } 10241 _ = v_0.Args[1] 10242 ptr := v_0.Args[0] 10243 idx := v_0.Args[1] 10244 val := v.Args[1] 10245 mem := v.Args[2] 10246 if !(ptr.Op != OpSB) { 10247 break 10248 } 10249 v.reset(OpS390XFMOVDstoreidx) 10250 v.AuxInt = off 10251 v.Aux = sym 10252 v.AddArg(ptr) 10253 v.AddArg(idx) 10254 v.AddArg(val) 10255 v.AddArg(mem) 10256 return true 10257 } 10258 return false 10259 } 10260 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 10261 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10262 // cond: is20Bit(c+d) 10263 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 10264 for { 10265 c := v.AuxInt 10266 sym := v.Aux 10267 _ = v.Args[3] 10268 v_0 := v.Args[0] 10269 if v_0.Op != OpS390XADDconst { 10270 break 10271 } 10272 d := v_0.AuxInt 10273 ptr := v_0.Args[0] 10274 idx := v.Args[1] 10275 val := v.Args[2] 10276 mem := v.Args[3] 10277 if !(is20Bit(c + d)) { 10278 break 10279 } 10280 v.reset(OpS390XFMOVDstoreidx) 10281 v.AuxInt = c + d 10282 v.Aux = sym 10283 v.AddArg(ptr) 10284 v.AddArg(idx) 10285 v.AddArg(val) 10286 v.AddArg(mem) 10287 return true 10288 } 10289 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10290 // cond: is20Bit(c+d) 10291 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 10292 for { 10293 c := v.AuxInt 10294 sym := v.Aux 10295 _ = v.Args[3] 10296 ptr := v.Args[0] 10297 v_1 := v.Args[1] 10298 if v_1.Op != OpS390XADDconst { 10299 break 10300 } 10301 d := v_1.AuxInt 10302 idx := v_1.Args[0] 10303 val := v.Args[2] 10304 mem := v.Args[3] 10305 if !(is20Bit(c + d)) { 10306 break 10307 } 10308 v.reset(OpS390XFMOVDstoreidx) 10309 v.AuxInt = c + d 10310 v.Aux = sym 10311 v.AddArg(ptr) 10312 v.AddArg(idx) 10313 v.AddArg(val) 10314 v.AddArg(mem) 10315 return true 10316 } 10317 return false 10318 } 10319 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 10320 // match: (FMOVSload [off] {sym} ptr1 (FMOVSstore [off] {sym} ptr2 x _)) 10321 // cond: isSamePtr(ptr1, ptr2) 10322 // result: x 10323 for { 10324 off := v.AuxInt 10325 sym := v.Aux 10326 _ = v.Args[1] 10327 ptr1 := v.Args[0] 10328 v_1 := v.Args[1] 10329 if v_1.Op != OpS390XFMOVSstore { 10330 break 10331 } 10332 if v_1.AuxInt != off { 10333 break 10334 } 10335 if v_1.Aux != sym { 10336 break 10337 } 10338 _ = v_1.Args[2] 10339 ptr2 := v_1.Args[0] 10340 x := v_1.Args[1] 10341 if !(isSamePtr(ptr1, ptr2)) { 10342 break 10343 } 10344 v.reset(OpCopy) 10345 v.Type = x.Type 10346 v.AddArg(x) 10347 return true 10348 } 10349 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 10350 // cond: is20Bit(off1+off2) 10351 // result: (FMOVSload [off1+off2] {sym} ptr mem) 10352 for { 10353 off1 := v.AuxInt 10354 sym := v.Aux 10355 _ = v.Args[1] 10356 v_0 := v.Args[0] 10357 if v_0.Op != OpS390XADDconst { 10358 break 10359 } 10360 off2 := v_0.AuxInt 10361 ptr := v_0.Args[0] 10362 mem := v.Args[1] 10363 if !(is20Bit(off1 + off2)) { 10364 break 10365 } 10366 v.reset(OpS390XFMOVSload) 10367 v.AuxInt = off1 + off2 10368 v.Aux = sym 10369 v.AddArg(ptr) 10370 v.AddArg(mem) 10371 return true 10372 } 10373 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10374 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10375 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10376 for { 10377 off1 := v.AuxInt 10378 sym1 := v.Aux 10379 _ = v.Args[1] 10380 v_0 := v.Args[0] 10381 if v_0.Op != OpS390XMOVDaddr { 10382 break 10383 } 10384 off2 := v_0.AuxInt 10385 sym2 := v_0.Aux 10386 base := v_0.Args[0] 10387 mem := v.Args[1] 10388 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10389 break 10390 } 10391 v.reset(OpS390XFMOVSload) 10392 v.AuxInt = off1 + off2 10393 v.Aux = mergeSym(sym1, sym2) 10394 v.AddArg(base) 10395 v.AddArg(mem) 10396 return true 10397 } 10398 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10399 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10400 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10401 for { 10402 off1 := v.AuxInt 10403 sym1 := v.Aux 10404 _ = v.Args[1] 10405 v_0 := v.Args[0] 10406 if v_0.Op != OpS390XMOVDaddridx { 10407 break 10408 } 10409 off2 := v_0.AuxInt 10410 sym2 := v_0.Aux 10411 _ = v_0.Args[1] 10412 ptr := v_0.Args[0] 10413 idx := v_0.Args[1] 10414 mem := v.Args[1] 10415 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10416 break 10417 } 10418 v.reset(OpS390XFMOVSloadidx) 10419 v.AuxInt = off1 + off2 10420 v.Aux = mergeSym(sym1, sym2) 10421 v.AddArg(ptr) 10422 v.AddArg(idx) 10423 v.AddArg(mem) 10424 return true 10425 } 10426 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 10427 // cond: ptr.Op != OpSB 10428 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 10429 for { 10430 off := v.AuxInt 10431 sym := v.Aux 10432 _ = v.Args[1] 10433 v_0 := v.Args[0] 10434 if v_0.Op != OpS390XADD { 10435 break 10436 } 10437 _ = v_0.Args[1] 10438 ptr := v_0.Args[0] 10439 idx := v_0.Args[1] 10440 mem := v.Args[1] 10441 if !(ptr.Op != OpSB) { 10442 break 10443 } 10444 v.reset(OpS390XFMOVSloadidx) 10445 v.AuxInt = off 10446 v.Aux = sym 10447 v.AddArg(ptr) 10448 v.AddArg(idx) 10449 v.AddArg(mem) 10450 return true 10451 } 10452 return false 10453 } 10454 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 10455 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10456 // cond: is20Bit(c+d) 10457 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 10458 for { 10459 c := v.AuxInt 10460 sym := v.Aux 10461 _ = v.Args[2] 10462 v_0 := v.Args[0] 10463 if v_0.Op != OpS390XADDconst { 10464 break 10465 } 10466 d := v_0.AuxInt 10467 ptr := v_0.Args[0] 10468 idx := v.Args[1] 10469 mem := v.Args[2] 10470 if !(is20Bit(c + d)) { 10471 break 10472 } 10473 v.reset(OpS390XFMOVSloadidx) 10474 v.AuxInt = c + d 10475 v.Aux = sym 10476 v.AddArg(ptr) 10477 v.AddArg(idx) 10478 v.AddArg(mem) 10479 return true 10480 } 10481 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10482 // cond: is20Bit(c+d) 10483 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 10484 for { 10485 c := v.AuxInt 10486 sym := v.Aux 10487 _ = v.Args[2] 10488 ptr := v.Args[0] 10489 v_1 := v.Args[1] 10490 if v_1.Op != OpS390XADDconst { 10491 break 10492 } 10493 d := v_1.AuxInt 10494 idx := v_1.Args[0] 10495 mem := v.Args[2] 10496 if !(is20Bit(c + d)) { 10497 break 10498 } 10499 v.reset(OpS390XFMOVSloadidx) 10500 v.AuxInt = c + d 10501 v.Aux = sym 10502 v.AddArg(ptr) 10503 v.AddArg(idx) 10504 v.AddArg(mem) 10505 return true 10506 } 10507 return false 10508 } 10509 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 10510 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10511 // cond: is20Bit(off1+off2) 10512 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 10513 for { 10514 off1 := v.AuxInt 10515 sym := v.Aux 10516 _ = v.Args[2] 10517 v_0 := v.Args[0] 10518 if v_0.Op != OpS390XADDconst { 10519 break 10520 } 10521 off2 := v_0.AuxInt 10522 ptr := v_0.Args[0] 10523 val := v.Args[1] 10524 mem := v.Args[2] 10525 if !(is20Bit(off1 + off2)) { 10526 break 10527 } 10528 v.reset(OpS390XFMOVSstore) 10529 v.AuxInt = off1 + off2 10530 v.Aux = sym 10531 v.AddArg(ptr) 10532 v.AddArg(val) 10533 v.AddArg(mem) 10534 return true 10535 } 10536 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10537 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10538 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10539 for { 10540 off1 := v.AuxInt 10541 sym1 := v.Aux 10542 _ = v.Args[2] 10543 v_0 := v.Args[0] 10544 if v_0.Op != OpS390XMOVDaddr { 10545 break 10546 } 10547 off2 := v_0.AuxInt 10548 sym2 := v_0.Aux 10549 base := v_0.Args[0] 10550 val := v.Args[1] 10551 mem := v.Args[2] 10552 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10553 break 10554 } 10555 v.reset(OpS390XFMOVSstore) 10556 v.AuxInt = off1 + off2 10557 v.Aux = mergeSym(sym1, sym2) 10558 v.AddArg(base) 10559 v.AddArg(val) 10560 v.AddArg(mem) 10561 return true 10562 } 10563 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10564 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10565 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10566 for { 10567 off1 := v.AuxInt 10568 sym1 := v.Aux 10569 _ = v.Args[2] 10570 v_0 := v.Args[0] 10571 if v_0.Op != OpS390XMOVDaddridx { 10572 break 10573 } 10574 off2 := v_0.AuxInt 10575 sym2 := v_0.Aux 10576 _ = v_0.Args[1] 10577 ptr := v_0.Args[0] 10578 idx := v_0.Args[1] 10579 val := v.Args[1] 10580 mem := v.Args[2] 10581 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10582 break 10583 } 10584 v.reset(OpS390XFMOVSstoreidx) 10585 v.AuxInt = off1 + off2 10586 v.Aux = mergeSym(sym1, sym2) 10587 v.AddArg(ptr) 10588 v.AddArg(idx) 10589 v.AddArg(val) 10590 v.AddArg(mem) 10591 return true 10592 } 10593 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 10594 // cond: ptr.Op != OpSB 10595 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 10596 for { 10597 off := v.AuxInt 10598 sym := v.Aux 10599 _ = v.Args[2] 10600 v_0 := v.Args[0] 10601 if v_0.Op != OpS390XADD { 10602 break 10603 } 10604 _ = v_0.Args[1] 10605 ptr := v_0.Args[0] 10606 idx := v_0.Args[1] 10607 val := v.Args[1] 10608 mem := v.Args[2] 10609 if !(ptr.Op != OpSB) { 10610 break 10611 } 10612 v.reset(OpS390XFMOVSstoreidx) 10613 v.AuxInt = off 10614 v.Aux = sym 10615 v.AddArg(ptr) 10616 v.AddArg(idx) 10617 v.AddArg(val) 10618 v.AddArg(mem) 10619 return true 10620 } 10621 return false 10622 } 10623 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 10624 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10625 // cond: is20Bit(c+d) 10626 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 10627 for { 10628 c := v.AuxInt 10629 sym := v.Aux 10630 _ = v.Args[3] 10631 v_0 := v.Args[0] 10632 if v_0.Op != OpS390XADDconst { 10633 break 10634 } 10635 d := v_0.AuxInt 10636 ptr := v_0.Args[0] 10637 idx := v.Args[1] 10638 val := v.Args[2] 10639 mem := v.Args[3] 10640 if !(is20Bit(c + d)) { 10641 break 10642 } 10643 v.reset(OpS390XFMOVSstoreidx) 10644 v.AuxInt = c + d 10645 v.Aux = sym 10646 v.AddArg(ptr) 10647 v.AddArg(idx) 10648 v.AddArg(val) 10649 v.AddArg(mem) 10650 return true 10651 } 10652 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10653 // cond: is20Bit(c+d) 10654 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 10655 for { 10656 c := v.AuxInt 10657 sym := v.Aux 10658 _ = v.Args[3] 10659 ptr := v.Args[0] 10660 v_1 := v.Args[1] 10661 if v_1.Op != OpS390XADDconst { 10662 break 10663 } 10664 d := v_1.AuxInt 10665 idx := v_1.Args[0] 10666 val := v.Args[2] 10667 mem := v.Args[3] 10668 if !(is20Bit(c + d)) { 10669 break 10670 } 10671 v.reset(OpS390XFMOVSstoreidx) 10672 v.AuxInt = c + d 10673 v.Aux = sym 10674 v.AddArg(ptr) 10675 v.AddArg(idx) 10676 v.AddArg(val) 10677 v.AddArg(mem) 10678 return true 10679 } 10680 return false 10681 } 10682 func rewriteValueS390X_OpS390XFNEG_0(v *Value) bool { 10683 // match: (FNEG (LPDFR x)) 10684 // cond: 10685 // result: (LNDFR x) 10686 for { 10687 v_0 := v.Args[0] 10688 if v_0.Op != OpS390XLPDFR { 10689 break 10690 } 10691 x := v_0.Args[0] 10692 v.reset(OpS390XLNDFR) 10693 v.AddArg(x) 10694 return true 10695 } 10696 // match: (FNEG (LNDFR x)) 10697 // cond: 10698 // result: (LPDFR x) 10699 for { 10700 v_0 := v.Args[0] 10701 if v_0.Op != OpS390XLNDFR { 10702 break 10703 } 10704 x := v_0.Args[0] 10705 v.reset(OpS390XLPDFR) 10706 v.AddArg(x) 10707 return true 10708 } 10709 return false 10710 } 10711 func rewriteValueS390X_OpS390XFNEGS_0(v *Value) bool { 10712 // match: (FNEGS (LPDFR x)) 10713 // cond: 10714 // result: (LNDFR x) 10715 for { 10716 v_0 := v.Args[0] 10717 if v_0.Op != OpS390XLPDFR { 10718 break 10719 } 10720 x := v_0.Args[0] 10721 v.reset(OpS390XLNDFR) 10722 v.AddArg(x) 10723 return true 10724 } 10725 // match: (FNEGS (LNDFR x)) 10726 // cond: 10727 // result: (LPDFR x) 10728 for { 10729 v_0 := v.Args[0] 10730 if v_0.Op != OpS390XLNDFR { 10731 break 10732 } 10733 x := v_0.Args[0] 10734 v.reset(OpS390XLPDFR) 10735 v.AddArg(x) 10736 return true 10737 } 10738 return false 10739 } 10740 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 10741 // match: (FSUB (FMUL y z) x) 10742 // cond: 10743 // result: (FMSUB x y z) 10744 for { 10745 _ = v.Args[1] 10746 v_0 := v.Args[0] 10747 if v_0.Op != OpS390XFMUL { 10748 break 10749 } 10750 _ = v_0.Args[1] 10751 y := v_0.Args[0] 10752 z := v_0.Args[1] 10753 x := v.Args[1] 10754 v.reset(OpS390XFMSUB) 10755 v.AddArg(x) 10756 v.AddArg(y) 10757 v.AddArg(z) 10758 return true 10759 } 10760 return false 10761 } 10762 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 10763 // match: (FSUBS (FMULS y z) x) 10764 // cond: 10765 // result: (FMSUBS x y z) 10766 for { 10767 _ = v.Args[1] 10768 v_0 := v.Args[0] 10769 if v_0.Op != OpS390XFMULS { 10770 break 10771 } 10772 _ = v_0.Args[1] 10773 y := v_0.Args[0] 10774 z := v_0.Args[1] 10775 x := v.Args[1] 10776 v.reset(OpS390XFMSUBS) 10777 v.AddArg(x) 10778 v.AddArg(y) 10779 v.AddArg(z) 10780 return true 10781 } 10782 return false 10783 } 10784 func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { 10785 b := v.Block 10786 _ = b 10787 // match: (LDGR <t> (SRDconst [1] (SLDconst [1] x))) 10788 // cond: 10789 // result: (LPDFR (LDGR <t> x)) 10790 for { 10791 t := v.Type 10792 v_0 := v.Args[0] 10793 if v_0.Op != OpS390XSRDconst { 10794 break 10795 } 10796 if v_0.AuxInt != 1 { 10797 break 10798 } 10799 v_0_0 := v_0.Args[0] 10800 if v_0_0.Op != OpS390XSLDconst { 10801 break 10802 } 10803 if v_0_0.AuxInt != 1 { 10804 break 10805 } 10806 x := v_0_0.Args[0] 10807 v.reset(OpS390XLPDFR) 10808 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10809 v0.AddArg(x) 10810 v.AddArg(v0) 10811 return true 10812 } 10813 // match: (LDGR <t> (OR (MOVDconst [-1<<63]) x)) 10814 // cond: 10815 // result: (LNDFR (LDGR <t> x)) 10816 for { 10817 t := v.Type 10818 v_0 := v.Args[0] 10819 if v_0.Op != OpS390XOR { 10820 break 10821 } 10822 _ = v_0.Args[1] 10823 v_0_0 := v_0.Args[0] 10824 if v_0_0.Op != OpS390XMOVDconst { 10825 break 10826 } 10827 if v_0_0.AuxInt != -1<<63 { 10828 break 10829 } 10830 x := v_0.Args[1] 10831 v.reset(OpS390XLNDFR) 10832 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10833 v0.AddArg(x) 10834 v.AddArg(v0) 10835 return true 10836 } 10837 // match: (LDGR <t> (OR x (MOVDconst [-1<<63]))) 10838 // cond: 10839 // result: (LNDFR (LDGR <t> x)) 10840 for { 10841 t := v.Type 10842 v_0 := v.Args[0] 10843 if v_0.Op != OpS390XOR { 10844 break 10845 } 10846 _ = v_0.Args[1] 10847 x := v_0.Args[0] 10848 v_0_1 := v_0.Args[1] 10849 if v_0_1.Op != OpS390XMOVDconst { 10850 break 10851 } 10852 if v_0_1.AuxInt != -1<<63 { 10853 break 10854 } 10855 v.reset(OpS390XLNDFR) 10856 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 10857 v0.AddArg(x) 10858 v.AddArg(v0) 10859 return true 10860 } 10861 // match: (LDGR <t> x:(ORload <t1> [off] {sym} (MOVDconst [-1<<63]) ptr mem)) 10862 // cond: x.Uses == 1 && clobber(x) 10863 // result: @x.Block (LNDFR <t> (LDGR <t> (MOVDload <t1> [off] {sym} ptr mem))) 10864 for { 10865 t := v.Type 10866 x := v.Args[0] 10867 if x.Op != OpS390XORload { 10868 break 10869 } 10870 t1 := x.Type 10871 off := x.AuxInt 10872 sym := x.Aux 10873 _ = x.Args[2] 10874 x_0 := x.Args[0] 10875 if x_0.Op != OpS390XMOVDconst { 10876 break 10877 } 10878 if x_0.AuxInt != -1<<63 { 10879 break 10880 } 10881 ptr := x.Args[1] 10882 mem := x.Args[2] 10883 if !(x.Uses == 1 && clobber(x)) { 10884 break 10885 } 10886 b = x.Block 10887 v0 := b.NewValue0(x.Pos, OpS390XLNDFR, t) 10888 v.reset(OpCopy) 10889 v.AddArg(v0) 10890 v1 := b.NewValue0(x.Pos, OpS390XLDGR, t) 10891 v2 := b.NewValue0(x.Pos, OpS390XMOVDload, t1) 10892 v2.AuxInt = off 10893 v2.Aux = sym 10894 v2.AddArg(ptr) 10895 v2.AddArg(mem) 10896 v1.AddArg(v2) 10897 v0.AddArg(v1) 10898 return true 10899 } 10900 // match: (LDGR (LGDR x)) 10901 // cond: 10902 // result: x 10903 for { 10904 v_0 := v.Args[0] 10905 if v_0.Op != OpS390XLGDR { 10906 break 10907 } 10908 x := v_0.Args[0] 10909 v.reset(OpCopy) 10910 v.Type = x.Type 10911 v.AddArg(x) 10912 return true 10913 } 10914 return false 10915 } 10916 func rewriteValueS390X_OpS390XLEDBR_0(v *Value) bool { 10917 // match: (LEDBR (LPDFR (LDEBR x))) 10918 // cond: 10919 // result: (LPDFR x) 10920 for { 10921 v_0 := v.Args[0] 10922 if v_0.Op != OpS390XLPDFR { 10923 break 10924 } 10925 v_0_0 := v_0.Args[0] 10926 if v_0_0.Op != OpS390XLDEBR { 10927 break 10928 } 10929 x := v_0_0.Args[0] 10930 v.reset(OpS390XLPDFR) 10931 v.AddArg(x) 10932 return true 10933 } 10934 // match: (LEDBR (LNDFR (LDEBR x))) 10935 // cond: 10936 // result: (LNDFR x) 10937 for { 10938 v_0 := v.Args[0] 10939 if v_0.Op != OpS390XLNDFR { 10940 break 10941 } 10942 v_0_0 := v_0.Args[0] 10943 if v_0_0.Op != OpS390XLDEBR { 10944 break 10945 } 10946 x := v_0_0.Args[0] 10947 v.reset(OpS390XLNDFR) 10948 v.AddArg(x) 10949 return true 10950 } 10951 return false 10952 } 10953 func rewriteValueS390X_OpS390XLGDR_0(v *Value) bool { 10954 // match: (LGDR (LDGR x)) 10955 // cond: 10956 // result: (MOVDreg x) 10957 for { 10958 v_0 := v.Args[0] 10959 if v_0.Op != OpS390XLDGR { 10960 break 10961 } 10962 x := v_0.Args[0] 10963 v.reset(OpS390XMOVDreg) 10964 v.AddArg(x) 10965 return true 10966 } 10967 return false 10968 } 10969 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 10970 // match: (LoweredRound32F x:(FMOVSconst)) 10971 // cond: 10972 // result: x 10973 for { 10974 x := v.Args[0] 10975 if x.Op != OpS390XFMOVSconst { 10976 break 10977 } 10978 v.reset(OpCopy) 10979 v.Type = x.Type 10980 v.AddArg(x) 10981 return true 10982 } 10983 return false 10984 } 10985 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 10986 // match: (LoweredRound64F x:(FMOVDconst)) 10987 // cond: 10988 // result: x 10989 for { 10990 x := v.Args[0] 10991 if x.Op != OpS390XFMOVDconst { 10992 break 10993 } 10994 v.reset(OpCopy) 10995 v.Type = x.Type 10996 v.AddArg(x) 10997 return true 10998 } 10999 return false 11000 } 11001 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 11002 // match: (MOVBZload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 11003 // cond: isSamePtr(ptr1, ptr2) 11004 // result: (MOVBZreg x) 11005 for { 11006 off := v.AuxInt 11007 sym := v.Aux 11008 _ = v.Args[1] 11009 ptr1 := v.Args[0] 11010 v_1 := v.Args[1] 11011 if v_1.Op != OpS390XMOVBstore { 11012 break 11013 } 11014 if v_1.AuxInt != off { 11015 break 11016 } 11017 if v_1.Aux != sym { 11018 break 11019 } 11020 _ = v_1.Args[2] 11021 ptr2 := v_1.Args[0] 11022 x := v_1.Args[1] 11023 if !(isSamePtr(ptr1, ptr2)) { 11024 break 11025 } 11026 v.reset(OpS390XMOVBZreg) 11027 v.AddArg(x) 11028 return true 11029 } 11030 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 11031 // cond: is20Bit(off1+off2) 11032 // result: (MOVBZload [off1+off2] {sym} ptr mem) 11033 for { 11034 off1 := v.AuxInt 11035 sym := v.Aux 11036 _ = v.Args[1] 11037 v_0 := v.Args[0] 11038 if v_0.Op != OpS390XADDconst { 11039 break 11040 } 11041 off2 := v_0.AuxInt 11042 ptr := v_0.Args[0] 11043 mem := v.Args[1] 11044 if !(is20Bit(off1 + off2)) { 11045 break 11046 } 11047 v.reset(OpS390XMOVBZload) 11048 v.AuxInt = off1 + off2 11049 v.Aux = sym 11050 v.AddArg(ptr) 11051 v.AddArg(mem) 11052 return true 11053 } 11054 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11055 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11056 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11057 for { 11058 off1 := v.AuxInt 11059 sym1 := v.Aux 11060 _ = v.Args[1] 11061 v_0 := v.Args[0] 11062 if v_0.Op != OpS390XMOVDaddr { 11063 break 11064 } 11065 off2 := v_0.AuxInt 11066 sym2 := v_0.Aux 11067 base := v_0.Args[0] 11068 mem := v.Args[1] 11069 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11070 break 11071 } 11072 v.reset(OpS390XMOVBZload) 11073 v.AuxInt = off1 + off2 11074 v.Aux = mergeSym(sym1, sym2) 11075 v.AddArg(base) 11076 v.AddArg(mem) 11077 return true 11078 } 11079 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11080 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11081 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11082 for { 11083 off1 := v.AuxInt 11084 sym1 := v.Aux 11085 _ = v.Args[1] 11086 v_0 := v.Args[0] 11087 if v_0.Op != OpS390XMOVDaddridx { 11088 break 11089 } 11090 off2 := v_0.AuxInt 11091 sym2 := v_0.Aux 11092 _ = v_0.Args[1] 11093 ptr := v_0.Args[0] 11094 idx := v_0.Args[1] 11095 mem := v.Args[1] 11096 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11097 break 11098 } 11099 v.reset(OpS390XMOVBZloadidx) 11100 v.AuxInt = off1 + off2 11101 v.Aux = mergeSym(sym1, sym2) 11102 v.AddArg(ptr) 11103 v.AddArg(idx) 11104 v.AddArg(mem) 11105 return true 11106 } 11107 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 11108 // cond: ptr.Op != OpSB 11109 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 11110 for { 11111 off := v.AuxInt 11112 sym := v.Aux 11113 _ = v.Args[1] 11114 v_0 := v.Args[0] 11115 if v_0.Op != OpS390XADD { 11116 break 11117 } 11118 _ = v_0.Args[1] 11119 ptr := v_0.Args[0] 11120 idx := v_0.Args[1] 11121 mem := v.Args[1] 11122 if !(ptr.Op != OpSB) { 11123 break 11124 } 11125 v.reset(OpS390XMOVBZloadidx) 11126 v.AuxInt = off 11127 v.Aux = sym 11128 v.AddArg(ptr) 11129 v.AddArg(idx) 11130 v.AddArg(mem) 11131 return true 11132 } 11133 return false 11134 } 11135 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 11136 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11137 // cond: is20Bit(c+d) 11138 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11139 for { 11140 c := v.AuxInt 11141 sym := v.Aux 11142 _ = v.Args[2] 11143 v_0 := v.Args[0] 11144 if v_0.Op != OpS390XADDconst { 11145 break 11146 } 11147 d := v_0.AuxInt 11148 ptr := v_0.Args[0] 11149 idx := v.Args[1] 11150 mem := v.Args[2] 11151 if !(is20Bit(c + d)) { 11152 break 11153 } 11154 v.reset(OpS390XMOVBZloadidx) 11155 v.AuxInt = c + d 11156 v.Aux = sym 11157 v.AddArg(ptr) 11158 v.AddArg(idx) 11159 v.AddArg(mem) 11160 return true 11161 } 11162 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 11163 // cond: is20Bit(c+d) 11164 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11165 for { 11166 c := v.AuxInt 11167 sym := v.Aux 11168 _ = v.Args[2] 11169 idx := v.Args[0] 11170 v_1 := v.Args[1] 11171 if v_1.Op != OpS390XADDconst { 11172 break 11173 } 11174 d := v_1.AuxInt 11175 ptr := v_1.Args[0] 11176 mem := v.Args[2] 11177 if !(is20Bit(c + d)) { 11178 break 11179 } 11180 v.reset(OpS390XMOVBZloadidx) 11181 v.AuxInt = c + d 11182 v.Aux = sym 11183 v.AddArg(ptr) 11184 v.AddArg(idx) 11185 v.AddArg(mem) 11186 return true 11187 } 11188 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11189 // cond: is20Bit(c+d) 11190 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11191 for { 11192 c := v.AuxInt 11193 sym := v.Aux 11194 _ = v.Args[2] 11195 ptr := v.Args[0] 11196 v_1 := v.Args[1] 11197 if v_1.Op != OpS390XADDconst { 11198 break 11199 } 11200 d := v_1.AuxInt 11201 idx := v_1.Args[0] 11202 mem := v.Args[2] 11203 if !(is20Bit(c + d)) { 11204 break 11205 } 11206 v.reset(OpS390XMOVBZloadidx) 11207 v.AuxInt = c + d 11208 v.Aux = sym 11209 v.AddArg(ptr) 11210 v.AddArg(idx) 11211 v.AddArg(mem) 11212 return true 11213 } 11214 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 11215 // cond: is20Bit(c+d) 11216 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 11217 for { 11218 c := v.AuxInt 11219 sym := v.Aux 11220 _ = v.Args[2] 11221 v_0 := v.Args[0] 11222 if v_0.Op != OpS390XADDconst { 11223 break 11224 } 11225 d := v_0.AuxInt 11226 idx := v_0.Args[0] 11227 ptr := v.Args[1] 11228 mem := v.Args[2] 11229 if !(is20Bit(c + d)) { 11230 break 11231 } 11232 v.reset(OpS390XMOVBZloadidx) 11233 v.AuxInt = c + d 11234 v.Aux = sym 11235 v.AddArg(ptr) 11236 v.AddArg(idx) 11237 v.AddArg(mem) 11238 return true 11239 } 11240 return false 11241 } 11242 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 11243 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 11244 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11245 // result: (MOVDreg x) 11246 for { 11247 x := v.Args[0] 11248 if x.Op != OpS390XMOVDLT { 11249 break 11250 } 11251 _ = x.Args[2] 11252 x_0 := x.Args[0] 11253 if x_0.Op != OpS390XMOVDconst { 11254 break 11255 } 11256 c := x_0.AuxInt 11257 x_1 := x.Args[1] 11258 if x_1.Op != OpS390XMOVDconst { 11259 break 11260 } 11261 d := x_1.AuxInt 11262 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11263 break 11264 } 11265 v.reset(OpS390XMOVDreg) 11266 v.AddArg(x) 11267 return true 11268 } 11269 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 11270 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11271 // result: (MOVDreg x) 11272 for { 11273 x := v.Args[0] 11274 if x.Op != OpS390XMOVDLE { 11275 break 11276 } 11277 _ = x.Args[2] 11278 x_0 := x.Args[0] 11279 if x_0.Op != OpS390XMOVDconst { 11280 break 11281 } 11282 c := x_0.AuxInt 11283 x_1 := x.Args[1] 11284 if x_1.Op != OpS390XMOVDconst { 11285 break 11286 } 11287 d := x_1.AuxInt 11288 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11289 break 11290 } 11291 v.reset(OpS390XMOVDreg) 11292 v.AddArg(x) 11293 return true 11294 } 11295 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 11296 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11297 // result: (MOVDreg x) 11298 for { 11299 x := v.Args[0] 11300 if x.Op != OpS390XMOVDGT { 11301 break 11302 } 11303 _ = x.Args[2] 11304 x_0 := x.Args[0] 11305 if x_0.Op != OpS390XMOVDconst { 11306 break 11307 } 11308 c := x_0.AuxInt 11309 x_1 := x.Args[1] 11310 if x_1.Op != OpS390XMOVDconst { 11311 break 11312 } 11313 d := x_1.AuxInt 11314 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11315 break 11316 } 11317 v.reset(OpS390XMOVDreg) 11318 v.AddArg(x) 11319 return true 11320 } 11321 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 11322 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11323 // result: (MOVDreg x) 11324 for { 11325 x := v.Args[0] 11326 if x.Op != OpS390XMOVDGE { 11327 break 11328 } 11329 _ = x.Args[2] 11330 x_0 := x.Args[0] 11331 if x_0.Op != OpS390XMOVDconst { 11332 break 11333 } 11334 c := x_0.AuxInt 11335 x_1 := x.Args[1] 11336 if x_1.Op != OpS390XMOVDconst { 11337 break 11338 } 11339 d := x_1.AuxInt 11340 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11341 break 11342 } 11343 v.reset(OpS390XMOVDreg) 11344 v.AddArg(x) 11345 return true 11346 } 11347 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 11348 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11349 // result: (MOVDreg x) 11350 for { 11351 x := v.Args[0] 11352 if x.Op != OpS390XMOVDEQ { 11353 break 11354 } 11355 _ = x.Args[2] 11356 x_0 := x.Args[0] 11357 if x_0.Op != OpS390XMOVDconst { 11358 break 11359 } 11360 c := x_0.AuxInt 11361 x_1 := x.Args[1] 11362 if x_1.Op != OpS390XMOVDconst { 11363 break 11364 } 11365 d := x_1.AuxInt 11366 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11367 break 11368 } 11369 v.reset(OpS390XMOVDreg) 11370 v.AddArg(x) 11371 return true 11372 } 11373 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 11374 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11375 // result: (MOVDreg x) 11376 for { 11377 x := v.Args[0] 11378 if x.Op != OpS390XMOVDNE { 11379 break 11380 } 11381 _ = x.Args[2] 11382 x_0 := x.Args[0] 11383 if x_0.Op != OpS390XMOVDconst { 11384 break 11385 } 11386 c := x_0.AuxInt 11387 x_1 := x.Args[1] 11388 if x_1.Op != OpS390XMOVDconst { 11389 break 11390 } 11391 d := x_1.AuxInt 11392 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11393 break 11394 } 11395 v.reset(OpS390XMOVDreg) 11396 v.AddArg(x) 11397 return true 11398 } 11399 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 11400 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11401 // result: (MOVDreg x) 11402 for { 11403 x := v.Args[0] 11404 if x.Op != OpS390XMOVDGTnoinv { 11405 break 11406 } 11407 _ = x.Args[2] 11408 x_0 := x.Args[0] 11409 if x_0.Op != OpS390XMOVDconst { 11410 break 11411 } 11412 c := x_0.AuxInt 11413 x_1 := x.Args[1] 11414 if x_1.Op != OpS390XMOVDconst { 11415 break 11416 } 11417 d := x_1.AuxInt 11418 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11419 break 11420 } 11421 v.reset(OpS390XMOVDreg) 11422 v.AddArg(x) 11423 return true 11424 } 11425 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 11426 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 11427 // result: (MOVDreg x) 11428 for { 11429 x := v.Args[0] 11430 if x.Op != OpS390XMOVDGEnoinv { 11431 break 11432 } 11433 _ = x.Args[2] 11434 x_0 := x.Args[0] 11435 if x_0.Op != OpS390XMOVDconst { 11436 break 11437 } 11438 c := x_0.AuxInt 11439 x_1 := x.Args[1] 11440 if x_1.Op != OpS390XMOVDconst { 11441 break 11442 } 11443 d := x_1.AuxInt 11444 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 11445 break 11446 } 11447 v.reset(OpS390XMOVDreg) 11448 v.AddArg(x) 11449 return true 11450 } 11451 // match: (MOVBZreg x:(MOVBZload _ _)) 11452 // cond: 11453 // result: (MOVDreg x) 11454 for { 11455 x := v.Args[0] 11456 if x.Op != OpS390XMOVBZload { 11457 break 11458 } 11459 _ = x.Args[1] 11460 v.reset(OpS390XMOVDreg) 11461 v.AddArg(x) 11462 return true 11463 } 11464 // match: (MOVBZreg x:(Arg <t>)) 11465 // cond: is8BitInt(t) && !isSigned(t) 11466 // result: (MOVDreg x) 11467 for { 11468 x := v.Args[0] 11469 if x.Op != OpArg { 11470 break 11471 } 11472 t := x.Type 11473 if !(is8BitInt(t) && !isSigned(t)) { 11474 break 11475 } 11476 v.reset(OpS390XMOVDreg) 11477 v.AddArg(x) 11478 return true 11479 } 11480 return false 11481 } 11482 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 11483 b := v.Block 11484 _ = b 11485 typ := &b.Func.Config.Types 11486 _ = typ 11487 // match: (MOVBZreg x:(MOVBZreg _)) 11488 // cond: 11489 // result: (MOVDreg x) 11490 for { 11491 x := v.Args[0] 11492 if x.Op != OpS390XMOVBZreg { 11493 break 11494 } 11495 v.reset(OpS390XMOVDreg) 11496 v.AddArg(x) 11497 return true 11498 } 11499 // match: (MOVBZreg (MOVBreg x)) 11500 // cond: 11501 // result: (MOVBZreg x) 11502 for { 11503 v_0 := v.Args[0] 11504 if v_0.Op != OpS390XMOVBreg { 11505 break 11506 } 11507 x := v_0.Args[0] 11508 v.reset(OpS390XMOVBZreg) 11509 v.AddArg(x) 11510 return true 11511 } 11512 // match: (MOVBZreg (MOVDconst [c])) 11513 // cond: 11514 // result: (MOVDconst [int64(uint8(c))]) 11515 for { 11516 v_0 := v.Args[0] 11517 if v_0.Op != OpS390XMOVDconst { 11518 break 11519 } 11520 c := v_0.AuxInt 11521 v.reset(OpS390XMOVDconst) 11522 v.AuxInt = int64(uint8(c)) 11523 return true 11524 } 11525 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 11526 // cond: x.Uses == 1 && clobber(x) 11527 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 11528 for { 11529 x := v.Args[0] 11530 if x.Op != OpS390XMOVBZload { 11531 break 11532 } 11533 off := x.AuxInt 11534 sym := x.Aux 11535 _ = x.Args[1] 11536 ptr := x.Args[0] 11537 mem := x.Args[1] 11538 if !(x.Uses == 1 && clobber(x)) { 11539 break 11540 } 11541 b = x.Block 11542 v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, v.Type) 11543 v.reset(OpCopy) 11544 v.AddArg(v0) 11545 v0.AuxInt = off 11546 v0.Aux = sym 11547 v0.AddArg(ptr) 11548 v0.AddArg(mem) 11549 return true 11550 } 11551 // match: (MOVBZreg x:(MOVBload [off] {sym} ptr mem)) 11552 // cond: x.Uses == 1 && clobber(x) 11553 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 11554 for { 11555 x := v.Args[0] 11556 if x.Op != OpS390XMOVBload { 11557 break 11558 } 11559 off := x.AuxInt 11560 sym := x.Aux 11561 _ = x.Args[1] 11562 ptr := x.Args[0] 11563 mem := x.Args[1] 11564 if !(x.Uses == 1 && clobber(x)) { 11565 break 11566 } 11567 b = x.Block 11568 v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, v.Type) 11569 v.reset(OpCopy) 11570 v.AddArg(v0) 11571 v0.AuxInt = off 11572 v0.Aux = sym 11573 v0.AddArg(ptr) 11574 v0.AddArg(mem) 11575 return true 11576 } 11577 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 11578 // cond: x.Uses == 1 && clobber(x) 11579 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 11580 for { 11581 x := v.Args[0] 11582 if x.Op != OpS390XMOVBZloadidx { 11583 break 11584 } 11585 off := x.AuxInt 11586 sym := x.Aux 11587 _ = x.Args[2] 11588 ptr := x.Args[0] 11589 idx := x.Args[1] 11590 mem := x.Args[2] 11591 if !(x.Uses == 1 && clobber(x)) { 11592 break 11593 } 11594 b = x.Block 11595 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 11596 v.reset(OpCopy) 11597 v.AddArg(v0) 11598 v0.AuxInt = off 11599 v0.Aux = sym 11600 v0.AddArg(ptr) 11601 v0.AddArg(idx) 11602 v0.AddArg(mem) 11603 return true 11604 } 11605 // match: (MOVBZreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 11606 // cond: x.Uses == 1 && clobber(x) 11607 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 11608 for { 11609 x := v.Args[0] 11610 if x.Op != OpS390XMOVBloadidx { 11611 break 11612 } 11613 off := x.AuxInt 11614 sym := x.Aux 11615 _ = x.Args[2] 11616 ptr := x.Args[0] 11617 idx := x.Args[1] 11618 mem := x.Args[2] 11619 if !(x.Uses == 1 && clobber(x)) { 11620 break 11621 } 11622 b = x.Block 11623 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 11624 v.reset(OpCopy) 11625 v.AddArg(v0) 11626 v0.AuxInt = off 11627 v0.Aux = sym 11628 v0.AddArg(ptr) 11629 v0.AddArg(idx) 11630 v0.AddArg(mem) 11631 return true 11632 } 11633 // match: (MOVBZreg (ANDWconst [m] x)) 11634 // cond: 11635 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x)) 11636 for { 11637 v_0 := v.Args[0] 11638 if v_0.Op != OpS390XANDWconst { 11639 break 11640 } 11641 m := v_0.AuxInt 11642 x := v_0.Args[0] 11643 v.reset(OpS390XMOVWZreg) 11644 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 11645 v0.AuxInt = int64(uint8(m)) 11646 v0.AddArg(x) 11647 v.AddArg(v0) 11648 return true 11649 } 11650 return false 11651 } 11652 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 11653 // match: (MOVBload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 11654 // cond: isSamePtr(ptr1, ptr2) 11655 // result: (MOVBreg x) 11656 for { 11657 off := v.AuxInt 11658 sym := v.Aux 11659 _ = v.Args[1] 11660 ptr1 := v.Args[0] 11661 v_1 := v.Args[1] 11662 if v_1.Op != OpS390XMOVBstore { 11663 break 11664 } 11665 if v_1.AuxInt != off { 11666 break 11667 } 11668 if v_1.Aux != sym { 11669 break 11670 } 11671 _ = v_1.Args[2] 11672 ptr2 := v_1.Args[0] 11673 x := v_1.Args[1] 11674 if !(isSamePtr(ptr1, ptr2)) { 11675 break 11676 } 11677 v.reset(OpS390XMOVBreg) 11678 v.AddArg(x) 11679 return true 11680 } 11681 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 11682 // cond: is20Bit(off1+off2) 11683 // result: (MOVBload [off1+off2] {sym} ptr mem) 11684 for { 11685 off1 := v.AuxInt 11686 sym := v.Aux 11687 _ = v.Args[1] 11688 v_0 := v.Args[0] 11689 if v_0.Op != OpS390XADDconst { 11690 break 11691 } 11692 off2 := v_0.AuxInt 11693 ptr := v_0.Args[0] 11694 mem := v.Args[1] 11695 if !(is20Bit(off1 + off2)) { 11696 break 11697 } 11698 v.reset(OpS390XMOVBload) 11699 v.AuxInt = off1 + off2 11700 v.Aux = sym 11701 v.AddArg(ptr) 11702 v.AddArg(mem) 11703 return true 11704 } 11705 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11706 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11707 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11708 for { 11709 off1 := v.AuxInt 11710 sym1 := v.Aux 11711 _ = v.Args[1] 11712 v_0 := v.Args[0] 11713 if v_0.Op != OpS390XMOVDaddr { 11714 break 11715 } 11716 off2 := v_0.AuxInt 11717 sym2 := v_0.Aux 11718 base := v_0.Args[0] 11719 mem := v.Args[1] 11720 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11721 break 11722 } 11723 v.reset(OpS390XMOVBload) 11724 v.AuxInt = off1 + off2 11725 v.Aux = mergeSym(sym1, sym2) 11726 v.AddArg(base) 11727 v.AddArg(mem) 11728 return true 11729 } 11730 // match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11731 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11732 // result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11733 for { 11734 off1 := v.AuxInt 11735 sym1 := v.Aux 11736 _ = v.Args[1] 11737 v_0 := v.Args[0] 11738 if v_0.Op != OpS390XMOVDaddridx { 11739 break 11740 } 11741 off2 := v_0.AuxInt 11742 sym2 := v_0.Aux 11743 _ = v_0.Args[1] 11744 ptr := v_0.Args[0] 11745 idx := v_0.Args[1] 11746 mem := v.Args[1] 11747 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11748 break 11749 } 11750 v.reset(OpS390XMOVBloadidx) 11751 v.AuxInt = off1 + off2 11752 v.Aux = mergeSym(sym1, sym2) 11753 v.AddArg(ptr) 11754 v.AddArg(idx) 11755 v.AddArg(mem) 11756 return true 11757 } 11758 // match: (MOVBload [off] {sym} (ADD ptr idx) mem) 11759 // cond: ptr.Op != OpSB 11760 // result: (MOVBloadidx [off] {sym} ptr idx mem) 11761 for { 11762 off := v.AuxInt 11763 sym := v.Aux 11764 _ = v.Args[1] 11765 v_0 := v.Args[0] 11766 if v_0.Op != OpS390XADD { 11767 break 11768 } 11769 _ = v_0.Args[1] 11770 ptr := v_0.Args[0] 11771 idx := v_0.Args[1] 11772 mem := v.Args[1] 11773 if !(ptr.Op != OpSB) { 11774 break 11775 } 11776 v.reset(OpS390XMOVBloadidx) 11777 v.AuxInt = off 11778 v.Aux = sym 11779 v.AddArg(ptr) 11780 v.AddArg(idx) 11781 v.AddArg(mem) 11782 return true 11783 } 11784 return false 11785 } 11786 func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { 11787 // match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11788 // cond: is20Bit(c+d) 11789 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11790 for { 11791 c := v.AuxInt 11792 sym := v.Aux 11793 _ = v.Args[2] 11794 v_0 := v.Args[0] 11795 if v_0.Op != OpS390XADDconst { 11796 break 11797 } 11798 d := v_0.AuxInt 11799 ptr := v_0.Args[0] 11800 idx := v.Args[1] 11801 mem := v.Args[2] 11802 if !(is20Bit(c + d)) { 11803 break 11804 } 11805 v.reset(OpS390XMOVBloadidx) 11806 v.AuxInt = c + d 11807 v.Aux = sym 11808 v.AddArg(ptr) 11809 v.AddArg(idx) 11810 v.AddArg(mem) 11811 return true 11812 } 11813 // match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 11814 // cond: is20Bit(c+d) 11815 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11816 for { 11817 c := v.AuxInt 11818 sym := v.Aux 11819 _ = v.Args[2] 11820 idx := v.Args[0] 11821 v_1 := v.Args[1] 11822 if v_1.Op != OpS390XADDconst { 11823 break 11824 } 11825 d := v_1.AuxInt 11826 ptr := v_1.Args[0] 11827 mem := v.Args[2] 11828 if !(is20Bit(c + d)) { 11829 break 11830 } 11831 v.reset(OpS390XMOVBloadidx) 11832 v.AuxInt = c + d 11833 v.Aux = sym 11834 v.AddArg(ptr) 11835 v.AddArg(idx) 11836 v.AddArg(mem) 11837 return true 11838 } 11839 // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11840 // cond: is20Bit(c+d) 11841 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11842 for { 11843 c := v.AuxInt 11844 sym := v.Aux 11845 _ = v.Args[2] 11846 ptr := v.Args[0] 11847 v_1 := v.Args[1] 11848 if v_1.Op != OpS390XADDconst { 11849 break 11850 } 11851 d := v_1.AuxInt 11852 idx := v_1.Args[0] 11853 mem := v.Args[2] 11854 if !(is20Bit(c + d)) { 11855 break 11856 } 11857 v.reset(OpS390XMOVBloadidx) 11858 v.AuxInt = c + d 11859 v.Aux = sym 11860 v.AddArg(ptr) 11861 v.AddArg(idx) 11862 v.AddArg(mem) 11863 return true 11864 } 11865 // match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 11866 // cond: is20Bit(c+d) 11867 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 11868 for { 11869 c := v.AuxInt 11870 sym := v.Aux 11871 _ = v.Args[2] 11872 v_0 := v.Args[0] 11873 if v_0.Op != OpS390XADDconst { 11874 break 11875 } 11876 d := v_0.AuxInt 11877 idx := v_0.Args[0] 11878 ptr := v.Args[1] 11879 mem := v.Args[2] 11880 if !(is20Bit(c + d)) { 11881 break 11882 } 11883 v.reset(OpS390XMOVBloadidx) 11884 v.AuxInt = c + d 11885 v.Aux = sym 11886 v.AddArg(ptr) 11887 v.AddArg(idx) 11888 v.AddArg(mem) 11889 return true 11890 } 11891 return false 11892 } 11893 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 11894 b := v.Block 11895 _ = b 11896 typ := &b.Func.Config.Types 11897 _ = typ 11898 // match: (MOVBreg x:(MOVBload _ _)) 11899 // cond: 11900 // result: (MOVDreg x) 11901 for { 11902 x := v.Args[0] 11903 if x.Op != OpS390XMOVBload { 11904 break 11905 } 11906 _ = x.Args[1] 11907 v.reset(OpS390XMOVDreg) 11908 v.AddArg(x) 11909 return true 11910 } 11911 // match: (MOVBreg x:(Arg <t>)) 11912 // cond: is8BitInt(t) && isSigned(t) 11913 // result: (MOVDreg x) 11914 for { 11915 x := v.Args[0] 11916 if x.Op != OpArg { 11917 break 11918 } 11919 t := x.Type 11920 if !(is8BitInt(t) && isSigned(t)) { 11921 break 11922 } 11923 v.reset(OpS390XMOVDreg) 11924 v.AddArg(x) 11925 return true 11926 } 11927 // match: (MOVBreg x:(MOVBreg _)) 11928 // cond: 11929 // result: (MOVDreg x) 11930 for { 11931 x := v.Args[0] 11932 if x.Op != OpS390XMOVBreg { 11933 break 11934 } 11935 v.reset(OpS390XMOVDreg) 11936 v.AddArg(x) 11937 return true 11938 } 11939 // match: (MOVBreg (MOVBZreg x)) 11940 // cond: 11941 // result: (MOVBreg x) 11942 for { 11943 v_0 := v.Args[0] 11944 if v_0.Op != OpS390XMOVBZreg { 11945 break 11946 } 11947 x := v_0.Args[0] 11948 v.reset(OpS390XMOVBreg) 11949 v.AddArg(x) 11950 return true 11951 } 11952 // match: (MOVBreg (MOVDconst [c])) 11953 // cond: 11954 // result: (MOVDconst [int64(int8(c))]) 11955 for { 11956 v_0 := v.Args[0] 11957 if v_0.Op != OpS390XMOVDconst { 11958 break 11959 } 11960 c := v_0.AuxInt 11961 v.reset(OpS390XMOVDconst) 11962 v.AuxInt = int64(int8(c)) 11963 return true 11964 } 11965 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 11966 // cond: x.Uses == 1 && clobber(x) 11967 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 11968 for { 11969 x := v.Args[0] 11970 if x.Op != OpS390XMOVBZload { 11971 break 11972 } 11973 off := x.AuxInt 11974 sym := x.Aux 11975 _ = x.Args[1] 11976 ptr := x.Args[0] 11977 mem := x.Args[1] 11978 if !(x.Uses == 1 && clobber(x)) { 11979 break 11980 } 11981 b = x.Block 11982 v0 := b.NewValue0(x.Pos, OpS390XMOVBload, v.Type) 11983 v.reset(OpCopy) 11984 v.AddArg(v0) 11985 v0.AuxInt = off 11986 v0.Aux = sym 11987 v0.AddArg(ptr) 11988 v0.AddArg(mem) 11989 return true 11990 } 11991 // match: (MOVBreg x:(MOVBload [off] {sym} ptr mem)) 11992 // cond: x.Uses == 1 && clobber(x) 11993 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 11994 for { 11995 x := v.Args[0] 11996 if x.Op != OpS390XMOVBload { 11997 break 11998 } 11999 off := x.AuxInt 12000 sym := x.Aux 12001 _ = x.Args[1] 12002 ptr := x.Args[0] 12003 mem := x.Args[1] 12004 if !(x.Uses == 1 && clobber(x)) { 12005 break 12006 } 12007 b = x.Block 12008 v0 := b.NewValue0(x.Pos, OpS390XMOVBload, v.Type) 12009 v.reset(OpCopy) 12010 v.AddArg(v0) 12011 v0.AuxInt = off 12012 v0.Aux = sym 12013 v0.AddArg(ptr) 12014 v0.AddArg(mem) 12015 return true 12016 } 12017 // match: (MOVBreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12018 // cond: x.Uses == 1 && clobber(x) 12019 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 12020 for { 12021 x := v.Args[0] 12022 if x.Op != OpS390XMOVBZloadidx { 12023 break 12024 } 12025 off := x.AuxInt 12026 sym := x.Aux 12027 _ = x.Args[2] 12028 ptr := x.Args[0] 12029 idx := x.Args[1] 12030 mem := x.Args[2] 12031 if !(x.Uses == 1 && clobber(x)) { 12032 break 12033 } 12034 b = x.Block 12035 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 12036 v.reset(OpCopy) 12037 v.AddArg(v0) 12038 v0.AuxInt = off 12039 v0.Aux = sym 12040 v0.AddArg(ptr) 12041 v0.AddArg(idx) 12042 v0.AddArg(mem) 12043 return true 12044 } 12045 // match: (MOVBreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 12046 // cond: x.Uses == 1 && clobber(x) 12047 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 12048 for { 12049 x := v.Args[0] 12050 if x.Op != OpS390XMOVBloadidx { 12051 break 12052 } 12053 off := x.AuxInt 12054 sym := x.Aux 12055 _ = x.Args[2] 12056 ptr := x.Args[0] 12057 idx := x.Args[1] 12058 mem := x.Args[2] 12059 if !(x.Uses == 1 && clobber(x)) { 12060 break 12061 } 12062 b = x.Block 12063 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 12064 v.reset(OpCopy) 12065 v.AddArg(v0) 12066 v0.AuxInt = off 12067 v0.Aux = sym 12068 v0.AddArg(ptr) 12069 v0.AddArg(idx) 12070 v0.AddArg(mem) 12071 return true 12072 } 12073 // match: (MOVBreg (ANDWconst [m] x)) 12074 // cond: int8(m) >= 0 12075 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64( uint8(m))] x)) 12076 for { 12077 v_0 := v.Args[0] 12078 if v_0.Op != OpS390XANDWconst { 12079 break 12080 } 12081 m := v_0.AuxInt 12082 x := v_0.Args[0] 12083 if !(int8(m) >= 0) { 12084 break 12085 } 12086 v.reset(OpS390XMOVWZreg) 12087 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 12088 v0.AuxInt = int64(uint8(m)) 12089 v0.AddArg(x) 12090 v.AddArg(v0) 12091 return true 12092 } 12093 return false 12094 } 12095 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 12096 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 12097 // cond: 12098 // result: (MOVBstore [off] {sym} ptr x mem) 12099 for { 12100 off := v.AuxInt 12101 sym := v.Aux 12102 _ = v.Args[2] 12103 ptr := v.Args[0] 12104 v_1 := v.Args[1] 12105 if v_1.Op != OpS390XMOVBreg { 12106 break 12107 } 12108 x := v_1.Args[0] 12109 mem := v.Args[2] 12110 v.reset(OpS390XMOVBstore) 12111 v.AuxInt = off 12112 v.Aux = sym 12113 v.AddArg(ptr) 12114 v.AddArg(x) 12115 v.AddArg(mem) 12116 return true 12117 } 12118 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 12119 // cond: 12120 // result: (MOVBstore [off] {sym} ptr x mem) 12121 for { 12122 off := v.AuxInt 12123 sym := v.Aux 12124 _ = v.Args[2] 12125 ptr := v.Args[0] 12126 v_1 := v.Args[1] 12127 if v_1.Op != OpS390XMOVBZreg { 12128 break 12129 } 12130 x := v_1.Args[0] 12131 mem := v.Args[2] 12132 v.reset(OpS390XMOVBstore) 12133 v.AuxInt = off 12134 v.Aux = sym 12135 v.AddArg(ptr) 12136 v.AddArg(x) 12137 v.AddArg(mem) 12138 return true 12139 } 12140 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 12141 // cond: is20Bit(off1+off2) 12142 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 12143 for { 12144 off1 := v.AuxInt 12145 sym := v.Aux 12146 _ = v.Args[2] 12147 v_0 := v.Args[0] 12148 if v_0.Op != OpS390XADDconst { 12149 break 12150 } 12151 off2 := v_0.AuxInt 12152 ptr := v_0.Args[0] 12153 val := v.Args[1] 12154 mem := v.Args[2] 12155 if !(is20Bit(off1 + off2)) { 12156 break 12157 } 12158 v.reset(OpS390XMOVBstore) 12159 v.AuxInt = off1 + off2 12160 v.Aux = sym 12161 v.AddArg(ptr) 12162 v.AddArg(val) 12163 v.AddArg(mem) 12164 return true 12165 } 12166 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 12167 // cond: is20Bit(off) && ptr.Op != OpSB 12168 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 12169 for { 12170 off := v.AuxInt 12171 sym := v.Aux 12172 _ = v.Args[2] 12173 ptr := v.Args[0] 12174 v_1 := v.Args[1] 12175 if v_1.Op != OpS390XMOVDconst { 12176 break 12177 } 12178 c := v_1.AuxInt 12179 mem := v.Args[2] 12180 if !(is20Bit(off) && ptr.Op != OpSB) { 12181 break 12182 } 12183 v.reset(OpS390XMOVBstoreconst) 12184 v.AuxInt = makeValAndOff(int64(int8(c)), off) 12185 v.Aux = sym 12186 v.AddArg(ptr) 12187 v.AddArg(mem) 12188 return true 12189 } 12190 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 12191 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12192 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 12193 for { 12194 off1 := v.AuxInt 12195 sym1 := v.Aux 12196 _ = v.Args[2] 12197 v_0 := v.Args[0] 12198 if v_0.Op != OpS390XMOVDaddr { 12199 break 12200 } 12201 off2 := v_0.AuxInt 12202 sym2 := v_0.Aux 12203 base := v_0.Args[0] 12204 val := v.Args[1] 12205 mem := v.Args[2] 12206 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12207 break 12208 } 12209 v.reset(OpS390XMOVBstore) 12210 v.AuxInt = off1 + off2 12211 v.Aux = mergeSym(sym1, sym2) 12212 v.AddArg(base) 12213 v.AddArg(val) 12214 v.AddArg(mem) 12215 return true 12216 } 12217 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 12218 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12219 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 12220 for { 12221 off1 := v.AuxInt 12222 sym1 := v.Aux 12223 _ = v.Args[2] 12224 v_0 := v.Args[0] 12225 if v_0.Op != OpS390XMOVDaddridx { 12226 break 12227 } 12228 off2 := v_0.AuxInt 12229 sym2 := v_0.Aux 12230 _ = v_0.Args[1] 12231 ptr := v_0.Args[0] 12232 idx := v_0.Args[1] 12233 val := v.Args[1] 12234 mem := v.Args[2] 12235 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12236 break 12237 } 12238 v.reset(OpS390XMOVBstoreidx) 12239 v.AuxInt = off1 + off2 12240 v.Aux = mergeSym(sym1, sym2) 12241 v.AddArg(ptr) 12242 v.AddArg(idx) 12243 v.AddArg(val) 12244 v.AddArg(mem) 12245 return true 12246 } 12247 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 12248 // cond: ptr.Op != OpSB 12249 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 12250 for { 12251 off := v.AuxInt 12252 sym := v.Aux 12253 _ = v.Args[2] 12254 v_0 := v.Args[0] 12255 if v_0.Op != OpS390XADD { 12256 break 12257 } 12258 _ = v_0.Args[1] 12259 ptr := v_0.Args[0] 12260 idx := v_0.Args[1] 12261 val := v.Args[1] 12262 mem := v.Args[2] 12263 if !(ptr.Op != OpSB) { 12264 break 12265 } 12266 v.reset(OpS390XMOVBstoreidx) 12267 v.AuxInt = off 12268 v.Aux = sym 12269 v.AddArg(ptr) 12270 v.AddArg(idx) 12271 v.AddArg(val) 12272 v.AddArg(mem) 12273 return true 12274 } 12275 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 12276 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12277 // result: (MOVHstore [i-1] {s} p w mem) 12278 for { 12279 i := v.AuxInt 12280 s := v.Aux 12281 _ = v.Args[2] 12282 p := v.Args[0] 12283 w := v.Args[1] 12284 x := v.Args[2] 12285 if x.Op != OpS390XMOVBstore { 12286 break 12287 } 12288 if x.AuxInt != i-1 { 12289 break 12290 } 12291 if x.Aux != s { 12292 break 12293 } 12294 _ = x.Args[2] 12295 if p != x.Args[0] { 12296 break 12297 } 12298 x_1 := x.Args[1] 12299 if x_1.Op != OpS390XSRDconst { 12300 break 12301 } 12302 if x_1.AuxInt != 8 { 12303 break 12304 } 12305 if w != x_1.Args[0] { 12306 break 12307 } 12308 mem := x.Args[2] 12309 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12310 break 12311 } 12312 v.reset(OpS390XMOVHstore) 12313 v.AuxInt = i - 1 12314 v.Aux = s 12315 v.AddArg(p) 12316 v.AddArg(w) 12317 v.AddArg(mem) 12318 return true 12319 } 12320 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 12321 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12322 // result: (MOVHstore [i-1] {s} p w0 mem) 12323 for { 12324 i := v.AuxInt 12325 s := v.Aux 12326 _ = v.Args[2] 12327 p := v.Args[0] 12328 w0 := v.Args[1] 12329 if w0.Op != OpS390XSRDconst { 12330 break 12331 } 12332 j := w0.AuxInt 12333 w := w0.Args[0] 12334 x := v.Args[2] 12335 if x.Op != OpS390XMOVBstore { 12336 break 12337 } 12338 if x.AuxInt != i-1 { 12339 break 12340 } 12341 if x.Aux != s { 12342 break 12343 } 12344 _ = x.Args[2] 12345 if p != x.Args[0] { 12346 break 12347 } 12348 x_1 := x.Args[1] 12349 if x_1.Op != OpS390XSRDconst { 12350 break 12351 } 12352 if x_1.AuxInt != j+8 { 12353 break 12354 } 12355 if w != x_1.Args[0] { 12356 break 12357 } 12358 mem := x.Args[2] 12359 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12360 break 12361 } 12362 v.reset(OpS390XMOVHstore) 12363 v.AuxInt = i - 1 12364 v.Aux = s 12365 v.AddArg(p) 12366 v.AddArg(w0) 12367 v.AddArg(mem) 12368 return true 12369 } 12370 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 12371 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12372 // result: (MOVHstore [i-1] {s} p w mem) 12373 for { 12374 i := v.AuxInt 12375 s := v.Aux 12376 _ = v.Args[2] 12377 p := v.Args[0] 12378 w := v.Args[1] 12379 x := v.Args[2] 12380 if x.Op != OpS390XMOVBstore { 12381 break 12382 } 12383 if x.AuxInt != i-1 { 12384 break 12385 } 12386 if x.Aux != s { 12387 break 12388 } 12389 _ = x.Args[2] 12390 if p != x.Args[0] { 12391 break 12392 } 12393 x_1 := x.Args[1] 12394 if x_1.Op != OpS390XSRWconst { 12395 break 12396 } 12397 if x_1.AuxInt != 8 { 12398 break 12399 } 12400 if w != x_1.Args[0] { 12401 break 12402 } 12403 mem := x.Args[2] 12404 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12405 break 12406 } 12407 v.reset(OpS390XMOVHstore) 12408 v.AuxInt = i - 1 12409 v.Aux = s 12410 v.AddArg(p) 12411 v.AddArg(w) 12412 v.AddArg(mem) 12413 return true 12414 } 12415 return false 12416 } 12417 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 12418 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 12419 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12420 // result: (MOVHstore [i-1] {s} p w0 mem) 12421 for { 12422 i := v.AuxInt 12423 s := v.Aux 12424 _ = v.Args[2] 12425 p := v.Args[0] 12426 w0 := v.Args[1] 12427 if w0.Op != OpS390XSRWconst { 12428 break 12429 } 12430 j := w0.AuxInt 12431 w := w0.Args[0] 12432 x := v.Args[2] 12433 if x.Op != OpS390XMOVBstore { 12434 break 12435 } 12436 if x.AuxInt != i-1 { 12437 break 12438 } 12439 if x.Aux != s { 12440 break 12441 } 12442 _ = x.Args[2] 12443 if p != x.Args[0] { 12444 break 12445 } 12446 x_1 := x.Args[1] 12447 if x_1.Op != OpS390XSRWconst { 12448 break 12449 } 12450 if x_1.AuxInt != j+8 { 12451 break 12452 } 12453 if w != x_1.Args[0] { 12454 break 12455 } 12456 mem := x.Args[2] 12457 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12458 break 12459 } 12460 v.reset(OpS390XMOVHstore) 12461 v.AuxInt = i - 1 12462 v.Aux = s 12463 v.AddArg(p) 12464 v.AddArg(w0) 12465 v.AddArg(mem) 12466 return true 12467 } 12468 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 12469 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12470 // result: (MOVHBRstore [i-1] {s} p w mem) 12471 for { 12472 i := v.AuxInt 12473 s := v.Aux 12474 _ = v.Args[2] 12475 p := v.Args[0] 12476 v_1 := v.Args[1] 12477 if v_1.Op != OpS390XSRDconst { 12478 break 12479 } 12480 if v_1.AuxInt != 8 { 12481 break 12482 } 12483 w := v_1.Args[0] 12484 x := v.Args[2] 12485 if x.Op != OpS390XMOVBstore { 12486 break 12487 } 12488 if x.AuxInt != i-1 { 12489 break 12490 } 12491 if x.Aux != s { 12492 break 12493 } 12494 _ = x.Args[2] 12495 if p != x.Args[0] { 12496 break 12497 } 12498 if w != x.Args[1] { 12499 break 12500 } 12501 mem := x.Args[2] 12502 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12503 break 12504 } 12505 v.reset(OpS390XMOVHBRstore) 12506 v.AuxInt = i - 1 12507 v.Aux = s 12508 v.AddArg(p) 12509 v.AddArg(w) 12510 v.AddArg(mem) 12511 return true 12512 } 12513 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 12514 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12515 // result: (MOVHBRstore [i-1] {s} p w0 mem) 12516 for { 12517 i := v.AuxInt 12518 s := v.Aux 12519 _ = v.Args[2] 12520 p := v.Args[0] 12521 v_1 := v.Args[1] 12522 if v_1.Op != OpS390XSRDconst { 12523 break 12524 } 12525 j := v_1.AuxInt 12526 w := v_1.Args[0] 12527 x := v.Args[2] 12528 if x.Op != OpS390XMOVBstore { 12529 break 12530 } 12531 if x.AuxInt != i-1 { 12532 break 12533 } 12534 if x.Aux != s { 12535 break 12536 } 12537 _ = x.Args[2] 12538 if p != x.Args[0] { 12539 break 12540 } 12541 w0 := x.Args[1] 12542 if w0.Op != OpS390XSRDconst { 12543 break 12544 } 12545 if w0.AuxInt != j-8 { 12546 break 12547 } 12548 if w != w0.Args[0] { 12549 break 12550 } 12551 mem := x.Args[2] 12552 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12553 break 12554 } 12555 v.reset(OpS390XMOVHBRstore) 12556 v.AuxInt = i - 1 12557 v.Aux = s 12558 v.AddArg(p) 12559 v.AddArg(w0) 12560 v.AddArg(mem) 12561 return true 12562 } 12563 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 12564 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12565 // result: (MOVHBRstore [i-1] {s} p w mem) 12566 for { 12567 i := v.AuxInt 12568 s := v.Aux 12569 _ = v.Args[2] 12570 p := v.Args[0] 12571 v_1 := v.Args[1] 12572 if v_1.Op != OpS390XSRWconst { 12573 break 12574 } 12575 if v_1.AuxInt != 8 { 12576 break 12577 } 12578 w := v_1.Args[0] 12579 x := v.Args[2] 12580 if x.Op != OpS390XMOVBstore { 12581 break 12582 } 12583 if x.AuxInt != i-1 { 12584 break 12585 } 12586 if x.Aux != s { 12587 break 12588 } 12589 _ = x.Args[2] 12590 if p != x.Args[0] { 12591 break 12592 } 12593 if w != x.Args[1] { 12594 break 12595 } 12596 mem := x.Args[2] 12597 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12598 break 12599 } 12600 v.reset(OpS390XMOVHBRstore) 12601 v.AuxInt = i - 1 12602 v.Aux = s 12603 v.AddArg(p) 12604 v.AddArg(w) 12605 v.AddArg(mem) 12606 return true 12607 } 12608 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 12609 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 12610 // result: (MOVHBRstore [i-1] {s} p w0 mem) 12611 for { 12612 i := v.AuxInt 12613 s := v.Aux 12614 _ = v.Args[2] 12615 p := v.Args[0] 12616 v_1 := v.Args[1] 12617 if v_1.Op != OpS390XSRWconst { 12618 break 12619 } 12620 j := v_1.AuxInt 12621 w := v_1.Args[0] 12622 x := v.Args[2] 12623 if x.Op != OpS390XMOVBstore { 12624 break 12625 } 12626 if x.AuxInt != i-1 { 12627 break 12628 } 12629 if x.Aux != s { 12630 break 12631 } 12632 _ = x.Args[2] 12633 if p != x.Args[0] { 12634 break 12635 } 12636 w0 := x.Args[1] 12637 if w0.Op != OpS390XSRWconst { 12638 break 12639 } 12640 if w0.AuxInt != j-8 { 12641 break 12642 } 12643 if w != w0.Args[0] { 12644 break 12645 } 12646 mem := x.Args[2] 12647 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 12648 break 12649 } 12650 v.reset(OpS390XMOVHBRstore) 12651 v.AuxInt = i - 1 12652 v.Aux = s 12653 v.AddArg(p) 12654 v.AddArg(w0) 12655 v.AddArg(mem) 12656 return true 12657 } 12658 return false 12659 } 12660 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 12661 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 12662 // cond: is20Bit(ValAndOff(sc).Off()+off) 12663 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 12664 for { 12665 sc := v.AuxInt 12666 s := v.Aux 12667 _ = v.Args[1] 12668 v_0 := v.Args[0] 12669 if v_0.Op != OpS390XADDconst { 12670 break 12671 } 12672 off := v_0.AuxInt 12673 ptr := v_0.Args[0] 12674 mem := v.Args[1] 12675 if !(is20Bit(ValAndOff(sc).Off() + off)) { 12676 break 12677 } 12678 v.reset(OpS390XMOVBstoreconst) 12679 v.AuxInt = ValAndOff(sc).add(off) 12680 v.Aux = s 12681 v.AddArg(ptr) 12682 v.AddArg(mem) 12683 return true 12684 } 12685 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 12686 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 12687 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 12688 for { 12689 sc := v.AuxInt 12690 sym1 := v.Aux 12691 _ = v.Args[1] 12692 v_0 := v.Args[0] 12693 if v_0.Op != OpS390XMOVDaddr { 12694 break 12695 } 12696 off := v_0.AuxInt 12697 sym2 := v_0.Aux 12698 ptr := v_0.Args[0] 12699 mem := v.Args[1] 12700 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 12701 break 12702 } 12703 v.reset(OpS390XMOVBstoreconst) 12704 v.AuxInt = ValAndOff(sc).add(off) 12705 v.Aux = mergeSym(sym1, sym2) 12706 v.AddArg(ptr) 12707 v.AddArg(mem) 12708 return true 12709 } 12710 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 12711 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 12712 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 12713 for { 12714 c := v.AuxInt 12715 s := v.Aux 12716 _ = v.Args[1] 12717 p := v.Args[0] 12718 x := v.Args[1] 12719 if x.Op != OpS390XMOVBstoreconst { 12720 break 12721 } 12722 a := x.AuxInt 12723 if x.Aux != s { 12724 break 12725 } 12726 _ = x.Args[1] 12727 if p != x.Args[0] { 12728 break 12729 } 12730 mem := x.Args[1] 12731 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 12732 break 12733 } 12734 v.reset(OpS390XMOVHstoreconst) 12735 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 12736 v.Aux = s 12737 v.AddArg(p) 12738 v.AddArg(mem) 12739 return true 12740 } 12741 return false 12742 } 12743 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 12744 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 12745 // cond: is20Bit(c+d) 12746 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12747 for { 12748 c := v.AuxInt 12749 sym := v.Aux 12750 _ = v.Args[3] 12751 v_0 := v.Args[0] 12752 if v_0.Op != OpS390XADDconst { 12753 break 12754 } 12755 d := v_0.AuxInt 12756 ptr := v_0.Args[0] 12757 idx := v.Args[1] 12758 val := v.Args[2] 12759 mem := v.Args[3] 12760 if !(is20Bit(c + d)) { 12761 break 12762 } 12763 v.reset(OpS390XMOVBstoreidx) 12764 v.AuxInt = c + d 12765 v.Aux = sym 12766 v.AddArg(ptr) 12767 v.AddArg(idx) 12768 v.AddArg(val) 12769 v.AddArg(mem) 12770 return true 12771 } 12772 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 12773 // cond: is20Bit(c+d) 12774 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12775 for { 12776 c := v.AuxInt 12777 sym := v.Aux 12778 _ = v.Args[3] 12779 idx := v.Args[0] 12780 v_1 := v.Args[1] 12781 if v_1.Op != OpS390XADDconst { 12782 break 12783 } 12784 d := v_1.AuxInt 12785 ptr := v_1.Args[0] 12786 val := v.Args[2] 12787 mem := v.Args[3] 12788 if !(is20Bit(c + d)) { 12789 break 12790 } 12791 v.reset(OpS390XMOVBstoreidx) 12792 v.AuxInt = c + d 12793 v.Aux = sym 12794 v.AddArg(ptr) 12795 v.AddArg(idx) 12796 v.AddArg(val) 12797 v.AddArg(mem) 12798 return true 12799 } 12800 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 12801 // cond: is20Bit(c+d) 12802 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12803 for { 12804 c := v.AuxInt 12805 sym := v.Aux 12806 _ = v.Args[3] 12807 ptr := v.Args[0] 12808 v_1 := v.Args[1] 12809 if v_1.Op != OpS390XADDconst { 12810 break 12811 } 12812 d := v_1.AuxInt 12813 idx := v_1.Args[0] 12814 val := v.Args[2] 12815 mem := v.Args[3] 12816 if !(is20Bit(c + d)) { 12817 break 12818 } 12819 v.reset(OpS390XMOVBstoreidx) 12820 v.AuxInt = c + d 12821 v.Aux = sym 12822 v.AddArg(ptr) 12823 v.AddArg(idx) 12824 v.AddArg(val) 12825 v.AddArg(mem) 12826 return true 12827 } 12828 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 12829 // cond: is20Bit(c+d) 12830 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 12831 for { 12832 c := v.AuxInt 12833 sym := v.Aux 12834 _ = v.Args[3] 12835 v_0 := v.Args[0] 12836 if v_0.Op != OpS390XADDconst { 12837 break 12838 } 12839 d := v_0.AuxInt 12840 idx := v_0.Args[0] 12841 ptr := v.Args[1] 12842 val := v.Args[2] 12843 mem := v.Args[3] 12844 if !(is20Bit(c + d)) { 12845 break 12846 } 12847 v.reset(OpS390XMOVBstoreidx) 12848 v.AuxInt = c + d 12849 v.Aux = sym 12850 v.AddArg(ptr) 12851 v.AddArg(idx) 12852 v.AddArg(val) 12853 v.AddArg(mem) 12854 return true 12855 } 12856 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 12857 // cond: x.Uses == 1 && clobber(x) 12858 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12859 for { 12860 i := v.AuxInt 12861 s := v.Aux 12862 _ = v.Args[3] 12863 p := v.Args[0] 12864 idx := v.Args[1] 12865 w := v.Args[2] 12866 x := v.Args[3] 12867 if x.Op != OpS390XMOVBstoreidx { 12868 break 12869 } 12870 if x.AuxInt != i-1 { 12871 break 12872 } 12873 if x.Aux != s { 12874 break 12875 } 12876 _ = x.Args[3] 12877 if p != x.Args[0] { 12878 break 12879 } 12880 if idx != x.Args[1] { 12881 break 12882 } 12883 x_2 := x.Args[2] 12884 if x_2.Op != OpS390XSRDconst { 12885 break 12886 } 12887 if x_2.AuxInt != 8 { 12888 break 12889 } 12890 if w != x_2.Args[0] { 12891 break 12892 } 12893 mem := x.Args[3] 12894 if !(x.Uses == 1 && clobber(x)) { 12895 break 12896 } 12897 v.reset(OpS390XMOVHstoreidx) 12898 v.AuxInt = i - 1 12899 v.Aux = s 12900 v.AddArg(p) 12901 v.AddArg(idx) 12902 v.AddArg(w) 12903 v.AddArg(mem) 12904 return true 12905 } 12906 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 12907 // cond: x.Uses == 1 && clobber(x) 12908 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12909 for { 12910 i := v.AuxInt 12911 s := v.Aux 12912 _ = v.Args[3] 12913 p := v.Args[0] 12914 idx := v.Args[1] 12915 w := v.Args[2] 12916 x := v.Args[3] 12917 if x.Op != OpS390XMOVBstoreidx { 12918 break 12919 } 12920 if x.AuxInt != i-1 { 12921 break 12922 } 12923 if x.Aux != s { 12924 break 12925 } 12926 _ = x.Args[3] 12927 if idx != x.Args[0] { 12928 break 12929 } 12930 if p != x.Args[1] { 12931 break 12932 } 12933 x_2 := x.Args[2] 12934 if x_2.Op != OpS390XSRDconst { 12935 break 12936 } 12937 if x_2.AuxInt != 8 { 12938 break 12939 } 12940 if w != x_2.Args[0] { 12941 break 12942 } 12943 mem := x.Args[3] 12944 if !(x.Uses == 1 && clobber(x)) { 12945 break 12946 } 12947 v.reset(OpS390XMOVHstoreidx) 12948 v.AuxInt = i - 1 12949 v.Aux = s 12950 v.AddArg(p) 12951 v.AddArg(idx) 12952 v.AddArg(w) 12953 v.AddArg(mem) 12954 return true 12955 } 12956 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 12957 // cond: x.Uses == 1 && clobber(x) 12958 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 12959 for { 12960 i := v.AuxInt 12961 s := v.Aux 12962 _ = v.Args[3] 12963 idx := v.Args[0] 12964 p := v.Args[1] 12965 w := v.Args[2] 12966 x := v.Args[3] 12967 if x.Op != OpS390XMOVBstoreidx { 12968 break 12969 } 12970 if x.AuxInt != i-1 { 12971 break 12972 } 12973 if x.Aux != s { 12974 break 12975 } 12976 _ = x.Args[3] 12977 if p != x.Args[0] { 12978 break 12979 } 12980 if idx != x.Args[1] { 12981 break 12982 } 12983 x_2 := x.Args[2] 12984 if x_2.Op != OpS390XSRDconst { 12985 break 12986 } 12987 if x_2.AuxInt != 8 { 12988 break 12989 } 12990 if w != x_2.Args[0] { 12991 break 12992 } 12993 mem := x.Args[3] 12994 if !(x.Uses == 1 && clobber(x)) { 12995 break 12996 } 12997 v.reset(OpS390XMOVHstoreidx) 12998 v.AuxInt = i - 1 12999 v.Aux = s 13000 v.AddArg(p) 13001 v.AddArg(idx) 13002 v.AddArg(w) 13003 v.AddArg(mem) 13004 return true 13005 } 13006 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 13007 // cond: x.Uses == 1 && clobber(x) 13008 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13009 for { 13010 i := v.AuxInt 13011 s := v.Aux 13012 _ = v.Args[3] 13013 idx := v.Args[0] 13014 p := v.Args[1] 13015 w := v.Args[2] 13016 x := v.Args[3] 13017 if x.Op != OpS390XMOVBstoreidx { 13018 break 13019 } 13020 if x.AuxInt != i-1 { 13021 break 13022 } 13023 if x.Aux != s { 13024 break 13025 } 13026 _ = x.Args[3] 13027 if idx != x.Args[0] { 13028 break 13029 } 13030 if p != x.Args[1] { 13031 break 13032 } 13033 x_2 := x.Args[2] 13034 if x_2.Op != OpS390XSRDconst { 13035 break 13036 } 13037 if x_2.AuxInt != 8 { 13038 break 13039 } 13040 if w != x_2.Args[0] { 13041 break 13042 } 13043 mem := x.Args[3] 13044 if !(x.Uses == 1 && clobber(x)) { 13045 break 13046 } 13047 v.reset(OpS390XMOVHstoreidx) 13048 v.AuxInt = i - 1 13049 v.Aux = s 13050 v.AddArg(p) 13051 v.AddArg(idx) 13052 v.AddArg(w) 13053 v.AddArg(mem) 13054 return true 13055 } 13056 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 13057 // cond: x.Uses == 1 && clobber(x) 13058 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13059 for { 13060 i := v.AuxInt 13061 s := v.Aux 13062 _ = v.Args[3] 13063 p := v.Args[0] 13064 idx := v.Args[1] 13065 w0 := v.Args[2] 13066 if w0.Op != OpS390XSRDconst { 13067 break 13068 } 13069 j := w0.AuxInt 13070 w := w0.Args[0] 13071 x := v.Args[3] 13072 if x.Op != OpS390XMOVBstoreidx { 13073 break 13074 } 13075 if x.AuxInt != i-1 { 13076 break 13077 } 13078 if x.Aux != s { 13079 break 13080 } 13081 _ = x.Args[3] 13082 if p != x.Args[0] { 13083 break 13084 } 13085 if idx != x.Args[1] { 13086 break 13087 } 13088 x_2 := x.Args[2] 13089 if x_2.Op != OpS390XSRDconst { 13090 break 13091 } 13092 if x_2.AuxInt != j+8 { 13093 break 13094 } 13095 if w != x_2.Args[0] { 13096 break 13097 } 13098 mem := x.Args[3] 13099 if !(x.Uses == 1 && clobber(x)) { 13100 break 13101 } 13102 v.reset(OpS390XMOVHstoreidx) 13103 v.AuxInt = i - 1 13104 v.Aux = s 13105 v.AddArg(p) 13106 v.AddArg(idx) 13107 v.AddArg(w0) 13108 v.AddArg(mem) 13109 return true 13110 } 13111 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 13112 // cond: x.Uses == 1 && clobber(x) 13113 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13114 for { 13115 i := v.AuxInt 13116 s := v.Aux 13117 _ = v.Args[3] 13118 p := v.Args[0] 13119 idx := v.Args[1] 13120 w0 := v.Args[2] 13121 if w0.Op != OpS390XSRDconst { 13122 break 13123 } 13124 j := w0.AuxInt 13125 w := w0.Args[0] 13126 x := v.Args[3] 13127 if x.Op != OpS390XMOVBstoreidx { 13128 break 13129 } 13130 if x.AuxInt != i-1 { 13131 break 13132 } 13133 if x.Aux != s { 13134 break 13135 } 13136 _ = x.Args[3] 13137 if idx != x.Args[0] { 13138 break 13139 } 13140 if p != x.Args[1] { 13141 break 13142 } 13143 x_2 := x.Args[2] 13144 if x_2.Op != OpS390XSRDconst { 13145 break 13146 } 13147 if x_2.AuxInt != j+8 { 13148 break 13149 } 13150 if w != x_2.Args[0] { 13151 break 13152 } 13153 mem := x.Args[3] 13154 if !(x.Uses == 1 && clobber(x)) { 13155 break 13156 } 13157 v.reset(OpS390XMOVHstoreidx) 13158 v.AuxInt = i - 1 13159 v.Aux = s 13160 v.AddArg(p) 13161 v.AddArg(idx) 13162 v.AddArg(w0) 13163 v.AddArg(mem) 13164 return true 13165 } 13166 return false 13167 } 13168 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 13169 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 13170 // cond: x.Uses == 1 && clobber(x) 13171 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13172 for { 13173 i := v.AuxInt 13174 s := v.Aux 13175 _ = v.Args[3] 13176 idx := v.Args[0] 13177 p := v.Args[1] 13178 w0 := v.Args[2] 13179 if w0.Op != OpS390XSRDconst { 13180 break 13181 } 13182 j := w0.AuxInt 13183 w := w0.Args[0] 13184 x := v.Args[3] 13185 if x.Op != OpS390XMOVBstoreidx { 13186 break 13187 } 13188 if x.AuxInt != i-1 { 13189 break 13190 } 13191 if x.Aux != s { 13192 break 13193 } 13194 _ = x.Args[3] 13195 if p != x.Args[0] { 13196 break 13197 } 13198 if idx != x.Args[1] { 13199 break 13200 } 13201 x_2 := x.Args[2] 13202 if x_2.Op != OpS390XSRDconst { 13203 break 13204 } 13205 if x_2.AuxInt != j+8 { 13206 break 13207 } 13208 if w != x_2.Args[0] { 13209 break 13210 } 13211 mem := x.Args[3] 13212 if !(x.Uses == 1 && clobber(x)) { 13213 break 13214 } 13215 v.reset(OpS390XMOVHstoreidx) 13216 v.AuxInt = i - 1 13217 v.Aux = s 13218 v.AddArg(p) 13219 v.AddArg(idx) 13220 v.AddArg(w0) 13221 v.AddArg(mem) 13222 return true 13223 } 13224 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 13225 // cond: x.Uses == 1 && clobber(x) 13226 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13227 for { 13228 i := v.AuxInt 13229 s := v.Aux 13230 _ = v.Args[3] 13231 idx := v.Args[0] 13232 p := v.Args[1] 13233 w0 := v.Args[2] 13234 if w0.Op != OpS390XSRDconst { 13235 break 13236 } 13237 j := w0.AuxInt 13238 w := w0.Args[0] 13239 x := v.Args[3] 13240 if x.Op != OpS390XMOVBstoreidx { 13241 break 13242 } 13243 if x.AuxInt != i-1 { 13244 break 13245 } 13246 if x.Aux != s { 13247 break 13248 } 13249 _ = x.Args[3] 13250 if idx != x.Args[0] { 13251 break 13252 } 13253 if p != x.Args[1] { 13254 break 13255 } 13256 x_2 := x.Args[2] 13257 if x_2.Op != OpS390XSRDconst { 13258 break 13259 } 13260 if x_2.AuxInt != j+8 { 13261 break 13262 } 13263 if w != x_2.Args[0] { 13264 break 13265 } 13266 mem := x.Args[3] 13267 if !(x.Uses == 1 && clobber(x)) { 13268 break 13269 } 13270 v.reset(OpS390XMOVHstoreidx) 13271 v.AuxInt = i - 1 13272 v.Aux = s 13273 v.AddArg(p) 13274 v.AddArg(idx) 13275 v.AddArg(w0) 13276 v.AddArg(mem) 13277 return true 13278 } 13279 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 13280 // cond: x.Uses == 1 && clobber(x) 13281 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13282 for { 13283 i := v.AuxInt 13284 s := v.Aux 13285 _ = v.Args[3] 13286 p := v.Args[0] 13287 idx := v.Args[1] 13288 w := v.Args[2] 13289 x := v.Args[3] 13290 if x.Op != OpS390XMOVBstoreidx { 13291 break 13292 } 13293 if x.AuxInt != i-1 { 13294 break 13295 } 13296 if x.Aux != s { 13297 break 13298 } 13299 _ = x.Args[3] 13300 if p != x.Args[0] { 13301 break 13302 } 13303 if idx != x.Args[1] { 13304 break 13305 } 13306 x_2 := x.Args[2] 13307 if x_2.Op != OpS390XSRWconst { 13308 break 13309 } 13310 if x_2.AuxInt != 8 { 13311 break 13312 } 13313 if w != x_2.Args[0] { 13314 break 13315 } 13316 mem := x.Args[3] 13317 if !(x.Uses == 1 && clobber(x)) { 13318 break 13319 } 13320 v.reset(OpS390XMOVHstoreidx) 13321 v.AuxInt = i - 1 13322 v.Aux = s 13323 v.AddArg(p) 13324 v.AddArg(idx) 13325 v.AddArg(w) 13326 v.AddArg(mem) 13327 return true 13328 } 13329 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 13330 // cond: x.Uses == 1 && clobber(x) 13331 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13332 for { 13333 i := v.AuxInt 13334 s := v.Aux 13335 _ = v.Args[3] 13336 p := v.Args[0] 13337 idx := v.Args[1] 13338 w := v.Args[2] 13339 x := v.Args[3] 13340 if x.Op != OpS390XMOVBstoreidx { 13341 break 13342 } 13343 if x.AuxInt != i-1 { 13344 break 13345 } 13346 if x.Aux != s { 13347 break 13348 } 13349 _ = x.Args[3] 13350 if idx != x.Args[0] { 13351 break 13352 } 13353 if p != x.Args[1] { 13354 break 13355 } 13356 x_2 := x.Args[2] 13357 if x_2.Op != OpS390XSRWconst { 13358 break 13359 } 13360 if x_2.AuxInt != 8 { 13361 break 13362 } 13363 if w != x_2.Args[0] { 13364 break 13365 } 13366 mem := x.Args[3] 13367 if !(x.Uses == 1 && clobber(x)) { 13368 break 13369 } 13370 v.reset(OpS390XMOVHstoreidx) 13371 v.AuxInt = i - 1 13372 v.Aux = s 13373 v.AddArg(p) 13374 v.AddArg(idx) 13375 v.AddArg(w) 13376 v.AddArg(mem) 13377 return true 13378 } 13379 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 13380 // cond: x.Uses == 1 && clobber(x) 13381 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13382 for { 13383 i := v.AuxInt 13384 s := v.Aux 13385 _ = v.Args[3] 13386 idx := v.Args[0] 13387 p := v.Args[1] 13388 w := v.Args[2] 13389 x := v.Args[3] 13390 if x.Op != OpS390XMOVBstoreidx { 13391 break 13392 } 13393 if x.AuxInt != i-1 { 13394 break 13395 } 13396 if x.Aux != s { 13397 break 13398 } 13399 _ = x.Args[3] 13400 if p != x.Args[0] { 13401 break 13402 } 13403 if idx != x.Args[1] { 13404 break 13405 } 13406 x_2 := x.Args[2] 13407 if x_2.Op != OpS390XSRWconst { 13408 break 13409 } 13410 if x_2.AuxInt != 8 { 13411 break 13412 } 13413 if w != x_2.Args[0] { 13414 break 13415 } 13416 mem := x.Args[3] 13417 if !(x.Uses == 1 && clobber(x)) { 13418 break 13419 } 13420 v.reset(OpS390XMOVHstoreidx) 13421 v.AuxInt = i - 1 13422 v.Aux = s 13423 v.AddArg(p) 13424 v.AddArg(idx) 13425 v.AddArg(w) 13426 v.AddArg(mem) 13427 return true 13428 } 13429 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 13430 // cond: x.Uses == 1 && clobber(x) 13431 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 13432 for { 13433 i := v.AuxInt 13434 s := v.Aux 13435 _ = v.Args[3] 13436 idx := v.Args[0] 13437 p := v.Args[1] 13438 w := v.Args[2] 13439 x := v.Args[3] 13440 if x.Op != OpS390XMOVBstoreidx { 13441 break 13442 } 13443 if x.AuxInt != i-1 { 13444 break 13445 } 13446 if x.Aux != s { 13447 break 13448 } 13449 _ = x.Args[3] 13450 if idx != x.Args[0] { 13451 break 13452 } 13453 if p != x.Args[1] { 13454 break 13455 } 13456 x_2 := x.Args[2] 13457 if x_2.Op != OpS390XSRWconst { 13458 break 13459 } 13460 if x_2.AuxInt != 8 { 13461 break 13462 } 13463 if w != x_2.Args[0] { 13464 break 13465 } 13466 mem := x.Args[3] 13467 if !(x.Uses == 1 && clobber(x)) { 13468 break 13469 } 13470 v.reset(OpS390XMOVHstoreidx) 13471 v.AuxInt = i - 1 13472 v.Aux = s 13473 v.AddArg(p) 13474 v.AddArg(idx) 13475 v.AddArg(w) 13476 v.AddArg(mem) 13477 return true 13478 } 13479 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 13480 // cond: x.Uses == 1 && clobber(x) 13481 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13482 for { 13483 i := v.AuxInt 13484 s := v.Aux 13485 _ = v.Args[3] 13486 p := v.Args[0] 13487 idx := v.Args[1] 13488 w0 := v.Args[2] 13489 if w0.Op != OpS390XSRWconst { 13490 break 13491 } 13492 j := w0.AuxInt 13493 w := w0.Args[0] 13494 x := v.Args[3] 13495 if x.Op != OpS390XMOVBstoreidx { 13496 break 13497 } 13498 if x.AuxInt != i-1 { 13499 break 13500 } 13501 if x.Aux != s { 13502 break 13503 } 13504 _ = x.Args[3] 13505 if p != x.Args[0] { 13506 break 13507 } 13508 if idx != x.Args[1] { 13509 break 13510 } 13511 x_2 := x.Args[2] 13512 if x_2.Op != OpS390XSRWconst { 13513 break 13514 } 13515 if x_2.AuxInt != j+8 { 13516 break 13517 } 13518 if w != x_2.Args[0] { 13519 break 13520 } 13521 mem := x.Args[3] 13522 if !(x.Uses == 1 && clobber(x)) { 13523 break 13524 } 13525 v.reset(OpS390XMOVHstoreidx) 13526 v.AuxInt = i - 1 13527 v.Aux = s 13528 v.AddArg(p) 13529 v.AddArg(idx) 13530 v.AddArg(w0) 13531 v.AddArg(mem) 13532 return true 13533 } 13534 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 13535 // cond: x.Uses == 1 && clobber(x) 13536 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13537 for { 13538 i := v.AuxInt 13539 s := v.Aux 13540 _ = v.Args[3] 13541 p := v.Args[0] 13542 idx := v.Args[1] 13543 w0 := v.Args[2] 13544 if w0.Op != OpS390XSRWconst { 13545 break 13546 } 13547 j := w0.AuxInt 13548 w := w0.Args[0] 13549 x := v.Args[3] 13550 if x.Op != OpS390XMOVBstoreidx { 13551 break 13552 } 13553 if x.AuxInt != i-1 { 13554 break 13555 } 13556 if x.Aux != s { 13557 break 13558 } 13559 _ = x.Args[3] 13560 if idx != x.Args[0] { 13561 break 13562 } 13563 if p != x.Args[1] { 13564 break 13565 } 13566 x_2 := x.Args[2] 13567 if x_2.Op != OpS390XSRWconst { 13568 break 13569 } 13570 if x_2.AuxInt != j+8 { 13571 break 13572 } 13573 if w != x_2.Args[0] { 13574 break 13575 } 13576 mem := x.Args[3] 13577 if !(x.Uses == 1 && clobber(x)) { 13578 break 13579 } 13580 v.reset(OpS390XMOVHstoreidx) 13581 v.AuxInt = i - 1 13582 v.Aux = s 13583 v.AddArg(p) 13584 v.AddArg(idx) 13585 v.AddArg(w0) 13586 v.AddArg(mem) 13587 return true 13588 } 13589 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 13590 // cond: x.Uses == 1 && clobber(x) 13591 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13592 for { 13593 i := v.AuxInt 13594 s := v.Aux 13595 _ = v.Args[3] 13596 idx := v.Args[0] 13597 p := v.Args[1] 13598 w0 := v.Args[2] 13599 if w0.Op != OpS390XSRWconst { 13600 break 13601 } 13602 j := w0.AuxInt 13603 w := w0.Args[0] 13604 x := v.Args[3] 13605 if x.Op != OpS390XMOVBstoreidx { 13606 break 13607 } 13608 if x.AuxInt != i-1 { 13609 break 13610 } 13611 if x.Aux != s { 13612 break 13613 } 13614 _ = x.Args[3] 13615 if p != x.Args[0] { 13616 break 13617 } 13618 if idx != x.Args[1] { 13619 break 13620 } 13621 x_2 := x.Args[2] 13622 if x_2.Op != OpS390XSRWconst { 13623 break 13624 } 13625 if x_2.AuxInt != j+8 { 13626 break 13627 } 13628 if w != x_2.Args[0] { 13629 break 13630 } 13631 mem := x.Args[3] 13632 if !(x.Uses == 1 && clobber(x)) { 13633 break 13634 } 13635 v.reset(OpS390XMOVHstoreidx) 13636 v.AuxInt = i - 1 13637 v.Aux = s 13638 v.AddArg(p) 13639 v.AddArg(idx) 13640 v.AddArg(w0) 13641 v.AddArg(mem) 13642 return true 13643 } 13644 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 13645 // cond: x.Uses == 1 && clobber(x) 13646 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 13647 for { 13648 i := v.AuxInt 13649 s := v.Aux 13650 _ = v.Args[3] 13651 idx := v.Args[0] 13652 p := v.Args[1] 13653 w0 := v.Args[2] 13654 if w0.Op != OpS390XSRWconst { 13655 break 13656 } 13657 j := w0.AuxInt 13658 w := w0.Args[0] 13659 x := v.Args[3] 13660 if x.Op != OpS390XMOVBstoreidx { 13661 break 13662 } 13663 if x.AuxInt != i-1 { 13664 break 13665 } 13666 if x.Aux != s { 13667 break 13668 } 13669 _ = x.Args[3] 13670 if idx != x.Args[0] { 13671 break 13672 } 13673 if p != x.Args[1] { 13674 break 13675 } 13676 x_2 := x.Args[2] 13677 if x_2.Op != OpS390XSRWconst { 13678 break 13679 } 13680 if x_2.AuxInt != j+8 { 13681 break 13682 } 13683 if w != x_2.Args[0] { 13684 break 13685 } 13686 mem := x.Args[3] 13687 if !(x.Uses == 1 && clobber(x)) { 13688 break 13689 } 13690 v.reset(OpS390XMOVHstoreidx) 13691 v.AuxInt = i - 1 13692 v.Aux = s 13693 v.AddArg(p) 13694 v.AddArg(idx) 13695 v.AddArg(w0) 13696 v.AddArg(mem) 13697 return true 13698 } 13699 return false 13700 } 13701 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 13702 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 13703 // cond: x.Uses == 1 && clobber(x) 13704 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13705 for { 13706 i := v.AuxInt 13707 s := v.Aux 13708 _ = v.Args[3] 13709 p := v.Args[0] 13710 idx := v.Args[1] 13711 v_2 := v.Args[2] 13712 if v_2.Op != OpS390XSRDconst { 13713 break 13714 } 13715 if v_2.AuxInt != 8 { 13716 break 13717 } 13718 w := v_2.Args[0] 13719 x := v.Args[3] 13720 if x.Op != OpS390XMOVBstoreidx { 13721 break 13722 } 13723 if x.AuxInt != i-1 { 13724 break 13725 } 13726 if x.Aux != s { 13727 break 13728 } 13729 _ = x.Args[3] 13730 if p != x.Args[0] { 13731 break 13732 } 13733 if idx != x.Args[1] { 13734 break 13735 } 13736 if w != x.Args[2] { 13737 break 13738 } 13739 mem := x.Args[3] 13740 if !(x.Uses == 1 && clobber(x)) { 13741 break 13742 } 13743 v.reset(OpS390XMOVHBRstoreidx) 13744 v.AuxInt = i - 1 13745 v.Aux = s 13746 v.AddArg(p) 13747 v.AddArg(idx) 13748 v.AddArg(w) 13749 v.AddArg(mem) 13750 return true 13751 } 13752 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 13753 // cond: x.Uses == 1 && clobber(x) 13754 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13755 for { 13756 i := v.AuxInt 13757 s := v.Aux 13758 _ = v.Args[3] 13759 p := v.Args[0] 13760 idx := v.Args[1] 13761 v_2 := v.Args[2] 13762 if v_2.Op != OpS390XSRDconst { 13763 break 13764 } 13765 if v_2.AuxInt != 8 { 13766 break 13767 } 13768 w := v_2.Args[0] 13769 x := v.Args[3] 13770 if x.Op != OpS390XMOVBstoreidx { 13771 break 13772 } 13773 if x.AuxInt != i-1 { 13774 break 13775 } 13776 if x.Aux != s { 13777 break 13778 } 13779 _ = x.Args[3] 13780 if idx != x.Args[0] { 13781 break 13782 } 13783 if p != x.Args[1] { 13784 break 13785 } 13786 if w != x.Args[2] { 13787 break 13788 } 13789 mem := x.Args[3] 13790 if !(x.Uses == 1 && clobber(x)) { 13791 break 13792 } 13793 v.reset(OpS390XMOVHBRstoreidx) 13794 v.AuxInt = i - 1 13795 v.Aux = s 13796 v.AddArg(p) 13797 v.AddArg(idx) 13798 v.AddArg(w) 13799 v.AddArg(mem) 13800 return true 13801 } 13802 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 13803 // cond: x.Uses == 1 && clobber(x) 13804 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13805 for { 13806 i := v.AuxInt 13807 s := v.Aux 13808 _ = v.Args[3] 13809 idx := v.Args[0] 13810 p := v.Args[1] 13811 v_2 := v.Args[2] 13812 if v_2.Op != OpS390XSRDconst { 13813 break 13814 } 13815 if v_2.AuxInt != 8 { 13816 break 13817 } 13818 w := v_2.Args[0] 13819 x := v.Args[3] 13820 if x.Op != OpS390XMOVBstoreidx { 13821 break 13822 } 13823 if x.AuxInt != i-1 { 13824 break 13825 } 13826 if x.Aux != s { 13827 break 13828 } 13829 _ = x.Args[3] 13830 if p != x.Args[0] { 13831 break 13832 } 13833 if idx != x.Args[1] { 13834 break 13835 } 13836 if w != x.Args[2] { 13837 break 13838 } 13839 mem := x.Args[3] 13840 if !(x.Uses == 1 && clobber(x)) { 13841 break 13842 } 13843 v.reset(OpS390XMOVHBRstoreidx) 13844 v.AuxInt = i - 1 13845 v.Aux = s 13846 v.AddArg(p) 13847 v.AddArg(idx) 13848 v.AddArg(w) 13849 v.AddArg(mem) 13850 return true 13851 } 13852 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 13853 // cond: x.Uses == 1 && clobber(x) 13854 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 13855 for { 13856 i := v.AuxInt 13857 s := v.Aux 13858 _ = v.Args[3] 13859 idx := v.Args[0] 13860 p := v.Args[1] 13861 v_2 := v.Args[2] 13862 if v_2.Op != OpS390XSRDconst { 13863 break 13864 } 13865 if v_2.AuxInt != 8 { 13866 break 13867 } 13868 w := v_2.Args[0] 13869 x := v.Args[3] 13870 if x.Op != OpS390XMOVBstoreidx { 13871 break 13872 } 13873 if x.AuxInt != i-1 { 13874 break 13875 } 13876 if x.Aux != s { 13877 break 13878 } 13879 _ = x.Args[3] 13880 if idx != x.Args[0] { 13881 break 13882 } 13883 if p != x.Args[1] { 13884 break 13885 } 13886 if w != x.Args[2] { 13887 break 13888 } 13889 mem := x.Args[3] 13890 if !(x.Uses == 1 && clobber(x)) { 13891 break 13892 } 13893 v.reset(OpS390XMOVHBRstoreidx) 13894 v.AuxInt = i - 1 13895 v.Aux = s 13896 v.AddArg(p) 13897 v.AddArg(idx) 13898 v.AddArg(w) 13899 v.AddArg(mem) 13900 return true 13901 } 13902 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 13903 // cond: x.Uses == 1 && clobber(x) 13904 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 13905 for { 13906 i := v.AuxInt 13907 s := v.Aux 13908 _ = v.Args[3] 13909 p := v.Args[0] 13910 idx := v.Args[1] 13911 v_2 := v.Args[2] 13912 if v_2.Op != OpS390XSRDconst { 13913 break 13914 } 13915 j := v_2.AuxInt 13916 w := v_2.Args[0] 13917 x := v.Args[3] 13918 if x.Op != OpS390XMOVBstoreidx { 13919 break 13920 } 13921 if x.AuxInt != i-1 { 13922 break 13923 } 13924 if x.Aux != s { 13925 break 13926 } 13927 _ = x.Args[3] 13928 if p != x.Args[0] { 13929 break 13930 } 13931 if idx != x.Args[1] { 13932 break 13933 } 13934 w0 := x.Args[2] 13935 if w0.Op != OpS390XSRDconst { 13936 break 13937 } 13938 if w0.AuxInt != j-8 { 13939 break 13940 } 13941 if w != w0.Args[0] { 13942 break 13943 } 13944 mem := x.Args[3] 13945 if !(x.Uses == 1 && clobber(x)) { 13946 break 13947 } 13948 v.reset(OpS390XMOVHBRstoreidx) 13949 v.AuxInt = i - 1 13950 v.Aux = s 13951 v.AddArg(p) 13952 v.AddArg(idx) 13953 v.AddArg(w0) 13954 v.AddArg(mem) 13955 return true 13956 } 13957 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 13958 // cond: x.Uses == 1 && clobber(x) 13959 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 13960 for { 13961 i := v.AuxInt 13962 s := v.Aux 13963 _ = v.Args[3] 13964 p := v.Args[0] 13965 idx := v.Args[1] 13966 v_2 := v.Args[2] 13967 if v_2.Op != OpS390XSRDconst { 13968 break 13969 } 13970 j := v_2.AuxInt 13971 w := v_2.Args[0] 13972 x := v.Args[3] 13973 if x.Op != OpS390XMOVBstoreidx { 13974 break 13975 } 13976 if x.AuxInt != i-1 { 13977 break 13978 } 13979 if x.Aux != s { 13980 break 13981 } 13982 _ = x.Args[3] 13983 if idx != x.Args[0] { 13984 break 13985 } 13986 if p != x.Args[1] { 13987 break 13988 } 13989 w0 := x.Args[2] 13990 if w0.Op != OpS390XSRDconst { 13991 break 13992 } 13993 if w0.AuxInt != j-8 { 13994 break 13995 } 13996 if w != w0.Args[0] { 13997 break 13998 } 13999 mem := x.Args[3] 14000 if !(x.Uses == 1 && clobber(x)) { 14001 break 14002 } 14003 v.reset(OpS390XMOVHBRstoreidx) 14004 v.AuxInt = i - 1 14005 v.Aux = s 14006 v.AddArg(p) 14007 v.AddArg(idx) 14008 v.AddArg(w0) 14009 v.AddArg(mem) 14010 return true 14011 } 14012 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 14013 // cond: x.Uses == 1 && clobber(x) 14014 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14015 for { 14016 i := v.AuxInt 14017 s := v.Aux 14018 _ = v.Args[3] 14019 idx := v.Args[0] 14020 p := v.Args[1] 14021 v_2 := v.Args[2] 14022 if v_2.Op != OpS390XSRDconst { 14023 break 14024 } 14025 j := v_2.AuxInt 14026 w := v_2.Args[0] 14027 x := v.Args[3] 14028 if x.Op != OpS390XMOVBstoreidx { 14029 break 14030 } 14031 if x.AuxInt != i-1 { 14032 break 14033 } 14034 if x.Aux != s { 14035 break 14036 } 14037 _ = x.Args[3] 14038 if p != x.Args[0] { 14039 break 14040 } 14041 if idx != x.Args[1] { 14042 break 14043 } 14044 w0 := x.Args[2] 14045 if w0.Op != OpS390XSRDconst { 14046 break 14047 } 14048 if w0.AuxInt != j-8 { 14049 break 14050 } 14051 if w != w0.Args[0] { 14052 break 14053 } 14054 mem := x.Args[3] 14055 if !(x.Uses == 1 && clobber(x)) { 14056 break 14057 } 14058 v.reset(OpS390XMOVHBRstoreidx) 14059 v.AuxInt = i - 1 14060 v.Aux = s 14061 v.AddArg(p) 14062 v.AddArg(idx) 14063 v.AddArg(w0) 14064 v.AddArg(mem) 14065 return true 14066 } 14067 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 14068 // cond: x.Uses == 1 && clobber(x) 14069 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14070 for { 14071 i := v.AuxInt 14072 s := v.Aux 14073 _ = v.Args[3] 14074 idx := v.Args[0] 14075 p := v.Args[1] 14076 v_2 := v.Args[2] 14077 if v_2.Op != OpS390XSRDconst { 14078 break 14079 } 14080 j := v_2.AuxInt 14081 w := v_2.Args[0] 14082 x := v.Args[3] 14083 if x.Op != OpS390XMOVBstoreidx { 14084 break 14085 } 14086 if x.AuxInt != i-1 { 14087 break 14088 } 14089 if x.Aux != s { 14090 break 14091 } 14092 _ = x.Args[3] 14093 if idx != x.Args[0] { 14094 break 14095 } 14096 if p != x.Args[1] { 14097 break 14098 } 14099 w0 := x.Args[2] 14100 if w0.Op != OpS390XSRDconst { 14101 break 14102 } 14103 if w0.AuxInt != j-8 { 14104 break 14105 } 14106 if w != w0.Args[0] { 14107 break 14108 } 14109 mem := x.Args[3] 14110 if !(x.Uses == 1 && clobber(x)) { 14111 break 14112 } 14113 v.reset(OpS390XMOVHBRstoreidx) 14114 v.AuxInt = i - 1 14115 v.Aux = s 14116 v.AddArg(p) 14117 v.AddArg(idx) 14118 v.AddArg(w0) 14119 v.AddArg(mem) 14120 return true 14121 } 14122 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 14123 // cond: x.Uses == 1 && clobber(x) 14124 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14125 for { 14126 i := v.AuxInt 14127 s := v.Aux 14128 _ = v.Args[3] 14129 p := v.Args[0] 14130 idx := v.Args[1] 14131 v_2 := v.Args[2] 14132 if v_2.Op != OpS390XSRWconst { 14133 break 14134 } 14135 if v_2.AuxInt != 8 { 14136 break 14137 } 14138 w := v_2.Args[0] 14139 x := v.Args[3] 14140 if x.Op != OpS390XMOVBstoreidx { 14141 break 14142 } 14143 if x.AuxInt != i-1 { 14144 break 14145 } 14146 if x.Aux != s { 14147 break 14148 } 14149 _ = x.Args[3] 14150 if p != x.Args[0] { 14151 break 14152 } 14153 if idx != x.Args[1] { 14154 break 14155 } 14156 if w != x.Args[2] { 14157 break 14158 } 14159 mem := x.Args[3] 14160 if !(x.Uses == 1 && clobber(x)) { 14161 break 14162 } 14163 v.reset(OpS390XMOVHBRstoreidx) 14164 v.AuxInt = i - 1 14165 v.Aux = s 14166 v.AddArg(p) 14167 v.AddArg(idx) 14168 v.AddArg(w) 14169 v.AddArg(mem) 14170 return true 14171 } 14172 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 14173 // cond: x.Uses == 1 && clobber(x) 14174 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14175 for { 14176 i := v.AuxInt 14177 s := v.Aux 14178 _ = v.Args[3] 14179 p := v.Args[0] 14180 idx := v.Args[1] 14181 v_2 := v.Args[2] 14182 if v_2.Op != OpS390XSRWconst { 14183 break 14184 } 14185 if v_2.AuxInt != 8 { 14186 break 14187 } 14188 w := v_2.Args[0] 14189 x := v.Args[3] 14190 if x.Op != OpS390XMOVBstoreidx { 14191 break 14192 } 14193 if x.AuxInt != i-1 { 14194 break 14195 } 14196 if x.Aux != s { 14197 break 14198 } 14199 _ = x.Args[3] 14200 if idx != x.Args[0] { 14201 break 14202 } 14203 if p != x.Args[1] { 14204 break 14205 } 14206 if w != x.Args[2] { 14207 break 14208 } 14209 mem := x.Args[3] 14210 if !(x.Uses == 1 && clobber(x)) { 14211 break 14212 } 14213 v.reset(OpS390XMOVHBRstoreidx) 14214 v.AuxInt = i - 1 14215 v.Aux = s 14216 v.AddArg(p) 14217 v.AddArg(idx) 14218 v.AddArg(w) 14219 v.AddArg(mem) 14220 return true 14221 } 14222 return false 14223 } 14224 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 14225 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 14226 // cond: x.Uses == 1 && clobber(x) 14227 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14228 for { 14229 i := v.AuxInt 14230 s := v.Aux 14231 _ = v.Args[3] 14232 idx := v.Args[0] 14233 p := v.Args[1] 14234 v_2 := v.Args[2] 14235 if v_2.Op != OpS390XSRWconst { 14236 break 14237 } 14238 if v_2.AuxInt != 8 { 14239 break 14240 } 14241 w := v_2.Args[0] 14242 x := v.Args[3] 14243 if x.Op != OpS390XMOVBstoreidx { 14244 break 14245 } 14246 if x.AuxInt != i-1 { 14247 break 14248 } 14249 if x.Aux != s { 14250 break 14251 } 14252 _ = x.Args[3] 14253 if p != x.Args[0] { 14254 break 14255 } 14256 if idx != x.Args[1] { 14257 break 14258 } 14259 if w != x.Args[2] { 14260 break 14261 } 14262 mem := x.Args[3] 14263 if !(x.Uses == 1 && clobber(x)) { 14264 break 14265 } 14266 v.reset(OpS390XMOVHBRstoreidx) 14267 v.AuxInt = i - 1 14268 v.Aux = s 14269 v.AddArg(p) 14270 v.AddArg(idx) 14271 v.AddArg(w) 14272 v.AddArg(mem) 14273 return true 14274 } 14275 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 14276 // cond: x.Uses == 1 && clobber(x) 14277 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 14278 for { 14279 i := v.AuxInt 14280 s := v.Aux 14281 _ = v.Args[3] 14282 idx := v.Args[0] 14283 p := v.Args[1] 14284 v_2 := v.Args[2] 14285 if v_2.Op != OpS390XSRWconst { 14286 break 14287 } 14288 if v_2.AuxInt != 8 { 14289 break 14290 } 14291 w := v_2.Args[0] 14292 x := v.Args[3] 14293 if x.Op != OpS390XMOVBstoreidx { 14294 break 14295 } 14296 if x.AuxInt != i-1 { 14297 break 14298 } 14299 if x.Aux != s { 14300 break 14301 } 14302 _ = x.Args[3] 14303 if idx != x.Args[0] { 14304 break 14305 } 14306 if p != x.Args[1] { 14307 break 14308 } 14309 if w != x.Args[2] { 14310 break 14311 } 14312 mem := x.Args[3] 14313 if !(x.Uses == 1 && clobber(x)) { 14314 break 14315 } 14316 v.reset(OpS390XMOVHBRstoreidx) 14317 v.AuxInt = i - 1 14318 v.Aux = s 14319 v.AddArg(p) 14320 v.AddArg(idx) 14321 v.AddArg(w) 14322 v.AddArg(mem) 14323 return true 14324 } 14325 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 14326 // cond: x.Uses == 1 && clobber(x) 14327 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14328 for { 14329 i := v.AuxInt 14330 s := v.Aux 14331 _ = v.Args[3] 14332 p := v.Args[0] 14333 idx := v.Args[1] 14334 v_2 := v.Args[2] 14335 if v_2.Op != OpS390XSRWconst { 14336 break 14337 } 14338 j := v_2.AuxInt 14339 w := v_2.Args[0] 14340 x := v.Args[3] 14341 if x.Op != OpS390XMOVBstoreidx { 14342 break 14343 } 14344 if x.AuxInt != i-1 { 14345 break 14346 } 14347 if x.Aux != s { 14348 break 14349 } 14350 _ = x.Args[3] 14351 if p != x.Args[0] { 14352 break 14353 } 14354 if idx != x.Args[1] { 14355 break 14356 } 14357 w0 := x.Args[2] 14358 if w0.Op != OpS390XSRWconst { 14359 break 14360 } 14361 if w0.AuxInt != j-8 { 14362 break 14363 } 14364 if w != w0.Args[0] { 14365 break 14366 } 14367 mem := x.Args[3] 14368 if !(x.Uses == 1 && clobber(x)) { 14369 break 14370 } 14371 v.reset(OpS390XMOVHBRstoreidx) 14372 v.AuxInt = i - 1 14373 v.Aux = s 14374 v.AddArg(p) 14375 v.AddArg(idx) 14376 v.AddArg(w0) 14377 v.AddArg(mem) 14378 return true 14379 } 14380 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 14381 // cond: x.Uses == 1 && clobber(x) 14382 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14383 for { 14384 i := v.AuxInt 14385 s := v.Aux 14386 _ = v.Args[3] 14387 p := v.Args[0] 14388 idx := v.Args[1] 14389 v_2 := v.Args[2] 14390 if v_2.Op != OpS390XSRWconst { 14391 break 14392 } 14393 j := v_2.AuxInt 14394 w := v_2.Args[0] 14395 x := v.Args[3] 14396 if x.Op != OpS390XMOVBstoreidx { 14397 break 14398 } 14399 if x.AuxInt != i-1 { 14400 break 14401 } 14402 if x.Aux != s { 14403 break 14404 } 14405 _ = x.Args[3] 14406 if idx != x.Args[0] { 14407 break 14408 } 14409 if p != x.Args[1] { 14410 break 14411 } 14412 w0 := x.Args[2] 14413 if w0.Op != OpS390XSRWconst { 14414 break 14415 } 14416 if w0.AuxInt != j-8 { 14417 break 14418 } 14419 if w != w0.Args[0] { 14420 break 14421 } 14422 mem := x.Args[3] 14423 if !(x.Uses == 1 && clobber(x)) { 14424 break 14425 } 14426 v.reset(OpS390XMOVHBRstoreidx) 14427 v.AuxInt = i - 1 14428 v.Aux = s 14429 v.AddArg(p) 14430 v.AddArg(idx) 14431 v.AddArg(w0) 14432 v.AddArg(mem) 14433 return true 14434 } 14435 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 14436 // cond: x.Uses == 1 && clobber(x) 14437 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14438 for { 14439 i := v.AuxInt 14440 s := v.Aux 14441 _ = v.Args[3] 14442 idx := v.Args[0] 14443 p := v.Args[1] 14444 v_2 := v.Args[2] 14445 if v_2.Op != OpS390XSRWconst { 14446 break 14447 } 14448 j := v_2.AuxInt 14449 w := v_2.Args[0] 14450 x := v.Args[3] 14451 if x.Op != OpS390XMOVBstoreidx { 14452 break 14453 } 14454 if x.AuxInt != i-1 { 14455 break 14456 } 14457 if x.Aux != s { 14458 break 14459 } 14460 _ = x.Args[3] 14461 if p != x.Args[0] { 14462 break 14463 } 14464 if idx != x.Args[1] { 14465 break 14466 } 14467 w0 := x.Args[2] 14468 if w0.Op != OpS390XSRWconst { 14469 break 14470 } 14471 if w0.AuxInt != j-8 { 14472 break 14473 } 14474 if w != w0.Args[0] { 14475 break 14476 } 14477 mem := x.Args[3] 14478 if !(x.Uses == 1 && clobber(x)) { 14479 break 14480 } 14481 v.reset(OpS390XMOVHBRstoreidx) 14482 v.AuxInt = i - 1 14483 v.Aux = s 14484 v.AddArg(p) 14485 v.AddArg(idx) 14486 v.AddArg(w0) 14487 v.AddArg(mem) 14488 return true 14489 } 14490 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 14491 // cond: x.Uses == 1 && clobber(x) 14492 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 14493 for { 14494 i := v.AuxInt 14495 s := v.Aux 14496 _ = v.Args[3] 14497 idx := v.Args[0] 14498 p := v.Args[1] 14499 v_2 := v.Args[2] 14500 if v_2.Op != OpS390XSRWconst { 14501 break 14502 } 14503 j := v_2.AuxInt 14504 w := v_2.Args[0] 14505 x := v.Args[3] 14506 if x.Op != OpS390XMOVBstoreidx { 14507 break 14508 } 14509 if x.AuxInt != i-1 { 14510 break 14511 } 14512 if x.Aux != s { 14513 break 14514 } 14515 _ = x.Args[3] 14516 if idx != x.Args[0] { 14517 break 14518 } 14519 if p != x.Args[1] { 14520 break 14521 } 14522 w0 := x.Args[2] 14523 if w0.Op != OpS390XSRWconst { 14524 break 14525 } 14526 if w0.AuxInt != j-8 { 14527 break 14528 } 14529 if w != w0.Args[0] { 14530 break 14531 } 14532 mem := x.Args[3] 14533 if !(x.Uses == 1 && clobber(x)) { 14534 break 14535 } 14536 v.reset(OpS390XMOVHBRstoreidx) 14537 v.AuxInt = i - 1 14538 v.Aux = s 14539 v.AddArg(p) 14540 v.AddArg(idx) 14541 v.AddArg(w0) 14542 v.AddArg(mem) 14543 return true 14544 } 14545 return false 14546 } 14547 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 14548 // match: (MOVDEQ x y (InvertFlags cmp)) 14549 // cond: 14550 // result: (MOVDEQ x y cmp) 14551 for { 14552 _ = v.Args[2] 14553 x := v.Args[0] 14554 y := v.Args[1] 14555 v_2 := v.Args[2] 14556 if v_2.Op != OpS390XInvertFlags { 14557 break 14558 } 14559 cmp := v_2.Args[0] 14560 v.reset(OpS390XMOVDEQ) 14561 v.AddArg(x) 14562 v.AddArg(y) 14563 v.AddArg(cmp) 14564 return true 14565 } 14566 // match: (MOVDEQ _ x (FlagEQ)) 14567 // cond: 14568 // result: x 14569 for { 14570 _ = v.Args[2] 14571 x := v.Args[1] 14572 v_2 := v.Args[2] 14573 if v_2.Op != OpS390XFlagEQ { 14574 break 14575 } 14576 v.reset(OpCopy) 14577 v.Type = x.Type 14578 v.AddArg(x) 14579 return true 14580 } 14581 // match: (MOVDEQ y _ (FlagLT)) 14582 // cond: 14583 // result: y 14584 for { 14585 _ = v.Args[2] 14586 y := v.Args[0] 14587 v_2 := v.Args[2] 14588 if v_2.Op != OpS390XFlagLT { 14589 break 14590 } 14591 v.reset(OpCopy) 14592 v.Type = y.Type 14593 v.AddArg(y) 14594 return true 14595 } 14596 // match: (MOVDEQ y _ (FlagGT)) 14597 // cond: 14598 // result: y 14599 for { 14600 _ = v.Args[2] 14601 y := v.Args[0] 14602 v_2 := v.Args[2] 14603 if v_2.Op != OpS390XFlagGT { 14604 break 14605 } 14606 v.reset(OpCopy) 14607 v.Type = y.Type 14608 v.AddArg(y) 14609 return true 14610 } 14611 return false 14612 } 14613 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 14614 // match: (MOVDGE x y (InvertFlags cmp)) 14615 // cond: 14616 // result: (MOVDLE x y cmp) 14617 for { 14618 _ = v.Args[2] 14619 x := v.Args[0] 14620 y := v.Args[1] 14621 v_2 := v.Args[2] 14622 if v_2.Op != OpS390XInvertFlags { 14623 break 14624 } 14625 cmp := v_2.Args[0] 14626 v.reset(OpS390XMOVDLE) 14627 v.AddArg(x) 14628 v.AddArg(y) 14629 v.AddArg(cmp) 14630 return true 14631 } 14632 // match: (MOVDGE _ x (FlagEQ)) 14633 // cond: 14634 // result: x 14635 for { 14636 _ = v.Args[2] 14637 x := v.Args[1] 14638 v_2 := v.Args[2] 14639 if v_2.Op != OpS390XFlagEQ { 14640 break 14641 } 14642 v.reset(OpCopy) 14643 v.Type = x.Type 14644 v.AddArg(x) 14645 return true 14646 } 14647 // match: (MOVDGE y _ (FlagLT)) 14648 // cond: 14649 // result: y 14650 for { 14651 _ = v.Args[2] 14652 y := v.Args[0] 14653 v_2 := v.Args[2] 14654 if v_2.Op != OpS390XFlagLT { 14655 break 14656 } 14657 v.reset(OpCopy) 14658 v.Type = y.Type 14659 v.AddArg(y) 14660 return true 14661 } 14662 // match: (MOVDGE _ x (FlagGT)) 14663 // cond: 14664 // result: x 14665 for { 14666 _ = v.Args[2] 14667 x := v.Args[1] 14668 v_2 := v.Args[2] 14669 if v_2.Op != OpS390XFlagGT { 14670 break 14671 } 14672 v.reset(OpCopy) 14673 v.Type = x.Type 14674 v.AddArg(x) 14675 return true 14676 } 14677 return false 14678 } 14679 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 14680 // match: (MOVDGT x y (InvertFlags cmp)) 14681 // cond: 14682 // result: (MOVDLT x y cmp) 14683 for { 14684 _ = v.Args[2] 14685 x := v.Args[0] 14686 y := v.Args[1] 14687 v_2 := v.Args[2] 14688 if v_2.Op != OpS390XInvertFlags { 14689 break 14690 } 14691 cmp := v_2.Args[0] 14692 v.reset(OpS390XMOVDLT) 14693 v.AddArg(x) 14694 v.AddArg(y) 14695 v.AddArg(cmp) 14696 return true 14697 } 14698 // match: (MOVDGT y _ (FlagEQ)) 14699 // cond: 14700 // result: y 14701 for { 14702 _ = v.Args[2] 14703 y := v.Args[0] 14704 v_2 := v.Args[2] 14705 if v_2.Op != OpS390XFlagEQ { 14706 break 14707 } 14708 v.reset(OpCopy) 14709 v.Type = y.Type 14710 v.AddArg(y) 14711 return true 14712 } 14713 // match: (MOVDGT y _ (FlagLT)) 14714 // cond: 14715 // result: y 14716 for { 14717 _ = v.Args[2] 14718 y := v.Args[0] 14719 v_2 := v.Args[2] 14720 if v_2.Op != OpS390XFlagLT { 14721 break 14722 } 14723 v.reset(OpCopy) 14724 v.Type = y.Type 14725 v.AddArg(y) 14726 return true 14727 } 14728 // match: (MOVDGT _ x (FlagGT)) 14729 // cond: 14730 // result: x 14731 for { 14732 _ = v.Args[2] 14733 x := v.Args[1] 14734 v_2 := v.Args[2] 14735 if v_2.Op != OpS390XFlagGT { 14736 break 14737 } 14738 v.reset(OpCopy) 14739 v.Type = x.Type 14740 v.AddArg(x) 14741 return true 14742 } 14743 return false 14744 } 14745 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 14746 // match: (MOVDLE x y (InvertFlags cmp)) 14747 // cond: 14748 // result: (MOVDGE x y cmp) 14749 for { 14750 _ = v.Args[2] 14751 x := v.Args[0] 14752 y := v.Args[1] 14753 v_2 := v.Args[2] 14754 if v_2.Op != OpS390XInvertFlags { 14755 break 14756 } 14757 cmp := v_2.Args[0] 14758 v.reset(OpS390XMOVDGE) 14759 v.AddArg(x) 14760 v.AddArg(y) 14761 v.AddArg(cmp) 14762 return true 14763 } 14764 // match: (MOVDLE _ x (FlagEQ)) 14765 // cond: 14766 // result: x 14767 for { 14768 _ = v.Args[2] 14769 x := v.Args[1] 14770 v_2 := v.Args[2] 14771 if v_2.Op != OpS390XFlagEQ { 14772 break 14773 } 14774 v.reset(OpCopy) 14775 v.Type = x.Type 14776 v.AddArg(x) 14777 return true 14778 } 14779 // match: (MOVDLE _ x (FlagLT)) 14780 // cond: 14781 // result: x 14782 for { 14783 _ = v.Args[2] 14784 x := v.Args[1] 14785 v_2 := v.Args[2] 14786 if v_2.Op != OpS390XFlagLT { 14787 break 14788 } 14789 v.reset(OpCopy) 14790 v.Type = x.Type 14791 v.AddArg(x) 14792 return true 14793 } 14794 // match: (MOVDLE y _ (FlagGT)) 14795 // cond: 14796 // result: y 14797 for { 14798 _ = v.Args[2] 14799 y := v.Args[0] 14800 v_2 := v.Args[2] 14801 if v_2.Op != OpS390XFlagGT { 14802 break 14803 } 14804 v.reset(OpCopy) 14805 v.Type = y.Type 14806 v.AddArg(y) 14807 return true 14808 } 14809 return false 14810 } 14811 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 14812 // match: (MOVDLT x y (InvertFlags cmp)) 14813 // cond: 14814 // result: (MOVDGT x y cmp) 14815 for { 14816 _ = v.Args[2] 14817 x := v.Args[0] 14818 y := v.Args[1] 14819 v_2 := v.Args[2] 14820 if v_2.Op != OpS390XInvertFlags { 14821 break 14822 } 14823 cmp := v_2.Args[0] 14824 v.reset(OpS390XMOVDGT) 14825 v.AddArg(x) 14826 v.AddArg(y) 14827 v.AddArg(cmp) 14828 return true 14829 } 14830 // match: (MOVDLT y _ (FlagEQ)) 14831 // cond: 14832 // result: y 14833 for { 14834 _ = v.Args[2] 14835 y := v.Args[0] 14836 v_2 := v.Args[2] 14837 if v_2.Op != OpS390XFlagEQ { 14838 break 14839 } 14840 v.reset(OpCopy) 14841 v.Type = y.Type 14842 v.AddArg(y) 14843 return true 14844 } 14845 // match: (MOVDLT _ x (FlagLT)) 14846 // cond: 14847 // result: x 14848 for { 14849 _ = v.Args[2] 14850 x := v.Args[1] 14851 v_2 := v.Args[2] 14852 if v_2.Op != OpS390XFlagLT { 14853 break 14854 } 14855 v.reset(OpCopy) 14856 v.Type = x.Type 14857 v.AddArg(x) 14858 return true 14859 } 14860 // match: (MOVDLT y _ (FlagGT)) 14861 // cond: 14862 // result: y 14863 for { 14864 _ = v.Args[2] 14865 y := v.Args[0] 14866 v_2 := v.Args[2] 14867 if v_2.Op != OpS390XFlagGT { 14868 break 14869 } 14870 v.reset(OpCopy) 14871 v.Type = y.Type 14872 v.AddArg(y) 14873 return true 14874 } 14875 return false 14876 } 14877 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 14878 // match: (MOVDNE x y (InvertFlags cmp)) 14879 // cond: 14880 // result: (MOVDNE x y cmp) 14881 for { 14882 _ = v.Args[2] 14883 x := v.Args[0] 14884 y := v.Args[1] 14885 v_2 := v.Args[2] 14886 if v_2.Op != OpS390XInvertFlags { 14887 break 14888 } 14889 cmp := v_2.Args[0] 14890 v.reset(OpS390XMOVDNE) 14891 v.AddArg(x) 14892 v.AddArg(y) 14893 v.AddArg(cmp) 14894 return true 14895 } 14896 // match: (MOVDNE y _ (FlagEQ)) 14897 // cond: 14898 // result: y 14899 for { 14900 _ = v.Args[2] 14901 y := v.Args[0] 14902 v_2 := v.Args[2] 14903 if v_2.Op != OpS390XFlagEQ { 14904 break 14905 } 14906 v.reset(OpCopy) 14907 v.Type = y.Type 14908 v.AddArg(y) 14909 return true 14910 } 14911 // match: (MOVDNE _ x (FlagLT)) 14912 // cond: 14913 // result: x 14914 for { 14915 _ = v.Args[2] 14916 x := v.Args[1] 14917 v_2 := v.Args[2] 14918 if v_2.Op != OpS390XFlagLT { 14919 break 14920 } 14921 v.reset(OpCopy) 14922 v.Type = x.Type 14923 v.AddArg(x) 14924 return true 14925 } 14926 // match: (MOVDNE _ x (FlagGT)) 14927 // cond: 14928 // result: x 14929 for { 14930 _ = v.Args[2] 14931 x := v.Args[1] 14932 v_2 := v.Args[2] 14933 if v_2.Op != OpS390XFlagGT { 14934 break 14935 } 14936 v.reset(OpCopy) 14937 v.Type = x.Type 14938 v.AddArg(x) 14939 return true 14940 } 14941 return false 14942 } 14943 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 14944 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 14945 // cond: is20Bit(c+d) && x.Op != OpSB 14946 // result: (MOVDaddridx [c+d] {s} x y) 14947 for { 14948 c := v.AuxInt 14949 s := v.Aux 14950 _ = v.Args[1] 14951 v_0 := v.Args[0] 14952 if v_0.Op != OpS390XADDconst { 14953 break 14954 } 14955 d := v_0.AuxInt 14956 x := v_0.Args[0] 14957 y := v.Args[1] 14958 if !(is20Bit(c+d) && x.Op != OpSB) { 14959 break 14960 } 14961 v.reset(OpS390XMOVDaddridx) 14962 v.AuxInt = c + d 14963 v.Aux = s 14964 v.AddArg(x) 14965 v.AddArg(y) 14966 return true 14967 } 14968 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 14969 // cond: is20Bit(c+d) && y.Op != OpSB 14970 // result: (MOVDaddridx [c+d] {s} x y) 14971 for { 14972 c := v.AuxInt 14973 s := v.Aux 14974 _ = v.Args[1] 14975 x := v.Args[0] 14976 v_1 := v.Args[1] 14977 if v_1.Op != OpS390XADDconst { 14978 break 14979 } 14980 d := v_1.AuxInt 14981 y := v_1.Args[0] 14982 if !(is20Bit(c+d) && y.Op != OpSB) { 14983 break 14984 } 14985 v.reset(OpS390XMOVDaddridx) 14986 v.AuxInt = c + d 14987 v.Aux = s 14988 v.AddArg(x) 14989 v.AddArg(y) 14990 return true 14991 } 14992 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 14993 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 14994 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 14995 for { 14996 off1 := v.AuxInt 14997 sym1 := v.Aux 14998 _ = v.Args[1] 14999 v_0 := v.Args[0] 15000 if v_0.Op != OpS390XMOVDaddr { 15001 break 15002 } 15003 off2 := v_0.AuxInt 15004 sym2 := v_0.Aux 15005 x := v_0.Args[0] 15006 y := v.Args[1] 15007 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 15008 break 15009 } 15010 v.reset(OpS390XMOVDaddridx) 15011 v.AuxInt = off1 + off2 15012 v.Aux = mergeSym(sym1, sym2) 15013 v.AddArg(x) 15014 v.AddArg(y) 15015 return true 15016 } 15017 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 15018 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 15019 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 15020 for { 15021 off1 := v.AuxInt 15022 sym1 := v.Aux 15023 _ = v.Args[1] 15024 x := v.Args[0] 15025 v_1 := v.Args[1] 15026 if v_1.Op != OpS390XMOVDaddr { 15027 break 15028 } 15029 off2 := v_1.AuxInt 15030 sym2 := v_1.Aux 15031 y := v_1.Args[0] 15032 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 15033 break 15034 } 15035 v.reset(OpS390XMOVDaddridx) 15036 v.AuxInt = off1 + off2 15037 v.Aux = mergeSym(sym1, sym2) 15038 v.AddArg(x) 15039 v.AddArg(y) 15040 return true 15041 } 15042 return false 15043 } 15044 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 15045 // match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 15046 // cond: isSamePtr(ptr1, ptr2) 15047 // result: (MOVDreg x) 15048 for { 15049 off := v.AuxInt 15050 sym := v.Aux 15051 _ = v.Args[1] 15052 ptr1 := v.Args[0] 15053 v_1 := v.Args[1] 15054 if v_1.Op != OpS390XMOVDstore { 15055 break 15056 } 15057 if v_1.AuxInt != off { 15058 break 15059 } 15060 if v_1.Aux != sym { 15061 break 15062 } 15063 _ = v_1.Args[2] 15064 ptr2 := v_1.Args[0] 15065 x := v_1.Args[1] 15066 if !(isSamePtr(ptr1, ptr2)) { 15067 break 15068 } 15069 v.reset(OpS390XMOVDreg) 15070 v.AddArg(x) 15071 return true 15072 } 15073 // match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 15074 // cond: isSamePtr(ptr1, ptr2) 15075 // result: (LGDR x) 15076 for { 15077 off := v.AuxInt 15078 sym := v.Aux 15079 _ = v.Args[1] 15080 ptr1 := v.Args[0] 15081 v_1 := v.Args[1] 15082 if v_1.Op != OpS390XFMOVDstore { 15083 break 15084 } 15085 if v_1.AuxInt != off { 15086 break 15087 } 15088 if v_1.Aux != sym { 15089 break 15090 } 15091 _ = v_1.Args[2] 15092 ptr2 := v_1.Args[0] 15093 x := v_1.Args[1] 15094 if !(isSamePtr(ptr1, ptr2)) { 15095 break 15096 } 15097 v.reset(OpS390XLGDR) 15098 v.AddArg(x) 15099 return true 15100 } 15101 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 15102 // cond: is20Bit(off1+off2) 15103 // result: (MOVDload [off1+off2] {sym} ptr mem) 15104 for { 15105 off1 := v.AuxInt 15106 sym := v.Aux 15107 _ = v.Args[1] 15108 v_0 := v.Args[0] 15109 if v_0.Op != OpS390XADDconst { 15110 break 15111 } 15112 off2 := v_0.AuxInt 15113 ptr := v_0.Args[0] 15114 mem := v.Args[1] 15115 if !(is20Bit(off1 + off2)) { 15116 break 15117 } 15118 v.reset(OpS390XMOVDload) 15119 v.AuxInt = off1 + off2 15120 v.Aux = sym 15121 v.AddArg(ptr) 15122 v.AddArg(mem) 15123 return true 15124 } 15125 // match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 15126 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 15127 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 15128 for { 15129 off1 := v.AuxInt 15130 sym1 := v.Aux 15131 _ = v.Args[1] 15132 v_0 := v.Args[0] 15133 if v_0.Op != OpS390XMOVDaddr { 15134 break 15135 } 15136 t := v_0.Type 15137 off2 := v_0.AuxInt 15138 sym2 := v_0.Aux 15139 base := v_0.Args[0] 15140 mem := v.Args[1] 15141 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 15142 break 15143 } 15144 v.reset(OpS390XMOVDload) 15145 v.AuxInt = off1 + off2 15146 v.Aux = mergeSym(sym1, sym2) 15147 v.AddArg(base) 15148 v.AddArg(mem) 15149 return true 15150 } 15151 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 15152 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15153 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 15154 for { 15155 off1 := v.AuxInt 15156 sym1 := v.Aux 15157 _ = v.Args[1] 15158 v_0 := v.Args[0] 15159 if v_0.Op != OpS390XMOVDaddridx { 15160 break 15161 } 15162 off2 := v_0.AuxInt 15163 sym2 := v_0.Aux 15164 _ = v_0.Args[1] 15165 ptr := v_0.Args[0] 15166 idx := v_0.Args[1] 15167 mem := v.Args[1] 15168 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15169 break 15170 } 15171 v.reset(OpS390XMOVDloadidx) 15172 v.AuxInt = off1 + off2 15173 v.Aux = mergeSym(sym1, sym2) 15174 v.AddArg(ptr) 15175 v.AddArg(idx) 15176 v.AddArg(mem) 15177 return true 15178 } 15179 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 15180 // cond: ptr.Op != OpSB 15181 // result: (MOVDloadidx [off] {sym} ptr idx mem) 15182 for { 15183 off := v.AuxInt 15184 sym := v.Aux 15185 _ = v.Args[1] 15186 v_0 := v.Args[0] 15187 if v_0.Op != OpS390XADD { 15188 break 15189 } 15190 _ = v_0.Args[1] 15191 ptr := v_0.Args[0] 15192 idx := v_0.Args[1] 15193 mem := v.Args[1] 15194 if !(ptr.Op != OpSB) { 15195 break 15196 } 15197 v.reset(OpS390XMOVDloadidx) 15198 v.AuxInt = off 15199 v.Aux = sym 15200 v.AddArg(ptr) 15201 v.AddArg(idx) 15202 v.AddArg(mem) 15203 return true 15204 } 15205 return false 15206 } 15207 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 15208 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 15209 // cond: is20Bit(c+d) 15210 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15211 for { 15212 c := v.AuxInt 15213 sym := v.Aux 15214 _ = v.Args[2] 15215 v_0 := v.Args[0] 15216 if v_0.Op != OpS390XADDconst { 15217 break 15218 } 15219 d := v_0.AuxInt 15220 ptr := v_0.Args[0] 15221 idx := v.Args[1] 15222 mem := v.Args[2] 15223 if !(is20Bit(c + d)) { 15224 break 15225 } 15226 v.reset(OpS390XMOVDloadidx) 15227 v.AuxInt = c + d 15228 v.Aux = sym 15229 v.AddArg(ptr) 15230 v.AddArg(idx) 15231 v.AddArg(mem) 15232 return true 15233 } 15234 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 15235 // cond: is20Bit(c+d) 15236 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15237 for { 15238 c := v.AuxInt 15239 sym := v.Aux 15240 _ = v.Args[2] 15241 idx := v.Args[0] 15242 v_1 := v.Args[1] 15243 if v_1.Op != OpS390XADDconst { 15244 break 15245 } 15246 d := v_1.AuxInt 15247 ptr := v_1.Args[0] 15248 mem := v.Args[2] 15249 if !(is20Bit(c + d)) { 15250 break 15251 } 15252 v.reset(OpS390XMOVDloadidx) 15253 v.AuxInt = c + d 15254 v.Aux = sym 15255 v.AddArg(ptr) 15256 v.AddArg(idx) 15257 v.AddArg(mem) 15258 return true 15259 } 15260 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 15261 // cond: is20Bit(c+d) 15262 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15263 for { 15264 c := v.AuxInt 15265 sym := v.Aux 15266 _ = v.Args[2] 15267 ptr := v.Args[0] 15268 v_1 := v.Args[1] 15269 if v_1.Op != OpS390XADDconst { 15270 break 15271 } 15272 d := v_1.AuxInt 15273 idx := v_1.Args[0] 15274 mem := v.Args[2] 15275 if !(is20Bit(c + d)) { 15276 break 15277 } 15278 v.reset(OpS390XMOVDloadidx) 15279 v.AuxInt = c + d 15280 v.Aux = sym 15281 v.AddArg(ptr) 15282 v.AddArg(idx) 15283 v.AddArg(mem) 15284 return true 15285 } 15286 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 15287 // cond: is20Bit(c+d) 15288 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 15289 for { 15290 c := v.AuxInt 15291 sym := v.Aux 15292 _ = v.Args[2] 15293 v_0 := v.Args[0] 15294 if v_0.Op != OpS390XADDconst { 15295 break 15296 } 15297 d := v_0.AuxInt 15298 idx := v_0.Args[0] 15299 ptr := v.Args[1] 15300 mem := v.Args[2] 15301 if !(is20Bit(c + d)) { 15302 break 15303 } 15304 v.reset(OpS390XMOVDloadidx) 15305 v.AuxInt = c + d 15306 v.Aux = sym 15307 v.AddArg(ptr) 15308 v.AddArg(idx) 15309 v.AddArg(mem) 15310 return true 15311 } 15312 return false 15313 } 15314 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 15315 b := v.Block 15316 _ = b 15317 // match: (MOVDnop <t> x) 15318 // cond: t.Compare(x.Type) == types.CMPeq 15319 // result: x 15320 for { 15321 t := v.Type 15322 x := v.Args[0] 15323 if !(t.Compare(x.Type) == types.CMPeq) { 15324 break 15325 } 15326 v.reset(OpCopy) 15327 v.Type = x.Type 15328 v.AddArg(x) 15329 return true 15330 } 15331 // match: (MOVDnop (MOVDconst [c])) 15332 // cond: 15333 // result: (MOVDconst [c]) 15334 for { 15335 v_0 := v.Args[0] 15336 if v_0.Op != OpS390XMOVDconst { 15337 break 15338 } 15339 c := v_0.AuxInt 15340 v.reset(OpS390XMOVDconst) 15341 v.AuxInt = c 15342 return true 15343 } 15344 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 15345 // cond: x.Uses == 1 && clobber(x) 15346 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 15347 for { 15348 t := v.Type 15349 x := v.Args[0] 15350 if x.Op != OpS390XMOVBZload { 15351 break 15352 } 15353 off := x.AuxInt 15354 sym := x.Aux 15355 _ = x.Args[1] 15356 ptr := x.Args[0] 15357 mem := x.Args[1] 15358 if !(x.Uses == 1 && clobber(x)) { 15359 break 15360 } 15361 b = x.Block 15362 v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, t) 15363 v.reset(OpCopy) 15364 v.AddArg(v0) 15365 v0.AuxInt = off 15366 v0.Aux = sym 15367 v0.AddArg(ptr) 15368 v0.AddArg(mem) 15369 return true 15370 } 15371 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 15372 // cond: x.Uses == 1 && clobber(x) 15373 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 15374 for { 15375 t := v.Type 15376 x := v.Args[0] 15377 if x.Op != OpS390XMOVBload { 15378 break 15379 } 15380 off := x.AuxInt 15381 sym := x.Aux 15382 _ = x.Args[1] 15383 ptr := x.Args[0] 15384 mem := x.Args[1] 15385 if !(x.Uses == 1 && clobber(x)) { 15386 break 15387 } 15388 b = x.Block 15389 v0 := b.NewValue0(x.Pos, OpS390XMOVBload, t) 15390 v.reset(OpCopy) 15391 v.AddArg(v0) 15392 v0.AuxInt = off 15393 v0.Aux = sym 15394 v0.AddArg(ptr) 15395 v0.AddArg(mem) 15396 return true 15397 } 15398 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 15399 // cond: x.Uses == 1 && clobber(x) 15400 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 15401 for { 15402 t := v.Type 15403 x := v.Args[0] 15404 if x.Op != OpS390XMOVHZload { 15405 break 15406 } 15407 off := x.AuxInt 15408 sym := x.Aux 15409 _ = x.Args[1] 15410 ptr := x.Args[0] 15411 mem := x.Args[1] 15412 if !(x.Uses == 1 && clobber(x)) { 15413 break 15414 } 15415 b = x.Block 15416 v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, t) 15417 v.reset(OpCopy) 15418 v.AddArg(v0) 15419 v0.AuxInt = off 15420 v0.Aux = sym 15421 v0.AddArg(ptr) 15422 v0.AddArg(mem) 15423 return true 15424 } 15425 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 15426 // cond: x.Uses == 1 && clobber(x) 15427 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 15428 for { 15429 t := v.Type 15430 x := v.Args[0] 15431 if x.Op != OpS390XMOVHload { 15432 break 15433 } 15434 off := x.AuxInt 15435 sym := x.Aux 15436 _ = x.Args[1] 15437 ptr := x.Args[0] 15438 mem := x.Args[1] 15439 if !(x.Uses == 1 && clobber(x)) { 15440 break 15441 } 15442 b = x.Block 15443 v0 := b.NewValue0(x.Pos, OpS390XMOVHload, t) 15444 v.reset(OpCopy) 15445 v.AddArg(v0) 15446 v0.AuxInt = off 15447 v0.Aux = sym 15448 v0.AddArg(ptr) 15449 v0.AddArg(mem) 15450 return true 15451 } 15452 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 15453 // cond: x.Uses == 1 && clobber(x) 15454 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 15455 for { 15456 t := v.Type 15457 x := v.Args[0] 15458 if x.Op != OpS390XMOVWZload { 15459 break 15460 } 15461 off := x.AuxInt 15462 sym := x.Aux 15463 _ = x.Args[1] 15464 ptr := x.Args[0] 15465 mem := x.Args[1] 15466 if !(x.Uses == 1 && clobber(x)) { 15467 break 15468 } 15469 b = x.Block 15470 v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, t) 15471 v.reset(OpCopy) 15472 v.AddArg(v0) 15473 v0.AuxInt = off 15474 v0.Aux = sym 15475 v0.AddArg(ptr) 15476 v0.AddArg(mem) 15477 return true 15478 } 15479 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 15480 // cond: x.Uses == 1 && clobber(x) 15481 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 15482 for { 15483 t := v.Type 15484 x := v.Args[0] 15485 if x.Op != OpS390XMOVWload { 15486 break 15487 } 15488 off := x.AuxInt 15489 sym := x.Aux 15490 _ = x.Args[1] 15491 ptr := x.Args[0] 15492 mem := x.Args[1] 15493 if !(x.Uses == 1 && clobber(x)) { 15494 break 15495 } 15496 b = x.Block 15497 v0 := b.NewValue0(x.Pos, OpS390XMOVWload, t) 15498 v.reset(OpCopy) 15499 v.AddArg(v0) 15500 v0.AuxInt = off 15501 v0.Aux = sym 15502 v0.AddArg(ptr) 15503 v0.AddArg(mem) 15504 return true 15505 } 15506 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 15507 // cond: x.Uses == 1 && clobber(x) 15508 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 15509 for { 15510 t := v.Type 15511 x := v.Args[0] 15512 if x.Op != OpS390XMOVDload { 15513 break 15514 } 15515 off := x.AuxInt 15516 sym := x.Aux 15517 _ = x.Args[1] 15518 ptr := x.Args[0] 15519 mem := x.Args[1] 15520 if !(x.Uses == 1 && clobber(x)) { 15521 break 15522 } 15523 b = x.Block 15524 v0 := b.NewValue0(x.Pos, OpS390XMOVDload, t) 15525 v.reset(OpCopy) 15526 v.AddArg(v0) 15527 v0.AuxInt = off 15528 v0.Aux = sym 15529 v0.AddArg(ptr) 15530 v0.AddArg(mem) 15531 return true 15532 } 15533 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 15534 // cond: x.Uses == 1 && clobber(x) 15535 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 15536 for { 15537 t := v.Type 15538 x := v.Args[0] 15539 if x.Op != OpS390XMOVBZloadidx { 15540 break 15541 } 15542 off := x.AuxInt 15543 sym := x.Aux 15544 _ = x.Args[2] 15545 ptr := x.Args[0] 15546 idx := x.Args[1] 15547 mem := x.Args[2] 15548 if !(x.Uses == 1 && clobber(x)) { 15549 break 15550 } 15551 b = x.Block 15552 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 15553 v.reset(OpCopy) 15554 v.AddArg(v0) 15555 v0.AuxInt = off 15556 v0.Aux = sym 15557 v0.AddArg(ptr) 15558 v0.AddArg(idx) 15559 v0.AddArg(mem) 15560 return true 15561 } 15562 return false 15563 } 15564 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 15565 b := v.Block 15566 _ = b 15567 // match: (MOVDnop <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 15568 // cond: x.Uses == 1 && clobber(x) 15569 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 15570 for { 15571 t := v.Type 15572 x := v.Args[0] 15573 if x.Op != OpS390XMOVBloadidx { 15574 break 15575 } 15576 off := x.AuxInt 15577 sym := x.Aux 15578 _ = x.Args[2] 15579 ptr := x.Args[0] 15580 idx := x.Args[1] 15581 mem := x.Args[2] 15582 if !(x.Uses == 1 && clobber(x)) { 15583 break 15584 } 15585 b = x.Block 15586 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 15587 v.reset(OpCopy) 15588 v.AddArg(v0) 15589 v0.AuxInt = off 15590 v0.Aux = sym 15591 v0.AddArg(ptr) 15592 v0.AddArg(idx) 15593 v0.AddArg(mem) 15594 return true 15595 } 15596 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 15597 // cond: x.Uses == 1 && clobber(x) 15598 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 15599 for { 15600 t := v.Type 15601 x := v.Args[0] 15602 if x.Op != OpS390XMOVHZloadidx { 15603 break 15604 } 15605 off := x.AuxInt 15606 sym := x.Aux 15607 _ = x.Args[2] 15608 ptr := x.Args[0] 15609 idx := x.Args[1] 15610 mem := x.Args[2] 15611 if !(x.Uses == 1 && clobber(x)) { 15612 break 15613 } 15614 b = x.Block 15615 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 15616 v.reset(OpCopy) 15617 v.AddArg(v0) 15618 v0.AuxInt = off 15619 v0.Aux = sym 15620 v0.AddArg(ptr) 15621 v0.AddArg(idx) 15622 v0.AddArg(mem) 15623 return true 15624 } 15625 // match: (MOVDnop <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 15626 // cond: x.Uses == 1 && clobber(x) 15627 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 15628 for { 15629 t := v.Type 15630 x := v.Args[0] 15631 if x.Op != OpS390XMOVHloadidx { 15632 break 15633 } 15634 off := x.AuxInt 15635 sym := x.Aux 15636 _ = x.Args[2] 15637 ptr := x.Args[0] 15638 idx := x.Args[1] 15639 mem := x.Args[2] 15640 if !(x.Uses == 1 && clobber(x)) { 15641 break 15642 } 15643 b = x.Block 15644 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 15645 v.reset(OpCopy) 15646 v.AddArg(v0) 15647 v0.AuxInt = off 15648 v0.Aux = sym 15649 v0.AddArg(ptr) 15650 v0.AddArg(idx) 15651 v0.AddArg(mem) 15652 return true 15653 } 15654 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 15655 // cond: x.Uses == 1 && clobber(x) 15656 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 15657 for { 15658 t := v.Type 15659 x := v.Args[0] 15660 if x.Op != OpS390XMOVWZloadidx { 15661 break 15662 } 15663 off := x.AuxInt 15664 sym := x.Aux 15665 _ = x.Args[2] 15666 ptr := x.Args[0] 15667 idx := x.Args[1] 15668 mem := x.Args[2] 15669 if !(x.Uses == 1 && clobber(x)) { 15670 break 15671 } 15672 b = x.Block 15673 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 15674 v.reset(OpCopy) 15675 v.AddArg(v0) 15676 v0.AuxInt = off 15677 v0.Aux = sym 15678 v0.AddArg(ptr) 15679 v0.AddArg(idx) 15680 v0.AddArg(mem) 15681 return true 15682 } 15683 // match: (MOVDnop <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 15684 // cond: x.Uses == 1 && clobber(x) 15685 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 15686 for { 15687 t := v.Type 15688 x := v.Args[0] 15689 if x.Op != OpS390XMOVWloadidx { 15690 break 15691 } 15692 off := x.AuxInt 15693 sym := x.Aux 15694 _ = x.Args[2] 15695 ptr := x.Args[0] 15696 idx := x.Args[1] 15697 mem := x.Args[2] 15698 if !(x.Uses == 1 && clobber(x)) { 15699 break 15700 } 15701 b = x.Block 15702 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 15703 v.reset(OpCopy) 15704 v.AddArg(v0) 15705 v0.AuxInt = off 15706 v0.Aux = sym 15707 v0.AddArg(ptr) 15708 v0.AddArg(idx) 15709 v0.AddArg(mem) 15710 return true 15711 } 15712 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 15713 // cond: x.Uses == 1 && clobber(x) 15714 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 15715 for { 15716 t := v.Type 15717 x := v.Args[0] 15718 if x.Op != OpS390XMOVDloadidx { 15719 break 15720 } 15721 off := x.AuxInt 15722 sym := x.Aux 15723 _ = x.Args[2] 15724 ptr := x.Args[0] 15725 idx := x.Args[1] 15726 mem := x.Args[2] 15727 if !(x.Uses == 1 && clobber(x)) { 15728 break 15729 } 15730 b = x.Block 15731 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 15732 v.reset(OpCopy) 15733 v.AddArg(v0) 15734 v0.AuxInt = off 15735 v0.Aux = sym 15736 v0.AddArg(ptr) 15737 v0.AddArg(idx) 15738 v0.AddArg(mem) 15739 return true 15740 } 15741 return false 15742 } 15743 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 15744 b := v.Block 15745 _ = b 15746 // match: (MOVDreg <t> x) 15747 // cond: t.Compare(x.Type) == types.CMPeq 15748 // result: x 15749 for { 15750 t := v.Type 15751 x := v.Args[0] 15752 if !(t.Compare(x.Type) == types.CMPeq) { 15753 break 15754 } 15755 v.reset(OpCopy) 15756 v.Type = x.Type 15757 v.AddArg(x) 15758 return true 15759 } 15760 // match: (MOVDreg (MOVDconst [c])) 15761 // cond: 15762 // result: (MOVDconst [c]) 15763 for { 15764 v_0 := v.Args[0] 15765 if v_0.Op != OpS390XMOVDconst { 15766 break 15767 } 15768 c := v_0.AuxInt 15769 v.reset(OpS390XMOVDconst) 15770 v.AuxInt = c 15771 return true 15772 } 15773 // match: (MOVDreg x) 15774 // cond: x.Uses == 1 15775 // result: (MOVDnop x) 15776 for { 15777 x := v.Args[0] 15778 if !(x.Uses == 1) { 15779 break 15780 } 15781 v.reset(OpS390XMOVDnop) 15782 v.AddArg(x) 15783 return true 15784 } 15785 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 15786 // cond: x.Uses == 1 && clobber(x) 15787 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 15788 for { 15789 t := v.Type 15790 x := v.Args[0] 15791 if x.Op != OpS390XMOVBZload { 15792 break 15793 } 15794 off := x.AuxInt 15795 sym := x.Aux 15796 _ = x.Args[1] 15797 ptr := x.Args[0] 15798 mem := x.Args[1] 15799 if !(x.Uses == 1 && clobber(x)) { 15800 break 15801 } 15802 b = x.Block 15803 v0 := b.NewValue0(x.Pos, OpS390XMOVBZload, t) 15804 v.reset(OpCopy) 15805 v.AddArg(v0) 15806 v0.AuxInt = off 15807 v0.Aux = sym 15808 v0.AddArg(ptr) 15809 v0.AddArg(mem) 15810 return true 15811 } 15812 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 15813 // cond: x.Uses == 1 && clobber(x) 15814 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 15815 for { 15816 t := v.Type 15817 x := v.Args[0] 15818 if x.Op != OpS390XMOVBload { 15819 break 15820 } 15821 off := x.AuxInt 15822 sym := x.Aux 15823 _ = x.Args[1] 15824 ptr := x.Args[0] 15825 mem := x.Args[1] 15826 if !(x.Uses == 1 && clobber(x)) { 15827 break 15828 } 15829 b = x.Block 15830 v0 := b.NewValue0(x.Pos, OpS390XMOVBload, t) 15831 v.reset(OpCopy) 15832 v.AddArg(v0) 15833 v0.AuxInt = off 15834 v0.Aux = sym 15835 v0.AddArg(ptr) 15836 v0.AddArg(mem) 15837 return true 15838 } 15839 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 15840 // cond: x.Uses == 1 && clobber(x) 15841 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 15842 for { 15843 t := v.Type 15844 x := v.Args[0] 15845 if x.Op != OpS390XMOVHZload { 15846 break 15847 } 15848 off := x.AuxInt 15849 sym := x.Aux 15850 _ = x.Args[1] 15851 ptr := x.Args[0] 15852 mem := x.Args[1] 15853 if !(x.Uses == 1 && clobber(x)) { 15854 break 15855 } 15856 b = x.Block 15857 v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, t) 15858 v.reset(OpCopy) 15859 v.AddArg(v0) 15860 v0.AuxInt = off 15861 v0.Aux = sym 15862 v0.AddArg(ptr) 15863 v0.AddArg(mem) 15864 return true 15865 } 15866 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 15867 // cond: x.Uses == 1 && clobber(x) 15868 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 15869 for { 15870 t := v.Type 15871 x := v.Args[0] 15872 if x.Op != OpS390XMOVHload { 15873 break 15874 } 15875 off := x.AuxInt 15876 sym := x.Aux 15877 _ = x.Args[1] 15878 ptr := x.Args[0] 15879 mem := x.Args[1] 15880 if !(x.Uses == 1 && clobber(x)) { 15881 break 15882 } 15883 b = x.Block 15884 v0 := b.NewValue0(x.Pos, OpS390XMOVHload, t) 15885 v.reset(OpCopy) 15886 v.AddArg(v0) 15887 v0.AuxInt = off 15888 v0.Aux = sym 15889 v0.AddArg(ptr) 15890 v0.AddArg(mem) 15891 return true 15892 } 15893 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 15894 // cond: x.Uses == 1 && clobber(x) 15895 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 15896 for { 15897 t := v.Type 15898 x := v.Args[0] 15899 if x.Op != OpS390XMOVWZload { 15900 break 15901 } 15902 off := x.AuxInt 15903 sym := x.Aux 15904 _ = x.Args[1] 15905 ptr := x.Args[0] 15906 mem := x.Args[1] 15907 if !(x.Uses == 1 && clobber(x)) { 15908 break 15909 } 15910 b = x.Block 15911 v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, t) 15912 v.reset(OpCopy) 15913 v.AddArg(v0) 15914 v0.AuxInt = off 15915 v0.Aux = sym 15916 v0.AddArg(ptr) 15917 v0.AddArg(mem) 15918 return true 15919 } 15920 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 15921 // cond: x.Uses == 1 && clobber(x) 15922 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 15923 for { 15924 t := v.Type 15925 x := v.Args[0] 15926 if x.Op != OpS390XMOVWload { 15927 break 15928 } 15929 off := x.AuxInt 15930 sym := x.Aux 15931 _ = x.Args[1] 15932 ptr := x.Args[0] 15933 mem := x.Args[1] 15934 if !(x.Uses == 1 && clobber(x)) { 15935 break 15936 } 15937 b = x.Block 15938 v0 := b.NewValue0(x.Pos, OpS390XMOVWload, t) 15939 v.reset(OpCopy) 15940 v.AddArg(v0) 15941 v0.AuxInt = off 15942 v0.Aux = sym 15943 v0.AddArg(ptr) 15944 v0.AddArg(mem) 15945 return true 15946 } 15947 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 15948 // cond: x.Uses == 1 && clobber(x) 15949 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 15950 for { 15951 t := v.Type 15952 x := v.Args[0] 15953 if x.Op != OpS390XMOVDload { 15954 break 15955 } 15956 off := x.AuxInt 15957 sym := x.Aux 15958 _ = x.Args[1] 15959 ptr := x.Args[0] 15960 mem := x.Args[1] 15961 if !(x.Uses == 1 && clobber(x)) { 15962 break 15963 } 15964 b = x.Block 15965 v0 := b.NewValue0(x.Pos, OpS390XMOVDload, t) 15966 v.reset(OpCopy) 15967 v.AddArg(v0) 15968 v0.AuxInt = off 15969 v0.Aux = sym 15970 v0.AddArg(ptr) 15971 v0.AddArg(mem) 15972 return true 15973 } 15974 return false 15975 } 15976 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 15977 b := v.Block 15978 _ = b 15979 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 15980 // cond: x.Uses == 1 && clobber(x) 15981 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 15982 for { 15983 t := v.Type 15984 x := v.Args[0] 15985 if x.Op != OpS390XMOVBZloadidx { 15986 break 15987 } 15988 off := x.AuxInt 15989 sym := x.Aux 15990 _ = x.Args[2] 15991 ptr := x.Args[0] 15992 idx := x.Args[1] 15993 mem := x.Args[2] 15994 if !(x.Uses == 1 && clobber(x)) { 15995 break 15996 } 15997 b = x.Block 15998 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 15999 v.reset(OpCopy) 16000 v.AddArg(v0) 16001 v0.AuxInt = off 16002 v0.Aux = sym 16003 v0.AddArg(ptr) 16004 v0.AddArg(idx) 16005 v0.AddArg(mem) 16006 return true 16007 } 16008 // match: (MOVDreg <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 16009 // cond: x.Uses == 1 && clobber(x) 16010 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 16011 for { 16012 t := v.Type 16013 x := v.Args[0] 16014 if x.Op != OpS390XMOVBloadidx { 16015 break 16016 } 16017 off := x.AuxInt 16018 sym := x.Aux 16019 _ = x.Args[2] 16020 ptr := x.Args[0] 16021 idx := x.Args[1] 16022 mem := x.Args[2] 16023 if !(x.Uses == 1 && clobber(x)) { 16024 break 16025 } 16026 b = x.Block 16027 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 16028 v.reset(OpCopy) 16029 v.AddArg(v0) 16030 v0.AuxInt = off 16031 v0.Aux = sym 16032 v0.AddArg(ptr) 16033 v0.AddArg(idx) 16034 v0.AddArg(mem) 16035 return true 16036 } 16037 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 16038 // cond: x.Uses == 1 && clobber(x) 16039 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 16040 for { 16041 t := v.Type 16042 x := v.Args[0] 16043 if x.Op != OpS390XMOVHZloadidx { 16044 break 16045 } 16046 off := x.AuxInt 16047 sym := x.Aux 16048 _ = x.Args[2] 16049 ptr := x.Args[0] 16050 idx := x.Args[1] 16051 mem := x.Args[2] 16052 if !(x.Uses == 1 && clobber(x)) { 16053 break 16054 } 16055 b = x.Block 16056 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 16057 v.reset(OpCopy) 16058 v.AddArg(v0) 16059 v0.AuxInt = off 16060 v0.Aux = sym 16061 v0.AddArg(ptr) 16062 v0.AddArg(idx) 16063 v0.AddArg(mem) 16064 return true 16065 } 16066 // match: (MOVDreg <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 16067 // cond: x.Uses == 1 && clobber(x) 16068 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 16069 for { 16070 t := v.Type 16071 x := v.Args[0] 16072 if x.Op != OpS390XMOVHloadidx { 16073 break 16074 } 16075 off := x.AuxInt 16076 sym := x.Aux 16077 _ = x.Args[2] 16078 ptr := x.Args[0] 16079 idx := x.Args[1] 16080 mem := x.Args[2] 16081 if !(x.Uses == 1 && clobber(x)) { 16082 break 16083 } 16084 b = x.Block 16085 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 16086 v.reset(OpCopy) 16087 v.AddArg(v0) 16088 v0.AuxInt = off 16089 v0.Aux = sym 16090 v0.AddArg(ptr) 16091 v0.AddArg(idx) 16092 v0.AddArg(mem) 16093 return true 16094 } 16095 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 16096 // cond: x.Uses == 1 && clobber(x) 16097 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 16098 for { 16099 t := v.Type 16100 x := v.Args[0] 16101 if x.Op != OpS390XMOVWZloadidx { 16102 break 16103 } 16104 off := x.AuxInt 16105 sym := x.Aux 16106 _ = x.Args[2] 16107 ptr := x.Args[0] 16108 idx := x.Args[1] 16109 mem := x.Args[2] 16110 if !(x.Uses == 1 && clobber(x)) { 16111 break 16112 } 16113 b = x.Block 16114 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 16115 v.reset(OpCopy) 16116 v.AddArg(v0) 16117 v0.AuxInt = off 16118 v0.Aux = sym 16119 v0.AddArg(ptr) 16120 v0.AddArg(idx) 16121 v0.AddArg(mem) 16122 return true 16123 } 16124 // match: (MOVDreg <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 16125 // cond: x.Uses == 1 && clobber(x) 16126 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 16127 for { 16128 t := v.Type 16129 x := v.Args[0] 16130 if x.Op != OpS390XMOVWloadidx { 16131 break 16132 } 16133 off := x.AuxInt 16134 sym := x.Aux 16135 _ = x.Args[2] 16136 ptr := x.Args[0] 16137 idx := x.Args[1] 16138 mem := x.Args[2] 16139 if !(x.Uses == 1 && clobber(x)) { 16140 break 16141 } 16142 b = x.Block 16143 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 16144 v.reset(OpCopy) 16145 v.AddArg(v0) 16146 v0.AuxInt = off 16147 v0.Aux = sym 16148 v0.AddArg(ptr) 16149 v0.AddArg(idx) 16150 v0.AddArg(mem) 16151 return true 16152 } 16153 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 16154 // cond: x.Uses == 1 && clobber(x) 16155 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 16156 for { 16157 t := v.Type 16158 x := v.Args[0] 16159 if x.Op != OpS390XMOVDloadidx { 16160 break 16161 } 16162 off := x.AuxInt 16163 sym := x.Aux 16164 _ = x.Args[2] 16165 ptr := x.Args[0] 16166 idx := x.Args[1] 16167 mem := x.Args[2] 16168 if !(x.Uses == 1 && clobber(x)) { 16169 break 16170 } 16171 b = x.Block 16172 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 16173 v.reset(OpCopy) 16174 v.AddArg(v0) 16175 v0.AuxInt = off 16176 v0.Aux = sym 16177 v0.AddArg(ptr) 16178 v0.AddArg(idx) 16179 v0.AddArg(mem) 16180 return true 16181 } 16182 return false 16183 } 16184 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 16185 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 16186 // cond: is20Bit(off1+off2) 16187 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 16188 for { 16189 off1 := v.AuxInt 16190 sym := v.Aux 16191 _ = v.Args[2] 16192 v_0 := v.Args[0] 16193 if v_0.Op != OpS390XADDconst { 16194 break 16195 } 16196 off2 := v_0.AuxInt 16197 ptr := v_0.Args[0] 16198 val := v.Args[1] 16199 mem := v.Args[2] 16200 if !(is20Bit(off1 + off2)) { 16201 break 16202 } 16203 v.reset(OpS390XMOVDstore) 16204 v.AuxInt = off1 + off2 16205 v.Aux = sym 16206 v.AddArg(ptr) 16207 v.AddArg(val) 16208 v.AddArg(mem) 16209 return true 16210 } 16211 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 16212 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 16213 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 16214 for { 16215 off := v.AuxInt 16216 sym := v.Aux 16217 _ = v.Args[2] 16218 ptr := v.Args[0] 16219 v_1 := v.Args[1] 16220 if v_1.Op != OpS390XMOVDconst { 16221 break 16222 } 16223 c := v_1.AuxInt 16224 mem := v.Args[2] 16225 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 16226 break 16227 } 16228 v.reset(OpS390XMOVDstoreconst) 16229 v.AuxInt = makeValAndOff(c, off) 16230 v.Aux = sym 16231 v.AddArg(ptr) 16232 v.AddArg(mem) 16233 return true 16234 } 16235 // match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 16236 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 16237 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 16238 for { 16239 off1 := v.AuxInt 16240 sym1 := v.Aux 16241 _ = v.Args[2] 16242 v_0 := v.Args[0] 16243 if v_0.Op != OpS390XMOVDaddr { 16244 break 16245 } 16246 t := v_0.Type 16247 off2 := v_0.AuxInt 16248 sym2 := v_0.Aux 16249 base := v_0.Args[0] 16250 val := v.Args[1] 16251 mem := v.Args[2] 16252 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 16253 break 16254 } 16255 v.reset(OpS390XMOVDstore) 16256 v.AuxInt = off1 + off2 16257 v.Aux = mergeSym(sym1, sym2) 16258 v.AddArg(base) 16259 v.AddArg(val) 16260 v.AddArg(mem) 16261 return true 16262 } 16263 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 16264 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16265 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 16266 for { 16267 off1 := v.AuxInt 16268 sym1 := v.Aux 16269 _ = v.Args[2] 16270 v_0 := v.Args[0] 16271 if v_0.Op != OpS390XMOVDaddridx { 16272 break 16273 } 16274 off2 := v_0.AuxInt 16275 sym2 := v_0.Aux 16276 _ = v_0.Args[1] 16277 ptr := v_0.Args[0] 16278 idx := v_0.Args[1] 16279 val := v.Args[1] 16280 mem := v.Args[2] 16281 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16282 break 16283 } 16284 v.reset(OpS390XMOVDstoreidx) 16285 v.AuxInt = off1 + off2 16286 v.Aux = mergeSym(sym1, sym2) 16287 v.AddArg(ptr) 16288 v.AddArg(idx) 16289 v.AddArg(val) 16290 v.AddArg(mem) 16291 return true 16292 } 16293 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 16294 // cond: ptr.Op != OpSB 16295 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 16296 for { 16297 off := v.AuxInt 16298 sym := v.Aux 16299 _ = v.Args[2] 16300 v_0 := v.Args[0] 16301 if v_0.Op != OpS390XADD { 16302 break 16303 } 16304 _ = v_0.Args[1] 16305 ptr := v_0.Args[0] 16306 idx := v_0.Args[1] 16307 val := v.Args[1] 16308 mem := v.Args[2] 16309 if !(ptr.Op != OpSB) { 16310 break 16311 } 16312 v.reset(OpS390XMOVDstoreidx) 16313 v.AuxInt = off 16314 v.Aux = sym 16315 v.AddArg(ptr) 16316 v.AddArg(idx) 16317 v.AddArg(val) 16318 v.AddArg(mem) 16319 return true 16320 } 16321 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 16322 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 16323 // result: (STMG2 [i-8] {s} p w0 w1 mem) 16324 for { 16325 i := v.AuxInt 16326 s := v.Aux 16327 _ = v.Args[2] 16328 p := v.Args[0] 16329 w1 := v.Args[1] 16330 x := v.Args[2] 16331 if x.Op != OpS390XMOVDstore { 16332 break 16333 } 16334 if x.AuxInt != i-8 { 16335 break 16336 } 16337 if x.Aux != s { 16338 break 16339 } 16340 _ = x.Args[2] 16341 if p != x.Args[0] { 16342 break 16343 } 16344 w0 := x.Args[1] 16345 mem := x.Args[2] 16346 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 16347 break 16348 } 16349 v.reset(OpS390XSTMG2) 16350 v.AuxInt = i - 8 16351 v.Aux = s 16352 v.AddArg(p) 16353 v.AddArg(w0) 16354 v.AddArg(w1) 16355 v.AddArg(mem) 16356 return true 16357 } 16358 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 16359 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 16360 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 16361 for { 16362 i := v.AuxInt 16363 s := v.Aux 16364 _ = v.Args[2] 16365 p := v.Args[0] 16366 w2 := v.Args[1] 16367 x := v.Args[2] 16368 if x.Op != OpS390XSTMG2 { 16369 break 16370 } 16371 if x.AuxInt != i-16 { 16372 break 16373 } 16374 if x.Aux != s { 16375 break 16376 } 16377 _ = x.Args[3] 16378 if p != x.Args[0] { 16379 break 16380 } 16381 w0 := x.Args[1] 16382 w1 := x.Args[2] 16383 mem := x.Args[3] 16384 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 16385 break 16386 } 16387 v.reset(OpS390XSTMG3) 16388 v.AuxInt = i - 16 16389 v.Aux = s 16390 v.AddArg(p) 16391 v.AddArg(w0) 16392 v.AddArg(w1) 16393 v.AddArg(w2) 16394 v.AddArg(mem) 16395 return true 16396 } 16397 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 16398 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 16399 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 16400 for { 16401 i := v.AuxInt 16402 s := v.Aux 16403 _ = v.Args[2] 16404 p := v.Args[0] 16405 w3 := v.Args[1] 16406 x := v.Args[2] 16407 if x.Op != OpS390XSTMG3 { 16408 break 16409 } 16410 if x.AuxInt != i-24 { 16411 break 16412 } 16413 if x.Aux != s { 16414 break 16415 } 16416 _ = x.Args[4] 16417 if p != x.Args[0] { 16418 break 16419 } 16420 w0 := x.Args[1] 16421 w1 := x.Args[2] 16422 w2 := x.Args[3] 16423 mem := x.Args[4] 16424 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 16425 break 16426 } 16427 v.reset(OpS390XSTMG4) 16428 v.AuxInt = i - 24 16429 v.Aux = s 16430 v.AddArg(p) 16431 v.AddArg(w0) 16432 v.AddArg(w1) 16433 v.AddArg(w2) 16434 v.AddArg(w3) 16435 v.AddArg(mem) 16436 return true 16437 } 16438 return false 16439 } 16440 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 16441 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 16442 // cond: isU12Bit(ValAndOff(sc).Off()+off) 16443 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 16444 for { 16445 sc := v.AuxInt 16446 s := v.Aux 16447 _ = v.Args[1] 16448 v_0 := v.Args[0] 16449 if v_0.Op != OpS390XADDconst { 16450 break 16451 } 16452 off := v_0.AuxInt 16453 ptr := v_0.Args[0] 16454 mem := v.Args[1] 16455 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 16456 break 16457 } 16458 v.reset(OpS390XMOVDstoreconst) 16459 v.AuxInt = ValAndOff(sc).add(off) 16460 v.Aux = s 16461 v.AddArg(ptr) 16462 v.AddArg(mem) 16463 return true 16464 } 16465 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 16466 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 16467 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 16468 for { 16469 sc := v.AuxInt 16470 sym1 := v.Aux 16471 _ = v.Args[1] 16472 v_0 := v.Args[0] 16473 if v_0.Op != OpS390XMOVDaddr { 16474 break 16475 } 16476 off := v_0.AuxInt 16477 sym2 := v_0.Aux 16478 ptr := v_0.Args[0] 16479 mem := v.Args[1] 16480 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 16481 break 16482 } 16483 v.reset(OpS390XMOVDstoreconst) 16484 v.AuxInt = ValAndOff(sc).add(off) 16485 v.Aux = mergeSym(sym1, sym2) 16486 v.AddArg(ptr) 16487 v.AddArg(mem) 16488 return true 16489 } 16490 return false 16491 } 16492 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 16493 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 16494 // cond: is20Bit(c+d) 16495 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16496 for { 16497 c := v.AuxInt 16498 sym := v.Aux 16499 _ = v.Args[3] 16500 v_0 := v.Args[0] 16501 if v_0.Op != OpS390XADDconst { 16502 break 16503 } 16504 d := v_0.AuxInt 16505 ptr := v_0.Args[0] 16506 idx := v.Args[1] 16507 val := v.Args[2] 16508 mem := v.Args[3] 16509 if !(is20Bit(c + d)) { 16510 break 16511 } 16512 v.reset(OpS390XMOVDstoreidx) 16513 v.AuxInt = c + d 16514 v.Aux = sym 16515 v.AddArg(ptr) 16516 v.AddArg(idx) 16517 v.AddArg(val) 16518 v.AddArg(mem) 16519 return true 16520 } 16521 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 16522 // cond: is20Bit(c+d) 16523 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16524 for { 16525 c := v.AuxInt 16526 sym := v.Aux 16527 _ = v.Args[3] 16528 idx := v.Args[0] 16529 v_1 := v.Args[1] 16530 if v_1.Op != OpS390XADDconst { 16531 break 16532 } 16533 d := v_1.AuxInt 16534 ptr := v_1.Args[0] 16535 val := v.Args[2] 16536 mem := v.Args[3] 16537 if !(is20Bit(c + d)) { 16538 break 16539 } 16540 v.reset(OpS390XMOVDstoreidx) 16541 v.AuxInt = c + d 16542 v.Aux = sym 16543 v.AddArg(ptr) 16544 v.AddArg(idx) 16545 v.AddArg(val) 16546 v.AddArg(mem) 16547 return true 16548 } 16549 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 16550 // cond: is20Bit(c+d) 16551 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16552 for { 16553 c := v.AuxInt 16554 sym := v.Aux 16555 _ = v.Args[3] 16556 ptr := v.Args[0] 16557 v_1 := v.Args[1] 16558 if v_1.Op != OpS390XADDconst { 16559 break 16560 } 16561 d := v_1.AuxInt 16562 idx := v_1.Args[0] 16563 val := v.Args[2] 16564 mem := v.Args[3] 16565 if !(is20Bit(c + d)) { 16566 break 16567 } 16568 v.reset(OpS390XMOVDstoreidx) 16569 v.AuxInt = c + d 16570 v.Aux = sym 16571 v.AddArg(ptr) 16572 v.AddArg(idx) 16573 v.AddArg(val) 16574 v.AddArg(mem) 16575 return true 16576 } 16577 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 16578 // cond: is20Bit(c+d) 16579 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 16580 for { 16581 c := v.AuxInt 16582 sym := v.Aux 16583 _ = v.Args[3] 16584 v_0 := v.Args[0] 16585 if v_0.Op != OpS390XADDconst { 16586 break 16587 } 16588 d := v_0.AuxInt 16589 idx := v_0.Args[0] 16590 ptr := v.Args[1] 16591 val := v.Args[2] 16592 mem := v.Args[3] 16593 if !(is20Bit(c + d)) { 16594 break 16595 } 16596 v.reset(OpS390XMOVDstoreidx) 16597 v.AuxInt = c + d 16598 v.Aux = sym 16599 v.AddArg(ptr) 16600 v.AddArg(idx) 16601 v.AddArg(val) 16602 v.AddArg(mem) 16603 return true 16604 } 16605 return false 16606 } 16607 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 16608 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 16609 // cond: x.Uses == 1 && clobber(x) 16610 // result: (MOVWBRstore [i-2] {s} p w mem) 16611 for { 16612 i := v.AuxInt 16613 s := v.Aux 16614 _ = v.Args[2] 16615 p := v.Args[0] 16616 v_1 := v.Args[1] 16617 if v_1.Op != OpS390XSRDconst { 16618 break 16619 } 16620 if v_1.AuxInt != 16 { 16621 break 16622 } 16623 w := v_1.Args[0] 16624 x := v.Args[2] 16625 if x.Op != OpS390XMOVHBRstore { 16626 break 16627 } 16628 if x.AuxInt != i-2 { 16629 break 16630 } 16631 if x.Aux != s { 16632 break 16633 } 16634 _ = x.Args[2] 16635 if p != x.Args[0] { 16636 break 16637 } 16638 if w != x.Args[1] { 16639 break 16640 } 16641 mem := x.Args[2] 16642 if !(x.Uses == 1 && clobber(x)) { 16643 break 16644 } 16645 v.reset(OpS390XMOVWBRstore) 16646 v.AuxInt = i - 2 16647 v.Aux = s 16648 v.AddArg(p) 16649 v.AddArg(w) 16650 v.AddArg(mem) 16651 return true 16652 } 16653 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 16654 // cond: x.Uses == 1 && clobber(x) 16655 // result: (MOVWBRstore [i-2] {s} p w0 mem) 16656 for { 16657 i := v.AuxInt 16658 s := v.Aux 16659 _ = v.Args[2] 16660 p := v.Args[0] 16661 v_1 := v.Args[1] 16662 if v_1.Op != OpS390XSRDconst { 16663 break 16664 } 16665 j := v_1.AuxInt 16666 w := v_1.Args[0] 16667 x := v.Args[2] 16668 if x.Op != OpS390XMOVHBRstore { 16669 break 16670 } 16671 if x.AuxInt != i-2 { 16672 break 16673 } 16674 if x.Aux != s { 16675 break 16676 } 16677 _ = x.Args[2] 16678 if p != x.Args[0] { 16679 break 16680 } 16681 w0 := x.Args[1] 16682 if w0.Op != OpS390XSRDconst { 16683 break 16684 } 16685 if w0.AuxInt != j-16 { 16686 break 16687 } 16688 if w != w0.Args[0] { 16689 break 16690 } 16691 mem := x.Args[2] 16692 if !(x.Uses == 1 && clobber(x)) { 16693 break 16694 } 16695 v.reset(OpS390XMOVWBRstore) 16696 v.AuxInt = i - 2 16697 v.Aux = s 16698 v.AddArg(p) 16699 v.AddArg(w0) 16700 v.AddArg(mem) 16701 return true 16702 } 16703 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 16704 // cond: x.Uses == 1 && clobber(x) 16705 // result: (MOVWBRstore [i-2] {s} p w mem) 16706 for { 16707 i := v.AuxInt 16708 s := v.Aux 16709 _ = v.Args[2] 16710 p := v.Args[0] 16711 v_1 := v.Args[1] 16712 if v_1.Op != OpS390XSRWconst { 16713 break 16714 } 16715 if v_1.AuxInt != 16 { 16716 break 16717 } 16718 w := v_1.Args[0] 16719 x := v.Args[2] 16720 if x.Op != OpS390XMOVHBRstore { 16721 break 16722 } 16723 if x.AuxInt != i-2 { 16724 break 16725 } 16726 if x.Aux != s { 16727 break 16728 } 16729 _ = x.Args[2] 16730 if p != x.Args[0] { 16731 break 16732 } 16733 if w != x.Args[1] { 16734 break 16735 } 16736 mem := x.Args[2] 16737 if !(x.Uses == 1 && clobber(x)) { 16738 break 16739 } 16740 v.reset(OpS390XMOVWBRstore) 16741 v.AuxInt = i - 2 16742 v.Aux = s 16743 v.AddArg(p) 16744 v.AddArg(w) 16745 v.AddArg(mem) 16746 return true 16747 } 16748 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 16749 // cond: x.Uses == 1 && clobber(x) 16750 // result: (MOVWBRstore [i-2] {s} p w0 mem) 16751 for { 16752 i := v.AuxInt 16753 s := v.Aux 16754 _ = v.Args[2] 16755 p := v.Args[0] 16756 v_1 := v.Args[1] 16757 if v_1.Op != OpS390XSRWconst { 16758 break 16759 } 16760 j := v_1.AuxInt 16761 w := v_1.Args[0] 16762 x := v.Args[2] 16763 if x.Op != OpS390XMOVHBRstore { 16764 break 16765 } 16766 if x.AuxInt != i-2 { 16767 break 16768 } 16769 if x.Aux != s { 16770 break 16771 } 16772 _ = x.Args[2] 16773 if p != x.Args[0] { 16774 break 16775 } 16776 w0 := x.Args[1] 16777 if w0.Op != OpS390XSRWconst { 16778 break 16779 } 16780 if w0.AuxInt != j-16 { 16781 break 16782 } 16783 if w != w0.Args[0] { 16784 break 16785 } 16786 mem := x.Args[2] 16787 if !(x.Uses == 1 && clobber(x)) { 16788 break 16789 } 16790 v.reset(OpS390XMOVWBRstore) 16791 v.AuxInt = i - 2 16792 v.Aux = s 16793 v.AddArg(p) 16794 v.AddArg(w0) 16795 v.AddArg(mem) 16796 return true 16797 } 16798 return false 16799 } 16800 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 16801 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 16802 // cond: x.Uses == 1 && clobber(x) 16803 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16804 for { 16805 i := v.AuxInt 16806 s := v.Aux 16807 _ = v.Args[3] 16808 p := v.Args[0] 16809 idx := v.Args[1] 16810 v_2 := v.Args[2] 16811 if v_2.Op != OpS390XSRDconst { 16812 break 16813 } 16814 if v_2.AuxInt != 16 { 16815 break 16816 } 16817 w := v_2.Args[0] 16818 x := v.Args[3] 16819 if x.Op != OpS390XMOVHBRstoreidx { 16820 break 16821 } 16822 if x.AuxInt != i-2 { 16823 break 16824 } 16825 if x.Aux != s { 16826 break 16827 } 16828 _ = x.Args[3] 16829 if p != x.Args[0] { 16830 break 16831 } 16832 if idx != x.Args[1] { 16833 break 16834 } 16835 if w != x.Args[2] { 16836 break 16837 } 16838 mem := x.Args[3] 16839 if !(x.Uses == 1 && clobber(x)) { 16840 break 16841 } 16842 v.reset(OpS390XMOVWBRstoreidx) 16843 v.AuxInt = i - 2 16844 v.Aux = s 16845 v.AddArg(p) 16846 v.AddArg(idx) 16847 v.AddArg(w) 16848 v.AddArg(mem) 16849 return true 16850 } 16851 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 16852 // cond: x.Uses == 1 && clobber(x) 16853 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16854 for { 16855 i := v.AuxInt 16856 s := v.Aux 16857 _ = v.Args[3] 16858 p := v.Args[0] 16859 idx := v.Args[1] 16860 v_2 := v.Args[2] 16861 if v_2.Op != OpS390XSRDconst { 16862 break 16863 } 16864 if v_2.AuxInt != 16 { 16865 break 16866 } 16867 w := v_2.Args[0] 16868 x := v.Args[3] 16869 if x.Op != OpS390XMOVHBRstoreidx { 16870 break 16871 } 16872 if x.AuxInt != i-2 { 16873 break 16874 } 16875 if x.Aux != s { 16876 break 16877 } 16878 _ = x.Args[3] 16879 if idx != x.Args[0] { 16880 break 16881 } 16882 if p != x.Args[1] { 16883 break 16884 } 16885 if w != x.Args[2] { 16886 break 16887 } 16888 mem := x.Args[3] 16889 if !(x.Uses == 1 && clobber(x)) { 16890 break 16891 } 16892 v.reset(OpS390XMOVWBRstoreidx) 16893 v.AuxInt = i - 2 16894 v.Aux = s 16895 v.AddArg(p) 16896 v.AddArg(idx) 16897 v.AddArg(w) 16898 v.AddArg(mem) 16899 return true 16900 } 16901 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 16902 // cond: x.Uses == 1 && clobber(x) 16903 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16904 for { 16905 i := v.AuxInt 16906 s := v.Aux 16907 _ = v.Args[3] 16908 idx := v.Args[0] 16909 p := v.Args[1] 16910 v_2 := v.Args[2] 16911 if v_2.Op != OpS390XSRDconst { 16912 break 16913 } 16914 if v_2.AuxInt != 16 { 16915 break 16916 } 16917 w := v_2.Args[0] 16918 x := v.Args[3] 16919 if x.Op != OpS390XMOVHBRstoreidx { 16920 break 16921 } 16922 if x.AuxInt != i-2 { 16923 break 16924 } 16925 if x.Aux != s { 16926 break 16927 } 16928 _ = x.Args[3] 16929 if p != x.Args[0] { 16930 break 16931 } 16932 if idx != x.Args[1] { 16933 break 16934 } 16935 if w != x.Args[2] { 16936 break 16937 } 16938 mem := x.Args[3] 16939 if !(x.Uses == 1 && clobber(x)) { 16940 break 16941 } 16942 v.reset(OpS390XMOVWBRstoreidx) 16943 v.AuxInt = i - 2 16944 v.Aux = s 16945 v.AddArg(p) 16946 v.AddArg(idx) 16947 v.AddArg(w) 16948 v.AddArg(mem) 16949 return true 16950 } 16951 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 16952 // cond: x.Uses == 1 && clobber(x) 16953 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 16954 for { 16955 i := v.AuxInt 16956 s := v.Aux 16957 _ = v.Args[3] 16958 idx := v.Args[0] 16959 p := v.Args[1] 16960 v_2 := v.Args[2] 16961 if v_2.Op != OpS390XSRDconst { 16962 break 16963 } 16964 if v_2.AuxInt != 16 { 16965 break 16966 } 16967 w := v_2.Args[0] 16968 x := v.Args[3] 16969 if x.Op != OpS390XMOVHBRstoreidx { 16970 break 16971 } 16972 if x.AuxInt != i-2 { 16973 break 16974 } 16975 if x.Aux != s { 16976 break 16977 } 16978 _ = x.Args[3] 16979 if idx != x.Args[0] { 16980 break 16981 } 16982 if p != x.Args[1] { 16983 break 16984 } 16985 if w != x.Args[2] { 16986 break 16987 } 16988 mem := x.Args[3] 16989 if !(x.Uses == 1 && clobber(x)) { 16990 break 16991 } 16992 v.reset(OpS390XMOVWBRstoreidx) 16993 v.AuxInt = i - 2 16994 v.Aux = s 16995 v.AddArg(p) 16996 v.AddArg(idx) 16997 v.AddArg(w) 16998 v.AddArg(mem) 16999 return true 17000 } 17001 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 17002 // cond: x.Uses == 1 && clobber(x) 17003 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17004 for { 17005 i := v.AuxInt 17006 s := v.Aux 17007 _ = v.Args[3] 17008 p := v.Args[0] 17009 idx := v.Args[1] 17010 v_2 := v.Args[2] 17011 if v_2.Op != OpS390XSRDconst { 17012 break 17013 } 17014 j := v_2.AuxInt 17015 w := v_2.Args[0] 17016 x := v.Args[3] 17017 if x.Op != OpS390XMOVHBRstoreidx { 17018 break 17019 } 17020 if x.AuxInt != i-2 { 17021 break 17022 } 17023 if x.Aux != s { 17024 break 17025 } 17026 _ = x.Args[3] 17027 if p != x.Args[0] { 17028 break 17029 } 17030 if idx != x.Args[1] { 17031 break 17032 } 17033 w0 := x.Args[2] 17034 if w0.Op != OpS390XSRDconst { 17035 break 17036 } 17037 if w0.AuxInt != j-16 { 17038 break 17039 } 17040 if w != w0.Args[0] { 17041 break 17042 } 17043 mem := x.Args[3] 17044 if !(x.Uses == 1 && clobber(x)) { 17045 break 17046 } 17047 v.reset(OpS390XMOVWBRstoreidx) 17048 v.AuxInt = i - 2 17049 v.Aux = s 17050 v.AddArg(p) 17051 v.AddArg(idx) 17052 v.AddArg(w0) 17053 v.AddArg(mem) 17054 return true 17055 } 17056 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 17057 // cond: x.Uses == 1 && clobber(x) 17058 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17059 for { 17060 i := v.AuxInt 17061 s := v.Aux 17062 _ = v.Args[3] 17063 p := v.Args[0] 17064 idx := v.Args[1] 17065 v_2 := v.Args[2] 17066 if v_2.Op != OpS390XSRDconst { 17067 break 17068 } 17069 j := v_2.AuxInt 17070 w := v_2.Args[0] 17071 x := v.Args[3] 17072 if x.Op != OpS390XMOVHBRstoreidx { 17073 break 17074 } 17075 if x.AuxInt != i-2 { 17076 break 17077 } 17078 if x.Aux != s { 17079 break 17080 } 17081 _ = x.Args[3] 17082 if idx != x.Args[0] { 17083 break 17084 } 17085 if p != x.Args[1] { 17086 break 17087 } 17088 w0 := x.Args[2] 17089 if w0.Op != OpS390XSRDconst { 17090 break 17091 } 17092 if w0.AuxInt != j-16 { 17093 break 17094 } 17095 if w != w0.Args[0] { 17096 break 17097 } 17098 mem := x.Args[3] 17099 if !(x.Uses == 1 && clobber(x)) { 17100 break 17101 } 17102 v.reset(OpS390XMOVWBRstoreidx) 17103 v.AuxInt = i - 2 17104 v.Aux = s 17105 v.AddArg(p) 17106 v.AddArg(idx) 17107 v.AddArg(w0) 17108 v.AddArg(mem) 17109 return true 17110 } 17111 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 17112 // cond: x.Uses == 1 && clobber(x) 17113 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17114 for { 17115 i := v.AuxInt 17116 s := v.Aux 17117 _ = v.Args[3] 17118 idx := v.Args[0] 17119 p := v.Args[1] 17120 v_2 := v.Args[2] 17121 if v_2.Op != OpS390XSRDconst { 17122 break 17123 } 17124 j := v_2.AuxInt 17125 w := v_2.Args[0] 17126 x := v.Args[3] 17127 if x.Op != OpS390XMOVHBRstoreidx { 17128 break 17129 } 17130 if x.AuxInt != i-2 { 17131 break 17132 } 17133 if x.Aux != s { 17134 break 17135 } 17136 _ = x.Args[3] 17137 if p != x.Args[0] { 17138 break 17139 } 17140 if idx != x.Args[1] { 17141 break 17142 } 17143 w0 := x.Args[2] 17144 if w0.Op != OpS390XSRDconst { 17145 break 17146 } 17147 if w0.AuxInt != j-16 { 17148 break 17149 } 17150 if w != w0.Args[0] { 17151 break 17152 } 17153 mem := x.Args[3] 17154 if !(x.Uses == 1 && clobber(x)) { 17155 break 17156 } 17157 v.reset(OpS390XMOVWBRstoreidx) 17158 v.AuxInt = i - 2 17159 v.Aux = s 17160 v.AddArg(p) 17161 v.AddArg(idx) 17162 v.AddArg(w0) 17163 v.AddArg(mem) 17164 return true 17165 } 17166 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 17167 // cond: x.Uses == 1 && clobber(x) 17168 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17169 for { 17170 i := v.AuxInt 17171 s := v.Aux 17172 _ = v.Args[3] 17173 idx := v.Args[0] 17174 p := v.Args[1] 17175 v_2 := v.Args[2] 17176 if v_2.Op != OpS390XSRDconst { 17177 break 17178 } 17179 j := v_2.AuxInt 17180 w := v_2.Args[0] 17181 x := v.Args[3] 17182 if x.Op != OpS390XMOVHBRstoreidx { 17183 break 17184 } 17185 if x.AuxInt != i-2 { 17186 break 17187 } 17188 if x.Aux != s { 17189 break 17190 } 17191 _ = x.Args[3] 17192 if idx != x.Args[0] { 17193 break 17194 } 17195 if p != x.Args[1] { 17196 break 17197 } 17198 w0 := x.Args[2] 17199 if w0.Op != OpS390XSRDconst { 17200 break 17201 } 17202 if w0.AuxInt != j-16 { 17203 break 17204 } 17205 if w != w0.Args[0] { 17206 break 17207 } 17208 mem := x.Args[3] 17209 if !(x.Uses == 1 && clobber(x)) { 17210 break 17211 } 17212 v.reset(OpS390XMOVWBRstoreidx) 17213 v.AuxInt = i - 2 17214 v.Aux = s 17215 v.AddArg(p) 17216 v.AddArg(idx) 17217 v.AddArg(w0) 17218 v.AddArg(mem) 17219 return true 17220 } 17221 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 17222 // cond: x.Uses == 1 && clobber(x) 17223 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17224 for { 17225 i := v.AuxInt 17226 s := v.Aux 17227 _ = v.Args[3] 17228 p := v.Args[0] 17229 idx := v.Args[1] 17230 v_2 := v.Args[2] 17231 if v_2.Op != OpS390XSRWconst { 17232 break 17233 } 17234 if v_2.AuxInt != 16 { 17235 break 17236 } 17237 w := v_2.Args[0] 17238 x := v.Args[3] 17239 if x.Op != OpS390XMOVHBRstoreidx { 17240 break 17241 } 17242 if x.AuxInt != i-2 { 17243 break 17244 } 17245 if x.Aux != s { 17246 break 17247 } 17248 _ = x.Args[3] 17249 if p != x.Args[0] { 17250 break 17251 } 17252 if idx != x.Args[1] { 17253 break 17254 } 17255 if w != x.Args[2] { 17256 break 17257 } 17258 mem := x.Args[3] 17259 if !(x.Uses == 1 && clobber(x)) { 17260 break 17261 } 17262 v.reset(OpS390XMOVWBRstoreidx) 17263 v.AuxInt = i - 2 17264 v.Aux = s 17265 v.AddArg(p) 17266 v.AddArg(idx) 17267 v.AddArg(w) 17268 v.AddArg(mem) 17269 return true 17270 } 17271 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 17272 // cond: x.Uses == 1 && clobber(x) 17273 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17274 for { 17275 i := v.AuxInt 17276 s := v.Aux 17277 _ = v.Args[3] 17278 p := v.Args[0] 17279 idx := v.Args[1] 17280 v_2 := v.Args[2] 17281 if v_2.Op != OpS390XSRWconst { 17282 break 17283 } 17284 if v_2.AuxInt != 16 { 17285 break 17286 } 17287 w := v_2.Args[0] 17288 x := v.Args[3] 17289 if x.Op != OpS390XMOVHBRstoreidx { 17290 break 17291 } 17292 if x.AuxInt != i-2 { 17293 break 17294 } 17295 if x.Aux != s { 17296 break 17297 } 17298 _ = x.Args[3] 17299 if idx != x.Args[0] { 17300 break 17301 } 17302 if p != x.Args[1] { 17303 break 17304 } 17305 if w != x.Args[2] { 17306 break 17307 } 17308 mem := x.Args[3] 17309 if !(x.Uses == 1 && clobber(x)) { 17310 break 17311 } 17312 v.reset(OpS390XMOVWBRstoreidx) 17313 v.AuxInt = i - 2 17314 v.Aux = s 17315 v.AddArg(p) 17316 v.AddArg(idx) 17317 v.AddArg(w) 17318 v.AddArg(mem) 17319 return true 17320 } 17321 return false 17322 } 17323 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 17324 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 17325 // cond: x.Uses == 1 && clobber(x) 17326 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17327 for { 17328 i := v.AuxInt 17329 s := v.Aux 17330 _ = v.Args[3] 17331 idx := v.Args[0] 17332 p := v.Args[1] 17333 v_2 := v.Args[2] 17334 if v_2.Op != OpS390XSRWconst { 17335 break 17336 } 17337 if v_2.AuxInt != 16 { 17338 break 17339 } 17340 w := v_2.Args[0] 17341 x := v.Args[3] 17342 if x.Op != OpS390XMOVHBRstoreidx { 17343 break 17344 } 17345 if x.AuxInt != i-2 { 17346 break 17347 } 17348 if x.Aux != s { 17349 break 17350 } 17351 _ = x.Args[3] 17352 if p != x.Args[0] { 17353 break 17354 } 17355 if idx != x.Args[1] { 17356 break 17357 } 17358 if w != x.Args[2] { 17359 break 17360 } 17361 mem := x.Args[3] 17362 if !(x.Uses == 1 && clobber(x)) { 17363 break 17364 } 17365 v.reset(OpS390XMOVWBRstoreidx) 17366 v.AuxInt = i - 2 17367 v.Aux = s 17368 v.AddArg(p) 17369 v.AddArg(idx) 17370 v.AddArg(w) 17371 v.AddArg(mem) 17372 return true 17373 } 17374 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 17375 // cond: x.Uses == 1 && clobber(x) 17376 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 17377 for { 17378 i := v.AuxInt 17379 s := v.Aux 17380 _ = v.Args[3] 17381 idx := v.Args[0] 17382 p := v.Args[1] 17383 v_2 := v.Args[2] 17384 if v_2.Op != OpS390XSRWconst { 17385 break 17386 } 17387 if v_2.AuxInt != 16 { 17388 break 17389 } 17390 w := v_2.Args[0] 17391 x := v.Args[3] 17392 if x.Op != OpS390XMOVHBRstoreidx { 17393 break 17394 } 17395 if x.AuxInt != i-2 { 17396 break 17397 } 17398 if x.Aux != s { 17399 break 17400 } 17401 _ = x.Args[3] 17402 if idx != x.Args[0] { 17403 break 17404 } 17405 if p != x.Args[1] { 17406 break 17407 } 17408 if w != x.Args[2] { 17409 break 17410 } 17411 mem := x.Args[3] 17412 if !(x.Uses == 1 && clobber(x)) { 17413 break 17414 } 17415 v.reset(OpS390XMOVWBRstoreidx) 17416 v.AuxInt = i - 2 17417 v.Aux = s 17418 v.AddArg(p) 17419 v.AddArg(idx) 17420 v.AddArg(w) 17421 v.AddArg(mem) 17422 return true 17423 } 17424 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 17425 // cond: x.Uses == 1 && clobber(x) 17426 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17427 for { 17428 i := v.AuxInt 17429 s := v.Aux 17430 _ = v.Args[3] 17431 p := v.Args[0] 17432 idx := v.Args[1] 17433 v_2 := v.Args[2] 17434 if v_2.Op != OpS390XSRWconst { 17435 break 17436 } 17437 j := v_2.AuxInt 17438 w := v_2.Args[0] 17439 x := v.Args[3] 17440 if x.Op != OpS390XMOVHBRstoreidx { 17441 break 17442 } 17443 if x.AuxInt != i-2 { 17444 break 17445 } 17446 if x.Aux != s { 17447 break 17448 } 17449 _ = x.Args[3] 17450 if p != x.Args[0] { 17451 break 17452 } 17453 if idx != x.Args[1] { 17454 break 17455 } 17456 w0 := x.Args[2] 17457 if w0.Op != OpS390XSRWconst { 17458 break 17459 } 17460 if w0.AuxInt != j-16 { 17461 break 17462 } 17463 if w != w0.Args[0] { 17464 break 17465 } 17466 mem := x.Args[3] 17467 if !(x.Uses == 1 && clobber(x)) { 17468 break 17469 } 17470 v.reset(OpS390XMOVWBRstoreidx) 17471 v.AuxInt = i - 2 17472 v.Aux = s 17473 v.AddArg(p) 17474 v.AddArg(idx) 17475 v.AddArg(w0) 17476 v.AddArg(mem) 17477 return true 17478 } 17479 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 17480 // cond: x.Uses == 1 && clobber(x) 17481 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17482 for { 17483 i := v.AuxInt 17484 s := v.Aux 17485 _ = v.Args[3] 17486 p := v.Args[0] 17487 idx := v.Args[1] 17488 v_2 := v.Args[2] 17489 if v_2.Op != OpS390XSRWconst { 17490 break 17491 } 17492 j := v_2.AuxInt 17493 w := v_2.Args[0] 17494 x := v.Args[3] 17495 if x.Op != OpS390XMOVHBRstoreidx { 17496 break 17497 } 17498 if x.AuxInt != i-2 { 17499 break 17500 } 17501 if x.Aux != s { 17502 break 17503 } 17504 _ = x.Args[3] 17505 if idx != x.Args[0] { 17506 break 17507 } 17508 if p != x.Args[1] { 17509 break 17510 } 17511 w0 := x.Args[2] 17512 if w0.Op != OpS390XSRWconst { 17513 break 17514 } 17515 if w0.AuxInt != j-16 { 17516 break 17517 } 17518 if w != w0.Args[0] { 17519 break 17520 } 17521 mem := x.Args[3] 17522 if !(x.Uses == 1 && clobber(x)) { 17523 break 17524 } 17525 v.reset(OpS390XMOVWBRstoreidx) 17526 v.AuxInt = i - 2 17527 v.Aux = s 17528 v.AddArg(p) 17529 v.AddArg(idx) 17530 v.AddArg(w0) 17531 v.AddArg(mem) 17532 return true 17533 } 17534 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 17535 // cond: x.Uses == 1 && clobber(x) 17536 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17537 for { 17538 i := v.AuxInt 17539 s := v.Aux 17540 _ = v.Args[3] 17541 idx := v.Args[0] 17542 p := v.Args[1] 17543 v_2 := v.Args[2] 17544 if v_2.Op != OpS390XSRWconst { 17545 break 17546 } 17547 j := v_2.AuxInt 17548 w := v_2.Args[0] 17549 x := v.Args[3] 17550 if x.Op != OpS390XMOVHBRstoreidx { 17551 break 17552 } 17553 if x.AuxInt != i-2 { 17554 break 17555 } 17556 if x.Aux != s { 17557 break 17558 } 17559 _ = x.Args[3] 17560 if p != x.Args[0] { 17561 break 17562 } 17563 if idx != x.Args[1] { 17564 break 17565 } 17566 w0 := x.Args[2] 17567 if w0.Op != OpS390XSRWconst { 17568 break 17569 } 17570 if w0.AuxInt != j-16 { 17571 break 17572 } 17573 if w != w0.Args[0] { 17574 break 17575 } 17576 mem := x.Args[3] 17577 if !(x.Uses == 1 && clobber(x)) { 17578 break 17579 } 17580 v.reset(OpS390XMOVWBRstoreidx) 17581 v.AuxInt = i - 2 17582 v.Aux = s 17583 v.AddArg(p) 17584 v.AddArg(idx) 17585 v.AddArg(w0) 17586 v.AddArg(mem) 17587 return true 17588 } 17589 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 17590 // cond: x.Uses == 1 && clobber(x) 17591 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 17592 for { 17593 i := v.AuxInt 17594 s := v.Aux 17595 _ = v.Args[3] 17596 idx := v.Args[0] 17597 p := v.Args[1] 17598 v_2 := v.Args[2] 17599 if v_2.Op != OpS390XSRWconst { 17600 break 17601 } 17602 j := v_2.AuxInt 17603 w := v_2.Args[0] 17604 x := v.Args[3] 17605 if x.Op != OpS390XMOVHBRstoreidx { 17606 break 17607 } 17608 if x.AuxInt != i-2 { 17609 break 17610 } 17611 if x.Aux != s { 17612 break 17613 } 17614 _ = x.Args[3] 17615 if idx != x.Args[0] { 17616 break 17617 } 17618 if p != x.Args[1] { 17619 break 17620 } 17621 w0 := x.Args[2] 17622 if w0.Op != OpS390XSRWconst { 17623 break 17624 } 17625 if w0.AuxInt != j-16 { 17626 break 17627 } 17628 if w != w0.Args[0] { 17629 break 17630 } 17631 mem := x.Args[3] 17632 if !(x.Uses == 1 && clobber(x)) { 17633 break 17634 } 17635 v.reset(OpS390XMOVWBRstoreidx) 17636 v.AuxInt = i - 2 17637 v.Aux = s 17638 v.AddArg(p) 17639 v.AddArg(idx) 17640 v.AddArg(w0) 17641 v.AddArg(mem) 17642 return true 17643 } 17644 return false 17645 } 17646 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 17647 // match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 17648 // cond: isSamePtr(ptr1, ptr2) 17649 // result: (MOVHZreg x) 17650 for { 17651 off := v.AuxInt 17652 sym := v.Aux 17653 _ = v.Args[1] 17654 ptr1 := v.Args[0] 17655 v_1 := v.Args[1] 17656 if v_1.Op != OpS390XMOVHstore { 17657 break 17658 } 17659 if v_1.AuxInt != off { 17660 break 17661 } 17662 if v_1.Aux != sym { 17663 break 17664 } 17665 _ = v_1.Args[2] 17666 ptr2 := v_1.Args[0] 17667 x := v_1.Args[1] 17668 if !(isSamePtr(ptr1, ptr2)) { 17669 break 17670 } 17671 v.reset(OpS390XMOVHZreg) 17672 v.AddArg(x) 17673 return true 17674 } 17675 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 17676 // cond: is20Bit(off1+off2) 17677 // result: (MOVHZload [off1+off2] {sym} ptr mem) 17678 for { 17679 off1 := v.AuxInt 17680 sym := v.Aux 17681 _ = v.Args[1] 17682 v_0 := v.Args[0] 17683 if v_0.Op != OpS390XADDconst { 17684 break 17685 } 17686 off2 := v_0.AuxInt 17687 ptr := v_0.Args[0] 17688 mem := v.Args[1] 17689 if !(is20Bit(off1 + off2)) { 17690 break 17691 } 17692 v.reset(OpS390XMOVHZload) 17693 v.AuxInt = off1 + off2 17694 v.Aux = sym 17695 v.AddArg(ptr) 17696 v.AddArg(mem) 17697 return true 17698 } 17699 // match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17700 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 17701 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17702 for { 17703 off1 := v.AuxInt 17704 sym1 := v.Aux 17705 _ = v.Args[1] 17706 v_0 := v.Args[0] 17707 if v_0.Op != OpS390XMOVDaddr { 17708 break 17709 } 17710 t := v_0.Type 17711 off2 := v_0.AuxInt 17712 sym2 := v_0.Aux 17713 base := v_0.Args[0] 17714 mem := v.Args[1] 17715 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 17716 break 17717 } 17718 v.reset(OpS390XMOVHZload) 17719 v.AuxInt = off1 + off2 17720 v.Aux = mergeSym(sym1, sym2) 17721 v.AddArg(base) 17722 v.AddArg(mem) 17723 return true 17724 } 17725 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 17726 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17727 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 17728 for { 17729 off1 := v.AuxInt 17730 sym1 := v.Aux 17731 _ = v.Args[1] 17732 v_0 := v.Args[0] 17733 if v_0.Op != OpS390XMOVDaddridx { 17734 break 17735 } 17736 off2 := v_0.AuxInt 17737 sym2 := v_0.Aux 17738 _ = v_0.Args[1] 17739 ptr := v_0.Args[0] 17740 idx := v_0.Args[1] 17741 mem := v.Args[1] 17742 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17743 break 17744 } 17745 v.reset(OpS390XMOVHZloadidx) 17746 v.AuxInt = off1 + off2 17747 v.Aux = mergeSym(sym1, sym2) 17748 v.AddArg(ptr) 17749 v.AddArg(idx) 17750 v.AddArg(mem) 17751 return true 17752 } 17753 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 17754 // cond: ptr.Op != OpSB 17755 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 17756 for { 17757 off := v.AuxInt 17758 sym := v.Aux 17759 _ = v.Args[1] 17760 v_0 := v.Args[0] 17761 if v_0.Op != OpS390XADD { 17762 break 17763 } 17764 _ = v_0.Args[1] 17765 ptr := v_0.Args[0] 17766 idx := v_0.Args[1] 17767 mem := v.Args[1] 17768 if !(ptr.Op != OpSB) { 17769 break 17770 } 17771 v.reset(OpS390XMOVHZloadidx) 17772 v.AuxInt = off 17773 v.Aux = sym 17774 v.AddArg(ptr) 17775 v.AddArg(idx) 17776 v.AddArg(mem) 17777 return true 17778 } 17779 return false 17780 } 17781 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 17782 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 17783 // cond: is20Bit(c+d) 17784 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17785 for { 17786 c := v.AuxInt 17787 sym := v.Aux 17788 _ = v.Args[2] 17789 v_0 := v.Args[0] 17790 if v_0.Op != OpS390XADDconst { 17791 break 17792 } 17793 d := v_0.AuxInt 17794 ptr := v_0.Args[0] 17795 idx := v.Args[1] 17796 mem := v.Args[2] 17797 if !(is20Bit(c + d)) { 17798 break 17799 } 17800 v.reset(OpS390XMOVHZloadidx) 17801 v.AuxInt = c + d 17802 v.Aux = sym 17803 v.AddArg(ptr) 17804 v.AddArg(idx) 17805 v.AddArg(mem) 17806 return true 17807 } 17808 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 17809 // cond: is20Bit(c+d) 17810 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17811 for { 17812 c := v.AuxInt 17813 sym := v.Aux 17814 _ = v.Args[2] 17815 idx := v.Args[0] 17816 v_1 := v.Args[1] 17817 if v_1.Op != OpS390XADDconst { 17818 break 17819 } 17820 d := v_1.AuxInt 17821 ptr := v_1.Args[0] 17822 mem := v.Args[2] 17823 if !(is20Bit(c + d)) { 17824 break 17825 } 17826 v.reset(OpS390XMOVHZloadidx) 17827 v.AuxInt = c + d 17828 v.Aux = sym 17829 v.AddArg(ptr) 17830 v.AddArg(idx) 17831 v.AddArg(mem) 17832 return true 17833 } 17834 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 17835 // cond: is20Bit(c+d) 17836 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17837 for { 17838 c := v.AuxInt 17839 sym := v.Aux 17840 _ = v.Args[2] 17841 ptr := v.Args[0] 17842 v_1 := v.Args[1] 17843 if v_1.Op != OpS390XADDconst { 17844 break 17845 } 17846 d := v_1.AuxInt 17847 idx := v_1.Args[0] 17848 mem := v.Args[2] 17849 if !(is20Bit(c + d)) { 17850 break 17851 } 17852 v.reset(OpS390XMOVHZloadidx) 17853 v.AuxInt = c + d 17854 v.Aux = sym 17855 v.AddArg(ptr) 17856 v.AddArg(idx) 17857 v.AddArg(mem) 17858 return true 17859 } 17860 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 17861 // cond: is20Bit(c+d) 17862 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 17863 for { 17864 c := v.AuxInt 17865 sym := v.Aux 17866 _ = v.Args[2] 17867 v_0 := v.Args[0] 17868 if v_0.Op != OpS390XADDconst { 17869 break 17870 } 17871 d := v_0.AuxInt 17872 idx := v_0.Args[0] 17873 ptr := v.Args[1] 17874 mem := v.Args[2] 17875 if !(is20Bit(c + d)) { 17876 break 17877 } 17878 v.reset(OpS390XMOVHZloadidx) 17879 v.AuxInt = c + d 17880 v.Aux = sym 17881 v.AddArg(ptr) 17882 v.AddArg(idx) 17883 v.AddArg(mem) 17884 return true 17885 } 17886 return false 17887 } 17888 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 17889 b := v.Block 17890 _ = b 17891 // match: (MOVHZreg x:(MOVBZload _ _)) 17892 // cond: 17893 // result: (MOVDreg x) 17894 for { 17895 x := v.Args[0] 17896 if x.Op != OpS390XMOVBZload { 17897 break 17898 } 17899 _ = x.Args[1] 17900 v.reset(OpS390XMOVDreg) 17901 v.AddArg(x) 17902 return true 17903 } 17904 // match: (MOVHZreg x:(MOVHZload _ _)) 17905 // cond: 17906 // result: (MOVDreg x) 17907 for { 17908 x := v.Args[0] 17909 if x.Op != OpS390XMOVHZload { 17910 break 17911 } 17912 _ = x.Args[1] 17913 v.reset(OpS390XMOVDreg) 17914 v.AddArg(x) 17915 return true 17916 } 17917 // match: (MOVHZreg x:(Arg <t>)) 17918 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 17919 // result: (MOVDreg x) 17920 for { 17921 x := v.Args[0] 17922 if x.Op != OpArg { 17923 break 17924 } 17925 t := x.Type 17926 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 17927 break 17928 } 17929 v.reset(OpS390XMOVDreg) 17930 v.AddArg(x) 17931 return true 17932 } 17933 // match: (MOVHZreg x:(MOVBZreg _)) 17934 // cond: 17935 // result: (MOVDreg x) 17936 for { 17937 x := v.Args[0] 17938 if x.Op != OpS390XMOVBZreg { 17939 break 17940 } 17941 v.reset(OpS390XMOVDreg) 17942 v.AddArg(x) 17943 return true 17944 } 17945 // match: (MOVHZreg x:(MOVHZreg _)) 17946 // cond: 17947 // result: (MOVDreg x) 17948 for { 17949 x := v.Args[0] 17950 if x.Op != OpS390XMOVHZreg { 17951 break 17952 } 17953 v.reset(OpS390XMOVDreg) 17954 v.AddArg(x) 17955 return true 17956 } 17957 // match: (MOVHZreg (MOVHreg x)) 17958 // cond: 17959 // result: (MOVHZreg x) 17960 for { 17961 v_0 := v.Args[0] 17962 if v_0.Op != OpS390XMOVHreg { 17963 break 17964 } 17965 x := v_0.Args[0] 17966 v.reset(OpS390XMOVHZreg) 17967 v.AddArg(x) 17968 return true 17969 } 17970 // match: (MOVHZreg (MOVDconst [c])) 17971 // cond: 17972 // result: (MOVDconst [int64(uint16(c))]) 17973 for { 17974 v_0 := v.Args[0] 17975 if v_0.Op != OpS390XMOVDconst { 17976 break 17977 } 17978 c := v_0.AuxInt 17979 v.reset(OpS390XMOVDconst) 17980 v.AuxInt = int64(uint16(c)) 17981 return true 17982 } 17983 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 17984 // cond: x.Uses == 1 && clobber(x) 17985 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 17986 for { 17987 x := v.Args[0] 17988 if x.Op != OpS390XMOVHZload { 17989 break 17990 } 17991 off := x.AuxInt 17992 sym := x.Aux 17993 _ = x.Args[1] 17994 ptr := x.Args[0] 17995 mem := x.Args[1] 17996 if !(x.Uses == 1 && clobber(x)) { 17997 break 17998 } 17999 b = x.Block 18000 v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, v.Type) 18001 v.reset(OpCopy) 18002 v.AddArg(v0) 18003 v0.AuxInt = off 18004 v0.Aux = sym 18005 v0.AddArg(ptr) 18006 v0.AddArg(mem) 18007 return true 18008 } 18009 // match: (MOVHZreg x:(MOVHload [off] {sym} ptr mem)) 18010 // cond: x.Uses == 1 && clobber(x) 18011 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 18012 for { 18013 x := v.Args[0] 18014 if x.Op != OpS390XMOVHload { 18015 break 18016 } 18017 off := x.AuxInt 18018 sym := x.Aux 18019 _ = x.Args[1] 18020 ptr := x.Args[0] 18021 mem := x.Args[1] 18022 if !(x.Uses == 1 && clobber(x)) { 18023 break 18024 } 18025 b = x.Block 18026 v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, v.Type) 18027 v.reset(OpCopy) 18028 v.AddArg(v0) 18029 v0.AuxInt = off 18030 v0.Aux = sym 18031 v0.AddArg(ptr) 18032 v0.AddArg(mem) 18033 return true 18034 } 18035 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 18036 // cond: x.Uses == 1 && clobber(x) 18037 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 18038 for { 18039 x := v.Args[0] 18040 if x.Op != OpS390XMOVHZloadidx { 18041 break 18042 } 18043 off := x.AuxInt 18044 sym := x.Aux 18045 _ = x.Args[2] 18046 ptr := x.Args[0] 18047 idx := x.Args[1] 18048 mem := x.Args[2] 18049 if !(x.Uses == 1 && clobber(x)) { 18050 break 18051 } 18052 b = x.Block 18053 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 18054 v.reset(OpCopy) 18055 v.AddArg(v0) 18056 v0.AuxInt = off 18057 v0.Aux = sym 18058 v0.AddArg(ptr) 18059 v0.AddArg(idx) 18060 v0.AddArg(mem) 18061 return true 18062 } 18063 return false 18064 } 18065 func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { 18066 b := v.Block 18067 _ = b 18068 typ := &b.Func.Config.Types 18069 _ = typ 18070 // match: (MOVHZreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 18071 // cond: x.Uses == 1 && clobber(x) 18072 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 18073 for { 18074 x := v.Args[0] 18075 if x.Op != OpS390XMOVHloadidx { 18076 break 18077 } 18078 off := x.AuxInt 18079 sym := x.Aux 18080 _ = x.Args[2] 18081 ptr := x.Args[0] 18082 idx := x.Args[1] 18083 mem := x.Args[2] 18084 if !(x.Uses == 1 && clobber(x)) { 18085 break 18086 } 18087 b = x.Block 18088 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 18089 v.reset(OpCopy) 18090 v.AddArg(v0) 18091 v0.AuxInt = off 18092 v0.Aux = sym 18093 v0.AddArg(ptr) 18094 v0.AddArg(idx) 18095 v0.AddArg(mem) 18096 return true 18097 } 18098 // match: (MOVHZreg (ANDWconst [m] x)) 18099 // cond: 18100 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(uint16(m))] x)) 18101 for { 18102 v_0 := v.Args[0] 18103 if v_0.Op != OpS390XANDWconst { 18104 break 18105 } 18106 m := v_0.AuxInt 18107 x := v_0.Args[0] 18108 v.reset(OpS390XMOVWZreg) 18109 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 18110 v0.AuxInt = int64(uint16(m)) 18111 v0.AddArg(x) 18112 v.AddArg(v0) 18113 return true 18114 } 18115 return false 18116 } 18117 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 18118 // match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 18119 // cond: isSamePtr(ptr1, ptr2) 18120 // result: (MOVHreg x) 18121 for { 18122 off := v.AuxInt 18123 sym := v.Aux 18124 _ = v.Args[1] 18125 ptr1 := v.Args[0] 18126 v_1 := v.Args[1] 18127 if v_1.Op != OpS390XMOVHstore { 18128 break 18129 } 18130 if v_1.AuxInt != off { 18131 break 18132 } 18133 if v_1.Aux != sym { 18134 break 18135 } 18136 _ = v_1.Args[2] 18137 ptr2 := v_1.Args[0] 18138 x := v_1.Args[1] 18139 if !(isSamePtr(ptr1, ptr2)) { 18140 break 18141 } 18142 v.reset(OpS390XMOVHreg) 18143 v.AddArg(x) 18144 return true 18145 } 18146 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 18147 // cond: is20Bit(off1+off2) 18148 // result: (MOVHload [off1+off2] {sym} ptr mem) 18149 for { 18150 off1 := v.AuxInt 18151 sym := v.Aux 18152 _ = v.Args[1] 18153 v_0 := v.Args[0] 18154 if v_0.Op != OpS390XADDconst { 18155 break 18156 } 18157 off2 := v_0.AuxInt 18158 ptr := v_0.Args[0] 18159 mem := v.Args[1] 18160 if !(is20Bit(off1 + off2)) { 18161 break 18162 } 18163 v.reset(OpS390XMOVHload) 18164 v.AuxInt = off1 + off2 18165 v.Aux = sym 18166 v.AddArg(ptr) 18167 v.AddArg(mem) 18168 return true 18169 } 18170 // match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 18171 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 18172 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 18173 for { 18174 off1 := v.AuxInt 18175 sym1 := v.Aux 18176 _ = v.Args[1] 18177 v_0 := v.Args[0] 18178 if v_0.Op != OpS390XMOVDaddr { 18179 break 18180 } 18181 t := v_0.Type 18182 off2 := v_0.AuxInt 18183 sym2 := v_0.Aux 18184 base := v_0.Args[0] 18185 mem := v.Args[1] 18186 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 18187 break 18188 } 18189 v.reset(OpS390XMOVHload) 18190 v.AuxInt = off1 + off2 18191 v.Aux = mergeSym(sym1, sym2) 18192 v.AddArg(base) 18193 v.AddArg(mem) 18194 return true 18195 } 18196 // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 18197 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 18198 // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 18199 for { 18200 off1 := v.AuxInt 18201 sym1 := v.Aux 18202 _ = v.Args[1] 18203 v_0 := v.Args[0] 18204 if v_0.Op != OpS390XMOVDaddridx { 18205 break 18206 } 18207 off2 := v_0.AuxInt 18208 sym2 := v_0.Aux 18209 _ = v_0.Args[1] 18210 ptr := v_0.Args[0] 18211 idx := v_0.Args[1] 18212 mem := v.Args[1] 18213 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 18214 break 18215 } 18216 v.reset(OpS390XMOVHloadidx) 18217 v.AuxInt = off1 + off2 18218 v.Aux = mergeSym(sym1, sym2) 18219 v.AddArg(ptr) 18220 v.AddArg(idx) 18221 v.AddArg(mem) 18222 return true 18223 } 18224 // match: (MOVHload [off] {sym} (ADD ptr idx) mem) 18225 // cond: ptr.Op != OpSB 18226 // result: (MOVHloadidx [off] {sym} ptr idx mem) 18227 for { 18228 off := v.AuxInt 18229 sym := v.Aux 18230 _ = v.Args[1] 18231 v_0 := v.Args[0] 18232 if v_0.Op != OpS390XADD { 18233 break 18234 } 18235 _ = v_0.Args[1] 18236 ptr := v_0.Args[0] 18237 idx := v_0.Args[1] 18238 mem := v.Args[1] 18239 if !(ptr.Op != OpSB) { 18240 break 18241 } 18242 v.reset(OpS390XMOVHloadidx) 18243 v.AuxInt = off 18244 v.Aux = sym 18245 v.AddArg(ptr) 18246 v.AddArg(idx) 18247 v.AddArg(mem) 18248 return true 18249 } 18250 return false 18251 } 18252 func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { 18253 // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 18254 // cond: is20Bit(c+d) 18255 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18256 for { 18257 c := v.AuxInt 18258 sym := v.Aux 18259 _ = v.Args[2] 18260 v_0 := v.Args[0] 18261 if v_0.Op != OpS390XADDconst { 18262 break 18263 } 18264 d := v_0.AuxInt 18265 ptr := v_0.Args[0] 18266 idx := v.Args[1] 18267 mem := v.Args[2] 18268 if !(is20Bit(c + d)) { 18269 break 18270 } 18271 v.reset(OpS390XMOVHloadidx) 18272 v.AuxInt = c + d 18273 v.Aux = sym 18274 v.AddArg(ptr) 18275 v.AddArg(idx) 18276 v.AddArg(mem) 18277 return true 18278 } 18279 // match: (MOVHloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 18280 // cond: is20Bit(c+d) 18281 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18282 for { 18283 c := v.AuxInt 18284 sym := v.Aux 18285 _ = v.Args[2] 18286 idx := v.Args[0] 18287 v_1 := v.Args[1] 18288 if v_1.Op != OpS390XADDconst { 18289 break 18290 } 18291 d := v_1.AuxInt 18292 ptr := v_1.Args[0] 18293 mem := v.Args[2] 18294 if !(is20Bit(c + d)) { 18295 break 18296 } 18297 v.reset(OpS390XMOVHloadidx) 18298 v.AuxInt = c + d 18299 v.Aux = sym 18300 v.AddArg(ptr) 18301 v.AddArg(idx) 18302 v.AddArg(mem) 18303 return true 18304 } 18305 // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 18306 // cond: is20Bit(c+d) 18307 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18308 for { 18309 c := v.AuxInt 18310 sym := v.Aux 18311 _ = v.Args[2] 18312 ptr := v.Args[0] 18313 v_1 := v.Args[1] 18314 if v_1.Op != OpS390XADDconst { 18315 break 18316 } 18317 d := v_1.AuxInt 18318 idx := v_1.Args[0] 18319 mem := v.Args[2] 18320 if !(is20Bit(c + d)) { 18321 break 18322 } 18323 v.reset(OpS390XMOVHloadidx) 18324 v.AuxInt = c + d 18325 v.Aux = sym 18326 v.AddArg(ptr) 18327 v.AddArg(idx) 18328 v.AddArg(mem) 18329 return true 18330 } 18331 // match: (MOVHloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 18332 // cond: is20Bit(c+d) 18333 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 18334 for { 18335 c := v.AuxInt 18336 sym := v.Aux 18337 _ = v.Args[2] 18338 v_0 := v.Args[0] 18339 if v_0.Op != OpS390XADDconst { 18340 break 18341 } 18342 d := v_0.AuxInt 18343 idx := v_0.Args[0] 18344 ptr := v.Args[1] 18345 mem := v.Args[2] 18346 if !(is20Bit(c + d)) { 18347 break 18348 } 18349 v.reset(OpS390XMOVHloadidx) 18350 v.AuxInt = c + d 18351 v.Aux = sym 18352 v.AddArg(ptr) 18353 v.AddArg(idx) 18354 v.AddArg(mem) 18355 return true 18356 } 18357 return false 18358 } 18359 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 18360 b := v.Block 18361 _ = b 18362 // match: (MOVHreg x:(MOVBload _ _)) 18363 // cond: 18364 // result: (MOVDreg x) 18365 for { 18366 x := v.Args[0] 18367 if x.Op != OpS390XMOVBload { 18368 break 18369 } 18370 _ = x.Args[1] 18371 v.reset(OpS390XMOVDreg) 18372 v.AddArg(x) 18373 return true 18374 } 18375 // match: (MOVHreg x:(MOVBZload _ _)) 18376 // cond: 18377 // result: (MOVDreg x) 18378 for { 18379 x := v.Args[0] 18380 if x.Op != OpS390XMOVBZload { 18381 break 18382 } 18383 _ = x.Args[1] 18384 v.reset(OpS390XMOVDreg) 18385 v.AddArg(x) 18386 return true 18387 } 18388 // match: (MOVHreg x:(MOVHload _ _)) 18389 // cond: 18390 // result: (MOVDreg x) 18391 for { 18392 x := v.Args[0] 18393 if x.Op != OpS390XMOVHload { 18394 break 18395 } 18396 _ = x.Args[1] 18397 v.reset(OpS390XMOVDreg) 18398 v.AddArg(x) 18399 return true 18400 } 18401 // match: (MOVHreg x:(Arg <t>)) 18402 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 18403 // result: (MOVDreg x) 18404 for { 18405 x := v.Args[0] 18406 if x.Op != OpArg { 18407 break 18408 } 18409 t := x.Type 18410 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 18411 break 18412 } 18413 v.reset(OpS390XMOVDreg) 18414 v.AddArg(x) 18415 return true 18416 } 18417 // match: (MOVHreg x:(MOVBreg _)) 18418 // cond: 18419 // result: (MOVDreg x) 18420 for { 18421 x := v.Args[0] 18422 if x.Op != OpS390XMOVBreg { 18423 break 18424 } 18425 v.reset(OpS390XMOVDreg) 18426 v.AddArg(x) 18427 return true 18428 } 18429 // match: (MOVHreg x:(MOVBZreg _)) 18430 // cond: 18431 // result: (MOVDreg x) 18432 for { 18433 x := v.Args[0] 18434 if x.Op != OpS390XMOVBZreg { 18435 break 18436 } 18437 v.reset(OpS390XMOVDreg) 18438 v.AddArg(x) 18439 return true 18440 } 18441 // match: (MOVHreg x:(MOVHreg _)) 18442 // cond: 18443 // result: (MOVDreg x) 18444 for { 18445 x := v.Args[0] 18446 if x.Op != OpS390XMOVHreg { 18447 break 18448 } 18449 v.reset(OpS390XMOVDreg) 18450 v.AddArg(x) 18451 return true 18452 } 18453 // match: (MOVHreg (MOVHZreg x)) 18454 // cond: 18455 // result: (MOVHreg x) 18456 for { 18457 v_0 := v.Args[0] 18458 if v_0.Op != OpS390XMOVHZreg { 18459 break 18460 } 18461 x := v_0.Args[0] 18462 v.reset(OpS390XMOVHreg) 18463 v.AddArg(x) 18464 return true 18465 } 18466 // match: (MOVHreg (MOVDconst [c])) 18467 // cond: 18468 // result: (MOVDconst [int64(int16(c))]) 18469 for { 18470 v_0 := v.Args[0] 18471 if v_0.Op != OpS390XMOVDconst { 18472 break 18473 } 18474 c := v_0.AuxInt 18475 v.reset(OpS390XMOVDconst) 18476 v.AuxInt = int64(int16(c)) 18477 return true 18478 } 18479 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 18480 // cond: x.Uses == 1 && clobber(x) 18481 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 18482 for { 18483 x := v.Args[0] 18484 if x.Op != OpS390XMOVHZload { 18485 break 18486 } 18487 off := x.AuxInt 18488 sym := x.Aux 18489 _ = x.Args[1] 18490 ptr := x.Args[0] 18491 mem := x.Args[1] 18492 if !(x.Uses == 1 && clobber(x)) { 18493 break 18494 } 18495 b = x.Block 18496 v0 := b.NewValue0(x.Pos, OpS390XMOVHload, v.Type) 18497 v.reset(OpCopy) 18498 v.AddArg(v0) 18499 v0.AuxInt = off 18500 v0.Aux = sym 18501 v0.AddArg(ptr) 18502 v0.AddArg(mem) 18503 return true 18504 } 18505 return false 18506 } 18507 func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { 18508 b := v.Block 18509 _ = b 18510 typ := &b.Func.Config.Types 18511 _ = typ 18512 // match: (MOVHreg x:(MOVHload [off] {sym} ptr mem)) 18513 // cond: x.Uses == 1 && clobber(x) 18514 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 18515 for { 18516 x := v.Args[0] 18517 if x.Op != OpS390XMOVHload { 18518 break 18519 } 18520 off := x.AuxInt 18521 sym := x.Aux 18522 _ = x.Args[1] 18523 ptr := x.Args[0] 18524 mem := x.Args[1] 18525 if !(x.Uses == 1 && clobber(x)) { 18526 break 18527 } 18528 b = x.Block 18529 v0 := b.NewValue0(x.Pos, OpS390XMOVHload, v.Type) 18530 v.reset(OpCopy) 18531 v.AddArg(v0) 18532 v0.AuxInt = off 18533 v0.Aux = sym 18534 v0.AddArg(ptr) 18535 v0.AddArg(mem) 18536 return true 18537 } 18538 // match: (MOVHreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 18539 // cond: x.Uses == 1 && clobber(x) 18540 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 18541 for { 18542 x := v.Args[0] 18543 if x.Op != OpS390XMOVHZloadidx { 18544 break 18545 } 18546 off := x.AuxInt 18547 sym := x.Aux 18548 _ = x.Args[2] 18549 ptr := x.Args[0] 18550 idx := x.Args[1] 18551 mem := x.Args[2] 18552 if !(x.Uses == 1 && clobber(x)) { 18553 break 18554 } 18555 b = x.Block 18556 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 18557 v.reset(OpCopy) 18558 v.AddArg(v0) 18559 v0.AuxInt = off 18560 v0.Aux = sym 18561 v0.AddArg(ptr) 18562 v0.AddArg(idx) 18563 v0.AddArg(mem) 18564 return true 18565 } 18566 // match: (MOVHreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 18567 // cond: x.Uses == 1 && clobber(x) 18568 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 18569 for { 18570 x := v.Args[0] 18571 if x.Op != OpS390XMOVHloadidx { 18572 break 18573 } 18574 off := x.AuxInt 18575 sym := x.Aux 18576 _ = x.Args[2] 18577 ptr := x.Args[0] 18578 idx := x.Args[1] 18579 mem := x.Args[2] 18580 if !(x.Uses == 1 && clobber(x)) { 18581 break 18582 } 18583 b = x.Block 18584 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 18585 v.reset(OpCopy) 18586 v.AddArg(v0) 18587 v0.AuxInt = off 18588 v0.Aux = sym 18589 v0.AddArg(ptr) 18590 v0.AddArg(idx) 18591 v0.AddArg(mem) 18592 return true 18593 } 18594 // match: (MOVHreg (ANDWconst [m] x)) 18595 // cond: int16(m) >= 0 18596 // result: (MOVWZreg (ANDWconst <typ.UInt32> [int64(uint16(m))] x)) 18597 for { 18598 v_0 := v.Args[0] 18599 if v_0.Op != OpS390XANDWconst { 18600 break 18601 } 18602 m := v_0.AuxInt 18603 x := v_0.Args[0] 18604 if !(int16(m) >= 0) { 18605 break 18606 } 18607 v.reset(OpS390XMOVWZreg) 18608 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 18609 v0.AuxInt = int64(uint16(m)) 18610 v0.AddArg(x) 18611 v.AddArg(v0) 18612 return true 18613 } 18614 return false 18615 } 18616 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 18617 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 18618 // cond: 18619 // result: (MOVHstore [off] {sym} ptr x mem) 18620 for { 18621 off := v.AuxInt 18622 sym := v.Aux 18623 _ = v.Args[2] 18624 ptr := v.Args[0] 18625 v_1 := v.Args[1] 18626 if v_1.Op != OpS390XMOVHreg { 18627 break 18628 } 18629 x := v_1.Args[0] 18630 mem := v.Args[2] 18631 v.reset(OpS390XMOVHstore) 18632 v.AuxInt = off 18633 v.Aux = sym 18634 v.AddArg(ptr) 18635 v.AddArg(x) 18636 v.AddArg(mem) 18637 return true 18638 } 18639 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 18640 // cond: 18641 // result: (MOVHstore [off] {sym} ptr x mem) 18642 for { 18643 off := v.AuxInt 18644 sym := v.Aux 18645 _ = v.Args[2] 18646 ptr := v.Args[0] 18647 v_1 := v.Args[1] 18648 if v_1.Op != OpS390XMOVHZreg { 18649 break 18650 } 18651 x := v_1.Args[0] 18652 mem := v.Args[2] 18653 v.reset(OpS390XMOVHstore) 18654 v.AuxInt = off 18655 v.Aux = sym 18656 v.AddArg(ptr) 18657 v.AddArg(x) 18658 v.AddArg(mem) 18659 return true 18660 } 18661 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 18662 // cond: is20Bit(off1+off2) 18663 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 18664 for { 18665 off1 := v.AuxInt 18666 sym := v.Aux 18667 _ = v.Args[2] 18668 v_0 := v.Args[0] 18669 if v_0.Op != OpS390XADDconst { 18670 break 18671 } 18672 off2 := v_0.AuxInt 18673 ptr := v_0.Args[0] 18674 val := v.Args[1] 18675 mem := v.Args[2] 18676 if !(is20Bit(off1 + off2)) { 18677 break 18678 } 18679 v.reset(OpS390XMOVHstore) 18680 v.AuxInt = off1 + off2 18681 v.Aux = sym 18682 v.AddArg(ptr) 18683 v.AddArg(val) 18684 v.AddArg(mem) 18685 return true 18686 } 18687 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 18688 // cond: isU12Bit(off) && ptr.Op != OpSB 18689 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 18690 for { 18691 off := v.AuxInt 18692 sym := v.Aux 18693 _ = v.Args[2] 18694 ptr := v.Args[0] 18695 v_1 := v.Args[1] 18696 if v_1.Op != OpS390XMOVDconst { 18697 break 18698 } 18699 c := v_1.AuxInt 18700 mem := v.Args[2] 18701 if !(isU12Bit(off) && ptr.Op != OpSB) { 18702 break 18703 } 18704 v.reset(OpS390XMOVHstoreconst) 18705 v.AuxInt = makeValAndOff(int64(int16(c)), off) 18706 v.Aux = sym 18707 v.AddArg(ptr) 18708 v.AddArg(mem) 18709 return true 18710 } 18711 // match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 18712 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 18713 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 18714 for { 18715 off1 := v.AuxInt 18716 sym1 := v.Aux 18717 _ = v.Args[2] 18718 v_0 := v.Args[0] 18719 if v_0.Op != OpS390XMOVDaddr { 18720 break 18721 } 18722 t := v_0.Type 18723 off2 := v_0.AuxInt 18724 sym2 := v_0.Aux 18725 base := v_0.Args[0] 18726 val := v.Args[1] 18727 mem := v.Args[2] 18728 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 18729 break 18730 } 18731 v.reset(OpS390XMOVHstore) 18732 v.AuxInt = off1 + off2 18733 v.Aux = mergeSym(sym1, sym2) 18734 v.AddArg(base) 18735 v.AddArg(val) 18736 v.AddArg(mem) 18737 return true 18738 } 18739 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 18740 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 18741 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 18742 for { 18743 off1 := v.AuxInt 18744 sym1 := v.Aux 18745 _ = v.Args[2] 18746 v_0 := v.Args[0] 18747 if v_0.Op != OpS390XMOVDaddridx { 18748 break 18749 } 18750 off2 := v_0.AuxInt 18751 sym2 := v_0.Aux 18752 _ = v_0.Args[1] 18753 ptr := v_0.Args[0] 18754 idx := v_0.Args[1] 18755 val := v.Args[1] 18756 mem := v.Args[2] 18757 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 18758 break 18759 } 18760 v.reset(OpS390XMOVHstoreidx) 18761 v.AuxInt = off1 + off2 18762 v.Aux = mergeSym(sym1, sym2) 18763 v.AddArg(ptr) 18764 v.AddArg(idx) 18765 v.AddArg(val) 18766 v.AddArg(mem) 18767 return true 18768 } 18769 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 18770 // cond: ptr.Op != OpSB 18771 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 18772 for { 18773 off := v.AuxInt 18774 sym := v.Aux 18775 _ = v.Args[2] 18776 v_0 := v.Args[0] 18777 if v_0.Op != OpS390XADD { 18778 break 18779 } 18780 _ = v_0.Args[1] 18781 ptr := v_0.Args[0] 18782 idx := v_0.Args[1] 18783 val := v.Args[1] 18784 mem := v.Args[2] 18785 if !(ptr.Op != OpSB) { 18786 break 18787 } 18788 v.reset(OpS390XMOVHstoreidx) 18789 v.AuxInt = off 18790 v.Aux = sym 18791 v.AddArg(ptr) 18792 v.AddArg(idx) 18793 v.AddArg(val) 18794 v.AddArg(mem) 18795 return true 18796 } 18797 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 18798 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18799 // result: (MOVWstore [i-2] {s} p w mem) 18800 for { 18801 i := v.AuxInt 18802 s := v.Aux 18803 _ = v.Args[2] 18804 p := v.Args[0] 18805 w := v.Args[1] 18806 x := v.Args[2] 18807 if x.Op != OpS390XMOVHstore { 18808 break 18809 } 18810 if x.AuxInt != i-2 { 18811 break 18812 } 18813 if x.Aux != s { 18814 break 18815 } 18816 _ = x.Args[2] 18817 if p != x.Args[0] { 18818 break 18819 } 18820 x_1 := x.Args[1] 18821 if x_1.Op != OpS390XSRDconst { 18822 break 18823 } 18824 if x_1.AuxInt != 16 { 18825 break 18826 } 18827 if w != x_1.Args[0] { 18828 break 18829 } 18830 mem := x.Args[2] 18831 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18832 break 18833 } 18834 v.reset(OpS390XMOVWstore) 18835 v.AuxInt = i - 2 18836 v.Aux = s 18837 v.AddArg(p) 18838 v.AddArg(w) 18839 v.AddArg(mem) 18840 return true 18841 } 18842 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 18843 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18844 // result: (MOVWstore [i-2] {s} p w0 mem) 18845 for { 18846 i := v.AuxInt 18847 s := v.Aux 18848 _ = v.Args[2] 18849 p := v.Args[0] 18850 w0 := v.Args[1] 18851 if w0.Op != OpS390XSRDconst { 18852 break 18853 } 18854 j := w0.AuxInt 18855 w := w0.Args[0] 18856 x := v.Args[2] 18857 if x.Op != OpS390XMOVHstore { 18858 break 18859 } 18860 if x.AuxInt != i-2 { 18861 break 18862 } 18863 if x.Aux != s { 18864 break 18865 } 18866 _ = x.Args[2] 18867 if p != x.Args[0] { 18868 break 18869 } 18870 x_1 := x.Args[1] 18871 if x_1.Op != OpS390XSRDconst { 18872 break 18873 } 18874 if x_1.AuxInt != j+16 { 18875 break 18876 } 18877 if w != x_1.Args[0] { 18878 break 18879 } 18880 mem := x.Args[2] 18881 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18882 break 18883 } 18884 v.reset(OpS390XMOVWstore) 18885 v.AuxInt = i - 2 18886 v.Aux = s 18887 v.AddArg(p) 18888 v.AddArg(w0) 18889 v.AddArg(mem) 18890 return true 18891 } 18892 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 18893 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18894 // result: (MOVWstore [i-2] {s} p w mem) 18895 for { 18896 i := v.AuxInt 18897 s := v.Aux 18898 _ = v.Args[2] 18899 p := v.Args[0] 18900 w := v.Args[1] 18901 x := v.Args[2] 18902 if x.Op != OpS390XMOVHstore { 18903 break 18904 } 18905 if x.AuxInt != i-2 { 18906 break 18907 } 18908 if x.Aux != s { 18909 break 18910 } 18911 _ = x.Args[2] 18912 if p != x.Args[0] { 18913 break 18914 } 18915 x_1 := x.Args[1] 18916 if x_1.Op != OpS390XSRWconst { 18917 break 18918 } 18919 if x_1.AuxInt != 16 { 18920 break 18921 } 18922 if w != x_1.Args[0] { 18923 break 18924 } 18925 mem := x.Args[2] 18926 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18927 break 18928 } 18929 v.reset(OpS390XMOVWstore) 18930 v.AuxInt = i - 2 18931 v.Aux = s 18932 v.AddArg(p) 18933 v.AddArg(w) 18934 v.AddArg(mem) 18935 return true 18936 } 18937 return false 18938 } 18939 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 18940 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 18941 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18942 // result: (MOVWstore [i-2] {s} p w0 mem) 18943 for { 18944 i := v.AuxInt 18945 s := v.Aux 18946 _ = v.Args[2] 18947 p := v.Args[0] 18948 w0 := v.Args[1] 18949 if w0.Op != OpS390XSRWconst { 18950 break 18951 } 18952 j := w0.AuxInt 18953 w := w0.Args[0] 18954 x := v.Args[2] 18955 if x.Op != OpS390XMOVHstore { 18956 break 18957 } 18958 if x.AuxInt != i-2 { 18959 break 18960 } 18961 if x.Aux != s { 18962 break 18963 } 18964 _ = x.Args[2] 18965 if p != x.Args[0] { 18966 break 18967 } 18968 x_1 := x.Args[1] 18969 if x_1.Op != OpS390XSRWconst { 18970 break 18971 } 18972 if x_1.AuxInt != j+16 { 18973 break 18974 } 18975 if w != x_1.Args[0] { 18976 break 18977 } 18978 mem := x.Args[2] 18979 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18980 break 18981 } 18982 v.reset(OpS390XMOVWstore) 18983 v.AuxInt = i - 2 18984 v.Aux = s 18985 v.AddArg(p) 18986 v.AddArg(w0) 18987 v.AddArg(mem) 18988 return true 18989 } 18990 return false 18991 } 18992 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 18993 b := v.Block 18994 _ = b 18995 typ := &b.Func.Config.Types 18996 _ = typ 18997 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 18998 // cond: isU12Bit(ValAndOff(sc).Off()+off) 18999 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 19000 for { 19001 sc := v.AuxInt 19002 s := v.Aux 19003 _ = v.Args[1] 19004 v_0 := v.Args[0] 19005 if v_0.Op != OpS390XADDconst { 19006 break 19007 } 19008 off := v_0.AuxInt 19009 ptr := v_0.Args[0] 19010 mem := v.Args[1] 19011 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 19012 break 19013 } 19014 v.reset(OpS390XMOVHstoreconst) 19015 v.AuxInt = ValAndOff(sc).add(off) 19016 v.Aux = s 19017 v.AddArg(ptr) 19018 v.AddArg(mem) 19019 return true 19020 } 19021 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 19022 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 19023 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 19024 for { 19025 sc := v.AuxInt 19026 sym1 := v.Aux 19027 _ = v.Args[1] 19028 v_0 := v.Args[0] 19029 if v_0.Op != OpS390XMOVDaddr { 19030 break 19031 } 19032 off := v_0.AuxInt 19033 sym2 := v_0.Aux 19034 ptr := v_0.Args[0] 19035 mem := v.Args[1] 19036 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 19037 break 19038 } 19039 v.reset(OpS390XMOVHstoreconst) 19040 v.AuxInt = ValAndOff(sc).add(off) 19041 v.Aux = mergeSym(sym1, sym2) 19042 v.AddArg(ptr) 19043 v.AddArg(mem) 19044 return true 19045 } 19046 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 19047 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 19048 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 19049 for { 19050 c := v.AuxInt 19051 s := v.Aux 19052 _ = v.Args[1] 19053 p := v.Args[0] 19054 x := v.Args[1] 19055 if x.Op != OpS390XMOVHstoreconst { 19056 break 19057 } 19058 a := x.AuxInt 19059 if x.Aux != s { 19060 break 19061 } 19062 _ = x.Args[1] 19063 if p != x.Args[0] { 19064 break 19065 } 19066 mem := x.Args[1] 19067 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 19068 break 19069 } 19070 v.reset(OpS390XMOVWstore) 19071 v.AuxInt = ValAndOff(a).Off() 19072 v.Aux = s 19073 v.AddArg(p) 19074 v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) 19075 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 19076 v.AddArg(v0) 19077 v.AddArg(mem) 19078 return true 19079 } 19080 return false 19081 } 19082 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 19083 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 19084 // cond: is20Bit(c+d) 19085 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19086 for { 19087 c := v.AuxInt 19088 sym := v.Aux 19089 _ = v.Args[3] 19090 v_0 := v.Args[0] 19091 if v_0.Op != OpS390XADDconst { 19092 break 19093 } 19094 d := v_0.AuxInt 19095 ptr := v_0.Args[0] 19096 idx := v.Args[1] 19097 val := v.Args[2] 19098 mem := v.Args[3] 19099 if !(is20Bit(c + d)) { 19100 break 19101 } 19102 v.reset(OpS390XMOVHstoreidx) 19103 v.AuxInt = c + d 19104 v.Aux = sym 19105 v.AddArg(ptr) 19106 v.AddArg(idx) 19107 v.AddArg(val) 19108 v.AddArg(mem) 19109 return true 19110 } 19111 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 19112 // cond: is20Bit(c+d) 19113 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19114 for { 19115 c := v.AuxInt 19116 sym := v.Aux 19117 _ = v.Args[3] 19118 idx := v.Args[0] 19119 v_1 := v.Args[1] 19120 if v_1.Op != OpS390XADDconst { 19121 break 19122 } 19123 d := v_1.AuxInt 19124 ptr := v_1.Args[0] 19125 val := v.Args[2] 19126 mem := v.Args[3] 19127 if !(is20Bit(c + d)) { 19128 break 19129 } 19130 v.reset(OpS390XMOVHstoreidx) 19131 v.AuxInt = c + d 19132 v.Aux = sym 19133 v.AddArg(ptr) 19134 v.AddArg(idx) 19135 v.AddArg(val) 19136 v.AddArg(mem) 19137 return true 19138 } 19139 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 19140 // cond: is20Bit(c+d) 19141 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19142 for { 19143 c := v.AuxInt 19144 sym := v.Aux 19145 _ = v.Args[3] 19146 ptr := v.Args[0] 19147 v_1 := v.Args[1] 19148 if v_1.Op != OpS390XADDconst { 19149 break 19150 } 19151 d := v_1.AuxInt 19152 idx := v_1.Args[0] 19153 val := v.Args[2] 19154 mem := v.Args[3] 19155 if !(is20Bit(c + d)) { 19156 break 19157 } 19158 v.reset(OpS390XMOVHstoreidx) 19159 v.AuxInt = c + d 19160 v.Aux = sym 19161 v.AddArg(ptr) 19162 v.AddArg(idx) 19163 v.AddArg(val) 19164 v.AddArg(mem) 19165 return true 19166 } 19167 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 19168 // cond: is20Bit(c+d) 19169 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 19170 for { 19171 c := v.AuxInt 19172 sym := v.Aux 19173 _ = v.Args[3] 19174 v_0 := v.Args[0] 19175 if v_0.Op != OpS390XADDconst { 19176 break 19177 } 19178 d := v_0.AuxInt 19179 idx := v_0.Args[0] 19180 ptr := v.Args[1] 19181 val := v.Args[2] 19182 mem := v.Args[3] 19183 if !(is20Bit(c + d)) { 19184 break 19185 } 19186 v.reset(OpS390XMOVHstoreidx) 19187 v.AuxInt = c + d 19188 v.Aux = sym 19189 v.AddArg(ptr) 19190 v.AddArg(idx) 19191 v.AddArg(val) 19192 v.AddArg(mem) 19193 return true 19194 } 19195 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 19196 // cond: x.Uses == 1 && clobber(x) 19197 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19198 for { 19199 i := v.AuxInt 19200 s := v.Aux 19201 _ = v.Args[3] 19202 p := v.Args[0] 19203 idx := v.Args[1] 19204 w := v.Args[2] 19205 x := v.Args[3] 19206 if x.Op != OpS390XMOVHstoreidx { 19207 break 19208 } 19209 if x.AuxInt != i-2 { 19210 break 19211 } 19212 if x.Aux != s { 19213 break 19214 } 19215 _ = x.Args[3] 19216 if p != x.Args[0] { 19217 break 19218 } 19219 if idx != x.Args[1] { 19220 break 19221 } 19222 x_2 := x.Args[2] 19223 if x_2.Op != OpS390XSRDconst { 19224 break 19225 } 19226 if x_2.AuxInt != 16 { 19227 break 19228 } 19229 if w != x_2.Args[0] { 19230 break 19231 } 19232 mem := x.Args[3] 19233 if !(x.Uses == 1 && clobber(x)) { 19234 break 19235 } 19236 v.reset(OpS390XMOVWstoreidx) 19237 v.AuxInt = i - 2 19238 v.Aux = s 19239 v.AddArg(p) 19240 v.AddArg(idx) 19241 v.AddArg(w) 19242 v.AddArg(mem) 19243 return true 19244 } 19245 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 19246 // cond: x.Uses == 1 && clobber(x) 19247 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19248 for { 19249 i := v.AuxInt 19250 s := v.Aux 19251 _ = v.Args[3] 19252 p := v.Args[0] 19253 idx := v.Args[1] 19254 w := v.Args[2] 19255 x := v.Args[3] 19256 if x.Op != OpS390XMOVHstoreidx { 19257 break 19258 } 19259 if x.AuxInt != i-2 { 19260 break 19261 } 19262 if x.Aux != s { 19263 break 19264 } 19265 _ = x.Args[3] 19266 if idx != x.Args[0] { 19267 break 19268 } 19269 if p != x.Args[1] { 19270 break 19271 } 19272 x_2 := x.Args[2] 19273 if x_2.Op != OpS390XSRDconst { 19274 break 19275 } 19276 if x_2.AuxInt != 16 { 19277 break 19278 } 19279 if w != x_2.Args[0] { 19280 break 19281 } 19282 mem := x.Args[3] 19283 if !(x.Uses == 1 && clobber(x)) { 19284 break 19285 } 19286 v.reset(OpS390XMOVWstoreidx) 19287 v.AuxInt = i - 2 19288 v.Aux = s 19289 v.AddArg(p) 19290 v.AddArg(idx) 19291 v.AddArg(w) 19292 v.AddArg(mem) 19293 return true 19294 } 19295 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 19296 // cond: x.Uses == 1 && clobber(x) 19297 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19298 for { 19299 i := v.AuxInt 19300 s := v.Aux 19301 _ = v.Args[3] 19302 idx := v.Args[0] 19303 p := v.Args[1] 19304 w := v.Args[2] 19305 x := v.Args[3] 19306 if x.Op != OpS390XMOVHstoreidx { 19307 break 19308 } 19309 if x.AuxInt != i-2 { 19310 break 19311 } 19312 if x.Aux != s { 19313 break 19314 } 19315 _ = x.Args[3] 19316 if p != x.Args[0] { 19317 break 19318 } 19319 if idx != x.Args[1] { 19320 break 19321 } 19322 x_2 := x.Args[2] 19323 if x_2.Op != OpS390XSRDconst { 19324 break 19325 } 19326 if x_2.AuxInt != 16 { 19327 break 19328 } 19329 if w != x_2.Args[0] { 19330 break 19331 } 19332 mem := x.Args[3] 19333 if !(x.Uses == 1 && clobber(x)) { 19334 break 19335 } 19336 v.reset(OpS390XMOVWstoreidx) 19337 v.AuxInt = i - 2 19338 v.Aux = s 19339 v.AddArg(p) 19340 v.AddArg(idx) 19341 v.AddArg(w) 19342 v.AddArg(mem) 19343 return true 19344 } 19345 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 19346 // cond: x.Uses == 1 && clobber(x) 19347 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19348 for { 19349 i := v.AuxInt 19350 s := v.Aux 19351 _ = v.Args[3] 19352 idx := v.Args[0] 19353 p := v.Args[1] 19354 w := v.Args[2] 19355 x := v.Args[3] 19356 if x.Op != OpS390XMOVHstoreidx { 19357 break 19358 } 19359 if x.AuxInt != i-2 { 19360 break 19361 } 19362 if x.Aux != s { 19363 break 19364 } 19365 _ = x.Args[3] 19366 if idx != x.Args[0] { 19367 break 19368 } 19369 if p != x.Args[1] { 19370 break 19371 } 19372 x_2 := x.Args[2] 19373 if x_2.Op != OpS390XSRDconst { 19374 break 19375 } 19376 if x_2.AuxInt != 16 { 19377 break 19378 } 19379 if w != x_2.Args[0] { 19380 break 19381 } 19382 mem := x.Args[3] 19383 if !(x.Uses == 1 && clobber(x)) { 19384 break 19385 } 19386 v.reset(OpS390XMOVWstoreidx) 19387 v.AuxInt = i - 2 19388 v.Aux = s 19389 v.AddArg(p) 19390 v.AddArg(idx) 19391 v.AddArg(w) 19392 v.AddArg(mem) 19393 return true 19394 } 19395 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 19396 // cond: x.Uses == 1 && clobber(x) 19397 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19398 for { 19399 i := v.AuxInt 19400 s := v.Aux 19401 _ = v.Args[3] 19402 p := v.Args[0] 19403 idx := v.Args[1] 19404 w0 := v.Args[2] 19405 if w0.Op != OpS390XSRDconst { 19406 break 19407 } 19408 j := w0.AuxInt 19409 w := w0.Args[0] 19410 x := v.Args[3] 19411 if x.Op != OpS390XMOVHstoreidx { 19412 break 19413 } 19414 if x.AuxInt != i-2 { 19415 break 19416 } 19417 if x.Aux != s { 19418 break 19419 } 19420 _ = x.Args[3] 19421 if p != x.Args[0] { 19422 break 19423 } 19424 if idx != x.Args[1] { 19425 break 19426 } 19427 x_2 := x.Args[2] 19428 if x_2.Op != OpS390XSRDconst { 19429 break 19430 } 19431 if x_2.AuxInt != j+16 { 19432 break 19433 } 19434 if w != x_2.Args[0] { 19435 break 19436 } 19437 mem := x.Args[3] 19438 if !(x.Uses == 1 && clobber(x)) { 19439 break 19440 } 19441 v.reset(OpS390XMOVWstoreidx) 19442 v.AuxInt = i - 2 19443 v.Aux = s 19444 v.AddArg(p) 19445 v.AddArg(idx) 19446 v.AddArg(w0) 19447 v.AddArg(mem) 19448 return true 19449 } 19450 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 19451 // cond: x.Uses == 1 && clobber(x) 19452 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19453 for { 19454 i := v.AuxInt 19455 s := v.Aux 19456 _ = v.Args[3] 19457 p := v.Args[0] 19458 idx := v.Args[1] 19459 w0 := v.Args[2] 19460 if w0.Op != OpS390XSRDconst { 19461 break 19462 } 19463 j := w0.AuxInt 19464 w := w0.Args[0] 19465 x := v.Args[3] 19466 if x.Op != OpS390XMOVHstoreidx { 19467 break 19468 } 19469 if x.AuxInt != i-2 { 19470 break 19471 } 19472 if x.Aux != s { 19473 break 19474 } 19475 _ = x.Args[3] 19476 if idx != x.Args[0] { 19477 break 19478 } 19479 if p != x.Args[1] { 19480 break 19481 } 19482 x_2 := x.Args[2] 19483 if x_2.Op != OpS390XSRDconst { 19484 break 19485 } 19486 if x_2.AuxInt != j+16 { 19487 break 19488 } 19489 if w != x_2.Args[0] { 19490 break 19491 } 19492 mem := x.Args[3] 19493 if !(x.Uses == 1 && clobber(x)) { 19494 break 19495 } 19496 v.reset(OpS390XMOVWstoreidx) 19497 v.AuxInt = i - 2 19498 v.Aux = s 19499 v.AddArg(p) 19500 v.AddArg(idx) 19501 v.AddArg(w0) 19502 v.AddArg(mem) 19503 return true 19504 } 19505 return false 19506 } 19507 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 19508 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 19509 // cond: x.Uses == 1 && clobber(x) 19510 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19511 for { 19512 i := v.AuxInt 19513 s := v.Aux 19514 _ = v.Args[3] 19515 idx := v.Args[0] 19516 p := v.Args[1] 19517 w0 := v.Args[2] 19518 if w0.Op != OpS390XSRDconst { 19519 break 19520 } 19521 j := w0.AuxInt 19522 w := w0.Args[0] 19523 x := v.Args[3] 19524 if x.Op != OpS390XMOVHstoreidx { 19525 break 19526 } 19527 if x.AuxInt != i-2 { 19528 break 19529 } 19530 if x.Aux != s { 19531 break 19532 } 19533 _ = x.Args[3] 19534 if p != x.Args[0] { 19535 break 19536 } 19537 if idx != x.Args[1] { 19538 break 19539 } 19540 x_2 := x.Args[2] 19541 if x_2.Op != OpS390XSRDconst { 19542 break 19543 } 19544 if x_2.AuxInt != j+16 { 19545 break 19546 } 19547 if w != x_2.Args[0] { 19548 break 19549 } 19550 mem := x.Args[3] 19551 if !(x.Uses == 1 && clobber(x)) { 19552 break 19553 } 19554 v.reset(OpS390XMOVWstoreidx) 19555 v.AuxInt = i - 2 19556 v.Aux = s 19557 v.AddArg(p) 19558 v.AddArg(idx) 19559 v.AddArg(w0) 19560 v.AddArg(mem) 19561 return true 19562 } 19563 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 19564 // cond: x.Uses == 1 && clobber(x) 19565 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19566 for { 19567 i := v.AuxInt 19568 s := v.Aux 19569 _ = v.Args[3] 19570 idx := v.Args[0] 19571 p := v.Args[1] 19572 w0 := v.Args[2] 19573 if w0.Op != OpS390XSRDconst { 19574 break 19575 } 19576 j := w0.AuxInt 19577 w := w0.Args[0] 19578 x := v.Args[3] 19579 if x.Op != OpS390XMOVHstoreidx { 19580 break 19581 } 19582 if x.AuxInt != i-2 { 19583 break 19584 } 19585 if x.Aux != s { 19586 break 19587 } 19588 _ = x.Args[3] 19589 if idx != x.Args[0] { 19590 break 19591 } 19592 if p != x.Args[1] { 19593 break 19594 } 19595 x_2 := x.Args[2] 19596 if x_2.Op != OpS390XSRDconst { 19597 break 19598 } 19599 if x_2.AuxInt != j+16 { 19600 break 19601 } 19602 if w != x_2.Args[0] { 19603 break 19604 } 19605 mem := x.Args[3] 19606 if !(x.Uses == 1 && clobber(x)) { 19607 break 19608 } 19609 v.reset(OpS390XMOVWstoreidx) 19610 v.AuxInt = i - 2 19611 v.Aux = s 19612 v.AddArg(p) 19613 v.AddArg(idx) 19614 v.AddArg(w0) 19615 v.AddArg(mem) 19616 return true 19617 } 19618 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 19619 // cond: x.Uses == 1 && clobber(x) 19620 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19621 for { 19622 i := v.AuxInt 19623 s := v.Aux 19624 _ = v.Args[3] 19625 p := v.Args[0] 19626 idx := v.Args[1] 19627 w := v.Args[2] 19628 x := v.Args[3] 19629 if x.Op != OpS390XMOVHstoreidx { 19630 break 19631 } 19632 if x.AuxInt != i-2 { 19633 break 19634 } 19635 if x.Aux != s { 19636 break 19637 } 19638 _ = x.Args[3] 19639 if p != x.Args[0] { 19640 break 19641 } 19642 if idx != x.Args[1] { 19643 break 19644 } 19645 x_2 := x.Args[2] 19646 if x_2.Op != OpS390XSRWconst { 19647 break 19648 } 19649 if x_2.AuxInt != 16 { 19650 break 19651 } 19652 if w != x_2.Args[0] { 19653 break 19654 } 19655 mem := x.Args[3] 19656 if !(x.Uses == 1 && clobber(x)) { 19657 break 19658 } 19659 v.reset(OpS390XMOVWstoreidx) 19660 v.AuxInt = i - 2 19661 v.Aux = s 19662 v.AddArg(p) 19663 v.AddArg(idx) 19664 v.AddArg(w) 19665 v.AddArg(mem) 19666 return true 19667 } 19668 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 19669 // cond: x.Uses == 1 && clobber(x) 19670 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19671 for { 19672 i := v.AuxInt 19673 s := v.Aux 19674 _ = v.Args[3] 19675 p := v.Args[0] 19676 idx := v.Args[1] 19677 w := v.Args[2] 19678 x := v.Args[3] 19679 if x.Op != OpS390XMOVHstoreidx { 19680 break 19681 } 19682 if x.AuxInt != i-2 { 19683 break 19684 } 19685 if x.Aux != s { 19686 break 19687 } 19688 _ = x.Args[3] 19689 if idx != x.Args[0] { 19690 break 19691 } 19692 if p != x.Args[1] { 19693 break 19694 } 19695 x_2 := x.Args[2] 19696 if x_2.Op != OpS390XSRWconst { 19697 break 19698 } 19699 if x_2.AuxInt != 16 { 19700 break 19701 } 19702 if w != x_2.Args[0] { 19703 break 19704 } 19705 mem := x.Args[3] 19706 if !(x.Uses == 1 && clobber(x)) { 19707 break 19708 } 19709 v.reset(OpS390XMOVWstoreidx) 19710 v.AuxInt = i - 2 19711 v.Aux = s 19712 v.AddArg(p) 19713 v.AddArg(idx) 19714 v.AddArg(w) 19715 v.AddArg(mem) 19716 return true 19717 } 19718 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 19719 // cond: x.Uses == 1 && clobber(x) 19720 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19721 for { 19722 i := v.AuxInt 19723 s := v.Aux 19724 _ = v.Args[3] 19725 idx := v.Args[0] 19726 p := v.Args[1] 19727 w := v.Args[2] 19728 x := v.Args[3] 19729 if x.Op != OpS390XMOVHstoreidx { 19730 break 19731 } 19732 if x.AuxInt != i-2 { 19733 break 19734 } 19735 if x.Aux != s { 19736 break 19737 } 19738 _ = x.Args[3] 19739 if p != x.Args[0] { 19740 break 19741 } 19742 if idx != x.Args[1] { 19743 break 19744 } 19745 x_2 := x.Args[2] 19746 if x_2.Op != OpS390XSRWconst { 19747 break 19748 } 19749 if x_2.AuxInt != 16 { 19750 break 19751 } 19752 if w != x_2.Args[0] { 19753 break 19754 } 19755 mem := x.Args[3] 19756 if !(x.Uses == 1 && clobber(x)) { 19757 break 19758 } 19759 v.reset(OpS390XMOVWstoreidx) 19760 v.AuxInt = i - 2 19761 v.Aux = s 19762 v.AddArg(p) 19763 v.AddArg(idx) 19764 v.AddArg(w) 19765 v.AddArg(mem) 19766 return true 19767 } 19768 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 19769 // cond: x.Uses == 1 && clobber(x) 19770 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 19771 for { 19772 i := v.AuxInt 19773 s := v.Aux 19774 _ = v.Args[3] 19775 idx := v.Args[0] 19776 p := v.Args[1] 19777 w := v.Args[2] 19778 x := v.Args[3] 19779 if x.Op != OpS390XMOVHstoreidx { 19780 break 19781 } 19782 if x.AuxInt != i-2 { 19783 break 19784 } 19785 if x.Aux != s { 19786 break 19787 } 19788 _ = x.Args[3] 19789 if idx != x.Args[0] { 19790 break 19791 } 19792 if p != x.Args[1] { 19793 break 19794 } 19795 x_2 := x.Args[2] 19796 if x_2.Op != OpS390XSRWconst { 19797 break 19798 } 19799 if x_2.AuxInt != 16 { 19800 break 19801 } 19802 if w != x_2.Args[0] { 19803 break 19804 } 19805 mem := x.Args[3] 19806 if !(x.Uses == 1 && clobber(x)) { 19807 break 19808 } 19809 v.reset(OpS390XMOVWstoreidx) 19810 v.AuxInt = i - 2 19811 v.Aux = s 19812 v.AddArg(p) 19813 v.AddArg(idx) 19814 v.AddArg(w) 19815 v.AddArg(mem) 19816 return true 19817 } 19818 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 19819 // cond: x.Uses == 1 && clobber(x) 19820 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19821 for { 19822 i := v.AuxInt 19823 s := v.Aux 19824 _ = v.Args[3] 19825 p := v.Args[0] 19826 idx := v.Args[1] 19827 w0 := v.Args[2] 19828 if w0.Op != OpS390XSRWconst { 19829 break 19830 } 19831 j := w0.AuxInt 19832 w := w0.Args[0] 19833 x := v.Args[3] 19834 if x.Op != OpS390XMOVHstoreidx { 19835 break 19836 } 19837 if x.AuxInt != i-2 { 19838 break 19839 } 19840 if x.Aux != s { 19841 break 19842 } 19843 _ = x.Args[3] 19844 if p != x.Args[0] { 19845 break 19846 } 19847 if idx != x.Args[1] { 19848 break 19849 } 19850 x_2 := x.Args[2] 19851 if x_2.Op != OpS390XSRWconst { 19852 break 19853 } 19854 if x_2.AuxInt != j+16 { 19855 break 19856 } 19857 if w != x_2.Args[0] { 19858 break 19859 } 19860 mem := x.Args[3] 19861 if !(x.Uses == 1 && clobber(x)) { 19862 break 19863 } 19864 v.reset(OpS390XMOVWstoreidx) 19865 v.AuxInt = i - 2 19866 v.Aux = s 19867 v.AddArg(p) 19868 v.AddArg(idx) 19869 v.AddArg(w0) 19870 v.AddArg(mem) 19871 return true 19872 } 19873 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 19874 // cond: x.Uses == 1 && clobber(x) 19875 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19876 for { 19877 i := v.AuxInt 19878 s := v.Aux 19879 _ = v.Args[3] 19880 p := v.Args[0] 19881 idx := v.Args[1] 19882 w0 := v.Args[2] 19883 if w0.Op != OpS390XSRWconst { 19884 break 19885 } 19886 j := w0.AuxInt 19887 w := w0.Args[0] 19888 x := v.Args[3] 19889 if x.Op != OpS390XMOVHstoreidx { 19890 break 19891 } 19892 if x.AuxInt != i-2 { 19893 break 19894 } 19895 if x.Aux != s { 19896 break 19897 } 19898 _ = x.Args[3] 19899 if idx != x.Args[0] { 19900 break 19901 } 19902 if p != x.Args[1] { 19903 break 19904 } 19905 x_2 := x.Args[2] 19906 if x_2.Op != OpS390XSRWconst { 19907 break 19908 } 19909 if x_2.AuxInt != j+16 { 19910 break 19911 } 19912 if w != x_2.Args[0] { 19913 break 19914 } 19915 mem := x.Args[3] 19916 if !(x.Uses == 1 && clobber(x)) { 19917 break 19918 } 19919 v.reset(OpS390XMOVWstoreidx) 19920 v.AuxInt = i - 2 19921 v.Aux = s 19922 v.AddArg(p) 19923 v.AddArg(idx) 19924 v.AddArg(w0) 19925 v.AddArg(mem) 19926 return true 19927 } 19928 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 19929 // cond: x.Uses == 1 && clobber(x) 19930 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19931 for { 19932 i := v.AuxInt 19933 s := v.Aux 19934 _ = v.Args[3] 19935 idx := v.Args[0] 19936 p := v.Args[1] 19937 w0 := v.Args[2] 19938 if w0.Op != OpS390XSRWconst { 19939 break 19940 } 19941 j := w0.AuxInt 19942 w := w0.Args[0] 19943 x := v.Args[3] 19944 if x.Op != OpS390XMOVHstoreidx { 19945 break 19946 } 19947 if x.AuxInt != i-2 { 19948 break 19949 } 19950 if x.Aux != s { 19951 break 19952 } 19953 _ = x.Args[3] 19954 if p != x.Args[0] { 19955 break 19956 } 19957 if idx != x.Args[1] { 19958 break 19959 } 19960 x_2 := x.Args[2] 19961 if x_2.Op != OpS390XSRWconst { 19962 break 19963 } 19964 if x_2.AuxInt != j+16 { 19965 break 19966 } 19967 if w != x_2.Args[0] { 19968 break 19969 } 19970 mem := x.Args[3] 19971 if !(x.Uses == 1 && clobber(x)) { 19972 break 19973 } 19974 v.reset(OpS390XMOVWstoreidx) 19975 v.AuxInt = i - 2 19976 v.Aux = s 19977 v.AddArg(p) 19978 v.AddArg(idx) 19979 v.AddArg(w0) 19980 v.AddArg(mem) 19981 return true 19982 } 19983 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 19984 // cond: x.Uses == 1 && clobber(x) 19985 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 19986 for { 19987 i := v.AuxInt 19988 s := v.Aux 19989 _ = v.Args[3] 19990 idx := v.Args[0] 19991 p := v.Args[1] 19992 w0 := v.Args[2] 19993 if w0.Op != OpS390XSRWconst { 19994 break 19995 } 19996 j := w0.AuxInt 19997 w := w0.Args[0] 19998 x := v.Args[3] 19999 if x.Op != OpS390XMOVHstoreidx { 20000 break 20001 } 20002 if x.AuxInt != i-2 { 20003 break 20004 } 20005 if x.Aux != s { 20006 break 20007 } 20008 _ = x.Args[3] 20009 if idx != x.Args[0] { 20010 break 20011 } 20012 if p != x.Args[1] { 20013 break 20014 } 20015 x_2 := x.Args[2] 20016 if x_2.Op != OpS390XSRWconst { 20017 break 20018 } 20019 if x_2.AuxInt != j+16 { 20020 break 20021 } 20022 if w != x_2.Args[0] { 20023 break 20024 } 20025 mem := x.Args[3] 20026 if !(x.Uses == 1 && clobber(x)) { 20027 break 20028 } 20029 v.reset(OpS390XMOVWstoreidx) 20030 v.AuxInt = i - 2 20031 v.Aux = s 20032 v.AddArg(p) 20033 v.AddArg(idx) 20034 v.AddArg(w0) 20035 v.AddArg(mem) 20036 return true 20037 } 20038 return false 20039 } 20040 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 20041 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 20042 // cond: x.Uses == 1 && clobber(x) 20043 // result: (MOVDBRstore [i-4] {s} p w mem) 20044 for { 20045 i := v.AuxInt 20046 s := v.Aux 20047 _ = v.Args[2] 20048 p := v.Args[0] 20049 v_1 := v.Args[1] 20050 if v_1.Op != OpS390XSRDconst { 20051 break 20052 } 20053 if v_1.AuxInt != 32 { 20054 break 20055 } 20056 w := v_1.Args[0] 20057 x := v.Args[2] 20058 if x.Op != OpS390XMOVWBRstore { 20059 break 20060 } 20061 if x.AuxInt != i-4 { 20062 break 20063 } 20064 if x.Aux != s { 20065 break 20066 } 20067 _ = x.Args[2] 20068 if p != x.Args[0] { 20069 break 20070 } 20071 if w != x.Args[1] { 20072 break 20073 } 20074 mem := x.Args[2] 20075 if !(x.Uses == 1 && clobber(x)) { 20076 break 20077 } 20078 v.reset(OpS390XMOVDBRstore) 20079 v.AuxInt = i - 4 20080 v.Aux = s 20081 v.AddArg(p) 20082 v.AddArg(w) 20083 v.AddArg(mem) 20084 return true 20085 } 20086 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 20087 // cond: x.Uses == 1 && clobber(x) 20088 // result: (MOVDBRstore [i-4] {s} p w0 mem) 20089 for { 20090 i := v.AuxInt 20091 s := v.Aux 20092 _ = v.Args[2] 20093 p := v.Args[0] 20094 v_1 := v.Args[1] 20095 if v_1.Op != OpS390XSRDconst { 20096 break 20097 } 20098 j := v_1.AuxInt 20099 w := v_1.Args[0] 20100 x := v.Args[2] 20101 if x.Op != OpS390XMOVWBRstore { 20102 break 20103 } 20104 if x.AuxInt != i-4 { 20105 break 20106 } 20107 if x.Aux != s { 20108 break 20109 } 20110 _ = x.Args[2] 20111 if p != x.Args[0] { 20112 break 20113 } 20114 w0 := x.Args[1] 20115 if w0.Op != OpS390XSRDconst { 20116 break 20117 } 20118 if w0.AuxInt != j-32 { 20119 break 20120 } 20121 if w != w0.Args[0] { 20122 break 20123 } 20124 mem := x.Args[2] 20125 if !(x.Uses == 1 && clobber(x)) { 20126 break 20127 } 20128 v.reset(OpS390XMOVDBRstore) 20129 v.AuxInt = i - 4 20130 v.Aux = s 20131 v.AddArg(p) 20132 v.AddArg(w0) 20133 v.AddArg(mem) 20134 return true 20135 } 20136 return false 20137 } 20138 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 20139 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 20140 // cond: x.Uses == 1 && clobber(x) 20141 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20142 for { 20143 i := v.AuxInt 20144 s := v.Aux 20145 _ = v.Args[3] 20146 p := v.Args[0] 20147 idx := v.Args[1] 20148 v_2 := v.Args[2] 20149 if v_2.Op != OpS390XSRDconst { 20150 break 20151 } 20152 if v_2.AuxInt != 32 { 20153 break 20154 } 20155 w := v_2.Args[0] 20156 x := v.Args[3] 20157 if x.Op != OpS390XMOVWBRstoreidx { 20158 break 20159 } 20160 if x.AuxInt != i-4 { 20161 break 20162 } 20163 if x.Aux != s { 20164 break 20165 } 20166 _ = x.Args[3] 20167 if p != x.Args[0] { 20168 break 20169 } 20170 if idx != x.Args[1] { 20171 break 20172 } 20173 if w != x.Args[2] { 20174 break 20175 } 20176 mem := x.Args[3] 20177 if !(x.Uses == 1 && clobber(x)) { 20178 break 20179 } 20180 v.reset(OpS390XMOVDBRstoreidx) 20181 v.AuxInt = i - 4 20182 v.Aux = s 20183 v.AddArg(p) 20184 v.AddArg(idx) 20185 v.AddArg(w) 20186 v.AddArg(mem) 20187 return true 20188 } 20189 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 20190 // cond: x.Uses == 1 && clobber(x) 20191 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20192 for { 20193 i := v.AuxInt 20194 s := v.Aux 20195 _ = v.Args[3] 20196 p := v.Args[0] 20197 idx := v.Args[1] 20198 v_2 := v.Args[2] 20199 if v_2.Op != OpS390XSRDconst { 20200 break 20201 } 20202 if v_2.AuxInt != 32 { 20203 break 20204 } 20205 w := v_2.Args[0] 20206 x := v.Args[3] 20207 if x.Op != OpS390XMOVWBRstoreidx { 20208 break 20209 } 20210 if x.AuxInt != i-4 { 20211 break 20212 } 20213 if x.Aux != s { 20214 break 20215 } 20216 _ = x.Args[3] 20217 if idx != x.Args[0] { 20218 break 20219 } 20220 if p != x.Args[1] { 20221 break 20222 } 20223 if w != x.Args[2] { 20224 break 20225 } 20226 mem := x.Args[3] 20227 if !(x.Uses == 1 && clobber(x)) { 20228 break 20229 } 20230 v.reset(OpS390XMOVDBRstoreidx) 20231 v.AuxInt = i - 4 20232 v.Aux = s 20233 v.AddArg(p) 20234 v.AddArg(idx) 20235 v.AddArg(w) 20236 v.AddArg(mem) 20237 return true 20238 } 20239 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 20240 // cond: x.Uses == 1 && clobber(x) 20241 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20242 for { 20243 i := v.AuxInt 20244 s := v.Aux 20245 _ = v.Args[3] 20246 idx := v.Args[0] 20247 p := v.Args[1] 20248 v_2 := v.Args[2] 20249 if v_2.Op != OpS390XSRDconst { 20250 break 20251 } 20252 if v_2.AuxInt != 32 { 20253 break 20254 } 20255 w := v_2.Args[0] 20256 x := v.Args[3] 20257 if x.Op != OpS390XMOVWBRstoreidx { 20258 break 20259 } 20260 if x.AuxInt != i-4 { 20261 break 20262 } 20263 if x.Aux != s { 20264 break 20265 } 20266 _ = x.Args[3] 20267 if p != x.Args[0] { 20268 break 20269 } 20270 if idx != x.Args[1] { 20271 break 20272 } 20273 if w != x.Args[2] { 20274 break 20275 } 20276 mem := x.Args[3] 20277 if !(x.Uses == 1 && clobber(x)) { 20278 break 20279 } 20280 v.reset(OpS390XMOVDBRstoreidx) 20281 v.AuxInt = i - 4 20282 v.Aux = s 20283 v.AddArg(p) 20284 v.AddArg(idx) 20285 v.AddArg(w) 20286 v.AddArg(mem) 20287 return true 20288 } 20289 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 20290 // cond: x.Uses == 1 && clobber(x) 20291 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 20292 for { 20293 i := v.AuxInt 20294 s := v.Aux 20295 _ = v.Args[3] 20296 idx := v.Args[0] 20297 p := v.Args[1] 20298 v_2 := v.Args[2] 20299 if v_2.Op != OpS390XSRDconst { 20300 break 20301 } 20302 if v_2.AuxInt != 32 { 20303 break 20304 } 20305 w := v_2.Args[0] 20306 x := v.Args[3] 20307 if x.Op != OpS390XMOVWBRstoreidx { 20308 break 20309 } 20310 if x.AuxInt != i-4 { 20311 break 20312 } 20313 if x.Aux != s { 20314 break 20315 } 20316 _ = x.Args[3] 20317 if idx != x.Args[0] { 20318 break 20319 } 20320 if p != x.Args[1] { 20321 break 20322 } 20323 if w != x.Args[2] { 20324 break 20325 } 20326 mem := x.Args[3] 20327 if !(x.Uses == 1 && clobber(x)) { 20328 break 20329 } 20330 v.reset(OpS390XMOVDBRstoreidx) 20331 v.AuxInt = i - 4 20332 v.Aux = s 20333 v.AddArg(p) 20334 v.AddArg(idx) 20335 v.AddArg(w) 20336 v.AddArg(mem) 20337 return true 20338 } 20339 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 20340 // cond: x.Uses == 1 && clobber(x) 20341 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20342 for { 20343 i := v.AuxInt 20344 s := v.Aux 20345 _ = v.Args[3] 20346 p := v.Args[0] 20347 idx := v.Args[1] 20348 v_2 := v.Args[2] 20349 if v_2.Op != OpS390XSRDconst { 20350 break 20351 } 20352 j := v_2.AuxInt 20353 w := v_2.Args[0] 20354 x := v.Args[3] 20355 if x.Op != OpS390XMOVWBRstoreidx { 20356 break 20357 } 20358 if x.AuxInt != i-4 { 20359 break 20360 } 20361 if x.Aux != s { 20362 break 20363 } 20364 _ = x.Args[3] 20365 if p != x.Args[0] { 20366 break 20367 } 20368 if idx != x.Args[1] { 20369 break 20370 } 20371 w0 := x.Args[2] 20372 if w0.Op != OpS390XSRDconst { 20373 break 20374 } 20375 if w0.AuxInt != j-32 { 20376 break 20377 } 20378 if w != w0.Args[0] { 20379 break 20380 } 20381 mem := x.Args[3] 20382 if !(x.Uses == 1 && clobber(x)) { 20383 break 20384 } 20385 v.reset(OpS390XMOVDBRstoreidx) 20386 v.AuxInt = i - 4 20387 v.Aux = s 20388 v.AddArg(p) 20389 v.AddArg(idx) 20390 v.AddArg(w0) 20391 v.AddArg(mem) 20392 return true 20393 } 20394 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 20395 // cond: x.Uses == 1 && clobber(x) 20396 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20397 for { 20398 i := v.AuxInt 20399 s := v.Aux 20400 _ = v.Args[3] 20401 p := v.Args[0] 20402 idx := v.Args[1] 20403 v_2 := v.Args[2] 20404 if v_2.Op != OpS390XSRDconst { 20405 break 20406 } 20407 j := v_2.AuxInt 20408 w := v_2.Args[0] 20409 x := v.Args[3] 20410 if x.Op != OpS390XMOVWBRstoreidx { 20411 break 20412 } 20413 if x.AuxInt != i-4 { 20414 break 20415 } 20416 if x.Aux != s { 20417 break 20418 } 20419 _ = x.Args[3] 20420 if idx != x.Args[0] { 20421 break 20422 } 20423 if p != x.Args[1] { 20424 break 20425 } 20426 w0 := x.Args[2] 20427 if w0.Op != OpS390XSRDconst { 20428 break 20429 } 20430 if w0.AuxInt != j-32 { 20431 break 20432 } 20433 if w != w0.Args[0] { 20434 break 20435 } 20436 mem := x.Args[3] 20437 if !(x.Uses == 1 && clobber(x)) { 20438 break 20439 } 20440 v.reset(OpS390XMOVDBRstoreidx) 20441 v.AuxInt = i - 4 20442 v.Aux = s 20443 v.AddArg(p) 20444 v.AddArg(idx) 20445 v.AddArg(w0) 20446 v.AddArg(mem) 20447 return true 20448 } 20449 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 20450 // cond: x.Uses == 1 && clobber(x) 20451 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20452 for { 20453 i := v.AuxInt 20454 s := v.Aux 20455 _ = v.Args[3] 20456 idx := v.Args[0] 20457 p := v.Args[1] 20458 v_2 := v.Args[2] 20459 if v_2.Op != OpS390XSRDconst { 20460 break 20461 } 20462 j := v_2.AuxInt 20463 w := v_2.Args[0] 20464 x := v.Args[3] 20465 if x.Op != OpS390XMOVWBRstoreidx { 20466 break 20467 } 20468 if x.AuxInt != i-4 { 20469 break 20470 } 20471 if x.Aux != s { 20472 break 20473 } 20474 _ = x.Args[3] 20475 if p != x.Args[0] { 20476 break 20477 } 20478 if idx != x.Args[1] { 20479 break 20480 } 20481 w0 := x.Args[2] 20482 if w0.Op != OpS390XSRDconst { 20483 break 20484 } 20485 if w0.AuxInt != j-32 { 20486 break 20487 } 20488 if w != w0.Args[0] { 20489 break 20490 } 20491 mem := x.Args[3] 20492 if !(x.Uses == 1 && clobber(x)) { 20493 break 20494 } 20495 v.reset(OpS390XMOVDBRstoreidx) 20496 v.AuxInt = i - 4 20497 v.Aux = s 20498 v.AddArg(p) 20499 v.AddArg(idx) 20500 v.AddArg(w0) 20501 v.AddArg(mem) 20502 return true 20503 } 20504 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 20505 // cond: x.Uses == 1 && clobber(x) 20506 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 20507 for { 20508 i := v.AuxInt 20509 s := v.Aux 20510 _ = v.Args[3] 20511 idx := v.Args[0] 20512 p := v.Args[1] 20513 v_2 := v.Args[2] 20514 if v_2.Op != OpS390XSRDconst { 20515 break 20516 } 20517 j := v_2.AuxInt 20518 w := v_2.Args[0] 20519 x := v.Args[3] 20520 if x.Op != OpS390XMOVWBRstoreidx { 20521 break 20522 } 20523 if x.AuxInt != i-4 { 20524 break 20525 } 20526 if x.Aux != s { 20527 break 20528 } 20529 _ = x.Args[3] 20530 if idx != x.Args[0] { 20531 break 20532 } 20533 if p != x.Args[1] { 20534 break 20535 } 20536 w0 := x.Args[2] 20537 if w0.Op != OpS390XSRDconst { 20538 break 20539 } 20540 if w0.AuxInt != j-32 { 20541 break 20542 } 20543 if w != w0.Args[0] { 20544 break 20545 } 20546 mem := x.Args[3] 20547 if !(x.Uses == 1 && clobber(x)) { 20548 break 20549 } 20550 v.reset(OpS390XMOVDBRstoreidx) 20551 v.AuxInt = i - 4 20552 v.Aux = s 20553 v.AddArg(p) 20554 v.AddArg(idx) 20555 v.AddArg(w0) 20556 v.AddArg(mem) 20557 return true 20558 } 20559 return false 20560 } 20561 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 20562 // match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 20563 // cond: isSamePtr(ptr1, ptr2) 20564 // result: (MOVWZreg x) 20565 for { 20566 off := v.AuxInt 20567 sym := v.Aux 20568 _ = v.Args[1] 20569 ptr1 := v.Args[0] 20570 v_1 := v.Args[1] 20571 if v_1.Op != OpS390XMOVWstore { 20572 break 20573 } 20574 if v_1.AuxInt != off { 20575 break 20576 } 20577 if v_1.Aux != sym { 20578 break 20579 } 20580 _ = v_1.Args[2] 20581 ptr2 := v_1.Args[0] 20582 x := v_1.Args[1] 20583 if !(isSamePtr(ptr1, ptr2)) { 20584 break 20585 } 20586 v.reset(OpS390XMOVWZreg) 20587 v.AddArg(x) 20588 return true 20589 } 20590 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 20591 // cond: is20Bit(off1+off2) 20592 // result: (MOVWZload [off1+off2] {sym} ptr mem) 20593 for { 20594 off1 := v.AuxInt 20595 sym := v.Aux 20596 _ = v.Args[1] 20597 v_0 := v.Args[0] 20598 if v_0.Op != OpS390XADDconst { 20599 break 20600 } 20601 off2 := v_0.AuxInt 20602 ptr := v_0.Args[0] 20603 mem := v.Args[1] 20604 if !(is20Bit(off1 + off2)) { 20605 break 20606 } 20607 v.reset(OpS390XMOVWZload) 20608 v.AuxInt = off1 + off2 20609 v.Aux = sym 20610 v.AddArg(ptr) 20611 v.AddArg(mem) 20612 return true 20613 } 20614 // match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 20615 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 20616 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 20617 for { 20618 off1 := v.AuxInt 20619 sym1 := v.Aux 20620 _ = v.Args[1] 20621 v_0 := v.Args[0] 20622 if v_0.Op != OpS390XMOVDaddr { 20623 break 20624 } 20625 t := v_0.Type 20626 off2 := v_0.AuxInt 20627 sym2 := v_0.Aux 20628 base := v_0.Args[0] 20629 mem := v.Args[1] 20630 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 20631 break 20632 } 20633 v.reset(OpS390XMOVWZload) 20634 v.AuxInt = off1 + off2 20635 v.Aux = mergeSym(sym1, sym2) 20636 v.AddArg(base) 20637 v.AddArg(mem) 20638 return true 20639 } 20640 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 20641 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 20642 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 20643 for { 20644 off1 := v.AuxInt 20645 sym1 := v.Aux 20646 _ = v.Args[1] 20647 v_0 := v.Args[0] 20648 if v_0.Op != OpS390XMOVDaddridx { 20649 break 20650 } 20651 off2 := v_0.AuxInt 20652 sym2 := v_0.Aux 20653 _ = v_0.Args[1] 20654 ptr := v_0.Args[0] 20655 idx := v_0.Args[1] 20656 mem := v.Args[1] 20657 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 20658 break 20659 } 20660 v.reset(OpS390XMOVWZloadidx) 20661 v.AuxInt = off1 + off2 20662 v.Aux = mergeSym(sym1, sym2) 20663 v.AddArg(ptr) 20664 v.AddArg(idx) 20665 v.AddArg(mem) 20666 return true 20667 } 20668 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 20669 // cond: ptr.Op != OpSB 20670 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 20671 for { 20672 off := v.AuxInt 20673 sym := v.Aux 20674 _ = v.Args[1] 20675 v_0 := v.Args[0] 20676 if v_0.Op != OpS390XADD { 20677 break 20678 } 20679 _ = v_0.Args[1] 20680 ptr := v_0.Args[0] 20681 idx := v_0.Args[1] 20682 mem := v.Args[1] 20683 if !(ptr.Op != OpSB) { 20684 break 20685 } 20686 v.reset(OpS390XMOVWZloadidx) 20687 v.AuxInt = off 20688 v.Aux = sym 20689 v.AddArg(ptr) 20690 v.AddArg(idx) 20691 v.AddArg(mem) 20692 return true 20693 } 20694 return false 20695 } 20696 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 20697 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 20698 // cond: is20Bit(c+d) 20699 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20700 for { 20701 c := v.AuxInt 20702 sym := v.Aux 20703 _ = v.Args[2] 20704 v_0 := v.Args[0] 20705 if v_0.Op != OpS390XADDconst { 20706 break 20707 } 20708 d := v_0.AuxInt 20709 ptr := v_0.Args[0] 20710 idx := v.Args[1] 20711 mem := v.Args[2] 20712 if !(is20Bit(c + d)) { 20713 break 20714 } 20715 v.reset(OpS390XMOVWZloadidx) 20716 v.AuxInt = c + d 20717 v.Aux = sym 20718 v.AddArg(ptr) 20719 v.AddArg(idx) 20720 v.AddArg(mem) 20721 return true 20722 } 20723 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 20724 // cond: is20Bit(c+d) 20725 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20726 for { 20727 c := v.AuxInt 20728 sym := v.Aux 20729 _ = v.Args[2] 20730 idx := v.Args[0] 20731 v_1 := v.Args[1] 20732 if v_1.Op != OpS390XADDconst { 20733 break 20734 } 20735 d := v_1.AuxInt 20736 ptr := v_1.Args[0] 20737 mem := v.Args[2] 20738 if !(is20Bit(c + d)) { 20739 break 20740 } 20741 v.reset(OpS390XMOVWZloadidx) 20742 v.AuxInt = c + d 20743 v.Aux = sym 20744 v.AddArg(ptr) 20745 v.AddArg(idx) 20746 v.AddArg(mem) 20747 return true 20748 } 20749 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 20750 // cond: is20Bit(c+d) 20751 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20752 for { 20753 c := v.AuxInt 20754 sym := v.Aux 20755 _ = v.Args[2] 20756 ptr := v.Args[0] 20757 v_1 := v.Args[1] 20758 if v_1.Op != OpS390XADDconst { 20759 break 20760 } 20761 d := v_1.AuxInt 20762 idx := v_1.Args[0] 20763 mem := v.Args[2] 20764 if !(is20Bit(c + d)) { 20765 break 20766 } 20767 v.reset(OpS390XMOVWZloadidx) 20768 v.AuxInt = c + d 20769 v.Aux = sym 20770 v.AddArg(ptr) 20771 v.AddArg(idx) 20772 v.AddArg(mem) 20773 return true 20774 } 20775 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 20776 // cond: is20Bit(c+d) 20777 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 20778 for { 20779 c := v.AuxInt 20780 sym := v.Aux 20781 _ = v.Args[2] 20782 v_0 := v.Args[0] 20783 if v_0.Op != OpS390XADDconst { 20784 break 20785 } 20786 d := v_0.AuxInt 20787 idx := v_0.Args[0] 20788 ptr := v.Args[1] 20789 mem := v.Args[2] 20790 if !(is20Bit(c + d)) { 20791 break 20792 } 20793 v.reset(OpS390XMOVWZloadidx) 20794 v.AuxInt = c + d 20795 v.Aux = sym 20796 v.AddArg(ptr) 20797 v.AddArg(idx) 20798 v.AddArg(mem) 20799 return true 20800 } 20801 return false 20802 } 20803 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 20804 b := v.Block 20805 _ = b 20806 // match: (MOVWZreg x:(MOVBZload _ _)) 20807 // cond: 20808 // result: (MOVDreg x) 20809 for { 20810 x := v.Args[0] 20811 if x.Op != OpS390XMOVBZload { 20812 break 20813 } 20814 _ = x.Args[1] 20815 v.reset(OpS390XMOVDreg) 20816 v.AddArg(x) 20817 return true 20818 } 20819 // match: (MOVWZreg x:(MOVHZload _ _)) 20820 // cond: 20821 // result: (MOVDreg x) 20822 for { 20823 x := v.Args[0] 20824 if x.Op != OpS390XMOVHZload { 20825 break 20826 } 20827 _ = x.Args[1] 20828 v.reset(OpS390XMOVDreg) 20829 v.AddArg(x) 20830 return true 20831 } 20832 // match: (MOVWZreg x:(MOVWZload _ _)) 20833 // cond: 20834 // result: (MOVDreg x) 20835 for { 20836 x := v.Args[0] 20837 if x.Op != OpS390XMOVWZload { 20838 break 20839 } 20840 _ = x.Args[1] 20841 v.reset(OpS390XMOVDreg) 20842 v.AddArg(x) 20843 return true 20844 } 20845 // match: (MOVWZreg x:(Arg <t>)) 20846 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 20847 // result: (MOVDreg x) 20848 for { 20849 x := v.Args[0] 20850 if x.Op != OpArg { 20851 break 20852 } 20853 t := x.Type 20854 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 20855 break 20856 } 20857 v.reset(OpS390XMOVDreg) 20858 v.AddArg(x) 20859 return true 20860 } 20861 // match: (MOVWZreg x:(MOVBZreg _)) 20862 // cond: 20863 // result: (MOVDreg x) 20864 for { 20865 x := v.Args[0] 20866 if x.Op != OpS390XMOVBZreg { 20867 break 20868 } 20869 v.reset(OpS390XMOVDreg) 20870 v.AddArg(x) 20871 return true 20872 } 20873 // match: (MOVWZreg x:(MOVHZreg _)) 20874 // cond: 20875 // result: (MOVDreg x) 20876 for { 20877 x := v.Args[0] 20878 if x.Op != OpS390XMOVHZreg { 20879 break 20880 } 20881 v.reset(OpS390XMOVDreg) 20882 v.AddArg(x) 20883 return true 20884 } 20885 // match: (MOVWZreg x:(MOVWZreg _)) 20886 // cond: 20887 // result: (MOVDreg x) 20888 for { 20889 x := v.Args[0] 20890 if x.Op != OpS390XMOVWZreg { 20891 break 20892 } 20893 v.reset(OpS390XMOVDreg) 20894 v.AddArg(x) 20895 return true 20896 } 20897 // match: (MOVWZreg (MOVWreg x)) 20898 // cond: 20899 // result: (MOVWZreg x) 20900 for { 20901 v_0 := v.Args[0] 20902 if v_0.Op != OpS390XMOVWreg { 20903 break 20904 } 20905 x := v_0.Args[0] 20906 v.reset(OpS390XMOVWZreg) 20907 v.AddArg(x) 20908 return true 20909 } 20910 // match: (MOVWZreg (MOVDconst [c])) 20911 // cond: 20912 // result: (MOVDconst [int64(uint32(c))]) 20913 for { 20914 v_0 := v.Args[0] 20915 if v_0.Op != OpS390XMOVDconst { 20916 break 20917 } 20918 c := v_0.AuxInt 20919 v.reset(OpS390XMOVDconst) 20920 v.AuxInt = int64(uint32(c)) 20921 return true 20922 } 20923 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 20924 // cond: x.Uses == 1 && clobber(x) 20925 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 20926 for { 20927 x := v.Args[0] 20928 if x.Op != OpS390XMOVWZload { 20929 break 20930 } 20931 off := x.AuxInt 20932 sym := x.Aux 20933 _ = x.Args[1] 20934 ptr := x.Args[0] 20935 mem := x.Args[1] 20936 if !(x.Uses == 1 && clobber(x)) { 20937 break 20938 } 20939 b = x.Block 20940 v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, v.Type) 20941 v.reset(OpCopy) 20942 v.AddArg(v0) 20943 v0.AuxInt = off 20944 v0.Aux = sym 20945 v0.AddArg(ptr) 20946 v0.AddArg(mem) 20947 return true 20948 } 20949 return false 20950 } 20951 func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { 20952 b := v.Block 20953 _ = b 20954 // match: (MOVWZreg x:(MOVWload [off] {sym} ptr mem)) 20955 // cond: x.Uses == 1 && clobber(x) 20956 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 20957 for { 20958 x := v.Args[0] 20959 if x.Op != OpS390XMOVWload { 20960 break 20961 } 20962 off := x.AuxInt 20963 sym := x.Aux 20964 _ = x.Args[1] 20965 ptr := x.Args[0] 20966 mem := x.Args[1] 20967 if !(x.Uses == 1 && clobber(x)) { 20968 break 20969 } 20970 b = x.Block 20971 v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, v.Type) 20972 v.reset(OpCopy) 20973 v.AddArg(v0) 20974 v0.AuxInt = off 20975 v0.Aux = sym 20976 v0.AddArg(ptr) 20977 v0.AddArg(mem) 20978 return true 20979 } 20980 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 20981 // cond: x.Uses == 1 && clobber(x) 20982 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 20983 for { 20984 x := v.Args[0] 20985 if x.Op != OpS390XMOVWZloadidx { 20986 break 20987 } 20988 off := x.AuxInt 20989 sym := x.Aux 20990 _ = x.Args[2] 20991 ptr := x.Args[0] 20992 idx := x.Args[1] 20993 mem := x.Args[2] 20994 if !(x.Uses == 1 && clobber(x)) { 20995 break 20996 } 20997 b = x.Block 20998 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 20999 v.reset(OpCopy) 21000 v.AddArg(v0) 21001 v0.AuxInt = off 21002 v0.Aux = sym 21003 v0.AddArg(ptr) 21004 v0.AddArg(idx) 21005 v0.AddArg(mem) 21006 return true 21007 } 21008 // match: (MOVWZreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 21009 // cond: x.Uses == 1 && clobber(x) 21010 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 21011 for { 21012 x := v.Args[0] 21013 if x.Op != OpS390XMOVWloadidx { 21014 break 21015 } 21016 off := x.AuxInt 21017 sym := x.Aux 21018 _ = x.Args[2] 21019 ptr := x.Args[0] 21020 idx := x.Args[1] 21021 mem := x.Args[2] 21022 if !(x.Uses == 1 && clobber(x)) { 21023 break 21024 } 21025 b = x.Block 21026 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 21027 v.reset(OpCopy) 21028 v.AddArg(v0) 21029 v0.AuxInt = off 21030 v0.Aux = sym 21031 v0.AddArg(ptr) 21032 v0.AddArg(idx) 21033 v0.AddArg(mem) 21034 return true 21035 } 21036 return false 21037 } 21038 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 21039 // match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 21040 // cond: isSamePtr(ptr1, ptr2) 21041 // result: (MOVWreg x) 21042 for { 21043 off := v.AuxInt 21044 sym := v.Aux 21045 _ = v.Args[1] 21046 ptr1 := v.Args[0] 21047 v_1 := v.Args[1] 21048 if v_1.Op != OpS390XMOVWstore { 21049 break 21050 } 21051 if v_1.AuxInt != off { 21052 break 21053 } 21054 if v_1.Aux != sym { 21055 break 21056 } 21057 _ = v_1.Args[2] 21058 ptr2 := v_1.Args[0] 21059 x := v_1.Args[1] 21060 if !(isSamePtr(ptr1, ptr2)) { 21061 break 21062 } 21063 v.reset(OpS390XMOVWreg) 21064 v.AddArg(x) 21065 return true 21066 } 21067 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 21068 // cond: is20Bit(off1+off2) 21069 // result: (MOVWload [off1+off2] {sym} ptr mem) 21070 for { 21071 off1 := v.AuxInt 21072 sym := v.Aux 21073 _ = v.Args[1] 21074 v_0 := v.Args[0] 21075 if v_0.Op != OpS390XADDconst { 21076 break 21077 } 21078 off2 := v_0.AuxInt 21079 ptr := v_0.Args[0] 21080 mem := v.Args[1] 21081 if !(is20Bit(off1 + off2)) { 21082 break 21083 } 21084 v.reset(OpS390XMOVWload) 21085 v.AuxInt = off1 + off2 21086 v.Aux = sym 21087 v.AddArg(ptr) 21088 v.AddArg(mem) 21089 return true 21090 } 21091 // match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 21092 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 21093 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 21094 for { 21095 off1 := v.AuxInt 21096 sym1 := v.Aux 21097 _ = v.Args[1] 21098 v_0 := v.Args[0] 21099 if v_0.Op != OpS390XMOVDaddr { 21100 break 21101 } 21102 t := v_0.Type 21103 off2 := v_0.AuxInt 21104 sym2 := v_0.Aux 21105 base := v_0.Args[0] 21106 mem := v.Args[1] 21107 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 21108 break 21109 } 21110 v.reset(OpS390XMOVWload) 21111 v.AuxInt = off1 + off2 21112 v.Aux = mergeSym(sym1, sym2) 21113 v.AddArg(base) 21114 v.AddArg(mem) 21115 return true 21116 } 21117 // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 21118 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 21119 // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 21120 for { 21121 off1 := v.AuxInt 21122 sym1 := v.Aux 21123 _ = v.Args[1] 21124 v_0 := v.Args[0] 21125 if v_0.Op != OpS390XMOVDaddridx { 21126 break 21127 } 21128 off2 := v_0.AuxInt 21129 sym2 := v_0.Aux 21130 _ = v_0.Args[1] 21131 ptr := v_0.Args[0] 21132 idx := v_0.Args[1] 21133 mem := v.Args[1] 21134 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 21135 break 21136 } 21137 v.reset(OpS390XMOVWloadidx) 21138 v.AuxInt = off1 + off2 21139 v.Aux = mergeSym(sym1, sym2) 21140 v.AddArg(ptr) 21141 v.AddArg(idx) 21142 v.AddArg(mem) 21143 return true 21144 } 21145 // match: (MOVWload [off] {sym} (ADD ptr idx) mem) 21146 // cond: ptr.Op != OpSB 21147 // result: (MOVWloadidx [off] {sym} ptr idx mem) 21148 for { 21149 off := v.AuxInt 21150 sym := v.Aux 21151 _ = v.Args[1] 21152 v_0 := v.Args[0] 21153 if v_0.Op != OpS390XADD { 21154 break 21155 } 21156 _ = v_0.Args[1] 21157 ptr := v_0.Args[0] 21158 idx := v_0.Args[1] 21159 mem := v.Args[1] 21160 if !(ptr.Op != OpSB) { 21161 break 21162 } 21163 v.reset(OpS390XMOVWloadidx) 21164 v.AuxInt = off 21165 v.Aux = sym 21166 v.AddArg(ptr) 21167 v.AddArg(idx) 21168 v.AddArg(mem) 21169 return true 21170 } 21171 return false 21172 } 21173 func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { 21174 // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 21175 // cond: is20Bit(c+d) 21176 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21177 for { 21178 c := v.AuxInt 21179 sym := v.Aux 21180 _ = v.Args[2] 21181 v_0 := v.Args[0] 21182 if v_0.Op != OpS390XADDconst { 21183 break 21184 } 21185 d := v_0.AuxInt 21186 ptr := v_0.Args[0] 21187 idx := v.Args[1] 21188 mem := v.Args[2] 21189 if !(is20Bit(c + d)) { 21190 break 21191 } 21192 v.reset(OpS390XMOVWloadidx) 21193 v.AuxInt = c + d 21194 v.Aux = sym 21195 v.AddArg(ptr) 21196 v.AddArg(idx) 21197 v.AddArg(mem) 21198 return true 21199 } 21200 // match: (MOVWloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 21201 // cond: is20Bit(c+d) 21202 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21203 for { 21204 c := v.AuxInt 21205 sym := v.Aux 21206 _ = v.Args[2] 21207 idx := v.Args[0] 21208 v_1 := v.Args[1] 21209 if v_1.Op != OpS390XADDconst { 21210 break 21211 } 21212 d := v_1.AuxInt 21213 ptr := v_1.Args[0] 21214 mem := v.Args[2] 21215 if !(is20Bit(c + d)) { 21216 break 21217 } 21218 v.reset(OpS390XMOVWloadidx) 21219 v.AuxInt = c + d 21220 v.Aux = sym 21221 v.AddArg(ptr) 21222 v.AddArg(idx) 21223 v.AddArg(mem) 21224 return true 21225 } 21226 // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 21227 // cond: is20Bit(c+d) 21228 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21229 for { 21230 c := v.AuxInt 21231 sym := v.Aux 21232 _ = v.Args[2] 21233 ptr := v.Args[0] 21234 v_1 := v.Args[1] 21235 if v_1.Op != OpS390XADDconst { 21236 break 21237 } 21238 d := v_1.AuxInt 21239 idx := v_1.Args[0] 21240 mem := v.Args[2] 21241 if !(is20Bit(c + d)) { 21242 break 21243 } 21244 v.reset(OpS390XMOVWloadidx) 21245 v.AuxInt = c + d 21246 v.Aux = sym 21247 v.AddArg(ptr) 21248 v.AddArg(idx) 21249 v.AddArg(mem) 21250 return true 21251 } 21252 // match: (MOVWloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 21253 // cond: is20Bit(c+d) 21254 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 21255 for { 21256 c := v.AuxInt 21257 sym := v.Aux 21258 _ = v.Args[2] 21259 v_0 := v.Args[0] 21260 if v_0.Op != OpS390XADDconst { 21261 break 21262 } 21263 d := v_0.AuxInt 21264 idx := v_0.Args[0] 21265 ptr := v.Args[1] 21266 mem := v.Args[2] 21267 if !(is20Bit(c + d)) { 21268 break 21269 } 21270 v.reset(OpS390XMOVWloadidx) 21271 v.AuxInt = c + d 21272 v.Aux = sym 21273 v.AddArg(ptr) 21274 v.AddArg(idx) 21275 v.AddArg(mem) 21276 return true 21277 } 21278 return false 21279 } 21280 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 21281 // match: (MOVWreg x:(MOVBload _ _)) 21282 // cond: 21283 // result: (MOVDreg x) 21284 for { 21285 x := v.Args[0] 21286 if x.Op != OpS390XMOVBload { 21287 break 21288 } 21289 _ = x.Args[1] 21290 v.reset(OpS390XMOVDreg) 21291 v.AddArg(x) 21292 return true 21293 } 21294 // match: (MOVWreg x:(MOVBZload _ _)) 21295 // cond: 21296 // result: (MOVDreg x) 21297 for { 21298 x := v.Args[0] 21299 if x.Op != OpS390XMOVBZload { 21300 break 21301 } 21302 _ = x.Args[1] 21303 v.reset(OpS390XMOVDreg) 21304 v.AddArg(x) 21305 return true 21306 } 21307 // match: (MOVWreg x:(MOVHload _ _)) 21308 // cond: 21309 // result: (MOVDreg x) 21310 for { 21311 x := v.Args[0] 21312 if x.Op != OpS390XMOVHload { 21313 break 21314 } 21315 _ = x.Args[1] 21316 v.reset(OpS390XMOVDreg) 21317 v.AddArg(x) 21318 return true 21319 } 21320 // match: (MOVWreg x:(MOVHZload _ _)) 21321 // cond: 21322 // result: (MOVDreg x) 21323 for { 21324 x := v.Args[0] 21325 if x.Op != OpS390XMOVHZload { 21326 break 21327 } 21328 _ = x.Args[1] 21329 v.reset(OpS390XMOVDreg) 21330 v.AddArg(x) 21331 return true 21332 } 21333 // match: (MOVWreg x:(MOVWload _ _)) 21334 // cond: 21335 // result: (MOVDreg x) 21336 for { 21337 x := v.Args[0] 21338 if x.Op != OpS390XMOVWload { 21339 break 21340 } 21341 _ = x.Args[1] 21342 v.reset(OpS390XMOVDreg) 21343 v.AddArg(x) 21344 return true 21345 } 21346 // match: (MOVWreg x:(Arg <t>)) 21347 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 21348 // result: (MOVDreg x) 21349 for { 21350 x := v.Args[0] 21351 if x.Op != OpArg { 21352 break 21353 } 21354 t := x.Type 21355 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 21356 break 21357 } 21358 v.reset(OpS390XMOVDreg) 21359 v.AddArg(x) 21360 return true 21361 } 21362 // match: (MOVWreg x:(MOVBreg _)) 21363 // cond: 21364 // result: (MOVDreg x) 21365 for { 21366 x := v.Args[0] 21367 if x.Op != OpS390XMOVBreg { 21368 break 21369 } 21370 v.reset(OpS390XMOVDreg) 21371 v.AddArg(x) 21372 return true 21373 } 21374 // match: (MOVWreg x:(MOVBZreg _)) 21375 // cond: 21376 // result: (MOVDreg x) 21377 for { 21378 x := v.Args[0] 21379 if x.Op != OpS390XMOVBZreg { 21380 break 21381 } 21382 v.reset(OpS390XMOVDreg) 21383 v.AddArg(x) 21384 return true 21385 } 21386 // match: (MOVWreg x:(MOVHreg _)) 21387 // cond: 21388 // result: (MOVDreg x) 21389 for { 21390 x := v.Args[0] 21391 if x.Op != OpS390XMOVHreg { 21392 break 21393 } 21394 v.reset(OpS390XMOVDreg) 21395 v.AddArg(x) 21396 return true 21397 } 21398 // match: (MOVWreg x:(MOVHZreg _)) 21399 // cond: 21400 // result: (MOVDreg x) 21401 for { 21402 x := v.Args[0] 21403 if x.Op != OpS390XMOVHZreg { 21404 break 21405 } 21406 v.reset(OpS390XMOVDreg) 21407 v.AddArg(x) 21408 return true 21409 } 21410 return false 21411 } 21412 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 21413 b := v.Block 21414 _ = b 21415 // match: (MOVWreg x:(MOVWreg _)) 21416 // cond: 21417 // result: (MOVDreg x) 21418 for { 21419 x := v.Args[0] 21420 if x.Op != OpS390XMOVWreg { 21421 break 21422 } 21423 v.reset(OpS390XMOVDreg) 21424 v.AddArg(x) 21425 return true 21426 } 21427 // match: (MOVWreg (MOVWZreg x)) 21428 // cond: 21429 // result: (MOVWreg x) 21430 for { 21431 v_0 := v.Args[0] 21432 if v_0.Op != OpS390XMOVWZreg { 21433 break 21434 } 21435 x := v_0.Args[0] 21436 v.reset(OpS390XMOVWreg) 21437 v.AddArg(x) 21438 return true 21439 } 21440 // match: (MOVWreg (MOVDconst [c])) 21441 // cond: 21442 // result: (MOVDconst [int64(int32(c))]) 21443 for { 21444 v_0 := v.Args[0] 21445 if v_0.Op != OpS390XMOVDconst { 21446 break 21447 } 21448 c := v_0.AuxInt 21449 v.reset(OpS390XMOVDconst) 21450 v.AuxInt = int64(int32(c)) 21451 return true 21452 } 21453 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 21454 // cond: x.Uses == 1 && clobber(x) 21455 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 21456 for { 21457 x := v.Args[0] 21458 if x.Op != OpS390XMOVWZload { 21459 break 21460 } 21461 off := x.AuxInt 21462 sym := x.Aux 21463 _ = x.Args[1] 21464 ptr := x.Args[0] 21465 mem := x.Args[1] 21466 if !(x.Uses == 1 && clobber(x)) { 21467 break 21468 } 21469 b = x.Block 21470 v0 := b.NewValue0(x.Pos, OpS390XMOVWload, v.Type) 21471 v.reset(OpCopy) 21472 v.AddArg(v0) 21473 v0.AuxInt = off 21474 v0.Aux = sym 21475 v0.AddArg(ptr) 21476 v0.AddArg(mem) 21477 return true 21478 } 21479 // match: (MOVWreg x:(MOVWload [off] {sym} ptr mem)) 21480 // cond: x.Uses == 1 && clobber(x) 21481 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 21482 for { 21483 x := v.Args[0] 21484 if x.Op != OpS390XMOVWload { 21485 break 21486 } 21487 off := x.AuxInt 21488 sym := x.Aux 21489 _ = x.Args[1] 21490 ptr := x.Args[0] 21491 mem := x.Args[1] 21492 if !(x.Uses == 1 && clobber(x)) { 21493 break 21494 } 21495 b = x.Block 21496 v0 := b.NewValue0(x.Pos, OpS390XMOVWload, v.Type) 21497 v.reset(OpCopy) 21498 v.AddArg(v0) 21499 v0.AuxInt = off 21500 v0.Aux = sym 21501 v0.AddArg(ptr) 21502 v0.AddArg(mem) 21503 return true 21504 } 21505 // match: (MOVWreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 21506 // cond: x.Uses == 1 && clobber(x) 21507 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 21508 for { 21509 x := v.Args[0] 21510 if x.Op != OpS390XMOVWZloadidx { 21511 break 21512 } 21513 off := x.AuxInt 21514 sym := x.Aux 21515 _ = x.Args[2] 21516 ptr := x.Args[0] 21517 idx := x.Args[1] 21518 mem := x.Args[2] 21519 if !(x.Uses == 1 && clobber(x)) { 21520 break 21521 } 21522 b = x.Block 21523 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 21524 v.reset(OpCopy) 21525 v.AddArg(v0) 21526 v0.AuxInt = off 21527 v0.Aux = sym 21528 v0.AddArg(ptr) 21529 v0.AddArg(idx) 21530 v0.AddArg(mem) 21531 return true 21532 } 21533 // match: (MOVWreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 21534 // cond: x.Uses == 1 && clobber(x) 21535 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 21536 for { 21537 x := v.Args[0] 21538 if x.Op != OpS390XMOVWloadidx { 21539 break 21540 } 21541 off := x.AuxInt 21542 sym := x.Aux 21543 _ = x.Args[2] 21544 ptr := x.Args[0] 21545 idx := x.Args[1] 21546 mem := x.Args[2] 21547 if !(x.Uses == 1 && clobber(x)) { 21548 break 21549 } 21550 b = x.Block 21551 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 21552 v.reset(OpCopy) 21553 v.AddArg(v0) 21554 v0.AuxInt = off 21555 v0.Aux = sym 21556 v0.AddArg(ptr) 21557 v0.AddArg(idx) 21558 v0.AddArg(mem) 21559 return true 21560 } 21561 return false 21562 } 21563 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 21564 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 21565 // cond: 21566 // result: (MOVWstore [off] {sym} ptr x mem) 21567 for { 21568 off := v.AuxInt 21569 sym := v.Aux 21570 _ = v.Args[2] 21571 ptr := v.Args[0] 21572 v_1 := v.Args[1] 21573 if v_1.Op != OpS390XMOVWreg { 21574 break 21575 } 21576 x := v_1.Args[0] 21577 mem := v.Args[2] 21578 v.reset(OpS390XMOVWstore) 21579 v.AuxInt = off 21580 v.Aux = sym 21581 v.AddArg(ptr) 21582 v.AddArg(x) 21583 v.AddArg(mem) 21584 return true 21585 } 21586 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 21587 // cond: 21588 // result: (MOVWstore [off] {sym} ptr x mem) 21589 for { 21590 off := v.AuxInt 21591 sym := v.Aux 21592 _ = v.Args[2] 21593 ptr := v.Args[0] 21594 v_1 := v.Args[1] 21595 if v_1.Op != OpS390XMOVWZreg { 21596 break 21597 } 21598 x := v_1.Args[0] 21599 mem := v.Args[2] 21600 v.reset(OpS390XMOVWstore) 21601 v.AuxInt = off 21602 v.Aux = sym 21603 v.AddArg(ptr) 21604 v.AddArg(x) 21605 v.AddArg(mem) 21606 return true 21607 } 21608 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 21609 // cond: is20Bit(off1+off2) 21610 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 21611 for { 21612 off1 := v.AuxInt 21613 sym := v.Aux 21614 _ = v.Args[2] 21615 v_0 := v.Args[0] 21616 if v_0.Op != OpS390XADDconst { 21617 break 21618 } 21619 off2 := v_0.AuxInt 21620 ptr := v_0.Args[0] 21621 val := v.Args[1] 21622 mem := v.Args[2] 21623 if !(is20Bit(off1 + off2)) { 21624 break 21625 } 21626 v.reset(OpS390XMOVWstore) 21627 v.AuxInt = off1 + off2 21628 v.Aux = sym 21629 v.AddArg(ptr) 21630 v.AddArg(val) 21631 v.AddArg(mem) 21632 return true 21633 } 21634 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 21635 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 21636 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 21637 for { 21638 off := v.AuxInt 21639 sym := v.Aux 21640 _ = v.Args[2] 21641 ptr := v.Args[0] 21642 v_1 := v.Args[1] 21643 if v_1.Op != OpS390XMOVDconst { 21644 break 21645 } 21646 c := v_1.AuxInt 21647 mem := v.Args[2] 21648 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 21649 break 21650 } 21651 v.reset(OpS390XMOVWstoreconst) 21652 v.AuxInt = makeValAndOff(int64(int32(c)), off) 21653 v.Aux = sym 21654 v.AddArg(ptr) 21655 v.AddArg(mem) 21656 return true 21657 } 21658 // match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 21659 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 21660 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 21661 for { 21662 off1 := v.AuxInt 21663 sym1 := v.Aux 21664 _ = v.Args[2] 21665 v_0 := v.Args[0] 21666 if v_0.Op != OpS390XMOVDaddr { 21667 break 21668 } 21669 t := v_0.Type 21670 off2 := v_0.AuxInt 21671 sym2 := v_0.Aux 21672 base := v_0.Args[0] 21673 val := v.Args[1] 21674 mem := v.Args[2] 21675 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 21676 break 21677 } 21678 v.reset(OpS390XMOVWstore) 21679 v.AuxInt = off1 + off2 21680 v.Aux = mergeSym(sym1, sym2) 21681 v.AddArg(base) 21682 v.AddArg(val) 21683 v.AddArg(mem) 21684 return true 21685 } 21686 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 21687 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 21688 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 21689 for { 21690 off1 := v.AuxInt 21691 sym1 := v.Aux 21692 _ = v.Args[2] 21693 v_0 := v.Args[0] 21694 if v_0.Op != OpS390XMOVDaddridx { 21695 break 21696 } 21697 off2 := v_0.AuxInt 21698 sym2 := v_0.Aux 21699 _ = v_0.Args[1] 21700 ptr := v_0.Args[0] 21701 idx := v_0.Args[1] 21702 val := v.Args[1] 21703 mem := v.Args[2] 21704 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 21705 break 21706 } 21707 v.reset(OpS390XMOVWstoreidx) 21708 v.AuxInt = off1 + off2 21709 v.Aux = mergeSym(sym1, sym2) 21710 v.AddArg(ptr) 21711 v.AddArg(idx) 21712 v.AddArg(val) 21713 v.AddArg(mem) 21714 return true 21715 } 21716 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 21717 // cond: ptr.Op != OpSB 21718 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 21719 for { 21720 off := v.AuxInt 21721 sym := v.Aux 21722 _ = v.Args[2] 21723 v_0 := v.Args[0] 21724 if v_0.Op != OpS390XADD { 21725 break 21726 } 21727 _ = v_0.Args[1] 21728 ptr := v_0.Args[0] 21729 idx := v_0.Args[1] 21730 val := v.Args[1] 21731 mem := v.Args[2] 21732 if !(ptr.Op != OpSB) { 21733 break 21734 } 21735 v.reset(OpS390XMOVWstoreidx) 21736 v.AuxInt = off 21737 v.Aux = sym 21738 v.AddArg(ptr) 21739 v.AddArg(idx) 21740 v.AddArg(val) 21741 v.AddArg(mem) 21742 return true 21743 } 21744 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 21745 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 21746 // result: (MOVDstore [i-4] {s} p w mem) 21747 for { 21748 i := v.AuxInt 21749 s := v.Aux 21750 _ = v.Args[2] 21751 p := v.Args[0] 21752 v_1 := v.Args[1] 21753 if v_1.Op != OpS390XSRDconst { 21754 break 21755 } 21756 if v_1.AuxInt != 32 { 21757 break 21758 } 21759 w := v_1.Args[0] 21760 x := v.Args[2] 21761 if x.Op != OpS390XMOVWstore { 21762 break 21763 } 21764 if x.AuxInt != i-4 { 21765 break 21766 } 21767 if x.Aux != s { 21768 break 21769 } 21770 _ = x.Args[2] 21771 if p != x.Args[0] { 21772 break 21773 } 21774 if w != x.Args[1] { 21775 break 21776 } 21777 mem := x.Args[2] 21778 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 21779 break 21780 } 21781 v.reset(OpS390XMOVDstore) 21782 v.AuxInt = i - 4 21783 v.Aux = s 21784 v.AddArg(p) 21785 v.AddArg(w) 21786 v.AddArg(mem) 21787 return true 21788 } 21789 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 21790 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 21791 // result: (MOVDstore [i-4] {s} p w0 mem) 21792 for { 21793 i := v.AuxInt 21794 s := v.Aux 21795 _ = v.Args[2] 21796 p := v.Args[0] 21797 w0 := v.Args[1] 21798 if w0.Op != OpS390XSRDconst { 21799 break 21800 } 21801 j := w0.AuxInt 21802 w := w0.Args[0] 21803 x := v.Args[2] 21804 if x.Op != OpS390XMOVWstore { 21805 break 21806 } 21807 if x.AuxInt != i-4 { 21808 break 21809 } 21810 if x.Aux != s { 21811 break 21812 } 21813 _ = x.Args[2] 21814 if p != x.Args[0] { 21815 break 21816 } 21817 x_1 := x.Args[1] 21818 if x_1.Op != OpS390XSRDconst { 21819 break 21820 } 21821 if x_1.AuxInt != j+32 { 21822 break 21823 } 21824 if w != x_1.Args[0] { 21825 break 21826 } 21827 mem := x.Args[2] 21828 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 21829 break 21830 } 21831 v.reset(OpS390XMOVDstore) 21832 v.AuxInt = i - 4 21833 v.Aux = s 21834 v.AddArg(p) 21835 v.AddArg(w0) 21836 v.AddArg(mem) 21837 return true 21838 } 21839 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 21840 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 21841 // result: (STM2 [i-4] {s} p w0 w1 mem) 21842 for { 21843 i := v.AuxInt 21844 s := v.Aux 21845 _ = v.Args[2] 21846 p := v.Args[0] 21847 w1 := v.Args[1] 21848 x := v.Args[2] 21849 if x.Op != OpS390XMOVWstore { 21850 break 21851 } 21852 if x.AuxInt != i-4 { 21853 break 21854 } 21855 if x.Aux != s { 21856 break 21857 } 21858 _ = x.Args[2] 21859 if p != x.Args[0] { 21860 break 21861 } 21862 w0 := x.Args[1] 21863 mem := x.Args[2] 21864 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 21865 break 21866 } 21867 v.reset(OpS390XSTM2) 21868 v.AuxInt = i - 4 21869 v.Aux = s 21870 v.AddArg(p) 21871 v.AddArg(w0) 21872 v.AddArg(w1) 21873 v.AddArg(mem) 21874 return true 21875 } 21876 return false 21877 } 21878 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 21879 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 21880 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 21881 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 21882 for { 21883 i := v.AuxInt 21884 s := v.Aux 21885 _ = v.Args[2] 21886 p := v.Args[0] 21887 w2 := v.Args[1] 21888 x := v.Args[2] 21889 if x.Op != OpS390XSTM2 { 21890 break 21891 } 21892 if x.AuxInt != i-8 { 21893 break 21894 } 21895 if x.Aux != s { 21896 break 21897 } 21898 _ = x.Args[3] 21899 if p != x.Args[0] { 21900 break 21901 } 21902 w0 := x.Args[1] 21903 w1 := x.Args[2] 21904 mem := x.Args[3] 21905 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 21906 break 21907 } 21908 v.reset(OpS390XSTM3) 21909 v.AuxInt = i - 8 21910 v.Aux = s 21911 v.AddArg(p) 21912 v.AddArg(w0) 21913 v.AddArg(w1) 21914 v.AddArg(w2) 21915 v.AddArg(mem) 21916 return true 21917 } 21918 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 21919 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 21920 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 21921 for { 21922 i := v.AuxInt 21923 s := v.Aux 21924 _ = v.Args[2] 21925 p := v.Args[0] 21926 w3 := v.Args[1] 21927 x := v.Args[2] 21928 if x.Op != OpS390XSTM3 { 21929 break 21930 } 21931 if x.AuxInt != i-12 { 21932 break 21933 } 21934 if x.Aux != s { 21935 break 21936 } 21937 _ = x.Args[4] 21938 if p != x.Args[0] { 21939 break 21940 } 21941 w0 := x.Args[1] 21942 w1 := x.Args[2] 21943 w2 := x.Args[3] 21944 mem := x.Args[4] 21945 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 21946 break 21947 } 21948 v.reset(OpS390XSTM4) 21949 v.AuxInt = i - 12 21950 v.Aux = s 21951 v.AddArg(p) 21952 v.AddArg(w0) 21953 v.AddArg(w1) 21954 v.AddArg(w2) 21955 v.AddArg(w3) 21956 v.AddArg(mem) 21957 return true 21958 } 21959 return false 21960 } 21961 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 21962 b := v.Block 21963 _ = b 21964 typ := &b.Func.Config.Types 21965 _ = typ 21966 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 21967 // cond: isU12Bit(ValAndOff(sc).Off()+off) 21968 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 21969 for { 21970 sc := v.AuxInt 21971 s := v.Aux 21972 _ = v.Args[1] 21973 v_0 := v.Args[0] 21974 if v_0.Op != OpS390XADDconst { 21975 break 21976 } 21977 off := v_0.AuxInt 21978 ptr := v_0.Args[0] 21979 mem := v.Args[1] 21980 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 21981 break 21982 } 21983 v.reset(OpS390XMOVWstoreconst) 21984 v.AuxInt = ValAndOff(sc).add(off) 21985 v.Aux = s 21986 v.AddArg(ptr) 21987 v.AddArg(mem) 21988 return true 21989 } 21990 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 21991 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 21992 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 21993 for { 21994 sc := v.AuxInt 21995 sym1 := v.Aux 21996 _ = v.Args[1] 21997 v_0 := v.Args[0] 21998 if v_0.Op != OpS390XMOVDaddr { 21999 break 22000 } 22001 off := v_0.AuxInt 22002 sym2 := v_0.Aux 22003 ptr := v_0.Args[0] 22004 mem := v.Args[1] 22005 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 22006 break 22007 } 22008 v.reset(OpS390XMOVWstoreconst) 22009 v.AuxInt = ValAndOff(sc).add(off) 22010 v.Aux = mergeSym(sym1, sym2) 22011 v.AddArg(ptr) 22012 v.AddArg(mem) 22013 return true 22014 } 22015 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 22016 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 22017 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 22018 for { 22019 c := v.AuxInt 22020 s := v.Aux 22021 _ = v.Args[1] 22022 p := v.Args[0] 22023 x := v.Args[1] 22024 if x.Op != OpS390XMOVWstoreconst { 22025 break 22026 } 22027 a := x.AuxInt 22028 if x.Aux != s { 22029 break 22030 } 22031 _ = x.Args[1] 22032 if p != x.Args[0] { 22033 break 22034 } 22035 mem := x.Args[1] 22036 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 22037 break 22038 } 22039 v.reset(OpS390XMOVDstore) 22040 v.AuxInt = ValAndOff(a).Off() 22041 v.Aux = s 22042 v.AddArg(p) 22043 v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) 22044 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 22045 v.AddArg(v0) 22046 v.AddArg(mem) 22047 return true 22048 } 22049 return false 22050 } 22051 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 22052 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 22053 // cond: is20Bit(c+d) 22054 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22055 for { 22056 c := v.AuxInt 22057 sym := v.Aux 22058 _ = v.Args[3] 22059 v_0 := v.Args[0] 22060 if v_0.Op != OpS390XADDconst { 22061 break 22062 } 22063 d := v_0.AuxInt 22064 ptr := v_0.Args[0] 22065 idx := v.Args[1] 22066 val := v.Args[2] 22067 mem := v.Args[3] 22068 if !(is20Bit(c + d)) { 22069 break 22070 } 22071 v.reset(OpS390XMOVWstoreidx) 22072 v.AuxInt = c + d 22073 v.Aux = sym 22074 v.AddArg(ptr) 22075 v.AddArg(idx) 22076 v.AddArg(val) 22077 v.AddArg(mem) 22078 return true 22079 } 22080 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 22081 // cond: is20Bit(c+d) 22082 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22083 for { 22084 c := v.AuxInt 22085 sym := v.Aux 22086 _ = v.Args[3] 22087 idx := v.Args[0] 22088 v_1 := v.Args[1] 22089 if v_1.Op != OpS390XADDconst { 22090 break 22091 } 22092 d := v_1.AuxInt 22093 ptr := v_1.Args[0] 22094 val := v.Args[2] 22095 mem := v.Args[3] 22096 if !(is20Bit(c + d)) { 22097 break 22098 } 22099 v.reset(OpS390XMOVWstoreidx) 22100 v.AuxInt = c + d 22101 v.Aux = sym 22102 v.AddArg(ptr) 22103 v.AddArg(idx) 22104 v.AddArg(val) 22105 v.AddArg(mem) 22106 return true 22107 } 22108 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 22109 // cond: is20Bit(c+d) 22110 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22111 for { 22112 c := v.AuxInt 22113 sym := v.Aux 22114 _ = v.Args[3] 22115 ptr := v.Args[0] 22116 v_1 := v.Args[1] 22117 if v_1.Op != OpS390XADDconst { 22118 break 22119 } 22120 d := v_1.AuxInt 22121 idx := v_1.Args[0] 22122 val := v.Args[2] 22123 mem := v.Args[3] 22124 if !(is20Bit(c + d)) { 22125 break 22126 } 22127 v.reset(OpS390XMOVWstoreidx) 22128 v.AuxInt = c + d 22129 v.Aux = sym 22130 v.AddArg(ptr) 22131 v.AddArg(idx) 22132 v.AddArg(val) 22133 v.AddArg(mem) 22134 return true 22135 } 22136 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 22137 // cond: is20Bit(c+d) 22138 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 22139 for { 22140 c := v.AuxInt 22141 sym := v.Aux 22142 _ = v.Args[3] 22143 v_0 := v.Args[0] 22144 if v_0.Op != OpS390XADDconst { 22145 break 22146 } 22147 d := v_0.AuxInt 22148 idx := v_0.Args[0] 22149 ptr := v.Args[1] 22150 val := v.Args[2] 22151 mem := v.Args[3] 22152 if !(is20Bit(c + d)) { 22153 break 22154 } 22155 v.reset(OpS390XMOVWstoreidx) 22156 v.AuxInt = c + d 22157 v.Aux = sym 22158 v.AddArg(ptr) 22159 v.AddArg(idx) 22160 v.AddArg(val) 22161 v.AddArg(mem) 22162 return true 22163 } 22164 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 22165 // cond: x.Uses == 1 && clobber(x) 22166 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22167 for { 22168 i := v.AuxInt 22169 s := v.Aux 22170 _ = v.Args[3] 22171 p := v.Args[0] 22172 idx := v.Args[1] 22173 w := v.Args[2] 22174 x := v.Args[3] 22175 if x.Op != OpS390XMOVWstoreidx { 22176 break 22177 } 22178 if x.AuxInt != i-4 { 22179 break 22180 } 22181 if x.Aux != s { 22182 break 22183 } 22184 _ = x.Args[3] 22185 if p != x.Args[0] { 22186 break 22187 } 22188 if idx != x.Args[1] { 22189 break 22190 } 22191 x_2 := x.Args[2] 22192 if x_2.Op != OpS390XSRDconst { 22193 break 22194 } 22195 if x_2.AuxInt != 32 { 22196 break 22197 } 22198 if w != x_2.Args[0] { 22199 break 22200 } 22201 mem := x.Args[3] 22202 if !(x.Uses == 1 && clobber(x)) { 22203 break 22204 } 22205 v.reset(OpS390XMOVDstoreidx) 22206 v.AuxInt = i - 4 22207 v.Aux = s 22208 v.AddArg(p) 22209 v.AddArg(idx) 22210 v.AddArg(w) 22211 v.AddArg(mem) 22212 return true 22213 } 22214 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 22215 // cond: x.Uses == 1 && clobber(x) 22216 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22217 for { 22218 i := v.AuxInt 22219 s := v.Aux 22220 _ = v.Args[3] 22221 p := v.Args[0] 22222 idx := v.Args[1] 22223 w := v.Args[2] 22224 x := v.Args[3] 22225 if x.Op != OpS390XMOVWstoreidx { 22226 break 22227 } 22228 if x.AuxInt != i-4 { 22229 break 22230 } 22231 if x.Aux != s { 22232 break 22233 } 22234 _ = x.Args[3] 22235 if idx != x.Args[0] { 22236 break 22237 } 22238 if p != x.Args[1] { 22239 break 22240 } 22241 x_2 := x.Args[2] 22242 if x_2.Op != OpS390XSRDconst { 22243 break 22244 } 22245 if x_2.AuxInt != 32 { 22246 break 22247 } 22248 if w != x_2.Args[0] { 22249 break 22250 } 22251 mem := x.Args[3] 22252 if !(x.Uses == 1 && clobber(x)) { 22253 break 22254 } 22255 v.reset(OpS390XMOVDstoreidx) 22256 v.AuxInt = i - 4 22257 v.Aux = s 22258 v.AddArg(p) 22259 v.AddArg(idx) 22260 v.AddArg(w) 22261 v.AddArg(mem) 22262 return true 22263 } 22264 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 22265 // cond: x.Uses == 1 && clobber(x) 22266 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22267 for { 22268 i := v.AuxInt 22269 s := v.Aux 22270 _ = v.Args[3] 22271 idx := v.Args[0] 22272 p := v.Args[1] 22273 w := v.Args[2] 22274 x := v.Args[3] 22275 if x.Op != OpS390XMOVWstoreidx { 22276 break 22277 } 22278 if x.AuxInt != i-4 { 22279 break 22280 } 22281 if x.Aux != s { 22282 break 22283 } 22284 _ = x.Args[3] 22285 if p != x.Args[0] { 22286 break 22287 } 22288 if idx != x.Args[1] { 22289 break 22290 } 22291 x_2 := x.Args[2] 22292 if x_2.Op != OpS390XSRDconst { 22293 break 22294 } 22295 if x_2.AuxInt != 32 { 22296 break 22297 } 22298 if w != x_2.Args[0] { 22299 break 22300 } 22301 mem := x.Args[3] 22302 if !(x.Uses == 1 && clobber(x)) { 22303 break 22304 } 22305 v.reset(OpS390XMOVDstoreidx) 22306 v.AuxInt = i - 4 22307 v.Aux = s 22308 v.AddArg(p) 22309 v.AddArg(idx) 22310 v.AddArg(w) 22311 v.AddArg(mem) 22312 return true 22313 } 22314 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 22315 // cond: x.Uses == 1 && clobber(x) 22316 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 22317 for { 22318 i := v.AuxInt 22319 s := v.Aux 22320 _ = v.Args[3] 22321 idx := v.Args[0] 22322 p := v.Args[1] 22323 w := v.Args[2] 22324 x := v.Args[3] 22325 if x.Op != OpS390XMOVWstoreidx { 22326 break 22327 } 22328 if x.AuxInt != i-4 { 22329 break 22330 } 22331 if x.Aux != s { 22332 break 22333 } 22334 _ = x.Args[3] 22335 if idx != x.Args[0] { 22336 break 22337 } 22338 if p != x.Args[1] { 22339 break 22340 } 22341 x_2 := x.Args[2] 22342 if x_2.Op != OpS390XSRDconst { 22343 break 22344 } 22345 if x_2.AuxInt != 32 { 22346 break 22347 } 22348 if w != x_2.Args[0] { 22349 break 22350 } 22351 mem := x.Args[3] 22352 if !(x.Uses == 1 && clobber(x)) { 22353 break 22354 } 22355 v.reset(OpS390XMOVDstoreidx) 22356 v.AuxInt = i - 4 22357 v.Aux = s 22358 v.AddArg(p) 22359 v.AddArg(idx) 22360 v.AddArg(w) 22361 v.AddArg(mem) 22362 return true 22363 } 22364 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 22365 // cond: x.Uses == 1 && clobber(x) 22366 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22367 for { 22368 i := v.AuxInt 22369 s := v.Aux 22370 _ = v.Args[3] 22371 p := v.Args[0] 22372 idx := v.Args[1] 22373 w0 := v.Args[2] 22374 if w0.Op != OpS390XSRDconst { 22375 break 22376 } 22377 j := w0.AuxInt 22378 w := w0.Args[0] 22379 x := v.Args[3] 22380 if x.Op != OpS390XMOVWstoreidx { 22381 break 22382 } 22383 if x.AuxInt != i-4 { 22384 break 22385 } 22386 if x.Aux != s { 22387 break 22388 } 22389 _ = x.Args[3] 22390 if p != x.Args[0] { 22391 break 22392 } 22393 if idx != x.Args[1] { 22394 break 22395 } 22396 x_2 := x.Args[2] 22397 if x_2.Op != OpS390XSRDconst { 22398 break 22399 } 22400 if x_2.AuxInt != j+32 { 22401 break 22402 } 22403 if w != x_2.Args[0] { 22404 break 22405 } 22406 mem := x.Args[3] 22407 if !(x.Uses == 1 && clobber(x)) { 22408 break 22409 } 22410 v.reset(OpS390XMOVDstoreidx) 22411 v.AuxInt = i - 4 22412 v.Aux = s 22413 v.AddArg(p) 22414 v.AddArg(idx) 22415 v.AddArg(w0) 22416 v.AddArg(mem) 22417 return true 22418 } 22419 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 22420 // cond: x.Uses == 1 && clobber(x) 22421 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22422 for { 22423 i := v.AuxInt 22424 s := v.Aux 22425 _ = v.Args[3] 22426 p := v.Args[0] 22427 idx := v.Args[1] 22428 w0 := v.Args[2] 22429 if w0.Op != OpS390XSRDconst { 22430 break 22431 } 22432 j := w0.AuxInt 22433 w := w0.Args[0] 22434 x := v.Args[3] 22435 if x.Op != OpS390XMOVWstoreidx { 22436 break 22437 } 22438 if x.AuxInt != i-4 { 22439 break 22440 } 22441 if x.Aux != s { 22442 break 22443 } 22444 _ = x.Args[3] 22445 if idx != x.Args[0] { 22446 break 22447 } 22448 if p != x.Args[1] { 22449 break 22450 } 22451 x_2 := x.Args[2] 22452 if x_2.Op != OpS390XSRDconst { 22453 break 22454 } 22455 if x_2.AuxInt != j+32 { 22456 break 22457 } 22458 if w != x_2.Args[0] { 22459 break 22460 } 22461 mem := x.Args[3] 22462 if !(x.Uses == 1 && clobber(x)) { 22463 break 22464 } 22465 v.reset(OpS390XMOVDstoreidx) 22466 v.AuxInt = i - 4 22467 v.Aux = s 22468 v.AddArg(p) 22469 v.AddArg(idx) 22470 v.AddArg(w0) 22471 v.AddArg(mem) 22472 return true 22473 } 22474 return false 22475 } 22476 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 22477 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 22478 // cond: x.Uses == 1 && clobber(x) 22479 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22480 for { 22481 i := v.AuxInt 22482 s := v.Aux 22483 _ = v.Args[3] 22484 idx := v.Args[0] 22485 p := v.Args[1] 22486 w0 := v.Args[2] 22487 if w0.Op != OpS390XSRDconst { 22488 break 22489 } 22490 j := w0.AuxInt 22491 w := w0.Args[0] 22492 x := v.Args[3] 22493 if x.Op != OpS390XMOVWstoreidx { 22494 break 22495 } 22496 if x.AuxInt != i-4 { 22497 break 22498 } 22499 if x.Aux != s { 22500 break 22501 } 22502 _ = x.Args[3] 22503 if p != x.Args[0] { 22504 break 22505 } 22506 if idx != x.Args[1] { 22507 break 22508 } 22509 x_2 := x.Args[2] 22510 if x_2.Op != OpS390XSRDconst { 22511 break 22512 } 22513 if x_2.AuxInt != j+32 { 22514 break 22515 } 22516 if w != x_2.Args[0] { 22517 break 22518 } 22519 mem := x.Args[3] 22520 if !(x.Uses == 1 && clobber(x)) { 22521 break 22522 } 22523 v.reset(OpS390XMOVDstoreidx) 22524 v.AuxInt = i - 4 22525 v.Aux = s 22526 v.AddArg(p) 22527 v.AddArg(idx) 22528 v.AddArg(w0) 22529 v.AddArg(mem) 22530 return true 22531 } 22532 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 22533 // cond: x.Uses == 1 && clobber(x) 22534 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 22535 for { 22536 i := v.AuxInt 22537 s := v.Aux 22538 _ = v.Args[3] 22539 idx := v.Args[0] 22540 p := v.Args[1] 22541 w0 := v.Args[2] 22542 if w0.Op != OpS390XSRDconst { 22543 break 22544 } 22545 j := w0.AuxInt 22546 w := w0.Args[0] 22547 x := v.Args[3] 22548 if x.Op != OpS390XMOVWstoreidx { 22549 break 22550 } 22551 if x.AuxInt != i-4 { 22552 break 22553 } 22554 if x.Aux != s { 22555 break 22556 } 22557 _ = x.Args[3] 22558 if idx != x.Args[0] { 22559 break 22560 } 22561 if p != x.Args[1] { 22562 break 22563 } 22564 x_2 := x.Args[2] 22565 if x_2.Op != OpS390XSRDconst { 22566 break 22567 } 22568 if x_2.AuxInt != j+32 { 22569 break 22570 } 22571 if w != x_2.Args[0] { 22572 break 22573 } 22574 mem := x.Args[3] 22575 if !(x.Uses == 1 && clobber(x)) { 22576 break 22577 } 22578 v.reset(OpS390XMOVDstoreidx) 22579 v.AuxInt = i - 4 22580 v.Aux = s 22581 v.AddArg(p) 22582 v.AddArg(idx) 22583 v.AddArg(w0) 22584 v.AddArg(mem) 22585 return true 22586 } 22587 return false 22588 } 22589 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 22590 // match: (MULLD x (MOVDconst [c])) 22591 // cond: is32Bit(c) 22592 // result: (MULLDconst [c] x) 22593 for { 22594 _ = v.Args[1] 22595 x := v.Args[0] 22596 v_1 := v.Args[1] 22597 if v_1.Op != OpS390XMOVDconst { 22598 break 22599 } 22600 c := v_1.AuxInt 22601 if !(is32Bit(c)) { 22602 break 22603 } 22604 v.reset(OpS390XMULLDconst) 22605 v.AuxInt = c 22606 v.AddArg(x) 22607 return true 22608 } 22609 // match: (MULLD (MOVDconst [c]) x) 22610 // cond: is32Bit(c) 22611 // result: (MULLDconst [c] x) 22612 for { 22613 _ = v.Args[1] 22614 v_0 := v.Args[0] 22615 if v_0.Op != OpS390XMOVDconst { 22616 break 22617 } 22618 c := v_0.AuxInt 22619 x := v.Args[1] 22620 if !(is32Bit(c)) { 22621 break 22622 } 22623 v.reset(OpS390XMULLDconst) 22624 v.AuxInt = c 22625 v.AddArg(x) 22626 return true 22627 } 22628 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 22629 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22630 // result: (MULLDload <t> [off] {sym} x ptr mem) 22631 for { 22632 t := v.Type 22633 _ = v.Args[1] 22634 x := v.Args[0] 22635 g := v.Args[1] 22636 if g.Op != OpS390XMOVDload { 22637 break 22638 } 22639 off := g.AuxInt 22640 sym := g.Aux 22641 _ = g.Args[1] 22642 ptr := g.Args[0] 22643 mem := g.Args[1] 22644 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 22645 break 22646 } 22647 v.reset(OpS390XMULLDload) 22648 v.Type = t 22649 v.AuxInt = off 22650 v.Aux = sym 22651 v.AddArg(x) 22652 v.AddArg(ptr) 22653 v.AddArg(mem) 22654 return true 22655 } 22656 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 22657 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22658 // result: (MULLDload <t> [off] {sym} x ptr mem) 22659 for { 22660 t := v.Type 22661 _ = v.Args[1] 22662 g := v.Args[0] 22663 if g.Op != OpS390XMOVDload { 22664 break 22665 } 22666 off := g.AuxInt 22667 sym := g.Aux 22668 _ = g.Args[1] 22669 ptr := g.Args[0] 22670 mem := g.Args[1] 22671 x := v.Args[1] 22672 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 22673 break 22674 } 22675 v.reset(OpS390XMULLDload) 22676 v.Type = t 22677 v.AuxInt = off 22678 v.Aux = sym 22679 v.AddArg(x) 22680 v.AddArg(ptr) 22681 v.AddArg(mem) 22682 return true 22683 } 22684 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 22685 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22686 // result: (MULLDload <t> [off] {sym} x ptr mem) 22687 for { 22688 t := v.Type 22689 _ = v.Args[1] 22690 g := v.Args[0] 22691 if g.Op != OpS390XMOVDload { 22692 break 22693 } 22694 off := g.AuxInt 22695 sym := g.Aux 22696 _ = g.Args[1] 22697 ptr := g.Args[0] 22698 mem := g.Args[1] 22699 x := v.Args[1] 22700 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 22701 break 22702 } 22703 v.reset(OpS390XMULLDload) 22704 v.Type = t 22705 v.AuxInt = off 22706 v.Aux = sym 22707 v.AddArg(x) 22708 v.AddArg(ptr) 22709 v.AddArg(mem) 22710 return true 22711 } 22712 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 22713 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22714 // result: (MULLDload <t> [off] {sym} x ptr mem) 22715 for { 22716 t := v.Type 22717 _ = v.Args[1] 22718 x := v.Args[0] 22719 g := v.Args[1] 22720 if g.Op != OpS390XMOVDload { 22721 break 22722 } 22723 off := g.AuxInt 22724 sym := g.Aux 22725 _ = g.Args[1] 22726 ptr := g.Args[0] 22727 mem := g.Args[1] 22728 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 22729 break 22730 } 22731 v.reset(OpS390XMULLDload) 22732 v.Type = t 22733 v.AuxInt = off 22734 v.Aux = sym 22735 v.AddArg(x) 22736 v.AddArg(ptr) 22737 v.AddArg(mem) 22738 return true 22739 } 22740 return false 22741 } 22742 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 22743 b := v.Block 22744 _ = b 22745 // match: (MULLDconst [-1] x) 22746 // cond: 22747 // result: (NEG x) 22748 for { 22749 if v.AuxInt != -1 { 22750 break 22751 } 22752 x := v.Args[0] 22753 v.reset(OpS390XNEG) 22754 v.AddArg(x) 22755 return true 22756 } 22757 // match: (MULLDconst [0] _) 22758 // cond: 22759 // result: (MOVDconst [0]) 22760 for { 22761 if v.AuxInt != 0 { 22762 break 22763 } 22764 v.reset(OpS390XMOVDconst) 22765 v.AuxInt = 0 22766 return true 22767 } 22768 // match: (MULLDconst [1] x) 22769 // cond: 22770 // result: x 22771 for { 22772 if v.AuxInt != 1 { 22773 break 22774 } 22775 x := v.Args[0] 22776 v.reset(OpCopy) 22777 v.Type = x.Type 22778 v.AddArg(x) 22779 return true 22780 } 22781 // match: (MULLDconst [c] x) 22782 // cond: isPowerOfTwo(c) 22783 // result: (SLDconst [log2(c)] x) 22784 for { 22785 c := v.AuxInt 22786 x := v.Args[0] 22787 if !(isPowerOfTwo(c)) { 22788 break 22789 } 22790 v.reset(OpS390XSLDconst) 22791 v.AuxInt = log2(c) 22792 v.AddArg(x) 22793 return true 22794 } 22795 // match: (MULLDconst [c] x) 22796 // cond: isPowerOfTwo(c+1) && c >= 15 22797 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 22798 for { 22799 c := v.AuxInt 22800 x := v.Args[0] 22801 if !(isPowerOfTwo(c+1) && c >= 15) { 22802 break 22803 } 22804 v.reset(OpS390XSUB) 22805 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22806 v0.AuxInt = log2(c + 1) 22807 v0.AddArg(x) 22808 v.AddArg(v0) 22809 v.AddArg(x) 22810 return true 22811 } 22812 // match: (MULLDconst [c] x) 22813 // cond: isPowerOfTwo(c-1) && c >= 17 22814 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 22815 for { 22816 c := v.AuxInt 22817 x := v.Args[0] 22818 if !(isPowerOfTwo(c-1) && c >= 17) { 22819 break 22820 } 22821 v.reset(OpS390XADD) 22822 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22823 v0.AuxInt = log2(c - 1) 22824 v0.AddArg(x) 22825 v.AddArg(v0) 22826 v.AddArg(x) 22827 return true 22828 } 22829 // match: (MULLDconst [c] (MOVDconst [d])) 22830 // cond: 22831 // result: (MOVDconst [c*d]) 22832 for { 22833 c := v.AuxInt 22834 v_0 := v.Args[0] 22835 if v_0.Op != OpS390XMOVDconst { 22836 break 22837 } 22838 d := v_0.AuxInt 22839 v.reset(OpS390XMOVDconst) 22840 v.AuxInt = c * d 22841 return true 22842 } 22843 return false 22844 } 22845 func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { 22846 b := v.Block 22847 _ = b 22848 // match: (MULLDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 22849 // cond: isSamePtr(ptr1, ptr2) 22850 // result: (MULLD x (LGDR <t> y)) 22851 for { 22852 t := v.Type 22853 off := v.AuxInt 22854 sym := v.Aux 22855 _ = v.Args[2] 22856 x := v.Args[0] 22857 ptr1 := v.Args[1] 22858 v_2 := v.Args[2] 22859 if v_2.Op != OpS390XFMOVDstore { 22860 break 22861 } 22862 if v_2.AuxInt != off { 22863 break 22864 } 22865 if v_2.Aux != sym { 22866 break 22867 } 22868 _ = v_2.Args[2] 22869 ptr2 := v_2.Args[0] 22870 y := v_2.Args[1] 22871 if !(isSamePtr(ptr1, ptr2)) { 22872 break 22873 } 22874 v.reset(OpS390XMULLD) 22875 v.AddArg(x) 22876 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 22877 v0.AddArg(y) 22878 v.AddArg(v0) 22879 return true 22880 } 22881 // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) 22882 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 22883 // result: (MULLDload [off1+off2] {sym} x ptr mem) 22884 for { 22885 off1 := v.AuxInt 22886 sym := v.Aux 22887 _ = v.Args[2] 22888 x := v.Args[0] 22889 v_1 := v.Args[1] 22890 if v_1.Op != OpS390XADDconst { 22891 break 22892 } 22893 off2 := v_1.AuxInt 22894 ptr := v_1.Args[0] 22895 mem := v.Args[2] 22896 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 22897 break 22898 } 22899 v.reset(OpS390XMULLDload) 22900 v.AuxInt = off1 + off2 22901 v.Aux = sym 22902 v.AddArg(x) 22903 v.AddArg(ptr) 22904 v.AddArg(mem) 22905 return true 22906 } 22907 // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 22908 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 22909 // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 22910 for { 22911 o1 := v.AuxInt 22912 s1 := v.Aux 22913 _ = v.Args[2] 22914 x := v.Args[0] 22915 v_1 := v.Args[1] 22916 if v_1.Op != OpS390XMOVDaddr { 22917 break 22918 } 22919 o2 := v_1.AuxInt 22920 s2 := v_1.Aux 22921 ptr := v_1.Args[0] 22922 mem := v.Args[2] 22923 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 22924 break 22925 } 22926 v.reset(OpS390XMULLDload) 22927 v.AuxInt = o1 + o2 22928 v.Aux = mergeSym(s1, s2) 22929 v.AddArg(x) 22930 v.AddArg(ptr) 22931 v.AddArg(mem) 22932 return true 22933 } 22934 return false 22935 } 22936 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 22937 // match: (MULLW x (MOVDconst [c])) 22938 // cond: 22939 // result: (MULLWconst [int64(int32(c))] x) 22940 for { 22941 _ = v.Args[1] 22942 x := v.Args[0] 22943 v_1 := v.Args[1] 22944 if v_1.Op != OpS390XMOVDconst { 22945 break 22946 } 22947 c := v_1.AuxInt 22948 v.reset(OpS390XMULLWconst) 22949 v.AuxInt = int64(int32(c)) 22950 v.AddArg(x) 22951 return true 22952 } 22953 // match: (MULLW (MOVDconst [c]) x) 22954 // cond: 22955 // result: (MULLWconst [int64(int32(c))] x) 22956 for { 22957 _ = v.Args[1] 22958 v_0 := v.Args[0] 22959 if v_0.Op != OpS390XMOVDconst { 22960 break 22961 } 22962 c := v_0.AuxInt 22963 x := v.Args[1] 22964 v.reset(OpS390XMULLWconst) 22965 v.AuxInt = int64(int32(c)) 22966 v.AddArg(x) 22967 return true 22968 } 22969 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 22970 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22971 // result: (MULLWload <t> [off] {sym} x ptr mem) 22972 for { 22973 t := v.Type 22974 _ = v.Args[1] 22975 x := v.Args[0] 22976 g := v.Args[1] 22977 if g.Op != OpS390XMOVWload { 22978 break 22979 } 22980 off := g.AuxInt 22981 sym := g.Aux 22982 _ = g.Args[1] 22983 ptr := g.Args[0] 22984 mem := g.Args[1] 22985 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 22986 break 22987 } 22988 v.reset(OpS390XMULLWload) 22989 v.Type = t 22990 v.AuxInt = off 22991 v.Aux = sym 22992 v.AddArg(x) 22993 v.AddArg(ptr) 22994 v.AddArg(mem) 22995 return true 22996 } 22997 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 22998 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 22999 // result: (MULLWload <t> [off] {sym} x ptr mem) 23000 for { 23001 t := v.Type 23002 _ = v.Args[1] 23003 g := v.Args[0] 23004 if g.Op != OpS390XMOVWload { 23005 break 23006 } 23007 off := g.AuxInt 23008 sym := g.Aux 23009 _ = g.Args[1] 23010 ptr := g.Args[0] 23011 mem := g.Args[1] 23012 x := v.Args[1] 23013 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23014 break 23015 } 23016 v.reset(OpS390XMULLWload) 23017 v.Type = t 23018 v.AuxInt = off 23019 v.Aux = sym 23020 v.AddArg(x) 23021 v.AddArg(ptr) 23022 v.AddArg(mem) 23023 return true 23024 } 23025 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 23026 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23027 // result: (MULLWload <t> [off] {sym} x ptr mem) 23028 for { 23029 t := v.Type 23030 _ = v.Args[1] 23031 g := v.Args[0] 23032 if g.Op != OpS390XMOVWload { 23033 break 23034 } 23035 off := g.AuxInt 23036 sym := g.Aux 23037 _ = g.Args[1] 23038 ptr := g.Args[0] 23039 mem := g.Args[1] 23040 x := v.Args[1] 23041 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23042 break 23043 } 23044 v.reset(OpS390XMULLWload) 23045 v.Type = t 23046 v.AuxInt = off 23047 v.Aux = sym 23048 v.AddArg(x) 23049 v.AddArg(ptr) 23050 v.AddArg(mem) 23051 return true 23052 } 23053 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 23054 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23055 // result: (MULLWload <t> [off] {sym} x ptr mem) 23056 for { 23057 t := v.Type 23058 _ = v.Args[1] 23059 x := v.Args[0] 23060 g := v.Args[1] 23061 if g.Op != OpS390XMOVWload { 23062 break 23063 } 23064 off := g.AuxInt 23065 sym := g.Aux 23066 _ = g.Args[1] 23067 ptr := g.Args[0] 23068 mem := g.Args[1] 23069 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23070 break 23071 } 23072 v.reset(OpS390XMULLWload) 23073 v.Type = t 23074 v.AuxInt = off 23075 v.Aux = sym 23076 v.AddArg(x) 23077 v.AddArg(ptr) 23078 v.AddArg(mem) 23079 return true 23080 } 23081 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 23082 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23083 // result: (MULLWload <t> [off] {sym} x ptr mem) 23084 for { 23085 t := v.Type 23086 _ = v.Args[1] 23087 x := v.Args[0] 23088 g := v.Args[1] 23089 if g.Op != OpS390XMOVWZload { 23090 break 23091 } 23092 off := g.AuxInt 23093 sym := g.Aux 23094 _ = g.Args[1] 23095 ptr := g.Args[0] 23096 mem := g.Args[1] 23097 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23098 break 23099 } 23100 v.reset(OpS390XMULLWload) 23101 v.Type = t 23102 v.AuxInt = off 23103 v.Aux = sym 23104 v.AddArg(x) 23105 v.AddArg(ptr) 23106 v.AddArg(mem) 23107 return true 23108 } 23109 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 23110 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23111 // result: (MULLWload <t> [off] {sym} x ptr mem) 23112 for { 23113 t := v.Type 23114 _ = v.Args[1] 23115 g := v.Args[0] 23116 if g.Op != OpS390XMOVWZload { 23117 break 23118 } 23119 off := g.AuxInt 23120 sym := g.Aux 23121 _ = g.Args[1] 23122 ptr := g.Args[0] 23123 mem := g.Args[1] 23124 x := v.Args[1] 23125 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23126 break 23127 } 23128 v.reset(OpS390XMULLWload) 23129 v.Type = t 23130 v.AuxInt = off 23131 v.Aux = sym 23132 v.AddArg(x) 23133 v.AddArg(ptr) 23134 v.AddArg(mem) 23135 return true 23136 } 23137 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 23138 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23139 // result: (MULLWload <t> [off] {sym} x ptr mem) 23140 for { 23141 t := v.Type 23142 _ = v.Args[1] 23143 g := v.Args[0] 23144 if g.Op != OpS390XMOVWZload { 23145 break 23146 } 23147 off := g.AuxInt 23148 sym := g.Aux 23149 _ = g.Args[1] 23150 ptr := g.Args[0] 23151 mem := g.Args[1] 23152 x := v.Args[1] 23153 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23154 break 23155 } 23156 v.reset(OpS390XMULLWload) 23157 v.Type = t 23158 v.AuxInt = off 23159 v.Aux = sym 23160 v.AddArg(x) 23161 v.AddArg(ptr) 23162 v.AddArg(mem) 23163 return true 23164 } 23165 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 23166 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23167 // result: (MULLWload <t> [off] {sym} x ptr mem) 23168 for { 23169 t := v.Type 23170 _ = v.Args[1] 23171 x := v.Args[0] 23172 g := v.Args[1] 23173 if g.Op != OpS390XMOVWZload { 23174 break 23175 } 23176 off := g.AuxInt 23177 sym := g.Aux 23178 _ = g.Args[1] 23179 ptr := g.Args[0] 23180 mem := g.Args[1] 23181 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23182 break 23183 } 23184 v.reset(OpS390XMULLWload) 23185 v.Type = t 23186 v.AuxInt = off 23187 v.Aux = sym 23188 v.AddArg(x) 23189 v.AddArg(ptr) 23190 v.AddArg(mem) 23191 return true 23192 } 23193 return false 23194 } 23195 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 23196 b := v.Block 23197 _ = b 23198 // match: (MULLWconst [-1] x) 23199 // cond: 23200 // result: (NEGW x) 23201 for { 23202 if v.AuxInt != -1 { 23203 break 23204 } 23205 x := v.Args[0] 23206 v.reset(OpS390XNEGW) 23207 v.AddArg(x) 23208 return true 23209 } 23210 // match: (MULLWconst [0] _) 23211 // cond: 23212 // result: (MOVDconst [0]) 23213 for { 23214 if v.AuxInt != 0 { 23215 break 23216 } 23217 v.reset(OpS390XMOVDconst) 23218 v.AuxInt = 0 23219 return true 23220 } 23221 // match: (MULLWconst [1] x) 23222 // cond: 23223 // result: x 23224 for { 23225 if v.AuxInt != 1 { 23226 break 23227 } 23228 x := v.Args[0] 23229 v.reset(OpCopy) 23230 v.Type = x.Type 23231 v.AddArg(x) 23232 return true 23233 } 23234 // match: (MULLWconst [c] x) 23235 // cond: isPowerOfTwo(c) 23236 // result: (SLWconst [log2(c)] x) 23237 for { 23238 c := v.AuxInt 23239 x := v.Args[0] 23240 if !(isPowerOfTwo(c)) { 23241 break 23242 } 23243 v.reset(OpS390XSLWconst) 23244 v.AuxInt = log2(c) 23245 v.AddArg(x) 23246 return true 23247 } 23248 // match: (MULLWconst [c] x) 23249 // cond: isPowerOfTwo(c+1) && c >= 15 23250 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 23251 for { 23252 c := v.AuxInt 23253 x := v.Args[0] 23254 if !(isPowerOfTwo(c+1) && c >= 15) { 23255 break 23256 } 23257 v.reset(OpS390XSUBW) 23258 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 23259 v0.AuxInt = log2(c + 1) 23260 v0.AddArg(x) 23261 v.AddArg(v0) 23262 v.AddArg(x) 23263 return true 23264 } 23265 // match: (MULLWconst [c] x) 23266 // cond: isPowerOfTwo(c-1) && c >= 17 23267 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 23268 for { 23269 c := v.AuxInt 23270 x := v.Args[0] 23271 if !(isPowerOfTwo(c-1) && c >= 17) { 23272 break 23273 } 23274 v.reset(OpS390XADDW) 23275 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 23276 v0.AuxInt = log2(c - 1) 23277 v0.AddArg(x) 23278 v.AddArg(v0) 23279 v.AddArg(x) 23280 return true 23281 } 23282 // match: (MULLWconst [c] (MOVDconst [d])) 23283 // cond: 23284 // result: (MOVDconst [int64(int32(c*d))]) 23285 for { 23286 c := v.AuxInt 23287 v_0 := v.Args[0] 23288 if v_0.Op != OpS390XMOVDconst { 23289 break 23290 } 23291 d := v_0.AuxInt 23292 v.reset(OpS390XMOVDconst) 23293 v.AuxInt = int64(int32(c * d)) 23294 return true 23295 } 23296 return false 23297 } 23298 func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { 23299 // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) 23300 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 23301 // result: (MULLWload [off1+off2] {sym} x ptr mem) 23302 for { 23303 off1 := v.AuxInt 23304 sym := v.Aux 23305 _ = v.Args[2] 23306 x := v.Args[0] 23307 v_1 := v.Args[1] 23308 if v_1.Op != OpS390XADDconst { 23309 break 23310 } 23311 off2 := v_1.AuxInt 23312 ptr := v_1.Args[0] 23313 mem := v.Args[2] 23314 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 23315 break 23316 } 23317 v.reset(OpS390XMULLWload) 23318 v.AuxInt = off1 + off2 23319 v.Aux = sym 23320 v.AddArg(x) 23321 v.AddArg(ptr) 23322 v.AddArg(mem) 23323 return true 23324 } 23325 // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 23326 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 23327 // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 23328 for { 23329 o1 := v.AuxInt 23330 s1 := v.Aux 23331 _ = v.Args[2] 23332 x := v.Args[0] 23333 v_1 := v.Args[1] 23334 if v_1.Op != OpS390XMOVDaddr { 23335 break 23336 } 23337 o2 := v_1.AuxInt 23338 s2 := v_1.Aux 23339 ptr := v_1.Args[0] 23340 mem := v.Args[2] 23341 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 23342 break 23343 } 23344 v.reset(OpS390XMULLWload) 23345 v.AuxInt = o1 + o2 23346 v.Aux = mergeSym(s1, s2) 23347 v.AddArg(x) 23348 v.AddArg(ptr) 23349 v.AddArg(mem) 23350 return true 23351 } 23352 return false 23353 } 23354 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 23355 // match: (NEG (MOVDconst [c])) 23356 // cond: 23357 // result: (MOVDconst [-c]) 23358 for { 23359 v_0 := v.Args[0] 23360 if v_0.Op != OpS390XMOVDconst { 23361 break 23362 } 23363 c := v_0.AuxInt 23364 v.reset(OpS390XMOVDconst) 23365 v.AuxInt = -c 23366 return true 23367 } 23368 // match: (NEG (ADDconst [c] (NEG x))) 23369 // cond: c != -(1<<31) 23370 // result: (ADDconst [-c] x) 23371 for { 23372 v_0 := v.Args[0] 23373 if v_0.Op != OpS390XADDconst { 23374 break 23375 } 23376 c := v_0.AuxInt 23377 v_0_0 := v_0.Args[0] 23378 if v_0_0.Op != OpS390XNEG { 23379 break 23380 } 23381 x := v_0_0.Args[0] 23382 if !(c != -(1 << 31)) { 23383 break 23384 } 23385 v.reset(OpS390XADDconst) 23386 v.AuxInt = -c 23387 v.AddArg(x) 23388 return true 23389 } 23390 return false 23391 } 23392 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 23393 // match: (NEGW (MOVDconst [c])) 23394 // cond: 23395 // result: (MOVDconst [int64(int32(-c))]) 23396 for { 23397 v_0 := v.Args[0] 23398 if v_0.Op != OpS390XMOVDconst { 23399 break 23400 } 23401 c := v_0.AuxInt 23402 v.reset(OpS390XMOVDconst) 23403 v.AuxInt = int64(int32(-c)) 23404 return true 23405 } 23406 return false 23407 } 23408 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 23409 b := v.Block 23410 _ = b 23411 typ := &b.Func.Config.Types 23412 _ = typ 23413 // match: (NOT x) 23414 // cond: true 23415 // result: (XOR (MOVDconst [-1]) x) 23416 for { 23417 x := v.Args[0] 23418 if !(true) { 23419 break 23420 } 23421 v.reset(OpS390XXOR) 23422 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 23423 v0.AuxInt = -1 23424 v.AddArg(v0) 23425 v.AddArg(x) 23426 return true 23427 } 23428 return false 23429 } 23430 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 23431 // match: (NOTW x) 23432 // cond: true 23433 // result: (XORWconst [-1] x) 23434 for { 23435 x := v.Args[0] 23436 if !(true) { 23437 break 23438 } 23439 v.reset(OpS390XXORWconst) 23440 v.AuxInt = -1 23441 v.AddArg(x) 23442 return true 23443 } 23444 return false 23445 } 23446 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 23447 b := v.Block 23448 _ = b 23449 // match: (OR x (MOVDconst [c])) 23450 // cond: isU32Bit(c) 23451 // result: (ORconst [c] x) 23452 for { 23453 _ = v.Args[1] 23454 x := v.Args[0] 23455 v_1 := v.Args[1] 23456 if v_1.Op != OpS390XMOVDconst { 23457 break 23458 } 23459 c := v_1.AuxInt 23460 if !(isU32Bit(c)) { 23461 break 23462 } 23463 v.reset(OpS390XORconst) 23464 v.AuxInt = c 23465 v.AddArg(x) 23466 return true 23467 } 23468 // match: (OR (MOVDconst [c]) x) 23469 // cond: isU32Bit(c) 23470 // result: (ORconst [c] x) 23471 for { 23472 _ = v.Args[1] 23473 v_0 := v.Args[0] 23474 if v_0.Op != OpS390XMOVDconst { 23475 break 23476 } 23477 c := v_0.AuxInt 23478 x := v.Args[1] 23479 if !(isU32Bit(c)) { 23480 break 23481 } 23482 v.reset(OpS390XORconst) 23483 v.AuxInt = c 23484 v.AddArg(x) 23485 return true 23486 } 23487 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 23488 // cond: d == 64-c 23489 // result: (RLLGconst [c] x) 23490 for { 23491 _ = v.Args[1] 23492 v_0 := v.Args[0] 23493 if v_0.Op != OpS390XSLDconst { 23494 break 23495 } 23496 c := v_0.AuxInt 23497 x := v_0.Args[0] 23498 v_1 := v.Args[1] 23499 if v_1.Op != OpS390XSRDconst { 23500 break 23501 } 23502 d := v_1.AuxInt 23503 if x != v_1.Args[0] { 23504 break 23505 } 23506 if !(d == 64-c) { 23507 break 23508 } 23509 v.reset(OpS390XRLLGconst) 23510 v.AuxInt = c 23511 v.AddArg(x) 23512 return true 23513 } 23514 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 23515 // cond: d == 64-c 23516 // result: (RLLGconst [c] x) 23517 for { 23518 _ = v.Args[1] 23519 v_0 := v.Args[0] 23520 if v_0.Op != OpS390XSRDconst { 23521 break 23522 } 23523 d := v_0.AuxInt 23524 x := v_0.Args[0] 23525 v_1 := v.Args[1] 23526 if v_1.Op != OpS390XSLDconst { 23527 break 23528 } 23529 c := v_1.AuxInt 23530 if x != v_1.Args[0] { 23531 break 23532 } 23533 if !(d == 64-c) { 23534 break 23535 } 23536 v.reset(OpS390XRLLGconst) 23537 v.AuxInt = c 23538 v.AddArg(x) 23539 return true 23540 } 23541 // match: (OR (MOVDconst [-1<<63]) (LGDR <t> x)) 23542 // cond: 23543 // result: (LGDR <t> (LNDFR <x.Type> x)) 23544 for { 23545 _ = v.Args[1] 23546 v_0 := v.Args[0] 23547 if v_0.Op != OpS390XMOVDconst { 23548 break 23549 } 23550 if v_0.AuxInt != -1<<63 { 23551 break 23552 } 23553 v_1 := v.Args[1] 23554 if v_1.Op != OpS390XLGDR { 23555 break 23556 } 23557 t := v_1.Type 23558 x := v_1.Args[0] 23559 v.reset(OpS390XLGDR) 23560 v.Type = t 23561 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 23562 v0.AddArg(x) 23563 v.AddArg(v0) 23564 return true 23565 } 23566 // match: (OR (LGDR <t> x) (MOVDconst [-1<<63])) 23567 // cond: 23568 // result: (LGDR <t> (LNDFR <x.Type> x)) 23569 for { 23570 _ = v.Args[1] 23571 v_0 := v.Args[0] 23572 if v_0.Op != OpS390XLGDR { 23573 break 23574 } 23575 t := v_0.Type 23576 x := v_0.Args[0] 23577 v_1 := v.Args[1] 23578 if v_1.Op != OpS390XMOVDconst { 23579 break 23580 } 23581 if v_1.AuxInt != -1<<63 { 23582 break 23583 } 23584 v.reset(OpS390XLGDR) 23585 v.Type = t 23586 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 23587 v0.AddArg(x) 23588 v.AddArg(v0) 23589 return true 23590 } 23591 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR <t> y))) 23592 // cond: 23593 // result: (LGDR (CPSDR <t> y x)) 23594 for { 23595 _ = v.Args[1] 23596 v_0 := v.Args[0] 23597 if v_0.Op != OpS390XSLDconst { 23598 break 23599 } 23600 if v_0.AuxInt != 63 { 23601 break 23602 } 23603 v_0_0 := v_0.Args[0] 23604 if v_0_0.Op != OpS390XSRDconst { 23605 break 23606 } 23607 if v_0_0.AuxInt != 63 { 23608 break 23609 } 23610 v_0_0_0 := v_0_0.Args[0] 23611 if v_0_0_0.Op != OpS390XLGDR { 23612 break 23613 } 23614 x := v_0_0_0.Args[0] 23615 v_1 := v.Args[1] 23616 if v_1.Op != OpS390XLGDR { 23617 break 23618 } 23619 v_1_0 := v_1.Args[0] 23620 if v_1_0.Op != OpS390XLPDFR { 23621 break 23622 } 23623 t := v_1_0.Type 23624 y := v_1_0.Args[0] 23625 v.reset(OpS390XLGDR) 23626 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 23627 v0.AddArg(y) 23628 v0.AddArg(x) 23629 v.AddArg(v0) 23630 return true 23631 } 23632 // match: (OR (LGDR (LPDFR <t> y)) (SLDconst [63] (SRDconst [63] (LGDR x)))) 23633 // cond: 23634 // result: (LGDR (CPSDR <t> y x)) 23635 for { 23636 _ = v.Args[1] 23637 v_0 := v.Args[0] 23638 if v_0.Op != OpS390XLGDR { 23639 break 23640 } 23641 v_0_0 := v_0.Args[0] 23642 if v_0_0.Op != OpS390XLPDFR { 23643 break 23644 } 23645 t := v_0_0.Type 23646 y := v_0_0.Args[0] 23647 v_1 := v.Args[1] 23648 if v_1.Op != OpS390XSLDconst { 23649 break 23650 } 23651 if v_1.AuxInt != 63 { 23652 break 23653 } 23654 v_1_0 := v_1.Args[0] 23655 if v_1_0.Op != OpS390XSRDconst { 23656 break 23657 } 23658 if v_1_0.AuxInt != 63 { 23659 break 23660 } 23661 v_1_0_0 := v_1_0.Args[0] 23662 if v_1_0_0.Op != OpS390XLGDR { 23663 break 23664 } 23665 x := v_1_0_0.Args[0] 23666 v.reset(OpS390XLGDR) 23667 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 23668 v0.AddArg(y) 23669 v0.AddArg(x) 23670 v.AddArg(v0) 23671 return true 23672 } 23673 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) 23674 // cond: c & -1<<63 == 0 23675 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 23676 for { 23677 _ = v.Args[1] 23678 v_0 := v.Args[0] 23679 if v_0.Op != OpS390XSLDconst { 23680 break 23681 } 23682 if v_0.AuxInt != 63 { 23683 break 23684 } 23685 v_0_0 := v_0.Args[0] 23686 if v_0_0.Op != OpS390XSRDconst { 23687 break 23688 } 23689 if v_0_0.AuxInt != 63 { 23690 break 23691 } 23692 v_0_0_0 := v_0_0.Args[0] 23693 if v_0_0_0.Op != OpS390XLGDR { 23694 break 23695 } 23696 x := v_0_0_0.Args[0] 23697 v_1 := v.Args[1] 23698 if v_1.Op != OpS390XMOVDconst { 23699 break 23700 } 23701 c := v_1.AuxInt 23702 if !(c&-1<<63 == 0) { 23703 break 23704 } 23705 v.reset(OpS390XLGDR) 23706 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 23707 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 23708 v1.AuxInt = c 23709 v0.AddArg(v1) 23710 v0.AddArg(x) 23711 v.AddArg(v0) 23712 return true 23713 } 23714 // match: (OR (MOVDconst [c]) (SLDconst [63] (SRDconst [63] (LGDR x)))) 23715 // cond: c & -1<<63 == 0 23716 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 23717 for { 23718 _ = v.Args[1] 23719 v_0 := v.Args[0] 23720 if v_0.Op != OpS390XMOVDconst { 23721 break 23722 } 23723 c := v_0.AuxInt 23724 v_1 := v.Args[1] 23725 if v_1.Op != OpS390XSLDconst { 23726 break 23727 } 23728 if v_1.AuxInt != 63 { 23729 break 23730 } 23731 v_1_0 := v_1.Args[0] 23732 if v_1_0.Op != OpS390XSRDconst { 23733 break 23734 } 23735 if v_1_0.AuxInt != 63 { 23736 break 23737 } 23738 v_1_0_0 := v_1_0.Args[0] 23739 if v_1_0_0.Op != OpS390XLGDR { 23740 break 23741 } 23742 x := v_1_0_0.Args[0] 23743 if !(c&-1<<63 == 0) { 23744 break 23745 } 23746 v.reset(OpS390XLGDR) 23747 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 23748 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 23749 v1.AuxInt = c 23750 v0.AddArg(v1) 23751 v0.AddArg(x) 23752 v.AddArg(v0) 23753 return true 23754 } 23755 return false 23756 } 23757 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 23758 b := v.Block 23759 _ = b 23760 typ := &b.Func.Config.Types 23761 _ = typ 23762 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 23763 // cond: 23764 // result: (MOVDconst [c|d]) 23765 for { 23766 _ = v.Args[1] 23767 v_0 := v.Args[0] 23768 if v_0.Op != OpS390XMOVDconst { 23769 break 23770 } 23771 c := v_0.AuxInt 23772 v_1 := v.Args[1] 23773 if v_1.Op != OpS390XMOVDconst { 23774 break 23775 } 23776 d := v_1.AuxInt 23777 v.reset(OpS390XMOVDconst) 23778 v.AuxInt = c | d 23779 return true 23780 } 23781 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 23782 // cond: 23783 // result: (MOVDconst [c|d]) 23784 for { 23785 _ = v.Args[1] 23786 v_0 := v.Args[0] 23787 if v_0.Op != OpS390XMOVDconst { 23788 break 23789 } 23790 d := v_0.AuxInt 23791 v_1 := v.Args[1] 23792 if v_1.Op != OpS390XMOVDconst { 23793 break 23794 } 23795 c := v_1.AuxInt 23796 v.reset(OpS390XMOVDconst) 23797 v.AuxInt = c | d 23798 return true 23799 } 23800 // match: (OR x x) 23801 // cond: 23802 // result: x 23803 for { 23804 _ = v.Args[1] 23805 x := v.Args[0] 23806 if x != v.Args[1] { 23807 break 23808 } 23809 v.reset(OpCopy) 23810 v.Type = x.Type 23811 v.AddArg(x) 23812 return true 23813 } 23814 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 23815 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23816 // result: (ORload <t> [off] {sym} x ptr mem) 23817 for { 23818 t := v.Type 23819 _ = v.Args[1] 23820 x := v.Args[0] 23821 g := v.Args[1] 23822 if g.Op != OpS390XMOVDload { 23823 break 23824 } 23825 off := g.AuxInt 23826 sym := g.Aux 23827 _ = g.Args[1] 23828 ptr := g.Args[0] 23829 mem := g.Args[1] 23830 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23831 break 23832 } 23833 v.reset(OpS390XORload) 23834 v.Type = t 23835 v.AuxInt = off 23836 v.Aux = sym 23837 v.AddArg(x) 23838 v.AddArg(ptr) 23839 v.AddArg(mem) 23840 return true 23841 } 23842 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 23843 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23844 // result: (ORload <t> [off] {sym} x ptr mem) 23845 for { 23846 t := v.Type 23847 _ = v.Args[1] 23848 g := v.Args[0] 23849 if g.Op != OpS390XMOVDload { 23850 break 23851 } 23852 off := g.AuxInt 23853 sym := g.Aux 23854 _ = g.Args[1] 23855 ptr := g.Args[0] 23856 mem := g.Args[1] 23857 x := v.Args[1] 23858 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23859 break 23860 } 23861 v.reset(OpS390XORload) 23862 v.Type = t 23863 v.AuxInt = off 23864 v.Aux = sym 23865 v.AddArg(x) 23866 v.AddArg(ptr) 23867 v.AddArg(mem) 23868 return true 23869 } 23870 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 23871 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23872 // result: (ORload <t> [off] {sym} x ptr mem) 23873 for { 23874 t := v.Type 23875 _ = v.Args[1] 23876 g := v.Args[0] 23877 if g.Op != OpS390XMOVDload { 23878 break 23879 } 23880 off := g.AuxInt 23881 sym := g.Aux 23882 _ = g.Args[1] 23883 ptr := g.Args[0] 23884 mem := g.Args[1] 23885 x := v.Args[1] 23886 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23887 break 23888 } 23889 v.reset(OpS390XORload) 23890 v.Type = t 23891 v.AuxInt = off 23892 v.Aux = sym 23893 v.AddArg(x) 23894 v.AddArg(ptr) 23895 v.AddArg(mem) 23896 return true 23897 } 23898 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 23899 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 23900 // result: (ORload <t> [off] {sym} x ptr mem) 23901 for { 23902 t := v.Type 23903 _ = v.Args[1] 23904 x := v.Args[0] 23905 g := v.Args[1] 23906 if g.Op != OpS390XMOVDload { 23907 break 23908 } 23909 off := g.AuxInt 23910 sym := g.Aux 23911 _ = g.Args[1] 23912 ptr := g.Args[0] 23913 mem := g.Args[1] 23914 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 23915 break 23916 } 23917 v.reset(OpS390XORload) 23918 v.Type = t 23919 v.AuxInt = off 23920 v.Aux = sym 23921 v.AddArg(x) 23922 v.AddArg(ptr) 23923 v.AddArg(mem) 23924 return true 23925 } 23926 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 23927 // 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) 23928 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 23929 for { 23930 _ = v.Args[1] 23931 x1 := v.Args[0] 23932 if x1.Op != OpS390XMOVBZload { 23933 break 23934 } 23935 i1 := x1.AuxInt 23936 s := x1.Aux 23937 _ = x1.Args[1] 23938 p := x1.Args[0] 23939 mem := x1.Args[1] 23940 sh := v.Args[1] 23941 if sh.Op != OpS390XSLDconst { 23942 break 23943 } 23944 if sh.AuxInt != 8 { 23945 break 23946 } 23947 x0 := sh.Args[0] 23948 if x0.Op != OpS390XMOVBZload { 23949 break 23950 } 23951 i0 := x0.AuxInt 23952 if x0.Aux != s { 23953 break 23954 } 23955 _ = x0.Args[1] 23956 if p != x0.Args[0] { 23957 break 23958 } 23959 if mem != x0.Args[1] { 23960 break 23961 } 23962 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)) { 23963 break 23964 } 23965 b = mergePoint(b, x0, x1) 23966 v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 23967 v.reset(OpCopy) 23968 v.AddArg(v0) 23969 v0.AuxInt = i0 23970 v0.Aux = s 23971 v0.AddArg(p) 23972 v0.AddArg(mem) 23973 return true 23974 } 23975 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 23976 // 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) 23977 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 23978 for { 23979 _ = v.Args[1] 23980 sh := v.Args[0] 23981 if sh.Op != OpS390XSLDconst { 23982 break 23983 } 23984 if sh.AuxInt != 8 { 23985 break 23986 } 23987 x0 := sh.Args[0] 23988 if x0.Op != OpS390XMOVBZload { 23989 break 23990 } 23991 i0 := x0.AuxInt 23992 s := x0.Aux 23993 _ = x0.Args[1] 23994 p := x0.Args[0] 23995 mem := x0.Args[1] 23996 x1 := v.Args[1] 23997 if x1.Op != OpS390XMOVBZload { 23998 break 23999 } 24000 i1 := x1.AuxInt 24001 if x1.Aux != s { 24002 break 24003 } 24004 _ = x1.Args[1] 24005 if p != x1.Args[0] { 24006 break 24007 } 24008 if mem != x1.Args[1] { 24009 break 24010 } 24011 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)) { 24012 break 24013 } 24014 b = mergePoint(b, x0, x1) 24015 v0 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 24016 v.reset(OpCopy) 24017 v.AddArg(v0) 24018 v0.AuxInt = i0 24019 v0.Aux = s 24020 v0.AddArg(p) 24021 v0.AddArg(mem) 24022 return true 24023 } 24024 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 24025 // 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) 24026 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 24027 for { 24028 _ = v.Args[1] 24029 x1 := v.Args[0] 24030 if x1.Op != OpS390XMOVHZload { 24031 break 24032 } 24033 i1 := x1.AuxInt 24034 s := x1.Aux 24035 _ = x1.Args[1] 24036 p := x1.Args[0] 24037 mem := x1.Args[1] 24038 sh := v.Args[1] 24039 if sh.Op != OpS390XSLDconst { 24040 break 24041 } 24042 if sh.AuxInt != 16 { 24043 break 24044 } 24045 x0 := sh.Args[0] 24046 if x0.Op != OpS390XMOVHZload { 24047 break 24048 } 24049 i0 := x0.AuxInt 24050 if x0.Aux != s { 24051 break 24052 } 24053 _ = x0.Args[1] 24054 if p != x0.Args[0] { 24055 break 24056 } 24057 if mem != x0.Args[1] { 24058 break 24059 } 24060 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)) { 24061 break 24062 } 24063 b = mergePoint(b, x0, x1) 24064 v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) 24065 v.reset(OpCopy) 24066 v.AddArg(v0) 24067 v0.AuxInt = i0 24068 v0.Aux = s 24069 v0.AddArg(p) 24070 v0.AddArg(mem) 24071 return true 24072 } 24073 return false 24074 } 24075 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 24076 b := v.Block 24077 _ = b 24078 typ := &b.Func.Config.Types 24079 _ = typ 24080 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 24081 // 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) 24082 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 24083 for { 24084 _ = v.Args[1] 24085 sh := v.Args[0] 24086 if sh.Op != OpS390XSLDconst { 24087 break 24088 } 24089 if sh.AuxInt != 16 { 24090 break 24091 } 24092 x0 := sh.Args[0] 24093 if x0.Op != OpS390XMOVHZload { 24094 break 24095 } 24096 i0 := x0.AuxInt 24097 s := x0.Aux 24098 _ = x0.Args[1] 24099 p := x0.Args[0] 24100 mem := x0.Args[1] 24101 x1 := v.Args[1] 24102 if x1.Op != OpS390XMOVHZload { 24103 break 24104 } 24105 i1 := x1.AuxInt 24106 if x1.Aux != s { 24107 break 24108 } 24109 _ = x1.Args[1] 24110 if p != x1.Args[0] { 24111 break 24112 } 24113 if mem != x1.Args[1] { 24114 break 24115 } 24116 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)) { 24117 break 24118 } 24119 b = mergePoint(b, x0, x1) 24120 v0 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) 24121 v.reset(OpCopy) 24122 v.AddArg(v0) 24123 v0.AuxInt = i0 24124 v0.Aux = s 24125 v0.AddArg(p) 24126 v0.AddArg(mem) 24127 return true 24128 } 24129 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 24130 // 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) 24131 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 24132 for { 24133 _ = v.Args[1] 24134 x1 := v.Args[0] 24135 if x1.Op != OpS390XMOVWZload { 24136 break 24137 } 24138 i1 := x1.AuxInt 24139 s := x1.Aux 24140 _ = x1.Args[1] 24141 p := x1.Args[0] 24142 mem := x1.Args[1] 24143 sh := v.Args[1] 24144 if sh.Op != OpS390XSLDconst { 24145 break 24146 } 24147 if sh.AuxInt != 32 { 24148 break 24149 } 24150 x0 := sh.Args[0] 24151 if x0.Op != OpS390XMOVWZload { 24152 break 24153 } 24154 i0 := x0.AuxInt 24155 if x0.Aux != s { 24156 break 24157 } 24158 _ = x0.Args[1] 24159 if p != x0.Args[0] { 24160 break 24161 } 24162 if mem != x0.Args[1] { 24163 break 24164 } 24165 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)) { 24166 break 24167 } 24168 b = mergePoint(b, x0, x1) 24169 v0 := b.NewValue0(x0.Pos, OpS390XMOVDload, typ.UInt64) 24170 v.reset(OpCopy) 24171 v.AddArg(v0) 24172 v0.AuxInt = i0 24173 v0.Aux = s 24174 v0.AddArg(p) 24175 v0.AddArg(mem) 24176 return true 24177 } 24178 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 24179 // 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) 24180 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 24181 for { 24182 _ = v.Args[1] 24183 sh := v.Args[0] 24184 if sh.Op != OpS390XSLDconst { 24185 break 24186 } 24187 if sh.AuxInt != 32 { 24188 break 24189 } 24190 x0 := sh.Args[0] 24191 if x0.Op != OpS390XMOVWZload { 24192 break 24193 } 24194 i0 := x0.AuxInt 24195 s := x0.Aux 24196 _ = x0.Args[1] 24197 p := x0.Args[0] 24198 mem := x0.Args[1] 24199 x1 := v.Args[1] 24200 if x1.Op != OpS390XMOVWZload { 24201 break 24202 } 24203 i1 := x1.AuxInt 24204 if x1.Aux != s { 24205 break 24206 } 24207 _ = x1.Args[1] 24208 if p != x1.Args[0] { 24209 break 24210 } 24211 if mem != x1.Args[1] { 24212 break 24213 } 24214 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)) { 24215 break 24216 } 24217 b = mergePoint(b, x0, x1) 24218 v0 := b.NewValue0(x1.Pos, OpS390XMOVDload, typ.UInt64) 24219 v.reset(OpCopy) 24220 v.AddArg(v0) 24221 v0.AuxInt = i0 24222 v0.Aux = s 24223 v0.AddArg(p) 24224 v0.AddArg(mem) 24225 return true 24226 } 24227 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 24228 // 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) 24229 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24230 for { 24231 _ = v.Args[1] 24232 s0 := v.Args[0] 24233 if s0.Op != OpS390XSLDconst { 24234 break 24235 } 24236 j0 := s0.AuxInt 24237 x0 := s0.Args[0] 24238 if x0.Op != OpS390XMOVBZload { 24239 break 24240 } 24241 i0 := x0.AuxInt 24242 s := x0.Aux 24243 _ = x0.Args[1] 24244 p := x0.Args[0] 24245 mem := x0.Args[1] 24246 or := v.Args[1] 24247 if or.Op != OpS390XOR { 24248 break 24249 } 24250 _ = or.Args[1] 24251 s1 := or.Args[0] 24252 if s1.Op != OpS390XSLDconst { 24253 break 24254 } 24255 j1 := s1.AuxInt 24256 x1 := s1.Args[0] 24257 if x1.Op != OpS390XMOVBZload { 24258 break 24259 } 24260 i1 := x1.AuxInt 24261 if x1.Aux != s { 24262 break 24263 } 24264 _ = x1.Args[1] 24265 if p != x1.Args[0] { 24266 break 24267 } 24268 if mem != x1.Args[1] { 24269 break 24270 } 24271 y := or.Args[1] 24272 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)) { 24273 break 24274 } 24275 b = mergePoint(b, x0, x1) 24276 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 24277 v.reset(OpCopy) 24278 v.AddArg(v0) 24279 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 24280 v1.AuxInt = j1 24281 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 24282 v2.AuxInt = i0 24283 v2.Aux = s 24284 v2.AddArg(p) 24285 v2.AddArg(mem) 24286 v1.AddArg(v2) 24287 v0.AddArg(v1) 24288 v0.AddArg(y) 24289 return true 24290 } 24291 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 24292 // 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) 24293 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24294 for { 24295 _ = v.Args[1] 24296 s0 := v.Args[0] 24297 if s0.Op != OpS390XSLDconst { 24298 break 24299 } 24300 j0 := s0.AuxInt 24301 x0 := s0.Args[0] 24302 if x0.Op != OpS390XMOVBZload { 24303 break 24304 } 24305 i0 := x0.AuxInt 24306 s := x0.Aux 24307 _ = x0.Args[1] 24308 p := x0.Args[0] 24309 mem := x0.Args[1] 24310 or := v.Args[1] 24311 if or.Op != OpS390XOR { 24312 break 24313 } 24314 _ = or.Args[1] 24315 y := or.Args[0] 24316 s1 := or.Args[1] 24317 if s1.Op != OpS390XSLDconst { 24318 break 24319 } 24320 j1 := s1.AuxInt 24321 x1 := s1.Args[0] 24322 if x1.Op != OpS390XMOVBZload { 24323 break 24324 } 24325 i1 := x1.AuxInt 24326 if x1.Aux != s { 24327 break 24328 } 24329 _ = x1.Args[1] 24330 if p != x1.Args[0] { 24331 break 24332 } 24333 if mem != x1.Args[1] { 24334 break 24335 } 24336 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)) { 24337 break 24338 } 24339 b = mergePoint(b, x0, x1) 24340 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 24341 v.reset(OpCopy) 24342 v.AddArg(v0) 24343 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 24344 v1.AuxInt = j1 24345 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 24346 v2.AuxInt = i0 24347 v2.Aux = s 24348 v2.AddArg(p) 24349 v2.AddArg(mem) 24350 v1.AddArg(v2) 24351 v0.AddArg(v1) 24352 v0.AddArg(y) 24353 return true 24354 } 24355 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 24356 // 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) 24357 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24358 for { 24359 _ = v.Args[1] 24360 or := v.Args[0] 24361 if or.Op != OpS390XOR { 24362 break 24363 } 24364 _ = or.Args[1] 24365 s1 := or.Args[0] 24366 if s1.Op != OpS390XSLDconst { 24367 break 24368 } 24369 j1 := s1.AuxInt 24370 x1 := s1.Args[0] 24371 if x1.Op != OpS390XMOVBZload { 24372 break 24373 } 24374 i1 := x1.AuxInt 24375 s := x1.Aux 24376 _ = x1.Args[1] 24377 p := x1.Args[0] 24378 mem := x1.Args[1] 24379 y := or.Args[1] 24380 s0 := v.Args[1] 24381 if s0.Op != OpS390XSLDconst { 24382 break 24383 } 24384 j0 := s0.AuxInt 24385 x0 := s0.Args[0] 24386 if x0.Op != OpS390XMOVBZload { 24387 break 24388 } 24389 i0 := x0.AuxInt 24390 if x0.Aux != s { 24391 break 24392 } 24393 _ = x0.Args[1] 24394 if p != x0.Args[0] { 24395 break 24396 } 24397 if mem != x0.Args[1] { 24398 break 24399 } 24400 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)) { 24401 break 24402 } 24403 b = mergePoint(b, x0, x1) 24404 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 24405 v.reset(OpCopy) 24406 v.AddArg(v0) 24407 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 24408 v1.AuxInt = j1 24409 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 24410 v2.AuxInt = i0 24411 v2.Aux = s 24412 v2.AddArg(p) 24413 v2.AddArg(mem) 24414 v1.AddArg(v2) 24415 v0.AddArg(v1) 24416 v0.AddArg(y) 24417 return true 24418 } 24419 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 24420 // 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) 24421 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 24422 for { 24423 _ = v.Args[1] 24424 or := v.Args[0] 24425 if or.Op != OpS390XOR { 24426 break 24427 } 24428 _ = or.Args[1] 24429 y := or.Args[0] 24430 s1 := or.Args[1] 24431 if s1.Op != OpS390XSLDconst { 24432 break 24433 } 24434 j1 := s1.AuxInt 24435 x1 := s1.Args[0] 24436 if x1.Op != OpS390XMOVBZload { 24437 break 24438 } 24439 i1 := x1.AuxInt 24440 s := x1.Aux 24441 _ = x1.Args[1] 24442 p := x1.Args[0] 24443 mem := x1.Args[1] 24444 s0 := v.Args[1] 24445 if s0.Op != OpS390XSLDconst { 24446 break 24447 } 24448 j0 := s0.AuxInt 24449 x0 := s0.Args[0] 24450 if x0.Op != OpS390XMOVBZload { 24451 break 24452 } 24453 i0 := x0.AuxInt 24454 if x0.Aux != s { 24455 break 24456 } 24457 _ = x0.Args[1] 24458 if p != x0.Args[0] { 24459 break 24460 } 24461 if mem != x0.Args[1] { 24462 break 24463 } 24464 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)) { 24465 break 24466 } 24467 b = mergePoint(b, x0, x1) 24468 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 24469 v.reset(OpCopy) 24470 v.AddArg(v0) 24471 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 24472 v1.AuxInt = j1 24473 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 24474 v2.AuxInt = i0 24475 v2.Aux = s 24476 v2.AddArg(p) 24477 v2.AddArg(mem) 24478 v1.AddArg(v2) 24479 v0.AddArg(v1) 24480 v0.AddArg(y) 24481 return true 24482 } 24483 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 24484 // 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) 24485 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24486 for { 24487 _ = v.Args[1] 24488 s0 := v.Args[0] 24489 if s0.Op != OpS390XSLDconst { 24490 break 24491 } 24492 j0 := s0.AuxInt 24493 x0 := s0.Args[0] 24494 if x0.Op != OpS390XMOVHZload { 24495 break 24496 } 24497 i0 := x0.AuxInt 24498 s := x0.Aux 24499 _ = x0.Args[1] 24500 p := x0.Args[0] 24501 mem := x0.Args[1] 24502 or := v.Args[1] 24503 if or.Op != OpS390XOR { 24504 break 24505 } 24506 _ = or.Args[1] 24507 s1 := or.Args[0] 24508 if s1.Op != OpS390XSLDconst { 24509 break 24510 } 24511 j1 := s1.AuxInt 24512 x1 := s1.Args[0] 24513 if x1.Op != OpS390XMOVHZload { 24514 break 24515 } 24516 i1 := x1.AuxInt 24517 if x1.Aux != s { 24518 break 24519 } 24520 _ = x1.Args[1] 24521 if p != x1.Args[0] { 24522 break 24523 } 24524 if mem != x1.Args[1] { 24525 break 24526 } 24527 y := or.Args[1] 24528 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)) { 24529 break 24530 } 24531 b = mergePoint(b, x0, x1) 24532 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 24533 v.reset(OpCopy) 24534 v.AddArg(v0) 24535 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 24536 v1.AuxInt = j1 24537 v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) 24538 v2.AuxInt = i0 24539 v2.Aux = s 24540 v2.AddArg(p) 24541 v2.AddArg(mem) 24542 v1.AddArg(v2) 24543 v0.AddArg(v1) 24544 v0.AddArg(y) 24545 return true 24546 } 24547 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 24548 // 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) 24549 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24550 for { 24551 _ = v.Args[1] 24552 s0 := v.Args[0] 24553 if s0.Op != OpS390XSLDconst { 24554 break 24555 } 24556 j0 := s0.AuxInt 24557 x0 := s0.Args[0] 24558 if x0.Op != OpS390XMOVHZload { 24559 break 24560 } 24561 i0 := x0.AuxInt 24562 s := x0.Aux 24563 _ = x0.Args[1] 24564 p := x0.Args[0] 24565 mem := x0.Args[1] 24566 or := v.Args[1] 24567 if or.Op != OpS390XOR { 24568 break 24569 } 24570 _ = or.Args[1] 24571 y := or.Args[0] 24572 s1 := or.Args[1] 24573 if s1.Op != OpS390XSLDconst { 24574 break 24575 } 24576 j1 := s1.AuxInt 24577 x1 := s1.Args[0] 24578 if x1.Op != OpS390XMOVHZload { 24579 break 24580 } 24581 i1 := x1.AuxInt 24582 if x1.Aux != s { 24583 break 24584 } 24585 _ = x1.Args[1] 24586 if p != x1.Args[0] { 24587 break 24588 } 24589 if mem != x1.Args[1] { 24590 break 24591 } 24592 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)) { 24593 break 24594 } 24595 b = mergePoint(b, x0, x1) 24596 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 24597 v.reset(OpCopy) 24598 v.AddArg(v0) 24599 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 24600 v1.AuxInt = j1 24601 v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) 24602 v2.AuxInt = i0 24603 v2.Aux = s 24604 v2.AddArg(p) 24605 v2.AddArg(mem) 24606 v1.AddArg(v2) 24607 v0.AddArg(v1) 24608 v0.AddArg(y) 24609 return true 24610 } 24611 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 24612 // 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) 24613 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24614 for { 24615 _ = v.Args[1] 24616 or := v.Args[0] 24617 if or.Op != OpS390XOR { 24618 break 24619 } 24620 _ = or.Args[1] 24621 s1 := or.Args[0] 24622 if s1.Op != OpS390XSLDconst { 24623 break 24624 } 24625 j1 := s1.AuxInt 24626 x1 := s1.Args[0] 24627 if x1.Op != OpS390XMOVHZload { 24628 break 24629 } 24630 i1 := x1.AuxInt 24631 s := x1.Aux 24632 _ = x1.Args[1] 24633 p := x1.Args[0] 24634 mem := x1.Args[1] 24635 y := or.Args[1] 24636 s0 := v.Args[1] 24637 if s0.Op != OpS390XSLDconst { 24638 break 24639 } 24640 j0 := s0.AuxInt 24641 x0 := s0.Args[0] 24642 if x0.Op != OpS390XMOVHZload { 24643 break 24644 } 24645 i0 := x0.AuxInt 24646 if x0.Aux != s { 24647 break 24648 } 24649 _ = x0.Args[1] 24650 if p != x0.Args[0] { 24651 break 24652 } 24653 if mem != x0.Args[1] { 24654 break 24655 } 24656 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)) { 24657 break 24658 } 24659 b = mergePoint(b, x0, x1) 24660 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 24661 v.reset(OpCopy) 24662 v.AddArg(v0) 24663 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 24664 v1.AuxInt = j1 24665 v2 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) 24666 v2.AuxInt = i0 24667 v2.Aux = s 24668 v2.AddArg(p) 24669 v2.AddArg(mem) 24670 v1.AddArg(v2) 24671 v0.AddArg(v1) 24672 v0.AddArg(y) 24673 return true 24674 } 24675 return false 24676 } 24677 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 24678 b := v.Block 24679 _ = b 24680 typ := &b.Func.Config.Types 24681 _ = typ 24682 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 24683 // 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) 24684 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 24685 for { 24686 _ = v.Args[1] 24687 or := v.Args[0] 24688 if or.Op != OpS390XOR { 24689 break 24690 } 24691 _ = or.Args[1] 24692 y := or.Args[0] 24693 s1 := or.Args[1] 24694 if s1.Op != OpS390XSLDconst { 24695 break 24696 } 24697 j1 := s1.AuxInt 24698 x1 := s1.Args[0] 24699 if x1.Op != OpS390XMOVHZload { 24700 break 24701 } 24702 i1 := x1.AuxInt 24703 s := x1.Aux 24704 _ = x1.Args[1] 24705 p := x1.Args[0] 24706 mem := x1.Args[1] 24707 s0 := v.Args[1] 24708 if s0.Op != OpS390XSLDconst { 24709 break 24710 } 24711 j0 := s0.AuxInt 24712 x0 := s0.Args[0] 24713 if x0.Op != OpS390XMOVHZload { 24714 break 24715 } 24716 i0 := x0.AuxInt 24717 if x0.Aux != s { 24718 break 24719 } 24720 _ = x0.Args[1] 24721 if p != x0.Args[0] { 24722 break 24723 } 24724 if mem != x0.Args[1] { 24725 break 24726 } 24727 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)) { 24728 break 24729 } 24730 b = mergePoint(b, x0, x1) 24731 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 24732 v.reset(OpCopy) 24733 v.AddArg(v0) 24734 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 24735 v1.AuxInt = j1 24736 v2 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) 24737 v2.AuxInt = i0 24738 v2.Aux = s 24739 v2.AddArg(p) 24740 v2.AddArg(mem) 24741 v1.AddArg(v2) 24742 v0.AddArg(v1) 24743 v0.AddArg(y) 24744 return true 24745 } 24746 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 24747 // 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) 24748 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24749 for { 24750 _ = v.Args[1] 24751 x1 := v.Args[0] 24752 if x1.Op != OpS390XMOVBZloadidx { 24753 break 24754 } 24755 i1 := x1.AuxInt 24756 s := x1.Aux 24757 _ = x1.Args[2] 24758 p := x1.Args[0] 24759 idx := x1.Args[1] 24760 mem := x1.Args[2] 24761 sh := v.Args[1] 24762 if sh.Op != OpS390XSLDconst { 24763 break 24764 } 24765 if sh.AuxInt != 8 { 24766 break 24767 } 24768 x0 := sh.Args[0] 24769 if x0.Op != OpS390XMOVBZloadidx { 24770 break 24771 } 24772 i0 := x0.AuxInt 24773 if x0.Aux != s { 24774 break 24775 } 24776 _ = x0.Args[2] 24777 if p != x0.Args[0] { 24778 break 24779 } 24780 if idx != x0.Args[1] { 24781 break 24782 } 24783 if mem != x0.Args[2] { 24784 break 24785 } 24786 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)) { 24787 break 24788 } 24789 b = mergePoint(b, x0, x1) 24790 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24791 v.reset(OpCopy) 24792 v.AddArg(v0) 24793 v0.AuxInt = i0 24794 v0.Aux = s 24795 v0.AddArg(p) 24796 v0.AddArg(idx) 24797 v0.AddArg(mem) 24798 return true 24799 } 24800 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 24801 // 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) 24802 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24803 for { 24804 _ = v.Args[1] 24805 x1 := v.Args[0] 24806 if x1.Op != OpS390XMOVBZloadidx { 24807 break 24808 } 24809 i1 := x1.AuxInt 24810 s := x1.Aux 24811 _ = x1.Args[2] 24812 idx := x1.Args[0] 24813 p := x1.Args[1] 24814 mem := x1.Args[2] 24815 sh := v.Args[1] 24816 if sh.Op != OpS390XSLDconst { 24817 break 24818 } 24819 if sh.AuxInt != 8 { 24820 break 24821 } 24822 x0 := sh.Args[0] 24823 if x0.Op != OpS390XMOVBZloadidx { 24824 break 24825 } 24826 i0 := x0.AuxInt 24827 if x0.Aux != s { 24828 break 24829 } 24830 _ = x0.Args[2] 24831 if p != x0.Args[0] { 24832 break 24833 } 24834 if idx != x0.Args[1] { 24835 break 24836 } 24837 if mem != x0.Args[2] { 24838 break 24839 } 24840 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)) { 24841 break 24842 } 24843 b = mergePoint(b, x0, x1) 24844 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24845 v.reset(OpCopy) 24846 v.AddArg(v0) 24847 v0.AuxInt = i0 24848 v0.Aux = s 24849 v0.AddArg(p) 24850 v0.AddArg(idx) 24851 v0.AddArg(mem) 24852 return true 24853 } 24854 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 24855 // 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) 24856 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24857 for { 24858 _ = v.Args[1] 24859 x1 := v.Args[0] 24860 if x1.Op != OpS390XMOVBZloadidx { 24861 break 24862 } 24863 i1 := x1.AuxInt 24864 s := x1.Aux 24865 _ = x1.Args[2] 24866 p := x1.Args[0] 24867 idx := x1.Args[1] 24868 mem := x1.Args[2] 24869 sh := v.Args[1] 24870 if sh.Op != OpS390XSLDconst { 24871 break 24872 } 24873 if sh.AuxInt != 8 { 24874 break 24875 } 24876 x0 := sh.Args[0] 24877 if x0.Op != OpS390XMOVBZloadidx { 24878 break 24879 } 24880 i0 := x0.AuxInt 24881 if x0.Aux != s { 24882 break 24883 } 24884 _ = x0.Args[2] 24885 if idx != x0.Args[0] { 24886 break 24887 } 24888 if p != x0.Args[1] { 24889 break 24890 } 24891 if mem != x0.Args[2] { 24892 break 24893 } 24894 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)) { 24895 break 24896 } 24897 b = mergePoint(b, x0, x1) 24898 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24899 v.reset(OpCopy) 24900 v.AddArg(v0) 24901 v0.AuxInt = i0 24902 v0.Aux = s 24903 v0.AddArg(p) 24904 v0.AddArg(idx) 24905 v0.AddArg(mem) 24906 return true 24907 } 24908 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 24909 // 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) 24910 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24911 for { 24912 _ = v.Args[1] 24913 x1 := v.Args[0] 24914 if x1.Op != OpS390XMOVBZloadidx { 24915 break 24916 } 24917 i1 := x1.AuxInt 24918 s := x1.Aux 24919 _ = x1.Args[2] 24920 idx := x1.Args[0] 24921 p := x1.Args[1] 24922 mem := x1.Args[2] 24923 sh := v.Args[1] 24924 if sh.Op != OpS390XSLDconst { 24925 break 24926 } 24927 if sh.AuxInt != 8 { 24928 break 24929 } 24930 x0 := sh.Args[0] 24931 if x0.Op != OpS390XMOVBZloadidx { 24932 break 24933 } 24934 i0 := x0.AuxInt 24935 if x0.Aux != s { 24936 break 24937 } 24938 _ = x0.Args[2] 24939 if idx != x0.Args[0] { 24940 break 24941 } 24942 if p != x0.Args[1] { 24943 break 24944 } 24945 if mem != x0.Args[2] { 24946 break 24947 } 24948 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)) { 24949 break 24950 } 24951 b = mergePoint(b, x0, x1) 24952 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24953 v.reset(OpCopy) 24954 v.AddArg(v0) 24955 v0.AuxInt = i0 24956 v0.Aux = s 24957 v0.AddArg(p) 24958 v0.AddArg(idx) 24959 v0.AddArg(mem) 24960 return true 24961 } 24962 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 24963 // 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) 24964 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 24965 for { 24966 _ = v.Args[1] 24967 sh := v.Args[0] 24968 if sh.Op != OpS390XSLDconst { 24969 break 24970 } 24971 if sh.AuxInt != 8 { 24972 break 24973 } 24974 x0 := sh.Args[0] 24975 if x0.Op != OpS390XMOVBZloadidx { 24976 break 24977 } 24978 i0 := x0.AuxInt 24979 s := x0.Aux 24980 _ = x0.Args[2] 24981 p := x0.Args[0] 24982 idx := x0.Args[1] 24983 mem := x0.Args[2] 24984 x1 := v.Args[1] 24985 if x1.Op != OpS390XMOVBZloadidx { 24986 break 24987 } 24988 i1 := x1.AuxInt 24989 if x1.Aux != s { 24990 break 24991 } 24992 _ = x1.Args[2] 24993 if p != x1.Args[0] { 24994 break 24995 } 24996 if idx != x1.Args[1] { 24997 break 24998 } 24999 if mem != x1.Args[2] { 25000 break 25001 } 25002 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)) { 25003 break 25004 } 25005 b = mergePoint(b, x0, x1) 25006 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25007 v.reset(OpCopy) 25008 v.AddArg(v0) 25009 v0.AuxInt = i0 25010 v0.Aux = s 25011 v0.AddArg(p) 25012 v0.AddArg(idx) 25013 v0.AddArg(mem) 25014 return true 25015 } 25016 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 25017 // 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) 25018 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25019 for { 25020 _ = v.Args[1] 25021 sh := v.Args[0] 25022 if sh.Op != OpS390XSLDconst { 25023 break 25024 } 25025 if sh.AuxInt != 8 { 25026 break 25027 } 25028 x0 := sh.Args[0] 25029 if x0.Op != OpS390XMOVBZloadidx { 25030 break 25031 } 25032 i0 := x0.AuxInt 25033 s := x0.Aux 25034 _ = x0.Args[2] 25035 idx := x0.Args[0] 25036 p := x0.Args[1] 25037 mem := x0.Args[2] 25038 x1 := v.Args[1] 25039 if x1.Op != OpS390XMOVBZloadidx { 25040 break 25041 } 25042 i1 := x1.AuxInt 25043 if x1.Aux != s { 25044 break 25045 } 25046 _ = x1.Args[2] 25047 if p != x1.Args[0] { 25048 break 25049 } 25050 if idx != x1.Args[1] { 25051 break 25052 } 25053 if mem != x1.Args[2] { 25054 break 25055 } 25056 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)) { 25057 break 25058 } 25059 b = mergePoint(b, x0, x1) 25060 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25061 v.reset(OpCopy) 25062 v.AddArg(v0) 25063 v0.AuxInt = i0 25064 v0.Aux = s 25065 v0.AddArg(p) 25066 v0.AddArg(idx) 25067 v0.AddArg(mem) 25068 return true 25069 } 25070 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 25071 // 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) 25072 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25073 for { 25074 _ = v.Args[1] 25075 sh := v.Args[0] 25076 if sh.Op != OpS390XSLDconst { 25077 break 25078 } 25079 if sh.AuxInt != 8 { 25080 break 25081 } 25082 x0 := sh.Args[0] 25083 if x0.Op != OpS390XMOVBZloadidx { 25084 break 25085 } 25086 i0 := x0.AuxInt 25087 s := x0.Aux 25088 _ = x0.Args[2] 25089 p := x0.Args[0] 25090 idx := x0.Args[1] 25091 mem := x0.Args[2] 25092 x1 := v.Args[1] 25093 if x1.Op != OpS390XMOVBZloadidx { 25094 break 25095 } 25096 i1 := x1.AuxInt 25097 if x1.Aux != s { 25098 break 25099 } 25100 _ = x1.Args[2] 25101 if idx != x1.Args[0] { 25102 break 25103 } 25104 if p != x1.Args[1] { 25105 break 25106 } 25107 if mem != x1.Args[2] { 25108 break 25109 } 25110 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)) { 25111 break 25112 } 25113 b = mergePoint(b, x0, x1) 25114 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25115 v.reset(OpCopy) 25116 v.AddArg(v0) 25117 v0.AuxInt = i0 25118 v0.Aux = s 25119 v0.AddArg(p) 25120 v0.AddArg(idx) 25121 v0.AddArg(mem) 25122 return true 25123 } 25124 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 25125 // 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) 25126 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 25127 for { 25128 _ = v.Args[1] 25129 sh := v.Args[0] 25130 if sh.Op != OpS390XSLDconst { 25131 break 25132 } 25133 if sh.AuxInt != 8 { 25134 break 25135 } 25136 x0 := sh.Args[0] 25137 if x0.Op != OpS390XMOVBZloadidx { 25138 break 25139 } 25140 i0 := x0.AuxInt 25141 s := x0.Aux 25142 _ = x0.Args[2] 25143 idx := x0.Args[0] 25144 p := x0.Args[1] 25145 mem := x0.Args[2] 25146 x1 := v.Args[1] 25147 if x1.Op != OpS390XMOVBZloadidx { 25148 break 25149 } 25150 i1 := x1.AuxInt 25151 if x1.Aux != s { 25152 break 25153 } 25154 _ = x1.Args[2] 25155 if idx != x1.Args[0] { 25156 break 25157 } 25158 if p != x1.Args[1] { 25159 break 25160 } 25161 if mem != x1.Args[2] { 25162 break 25163 } 25164 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)) { 25165 break 25166 } 25167 b = mergePoint(b, x0, x1) 25168 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25169 v.reset(OpCopy) 25170 v.AddArg(v0) 25171 v0.AuxInt = i0 25172 v0.Aux = s 25173 v0.AddArg(p) 25174 v0.AddArg(idx) 25175 v0.AddArg(mem) 25176 return true 25177 } 25178 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 25179 // 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) 25180 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25181 for { 25182 _ = v.Args[1] 25183 x1 := v.Args[0] 25184 if x1.Op != OpS390XMOVHZloadidx { 25185 break 25186 } 25187 i1 := x1.AuxInt 25188 s := x1.Aux 25189 _ = x1.Args[2] 25190 p := x1.Args[0] 25191 idx := x1.Args[1] 25192 mem := x1.Args[2] 25193 sh := v.Args[1] 25194 if sh.Op != OpS390XSLDconst { 25195 break 25196 } 25197 if sh.AuxInt != 16 { 25198 break 25199 } 25200 x0 := sh.Args[0] 25201 if x0.Op != OpS390XMOVHZloadidx { 25202 break 25203 } 25204 i0 := x0.AuxInt 25205 if x0.Aux != s { 25206 break 25207 } 25208 _ = x0.Args[2] 25209 if p != x0.Args[0] { 25210 break 25211 } 25212 if idx != x0.Args[1] { 25213 break 25214 } 25215 if mem != x0.Args[2] { 25216 break 25217 } 25218 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)) { 25219 break 25220 } 25221 b = mergePoint(b, x0, x1) 25222 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25223 v.reset(OpCopy) 25224 v.AddArg(v0) 25225 v0.AuxInt = i0 25226 v0.Aux = s 25227 v0.AddArg(p) 25228 v0.AddArg(idx) 25229 v0.AddArg(mem) 25230 return true 25231 } 25232 return false 25233 } 25234 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 25235 b := v.Block 25236 _ = b 25237 typ := &b.Func.Config.Types 25238 _ = typ 25239 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 25240 // 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) 25241 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25242 for { 25243 _ = v.Args[1] 25244 x1 := v.Args[0] 25245 if x1.Op != OpS390XMOVHZloadidx { 25246 break 25247 } 25248 i1 := x1.AuxInt 25249 s := x1.Aux 25250 _ = x1.Args[2] 25251 idx := x1.Args[0] 25252 p := x1.Args[1] 25253 mem := x1.Args[2] 25254 sh := v.Args[1] 25255 if sh.Op != OpS390XSLDconst { 25256 break 25257 } 25258 if sh.AuxInt != 16 { 25259 break 25260 } 25261 x0 := sh.Args[0] 25262 if x0.Op != OpS390XMOVHZloadidx { 25263 break 25264 } 25265 i0 := x0.AuxInt 25266 if x0.Aux != s { 25267 break 25268 } 25269 _ = x0.Args[2] 25270 if p != x0.Args[0] { 25271 break 25272 } 25273 if idx != x0.Args[1] { 25274 break 25275 } 25276 if mem != x0.Args[2] { 25277 break 25278 } 25279 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)) { 25280 break 25281 } 25282 b = mergePoint(b, x0, x1) 25283 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25284 v.reset(OpCopy) 25285 v.AddArg(v0) 25286 v0.AuxInt = i0 25287 v0.Aux = s 25288 v0.AddArg(p) 25289 v0.AddArg(idx) 25290 v0.AddArg(mem) 25291 return true 25292 } 25293 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 25294 // 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) 25295 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25296 for { 25297 _ = v.Args[1] 25298 x1 := v.Args[0] 25299 if x1.Op != OpS390XMOVHZloadidx { 25300 break 25301 } 25302 i1 := x1.AuxInt 25303 s := x1.Aux 25304 _ = x1.Args[2] 25305 p := x1.Args[0] 25306 idx := x1.Args[1] 25307 mem := x1.Args[2] 25308 sh := v.Args[1] 25309 if sh.Op != OpS390XSLDconst { 25310 break 25311 } 25312 if sh.AuxInt != 16 { 25313 break 25314 } 25315 x0 := sh.Args[0] 25316 if x0.Op != OpS390XMOVHZloadidx { 25317 break 25318 } 25319 i0 := x0.AuxInt 25320 if x0.Aux != s { 25321 break 25322 } 25323 _ = x0.Args[2] 25324 if idx != x0.Args[0] { 25325 break 25326 } 25327 if p != x0.Args[1] { 25328 break 25329 } 25330 if mem != x0.Args[2] { 25331 break 25332 } 25333 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)) { 25334 break 25335 } 25336 b = mergePoint(b, x0, x1) 25337 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25338 v.reset(OpCopy) 25339 v.AddArg(v0) 25340 v0.AuxInt = i0 25341 v0.Aux = s 25342 v0.AddArg(p) 25343 v0.AddArg(idx) 25344 v0.AddArg(mem) 25345 return true 25346 } 25347 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 25348 // 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) 25349 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25350 for { 25351 _ = v.Args[1] 25352 x1 := v.Args[0] 25353 if x1.Op != OpS390XMOVHZloadidx { 25354 break 25355 } 25356 i1 := x1.AuxInt 25357 s := x1.Aux 25358 _ = x1.Args[2] 25359 idx := x1.Args[0] 25360 p := x1.Args[1] 25361 mem := x1.Args[2] 25362 sh := v.Args[1] 25363 if sh.Op != OpS390XSLDconst { 25364 break 25365 } 25366 if sh.AuxInt != 16 { 25367 break 25368 } 25369 x0 := sh.Args[0] 25370 if x0.Op != OpS390XMOVHZloadidx { 25371 break 25372 } 25373 i0 := x0.AuxInt 25374 if x0.Aux != s { 25375 break 25376 } 25377 _ = x0.Args[2] 25378 if idx != x0.Args[0] { 25379 break 25380 } 25381 if p != x0.Args[1] { 25382 break 25383 } 25384 if mem != x0.Args[2] { 25385 break 25386 } 25387 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)) { 25388 break 25389 } 25390 b = mergePoint(b, x0, x1) 25391 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25392 v.reset(OpCopy) 25393 v.AddArg(v0) 25394 v0.AuxInt = i0 25395 v0.Aux = s 25396 v0.AddArg(p) 25397 v0.AddArg(idx) 25398 v0.AddArg(mem) 25399 return true 25400 } 25401 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 25402 // 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) 25403 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25404 for { 25405 _ = v.Args[1] 25406 sh := v.Args[0] 25407 if sh.Op != OpS390XSLDconst { 25408 break 25409 } 25410 if sh.AuxInt != 16 { 25411 break 25412 } 25413 x0 := sh.Args[0] 25414 if x0.Op != OpS390XMOVHZloadidx { 25415 break 25416 } 25417 i0 := x0.AuxInt 25418 s := x0.Aux 25419 _ = x0.Args[2] 25420 p := x0.Args[0] 25421 idx := x0.Args[1] 25422 mem := x0.Args[2] 25423 x1 := v.Args[1] 25424 if x1.Op != OpS390XMOVHZloadidx { 25425 break 25426 } 25427 i1 := x1.AuxInt 25428 if x1.Aux != s { 25429 break 25430 } 25431 _ = x1.Args[2] 25432 if p != x1.Args[0] { 25433 break 25434 } 25435 if idx != x1.Args[1] { 25436 break 25437 } 25438 if mem != x1.Args[2] { 25439 break 25440 } 25441 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)) { 25442 break 25443 } 25444 b = mergePoint(b, x0, x1) 25445 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25446 v.reset(OpCopy) 25447 v.AddArg(v0) 25448 v0.AuxInt = i0 25449 v0.Aux = s 25450 v0.AddArg(p) 25451 v0.AddArg(idx) 25452 v0.AddArg(mem) 25453 return true 25454 } 25455 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 25456 // 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) 25457 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25458 for { 25459 _ = v.Args[1] 25460 sh := v.Args[0] 25461 if sh.Op != OpS390XSLDconst { 25462 break 25463 } 25464 if sh.AuxInt != 16 { 25465 break 25466 } 25467 x0 := sh.Args[0] 25468 if x0.Op != OpS390XMOVHZloadidx { 25469 break 25470 } 25471 i0 := x0.AuxInt 25472 s := x0.Aux 25473 _ = x0.Args[2] 25474 idx := x0.Args[0] 25475 p := x0.Args[1] 25476 mem := x0.Args[2] 25477 x1 := v.Args[1] 25478 if x1.Op != OpS390XMOVHZloadidx { 25479 break 25480 } 25481 i1 := x1.AuxInt 25482 if x1.Aux != s { 25483 break 25484 } 25485 _ = x1.Args[2] 25486 if p != x1.Args[0] { 25487 break 25488 } 25489 if idx != x1.Args[1] { 25490 break 25491 } 25492 if mem != x1.Args[2] { 25493 break 25494 } 25495 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)) { 25496 break 25497 } 25498 b = mergePoint(b, x0, x1) 25499 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25500 v.reset(OpCopy) 25501 v.AddArg(v0) 25502 v0.AuxInt = i0 25503 v0.Aux = s 25504 v0.AddArg(p) 25505 v0.AddArg(idx) 25506 v0.AddArg(mem) 25507 return true 25508 } 25509 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 25510 // 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) 25511 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25512 for { 25513 _ = v.Args[1] 25514 sh := v.Args[0] 25515 if sh.Op != OpS390XSLDconst { 25516 break 25517 } 25518 if sh.AuxInt != 16 { 25519 break 25520 } 25521 x0 := sh.Args[0] 25522 if x0.Op != OpS390XMOVHZloadidx { 25523 break 25524 } 25525 i0 := x0.AuxInt 25526 s := x0.Aux 25527 _ = x0.Args[2] 25528 p := x0.Args[0] 25529 idx := x0.Args[1] 25530 mem := x0.Args[2] 25531 x1 := v.Args[1] 25532 if x1.Op != OpS390XMOVHZloadidx { 25533 break 25534 } 25535 i1 := x1.AuxInt 25536 if x1.Aux != s { 25537 break 25538 } 25539 _ = x1.Args[2] 25540 if idx != x1.Args[0] { 25541 break 25542 } 25543 if p != x1.Args[1] { 25544 break 25545 } 25546 if mem != x1.Args[2] { 25547 break 25548 } 25549 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)) { 25550 break 25551 } 25552 b = mergePoint(b, x0, x1) 25553 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25554 v.reset(OpCopy) 25555 v.AddArg(v0) 25556 v0.AuxInt = i0 25557 v0.Aux = s 25558 v0.AddArg(p) 25559 v0.AddArg(idx) 25560 v0.AddArg(mem) 25561 return true 25562 } 25563 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 25564 // 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) 25565 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 25566 for { 25567 _ = v.Args[1] 25568 sh := v.Args[0] 25569 if sh.Op != OpS390XSLDconst { 25570 break 25571 } 25572 if sh.AuxInt != 16 { 25573 break 25574 } 25575 x0 := sh.Args[0] 25576 if x0.Op != OpS390XMOVHZloadidx { 25577 break 25578 } 25579 i0 := x0.AuxInt 25580 s := x0.Aux 25581 _ = x0.Args[2] 25582 idx := x0.Args[0] 25583 p := x0.Args[1] 25584 mem := x0.Args[2] 25585 x1 := v.Args[1] 25586 if x1.Op != OpS390XMOVHZloadidx { 25587 break 25588 } 25589 i1 := x1.AuxInt 25590 if x1.Aux != s { 25591 break 25592 } 25593 _ = x1.Args[2] 25594 if idx != x1.Args[0] { 25595 break 25596 } 25597 if p != x1.Args[1] { 25598 break 25599 } 25600 if mem != x1.Args[2] { 25601 break 25602 } 25603 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)) { 25604 break 25605 } 25606 b = mergePoint(b, x0, x1) 25607 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25608 v.reset(OpCopy) 25609 v.AddArg(v0) 25610 v0.AuxInt = i0 25611 v0.Aux = s 25612 v0.AddArg(p) 25613 v0.AddArg(idx) 25614 v0.AddArg(mem) 25615 return true 25616 } 25617 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 25618 // 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) 25619 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25620 for { 25621 _ = v.Args[1] 25622 x1 := v.Args[0] 25623 if x1.Op != OpS390XMOVWZloadidx { 25624 break 25625 } 25626 i1 := x1.AuxInt 25627 s := x1.Aux 25628 _ = x1.Args[2] 25629 p := x1.Args[0] 25630 idx := x1.Args[1] 25631 mem := x1.Args[2] 25632 sh := v.Args[1] 25633 if sh.Op != OpS390XSLDconst { 25634 break 25635 } 25636 if sh.AuxInt != 32 { 25637 break 25638 } 25639 x0 := sh.Args[0] 25640 if x0.Op != OpS390XMOVWZloadidx { 25641 break 25642 } 25643 i0 := x0.AuxInt 25644 if x0.Aux != s { 25645 break 25646 } 25647 _ = x0.Args[2] 25648 if p != x0.Args[0] { 25649 break 25650 } 25651 if idx != x0.Args[1] { 25652 break 25653 } 25654 if mem != x0.Args[2] { 25655 break 25656 } 25657 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)) { 25658 break 25659 } 25660 b = mergePoint(b, x0, x1) 25661 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25662 v.reset(OpCopy) 25663 v.AddArg(v0) 25664 v0.AuxInt = i0 25665 v0.Aux = s 25666 v0.AddArg(p) 25667 v0.AddArg(idx) 25668 v0.AddArg(mem) 25669 return true 25670 } 25671 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 25672 // 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) 25673 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25674 for { 25675 _ = v.Args[1] 25676 x1 := v.Args[0] 25677 if x1.Op != OpS390XMOVWZloadidx { 25678 break 25679 } 25680 i1 := x1.AuxInt 25681 s := x1.Aux 25682 _ = x1.Args[2] 25683 idx := x1.Args[0] 25684 p := x1.Args[1] 25685 mem := x1.Args[2] 25686 sh := v.Args[1] 25687 if sh.Op != OpS390XSLDconst { 25688 break 25689 } 25690 if sh.AuxInt != 32 { 25691 break 25692 } 25693 x0 := sh.Args[0] 25694 if x0.Op != OpS390XMOVWZloadidx { 25695 break 25696 } 25697 i0 := x0.AuxInt 25698 if x0.Aux != s { 25699 break 25700 } 25701 _ = x0.Args[2] 25702 if p != x0.Args[0] { 25703 break 25704 } 25705 if idx != x0.Args[1] { 25706 break 25707 } 25708 if mem != x0.Args[2] { 25709 break 25710 } 25711 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)) { 25712 break 25713 } 25714 b = mergePoint(b, x0, x1) 25715 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25716 v.reset(OpCopy) 25717 v.AddArg(v0) 25718 v0.AuxInt = i0 25719 v0.Aux = s 25720 v0.AddArg(p) 25721 v0.AddArg(idx) 25722 v0.AddArg(mem) 25723 return true 25724 } 25725 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 25726 // 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) 25727 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25728 for { 25729 _ = v.Args[1] 25730 x1 := v.Args[0] 25731 if x1.Op != OpS390XMOVWZloadidx { 25732 break 25733 } 25734 i1 := x1.AuxInt 25735 s := x1.Aux 25736 _ = x1.Args[2] 25737 p := x1.Args[0] 25738 idx := x1.Args[1] 25739 mem := x1.Args[2] 25740 sh := v.Args[1] 25741 if sh.Op != OpS390XSLDconst { 25742 break 25743 } 25744 if sh.AuxInt != 32 { 25745 break 25746 } 25747 x0 := sh.Args[0] 25748 if x0.Op != OpS390XMOVWZloadidx { 25749 break 25750 } 25751 i0 := x0.AuxInt 25752 if x0.Aux != s { 25753 break 25754 } 25755 _ = x0.Args[2] 25756 if idx != x0.Args[0] { 25757 break 25758 } 25759 if p != x0.Args[1] { 25760 break 25761 } 25762 if mem != x0.Args[2] { 25763 break 25764 } 25765 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)) { 25766 break 25767 } 25768 b = mergePoint(b, x0, x1) 25769 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25770 v.reset(OpCopy) 25771 v.AddArg(v0) 25772 v0.AuxInt = i0 25773 v0.Aux = s 25774 v0.AddArg(p) 25775 v0.AddArg(idx) 25776 v0.AddArg(mem) 25777 return true 25778 } 25779 return false 25780 } 25781 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 25782 b := v.Block 25783 _ = b 25784 typ := &b.Func.Config.Types 25785 _ = typ 25786 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 25787 // 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) 25788 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25789 for { 25790 _ = v.Args[1] 25791 x1 := v.Args[0] 25792 if x1.Op != OpS390XMOVWZloadidx { 25793 break 25794 } 25795 i1 := x1.AuxInt 25796 s := x1.Aux 25797 _ = x1.Args[2] 25798 idx := x1.Args[0] 25799 p := x1.Args[1] 25800 mem := x1.Args[2] 25801 sh := v.Args[1] 25802 if sh.Op != OpS390XSLDconst { 25803 break 25804 } 25805 if sh.AuxInt != 32 { 25806 break 25807 } 25808 x0 := sh.Args[0] 25809 if x0.Op != OpS390XMOVWZloadidx { 25810 break 25811 } 25812 i0 := x0.AuxInt 25813 if x0.Aux != s { 25814 break 25815 } 25816 _ = x0.Args[2] 25817 if idx != x0.Args[0] { 25818 break 25819 } 25820 if p != x0.Args[1] { 25821 break 25822 } 25823 if mem != x0.Args[2] { 25824 break 25825 } 25826 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)) { 25827 break 25828 } 25829 b = mergePoint(b, x0, x1) 25830 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25831 v.reset(OpCopy) 25832 v.AddArg(v0) 25833 v0.AuxInt = i0 25834 v0.Aux = s 25835 v0.AddArg(p) 25836 v0.AddArg(idx) 25837 v0.AddArg(mem) 25838 return true 25839 } 25840 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 25841 // 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) 25842 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25843 for { 25844 _ = v.Args[1] 25845 sh := v.Args[0] 25846 if sh.Op != OpS390XSLDconst { 25847 break 25848 } 25849 if sh.AuxInt != 32 { 25850 break 25851 } 25852 x0 := sh.Args[0] 25853 if x0.Op != OpS390XMOVWZloadidx { 25854 break 25855 } 25856 i0 := x0.AuxInt 25857 s := x0.Aux 25858 _ = x0.Args[2] 25859 p := x0.Args[0] 25860 idx := x0.Args[1] 25861 mem := x0.Args[2] 25862 x1 := v.Args[1] 25863 if x1.Op != OpS390XMOVWZloadidx { 25864 break 25865 } 25866 i1 := x1.AuxInt 25867 if x1.Aux != s { 25868 break 25869 } 25870 _ = x1.Args[2] 25871 if p != x1.Args[0] { 25872 break 25873 } 25874 if idx != x1.Args[1] { 25875 break 25876 } 25877 if mem != x1.Args[2] { 25878 break 25879 } 25880 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)) { 25881 break 25882 } 25883 b = mergePoint(b, x0, x1) 25884 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25885 v.reset(OpCopy) 25886 v.AddArg(v0) 25887 v0.AuxInt = i0 25888 v0.Aux = s 25889 v0.AddArg(p) 25890 v0.AddArg(idx) 25891 v0.AddArg(mem) 25892 return true 25893 } 25894 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 25895 // 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) 25896 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25897 for { 25898 _ = v.Args[1] 25899 sh := v.Args[0] 25900 if sh.Op != OpS390XSLDconst { 25901 break 25902 } 25903 if sh.AuxInt != 32 { 25904 break 25905 } 25906 x0 := sh.Args[0] 25907 if x0.Op != OpS390XMOVWZloadidx { 25908 break 25909 } 25910 i0 := x0.AuxInt 25911 s := x0.Aux 25912 _ = x0.Args[2] 25913 idx := x0.Args[0] 25914 p := x0.Args[1] 25915 mem := x0.Args[2] 25916 x1 := v.Args[1] 25917 if x1.Op != OpS390XMOVWZloadidx { 25918 break 25919 } 25920 i1 := x1.AuxInt 25921 if x1.Aux != s { 25922 break 25923 } 25924 _ = x1.Args[2] 25925 if p != x1.Args[0] { 25926 break 25927 } 25928 if idx != x1.Args[1] { 25929 break 25930 } 25931 if mem != x1.Args[2] { 25932 break 25933 } 25934 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)) { 25935 break 25936 } 25937 b = mergePoint(b, x0, x1) 25938 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25939 v.reset(OpCopy) 25940 v.AddArg(v0) 25941 v0.AuxInt = i0 25942 v0.Aux = s 25943 v0.AddArg(p) 25944 v0.AddArg(idx) 25945 v0.AddArg(mem) 25946 return true 25947 } 25948 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 25949 // 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) 25950 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 25951 for { 25952 _ = v.Args[1] 25953 sh := v.Args[0] 25954 if sh.Op != OpS390XSLDconst { 25955 break 25956 } 25957 if sh.AuxInt != 32 { 25958 break 25959 } 25960 x0 := sh.Args[0] 25961 if x0.Op != OpS390XMOVWZloadidx { 25962 break 25963 } 25964 i0 := x0.AuxInt 25965 s := x0.Aux 25966 _ = x0.Args[2] 25967 p := x0.Args[0] 25968 idx := x0.Args[1] 25969 mem := x0.Args[2] 25970 x1 := v.Args[1] 25971 if x1.Op != OpS390XMOVWZloadidx { 25972 break 25973 } 25974 i1 := x1.AuxInt 25975 if x1.Aux != s { 25976 break 25977 } 25978 _ = x1.Args[2] 25979 if idx != x1.Args[0] { 25980 break 25981 } 25982 if p != x1.Args[1] { 25983 break 25984 } 25985 if mem != x1.Args[2] { 25986 break 25987 } 25988 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)) { 25989 break 25990 } 25991 b = mergePoint(b, x0, x1) 25992 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 25993 v.reset(OpCopy) 25994 v.AddArg(v0) 25995 v0.AuxInt = i0 25996 v0.Aux = s 25997 v0.AddArg(p) 25998 v0.AddArg(idx) 25999 v0.AddArg(mem) 26000 return true 26001 } 26002 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 26003 // 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) 26004 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 26005 for { 26006 _ = v.Args[1] 26007 sh := v.Args[0] 26008 if sh.Op != OpS390XSLDconst { 26009 break 26010 } 26011 if sh.AuxInt != 32 { 26012 break 26013 } 26014 x0 := sh.Args[0] 26015 if x0.Op != OpS390XMOVWZloadidx { 26016 break 26017 } 26018 i0 := x0.AuxInt 26019 s := x0.Aux 26020 _ = x0.Args[2] 26021 idx := x0.Args[0] 26022 p := x0.Args[1] 26023 mem := x0.Args[2] 26024 x1 := v.Args[1] 26025 if x1.Op != OpS390XMOVWZloadidx { 26026 break 26027 } 26028 i1 := x1.AuxInt 26029 if x1.Aux != s { 26030 break 26031 } 26032 _ = x1.Args[2] 26033 if idx != x1.Args[0] { 26034 break 26035 } 26036 if p != x1.Args[1] { 26037 break 26038 } 26039 if mem != x1.Args[2] { 26040 break 26041 } 26042 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)) { 26043 break 26044 } 26045 b = mergePoint(b, x0, x1) 26046 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 26047 v.reset(OpCopy) 26048 v.AddArg(v0) 26049 v0.AuxInt = i0 26050 v0.Aux = s 26051 v0.AddArg(p) 26052 v0.AddArg(idx) 26053 v0.AddArg(mem) 26054 return true 26055 } 26056 // 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)) 26057 // 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) 26058 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26059 for { 26060 _ = v.Args[1] 26061 s0 := v.Args[0] 26062 if s0.Op != OpS390XSLDconst { 26063 break 26064 } 26065 j0 := s0.AuxInt 26066 x0 := s0.Args[0] 26067 if x0.Op != OpS390XMOVBZloadidx { 26068 break 26069 } 26070 i0 := x0.AuxInt 26071 s := x0.Aux 26072 _ = x0.Args[2] 26073 p := x0.Args[0] 26074 idx := x0.Args[1] 26075 mem := x0.Args[2] 26076 or := v.Args[1] 26077 if or.Op != OpS390XOR { 26078 break 26079 } 26080 _ = or.Args[1] 26081 s1 := or.Args[0] 26082 if s1.Op != OpS390XSLDconst { 26083 break 26084 } 26085 j1 := s1.AuxInt 26086 x1 := s1.Args[0] 26087 if x1.Op != OpS390XMOVBZloadidx { 26088 break 26089 } 26090 i1 := x1.AuxInt 26091 if x1.Aux != s { 26092 break 26093 } 26094 _ = x1.Args[2] 26095 if p != x1.Args[0] { 26096 break 26097 } 26098 if idx != x1.Args[1] { 26099 break 26100 } 26101 if mem != x1.Args[2] { 26102 break 26103 } 26104 y := or.Args[1] 26105 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)) { 26106 break 26107 } 26108 b = mergePoint(b, x0, x1) 26109 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26110 v.reset(OpCopy) 26111 v.AddArg(v0) 26112 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26113 v1.AuxInt = j1 26114 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26115 v2.AuxInt = i0 26116 v2.Aux = s 26117 v2.AddArg(p) 26118 v2.AddArg(idx) 26119 v2.AddArg(mem) 26120 v1.AddArg(v2) 26121 v0.AddArg(v1) 26122 v0.AddArg(y) 26123 return true 26124 } 26125 // 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)) 26126 // 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) 26127 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26128 for { 26129 _ = v.Args[1] 26130 s0 := v.Args[0] 26131 if s0.Op != OpS390XSLDconst { 26132 break 26133 } 26134 j0 := s0.AuxInt 26135 x0 := s0.Args[0] 26136 if x0.Op != OpS390XMOVBZloadidx { 26137 break 26138 } 26139 i0 := x0.AuxInt 26140 s := x0.Aux 26141 _ = x0.Args[2] 26142 idx := x0.Args[0] 26143 p := x0.Args[1] 26144 mem := x0.Args[2] 26145 or := v.Args[1] 26146 if or.Op != OpS390XOR { 26147 break 26148 } 26149 _ = or.Args[1] 26150 s1 := or.Args[0] 26151 if s1.Op != OpS390XSLDconst { 26152 break 26153 } 26154 j1 := s1.AuxInt 26155 x1 := s1.Args[0] 26156 if x1.Op != OpS390XMOVBZloadidx { 26157 break 26158 } 26159 i1 := x1.AuxInt 26160 if x1.Aux != s { 26161 break 26162 } 26163 _ = x1.Args[2] 26164 if p != x1.Args[0] { 26165 break 26166 } 26167 if idx != x1.Args[1] { 26168 break 26169 } 26170 if mem != x1.Args[2] { 26171 break 26172 } 26173 y := or.Args[1] 26174 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)) { 26175 break 26176 } 26177 b = mergePoint(b, x0, x1) 26178 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26179 v.reset(OpCopy) 26180 v.AddArg(v0) 26181 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26182 v1.AuxInt = j1 26183 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26184 v2.AuxInt = i0 26185 v2.Aux = s 26186 v2.AddArg(p) 26187 v2.AddArg(idx) 26188 v2.AddArg(mem) 26189 v1.AddArg(v2) 26190 v0.AddArg(v1) 26191 v0.AddArg(y) 26192 return true 26193 } 26194 // 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)) 26195 // 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) 26196 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26197 for { 26198 _ = v.Args[1] 26199 s0 := v.Args[0] 26200 if s0.Op != OpS390XSLDconst { 26201 break 26202 } 26203 j0 := s0.AuxInt 26204 x0 := s0.Args[0] 26205 if x0.Op != OpS390XMOVBZloadidx { 26206 break 26207 } 26208 i0 := x0.AuxInt 26209 s := x0.Aux 26210 _ = x0.Args[2] 26211 p := x0.Args[0] 26212 idx := x0.Args[1] 26213 mem := x0.Args[2] 26214 or := v.Args[1] 26215 if or.Op != OpS390XOR { 26216 break 26217 } 26218 _ = or.Args[1] 26219 s1 := or.Args[0] 26220 if s1.Op != OpS390XSLDconst { 26221 break 26222 } 26223 j1 := s1.AuxInt 26224 x1 := s1.Args[0] 26225 if x1.Op != OpS390XMOVBZloadidx { 26226 break 26227 } 26228 i1 := x1.AuxInt 26229 if x1.Aux != s { 26230 break 26231 } 26232 _ = x1.Args[2] 26233 if idx != x1.Args[0] { 26234 break 26235 } 26236 if p != x1.Args[1] { 26237 break 26238 } 26239 if mem != x1.Args[2] { 26240 break 26241 } 26242 y := or.Args[1] 26243 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)) { 26244 break 26245 } 26246 b = mergePoint(b, x0, x1) 26247 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26248 v.reset(OpCopy) 26249 v.AddArg(v0) 26250 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26251 v1.AuxInt = j1 26252 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26253 v2.AuxInt = i0 26254 v2.Aux = s 26255 v2.AddArg(p) 26256 v2.AddArg(idx) 26257 v2.AddArg(mem) 26258 v1.AddArg(v2) 26259 v0.AddArg(v1) 26260 v0.AddArg(y) 26261 return true 26262 } 26263 // 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)) 26264 // 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) 26265 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26266 for { 26267 _ = v.Args[1] 26268 s0 := v.Args[0] 26269 if s0.Op != OpS390XSLDconst { 26270 break 26271 } 26272 j0 := s0.AuxInt 26273 x0 := s0.Args[0] 26274 if x0.Op != OpS390XMOVBZloadidx { 26275 break 26276 } 26277 i0 := x0.AuxInt 26278 s := x0.Aux 26279 _ = x0.Args[2] 26280 idx := x0.Args[0] 26281 p := x0.Args[1] 26282 mem := x0.Args[2] 26283 or := v.Args[1] 26284 if or.Op != OpS390XOR { 26285 break 26286 } 26287 _ = or.Args[1] 26288 s1 := or.Args[0] 26289 if s1.Op != OpS390XSLDconst { 26290 break 26291 } 26292 j1 := s1.AuxInt 26293 x1 := s1.Args[0] 26294 if x1.Op != OpS390XMOVBZloadidx { 26295 break 26296 } 26297 i1 := x1.AuxInt 26298 if x1.Aux != s { 26299 break 26300 } 26301 _ = x1.Args[2] 26302 if idx != x1.Args[0] { 26303 break 26304 } 26305 if p != x1.Args[1] { 26306 break 26307 } 26308 if mem != x1.Args[2] { 26309 break 26310 } 26311 y := or.Args[1] 26312 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)) { 26313 break 26314 } 26315 b = mergePoint(b, x0, x1) 26316 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26317 v.reset(OpCopy) 26318 v.AddArg(v0) 26319 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26320 v1.AuxInt = j1 26321 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26322 v2.AuxInt = i0 26323 v2.Aux = s 26324 v2.AddArg(p) 26325 v2.AddArg(idx) 26326 v2.AddArg(mem) 26327 v1.AddArg(v2) 26328 v0.AddArg(v1) 26329 v0.AddArg(y) 26330 return true 26331 } 26332 // 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)))) 26333 // 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) 26334 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26335 for { 26336 _ = v.Args[1] 26337 s0 := v.Args[0] 26338 if s0.Op != OpS390XSLDconst { 26339 break 26340 } 26341 j0 := s0.AuxInt 26342 x0 := s0.Args[0] 26343 if x0.Op != OpS390XMOVBZloadidx { 26344 break 26345 } 26346 i0 := x0.AuxInt 26347 s := x0.Aux 26348 _ = x0.Args[2] 26349 p := x0.Args[0] 26350 idx := x0.Args[1] 26351 mem := x0.Args[2] 26352 or := v.Args[1] 26353 if or.Op != OpS390XOR { 26354 break 26355 } 26356 _ = or.Args[1] 26357 y := or.Args[0] 26358 s1 := or.Args[1] 26359 if s1.Op != OpS390XSLDconst { 26360 break 26361 } 26362 j1 := s1.AuxInt 26363 x1 := s1.Args[0] 26364 if x1.Op != OpS390XMOVBZloadidx { 26365 break 26366 } 26367 i1 := x1.AuxInt 26368 if x1.Aux != s { 26369 break 26370 } 26371 _ = x1.Args[2] 26372 if p != x1.Args[0] { 26373 break 26374 } 26375 if idx != x1.Args[1] { 26376 break 26377 } 26378 if mem != x1.Args[2] { 26379 break 26380 } 26381 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)) { 26382 break 26383 } 26384 b = mergePoint(b, x0, x1) 26385 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26386 v.reset(OpCopy) 26387 v.AddArg(v0) 26388 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26389 v1.AuxInt = j1 26390 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26391 v2.AuxInt = i0 26392 v2.Aux = s 26393 v2.AddArg(p) 26394 v2.AddArg(idx) 26395 v2.AddArg(mem) 26396 v1.AddArg(v2) 26397 v0.AddArg(v1) 26398 v0.AddArg(y) 26399 return true 26400 } 26401 return false 26402 } 26403 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 26404 b := v.Block 26405 _ = b 26406 typ := &b.Func.Config.Types 26407 _ = typ 26408 // 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)))) 26409 // 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) 26410 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26411 for { 26412 _ = v.Args[1] 26413 s0 := v.Args[0] 26414 if s0.Op != OpS390XSLDconst { 26415 break 26416 } 26417 j0 := s0.AuxInt 26418 x0 := s0.Args[0] 26419 if x0.Op != OpS390XMOVBZloadidx { 26420 break 26421 } 26422 i0 := x0.AuxInt 26423 s := x0.Aux 26424 _ = x0.Args[2] 26425 idx := x0.Args[0] 26426 p := x0.Args[1] 26427 mem := x0.Args[2] 26428 or := v.Args[1] 26429 if or.Op != OpS390XOR { 26430 break 26431 } 26432 _ = or.Args[1] 26433 y := or.Args[0] 26434 s1 := or.Args[1] 26435 if s1.Op != OpS390XSLDconst { 26436 break 26437 } 26438 j1 := s1.AuxInt 26439 x1 := s1.Args[0] 26440 if x1.Op != OpS390XMOVBZloadidx { 26441 break 26442 } 26443 i1 := x1.AuxInt 26444 if x1.Aux != s { 26445 break 26446 } 26447 _ = x1.Args[2] 26448 if p != x1.Args[0] { 26449 break 26450 } 26451 if idx != x1.Args[1] { 26452 break 26453 } 26454 if mem != x1.Args[2] { 26455 break 26456 } 26457 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)) { 26458 break 26459 } 26460 b = mergePoint(b, x0, x1) 26461 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26462 v.reset(OpCopy) 26463 v.AddArg(v0) 26464 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26465 v1.AuxInt = j1 26466 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26467 v2.AuxInt = i0 26468 v2.Aux = s 26469 v2.AddArg(p) 26470 v2.AddArg(idx) 26471 v2.AddArg(mem) 26472 v1.AddArg(v2) 26473 v0.AddArg(v1) 26474 v0.AddArg(y) 26475 return true 26476 } 26477 // 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)))) 26478 // 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) 26479 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26480 for { 26481 _ = v.Args[1] 26482 s0 := v.Args[0] 26483 if s0.Op != OpS390XSLDconst { 26484 break 26485 } 26486 j0 := s0.AuxInt 26487 x0 := s0.Args[0] 26488 if x0.Op != OpS390XMOVBZloadidx { 26489 break 26490 } 26491 i0 := x0.AuxInt 26492 s := x0.Aux 26493 _ = x0.Args[2] 26494 p := x0.Args[0] 26495 idx := x0.Args[1] 26496 mem := x0.Args[2] 26497 or := v.Args[1] 26498 if or.Op != OpS390XOR { 26499 break 26500 } 26501 _ = or.Args[1] 26502 y := or.Args[0] 26503 s1 := or.Args[1] 26504 if s1.Op != OpS390XSLDconst { 26505 break 26506 } 26507 j1 := s1.AuxInt 26508 x1 := s1.Args[0] 26509 if x1.Op != OpS390XMOVBZloadidx { 26510 break 26511 } 26512 i1 := x1.AuxInt 26513 if x1.Aux != s { 26514 break 26515 } 26516 _ = x1.Args[2] 26517 if idx != x1.Args[0] { 26518 break 26519 } 26520 if p != x1.Args[1] { 26521 break 26522 } 26523 if mem != x1.Args[2] { 26524 break 26525 } 26526 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)) { 26527 break 26528 } 26529 b = mergePoint(b, x0, x1) 26530 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26531 v.reset(OpCopy) 26532 v.AddArg(v0) 26533 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26534 v1.AuxInt = j1 26535 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26536 v2.AuxInt = i0 26537 v2.Aux = s 26538 v2.AddArg(p) 26539 v2.AddArg(idx) 26540 v2.AddArg(mem) 26541 v1.AddArg(v2) 26542 v0.AddArg(v1) 26543 v0.AddArg(y) 26544 return true 26545 } 26546 // 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)))) 26547 // 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) 26548 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26549 for { 26550 _ = v.Args[1] 26551 s0 := v.Args[0] 26552 if s0.Op != OpS390XSLDconst { 26553 break 26554 } 26555 j0 := s0.AuxInt 26556 x0 := s0.Args[0] 26557 if x0.Op != OpS390XMOVBZloadidx { 26558 break 26559 } 26560 i0 := x0.AuxInt 26561 s := x0.Aux 26562 _ = x0.Args[2] 26563 idx := x0.Args[0] 26564 p := x0.Args[1] 26565 mem := x0.Args[2] 26566 or := v.Args[1] 26567 if or.Op != OpS390XOR { 26568 break 26569 } 26570 _ = or.Args[1] 26571 y := or.Args[0] 26572 s1 := or.Args[1] 26573 if s1.Op != OpS390XSLDconst { 26574 break 26575 } 26576 j1 := s1.AuxInt 26577 x1 := s1.Args[0] 26578 if x1.Op != OpS390XMOVBZloadidx { 26579 break 26580 } 26581 i1 := x1.AuxInt 26582 if x1.Aux != s { 26583 break 26584 } 26585 _ = x1.Args[2] 26586 if idx != x1.Args[0] { 26587 break 26588 } 26589 if p != x1.Args[1] { 26590 break 26591 } 26592 if mem != x1.Args[2] { 26593 break 26594 } 26595 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)) { 26596 break 26597 } 26598 b = mergePoint(b, x0, x1) 26599 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26600 v.reset(OpCopy) 26601 v.AddArg(v0) 26602 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26603 v1.AuxInt = j1 26604 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26605 v2.AuxInt = i0 26606 v2.Aux = s 26607 v2.AddArg(p) 26608 v2.AddArg(idx) 26609 v2.AddArg(mem) 26610 v1.AddArg(v2) 26611 v0.AddArg(v1) 26612 v0.AddArg(y) 26613 return true 26614 } 26615 // 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))) 26616 // 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) 26617 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26618 for { 26619 _ = v.Args[1] 26620 or := v.Args[0] 26621 if or.Op != OpS390XOR { 26622 break 26623 } 26624 _ = or.Args[1] 26625 s1 := or.Args[0] 26626 if s1.Op != OpS390XSLDconst { 26627 break 26628 } 26629 j1 := s1.AuxInt 26630 x1 := s1.Args[0] 26631 if x1.Op != OpS390XMOVBZloadidx { 26632 break 26633 } 26634 i1 := x1.AuxInt 26635 s := x1.Aux 26636 _ = x1.Args[2] 26637 p := x1.Args[0] 26638 idx := x1.Args[1] 26639 mem := x1.Args[2] 26640 y := or.Args[1] 26641 s0 := v.Args[1] 26642 if s0.Op != OpS390XSLDconst { 26643 break 26644 } 26645 j0 := s0.AuxInt 26646 x0 := s0.Args[0] 26647 if x0.Op != OpS390XMOVBZloadidx { 26648 break 26649 } 26650 i0 := x0.AuxInt 26651 if x0.Aux != s { 26652 break 26653 } 26654 _ = x0.Args[2] 26655 if p != x0.Args[0] { 26656 break 26657 } 26658 if idx != x0.Args[1] { 26659 break 26660 } 26661 if mem != x0.Args[2] { 26662 break 26663 } 26664 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)) { 26665 break 26666 } 26667 b = mergePoint(b, x0, x1) 26668 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26669 v.reset(OpCopy) 26670 v.AddArg(v0) 26671 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26672 v1.AuxInt = j1 26673 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26674 v2.AuxInt = i0 26675 v2.Aux = s 26676 v2.AddArg(p) 26677 v2.AddArg(idx) 26678 v2.AddArg(mem) 26679 v1.AddArg(v2) 26680 v0.AddArg(v1) 26681 v0.AddArg(y) 26682 return true 26683 } 26684 // 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))) 26685 // 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) 26686 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26687 for { 26688 _ = v.Args[1] 26689 or := v.Args[0] 26690 if or.Op != OpS390XOR { 26691 break 26692 } 26693 _ = or.Args[1] 26694 s1 := or.Args[0] 26695 if s1.Op != OpS390XSLDconst { 26696 break 26697 } 26698 j1 := s1.AuxInt 26699 x1 := s1.Args[0] 26700 if x1.Op != OpS390XMOVBZloadidx { 26701 break 26702 } 26703 i1 := x1.AuxInt 26704 s := x1.Aux 26705 _ = x1.Args[2] 26706 idx := x1.Args[0] 26707 p := x1.Args[1] 26708 mem := x1.Args[2] 26709 y := or.Args[1] 26710 s0 := v.Args[1] 26711 if s0.Op != OpS390XSLDconst { 26712 break 26713 } 26714 j0 := s0.AuxInt 26715 x0 := s0.Args[0] 26716 if x0.Op != OpS390XMOVBZloadidx { 26717 break 26718 } 26719 i0 := x0.AuxInt 26720 if x0.Aux != s { 26721 break 26722 } 26723 _ = x0.Args[2] 26724 if p != x0.Args[0] { 26725 break 26726 } 26727 if idx != x0.Args[1] { 26728 break 26729 } 26730 if mem != x0.Args[2] { 26731 break 26732 } 26733 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)) { 26734 break 26735 } 26736 b = mergePoint(b, x0, x1) 26737 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26738 v.reset(OpCopy) 26739 v.AddArg(v0) 26740 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26741 v1.AuxInt = j1 26742 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26743 v2.AuxInt = i0 26744 v2.Aux = s 26745 v2.AddArg(p) 26746 v2.AddArg(idx) 26747 v2.AddArg(mem) 26748 v1.AddArg(v2) 26749 v0.AddArg(v1) 26750 v0.AddArg(y) 26751 return true 26752 } 26753 // 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))) 26754 // 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) 26755 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26756 for { 26757 _ = v.Args[1] 26758 or := v.Args[0] 26759 if or.Op != OpS390XOR { 26760 break 26761 } 26762 _ = or.Args[1] 26763 y := or.Args[0] 26764 s1 := or.Args[1] 26765 if s1.Op != OpS390XSLDconst { 26766 break 26767 } 26768 j1 := s1.AuxInt 26769 x1 := s1.Args[0] 26770 if x1.Op != OpS390XMOVBZloadidx { 26771 break 26772 } 26773 i1 := x1.AuxInt 26774 s := x1.Aux 26775 _ = x1.Args[2] 26776 p := x1.Args[0] 26777 idx := x1.Args[1] 26778 mem := x1.Args[2] 26779 s0 := v.Args[1] 26780 if s0.Op != OpS390XSLDconst { 26781 break 26782 } 26783 j0 := s0.AuxInt 26784 x0 := s0.Args[0] 26785 if x0.Op != OpS390XMOVBZloadidx { 26786 break 26787 } 26788 i0 := x0.AuxInt 26789 if x0.Aux != s { 26790 break 26791 } 26792 _ = x0.Args[2] 26793 if p != x0.Args[0] { 26794 break 26795 } 26796 if idx != x0.Args[1] { 26797 break 26798 } 26799 if mem != x0.Args[2] { 26800 break 26801 } 26802 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)) { 26803 break 26804 } 26805 b = mergePoint(b, x0, x1) 26806 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26807 v.reset(OpCopy) 26808 v.AddArg(v0) 26809 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26810 v1.AuxInt = j1 26811 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26812 v2.AuxInt = i0 26813 v2.Aux = s 26814 v2.AddArg(p) 26815 v2.AddArg(idx) 26816 v2.AddArg(mem) 26817 v1.AddArg(v2) 26818 v0.AddArg(v1) 26819 v0.AddArg(y) 26820 return true 26821 } 26822 // 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))) 26823 // 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) 26824 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26825 for { 26826 _ = v.Args[1] 26827 or := v.Args[0] 26828 if or.Op != OpS390XOR { 26829 break 26830 } 26831 _ = or.Args[1] 26832 y := or.Args[0] 26833 s1 := or.Args[1] 26834 if s1.Op != OpS390XSLDconst { 26835 break 26836 } 26837 j1 := s1.AuxInt 26838 x1 := s1.Args[0] 26839 if x1.Op != OpS390XMOVBZloadidx { 26840 break 26841 } 26842 i1 := x1.AuxInt 26843 s := x1.Aux 26844 _ = x1.Args[2] 26845 idx := x1.Args[0] 26846 p := x1.Args[1] 26847 mem := x1.Args[2] 26848 s0 := v.Args[1] 26849 if s0.Op != OpS390XSLDconst { 26850 break 26851 } 26852 j0 := s0.AuxInt 26853 x0 := s0.Args[0] 26854 if x0.Op != OpS390XMOVBZloadidx { 26855 break 26856 } 26857 i0 := x0.AuxInt 26858 if x0.Aux != s { 26859 break 26860 } 26861 _ = x0.Args[2] 26862 if p != x0.Args[0] { 26863 break 26864 } 26865 if idx != x0.Args[1] { 26866 break 26867 } 26868 if mem != x0.Args[2] { 26869 break 26870 } 26871 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)) { 26872 break 26873 } 26874 b = mergePoint(b, x0, x1) 26875 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26876 v.reset(OpCopy) 26877 v.AddArg(v0) 26878 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26879 v1.AuxInt = j1 26880 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26881 v2.AuxInt = i0 26882 v2.Aux = s 26883 v2.AddArg(p) 26884 v2.AddArg(idx) 26885 v2.AddArg(mem) 26886 v1.AddArg(v2) 26887 v0.AddArg(v1) 26888 v0.AddArg(y) 26889 return true 26890 } 26891 // 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))) 26892 // 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) 26893 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26894 for { 26895 _ = v.Args[1] 26896 or := v.Args[0] 26897 if or.Op != OpS390XOR { 26898 break 26899 } 26900 _ = or.Args[1] 26901 s1 := or.Args[0] 26902 if s1.Op != OpS390XSLDconst { 26903 break 26904 } 26905 j1 := s1.AuxInt 26906 x1 := s1.Args[0] 26907 if x1.Op != OpS390XMOVBZloadidx { 26908 break 26909 } 26910 i1 := x1.AuxInt 26911 s := x1.Aux 26912 _ = x1.Args[2] 26913 p := x1.Args[0] 26914 idx := x1.Args[1] 26915 mem := x1.Args[2] 26916 y := or.Args[1] 26917 s0 := v.Args[1] 26918 if s0.Op != OpS390XSLDconst { 26919 break 26920 } 26921 j0 := s0.AuxInt 26922 x0 := s0.Args[0] 26923 if x0.Op != OpS390XMOVBZloadidx { 26924 break 26925 } 26926 i0 := x0.AuxInt 26927 if x0.Aux != s { 26928 break 26929 } 26930 _ = x0.Args[2] 26931 if idx != x0.Args[0] { 26932 break 26933 } 26934 if p != x0.Args[1] { 26935 break 26936 } 26937 if mem != x0.Args[2] { 26938 break 26939 } 26940 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)) { 26941 break 26942 } 26943 b = mergePoint(b, x0, x1) 26944 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26945 v.reset(OpCopy) 26946 v.AddArg(v0) 26947 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26948 v1.AuxInt = j1 26949 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 26950 v2.AuxInt = i0 26951 v2.Aux = s 26952 v2.AddArg(p) 26953 v2.AddArg(idx) 26954 v2.AddArg(mem) 26955 v1.AddArg(v2) 26956 v0.AddArg(v1) 26957 v0.AddArg(y) 26958 return true 26959 } 26960 // 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))) 26961 // 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) 26962 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 26963 for { 26964 _ = v.Args[1] 26965 or := v.Args[0] 26966 if or.Op != OpS390XOR { 26967 break 26968 } 26969 _ = or.Args[1] 26970 s1 := or.Args[0] 26971 if s1.Op != OpS390XSLDconst { 26972 break 26973 } 26974 j1 := s1.AuxInt 26975 x1 := s1.Args[0] 26976 if x1.Op != OpS390XMOVBZloadidx { 26977 break 26978 } 26979 i1 := x1.AuxInt 26980 s := x1.Aux 26981 _ = x1.Args[2] 26982 idx := x1.Args[0] 26983 p := x1.Args[1] 26984 mem := x1.Args[2] 26985 y := or.Args[1] 26986 s0 := v.Args[1] 26987 if s0.Op != OpS390XSLDconst { 26988 break 26989 } 26990 j0 := s0.AuxInt 26991 x0 := s0.Args[0] 26992 if x0.Op != OpS390XMOVBZloadidx { 26993 break 26994 } 26995 i0 := x0.AuxInt 26996 if x0.Aux != s { 26997 break 26998 } 26999 _ = x0.Args[2] 27000 if idx != x0.Args[0] { 27001 break 27002 } 27003 if p != x0.Args[1] { 27004 break 27005 } 27006 if mem != x0.Args[2] { 27007 break 27008 } 27009 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)) { 27010 break 27011 } 27012 b = mergePoint(b, x0, x1) 27013 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27014 v.reset(OpCopy) 27015 v.AddArg(v0) 27016 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27017 v1.AuxInt = j1 27018 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27019 v2.AuxInt = i0 27020 v2.Aux = s 27021 v2.AddArg(p) 27022 v2.AddArg(idx) 27023 v2.AddArg(mem) 27024 v1.AddArg(v2) 27025 v0.AddArg(v1) 27026 v0.AddArg(y) 27027 return true 27028 } 27029 // 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))) 27030 // 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) 27031 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 27032 for { 27033 _ = v.Args[1] 27034 or := v.Args[0] 27035 if or.Op != OpS390XOR { 27036 break 27037 } 27038 _ = or.Args[1] 27039 y := or.Args[0] 27040 s1 := or.Args[1] 27041 if s1.Op != OpS390XSLDconst { 27042 break 27043 } 27044 j1 := s1.AuxInt 27045 x1 := s1.Args[0] 27046 if x1.Op != OpS390XMOVBZloadidx { 27047 break 27048 } 27049 i1 := x1.AuxInt 27050 s := x1.Aux 27051 _ = x1.Args[2] 27052 p := x1.Args[0] 27053 idx := x1.Args[1] 27054 mem := x1.Args[2] 27055 s0 := v.Args[1] 27056 if s0.Op != OpS390XSLDconst { 27057 break 27058 } 27059 j0 := s0.AuxInt 27060 x0 := s0.Args[0] 27061 if x0.Op != OpS390XMOVBZloadidx { 27062 break 27063 } 27064 i0 := x0.AuxInt 27065 if x0.Aux != s { 27066 break 27067 } 27068 _ = x0.Args[2] 27069 if idx != x0.Args[0] { 27070 break 27071 } 27072 if p != x0.Args[1] { 27073 break 27074 } 27075 if mem != x0.Args[2] { 27076 break 27077 } 27078 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)) { 27079 break 27080 } 27081 b = mergePoint(b, x0, x1) 27082 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27083 v.reset(OpCopy) 27084 v.AddArg(v0) 27085 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27086 v1.AuxInt = j1 27087 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27088 v2.AuxInt = i0 27089 v2.Aux = s 27090 v2.AddArg(p) 27091 v2.AddArg(idx) 27092 v2.AddArg(mem) 27093 v1.AddArg(v2) 27094 v0.AddArg(v1) 27095 v0.AddArg(y) 27096 return true 27097 } 27098 return false 27099 } 27100 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 27101 b := v.Block 27102 _ = b 27103 typ := &b.Func.Config.Types 27104 _ = typ 27105 // 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))) 27106 // 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) 27107 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 27108 for { 27109 _ = v.Args[1] 27110 or := v.Args[0] 27111 if or.Op != OpS390XOR { 27112 break 27113 } 27114 _ = or.Args[1] 27115 y := or.Args[0] 27116 s1 := or.Args[1] 27117 if s1.Op != OpS390XSLDconst { 27118 break 27119 } 27120 j1 := s1.AuxInt 27121 x1 := s1.Args[0] 27122 if x1.Op != OpS390XMOVBZloadidx { 27123 break 27124 } 27125 i1 := x1.AuxInt 27126 s := x1.Aux 27127 _ = x1.Args[2] 27128 idx := x1.Args[0] 27129 p := x1.Args[1] 27130 mem := x1.Args[2] 27131 s0 := v.Args[1] 27132 if s0.Op != OpS390XSLDconst { 27133 break 27134 } 27135 j0 := s0.AuxInt 27136 x0 := s0.Args[0] 27137 if x0.Op != OpS390XMOVBZloadidx { 27138 break 27139 } 27140 i0 := x0.AuxInt 27141 if x0.Aux != s { 27142 break 27143 } 27144 _ = x0.Args[2] 27145 if idx != x0.Args[0] { 27146 break 27147 } 27148 if p != x0.Args[1] { 27149 break 27150 } 27151 if mem != x0.Args[2] { 27152 break 27153 } 27154 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)) { 27155 break 27156 } 27157 b = mergePoint(b, x0, x1) 27158 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27159 v.reset(OpCopy) 27160 v.AddArg(v0) 27161 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27162 v1.AuxInt = j1 27163 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 27164 v2.AuxInt = i0 27165 v2.Aux = s 27166 v2.AddArg(p) 27167 v2.AddArg(idx) 27168 v2.AddArg(mem) 27169 v1.AddArg(v2) 27170 v0.AddArg(v1) 27171 v0.AddArg(y) 27172 return true 27173 } 27174 // 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)) 27175 // 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) 27176 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27177 for { 27178 _ = v.Args[1] 27179 s0 := v.Args[0] 27180 if s0.Op != OpS390XSLDconst { 27181 break 27182 } 27183 j0 := s0.AuxInt 27184 x0 := s0.Args[0] 27185 if x0.Op != OpS390XMOVHZloadidx { 27186 break 27187 } 27188 i0 := x0.AuxInt 27189 s := x0.Aux 27190 _ = x0.Args[2] 27191 p := x0.Args[0] 27192 idx := x0.Args[1] 27193 mem := x0.Args[2] 27194 or := v.Args[1] 27195 if or.Op != OpS390XOR { 27196 break 27197 } 27198 _ = or.Args[1] 27199 s1 := or.Args[0] 27200 if s1.Op != OpS390XSLDconst { 27201 break 27202 } 27203 j1 := s1.AuxInt 27204 x1 := s1.Args[0] 27205 if x1.Op != OpS390XMOVHZloadidx { 27206 break 27207 } 27208 i1 := x1.AuxInt 27209 if x1.Aux != s { 27210 break 27211 } 27212 _ = x1.Args[2] 27213 if p != x1.Args[0] { 27214 break 27215 } 27216 if idx != x1.Args[1] { 27217 break 27218 } 27219 if mem != x1.Args[2] { 27220 break 27221 } 27222 y := or.Args[1] 27223 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)) { 27224 break 27225 } 27226 b = mergePoint(b, x0, x1) 27227 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27228 v.reset(OpCopy) 27229 v.AddArg(v0) 27230 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27231 v1.AuxInt = j1 27232 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27233 v2.AuxInt = i0 27234 v2.Aux = s 27235 v2.AddArg(p) 27236 v2.AddArg(idx) 27237 v2.AddArg(mem) 27238 v1.AddArg(v2) 27239 v0.AddArg(v1) 27240 v0.AddArg(y) 27241 return true 27242 } 27243 // 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)) 27244 // 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) 27245 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27246 for { 27247 _ = v.Args[1] 27248 s0 := v.Args[0] 27249 if s0.Op != OpS390XSLDconst { 27250 break 27251 } 27252 j0 := s0.AuxInt 27253 x0 := s0.Args[0] 27254 if x0.Op != OpS390XMOVHZloadidx { 27255 break 27256 } 27257 i0 := x0.AuxInt 27258 s := x0.Aux 27259 _ = x0.Args[2] 27260 idx := x0.Args[0] 27261 p := x0.Args[1] 27262 mem := x0.Args[2] 27263 or := v.Args[1] 27264 if or.Op != OpS390XOR { 27265 break 27266 } 27267 _ = or.Args[1] 27268 s1 := or.Args[0] 27269 if s1.Op != OpS390XSLDconst { 27270 break 27271 } 27272 j1 := s1.AuxInt 27273 x1 := s1.Args[0] 27274 if x1.Op != OpS390XMOVHZloadidx { 27275 break 27276 } 27277 i1 := x1.AuxInt 27278 if x1.Aux != s { 27279 break 27280 } 27281 _ = x1.Args[2] 27282 if p != x1.Args[0] { 27283 break 27284 } 27285 if idx != x1.Args[1] { 27286 break 27287 } 27288 if mem != x1.Args[2] { 27289 break 27290 } 27291 y := or.Args[1] 27292 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)) { 27293 break 27294 } 27295 b = mergePoint(b, x0, x1) 27296 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27297 v.reset(OpCopy) 27298 v.AddArg(v0) 27299 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27300 v1.AuxInt = j1 27301 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27302 v2.AuxInt = i0 27303 v2.Aux = s 27304 v2.AddArg(p) 27305 v2.AddArg(idx) 27306 v2.AddArg(mem) 27307 v1.AddArg(v2) 27308 v0.AddArg(v1) 27309 v0.AddArg(y) 27310 return true 27311 } 27312 // 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)) 27313 // 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) 27314 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27315 for { 27316 _ = v.Args[1] 27317 s0 := v.Args[0] 27318 if s0.Op != OpS390XSLDconst { 27319 break 27320 } 27321 j0 := s0.AuxInt 27322 x0 := s0.Args[0] 27323 if x0.Op != OpS390XMOVHZloadidx { 27324 break 27325 } 27326 i0 := x0.AuxInt 27327 s := x0.Aux 27328 _ = x0.Args[2] 27329 p := x0.Args[0] 27330 idx := x0.Args[1] 27331 mem := x0.Args[2] 27332 or := v.Args[1] 27333 if or.Op != OpS390XOR { 27334 break 27335 } 27336 _ = or.Args[1] 27337 s1 := or.Args[0] 27338 if s1.Op != OpS390XSLDconst { 27339 break 27340 } 27341 j1 := s1.AuxInt 27342 x1 := s1.Args[0] 27343 if x1.Op != OpS390XMOVHZloadidx { 27344 break 27345 } 27346 i1 := x1.AuxInt 27347 if x1.Aux != s { 27348 break 27349 } 27350 _ = x1.Args[2] 27351 if idx != x1.Args[0] { 27352 break 27353 } 27354 if p != x1.Args[1] { 27355 break 27356 } 27357 if mem != x1.Args[2] { 27358 break 27359 } 27360 y := or.Args[1] 27361 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)) { 27362 break 27363 } 27364 b = mergePoint(b, x0, x1) 27365 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27366 v.reset(OpCopy) 27367 v.AddArg(v0) 27368 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27369 v1.AuxInt = j1 27370 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27371 v2.AuxInt = i0 27372 v2.Aux = s 27373 v2.AddArg(p) 27374 v2.AddArg(idx) 27375 v2.AddArg(mem) 27376 v1.AddArg(v2) 27377 v0.AddArg(v1) 27378 v0.AddArg(y) 27379 return true 27380 } 27381 // 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)) 27382 // 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) 27383 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27384 for { 27385 _ = v.Args[1] 27386 s0 := v.Args[0] 27387 if s0.Op != OpS390XSLDconst { 27388 break 27389 } 27390 j0 := s0.AuxInt 27391 x0 := s0.Args[0] 27392 if x0.Op != OpS390XMOVHZloadidx { 27393 break 27394 } 27395 i0 := x0.AuxInt 27396 s := x0.Aux 27397 _ = x0.Args[2] 27398 idx := x0.Args[0] 27399 p := x0.Args[1] 27400 mem := x0.Args[2] 27401 or := v.Args[1] 27402 if or.Op != OpS390XOR { 27403 break 27404 } 27405 _ = or.Args[1] 27406 s1 := or.Args[0] 27407 if s1.Op != OpS390XSLDconst { 27408 break 27409 } 27410 j1 := s1.AuxInt 27411 x1 := s1.Args[0] 27412 if x1.Op != OpS390XMOVHZloadidx { 27413 break 27414 } 27415 i1 := x1.AuxInt 27416 if x1.Aux != s { 27417 break 27418 } 27419 _ = x1.Args[2] 27420 if idx != x1.Args[0] { 27421 break 27422 } 27423 if p != x1.Args[1] { 27424 break 27425 } 27426 if mem != x1.Args[2] { 27427 break 27428 } 27429 y := or.Args[1] 27430 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)) { 27431 break 27432 } 27433 b = mergePoint(b, x0, x1) 27434 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27435 v.reset(OpCopy) 27436 v.AddArg(v0) 27437 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27438 v1.AuxInt = j1 27439 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27440 v2.AuxInt = i0 27441 v2.Aux = s 27442 v2.AddArg(p) 27443 v2.AddArg(idx) 27444 v2.AddArg(mem) 27445 v1.AddArg(v2) 27446 v0.AddArg(v1) 27447 v0.AddArg(y) 27448 return true 27449 } 27450 // 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)))) 27451 // 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) 27452 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27453 for { 27454 _ = v.Args[1] 27455 s0 := v.Args[0] 27456 if s0.Op != OpS390XSLDconst { 27457 break 27458 } 27459 j0 := s0.AuxInt 27460 x0 := s0.Args[0] 27461 if x0.Op != OpS390XMOVHZloadidx { 27462 break 27463 } 27464 i0 := x0.AuxInt 27465 s := x0.Aux 27466 _ = x0.Args[2] 27467 p := x0.Args[0] 27468 idx := x0.Args[1] 27469 mem := x0.Args[2] 27470 or := v.Args[1] 27471 if or.Op != OpS390XOR { 27472 break 27473 } 27474 _ = or.Args[1] 27475 y := or.Args[0] 27476 s1 := or.Args[1] 27477 if s1.Op != OpS390XSLDconst { 27478 break 27479 } 27480 j1 := s1.AuxInt 27481 x1 := s1.Args[0] 27482 if x1.Op != OpS390XMOVHZloadidx { 27483 break 27484 } 27485 i1 := x1.AuxInt 27486 if x1.Aux != s { 27487 break 27488 } 27489 _ = x1.Args[2] 27490 if p != x1.Args[0] { 27491 break 27492 } 27493 if idx != x1.Args[1] { 27494 break 27495 } 27496 if mem != x1.Args[2] { 27497 break 27498 } 27499 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)) { 27500 break 27501 } 27502 b = mergePoint(b, x0, x1) 27503 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27504 v.reset(OpCopy) 27505 v.AddArg(v0) 27506 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27507 v1.AuxInt = j1 27508 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27509 v2.AuxInt = i0 27510 v2.Aux = s 27511 v2.AddArg(p) 27512 v2.AddArg(idx) 27513 v2.AddArg(mem) 27514 v1.AddArg(v2) 27515 v0.AddArg(v1) 27516 v0.AddArg(y) 27517 return true 27518 } 27519 // 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)))) 27520 // 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) 27521 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27522 for { 27523 _ = v.Args[1] 27524 s0 := v.Args[0] 27525 if s0.Op != OpS390XSLDconst { 27526 break 27527 } 27528 j0 := s0.AuxInt 27529 x0 := s0.Args[0] 27530 if x0.Op != OpS390XMOVHZloadidx { 27531 break 27532 } 27533 i0 := x0.AuxInt 27534 s := x0.Aux 27535 _ = x0.Args[2] 27536 idx := x0.Args[0] 27537 p := x0.Args[1] 27538 mem := x0.Args[2] 27539 or := v.Args[1] 27540 if or.Op != OpS390XOR { 27541 break 27542 } 27543 _ = or.Args[1] 27544 y := or.Args[0] 27545 s1 := or.Args[1] 27546 if s1.Op != OpS390XSLDconst { 27547 break 27548 } 27549 j1 := s1.AuxInt 27550 x1 := s1.Args[0] 27551 if x1.Op != OpS390XMOVHZloadidx { 27552 break 27553 } 27554 i1 := x1.AuxInt 27555 if x1.Aux != s { 27556 break 27557 } 27558 _ = x1.Args[2] 27559 if p != x1.Args[0] { 27560 break 27561 } 27562 if idx != x1.Args[1] { 27563 break 27564 } 27565 if mem != x1.Args[2] { 27566 break 27567 } 27568 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)) { 27569 break 27570 } 27571 b = mergePoint(b, x0, x1) 27572 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27573 v.reset(OpCopy) 27574 v.AddArg(v0) 27575 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27576 v1.AuxInt = j1 27577 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27578 v2.AuxInt = i0 27579 v2.Aux = s 27580 v2.AddArg(p) 27581 v2.AddArg(idx) 27582 v2.AddArg(mem) 27583 v1.AddArg(v2) 27584 v0.AddArg(v1) 27585 v0.AddArg(y) 27586 return true 27587 } 27588 // 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)))) 27589 // 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) 27590 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27591 for { 27592 _ = v.Args[1] 27593 s0 := v.Args[0] 27594 if s0.Op != OpS390XSLDconst { 27595 break 27596 } 27597 j0 := s0.AuxInt 27598 x0 := s0.Args[0] 27599 if x0.Op != OpS390XMOVHZloadidx { 27600 break 27601 } 27602 i0 := x0.AuxInt 27603 s := x0.Aux 27604 _ = x0.Args[2] 27605 p := x0.Args[0] 27606 idx := x0.Args[1] 27607 mem := x0.Args[2] 27608 or := v.Args[1] 27609 if or.Op != OpS390XOR { 27610 break 27611 } 27612 _ = or.Args[1] 27613 y := or.Args[0] 27614 s1 := or.Args[1] 27615 if s1.Op != OpS390XSLDconst { 27616 break 27617 } 27618 j1 := s1.AuxInt 27619 x1 := s1.Args[0] 27620 if x1.Op != OpS390XMOVHZloadidx { 27621 break 27622 } 27623 i1 := x1.AuxInt 27624 if x1.Aux != s { 27625 break 27626 } 27627 _ = x1.Args[2] 27628 if idx != x1.Args[0] { 27629 break 27630 } 27631 if p != x1.Args[1] { 27632 break 27633 } 27634 if mem != x1.Args[2] { 27635 break 27636 } 27637 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)) { 27638 break 27639 } 27640 b = mergePoint(b, x0, x1) 27641 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27642 v.reset(OpCopy) 27643 v.AddArg(v0) 27644 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27645 v1.AuxInt = j1 27646 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27647 v2.AuxInt = i0 27648 v2.Aux = s 27649 v2.AddArg(p) 27650 v2.AddArg(idx) 27651 v2.AddArg(mem) 27652 v1.AddArg(v2) 27653 v0.AddArg(v1) 27654 v0.AddArg(y) 27655 return true 27656 } 27657 // 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)))) 27658 // 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) 27659 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27660 for { 27661 _ = v.Args[1] 27662 s0 := v.Args[0] 27663 if s0.Op != OpS390XSLDconst { 27664 break 27665 } 27666 j0 := s0.AuxInt 27667 x0 := s0.Args[0] 27668 if x0.Op != OpS390XMOVHZloadidx { 27669 break 27670 } 27671 i0 := x0.AuxInt 27672 s := x0.Aux 27673 _ = x0.Args[2] 27674 idx := x0.Args[0] 27675 p := x0.Args[1] 27676 mem := x0.Args[2] 27677 or := v.Args[1] 27678 if or.Op != OpS390XOR { 27679 break 27680 } 27681 _ = or.Args[1] 27682 y := or.Args[0] 27683 s1 := or.Args[1] 27684 if s1.Op != OpS390XSLDconst { 27685 break 27686 } 27687 j1 := s1.AuxInt 27688 x1 := s1.Args[0] 27689 if x1.Op != OpS390XMOVHZloadidx { 27690 break 27691 } 27692 i1 := x1.AuxInt 27693 if x1.Aux != s { 27694 break 27695 } 27696 _ = x1.Args[2] 27697 if idx != x1.Args[0] { 27698 break 27699 } 27700 if p != x1.Args[1] { 27701 break 27702 } 27703 if mem != x1.Args[2] { 27704 break 27705 } 27706 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)) { 27707 break 27708 } 27709 b = mergePoint(b, x0, x1) 27710 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27711 v.reset(OpCopy) 27712 v.AddArg(v0) 27713 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27714 v1.AuxInt = j1 27715 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27716 v2.AuxInt = i0 27717 v2.Aux = s 27718 v2.AddArg(p) 27719 v2.AddArg(idx) 27720 v2.AddArg(mem) 27721 v1.AddArg(v2) 27722 v0.AddArg(v1) 27723 v0.AddArg(y) 27724 return true 27725 } 27726 // 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))) 27727 // 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) 27728 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27729 for { 27730 _ = v.Args[1] 27731 or := v.Args[0] 27732 if or.Op != OpS390XOR { 27733 break 27734 } 27735 _ = or.Args[1] 27736 s1 := or.Args[0] 27737 if s1.Op != OpS390XSLDconst { 27738 break 27739 } 27740 j1 := s1.AuxInt 27741 x1 := s1.Args[0] 27742 if x1.Op != OpS390XMOVHZloadidx { 27743 break 27744 } 27745 i1 := x1.AuxInt 27746 s := x1.Aux 27747 _ = x1.Args[2] 27748 p := x1.Args[0] 27749 idx := x1.Args[1] 27750 mem := x1.Args[2] 27751 y := or.Args[1] 27752 s0 := v.Args[1] 27753 if s0.Op != OpS390XSLDconst { 27754 break 27755 } 27756 j0 := s0.AuxInt 27757 x0 := s0.Args[0] 27758 if x0.Op != OpS390XMOVHZloadidx { 27759 break 27760 } 27761 i0 := x0.AuxInt 27762 if x0.Aux != s { 27763 break 27764 } 27765 _ = x0.Args[2] 27766 if p != x0.Args[0] { 27767 break 27768 } 27769 if idx != x0.Args[1] { 27770 break 27771 } 27772 if mem != x0.Args[2] { 27773 break 27774 } 27775 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)) { 27776 break 27777 } 27778 b = mergePoint(b, x0, x1) 27779 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27780 v.reset(OpCopy) 27781 v.AddArg(v0) 27782 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27783 v1.AuxInt = j1 27784 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27785 v2.AuxInt = i0 27786 v2.Aux = s 27787 v2.AddArg(p) 27788 v2.AddArg(idx) 27789 v2.AddArg(mem) 27790 v1.AddArg(v2) 27791 v0.AddArg(v1) 27792 v0.AddArg(y) 27793 return true 27794 } 27795 return false 27796 } 27797 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 27798 b := v.Block 27799 _ = b 27800 typ := &b.Func.Config.Types 27801 _ = typ 27802 // 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))) 27803 // 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) 27804 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27805 for { 27806 _ = v.Args[1] 27807 or := v.Args[0] 27808 if or.Op != OpS390XOR { 27809 break 27810 } 27811 _ = or.Args[1] 27812 s1 := or.Args[0] 27813 if s1.Op != OpS390XSLDconst { 27814 break 27815 } 27816 j1 := s1.AuxInt 27817 x1 := s1.Args[0] 27818 if x1.Op != OpS390XMOVHZloadidx { 27819 break 27820 } 27821 i1 := x1.AuxInt 27822 s := x1.Aux 27823 _ = x1.Args[2] 27824 idx := x1.Args[0] 27825 p := x1.Args[1] 27826 mem := x1.Args[2] 27827 y := or.Args[1] 27828 s0 := v.Args[1] 27829 if s0.Op != OpS390XSLDconst { 27830 break 27831 } 27832 j0 := s0.AuxInt 27833 x0 := s0.Args[0] 27834 if x0.Op != OpS390XMOVHZloadidx { 27835 break 27836 } 27837 i0 := x0.AuxInt 27838 if x0.Aux != s { 27839 break 27840 } 27841 _ = x0.Args[2] 27842 if p != x0.Args[0] { 27843 break 27844 } 27845 if idx != x0.Args[1] { 27846 break 27847 } 27848 if mem != x0.Args[2] { 27849 break 27850 } 27851 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)) { 27852 break 27853 } 27854 b = mergePoint(b, x0, x1) 27855 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27856 v.reset(OpCopy) 27857 v.AddArg(v0) 27858 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27859 v1.AuxInt = j1 27860 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27861 v2.AuxInt = i0 27862 v2.Aux = s 27863 v2.AddArg(p) 27864 v2.AddArg(idx) 27865 v2.AddArg(mem) 27866 v1.AddArg(v2) 27867 v0.AddArg(v1) 27868 v0.AddArg(y) 27869 return true 27870 } 27871 // 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))) 27872 // 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) 27873 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27874 for { 27875 _ = v.Args[1] 27876 or := v.Args[0] 27877 if or.Op != OpS390XOR { 27878 break 27879 } 27880 _ = or.Args[1] 27881 y := or.Args[0] 27882 s1 := or.Args[1] 27883 if s1.Op != OpS390XSLDconst { 27884 break 27885 } 27886 j1 := s1.AuxInt 27887 x1 := s1.Args[0] 27888 if x1.Op != OpS390XMOVHZloadidx { 27889 break 27890 } 27891 i1 := x1.AuxInt 27892 s := x1.Aux 27893 _ = x1.Args[2] 27894 p := x1.Args[0] 27895 idx := x1.Args[1] 27896 mem := x1.Args[2] 27897 s0 := v.Args[1] 27898 if s0.Op != OpS390XSLDconst { 27899 break 27900 } 27901 j0 := s0.AuxInt 27902 x0 := s0.Args[0] 27903 if x0.Op != OpS390XMOVHZloadidx { 27904 break 27905 } 27906 i0 := x0.AuxInt 27907 if x0.Aux != s { 27908 break 27909 } 27910 _ = x0.Args[2] 27911 if p != x0.Args[0] { 27912 break 27913 } 27914 if idx != x0.Args[1] { 27915 break 27916 } 27917 if mem != x0.Args[2] { 27918 break 27919 } 27920 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)) { 27921 break 27922 } 27923 b = mergePoint(b, x0, x1) 27924 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27925 v.reset(OpCopy) 27926 v.AddArg(v0) 27927 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27928 v1.AuxInt = j1 27929 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27930 v2.AuxInt = i0 27931 v2.Aux = s 27932 v2.AddArg(p) 27933 v2.AddArg(idx) 27934 v2.AddArg(mem) 27935 v1.AddArg(v2) 27936 v0.AddArg(v1) 27937 v0.AddArg(y) 27938 return true 27939 } 27940 // 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))) 27941 // 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) 27942 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 27943 for { 27944 _ = v.Args[1] 27945 or := v.Args[0] 27946 if or.Op != OpS390XOR { 27947 break 27948 } 27949 _ = or.Args[1] 27950 y := or.Args[0] 27951 s1 := or.Args[1] 27952 if s1.Op != OpS390XSLDconst { 27953 break 27954 } 27955 j1 := s1.AuxInt 27956 x1 := s1.Args[0] 27957 if x1.Op != OpS390XMOVHZloadidx { 27958 break 27959 } 27960 i1 := x1.AuxInt 27961 s := x1.Aux 27962 _ = x1.Args[2] 27963 idx := x1.Args[0] 27964 p := x1.Args[1] 27965 mem := x1.Args[2] 27966 s0 := v.Args[1] 27967 if s0.Op != OpS390XSLDconst { 27968 break 27969 } 27970 j0 := s0.AuxInt 27971 x0 := s0.Args[0] 27972 if x0.Op != OpS390XMOVHZloadidx { 27973 break 27974 } 27975 i0 := x0.AuxInt 27976 if x0.Aux != s { 27977 break 27978 } 27979 _ = x0.Args[2] 27980 if p != x0.Args[0] { 27981 break 27982 } 27983 if idx != x0.Args[1] { 27984 break 27985 } 27986 if mem != x0.Args[2] { 27987 break 27988 } 27989 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)) { 27990 break 27991 } 27992 b = mergePoint(b, x0, x1) 27993 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27994 v.reset(OpCopy) 27995 v.AddArg(v0) 27996 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27997 v1.AuxInt = j1 27998 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 27999 v2.AuxInt = i0 28000 v2.Aux = s 28001 v2.AddArg(p) 28002 v2.AddArg(idx) 28003 v2.AddArg(mem) 28004 v1.AddArg(v2) 28005 v0.AddArg(v1) 28006 v0.AddArg(y) 28007 return true 28008 } 28009 // 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))) 28010 // 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) 28011 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28012 for { 28013 _ = v.Args[1] 28014 or := v.Args[0] 28015 if or.Op != OpS390XOR { 28016 break 28017 } 28018 _ = or.Args[1] 28019 s1 := or.Args[0] 28020 if s1.Op != OpS390XSLDconst { 28021 break 28022 } 28023 j1 := s1.AuxInt 28024 x1 := s1.Args[0] 28025 if x1.Op != OpS390XMOVHZloadidx { 28026 break 28027 } 28028 i1 := x1.AuxInt 28029 s := x1.Aux 28030 _ = x1.Args[2] 28031 p := x1.Args[0] 28032 idx := x1.Args[1] 28033 mem := x1.Args[2] 28034 y := or.Args[1] 28035 s0 := v.Args[1] 28036 if s0.Op != OpS390XSLDconst { 28037 break 28038 } 28039 j0 := s0.AuxInt 28040 x0 := s0.Args[0] 28041 if x0.Op != OpS390XMOVHZloadidx { 28042 break 28043 } 28044 i0 := x0.AuxInt 28045 if x0.Aux != s { 28046 break 28047 } 28048 _ = x0.Args[2] 28049 if idx != x0.Args[0] { 28050 break 28051 } 28052 if p != x0.Args[1] { 28053 break 28054 } 28055 if mem != x0.Args[2] { 28056 break 28057 } 28058 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)) { 28059 break 28060 } 28061 b = mergePoint(b, x0, x1) 28062 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28063 v.reset(OpCopy) 28064 v.AddArg(v0) 28065 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28066 v1.AuxInt = j1 28067 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28068 v2.AuxInt = i0 28069 v2.Aux = s 28070 v2.AddArg(p) 28071 v2.AddArg(idx) 28072 v2.AddArg(mem) 28073 v1.AddArg(v2) 28074 v0.AddArg(v1) 28075 v0.AddArg(y) 28076 return true 28077 } 28078 // 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))) 28079 // 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) 28080 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28081 for { 28082 _ = v.Args[1] 28083 or := v.Args[0] 28084 if or.Op != OpS390XOR { 28085 break 28086 } 28087 _ = or.Args[1] 28088 s1 := or.Args[0] 28089 if s1.Op != OpS390XSLDconst { 28090 break 28091 } 28092 j1 := s1.AuxInt 28093 x1 := s1.Args[0] 28094 if x1.Op != OpS390XMOVHZloadidx { 28095 break 28096 } 28097 i1 := x1.AuxInt 28098 s := x1.Aux 28099 _ = x1.Args[2] 28100 idx := x1.Args[0] 28101 p := x1.Args[1] 28102 mem := x1.Args[2] 28103 y := or.Args[1] 28104 s0 := v.Args[1] 28105 if s0.Op != OpS390XSLDconst { 28106 break 28107 } 28108 j0 := s0.AuxInt 28109 x0 := s0.Args[0] 28110 if x0.Op != OpS390XMOVHZloadidx { 28111 break 28112 } 28113 i0 := x0.AuxInt 28114 if x0.Aux != s { 28115 break 28116 } 28117 _ = x0.Args[2] 28118 if idx != x0.Args[0] { 28119 break 28120 } 28121 if p != x0.Args[1] { 28122 break 28123 } 28124 if mem != x0.Args[2] { 28125 break 28126 } 28127 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)) { 28128 break 28129 } 28130 b = mergePoint(b, x0, x1) 28131 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28132 v.reset(OpCopy) 28133 v.AddArg(v0) 28134 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28135 v1.AuxInt = j1 28136 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28137 v2.AuxInt = i0 28138 v2.Aux = s 28139 v2.AddArg(p) 28140 v2.AddArg(idx) 28141 v2.AddArg(mem) 28142 v1.AddArg(v2) 28143 v0.AddArg(v1) 28144 v0.AddArg(y) 28145 return true 28146 } 28147 // 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))) 28148 // 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) 28149 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28150 for { 28151 _ = v.Args[1] 28152 or := v.Args[0] 28153 if or.Op != OpS390XOR { 28154 break 28155 } 28156 _ = or.Args[1] 28157 y := or.Args[0] 28158 s1 := or.Args[1] 28159 if s1.Op != OpS390XSLDconst { 28160 break 28161 } 28162 j1 := s1.AuxInt 28163 x1 := s1.Args[0] 28164 if x1.Op != OpS390XMOVHZloadidx { 28165 break 28166 } 28167 i1 := x1.AuxInt 28168 s := x1.Aux 28169 _ = x1.Args[2] 28170 p := x1.Args[0] 28171 idx := x1.Args[1] 28172 mem := x1.Args[2] 28173 s0 := v.Args[1] 28174 if s0.Op != OpS390XSLDconst { 28175 break 28176 } 28177 j0 := s0.AuxInt 28178 x0 := s0.Args[0] 28179 if x0.Op != OpS390XMOVHZloadidx { 28180 break 28181 } 28182 i0 := x0.AuxInt 28183 if x0.Aux != s { 28184 break 28185 } 28186 _ = x0.Args[2] 28187 if idx != x0.Args[0] { 28188 break 28189 } 28190 if p != x0.Args[1] { 28191 break 28192 } 28193 if mem != x0.Args[2] { 28194 break 28195 } 28196 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)) { 28197 break 28198 } 28199 b = mergePoint(b, x0, x1) 28200 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28201 v.reset(OpCopy) 28202 v.AddArg(v0) 28203 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28204 v1.AuxInt = j1 28205 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28206 v2.AuxInt = i0 28207 v2.Aux = s 28208 v2.AddArg(p) 28209 v2.AddArg(idx) 28210 v2.AddArg(mem) 28211 v1.AddArg(v2) 28212 v0.AddArg(v1) 28213 v0.AddArg(y) 28214 return true 28215 } 28216 // 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))) 28217 // 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) 28218 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 28219 for { 28220 _ = v.Args[1] 28221 or := v.Args[0] 28222 if or.Op != OpS390XOR { 28223 break 28224 } 28225 _ = or.Args[1] 28226 y := or.Args[0] 28227 s1 := or.Args[1] 28228 if s1.Op != OpS390XSLDconst { 28229 break 28230 } 28231 j1 := s1.AuxInt 28232 x1 := s1.Args[0] 28233 if x1.Op != OpS390XMOVHZloadidx { 28234 break 28235 } 28236 i1 := x1.AuxInt 28237 s := x1.Aux 28238 _ = x1.Args[2] 28239 idx := x1.Args[0] 28240 p := x1.Args[1] 28241 mem := x1.Args[2] 28242 s0 := v.Args[1] 28243 if s0.Op != OpS390XSLDconst { 28244 break 28245 } 28246 j0 := s0.AuxInt 28247 x0 := s0.Args[0] 28248 if x0.Op != OpS390XMOVHZloadidx { 28249 break 28250 } 28251 i0 := x0.AuxInt 28252 if x0.Aux != s { 28253 break 28254 } 28255 _ = x0.Args[2] 28256 if idx != x0.Args[0] { 28257 break 28258 } 28259 if p != x0.Args[1] { 28260 break 28261 } 28262 if mem != x0.Args[2] { 28263 break 28264 } 28265 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)) { 28266 break 28267 } 28268 b = mergePoint(b, x0, x1) 28269 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28270 v.reset(OpCopy) 28271 v.AddArg(v0) 28272 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28273 v1.AuxInt = j1 28274 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 28275 v2.AuxInt = i0 28276 v2.Aux = s 28277 v2.AddArg(p) 28278 v2.AddArg(idx) 28279 v2.AddArg(mem) 28280 v1.AddArg(v2) 28281 v0.AddArg(v1) 28282 v0.AddArg(y) 28283 return true 28284 } 28285 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 28286 // 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) 28287 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 28288 for { 28289 _ = v.Args[1] 28290 x0 := v.Args[0] 28291 if x0.Op != OpS390XMOVBZload { 28292 break 28293 } 28294 i0 := x0.AuxInt 28295 s := x0.Aux 28296 _ = x0.Args[1] 28297 p := x0.Args[0] 28298 mem := x0.Args[1] 28299 sh := v.Args[1] 28300 if sh.Op != OpS390XSLDconst { 28301 break 28302 } 28303 if sh.AuxInt != 8 { 28304 break 28305 } 28306 x1 := sh.Args[0] 28307 if x1.Op != OpS390XMOVBZload { 28308 break 28309 } 28310 i1 := x1.AuxInt 28311 if x1.Aux != s { 28312 break 28313 } 28314 _ = x1.Args[1] 28315 if p != x1.Args[0] { 28316 break 28317 } 28318 if mem != x1.Args[1] { 28319 break 28320 } 28321 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)) { 28322 break 28323 } 28324 b = mergePoint(b, x0, x1) 28325 v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 28326 v.reset(OpCopy) 28327 v.AddArg(v0) 28328 v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 28329 v1.AuxInt = i0 28330 v1.Aux = s 28331 v1.AddArg(p) 28332 v1.AddArg(mem) 28333 v0.AddArg(v1) 28334 return true 28335 } 28336 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 28337 // 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) 28338 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 28339 for { 28340 _ = v.Args[1] 28341 sh := v.Args[0] 28342 if sh.Op != OpS390XSLDconst { 28343 break 28344 } 28345 if sh.AuxInt != 8 { 28346 break 28347 } 28348 x1 := sh.Args[0] 28349 if x1.Op != OpS390XMOVBZload { 28350 break 28351 } 28352 i1 := x1.AuxInt 28353 s := x1.Aux 28354 _ = x1.Args[1] 28355 p := x1.Args[0] 28356 mem := x1.Args[1] 28357 x0 := v.Args[1] 28358 if x0.Op != OpS390XMOVBZload { 28359 break 28360 } 28361 i0 := x0.AuxInt 28362 if x0.Aux != s { 28363 break 28364 } 28365 _ = x0.Args[1] 28366 if p != x0.Args[0] { 28367 break 28368 } 28369 if mem != x0.Args[1] { 28370 break 28371 } 28372 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)) { 28373 break 28374 } 28375 b = mergePoint(b, x0, x1) 28376 v0 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 28377 v.reset(OpCopy) 28378 v.AddArg(v0) 28379 v1 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 28380 v1.AuxInt = i0 28381 v1.Aux = s 28382 v1.AddArg(p) 28383 v1.AddArg(mem) 28384 v0.AddArg(v1) 28385 return true 28386 } 28387 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 28388 // 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) 28389 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 28390 for { 28391 _ = v.Args[1] 28392 r0 := v.Args[0] 28393 if r0.Op != OpS390XMOVHZreg { 28394 break 28395 } 28396 x0 := r0.Args[0] 28397 if x0.Op != OpS390XMOVHBRload { 28398 break 28399 } 28400 i0 := x0.AuxInt 28401 s := x0.Aux 28402 _ = x0.Args[1] 28403 p := x0.Args[0] 28404 mem := x0.Args[1] 28405 sh := v.Args[1] 28406 if sh.Op != OpS390XSLDconst { 28407 break 28408 } 28409 if sh.AuxInt != 16 { 28410 break 28411 } 28412 r1 := sh.Args[0] 28413 if r1.Op != OpS390XMOVHZreg { 28414 break 28415 } 28416 x1 := r1.Args[0] 28417 if x1.Op != OpS390XMOVHBRload { 28418 break 28419 } 28420 i1 := x1.AuxInt 28421 if x1.Aux != s { 28422 break 28423 } 28424 _ = x1.Args[1] 28425 if p != x1.Args[0] { 28426 break 28427 } 28428 if mem != x1.Args[1] { 28429 break 28430 } 28431 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)) { 28432 break 28433 } 28434 b = mergePoint(b, x0, x1) 28435 v0 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) 28436 v.reset(OpCopy) 28437 v.AddArg(v0) 28438 v1 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) 28439 v1.AuxInt = i0 28440 v1.Aux = s 28441 v1.AddArg(p) 28442 v1.AddArg(mem) 28443 v0.AddArg(v1) 28444 return true 28445 } 28446 return false 28447 } 28448 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 28449 b := v.Block 28450 _ = b 28451 typ := &b.Func.Config.Types 28452 _ = typ 28453 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 28454 // 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) 28455 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 28456 for { 28457 _ = v.Args[1] 28458 sh := v.Args[0] 28459 if sh.Op != OpS390XSLDconst { 28460 break 28461 } 28462 if sh.AuxInt != 16 { 28463 break 28464 } 28465 r1 := sh.Args[0] 28466 if r1.Op != OpS390XMOVHZreg { 28467 break 28468 } 28469 x1 := r1.Args[0] 28470 if x1.Op != OpS390XMOVHBRload { 28471 break 28472 } 28473 i1 := x1.AuxInt 28474 s := x1.Aux 28475 _ = x1.Args[1] 28476 p := x1.Args[0] 28477 mem := x1.Args[1] 28478 r0 := v.Args[1] 28479 if r0.Op != OpS390XMOVHZreg { 28480 break 28481 } 28482 x0 := r0.Args[0] 28483 if x0.Op != OpS390XMOVHBRload { 28484 break 28485 } 28486 i0 := x0.AuxInt 28487 if x0.Aux != s { 28488 break 28489 } 28490 _ = x0.Args[1] 28491 if p != x0.Args[0] { 28492 break 28493 } 28494 if mem != x0.Args[1] { 28495 break 28496 } 28497 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)) { 28498 break 28499 } 28500 b = mergePoint(b, x0, x1) 28501 v0 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) 28502 v.reset(OpCopy) 28503 v.AddArg(v0) 28504 v1 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) 28505 v1.AuxInt = i0 28506 v1.Aux = s 28507 v1.AddArg(p) 28508 v1.AddArg(mem) 28509 v0.AddArg(v1) 28510 return true 28511 } 28512 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 28513 // 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) 28514 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 28515 for { 28516 _ = v.Args[1] 28517 r0 := v.Args[0] 28518 if r0.Op != OpS390XMOVWZreg { 28519 break 28520 } 28521 x0 := r0.Args[0] 28522 if x0.Op != OpS390XMOVWBRload { 28523 break 28524 } 28525 i0 := x0.AuxInt 28526 s := x0.Aux 28527 _ = x0.Args[1] 28528 p := x0.Args[0] 28529 mem := x0.Args[1] 28530 sh := v.Args[1] 28531 if sh.Op != OpS390XSLDconst { 28532 break 28533 } 28534 if sh.AuxInt != 32 { 28535 break 28536 } 28537 r1 := sh.Args[0] 28538 if r1.Op != OpS390XMOVWZreg { 28539 break 28540 } 28541 x1 := r1.Args[0] 28542 if x1.Op != OpS390XMOVWBRload { 28543 break 28544 } 28545 i1 := x1.AuxInt 28546 if x1.Aux != s { 28547 break 28548 } 28549 _ = x1.Args[1] 28550 if p != x1.Args[0] { 28551 break 28552 } 28553 if mem != x1.Args[1] { 28554 break 28555 } 28556 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)) { 28557 break 28558 } 28559 b = mergePoint(b, x0, x1) 28560 v0 := b.NewValue0(x1.Pos, OpS390XMOVDBRload, typ.UInt64) 28561 v.reset(OpCopy) 28562 v.AddArg(v0) 28563 v0.AuxInt = i0 28564 v0.Aux = s 28565 v0.AddArg(p) 28566 v0.AddArg(mem) 28567 return true 28568 } 28569 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 28570 // 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) 28571 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 28572 for { 28573 _ = v.Args[1] 28574 sh := v.Args[0] 28575 if sh.Op != OpS390XSLDconst { 28576 break 28577 } 28578 if sh.AuxInt != 32 { 28579 break 28580 } 28581 r1 := sh.Args[0] 28582 if r1.Op != OpS390XMOVWZreg { 28583 break 28584 } 28585 x1 := r1.Args[0] 28586 if x1.Op != OpS390XMOVWBRload { 28587 break 28588 } 28589 i1 := x1.AuxInt 28590 s := x1.Aux 28591 _ = x1.Args[1] 28592 p := x1.Args[0] 28593 mem := x1.Args[1] 28594 r0 := v.Args[1] 28595 if r0.Op != OpS390XMOVWZreg { 28596 break 28597 } 28598 x0 := r0.Args[0] 28599 if x0.Op != OpS390XMOVWBRload { 28600 break 28601 } 28602 i0 := x0.AuxInt 28603 if x0.Aux != s { 28604 break 28605 } 28606 _ = x0.Args[1] 28607 if p != x0.Args[0] { 28608 break 28609 } 28610 if mem != x0.Args[1] { 28611 break 28612 } 28613 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)) { 28614 break 28615 } 28616 b = mergePoint(b, x0, x1) 28617 v0 := b.NewValue0(x0.Pos, OpS390XMOVDBRload, typ.UInt64) 28618 v.reset(OpCopy) 28619 v.AddArg(v0) 28620 v0.AuxInt = i0 28621 v0.Aux = s 28622 v0.AddArg(p) 28623 v0.AddArg(mem) 28624 return true 28625 } 28626 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 28627 // 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) 28628 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28629 for { 28630 _ = v.Args[1] 28631 s1 := v.Args[0] 28632 if s1.Op != OpS390XSLDconst { 28633 break 28634 } 28635 j1 := s1.AuxInt 28636 x1 := s1.Args[0] 28637 if x1.Op != OpS390XMOVBZload { 28638 break 28639 } 28640 i1 := x1.AuxInt 28641 s := x1.Aux 28642 _ = x1.Args[1] 28643 p := x1.Args[0] 28644 mem := x1.Args[1] 28645 or := v.Args[1] 28646 if or.Op != OpS390XOR { 28647 break 28648 } 28649 _ = or.Args[1] 28650 s0 := or.Args[0] 28651 if s0.Op != OpS390XSLDconst { 28652 break 28653 } 28654 j0 := s0.AuxInt 28655 x0 := s0.Args[0] 28656 if x0.Op != OpS390XMOVBZload { 28657 break 28658 } 28659 i0 := x0.AuxInt 28660 if x0.Aux != s { 28661 break 28662 } 28663 _ = x0.Args[1] 28664 if p != x0.Args[0] { 28665 break 28666 } 28667 if mem != x0.Args[1] { 28668 break 28669 } 28670 y := or.Args[1] 28671 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)) { 28672 break 28673 } 28674 b = mergePoint(b, x0, x1) 28675 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 28676 v.reset(OpCopy) 28677 v.AddArg(v0) 28678 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 28679 v1.AuxInt = j0 28680 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 28681 v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 28682 v3.AuxInt = i0 28683 v3.Aux = s 28684 v3.AddArg(p) 28685 v3.AddArg(mem) 28686 v2.AddArg(v3) 28687 v1.AddArg(v2) 28688 v0.AddArg(v1) 28689 v0.AddArg(y) 28690 return true 28691 } 28692 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 28693 // 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) 28694 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28695 for { 28696 _ = v.Args[1] 28697 s1 := v.Args[0] 28698 if s1.Op != OpS390XSLDconst { 28699 break 28700 } 28701 j1 := s1.AuxInt 28702 x1 := s1.Args[0] 28703 if x1.Op != OpS390XMOVBZload { 28704 break 28705 } 28706 i1 := x1.AuxInt 28707 s := x1.Aux 28708 _ = x1.Args[1] 28709 p := x1.Args[0] 28710 mem := x1.Args[1] 28711 or := v.Args[1] 28712 if or.Op != OpS390XOR { 28713 break 28714 } 28715 _ = or.Args[1] 28716 y := or.Args[0] 28717 s0 := or.Args[1] 28718 if s0.Op != OpS390XSLDconst { 28719 break 28720 } 28721 j0 := s0.AuxInt 28722 x0 := s0.Args[0] 28723 if x0.Op != OpS390XMOVBZload { 28724 break 28725 } 28726 i0 := x0.AuxInt 28727 if x0.Aux != s { 28728 break 28729 } 28730 _ = x0.Args[1] 28731 if p != x0.Args[0] { 28732 break 28733 } 28734 if mem != x0.Args[1] { 28735 break 28736 } 28737 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)) { 28738 break 28739 } 28740 b = mergePoint(b, x0, x1) 28741 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 28742 v.reset(OpCopy) 28743 v.AddArg(v0) 28744 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 28745 v1.AuxInt = j0 28746 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 28747 v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 28748 v3.AuxInt = i0 28749 v3.Aux = s 28750 v3.AddArg(p) 28751 v3.AddArg(mem) 28752 v2.AddArg(v3) 28753 v1.AddArg(v2) 28754 v0.AddArg(v1) 28755 v0.AddArg(y) 28756 return true 28757 } 28758 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 28759 // 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) 28760 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28761 for { 28762 _ = v.Args[1] 28763 or := v.Args[0] 28764 if or.Op != OpS390XOR { 28765 break 28766 } 28767 _ = or.Args[1] 28768 s0 := or.Args[0] 28769 if s0.Op != OpS390XSLDconst { 28770 break 28771 } 28772 j0 := s0.AuxInt 28773 x0 := s0.Args[0] 28774 if x0.Op != OpS390XMOVBZload { 28775 break 28776 } 28777 i0 := x0.AuxInt 28778 s := x0.Aux 28779 _ = x0.Args[1] 28780 p := x0.Args[0] 28781 mem := x0.Args[1] 28782 y := or.Args[1] 28783 s1 := v.Args[1] 28784 if s1.Op != OpS390XSLDconst { 28785 break 28786 } 28787 j1 := s1.AuxInt 28788 x1 := s1.Args[0] 28789 if x1.Op != OpS390XMOVBZload { 28790 break 28791 } 28792 i1 := x1.AuxInt 28793 if x1.Aux != s { 28794 break 28795 } 28796 _ = x1.Args[1] 28797 if p != x1.Args[0] { 28798 break 28799 } 28800 if mem != x1.Args[1] { 28801 break 28802 } 28803 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)) { 28804 break 28805 } 28806 b = mergePoint(b, x0, x1) 28807 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 28808 v.reset(OpCopy) 28809 v.AddArg(v0) 28810 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 28811 v1.AuxInt = j0 28812 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 28813 v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 28814 v3.AuxInt = i0 28815 v3.Aux = s 28816 v3.AddArg(p) 28817 v3.AddArg(mem) 28818 v2.AddArg(v3) 28819 v1.AddArg(v2) 28820 v0.AddArg(v1) 28821 v0.AddArg(y) 28822 return true 28823 } 28824 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 28825 // 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) 28826 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 28827 for { 28828 _ = v.Args[1] 28829 or := v.Args[0] 28830 if or.Op != OpS390XOR { 28831 break 28832 } 28833 _ = or.Args[1] 28834 y := or.Args[0] 28835 s0 := or.Args[1] 28836 if s0.Op != OpS390XSLDconst { 28837 break 28838 } 28839 j0 := s0.AuxInt 28840 x0 := s0.Args[0] 28841 if x0.Op != OpS390XMOVBZload { 28842 break 28843 } 28844 i0 := x0.AuxInt 28845 s := x0.Aux 28846 _ = x0.Args[1] 28847 p := x0.Args[0] 28848 mem := x0.Args[1] 28849 s1 := v.Args[1] 28850 if s1.Op != OpS390XSLDconst { 28851 break 28852 } 28853 j1 := s1.AuxInt 28854 x1 := s1.Args[0] 28855 if x1.Op != OpS390XMOVBZload { 28856 break 28857 } 28858 i1 := x1.AuxInt 28859 if x1.Aux != s { 28860 break 28861 } 28862 _ = x1.Args[1] 28863 if p != x1.Args[0] { 28864 break 28865 } 28866 if mem != x1.Args[1] { 28867 break 28868 } 28869 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)) { 28870 break 28871 } 28872 b = mergePoint(b, x0, x1) 28873 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 28874 v.reset(OpCopy) 28875 v.AddArg(v0) 28876 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 28877 v1.AuxInt = j0 28878 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 28879 v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 28880 v3.AuxInt = i0 28881 v3.Aux = s 28882 v3.AddArg(p) 28883 v3.AddArg(mem) 28884 v2.AddArg(v3) 28885 v1.AddArg(v2) 28886 v0.AddArg(v1) 28887 v0.AddArg(y) 28888 return true 28889 } 28890 // 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)) 28891 // 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) 28892 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 28893 for { 28894 _ = v.Args[1] 28895 s1 := v.Args[0] 28896 if s1.Op != OpS390XSLDconst { 28897 break 28898 } 28899 j1 := s1.AuxInt 28900 r1 := s1.Args[0] 28901 if r1.Op != OpS390XMOVHZreg { 28902 break 28903 } 28904 x1 := r1.Args[0] 28905 if x1.Op != OpS390XMOVHBRload { 28906 break 28907 } 28908 i1 := x1.AuxInt 28909 s := x1.Aux 28910 _ = x1.Args[1] 28911 p := x1.Args[0] 28912 mem := x1.Args[1] 28913 or := v.Args[1] 28914 if or.Op != OpS390XOR { 28915 break 28916 } 28917 _ = or.Args[1] 28918 s0 := or.Args[0] 28919 if s0.Op != OpS390XSLDconst { 28920 break 28921 } 28922 j0 := s0.AuxInt 28923 r0 := s0.Args[0] 28924 if r0.Op != OpS390XMOVHZreg { 28925 break 28926 } 28927 x0 := r0.Args[0] 28928 if x0.Op != OpS390XMOVHBRload { 28929 break 28930 } 28931 i0 := x0.AuxInt 28932 if x0.Aux != s { 28933 break 28934 } 28935 _ = x0.Args[1] 28936 if p != x0.Args[0] { 28937 break 28938 } 28939 if mem != x0.Args[1] { 28940 break 28941 } 28942 y := or.Args[1] 28943 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)) { 28944 break 28945 } 28946 b = mergePoint(b, x0, x1) 28947 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 28948 v.reset(OpCopy) 28949 v.AddArg(v0) 28950 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 28951 v1.AuxInt = j0 28952 v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) 28953 v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) 28954 v3.AuxInt = i0 28955 v3.Aux = s 28956 v3.AddArg(p) 28957 v3.AddArg(mem) 28958 v2.AddArg(v3) 28959 v1.AddArg(v2) 28960 v0.AddArg(v1) 28961 v0.AddArg(y) 28962 return true 28963 } 28964 // 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))))) 28965 // 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) 28966 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 28967 for { 28968 _ = v.Args[1] 28969 s1 := v.Args[0] 28970 if s1.Op != OpS390XSLDconst { 28971 break 28972 } 28973 j1 := s1.AuxInt 28974 r1 := s1.Args[0] 28975 if r1.Op != OpS390XMOVHZreg { 28976 break 28977 } 28978 x1 := r1.Args[0] 28979 if x1.Op != OpS390XMOVHBRload { 28980 break 28981 } 28982 i1 := x1.AuxInt 28983 s := x1.Aux 28984 _ = x1.Args[1] 28985 p := x1.Args[0] 28986 mem := x1.Args[1] 28987 or := v.Args[1] 28988 if or.Op != OpS390XOR { 28989 break 28990 } 28991 _ = or.Args[1] 28992 y := or.Args[0] 28993 s0 := or.Args[1] 28994 if s0.Op != OpS390XSLDconst { 28995 break 28996 } 28997 j0 := s0.AuxInt 28998 r0 := s0.Args[0] 28999 if r0.Op != OpS390XMOVHZreg { 29000 break 29001 } 29002 x0 := r0.Args[0] 29003 if x0.Op != OpS390XMOVHBRload { 29004 break 29005 } 29006 i0 := x0.AuxInt 29007 if x0.Aux != s { 29008 break 29009 } 29010 _ = x0.Args[1] 29011 if p != x0.Args[0] { 29012 break 29013 } 29014 if mem != x0.Args[1] { 29015 break 29016 } 29017 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)) { 29018 break 29019 } 29020 b = mergePoint(b, x0, x1) 29021 v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) 29022 v.reset(OpCopy) 29023 v.AddArg(v0) 29024 v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) 29025 v1.AuxInt = j0 29026 v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) 29027 v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) 29028 v3.AuxInt = i0 29029 v3.Aux = s 29030 v3.AddArg(p) 29031 v3.AddArg(mem) 29032 v2.AddArg(v3) 29033 v1.AddArg(v2) 29034 v0.AddArg(v1) 29035 v0.AddArg(y) 29036 return true 29037 } 29038 // 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)))) 29039 // 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) 29040 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 29041 for { 29042 _ = v.Args[1] 29043 or := v.Args[0] 29044 if or.Op != OpS390XOR { 29045 break 29046 } 29047 _ = or.Args[1] 29048 s0 := or.Args[0] 29049 if s0.Op != OpS390XSLDconst { 29050 break 29051 } 29052 j0 := s0.AuxInt 29053 r0 := s0.Args[0] 29054 if r0.Op != OpS390XMOVHZreg { 29055 break 29056 } 29057 x0 := r0.Args[0] 29058 if x0.Op != OpS390XMOVHBRload { 29059 break 29060 } 29061 i0 := x0.AuxInt 29062 s := x0.Aux 29063 _ = x0.Args[1] 29064 p := x0.Args[0] 29065 mem := x0.Args[1] 29066 y := or.Args[1] 29067 s1 := v.Args[1] 29068 if s1.Op != OpS390XSLDconst { 29069 break 29070 } 29071 j1 := s1.AuxInt 29072 r1 := s1.Args[0] 29073 if r1.Op != OpS390XMOVHZreg { 29074 break 29075 } 29076 x1 := r1.Args[0] 29077 if x1.Op != OpS390XMOVHBRload { 29078 break 29079 } 29080 i1 := x1.AuxInt 29081 if x1.Aux != s { 29082 break 29083 } 29084 _ = x1.Args[1] 29085 if p != x1.Args[0] { 29086 break 29087 } 29088 if mem != x1.Args[1] { 29089 break 29090 } 29091 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)) { 29092 break 29093 } 29094 b = mergePoint(b, x0, x1) 29095 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 29096 v.reset(OpCopy) 29097 v.AddArg(v0) 29098 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 29099 v1.AuxInt = j0 29100 v2 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) 29101 v3 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) 29102 v3.AuxInt = i0 29103 v3.Aux = s 29104 v3.AddArg(p) 29105 v3.AddArg(mem) 29106 v2.AddArg(v3) 29107 v1.AddArg(v2) 29108 v0.AddArg(v1) 29109 v0.AddArg(y) 29110 return true 29111 } 29112 return false 29113 } 29114 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 29115 b := v.Block 29116 _ = b 29117 typ := &b.Func.Config.Types 29118 _ = typ 29119 // 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)))) 29120 // 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) 29121 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 29122 for { 29123 _ = v.Args[1] 29124 or := v.Args[0] 29125 if or.Op != OpS390XOR { 29126 break 29127 } 29128 _ = or.Args[1] 29129 y := or.Args[0] 29130 s0 := or.Args[1] 29131 if s0.Op != OpS390XSLDconst { 29132 break 29133 } 29134 j0 := s0.AuxInt 29135 r0 := s0.Args[0] 29136 if r0.Op != OpS390XMOVHZreg { 29137 break 29138 } 29139 x0 := r0.Args[0] 29140 if x0.Op != OpS390XMOVHBRload { 29141 break 29142 } 29143 i0 := x0.AuxInt 29144 s := x0.Aux 29145 _ = x0.Args[1] 29146 p := x0.Args[0] 29147 mem := x0.Args[1] 29148 s1 := v.Args[1] 29149 if s1.Op != OpS390XSLDconst { 29150 break 29151 } 29152 j1 := s1.AuxInt 29153 r1 := s1.Args[0] 29154 if r1.Op != OpS390XMOVHZreg { 29155 break 29156 } 29157 x1 := r1.Args[0] 29158 if x1.Op != OpS390XMOVHBRload { 29159 break 29160 } 29161 i1 := x1.AuxInt 29162 if x1.Aux != s { 29163 break 29164 } 29165 _ = x1.Args[1] 29166 if p != x1.Args[0] { 29167 break 29168 } 29169 if mem != x1.Args[1] { 29170 break 29171 } 29172 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)) { 29173 break 29174 } 29175 b = mergePoint(b, x0, x1) 29176 v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) 29177 v.reset(OpCopy) 29178 v.AddArg(v0) 29179 v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) 29180 v1.AuxInt = j0 29181 v2 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) 29182 v3 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) 29183 v3.AuxInt = i0 29184 v3.Aux = s 29185 v3.AddArg(p) 29186 v3.AddArg(mem) 29187 v2.AddArg(v3) 29188 v1.AddArg(v2) 29189 v0.AddArg(v1) 29190 v0.AddArg(y) 29191 return true 29192 } 29193 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 29194 // 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) 29195 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29196 for { 29197 _ = v.Args[1] 29198 x0 := v.Args[0] 29199 if x0.Op != OpS390XMOVBZloadidx { 29200 break 29201 } 29202 i0 := x0.AuxInt 29203 s := x0.Aux 29204 _ = x0.Args[2] 29205 p := x0.Args[0] 29206 idx := x0.Args[1] 29207 mem := x0.Args[2] 29208 sh := v.Args[1] 29209 if sh.Op != OpS390XSLDconst { 29210 break 29211 } 29212 if sh.AuxInt != 8 { 29213 break 29214 } 29215 x1 := sh.Args[0] 29216 if x1.Op != OpS390XMOVBZloadidx { 29217 break 29218 } 29219 i1 := x1.AuxInt 29220 if x1.Aux != s { 29221 break 29222 } 29223 _ = x1.Args[2] 29224 if p != x1.Args[0] { 29225 break 29226 } 29227 if idx != x1.Args[1] { 29228 break 29229 } 29230 if mem != x1.Args[2] { 29231 break 29232 } 29233 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)) { 29234 break 29235 } 29236 b = mergePoint(b, x0, x1) 29237 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29238 v.reset(OpCopy) 29239 v.AddArg(v0) 29240 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29241 v1.AuxInt = i0 29242 v1.Aux = s 29243 v1.AddArg(p) 29244 v1.AddArg(idx) 29245 v1.AddArg(mem) 29246 v0.AddArg(v1) 29247 return true 29248 } 29249 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 29250 // 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) 29251 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29252 for { 29253 _ = v.Args[1] 29254 x0 := v.Args[0] 29255 if x0.Op != OpS390XMOVBZloadidx { 29256 break 29257 } 29258 i0 := x0.AuxInt 29259 s := x0.Aux 29260 _ = x0.Args[2] 29261 idx := x0.Args[0] 29262 p := x0.Args[1] 29263 mem := x0.Args[2] 29264 sh := v.Args[1] 29265 if sh.Op != OpS390XSLDconst { 29266 break 29267 } 29268 if sh.AuxInt != 8 { 29269 break 29270 } 29271 x1 := sh.Args[0] 29272 if x1.Op != OpS390XMOVBZloadidx { 29273 break 29274 } 29275 i1 := x1.AuxInt 29276 if x1.Aux != s { 29277 break 29278 } 29279 _ = x1.Args[2] 29280 if p != x1.Args[0] { 29281 break 29282 } 29283 if idx != x1.Args[1] { 29284 break 29285 } 29286 if mem != x1.Args[2] { 29287 break 29288 } 29289 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)) { 29290 break 29291 } 29292 b = mergePoint(b, x0, x1) 29293 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29294 v.reset(OpCopy) 29295 v.AddArg(v0) 29296 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29297 v1.AuxInt = i0 29298 v1.Aux = s 29299 v1.AddArg(p) 29300 v1.AddArg(idx) 29301 v1.AddArg(mem) 29302 v0.AddArg(v1) 29303 return true 29304 } 29305 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 29306 // 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) 29307 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29308 for { 29309 _ = v.Args[1] 29310 x0 := v.Args[0] 29311 if x0.Op != OpS390XMOVBZloadidx { 29312 break 29313 } 29314 i0 := x0.AuxInt 29315 s := x0.Aux 29316 _ = x0.Args[2] 29317 p := x0.Args[0] 29318 idx := x0.Args[1] 29319 mem := x0.Args[2] 29320 sh := v.Args[1] 29321 if sh.Op != OpS390XSLDconst { 29322 break 29323 } 29324 if sh.AuxInt != 8 { 29325 break 29326 } 29327 x1 := sh.Args[0] 29328 if x1.Op != OpS390XMOVBZloadidx { 29329 break 29330 } 29331 i1 := x1.AuxInt 29332 if x1.Aux != s { 29333 break 29334 } 29335 _ = x1.Args[2] 29336 if idx != x1.Args[0] { 29337 break 29338 } 29339 if p != x1.Args[1] { 29340 break 29341 } 29342 if mem != x1.Args[2] { 29343 break 29344 } 29345 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)) { 29346 break 29347 } 29348 b = mergePoint(b, x0, x1) 29349 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29350 v.reset(OpCopy) 29351 v.AddArg(v0) 29352 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29353 v1.AuxInt = i0 29354 v1.Aux = s 29355 v1.AddArg(p) 29356 v1.AddArg(idx) 29357 v1.AddArg(mem) 29358 v0.AddArg(v1) 29359 return true 29360 } 29361 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 29362 // 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) 29363 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29364 for { 29365 _ = v.Args[1] 29366 x0 := v.Args[0] 29367 if x0.Op != OpS390XMOVBZloadidx { 29368 break 29369 } 29370 i0 := x0.AuxInt 29371 s := x0.Aux 29372 _ = x0.Args[2] 29373 idx := x0.Args[0] 29374 p := x0.Args[1] 29375 mem := x0.Args[2] 29376 sh := v.Args[1] 29377 if sh.Op != OpS390XSLDconst { 29378 break 29379 } 29380 if sh.AuxInt != 8 { 29381 break 29382 } 29383 x1 := sh.Args[0] 29384 if x1.Op != OpS390XMOVBZloadidx { 29385 break 29386 } 29387 i1 := x1.AuxInt 29388 if x1.Aux != s { 29389 break 29390 } 29391 _ = x1.Args[2] 29392 if idx != x1.Args[0] { 29393 break 29394 } 29395 if p != x1.Args[1] { 29396 break 29397 } 29398 if mem != x1.Args[2] { 29399 break 29400 } 29401 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)) { 29402 break 29403 } 29404 b = mergePoint(b, x0, x1) 29405 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29406 v.reset(OpCopy) 29407 v.AddArg(v0) 29408 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29409 v1.AuxInt = i0 29410 v1.Aux = s 29411 v1.AddArg(p) 29412 v1.AddArg(idx) 29413 v1.AddArg(mem) 29414 v0.AddArg(v1) 29415 return true 29416 } 29417 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 29418 // 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) 29419 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29420 for { 29421 _ = v.Args[1] 29422 sh := v.Args[0] 29423 if sh.Op != OpS390XSLDconst { 29424 break 29425 } 29426 if sh.AuxInt != 8 { 29427 break 29428 } 29429 x1 := sh.Args[0] 29430 if x1.Op != OpS390XMOVBZloadidx { 29431 break 29432 } 29433 i1 := x1.AuxInt 29434 s := x1.Aux 29435 _ = x1.Args[2] 29436 p := x1.Args[0] 29437 idx := x1.Args[1] 29438 mem := x1.Args[2] 29439 x0 := v.Args[1] 29440 if x0.Op != OpS390XMOVBZloadidx { 29441 break 29442 } 29443 i0 := x0.AuxInt 29444 if x0.Aux != s { 29445 break 29446 } 29447 _ = x0.Args[2] 29448 if p != x0.Args[0] { 29449 break 29450 } 29451 if idx != x0.Args[1] { 29452 break 29453 } 29454 if mem != x0.Args[2] { 29455 break 29456 } 29457 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)) { 29458 break 29459 } 29460 b = mergePoint(b, x0, x1) 29461 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29462 v.reset(OpCopy) 29463 v.AddArg(v0) 29464 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29465 v1.AuxInt = i0 29466 v1.Aux = s 29467 v1.AddArg(p) 29468 v1.AddArg(idx) 29469 v1.AddArg(mem) 29470 v0.AddArg(v1) 29471 return true 29472 } 29473 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 29474 // 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) 29475 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29476 for { 29477 _ = v.Args[1] 29478 sh := v.Args[0] 29479 if sh.Op != OpS390XSLDconst { 29480 break 29481 } 29482 if sh.AuxInt != 8 { 29483 break 29484 } 29485 x1 := sh.Args[0] 29486 if x1.Op != OpS390XMOVBZloadidx { 29487 break 29488 } 29489 i1 := x1.AuxInt 29490 s := x1.Aux 29491 _ = x1.Args[2] 29492 idx := x1.Args[0] 29493 p := x1.Args[1] 29494 mem := x1.Args[2] 29495 x0 := v.Args[1] 29496 if x0.Op != OpS390XMOVBZloadidx { 29497 break 29498 } 29499 i0 := x0.AuxInt 29500 if x0.Aux != s { 29501 break 29502 } 29503 _ = x0.Args[2] 29504 if p != x0.Args[0] { 29505 break 29506 } 29507 if idx != x0.Args[1] { 29508 break 29509 } 29510 if mem != x0.Args[2] { 29511 break 29512 } 29513 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)) { 29514 break 29515 } 29516 b = mergePoint(b, x0, x1) 29517 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29518 v.reset(OpCopy) 29519 v.AddArg(v0) 29520 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29521 v1.AuxInt = i0 29522 v1.Aux = s 29523 v1.AddArg(p) 29524 v1.AddArg(idx) 29525 v1.AddArg(mem) 29526 v0.AddArg(v1) 29527 return true 29528 } 29529 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 29530 // 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) 29531 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29532 for { 29533 _ = v.Args[1] 29534 sh := v.Args[0] 29535 if sh.Op != OpS390XSLDconst { 29536 break 29537 } 29538 if sh.AuxInt != 8 { 29539 break 29540 } 29541 x1 := sh.Args[0] 29542 if x1.Op != OpS390XMOVBZloadidx { 29543 break 29544 } 29545 i1 := x1.AuxInt 29546 s := x1.Aux 29547 _ = x1.Args[2] 29548 p := x1.Args[0] 29549 idx := x1.Args[1] 29550 mem := x1.Args[2] 29551 x0 := v.Args[1] 29552 if x0.Op != OpS390XMOVBZloadidx { 29553 break 29554 } 29555 i0 := x0.AuxInt 29556 if x0.Aux != s { 29557 break 29558 } 29559 _ = x0.Args[2] 29560 if idx != x0.Args[0] { 29561 break 29562 } 29563 if p != x0.Args[1] { 29564 break 29565 } 29566 if mem != x0.Args[2] { 29567 break 29568 } 29569 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)) { 29570 break 29571 } 29572 b = mergePoint(b, x0, x1) 29573 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29574 v.reset(OpCopy) 29575 v.AddArg(v0) 29576 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29577 v1.AuxInt = i0 29578 v1.Aux = s 29579 v1.AddArg(p) 29580 v1.AddArg(idx) 29581 v1.AddArg(mem) 29582 v0.AddArg(v1) 29583 return true 29584 } 29585 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 29586 // 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) 29587 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 29588 for { 29589 _ = v.Args[1] 29590 sh := v.Args[0] 29591 if sh.Op != OpS390XSLDconst { 29592 break 29593 } 29594 if sh.AuxInt != 8 { 29595 break 29596 } 29597 x1 := sh.Args[0] 29598 if x1.Op != OpS390XMOVBZloadidx { 29599 break 29600 } 29601 i1 := x1.AuxInt 29602 s := x1.Aux 29603 _ = x1.Args[2] 29604 idx := x1.Args[0] 29605 p := x1.Args[1] 29606 mem := x1.Args[2] 29607 x0 := v.Args[1] 29608 if x0.Op != OpS390XMOVBZloadidx { 29609 break 29610 } 29611 i0 := x0.AuxInt 29612 if x0.Aux != s { 29613 break 29614 } 29615 _ = x0.Args[2] 29616 if idx != x0.Args[0] { 29617 break 29618 } 29619 if p != x0.Args[1] { 29620 break 29621 } 29622 if mem != x0.Args[2] { 29623 break 29624 } 29625 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)) { 29626 break 29627 } 29628 b = mergePoint(b, x0, x1) 29629 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29630 v.reset(OpCopy) 29631 v.AddArg(v0) 29632 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29633 v1.AuxInt = i0 29634 v1.Aux = s 29635 v1.AddArg(p) 29636 v1.AddArg(idx) 29637 v1.AddArg(mem) 29638 v0.AddArg(v1) 29639 return true 29640 } 29641 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 29642 // 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) 29643 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29644 for { 29645 _ = v.Args[1] 29646 r0 := v.Args[0] 29647 if r0.Op != OpS390XMOVHZreg { 29648 break 29649 } 29650 x0 := r0.Args[0] 29651 if x0.Op != OpS390XMOVHBRloadidx { 29652 break 29653 } 29654 i0 := x0.AuxInt 29655 s := x0.Aux 29656 _ = x0.Args[2] 29657 p := x0.Args[0] 29658 idx := x0.Args[1] 29659 mem := x0.Args[2] 29660 sh := v.Args[1] 29661 if sh.Op != OpS390XSLDconst { 29662 break 29663 } 29664 if sh.AuxInt != 16 { 29665 break 29666 } 29667 r1 := sh.Args[0] 29668 if r1.Op != OpS390XMOVHZreg { 29669 break 29670 } 29671 x1 := r1.Args[0] 29672 if x1.Op != OpS390XMOVHBRloadidx { 29673 break 29674 } 29675 i1 := x1.AuxInt 29676 if x1.Aux != s { 29677 break 29678 } 29679 _ = x1.Args[2] 29680 if p != x1.Args[0] { 29681 break 29682 } 29683 if idx != x1.Args[1] { 29684 break 29685 } 29686 if mem != x1.Args[2] { 29687 break 29688 } 29689 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)) { 29690 break 29691 } 29692 b = mergePoint(b, x0, x1) 29693 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29694 v.reset(OpCopy) 29695 v.AddArg(v0) 29696 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29697 v1.AuxInt = i0 29698 v1.Aux = s 29699 v1.AddArg(p) 29700 v1.AddArg(idx) 29701 v1.AddArg(mem) 29702 v0.AddArg(v1) 29703 return true 29704 } 29705 return false 29706 } 29707 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 29708 b := v.Block 29709 _ = b 29710 typ := &b.Func.Config.Types 29711 _ = typ 29712 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 29713 // 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) 29714 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29715 for { 29716 _ = v.Args[1] 29717 r0 := v.Args[0] 29718 if r0.Op != OpS390XMOVHZreg { 29719 break 29720 } 29721 x0 := r0.Args[0] 29722 if x0.Op != OpS390XMOVHBRloadidx { 29723 break 29724 } 29725 i0 := x0.AuxInt 29726 s := x0.Aux 29727 _ = x0.Args[2] 29728 idx := x0.Args[0] 29729 p := x0.Args[1] 29730 mem := x0.Args[2] 29731 sh := v.Args[1] 29732 if sh.Op != OpS390XSLDconst { 29733 break 29734 } 29735 if sh.AuxInt != 16 { 29736 break 29737 } 29738 r1 := sh.Args[0] 29739 if r1.Op != OpS390XMOVHZreg { 29740 break 29741 } 29742 x1 := r1.Args[0] 29743 if x1.Op != OpS390XMOVHBRloadidx { 29744 break 29745 } 29746 i1 := x1.AuxInt 29747 if x1.Aux != s { 29748 break 29749 } 29750 _ = x1.Args[2] 29751 if p != x1.Args[0] { 29752 break 29753 } 29754 if idx != x1.Args[1] { 29755 break 29756 } 29757 if mem != x1.Args[2] { 29758 break 29759 } 29760 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)) { 29761 break 29762 } 29763 b = mergePoint(b, x0, x1) 29764 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29765 v.reset(OpCopy) 29766 v.AddArg(v0) 29767 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29768 v1.AuxInt = i0 29769 v1.Aux = s 29770 v1.AddArg(p) 29771 v1.AddArg(idx) 29772 v1.AddArg(mem) 29773 v0.AddArg(v1) 29774 return true 29775 } 29776 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 29777 // 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) 29778 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29779 for { 29780 _ = v.Args[1] 29781 r0 := v.Args[0] 29782 if r0.Op != OpS390XMOVHZreg { 29783 break 29784 } 29785 x0 := r0.Args[0] 29786 if x0.Op != OpS390XMOVHBRloadidx { 29787 break 29788 } 29789 i0 := x0.AuxInt 29790 s := x0.Aux 29791 _ = x0.Args[2] 29792 p := x0.Args[0] 29793 idx := x0.Args[1] 29794 mem := x0.Args[2] 29795 sh := v.Args[1] 29796 if sh.Op != OpS390XSLDconst { 29797 break 29798 } 29799 if sh.AuxInt != 16 { 29800 break 29801 } 29802 r1 := sh.Args[0] 29803 if r1.Op != OpS390XMOVHZreg { 29804 break 29805 } 29806 x1 := r1.Args[0] 29807 if x1.Op != OpS390XMOVHBRloadidx { 29808 break 29809 } 29810 i1 := x1.AuxInt 29811 if x1.Aux != s { 29812 break 29813 } 29814 _ = x1.Args[2] 29815 if idx != x1.Args[0] { 29816 break 29817 } 29818 if p != x1.Args[1] { 29819 break 29820 } 29821 if mem != x1.Args[2] { 29822 break 29823 } 29824 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)) { 29825 break 29826 } 29827 b = mergePoint(b, x0, x1) 29828 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29829 v.reset(OpCopy) 29830 v.AddArg(v0) 29831 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29832 v1.AuxInt = i0 29833 v1.Aux = s 29834 v1.AddArg(p) 29835 v1.AddArg(idx) 29836 v1.AddArg(mem) 29837 v0.AddArg(v1) 29838 return true 29839 } 29840 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 29841 // 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) 29842 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29843 for { 29844 _ = v.Args[1] 29845 r0 := v.Args[0] 29846 if r0.Op != OpS390XMOVHZreg { 29847 break 29848 } 29849 x0 := r0.Args[0] 29850 if x0.Op != OpS390XMOVHBRloadidx { 29851 break 29852 } 29853 i0 := x0.AuxInt 29854 s := x0.Aux 29855 _ = x0.Args[2] 29856 idx := x0.Args[0] 29857 p := x0.Args[1] 29858 mem := x0.Args[2] 29859 sh := v.Args[1] 29860 if sh.Op != OpS390XSLDconst { 29861 break 29862 } 29863 if sh.AuxInt != 16 { 29864 break 29865 } 29866 r1 := sh.Args[0] 29867 if r1.Op != OpS390XMOVHZreg { 29868 break 29869 } 29870 x1 := r1.Args[0] 29871 if x1.Op != OpS390XMOVHBRloadidx { 29872 break 29873 } 29874 i1 := x1.AuxInt 29875 if x1.Aux != s { 29876 break 29877 } 29878 _ = x1.Args[2] 29879 if idx != x1.Args[0] { 29880 break 29881 } 29882 if p != x1.Args[1] { 29883 break 29884 } 29885 if mem != x1.Args[2] { 29886 break 29887 } 29888 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)) { 29889 break 29890 } 29891 b = mergePoint(b, x0, x1) 29892 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29893 v.reset(OpCopy) 29894 v.AddArg(v0) 29895 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29896 v1.AuxInt = i0 29897 v1.Aux = s 29898 v1.AddArg(p) 29899 v1.AddArg(idx) 29900 v1.AddArg(mem) 29901 v0.AddArg(v1) 29902 return true 29903 } 29904 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 29905 // 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) 29906 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29907 for { 29908 _ = v.Args[1] 29909 sh := v.Args[0] 29910 if sh.Op != OpS390XSLDconst { 29911 break 29912 } 29913 if sh.AuxInt != 16 { 29914 break 29915 } 29916 r1 := sh.Args[0] 29917 if r1.Op != OpS390XMOVHZreg { 29918 break 29919 } 29920 x1 := r1.Args[0] 29921 if x1.Op != OpS390XMOVHBRloadidx { 29922 break 29923 } 29924 i1 := x1.AuxInt 29925 s := x1.Aux 29926 _ = x1.Args[2] 29927 p := x1.Args[0] 29928 idx := x1.Args[1] 29929 mem := x1.Args[2] 29930 r0 := v.Args[1] 29931 if r0.Op != OpS390XMOVHZreg { 29932 break 29933 } 29934 x0 := r0.Args[0] 29935 if x0.Op != OpS390XMOVHBRloadidx { 29936 break 29937 } 29938 i0 := x0.AuxInt 29939 if x0.Aux != s { 29940 break 29941 } 29942 _ = x0.Args[2] 29943 if p != x0.Args[0] { 29944 break 29945 } 29946 if idx != x0.Args[1] { 29947 break 29948 } 29949 if mem != x0.Args[2] { 29950 break 29951 } 29952 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)) { 29953 break 29954 } 29955 b = mergePoint(b, x0, x1) 29956 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29957 v.reset(OpCopy) 29958 v.AddArg(v0) 29959 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29960 v1.AuxInt = i0 29961 v1.Aux = s 29962 v1.AddArg(p) 29963 v1.AddArg(idx) 29964 v1.AddArg(mem) 29965 v0.AddArg(v1) 29966 return true 29967 } 29968 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 29969 // 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) 29970 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 29971 for { 29972 _ = v.Args[1] 29973 sh := v.Args[0] 29974 if sh.Op != OpS390XSLDconst { 29975 break 29976 } 29977 if sh.AuxInt != 16 { 29978 break 29979 } 29980 r1 := sh.Args[0] 29981 if r1.Op != OpS390XMOVHZreg { 29982 break 29983 } 29984 x1 := r1.Args[0] 29985 if x1.Op != OpS390XMOVHBRloadidx { 29986 break 29987 } 29988 i1 := x1.AuxInt 29989 s := x1.Aux 29990 _ = x1.Args[2] 29991 idx := x1.Args[0] 29992 p := x1.Args[1] 29993 mem := x1.Args[2] 29994 r0 := v.Args[1] 29995 if r0.Op != OpS390XMOVHZreg { 29996 break 29997 } 29998 x0 := r0.Args[0] 29999 if x0.Op != OpS390XMOVHBRloadidx { 30000 break 30001 } 30002 i0 := x0.AuxInt 30003 if x0.Aux != s { 30004 break 30005 } 30006 _ = x0.Args[2] 30007 if p != x0.Args[0] { 30008 break 30009 } 30010 if idx != x0.Args[1] { 30011 break 30012 } 30013 if mem != x0.Args[2] { 30014 break 30015 } 30016 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)) { 30017 break 30018 } 30019 b = mergePoint(b, x0, x1) 30020 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30021 v.reset(OpCopy) 30022 v.AddArg(v0) 30023 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30024 v1.AuxInt = i0 30025 v1.Aux = s 30026 v1.AddArg(p) 30027 v1.AddArg(idx) 30028 v1.AddArg(mem) 30029 v0.AddArg(v1) 30030 return true 30031 } 30032 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 30033 // 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) 30034 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 30035 for { 30036 _ = v.Args[1] 30037 sh := v.Args[0] 30038 if sh.Op != OpS390XSLDconst { 30039 break 30040 } 30041 if sh.AuxInt != 16 { 30042 break 30043 } 30044 r1 := sh.Args[0] 30045 if r1.Op != OpS390XMOVHZreg { 30046 break 30047 } 30048 x1 := r1.Args[0] 30049 if x1.Op != OpS390XMOVHBRloadidx { 30050 break 30051 } 30052 i1 := x1.AuxInt 30053 s := x1.Aux 30054 _ = x1.Args[2] 30055 p := x1.Args[0] 30056 idx := x1.Args[1] 30057 mem := x1.Args[2] 30058 r0 := v.Args[1] 30059 if r0.Op != OpS390XMOVHZreg { 30060 break 30061 } 30062 x0 := r0.Args[0] 30063 if x0.Op != OpS390XMOVHBRloadidx { 30064 break 30065 } 30066 i0 := x0.AuxInt 30067 if x0.Aux != s { 30068 break 30069 } 30070 _ = x0.Args[2] 30071 if idx != x0.Args[0] { 30072 break 30073 } 30074 if p != x0.Args[1] { 30075 break 30076 } 30077 if mem != x0.Args[2] { 30078 break 30079 } 30080 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)) { 30081 break 30082 } 30083 b = mergePoint(b, x0, x1) 30084 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30085 v.reset(OpCopy) 30086 v.AddArg(v0) 30087 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30088 v1.AuxInt = i0 30089 v1.Aux = s 30090 v1.AddArg(p) 30091 v1.AddArg(idx) 30092 v1.AddArg(mem) 30093 v0.AddArg(v1) 30094 return true 30095 } 30096 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 30097 // 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) 30098 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 30099 for { 30100 _ = v.Args[1] 30101 sh := v.Args[0] 30102 if sh.Op != OpS390XSLDconst { 30103 break 30104 } 30105 if sh.AuxInt != 16 { 30106 break 30107 } 30108 r1 := sh.Args[0] 30109 if r1.Op != OpS390XMOVHZreg { 30110 break 30111 } 30112 x1 := r1.Args[0] 30113 if x1.Op != OpS390XMOVHBRloadidx { 30114 break 30115 } 30116 i1 := x1.AuxInt 30117 s := x1.Aux 30118 _ = x1.Args[2] 30119 idx := x1.Args[0] 30120 p := x1.Args[1] 30121 mem := x1.Args[2] 30122 r0 := v.Args[1] 30123 if r0.Op != OpS390XMOVHZreg { 30124 break 30125 } 30126 x0 := r0.Args[0] 30127 if x0.Op != OpS390XMOVHBRloadidx { 30128 break 30129 } 30130 i0 := x0.AuxInt 30131 if x0.Aux != s { 30132 break 30133 } 30134 _ = x0.Args[2] 30135 if idx != x0.Args[0] { 30136 break 30137 } 30138 if p != x0.Args[1] { 30139 break 30140 } 30141 if mem != x0.Args[2] { 30142 break 30143 } 30144 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)) { 30145 break 30146 } 30147 b = mergePoint(b, x0, x1) 30148 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30149 v.reset(OpCopy) 30150 v.AddArg(v0) 30151 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30152 v1.AuxInt = i0 30153 v1.Aux = s 30154 v1.AddArg(p) 30155 v1.AddArg(idx) 30156 v1.AddArg(mem) 30157 v0.AddArg(v1) 30158 return true 30159 } 30160 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 30161 // 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) 30162 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30163 for { 30164 _ = v.Args[1] 30165 r0 := v.Args[0] 30166 if r0.Op != OpS390XMOVWZreg { 30167 break 30168 } 30169 x0 := r0.Args[0] 30170 if x0.Op != OpS390XMOVWBRloadidx { 30171 break 30172 } 30173 i0 := x0.AuxInt 30174 s := x0.Aux 30175 _ = x0.Args[2] 30176 p := x0.Args[0] 30177 idx := x0.Args[1] 30178 mem := x0.Args[2] 30179 sh := v.Args[1] 30180 if sh.Op != OpS390XSLDconst { 30181 break 30182 } 30183 if sh.AuxInt != 32 { 30184 break 30185 } 30186 r1 := sh.Args[0] 30187 if r1.Op != OpS390XMOVWZreg { 30188 break 30189 } 30190 x1 := r1.Args[0] 30191 if x1.Op != OpS390XMOVWBRloadidx { 30192 break 30193 } 30194 i1 := x1.AuxInt 30195 if x1.Aux != s { 30196 break 30197 } 30198 _ = x1.Args[2] 30199 if p != x1.Args[0] { 30200 break 30201 } 30202 if idx != x1.Args[1] { 30203 break 30204 } 30205 if mem != x1.Args[2] { 30206 break 30207 } 30208 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)) { 30209 break 30210 } 30211 b = mergePoint(b, x0, x1) 30212 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30213 v.reset(OpCopy) 30214 v.AddArg(v0) 30215 v0.AuxInt = i0 30216 v0.Aux = s 30217 v0.AddArg(p) 30218 v0.AddArg(idx) 30219 v0.AddArg(mem) 30220 return true 30221 } 30222 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 30223 // 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) 30224 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30225 for { 30226 _ = v.Args[1] 30227 r0 := v.Args[0] 30228 if r0.Op != OpS390XMOVWZreg { 30229 break 30230 } 30231 x0 := r0.Args[0] 30232 if x0.Op != OpS390XMOVWBRloadidx { 30233 break 30234 } 30235 i0 := x0.AuxInt 30236 s := x0.Aux 30237 _ = x0.Args[2] 30238 idx := x0.Args[0] 30239 p := x0.Args[1] 30240 mem := x0.Args[2] 30241 sh := v.Args[1] 30242 if sh.Op != OpS390XSLDconst { 30243 break 30244 } 30245 if sh.AuxInt != 32 { 30246 break 30247 } 30248 r1 := sh.Args[0] 30249 if r1.Op != OpS390XMOVWZreg { 30250 break 30251 } 30252 x1 := r1.Args[0] 30253 if x1.Op != OpS390XMOVWBRloadidx { 30254 break 30255 } 30256 i1 := x1.AuxInt 30257 if x1.Aux != s { 30258 break 30259 } 30260 _ = x1.Args[2] 30261 if p != x1.Args[0] { 30262 break 30263 } 30264 if idx != x1.Args[1] { 30265 break 30266 } 30267 if mem != x1.Args[2] { 30268 break 30269 } 30270 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)) { 30271 break 30272 } 30273 b = mergePoint(b, x0, x1) 30274 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30275 v.reset(OpCopy) 30276 v.AddArg(v0) 30277 v0.AuxInt = i0 30278 v0.Aux = s 30279 v0.AddArg(p) 30280 v0.AddArg(idx) 30281 v0.AddArg(mem) 30282 return true 30283 } 30284 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 30285 // 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) 30286 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30287 for { 30288 _ = v.Args[1] 30289 r0 := v.Args[0] 30290 if r0.Op != OpS390XMOVWZreg { 30291 break 30292 } 30293 x0 := r0.Args[0] 30294 if x0.Op != OpS390XMOVWBRloadidx { 30295 break 30296 } 30297 i0 := x0.AuxInt 30298 s := x0.Aux 30299 _ = x0.Args[2] 30300 p := x0.Args[0] 30301 idx := x0.Args[1] 30302 mem := x0.Args[2] 30303 sh := v.Args[1] 30304 if sh.Op != OpS390XSLDconst { 30305 break 30306 } 30307 if sh.AuxInt != 32 { 30308 break 30309 } 30310 r1 := sh.Args[0] 30311 if r1.Op != OpS390XMOVWZreg { 30312 break 30313 } 30314 x1 := r1.Args[0] 30315 if x1.Op != OpS390XMOVWBRloadidx { 30316 break 30317 } 30318 i1 := x1.AuxInt 30319 if x1.Aux != s { 30320 break 30321 } 30322 _ = x1.Args[2] 30323 if idx != x1.Args[0] { 30324 break 30325 } 30326 if p != x1.Args[1] { 30327 break 30328 } 30329 if mem != x1.Args[2] { 30330 break 30331 } 30332 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)) { 30333 break 30334 } 30335 b = mergePoint(b, x0, x1) 30336 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30337 v.reset(OpCopy) 30338 v.AddArg(v0) 30339 v0.AuxInt = i0 30340 v0.Aux = s 30341 v0.AddArg(p) 30342 v0.AddArg(idx) 30343 v0.AddArg(mem) 30344 return true 30345 } 30346 return false 30347 } 30348 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 30349 b := v.Block 30350 _ = b 30351 typ := &b.Func.Config.Types 30352 _ = typ 30353 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 30354 // 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) 30355 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30356 for { 30357 _ = v.Args[1] 30358 r0 := v.Args[0] 30359 if r0.Op != OpS390XMOVWZreg { 30360 break 30361 } 30362 x0 := r0.Args[0] 30363 if x0.Op != OpS390XMOVWBRloadidx { 30364 break 30365 } 30366 i0 := x0.AuxInt 30367 s := x0.Aux 30368 _ = x0.Args[2] 30369 idx := x0.Args[0] 30370 p := x0.Args[1] 30371 mem := x0.Args[2] 30372 sh := v.Args[1] 30373 if sh.Op != OpS390XSLDconst { 30374 break 30375 } 30376 if sh.AuxInt != 32 { 30377 break 30378 } 30379 r1 := sh.Args[0] 30380 if r1.Op != OpS390XMOVWZreg { 30381 break 30382 } 30383 x1 := r1.Args[0] 30384 if x1.Op != OpS390XMOVWBRloadidx { 30385 break 30386 } 30387 i1 := x1.AuxInt 30388 if x1.Aux != s { 30389 break 30390 } 30391 _ = x1.Args[2] 30392 if idx != x1.Args[0] { 30393 break 30394 } 30395 if p != x1.Args[1] { 30396 break 30397 } 30398 if mem != x1.Args[2] { 30399 break 30400 } 30401 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)) { 30402 break 30403 } 30404 b = mergePoint(b, x0, x1) 30405 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30406 v.reset(OpCopy) 30407 v.AddArg(v0) 30408 v0.AuxInt = i0 30409 v0.Aux = s 30410 v0.AddArg(p) 30411 v0.AddArg(idx) 30412 v0.AddArg(mem) 30413 return true 30414 } 30415 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 30416 // 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) 30417 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30418 for { 30419 _ = v.Args[1] 30420 sh := v.Args[0] 30421 if sh.Op != OpS390XSLDconst { 30422 break 30423 } 30424 if sh.AuxInt != 32 { 30425 break 30426 } 30427 r1 := sh.Args[0] 30428 if r1.Op != OpS390XMOVWZreg { 30429 break 30430 } 30431 x1 := r1.Args[0] 30432 if x1.Op != OpS390XMOVWBRloadidx { 30433 break 30434 } 30435 i1 := x1.AuxInt 30436 s := x1.Aux 30437 _ = x1.Args[2] 30438 p := x1.Args[0] 30439 idx := x1.Args[1] 30440 mem := x1.Args[2] 30441 r0 := v.Args[1] 30442 if r0.Op != OpS390XMOVWZreg { 30443 break 30444 } 30445 x0 := r0.Args[0] 30446 if x0.Op != OpS390XMOVWBRloadidx { 30447 break 30448 } 30449 i0 := x0.AuxInt 30450 if x0.Aux != s { 30451 break 30452 } 30453 _ = x0.Args[2] 30454 if p != x0.Args[0] { 30455 break 30456 } 30457 if idx != x0.Args[1] { 30458 break 30459 } 30460 if mem != x0.Args[2] { 30461 break 30462 } 30463 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)) { 30464 break 30465 } 30466 b = mergePoint(b, x0, x1) 30467 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30468 v.reset(OpCopy) 30469 v.AddArg(v0) 30470 v0.AuxInt = i0 30471 v0.Aux = s 30472 v0.AddArg(p) 30473 v0.AddArg(idx) 30474 v0.AddArg(mem) 30475 return true 30476 } 30477 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 30478 // 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) 30479 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30480 for { 30481 _ = v.Args[1] 30482 sh := v.Args[0] 30483 if sh.Op != OpS390XSLDconst { 30484 break 30485 } 30486 if sh.AuxInt != 32 { 30487 break 30488 } 30489 r1 := sh.Args[0] 30490 if r1.Op != OpS390XMOVWZreg { 30491 break 30492 } 30493 x1 := r1.Args[0] 30494 if x1.Op != OpS390XMOVWBRloadidx { 30495 break 30496 } 30497 i1 := x1.AuxInt 30498 s := x1.Aux 30499 _ = x1.Args[2] 30500 idx := x1.Args[0] 30501 p := x1.Args[1] 30502 mem := x1.Args[2] 30503 r0 := v.Args[1] 30504 if r0.Op != OpS390XMOVWZreg { 30505 break 30506 } 30507 x0 := r0.Args[0] 30508 if x0.Op != OpS390XMOVWBRloadidx { 30509 break 30510 } 30511 i0 := x0.AuxInt 30512 if x0.Aux != s { 30513 break 30514 } 30515 _ = x0.Args[2] 30516 if p != x0.Args[0] { 30517 break 30518 } 30519 if idx != x0.Args[1] { 30520 break 30521 } 30522 if mem != x0.Args[2] { 30523 break 30524 } 30525 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)) { 30526 break 30527 } 30528 b = mergePoint(b, x0, x1) 30529 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30530 v.reset(OpCopy) 30531 v.AddArg(v0) 30532 v0.AuxInt = i0 30533 v0.Aux = s 30534 v0.AddArg(p) 30535 v0.AddArg(idx) 30536 v0.AddArg(mem) 30537 return true 30538 } 30539 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 30540 // 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) 30541 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30542 for { 30543 _ = v.Args[1] 30544 sh := v.Args[0] 30545 if sh.Op != OpS390XSLDconst { 30546 break 30547 } 30548 if sh.AuxInt != 32 { 30549 break 30550 } 30551 r1 := sh.Args[0] 30552 if r1.Op != OpS390XMOVWZreg { 30553 break 30554 } 30555 x1 := r1.Args[0] 30556 if x1.Op != OpS390XMOVWBRloadidx { 30557 break 30558 } 30559 i1 := x1.AuxInt 30560 s := x1.Aux 30561 _ = x1.Args[2] 30562 p := x1.Args[0] 30563 idx := x1.Args[1] 30564 mem := x1.Args[2] 30565 r0 := v.Args[1] 30566 if r0.Op != OpS390XMOVWZreg { 30567 break 30568 } 30569 x0 := r0.Args[0] 30570 if x0.Op != OpS390XMOVWBRloadidx { 30571 break 30572 } 30573 i0 := x0.AuxInt 30574 if x0.Aux != s { 30575 break 30576 } 30577 _ = x0.Args[2] 30578 if idx != x0.Args[0] { 30579 break 30580 } 30581 if p != x0.Args[1] { 30582 break 30583 } 30584 if mem != x0.Args[2] { 30585 break 30586 } 30587 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)) { 30588 break 30589 } 30590 b = mergePoint(b, x0, x1) 30591 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30592 v.reset(OpCopy) 30593 v.AddArg(v0) 30594 v0.AuxInt = i0 30595 v0.Aux = s 30596 v0.AddArg(p) 30597 v0.AddArg(idx) 30598 v0.AddArg(mem) 30599 return true 30600 } 30601 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 30602 // 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) 30603 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 30604 for { 30605 _ = v.Args[1] 30606 sh := v.Args[0] 30607 if sh.Op != OpS390XSLDconst { 30608 break 30609 } 30610 if sh.AuxInt != 32 { 30611 break 30612 } 30613 r1 := sh.Args[0] 30614 if r1.Op != OpS390XMOVWZreg { 30615 break 30616 } 30617 x1 := r1.Args[0] 30618 if x1.Op != OpS390XMOVWBRloadidx { 30619 break 30620 } 30621 i1 := x1.AuxInt 30622 s := x1.Aux 30623 _ = x1.Args[2] 30624 idx := x1.Args[0] 30625 p := x1.Args[1] 30626 mem := x1.Args[2] 30627 r0 := v.Args[1] 30628 if r0.Op != OpS390XMOVWZreg { 30629 break 30630 } 30631 x0 := r0.Args[0] 30632 if x0.Op != OpS390XMOVWBRloadidx { 30633 break 30634 } 30635 i0 := x0.AuxInt 30636 if x0.Aux != s { 30637 break 30638 } 30639 _ = x0.Args[2] 30640 if idx != x0.Args[0] { 30641 break 30642 } 30643 if p != x0.Args[1] { 30644 break 30645 } 30646 if mem != x0.Args[2] { 30647 break 30648 } 30649 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)) { 30650 break 30651 } 30652 b = mergePoint(b, x0, x1) 30653 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 30654 v.reset(OpCopy) 30655 v.AddArg(v0) 30656 v0.AuxInt = i0 30657 v0.Aux = s 30658 v0.AddArg(p) 30659 v0.AddArg(idx) 30660 v0.AddArg(mem) 30661 return true 30662 } 30663 // 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)) 30664 // 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) 30665 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30666 for { 30667 _ = v.Args[1] 30668 s1 := v.Args[0] 30669 if s1.Op != OpS390XSLDconst { 30670 break 30671 } 30672 j1 := s1.AuxInt 30673 x1 := s1.Args[0] 30674 if x1.Op != OpS390XMOVBZloadidx { 30675 break 30676 } 30677 i1 := x1.AuxInt 30678 s := x1.Aux 30679 _ = x1.Args[2] 30680 p := x1.Args[0] 30681 idx := x1.Args[1] 30682 mem := x1.Args[2] 30683 or := v.Args[1] 30684 if or.Op != OpS390XOR { 30685 break 30686 } 30687 _ = or.Args[1] 30688 s0 := or.Args[0] 30689 if s0.Op != OpS390XSLDconst { 30690 break 30691 } 30692 j0 := s0.AuxInt 30693 x0 := s0.Args[0] 30694 if x0.Op != OpS390XMOVBZloadidx { 30695 break 30696 } 30697 i0 := x0.AuxInt 30698 if x0.Aux != s { 30699 break 30700 } 30701 _ = x0.Args[2] 30702 if p != x0.Args[0] { 30703 break 30704 } 30705 if idx != x0.Args[1] { 30706 break 30707 } 30708 if mem != x0.Args[2] { 30709 break 30710 } 30711 y := or.Args[1] 30712 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)) { 30713 break 30714 } 30715 b = mergePoint(b, x0, x1) 30716 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30717 v.reset(OpCopy) 30718 v.AddArg(v0) 30719 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30720 v1.AuxInt = j0 30721 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30722 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30723 v3.AuxInt = i0 30724 v3.Aux = s 30725 v3.AddArg(p) 30726 v3.AddArg(idx) 30727 v3.AddArg(mem) 30728 v2.AddArg(v3) 30729 v1.AddArg(v2) 30730 v0.AddArg(v1) 30731 v0.AddArg(y) 30732 return true 30733 } 30734 // 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)) 30735 // 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) 30736 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30737 for { 30738 _ = v.Args[1] 30739 s1 := v.Args[0] 30740 if s1.Op != OpS390XSLDconst { 30741 break 30742 } 30743 j1 := s1.AuxInt 30744 x1 := s1.Args[0] 30745 if x1.Op != OpS390XMOVBZloadidx { 30746 break 30747 } 30748 i1 := x1.AuxInt 30749 s := x1.Aux 30750 _ = x1.Args[2] 30751 idx := x1.Args[0] 30752 p := x1.Args[1] 30753 mem := x1.Args[2] 30754 or := v.Args[1] 30755 if or.Op != OpS390XOR { 30756 break 30757 } 30758 _ = or.Args[1] 30759 s0 := or.Args[0] 30760 if s0.Op != OpS390XSLDconst { 30761 break 30762 } 30763 j0 := s0.AuxInt 30764 x0 := s0.Args[0] 30765 if x0.Op != OpS390XMOVBZloadidx { 30766 break 30767 } 30768 i0 := x0.AuxInt 30769 if x0.Aux != s { 30770 break 30771 } 30772 _ = x0.Args[2] 30773 if p != x0.Args[0] { 30774 break 30775 } 30776 if idx != x0.Args[1] { 30777 break 30778 } 30779 if mem != x0.Args[2] { 30780 break 30781 } 30782 y := or.Args[1] 30783 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)) { 30784 break 30785 } 30786 b = mergePoint(b, x0, x1) 30787 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30788 v.reset(OpCopy) 30789 v.AddArg(v0) 30790 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30791 v1.AuxInt = j0 30792 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30793 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30794 v3.AuxInt = i0 30795 v3.Aux = s 30796 v3.AddArg(p) 30797 v3.AddArg(idx) 30798 v3.AddArg(mem) 30799 v2.AddArg(v3) 30800 v1.AddArg(v2) 30801 v0.AddArg(v1) 30802 v0.AddArg(y) 30803 return true 30804 } 30805 // 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)) 30806 // 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) 30807 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30808 for { 30809 _ = v.Args[1] 30810 s1 := v.Args[0] 30811 if s1.Op != OpS390XSLDconst { 30812 break 30813 } 30814 j1 := s1.AuxInt 30815 x1 := s1.Args[0] 30816 if x1.Op != OpS390XMOVBZloadidx { 30817 break 30818 } 30819 i1 := x1.AuxInt 30820 s := x1.Aux 30821 _ = x1.Args[2] 30822 p := x1.Args[0] 30823 idx := x1.Args[1] 30824 mem := x1.Args[2] 30825 or := v.Args[1] 30826 if or.Op != OpS390XOR { 30827 break 30828 } 30829 _ = or.Args[1] 30830 s0 := or.Args[0] 30831 if s0.Op != OpS390XSLDconst { 30832 break 30833 } 30834 j0 := s0.AuxInt 30835 x0 := s0.Args[0] 30836 if x0.Op != OpS390XMOVBZloadidx { 30837 break 30838 } 30839 i0 := x0.AuxInt 30840 if x0.Aux != s { 30841 break 30842 } 30843 _ = x0.Args[2] 30844 if idx != x0.Args[0] { 30845 break 30846 } 30847 if p != x0.Args[1] { 30848 break 30849 } 30850 if mem != x0.Args[2] { 30851 break 30852 } 30853 y := or.Args[1] 30854 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)) { 30855 break 30856 } 30857 b = mergePoint(b, x0, x1) 30858 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30859 v.reset(OpCopy) 30860 v.AddArg(v0) 30861 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30862 v1.AuxInt = j0 30863 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30864 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30865 v3.AuxInt = i0 30866 v3.Aux = s 30867 v3.AddArg(p) 30868 v3.AddArg(idx) 30869 v3.AddArg(mem) 30870 v2.AddArg(v3) 30871 v1.AddArg(v2) 30872 v0.AddArg(v1) 30873 v0.AddArg(y) 30874 return true 30875 } 30876 // 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)) 30877 // 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) 30878 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30879 for { 30880 _ = v.Args[1] 30881 s1 := v.Args[0] 30882 if s1.Op != OpS390XSLDconst { 30883 break 30884 } 30885 j1 := s1.AuxInt 30886 x1 := s1.Args[0] 30887 if x1.Op != OpS390XMOVBZloadidx { 30888 break 30889 } 30890 i1 := x1.AuxInt 30891 s := x1.Aux 30892 _ = x1.Args[2] 30893 idx := x1.Args[0] 30894 p := x1.Args[1] 30895 mem := x1.Args[2] 30896 or := v.Args[1] 30897 if or.Op != OpS390XOR { 30898 break 30899 } 30900 _ = or.Args[1] 30901 s0 := or.Args[0] 30902 if s0.Op != OpS390XSLDconst { 30903 break 30904 } 30905 j0 := s0.AuxInt 30906 x0 := s0.Args[0] 30907 if x0.Op != OpS390XMOVBZloadidx { 30908 break 30909 } 30910 i0 := x0.AuxInt 30911 if x0.Aux != s { 30912 break 30913 } 30914 _ = x0.Args[2] 30915 if idx != x0.Args[0] { 30916 break 30917 } 30918 if p != x0.Args[1] { 30919 break 30920 } 30921 if mem != x0.Args[2] { 30922 break 30923 } 30924 y := or.Args[1] 30925 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)) { 30926 break 30927 } 30928 b = mergePoint(b, x0, x1) 30929 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30930 v.reset(OpCopy) 30931 v.AddArg(v0) 30932 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30933 v1.AuxInt = j0 30934 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30935 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30936 v3.AuxInt = i0 30937 v3.Aux = s 30938 v3.AddArg(p) 30939 v3.AddArg(idx) 30940 v3.AddArg(mem) 30941 v2.AddArg(v3) 30942 v1.AddArg(v2) 30943 v0.AddArg(v1) 30944 v0.AddArg(y) 30945 return true 30946 } 30947 // 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)))) 30948 // 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) 30949 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30950 for { 30951 _ = v.Args[1] 30952 s1 := v.Args[0] 30953 if s1.Op != OpS390XSLDconst { 30954 break 30955 } 30956 j1 := s1.AuxInt 30957 x1 := s1.Args[0] 30958 if x1.Op != OpS390XMOVBZloadidx { 30959 break 30960 } 30961 i1 := x1.AuxInt 30962 s := x1.Aux 30963 _ = x1.Args[2] 30964 p := x1.Args[0] 30965 idx := x1.Args[1] 30966 mem := x1.Args[2] 30967 or := v.Args[1] 30968 if or.Op != OpS390XOR { 30969 break 30970 } 30971 _ = or.Args[1] 30972 y := or.Args[0] 30973 s0 := or.Args[1] 30974 if s0.Op != OpS390XSLDconst { 30975 break 30976 } 30977 j0 := s0.AuxInt 30978 x0 := s0.Args[0] 30979 if x0.Op != OpS390XMOVBZloadidx { 30980 break 30981 } 30982 i0 := x0.AuxInt 30983 if x0.Aux != s { 30984 break 30985 } 30986 _ = x0.Args[2] 30987 if p != x0.Args[0] { 30988 break 30989 } 30990 if idx != x0.Args[1] { 30991 break 30992 } 30993 if mem != x0.Args[2] { 30994 break 30995 } 30996 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)) { 30997 break 30998 } 30999 b = mergePoint(b, x0, x1) 31000 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31001 v.reset(OpCopy) 31002 v.AddArg(v0) 31003 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31004 v1.AuxInt = j0 31005 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31006 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31007 v3.AuxInt = i0 31008 v3.Aux = s 31009 v3.AddArg(p) 31010 v3.AddArg(idx) 31011 v3.AddArg(mem) 31012 v2.AddArg(v3) 31013 v1.AddArg(v2) 31014 v0.AddArg(v1) 31015 v0.AddArg(y) 31016 return true 31017 } 31018 return false 31019 } 31020 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 31021 b := v.Block 31022 _ = b 31023 typ := &b.Func.Config.Types 31024 _ = typ 31025 // 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)))) 31026 // 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) 31027 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31028 for { 31029 _ = v.Args[1] 31030 s1 := v.Args[0] 31031 if s1.Op != OpS390XSLDconst { 31032 break 31033 } 31034 j1 := s1.AuxInt 31035 x1 := s1.Args[0] 31036 if x1.Op != OpS390XMOVBZloadidx { 31037 break 31038 } 31039 i1 := x1.AuxInt 31040 s := x1.Aux 31041 _ = x1.Args[2] 31042 idx := x1.Args[0] 31043 p := x1.Args[1] 31044 mem := x1.Args[2] 31045 or := v.Args[1] 31046 if or.Op != OpS390XOR { 31047 break 31048 } 31049 _ = or.Args[1] 31050 y := or.Args[0] 31051 s0 := or.Args[1] 31052 if s0.Op != OpS390XSLDconst { 31053 break 31054 } 31055 j0 := s0.AuxInt 31056 x0 := s0.Args[0] 31057 if x0.Op != OpS390XMOVBZloadidx { 31058 break 31059 } 31060 i0 := x0.AuxInt 31061 if x0.Aux != s { 31062 break 31063 } 31064 _ = x0.Args[2] 31065 if p != x0.Args[0] { 31066 break 31067 } 31068 if idx != x0.Args[1] { 31069 break 31070 } 31071 if mem != x0.Args[2] { 31072 break 31073 } 31074 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)) { 31075 break 31076 } 31077 b = mergePoint(b, x0, x1) 31078 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31079 v.reset(OpCopy) 31080 v.AddArg(v0) 31081 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31082 v1.AuxInt = j0 31083 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31084 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31085 v3.AuxInt = i0 31086 v3.Aux = s 31087 v3.AddArg(p) 31088 v3.AddArg(idx) 31089 v3.AddArg(mem) 31090 v2.AddArg(v3) 31091 v1.AddArg(v2) 31092 v0.AddArg(v1) 31093 v0.AddArg(y) 31094 return true 31095 } 31096 // 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)))) 31097 // 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) 31098 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31099 for { 31100 _ = v.Args[1] 31101 s1 := v.Args[0] 31102 if s1.Op != OpS390XSLDconst { 31103 break 31104 } 31105 j1 := s1.AuxInt 31106 x1 := s1.Args[0] 31107 if x1.Op != OpS390XMOVBZloadidx { 31108 break 31109 } 31110 i1 := x1.AuxInt 31111 s := x1.Aux 31112 _ = x1.Args[2] 31113 p := x1.Args[0] 31114 idx := x1.Args[1] 31115 mem := x1.Args[2] 31116 or := v.Args[1] 31117 if or.Op != OpS390XOR { 31118 break 31119 } 31120 _ = or.Args[1] 31121 y := or.Args[0] 31122 s0 := or.Args[1] 31123 if s0.Op != OpS390XSLDconst { 31124 break 31125 } 31126 j0 := s0.AuxInt 31127 x0 := s0.Args[0] 31128 if x0.Op != OpS390XMOVBZloadidx { 31129 break 31130 } 31131 i0 := x0.AuxInt 31132 if x0.Aux != s { 31133 break 31134 } 31135 _ = x0.Args[2] 31136 if idx != x0.Args[0] { 31137 break 31138 } 31139 if p != x0.Args[1] { 31140 break 31141 } 31142 if mem != x0.Args[2] { 31143 break 31144 } 31145 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)) { 31146 break 31147 } 31148 b = mergePoint(b, x0, x1) 31149 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31150 v.reset(OpCopy) 31151 v.AddArg(v0) 31152 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31153 v1.AuxInt = j0 31154 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31155 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31156 v3.AuxInt = i0 31157 v3.Aux = s 31158 v3.AddArg(p) 31159 v3.AddArg(idx) 31160 v3.AddArg(mem) 31161 v2.AddArg(v3) 31162 v1.AddArg(v2) 31163 v0.AddArg(v1) 31164 v0.AddArg(y) 31165 return true 31166 } 31167 // 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)))) 31168 // 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) 31169 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31170 for { 31171 _ = v.Args[1] 31172 s1 := v.Args[0] 31173 if s1.Op != OpS390XSLDconst { 31174 break 31175 } 31176 j1 := s1.AuxInt 31177 x1 := s1.Args[0] 31178 if x1.Op != OpS390XMOVBZloadidx { 31179 break 31180 } 31181 i1 := x1.AuxInt 31182 s := x1.Aux 31183 _ = x1.Args[2] 31184 idx := x1.Args[0] 31185 p := x1.Args[1] 31186 mem := x1.Args[2] 31187 or := v.Args[1] 31188 if or.Op != OpS390XOR { 31189 break 31190 } 31191 _ = or.Args[1] 31192 y := or.Args[0] 31193 s0 := or.Args[1] 31194 if s0.Op != OpS390XSLDconst { 31195 break 31196 } 31197 j0 := s0.AuxInt 31198 x0 := s0.Args[0] 31199 if x0.Op != OpS390XMOVBZloadidx { 31200 break 31201 } 31202 i0 := x0.AuxInt 31203 if x0.Aux != s { 31204 break 31205 } 31206 _ = x0.Args[2] 31207 if idx != x0.Args[0] { 31208 break 31209 } 31210 if p != x0.Args[1] { 31211 break 31212 } 31213 if mem != x0.Args[2] { 31214 break 31215 } 31216 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)) { 31217 break 31218 } 31219 b = mergePoint(b, x0, x1) 31220 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31221 v.reset(OpCopy) 31222 v.AddArg(v0) 31223 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31224 v1.AuxInt = j0 31225 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31226 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31227 v3.AuxInt = i0 31228 v3.Aux = s 31229 v3.AddArg(p) 31230 v3.AddArg(idx) 31231 v3.AddArg(mem) 31232 v2.AddArg(v3) 31233 v1.AddArg(v2) 31234 v0.AddArg(v1) 31235 v0.AddArg(y) 31236 return true 31237 } 31238 // 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))) 31239 // 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) 31240 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31241 for { 31242 _ = v.Args[1] 31243 or := v.Args[0] 31244 if or.Op != OpS390XOR { 31245 break 31246 } 31247 _ = or.Args[1] 31248 s0 := or.Args[0] 31249 if s0.Op != OpS390XSLDconst { 31250 break 31251 } 31252 j0 := s0.AuxInt 31253 x0 := s0.Args[0] 31254 if x0.Op != OpS390XMOVBZloadidx { 31255 break 31256 } 31257 i0 := x0.AuxInt 31258 s := x0.Aux 31259 _ = x0.Args[2] 31260 p := x0.Args[0] 31261 idx := x0.Args[1] 31262 mem := x0.Args[2] 31263 y := or.Args[1] 31264 s1 := v.Args[1] 31265 if s1.Op != OpS390XSLDconst { 31266 break 31267 } 31268 j1 := s1.AuxInt 31269 x1 := s1.Args[0] 31270 if x1.Op != OpS390XMOVBZloadidx { 31271 break 31272 } 31273 i1 := x1.AuxInt 31274 if x1.Aux != s { 31275 break 31276 } 31277 _ = x1.Args[2] 31278 if p != x1.Args[0] { 31279 break 31280 } 31281 if idx != x1.Args[1] { 31282 break 31283 } 31284 if mem != x1.Args[2] { 31285 break 31286 } 31287 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)) { 31288 break 31289 } 31290 b = mergePoint(b, x0, x1) 31291 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31292 v.reset(OpCopy) 31293 v.AddArg(v0) 31294 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31295 v1.AuxInt = j0 31296 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31297 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31298 v3.AuxInt = i0 31299 v3.Aux = s 31300 v3.AddArg(p) 31301 v3.AddArg(idx) 31302 v3.AddArg(mem) 31303 v2.AddArg(v3) 31304 v1.AddArg(v2) 31305 v0.AddArg(v1) 31306 v0.AddArg(y) 31307 return true 31308 } 31309 // 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))) 31310 // 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) 31311 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31312 for { 31313 _ = v.Args[1] 31314 or := v.Args[0] 31315 if or.Op != OpS390XOR { 31316 break 31317 } 31318 _ = or.Args[1] 31319 s0 := or.Args[0] 31320 if s0.Op != OpS390XSLDconst { 31321 break 31322 } 31323 j0 := s0.AuxInt 31324 x0 := s0.Args[0] 31325 if x0.Op != OpS390XMOVBZloadidx { 31326 break 31327 } 31328 i0 := x0.AuxInt 31329 s := x0.Aux 31330 _ = x0.Args[2] 31331 idx := x0.Args[0] 31332 p := x0.Args[1] 31333 mem := x0.Args[2] 31334 y := or.Args[1] 31335 s1 := v.Args[1] 31336 if s1.Op != OpS390XSLDconst { 31337 break 31338 } 31339 j1 := s1.AuxInt 31340 x1 := s1.Args[0] 31341 if x1.Op != OpS390XMOVBZloadidx { 31342 break 31343 } 31344 i1 := x1.AuxInt 31345 if x1.Aux != s { 31346 break 31347 } 31348 _ = x1.Args[2] 31349 if p != x1.Args[0] { 31350 break 31351 } 31352 if idx != x1.Args[1] { 31353 break 31354 } 31355 if mem != x1.Args[2] { 31356 break 31357 } 31358 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)) { 31359 break 31360 } 31361 b = mergePoint(b, x0, x1) 31362 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31363 v.reset(OpCopy) 31364 v.AddArg(v0) 31365 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31366 v1.AuxInt = j0 31367 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31368 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31369 v3.AuxInt = i0 31370 v3.Aux = s 31371 v3.AddArg(p) 31372 v3.AddArg(idx) 31373 v3.AddArg(mem) 31374 v2.AddArg(v3) 31375 v1.AddArg(v2) 31376 v0.AddArg(v1) 31377 v0.AddArg(y) 31378 return true 31379 } 31380 // 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))) 31381 // 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) 31382 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31383 for { 31384 _ = v.Args[1] 31385 or := v.Args[0] 31386 if or.Op != OpS390XOR { 31387 break 31388 } 31389 _ = or.Args[1] 31390 y := or.Args[0] 31391 s0 := or.Args[1] 31392 if s0.Op != OpS390XSLDconst { 31393 break 31394 } 31395 j0 := s0.AuxInt 31396 x0 := s0.Args[0] 31397 if x0.Op != OpS390XMOVBZloadidx { 31398 break 31399 } 31400 i0 := x0.AuxInt 31401 s := x0.Aux 31402 _ = x0.Args[2] 31403 p := x0.Args[0] 31404 idx := x0.Args[1] 31405 mem := x0.Args[2] 31406 s1 := v.Args[1] 31407 if s1.Op != OpS390XSLDconst { 31408 break 31409 } 31410 j1 := s1.AuxInt 31411 x1 := s1.Args[0] 31412 if x1.Op != OpS390XMOVBZloadidx { 31413 break 31414 } 31415 i1 := x1.AuxInt 31416 if x1.Aux != s { 31417 break 31418 } 31419 _ = x1.Args[2] 31420 if p != x1.Args[0] { 31421 break 31422 } 31423 if idx != x1.Args[1] { 31424 break 31425 } 31426 if mem != x1.Args[2] { 31427 break 31428 } 31429 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)) { 31430 break 31431 } 31432 b = mergePoint(b, x0, x1) 31433 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31434 v.reset(OpCopy) 31435 v.AddArg(v0) 31436 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31437 v1.AuxInt = j0 31438 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31439 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31440 v3.AuxInt = i0 31441 v3.Aux = s 31442 v3.AddArg(p) 31443 v3.AddArg(idx) 31444 v3.AddArg(mem) 31445 v2.AddArg(v3) 31446 v1.AddArg(v2) 31447 v0.AddArg(v1) 31448 v0.AddArg(y) 31449 return true 31450 } 31451 // 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))) 31452 // 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) 31453 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31454 for { 31455 _ = v.Args[1] 31456 or := v.Args[0] 31457 if or.Op != OpS390XOR { 31458 break 31459 } 31460 _ = or.Args[1] 31461 y := or.Args[0] 31462 s0 := or.Args[1] 31463 if s0.Op != OpS390XSLDconst { 31464 break 31465 } 31466 j0 := s0.AuxInt 31467 x0 := s0.Args[0] 31468 if x0.Op != OpS390XMOVBZloadidx { 31469 break 31470 } 31471 i0 := x0.AuxInt 31472 s := x0.Aux 31473 _ = x0.Args[2] 31474 idx := x0.Args[0] 31475 p := x0.Args[1] 31476 mem := x0.Args[2] 31477 s1 := v.Args[1] 31478 if s1.Op != OpS390XSLDconst { 31479 break 31480 } 31481 j1 := s1.AuxInt 31482 x1 := s1.Args[0] 31483 if x1.Op != OpS390XMOVBZloadidx { 31484 break 31485 } 31486 i1 := x1.AuxInt 31487 if x1.Aux != s { 31488 break 31489 } 31490 _ = x1.Args[2] 31491 if p != x1.Args[0] { 31492 break 31493 } 31494 if idx != x1.Args[1] { 31495 break 31496 } 31497 if mem != x1.Args[2] { 31498 break 31499 } 31500 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)) { 31501 break 31502 } 31503 b = mergePoint(b, x0, x1) 31504 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31505 v.reset(OpCopy) 31506 v.AddArg(v0) 31507 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31508 v1.AuxInt = j0 31509 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31510 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31511 v3.AuxInt = i0 31512 v3.Aux = s 31513 v3.AddArg(p) 31514 v3.AddArg(idx) 31515 v3.AddArg(mem) 31516 v2.AddArg(v3) 31517 v1.AddArg(v2) 31518 v0.AddArg(v1) 31519 v0.AddArg(y) 31520 return true 31521 } 31522 // 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))) 31523 // 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) 31524 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31525 for { 31526 _ = v.Args[1] 31527 or := v.Args[0] 31528 if or.Op != OpS390XOR { 31529 break 31530 } 31531 _ = or.Args[1] 31532 s0 := or.Args[0] 31533 if s0.Op != OpS390XSLDconst { 31534 break 31535 } 31536 j0 := s0.AuxInt 31537 x0 := s0.Args[0] 31538 if x0.Op != OpS390XMOVBZloadidx { 31539 break 31540 } 31541 i0 := x0.AuxInt 31542 s := x0.Aux 31543 _ = x0.Args[2] 31544 p := x0.Args[0] 31545 idx := x0.Args[1] 31546 mem := x0.Args[2] 31547 y := or.Args[1] 31548 s1 := v.Args[1] 31549 if s1.Op != OpS390XSLDconst { 31550 break 31551 } 31552 j1 := s1.AuxInt 31553 x1 := s1.Args[0] 31554 if x1.Op != OpS390XMOVBZloadidx { 31555 break 31556 } 31557 i1 := x1.AuxInt 31558 if x1.Aux != s { 31559 break 31560 } 31561 _ = x1.Args[2] 31562 if idx != x1.Args[0] { 31563 break 31564 } 31565 if p != x1.Args[1] { 31566 break 31567 } 31568 if mem != x1.Args[2] { 31569 break 31570 } 31571 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)) { 31572 break 31573 } 31574 b = mergePoint(b, x0, x1) 31575 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31576 v.reset(OpCopy) 31577 v.AddArg(v0) 31578 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31579 v1.AuxInt = j0 31580 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31581 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31582 v3.AuxInt = i0 31583 v3.Aux = s 31584 v3.AddArg(p) 31585 v3.AddArg(idx) 31586 v3.AddArg(mem) 31587 v2.AddArg(v3) 31588 v1.AddArg(v2) 31589 v0.AddArg(v1) 31590 v0.AddArg(y) 31591 return true 31592 } 31593 // 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))) 31594 // 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) 31595 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31596 for { 31597 _ = v.Args[1] 31598 or := v.Args[0] 31599 if or.Op != OpS390XOR { 31600 break 31601 } 31602 _ = or.Args[1] 31603 s0 := or.Args[0] 31604 if s0.Op != OpS390XSLDconst { 31605 break 31606 } 31607 j0 := s0.AuxInt 31608 x0 := s0.Args[0] 31609 if x0.Op != OpS390XMOVBZloadidx { 31610 break 31611 } 31612 i0 := x0.AuxInt 31613 s := x0.Aux 31614 _ = x0.Args[2] 31615 idx := x0.Args[0] 31616 p := x0.Args[1] 31617 mem := x0.Args[2] 31618 y := or.Args[1] 31619 s1 := v.Args[1] 31620 if s1.Op != OpS390XSLDconst { 31621 break 31622 } 31623 j1 := s1.AuxInt 31624 x1 := s1.Args[0] 31625 if x1.Op != OpS390XMOVBZloadidx { 31626 break 31627 } 31628 i1 := x1.AuxInt 31629 if x1.Aux != s { 31630 break 31631 } 31632 _ = x1.Args[2] 31633 if idx != x1.Args[0] { 31634 break 31635 } 31636 if p != x1.Args[1] { 31637 break 31638 } 31639 if mem != x1.Args[2] { 31640 break 31641 } 31642 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)) { 31643 break 31644 } 31645 b = mergePoint(b, x0, x1) 31646 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31647 v.reset(OpCopy) 31648 v.AddArg(v0) 31649 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31650 v1.AuxInt = j0 31651 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31652 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31653 v3.AuxInt = i0 31654 v3.Aux = s 31655 v3.AddArg(p) 31656 v3.AddArg(idx) 31657 v3.AddArg(mem) 31658 v2.AddArg(v3) 31659 v1.AddArg(v2) 31660 v0.AddArg(v1) 31661 v0.AddArg(y) 31662 return true 31663 } 31664 // 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))) 31665 // 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) 31666 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31667 for { 31668 _ = v.Args[1] 31669 or := v.Args[0] 31670 if or.Op != OpS390XOR { 31671 break 31672 } 31673 _ = or.Args[1] 31674 y := or.Args[0] 31675 s0 := or.Args[1] 31676 if s0.Op != OpS390XSLDconst { 31677 break 31678 } 31679 j0 := s0.AuxInt 31680 x0 := s0.Args[0] 31681 if x0.Op != OpS390XMOVBZloadidx { 31682 break 31683 } 31684 i0 := x0.AuxInt 31685 s := x0.Aux 31686 _ = x0.Args[2] 31687 p := x0.Args[0] 31688 idx := x0.Args[1] 31689 mem := x0.Args[2] 31690 s1 := v.Args[1] 31691 if s1.Op != OpS390XSLDconst { 31692 break 31693 } 31694 j1 := s1.AuxInt 31695 x1 := s1.Args[0] 31696 if x1.Op != OpS390XMOVBZloadidx { 31697 break 31698 } 31699 i1 := x1.AuxInt 31700 if x1.Aux != s { 31701 break 31702 } 31703 _ = x1.Args[2] 31704 if idx != x1.Args[0] { 31705 break 31706 } 31707 if p != x1.Args[1] { 31708 break 31709 } 31710 if mem != x1.Args[2] { 31711 break 31712 } 31713 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)) { 31714 break 31715 } 31716 b = mergePoint(b, x0, x1) 31717 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31718 v.reset(OpCopy) 31719 v.AddArg(v0) 31720 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31721 v1.AuxInt = j0 31722 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31723 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31724 v3.AuxInt = i0 31725 v3.Aux = s 31726 v3.AddArg(p) 31727 v3.AddArg(idx) 31728 v3.AddArg(mem) 31729 v2.AddArg(v3) 31730 v1.AddArg(v2) 31731 v0.AddArg(v1) 31732 v0.AddArg(y) 31733 return true 31734 } 31735 return false 31736 } 31737 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 31738 b := v.Block 31739 _ = b 31740 typ := &b.Func.Config.Types 31741 _ = typ 31742 // 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))) 31743 // 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) 31744 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31745 for { 31746 _ = v.Args[1] 31747 or := v.Args[0] 31748 if or.Op != OpS390XOR { 31749 break 31750 } 31751 _ = or.Args[1] 31752 y := or.Args[0] 31753 s0 := or.Args[1] 31754 if s0.Op != OpS390XSLDconst { 31755 break 31756 } 31757 j0 := s0.AuxInt 31758 x0 := s0.Args[0] 31759 if x0.Op != OpS390XMOVBZloadidx { 31760 break 31761 } 31762 i0 := x0.AuxInt 31763 s := x0.Aux 31764 _ = x0.Args[2] 31765 idx := x0.Args[0] 31766 p := x0.Args[1] 31767 mem := x0.Args[2] 31768 s1 := v.Args[1] 31769 if s1.Op != OpS390XSLDconst { 31770 break 31771 } 31772 j1 := s1.AuxInt 31773 x1 := s1.Args[0] 31774 if x1.Op != OpS390XMOVBZloadidx { 31775 break 31776 } 31777 i1 := x1.AuxInt 31778 if x1.Aux != s { 31779 break 31780 } 31781 _ = x1.Args[2] 31782 if idx != x1.Args[0] { 31783 break 31784 } 31785 if p != x1.Args[1] { 31786 break 31787 } 31788 if mem != x1.Args[2] { 31789 break 31790 } 31791 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)) { 31792 break 31793 } 31794 b = mergePoint(b, x0, x1) 31795 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31796 v.reset(OpCopy) 31797 v.AddArg(v0) 31798 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31799 v1.AuxInt = j0 31800 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31801 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 31802 v3.AuxInt = i0 31803 v3.Aux = s 31804 v3.AddArg(p) 31805 v3.AddArg(idx) 31806 v3.AddArg(mem) 31807 v2.AddArg(v3) 31808 v1.AddArg(v2) 31809 v0.AddArg(v1) 31810 v0.AddArg(y) 31811 return true 31812 } 31813 // 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)) 31814 // 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) 31815 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31816 for { 31817 _ = v.Args[1] 31818 s1 := v.Args[0] 31819 if s1.Op != OpS390XSLDconst { 31820 break 31821 } 31822 j1 := s1.AuxInt 31823 r1 := s1.Args[0] 31824 if r1.Op != OpS390XMOVHZreg { 31825 break 31826 } 31827 x1 := r1.Args[0] 31828 if x1.Op != OpS390XMOVHBRloadidx { 31829 break 31830 } 31831 i1 := x1.AuxInt 31832 s := x1.Aux 31833 _ = x1.Args[2] 31834 p := x1.Args[0] 31835 idx := x1.Args[1] 31836 mem := x1.Args[2] 31837 or := v.Args[1] 31838 if or.Op != OpS390XOR { 31839 break 31840 } 31841 _ = or.Args[1] 31842 s0 := or.Args[0] 31843 if s0.Op != OpS390XSLDconst { 31844 break 31845 } 31846 j0 := s0.AuxInt 31847 r0 := s0.Args[0] 31848 if r0.Op != OpS390XMOVHZreg { 31849 break 31850 } 31851 x0 := r0.Args[0] 31852 if x0.Op != OpS390XMOVHBRloadidx { 31853 break 31854 } 31855 i0 := x0.AuxInt 31856 if x0.Aux != s { 31857 break 31858 } 31859 _ = x0.Args[2] 31860 if p != x0.Args[0] { 31861 break 31862 } 31863 if idx != x0.Args[1] { 31864 break 31865 } 31866 if mem != x0.Args[2] { 31867 break 31868 } 31869 y := or.Args[1] 31870 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)) { 31871 break 31872 } 31873 b = mergePoint(b, x0, x1) 31874 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31875 v.reset(OpCopy) 31876 v.AddArg(v0) 31877 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31878 v1.AuxInt = j0 31879 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31880 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31881 v3.AuxInt = i0 31882 v3.Aux = s 31883 v3.AddArg(p) 31884 v3.AddArg(idx) 31885 v3.AddArg(mem) 31886 v2.AddArg(v3) 31887 v1.AddArg(v2) 31888 v0.AddArg(v1) 31889 v0.AddArg(y) 31890 return true 31891 } 31892 // 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)) 31893 // 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) 31894 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31895 for { 31896 _ = v.Args[1] 31897 s1 := v.Args[0] 31898 if s1.Op != OpS390XSLDconst { 31899 break 31900 } 31901 j1 := s1.AuxInt 31902 r1 := s1.Args[0] 31903 if r1.Op != OpS390XMOVHZreg { 31904 break 31905 } 31906 x1 := r1.Args[0] 31907 if x1.Op != OpS390XMOVHBRloadidx { 31908 break 31909 } 31910 i1 := x1.AuxInt 31911 s := x1.Aux 31912 _ = x1.Args[2] 31913 idx := x1.Args[0] 31914 p := x1.Args[1] 31915 mem := x1.Args[2] 31916 or := v.Args[1] 31917 if or.Op != OpS390XOR { 31918 break 31919 } 31920 _ = or.Args[1] 31921 s0 := or.Args[0] 31922 if s0.Op != OpS390XSLDconst { 31923 break 31924 } 31925 j0 := s0.AuxInt 31926 r0 := s0.Args[0] 31927 if r0.Op != OpS390XMOVHZreg { 31928 break 31929 } 31930 x0 := r0.Args[0] 31931 if x0.Op != OpS390XMOVHBRloadidx { 31932 break 31933 } 31934 i0 := x0.AuxInt 31935 if x0.Aux != s { 31936 break 31937 } 31938 _ = x0.Args[2] 31939 if p != x0.Args[0] { 31940 break 31941 } 31942 if idx != x0.Args[1] { 31943 break 31944 } 31945 if mem != x0.Args[2] { 31946 break 31947 } 31948 y := or.Args[1] 31949 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)) { 31950 break 31951 } 31952 b = mergePoint(b, x0, x1) 31953 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31954 v.reset(OpCopy) 31955 v.AddArg(v0) 31956 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31957 v1.AuxInt = j0 31958 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31959 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31960 v3.AuxInt = i0 31961 v3.Aux = s 31962 v3.AddArg(p) 31963 v3.AddArg(idx) 31964 v3.AddArg(mem) 31965 v2.AddArg(v3) 31966 v1.AddArg(v2) 31967 v0.AddArg(v1) 31968 v0.AddArg(y) 31969 return true 31970 } 31971 // 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)) 31972 // 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) 31973 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31974 for { 31975 _ = v.Args[1] 31976 s1 := v.Args[0] 31977 if s1.Op != OpS390XSLDconst { 31978 break 31979 } 31980 j1 := s1.AuxInt 31981 r1 := s1.Args[0] 31982 if r1.Op != OpS390XMOVHZreg { 31983 break 31984 } 31985 x1 := r1.Args[0] 31986 if x1.Op != OpS390XMOVHBRloadidx { 31987 break 31988 } 31989 i1 := x1.AuxInt 31990 s := x1.Aux 31991 _ = x1.Args[2] 31992 p := x1.Args[0] 31993 idx := x1.Args[1] 31994 mem := x1.Args[2] 31995 or := v.Args[1] 31996 if or.Op != OpS390XOR { 31997 break 31998 } 31999 _ = or.Args[1] 32000 s0 := or.Args[0] 32001 if s0.Op != OpS390XSLDconst { 32002 break 32003 } 32004 j0 := s0.AuxInt 32005 r0 := s0.Args[0] 32006 if r0.Op != OpS390XMOVHZreg { 32007 break 32008 } 32009 x0 := r0.Args[0] 32010 if x0.Op != OpS390XMOVHBRloadidx { 32011 break 32012 } 32013 i0 := x0.AuxInt 32014 if x0.Aux != s { 32015 break 32016 } 32017 _ = x0.Args[2] 32018 if idx != x0.Args[0] { 32019 break 32020 } 32021 if p != x0.Args[1] { 32022 break 32023 } 32024 if mem != x0.Args[2] { 32025 break 32026 } 32027 y := or.Args[1] 32028 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)) { 32029 break 32030 } 32031 b = mergePoint(b, x0, x1) 32032 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32033 v.reset(OpCopy) 32034 v.AddArg(v0) 32035 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32036 v1.AuxInt = j0 32037 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32038 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32039 v3.AuxInt = i0 32040 v3.Aux = s 32041 v3.AddArg(p) 32042 v3.AddArg(idx) 32043 v3.AddArg(mem) 32044 v2.AddArg(v3) 32045 v1.AddArg(v2) 32046 v0.AddArg(v1) 32047 v0.AddArg(y) 32048 return true 32049 } 32050 // 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)) 32051 // 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) 32052 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32053 for { 32054 _ = v.Args[1] 32055 s1 := v.Args[0] 32056 if s1.Op != OpS390XSLDconst { 32057 break 32058 } 32059 j1 := s1.AuxInt 32060 r1 := s1.Args[0] 32061 if r1.Op != OpS390XMOVHZreg { 32062 break 32063 } 32064 x1 := r1.Args[0] 32065 if x1.Op != OpS390XMOVHBRloadidx { 32066 break 32067 } 32068 i1 := x1.AuxInt 32069 s := x1.Aux 32070 _ = x1.Args[2] 32071 idx := x1.Args[0] 32072 p := x1.Args[1] 32073 mem := x1.Args[2] 32074 or := v.Args[1] 32075 if or.Op != OpS390XOR { 32076 break 32077 } 32078 _ = or.Args[1] 32079 s0 := or.Args[0] 32080 if s0.Op != OpS390XSLDconst { 32081 break 32082 } 32083 j0 := s0.AuxInt 32084 r0 := s0.Args[0] 32085 if r0.Op != OpS390XMOVHZreg { 32086 break 32087 } 32088 x0 := r0.Args[0] 32089 if x0.Op != OpS390XMOVHBRloadidx { 32090 break 32091 } 32092 i0 := x0.AuxInt 32093 if x0.Aux != s { 32094 break 32095 } 32096 _ = x0.Args[2] 32097 if idx != x0.Args[0] { 32098 break 32099 } 32100 if p != x0.Args[1] { 32101 break 32102 } 32103 if mem != x0.Args[2] { 32104 break 32105 } 32106 y := or.Args[1] 32107 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)) { 32108 break 32109 } 32110 b = mergePoint(b, x0, x1) 32111 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32112 v.reset(OpCopy) 32113 v.AddArg(v0) 32114 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32115 v1.AuxInt = j0 32116 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32117 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32118 v3.AuxInt = i0 32119 v3.Aux = s 32120 v3.AddArg(p) 32121 v3.AddArg(idx) 32122 v3.AddArg(mem) 32123 v2.AddArg(v3) 32124 v1.AddArg(v2) 32125 v0.AddArg(v1) 32126 v0.AddArg(y) 32127 return true 32128 } 32129 // 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))))) 32130 // 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) 32131 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32132 for { 32133 _ = v.Args[1] 32134 s1 := v.Args[0] 32135 if s1.Op != OpS390XSLDconst { 32136 break 32137 } 32138 j1 := s1.AuxInt 32139 r1 := s1.Args[0] 32140 if r1.Op != OpS390XMOVHZreg { 32141 break 32142 } 32143 x1 := r1.Args[0] 32144 if x1.Op != OpS390XMOVHBRloadidx { 32145 break 32146 } 32147 i1 := x1.AuxInt 32148 s := x1.Aux 32149 _ = x1.Args[2] 32150 p := x1.Args[0] 32151 idx := x1.Args[1] 32152 mem := x1.Args[2] 32153 or := v.Args[1] 32154 if or.Op != OpS390XOR { 32155 break 32156 } 32157 _ = or.Args[1] 32158 y := or.Args[0] 32159 s0 := or.Args[1] 32160 if s0.Op != OpS390XSLDconst { 32161 break 32162 } 32163 j0 := s0.AuxInt 32164 r0 := s0.Args[0] 32165 if r0.Op != OpS390XMOVHZreg { 32166 break 32167 } 32168 x0 := r0.Args[0] 32169 if x0.Op != OpS390XMOVHBRloadidx { 32170 break 32171 } 32172 i0 := x0.AuxInt 32173 if x0.Aux != s { 32174 break 32175 } 32176 _ = x0.Args[2] 32177 if p != x0.Args[0] { 32178 break 32179 } 32180 if idx != x0.Args[1] { 32181 break 32182 } 32183 if mem != x0.Args[2] { 32184 break 32185 } 32186 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)) { 32187 break 32188 } 32189 b = mergePoint(b, x0, x1) 32190 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32191 v.reset(OpCopy) 32192 v.AddArg(v0) 32193 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32194 v1.AuxInt = j0 32195 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32196 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32197 v3.AuxInt = i0 32198 v3.Aux = s 32199 v3.AddArg(p) 32200 v3.AddArg(idx) 32201 v3.AddArg(mem) 32202 v2.AddArg(v3) 32203 v1.AddArg(v2) 32204 v0.AddArg(v1) 32205 v0.AddArg(y) 32206 return true 32207 } 32208 // 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))))) 32209 // 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) 32210 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32211 for { 32212 _ = v.Args[1] 32213 s1 := v.Args[0] 32214 if s1.Op != OpS390XSLDconst { 32215 break 32216 } 32217 j1 := s1.AuxInt 32218 r1 := s1.Args[0] 32219 if r1.Op != OpS390XMOVHZreg { 32220 break 32221 } 32222 x1 := r1.Args[0] 32223 if x1.Op != OpS390XMOVHBRloadidx { 32224 break 32225 } 32226 i1 := x1.AuxInt 32227 s := x1.Aux 32228 _ = x1.Args[2] 32229 idx := x1.Args[0] 32230 p := x1.Args[1] 32231 mem := x1.Args[2] 32232 or := v.Args[1] 32233 if or.Op != OpS390XOR { 32234 break 32235 } 32236 _ = or.Args[1] 32237 y := or.Args[0] 32238 s0 := or.Args[1] 32239 if s0.Op != OpS390XSLDconst { 32240 break 32241 } 32242 j0 := s0.AuxInt 32243 r0 := s0.Args[0] 32244 if r0.Op != OpS390XMOVHZreg { 32245 break 32246 } 32247 x0 := r0.Args[0] 32248 if x0.Op != OpS390XMOVHBRloadidx { 32249 break 32250 } 32251 i0 := x0.AuxInt 32252 if x0.Aux != s { 32253 break 32254 } 32255 _ = x0.Args[2] 32256 if p != x0.Args[0] { 32257 break 32258 } 32259 if idx != x0.Args[1] { 32260 break 32261 } 32262 if mem != x0.Args[2] { 32263 break 32264 } 32265 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)) { 32266 break 32267 } 32268 b = mergePoint(b, x0, x1) 32269 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32270 v.reset(OpCopy) 32271 v.AddArg(v0) 32272 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32273 v1.AuxInt = j0 32274 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32275 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32276 v3.AuxInt = i0 32277 v3.Aux = s 32278 v3.AddArg(p) 32279 v3.AddArg(idx) 32280 v3.AddArg(mem) 32281 v2.AddArg(v3) 32282 v1.AddArg(v2) 32283 v0.AddArg(v1) 32284 v0.AddArg(y) 32285 return true 32286 } 32287 // 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))))) 32288 // 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) 32289 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32290 for { 32291 _ = v.Args[1] 32292 s1 := v.Args[0] 32293 if s1.Op != OpS390XSLDconst { 32294 break 32295 } 32296 j1 := s1.AuxInt 32297 r1 := s1.Args[0] 32298 if r1.Op != OpS390XMOVHZreg { 32299 break 32300 } 32301 x1 := r1.Args[0] 32302 if x1.Op != OpS390XMOVHBRloadidx { 32303 break 32304 } 32305 i1 := x1.AuxInt 32306 s := x1.Aux 32307 _ = x1.Args[2] 32308 p := x1.Args[0] 32309 idx := x1.Args[1] 32310 mem := x1.Args[2] 32311 or := v.Args[1] 32312 if or.Op != OpS390XOR { 32313 break 32314 } 32315 _ = or.Args[1] 32316 y := or.Args[0] 32317 s0 := or.Args[1] 32318 if s0.Op != OpS390XSLDconst { 32319 break 32320 } 32321 j0 := s0.AuxInt 32322 r0 := s0.Args[0] 32323 if r0.Op != OpS390XMOVHZreg { 32324 break 32325 } 32326 x0 := r0.Args[0] 32327 if x0.Op != OpS390XMOVHBRloadidx { 32328 break 32329 } 32330 i0 := x0.AuxInt 32331 if x0.Aux != s { 32332 break 32333 } 32334 _ = x0.Args[2] 32335 if idx != x0.Args[0] { 32336 break 32337 } 32338 if p != x0.Args[1] { 32339 break 32340 } 32341 if mem != x0.Args[2] { 32342 break 32343 } 32344 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)) { 32345 break 32346 } 32347 b = mergePoint(b, x0, x1) 32348 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32349 v.reset(OpCopy) 32350 v.AddArg(v0) 32351 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32352 v1.AuxInt = j0 32353 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32354 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32355 v3.AuxInt = i0 32356 v3.Aux = s 32357 v3.AddArg(p) 32358 v3.AddArg(idx) 32359 v3.AddArg(mem) 32360 v2.AddArg(v3) 32361 v1.AddArg(v2) 32362 v0.AddArg(v1) 32363 v0.AddArg(y) 32364 return true 32365 } 32366 // 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))))) 32367 // 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) 32368 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32369 for { 32370 _ = v.Args[1] 32371 s1 := v.Args[0] 32372 if s1.Op != OpS390XSLDconst { 32373 break 32374 } 32375 j1 := s1.AuxInt 32376 r1 := s1.Args[0] 32377 if r1.Op != OpS390XMOVHZreg { 32378 break 32379 } 32380 x1 := r1.Args[0] 32381 if x1.Op != OpS390XMOVHBRloadidx { 32382 break 32383 } 32384 i1 := x1.AuxInt 32385 s := x1.Aux 32386 _ = x1.Args[2] 32387 idx := x1.Args[0] 32388 p := x1.Args[1] 32389 mem := x1.Args[2] 32390 or := v.Args[1] 32391 if or.Op != OpS390XOR { 32392 break 32393 } 32394 _ = or.Args[1] 32395 y := or.Args[0] 32396 s0 := or.Args[1] 32397 if s0.Op != OpS390XSLDconst { 32398 break 32399 } 32400 j0 := s0.AuxInt 32401 r0 := s0.Args[0] 32402 if r0.Op != OpS390XMOVHZreg { 32403 break 32404 } 32405 x0 := r0.Args[0] 32406 if x0.Op != OpS390XMOVHBRloadidx { 32407 break 32408 } 32409 i0 := x0.AuxInt 32410 if x0.Aux != s { 32411 break 32412 } 32413 _ = x0.Args[2] 32414 if idx != x0.Args[0] { 32415 break 32416 } 32417 if p != x0.Args[1] { 32418 break 32419 } 32420 if mem != x0.Args[2] { 32421 break 32422 } 32423 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)) { 32424 break 32425 } 32426 b = mergePoint(b, x0, x1) 32427 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32428 v.reset(OpCopy) 32429 v.AddArg(v0) 32430 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32431 v1.AuxInt = j0 32432 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32433 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32434 v3.AuxInt = i0 32435 v3.Aux = s 32436 v3.AddArg(p) 32437 v3.AddArg(idx) 32438 v3.AddArg(mem) 32439 v2.AddArg(v3) 32440 v1.AddArg(v2) 32441 v0.AddArg(v1) 32442 v0.AddArg(y) 32443 return true 32444 } 32445 // 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)))) 32446 // 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) 32447 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32448 for { 32449 _ = v.Args[1] 32450 or := v.Args[0] 32451 if or.Op != OpS390XOR { 32452 break 32453 } 32454 _ = or.Args[1] 32455 s0 := or.Args[0] 32456 if s0.Op != OpS390XSLDconst { 32457 break 32458 } 32459 j0 := s0.AuxInt 32460 r0 := s0.Args[0] 32461 if r0.Op != OpS390XMOVHZreg { 32462 break 32463 } 32464 x0 := r0.Args[0] 32465 if x0.Op != OpS390XMOVHBRloadidx { 32466 break 32467 } 32468 i0 := x0.AuxInt 32469 s := x0.Aux 32470 _ = x0.Args[2] 32471 p := x0.Args[0] 32472 idx := x0.Args[1] 32473 mem := x0.Args[2] 32474 y := or.Args[1] 32475 s1 := v.Args[1] 32476 if s1.Op != OpS390XSLDconst { 32477 break 32478 } 32479 j1 := s1.AuxInt 32480 r1 := s1.Args[0] 32481 if r1.Op != OpS390XMOVHZreg { 32482 break 32483 } 32484 x1 := r1.Args[0] 32485 if x1.Op != OpS390XMOVHBRloadidx { 32486 break 32487 } 32488 i1 := x1.AuxInt 32489 if x1.Aux != s { 32490 break 32491 } 32492 _ = x1.Args[2] 32493 if p != x1.Args[0] { 32494 break 32495 } 32496 if idx != x1.Args[1] { 32497 break 32498 } 32499 if mem != x1.Args[2] { 32500 break 32501 } 32502 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)) { 32503 break 32504 } 32505 b = mergePoint(b, x0, x1) 32506 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32507 v.reset(OpCopy) 32508 v.AddArg(v0) 32509 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32510 v1.AuxInt = j0 32511 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32512 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32513 v3.AuxInt = i0 32514 v3.Aux = s 32515 v3.AddArg(p) 32516 v3.AddArg(idx) 32517 v3.AddArg(mem) 32518 v2.AddArg(v3) 32519 v1.AddArg(v2) 32520 v0.AddArg(v1) 32521 v0.AddArg(y) 32522 return true 32523 } 32524 return false 32525 } 32526 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 32527 b := v.Block 32528 _ = b 32529 typ := &b.Func.Config.Types 32530 _ = typ 32531 // 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)))) 32532 // 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) 32533 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32534 for { 32535 _ = v.Args[1] 32536 or := v.Args[0] 32537 if or.Op != OpS390XOR { 32538 break 32539 } 32540 _ = or.Args[1] 32541 s0 := or.Args[0] 32542 if s0.Op != OpS390XSLDconst { 32543 break 32544 } 32545 j0 := s0.AuxInt 32546 r0 := s0.Args[0] 32547 if r0.Op != OpS390XMOVHZreg { 32548 break 32549 } 32550 x0 := r0.Args[0] 32551 if x0.Op != OpS390XMOVHBRloadidx { 32552 break 32553 } 32554 i0 := x0.AuxInt 32555 s := x0.Aux 32556 _ = x0.Args[2] 32557 idx := x0.Args[0] 32558 p := x0.Args[1] 32559 mem := x0.Args[2] 32560 y := or.Args[1] 32561 s1 := v.Args[1] 32562 if s1.Op != OpS390XSLDconst { 32563 break 32564 } 32565 j1 := s1.AuxInt 32566 r1 := s1.Args[0] 32567 if r1.Op != OpS390XMOVHZreg { 32568 break 32569 } 32570 x1 := r1.Args[0] 32571 if x1.Op != OpS390XMOVHBRloadidx { 32572 break 32573 } 32574 i1 := x1.AuxInt 32575 if x1.Aux != s { 32576 break 32577 } 32578 _ = x1.Args[2] 32579 if p != x1.Args[0] { 32580 break 32581 } 32582 if idx != x1.Args[1] { 32583 break 32584 } 32585 if mem != x1.Args[2] { 32586 break 32587 } 32588 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)) { 32589 break 32590 } 32591 b = mergePoint(b, x0, x1) 32592 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32593 v.reset(OpCopy) 32594 v.AddArg(v0) 32595 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32596 v1.AuxInt = j0 32597 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32598 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32599 v3.AuxInt = i0 32600 v3.Aux = s 32601 v3.AddArg(p) 32602 v3.AddArg(idx) 32603 v3.AddArg(mem) 32604 v2.AddArg(v3) 32605 v1.AddArg(v2) 32606 v0.AddArg(v1) 32607 v0.AddArg(y) 32608 return true 32609 } 32610 // 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)))) 32611 // 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) 32612 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32613 for { 32614 _ = v.Args[1] 32615 or := v.Args[0] 32616 if or.Op != OpS390XOR { 32617 break 32618 } 32619 _ = or.Args[1] 32620 y := or.Args[0] 32621 s0 := or.Args[1] 32622 if s0.Op != OpS390XSLDconst { 32623 break 32624 } 32625 j0 := s0.AuxInt 32626 r0 := s0.Args[0] 32627 if r0.Op != OpS390XMOVHZreg { 32628 break 32629 } 32630 x0 := r0.Args[0] 32631 if x0.Op != OpS390XMOVHBRloadidx { 32632 break 32633 } 32634 i0 := x0.AuxInt 32635 s := x0.Aux 32636 _ = x0.Args[2] 32637 p := x0.Args[0] 32638 idx := x0.Args[1] 32639 mem := x0.Args[2] 32640 s1 := v.Args[1] 32641 if s1.Op != OpS390XSLDconst { 32642 break 32643 } 32644 j1 := s1.AuxInt 32645 r1 := s1.Args[0] 32646 if r1.Op != OpS390XMOVHZreg { 32647 break 32648 } 32649 x1 := r1.Args[0] 32650 if x1.Op != OpS390XMOVHBRloadidx { 32651 break 32652 } 32653 i1 := x1.AuxInt 32654 if x1.Aux != s { 32655 break 32656 } 32657 _ = x1.Args[2] 32658 if p != x1.Args[0] { 32659 break 32660 } 32661 if idx != x1.Args[1] { 32662 break 32663 } 32664 if mem != x1.Args[2] { 32665 break 32666 } 32667 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)) { 32668 break 32669 } 32670 b = mergePoint(b, x0, x1) 32671 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32672 v.reset(OpCopy) 32673 v.AddArg(v0) 32674 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32675 v1.AuxInt = j0 32676 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32677 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32678 v3.AuxInt = i0 32679 v3.Aux = s 32680 v3.AddArg(p) 32681 v3.AddArg(idx) 32682 v3.AddArg(mem) 32683 v2.AddArg(v3) 32684 v1.AddArg(v2) 32685 v0.AddArg(v1) 32686 v0.AddArg(y) 32687 return true 32688 } 32689 // 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)))) 32690 // 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) 32691 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32692 for { 32693 _ = v.Args[1] 32694 or := v.Args[0] 32695 if or.Op != OpS390XOR { 32696 break 32697 } 32698 _ = or.Args[1] 32699 y := or.Args[0] 32700 s0 := or.Args[1] 32701 if s0.Op != OpS390XSLDconst { 32702 break 32703 } 32704 j0 := s0.AuxInt 32705 r0 := s0.Args[0] 32706 if r0.Op != OpS390XMOVHZreg { 32707 break 32708 } 32709 x0 := r0.Args[0] 32710 if x0.Op != OpS390XMOVHBRloadidx { 32711 break 32712 } 32713 i0 := x0.AuxInt 32714 s := x0.Aux 32715 _ = x0.Args[2] 32716 idx := x0.Args[0] 32717 p := x0.Args[1] 32718 mem := x0.Args[2] 32719 s1 := v.Args[1] 32720 if s1.Op != OpS390XSLDconst { 32721 break 32722 } 32723 j1 := s1.AuxInt 32724 r1 := s1.Args[0] 32725 if r1.Op != OpS390XMOVHZreg { 32726 break 32727 } 32728 x1 := r1.Args[0] 32729 if x1.Op != OpS390XMOVHBRloadidx { 32730 break 32731 } 32732 i1 := x1.AuxInt 32733 if x1.Aux != s { 32734 break 32735 } 32736 _ = x1.Args[2] 32737 if p != x1.Args[0] { 32738 break 32739 } 32740 if idx != x1.Args[1] { 32741 break 32742 } 32743 if mem != x1.Args[2] { 32744 break 32745 } 32746 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)) { 32747 break 32748 } 32749 b = mergePoint(b, x0, x1) 32750 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32751 v.reset(OpCopy) 32752 v.AddArg(v0) 32753 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32754 v1.AuxInt = j0 32755 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32756 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32757 v3.AuxInt = i0 32758 v3.Aux = s 32759 v3.AddArg(p) 32760 v3.AddArg(idx) 32761 v3.AddArg(mem) 32762 v2.AddArg(v3) 32763 v1.AddArg(v2) 32764 v0.AddArg(v1) 32765 v0.AddArg(y) 32766 return true 32767 } 32768 // 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)))) 32769 // 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) 32770 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32771 for { 32772 _ = v.Args[1] 32773 or := v.Args[0] 32774 if or.Op != OpS390XOR { 32775 break 32776 } 32777 _ = or.Args[1] 32778 s0 := or.Args[0] 32779 if s0.Op != OpS390XSLDconst { 32780 break 32781 } 32782 j0 := s0.AuxInt 32783 r0 := s0.Args[0] 32784 if r0.Op != OpS390XMOVHZreg { 32785 break 32786 } 32787 x0 := r0.Args[0] 32788 if x0.Op != OpS390XMOVHBRloadidx { 32789 break 32790 } 32791 i0 := x0.AuxInt 32792 s := x0.Aux 32793 _ = x0.Args[2] 32794 p := x0.Args[0] 32795 idx := x0.Args[1] 32796 mem := x0.Args[2] 32797 y := or.Args[1] 32798 s1 := v.Args[1] 32799 if s1.Op != OpS390XSLDconst { 32800 break 32801 } 32802 j1 := s1.AuxInt 32803 r1 := s1.Args[0] 32804 if r1.Op != OpS390XMOVHZreg { 32805 break 32806 } 32807 x1 := r1.Args[0] 32808 if x1.Op != OpS390XMOVHBRloadidx { 32809 break 32810 } 32811 i1 := x1.AuxInt 32812 if x1.Aux != s { 32813 break 32814 } 32815 _ = x1.Args[2] 32816 if idx != x1.Args[0] { 32817 break 32818 } 32819 if p != x1.Args[1] { 32820 break 32821 } 32822 if mem != x1.Args[2] { 32823 break 32824 } 32825 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)) { 32826 break 32827 } 32828 b = mergePoint(b, x0, x1) 32829 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32830 v.reset(OpCopy) 32831 v.AddArg(v0) 32832 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32833 v1.AuxInt = j0 32834 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32835 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32836 v3.AuxInt = i0 32837 v3.Aux = s 32838 v3.AddArg(p) 32839 v3.AddArg(idx) 32840 v3.AddArg(mem) 32841 v2.AddArg(v3) 32842 v1.AddArg(v2) 32843 v0.AddArg(v1) 32844 v0.AddArg(y) 32845 return true 32846 } 32847 // 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)))) 32848 // 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) 32849 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32850 for { 32851 _ = v.Args[1] 32852 or := v.Args[0] 32853 if or.Op != OpS390XOR { 32854 break 32855 } 32856 _ = or.Args[1] 32857 s0 := or.Args[0] 32858 if s0.Op != OpS390XSLDconst { 32859 break 32860 } 32861 j0 := s0.AuxInt 32862 r0 := s0.Args[0] 32863 if r0.Op != OpS390XMOVHZreg { 32864 break 32865 } 32866 x0 := r0.Args[0] 32867 if x0.Op != OpS390XMOVHBRloadidx { 32868 break 32869 } 32870 i0 := x0.AuxInt 32871 s := x0.Aux 32872 _ = x0.Args[2] 32873 idx := x0.Args[0] 32874 p := x0.Args[1] 32875 mem := x0.Args[2] 32876 y := or.Args[1] 32877 s1 := v.Args[1] 32878 if s1.Op != OpS390XSLDconst { 32879 break 32880 } 32881 j1 := s1.AuxInt 32882 r1 := s1.Args[0] 32883 if r1.Op != OpS390XMOVHZreg { 32884 break 32885 } 32886 x1 := r1.Args[0] 32887 if x1.Op != OpS390XMOVHBRloadidx { 32888 break 32889 } 32890 i1 := x1.AuxInt 32891 if x1.Aux != s { 32892 break 32893 } 32894 _ = x1.Args[2] 32895 if idx != x1.Args[0] { 32896 break 32897 } 32898 if p != x1.Args[1] { 32899 break 32900 } 32901 if mem != x1.Args[2] { 32902 break 32903 } 32904 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)) { 32905 break 32906 } 32907 b = mergePoint(b, x0, x1) 32908 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32909 v.reset(OpCopy) 32910 v.AddArg(v0) 32911 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32912 v1.AuxInt = j0 32913 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32914 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32915 v3.AuxInt = i0 32916 v3.Aux = s 32917 v3.AddArg(p) 32918 v3.AddArg(idx) 32919 v3.AddArg(mem) 32920 v2.AddArg(v3) 32921 v1.AddArg(v2) 32922 v0.AddArg(v1) 32923 v0.AddArg(y) 32924 return true 32925 } 32926 // 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)))) 32927 // 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) 32928 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 32929 for { 32930 _ = v.Args[1] 32931 or := v.Args[0] 32932 if or.Op != OpS390XOR { 32933 break 32934 } 32935 _ = or.Args[1] 32936 y := or.Args[0] 32937 s0 := or.Args[1] 32938 if s0.Op != OpS390XSLDconst { 32939 break 32940 } 32941 j0 := s0.AuxInt 32942 r0 := s0.Args[0] 32943 if r0.Op != OpS390XMOVHZreg { 32944 break 32945 } 32946 x0 := r0.Args[0] 32947 if x0.Op != OpS390XMOVHBRloadidx { 32948 break 32949 } 32950 i0 := x0.AuxInt 32951 s := x0.Aux 32952 _ = x0.Args[2] 32953 p := x0.Args[0] 32954 idx := x0.Args[1] 32955 mem := x0.Args[2] 32956 s1 := v.Args[1] 32957 if s1.Op != OpS390XSLDconst { 32958 break 32959 } 32960 j1 := s1.AuxInt 32961 r1 := s1.Args[0] 32962 if r1.Op != OpS390XMOVHZreg { 32963 break 32964 } 32965 x1 := r1.Args[0] 32966 if x1.Op != OpS390XMOVHBRloadidx { 32967 break 32968 } 32969 i1 := x1.AuxInt 32970 if x1.Aux != s { 32971 break 32972 } 32973 _ = x1.Args[2] 32974 if idx != x1.Args[0] { 32975 break 32976 } 32977 if p != x1.Args[1] { 32978 break 32979 } 32980 if mem != x1.Args[2] { 32981 break 32982 } 32983 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)) { 32984 break 32985 } 32986 b = mergePoint(b, x0, x1) 32987 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 32988 v.reset(OpCopy) 32989 v.AddArg(v0) 32990 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 32991 v1.AuxInt = j0 32992 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 32993 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32994 v3.AuxInt = i0 32995 v3.Aux = s 32996 v3.AddArg(p) 32997 v3.AddArg(idx) 32998 v3.AddArg(mem) 32999 v2.AddArg(v3) 33000 v1.AddArg(v2) 33001 v0.AddArg(v1) 33002 v0.AddArg(y) 33003 return true 33004 } 33005 // 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)))) 33006 // 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) 33007 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 33008 for { 33009 _ = v.Args[1] 33010 or := v.Args[0] 33011 if or.Op != OpS390XOR { 33012 break 33013 } 33014 _ = or.Args[1] 33015 y := or.Args[0] 33016 s0 := or.Args[1] 33017 if s0.Op != OpS390XSLDconst { 33018 break 33019 } 33020 j0 := s0.AuxInt 33021 r0 := s0.Args[0] 33022 if r0.Op != OpS390XMOVHZreg { 33023 break 33024 } 33025 x0 := r0.Args[0] 33026 if x0.Op != OpS390XMOVHBRloadidx { 33027 break 33028 } 33029 i0 := x0.AuxInt 33030 s := x0.Aux 33031 _ = x0.Args[2] 33032 idx := x0.Args[0] 33033 p := x0.Args[1] 33034 mem := x0.Args[2] 33035 s1 := v.Args[1] 33036 if s1.Op != OpS390XSLDconst { 33037 break 33038 } 33039 j1 := s1.AuxInt 33040 r1 := s1.Args[0] 33041 if r1.Op != OpS390XMOVHZreg { 33042 break 33043 } 33044 x1 := r1.Args[0] 33045 if x1.Op != OpS390XMOVHBRloadidx { 33046 break 33047 } 33048 i1 := x1.AuxInt 33049 if x1.Aux != s { 33050 break 33051 } 33052 _ = x1.Args[2] 33053 if idx != x1.Args[0] { 33054 break 33055 } 33056 if p != x1.Args[1] { 33057 break 33058 } 33059 if mem != x1.Args[2] { 33060 break 33061 } 33062 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)) { 33063 break 33064 } 33065 b = mergePoint(b, x0, x1) 33066 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 33067 v.reset(OpCopy) 33068 v.AddArg(v0) 33069 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 33070 v1.AuxInt = j0 33071 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 33072 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33073 v3.AuxInt = i0 33074 v3.Aux = s 33075 v3.AddArg(p) 33076 v3.AddArg(idx) 33077 v3.AddArg(mem) 33078 v2.AddArg(v3) 33079 v1.AddArg(v2) 33080 v0.AddArg(v1) 33081 v0.AddArg(y) 33082 return true 33083 } 33084 return false 33085 } 33086 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 33087 // match: (ORW x (MOVDconst [c])) 33088 // cond: 33089 // result: (ORWconst [int64(int32(c))] x) 33090 for { 33091 _ = v.Args[1] 33092 x := v.Args[0] 33093 v_1 := v.Args[1] 33094 if v_1.Op != OpS390XMOVDconst { 33095 break 33096 } 33097 c := v_1.AuxInt 33098 v.reset(OpS390XORWconst) 33099 v.AuxInt = int64(int32(c)) 33100 v.AddArg(x) 33101 return true 33102 } 33103 // match: (ORW (MOVDconst [c]) x) 33104 // cond: 33105 // result: (ORWconst [int64(int32(c))] x) 33106 for { 33107 _ = v.Args[1] 33108 v_0 := v.Args[0] 33109 if v_0.Op != OpS390XMOVDconst { 33110 break 33111 } 33112 c := v_0.AuxInt 33113 x := v.Args[1] 33114 v.reset(OpS390XORWconst) 33115 v.AuxInt = int64(int32(c)) 33116 v.AddArg(x) 33117 return true 33118 } 33119 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 33120 // cond: d == 32-c 33121 // result: (RLLconst [c] x) 33122 for { 33123 _ = v.Args[1] 33124 v_0 := v.Args[0] 33125 if v_0.Op != OpS390XSLWconst { 33126 break 33127 } 33128 c := v_0.AuxInt 33129 x := v_0.Args[0] 33130 v_1 := v.Args[1] 33131 if v_1.Op != OpS390XSRWconst { 33132 break 33133 } 33134 d := v_1.AuxInt 33135 if x != v_1.Args[0] { 33136 break 33137 } 33138 if !(d == 32-c) { 33139 break 33140 } 33141 v.reset(OpS390XRLLconst) 33142 v.AuxInt = c 33143 v.AddArg(x) 33144 return true 33145 } 33146 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 33147 // cond: d == 32-c 33148 // result: (RLLconst [c] x) 33149 for { 33150 _ = v.Args[1] 33151 v_0 := v.Args[0] 33152 if v_0.Op != OpS390XSRWconst { 33153 break 33154 } 33155 d := v_0.AuxInt 33156 x := v_0.Args[0] 33157 v_1 := v.Args[1] 33158 if v_1.Op != OpS390XSLWconst { 33159 break 33160 } 33161 c := v_1.AuxInt 33162 if x != v_1.Args[0] { 33163 break 33164 } 33165 if !(d == 32-c) { 33166 break 33167 } 33168 v.reset(OpS390XRLLconst) 33169 v.AuxInt = c 33170 v.AddArg(x) 33171 return true 33172 } 33173 // match: (ORW x x) 33174 // cond: 33175 // result: x 33176 for { 33177 _ = v.Args[1] 33178 x := v.Args[0] 33179 if x != v.Args[1] { 33180 break 33181 } 33182 v.reset(OpCopy) 33183 v.Type = x.Type 33184 v.AddArg(x) 33185 return true 33186 } 33187 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33188 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33189 // result: (ORWload <t> [off] {sym} x ptr mem) 33190 for { 33191 t := v.Type 33192 _ = v.Args[1] 33193 x := v.Args[0] 33194 g := v.Args[1] 33195 if g.Op != OpS390XMOVWload { 33196 break 33197 } 33198 off := g.AuxInt 33199 sym := g.Aux 33200 _ = g.Args[1] 33201 ptr := g.Args[0] 33202 mem := g.Args[1] 33203 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33204 break 33205 } 33206 v.reset(OpS390XORWload) 33207 v.Type = t 33208 v.AuxInt = off 33209 v.Aux = sym 33210 v.AddArg(x) 33211 v.AddArg(ptr) 33212 v.AddArg(mem) 33213 return true 33214 } 33215 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33216 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33217 // result: (ORWload <t> [off] {sym} x ptr mem) 33218 for { 33219 t := v.Type 33220 _ = v.Args[1] 33221 g := v.Args[0] 33222 if g.Op != OpS390XMOVWload { 33223 break 33224 } 33225 off := g.AuxInt 33226 sym := g.Aux 33227 _ = g.Args[1] 33228 ptr := g.Args[0] 33229 mem := g.Args[1] 33230 x := v.Args[1] 33231 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33232 break 33233 } 33234 v.reset(OpS390XORWload) 33235 v.Type = t 33236 v.AuxInt = off 33237 v.Aux = sym 33238 v.AddArg(x) 33239 v.AddArg(ptr) 33240 v.AddArg(mem) 33241 return true 33242 } 33243 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33244 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33245 // result: (ORWload <t> [off] {sym} x ptr mem) 33246 for { 33247 t := v.Type 33248 _ = v.Args[1] 33249 g := v.Args[0] 33250 if g.Op != OpS390XMOVWload { 33251 break 33252 } 33253 off := g.AuxInt 33254 sym := g.Aux 33255 _ = g.Args[1] 33256 ptr := g.Args[0] 33257 mem := g.Args[1] 33258 x := v.Args[1] 33259 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33260 break 33261 } 33262 v.reset(OpS390XORWload) 33263 v.Type = t 33264 v.AuxInt = off 33265 v.Aux = sym 33266 v.AddArg(x) 33267 v.AddArg(ptr) 33268 v.AddArg(mem) 33269 return true 33270 } 33271 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33272 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33273 // result: (ORWload <t> [off] {sym} x ptr mem) 33274 for { 33275 t := v.Type 33276 _ = v.Args[1] 33277 x := v.Args[0] 33278 g := v.Args[1] 33279 if g.Op != OpS390XMOVWload { 33280 break 33281 } 33282 off := g.AuxInt 33283 sym := g.Aux 33284 _ = g.Args[1] 33285 ptr := g.Args[0] 33286 mem := g.Args[1] 33287 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33288 break 33289 } 33290 v.reset(OpS390XORWload) 33291 v.Type = t 33292 v.AuxInt = off 33293 v.Aux = sym 33294 v.AddArg(x) 33295 v.AddArg(ptr) 33296 v.AddArg(mem) 33297 return true 33298 } 33299 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33300 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33301 // result: (ORWload <t> [off] {sym} x ptr mem) 33302 for { 33303 t := v.Type 33304 _ = v.Args[1] 33305 x := v.Args[0] 33306 g := v.Args[1] 33307 if g.Op != OpS390XMOVWZload { 33308 break 33309 } 33310 off := g.AuxInt 33311 sym := g.Aux 33312 _ = g.Args[1] 33313 ptr := g.Args[0] 33314 mem := g.Args[1] 33315 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33316 break 33317 } 33318 v.reset(OpS390XORWload) 33319 v.Type = t 33320 v.AuxInt = off 33321 v.Aux = sym 33322 v.AddArg(x) 33323 v.AddArg(ptr) 33324 v.AddArg(mem) 33325 return true 33326 } 33327 return false 33328 } 33329 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 33330 b := v.Block 33331 _ = b 33332 typ := &b.Func.Config.Types 33333 _ = typ 33334 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33335 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33336 // result: (ORWload <t> [off] {sym} x ptr mem) 33337 for { 33338 t := v.Type 33339 _ = v.Args[1] 33340 g := v.Args[0] 33341 if g.Op != OpS390XMOVWZload { 33342 break 33343 } 33344 off := g.AuxInt 33345 sym := g.Aux 33346 _ = g.Args[1] 33347 ptr := g.Args[0] 33348 mem := g.Args[1] 33349 x := v.Args[1] 33350 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33351 break 33352 } 33353 v.reset(OpS390XORWload) 33354 v.Type = t 33355 v.AuxInt = off 33356 v.Aux = sym 33357 v.AddArg(x) 33358 v.AddArg(ptr) 33359 v.AddArg(mem) 33360 return true 33361 } 33362 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 33363 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33364 // result: (ORWload <t> [off] {sym} x ptr mem) 33365 for { 33366 t := v.Type 33367 _ = v.Args[1] 33368 g := v.Args[0] 33369 if g.Op != OpS390XMOVWZload { 33370 break 33371 } 33372 off := g.AuxInt 33373 sym := g.Aux 33374 _ = g.Args[1] 33375 ptr := g.Args[0] 33376 mem := g.Args[1] 33377 x := v.Args[1] 33378 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33379 break 33380 } 33381 v.reset(OpS390XORWload) 33382 v.Type = t 33383 v.AuxInt = off 33384 v.Aux = sym 33385 v.AddArg(x) 33386 v.AddArg(ptr) 33387 v.AddArg(mem) 33388 return true 33389 } 33390 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33391 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 33392 // result: (ORWload <t> [off] {sym} x ptr mem) 33393 for { 33394 t := v.Type 33395 _ = v.Args[1] 33396 x := v.Args[0] 33397 g := v.Args[1] 33398 if g.Op != OpS390XMOVWZload { 33399 break 33400 } 33401 off := g.AuxInt 33402 sym := g.Aux 33403 _ = g.Args[1] 33404 ptr := g.Args[0] 33405 mem := g.Args[1] 33406 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 33407 break 33408 } 33409 v.reset(OpS390XORWload) 33410 v.Type = t 33411 v.AuxInt = off 33412 v.Aux = sym 33413 v.AddArg(x) 33414 v.AddArg(ptr) 33415 v.AddArg(mem) 33416 return true 33417 } 33418 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 33419 // 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) 33420 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 33421 for { 33422 _ = v.Args[1] 33423 x1 := v.Args[0] 33424 if x1.Op != OpS390XMOVBZload { 33425 break 33426 } 33427 i1 := x1.AuxInt 33428 s := x1.Aux 33429 _ = x1.Args[1] 33430 p := x1.Args[0] 33431 mem := x1.Args[1] 33432 sh := v.Args[1] 33433 if sh.Op != OpS390XSLWconst { 33434 break 33435 } 33436 if sh.AuxInt != 8 { 33437 break 33438 } 33439 x0 := sh.Args[0] 33440 if x0.Op != OpS390XMOVBZload { 33441 break 33442 } 33443 i0 := x0.AuxInt 33444 if x0.Aux != s { 33445 break 33446 } 33447 _ = x0.Args[1] 33448 if p != x0.Args[0] { 33449 break 33450 } 33451 if mem != x0.Args[1] { 33452 break 33453 } 33454 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)) { 33455 break 33456 } 33457 b = mergePoint(b, x0, x1) 33458 v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 33459 v.reset(OpCopy) 33460 v.AddArg(v0) 33461 v0.AuxInt = i0 33462 v0.Aux = s 33463 v0.AddArg(p) 33464 v0.AddArg(mem) 33465 return true 33466 } 33467 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 33468 // 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) 33469 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 33470 for { 33471 _ = v.Args[1] 33472 sh := v.Args[0] 33473 if sh.Op != OpS390XSLWconst { 33474 break 33475 } 33476 if sh.AuxInt != 8 { 33477 break 33478 } 33479 x0 := sh.Args[0] 33480 if x0.Op != OpS390XMOVBZload { 33481 break 33482 } 33483 i0 := x0.AuxInt 33484 s := x0.Aux 33485 _ = x0.Args[1] 33486 p := x0.Args[0] 33487 mem := x0.Args[1] 33488 x1 := v.Args[1] 33489 if x1.Op != OpS390XMOVBZload { 33490 break 33491 } 33492 i1 := x1.AuxInt 33493 if x1.Aux != s { 33494 break 33495 } 33496 _ = x1.Args[1] 33497 if p != x1.Args[0] { 33498 break 33499 } 33500 if mem != x1.Args[1] { 33501 break 33502 } 33503 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)) { 33504 break 33505 } 33506 b = mergePoint(b, x0, x1) 33507 v0 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 33508 v.reset(OpCopy) 33509 v.AddArg(v0) 33510 v0.AuxInt = i0 33511 v0.Aux = s 33512 v0.AddArg(p) 33513 v0.AddArg(mem) 33514 return true 33515 } 33516 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 33517 // 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) 33518 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 33519 for { 33520 _ = v.Args[1] 33521 x1 := v.Args[0] 33522 if x1.Op != OpS390XMOVHZload { 33523 break 33524 } 33525 i1 := x1.AuxInt 33526 s := x1.Aux 33527 _ = x1.Args[1] 33528 p := x1.Args[0] 33529 mem := x1.Args[1] 33530 sh := v.Args[1] 33531 if sh.Op != OpS390XSLWconst { 33532 break 33533 } 33534 if sh.AuxInt != 16 { 33535 break 33536 } 33537 x0 := sh.Args[0] 33538 if x0.Op != OpS390XMOVHZload { 33539 break 33540 } 33541 i0 := x0.AuxInt 33542 if x0.Aux != s { 33543 break 33544 } 33545 _ = x0.Args[1] 33546 if p != x0.Args[0] { 33547 break 33548 } 33549 if mem != x0.Args[1] { 33550 break 33551 } 33552 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)) { 33553 break 33554 } 33555 b = mergePoint(b, x0, x1) 33556 v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) 33557 v.reset(OpCopy) 33558 v.AddArg(v0) 33559 v0.AuxInt = i0 33560 v0.Aux = s 33561 v0.AddArg(p) 33562 v0.AddArg(mem) 33563 return true 33564 } 33565 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 33566 // 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) 33567 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 33568 for { 33569 _ = v.Args[1] 33570 sh := v.Args[0] 33571 if sh.Op != OpS390XSLWconst { 33572 break 33573 } 33574 if sh.AuxInt != 16 { 33575 break 33576 } 33577 x0 := sh.Args[0] 33578 if x0.Op != OpS390XMOVHZload { 33579 break 33580 } 33581 i0 := x0.AuxInt 33582 s := x0.Aux 33583 _ = x0.Args[1] 33584 p := x0.Args[0] 33585 mem := x0.Args[1] 33586 x1 := v.Args[1] 33587 if x1.Op != OpS390XMOVHZload { 33588 break 33589 } 33590 i1 := x1.AuxInt 33591 if x1.Aux != s { 33592 break 33593 } 33594 _ = x1.Args[1] 33595 if p != x1.Args[0] { 33596 break 33597 } 33598 if mem != x1.Args[1] { 33599 break 33600 } 33601 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)) { 33602 break 33603 } 33604 b = mergePoint(b, x0, x1) 33605 v0 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) 33606 v.reset(OpCopy) 33607 v.AddArg(v0) 33608 v0.AuxInt = i0 33609 v0.Aux = s 33610 v0.AddArg(p) 33611 v0.AddArg(mem) 33612 return true 33613 } 33614 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 33615 // 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) 33616 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33617 for { 33618 _ = v.Args[1] 33619 s0 := v.Args[0] 33620 if s0.Op != OpS390XSLWconst { 33621 break 33622 } 33623 j0 := s0.AuxInt 33624 x0 := s0.Args[0] 33625 if x0.Op != OpS390XMOVBZload { 33626 break 33627 } 33628 i0 := x0.AuxInt 33629 s := x0.Aux 33630 _ = x0.Args[1] 33631 p := x0.Args[0] 33632 mem := x0.Args[1] 33633 or := v.Args[1] 33634 if or.Op != OpS390XORW { 33635 break 33636 } 33637 _ = or.Args[1] 33638 s1 := or.Args[0] 33639 if s1.Op != OpS390XSLWconst { 33640 break 33641 } 33642 j1 := s1.AuxInt 33643 x1 := s1.Args[0] 33644 if x1.Op != OpS390XMOVBZload { 33645 break 33646 } 33647 i1 := x1.AuxInt 33648 if x1.Aux != s { 33649 break 33650 } 33651 _ = x1.Args[1] 33652 if p != x1.Args[0] { 33653 break 33654 } 33655 if mem != x1.Args[1] { 33656 break 33657 } 33658 y := or.Args[1] 33659 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)) { 33660 break 33661 } 33662 b = mergePoint(b, x0, x1) 33663 v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) 33664 v.reset(OpCopy) 33665 v.AddArg(v0) 33666 v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) 33667 v1.AuxInt = j1 33668 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 33669 v2.AuxInt = i0 33670 v2.Aux = s 33671 v2.AddArg(p) 33672 v2.AddArg(mem) 33673 v1.AddArg(v2) 33674 v0.AddArg(v1) 33675 v0.AddArg(y) 33676 return true 33677 } 33678 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 33679 // 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) 33680 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33681 for { 33682 _ = v.Args[1] 33683 s0 := v.Args[0] 33684 if s0.Op != OpS390XSLWconst { 33685 break 33686 } 33687 j0 := s0.AuxInt 33688 x0 := s0.Args[0] 33689 if x0.Op != OpS390XMOVBZload { 33690 break 33691 } 33692 i0 := x0.AuxInt 33693 s := x0.Aux 33694 _ = x0.Args[1] 33695 p := x0.Args[0] 33696 mem := x0.Args[1] 33697 or := v.Args[1] 33698 if or.Op != OpS390XORW { 33699 break 33700 } 33701 _ = or.Args[1] 33702 y := or.Args[0] 33703 s1 := or.Args[1] 33704 if s1.Op != OpS390XSLWconst { 33705 break 33706 } 33707 j1 := s1.AuxInt 33708 x1 := s1.Args[0] 33709 if x1.Op != OpS390XMOVBZload { 33710 break 33711 } 33712 i1 := x1.AuxInt 33713 if x1.Aux != s { 33714 break 33715 } 33716 _ = x1.Args[1] 33717 if p != x1.Args[0] { 33718 break 33719 } 33720 if mem != x1.Args[1] { 33721 break 33722 } 33723 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)) { 33724 break 33725 } 33726 b = mergePoint(b, x0, x1) 33727 v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) 33728 v.reset(OpCopy) 33729 v.AddArg(v0) 33730 v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) 33731 v1.AuxInt = j1 33732 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) 33733 v2.AuxInt = i0 33734 v2.Aux = s 33735 v2.AddArg(p) 33736 v2.AddArg(mem) 33737 v1.AddArg(v2) 33738 v0.AddArg(v1) 33739 v0.AddArg(y) 33740 return true 33741 } 33742 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 33743 // 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) 33744 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33745 for { 33746 _ = v.Args[1] 33747 or := v.Args[0] 33748 if or.Op != OpS390XORW { 33749 break 33750 } 33751 _ = or.Args[1] 33752 s1 := or.Args[0] 33753 if s1.Op != OpS390XSLWconst { 33754 break 33755 } 33756 j1 := s1.AuxInt 33757 x1 := s1.Args[0] 33758 if x1.Op != OpS390XMOVBZload { 33759 break 33760 } 33761 i1 := x1.AuxInt 33762 s := x1.Aux 33763 _ = x1.Args[1] 33764 p := x1.Args[0] 33765 mem := x1.Args[1] 33766 y := or.Args[1] 33767 s0 := v.Args[1] 33768 if s0.Op != OpS390XSLWconst { 33769 break 33770 } 33771 j0 := s0.AuxInt 33772 x0 := s0.Args[0] 33773 if x0.Op != OpS390XMOVBZload { 33774 break 33775 } 33776 i0 := x0.AuxInt 33777 if x0.Aux != s { 33778 break 33779 } 33780 _ = x0.Args[1] 33781 if p != x0.Args[0] { 33782 break 33783 } 33784 if mem != x0.Args[1] { 33785 break 33786 } 33787 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)) { 33788 break 33789 } 33790 b = mergePoint(b, x0, x1) 33791 v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) 33792 v.reset(OpCopy) 33793 v.AddArg(v0) 33794 v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) 33795 v1.AuxInt = j1 33796 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 33797 v2.AuxInt = i0 33798 v2.Aux = s 33799 v2.AddArg(p) 33800 v2.AddArg(mem) 33801 v1.AddArg(v2) 33802 v0.AddArg(v1) 33803 v0.AddArg(y) 33804 return true 33805 } 33806 return false 33807 } 33808 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 33809 b := v.Block 33810 _ = b 33811 typ := &b.Func.Config.Types 33812 _ = typ 33813 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 33814 // 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) 33815 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 33816 for { 33817 _ = v.Args[1] 33818 or := v.Args[0] 33819 if or.Op != OpS390XORW { 33820 break 33821 } 33822 _ = or.Args[1] 33823 y := or.Args[0] 33824 s1 := or.Args[1] 33825 if s1.Op != OpS390XSLWconst { 33826 break 33827 } 33828 j1 := s1.AuxInt 33829 x1 := s1.Args[0] 33830 if x1.Op != OpS390XMOVBZload { 33831 break 33832 } 33833 i1 := x1.AuxInt 33834 s := x1.Aux 33835 _ = x1.Args[1] 33836 p := x1.Args[0] 33837 mem := x1.Args[1] 33838 s0 := v.Args[1] 33839 if s0.Op != OpS390XSLWconst { 33840 break 33841 } 33842 j0 := s0.AuxInt 33843 x0 := s0.Args[0] 33844 if x0.Op != OpS390XMOVBZload { 33845 break 33846 } 33847 i0 := x0.AuxInt 33848 if x0.Aux != s { 33849 break 33850 } 33851 _ = x0.Args[1] 33852 if p != x0.Args[0] { 33853 break 33854 } 33855 if mem != x0.Args[1] { 33856 break 33857 } 33858 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)) { 33859 break 33860 } 33861 b = mergePoint(b, x0, x1) 33862 v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) 33863 v.reset(OpCopy) 33864 v.AddArg(v0) 33865 v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) 33866 v1.AuxInt = j1 33867 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) 33868 v2.AuxInt = i0 33869 v2.Aux = s 33870 v2.AddArg(p) 33871 v2.AddArg(mem) 33872 v1.AddArg(v2) 33873 v0.AddArg(v1) 33874 v0.AddArg(y) 33875 return true 33876 } 33877 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 33878 // 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) 33879 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33880 for { 33881 _ = v.Args[1] 33882 x1 := v.Args[0] 33883 if x1.Op != OpS390XMOVBZloadidx { 33884 break 33885 } 33886 i1 := x1.AuxInt 33887 s := x1.Aux 33888 _ = x1.Args[2] 33889 p := x1.Args[0] 33890 idx := x1.Args[1] 33891 mem := x1.Args[2] 33892 sh := v.Args[1] 33893 if sh.Op != OpS390XSLWconst { 33894 break 33895 } 33896 if sh.AuxInt != 8 { 33897 break 33898 } 33899 x0 := sh.Args[0] 33900 if x0.Op != OpS390XMOVBZloadidx { 33901 break 33902 } 33903 i0 := x0.AuxInt 33904 if x0.Aux != s { 33905 break 33906 } 33907 _ = x0.Args[2] 33908 if p != x0.Args[0] { 33909 break 33910 } 33911 if idx != x0.Args[1] { 33912 break 33913 } 33914 if mem != x0.Args[2] { 33915 break 33916 } 33917 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)) { 33918 break 33919 } 33920 b = mergePoint(b, x0, x1) 33921 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33922 v.reset(OpCopy) 33923 v.AddArg(v0) 33924 v0.AuxInt = i0 33925 v0.Aux = s 33926 v0.AddArg(p) 33927 v0.AddArg(idx) 33928 v0.AddArg(mem) 33929 return true 33930 } 33931 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 33932 // 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) 33933 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33934 for { 33935 _ = v.Args[1] 33936 x1 := v.Args[0] 33937 if x1.Op != OpS390XMOVBZloadidx { 33938 break 33939 } 33940 i1 := x1.AuxInt 33941 s := x1.Aux 33942 _ = x1.Args[2] 33943 idx := x1.Args[0] 33944 p := x1.Args[1] 33945 mem := x1.Args[2] 33946 sh := v.Args[1] 33947 if sh.Op != OpS390XSLWconst { 33948 break 33949 } 33950 if sh.AuxInt != 8 { 33951 break 33952 } 33953 x0 := sh.Args[0] 33954 if x0.Op != OpS390XMOVBZloadidx { 33955 break 33956 } 33957 i0 := x0.AuxInt 33958 if x0.Aux != s { 33959 break 33960 } 33961 _ = x0.Args[2] 33962 if p != x0.Args[0] { 33963 break 33964 } 33965 if idx != x0.Args[1] { 33966 break 33967 } 33968 if mem != x0.Args[2] { 33969 break 33970 } 33971 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)) { 33972 break 33973 } 33974 b = mergePoint(b, x0, x1) 33975 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33976 v.reset(OpCopy) 33977 v.AddArg(v0) 33978 v0.AuxInt = i0 33979 v0.Aux = s 33980 v0.AddArg(p) 33981 v0.AddArg(idx) 33982 v0.AddArg(mem) 33983 return true 33984 } 33985 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 33986 // 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) 33987 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 33988 for { 33989 _ = v.Args[1] 33990 x1 := v.Args[0] 33991 if x1.Op != OpS390XMOVBZloadidx { 33992 break 33993 } 33994 i1 := x1.AuxInt 33995 s := x1.Aux 33996 _ = x1.Args[2] 33997 p := x1.Args[0] 33998 idx := x1.Args[1] 33999 mem := x1.Args[2] 34000 sh := v.Args[1] 34001 if sh.Op != OpS390XSLWconst { 34002 break 34003 } 34004 if sh.AuxInt != 8 { 34005 break 34006 } 34007 x0 := sh.Args[0] 34008 if x0.Op != OpS390XMOVBZloadidx { 34009 break 34010 } 34011 i0 := x0.AuxInt 34012 if x0.Aux != s { 34013 break 34014 } 34015 _ = x0.Args[2] 34016 if idx != x0.Args[0] { 34017 break 34018 } 34019 if p != x0.Args[1] { 34020 break 34021 } 34022 if mem != x0.Args[2] { 34023 break 34024 } 34025 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)) { 34026 break 34027 } 34028 b = mergePoint(b, x0, x1) 34029 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34030 v.reset(OpCopy) 34031 v.AddArg(v0) 34032 v0.AuxInt = i0 34033 v0.Aux = s 34034 v0.AddArg(p) 34035 v0.AddArg(idx) 34036 v0.AddArg(mem) 34037 return true 34038 } 34039 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 34040 // 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) 34041 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34042 for { 34043 _ = v.Args[1] 34044 x1 := v.Args[0] 34045 if x1.Op != OpS390XMOVBZloadidx { 34046 break 34047 } 34048 i1 := x1.AuxInt 34049 s := x1.Aux 34050 _ = x1.Args[2] 34051 idx := x1.Args[0] 34052 p := x1.Args[1] 34053 mem := x1.Args[2] 34054 sh := v.Args[1] 34055 if sh.Op != OpS390XSLWconst { 34056 break 34057 } 34058 if sh.AuxInt != 8 { 34059 break 34060 } 34061 x0 := sh.Args[0] 34062 if x0.Op != OpS390XMOVBZloadidx { 34063 break 34064 } 34065 i0 := x0.AuxInt 34066 if x0.Aux != s { 34067 break 34068 } 34069 _ = x0.Args[2] 34070 if idx != x0.Args[0] { 34071 break 34072 } 34073 if p != x0.Args[1] { 34074 break 34075 } 34076 if mem != x0.Args[2] { 34077 break 34078 } 34079 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)) { 34080 break 34081 } 34082 b = mergePoint(b, x0, x1) 34083 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34084 v.reset(OpCopy) 34085 v.AddArg(v0) 34086 v0.AuxInt = i0 34087 v0.Aux = s 34088 v0.AddArg(p) 34089 v0.AddArg(idx) 34090 v0.AddArg(mem) 34091 return true 34092 } 34093 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 34094 // 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) 34095 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34096 for { 34097 _ = v.Args[1] 34098 sh := v.Args[0] 34099 if sh.Op != OpS390XSLWconst { 34100 break 34101 } 34102 if sh.AuxInt != 8 { 34103 break 34104 } 34105 x0 := sh.Args[0] 34106 if x0.Op != OpS390XMOVBZloadidx { 34107 break 34108 } 34109 i0 := x0.AuxInt 34110 s := x0.Aux 34111 _ = x0.Args[2] 34112 p := x0.Args[0] 34113 idx := x0.Args[1] 34114 mem := x0.Args[2] 34115 x1 := v.Args[1] 34116 if x1.Op != OpS390XMOVBZloadidx { 34117 break 34118 } 34119 i1 := x1.AuxInt 34120 if x1.Aux != s { 34121 break 34122 } 34123 _ = x1.Args[2] 34124 if p != x1.Args[0] { 34125 break 34126 } 34127 if idx != x1.Args[1] { 34128 break 34129 } 34130 if mem != x1.Args[2] { 34131 break 34132 } 34133 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)) { 34134 break 34135 } 34136 b = mergePoint(b, x0, x1) 34137 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34138 v.reset(OpCopy) 34139 v.AddArg(v0) 34140 v0.AuxInt = i0 34141 v0.Aux = s 34142 v0.AddArg(p) 34143 v0.AddArg(idx) 34144 v0.AddArg(mem) 34145 return true 34146 } 34147 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 34148 // 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) 34149 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34150 for { 34151 _ = v.Args[1] 34152 sh := v.Args[0] 34153 if sh.Op != OpS390XSLWconst { 34154 break 34155 } 34156 if sh.AuxInt != 8 { 34157 break 34158 } 34159 x0 := sh.Args[0] 34160 if x0.Op != OpS390XMOVBZloadidx { 34161 break 34162 } 34163 i0 := x0.AuxInt 34164 s := x0.Aux 34165 _ = x0.Args[2] 34166 idx := x0.Args[0] 34167 p := x0.Args[1] 34168 mem := x0.Args[2] 34169 x1 := v.Args[1] 34170 if x1.Op != OpS390XMOVBZloadidx { 34171 break 34172 } 34173 i1 := x1.AuxInt 34174 if x1.Aux != s { 34175 break 34176 } 34177 _ = x1.Args[2] 34178 if p != x1.Args[0] { 34179 break 34180 } 34181 if idx != x1.Args[1] { 34182 break 34183 } 34184 if mem != x1.Args[2] { 34185 break 34186 } 34187 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)) { 34188 break 34189 } 34190 b = mergePoint(b, x0, x1) 34191 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34192 v.reset(OpCopy) 34193 v.AddArg(v0) 34194 v0.AuxInt = i0 34195 v0.Aux = s 34196 v0.AddArg(p) 34197 v0.AddArg(idx) 34198 v0.AddArg(mem) 34199 return true 34200 } 34201 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 34202 // 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) 34203 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34204 for { 34205 _ = v.Args[1] 34206 sh := v.Args[0] 34207 if sh.Op != OpS390XSLWconst { 34208 break 34209 } 34210 if sh.AuxInt != 8 { 34211 break 34212 } 34213 x0 := sh.Args[0] 34214 if x0.Op != OpS390XMOVBZloadidx { 34215 break 34216 } 34217 i0 := x0.AuxInt 34218 s := x0.Aux 34219 _ = x0.Args[2] 34220 p := x0.Args[0] 34221 idx := x0.Args[1] 34222 mem := x0.Args[2] 34223 x1 := v.Args[1] 34224 if x1.Op != OpS390XMOVBZloadidx { 34225 break 34226 } 34227 i1 := x1.AuxInt 34228 if x1.Aux != s { 34229 break 34230 } 34231 _ = x1.Args[2] 34232 if idx != x1.Args[0] { 34233 break 34234 } 34235 if p != x1.Args[1] { 34236 break 34237 } 34238 if mem != x1.Args[2] { 34239 break 34240 } 34241 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)) { 34242 break 34243 } 34244 b = mergePoint(b, x0, x1) 34245 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34246 v.reset(OpCopy) 34247 v.AddArg(v0) 34248 v0.AuxInt = i0 34249 v0.Aux = s 34250 v0.AddArg(p) 34251 v0.AddArg(idx) 34252 v0.AddArg(mem) 34253 return true 34254 } 34255 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 34256 // 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) 34257 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 34258 for { 34259 _ = v.Args[1] 34260 sh := v.Args[0] 34261 if sh.Op != OpS390XSLWconst { 34262 break 34263 } 34264 if sh.AuxInt != 8 { 34265 break 34266 } 34267 x0 := sh.Args[0] 34268 if x0.Op != OpS390XMOVBZloadidx { 34269 break 34270 } 34271 i0 := x0.AuxInt 34272 s := x0.Aux 34273 _ = x0.Args[2] 34274 idx := x0.Args[0] 34275 p := x0.Args[1] 34276 mem := x0.Args[2] 34277 x1 := v.Args[1] 34278 if x1.Op != OpS390XMOVBZloadidx { 34279 break 34280 } 34281 i1 := x1.AuxInt 34282 if x1.Aux != s { 34283 break 34284 } 34285 _ = x1.Args[2] 34286 if idx != x1.Args[0] { 34287 break 34288 } 34289 if p != x1.Args[1] { 34290 break 34291 } 34292 if mem != x1.Args[2] { 34293 break 34294 } 34295 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)) { 34296 break 34297 } 34298 b = mergePoint(b, x0, x1) 34299 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34300 v.reset(OpCopy) 34301 v.AddArg(v0) 34302 v0.AuxInt = i0 34303 v0.Aux = s 34304 v0.AddArg(p) 34305 v0.AddArg(idx) 34306 v0.AddArg(mem) 34307 return true 34308 } 34309 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 34310 // 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) 34311 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34312 for { 34313 _ = v.Args[1] 34314 x1 := v.Args[0] 34315 if x1.Op != OpS390XMOVHZloadidx { 34316 break 34317 } 34318 i1 := x1.AuxInt 34319 s := x1.Aux 34320 _ = x1.Args[2] 34321 p := x1.Args[0] 34322 idx := x1.Args[1] 34323 mem := x1.Args[2] 34324 sh := v.Args[1] 34325 if sh.Op != OpS390XSLWconst { 34326 break 34327 } 34328 if sh.AuxInt != 16 { 34329 break 34330 } 34331 x0 := sh.Args[0] 34332 if x0.Op != OpS390XMOVHZloadidx { 34333 break 34334 } 34335 i0 := x0.AuxInt 34336 if x0.Aux != s { 34337 break 34338 } 34339 _ = x0.Args[2] 34340 if p != x0.Args[0] { 34341 break 34342 } 34343 if idx != x0.Args[1] { 34344 break 34345 } 34346 if mem != x0.Args[2] { 34347 break 34348 } 34349 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)) { 34350 break 34351 } 34352 b = mergePoint(b, x0, x1) 34353 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34354 v.reset(OpCopy) 34355 v.AddArg(v0) 34356 v0.AuxInt = i0 34357 v0.Aux = s 34358 v0.AddArg(p) 34359 v0.AddArg(idx) 34360 v0.AddArg(mem) 34361 return true 34362 } 34363 return false 34364 } 34365 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 34366 b := v.Block 34367 _ = b 34368 typ := &b.Func.Config.Types 34369 _ = typ 34370 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 34371 // 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) 34372 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34373 for { 34374 _ = v.Args[1] 34375 x1 := v.Args[0] 34376 if x1.Op != OpS390XMOVHZloadidx { 34377 break 34378 } 34379 i1 := x1.AuxInt 34380 s := x1.Aux 34381 _ = x1.Args[2] 34382 idx := x1.Args[0] 34383 p := x1.Args[1] 34384 mem := x1.Args[2] 34385 sh := v.Args[1] 34386 if sh.Op != OpS390XSLWconst { 34387 break 34388 } 34389 if sh.AuxInt != 16 { 34390 break 34391 } 34392 x0 := sh.Args[0] 34393 if x0.Op != OpS390XMOVHZloadidx { 34394 break 34395 } 34396 i0 := x0.AuxInt 34397 if x0.Aux != s { 34398 break 34399 } 34400 _ = x0.Args[2] 34401 if p != x0.Args[0] { 34402 break 34403 } 34404 if idx != x0.Args[1] { 34405 break 34406 } 34407 if mem != x0.Args[2] { 34408 break 34409 } 34410 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)) { 34411 break 34412 } 34413 b = mergePoint(b, x0, x1) 34414 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34415 v.reset(OpCopy) 34416 v.AddArg(v0) 34417 v0.AuxInt = i0 34418 v0.Aux = s 34419 v0.AddArg(p) 34420 v0.AddArg(idx) 34421 v0.AddArg(mem) 34422 return true 34423 } 34424 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 34425 // 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) 34426 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34427 for { 34428 _ = v.Args[1] 34429 x1 := v.Args[0] 34430 if x1.Op != OpS390XMOVHZloadidx { 34431 break 34432 } 34433 i1 := x1.AuxInt 34434 s := x1.Aux 34435 _ = x1.Args[2] 34436 p := x1.Args[0] 34437 idx := x1.Args[1] 34438 mem := x1.Args[2] 34439 sh := v.Args[1] 34440 if sh.Op != OpS390XSLWconst { 34441 break 34442 } 34443 if sh.AuxInt != 16 { 34444 break 34445 } 34446 x0 := sh.Args[0] 34447 if x0.Op != OpS390XMOVHZloadidx { 34448 break 34449 } 34450 i0 := x0.AuxInt 34451 if x0.Aux != s { 34452 break 34453 } 34454 _ = x0.Args[2] 34455 if idx != x0.Args[0] { 34456 break 34457 } 34458 if p != x0.Args[1] { 34459 break 34460 } 34461 if mem != x0.Args[2] { 34462 break 34463 } 34464 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)) { 34465 break 34466 } 34467 b = mergePoint(b, x0, x1) 34468 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34469 v.reset(OpCopy) 34470 v.AddArg(v0) 34471 v0.AuxInt = i0 34472 v0.Aux = s 34473 v0.AddArg(p) 34474 v0.AddArg(idx) 34475 v0.AddArg(mem) 34476 return true 34477 } 34478 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 34479 // 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) 34480 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34481 for { 34482 _ = v.Args[1] 34483 x1 := v.Args[0] 34484 if x1.Op != OpS390XMOVHZloadidx { 34485 break 34486 } 34487 i1 := x1.AuxInt 34488 s := x1.Aux 34489 _ = x1.Args[2] 34490 idx := x1.Args[0] 34491 p := x1.Args[1] 34492 mem := x1.Args[2] 34493 sh := v.Args[1] 34494 if sh.Op != OpS390XSLWconst { 34495 break 34496 } 34497 if sh.AuxInt != 16 { 34498 break 34499 } 34500 x0 := sh.Args[0] 34501 if x0.Op != OpS390XMOVHZloadidx { 34502 break 34503 } 34504 i0 := x0.AuxInt 34505 if x0.Aux != s { 34506 break 34507 } 34508 _ = x0.Args[2] 34509 if idx != x0.Args[0] { 34510 break 34511 } 34512 if p != x0.Args[1] { 34513 break 34514 } 34515 if mem != x0.Args[2] { 34516 break 34517 } 34518 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)) { 34519 break 34520 } 34521 b = mergePoint(b, x0, x1) 34522 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34523 v.reset(OpCopy) 34524 v.AddArg(v0) 34525 v0.AuxInt = i0 34526 v0.Aux = s 34527 v0.AddArg(p) 34528 v0.AddArg(idx) 34529 v0.AddArg(mem) 34530 return true 34531 } 34532 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 34533 // 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) 34534 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34535 for { 34536 _ = v.Args[1] 34537 sh := v.Args[0] 34538 if sh.Op != OpS390XSLWconst { 34539 break 34540 } 34541 if sh.AuxInt != 16 { 34542 break 34543 } 34544 x0 := sh.Args[0] 34545 if x0.Op != OpS390XMOVHZloadidx { 34546 break 34547 } 34548 i0 := x0.AuxInt 34549 s := x0.Aux 34550 _ = x0.Args[2] 34551 p := x0.Args[0] 34552 idx := x0.Args[1] 34553 mem := x0.Args[2] 34554 x1 := v.Args[1] 34555 if x1.Op != OpS390XMOVHZloadidx { 34556 break 34557 } 34558 i1 := x1.AuxInt 34559 if x1.Aux != s { 34560 break 34561 } 34562 _ = x1.Args[2] 34563 if p != x1.Args[0] { 34564 break 34565 } 34566 if idx != x1.Args[1] { 34567 break 34568 } 34569 if mem != x1.Args[2] { 34570 break 34571 } 34572 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)) { 34573 break 34574 } 34575 b = mergePoint(b, x0, x1) 34576 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34577 v.reset(OpCopy) 34578 v.AddArg(v0) 34579 v0.AuxInt = i0 34580 v0.Aux = s 34581 v0.AddArg(p) 34582 v0.AddArg(idx) 34583 v0.AddArg(mem) 34584 return true 34585 } 34586 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 34587 // 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) 34588 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34589 for { 34590 _ = v.Args[1] 34591 sh := v.Args[0] 34592 if sh.Op != OpS390XSLWconst { 34593 break 34594 } 34595 if sh.AuxInt != 16 { 34596 break 34597 } 34598 x0 := sh.Args[0] 34599 if x0.Op != OpS390XMOVHZloadidx { 34600 break 34601 } 34602 i0 := x0.AuxInt 34603 s := x0.Aux 34604 _ = x0.Args[2] 34605 idx := x0.Args[0] 34606 p := x0.Args[1] 34607 mem := x0.Args[2] 34608 x1 := v.Args[1] 34609 if x1.Op != OpS390XMOVHZloadidx { 34610 break 34611 } 34612 i1 := x1.AuxInt 34613 if x1.Aux != s { 34614 break 34615 } 34616 _ = x1.Args[2] 34617 if p != x1.Args[0] { 34618 break 34619 } 34620 if idx != x1.Args[1] { 34621 break 34622 } 34623 if mem != x1.Args[2] { 34624 break 34625 } 34626 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)) { 34627 break 34628 } 34629 b = mergePoint(b, x0, x1) 34630 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34631 v.reset(OpCopy) 34632 v.AddArg(v0) 34633 v0.AuxInt = i0 34634 v0.Aux = s 34635 v0.AddArg(p) 34636 v0.AddArg(idx) 34637 v0.AddArg(mem) 34638 return true 34639 } 34640 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 34641 // 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) 34642 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34643 for { 34644 _ = v.Args[1] 34645 sh := v.Args[0] 34646 if sh.Op != OpS390XSLWconst { 34647 break 34648 } 34649 if sh.AuxInt != 16 { 34650 break 34651 } 34652 x0 := sh.Args[0] 34653 if x0.Op != OpS390XMOVHZloadidx { 34654 break 34655 } 34656 i0 := x0.AuxInt 34657 s := x0.Aux 34658 _ = x0.Args[2] 34659 p := x0.Args[0] 34660 idx := x0.Args[1] 34661 mem := x0.Args[2] 34662 x1 := v.Args[1] 34663 if x1.Op != OpS390XMOVHZloadidx { 34664 break 34665 } 34666 i1 := x1.AuxInt 34667 if x1.Aux != s { 34668 break 34669 } 34670 _ = x1.Args[2] 34671 if idx != x1.Args[0] { 34672 break 34673 } 34674 if p != x1.Args[1] { 34675 break 34676 } 34677 if mem != x1.Args[2] { 34678 break 34679 } 34680 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)) { 34681 break 34682 } 34683 b = mergePoint(b, x0, x1) 34684 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34685 v.reset(OpCopy) 34686 v.AddArg(v0) 34687 v0.AuxInt = i0 34688 v0.Aux = s 34689 v0.AddArg(p) 34690 v0.AddArg(idx) 34691 v0.AddArg(mem) 34692 return true 34693 } 34694 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 34695 // 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) 34696 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 34697 for { 34698 _ = v.Args[1] 34699 sh := v.Args[0] 34700 if sh.Op != OpS390XSLWconst { 34701 break 34702 } 34703 if sh.AuxInt != 16 { 34704 break 34705 } 34706 x0 := sh.Args[0] 34707 if x0.Op != OpS390XMOVHZloadidx { 34708 break 34709 } 34710 i0 := x0.AuxInt 34711 s := x0.Aux 34712 _ = x0.Args[2] 34713 idx := x0.Args[0] 34714 p := x0.Args[1] 34715 mem := x0.Args[2] 34716 x1 := v.Args[1] 34717 if x1.Op != OpS390XMOVHZloadidx { 34718 break 34719 } 34720 i1 := x1.AuxInt 34721 if x1.Aux != s { 34722 break 34723 } 34724 _ = x1.Args[2] 34725 if idx != x1.Args[0] { 34726 break 34727 } 34728 if p != x1.Args[1] { 34729 break 34730 } 34731 if mem != x1.Args[2] { 34732 break 34733 } 34734 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)) { 34735 break 34736 } 34737 b = mergePoint(b, x0, x1) 34738 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 34739 v.reset(OpCopy) 34740 v.AddArg(v0) 34741 v0.AuxInt = i0 34742 v0.Aux = s 34743 v0.AddArg(p) 34744 v0.AddArg(idx) 34745 v0.AddArg(mem) 34746 return true 34747 } 34748 // 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)) 34749 // 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) 34750 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34751 for { 34752 _ = v.Args[1] 34753 s0 := v.Args[0] 34754 if s0.Op != OpS390XSLWconst { 34755 break 34756 } 34757 j0 := s0.AuxInt 34758 x0 := s0.Args[0] 34759 if x0.Op != OpS390XMOVBZloadidx { 34760 break 34761 } 34762 i0 := x0.AuxInt 34763 s := x0.Aux 34764 _ = x0.Args[2] 34765 p := x0.Args[0] 34766 idx := x0.Args[1] 34767 mem := x0.Args[2] 34768 or := v.Args[1] 34769 if or.Op != OpS390XORW { 34770 break 34771 } 34772 _ = or.Args[1] 34773 s1 := or.Args[0] 34774 if s1.Op != OpS390XSLWconst { 34775 break 34776 } 34777 j1 := s1.AuxInt 34778 x1 := s1.Args[0] 34779 if x1.Op != OpS390XMOVBZloadidx { 34780 break 34781 } 34782 i1 := x1.AuxInt 34783 if x1.Aux != s { 34784 break 34785 } 34786 _ = x1.Args[2] 34787 if p != x1.Args[0] { 34788 break 34789 } 34790 if idx != x1.Args[1] { 34791 break 34792 } 34793 if mem != x1.Args[2] { 34794 break 34795 } 34796 y := or.Args[1] 34797 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)) { 34798 break 34799 } 34800 b = mergePoint(b, x0, x1) 34801 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34802 v.reset(OpCopy) 34803 v.AddArg(v0) 34804 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34805 v1.AuxInt = j1 34806 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34807 v2.AuxInt = i0 34808 v2.Aux = s 34809 v2.AddArg(p) 34810 v2.AddArg(idx) 34811 v2.AddArg(mem) 34812 v1.AddArg(v2) 34813 v0.AddArg(v1) 34814 v0.AddArg(y) 34815 return true 34816 } 34817 // 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)) 34818 // 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) 34819 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34820 for { 34821 _ = v.Args[1] 34822 s0 := v.Args[0] 34823 if s0.Op != OpS390XSLWconst { 34824 break 34825 } 34826 j0 := s0.AuxInt 34827 x0 := s0.Args[0] 34828 if x0.Op != OpS390XMOVBZloadidx { 34829 break 34830 } 34831 i0 := x0.AuxInt 34832 s := x0.Aux 34833 _ = x0.Args[2] 34834 idx := x0.Args[0] 34835 p := x0.Args[1] 34836 mem := x0.Args[2] 34837 or := v.Args[1] 34838 if or.Op != OpS390XORW { 34839 break 34840 } 34841 _ = or.Args[1] 34842 s1 := or.Args[0] 34843 if s1.Op != OpS390XSLWconst { 34844 break 34845 } 34846 j1 := s1.AuxInt 34847 x1 := s1.Args[0] 34848 if x1.Op != OpS390XMOVBZloadidx { 34849 break 34850 } 34851 i1 := x1.AuxInt 34852 if x1.Aux != s { 34853 break 34854 } 34855 _ = x1.Args[2] 34856 if p != x1.Args[0] { 34857 break 34858 } 34859 if idx != x1.Args[1] { 34860 break 34861 } 34862 if mem != x1.Args[2] { 34863 break 34864 } 34865 y := or.Args[1] 34866 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)) { 34867 break 34868 } 34869 b = mergePoint(b, x0, x1) 34870 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34871 v.reset(OpCopy) 34872 v.AddArg(v0) 34873 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34874 v1.AuxInt = j1 34875 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34876 v2.AuxInt = i0 34877 v2.Aux = s 34878 v2.AddArg(p) 34879 v2.AddArg(idx) 34880 v2.AddArg(mem) 34881 v1.AddArg(v2) 34882 v0.AddArg(v1) 34883 v0.AddArg(y) 34884 return true 34885 } 34886 // 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)) 34887 // 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) 34888 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34889 for { 34890 _ = v.Args[1] 34891 s0 := v.Args[0] 34892 if s0.Op != OpS390XSLWconst { 34893 break 34894 } 34895 j0 := s0.AuxInt 34896 x0 := s0.Args[0] 34897 if x0.Op != OpS390XMOVBZloadidx { 34898 break 34899 } 34900 i0 := x0.AuxInt 34901 s := x0.Aux 34902 _ = x0.Args[2] 34903 p := x0.Args[0] 34904 idx := x0.Args[1] 34905 mem := x0.Args[2] 34906 or := v.Args[1] 34907 if or.Op != OpS390XORW { 34908 break 34909 } 34910 _ = or.Args[1] 34911 s1 := or.Args[0] 34912 if s1.Op != OpS390XSLWconst { 34913 break 34914 } 34915 j1 := s1.AuxInt 34916 x1 := s1.Args[0] 34917 if x1.Op != OpS390XMOVBZloadidx { 34918 break 34919 } 34920 i1 := x1.AuxInt 34921 if x1.Aux != s { 34922 break 34923 } 34924 _ = x1.Args[2] 34925 if idx != x1.Args[0] { 34926 break 34927 } 34928 if p != x1.Args[1] { 34929 break 34930 } 34931 if mem != x1.Args[2] { 34932 break 34933 } 34934 y := or.Args[1] 34935 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)) { 34936 break 34937 } 34938 b = mergePoint(b, x0, x1) 34939 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34940 v.reset(OpCopy) 34941 v.AddArg(v0) 34942 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34943 v1.AuxInt = j1 34944 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34945 v2.AuxInt = i0 34946 v2.Aux = s 34947 v2.AddArg(p) 34948 v2.AddArg(idx) 34949 v2.AddArg(mem) 34950 v1.AddArg(v2) 34951 v0.AddArg(v1) 34952 v0.AddArg(y) 34953 return true 34954 } 34955 return false 34956 } 34957 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 34958 b := v.Block 34959 _ = b 34960 typ := &b.Func.Config.Types 34961 _ = typ 34962 // 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)) 34963 // 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) 34964 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34965 for { 34966 _ = v.Args[1] 34967 s0 := v.Args[0] 34968 if s0.Op != OpS390XSLWconst { 34969 break 34970 } 34971 j0 := s0.AuxInt 34972 x0 := s0.Args[0] 34973 if x0.Op != OpS390XMOVBZloadidx { 34974 break 34975 } 34976 i0 := x0.AuxInt 34977 s := x0.Aux 34978 _ = x0.Args[2] 34979 idx := x0.Args[0] 34980 p := x0.Args[1] 34981 mem := x0.Args[2] 34982 or := v.Args[1] 34983 if or.Op != OpS390XORW { 34984 break 34985 } 34986 _ = or.Args[1] 34987 s1 := or.Args[0] 34988 if s1.Op != OpS390XSLWconst { 34989 break 34990 } 34991 j1 := s1.AuxInt 34992 x1 := s1.Args[0] 34993 if x1.Op != OpS390XMOVBZloadidx { 34994 break 34995 } 34996 i1 := x1.AuxInt 34997 if x1.Aux != s { 34998 break 34999 } 35000 _ = x1.Args[2] 35001 if idx != x1.Args[0] { 35002 break 35003 } 35004 if p != x1.Args[1] { 35005 break 35006 } 35007 if mem != x1.Args[2] { 35008 break 35009 } 35010 y := or.Args[1] 35011 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)) { 35012 break 35013 } 35014 b = mergePoint(b, x0, x1) 35015 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35016 v.reset(OpCopy) 35017 v.AddArg(v0) 35018 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35019 v1.AuxInt = j1 35020 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35021 v2.AuxInt = i0 35022 v2.Aux = s 35023 v2.AddArg(p) 35024 v2.AddArg(idx) 35025 v2.AddArg(mem) 35026 v1.AddArg(v2) 35027 v0.AddArg(v1) 35028 v0.AddArg(y) 35029 return true 35030 } 35031 // 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)))) 35032 // 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) 35033 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35034 for { 35035 _ = v.Args[1] 35036 s0 := v.Args[0] 35037 if s0.Op != OpS390XSLWconst { 35038 break 35039 } 35040 j0 := s0.AuxInt 35041 x0 := s0.Args[0] 35042 if x0.Op != OpS390XMOVBZloadidx { 35043 break 35044 } 35045 i0 := x0.AuxInt 35046 s := x0.Aux 35047 _ = x0.Args[2] 35048 p := x0.Args[0] 35049 idx := x0.Args[1] 35050 mem := x0.Args[2] 35051 or := v.Args[1] 35052 if or.Op != OpS390XORW { 35053 break 35054 } 35055 _ = or.Args[1] 35056 y := or.Args[0] 35057 s1 := or.Args[1] 35058 if s1.Op != OpS390XSLWconst { 35059 break 35060 } 35061 j1 := s1.AuxInt 35062 x1 := s1.Args[0] 35063 if x1.Op != OpS390XMOVBZloadidx { 35064 break 35065 } 35066 i1 := x1.AuxInt 35067 if x1.Aux != s { 35068 break 35069 } 35070 _ = x1.Args[2] 35071 if p != x1.Args[0] { 35072 break 35073 } 35074 if idx != x1.Args[1] { 35075 break 35076 } 35077 if mem != x1.Args[2] { 35078 break 35079 } 35080 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)) { 35081 break 35082 } 35083 b = mergePoint(b, x0, x1) 35084 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35085 v.reset(OpCopy) 35086 v.AddArg(v0) 35087 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35088 v1.AuxInt = j1 35089 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35090 v2.AuxInt = i0 35091 v2.Aux = s 35092 v2.AddArg(p) 35093 v2.AddArg(idx) 35094 v2.AddArg(mem) 35095 v1.AddArg(v2) 35096 v0.AddArg(v1) 35097 v0.AddArg(y) 35098 return true 35099 } 35100 // 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)))) 35101 // 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) 35102 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35103 for { 35104 _ = v.Args[1] 35105 s0 := v.Args[0] 35106 if s0.Op != OpS390XSLWconst { 35107 break 35108 } 35109 j0 := s0.AuxInt 35110 x0 := s0.Args[0] 35111 if x0.Op != OpS390XMOVBZloadidx { 35112 break 35113 } 35114 i0 := x0.AuxInt 35115 s := x0.Aux 35116 _ = x0.Args[2] 35117 idx := x0.Args[0] 35118 p := x0.Args[1] 35119 mem := x0.Args[2] 35120 or := v.Args[1] 35121 if or.Op != OpS390XORW { 35122 break 35123 } 35124 _ = or.Args[1] 35125 y := or.Args[0] 35126 s1 := or.Args[1] 35127 if s1.Op != OpS390XSLWconst { 35128 break 35129 } 35130 j1 := s1.AuxInt 35131 x1 := s1.Args[0] 35132 if x1.Op != OpS390XMOVBZloadidx { 35133 break 35134 } 35135 i1 := x1.AuxInt 35136 if x1.Aux != s { 35137 break 35138 } 35139 _ = x1.Args[2] 35140 if p != x1.Args[0] { 35141 break 35142 } 35143 if idx != x1.Args[1] { 35144 break 35145 } 35146 if mem != x1.Args[2] { 35147 break 35148 } 35149 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)) { 35150 break 35151 } 35152 b = mergePoint(b, x0, x1) 35153 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35154 v.reset(OpCopy) 35155 v.AddArg(v0) 35156 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35157 v1.AuxInt = j1 35158 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35159 v2.AuxInt = i0 35160 v2.Aux = s 35161 v2.AddArg(p) 35162 v2.AddArg(idx) 35163 v2.AddArg(mem) 35164 v1.AddArg(v2) 35165 v0.AddArg(v1) 35166 v0.AddArg(y) 35167 return true 35168 } 35169 // 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)))) 35170 // 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) 35171 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35172 for { 35173 _ = v.Args[1] 35174 s0 := v.Args[0] 35175 if s0.Op != OpS390XSLWconst { 35176 break 35177 } 35178 j0 := s0.AuxInt 35179 x0 := s0.Args[0] 35180 if x0.Op != OpS390XMOVBZloadidx { 35181 break 35182 } 35183 i0 := x0.AuxInt 35184 s := x0.Aux 35185 _ = x0.Args[2] 35186 p := x0.Args[0] 35187 idx := x0.Args[1] 35188 mem := x0.Args[2] 35189 or := v.Args[1] 35190 if or.Op != OpS390XORW { 35191 break 35192 } 35193 _ = or.Args[1] 35194 y := or.Args[0] 35195 s1 := or.Args[1] 35196 if s1.Op != OpS390XSLWconst { 35197 break 35198 } 35199 j1 := s1.AuxInt 35200 x1 := s1.Args[0] 35201 if x1.Op != OpS390XMOVBZloadidx { 35202 break 35203 } 35204 i1 := x1.AuxInt 35205 if x1.Aux != s { 35206 break 35207 } 35208 _ = x1.Args[2] 35209 if idx != x1.Args[0] { 35210 break 35211 } 35212 if p != x1.Args[1] { 35213 break 35214 } 35215 if mem != x1.Args[2] { 35216 break 35217 } 35218 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)) { 35219 break 35220 } 35221 b = mergePoint(b, x0, x1) 35222 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35223 v.reset(OpCopy) 35224 v.AddArg(v0) 35225 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35226 v1.AuxInt = j1 35227 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35228 v2.AuxInt = i0 35229 v2.Aux = s 35230 v2.AddArg(p) 35231 v2.AddArg(idx) 35232 v2.AddArg(mem) 35233 v1.AddArg(v2) 35234 v0.AddArg(v1) 35235 v0.AddArg(y) 35236 return true 35237 } 35238 // 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)))) 35239 // 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) 35240 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35241 for { 35242 _ = v.Args[1] 35243 s0 := v.Args[0] 35244 if s0.Op != OpS390XSLWconst { 35245 break 35246 } 35247 j0 := s0.AuxInt 35248 x0 := s0.Args[0] 35249 if x0.Op != OpS390XMOVBZloadidx { 35250 break 35251 } 35252 i0 := x0.AuxInt 35253 s := x0.Aux 35254 _ = x0.Args[2] 35255 idx := x0.Args[0] 35256 p := x0.Args[1] 35257 mem := x0.Args[2] 35258 or := v.Args[1] 35259 if or.Op != OpS390XORW { 35260 break 35261 } 35262 _ = or.Args[1] 35263 y := or.Args[0] 35264 s1 := or.Args[1] 35265 if s1.Op != OpS390XSLWconst { 35266 break 35267 } 35268 j1 := s1.AuxInt 35269 x1 := s1.Args[0] 35270 if x1.Op != OpS390XMOVBZloadidx { 35271 break 35272 } 35273 i1 := x1.AuxInt 35274 if x1.Aux != s { 35275 break 35276 } 35277 _ = x1.Args[2] 35278 if idx != x1.Args[0] { 35279 break 35280 } 35281 if p != x1.Args[1] { 35282 break 35283 } 35284 if mem != x1.Args[2] { 35285 break 35286 } 35287 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)) { 35288 break 35289 } 35290 b = mergePoint(b, x0, x1) 35291 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35292 v.reset(OpCopy) 35293 v.AddArg(v0) 35294 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35295 v1.AuxInt = j1 35296 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35297 v2.AuxInt = i0 35298 v2.Aux = s 35299 v2.AddArg(p) 35300 v2.AddArg(idx) 35301 v2.AddArg(mem) 35302 v1.AddArg(v2) 35303 v0.AddArg(v1) 35304 v0.AddArg(y) 35305 return true 35306 } 35307 // 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))) 35308 // 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) 35309 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35310 for { 35311 _ = v.Args[1] 35312 or := v.Args[0] 35313 if or.Op != OpS390XORW { 35314 break 35315 } 35316 _ = or.Args[1] 35317 s1 := or.Args[0] 35318 if s1.Op != OpS390XSLWconst { 35319 break 35320 } 35321 j1 := s1.AuxInt 35322 x1 := s1.Args[0] 35323 if x1.Op != OpS390XMOVBZloadidx { 35324 break 35325 } 35326 i1 := x1.AuxInt 35327 s := x1.Aux 35328 _ = x1.Args[2] 35329 p := x1.Args[0] 35330 idx := x1.Args[1] 35331 mem := x1.Args[2] 35332 y := or.Args[1] 35333 s0 := v.Args[1] 35334 if s0.Op != OpS390XSLWconst { 35335 break 35336 } 35337 j0 := s0.AuxInt 35338 x0 := s0.Args[0] 35339 if x0.Op != OpS390XMOVBZloadidx { 35340 break 35341 } 35342 i0 := x0.AuxInt 35343 if x0.Aux != s { 35344 break 35345 } 35346 _ = x0.Args[2] 35347 if p != x0.Args[0] { 35348 break 35349 } 35350 if idx != x0.Args[1] { 35351 break 35352 } 35353 if mem != x0.Args[2] { 35354 break 35355 } 35356 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)) { 35357 break 35358 } 35359 b = mergePoint(b, x0, x1) 35360 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35361 v.reset(OpCopy) 35362 v.AddArg(v0) 35363 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35364 v1.AuxInt = j1 35365 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35366 v2.AuxInt = i0 35367 v2.Aux = s 35368 v2.AddArg(p) 35369 v2.AddArg(idx) 35370 v2.AddArg(mem) 35371 v1.AddArg(v2) 35372 v0.AddArg(v1) 35373 v0.AddArg(y) 35374 return true 35375 } 35376 // 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))) 35377 // 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) 35378 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35379 for { 35380 _ = v.Args[1] 35381 or := v.Args[0] 35382 if or.Op != OpS390XORW { 35383 break 35384 } 35385 _ = or.Args[1] 35386 s1 := or.Args[0] 35387 if s1.Op != OpS390XSLWconst { 35388 break 35389 } 35390 j1 := s1.AuxInt 35391 x1 := s1.Args[0] 35392 if x1.Op != OpS390XMOVBZloadidx { 35393 break 35394 } 35395 i1 := x1.AuxInt 35396 s := x1.Aux 35397 _ = x1.Args[2] 35398 idx := x1.Args[0] 35399 p := x1.Args[1] 35400 mem := x1.Args[2] 35401 y := or.Args[1] 35402 s0 := v.Args[1] 35403 if s0.Op != OpS390XSLWconst { 35404 break 35405 } 35406 j0 := s0.AuxInt 35407 x0 := s0.Args[0] 35408 if x0.Op != OpS390XMOVBZloadidx { 35409 break 35410 } 35411 i0 := x0.AuxInt 35412 if x0.Aux != s { 35413 break 35414 } 35415 _ = x0.Args[2] 35416 if p != x0.Args[0] { 35417 break 35418 } 35419 if idx != x0.Args[1] { 35420 break 35421 } 35422 if mem != x0.Args[2] { 35423 break 35424 } 35425 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)) { 35426 break 35427 } 35428 b = mergePoint(b, x0, x1) 35429 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35430 v.reset(OpCopy) 35431 v.AddArg(v0) 35432 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35433 v1.AuxInt = j1 35434 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35435 v2.AuxInt = i0 35436 v2.Aux = s 35437 v2.AddArg(p) 35438 v2.AddArg(idx) 35439 v2.AddArg(mem) 35440 v1.AddArg(v2) 35441 v0.AddArg(v1) 35442 v0.AddArg(y) 35443 return true 35444 } 35445 // 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))) 35446 // 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) 35447 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35448 for { 35449 _ = v.Args[1] 35450 or := v.Args[0] 35451 if or.Op != OpS390XORW { 35452 break 35453 } 35454 _ = or.Args[1] 35455 y := or.Args[0] 35456 s1 := or.Args[1] 35457 if s1.Op != OpS390XSLWconst { 35458 break 35459 } 35460 j1 := s1.AuxInt 35461 x1 := s1.Args[0] 35462 if x1.Op != OpS390XMOVBZloadidx { 35463 break 35464 } 35465 i1 := x1.AuxInt 35466 s := x1.Aux 35467 _ = x1.Args[2] 35468 p := x1.Args[0] 35469 idx := x1.Args[1] 35470 mem := x1.Args[2] 35471 s0 := v.Args[1] 35472 if s0.Op != OpS390XSLWconst { 35473 break 35474 } 35475 j0 := s0.AuxInt 35476 x0 := s0.Args[0] 35477 if x0.Op != OpS390XMOVBZloadidx { 35478 break 35479 } 35480 i0 := x0.AuxInt 35481 if x0.Aux != s { 35482 break 35483 } 35484 _ = x0.Args[2] 35485 if p != x0.Args[0] { 35486 break 35487 } 35488 if idx != x0.Args[1] { 35489 break 35490 } 35491 if mem != x0.Args[2] { 35492 break 35493 } 35494 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)) { 35495 break 35496 } 35497 b = mergePoint(b, x0, x1) 35498 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35499 v.reset(OpCopy) 35500 v.AddArg(v0) 35501 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35502 v1.AuxInt = j1 35503 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35504 v2.AuxInt = i0 35505 v2.Aux = s 35506 v2.AddArg(p) 35507 v2.AddArg(idx) 35508 v2.AddArg(mem) 35509 v1.AddArg(v2) 35510 v0.AddArg(v1) 35511 v0.AddArg(y) 35512 return true 35513 } 35514 // 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))) 35515 // 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) 35516 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35517 for { 35518 _ = v.Args[1] 35519 or := v.Args[0] 35520 if or.Op != OpS390XORW { 35521 break 35522 } 35523 _ = or.Args[1] 35524 y := or.Args[0] 35525 s1 := or.Args[1] 35526 if s1.Op != OpS390XSLWconst { 35527 break 35528 } 35529 j1 := s1.AuxInt 35530 x1 := s1.Args[0] 35531 if x1.Op != OpS390XMOVBZloadidx { 35532 break 35533 } 35534 i1 := x1.AuxInt 35535 s := x1.Aux 35536 _ = x1.Args[2] 35537 idx := x1.Args[0] 35538 p := x1.Args[1] 35539 mem := x1.Args[2] 35540 s0 := v.Args[1] 35541 if s0.Op != OpS390XSLWconst { 35542 break 35543 } 35544 j0 := s0.AuxInt 35545 x0 := s0.Args[0] 35546 if x0.Op != OpS390XMOVBZloadidx { 35547 break 35548 } 35549 i0 := x0.AuxInt 35550 if x0.Aux != s { 35551 break 35552 } 35553 _ = x0.Args[2] 35554 if p != x0.Args[0] { 35555 break 35556 } 35557 if idx != x0.Args[1] { 35558 break 35559 } 35560 if mem != x0.Args[2] { 35561 break 35562 } 35563 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)) { 35564 break 35565 } 35566 b = mergePoint(b, x0, x1) 35567 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35568 v.reset(OpCopy) 35569 v.AddArg(v0) 35570 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35571 v1.AuxInt = j1 35572 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35573 v2.AuxInt = i0 35574 v2.Aux = s 35575 v2.AddArg(p) 35576 v2.AddArg(idx) 35577 v2.AddArg(mem) 35578 v1.AddArg(v2) 35579 v0.AddArg(v1) 35580 v0.AddArg(y) 35581 return true 35582 } 35583 // 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))) 35584 // 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) 35585 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35586 for { 35587 _ = v.Args[1] 35588 or := v.Args[0] 35589 if or.Op != OpS390XORW { 35590 break 35591 } 35592 _ = or.Args[1] 35593 s1 := or.Args[0] 35594 if s1.Op != OpS390XSLWconst { 35595 break 35596 } 35597 j1 := s1.AuxInt 35598 x1 := s1.Args[0] 35599 if x1.Op != OpS390XMOVBZloadidx { 35600 break 35601 } 35602 i1 := x1.AuxInt 35603 s := x1.Aux 35604 _ = x1.Args[2] 35605 p := x1.Args[0] 35606 idx := x1.Args[1] 35607 mem := x1.Args[2] 35608 y := or.Args[1] 35609 s0 := v.Args[1] 35610 if s0.Op != OpS390XSLWconst { 35611 break 35612 } 35613 j0 := s0.AuxInt 35614 x0 := s0.Args[0] 35615 if x0.Op != OpS390XMOVBZloadidx { 35616 break 35617 } 35618 i0 := x0.AuxInt 35619 if x0.Aux != s { 35620 break 35621 } 35622 _ = x0.Args[2] 35623 if idx != x0.Args[0] { 35624 break 35625 } 35626 if p != x0.Args[1] { 35627 break 35628 } 35629 if mem != x0.Args[2] { 35630 break 35631 } 35632 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)) { 35633 break 35634 } 35635 b = mergePoint(b, x0, x1) 35636 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35637 v.reset(OpCopy) 35638 v.AddArg(v0) 35639 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35640 v1.AuxInt = j1 35641 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35642 v2.AuxInt = i0 35643 v2.Aux = s 35644 v2.AddArg(p) 35645 v2.AddArg(idx) 35646 v2.AddArg(mem) 35647 v1.AddArg(v2) 35648 v0.AddArg(v1) 35649 v0.AddArg(y) 35650 return true 35651 } 35652 return false 35653 } 35654 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 35655 b := v.Block 35656 _ = b 35657 typ := &b.Func.Config.Types 35658 _ = typ 35659 // 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))) 35660 // 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) 35661 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35662 for { 35663 _ = v.Args[1] 35664 or := v.Args[0] 35665 if or.Op != OpS390XORW { 35666 break 35667 } 35668 _ = or.Args[1] 35669 s1 := or.Args[0] 35670 if s1.Op != OpS390XSLWconst { 35671 break 35672 } 35673 j1 := s1.AuxInt 35674 x1 := s1.Args[0] 35675 if x1.Op != OpS390XMOVBZloadidx { 35676 break 35677 } 35678 i1 := x1.AuxInt 35679 s := x1.Aux 35680 _ = x1.Args[2] 35681 idx := x1.Args[0] 35682 p := x1.Args[1] 35683 mem := x1.Args[2] 35684 y := or.Args[1] 35685 s0 := v.Args[1] 35686 if s0.Op != OpS390XSLWconst { 35687 break 35688 } 35689 j0 := s0.AuxInt 35690 x0 := s0.Args[0] 35691 if x0.Op != OpS390XMOVBZloadidx { 35692 break 35693 } 35694 i0 := x0.AuxInt 35695 if x0.Aux != s { 35696 break 35697 } 35698 _ = x0.Args[2] 35699 if idx != x0.Args[0] { 35700 break 35701 } 35702 if p != x0.Args[1] { 35703 break 35704 } 35705 if mem != x0.Args[2] { 35706 break 35707 } 35708 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)) { 35709 break 35710 } 35711 b = mergePoint(b, x0, x1) 35712 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35713 v.reset(OpCopy) 35714 v.AddArg(v0) 35715 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35716 v1.AuxInt = j1 35717 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35718 v2.AuxInt = i0 35719 v2.Aux = s 35720 v2.AddArg(p) 35721 v2.AddArg(idx) 35722 v2.AddArg(mem) 35723 v1.AddArg(v2) 35724 v0.AddArg(v1) 35725 v0.AddArg(y) 35726 return true 35727 } 35728 // 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))) 35729 // 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) 35730 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35731 for { 35732 _ = v.Args[1] 35733 or := v.Args[0] 35734 if or.Op != OpS390XORW { 35735 break 35736 } 35737 _ = or.Args[1] 35738 y := or.Args[0] 35739 s1 := or.Args[1] 35740 if s1.Op != OpS390XSLWconst { 35741 break 35742 } 35743 j1 := s1.AuxInt 35744 x1 := s1.Args[0] 35745 if x1.Op != OpS390XMOVBZloadidx { 35746 break 35747 } 35748 i1 := x1.AuxInt 35749 s := x1.Aux 35750 _ = x1.Args[2] 35751 p := x1.Args[0] 35752 idx := x1.Args[1] 35753 mem := x1.Args[2] 35754 s0 := v.Args[1] 35755 if s0.Op != OpS390XSLWconst { 35756 break 35757 } 35758 j0 := s0.AuxInt 35759 x0 := s0.Args[0] 35760 if x0.Op != OpS390XMOVBZloadidx { 35761 break 35762 } 35763 i0 := x0.AuxInt 35764 if x0.Aux != s { 35765 break 35766 } 35767 _ = x0.Args[2] 35768 if idx != x0.Args[0] { 35769 break 35770 } 35771 if p != x0.Args[1] { 35772 break 35773 } 35774 if mem != x0.Args[2] { 35775 break 35776 } 35777 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)) { 35778 break 35779 } 35780 b = mergePoint(b, x0, x1) 35781 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35782 v.reset(OpCopy) 35783 v.AddArg(v0) 35784 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35785 v1.AuxInt = j1 35786 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35787 v2.AuxInt = i0 35788 v2.Aux = s 35789 v2.AddArg(p) 35790 v2.AddArg(idx) 35791 v2.AddArg(mem) 35792 v1.AddArg(v2) 35793 v0.AddArg(v1) 35794 v0.AddArg(y) 35795 return true 35796 } 35797 // 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))) 35798 // 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) 35799 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 35800 for { 35801 _ = v.Args[1] 35802 or := v.Args[0] 35803 if or.Op != OpS390XORW { 35804 break 35805 } 35806 _ = or.Args[1] 35807 y := or.Args[0] 35808 s1 := or.Args[1] 35809 if s1.Op != OpS390XSLWconst { 35810 break 35811 } 35812 j1 := s1.AuxInt 35813 x1 := s1.Args[0] 35814 if x1.Op != OpS390XMOVBZloadidx { 35815 break 35816 } 35817 i1 := x1.AuxInt 35818 s := x1.Aux 35819 _ = x1.Args[2] 35820 idx := x1.Args[0] 35821 p := x1.Args[1] 35822 mem := x1.Args[2] 35823 s0 := v.Args[1] 35824 if s0.Op != OpS390XSLWconst { 35825 break 35826 } 35827 j0 := s0.AuxInt 35828 x0 := s0.Args[0] 35829 if x0.Op != OpS390XMOVBZloadidx { 35830 break 35831 } 35832 i0 := x0.AuxInt 35833 if x0.Aux != s { 35834 break 35835 } 35836 _ = x0.Args[2] 35837 if idx != x0.Args[0] { 35838 break 35839 } 35840 if p != x0.Args[1] { 35841 break 35842 } 35843 if mem != x0.Args[2] { 35844 break 35845 } 35846 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)) { 35847 break 35848 } 35849 b = mergePoint(b, x0, x1) 35850 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35851 v.reset(OpCopy) 35852 v.AddArg(v0) 35853 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35854 v1.AuxInt = j1 35855 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 35856 v2.AuxInt = i0 35857 v2.Aux = s 35858 v2.AddArg(p) 35859 v2.AddArg(idx) 35860 v2.AddArg(mem) 35861 v1.AddArg(v2) 35862 v0.AddArg(v1) 35863 v0.AddArg(y) 35864 return true 35865 } 35866 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 35867 // 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) 35868 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 35869 for { 35870 _ = v.Args[1] 35871 x0 := v.Args[0] 35872 if x0.Op != OpS390XMOVBZload { 35873 break 35874 } 35875 i0 := x0.AuxInt 35876 s := x0.Aux 35877 _ = x0.Args[1] 35878 p := x0.Args[0] 35879 mem := x0.Args[1] 35880 sh := v.Args[1] 35881 if sh.Op != OpS390XSLWconst { 35882 break 35883 } 35884 if sh.AuxInt != 8 { 35885 break 35886 } 35887 x1 := sh.Args[0] 35888 if x1.Op != OpS390XMOVBZload { 35889 break 35890 } 35891 i1 := x1.AuxInt 35892 if x1.Aux != s { 35893 break 35894 } 35895 _ = x1.Args[1] 35896 if p != x1.Args[0] { 35897 break 35898 } 35899 if mem != x1.Args[1] { 35900 break 35901 } 35902 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)) { 35903 break 35904 } 35905 b = mergePoint(b, x0, x1) 35906 v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 35907 v.reset(OpCopy) 35908 v.AddArg(v0) 35909 v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 35910 v1.AuxInt = i0 35911 v1.Aux = s 35912 v1.AddArg(p) 35913 v1.AddArg(mem) 35914 v0.AddArg(v1) 35915 return true 35916 } 35917 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 35918 // 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) 35919 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 35920 for { 35921 _ = v.Args[1] 35922 sh := v.Args[0] 35923 if sh.Op != OpS390XSLWconst { 35924 break 35925 } 35926 if sh.AuxInt != 8 { 35927 break 35928 } 35929 x1 := sh.Args[0] 35930 if x1.Op != OpS390XMOVBZload { 35931 break 35932 } 35933 i1 := x1.AuxInt 35934 s := x1.Aux 35935 _ = x1.Args[1] 35936 p := x1.Args[0] 35937 mem := x1.Args[1] 35938 x0 := v.Args[1] 35939 if x0.Op != OpS390XMOVBZload { 35940 break 35941 } 35942 i0 := x0.AuxInt 35943 if x0.Aux != s { 35944 break 35945 } 35946 _ = x0.Args[1] 35947 if p != x0.Args[0] { 35948 break 35949 } 35950 if mem != x0.Args[1] { 35951 break 35952 } 35953 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)) { 35954 break 35955 } 35956 b = mergePoint(b, x0, x1) 35957 v0 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 35958 v.reset(OpCopy) 35959 v.AddArg(v0) 35960 v1 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 35961 v1.AuxInt = i0 35962 v1.Aux = s 35963 v1.AddArg(p) 35964 v1.AddArg(mem) 35965 v0.AddArg(v1) 35966 return true 35967 } 35968 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 35969 // 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) 35970 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 35971 for { 35972 _ = v.Args[1] 35973 r0 := v.Args[0] 35974 if r0.Op != OpS390XMOVHZreg { 35975 break 35976 } 35977 x0 := r0.Args[0] 35978 if x0.Op != OpS390XMOVHBRload { 35979 break 35980 } 35981 i0 := x0.AuxInt 35982 s := x0.Aux 35983 _ = x0.Args[1] 35984 p := x0.Args[0] 35985 mem := x0.Args[1] 35986 sh := v.Args[1] 35987 if sh.Op != OpS390XSLWconst { 35988 break 35989 } 35990 if sh.AuxInt != 16 { 35991 break 35992 } 35993 r1 := sh.Args[0] 35994 if r1.Op != OpS390XMOVHZreg { 35995 break 35996 } 35997 x1 := r1.Args[0] 35998 if x1.Op != OpS390XMOVHBRload { 35999 break 36000 } 36001 i1 := x1.AuxInt 36002 if x1.Aux != s { 36003 break 36004 } 36005 _ = x1.Args[1] 36006 if p != x1.Args[0] { 36007 break 36008 } 36009 if mem != x1.Args[1] { 36010 break 36011 } 36012 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)) { 36013 break 36014 } 36015 b = mergePoint(b, x0, x1) 36016 v0 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) 36017 v.reset(OpCopy) 36018 v.AddArg(v0) 36019 v0.AuxInt = i0 36020 v0.Aux = s 36021 v0.AddArg(p) 36022 v0.AddArg(mem) 36023 return true 36024 } 36025 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 36026 // 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) 36027 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 36028 for { 36029 _ = v.Args[1] 36030 sh := v.Args[0] 36031 if sh.Op != OpS390XSLWconst { 36032 break 36033 } 36034 if sh.AuxInt != 16 { 36035 break 36036 } 36037 r1 := sh.Args[0] 36038 if r1.Op != OpS390XMOVHZreg { 36039 break 36040 } 36041 x1 := r1.Args[0] 36042 if x1.Op != OpS390XMOVHBRload { 36043 break 36044 } 36045 i1 := x1.AuxInt 36046 s := x1.Aux 36047 _ = x1.Args[1] 36048 p := x1.Args[0] 36049 mem := x1.Args[1] 36050 r0 := v.Args[1] 36051 if r0.Op != OpS390XMOVHZreg { 36052 break 36053 } 36054 x0 := r0.Args[0] 36055 if x0.Op != OpS390XMOVHBRload { 36056 break 36057 } 36058 i0 := x0.AuxInt 36059 if x0.Aux != s { 36060 break 36061 } 36062 _ = x0.Args[1] 36063 if p != x0.Args[0] { 36064 break 36065 } 36066 if mem != x0.Args[1] { 36067 break 36068 } 36069 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)) { 36070 break 36071 } 36072 b = mergePoint(b, x0, x1) 36073 v0 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) 36074 v.reset(OpCopy) 36075 v.AddArg(v0) 36076 v0.AuxInt = i0 36077 v0.Aux = s 36078 v0.AddArg(p) 36079 v0.AddArg(mem) 36080 return true 36081 } 36082 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 36083 // 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) 36084 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36085 for { 36086 _ = v.Args[1] 36087 s1 := v.Args[0] 36088 if s1.Op != OpS390XSLWconst { 36089 break 36090 } 36091 j1 := s1.AuxInt 36092 x1 := s1.Args[0] 36093 if x1.Op != OpS390XMOVBZload { 36094 break 36095 } 36096 i1 := x1.AuxInt 36097 s := x1.Aux 36098 _ = x1.Args[1] 36099 p := x1.Args[0] 36100 mem := x1.Args[1] 36101 or := v.Args[1] 36102 if or.Op != OpS390XORW { 36103 break 36104 } 36105 _ = or.Args[1] 36106 s0 := or.Args[0] 36107 if s0.Op != OpS390XSLWconst { 36108 break 36109 } 36110 j0 := s0.AuxInt 36111 x0 := s0.Args[0] 36112 if x0.Op != OpS390XMOVBZload { 36113 break 36114 } 36115 i0 := x0.AuxInt 36116 if x0.Aux != s { 36117 break 36118 } 36119 _ = x0.Args[1] 36120 if p != x0.Args[0] { 36121 break 36122 } 36123 if mem != x0.Args[1] { 36124 break 36125 } 36126 y := or.Args[1] 36127 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)) { 36128 break 36129 } 36130 b = mergePoint(b, x0, x1) 36131 v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) 36132 v.reset(OpCopy) 36133 v.AddArg(v0) 36134 v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) 36135 v1.AuxInt = j0 36136 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 36137 v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 36138 v3.AuxInt = i0 36139 v3.Aux = s 36140 v3.AddArg(p) 36141 v3.AddArg(mem) 36142 v2.AddArg(v3) 36143 v1.AddArg(v2) 36144 v0.AddArg(v1) 36145 v0.AddArg(y) 36146 return true 36147 } 36148 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 36149 // 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) 36150 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36151 for { 36152 _ = v.Args[1] 36153 s1 := v.Args[0] 36154 if s1.Op != OpS390XSLWconst { 36155 break 36156 } 36157 j1 := s1.AuxInt 36158 x1 := s1.Args[0] 36159 if x1.Op != OpS390XMOVBZload { 36160 break 36161 } 36162 i1 := x1.AuxInt 36163 s := x1.Aux 36164 _ = x1.Args[1] 36165 p := x1.Args[0] 36166 mem := x1.Args[1] 36167 or := v.Args[1] 36168 if or.Op != OpS390XORW { 36169 break 36170 } 36171 _ = or.Args[1] 36172 y := or.Args[0] 36173 s0 := or.Args[1] 36174 if s0.Op != OpS390XSLWconst { 36175 break 36176 } 36177 j0 := s0.AuxInt 36178 x0 := s0.Args[0] 36179 if x0.Op != OpS390XMOVBZload { 36180 break 36181 } 36182 i0 := x0.AuxInt 36183 if x0.Aux != s { 36184 break 36185 } 36186 _ = x0.Args[1] 36187 if p != x0.Args[0] { 36188 break 36189 } 36190 if mem != x0.Args[1] { 36191 break 36192 } 36193 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)) { 36194 break 36195 } 36196 b = mergePoint(b, x0, x1) 36197 v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) 36198 v.reset(OpCopy) 36199 v.AddArg(v0) 36200 v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) 36201 v1.AuxInt = j0 36202 v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) 36203 v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) 36204 v3.AuxInt = i0 36205 v3.Aux = s 36206 v3.AddArg(p) 36207 v3.AddArg(mem) 36208 v2.AddArg(v3) 36209 v1.AddArg(v2) 36210 v0.AddArg(v1) 36211 v0.AddArg(y) 36212 return true 36213 } 36214 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 36215 // 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) 36216 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36217 for { 36218 _ = v.Args[1] 36219 or := v.Args[0] 36220 if or.Op != OpS390XORW { 36221 break 36222 } 36223 _ = or.Args[1] 36224 s0 := or.Args[0] 36225 if s0.Op != OpS390XSLWconst { 36226 break 36227 } 36228 j0 := s0.AuxInt 36229 x0 := s0.Args[0] 36230 if x0.Op != OpS390XMOVBZload { 36231 break 36232 } 36233 i0 := x0.AuxInt 36234 s := x0.Aux 36235 _ = x0.Args[1] 36236 p := x0.Args[0] 36237 mem := x0.Args[1] 36238 y := or.Args[1] 36239 s1 := v.Args[1] 36240 if s1.Op != OpS390XSLWconst { 36241 break 36242 } 36243 j1 := s1.AuxInt 36244 x1 := s1.Args[0] 36245 if x1.Op != OpS390XMOVBZload { 36246 break 36247 } 36248 i1 := x1.AuxInt 36249 if x1.Aux != s { 36250 break 36251 } 36252 _ = x1.Args[1] 36253 if p != x1.Args[0] { 36254 break 36255 } 36256 if mem != x1.Args[1] { 36257 break 36258 } 36259 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)) { 36260 break 36261 } 36262 b = mergePoint(b, x0, x1) 36263 v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) 36264 v.reset(OpCopy) 36265 v.AddArg(v0) 36266 v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) 36267 v1.AuxInt = j0 36268 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 36269 v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 36270 v3.AuxInt = i0 36271 v3.Aux = s 36272 v3.AddArg(p) 36273 v3.AddArg(mem) 36274 v2.AddArg(v3) 36275 v1.AddArg(v2) 36276 v0.AddArg(v1) 36277 v0.AddArg(y) 36278 return true 36279 } 36280 return false 36281 } 36282 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 36283 b := v.Block 36284 _ = b 36285 typ := &b.Func.Config.Types 36286 _ = typ 36287 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 36288 // 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) 36289 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 36290 for { 36291 _ = v.Args[1] 36292 or := v.Args[0] 36293 if or.Op != OpS390XORW { 36294 break 36295 } 36296 _ = or.Args[1] 36297 y := or.Args[0] 36298 s0 := or.Args[1] 36299 if s0.Op != OpS390XSLWconst { 36300 break 36301 } 36302 j0 := s0.AuxInt 36303 x0 := s0.Args[0] 36304 if x0.Op != OpS390XMOVBZload { 36305 break 36306 } 36307 i0 := x0.AuxInt 36308 s := x0.Aux 36309 _ = x0.Args[1] 36310 p := x0.Args[0] 36311 mem := x0.Args[1] 36312 s1 := v.Args[1] 36313 if s1.Op != OpS390XSLWconst { 36314 break 36315 } 36316 j1 := s1.AuxInt 36317 x1 := s1.Args[0] 36318 if x1.Op != OpS390XMOVBZload { 36319 break 36320 } 36321 i1 := x1.AuxInt 36322 if x1.Aux != s { 36323 break 36324 } 36325 _ = x1.Args[1] 36326 if p != x1.Args[0] { 36327 break 36328 } 36329 if mem != x1.Args[1] { 36330 break 36331 } 36332 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)) { 36333 break 36334 } 36335 b = mergePoint(b, x0, x1) 36336 v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) 36337 v.reset(OpCopy) 36338 v.AddArg(v0) 36339 v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) 36340 v1.AuxInt = j0 36341 v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) 36342 v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) 36343 v3.AuxInt = i0 36344 v3.Aux = s 36345 v3.AddArg(p) 36346 v3.AddArg(mem) 36347 v2.AddArg(v3) 36348 v1.AddArg(v2) 36349 v0.AddArg(v1) 36350 v0.AddArg(y) 36351 return true 36352 } 36353 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 36354 // 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) 36355 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36356 for { 36357 _ = v.Args[1] 36358 x0 := v.Args[0] 36359 if x0.Op != OpS390XMOVBZloadidx { 36360 break 36361 } 36362 i0 := x0.AuxInt 36363 s := x0.Aux 36364 _ = x0.Args[2] 36365 p := x0.Args[0] 36366 idx := x0.Args[1] 36367 mem := x0.Args[2] 36368 sh := v.Args[1] 36369 if sh.Op != OpS390XSLWconst { 36370 break 36371 } 36372 if sh.AuxInt != 8 { 36373 break 36374 } 36375 x1 := sh.Args[0] 36376 if x1.Op != OpS390XMOVBZloadidx { 36377 break 36378 } 36379 i1 := x1.AuxInt 36380 if x1.Aux != s { 36381 break 36382 } 36383 _ = x1.Args[2] 36384 if p != x1.Args[0] { 36385 break 36386 } 36387 if idx != x1.Args[1] { 36388 break 36389 } 36390 if mem != x1.Args[2] { 36391 break 36392 } 36393 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)) { 36394 break 36395 } 36396 b = mergePoint(b, x0, x1) 36397 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36398 v.reset(OpCopy) 36399 v.AddArg(v0) 36400 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36401 v1.AuxInt = i0 36402 v1.Aux = s 36403 v1.AddArg(p) 36404 v1.AddArg(idx) 36405 v1.AddArg(mem) 36406 v0.AddArg(v1) 36407 return true 36408 } 36409 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 36410 // 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) 36411 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36412 for { 36413 _ = v.Args[1] 36414 x0 := v.Args[0] 36415 if x0.Op != OpS390XMOVBZloadidx { 36416 break 36417 } 36418 i0 := x0.AuxInt 36419 s := x0.Aux 36420 _ = x0.Args[2] 36421 idx := x0.Args[0] 36422 p := x0.Args[1] 36423 mem := x0.Args[2] 36424 sh := v.Args[1] 36425 if sh.Op != OpS390XSLWconst { 36426 break 36427 } 36428 if sh.AuxInt != 8 { 36429 break 36430 } 36431 x1 := sh.Args[0] 36432 if x1.Op != OpS390XMOVBZloadidx { 36433 break 36434 } 36435 i1 := x1.AuxInt 36436 if x1.Aux != s { 36437 break 36438 } 36439 _ = x1.Args[2] 36440 if p != x1.Args[0] { 36441 break 36442 } 36443 if idx != x1.Args[1] { 36444 break 36445 } 36446 if mem != x1.Args[2] { 36447 break 36448 } 36449 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)) { 36450 break 36451 } 36452 b = mergePoint(b, x0, x1) 36453 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36454 v.reset(OpCopy) 36455 v.AddArg(v0) 36456 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36457 v1.AuxInt = i0 36458 v1.Aux = s 36459 v1.AddArg(p) 36460 v1.AddArg(idx) 36461 v1.AddArg(mem) 36462 v0.AddArg(v1) 36463 return true 36464 } 36465 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 36466 // 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) 36467 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36468 for { 36469 _ = v.Args[1] 36470 x0 := v.Args[0] 36471 if x0.Op != OpS390XMOVBZloadidx { 36472 break 36473 } 36474 i0 := x0.AuxInt 36475 s := x0.Aux 36476 _ = x0.Args[2] 36477 p := x0.Args[0] 36478 idx := x0.Args[1] 36479 mem := x0.Args[2] 36480 sh := v.Args[1] 36481 if sh.Op != OpS390XSLWconst { 36482 break 36483 } 36484 if sh.AuxInt != 8 { 36485 break 36486 } 36487 x1 := sh.Args[0] 36488 if x1.Op != OpS390XMOVBZloadidx { 36489 break 36490 } 36491 i1 := x1.AuxInt 36492 if x1.Aux != s { 36493 break 36494 } 36495 _ = x1.Args[2] 36496 if idx != x1.Args[0] { 36497 break 36498 } 36499 if p != x1.Args[1] { 36500 break 36501 } 36502 if mem != x1.Args[2] { 36503 break 36504 } 36505 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)) { 36506 break 36507 } 36508 b = mergePoint(b, x0, x1) 36509 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36510 v.reset(OpCopy) 36511 v.AddArg(v0) 36512 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36513 v1.AuxInt = i0 36514 v1.Aux = s 36515 v1.AddArg(p) 36516 v1.AddArg(idx) 36517 v1.AddArg(mem) 36518 v0.AddArg(v1) 36519 return true 36520 } 36521 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 36522 // 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) 36523 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36524 for { 36525 _ = v.Args[1] 36526 x0 := v.Args[0] 36527 if x0.Op != OpS390XMOVBZloadidx { 36528 break 36529 } 36530 i0 := x0.AuxInt 36531 s := x0.Aux 36532 _ = x0.Args[2] 36533 idx := x0.Args[0] 36534 p := x0.Args[1] 36535 mem := x0.Args[2] 36536 sh := v.Args[1] 36537 if sh.Op != OpS390XSLWconst { 36538 break 36539 } 36540 if sh.AuxInt != 8 { 36541 break 36542 } 36543 x1 := sh.Args[0] 36544 if x1.Op != OpS390XMOVBZloadidx { 36545 break 36546 } 36547 i1 := x1.AuxInt 36548 if x1.Aux != s { 36549 break 36550 } 36551 _ = x1.Args[2] 36552 if idx != x1.Args[0] { 36553 break 36554 } 36555 if p != x1.Args[1] { 36556 break 36557 } 36558 if mem != x1.Args[2] { 36559 break 36560 } 36561 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)) { 36562 break 36563 } 36564 b = mergePoint(b, x0, x1) 36565 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36566 v.reset(OpCopy) 36567 v.AddArg(v0) 36568 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36569 v1.AuxInt = i0 36570 v1.Aux = s 36571 v1.AddArg(p) 36572 v1.AddArg(idx) 36573 v1.AddArg(mem) 36574 v0.AddArg(v1) 36575 return true 36576 } 36577 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 36578 // 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) 36579 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36580 for { 36581 _ = v.Args[1] 36582 sh := v.Args[0] 36583 if sh.Op != OpS390XSLWconst { 36584 break 36585 } 36586 if sh.AuxInt != 8 { 36587 break 36588 } 36589 x1 := sh.Args[0] 36590 if x1.Op != OpS390XMOVBZloadidx { 36591 break 36592 } 36593 i1 := x1.AuxInt 36594 s := x1.Aux 36595 _ = x1.Args[2] 36596 p := x1.Args[0] 36597 idx := x1.Args[1] 36598 mem := x1.Args[2] 36599 x0 := v.Args[1] 36600 if x0.Op != OpS390XMOVBZloadidx { 36601 break 36602 } 36603 i0 := x0.AuxInt 36604 if x0.Aux != s { 36605 break 36606 } 36607 _ = x0.Args[2] 36608 if p != x0.Args[0] { 36609 break 36610 } 36611 if idx != x0.Args[1] { 36612 break 36613 } 36614 if mem != x0.Args[2] { 36615 break 36616 } 36617 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)) { 36618 break 36619 } 36620 b = mergePoint(b, x0, x1) 36621 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36622 v.reset(OpCopy) 36623 v.AddArg(v0) 36624 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36625 v1.AuxInt = i0 36626 v1.Aux = s 36627 v1.AddArg(p) 36628 v1.AddArg(idx) 36629 v1.AddArg(mem) 36630 v0.AddArg(v1) 36631 return true 36632 } 36633 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 36634 // 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) 36635 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36636 for { 36637 _ = v.Args[1] 36638 sh := v.Args[0] 36639 if sh.Op != OpS390XSLWconst { 36640 break 36641 } 36642 if sh.AuxInt != 8 { 36643 break 36644 } 36645 x1 := sh.Args[0] 36646 if x1.Op != OpS390XMOVBZloadidx { 36647 break 36648 } 36649 i1 := x1.AuxInt 36650 s := x1.Aux 36651 _ = x1.Args[2] 36652 idx := x1.Args[0] 36653 p := x1.Args[1] 36654 mem := x1.Args[2] 36655 x0 := v.Args[1] 36656 if x0.Op != OpS390XMOVBZloadidx { 36657 break 36658 } 36659 i0 := x0.AuxInt 36660 if x0.Aux != s { 36661 break 36662 } 36663 _ = x0.Args[2] 36664 if p != x0.Args[0] { 36665 break 36666 } 36667 if idx != x0.Args[1] { 36668 break 36669 } 36670 if mem != x0.Args[2] { 36671 break 36672 } 36673 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)) { 36674 break 36675 } 36676 b = mergePoint(b, x0, x1) 36677 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36678 v.reset(OpCopy) 36679 v.AddArg(v0) 36680 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36681 v1.AuxInt = i0 36682 v1.Aux = s 36683 v1.AddArg(p) 36684 v1.AddArg(idx) 36685 v1.AddArg(mem) 36686 v0.AddArg(v1) 36687 return true 36688 } 36689 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 36690 // 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) 36691 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36692 for { 36693 _ = v.Args[1] 36694 sh := v.Args[0] 36695 if sh.Op != OpS390XSLWconst { 36696 break 36697 } 36698 if sh.AuxInt != 8 { 36699 break 36700 } 36701 x1 := sh.Args[0] 36702 if x1.Op != OpS390XMOVBZloadidx { 36703 break 36704 } 36705 i1 := x1.AuxInt 36706 s := x1.Aux 36707 _ = x1.Args[2] 36708 p := x1.Args[0] 36709 idx := x1.Args[1] 36710 mem := x1.Args[2] 36711 x0 := v.Args[1] 36712 if x0.Op != OpS390XMOVBZloadidx { 36713 break 36714 } 36715 i0 := x0.AuxInt 36716 if x0.Aux != s { 36717 break 36718 } 36719 _ = x0.Args[2] 36720 if idx != x0.Args[0] { 36721 break 36722 } 36723 if p != x0.Args[1] { 36724 break 36725 } 36726 if mem != x0.Args[2] { 36727 break 36728 } 36729 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)) { 36730 break 36731 } 36732 b = mergePoint(b, x0, x1) 36733 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36734 v.reset(OpCopy) 36735 v.AddArg(v0) 36736 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36737 v1.AuxInt = i0 36738 v1.Aux = s 36739 v1.AddArg(p) 36740 v1.AddArg(idx) 36741 v1.AddArg(mem) 36742 v0.AddArg(v1) 36743 return true 36744 } 36745 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 36746 // 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) 36747 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 36748 for { 36749 _ = v.Args[1] 36750 sh := v.Args[0] 36751 if sh.Op != OpS390XSLWconst { 36752 break 36753 } 36754 if sh.AuxInt != 8 { 36755 break 36756 } 36757 x1 := sh.Args[0] 36758 if x1.Op != OpS390XMOVBZloadidx { 36759 break 36760 } 36761 i1 := x1.AuxInt 36762 s := x1.Aux 36763 _ = x1.Args[2] 36764 idx := x1.Args[0] 36765 p := x1.Args[1] 36766 mem := x1.Args[2] 36767 x0 := v.Args[1] 36768 if x0.Op != OpS390XMOVBZloadidx { 36769 break 36770 } 36771 i0 := x0.AuxInt 36772 if x0.Aux != s { 36773 break 36774 } 36775 _ = x0.Args[2] 36776 if idx != x0.Args[0] { 36777 break 36778 } 36779 if p != x0.Args[1] { 36780 break 36781 } 36782 if mem != x0.Args[2] { 36783 break 36784 } 36785 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)) { 36786 break 36787 } 36788 b = mergePoint(b, x0, x1) 36789 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36790 v.reset(OpCopy) 36791 v.AddArg(v0) 36792 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36793 v1.AuxInt = i0 36794 v1.Aux = s 36795 v1.AddArg(p) 36796 v1.AddArg(idx) 36797 v1.AddArg(mem) 36798 v0.AddArg(v1) 36799 return true 36800 } 36801 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 36802 // 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) 36803 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36804 for { 36805 _ = v.Args[1] 36806 r0 := v.Args[0] 36807 if r0.Op != OpS390XMOVHZreg { 36808 break 36809 } 36810 x0 := r0.Args[0] 36811 if x0.Op != OpS390XMOVHBRloadidx { 36812 break 36813 } 36814 i0 := x0.AuxInt 36815 s := x0.Aux 36816 _ = x0.Args[2] 36817 p := x0.Args[0] 36818 idx := x0.Args[1] 36819 mem := x0.Args[2] 36820 sh := v.Args[1] 36821 if sh.Op != OpS390XSLWconst { 36822 break 36823 } 36824 if sh.AuxInt != 16 { 36825 break 36826 } 36827 r1 := sh.Args[0] 36828 if r1.Op != OpS390XMOVHZreg { 36829 break 36830 } 36831 x1 := r1.Args[0] 36832 if x1.Op != OpS390XMOVHBRloadidx { 36833 break 36834 } 36835 i1 := x1.AuxInt 36836 if x1.Aux != s { 36837 break 36838 } 36839 _ = x1.Args[2] 36840 if p != x1.Args[0] { 36841 break 36842 } 36843 if idx != x1.Args[1] { 36844 break 36845 } 36846 if mem != x1.Args[2] { 36847 break 36848 } 36849 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)) { 36850 break 36851 } 36852 b = mergePoint(b, x0, x1) 36853 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36854 v.reset(OpCopy) 36855 v.AddArg(v0) 36856 v0.AuxInt = i0 36857 v0.Aux = s 36858 v0.AddArg(p) 36859 v0.AddArg(idx) 36860 v0.AddArg(mem) 36861 return true 36862 } 36863 return false 36864 } 36865 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 36866 b := v.Block 36867 _ = b 36868 typ := &b.Func.Config.Types 36869 _ = typ 36870 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 36871 // 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) 36872 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36873 for { 36874 _ = v.Args[1] 36875 r0 := v.Args[0] 36876 if r0.Op != OpS390XMOVHZreg { 36877 break 36878 } 36879 x0 := r0.Args[0] 36880 if x0.Op != OpS390XMOVHBRloadidx { 36881 break 36882 } 36883 i0 := x0.AuxInt 36884 s := x0.Aux 36885 _ = x0.Args[2] 36886 idx := x0.Args[0] 36887 p := x0.Args[1] 36888 mem := x0.Args[2] 36889 sh := v.Args[1] 36890 if sh.Op != OpS390XSLWconst { 36891 break 36892 } 36893 if sh.AuxInt != 16 { 36894 break 36895 } 36896 r1 := sh.Args[0] 36897 if r1.Op != OpS390XMOVHZreg { 36898 break 36899 } 36900 x1 := r1.Args[0] 36901 if x1.Op != OpS390XMOVHBRloadidx { 36902 break 36903 } 36904 i1 := x1.AuxInt 36905 if x1.Aux != s { 36906 break 36907 } 36908 _ = x1.Args[2] 36909 if p != x1.Args[0] { 36910 break 36911 } 36912 if idx != x1.Args[1] { 36913 break 36914 } 36915 if mem != x1.Args[2] { 36916 break 36917 } 36918 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)) { 36919 break 36920 } 36921 b = mergePoint(b, x0, x1) 36922 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36923 v.reset(OpCopy) 36924 v.AddArg(v0) 36925 v0.AuxInt = i0 36926 v0.Aux = s 36927 v0.AddArg(p) 36928 v0.AddArg(idx) 36929 v0.AddArg(mem) 36930 return true 36931 } 36932 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 36933 // 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) 36934 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36935 for { 36936 _ = v.Args[1] 36937 r0 := v.Args[0] 36938 if r0.Op != OpS390XMOVHZreg { 36939 break 36940 } 36941 x0 := r0.Args[0] 36942 if x0.Op != OpS390XMOVHBRloadidx { 36943 break 36944 } 36945 i0 := x0.AuxInt 36946 s := x0.Aux 36947 _ = x0.Args[2] 36948 p := x0.Args[0] 36949 idx := x0.Args[1] 36950 mem := x0.Args[2] 36951 sh := v.Args[1] 36952 if sh.Op != OpS390XSLWconst { 36953 break 36954 } 36955 if sh.AuxInt != 16 { 36956 break 36957 } 36958 r1 := sh.Args[0] 36959 if r1.Op != OpS390XMOVHZreg { 36960 break 36961 } 36962 x1 := r1.Args[0] 36963 if x1.Op != OpS390XMOVHBRloadidx { 36964 break 36965 } 36966 i1 := x1.AuxInt 36967 if x1.Aux != s { 36968 break 36969 } 36970 _ = x1.Args[2] 36971 if idx != x1.Args[0] { 36972 break 36973 } 36974 if p != x1.Args[1] { 36975 break 36976 } 36977 if mem != x1.Args[2] { 36978 break 36979 } 36980 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)) { 36981 break 36982 } 36983 b = mergePoint(b, x0, x1) 36984 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 36985 v.reset(OpCopy) 36986 v.AddArg(v0) 36987 v0.AuxInt = i0 36988 v0.Aux = s 36989 v0.AddArg(p) 36990 v0.AddArg(idx) 36991 v0.AddArg(mem) 36992 return true 36993 } 36994 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 36995 // 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) 36996 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 36997 for { 36998 _ = v.Args[1] 36999 r0 := v.Args[0] 37000 if r0.Op != OpS390XMOVHZreg { 37001 break 37002 } 37003 x0 := r0.Args[0] 37004 if x0.Op != OpS390XMOVHBRloadidx { 37005 break 37006 } 37007 i0 := x0.AuxInt 37008 s := x0.Aux 37009 _ = x0.Args[2] 37010 idx := x0.Args[0] 37011 p := x0.Args[1] 37012 mem := x0.Args[2] 37013 sh := v.Args[1] 37014 if sh.Op != OpS390XSLWconst { 37015 break 37016 } 37017 if sh.AuxInt != 16 { 37018 break 37019 } 37020 r1 := sh.Args[0] 37021 if r1.Op != OpS390XMOVHZreg { 37022 break 37023 } 37024 x1 := r1.Args[0] 37025 if x1.Op != OpS390XMOVHBRloadidx { 37026 break 37027 } 37028 i1 := x1.AuxInt 37029 if x1.Aux != s { 37030 break 37031 } 37032 _ = x1.Args[2] 37033 if idx != x1.Args[0] { 37034 break 37035 } 37036 if p != x1.Args[1] { 37037 break 37038 } 37039 if mem != x1.Args[2] { 37040 break 37041 } 37042 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)) { 37043 break 37044 } 37045 b = mergePoint(b, x0, x1) 37046 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37047 v.reset(OpCopy) 37048 v.AddArg(v0) 37049 v0.AuxInt = i0 37050 v0.Aux = s 37051 v0.AddArg(p) 37052 v0.AddArg(idx) 37053 v0.AddArg(mem) 37054 return true 37055 } 37056 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 37057 // 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) 37058 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37059 for { 37060 _ = v.Args[1] 37061 sh := v.Args[0] 37062 if sh.Op != OpS390XSLWconst { 37063 break 37064 } 37065 if sh.AuxInt != 16 { 37066 break 37067 } 37068 r1 := sh.Args[0] 37069 if r1.Op != OpS390XMOVHZreg { 37070 break 37071 } 37072 x1 := r1.Args[0] 37073 if x1.Op != OpS390XMOVHBRloadidx { 37074 break 37075 } 37076 i1 := x1.AuxInt 37077 s := x1.Aux 37078 _ = x1.Args[2] 37079 p := x1.Args[0] 37080 idx := x1.Args[1] 37081 mem := x1.Args[2] 37082 r0 := v.Args[1] 37083 if r0.Op != OpS390XMOVHZreg { 37084 break 37085 } 37086 x0 := r0.Args[0] 37087 if x0.Op != OpS390XMOVHBRloadidx { 37088 break 37089 } 37090 i0 := x0.AuxInt 37091 if x0.Aux != s { 37092 break 37093 } 37094 _ = x0.Args[2] 37095 if p != x0.Args[0] { 37096 break 37097 } 37098 if idx != x0.Args[1] { 37099 break 37100 } 37101 if mem != x0.Args[2] { 37102 break 37103 } 37104 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)) { 37105 break 37106 } 37107 b = mergePoint(b, x0, x1) 37108 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37109 v.reset(OpCopy) 37110 v.AddArg(v0) 37111 v0.AuxInt = i0 37112 v0.Aux = s 37113 v0.AddArg(p) 37114 v0.AddArg(idx) 37115 v0.AddArg(mem) 37116 return true 37117 } 37118 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 37119 // 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) 37120 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37121 for { 37122 _ = v.Args[1] 37123 sh := v.Args[0] 37124 if sh.Op != OpS390XSLWconst { 37125 break 37126 } 37127 if sh.AuxInt != 16 { 37128 break 37129 } 37130 r1 := sh.Args[0] 37131 if r1.Op != OpS390XMOVHZreg { 37132 break 37133 } 37134 x1 := r1.Args[0] 37135 if x1.Op != OpS390XMOVHBRloadidx { 37136 break 37137 } 37138 i1 := x1.AuxInt 37139 s := x1.Aux 37140 _ = x1.Args[2] 37141 idx := x1.Args[0] 37142 p := x1.Args[1] 37143 mem := x1.Args[2] 37144 r0 := v.Args[1] 37145 if r0.Op != OpS390XMOVHZreg { 37146 break 37147 } 37148 x0 := r0.Args[0] 37149 if x0.Op != OpS390XMOVHBRloadidx { 37150 break 37151 } 37152 i0 := x0.AuxInt 37153 if x0.Aux != s { 37154 break 37155 } 37156 _ = x0.Args[2] 37157 if p != x0.Args[0] { 37158 break 37159 } 37160 if idx != x0.Args[1] { 37161 break 37162 } 37163 if mem != x0.Args[2] { 37164 break 37165 } 37166 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)) { 37167 break 37168 } 37169 b = mergePoint(b, x0, x1) 37170 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37171 v.reset(OpCopy) 37172 v.AddArg(v0) 37173 v0.AuxInt = i0 37174 v0.Aux = s 37175 v0.AddArg(p) 37176 v0.AddArg(idx) 37177 v0.AddArg(mem) 37178 return true 37179 } 37180 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 37181 // 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) 37182 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37183 for { 37184 _ = v.Args[1] 37185 sh := v.Args[0] 37186 if sh.Op != OpS390XSLWconst { 37187 break 37188 } 37189 if sh.AuxInt != 16 { 37190 break 37191 } 37192 r1 := sh.Args[0] 37193 if r1.Op != OpS390XMOVHZreg { 37194 break 37195 } 37196 x1 := r1.Args[0] 37197 if x1.Op != OpS390XMOVHBRloadidx { 37198 break 37199 } 37200 i1 := x1.AuxInt 37201 s := x1.Aux 37202 _ = x1.Args[2] 37203 p := x1.Args[0] 37204 idx := x1.Args[1] 37205 mem := x1.Args[2] 37206 r0 := v.Args[1] 37207 if r0.Op != OpS390XMOVHZreg { 37208 break 37209 } 37210 x0 := r0.Args[0] 37211 if x0.Op != OpS390XMOVHBRloadidx { 37212 break 37213 } 37214 i0 := x0.AuxInt 37215 if x0.Aux != s { 37216 break 37217 } 37218 _ = x0.Args[2] 37219 if idx != x0.Args[0] { 37220 break 37221 } 37222 if p != x0.Args[1] { 37223 break 37224 } 37225 if mem != x0.Args[2] { 37226 break 37227 } 37228 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)) { 37229 break 37230 } 37231 b = mergePoint(b, x0, x1) 37232 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37233 v.reset(OpCopy) 37234 v.AddArg(v0) 37235 v0.AuxInt = i0 37236 v0.Aux = s 37237 v0.AddArg(p) 37238 v0.AddArg(idx) 37239 v0.AddArg(mem) 37240 return true 37241 } 37242 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 37243 // 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) 37244 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 37245 for { 37246 _ = v.Args[1] 37247 sh := v.Args[0] 37248 if sh.Op != OpS390XSLWconst { 37249 break 37250 } 37251 if sh.AuxInt != 16 { 37252 break 37253 } 37254 r1 := sh.Args[0] 37255 if r1.Op != OpS390XMOVHZreg { 37256 break 37257 } 37258 x1 := r1.Args[0] 37259 if x1.Op != OpS390XMOVHBRloadidx { 37260 break 37261 } 37262 i1 := x1.AuxInt 37263 s := x1.Aux 37264 _ = x1.Args[2] 37265 idx := x1.Args[0] 37266 p := x1.Args[1] 37267 mem := x1.Args[2] 37268 r0 := v.Args[1] 37269 if r0.Op != OpS390XMOVHZreg { 37270 break 37271 } 37272 x0 := r0.Args[0] 37273 if x0.Op != OpS390XMOVHBRloadidx { 37274 break 37275 } 37276 i0 := x0.AuxInt 37277 if x0.Aux != s { 37278 break 37279 } 37280 _ = x0.Args[2] 37281 if idx != x0.Args[0] { 37282 break 37283 } 37284 if p != x0.Args[1] { 37285 break 37286 } 37287 if mem != x0.Args[2] { 37288 break 37289 } 37290 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)) { 37291 break 37292 } 37293 b = mergePoint(b, x0, x1) 37294 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 37295 v.reset(OpCopy) 37296 v.AddArg(v0) 37297 v0.AuxInt = i0 37298 v0.Aux = s 37299 v0.AddArg(p) 37300 v0.AddArg(idx) 37301 v0.AddArg(mem) 37302 return true 37303 } 37304 // 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)) 37305 // 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) 37306 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37307 for { 37308 _ = v.Args[1] 37309 s1 := v.Args[0] 37310 if s1.Op != OpS390XSLWconst { 37311 break 37312 } 37313 j1 := s1.AuxInt 37314 x1 := s1.Args[0] 37315 if x1.Op != OpS390XMOVBZloadidx { 37316 break 37317 } 37318 i1 := x1.AuxInt 37319 s := x1.Aux 37320 _ = x1.Args[2] 37321 p := x1.Args[0] 37322 idx := x1.Args[1] 37323 mem := x1.Args[2] 37324 or := v.Args[1] 37325 if or.Op != OpS390XORW { 37326 break 37327 } 37328 _ = or.Args[1] 37329 s0 := or.Args[0] 37330 if s0.Op != OpS390XSLWconst { 37331 break 37332 } 37333 j0 := s0.AuxInt 37334 x0 := s0.Args[0] 37335 if x0.Op != OpS390XMOVBZloadidx { 37336 break 37337 } 37338 i0 := x0.AuxInt 37339 if x0.Aux != s { 37340 break 37341 } 37342 _ = x0.Args[2] 37343 if p != x0.Args[0] { 37344 break 37345 } 37346 if idx != x0.Args[1] { 37347 break 37348 } 37349 if mem != x0.Args[2] { 37350 break 37351 } 37352 y := or.Args[1] 37353 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)) { 37354 break 37355 } 37356 b = mergePoint(b, x0, x1) 37357 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37358 v.reset(OpCopy) 37359 v.AddArg(v0) 37360 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37361 v1.AuxInt = j0 37362 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37363 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37364 v3.AuxInt = i0 37365 v3.Aux = s 37366 v3.AddArg(p) 37367 v3.AddArg(idx) 37368 v3.AddArg(mem) 37369 v2.AddArg(v3) 37370 v1.AddArg(v2) 37371 v0.AddArg(v1) 37372 v0.AddArg(y) 37373 return true 37374 } 37375 // 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)) 37376 // 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) 37377 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37378 for { 37379 _ = v.Args[1] 37380 s1 := v.Args[0] 37381 if s1.Op != OpS390XSLWconst { 37382 break 37383 } 37384 j1 := s1.AuxInt 37385 x1 := s1.Args[0] 37386 if x1.Op != OpS390XMOVBZloadidx { 37387 break 37388 } 37389 i1 := x1.AuxInt 37390 s := x1.Aux 37391 _ = x1.Args[2] 37392 idx := x1.Args[0] 37393 p := x1.Args[1] 37394 mem := x1.Args[2] 37395 or := v.Args[1] 37396 if or.Op != OpS390XORW { 37397 break 37398 } 37399 _ = or.Args[1] 37400 s0 := or.Args[0] 37401 if s0.Op != OpS390XSLWconst { 37402 break 37403 } 37404 j0 := s0.AuxInt 37405 x0 := s0.Args[0] 37406 if x0.Op != OpS390XMOVBZloadidx { 37407 break 37408 } 37409 i0 := x0.AuxInt 37410 if x0.Aux != s { 37411 break 37412 } 37413 _ = x0.Args[2] 37414 if p != x0.Args[0] { 37415 break 37416 } 37417 if idx != x0.Args[1] { 37418 break 37419 } 37420 if mem != x0.Args[2] { 37421 break 37422 } 37423 y := or.Args[1] 37424 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)) { 37425 break 37426 } 37427 b = mergePoint(b, x0, x1) 37428 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37429 v.reset(OpCopy) 37430 v.AddArg(v0) 37431 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37432 v1.AuxInt = j0 37433 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37434 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37435 v3.AuxInt = i0 37436 v3.Aux = s 37437 v3.AddArg(p) 37438 v3.AddArg(idx) 37439 v3.AddArg(mem) 37440 v2.AddArg(v3) 37441 v1.AddArg(v2) 37442 v0.AddArg(v1) 37443 v0.AddArg(y) 37444 return true 37445 } 37446 // 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)) 37447 // 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) 37448 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37449 for { 37450 _ = v.Args[1] 37451 s1 := v.Args[0] 37452 if s1.Op != OpS390XSLWconst { 37453 break 37454 } 37455 j1 := s1.AuxInt 37456 x1 := s1.Args[0] 37457 if x1.Op != OpS390XMOVBZloadidx { 37458 break 37459 } 37460 i1 := x1.AuxInt 37461 s := x1.Aux 37462 _ = x1.Args[2] 37463 p := x1.Args[0] 37464 idx := x1.Args[1] 37465 mem := x1.Args[2] 37466 or := v.Args[1] 37467 if or.Op != OpS390XORW { 37468 break 37469 } 37470 _ = or.Args[1] 37471 s0 := or.Args[0] 37472 if s0.Op != OpS390XSLWconst { 37473 break 37474 } 37475 j0 := s0.AuxInt 37476 x0 := s0.Args[0] 37477 if x0.Op != OpS390XMOVBZloadidx { 37478 break 37479 } 37480 i0 := x0.AuxInt 37481 if x0.Aux != s { 37482 break 37483 } 37484 _ = x0.Args[2] 37485 if idx != x0.Args[0] { 37486 break 37487 } 37488 if p != x0.Args[1] { 37489 break 37490 } 37491 if mem != x0.Args[2] { 37492 break 37493 } 37494 y := or.Args[1] 37495 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)) { 37496 break 37497 } 37498 b = mergePoint(b, x0, x1) 37499 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37500 v.reset(OpCopy) 37501 v.AddArg(v0) 37502 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37503 v1.AuxInt = j0 37504 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37505 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37506 v3.AuxInt = i0 37507 v3.Aux = s 37508 v3.AddArg(p) 37509 v3.AddArg(idx) 37510 v3.AddArg(mem) 37511 v2.AddArg(v3) 37512 v1.AddArg(v2) 37513 v0.AddArg(v1) 37514 v0.AddArg(y) 37515 return true 37516 } 37517 return false 37518 } 37519 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 37520 b := v.Block 37521 _ = b 37522 typ := &b.Func.Config.Types 37523 _ = typ 37524 // 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)) 37525 // 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) 37526 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37527 for { 37528 _ = v.Args[1] 37529 s1 := v.Args[0] 37530 if s1.Op != OpS390XSLWconst { 37531 break 37532 } 37533 j1 := s1.AuxInt 37534 x1 := s1.Args[0] 37535 if x1.Op != OpS390XMOVBZloadidx { 37536 break 37537 } 37538 i1 := x1.AuxInt 37539 s := x1.Aux 37540 _ = x1.Args[2] 37541 idx := x1.Args[0] 37542 p := x1.Args[1] 37543 mem := x1.Args[2] 37544 or := v.Args[1] 37545 if or.Op != OpS390XORW { 37546 break 37547 } 37548 _ = or.Args[1] 37549 s0 := or.Args[0] 37550 if s0.Op != OpS390XSLWconst { 37551 break 37552 } 37553 j0 := s0.AuxInt 37554 x0 := s0.Args[0] 37555 if x0.Op != OpS390XMOVBZloadidx { 37556 break 37557 } 37558 i0 := x0.AuxInt 37559 if x0.Aux != s { 37560 break 37561 } 37562 _ = x0.Args[2] 37563 if idx != x0.Args[0] { 37564 break 37565 } 37566 if p != x0.Args[1] { 37567 break 37568 } 37569 if mem != x0.Args[2] { 37570 break 37571 } 37572 y := or.Args[1] 37573 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)) { 37574 break 37575 } 37576 b = mergePoint(b, x0, x1) 37577 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37578 v.reset(OpCopy) 37579 v.AddArg(v0) 37580 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37581 v1.AuxInt = j0 37582 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37583 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37584 v3.AuxInt = i0 37585 v3.Aux = s 37586 v3.AddArg(p) 37587 v3.AddArg(idx) 37588 v3.AddArg(mem) 37589 v2.AddArg(v3) 37590 v1.AddArg(v2) 37591 v0.AddArg(v1) 37592 v0.AddArg(y) 37593 return true 37594 } 37595 // 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)))) 37596 // 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) 37597 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37598 for { 37599 _ = v.Args[1] 37600 s1 := v.Args[0] 37601 if s1.Op != OpS390XSLWconst { 37602 break 37603 } 37604 j1 := s1.AuxInt 37605 x1 := s1.Args[0] 37606 if x1.Op != OpS390XMOVBZloadidx { 37607 break 37608 } 37609 i1 := x1.AuxInt 37610 s := x1.Aux 37611 _ = x1.Args[2] 37612 p := x1.Args[0] 37613 idx := x1.Args[1] 37614 mem := x1.Args[2] 37615 or := v.Args[1] 37616 if or.Op != OpS390XORW { 37617 break 37618 } 37619 _ = or.Args[1] 37620 y := or.Args[0] 37621 s0 := or.Args[1] 37622 if s0.Op != OpS390XSLWconst { 37623 break 37624 } 37625 j0 := s0.AuxInt 37626 x0 := s0.Args[0] 37627 if x0.Op != OpS390XMOVBZloadidx { 37628 break 37629 } 37630 i0 := x0.AuxInt 37631 if x0.Aux != s { 37632 break 37633 } 37634 _ = x0.Args[2] 37635 if p != x0.Args[0] { 37636 break 37637 } 37638 if idx != x0.Args[1] { 37639 break 37640 } 37641 if mem != x0.Args[2] { 37642 break 37643 } 37644 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)) { 37645 break 37646 } 37647 b = mergePoint(b, x0, x1) 37648 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37649 v.reset(OpCopy) 37650 v.AddArg(v0) 37651 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37652 v1.AuxInt = j0 37653 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37654 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37655 v3.AuxInt = i0 37656 v3.Aux = s 37657 v3.AddArg(p) 37658 v3.AddArg(idx) 37659 v3.AddArg(mem) 37660 v2.AddArg(v3) 37661 v1.AddArg(v2) 37662 v0.AddArg(v1) 37663 v0.AddArg(y) 37664 return true 37665 } 37666 // 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)))) 37667 // 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) 37668 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37669 for { 37670 _ = v.Args[1] 37671 s1 := v.Args[0] 37672 if s1.Op != OpS390XSLWconst { 37673 break 37674 } 37675 j1 := s1.AuxInt 37676 x1 := s1.Args[0] 37677 if x1.Op != OpS390XMOVBZloadidx { 37678 break 37679 } 37680 i1 := x1.AuxInt 37681 s := x1.Aux 37682 _ = x1.Args[2] 37683 idx := x1.Args[0] 37684 p := x1.Args[1] 37685 mem := x1.Args[2] 37686 or := v.Args[1] 37687 if or.Op != OpS390XORW { 37688 break 37689 } 37690 _ = or.Args[1] 37691 y := or.Args[0] 37692 s0 := or.Args[1] 37693 if s0.Op != OpS390XSLWconst { 37694 break 37695 } 37696 j0 := s0.AuxInt 37697 x0 := s0.Args[0] 37698 if x0.Op != OpS390XMOVBZloadidx { 37699 break 37700 } 37701 i0 := x0.AuxInt 37702 if x0.Aux != s { 37703 break 37704 } 37705 _ = x0.Args[2] 37706 if p != x0.Args[0] { 37707 break 37708 } 37709 if idx != x0.Args[1] { 37710 break 37711 } 37712 if mem != x0.Args[2] { 37713 break 37714 } 37715 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)) { 37716 break 37717 } 37718 b = mergePoint(b, x0, x1) 37719 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37720 v.reset(OpCopy) 37721 v.AddArg(v0) 37722 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37723 v1.AuxInt = j0 37724 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37725 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37726 v3.AuxInt = i0 37727 v3.Aux = s 37728 v3.AddArg(p) 37729 v3.AddArg(idx) 37730 v3.AddArg(mem) 37731 v2.AddArg(v3) 37732 v1.AddArg(v2) 37733 v0.AddArg(v1) 37734 v0.AddArg(y) 37735 return true 37736 } 37737 // 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)))) 37738 // 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) 37739 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37740 for { 37741 _ = v.Args[1] 37742 s1 := v.Args[0] 37743 if s1.Op != OpS390XSLWconst { 37744 break 37745 } 37746 j1 := s1.AuxInt 37747 x1 := s1.Args[0] 37748 if x1.Op != OpS390XMOVBZloadidx { 37749 break 37750 } 37751 i1 := x1.AuxInt 37752 s := x1.Aux 37753 _ = x1.Args[2] 37754 p := x1.Args[0] 37755 idx := x1.Args[1] 37756 mem := x1.Args[2] 37757 or := v.Args[1] 37758 if or.Op != OpS390XORW { 37759 break 37760 } 37761 _ = or.Args[1] 37762 y := or.Args[0] 37763 s0 := or.Args[1] 37764 if s0.Op != OpS390XSLWconst { 37765 break 37766 } 37767 j0 := s0.AuxInt 37768 x0 := s0.Args[0] 37769 if x0.Op != OpS390XMOVBZloadidx { 37770 break 37771 } 37772 i0 := x0.AuxInt 37773 if x0.Aux != s { 37774 break 37775 } 37776 _ = x0.Args[2] 37777 if idx != x0.Args[0] { 37778 break 37779 } 37780 if p != x0.Args[1] { 37781 break 37782 } 37783 if mem != x0.Args[2] { 37784 break 37785 } 37786 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)) { 37787 break 37788 } 37789 b = mergePoint(b, x0, x1) 37790 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37791 v.reset(OpCopy) 37792 v.AddArg(v0) 37793 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37794 v1.AuxInt = j0 37795 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37796 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37797 v3.AuxInt = i0 37798 v3.Aux = s 37799 v3.AddArg(p) 37800 v3.AddArg(idx) 37801 v3.AddArg(mem) 37802 v2.AddArg(v3) 37803 v1.AddArg(v2) 37804 v0.AddArg(v1) 37805 v0.AddArg(y) 37806 return true 37807 } 37808 // 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)))) 37809 // 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) 37810 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37811 for { 37812 _ = v.Args[1] 37813 s1 := v.Args[0] 37814 if s1.Op != OpS390XSLWconst { 37815 break 37816 } 37817 j1 := s1.AuxInt 37818 x1 := s1.Args[0] 37819 if x1.Op != OpS390XMOVBZloadidx { 37820 break 37821 } 37822 i1 := x1.AuxInt 37823 s := x1.Aux 37824 _ = x1.Args[2] 37825 idx := x1.Args[0] 37826 p := x1.Args[1] 37827 mem := x1.Args[2] 37828 or := v.Args[1] 37829 if or.Op != OpS390XORW { 37830 break 37831 } 37832 _ = or.Args[1] 37833 y := or.Args[0] 37834 s0 := or.Args[1] 37835 if s0.Op != OpS390XSLWconst { 37836 break 37837 } 37838 j0 := s0.AuxInt 37839 x0 := s0.Args[0] 37840 if x0.Op != OpS390XMOVBZloadidx { 37841 break 37842 } 37843 i0 := x0.AuxInt 37844 if x0.Aux != s { 37845 break 37846 } 37847 _ = x0.Args[2] 37848 if idx != x0.Args[0] { 37849 break 37850 } 37851 if p != x0.Args[1] { 37852 break 37853 } 37854 if mem != x0.Args[2] { 37855 break 37856 } 37857 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)) { 37858 break 37859 } 37860 b = mergePoint(b, x0, x1) 37861 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37862 v.reset(OpCopy) 37863 v.AddArg(v0) 37864 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37865 v1.AuxInt = j0 37866 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37867 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37868 v3.AuxInt = i0 37869 v3.Aux = s 37870 v3.AddArg(p) 37871 v3.AddArg(idx) 37872 v3.AddArg(mem) 37873 v2.AddArg(v3) 37874 v1.AddArg(v2) 37875 v0.AddArg(v1) 37876 v0.AddArg(y) 37877 return true 37878 } 37879 // 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))) 37880 // 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) 37881 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37882 for { 37883 _ = v.Args[1] 37884 or := v.Args[0] 37885 if or.Op != OpS390XORW { 37886 break 37887 } 37888 _ = or.Args[1] 37889 s0 := or.Args[0] 37890 if s0.Op != OpS390XSLWconst { 37891 break 37892 } 37893 j0 := s0.AuxInt 37894 x0 := s0.Args[0] 37895 if x0.Op != OpS390XMOVBZloadidx { 37896 break 37897 } 37898 i0 := x0.AuxInt 37899 s := x0.Aux 37900 _ = x0.Args[2] 37901 p := x0.Args[0] 37902 idx := x0.Args[1] 37903 mem := x0.Args[2] 37904 y := or.Args[1] 37905 s1 := v.Args[1] 37906 if s1.Op != OpS390XSLWconst { 37907 break 37908 } 37909 j1 := s1.AuxInt 37910 x1 := s1.Args[0] 37911 if x1.Op != OpS390XMOVBZloadidx { 37912 break 37913 } 37914 i1 := x1.AuxInt 37915 if x1.Aux != s { 37916 break 37917 } 37918 _ = x1.Args[2] 37919 if p != x1.Args[0] { 37920 break 37921 } 37922 if idx != x1.Args[1] { 37923 break 37924 } 37925 if mem != x1.Args[2] { 37926 break 37927 } 37928 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)) { 37929 break 37930 } 37931 b = mergePoint(b, x0, x1) 37932 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 37933 v.reset(OpCopy) 37934 v.AddArg(v0) 37935 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 37936 v1.AuxInt = j0 37937 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 37938 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 37939 v3.AuxInt = i0 37940 v3.Aux = s 37941 v3.AddArg(p) 37942 v3.AddArg(idx) 37943 v3.AddArg(mem) 37944 v2.AddArg(v3) 37945 v1.AddArg(v2) 37946 v0.AddArg(v1) 37947 v0.AddArg(y) 37948 return true 37949 } 37950 // 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))) 37951 // 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) 37952 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 37953 for { 37954 _ = v.Args[1] 37955 or := v.Args[0] 37956 if or.Op != OpS390XORW { 37957 break 37958 } 37959 _ = or.Args[1] 37960 s0 := or.Args[0] 37961 if s0.Op != OpS390XSLWconst { 37962 break 37963 } 37964 j0 := s0.AuxInt 37965 x0 := s0.Args[0] 37966 if x0.Op != OpS390XMOVBZloadidx { 37967 break 37968 } 37969 i0 := x0.AuxInt 37970 s := x0.Aux 37971 _ = x0.Args[2] 37972 idx := x0.Args[0] 37973 p := x0.Args[1] 37974 mem := x0.Args[2] 37975 y := or.Args[1] 37976 s1 := v.Args[1] 37977 if s1.Op != OpS390XSLWconst { 37978 break 37979 } 37980 j1 := s1.AuxInt 37981 x1 := s1.Args[0] 37982 if x1.Op != OpS390XMOVBZloadidx { 37983 break 37984 } 37985 i1 := x1.AuxInt 37986 if x1.Aux != s { 37987 break 37988 } 37989 _ = x1.Args[2] 37990 if p != x1.Args[0] { 37991 break 37992 } 37993 if idx != x1.Args[1] { 37994 break 37995 } 37996 if mem != x1.Args[2] { 37997 break 37998 } 37999 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)) { 38000 break 38001 } 38002 b = mergePoint(b, x0, x1) 38003 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38004 v.reset(OpCopy) 38005 v.AddArg(v0) 38006 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38007 v1.AuxInt = j0 38008 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38009 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38010 v3.AuxInt = i0 38011 v3.Aux = s 38012 v3.AddArg(p) 38013 v3.AddArg(idx) 38014 v3.AddArg(mem) 38015 v2.AddArg(v3) 38016 v1.AddArg(v2) 38017 v0.AddArg(v1) 38018 v0.AddArg(y) 38019 return true 38020 } 38021 // 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))) 38022 // 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) 38023 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38024 for { 38025 _ = v.Args[1] 38026 or := v.Args[0] 38027 if or.Op != OpS390XORW { 38028 break 38029 } 38030 _ = or.Args[1] 38031 y := or.Args[0] 38032 s0 := or.Args[1] 38033 if s0.Op != OpS390XSLWconst { 38034 break 38035 } 38036 j0 := s0.AuxInt 38037 x0 := s0.Args[0] 38038 if x0.Op != OpS390XMOVBZloadidx { 38039 break 38040 } 38041 i0 := x0.AuxInt 38042 s := x0.Aux 38043 _ = x0.Args[2] 38044 p := x0.Args[0] 38045 idx := x0.Args[1] 38046 mem := x0.Args[2] 38047 s1 := v.Args[1] 38048 if s1.Op != OpS390XSLWconst { 38049 break 38050 } 38051 j1 := s1.AuxInt 38052 x1 := s1.Args[0] 38053 if x1.Op != OpS390XMOVBZloadidx { 38054 break 38055 } 38056 i1 := x1.AuxInt 38057 if x1.Aux != s { 38058 break 38059 } 38060 _ = x1.Args[2] 38061 if p != x1.Args[0] { 38062 break 38063 } 38064 if idx != x1.Args[1] { 38065 break 38066 } 38067 if mem != x1.Args[2] { 38068 break 38069 } 38070 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)) { 38071 break 38072 } 38073 b = mergePoint(b, x0, x1) 38074 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38075 v.reset(OpCopy) 38076 v.AddArg(v0) 38077 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38078 v1.AuxInt = j0 38079 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38080 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38081 v3.AuxInt = i0 38082 v3.Aux = s 38083 v3.AddArg(p) 38084 v3.AddArg(idx) 38085 v3.AddArg(mem) 38086 v2.AddArg(v3) 38087 v1.AddArg(v2) 38088 v0.AddArg(v1) 38089 v0.AddArg(y) 38090 return true 38091 } 38092 // 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))) 38093 // 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) 38094 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38095 for { 38096 _ = v.Args[1] 38097 or := v.Args[0] 38098 if or.Op != OpS390XORW { 38099 break 38100 } 38101 _ = or.Args[1] 38102 y := or.Args[0] 38103 s0 := or.Args[1] 38104 if s0.Op != OpS390XSLWconst { 38105 break 38106 } 38107 j0 := s0.AuxInt 38108 x0 := s0.Args[0] 38109 if x0.Op != OpS390XMOVBZloadidx { 38110 break 38111 } 38112 i0 := x0.AuxInt 38113 s := x0.Aux 38114 _ = x0.Args[2] 38115 idx := x0.Args[0] 38116 p := x0.Args[1] 38117 mem := x0.Args[2] 38118 s1 := v.Args[1] 38119 if s1.Op != OpS390XSLWconst { 38120 break 38121 } 38122 j1 := s1.AuxInt 38123 x1 := s1.Args[0] 38124 if x1.Op != OpS390XMOVBZloadidx { 38125 break 38126 } 38127 i1 := x1.AuxInt 38128 if x1.Aux != s { 38129 break 38130 } 38131 _ = x1.Args[2] 38132 if p != x1.Args[0] { 38133 break 38134 } 38135 if idx != x1.Args[1] { 38136 break 38137 } 38138 if mem != x1.Args[2] { 38139 break 38140 } 38141 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)) { 38142 break 38143 } 38144 b = mergePoint(b, x0, x1) 38145 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38146 v.reset(OpCopy) 38147 v.AddArg(v0) 38148 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38149 v1.AuxInt = j0 38150 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38151 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38152 v3.AuxInt = i0 38153 v3.Aux = s 38154 v3.AddArg(p) 38155 v3.AddArg(idx) 38156 v3.AddArg(mem) 38157 v2.AddArg(v3) 38158 v1.AddArg(v2) 38159 v0.AddArg(v1) 38160 v0.AddArg(y) 38161 return true 38162 } 38163 // 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))) 38164 // 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) 38165 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38166 for { 38167 _ = v.Args[1] 38168 or := v.Args[0] 38169 if or.Op != OpS390XORW { 38170 break 38171 } 38172 _ = or.Args[1] 38173 s0 := or.Args[0] 38174 if s0.Op != OpS390XSLWconst { 38175 break 38176 } 38177 j0 := s0.AuxInt 38178 x0 := s0.Args[0] 38179 if x0.Op != OpS390XMOVBZloadidx { 38180 break 38181 } 38182 i0 := x0.AuxInt 38183 s := x0.Aux 38184 _ = x0.Args[2] 38185 p := x0.Args[0] 38186 idx := x0.Args[1] 38187 mem := x0.Args[2] 38188 y := or.Args[1] 38189 s1 := v.Args[1] 38190 if s1.Op != OpS390XSLWconst { 38191 break 38192 } 38193 j1 := s1.AuxInt 38194 x1 := s1.Args[0] 38195 if x1.Op != OpS390XMOVBZloadidx { 38196 break 38197 } 38198 i1 := x1.AuxInt 38199 if x1.Aux != s { 38200 break 38201 } 38202 _ = x1.Args[2] 38203 if idx != x1.Args[0] { 38204 break 38205 } 38206 if p != x1.Args[1] { 38207 break 38208 } 38209 if mem != x1.Args[2] { 38210 break 38211 } 38212 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)) { 38213 break 38214 } 38215 b = mergePoint(b, x0, x1) 38216 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38217 v.reset(OpCopy) 38218 v.AddArg(v0) 38219 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38220 v1.AuxInt = j0 38221 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38222 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38223 v3.AuxInt = i0 38224 v3.Aux = s 38225 v3.AddArg(p) 38226 v3.AddArg(idx) 38227 v3.AddArg(mem) 38228 v2.AddArg(v3) 38229 v1.AddArg(v2) 38230 v0.AddArg(v1) 38231 v0.AddArg(y) 38232 return true 38233 } 38234 return false 38235 } 38236 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 38237 b := v.Block 38238 _ = b 38239 typ := &b.Func.Config.Types 38240 _ = typ 38241 // 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))) 38242 // 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) 38243 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38244 for { 38245 _ = v.Args[1] 38246 or := v.Args[0] 38247 if or.Op != OpS390XORW { 38248 break 38249 } 38250 _ = or.Args[1] 38251 s0 := or.Args[0] 38252 if s0.Op != OpS390XSLWconst { 38253 break 38254 } 38255 j0 := s0.AuxInt 38256 x0 := s0.Args[0] 38257 if x0.Op != OpS390XMOVBZloadidx { 38258 break 38259 } 38260 i0 := x0.AuxInt 38261 s := x0.Aux 38262 _ = x0.Args[2] 38263 idx := x0.Args[0] 38264 p := x0.Args[1] 38265 mem := x0.Args[2] 38266 y := or.Args[1] 38267 s1 := v.Args[1] 38268 if s1.Op != OpS390XSLWconst { 38269 break 38270 } 38271 j1 := s1.AuxInt 38272 x1 := s1.Args[0] 38273 if x1.Op != OpS390XMOVBZloadidx { 38274 break 38275 } 38276 i1 := x1.AuxInt 38277 if x1.Aux != s { 38278 break 38279 } 38280 _ = x1.Args[2] 38281 if idx != x1.Args[0] { 38282 break 38283 } 38284 if p != x1.Args[1] { 38285 break 38286 } 38287 if mem != x1.Args[2] { 38288 break 38289 } 38290 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)) { 38291 break 38292 } 38293 b = mergePoint(b, x0, x1) 38294 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38295 v.reset(OpCopy) 38296 v.AddArg(v0) 38297 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38298 v1.AuxInt = j0 38299 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38300 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38301 v3.AuxInt = i0 38302 v3.Aux = s 38303 v3.AddArg(p) 38304 v3.AddArg(idx) 38305 v3.AddArg(mem) 38306 v2.AddArg(v3) 38307 v1.AddArg(v2) 38308 v0.AddArg(v1) 38309 v0.AddArg(y) 38310 return true 38311 } 38312 // 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))) 38313 // 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) 38314 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38315 for { 38316 _ = v.Args[1] 38317 or := v.Args[0] 38318 if or.Op != OpS390XORW { 38319 break 38320 } 38321 _ = or.Args[1] 38322 y := or.Args[0] 38323 s0 := or.Args[1] 38324 if s0.Op != OpS390XSLWconst { 38325 break 38326 } 38327 j0 := s0.AuxInt 38328 x0 := s0.Args[0] 38329 if x0.Op != OpS390XMOVBZloadidx { 38330 break 38331 } 38332 i0 := x0.AuxInt 38333 s := x0.Aux 38334 _ = x0.Args[2] 38335 p := x0.Args[0] 38336 idx := x0.Args[1] 38337 mem := x0.Args[2] 38338 s1 := v.Args[1] 38339 if s1.Op != OpS390XSLWconst { 38340 break 38341 } 38342 j1 := s1.AuxInt 38343 x1 := s1.Args[0] 38344 if x1.Op != OpS390XMOVBZloadidx { 38345 break 38346 } 38347 i1 := x1.AuxInt 38348 if x1.Aux != s { 38349 break 38350 } 38351 _ = x1.Args[2] 38352 if idx != x1.Args[0] { 38353 break 38354 } 38355 if p != x1.Args[1] { 38356 break 38357 } 38358 if mem != x1.Args[2] { 38359 break 38360 } 38361 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)) { 38362 break 38363 } 38364 b = mergePoint(b, x0, x1) 38365 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38366 v.reset(OpCopy) 38367 v.AddArg(v0) 38368 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38369 v1.AuxInt = j0 38370 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38371 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38372 v3.AuxInt = i0 38373 v3.Aux = s 38374 v3.AddArg(p) 38375 v3.AddArg(idx) 38376 v3.AddArg(mem) 38377 v2.AddArg(v3) 38378 v1.AddArg(v2) 38379 v0.AddArg(v1) 38380 v0.AddArg(y) 38381 return true 38382 } 38383 // 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))) 38384 // 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) 38385 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 38386 for { 38387 _ = v.Args[1] 38388 or := v.Args[0] 38389 if or.Op != OpS390XORW { 38390 break 38391 } 38392 _ = or.Args[1] 38393 y := or.Args[0] 38394 s0 := or.Args[1] 38395 if s0.Op != OpS390XSLWconst { 38396 break 38397 } 38398 j0 := s0.AuxInt 38399 x0 := s0.Args[0] 38400 if x0.Op != OpS390XMOVBZloadidx { 38401 break 38402 } 38403 i0 := x0.AuxInt 38404 s := x0.Aux 38405 _ = x0.Args[2] 38406 idx := x0.Args[0] 38407 p := x0.Args[1] 38408 mem := x0.Args[2] 38409 s1 := v.Args[1] 38410 if s1.Op != OpS390XSLWconst { 38411 break 38412 } 38413 j1 := s1.AuxInt 38414 x1 := s1.Args[0] 38415 if x1.Op != OpS390XMOVBZloadidx { 38416 break 38417 } 38418 i1 := x1.AuxInt 38419 if x1.Aux != s { 38420 break 38421 } 38422 _ = x1.Args[2] 38423 if idx != x1.Args[0] { 38424 break 38425 } 38426 if p != x1.Args[1] { 38427 break 38428 } 38429 if mem != x1.Args[2] { 38430 break 38431 } 38432 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)) { 38433 break 38434 } 38435 b = mergePoint(b, x0, x1) 38436 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 38437 v.reset(OpCopy) 38438 v.AddArg(v0) 38439 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 38440 v1.AuxInt = j0 38441 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 38442 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 38443 v3.AuxInt = i0 38444 v3.Aux = s 38445 v3.AddArg(p) 38446 v3.AddArg(idx) 38447 v3.AddArg(mem) 38448 v2.AddArg(v3) 38449 v1.AddArg(v2) 38450 v0.AddArg(v1) 38451 v0.AddArg(y) 38452 return true 38453 } 38454 return false 38455 } 38456 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 38457 // match: (ORWconst [c] x) 38458 // cond: int32(c)==0 38459 // result: x 38460 for { 38461 c := v.AuxInt 38462 x := v.Args[0] 38463 if !(int32(c) == 0) { 38464 break 38465 } 38466 v.reset(OpCopy) 38467 v.Type = x.Type 38468 v.AddArg(x) 38469 return true 38470 } 38471 // match: (ORWconst [c] _) 38472 // cond: int32(c)==-1 38473 // result: (MOVDconst [-1]) 38474 for { 38475 c := v.AuxInt 38476 if !(int32(c) == -1) { 38477 break 38478 } 38479 v.reset(OpS390XMOVDconst) 38480 v.AuxInt = -1 38481 return true 38482 } 38483 // match: (ORWconst [c] (MOVDconst [d])) 38484 // cond: 38485 // result: (MOVDconst [c|d]) 38486 for { 38487 c := v.AuxInt 38488 v_0 := v.Args[0] 38489 if v_0.Op != OpS390XMOVDconst { 38490 break 38491 } 38492 d := v_0.AuxInt 38493 v.reset(OpS390XMOVDconst) 38494 v.AuxInt = c | d 38495 return true 38496 } 38497 return false 38498 } 38499 func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { 38500 // match: (ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 38501 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38502 // result: (ORWload [off1+off2] {sym} x ptr mem) 38503 for { 38504 off1 := v.AuxInt 38505 sym := v.Aux 38506 _ = v.Args[2] 38507 x := v.Args[0] 38508 v_1 := v.Args[1] 38509 if v_1.Op != OpS390XADDconst { 38510 break 38511 } 38512 off2 := v_1.AuxInt 38513 ptr := v_1.Args[0] 38514 mem := v.Args[2] 38515 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38516 break 38517 } 38518 v.reset(OpS390XORWload) 38519 v.AuxInt = off1 + off2 38520 v.Aux = sym 38521 v.AddArg(x) 38522 v.AddArg(ptr) 38523 v.AddArg(mem) 38524 return true 38525 } 38526 // match: (ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38527 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38528 // result: (ORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38529 for { 38530 o1 := v.AuxInt 38531 s1 := v.Aux 38532 _ = v.Args[2] 38533 x := v.Args[0] 38534 v_1 := v.Args[1] 38535 if v_1.Op != OpS390XMOVDaddr { 38536 break 38537 } 38538 o2 := v_1.AuxInt 38539 s2 := v_1.Aux 38540 ptr := v_1.Args[0] 38541 mem := v.Args[2] 38542 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38543 break 38544 } 38545 v.reset(OpS390XORWload) 38546 v.AuxInt = o1 + o2 38547 v.Aux = mergeSym(s1, s2) 38548 v.AddArg(x) 38549 v.AddArg(ptr) 38550 v.AddArg(mem) 38551 return true 38552 } 38553 return false 38554 } 38555 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 38556 // match: (ORconst [0] x) 38557 // cond: 38558 // result: x 38559 for { 38560 if v.AuxInt != 0 { 38561 break 38562 } 38563 x := v.Args[0] 38564 v.reset(OpCopy) 38565 v.Type = x.Type 38566 v.AddArg(x) 38567 return true 38568 } 38569 // match: (ORconst [-1] _) 38570 // cond: 38571 // result: (MOVDconst [-1]) 38572 for { 38573 if v.AuxInt != -1 { 38574 break 38575 } 38576 v.reset(OpS390XMOVDconst) 38577 v.AuxInt = -1 38578 return true 38579 } 38580 // match: (ORconst [c] (MOVDconst [d])) 38581 // cond: 38582 // result: (MOVDconst [c|d]) 38583 for { 38584 c := v.AuxInt 38585 v_0 := v.Args[0] 38586 if v_0.Op != OpS390XMOVDconst { 38587 break 38588 } 38589 d := v_0.AuxInt 38590 v.reset(OpS390XMOVDconst) 38591 v.AuxInt = c | d 38592 return true 38593 } 38594 return false 38595 } 38596 func rewriteValueS390X_OpS390XORload_0(v *Value) bool { 38597 b := v.Block 38598 _ = b 38599 // match: (ORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 38600 // cond: isSamePtr(ptr1, ptr2) 38601 // result: (OR x (LGDR <t> y)) 38602 for { 38603 t := v.Type 38604 off := v.AuxInt 38605 sym := v.Aux 38606 _ = v.Args[2] 38607 x := v.Args[0] 38608 ptr1 := v.Args[1] 38609 v_2 := v.Args[2] 38610 if v_2.Op != OpS390XFMOVDstore { 38611 break 38612 } 38613 if v_2.AuxInt != off { 38614 break 38615 } 38616 if v_2.Aux != sym { 38617 break 38618 } 38619 _ = v_2.Args[2] 38620 ptr2 := v_2.Args[0] 38621 y := v_2.Args[1] 38622 if !(isSamePtr(ptr1, ptr2)) { 38623 break 38624 } 38625 v.reset(OpS390XOR) 38626 v.AddArg(x) 38627 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 38628 v0.AddArg(y) 38629 v.AddArg(v0) 38630 return true 38631 } 38632 // match: (ORload [off1] {sym} x (ADDconst [off2] ptr) mem) 38633 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38634 // result: (ORload [off1+off2] {sym} x ptr mem) 38635 for { 38636 off1 := v.AuxInt 38637 sym := v.Aux 38638 _ = v.Args[2] 38639 x := v.Args[0] 38640 v_1 := v.Args[1] 38641 if v_1.Op != OpS390XADDconst { 38642 break 38643 } 38644 off2 := v_1.AuxInt 38645 ptr := v_1.Args[0] 38646 mem := v.Args[2] 38647 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38648 break 38649 } 38650 v.reset(OpS390XORload) 38651 v.AuxInt = off1 + off2 38652 v.Aux = sym 38653 v.AddArg(x) 38654 v.AddArg(ptr) 38655 v.AddArg(mem) 38656 return true 38657 } 38658 // match: (ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38659 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38660 // result: (ORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38661 for { 38662 o1 := v.AuxInt 38663 s1 := v.Aux 38664 _ = v.Args[2] 38665 x := v.Args[0] 38666 v_1 := v.Args[1] 38667 if v_1.Op != OpS390XMOVDaddr { 38668 break 38669 } 38670 o2 := v_1.AuxInt 38671 s2 := v_1.Aux 38672 ptr := v_1.Args[0] 38673 mem := v.Args[2] 38674 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38675 break 38676 } 38677 v.reset(OpS390XORload) 38678 v.AuxInt = o1 + o2 38679 v.Aux = mergeSym(s1, s2) 38680 v.AddArg(x) 38681 v.AddArg(ptr) 38682 v.AddArg(mem) 38683 return true 38684 } 38685 return false 38686 } 38687 func rewriteValueS390X_OpS390XRLL_0(v *Value) bool { 38688 // match: (RLL x (MOVDconst [c])) 38689 // cond: 38690 // result: (RLLconst x [c&31]) 38691 for { 38692 _ = v.Args[1] 38693 x := v.Args[0] 38694 v_1 := v.Args[1] 38695 if v_1.Op != OpS390XMOVDconst { 38696 break 38697 } 38698 c := v_1.AuxInt 38699 v.reset(OpS390XRLLconst) 38700 v.AuxInt = c & 31 38701 v.AddArg(x) 38702 return true 38703 } 38704 return false 38705 } 38706 func rewriteValueS390X_OpS390XRLLG_0(v *Value) bool { 38707 // match: (RLLG x (MOVDconst [c])) 38708 // cond: 38709 // result: (RLLGconst x [c&63]) 38710 for { 38711 _ = v.Args[1] 38712 x := v.Args[0] 38713 v_1 := v.Args[1] 38714 if v_1.Op != OpS390XMOVDconst { 38715 break 38716 } 38717 c := v_1.AuxInt 38718 v.reset(OpS390XRLLGconst) 38719 v.AuxInt = c & 63 38720 v.AddArg(x) 38721 return true 38722 } 38723 return false 38724 } 38725 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 38726 b := v.Block 38727 _ = b 38728 typ := &b.Func.Config.Types 38729 _ = typ 38730 // match: (SLD x (MOVDconst [c])) 38731 // cond: 38732 // result: (SLDconst x [c&63]) 38733 for { 38734 _ = v.Args[1] 38735 x := v.Args[0] 38736 v_1 := v.Args[1] 38737 if v_1.Op != OpS390XMOVDconst { 38738 break 38739 } 38740 c := v_1.AuxInt 38741 v.reset(OpS390XSLDconst) 38742 v.AuxInt = c & 63 38743 v.AddArg(x) 38744 return true 38745 } 38746 // match: (SLD x (AND (MOVDconst [c]) y)) 38747 // cond: 38748 // result: (SLD x (ANDWconst <typ.UInt32> [c&63] y)) 38749 for { 38750 _ = v.Args[1] 38751 x := v.Args[0] 38752 v_1 := v.Args[1] 38753 if v_1.Op != OpS390XAND { 38754 break 38755 } 38756 _ = v_1.Args[1] 38757 v_1_0 := v_1.Args[0] 38758 if v_1_0.Op != OpS390XMOVDconst { 38759 break 38760 } 38761 c := v_1_0.AuxInt 38762 y := v_1.Args[1] 38763 v.reset(OpS390XSLD) 38764 v.AddArg(x) 38765 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38766 v0.AuxInt = c & 63 38767 v0.AddArg(y) 38768 v.AddArg(v0) 38769 return true 38770 } 38771 // match: (SLD x (AND y (MOVDconst [c]))) 38772 // cond: 38773 // result: (SLD x (ANDWconst <typ.UInt32> [c&63] y)) 38774 for { 38775 _ = v.Args[1] 38776 x := v.Args[0] 38777 v_1 := v.Args[1] 38778 if v_1.Op != OpS390XAND { 38779 break 38780 } 38781 _ = v_1.Args[1] 38782 y := v_1.Args[0] 38783 v_1_1 := v_1.Args[1] 38784 if v_1_1.Op != OpS390XMOVDconst { 38785 break 38786 } 38787 c := v_1_1.AuxInt 38788 v.reset(OpS390XSLD) 38789 v.AddArg(x) 38790 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38791 v0.AuxInt = c & 63 38792 v0.AddArg(y) 38793 v.AddArg(v0) 38794 return true 38795 } 38796 // match: (SLD x (ANDWconst [c] y)) 38797 // cond: c&63 == 63 38798 // result: (SLD x y) 38799 for { 38800 _ = v.Args[1] 38801 x := v.Args[0] 38802 v_1 := v.Args[1] 38803 if v_1.Op != OpS390XANDWconst { 38804 break 38805 } 38806 c := v_1.AuxInt 38807 y := v_1.Args[0] 38808 if !(c&63 == 63) { 38809 break 38810 } 38811 v.reset(OpS390XSLD) 38812 v.AddArg(x) 38813 v.AddArg(y) 38814 return true 38815 } 38816 // match: (SLD x (MOVDreg y)) 38817 // cond: 38818 // result: (SLD x y) 38819 for { 38820 _ = v.Args[1] 38821 x := v.Args[0] 38822 v_1 := v.Args[1] 38823 if v_1.Op != OpS390XMOVDreg { 38824 break 38825 } 38826 y := v_1.Args[0] 38827 v.reset(OpS390XSLD) 38828 v.AddArg(x) 38829 v.AddArg(y) 38830 return true 38831 } 38832 // match: (SLD x (MOVWreg y)) 38833 // cond: 38834 // result: (SLD x y) 38835 for { 38836 _ = v.Args[1] 38837 x := v.Args[0] 38838 v_1 := v.Args[1] 38839 if v_1.Op != OpS390XMOVWreg { 38840 break 38841 } 38842 y := v_1.Args[0] 38843 v.reset(OpS390XSLD) 38844 v.AddArg(x) 38845 v.AddArg(y) 38846 return true 38847 } 38848 // match: (SLD x (MOVHreg y)) 38849 // cond: 38850 // result: (SLD x y) 38851 for { 38852 _ = v.Args[1] 38853 x := v.Args[0] 38854 v_1 := v.Args[1] 38855 if v_1.Op != OpS390XMOVHreg { 38856 break 38857 } 38858 y := v_1.Args[0] 38859 v.reset(OpS390XSLD) 38860 v.AddArg(x) 38861 v.AddArg(y) 38862 return true 38863 } 38864 // match: (SLD x (MOVBreg y)) 38865 // cond: 38866 // result: (SLD x y) 38867 for { 38868 _ = v.Args[1] 38869 x := v.Args[0] 38870 v_1 := v.Args[1] 38871 if v_1.Op != OpS390XMOVBreg { 38872 break 38873 } 38874 y := v_1.Args[0] 38875 v.reset(OpS390XSLD) 38876 v.AddArg(x) 38877 v.AddArg(y) 38878 return true 38879 } 38880 // match: (SLD x (MOVWZreg y)) 38881 // cond: 38882 // result: (SLD x y) 38883 for { 38884 _ = v.Args[1] 38885 x := v.Args[0] 38886 v_1 := v.Args[1] 38887 if v_1.Op != OpS390XMOVWZreg { 38888 break 38889 } 38890 y := v_1.Args[0] 38891 v.reset(OpS390XSLD) 38892 v.AddArg(x) 38893 v.AddArg(y) 38894 return true 38895 } 38896 // match: (SLD x (MOVHZreg y)) 38897 // cond: 38898 // result: (SLD x y) 38899 for { 38900 _ = v.Args[1] 38901 x := v.Args[0] 38902 v_1 := v.Args[1] 38903 if v_1.Op != OpS390XMOVHZreg { 38904 break 38905 } 38906 y := v_1.Args[0] 38907 v.reset(OpS390XSLD) 38908 v.AddArg(x) 38909 v.AddArg(y) 38910 return true 38911 } 38912 return false 38913 } 38914 func rewriteValueS390X_OpS390XSLD_10(v *Value) bool { 38915 // match: (SLD x (MOVBZreg y)) 38916 // cond: 38917 // result: (SLD x y) 38918 for { 38919 _ = v.Args[1] 38920 x := v.Args[0] 38921 v_1 := v.Args[1] 38922 if v_1.Op != OpS390XMOVBZreg { 38923 break 38924 } 38925 y := v_1.Args[0] 38926 v.reset(OpS390XSLD) 38927 v.AddArg(x) 38928 v.AddArg(y) 38929 return true 38930 } 38931 return false 38932 } 38933 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 38934 b := v.Block 38935 _ = b 38936 typ := &b.Func.Config.Types 38937 _ = typ 38938 // match: (SLW x (MOVDconst [c])) 38939 // cond: 38940 // result: (SLWconst x [c&63]) 38941 for { 38942 _ = v.Args[1] 38943 x := v.Args[0] 38944 v_1 := v.Args[1] 38945 if v_1.Op != OpS390XMOVDconst { 38946 break 38947 } 38948 c := v_1.AuxInt 38949 v.reset(OpS390XSLWconst) 38950 v.AuxInt = c & 63 38951 v.AddArg(x) 38952 return true 38953 } 38954 // match: (SLW x (AND (MOVDconst [c]) y)) 38955 // cond: 38956 // result: (SLW x (ANDWconst <typ.UInt32> [c&63] y)) 38957 for { 38958 _ = v.Args[1] 38959 x := v.Args[0] 38960 v_1 := v.Args[1] 38961 if v_1.Op != OpS390XAND { 38962 break 38963 } 38964 _ = v_1.Args[1] 38965 v_1_0 := v_1.Args[0] 38966 if v_1_0.Op != OpS390XMOVDconst { 38967 break 38968 } 38969 c := v_1_0.AuxInt 38970 y := v_1.Args[1] 38971 v.reset(OpS390XSLW) 38972 v.AddArg(x) 38973 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38974 v0.AuxInt = c & 63 38975 v0.AddArg(y) 38976 v.AddArg(v0) 38977 return true 38978 } 38979 // match: (SLW x (AND y (MOVDconst [c]))) 38980 // cond: 38981 // result: (SLW x (ANDWconst <typ.UInt32> [c&63] y)) 38982 for { 38983 _ = v.Args[1] 38984 x := v.Args[0] 38985 v_1 := v.Args[1] 38986 if v_1.Op != OpS390XAND { 38987 break 38988 } 38989 _ = v_1.Args[1] 38990 y := v_1.Args[0] 38991 v_1_1 := v_1.Args[1] 38992 if v_1_1.Op != OpS390XMOVDconst { 38993 break 38994 } 38995 c := v_1_1.AuxInt 38996 v.reset(OpS390XSLW) 38997 v.AddArg(x) 38998 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 38999 v0.AuxInt = c & 63 39000 v0.AddArg(y) 39001 v.AddArg(v0) 39002 return true 39003 } 39004 // match: (SLW x (ANDWconst [c] y)) 39005 // cond: c&63 == 63 39006 // result: (SLW x y) 39007 for { 39008 _ = v.Args[1] 39009 x := v.Args[0] 39010 v_1 := v.Args[1] 39011 if v_1.Op != OpS390XANDWconst { 39012 break 39013 } 39014 c := v_1.AuxInt 39015 y := v_1.Args[0] 39016 if !(c&63 == 63) { 39017 break 39018 } 39019 v.reset(OpS390XSLW) 39020 v.AddArg(x) 39021 v.AddArg(y) 39022 return true 39023 } 39024 // match: (SLW x (MOVDreg y)) 39025 // cond: 39026 // result: (SLW x y) 39027 for { 39028 _ = v.Args[1] 39029 x := v.Args[0] 39030 v_1 := v.Args[1] 39031 if v_1.Op != OpS390XMOVDreg { 39032 break 39033 } 39034 y := v_1.Args[0] 39035 v.reset(OpS390XSLW) 39036 v.AddArg(x) 39037 v.AddArg(y) 39038 return true 39039 } 39040 // match: (SLW x (MOVWreg y)) 39041 // cond: 39042 // result: (SLW x y) 39043 for { 39044 _ = v.Args[1] 39045 x := v.Args[0] 39046 v_1 := v.Args[1] 39047 if v_1.Op != OpS390XMOVWreg { 39048 break 39049 } 39050 y := v_1.Args[0] 39051 v.reset(OpS390XSLW) 39052 v.AddArg(x) 39053 v.AddArg(y) 39054 return true 39055 } 39056 // match: (SLW x (MOVHreg y)) 39057 // cond: 39058 // result: (SLW x y) 39059 for { 39060 _ = v.Args[1] 39061 x := v.Args[0] 39062 v_1 := v.Args[1] 39063 if v_1.Op != OpS390XMOVHreg { 39064 break 39065 } 39066 y := v_1.Args[0] 39067 v.reset(OpS390XSLW) 39068 v.AddArg(x) 39069 v.AddArg(y) 39070 return true 39071 } 39072 // match: (SLW x (MOVBreg y)) 39073 // cond: 39074 // result: (SLW x y) 39075 for { 39076 _ = v.Args[1] 39077 x := v.Args[0] 39078 v_1 := v.Args[1] 39079 if v_1.Op != OpS390XMOVBreg { 39080 break 39081 } 39082 y := v_1.Args[0] 39083 v.reset(OpS390XSLW) 39084 v.AddArg(x) 39085 v.AddArg(y) 39086 return true 39087 } 39088 // match: (SLW x (MOVWZreg y)) 39089 // cond: 39090 // result: (SLW x y) 39091 for { 39092 _ = v.Args[1] 39093 x := v.Args[0] 39094 v_1 := v.Args[1] 39095 if v_1.Op != OpS390XMOVWZreg { 39096 break 39097 } 39098 y := v_1.Args[0] 39099 v.reset(OpS390XSLW) 39100 v.AddArg(x) 39101 v.AddArg(y) 39102 return true 39103 } 39104 // match: (SLW x (MOVHZreg y)) 39105 // cond: 39106 // result: (SLW x y) 39107 for { 39108 _ = v.Args[1] 39109 x := v.Args[0] 39110 v_1 := v.Args[1] 39111 if v_1.Op != OpS390XMOVHZreg { 39112 break 39113 } 39114 y := v_1.Args[0] 39115 v.reset(OpS390XSLW) 39116 v.AddArg(x) 39117 v.AddArg(y) 39118 return true 39119 } 39120 return false 39121 } 39122 func rewriteValueS390X_OpS390XSLW_10(v *Value) bool { 39123 // match: (SLW x (MOVBZreg y)) 39124 // cond: 39125 // result: (SLW x y) 39126 for { 39127 _ = v.Args[1] 39128 x := v.Args[0] 39129 v_1 := v.Args[1] 39130 if v_1.Op != OpS390XMOVBZreg { 39131 break 39132 } 39133 y := v_1.Args[0] 39134 v.reset(OpS390XSLW) 39135 v.AddArg(x) 39136 v.AddArg(y) 39137 return true 39138 } 39139 return false 39140 } 39141 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 39142 b := v.Block 39143 _ = b 39144 typ := &b.Func.Config.Types 39145 _ = typ 39146 // match: (SRAD x (MOVDconst [c])) 39147 // cond: 39148 // result: (SRADconst x [c&63]) 39149 for { 39150 _ = v.Args[1] 39151 x := v.Args[0] 39152 v_1 := v.Args[1] 39153 if v_1.Op != OpS390XMOVDconst { 39154 break 39155 } 39156 c := v_1.AuxInt 39157 v.reset(OpS390XSRADconst) 39158 v.AuxInt = c & 63 39159 v.AddArg(x) 39160 return true 39161 } 39162 // match: (SRAD x (AND (MOVDconst [c]) y)) 39163 // cond: 39164 // result: (SRAD x (ANDWconst <typ.UInt32> [c&63] y)) 39165 for { 39166 _ = v.Args[1] 39167 x := v.Args[0] 39168 v_1 := v.Args[1] 39169 if v_1.Op != OpS390XAND { 39170 break 39171 } 39172 _ = v_1.Args[1] 39173 v_1_0 := v_1.Args[0] 39174 if v_1_0.Op != OpS390XMOVDconst { 39175 break 39176 } 39177 c := v_1_0.AuxInt 39178 y := v_1.Args[1] 39179 v.reset(OpS390XSRAD) 39180 v.AddArg(x) 39181 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39182 v0.AuxInt = c & 63 39183 v0.AddArg(y) 39184 v.AddArg(v0) 39185 return true 39186 } 39187 // match: (SRAD x (AND y (MOVDconst [c]))) 39188 // cond: 39189 // result: (SRAD x (ANDWconst <typ.UInt32> [c&63] y)) 39190 for { 39191 _ = v.Args[1] 39192 x := v.Args[0] 39193 v_1 := v.Args[1] 39194 if v_1.Op != OpS390XAND { 39195 break 39196 } 39197 _ = v_1.Args[1] 39198 y := v_1.Args[0] 39199 v_1_1 := v_1.Args[1] 39200 if v_1_1.Op != OpS390XMOVDconst { 39201 break 39202 } 39203 c := v_1_1.AuxInt 39204 v.reset(OpS390XSRAD) 39205 v.AddArg(x) 39206 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39207 v0.AuxInt = c & 63 39208 v0.AddArg(y) 39209 v.AddArg(v0) 39210 return true 39211 } 39212 // match: (SRAD x (ANDWconst [c] y)) 39213 // cond: c&63 == 63 39214 // result: (SRAD x y) 39215 for { 39216 _ = v.Args[1] 39217 x := v.Args[0] 39218 v_1 := v.Args[1] 39219 if v_1.Op != OpS390XANDWconst { 39220 break 39221 } 39222 c := v_1.AuxInt 39223 y := v_1.Args[0] 39224 if !(c&63 == 63) { 39225 break 39226 } 39227 v.reset(OpS390XSRAD) 39228 v.AddArg(x) 39229 v.AddArg(y) 39230 return true 39231 } 39232 // match: (SRAD x (MOVDreg y)) 39233 // cond: 39234 // result: (SRAD x y) 39235 for { 39236 _ = v.Args[1] 39237 x := v.Args[0] 39238 v_1 := v.Args[1] 39239 if v_1.Op != OpS390XMOVDreg { 39240 break 39241 } 39242 y := v_1.Args[0] 39243 v.reset(OpS390XSRAD) 39244 v.AddArg(x) 39245 v.AddArg(y) 39246 return true 39247 } 39248 // match: (SRAD x (MOVWreg y)) 39249 // cond: 39250 // result: (SRAD x y) 39251 for { 39252 _ = v.Args[1] 39253 x := v.Args[0] 39254 v_1 := v.Args[1] 39255 if v_1.Op != OpS390XMOVWreg { 39256 break 39257 } 39258 y := v_1.Args[0] 39259 v.reset(OpS390XSRAD) 39260 v.AddArg(x) 39261 v.AddArg(y) 39262 return true 39263 } 39264 // match: (SRAD x (MOVHreg y)) 39265 // cond: 39266 // result: (SRAD x y) 39267 for { 39268 _ = v.Args[1] 39269 x := v.Args[0] 39270 v_1 := v.Args[1] 39271 if v_1.Op != OpS390XMOVHreg { 39272 break 39273 } 39274 y := v_1.Args[0] 39275 v.reset(OpS390XSRAD) 39276 v.AddArg(x) 39277 v.AddArg(y) 39278 return true 39279 } 39280 // match: (SRAD x (MOVBreg y)) 39281 // cond: 39282 // result: (SRAD x y) 39283 for { 39284 _ = v.Args[1] 39285 x := v.Args[0] 39286 v_1 := v.Args[1] 39287 if v_1.Op != OpS390XMOVBreg { 39288 break 39289 } 39290 y := v_1.Args[0] 39291 v.reset(OpS390XSRAD) 39292 v.AddArg(x) 39293 v.AddArg(y) 39294 return true 39295 } 39296 // match: (SRAD x (MOVWZreg y)) 39297 // cond: 39298 // result: (SRAD x y) 39299 for { 39300 _ = v.Args[1] 39301 x := v.Args[0] 39302 v_1 := v.Args[1] 39303 if v_1.Op != OpS390XMOVWZreg { 39304 break 39305 } 39306 y := v_1.Args[0] 39307 v.reset(OpS390XSRAD) 39308 v.AddArg(x) 39309 v.AddArg(y) 39310 return true 39311 } 39312 // match: (SRAD x (MOVHZreg y)) 39313 // cond: 39314 // result: (SRAD x y) 39315 for { 39316 _ = v.Args[1] 39317 x := v.Args[0] 39318 v_1 := v.Args[1] 39319 if v_1.Op != OpS390XMOVHZreg { 39320 break 39321 } 39322 y := v_1.Args[0] 39323 v.reset(OpS390XSRAD) 39324 v.AddArg(x) 39325 v.AddArg(y) 39326 return true 39327 } 39328 return false 39329 } 39330 func rewriteValueS390X_OpS390XSRAD_10(v *Value) bool { 39331 // match: (SRAD x (MOVBZreg y)) 39332 // cond: 39333 // result: (SRAD x y) 39334 for { 39335 _ = v.Args[1] 39336 x := v.Args[0] 39337 v_1 := v.Args[1] 39338 if v_1.Op != OpS390XMOVBZreg { 39339 break 39340 } 39341 y := v_1.Args[0] 39342 v.reset(OpS390XSRAD) 39343 v.AddArg(x) 39344 v.AddArg(y) 39345 return true 39346 } 39347 return false 39348 } 39349 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 39350 // match: (SRADconst [c] (MOVDconst [d])) 39351 // cond: 39352 // result: (MOVDconst [d>>uint64(c)]) 39353 for { 39354 c := v.AuxInt 39355 v_0 := v.Args[0] 39356 if v_0.Op != OpS390XMOVDconst { 39357 break 39358 } 39359 d := v_0.AuxInt 39360 v.reset(OpS390XMOVDconst) 39361 v.AuxInt = d >> uint64(c) 39362 return true 39363 } 39364 return false 39365 } 39366 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 39367 b := v.Block 39368 _ = b 39369 typ := &b.Func.Config.Types 39370 _ = typ 39371 // match: (SRAW x (MOVDconst [c])) 39372 // cond: 39373 // result: (SRAWconst x [c&63]) 39374 for { 39375 _ = v.Args[1] 39376 x := v.Args[0] 39377 v_1 := v.Args[1] 39378 if v_1.Op != OpS390XMOVDconst { 39379 break 39380 } 39381 c := v_1.AuxInt 39382 v.reset(OpS390XSRAWconst) 39383 v.AuxInt = c & 63 39384 v.AddArg(x) 39385 return true 39386 } 39387 // match: (SRAW x (AND (MOVDconst [c]) y)) 39388 // cond: 39389 // result: (SRAW x (ANDWconst <typ.UInt32> [c&63] y)) 39390 for { 39391 _ = v.Args[1] 39392 x := v.Args[0] 39393 v_1 := v.Args[1] 39394 if v_1.Op != OpS390XAND { 39395 break 39396 } 39397 _ = v_1.Args[1] 39398 v_1_0 := v_1.Args[0] 39399 if v_1_0.Op != OpS390XMOVDconst { 39400 break 39401 } 39402 c := v_1_0.AuxInt 39403 y := v_1.Args[1] 39404 v.reset(OpS390XSRAW) 39405 v.AddArg(x) 39406 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39407 v0.AuxInt = c & 63 39408 v0.AddArg(y) 39409 v.AddArg(v0) 39410 return true 39411 } 39412 // match: (SRAW x (AND y (MOVDconst [c]))) 39413 // cond: 39414 // result: (SRAW x (ANDWconst <typ.UInt32> [c&63] y)) 39415 for { 39416 _ = v.Args[1] 39417 x := v.Args[0] 39418 v_1 := v.Args[1] 39419 if v_1.Op != OpS390XAND { 39420 break 39421 } 39422 _ = v_1.Args[1] 39423 y := v_1.Args[0] 39424 v_1_1 := v_1.Args[1] 39425 if v_1_1.Op != OpS390XMOVDconst { 39426 break 39427 } 39428 c := v_1_1.AuxInt 39429 v.reset(OpS390XSRAW) 39430 v.AddArg(x) 39431 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39432 v0.AuxInt = c & 63 39433 v0.AddArg(y) 39434 v.AddArg(v0) 39435 return true 39436 } 39437 // match: (SRAW x (ANDWconst [c] y)) 39438 // cond: c&63 == 63 39439 // result: (SRAW x y) 39440 for { 39441 _ = v.Args[1] 39442 x := v.Args[0] 39443 v_1 := v.Args[1] 39444 if v_1.Op != OpS390XANDWconst { 39445 break 39446 } 39447 c := v_1.AuxInt 39448 y := v_1.Args[0] 39449 if !(c&63 == 63) { 39450 break 39451 } 39452 v.reset(OpS390XSRAW) 39453 v.AddArg(x) 39454 v.AddArg(y) 39455 return true 39456 } 39457 // match: (SRAW x (MOVDreg y)) 39458 // cond: 39459 // result: (SRAW x y) 39460 for { 39461 _ = v.Args[1] 39462 x := v.Args[0] 39463 v_1 := v.Args[1] 39464 if v_1.Op != OpS390XMOVDreg { 39465 break 39466 } 39467 y := v_1.Args[0] 39468 v.reset(OpS390XSRAW) 39469 v.AddArg(x) 39470 v.AddArg(y) 39471 return true 39472 } 39473 // match: (SRAW x (MOVWreg y)) 39474 // cond: 39475 // result: (SRAW x y) 39476 for { 39477 _ = v.Args[1] 39478 x := v.Args[0] 39479 v_1 := v.Args[1] 39480 if v_1.Op != OpS390XMOVWreg { 39481 break 39482 } 39483 y := v_1.Args[0] 39484 v.reset(OpS390XSRAW) 39485 v.AddArg(x) 39486 v.AddArg(y) 39487 return true 39488 } 39489 // match: (SRAW x (MOVHreg y)) 39490 // cond: 39491 // result: (SRAW x y) 39492 for { 39493 _ = v.Args[1] 39494 x := v.Args[0] 39495 v_1 := v.Args[1] 39496 if v_1.Op != OpS390XMOVHreg { 39497 break 39498 } 39499 y := v_1.Args[0] 39500 v.reset(OpS390XSRAW) 39501 v.AddArg(x) 39502 v.AddArg(y) 39503 return true 39504 } 39505 // match: (SRAW x (MOVBreg y)) 39506 // cond: 39507 // result: (SRAW x y) 39508 for { 39509 _ = v.Args[1] 39510 x := v.Args[0] 39511 v_1 := v.Args[1] 39512 if v_1.Op != OpS390XMOVBreg { 39513 break 39514 } 39515 y := v_1.Args[0] 39516 v.reset(OpS390XSRAW) 39517 v.AddArg(x) 39518 v.AddArg(y) 39519 return true 39520 } 39521 // match: (SRAW x (MOVWZreg y)) 39522 // cond: 39523 // result: (SRAW x y) 39524 for { 39525 _ = v.Args[1] 39526 x := v.Args[0] 39527 v_1 := v.Args[1] 39528 if v_1.Op != OpS390XMOVWZreg { 39529 break 39530 } 39531 y := v_1.Args[0] 39532 v.reset(OpS390XSRAW) 39533 v.AddArg(x) 39534 v.AddArg(y) 39535 return true 39536 } 39537 // match: (SRAW x (MOVHZreg y)) 39538 // cond: 39539 // result: (SRAW x y) 39540 for { 39541 _ = v.Args[1] 39542 x := v.Args[0] 39543 v_1 := v.Args[1] 39544 if v_1.Op != OpS390XMOVHZreg { 39545 break 39546 } 39547 y := v_1.Args[0] 39548 v.reset(OpS390XSRAW) 39549 v.AddArg(x) 39550 v.AddArg(y) 39551 return true 39552 } 39553 return false 39554 } 39555 func rewriteValueS390X_OpS390XSRAW_10(v *Value) bool { 39556 // match: (SRAW x (MOVBZreg y)) 39557 // cond: 39558 // result: (SRAW x y) 39559 for { 39560 _ = v.Args[1] 39561 x := v.Args[0] 39562 v_1 := v.Args[1] 39563 if v_1.Op != OpS390XMOVBZreg { 39564 break 39565 } 39566 y := v_1.Args[0] 39567 v.reset(OpS390XSRAW) 39568 v.AddArg(x) 39569 v.AddArg(y) 39570 return true 39571 } 39572 return false 39573 } 39574 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 39575 // match: (SRAWconst [c] (MOVDconst [d])) 39576 // cond: 39577 // result: (MOVDconst [int64(int32(d))>>uint64(c)]) 39578 for { 39579 c := v.AuxInt 39580 v_0 := v.Args[0] 39581 if v_0.Op != OpS390XMOVDconst { 39582 break 39583 } 39584 d := v_0.AuxInt 39585 v.reset(OpS390XMOVDconst) 39586 v.AuxInt = int64(int32(d)) >> uint64(c) 39587 return true 39588 } 39589 return false 39590 } 39591 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 39592 b := v.Block 39593 _ = b 39594 typ := &b.Func.Config.Types 39595 _ = typ 39596 // match: (SRD x (MOVDconst [c])) 39597 // cond: 39598 // result: (SRDconst x [c&63]) 39599 for { 39600 _ = v.Args[1] 39601 x := v.Args[0] 39602 v_1 := v.Args[1] 39603 if v_1.Op != OpS390XMOVDconst { 39604 break 39605 } 39606 c := v_1.AuxInt 39607 v.reset(OpS390XSRDconst) 39608 v.AuxInt = c & 63 39609 v.AddArg(x) 39610 return true 39611 } 39612 // match: (SRD x (AND (MOVDconst [c]) y)) 39613 // cond: 39614 // result: (SRD x (ANDWconst <typ.UInt32> [c&63] y)) 39615 for { 39616 _ = v.Args[1] 39617 x := v.Args[0] 39618 v_1 := v.Args[1] 39619 if v_1.Op != OpS390XAND { 39620 break 39621 } 39622 _ = v_1.Args[1] 39623 v_1_0 := v_1.Args[0] 39624 if v_1_0.Op != OpS390XMOVDconst { 39625 break 39626 } 39627 c := v_1_0.AuxInt 39628 y := v_1.Args[1] 39629 v.reset(OpS390XSRD) 39630 v.AddArg(x) 39631 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39632 v0.AuxInt = c & 63 39633 v0.AddArg(y) 39634 v.AddArg(v0) 39635 return true 39636 } 39637 // match: (SRD x (AND y (MOVDconst [c]))) 39638 // cond: 39639 // result: (SRD x (ANDWconst <typ.UInt32> [c&63] y)) 39640 for { 39641 _ = v.Args[1] 39642 x := v.Args[0] 39643 v_1 := v.Args[1] 39644 if v_1.Op != OpS390XAND { 39645 break 39646 } 39647 _ = v_1.Args[1] 39648 y := v_1.Args[0] 39649 v_1_1 := v_1.Args[1] 39650 if v_1_1.Op != OpS390XMOVDconst { 39651 break 39652 } 39653 c := v_1_1.AuxInt 39654 v.reset(OpS390XSRD) 39655 v.AddArg(x) 39656 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39657 v0.AuxInt = c & 63 39658 v0.AddArg(y) 39659 v.AddArg(v0) 39660 return true 39661 } 39662 // match: (SRD x (ANDWconst [c] y)) 39663 // cond: c&63 == 63 39664 // result: (SRD x y) 39665 for { 39666 _ = v.Args[1] 39667 x := v.Args[0] 39668 v_1 := v.Args[1] 39669 if v_1.Op != OpS390XANDWconst { 39670 break 39671 } 39672 c := v_1.AuxInt 39673 y := v_1.Args[0] 39674 if !(c&63 == 63) { 39675 break 39676 } 39677 v.reset(OpS390XSRD) 39678 v.AddArg(x) 39679 v.AddArg(y) 39680 return true 39681 } 39682 // match: (SRD x (MOVDreg y)) 39683 // cond: 39684 // result: (SRD x y) 39685 for { 39686 _ = v.Args[1] 39687 x := v.Args[0] 39688 v_1 := v.Args[1] 39689 if v_1.Op != OpS390XMOVDreg { 39690 break 39691 } 39692 y := v_1.Args[0] 39693 v.reset(OpS390XSRD) 39694 v.AddArg(x) 39695 v.AddArg(y) 39696 return true 39697 } 39698 // match: (SRD x (MOVWreg y)) 39699 // cond: 39700 // result: (SRD x y) 39701 for { 39702 _ = v.Args[1] 39703 x := v.Args[0] 39704 v_1 := v.Args[1] 39705 if v_1.Op != OpS390XMOVWreg { 39706 break 39707 } 39708 y := v_1.Args[0] 39709 v.reset(OpS390XSRD) 39710 v.AddArg(x) 39711 v.AddArg(y) 39712 return true 39713 } 39714 // match: (SRD x (MOVHreg y)) 39715 // cond: 39716 // result: (SRD x y) 39717 for { 39718 _ = v.Args[1] 39719 x := v.Args[0] 39720 v_1 := v.Args[1] 39721 if v_1.Op != OpS390XMOVHreg { 39722 break 39723 } 39724 y := v_1.Args[0] 39725 v.reset(OpS390XSRD) 39726 v.AddArg(x) 39727 v.AddArg(y) 39728 return true 39729 } 39730 // match: (SRD x (MOVBreg y)) 39731 // cond: 39732 // result: (SRD x y) 39733 for { 39734 _ = v.Args[1] 39735 x := v.Args[0] 39736 v_1 := v.Args[1] 39737 if v_1.Op != OpS390XMOVBreg { 39738 break 39739 } 39740 y := v_1.Args[0] 39741 v.reset(OpS390XSRD) 39742 v.AddArg(x) 39743 v.AddArg(y) 39744 return true 39745 } 39746 // match: (SRD x (MOVWZreg y)) 39747 // cond: 39748 // result: (SRD x y) 39749 for { 39750 _ = v.Args[1] 39751 x := v.Args[0] 39752 v_1 := v.Args[1] 39753 if v_1.Op != OpS390XMOVWZreg { 39754 break 39755 } 39756 y := v_1.Args[0] 39757 v.reset(OpS390XSRD) 39758 v.AddArg(x) 39759 v.AddArg(y) 39760 return true 39761 } 39762 // match: (SRD x (MOVHZreg y)) 39763 // cond: 39764 // result: (SRD x y) 39765 for { 39766 _ = v.Args[1] 39767 x := v.Args[0] 39768 v_1 := v.Args[1] 39769 if v_1.Op != OpS390XMOVHZreg { 39770 break 39771 } 39772 y := v_1.Args[0] 39773 v.reset(OpS390XSRD) 39774 v.AddArg(x) 39775 v.AddArg(y) 39776 return true 39777 } 39778 return false 39779 } 39780 func rewriteValueS390X_OpS390XSRD_10(v *Value) bool { 39781 // match: (SRD x (MOVBZreg y)) 39782 // cond: 39783 // result: (SRD x y) 39784 for { 39785 _ = v.Args[1] 39786 x := v.Args[0] 39787 v_1 := v.Args[1] 39788 if v_1.Op != OpS390XMOVBZreg { 39789 break 39790 } 39791 y := v_1.Args[0] 39792 v.reset(OpS390XSRD) 39793 v.AddArg(x) 39794 v.AddArg(y) 39795 return true 39796 } 39797 return false 39798 } 39799 func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool { 39800 b := v.Block 39801 _ = b 39802 // match: (SRDconst [1] (SLDconst [1] (LGDR <t> x))) 39803 // cond: 39804 // result: (LGDR <t> (LPDFR <x.Type> x)) 39805 for { 39806 if v.AuxInt != 1 { 39807 break 39808 } 39809 v_0 := v.Args[0] 39810 if v_0.Op != OpS390XSLDconst { 39811 break 39812 } 39813 if v_0.AuxInt != 1 { 39814 break 39815 } 39816 v_0_0 := v_0.Args[0] 39817 if v_0_0.Op != OpS390XLGDR { 39818 break 39819 } 39820 t := v_0_0.Type 39821 x := v_0_0.Args[0] 39822 v.reset(OpS390XLGDR) 39823 v.Type = t 39824 v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) 39825 v0.AddArg(x) 39826 v.AddArg(v0) 39827 return true 39828 } 39829 return false 39830 } 39831 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 39832 b := v.Block 39833 _ = b 39834 typ := &b.Func.Config.Types 39835 _ = typ 39836 // match: (SRW x (MOVDconst [c])) 39837 // cond: 39838 // result: (SRWconst x [c&63]) 39839 for { 39840 _ = v.Args[1] 39841 x := v.Args[0] 39842 v_1 := v.Args[1] 39843 if v_1.Op != OpS390XMOVDconst { 39844 break 39845 } 39846 c := v_1.AuxInt 39847 v.reset(OpS390XSRWconst) 39848 v.AuxInt = c & 63 39849 v.AddArg(x) 39850 return true 39851 } 39852 // match: (SRW x (AND (MOVDconst [c]) y)) 39853 // cond: 39854 // result: (SRW x (ANDWconst <typ.UInt32> [c&63] y)) 39855 for { 39856 _ = v.Args[1] 39857 x := v.Args[0] 39858 v_1 := v.Args[1] 39859 if v_1.Op != OpS390XAND { 39860 break 39861 } 39862 _ = v_1.Args[1] 39863 v_1_0 := v_1.Args[0] 39864 if v_1_0.Op != OpS390XMOVDconst { 39865 break 39866 } 39867 c := v_1_0.AuxInt 39868 y := v_1.Args[1] 39869 v.reset(OpS390XSRW) 39870 v.AddArg(x) 39871 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39872 v0.AuxInt = c & 63 39873 v0.AddArg(y) 39874 v.AddArg(v0) 39875 return true 39876 } 39877 // match: (SRW x (AND y (MOVDconst [c]))) 39878 // cond: 39879 // result: (SRW x (ANDWconst <typ.UInt32> [c&63] y)) 39880 for { 39881 _ = v.Args[1] 39882 x := v.Args[0] 39883 v_1 := v.Args[1] 39884 if v_1.Op != OpS390XAND { 39885 break 39886 } 39887 _ = v_1.Args[1] 39888 y := v_1.Args[0] 39889 v_1_1 := v_1.Args[1] 39890 if v_1_1.Op != OpS390XMOVDconst { 39891 break 39892 } 39893 c := v_1_1.AuxInt 39894 v.reset(OpS390XSRW) 39895 v.AddArg(x) 39896 v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) 39897 v0.AuxInt = c & 63 39898 v0.AddArg(y) 39899 v.AddArg(v0) 39900 return true 39901 } 39902 // match: (SRW x (ANDWconst [c] y)) 39903 // cond: c&63 == 63 39904 // result: (SRW x y) 39905 for { 39906 _ = v.Args[1] 39907 x := v.Args[0] 39908 v_1 := v.Args[1] 39909 if v_1.Op != OpS390XANDWconst { 39910 break 39911 } 39912 c := v_1.AuxInt 39913 y := v_1.Args[0] 39914 if !(c&63 == 63) { 39915 break 39916 } 39917 v.reset(OpS390XSRW) 39918 v.AddArg(x) 39919 v.AddArg(y) 39920 return true 39921 } 39922 // match: (SRW x (MOVDreg y)) 39923 // cond: 39924 // result: (SRW x y) 39925 for { 39926 _ = v.Args[1] 39927 x := v.Args[0] 39928 v_1 := v.Args[1] 39929 if v_1.Op != OpS390XMOVDreg { 39930 break 39931 } 39932 y := v_1.Args[0] 39933 v.reset(OpS390XSRW) 39934 v.AddArg(x) 39935 v.AddArg(y) 39936 return true 39937 } 39938 // match: (SRW x (MOVWreg y)) 39939 // cond: 39940 // result: (SRW x y) 39941 for { 39942 _ = v.Args[1] 39943 x := v.Args[0] 39944 v_1 := v.Args[1] 39945 if v_1.Op != OpS390XMOVWreg { 39946 break 39947 } 39948 y := v_1.Args[0] 39949 v.reset(OpS390XSRW) 39950 v.AddArg(x) 39951 v.AddArg(y) 39952 return true 39953 } 39954 // match: (SRW x (MOVHreg y)) 39955 // cond: 39956 // result: (SRW x y) 39957 for { 39958 _ = v.Args[1] 39959 x := v.Args[0] 39960 v_1 := v.Args[1] 39961 if v_1.Op != OpS390XMOVHreg { 39962 break 39963 } 39964 y := v_1.Args[0] 39965 v.reset(OpS390XSRW) 39966 v.AddArg(x) 39967 v.AddArg(y) 39968 return true 39969 } 39970 // match: (SRW x (MOVBreg y)) 39971 // cond: 39972 // result: (SRW x y) 39973 for { 39974 _ = v.Args[1] 39975 x := v.Args[0] 39976 v_1 := v.Args[1] 39977 if v_1.Op != OpS390XMOVBreg { 39978 break 39979 } 39980 y := v_1.Args[0] 39981 v.reset(OpS390XSRW) 39982 v.AddArg(x) 39983 v.AddArg(y) 39984 return true 39985 } 39986 // match: (SRW x (MOVWZreg y)) 39987 // cond: 39988 // result: (SRW x y) 39989 for { 39990 _ = v.Args[1] 39991 x := v.Args[0] 39992 v_1 := v.Args[1] 39993 if v_1.Op != OpS390XMOVWZreg { 39994 break 39995 } 39996 y := v_1.Args[0] 39997 v.reset(OpS390XSRW) 39998 v.AddArg(x) 39999 v.AddArg(y) 40000 return true 40001 } 40002 // match: (SRW x (MOVHZreg y)) 40003 // cond: 40004 // result: (SRW x y) 40005 for { 40006 _ = v.Args[1] 40007 x := v.Args[0] 40008 v_1 := v.Args[1] 40009 if v_1.Op != OpS390XMOVHZreg { 40010 break 40011 } 40012 y := v_1.Args[0] 40013 v.reset(OpS390XSRW) 40014 v.AddArg(x) 40015 v.AddArg(y) 40016 return true 40017 } 40018 return false 40019 } 40020 func rewriteValueS390X_OpS390XSRW_10(v *Value) bool { 40021 // match: (SRW x (MOVBZreg y)) 40022 // cond: 40023 // result: (SRW x y) 40024 for { 40025 _ = v.Args[1] 40026 x := v.Args[0] 40027 v_1 := v.Args[1] 40028 if v_1.Op != OpS390XMOVBZreg { 40029 break 40030 } 40031 y := v_1.Args[0] 40032 v.reset(OpS390XSRW) 40033 v.AddArg(x) 40034 v.AddArg(y) 40035 return true 40036 } 40037 return false 40038 } 40039 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 40040 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 40041 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 40042 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 40043 for { 40044 i := v.AuxInt 40045 s := v.Aux 40046 _ = v.Args[3] 40047 p := v.Args[0] 40048 w2 := v.Args[1] 40049 w3 := v.Args[2] 40050 x := v.Args[3] 40051 if x.Op != OpS390XSTM2 { 40052 break 40053 } 40054 if x.AuxInt != i-8 { 40055 break 40056 } 40057 if x.Aux != s { 40058 break 40059 } 40060 _ = x.Args[3] 40061 if p != x.Args[0] { 40062 break 40063 } 40064 w0 := x.Args[1] 40065 w1 := x.Args[2] 40066 mem := x.Args[3] 40067 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 40068 break 40069 } 40070 v.reset(OpS390XSTM4) 40071 v.AuxInt = i - 8 40072 v.Aux = s 40073 v.AddArg(p) 40074 v.AddArg(w0) 40075 v.AddArg(w1) 40076 v.AddArg(w2) 40077 v.AddArg(w3) 40078 v.AddArg(mem) 40079 return true 40080 } 40081 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 40082 // cond: 40083 // result: (MOVDstore [i] {s} p x mem) 40084 for { 40085 i := v.AuxInt 40086 s := v.Aux 40087 _ = v.Args[3] 40088 p := v.Args[0] 40089 v_1 := v.Args[1] 40090 if v_1.Op != OpS390XSRDconst { 40091 break 40092 } 40093 if v_1.AuxInt != 32 { 40094 break 40095 } 40096 x := v_1.Args[0] 40097 if x != v.Args[2] { 40098 break 40099 } 40100 mem := v.Args[3] 40101 v.reset(OpS390XMOVDstore) 40102 v.AuxInt = i 40103 v.Aux = s 40104 v.AddArg(p) 40105 v.AddArg(x) 40106 v.AddArg(mem) 40107 return true 40108 } 40109 return false 40110 } 40111 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 40112 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 40113 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 40114 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 40115 for { 40116 i := v.AuxInt 40117 s := v.Aux 40118 _ = v.Args[3] 40119 p := v.Args[0] 40120 w2 := v.Args[1] 40121 w3 := v.Args[2] 40122 x := v.Args[3] 40123 if x.Op != OpS390XSTMG2 { 40124 break 40125 } 40126 if x.AuxInt != i-16 { 40127 break 40128 } 40129 if x.Aux != s { 40130 break 40131 } 40132 _ = x.Args[3] 40133 if p != x.Args[0] { 40134 break 40135 } 40136 w0 := x.Args[1] 40137 w1 := x.Args[2] 40138 mem := x.Args[3] 40139 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 40140 break 40141 } 40142 v.reset(OpS390XSTMG4) 40143 v.AuxInt = i - 16 40144 v.Aux = s 40145 v.AddArg(p) 40146 v.AddArg(w0) 40147 v.AddArg(w1) 40148 v.AddArg(w2) 40149 v.AddArg(w3) 40150 v.AddArg(mem) 40151 return true 40152 } 40153 return false 40154 } 40155 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 40156 b := v.Block 40157 _ = b 40158 // match: (SUB x (MOVDconst [c])) 40159 // cond: is32Bit(c) 40160 // result: (SUBconst x [c]) 40161 for { 40162 _ = v.Args[1] 40163 x := v.Args[0] 40164 v_1 := v.Args[1] 40165 if v_1.Op != OpS390XMOVDconst { 40166 break 40167 } 40168 c := v_1.AuxInt 40169 if !(is32Bit(c)) { 40170 break 40171 } 40172 v.reset(OpS390XSUBconst) 40173 v.AuxInt = c 40174 v.AddArg(x) 40175 return true 40176 } 40177 // match: (SUB (MOVDconst [c]) x) 40178 // cond: is32Bit(c) 40179 // result: (NEG (SUBconst <v.Type> x [c])) 40180 for { 40181 _ = v.Args[1] 40182 v_0 := v.Args[0] 40183 if v_0.Op != OpS390XMOVDconst { 40184 break 40185 } 40186 c := v_0.AuxInt 40187 x := v.Args[1] 40188 if !(is32Bit(c)) { 40189 break 40190 } 40191 v.reset(OpS390XNEG) 40192 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 40193 v0.AuxInt = c 40194 v0.AddArg(x) 40195 v.AddArg(v0) 40196 return true 40197 } 40198 // match: (SUB x x) 40199 // cond: 40200 // result: (MOVDconst [0]) 40201 for { 40202 _ = v.Args[1] 40203 x := v.Args[0] 40204 if x != v.Args[1] { 40205 break 40206 } 40207 v.reset(OpS390XMOVDconst) 40208 v.AuxInt = 0 40209 return true 40210 } 40211 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 40212 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40213 // result: (SUBload <t> [off] {sym} x ptr mem) 40214 for { 40215 t := v.Type 40216 _ = v.Args[1] 40217 x := v.Args[0] 40218 g := v.Args[1] 40219 if g.Op != OpS390XMOVDload { 40220 break 40221 } 40222 off := g.AuxInt 40223 sym := g.Aux 40224 _ = g.Args[1] 40225 ptr := g.Args[0] 40226 mem := g.Args[1] 40227 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40228 break 40229 } 40230 v.reset(OpS390XSUBload) 40231 v.Type = t 40232 v.AuxInt = off 40233 v.Aux = sym 40234 v.AddArg(x) 40235 v.AddArg(ptr) 40236 v.AddArg(mem) 40237 return true 40238 } 40239 return false 40240 } 40241 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 40242 b := v.Block 40243 _ = b 40244 // match: (SUBW x (MOVDconst [c])) 40245 // cond: 40246 // result: (SUBWconst x [int64(int32(c))]) 40247 for { 40248 _ = v.Args[1] 40249 x := v.Args[0] 40250 v_1 := v.Args[1] 40251 if v_1.Op != OpS390XMOVDconst { 40252 break 40253 } 40254 c := v_1.AuxInt 40255 v.reset(OpS390XSUBWconst) 40256 v.AuxInt = int64(int32(c)) 40257 v.AddArg(x) 40258 return true 40259 } 40260 // match: (SUBW (MOVDconst [c]) x) 40261 // cond: 40262 // result: (NEGW (SUBWconst <v.Type> x [int64(int32(c))])) 40263 for { 40264 _ = v.Args[1] 40265 v_0 := v.Args[0] 40266 if v_0.Op != OpS390XMOVDconst { 40267 break 40268 } 40269 c := v_0.AuxInt 40270 x := v.Args[1] 40271 v.reset(OpS390XNEGW) 40272 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 40273 v0.AuxInt = int64(int32(c)) 40274 v0.AddArg(x) 40275 v.AddArg(v0) 40276 return true 40277 } 40278 // match: (SUBW x x) 40279 // cond: 40280 // result: (MOVDconst [0]) 40281 for { 40282 _ = v.Args[1] 40283 x := v.Args[0] 40284 if x != v.Args[1] { 40285 break 40286 } 40287 v.reset(OpS390XMOVDconst) 40288 v.AuxInt = 0 40289 return true 40290 } 40291 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 40292 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40293 // result: (SUBWload <t> [off] {sym} x ptr mem) 40294 for { 40295 t := v.Type 40296 _ = v.Args[1] 40297 x := v.Args[0] 40298 g := v.Args[1] 40299 if g.Op != OpS390XMOVWload { 40300 break 40301 } 40302 off := g.AuxInt 40303 sym := g.Aux 40304 _ = g.Args[1] 40305 ptr := g.Args[0] 40306 mem := g.Args[1] 40307 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40308 break 40309 } 40310 v.reset(OpS390XSUBWload) 40311 v.Type = t 40312 v.AuxInt = off 40313 v.Aux = sym 40314 v.AddArg(x) 40315 v.AddArg(ptr) 40316 v.AddArg(mem) 40317 return true 40318 } 40319 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 40320 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40321 // result: (SUBWload <t> [off] {sym} x ptr mem) 40322 for { 40323 t := v.Type 40324 _ = v.Args[1] 40325 x := v.Args[0] 40326 g := v.Args[1] 40327 if g.Op != OpS390XMOVWZload { 40328 break 40329 } 40330 off := g.AuxInt 40331 sym := g.Aux 40332 _ = g.Args[1] 40333 ptr := g.Args[0] 40334 mem := g.Args[1] 40335 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40336 break 40337 } 40338 v.reset(OpS390XSUBWload) 40339 v.Type = t 40340 v.AuxInt = off 40341 v.Aux = sym 40342 v.AddArg(x) 40343 v.AddArg(ptr) 40344 v.AddArg(mem) 40345 return true 40346 } 40347 return false 40348 } 40349 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 40350 // match: (SUBWconst [c] x) 40351 // cond: int32(c) == 0 40352 // result: x 40353 for { 40354 c := v.AuxInt 40355 x := v.Args[0] 40356 if !(int32(c) == 0) { 40357 break 40358 } 40359 v.reset(OpCopy) 40360 v.Type = x.Type 40361 v.AddArg(x) 40362 return true 40363 } 40364 // match: (SUBWconst [c] x) 40365 // cond: 40366 // result: (ADDWconst [int64(int32(-c))] x) 40367 for { 40368 c := v.AuxInt 40369 x := v.Args[0] 40370 v.reset(OpS390XADDWconst) 40371 v.AuxInt = int64(int32(-c)) 40372 v.AddArg(x) 40373 return true 40374 } 40375 } 40376 func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { 40377 // match: (SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) 40378 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 40379 // result: (SUBWload [off1+off2] {sym} x ptr mem) 40380 for { 40381 off1 := v.AuxInt 40382 sym := v.Aux 40383 _ = v.Args[2] 40384 x := v.Args[0] 40385 v_1 := v.Args[1] 40386 if v_1.Op != OpS390XADDconst { 40387 break 40388 } 40389 off2 := v_1.AuxInt 40390 ptr := v_1.Args[0] 40391 mem := v.Args[2] 40392 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 40393 break 40394 } 40395 v.reset(OpS390XSUBWload) 40396 v.AuxInt = off1 + off2 40397 v.Aux = sym 40398 v.AddArg(x) 40399 v.AddArg(ptr) 40400 v.AddArg(mem) 40401 return true 40402 } 40403 // match: (SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 40404 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 40405 // result: (SUBWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 40406 for { 40407 o1 := v.AuxInt 40408 s1 := v.Aux 40409 _ = v.Args[2] 40410 x := v.Args[0] 40411 v_1 := v.Args[1] 40412 if v_1.Op != OpS390XMOVDaddr { 40413 break 40414 } 40415 o2 := v_1.AuxInt 40416 s2 := v_1.Aux 40417 ptr := v_1.Args[0] 40418 mem := v.Args[2] 40419 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 40420 break 40421 } 40422 v.reset(OpS390XSUBWload) 40423 v.AuxInt = o1 + o2 40424 v.Aux = mergeSym(s1, s2) 40425 v.AddArg(x) 40426 v.AddArg(ptr) 40427 v.AddArg(mem) 40428 return true 40429 } 40430 return false 40431 } 40432 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 40433 // match: (SUBconst [0] x) 40434 // cond: 40435 // result: x 40436 for { 40437 if v.AuxInt != 0 { 40438 break 40439 } 40440 x := v.Args[0] 40441 v.reset(OpCopy) 40442 v.Type = x.Type 40443 v.AddArg(x) 40444 return true 40445 } 40446 // match: (SUBconst [c] x) 40447 // cond: c != -(1<<31) 40448 // result: (ADDconst [-c] x) 40449 for { 40450 c := v.AuxInt 40451 x := v.Args[0] 40452 if !(c != -(1 << 31)) { 40453 break 40454 } 40455 v.reset(OpS390XADDconst) 40456 v.AuxInt = -c 40457 v.AddArg(x) 40458 return true 40459 } 40460 // match: (SUBconst (MOVDconst [d]) [c]) 40461 // cond: 40462 // result: (MOVDconst [d-c]) 40463 for { 40464 c := v.AuxInt 40465 v_0 := v.Args[0] 40466 if v_0.Op != OpS390XMOVDconst { 40467 break 40468 } 40469 d := v_0.AuxInt 40470 v.reset(OpS390XMOVDconst) 40471 v.AuxInt = d - c 40472 return true 40473 } 40474 // match: (SUBconst (SUBconst x [d]) [c]) 40475 // cond: is32Bit(-c-d) 40476 // result: (ADDconst [-c-d] x) 40477 for { 40478 c := v.AuxInt 40479 v_0 := v.Args[0] 40480 if v_0.Op != OpS390XSUBconst { 40481 break 40482 } 40483 d := v_0.AuxInt 40484 x := v_0.Args[0] 40485 if !(is32Bit(-c - d)) { 40486 break 40487 } 40488 v.reset(OpS390XADDconst) 40489 v.AuxInt = -c - d 40490 v.AddArg(x) 40491 return true 40492 } 40493 return false 40494 } 40495 func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { 40496 b := v.Block 40497 _ = b 40498 // match: (SUBload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 40499 // cond: isSamePtr(ptr1, ptr2) 40500 // result: (SUB x (LGDR <t> y)) 40501 for { 40502 t := v.Type 40503 off := v.AuxInt 40504 sym := v.Aux 40505 _ = v.Args[2] 40506 x := v.Args[0] 40507 ptr1 := v.Args[1] 40508 v_2 := v.Args[2] 40509 if v_2.Op != OpS390XFMOVDstore { 40510 break 40511 } 40512 if v_2.AuxInt != off { 40513 break 40514 } 40515 if v_2.Aux != sym { 40516 break 40517 } 40518 _ = v_2.Args[2] 40519 ptr2 := v_2.Args[0] 40520 y := v_2.Args[1] 40521 if !(isSamePtr(ptr1, ptr2)) { 40522 break 40523 } 40524 v.reset(OpS390XSUB) 40525 v.AddArg(x) 40526 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 40527 v0.AddArg(y) 40528 v.AddArg(v0) 40529 return true 40530 } 40531 // match: (SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) 40532 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 40533 // result: (SUBload [off1+off2] {sym} x ptr mem) 40534 for { 40535 off1 := v.AuxInt 40536 sym := v.Aux 40537 _ = v.Args[2] 40538 x := v.Args[0] 40539 v_1 := v.Args[1] 40540 if v_1.Op != OpS390XADDconst { 40541 break 40542 } 40543 off2 := v_1.AuxInt 40544 ptr := v_1.Args[0] 40545 mem := v.Args[2] 40546 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 40547 break 40548 } 40549 v.reset(OpS390XSUBload) 40550 v.AuxInt = off1 + off2 40551 v.Aux = sym 40552 v.AddArg(x) 40553 v.AddArg(ptr) 40554 v.AddArg(mem) 40555 return true 40556 } 40557 // match: (SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 40558 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 40559 // result: (SUBload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 40560 for { 40561 o1 := v.AuxInt 40562 s1 := v.Aux 40563 _ = v.Args[2] 40564 x := v.Args[0] 40565 v_1 := v.Args[1] 40566 if v_1.Op != OpS390XMOVDaddr { 40567 break 40568 } 40569 o2 := v_1.AuxInt 40570 s2 := v_1.Aux 40571 ptr := v_1.Args[0] 40572 mem := v.Args[2] 40573 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 40574 break 40575 } 40576 v.reset(OpS390XSUBload) 40577 v.AuxInt = o1 + o2 40578 v.Aux = mergeSym(s1, s2) 40579 v.AddArg(x) 40580 v.AddArg(ptr) 40581 v.AddArg(mem) 40582 return true 40583 } 40584 return false 40585 } 40586 func rewriteValueS390X_OpS390XSumBytes2_0(v *Value) bool { 40587 b := v.Block 40588 _ = b 40589 typ := &b.Func.Config.Types 40590 _ = typ 40591 // match: (SumBytes2 x) 40592 // cond: 40593 // result: (ADDW (SRWconst <typ.UInt8> x [8]) x) 40594 for { 40595 x := v.Args[0] 40596 v.reset(OpS390XADDW) 40597 v0 := b.NewValue0(v.Pos, OpS390XSRWconst, typ.UInt8) 40598 v0.AuxInt = 8 40599 v0.AddArg(x) 40600 v.AddArg(v0) 40601 v.AddArg(x) 40602 return true 40603 } 40604 } 40605 func rewriteValueS390X_OpS390XSumBytes4_0(v *Value) bool { 40606 b := v.Block 40607 _ = b 40608 typ := &b.Func.Config.Types 40609 _ = typ 40610 // match: (SumBytes4 x) 40611 // cond: 40612 // result: (SumBytes2 (ADDW <typ.UInt16> (SRWconst <typ.UInt16> x [16]) x)) 40613 for { 40614 x := v.Args[0] 40615 v.reset(OpS390XSumBytes2) 40616 v0 := b.NewValue0(v.Pos, OpS390XADDW, typ.UInt16) 40617 v1 := b.NewValue0(v.Pos, OpS390XSRWconst, typ.UInt16) 40618 v1.AuxInt = 16 40619 v1.AddArg(x) 40620 v0.AddArg(v1) 40621 v0.AddArg(x) 40622 v.AddArg(v0) 40623 return true 40624 } 40625 } 40626 func rewriteValueS390X_OpS390XSumBytes8_0(v *Value) bool { 40627 b := v.Block 40628 _ = b 40629 typ := &b.Func.Config.Types 40630 _ = typ 40631 // match: (SumBytes8 x) 40632 // cond: 40633 // result: (SumBytes4 (ADDW <typ.UInt32> (SRDconst <typ.UInt32> x [32]) x)) 40634 for { 40635 x := v.Args[0] 40636 v.reset(OpS390XSumBytes4) 40637 v0 := b.NewValue0(v.Pos, OpS390XADDW, typ.UInt32) 40638 v1 := b.NewValue0(v.Pos, OpS390XSRDconst, typ.UInt32) 40639 v1.AuxInt = 32 40640 v1.AddArg(x) 40641 v0.AddArg(v1) 40642 v0.AddArg(x) 40643 v.AddArg(v0) 40644 return true 40645 } 40646 } 40647 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 40648 // match: (XOR x (MOVDconst [c])) 40649 // cond: isU32Bit(c) 40650 // result: (XORconst [c] x) 40651 for { 40652 _ = v.Args[1] 40653 x := v.Args[0] 40654 v_1 := v.Args[1] 40655 if v_1.Op != OpS390XMOVDconst { 40656 break 40657 } 40658 c := v_1.AuxInt 40659 if !(isU32Bit(c)) { 40660 break 40661 } 40662 v.reset(OpS390XXORconst) 40663 v.AuxInt = c 40664 v.AddArg(x) 40665 return true 40666 } 40667 // match: (XOR (MOVDconst [c]) x) 40668 // cond: isU32Bit(c) 40669 // result: (XORconst [c] x) 40670 for { 40671 _ = v.Args[1] 40672 v_0 := v.Args[0] 40673 if v_0.Op != OpS390XMOVDconst { 40674 break 40675 } 40676 c := v_0.AuxInt 40677 x := v.Args[1] 40678 if !(isU32Bit(c)) { 40679 break 40680 } 40681 v.reset(OpS390XXORconst) 40682 v.AuxInt = c 40683 v.AddArg(x) 40684 return true 40685 } 40686 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 40687 // cond: d == 64-c 40688 // result: (RLLGconst [c] x) 40689 for { 40690 _ = v.Args[1] 40691 v_0 := v.Args[0] 40692 if v_0.Op != OpS390XSLDconst { 40693 break 40694 } 40695 c := v_0.AuxInt 40696 x := v_0.Args[0] 40697 v_1 := v.Args[1] 40698 if v_1.Op != OpS390XSRDconst { 40699 break 40700 } 40701 d := v_1.AuxInt 40702 if x != v_1.Args[0] { 40703 break 40704 } 40705 if !(d == 64-c) { 40706 break 40707 } 40708 v.reset(OpS390XRLLGconst) 40709 v.AuxInt = c 40710 v.AddArg(x) 40711 return true 40712 } 40713 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 40714 // cond: d == 64-c 40715 // result: (RLLGconst [c] x) 40716 for { 40717 _ = v.Args[1] 40718 v_0 := v.Args[0] 40719 if v_0.Op != OpS390XSRDconst { 40720 break 40721 } 40722 d := v_0.AuxInt 40723 x := v_0.Args[0] 40724 v_1 := v.Args[1] 40725 if v_1.Op != OpS390XSLDconst { 40726 break 40727 } 40728 c := v_1.AuxInt 40729 if x != v_1.Args[0] { 40730 break 40731 } 40732 if !(d == 64-c) { 40733 break 40734 } 40735 v.reset(OpS390XRLLGconst) 40736 v.AuxInt = c 40737 v.AddArg(x) 40738 return true 40739 } 40740 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 40741 // cond: 40742 // result: (MOVDconst [c^d]) 40743 for { 40744 _ = v.Args[1] 40745 v_0 := v.Args[0] 40746 if v_0.Op != OpS390XMOVDconst { 40747 break 40748 } 40749 c := v_0.AuxInt 40750 v_1 := v.Args[1] 40751 if v_1.Op != OpS390XMOVDconst { 40752 break 40753 } 40754 d := v_1.AuxInt 40755 v.reset(OpS390XMOVDconst) 40756 v.AuxInt = c ^ d 40757 return true 40758 } 40759 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 40760 // cond: 40761 // result: (MOVDconst [c^d]) 40762 for { 40763 _ = v.Args[1] 40764 v_0 := v.Args[0] 40765 if v_0.Op != OpS390XMOVDconst { 40766 break 40767 } 40768 d := v_0.AuxInt 40769 v_1 := v.Args[1] 40770 if v_1.Op != OpS390XMOVDconst { 40771 break 40772 } 40773 c := v_1.AuxInt 40774 v.reset(OpS390XMOVDconst) 40775 v.AuxInt = c ^ d 40776 return true 40777 } 40778 // match: (XOR x x) 40779 // cond: 40780 // result: (MOVDconst [0]) 40781 for { 40782 _ = v.Args[1] 40783 x := v.Args[0] 40784 if x != v.Args[1] { 40785 break 40786 } 40787 v.reset(OpS390XMOVDconst) 40788 v.AuxInt = 0 40789 return true 40790 } 40791 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 40792 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40793 // result: (XORload <t> [off] {sym} x ptr mem) 40794 for { 40795 t := v.Type 40796 _ = v.Args[1] 40797 x := v.Args[0] 40798 g := v.Args[1] 40799 if g.Op != OpS390XMOVDload { 40800 break 40801 } 40802 off := g.AuxInt 40803 sym := g.Aux 40804 _ = g.Args[1] 40805 ptr := g.Args[0] 40806 mem := g.Args[1] 40807 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40808 break 40809 } 40810 v.reset(OpS390XXORload) 40811 v.Type = t 40812 v.AuxInt = off 40813 v.Aux = sym 40814 v.AddArg(x) 40815 v.AddArg(ptr) 40816 v.AddArg(mem) 40817 return true 40818 } 40819 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 40820 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40821 // result: (XORload <t> [off] {sym} x ptr mem) 40822 for { 40823 t := v.Type 40824 _ = v.Args[1] 40825 g := v.Args[0] 40826 if g.Op != OpS390XMOVDload { 40827 break 40828 } 40829 off := g.AuxInt 40830 sym := g.Aux 40831 _ = g.Args[1] 40832 ptr := g.Args[0] 40833 mem := g.Args[1] 40834 x := v.Args[1] 40835 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40836 break 40837 } 40838 v.reset(OpS390XXORload) 40839 v.Type = t 40840 v.AuxInt = off 40841 v.Aux = sym 40842 v.AddArg(x) 40843 v.AddArg(ptr) 40844 v.AddArg(mem) 40845 return true 40846 } 40847 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 40848 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40849 // result: (XORload <t> [off] {sym} x ptr mem) 40850 for { 40851 t := v.Type 40852 _ = v.Args[1] 40853 g := v.Args[0] 40854 if g.Op != OpS390XMOVDload { 40855 break 40856 } 40857 off := g.AuxInt 40858 sym := g.Aux 40859 _ = g.Args[1] 40860 ptr := g.Args[0] 40861 mem := g.Args[1] 40862 x := v.Args[1] 40863 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40864 break 40865 } 40866 v.reset(OpS390XXORload) 40867 v.Type = t 40868 v.AuxInt = off 40869 v.Aux = sym 40870 v.AddArg(x) 40871 v.AddArg(ptr) 40872 v.AddArg(mem) 40873 return true 40874 } 40875 return false 40876 } 40877 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 40878 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 40879 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 40880 // result: (XORload <t> [off] {sym} x ptr mem) 40881 for { 40882 t := v.Type 40883 _ = v.Args[1] 40884 x := v.Args[0] 40885 g := v.Args[1] 40886 if g.Op != OpS390XMOVDload { 40887 break 40888 } 40889 off := g.AuxInt 40890 sym := g.Aux 40891 _ = g.Args[1] 40892 ptr := g.Args[0] 40893 mem := g.Args[1] 40894 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 40895 break 40896 } 40897 v.reset(OpS390XXORload) 40898 v.Type = t 40899 v.AuxInt = off 40900 v.Aux = sym 40901 v.AddArg(x) 40902 v.AddArg(ptr) 40903 v.AddArg(mem) 40904 return true 40905 } 40906 return false 40907 } 40908 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 40909 // match: (XORW x (MOVDconst [c])) 40910 // cond: 40911 // result: (XORWconst [int64(int32(c))] x) 40912 for { 40913 _ = v.Args[1] 40914 x := v.Args[0] 40915 v_1 := v.Args[1] 40916 if v_1.Op != OpS390XMOVDconst { 40917 break 40918 } 40919 c := v_1.AuxInt 40920 v.reset(OpS390XXORWconst) 40921 v.AuxInt = int64(int32(c)) 40922 v.AddArg(x) 40923 return true 40924 } 40925 // match: (XORW (MOVDconst [c]) x) 40926 // cond: 40927 // result: (XORWconst [int64(int32(c))] x) 40928 for { 40929 _ = v.Args[1] 40930 v_0 := v.Args[0] 40931 if v_0.Op != OpS390XMOVDconst { 40932 break 40933 } 40934 c := v_0.AuxInt 40935 x := v.Args[1] 40936 v.reset(OpS390XXORWconst) 40937 v.AuxInt = int64(int32(c)) 40938 v.AddArg(x) 40939 return true 40940 } 40941 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 40942 // cond: d == 32-c 40943 // result: (RLLconst [c] x) 40944 for { 40945 _ = v.Args[1] 40946 v_0 := v.Args[0] 40947 if v_0.Op != OpS390XSLWconst { 40948 break 40949 } 40950 c := v_0.AuxInt 40951 x := v_0.Args[0] 40952 v_1 := v.Args[1] 40953 if v_1.Op != OpS390XSRWconst { 40954 break 40955 } 40956 d := v_1.AuxInt 40957 if x != v_1.Args[0] { 40958 break 40959 } 40960 if !(d == 32-c) { 40961 break 40962 } 40963 v.reset(OpS390XRLLconst) 40964 v.AuxInt = c 40965 v.AddArg(x) 40966 return true 40967 } 40968 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 40969 // cond: d == 32-c 40970 // result: (RLLconst [c] x) 40971 for { 40972 _ = v.Args[1] 40973 v_0 := v.Args[0] 40974 if v_0.Op != OpS390XSRWconst { 40975 break 40976 } 40977 d := v_0.AuxInt 40978 x := v_0.Args[0] 40979 v_1 := v.Args[1] 40980 if v_1.Op != OpS390XSLWconst { 40981 break 40982 } 40983 c := v_1.AuxInt 40984 if x != v_1.Args[0] { 40985 break 40986 } 40987 if !(d == 32-c) { 40988 break 40989 } 40990 v.reset(OpS390XRLLconst) 40991 v.AuxInt = c 40992 v.AddArg(x) 40993 return true 40994 } 40995 // match: (XORW x x) 40996 // cond: 40997 // result: (MOVDconst [0]) 40998 for { 40999 _ = v.Args[1] 41000 x := v.Args[0] 41001 if x != v.Args[1] { 41002 break 41003 } 41004 v.reset(OpS390XMOVDconst) 41005 v.AuxInt = 0 41006 return true 41007 } 41008 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 41009 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41010 // result: (XORWload <t> [off] {sym} x ptr mem) 41011 for { 41012 t := v.Type 41013 _ = v.Args[1] 41014 x := v.Args[0] 41015 g := v.Args[1] 41016 if g.Op != OpS390XMOVWload { 41017 break 41018 } 41019 off := g.AuxInt 41020 sym := g.Aux 41021 _ = g.Args[1] 41022 ptr := g.Args[0] 41023 mem := g.Args[1] 41024 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41025 break 41026 } 41027 v.reset(OpS390XXORWload) 41028 v.Type = t 41029 v.AuxInt = off 41030 v.Aux = sym 41031 v.AddArg(x) 41032 v.AddArg(ptr) 41033 v.AddArg(mem) 41034 return true 41035 } 41036 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 41037 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41038 // result: (XORWload <t> [off] {sym} x ptr mem) 41039 for { 41040 t := v.Type 41041 _ = v.Args[1] 41042 g := v.Args[0] 41043 if g.Op != OpS390XMOVWload { 41044 break 41045 } 41046 off := g.AuxInt 41047 sym := g.Aux 41048 _ = g.Args[1] 41049 ptr := g.Args[0] 41050 mem := g.Args[1] 41051 x := v.Args[1] 41052 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41053 break 41054 } 41055 v.reset(OpS390XXORWload) 41056 v.Type = t 41057 v.AuxInt = off 41058 v.Aux = sym 41059 v.AddArg(x) 41060 v.AddArg(ptr) 41061 v.AddArg(mem) 41062 return true 41063 } 41064 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 41065 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41066 // result: (XORWload <t> [off] {sym} x ptr mem) 41067 for { 41068 t := v.Type 41069 _ = v.Args[1] 41070 g := v.Args[0] 41071 if g.Op != OpS390XMOVWload { 41072 break 41073 } 41074 off := g.AuxInt 41075 sym := g.Aux 41076 _ = g.Args[1] 41077 ptr := g.Args[0] 41078 mem := g.Args[1] 41079 x := v.Args[1] 41080 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41081 break 41082 } 41083 v.reset(OpS390XXORWload) 41084 v.Type = t 41085 v.AuxInt = off 41086 v.Aux = sym 41087 v.AddArg(x) 41088 v.AddArg(ptr) 41089 v.AddArg(mem) 41090 return true 41091 } 41092 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 41093 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41094 // result: (XORWload <t> [off] {sym} x ptr mem) 41095 for { 41096 t := v.Type 41097 _ = v.Args[1] 41098 x := v.Args[0] 41099 g := v.Args[1] 41100 if g.Op != OpS390XMOVWload { 41101 break 41102 } 41103 off := g.AuxInt 41104 sym := g.Aux 41105 _ = g.Args[1] 41106 ptr := g.Args[0] 41107 mem := g.Args[1] 41108 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41109 break 41110 } 41111 v.reset(OpS390XXORWload) 41112 v.Type = t 41113 v.AuxInt = off 41114 v.Aux = sym 41115 v.AddArg(x) 41116 v.AddArg(ptr) 41117 v.AddArg(mem) 41118 return true 41119 } 41120 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 41121 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41122 // result: (XORWload <t> [off] {sym} x ptr mem) 41123 for { 41124 t := v.Type 41125 _ = v.Args[1] 41126 x := v.Args[0] 41127 g := v.Args[1] 41128 if g.Op != OpS390XMOVWZload { 41129 break 41130 } 41131 off := g.AuxInt 41132 sym := g.Aux 41133 _ = g.Args[1] 41134 ptr := g.Args[0] 41135 mem := g.Args[1] 41136 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41137 break 41138 } 41139 v.reset(OpS390XXORWload) 41140 v.Type = t 41141 v.AuxInt = off 41142 v.Aux = sym 41143 v.AddArg(x) 41144 v.AddArg(ptr) 41145 v.AddArg(mem) 41146 return true 41147 } 41148 return false 41149 } 41150 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 41151 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 41152 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41153 // result: (XORWload <t> [off] {sym} x ptr mem) 41154 for { 41155 t := v.Type 41156 _ = v.Args[1] 41157 g := v.Args[0] 41158 if g.Op != OpS390XMOVWZload { 41159 break 41160 } 41161 off := g.AuxInt 41162 sym := g.Aux 41163 _ = g.Args[1] 41164 ptr := g.Args[0] 41165 mem := g.Args[1] 41166 x := v.Args[1] 41167 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41168 break 41169 } 41170 v.reset(OpS390XXORWload) 41171 v.Type = t 41172 v.AuxInt = off 41173 v.Aux = sym 41174 v.AddArg(x) 41175 v.AddArg(ptr) 41176 v.AddArg(mem) 41177 return true 41178 } 41179 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 41180 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41181 // result: (XORWload <t> [off] {sym} x ptr mem) 41182 for { 41183 t := v.Type 41184 _ = v.Args[1] 41185 g := v.Args[0] 41186 if g.Op != OpS390XMOVWZload { 41187 break 41188 } 41189 off := g.AuxInt 41190 sym := g.Aux 41191 _ = g.Args[1] 41192 ptr := g.Args[0] 41193 mem := g.Args[1] 41194 x := v.Args[1] 41195 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41196 break 41197 } 41198 v.reset(OpS390XXORWload) 41199 v.Type = t 41200 v.AuxInt = off 41201 v.Aux = sym 41202 v.AddArg(x) 41203 v.AddArg(ptr) 41204 v.AddArg(mem) 41205 return true 41206 } 41207 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 41208 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) 41209 // result: (XORWload <t> [off] {sym} x ptr mem) 41210 for { 41211 t := v.Type 41212 _ = v.Args[1] 41213 x := v.Args[0] 41214 g := v.Args[1] 41215 if g.Op != OpS390XMOVWZload { 41216 break 41217 } 41218 off := g.AuxInt 41219 sym := g.Aux 41220 _ = g.Args[1] 41221 ptr := g.Args[0] 41222 mem := g.Args[1] 41223 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { 41224 break 41225 } 41226 v.reset(OpS390XXORWload) 41227 v.Type = t 41228 v.AuxInt = off 41229 v.Aux = sym 41230 v.AddArg(x) 41231 v.AddArg(ptr) 41232 v.AddArg(mem) 41233 return true 41234 } 41235 return false 41236 } 41237 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 41238 // match: (XORWconst [c] x) 41239 // cond: int32(c)==0 41240 // result: x 41241 for { 41242 c := v.AuxInt 41243 x := v.Args[0] 41244 if !(int32(c) == 0) { 41245 break 41246 } 41247 v.reset(OpCopy) 41248 v.Type = x.Type 41249 v.AddArg(x) 41250 return true 41251 } 41252 // match: (XORWconst [c] (MOVDconst [d])) 41253 // cond: 41254 // result: (MOVDconst [c^d]) 41255 for { 41256 c := v.AuxInt 41257 v_0 := v.Args[0] 41258 if v_0.Op != OpS390XMOVDconst { 41259 break 41260 } 41261 d := v_0.AuxInt 41262 v.reset(OpS390XMOVDconst) 41263 v.AuxInt = c ^ d 41264 return true 41265 } 41266 return false 41267 } 41268 func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { 41269 // match: (XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 41270 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 41271 // result: (XORWload [off1+off2] {sym} x ptr mem) 41272 for { 41273 off1 := v.AuxInt 41274 sym := v.Aux 41275 _ = v.Args[2] 41276 x := v.Args[0] 41277 v_1 := v.Args[1] 41278 if v_1.Op != OpS390XADDconst { 41279 break 41280 } 41281 off2 := v_1.AuxInt 41282 ptr := v_1.Args[0] 41283 mem := v.Args[2] 41284 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 41285 break 41286 } 41287 v.reset(OpS390XXORWload) 41288 v.AuxInt = off1 + off2 41289 v.Aux = sym 41290 v.AddArg(x) 41291 v.AddArg(ptr) 41292 v.AddArg(mem) 41293 return true 41294 } 41295 // match: (XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 41296 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 41297 // result: (XORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 41298 for { 41299 o1 := v.AuxInt 41300 s1 := v.Aux 41301 _ = v.Args[2] 41302 x := v.Args[0] 41303 v_1 := v.Args[1] 41304 if v_1.Op != OpS390XMOVDaddr { 41305 break 41306 } 41307 o2 := v_1.AuxInt 41308 s2 := v_1.Aux 41309 ptr := v_1.Args[0] 41310 mem := v.Args[2] 41311 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 41312 break 41313 } 41314 v.reset(OpS390XXORWload) 41315 v.AuxInt = o1 + o2 41316 v.Aux = mergeSym(s1, s2) 41317 v.AddArg(x) 41318 v.AddArg(ptr) 41319 v.AddArg(mem) 41320 return true 41321 } 41322 return false 41323 } 41324 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 41325 // match: (XORconst [0] x) 41326 // cond: 41327 // result: x 41328 for { 41329 if v.AuxInt != 0 { 41330 break 41331 } 41332 x := v.Args[0] 41333 v.reset(OpCopy) 41334 v.Type = x.Type 41335 v.AddArg(x) 41336 return true 41337 } 41338 // match: (XORconst [c] (MOVDconst [d])) 41339 // cond: 41340 // result: (MOVDconst [c^d]) 41341 for { 41342 c := v.AuxInt 41343 v_0 := v.Args[0] 41344 if v_0.Op != OpS390XMOVDconst { 41345 break 41346 } 41347 d := v_0.AuxInt 41348 v.reset(OpS390XMOVDconst) 41349 v.AuxInt = c ^ d 41350 return true 41351 } 41352 return false 41353 } 41354 func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { 41355 b := v.Block 41356 _ = b 41357 // match: (XORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 41358 // cond: isSamePtr(ptr1, ptr2) 41359 // result: (XOR x (LGDR <t> y)) 41360 for { 41361 t := v.Type 41362 off := v.AuxInt 41363 sym := v.Aux 41364 _ = v.Args[2] 41365 x := v.Args[0] 41366 ptr1 := v.Args[1] 41367 v_2 := v.Args[2] 41368 if v_2.Op != OpS390XFMOVDstore { 41369 break 41370 } 41371 if v_2.AuxInt != off { 41372 break 41373 } 41374 if v_2.Aux != sym { 41375 break 41376 } 41377 _ = v_2.Args[2] 41378 ptr2 := v_2.Args[0] 41379 y := v_2.Args[1] 41380 if !(isSamePtr(ptr1, ptr2)) { 41381 break 41382 } 41383 v.reset(OpS390XXOR) 41384 v.AddArg(x) 41385 v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) 41386 v0.AddArg(y) 41387 v.AddArg(v0) 41388 return true 41389 } 41390 // match: (XORload [off1] {sym} x (ADDconst [off2] ptr) mem) 41391 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 41392 // result: (XORload [off1+off2] {sym} x ptr mem) 41393 for { 41394 off1 := v.AuxInt 41395 sym := v.Aux 41396 _ = v.Args[2] 41397 x := v.Args[0] 41398 v_1 := v.Args[1] 41399 if v_1.Op != OpS390XADDconst { 41400 break 41401 } 41402 off2 := v_1.AuxInt 41403 ptr := v_1.Args[0] 41404 mem := v.Args[2] 41405 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 41406 break 41407 } 41408 v.reset(OpS390XXORload) 41409 v.AuxInt = off1 + off2 41410 v.Aux = sym 41411 v.AddArg(x) 41412 v.AddArg(ptr) 41413 v.AddArg(mem) 41414 return true 41415 } 41416 // match: (XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 41417 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 41418 // result: (XORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 41419 for { 41420 o1 := v.AuxInt 41421 s1 := v.Aux 41422 _ = v.Args[2] 41423 x := v.Args[0] 41424 v_1 := v.Args[1] 41425 if v_1.Op != OpS390XMOVDaddr { 41426 break 41427 } 41428 o2 := v_1.AuxInt 41429 s2 := v_1.Aux 41430 ptr := v_1.Args[0] 41431 mem := v.Args[2] 41432 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 41433 break 41434 } 41435 v.reset(OpS390XXORload) 41436 v.AuxInt = o1 + o2 41437 v.Aux = mergeSym(s1, s2) 41438 v.AddArg(x) 41439 v.AddArg(ptr) 41440 v.AddArg(mem) 41441 return true 41442 } 41443 return false 41444 } 41445 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 41446 b := v.Block 41447 _ = b 41448 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 41449 // cond: 41450 // result: (ADDW val (Select0 <t> tuple)) 41451 for { 41452 t := v.Type 41453 v_0 := v.Args[0] 41454 if v_0.Op != OpS390XAddTupleFirst32 { 41455 break 41456 } 41457 _ = v_0.Args[1] 41458 val := v_0.Args[0] 41459 tuple := v_0.Args[1] 41460 v.reset(OpS390XADDW) 41461 v.AddArg(val) 41462 v0 := b.NewValue0(v.Pos, OpSelect0, t) 41463 v0.AddArg(tuple) 41464 v.AddArg(v0) 41465 return true 41466 } 41467 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 41468 // cond: 41469 // result: (ADD val (Select0 <t> tuple)) 41470 for { 41471 t := v.Type 41472 v_0 := v.Args[0] 41473 if v_0.Op != OpS390XAddTupleFirst64 { 41474 break 41475 } 41476 _ = v_0.Args[1] 41477 val := v_0.Args[0] 41478 tuple := v_0.Args[1] 41479 v.reset(OpS390XADD) 41480 v.AddArg(val) 41481 v0 := b.NewValue0(v.Pos, OpSelect0, t) 41482 v0.AddArg(tuple) 41483 v.AddArg(v0) 41484 return true 41485 } 41486 return false 41487 } 41488 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 41489 // match: (Select1 (AddTupleFirst32 _ tuple)) 41490 // cond: 41491 // result: (Select1 tuple) 41492 for { 41493 v_0 := v.Args[0] 41494 if v_0.Op != OpS390XAddTupleFirst32 { 41495 break 41496 } 41497 _ = v_0.Args[1] 41498 tuple := v_0.Args[1] 41499 v.reset(OpSelect1) 41500 v.AddArg(tuple) 41501 return true 41502 } 41503 // match: (Select1 (AddTupleFirst64 _ tuple)) 41504 // cond: 41505 // result: (Select1 tuple) 41506 for { 41507 v_0 := v.Args[0] 41508 if v_0.Op != OpS390XAddTupleFirst64 { 41509 break 41510 } 41511 _ = v_0.Args[1] 41512 tuple := v_0.Args[1] 41513 v.reset(OpSelect1) 41514 v.AddArg(tuple) 41515 return true 41516 } 41517 return false 41518 } 41519 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 41520 // match: (SignExt16to32 x) 41521 // cond: 41522 // result: (MOVHreg x) 41523 for { 41524 x := v.Args[0] 41525 v.reset(OpS390XMOVHreg) 41526 v.AddArg(x) 41527 return true 41528 } 41529 } 41530 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 41531 // match: (SignExt16to64 x) 41532 // cond: 41533 // result: (MOVHreg x) 41534 for { 41535 x := v.Args[0] 41536 v.reset(OpS390XMOVHreg) 41537 v.AddArg(x) 41538 return true 41539 } 41540 } 41541 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 41542 // match: (SignExt32to64 x) 41543 // cond: 41544 // result: (MOVWreg x) 41545 for { 41546 x := v.Args[0] 41547 v.reset(OpS390XMOVWreg) 41548 v.AddArg(x) 41549 return true 41550 } 41551 } 41552 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 41553 // match: (SignExt8to16 x) 41554 // cond: 41555 // result: (MOVBreg x) 41556 for { 41557 x := v.Args[0] 41558 v.reset(OpS390XMOVBreg) 41559 v.AddArg(x) 41560 return true 41561 } 41562 } 41563 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 41564 // match: (SignExt8to32 x) 41565 // cond: 41566 // result: (MOVBreg x) 41567 for { 41568 x := v.Args[0] 41569 v.reset(OpS390XMOVBreg) 41570 v.AddArg(x) 41571 return true 41572 } 41573 } 41574 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 41575 // match: (SignExt8to64 x) 41576 // cond: 41577 // result: (MOVBreg x) 41578 for { 41579 x := v.Args[0] 41580 v.reset(OpS390XMOVBreg) 41581 v.AddArg(x) 41582 return true 41583 } 41584 } 41585 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 41586 b := v.Block 41587 _ = b 41588 // match: (Slicemask <t> x) 41589 // cond: 41590 // result: (SRADconst (NEG <t> x) [63]) 41591 for { 41592 t := v.Type 41593 x := v.Args[0] 41594 v.reset(OpS390XSRADconst) 41595 v.AuxInt = 63 41596 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 41597 v0.AddArg(x) 41598 v.AddArg(v0) 41599 return true 41600 } 41601 } 41602 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 41603 // match: (Sqrt x) 41604 // cond: 41605 // result: (FSQRT x) 41606 for { 41607 x := v.Args[0] 41608 v.reset(OpS390XFSQRT) 41609 v.AddArg(x) 41610 return true 41611 } 41612 } 41613 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 41614 // match: (StaticCall [argwid] {target} mem) 41615 // cond: 41616 // result: (CALLstatic [argwid] {target} mem) 41617 for { 41618 argwid := v.AuxInt 41619 target := v.Aux 41620 mem := v.Args[0] 41621 v.reset(OpS390XCALLstatic) 41622 v.AuxInt = argwid 41623 v.Aux = target 41624 v.AddArg(mem) 41625 return true 41626 } 41627 } 41628 func rewriteValueS390X_OpStore_0(v *Value) bool { 41629 // match: (Store {t} ptr val mem) 41630 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 41631 // result: (FMOVDstore ptr val mem) 41632 for { 41633 t := v.Aux 41634 _ = v.Args[2] 41635 ptr := v.Args[0] 41636 val := v.Args[1] 41637 mem := v.Args[2] 41638 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 41639 break 41640 } 41641 v.reset(OpS390XFMOVDstore) 41642 v.AddArg(ptr) 41643 v.AddArg(val) 41644 v.AddArg(mem) 41645 return true 41646 } 41647 // match: (Store {t} ptr val mem) 41648 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 41649 // result: (FMOVSstore ptr val mem) 41650 for { 41651 t := v.Aux 41652 _ = v.Args[2] 41653 ptr := v.Args[0] 41654 val := v.Args[1] 41655 mem := v.Args[2] 41656 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 41657 break 41658 } 41659 v.reset(OpS390XFMOVSstore) 41660 v.AddArg(ptr) 41661 v.AddArg(val) 41662 v.AddArg(mem) 41663 return true 41664 } 41665 // match: (Store {t} ptr val mem) 41666 // cond: t.(*types.Type).Size() == 8 41667 // result: (MOVDstore ptr val mem) 41668 for { 41669 t := v.Aux 41670 _ = v.Args[2] 41671 ptr := v.Args[0] 41672 val := v.Args[1] 41673 mem := v.Args[2] 41674 if !(t.(*types.Type).Size() == 8) { 41675 break 41676 } 41677 v.reset(OpS390XMOVDstore) 41678 v.AddArg(ptr) 41679 v.AddArg(val) 41680 v.AddArg(mem) 41681 return true 41682 } 41683 // match: (Store {t} ptr val mem) 41684 // cond: t.(*types.Type).Size() == 4 41685 // result: (MOVWstore ptr val mem) 41686 for { 41687 t := v.Aux 41688 _ = v.Args[2] 41689 ptr := v.Args[0] 41690 val := v.Args[1] 41691 mem := v.Args[2] 41692 if !(t.(*types.Type).Size() == 4) { 41693 break 41694 } 41695 v.reset(OpS390XMOVWstore) 41696 v.AddArg(ptr) 41697 v.AddArg(val) 41698 v.AddArg(mem) 41699 return true 41700 } 41701 // match: (Store {t} ptr val mem) 41702 // cond: t.(*types.Type).Size() == 2 41703 // result: (MOVHstore ptr val mem) 41704 for { 41705 t := v.Aux 41706 _ = v.Args[2] 41707 ptr := v.Args[0] 41708 val := v.Args[1] 41709 mem := v.Args[2] 41710 if !(t.(*types.Type).Size() == 2) { 41711 break 41712 } 41713 v.reset(OpS390XMOVHstore) 41714 v.AddArg(ptr) 41715 v.AddArg(val) 41716 v.AddArg(mem) 41717 return true 41718 } 41719 // match: (Store {t} ptr val mem) 41720 // cond: t.(*types.Type).Size() == 1 41721 // result: (MOVBstore ptr val mem) 41722 for { 41723 t := v.Aux 41724 _ = v.Args[2] 41725 ptr := v.Args[0] 41726 val := v.Args[1] 41727 mem := v.Args[2] 41728 if !(t.(*types.Type).Size() == 1) { 41729 break 41730 } 41731 v.reset(OpS390XMOVBstore) 41732 v.AddArg(ptr) 41733 v.AddArg(val) 41734 v.AddArg(mem) 41735 return true 41736 } 41737 return false 41738 } 41739 func rewriteValueS390X_OpSub16_0(v *Value) bool { 41740 // match: (Sub16 x y) 41741 // cond: 41742 // result: (SUBW x y) 41743 for { 41744 _ = v.Args[1] 41745 x := v.Args[0] 41746 y := v.Args[1] 41747 v.reset(OpS390XSUBW) 41748 v.AddArg(x) 41749 v.AddArg(y) 41750 return true 41751 } 41752 } 41753 func rewriteValueS390X_OpSub32_0(v *Value) bool { 41754 // match: (Sub32 x y) 41755 // cond: 41756 // result: (SUBW x y) 41757 for { 41758 _ = v.Args[1] 41759 x := v.Args[0] 41760 y := v.Args[1] 41761 v.reset(OpS390XSUBW) 41762 v.AddArg(x) 41763 v.AddArg(y) 41764 return true 41765 } 41766 } 41767 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 41768 // match: (Sub32F x y) 41769 // cond: 41770 // result: (FSUBS x y) 41771 for { 41772 _ = v.Args[1] 41773 x := v.Args[0] 41774 y := v.Args[1] 41775 v.reset(OpS390XFSUBS) 41776 v.AddArg(x) 41777 v.AddArg(y) 41778 return true 41779 } 41780 } 41781 func rewriteValueS390X_OpSub64_0(v *Value) bool { 41782 // match: (Sub64 x y) 41783 // cond: 41784 // result: (SUB x y) 41785 for { 41786 _ = v.Args[1] 41787 x := v.Args[0] 41788 y := v.Args[1] 41789 v.reset(OpS390XSUB) 41790 v.AddArg(x) 41791 v.AddArg(y) 41792 return true 41793 } 41794 } 41795 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 41796 // match: (Sub64F x y) 41797 // cond: 41798 // result: (FSUB x y) 41799 for { 41800 _ = v.Args[1] 41801 x := v.Args[0] 41802 y := v.Args[1] 41803 v.reset(OpS390XFSUB) 41804 v.AddArg(x) 41805 v.AddArg(y) 41806 return true 41807 } 41808 } 41809 func rewriteValueS390X_OpSub8_0(v *Value) bool { 41810 // match: (Sub8 x y) 41811 // cond: 41812 // result: (SUBW x y) 41813 for { 41814 _ = v.Args[1] 41815 x := v.Args[0] 41816 y := v.Args[1] 41817 v.reset(OpS390XSUBW) 41818 v.AddArg(x) 41819 v.AddArg(y) 41820 return true 41821 } 41822 } 41823 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 41824 // match: (SubPtr x y) 41825 // cond: 41826 // result: (SUB x y) 41827 for { 41828 _ = v.Args[1] 41829 x := v.Args[0] 41830 y := v.Args[1] 41831 v.reset(OpS390XSUB) 41832 v.AddArg(x) 41833 v.AddArg(y) 41834 return true 41835 } 41836 } 41837 func rewriteValueS390X_OpTrunc_0(v *Value) bool { 41838 // match: (Trunc x) 41839 // cond: 41840 // result: (FIDBR [5] x) 41841 for { 41842 x := v.Args[0] 41843 v.reset(OpS390XFIDBR) 41844 v.AuxInt = 5 41845 v.AddArg(x) 41846 return true 41847 } 41848 } 41849 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 41850 // match: (Trunc16to8 x) 41851 // cond: 41852 // result: x 41853 for { 41854 x := v.Args[0] 41855 v.reset(OpCopy) 41856 v.Type = x.Type 41857 v.AddArg(x) 41858 return true 41859 } 41860 } 41861 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 41862 // match: (Trunc32to16 x) 41863 // cond: 41864 // result: x 41865 for { 41866 x := v.Args[0] 41867 v.reset(OpCopy) 41868 v.Type = x.Type 41869 v.AddArg(x) 41870 return true 41871 } 41872 } 41873 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 41874 // match: (Trunc32to8 x) 41875 // cond: 41876 // result: x 41877 for { 41878 x := v.Args[0] 41879 v.reset(OpCopy) 41880 v.Type = x.Type 41881 v.AddArg(x) 41882 return true 41883 } 41884 } 41885 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 41886 // match: (Trunc64to16 x) 41887 // cond: 41888 // result: x 41889 for { 41890 x := v.Args[0] 41891 v.reset(OpCopy) 41892 v.Type = x.Type 41893 v.AddArg(x) 41894 return true 41895 } 41896 } 41897 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 41898 // match: (Trunc64to32 x) 41899 // cond: 41900 // result: x 41901 for { 41902 x := v.Args[0] 41903 v.reset(OpCopy) 41904 v.Type = x.Type 41905 v.AddArg(x) 41906 return true 41907 } 41908 } 41909 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 41910 // match: (Trunc64to8 x) 41911 // cond: 41912 // result: x 41913 for { 41914 x := v.Args[0] 41915 v.reset(OpCopy) 41916 v.Type = x.Type 41917 v.AddArg(x) 41918 return true 41919 } 41920 } 41921 func rewriteValueS390X_OpWB_0(v *Value) bool { 41922 // match: (WB {fn} destptr srcptr mem) 41923 // cond: 41924 // result: (LoweredWB {fn} destptr srcptr mem) 41925 for { 41926 fn := v.Aux 41927 _ = v.Args[2] 41928 destptr := v.Args[0] 41929 srcptr := v.Args[1] 41930 mem := v.Args[2] 41931 v.reset(OpS390XLoweredWB) 41932 v.Aux = fn 41933 v.AddArg(destptr) 41934 v.AddArg(srcptr) 41935 v.AddArg(mem) 41936 return true 41937 } 41938 } 41939 func rewriteValueS390X_OpXor16_0(v *Value) bool { 41940 // match: (Xor16 x y) 41941 // cond: 41942 // result: (XORW x y) 41943 for { 41944 _ = v.Args[1] 41945 x := v.Args[0] 41946 y := v.Args[1] 41947 v.reset(OpS390XXORW) 41948 v.AddArg(x) 41949 v.AddArg(y) 41950 return true 41951 } 41952 } 41953 func rewriteValueS390X_OpXor32_0(v *Value) bool { 41954 // match: (Xor32 x y) 41955 // cond: 41956 // result: (XORW x y) 41957 for { 41958 _ = v.Args[1] 41959 x := v.Args[0] 41960 y := v.Args[1] 41961 v.reset(OpS390XXORW) 41962 v.AddArg(x) 41963 v.AddArg(y) 41964 return true 41965 } 41966 } 41967 func rewriteValueS390X_OpXor64_0(v *Value) bool { 41968 // match: (Xor64 x y) 41969 // cond: 41970 // result: (XOR x y) 41971 for { 41972 _ = v.Args[1] 41973 x := v.Args[0] 41974 y := v.Args[1] 41975 v.reset(OpS390XXOR) 41976 v.AddArg(x) 41977 v.AddArg(y) 41978 return true 41979 } 41980 } 41981 func rewriteValueS390X_OpXor8_0(v *Value) bool { 41982 // match: (Xor8 x y) 41983 // cond: 41984 // result: (XORW x y) 41985 for { 41986 _ = v.Args[1] 41987 x := v.Args[0] 41988 y := v.Args[1] 41989 v.reset(OpS390XXORW) 41990 v.AddArg(x) 41991 v.AddArg(y) 41992 return true 41993 } 41994 } 41995 func rewriteValueS390X_OpZero_0(v *Value) bool { 41996 b := v.Block 41997 _ = b 41998 // match: (Zero [0] _ mem) 41999 // cond: 42000 // result: mem 42001 for { 42002 if v.AuxInt != 0 { 42003 break 42004 } 42005 _ = v.Args[1] 42006 mem := v.Args[1] 42007 v.reset(OpCopy) 42008 v.Type = mem.Type 42009 v.AddArg(mem) 42010 return true 42011 } 42012 // match: (Zero [1] destptr mem) 42013 // cond: 42014 // result: (MOVBstoreconst [0] destptr mem) 42015 for { 42016 if v.AuxInt != 1 { 42017 break 42018 } 42019 _ = v.Args[1] 42020 destptr := v.Args[0] 42021 mem := v.Args[1] 42022 v.reset(OpS390XMOVBstoreconst) 42023 v.AuxInt = 0 42024 v.AddArg(destptr) 42025 v.AddArg(mem) 42026 return true 42027 } 42028 // match: (Zero [2] destptr mem) 42029 // cond: 42030 // result: (MOVHstoreconst [0] destptr mem) 42031 for { 42032 if v.AuxInt != 2 { 42033 break 42034 } 42035 _ = v.Args[1] 42036 destptr := v.Args[0] 42037 mem := v.Args[1] 42038 v.reset(OpS390XMOVHstoreconst) 42039 v.AuxInt = 0 42040 v.AddArg(destptr) 42041 v.AddArg(mem) 42042 return true 42043 } 42044 // match: (Zero [4] destptr mem) 42045 // cond: 42046 // result: (MOVWstoreconst [0] destptr mem) 42047 for { 42048 if v.AuxInt != 4 { 42049 break 42050 } 42051 _ = v.Args[1] 42052 destptr := v.Args[0] 42053 mem := v.Args[1] 42054 v.reset(OpS390XMOVWstoreconst) 42055 v.AuxInt = 0 42056 v.AddArg(destptr) 42057 v.AddArg(mem) 42058 return true 42059 } 42060 // match: (Zero [8] destptr mem) 42061 // cond: 42062 // result: (MOVDstoreconst [0] destptr mem) 42063 for { 42064 if v.AuxInt != 8 { 42065 break 42066 } 42067 _ = v.Args[1] 42068 destptr := v.Args[0] 42069 mem := v.Args[1] 42070 v.reset(OpS390XMOVDstoreconst) 42071 v.AuxInt = 0 42072 v.AddArg(destptr) 42073 v.AddArg(mem) 42074 return true 42075 } 42076 // match: (Zero [3] destptr mem) 42077 // cond: 42078 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 42079 for { 42080 if v.AuxInt != 3 { 42081 break 42082 } 42083 _ = v.Args[1] 42084 destptr := v.Args[0] 42085 mem := v.Args[1] 42086 v.reset(OpS390XMOVBstoreconst) 42087 v.AuxInt = makeValAndOff(0, 2) 42088 v.AddArg(destptr) 42089 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 42090 v0.AuxInt = 0 42091 v0.AddArg(destptr) 42092 v0.AddArg(mem) 42093 v.AddArg(v0) 42094 return true 42095 } 42096 // match: (Zero [5] destptr mem) 42097 // cond: 42098 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 42099 for { 42100 if v.AuxInt != 5 { 42101 break 42102 } 42103 _ = v.Args[1] 42104 destptr := v.Args[0] 42105 mem := v.Args[1] 42106 v.reset(OpS390XMOVBstoreconst) 42107 v.AuxInt = makeValAndOff(0, 4) 42108 v.AddArg(destptr) 42109 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42110 v0.AuxInt = 0 42111 v0.AddArg(destptr) 42112 v0.AddArg(mem) 42113 v.AddArg(v0) 42114 return true 42115 } 42116 // match: (Zero [6] destptr mem) 42117 // cond: 42118 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 42119 for { 42120 if v.AuxInt != 6 { 42121 break 42122 } 42123 _ = v.Args[1] 42124 destptr := v.Args[0] 42125 mem := v.Args[1] 42126 v.reset(OpS390XMOVHstoreconst) 42127 v.AuxInt = makeValAndOff(0, 4) 42128 v.AddArg(destptr) 42129 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42130 v0.AuxInt = 0 42131 v0.AddArg(destptr) 42132 v0.AddArg(mem) 42133 v.AddArg(v0) 42134 return true 42135 } 42136 // match: (Zero [7] destptr mem) 42137 // cond: 42138 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 42139 for { 42140 if v.AuxInt != 7 { 42141 break 42142 } 42143 _ = v.Args[1] 42144 destptr := v.Args[0] 42145 mem := v.Args[1] 42146 v.reset(OpS390XMOVWstoreconst) 42147 v.AuxInt = makeValAndOff(0, 3) 42148 v.AddArg(destptr) 42149 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 42150 v0.AuxInt = 0 42151 v0.AddArg(destptr) 42152 v0.AddArg(mem) 42153 v.AddArg(v0) 42154 return true 42155 } 42156 // match: (Zero [s] destptr mem) 42157 // cond: s > 0 && s <= 1024 42158 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 42159 for { 42160 s := v.AuxInt 42161 _ = v.Args[1] 42162 destptr := v.Args[0] 42163 mem := v.Args[1] 42164 if !(s > 0 && s <= 1024) { 42165 break 42166 } 42167 v.reset(OpS390XCLEAR) 42168 v.AuxInt = makeValAndOff(s, 0) 42169 v.AddArg(destptr) 42170 v.AddArg(mem) 42171 return true 42172 } 42173 return false 42174 } 42175 func rewriteValueS390X_OpZero_10(v *Value) bool { 42176 b := v.Block 42177 _ = b 42178 // match: (Zero [s] destptr mem) 42179 // cond: s > 1024 42180 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 42181 for { 42182 s := v.AuxInt 42183 _ = v.Args[1] 42184 destptr := v.Args[0] 42185 mem := v.Args[1] 42186 if !(s > 1024) { 42187 break 42188 } 42189 v.reset(OpS390XLoweredZero) 42190 v.AuxInt = s % 256 42191 v.AddArg(destptr) 42192 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 42193 v0.AuxInt = (s / 256) * 256 42194 v0.AddArg(destptr) 42195 v.AddArg(v0) 42196 v.AddArg(mem) 42197 return true 42198 } 42199 return false 42200 } 42201 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 42202 // match: (ZeroExt16to32 x) 42203 // cond: 42204 // result: (MOVHZreg x) 42205 for { 42206 x := v.Args[0] 42207 v.reset(OpS390XMOVHZreg) 42208 v.AddArg(x) 42209 return true 42210 } 42211 } 42212 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 42213 // match: (ZeroExt16to64 x) 42214 // cond: 42215 // result: (MOVHZreg x) 42216 for { 42217 x := v.Args[0] 42218 v.reset(OpS390XMOVHZreg) 42219 v.AddArg(x) 42220 return true 42221 } 42222 } 42223 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 42224 // match: (ZeroExt32to64 x) 42225 // cond: 42226 // result: (MOVWZreg x) 42227 for { 42228 x := v.Args[0] 42229 v.reset(OpS390XMOVWZreg) 42230 v.AddArg(x) 42231 return true 42232 } 42233 } 42234 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 42235 // match: (ZeroExt8to16 x) 42236 // cond: 42237 // result: (MOVBZreg x) 42238 for { 42239 x := v.Args[0] 42240 v.reset(OpS390XMOVBZreg) 42241 v.AddArg(x) 42242 return true 42243 } 42244 } 42245 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 42246 // match: (ZeroExt8to32 x) 42247 // cond: 42248 // result: (MOVBZreg x) 42249 for { 42250 x := v.Args[0] 42251 v.reset(OpS390XMOVBZreg) 42252 v.AddArg(x) 42253 return true 42254 } 42255 } 42256 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 42257 // match: (ZeroExt8to64 x) 42258 // cond: 42259 // result: (MOVBZreg x) 42260 for { 42261 x := v.Args[0] 42262 v.reset(OpS390XMOVBZreg) 42263 v.AddArg(x) 42264 return true 42265 } 42266 } 42267 func rewriteBlockS390X(b *Block) bool { 42268 config := b.Func.Config 42269 _ = config 42270 fe := b.Func.fe 42271 _ = fe 42272 typ := &config.Types 42273 _ = typ 42274 switch b.Kind { 42275 case BlockS390XEQ: 42276 // match: (EQ (InvertFlags cmp) yes no) 42277 // cond: 42278 // result: (EQ cmp yes no) 42279 for { 42280 v := b.Control 42281 if v.Op != OpS390XInvertFlags { 42282 break 42283 } 42284 cmp := v.Args[0] 42285 b.Kind = BlockS390XEQ 42286 b.SetControl(cmp) 42287 b.Aux = nil 42288 return true 42289 } 42290 // match: (EQ (FlagEQ) yes no) 42291 // cond: 42292 // result: (First nil yes no) 42293 for { 42294 v := b.Control 42295 if v.Op != OpS390XFlagEQ { 42296 break 42297 } 42298 b.Kind = BlockFirst 42299 b.SetControl(nil) 42300 b.Aux = nil 42301 return true 42302 } 42303 // match: (EQ (FlagLT) yes no) 42304 // cond: 42305 // result: (First nil no yes) 42306 for { 42307 v := b.Control 42308 if v.Op != OpS390XFlagLT { 42309 break 42310 } 42311 b.Kind = BlockFirst 42312 b.SetControl(nil) 42313 b.Aux = nil 42314 b.swapSuccessors() 42315 return true 42316 } 42317 // match: (EQ (FlagGT) yes no) 42318 // cond: 42319 // result: (First nil no yes) 42320 for { 42321 v := b.Control 42322 if v.Op != OpS390XFlagGT { 42323 break 42324 } 42325 b.Kind = BlockFirst 42326 b.SetControl(nil) 42327 b.Aux = nil 42328 b.swapSuccessors() 42329 return true 42330 } 42331 case BlockS390XGE: 42332 // match: (GE (InvertFlags cmp) yes no) 42333 // cond: 42334 // result: (LE cmp yes no) 42335 for { 42336 v := b.Control 42337 if v.Op != OpS390XInvertFlags { 42338 break 42339 } 42340 cmp := v.Args[0] 42341 b.Kind = BlockS390XLE 42342 b.SetControl(cmp) 42343 b.Aux = nil 42344 return true 42345 } 42346 // match: (GE (FlagEQ) yes no) 42347 // cond: 42348 // result: (First nil yes no) 42349 for { 42350 v := b.Control 42351 if v.Op != OpS390XFlagEQ { 42352 break 42353 } 42354 b.Kind = BlockFirst 42355 b.SetControl(nil) 42356 b.Aux = nil 42357 return true 42358 } 42359 // match: (GE (FlagLT) yes no) 42360 // cond: 42361 // result: (First nil no yes) 42362 for { 42363 v := b.Control 42364 if v.Op != OpS390XFlagLT { 42365 break 42366 } 42367 b.Kind = BlockFirst 42368 b.SetControl(nil) 42369 b.Aux = nil 42370 b.swapSuccessors() 42371 return true 42372 } 42373 // match: (GE (FlagGT) yes no) 42374 // cond: 42375 // result: (First nil yes no) 42376 for { 42377 v := b.Control 42378 if v.Op != OpS390XFlagGT { 42379 break 42380 } 42381 b.Kind = BlockFirst 42382 b.SetControl(nil) 42383 b.Aux = nil 42384 return true 42385 } 42386 case BlockS390XGT: 42387 // match: (GT (InvertFlags cmp) yes no) 42388 // cond: 42389 // result: (LT cmp yes no) 42390 for { 42391 v := b.Control 42392 if v.Op != OpS390XInvertFlags { 42393 break 42394 } 42395 cmp := v.Args[0] 42396 b.Kind = BlockS390XLT 42397 b.SetControl(cmp) 42398 b.Aux = nil 42399 return true 42400 } 42401 // match: (GT (FlagEQ) yes no) 42402 // cond: 42403 // result: (First nil no yes) 42404 for { 42405 v := b.Control 42406 if v.Op != OpS390XFlagEQ { 42407 break 42408 } 42409 b.Kind = BlockFirst 42410 b.SetControl(nil) 42411 b.Aux = nil 42412 b.swapSuccessors() 42413 return true 42414 } 42415 // match: (GT (FlagLT) yes no) 42416 // cond: 42417 // result: (First nil no yes) 42418 for { 42419 v := b.Control 42420 if v.Op != OpS390XFlagLT { 42421 break 42422 } 42423 b.Kind = BlockFirst 42424 b.SetControl(nil) 42425 b.Aux = nil 42426 b.swapSuccessors() 42427 return true 42428 } 42429 // match: (GT (FlagGT) yes no) 42430 // cond: 42431 // result: (First nil yes no) 42432 for { 42433 v := b.Control 42434 if v.Op != OpS390XFlagGT { 42435 break 42436 } 42437 b.Kind = BlockFirst 42438 b.SetControl(nil) 42439 b.Aux = nil 42440 return true 42441 } 42442 case BlockIf: 42443 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42444 // cond: 42445 // result: (LT cmp yes no) 42446 for { 42447 v := b.Control 42448 if v.Op != OpS390XMOVDLT { 42449 break 42450 } 42451 _ = v.Args[2] 42452 v_0 := v.Args[0] 42453 if v_0.Op != OpS390XMOVDconst { 42454 break 42455 } 42456 if v_0.AuxInt != 0 { 42457 break 42458 } 42459 v_1 := v.Args[1] 42460 if v_1.Op != OpS390XMOVDconst { 42461 break 42462 } 42463 if v_1.AuxInt != 1 { 42464 break 42465 } 42466 cmp := v.Args[2] 42467 b.Kind = BlockS390XLT 42468 b.SetControl(cmp) 42469 b.Aux = nil 42470 return true 42471 } 42472 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42473 // cond: 42474 // result: (LE cmp yes no) 42475 for { 42476 v := b.Control 42477 if v.Op != OpS390XMOVDLE { 42478 break 42479 } 42480 _ = v.Args[2] 42481 v_0 := v.Args[0] 42482 if v_0.Op != OpS390XMOVDconst { 42483 break 42484 } 42485 if v_0.AuxInt != 0 { 42486 break 42487 } 42488 v_1 := v.Args[1] 42489 if v_1.Op != OpS390XMOVDconst { 42490 break 42491 } 42492 if v_1.AuxInt != 1 { 42493 break 42494 } 42495 cmp := v.Args[2] 42496 b.Kind = BlockS390XLE 42497 b.SetControl(cmp) 42498 b.Aux = nil 42499 return true 42500 } 42501 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42502 // cond: 42503 // result: (GT cmp yes no) 42504 for { 42505 v := b.Control 42506 if v.Op != OpS390XMOVDGT { 42507 break 42508 } 42509 _ = v.Args[2] 42510 v_0 := v.Args[0] 42511 if v_0.Op != OpS390XMOVDconst { 42512 break 42513 } 42514 if v_0.AuxInt != 0 { 42515 break 42516 } 42517 v_1 := v.Args[1] 42518 if v_1.Op != OpS390XMOVDconst { 42519 break 42520 } 42521 if v_1.AuxInt != 1 { 42522 break 42523 } 42524 cmp := v.Args[2] 42525 b.Kind = BlockS390XGT 42526 b.SetControl(cmp) 42527 b.Aux = nil 42528 return true 42529 } 42530 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42531 // cond: 42532 // result: (GE cmp yes no) 42533 for { 42534 v := b.Control 42535 if v.Op != OpS390XMOVDGE { 42536 break 42537 } 42538 _ = v.Args[2] 42539 v_0 := v.Args[0] 42540 if v_0.Op != OpS390XMOVDconst { 42541 break 42542 } 42543 if v_0.AuxInt != 0 { 42544 break 42545 } 42546 v_1 := v.Args[1] 42547 if v_1.Op != OpS390XMOVDconst { 42548 break 42549 } 42550 if v_1.AuxInt != 1 { 42551 break 42552 } 42553 cmp := v.Args[2] 42554 b.Kind = BlockS390XGE 42555 b.SetControl(cmp) 42556 b.Aux = nil 42557 return true 42558 } 42559 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42560 // cond: 42561 // result: (EQ cmp yes no) 42562 for { 42563 v := b.Control 42564 if v.Op != OpS390XMOVDEQ { 42565 break 42566 } 42567 _ = v.Args[2] 42568 v_0 := v.Args[0] 42569 if v_0.Op != OpS390XMOVDconst { 42570 break 42571 } 42572 if v_0.AuxInt != 0 { 42573 break 42574 } 42575 v_1 := v.Args[1] 42576 if v_1.Op != OpS390XMOVDconst { 42577 break 42578 } 42579 if v_1.AuxInt != 1 { 42580 break 42581 } 42582 cmp := v.Args[2] 42583 b.Kind = BlockS390XEQ 42584 b.SetControl(cmp) 42585 b.Aux = nil 42586 return true 42587 } 42588 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42589 // cond: 42590 // result: (NE cmp yes no) 42591 for { 42592 v := b.Control 42593 if v.Op != OpS390XMOVDNE { 42594 break 42595 } 42596 _ = v.Args[2] 42597 v_0 := v.Args[0] 42598 if v_0.Op != OpS390XMOVDconst { 42599 break 42600 } 42601 if v_0.AuxInt != 0 { 42602 break 42603 } 42604 v_1 := v.Args[1] 42605 if v_1.Op != OpS390XMOVDconst { 42606 break 42607 } 42608 if v_1.AuxInt != 1 { 42609 break 42610 } 42611 cmp := v.Args[2] 42612 b.Kind = BlockS390XNE 42613 b.SetControl(cmp) 42614 b.Aux = nil 42615 return true 42616 } 42617 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42618 // cond: 42619 // result: (GTF cmp yes no) 42620 for { 42621 v := b.Control 42622 if v.Op != OpS390XMOVDGTnoinv { 42623 break 42624 } 42625 _ = v.Args[2] 42626 v_0 := v.Args[0] 42627 if v_0.Op != OpS390XMOVDconst { 42628 break 42629 } 42630 if v_0.AuxInt != 0 { 42631 break 42632 } 42633 v_1 := v.Args[1] 42634 if v_1.Op != OpS390XMOVDconst { 42635 break 42636 } 42637 if v_1.AuxInt != 1 { 42638 break 42639 } 42640 cmp := v.Args[2] 42641 b.Kind = BlockS390XGTF 42642 b.SetControl(cmp) 42643 b.Aux = nil 42644 return true 42645 } 42646 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 42647 // cond: 42648 // result: (GEF cmp yes no) 42649 for { 42650 v := b.Control 42651 if v.Op != OpS390XMOVDGEnoinv { 42652 break 42653 } 42654 _ = v.Args[2] 42655 v_0 := v.Args[0] 42656 if v_0.Op != OpS390XMOVDconst { 42657 break 42658 } 42659 if v_0.AuxInt != 0 { 42660 break 42661 } 42662 v_1 := v.Args[1] 42663 if v_1.Op != OpS390XMOVDconst { 42664 break 42665 } 42666 if v_1.AuxInt != 1 { 42667 break 42668 } 42669 cmp := v.Args[2] 42670 b.Kind = BlockS390XGEF 42671 b.SetControl(cmp) 42672 b.Aux = nil 42673 return true 42674 } 42675 // match: (If cond yes no) 42676 // cond: 42677 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 42678 for { 42679 v := b.Control 42680 _ = v 42681 cond := b.Control 42682 b.Kind = BlockS390XNE 42683 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 42684 v0.AuxInt = 0 42685 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 42686 v1.AddArg(cond) 42687 v0.AddArg(v1) 42688 b.SetControl(v0) 42689 b.Aux = nil 42690 return true 42691 } 42692 case BlockS390XLE: 42693 // match: (LE (InvertFlags cmp) yes no) 42694 // cond: 42695 // result: (GE cmp yes no) 42696 for { 42697 v := b.Control 42698 if v.Op != OpS390XInvertFlags { 42699 break 42700 } 42701 cmp := v.Args[0] 42702 b.Kind = BlockS390XGE 42703 b.SetControl(cmp) 42704 b.Aux = nil 42705 return true 42706 } 42707 // match: (LE (FlagEQ) yes no) 42708 // cond: 42709 // result: (First nil yes no) 42710 for { 42711 v := b.Control 42712 if v.Op != OpS390XFlagEQ { 42713 break 42714 } 42715 b.Kind = BlockFirst 42716 b.SetControl(nil) 42717 b.Aux = nil 42718 return true 42719 } 42720 // match: (LE (FlagLT) yes no) 42721 // cond: 42722 // result: (First nil yes no) 42723 for { 42724 v := b.Control 42725 if v.Op != OpS390XFlagLT { 42726 break 42727 } 42728 b.Kind = BlockFirst 42729 b.SetControl(nil) 42730 b.Aux = nil 42731 return true 42732 } 42733 // match: (LE (FlagGT) yes no) 42734 // cond: 42735 // result: (First nil no yes) 42736 for { 42737 v := b.Control 42738 if v.Op != OpS390XFlagGT { 42739 break 42740 } 42741 b.Kind = BlockFirst 42742 b.SetControl(nil) 42743 b.Aux = nil 42744 b.swapSuccessors() 42745 return true 42746 } 42747 case BlockS390XLT: 42748 // match: (LT (InvertFlags cmp) yes no) 42749 // cond: 42750 // result: (GT cmp yes no) 42751 for { 42752 v := b.Control 42753 if v.Op != OpS390XInvertFlags { 42754 break 42755 } 42756 cmp := v.Args[0] 42757 b.Kind = BlockS390XGT 42758 b.SetControl(cmp) 42759 b.Aux = nil 42760 return true 42761 } 42762 // match: (LT (FlagEQ) yes no) 42763 // cond: 42764 // result: (First nil no yes) 42765 for { 42766 v := b.Control 42767 if v.Op != OpS390XFlagEQ { 42768 break 42769 } 42770 b.Kind = BlockFirst 42771 b.SetControl(nil) 42772 b.Aux = nil 42773 b.swapSuccessors() 42774 return true 42775 } 42776 // match: (LT (FlagLT) yes no) 42777 // cond: 42778 // result: (First nil yes no) 42779 for { 42780 v := b.Control 42781 if v.Op != OpS390XFlagLT { 42782 break 42783 } 42784 b.Kind = BlockFirst 42785 b.SetControl(nil) 42786 b.Aux = nil 42787 return true 42788 } 42789 // match: (LT (FlagGT) yes no) 42790 // cond: 42791 // result: (First nil no yes) 42792 for { 42793 v := b.Control 42794 if v.Op != OpS390XFlagGT { 42795 break 42796 } 42797 b.Kind = BlockFirst 42798 b.SetControl(nil) 42799 b.Aux = nil 42800 b.swapSuccessors() 42801 return true 42802 } 42803 case BlockS390XNE: 42804 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42805 // cond: 42806 // result: (LT cmp yes no) 42807 for { 42808 v := b.Control 42809 if v.Op != OpS390XCMPWconst { 42810 break 42811 } 42812 if v.AuxInt != 0 { 42813 break 42814 } 42815 v_0 := v.Args[0] 42816 if v_0.Op != OpS390XMOVDLT { 42817 break 42818 } 42819 _ = v_0.Args[2] 42820 v_0_0 := v_0.Args[0] 42821 if v_0_0.Op != OpS390XMOVDconst { 42822 break 42823 } 42824 if v_0_0.AuxInt != 0 { 42825 break 42826 } 42827 v_0_1 := v_0.Args[1] 42828 if v_0_1.Op != OpS390XMOVDconst { 42829 break 42830 } 42831 if v_0_1.AuxInt != 1 { 42832 break 42833 } 42834 cmp := v_0.Args[2] 42835 b.Kind = BlockS390XLT 42836 b.SetControl(cmp) 42837 b.Aux = nil 42838 return true 42839 } 42840 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42841 // cond: 42842 // result: (LE cmp yes no) 42843 for { 42844 v := b.Control 42845 if v.Op != OpS390XCMPWconst { 42846 break 42847 } 42848 if v.AuxInt != 0 { 42849 break 42850 } 42851 v_0 := v.Args[0] 42852 if v_0.Op != OpS390XMOVDLE { 42853 break 42854 } 42855 _ = v_0.Args[2] 42856 v_0_0 := v_0.Args[0] 42857 if v_0_0.Op != OpS390XMOVDconst { 42858 break 42859 } 42860 if v_0_0.AuxInt != 0 { 42861 break 42862 } 42863 v_0_1 := v_0.Args[1] 42864 if v_0_1.Op != OpS390XMOVDconst { 42865 break 42866 } 42867 if v_0_1.AuxInt != 1 { 42868 break 42869 } 42870 cmp := v_0.Args[2] 42871 b.Kind = BlockS390XLE 42872 b.SetControl(cmp) 42873 b.Aux = nil 42874 return true 42875 } 42876 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42877 // cond: 42878 // result: (GT cmp yes no) 42879 for { 42880 v := b.Control 42881 if v.Op != OpS390XCMPWconst { 42882 break 42883 } 42884 if v.AuxInt != 0 { 42885 break 42886 } 42887 v_0 := v.Args[0] 42888 if v_0.Op != OpS390XMOVDGT { 42889 break 42890 } 42891 _ = v_0.Args[2] 42892 v_0_0 := v_0.Args[0] 42893 if v_0_0.Op != OpS390XMOVDconst { 42894 break 42895 } 42896 if v_0_0.AuxInt != 0 { 42897 break 42898 } 42899 v_0_1 := v_0.Args[1] 42900 if v_0_1.Op != OpS390XMOVDconst { 42901 break 42902 } 42903 if v_0_1.AuxInt != 1 { 42904 break 42905 } 42906 cmp := v_0.Args[2] 42907 b.Kind = BlockS390XGT 42908 b.SetControl(cmp) 42909 b.Aux = nil 42910 return true 42911 } 42912 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42913 // cond: 42914 // result: (GE cmp yes no) 42915 for { 42916 v := b.Control 42917 if v.Op != OpS390XCMPWconst { 42918 break 42919 } 42920 if v.AuxInt != 0 { 42921 break 42922 } 42923 v_0 := v.Args[0] 42924 if v_0.Op != OpS390XMOVDGE { 42925 break 42926 } 42927 _ = v_0.Args[2] 42928 v_0_0 := v_0.Args[0] 42929 if v_0_0.Op != OpS390XMOVDconst { 42930 break 42931 } 42932 if v_0_0.AuxInt != 0 { 42933 break 42934 } 42935 v_0_1 := v_0.Args[1] 42936 if v_0_1.Op != OpS390XMOVDconst { 42937 break 42938 } 42939 if v_0_1.AuxInt != 1 { 42940 break 42941 } 42942 cmp := v_0.Args[2] 42943 b.Kind = BlockS390XGE 42944 b.SetControl(cmp) 42945 b.Aux = nil 42946 return true 42947 } 42948 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42949 // cond: 42950 // result: (EQ cmp yes no) 42951 for { 42952 v := b.Control 42953 if v.Op != OpS390XCMPWconst { 42954 break 42955 } 42956 if v.AuxInt != 0 { 42957 break 42958 } 42959 v_0 := v.Args[0] 42960 if v_0.Op != OpS390XMOVDEQ { 42961 break 42962 } 42963 _ = v_0.Args[2] 42964 v_0_0 := v_0.Args[0] 42965 if v_0_0.Op != OpS390XMOVDconst { 42966 break 42967 } 42968 if v_0_0.AuxInt != 0 { 42969 break 42970 } 42971 v_0_1 := v_0.Args[1] 42972 if v_0_1.Op != OpS390XMOVDconst { 42973 break 42974 } 42975 if v_0_1.AuxInt != 1 { 42976 break 42977 } 42978 cmp := v_0.Args[2] 42979 b.Kind = BlockS390XEQ 42980 b.SetControl(cmp) 42981 b.Aux = nil 42982 return true 42983 } 42984 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 42985 // cond: 42986 // result: (NE cmp yes no) 42987 for { 42988 v := b.Control 42989 if v.Op != OpS390XCMPWconst { 42990 break 42991 } 42992 if v.AuxInt != 0 { 42993 break 42994 } 42995 v_0 := v.Args[0] 42996 if v_0.Op != OpS390XMOVDNE { 42997 break 42998 } 42999 _ = v_0.Args[2] 43000 v_0_0 := v_0.Args[0] 43001 if v_0_0.Op != OpS390XMOVDconst { 43002 break 43003 } 43004 if v_0_0.AuxInt != 0 { 43005 break 43006 } 43007 v_0_1 := v_0.Args[1] 43008 if v_0_1.Op != OpS390XMOVDconst { 43009 break 43010 } 43011 if v_0_1.AuxInt != 1 { 43012 break 43013 } 43014 cmp := v_0.Args[2] 43015 b.Kind = BlockS390XNE 43016 b.SetControl(cmp) 43017 b.Aux = nil 43018 return true 43019 } 43020 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 43021 // cond: 43022 // result: (GTF cmp yes no) 43023 for { 43024 v := b.Control 43025 if v.Op != OpS390XCMPWconst { 43026 break 43027 } 43028 if v.AuxInt != 0 { 43029 break 43030 } 43031 v_0 := v.Args[0] 43032 if v_0.Op != OpS390XMOVDGTnoinv { 43033 break 43034 } 43035 _ = v_0.Args[2] 43036 v_0_0 := v_0.Args[0] 43037 if v_0_0.Op != OpS390XMOVDconst { 43038 break 43039 } 43040 if v_0_0.AuxInt != 0 { 43041 break 43042 } 43043 v_0_1 := v_0.Args[1] 43044 if v_0_1.Op != OpS390XMOVDconst { 43045 break 43046 } 43047 if v_0_1.AuxInt != 1 { 43048 break 43049 } 43050 cmp := v_0.Args[2] 43051 b.Kind = BlockS390XGTF 43052 b.SetControl(cmp) 43053 b.Aux = nil 43054 return true 43055 } 43056 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 43057 // cond: 43058 // result: (GEF cmp yes no) 43059 for { 43060 v := b.Control 43061 if v.Op != OpS390XCMPWconst { 43062 break 43063 } 43064 if v.AuxInt != 0 { 43065 break 43066 } 43067 v_0 := v.Args[0] 43068 if v_0.Op != OpS390XMOVDGEnoinv { 43069 break 43070 } 43071 _ = v_0.Args[2] 43072 v_0_0 := v_0.Args[0] 43073 if v_0_0.Op != OpS390XMOVDconst { 43074 break 43075 } 43076 if v_0_0.AuxInt != 0 { 43077 break 43078 } 43079 v_0_1 := v_0.Args[1] 43080 if v_0_1.Op != OpS390XMOVDconst { 43081 break 43082 } 43083 if v_0_1.AuxInt != 1 { 43084 break 43085 } 43086 cmp := v_0.Args[2] 43087 b.Kind = BlockS390XGEF 43088 b.SetControl(cmp) 43089 b.Aux = nil 43090 return true 43091 } 43092 // match: (NE (InvertFlags cmp) yes no) 43093 // cond: 43094 // result: (NE cmp yes no) 43095 for { 43096 v := b.Control 43097 if v.Op != OpS390XInvertFlags { 43098 break 43099 } 43100 cmp := v.Args[0] 43101 b.Kind = BlockS390XNE 43102 b.SetControl(cmp) 43103 b.Aux = nil 43104 return true 43105 } 43106 // match: (NE (FlagEQ) yes no) 43107 // cond: 43108 // result: (First nil no yes) 43109 for { 43110 v := b.Control 43111 if v.Op != OpS390XFlagEQ { 43112 break 43113 } 43114 b.Kind = BlockFirst 43115 b.SetControl(nil) 43116 b.Aux = nil 43117 b.swapSuccessors() 43118 return true 43119 } 43120 // match: (NE (FlagLT) yes no) 43121 // cond: 43122 // result: (First nil yes no) 43123 for { 43124 v := b.Control 43125 if v.Op != OpS390XFlagLT { 43126 break 43127 } 43128 b.Kind = BlockFirst 43129 b.SetControl(nil) 43130 b.Aux = nil 43131 return true 43132 } 43133 // match: (NE (FlagGT) yes no) 43134 // cond: 43135 // result: (First nil yes no) 43136 for { 43137 v := b.Control 43138 if v.Op != OpS390XFlagGT { 43139 break 43140 } 43141 b.Kind = BlockFirst 43142 b.SetControl(nil) 43143 b.Aux = nil 43144 return true 43145 } 43146 } 43147 return false 43148 }