github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/cmd/compile/internal/ssa/rewriteS390X.go (about) 1 // Code generated from gen/S390X.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueS390X(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValueS390X_OpAdd16_0(v) 20 case OpAdd32: 21 return rewriteValueS390X_OpAdd32_0(v) 22 case OpAdd32F: 23 return rewriteValueS390X_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValueS390X_OpAdd64_0(v) 26 case OpAdd64F: 27 return rewriteValueS390X_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValueS390X_OpAdd8_0(v) 30 case OpAddPtr: 31 return rewriteValueS390X_OpAddPtr_0(v) 32 case OpAddr: 33 return rewriteValueS390X_OpAddr_0(v) 34 case OpAnd16: 35 return rewriteValueS390X_OpAnd16_0(v) 36 case OpAnd32: 37 return rewriteValueS390X_OpAnd32_0(v) 38 case OpAnd64: 39 return rewriteValueS390X_OpAnd64_0(v) 40 case OpAnd8: 41 return rewriteValueS390X_OpAnd8_0(v) 42 case OpAndB: 43 return rewriteValueS390X_OpAndB_0(v) 44 case OpAtomicAdd32: 45 return rewriteValueS390X_OpAtomicAdd32_0(v) 46 case OpAtomicAdd64: 47 return rewriteValueS390X_OpAtomicAdd64_0(v) 48 case OpAtomicCompareAndSwap32: 49 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 50 case OpAtomicCompareAndSwap64: 51 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 52 case OpAtomicExchange32: 53 return rewriteValueS390X_OpAtomicExchange32_0(v) 54 case OpAtomicExchange64: 55 return rewriteValueS390X_OpAtomicExchange64_0(v) 56 case OpAtomicLoad32: 57 return rewriteValueS390X_OpAtomicLoad32_0(v) 58 case OpAtomicLoad64: 59 return rewriteValueS390X_OpAtomicLoad64_0(v) 60 case OpAtomicLoadPtr: 61 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 62 case OpAtomicStore32: 63 return rewriteValueS390X_OpAtomicStore32_0(v) 64 case OpAtomicStore64: 65 return rewriteValueS390X_OpAtomicStore64_0(v) 66 case OpAtomicStorePtrNoWB: 67 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 68 case OpAvg64u: 69 return rewriteValueS390X_OpAvg64u_0(v) 70 case OpBitLen64: 71 return rewriteValueS390X_OpBitLen64_0(v) 72 case OpBswap32: 73 return rewriteValueS390X_OpBswap32_0(v) 74 case OpBswap64: 75 return rewriteValueS390X_OpBswap64_0(v) 76 case OpCeil: 77 return rewriteValueS390X_OpCeil_0(v) 78 case OpClosureCall: 79 return rewriteValueS390X_OpClosureCall_0(v) 80 case OpCom16: 81 return rewriteValueS390X_OpCom16_0(v) 82 case OpCom32: 83 return rewriteValueS390X_OpCom32_0(v) 84 case OpCom64: 85 return rewriteValueS390X_OpCom64_0(v) 86 case OpCom8: 87 return rewriteValueS390X_OpCom8_0(v) 88 case OpConst16: 89 return rewriteValueS390X_OpConst16_0(v) 90 case OpConst32: 91 return rewriteValueS390X_OpConst32_0(v) 92 case OpConst32F: 93 return rewriteValueS390X_OpConst32F_0(v) 94 case OpConst64: 95 return rewriteValueS390X_OpConst64_0(v) 96 case OpConst64F: 97 return rewriteValueS390X_OpConst64F_0(v) 98 case OpConst8: 99 return rewriteValueS390X_OpConst8_0(v) 100 case OpConstBool: 101 return rewriteValueS390X_OpConstBool_0(v) 102 case OpConstNil: 103 return rewriteValueS390X_OpConstNil_0(v) 104 case OpConvert: 105 return rewriteValueS390X_OpConvert_0(v) 106 case OpCtz32: 107 return rewriteValueS390X_OpCtz32_0(v) 108 case OpCtz64: 109 return rewriteValueS390X_OpCtz64_0(v) 110 case OpCvt32Fto32: 111 return rewriteValueS390X_OpCvt32Fto32_0(v) 112 case OpCvt32Fto64: 113 return rewriteValueS390X_OpCvt32Fto64_0(v) 114 case OpCvt32Fto64F: 115 return rewriteValueS390X_OpCvt32Fto64F_0(v) 116 case OpCvt32to32F: 117 return rewriteValueS390X_OpCvt32to32F_0(v) 118 case OpCvt32to64F: 119 return rewriteValueS390X_OpCvt32to64F_0(v) 120 case OpCvt64Fto32: 121 return rewriteValueS390X_OpCvt64Fto32_0(v) 122 case OpCvt64Fto32F: 123 return rewriteValueS390X_OpCvt64Fto32F_0(v) 124 case OpCvt64Fto64: 125 return rewriteValueS390X_OpCvt64Fto64_0(v) 126 case OpCvt64to32F: 127 return rewriteValueS390X_OpCvt64to32F_0(v) 128 case OpCvt64to64F: 129 return rewriteValueS390X_OpCvt64to64F_0(v) 130 case OpDiv16: 131 return rewriteValueS390X_OpDiv16_0(v) 132 case OpDiv16u: 133 return rewriteValueS390X_OpDiv16u_0(v) 134 case OpDiv32: 135 return rewriteValueS390X_OpDiv32_0(v) 136 case OpDiv32F: 137 return rewriteValueS390X_OpDiv32F_0(v) 138 case OpDiv32u: 139 return rewriteValueS390X_OpDiv32u_0(v) 140 case OpDiv64: 141 return rewriteValueS390X_OpDiv64_0(v) 142 case OpDiv64F: 143 return rewriteValueS390X_OpDiv64F_0(v) 144 case OpDiv64u: 145 return rewriteValueS390X_OpDiv64u_0(v) 146 case OpDiv8: 147 return rewriteValueS390X_OpDiv8_0(v) 148 case OpDiv8u: 149 return rewriteValueS390X_OpDiv8u_0(v) 150 case OpEq16: 151 return rewriteValueS390X_OpEq16_0(v) 152 case OpEq32: 153 return rewriteValueS390X_OpEq32_0(v) 154 case OpEq32F: 155 return rewriteValueS390X_OpEq32F_0(v) 156 case OpEq64: 157 return rewriteValueS390X_OpEq64_0(v) 158 case OpEq64F: 159 return rewriteValueS390X_OpEq64F_0(v) 160 case OpEq8: 161 return rewriteValueS390X_OpEq8_0(v) 162 case OpEqB: 163 return rewriteValueS390X_OpEqB_0(v) 164 case OpEqPtr: 165 return rewriteValueS390X_OpEqPtr_0(v) 166 case OpFloor: 167 return rewriteValueS390X_OpFloor_0(v) 168 case OpGeq16: 169 return rewriteValueS390X_OpGeq16_0(v) 170 case OpGeq16U: 171 return rewriteValueS390X_OpGeq16U_0(v) 172 case OpGeq32: 173 return rewriteValueS390X_OpGeq32_0(v) 174 case OpGeq32F: 175 return rewriteValueS390X_OpGeq32F_0(v) 176 case OpGeq32U: 177 return rewriteValueS390X_OpGeq32U_0(v) 178 case OpGeq64: 179 return rewriteValueS390X_OpGeq64_0(v) 180 case OpGeq64F: 181 return rewriteValueS390X_OpGeq64F_0(v) 182 case OpGeq64U: 183 return rewriteValueS390X_OpGeq64U_0(v) 184 case OpGeq8: 185 return rewriteValueS390X_OpGeq8_0(v) 186 case OpGeq8U: 187 return rewriteValueS390X_OpGeq8U_0(v) 188 case OpGetCallerSP: 189 return rewriteValueS390X_OpGetCallerSP_0(v) 190 case OpGetClosurePtr: 191 return rewriteValueS390X_OpGetClosurePtr_0(v) 192 case OpGetG: 193 return rewriteValueS390X_OpGetG_0(v) 194 case OpGreater16: 195 return rewriteValueS390X_OpGreater16_0(v) 196 case OpGreater16U: 197 return rewriteValueS390X_OpGreater16U_0(v) 198 case OpGreater32: 199 return rewriteValueS390X_OpGreater32_0(v) 200 case OpGreater32F: 201 return rewriteValueS390X_OpGreater32F_0(v) 202 case OpGreater32U: 203 return rewriteValueS390X_OpGreater32U_0(v) 204 case OpGreater64: 205 return rewriteValueS390X_OpGreater64_0(v) 206 case OpGreater64F: 207 return rewriteValueS390X_OpGreater64F_0(v) 208 case OpGreater64U: 209 return rewriteValueS390X_OpGreater64U_0(v) 210 case OpGreater8: 211 return rewriteValueS390X_OpGreater8_0(v) 212 case OpGreater8U: 213 return rewriteValueS390X_OpGreater8U_0(v) 214 case OpHmul32: 215 return rewriteValueS390X_OpHmul32_0(v) 216 case OpHmul32u: 217 return rewriteValueS390X_OpHmul32u_0(v) 218 case OpHmul64: 219 return rewriteValueS390X_OpHmul64_0(v) 220 case OpHmul64u: 221 return rewriteValueS390X_OpHmul64u_0(v) 222 case OpITab: 223 return rewriteValueS390X_OpITab_0(v) 224 case OpInterCall: 225 return rewriteValueS390X_OpInterCall_0(v) 226 case OpIsInBounds: 227 return rewriteValueS390X_OpIsInBounds_0(v) 228 case OpIsNonNil: 229 return rewriteValueS390X_OpIsNonNil_0(v) 230 case OpIsSliceInBounds: 231 return rewriteValueS390X_OpIsSliceInBounds_0(v) 232 case OpLeq16: 233 return rewriteValueS390X_OpLeq16_0(v) 234 case OpLeq16U: 235 return rewriteValueS390X_OpLeq16U_0(v) 236 case OpLeq32: 237 return rewriteValueS390X_OpLeq32_0(v) 238 case OpLeq32F: 239 return rewriteValueS390X_OpLeq32F_0(v) 240 case OpLeq32U: 241 return rewriteValueS390X_OpLeq32U_0(v) 242 case OpLeq64: 243 return rewriteValueS390X_OpLeq64_0(v) 244 case OpLeq64F: 245 return rewriteValueS390X_OpLeq64F_0(v) 246 case OpLeq64U: 247 return rewriteValueS390X_OpLeq64U_0(v) 248 case OpLeq8: 249 return rewriteValueS390X_OpLeq8_0(v) 250 case OpLeq8U: 251 return rewriteValueS390X_OpLeq8U_0(v) 252 case OpLess16: 253 return rewriteValueS390X_OpLess16_0(v) 254 case OpLess16U: 255 return rewriteValueS390X_OpLess16U_0(v) 256 case OpLess32: 257 return rewriteValueS390X_OpLess32_0(v) 258 case OpLess32F: 259 return rewriteValueS390X_OpLess32F_0(v) 260 case OpLess32U: 261 return rewriteValueS390X_OpLess32U_0(v) 262 case OpLess64: 263 return rewriteValueS390X_OpLess64_0(v) 264 case OpLess64F: 265 return rewriteValueS390X_OpLess64F_0(v) 266 case OpLess64U: 267 return rewriteValueS390X_OpLess64U_0(v) 268 case OpLess8: 269 return rewriteValueS390X_OpLess8_0(v) 270 case OpLess8U: 271 return rewriteValueS390X_OpLess8U_0(v) 272 case OpLoad: 273 return rewriteValueS390X_OpLoad_0(v) 274 case OpLsh16x16: 275 return rewriteValueS390X_OpLsh16x16_0(v) 276 case OpLsh16x32: 277 return rewriteValueS390X_OpLsh16x32_0(v) 278 case OpLsh16x64: 279 return rewriteValueS390X_OpLsh16x64_0(v) 280 case OpLsh16x8: 281 return rewriteValueS390X_OpLsh16x8_0(v) 282 case OpLsh32x16: 283 return rewriteValueS390X_OpLsh32x16_0(v) 284 case OpLsh32x32: 285 return rewriteValueS390X_OpLsh32x32_0(v) 286 case OpLsh32x64: 287 return rewriteValueS390X_OpLsh32x64_0(v) 288 case OpLsh32x8: 289 return rewriteValueS390X_OpLsh32x8_0(v) 290 case OpLsh64x16: 291 return rewriteValueS390X_OpLsh64x16_0(v) 292 case OpLsh64x32: 293 return rewriteValueS390X_OpLsh64x32_0(v) 294 case OpLsh64x64: 295 return rewriteValueS390X_OpLsh64x64_0(v) 296 case OpLsh64x8: 297 return rewriteValueS390X_OpLsh64x8_0(v) 298 case OpLsh8x16: 299 return rewriteValueS390X_OpLsh8x16_0(v) 300 case OpLsh8x32: 301 return rewriteValueS390X_OpLsh8x32_0(v) 302 case OpLsh8x64: 303 return rewriteValueS390X_OpLsh8x64_0(v) 304 case OpLsh8x8: 305 return rewriteValueS390X_OpLsh8x8_0(v) 306 case OpMod16: 307 return rewriteValueS390X_OpMod16_0(v) 308 case OpMod16u: 309 return rewriteValueS390X_OpMod16u_0(v) 310 case OpMod32: 311 return rewriteValueS390X_OpMod32_0(v) 312 case OpMod32u: 313 return rewriteValueS390X_OpMod32u_0(v) 314 case OpMod64: 315 return rewriteValueS390X_OpMod64_0(v) 316 case OpMod64u: 317 return rewriteValueS390X_OpMod64u_0(v) 318 case OpMod8: 319 return rewriteValueS390X_OpMod8_0(v) 320 case OpMod8u: 321 return rewriteValueS390X_OpMod8u_0(v) 322 case OpMove: 323 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 324 case OpMul16: 325 return rewriteValueS390X_OpMul16_0(v) 326 case OpMul32: 327 return rewriteValueS390X_OpMul32_0(v) 328 case OpMul32F: 329 return rewriteValueS390X_OpMul32F_0(v) 330 case OpMul64: 331 return rewriteValueS390X_OpMul64_0(v) 332 case OpMul64F: 333 return rewriteValueS390X_OpMul64F_0(v) 334 case OpMul8: 335 return rewriteValueS390X_OpMul8_0(v) 336 case OpNeg16: 337 return rewriteValueS390X_OpNeg16_0(v) 338 case OpNeg32: 339 return rewriteValueS390X_OpNeg32_0(v) 340 case OpNeg32F: 341 return rewriteValueS390X_OpNeg32F_0(v) 342 case OpNeg64: 343 return rewriteValueS390X_OpNeg64_0(v) 344 case OpNeg64F: 345 return rewriteValueS390X_OpNeg64F_0(v) 346 case OpNeg8: 347 return rewriteValueS390X_OpNeg8_0(v) 348 case OpNeq16: 349 return rewriteValueS390X_OpNeq16_0(v) 350 case OpNeq32: 351 return rewriteValueS390X_OpNeq32_0(v) 352 case OpNeq32F: 353 return rewriteValueS390X_OpNeq32F_0(v) 354 case OpNeq64: 355 return rewriteValueS390X_OpNeq64_0(v) 356 case OpNeq64F: 357 return rewriteValueS390X_OpNeq64F_0(v) 358 case OpNeq8: 359 return rewriteValueS390X_OpNeq8_0(v) 360 case OpNeqB: 361 return rewriteValueS390X_OpNeqB_0(v) 362 case OpNeqPtr: 363 return rewriteValueS390X_OpNeqPtr_0(v) 364 case OpNilCheck: 365 return rewriteValueS390X_OpNilCheck_0(v) 366 case OpNot: 367 return rewriteValueS390X_OpNot_0(v) 368 case OpOffPtr: 369 return rewriteValueS390X_OpOffPtr_0(v) 370 case OpOr16: 371 return rewriteValueS390X_OpOr16_0(v) 372 case OpOr32: 373 return rewriteValueS390X_OpOr32_0(v) 374 case OpOr64: 375 return rewriteValueS390X_OpOr64_0(v) 376 case OpOr8: 377 return rewriteValueS390X_OpOr8_0(v) 378 case OpOrB: 379 return rewriteValueS390X_OpOrB_0(v) 380 case OpRound: 381 return rewriteValueS390X_OpRound_0(v) 382 case OpRound32F: 383 return rewriteValueS390X_OpRound32F_0(v) 384 case OpRound64F: 385 return rewriteValueS390X_OpRound64F_0(v) 386 case OpRoundToEven: 387 return rewriteValueS390X_OpRoundToEven_0(v) 388 case OpRsh16Ux16: 389 return rewriteValueS390X_OpRsh16Ux16_0(v) 390 case OpRsh16Ux32: 391 return rewriteValueS390X_OpRsh16Ux32_0(v) 392 case OpRsh16Ux64: 393 return rewriteValueS390X_OpRsh16Ux64_0(v) 394 case OpRsh16Ux8: 395 return rewriteValueS390X_OpRsh16Ux8_0(v) 396 case OpRsh16x16: 397 return rewriteValueS390X_OpRsh16x16_0(v) 398 case OpRsh16x32: 399 return rewriteValueS390X_OpRsh16x32_0(v) 400 case OpRsh16x64: 401 return rewriteValueS390X_OpRsh16x64_0(v) 402 case OpRsh16x8: 403 return rewriteValueS390X_OpRsh16x8_0(v) 404 case OpRsh32Ux16: 405 return rewriteValueS390X_OpRsh32Ux16_0(v) 406 case OpRsh32Ux32: 407 return rewriteValueS390X_OpRsh32Ux32_0(v) 408 case OpRsh32Ux64: 409 return rewriteValueS390X_OpRsh32Ux64_0(v) 410 case OpRsh32Ux8: 411 return rewriteValueS390X_OpRsh32Ux8_0(v) 412 case OpRsh32x16: 413 return rewriteValueS390X_OpRsh32x16_0(v) 414 case OpRsh32x32: 415 return rewriteValueS390X_OpRsh32x32_0(v) 416 case OpRsh32x64: 417 return rewriteValueS390X_OpRsh32x64_0(v) 418 case OpRsh32x8: 419 return rewriteValueS390X_OpRsh32x8_0(v) 420 case OpRsh64Ux16: 421 return rewriteValueS390X_OpRsh64Ux16_0(v) 422 case OpRsh64Ux32: 423 return rewriteValueS390X_OpRsh64Ux32_0(v) 424 case OpRsh64Ux64: 425 return rewriteValueS390X_OpRsh64Ux64_0(v) 426 case OpRsh64Ux8: 427 return rewriteValueS390X_OpRsh64Ux8_0(v) 428 case OpRsh64x16: 429 return rewriteValueS390X_OpRsh64x16_0(v) 430 case OpRsh64x32: 431 return rewriteValueS390X_OpRsh64x32_0(v) 432 case OpRsh64x64: 433 return rewriteValueS390X_OpRsh64x64_0(v) 434 case OpRsh64x8: 435 return rewriteValueS390X_OpRsh64x8_0(v) 436 case OpRsh8Ux16: 437 return rewriteValueS390X_OpRsh8Ux16_0(v) 438 case OpRsh8Ux32: 439 return rewriteValueS390X_OpRsh8Ux32_0(v) 440 case OpRsh8Ux64: 441 return rewriteValueS390X_OpRsh8Ux64_0(v) 442 case OpRsh8Ux8: 443 return rewriteValueS390X_OpRsh8Ux8_0(v) 444 case OpRsh8x16: 445 return rewriteValueS390X_OpRsh8x16_0(v) 446 case OpRsh8x32: 447 return rewriteValueS390X_OpRsh8x32_0(v) 448 case OpRsh8x64: 449 return rewriteValueS390X_OpRsh8x64_0(v) 450 case OpRsh8x8: 451 return rewriteValueS390X_OpRsh8x8_0(v) 452 case OpS390XADD: 453 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 454 case OpS390XADDW: 455 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 456 case OpS390XADDWconst: 457 return rewriteValueS390X_OpS390XADDWconst_0(v) 458 case OpS390XADDWload: 459 return rewriteValueS390X_OpS390XADDWload_0(v) 460 case OpS390XADDconst: 461 return rewriteValueS390X_OpS390XADDconst_0(v) 462 case OpS390XADDload: 463 return rewriteValueS390X_OpS390XADDload_0(v) 464 case OpS390XAND: 465 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 466 case OpS390XANDW: 467 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 468 case OpS390XANDWconst: 469 return rewriteValueS390X_OpS390XANDWconst_0(v) 470 case OpS390XANDWload: 471 return rewriteValueS390X_OpS390XANDWload_0(v) 472 case OpS390XANDconst: 473 return rewriteValueS390X_OpS390XANDconst_0(v) 474 case OpS390XANDload: 475 return rewriteValueS390X_OpS390XANDload_0(v) 476 case OpS390XCMP: 477 return rewriteValueS390X_OpS390XCMP_0(v) 478 case OpS390XCMPU: 479 return rewriteValueS390X_OpS390XCMPU_0(v) 480 case OpS390XCMPUconst: 481 return rewriteValueS390X_OpS390XCMPUconst_0(v) 482 case OpS390XCMPW: 483 return rewriteValueS390X_OpS390XCMPW_0(v) 484 case OpS390XCMPWU: 485 return rewriteValueS390X_OpS390XCMPWU_0(v) 486 case OpS390XCMPWUconst: 487 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 488 case OpS390XCMPWconst: 489 return rewriteValueS390X_OpS390XCMPWconst_0(v) 490 case OpS390XCMPconst: 491 return rewriteValueS390X_OpS390XCMPconst_0(v) 492 case OpS390XCPSDR: 493 return rewriteValueS390X_OpS390XCPSDR_0(v) 494 case OpS390XFADD: 495 return rewriteValueS390X_OpS390XFADD_0(v) 496 case OpS390XFADDS: 497 return rewriteValueS390X_OpS390XFADDS_0(v) 498 case OpS390XFMOVDload: 499 return rewriteValueS390X_OpS390XFMOVDload_0(v) 500 case OpS390XFMOVDloadidx: 501 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 502 case OpS390XFMOVDstore: 503 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 504 case OpS390XFMOVDstoreidx: 505 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 506 case OpS390XFMOVSload: 507 return rewriteValueS390X_OpS390XFMOVSload_0(v) 508 case OpS390XFMOVSloadidx: 509 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 510 case OpS390XFMOVSstore: 511 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 512 case OpS390XFMOVSstoreidx: 513 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 514 case OpS390XFNEG: 515 return rewriteValueS390X_OpS390XFNEG_0(v) 516 case OpS390XFNEGS: 517 return rewriteValueS390X_OpS390XFNEGS_0(v) 518 case OpS390XFSUB: 519 return rewriteValueS390X_OpS390XFSUB_0(v) 520 case OpS390XFSUBS: 521 return rewriteValueS390X_OpS390XFSUBS_0(v) 522 case OpS390XLDGR: 523 return rewriteValueS390X_OpS390XLDGR_0(v) 524 case OpS390XLEDBR: 525 return rewriteValueS390X_OpS390XLEDBR_0(v) 526 case OpS390XLGDR: 527 return rewriteValueS390X_OpS390XLGDR_0(v) 528 case OpS390XLoweredRound32F: 529 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 530 case OpS390XLoweredRound64F: 531 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 532 case OpS390XMOVBZload: 533 return rewriteValueS390X_OpS390XMOVBZload_0(v) 534 case OpS390XMOVBZloadidx: 535 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 536 case OpS390XMOVBZreg: 537 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 538 case OpS390XMOVBload: 539 return rewriteValueS390X_OpS390XMOVBload_0(v) 540 case OpS390XMOVBloadidx: 541 return rewriteValueS390X_OpS390XMOVBloadidx_0(v) 542 case OpS390XMOVBreg: 543 return rewriteValueS390X_OpS390XMOVBreg_0(v) 544 case OpS390XMOVBstore: 545 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 546 case OpS390XMOVBstoreconst: 547 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 548 case OpS390XMOVBstoreidx: 549 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 550 case OpS390XMOVDEQ: 551 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 552 case OpS390XMOVDGE: 553 return rewriteValueS390X_OpS390XMOVDGE_0(v) 554 case OpS390XMOVDGT: 555 return rewriteValueS390X_OpS390XMOVDGT_0(v) 556 case OpS390XMOVDLE: 557 return rewriteValueS390X_OpS390XMOVDLE_0(v) 558 case OpS390XMOVDLT: 559 return rewriteValueS390X_OpS390XMOVDLT_0(v) 560 case OpS390XMOVDNE: 561 return rewriteValueS390X_OpS390XMOVDNE_0(v) 562 case OpS390XMOVDaddridx: 563 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 564 case OpS390XMOVDload: 565 return rewriteValueS390X_OpS390XMOVDload_0(v) 566 case OpS390XMOVDloadidx: 567 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 568 case OpS390XMOVDnop: 569 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 570 case OpS390XMOVDreg: 571 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 572 case OpS390XMOVDstore: 573 return rewriteValueS390X_OpS390XMOVDstore_0(v) 574 case OpS390XMOVDstoreconst: 575 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 576 case OpS390XMOVDstoreidx: 577 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 578 case OpS390XMOVHBRstore: 579 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 580 case OpS390XMOVHBRstoreidx: 581 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 582 case OpS390XMOVHZload: 583 return rewriteValueS390X_OpS390XMOVHZload_0(v) 584 case OpS390XMOVHZloadidx: 585 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 586 case OpS390XMOVHZreg: 587 return rewriteValueS390X_OpS390XMOVHZreg_0(v) 588 case OpS390XMOVHload: 589 return rewriteValueS390X_OpS390XMOVHload_0(v) 590 case OpS390XMOVHloadidx: 591 return rewriteValueS390X_OpS390XMOVHloadidx_0(v) 592 case OpS390XMOVHreg: 593 return rewriteValueS390X_OpS390XMOVHreg_0(v) || rewriteValueS390X_OpS390XMOVHreg_10(v) 594 case OpS390XMOVHstore: 595 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 596 case OpS390XMOVHstoreconst: 597 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 598 case OpS390XMOVHstoreidx: 599 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 600 case OpS390XMOVWBRstore: 601 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 602 case OpS390XMOVWBRstoreidx: 603 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 604 case OpS390XMOVWZload: 605 return rewriteValueS390X_OpS390XMOVWZload_0(v) 606 case OpS390XMOVWZloadidx: 607 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 608 case OpS390XMOVWZreg: 609 return rewriteValueS390X_OpS390XMOVWZreg_0(v) || rewriteValueS390X_OpS390XMOVWZreg_10(v) 610 case OpS390XMOVWload: 611 return rewriteValueS390X_OpS390XMOVWload_0(v) 612 case OpS390XMOVWloadidx: 613 return rewriteValueS390X_OpS390XMOVWloadidx_0(v) 614 case OpS390XMOVWreg: 615 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 616 case OpS390XMOVWstore: 617 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 618 case OpS390XMOVWstoreconst: 619 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 620 case OpS390XMOVWstoreidx: 621 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 622 case OpS390XMULLD: 623 return rewriteValueS390X_OpS390XMULLD_0(v) 624 case OpS390XMULLDconst: 625 return rewriteValueS390X_OpS390XMULLDconst_0(v) 626 case OpS390XMULLDload: 627 return rewriteValueS390X_OpS390XMULLDload_0(v) 628 case OpS390XMULLW: 629 return rewriteValueS390X_OpS390XMULLW_0(v) 630 case OpS390XMULLWconst: 631 return rewriteValueS390X_OpS390XMULLWconst_0(v) 632 case OpS390XMULLWload: 633 return rewriteValueS390X_OpS390XMULLWload_0(v) 634 case OpS390XNEG: 635 return rewriteValueS390X_OpS390XNEG_0(v) 636 case OpS390XNEGW: 637 return rewriteValueS390X_OpS390XNEGW_0(v) 638 case OpS390XNOT: 639 return rewriteValueS390X_OpS390XNOT_0(v) 640 case OpS390XNOTW: 641 return rewriteValueS390X_OpS390XNOTW_0(v) 642 case OpS390XOR: 643 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) 644 case OpS390XORW: 645 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) 646 case OpS390XORWconst: 647 return rewriteValueS390X_OpS390XORWconst_0(v) 648 case OpS390XORWload: 649 return rewriteValueS390X_OpS390XORWload_0(v) 650 case OpS390XORconst: 651 return rewriteValueS390X_OpS390XORconst_0(v) 652 case OpS390XORload: 653 return rewriteValueS390X_OpS390XORload_0(v) 654 case OpS390XSLD: 655 return rewriteValueS390X_OpS390XSLD_0(v) 656 case OpS390XSLW: 657 return rewriteValueS390X_OpS390XSLW_0(v) 658 case OpS390XSRAD: 659 return rewriteValueS390X_OpS390XSRAD_0(v) 660 case OpS390XSRADconst: 661 return rewriteValueS390X_OpS390XSRADconst_0(v) 662 case OpS390XSRAW: 663 return rewriteValueS390X_OpS390XSRAW_0(v) 664 case OpS390XSRAWconst: 665 return rewriteValueS390X_OpS390XSRAWconst_0(v) 666 case OpS390XSRD: 667 return rewriteValueS390X_OpS390XSRD_0(v) 668 case OpS390XSRDconst: 669 return rewriteValueS390X_OpS390XSRDconst_0(v) 670 case OpS390XSRW: 671 return rewriteValueS390X_OpS390XSRW_0(v) 672 case OpS390XSTM2: 673 return rewriteValueS390X_OpS390XSTM2_0(v) 674 case OpS390XSTMG2: 675 return rewriteValueS390X_OpS390XSTMG2_0(v) 676 case OpS390XSUB: 677 return rewriteValueS390X_OpS390XSUB_0(v) 678 case OpS390XSUBEWcarrymask: 679 return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v) 680 case OpS390XSUBEcarrymask: 681 return rewriteValueS390X_OpS390XSUBEcarrymask_0(v) 682 case OpS390XSUBW: 683 return rewriteValueS390X_OpS390XSUBW_0(v) 684 case OpS390XSUBWconst: 685 return rewriteValueS390X_OpS390XSUBWconst_0(v) 686 case OpS390XSUBWload: 687 return rewriteValueS390X_OpS390XSUBWload_0(v) 688 case OpS390XSUBconst: 689 return rewriteValueS390X_OpS390XSUBconst_0(v) 690 case OpS390XSUBload: 691 return rewriteValueS390X_OpS390XSUBload_0(v) 692 case OpS390XXOR: 693 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 694 case OpS390XXORW: 695 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 696 case OpS390XXORWconst: 697 return rewriteValueS390X_OpS390XXORWconst_0(v) 698 case OpS390XXORWload: 699 return rewriteValueS390X_OpS390XXORWload_0(v) 700 case OpS390XXORconst: 701 return rewriteValueS390X_OpS390XXORconst_0(v) 702 case OpS390XXORload: 703 return rewriteValueS390X_OpS390XXORload_0(v) 704 case OpSelect0: 705 return rewriteValueS390X_OpSelect0_0(v) 706 case OpSelect1: 707 return rewriteValueS390X_OpSelect1_0(v) 708 case OpSignExt16to32: 709 return rewriteValueS390X_OpSignExt16to32_0(v) 710 case OpSignExt16to64: 711 return rewriteValueS390X_OpSignExt16to64_0(v) 712 case OpSignExt32to64: 713 return rewriteValueS390X_OpSignExt32to64_0(v) 714 case OpSignExt8to16: 715 return rewriteValueS390X_OpSignExt8to16_0(v) 716 case OpSignExt8to32: 717 return rewriteValueS390X_OpSignExt8to32_0(v) 718 case OpSignExt8to64: 719 return rewriteValueS390X_OpSignExt8to64_0(v) 720 case OpSlicemask: 721 return rewriteValueS390X_OpSlicemask_0(v) 722 case OpSqrt: 723 return rewriteValueS390X_OpSqrt_0(v) 724 case OpStaticCall: 725 return rewriteValueS390X_OpStaticCall_0(v) 726 case OpStore: 727 return rewriteValueS390X_OpStore_0(v) 728 case OpSub16: 729 return rewriteValueS390X_OpSub16_0(v) 730 case OpSub32: 731 return rewriteValueS390X_OpSub32_0(v) 732 case OpSub32F: 733 return rewriteValueS390X_OpSub32F_0(v) 734 case OpSub64: 735 return rewriteValueS390X_OpSub64_0(v) 736 case OpSub64F: 737 return rewriteValueS390X_OpSub64F_0(v) 738 case OpSub8: 739 return rewriteValueS390X_OpSub8_0(v) 740 case OpSubPtr: 741 return rewriteValueS390X_OpSubPtr_0(v) 742 case OpTrunc: 743 return rewriteValueS390X_OpTrunc_0(v) 744 case OpTrunc16to8: 745 return rewriteValueS390X_OpTrunc16to8_0(v) 746 case OpTrunc32to16: 747 return rewriteValueS390X_OpTrunc32to16_0(v) 748 case OpTrunc32to8: 749 return rewriteValueS390X_OpTrunc32to8_0(v) 750 case OpTrunc64to16: 751 return rewriteValueS390X_OpTrunc64to16_0(v) 752 case OpTrunc64to32: 753 return rewriteValueS390X_OpTrunc64to32_0(v) 754 case OpTrunc64to8: 755 return rewriteValueS390X_OpTrunc64to8_0(v) 756 case OpWB: 757 return rewriteValueS390X_OpWB_0(v) 758 case OpXor16: 759 return rewriteValueS390X_OpXor16_0(v) 760 case OpXor32: 761 return rewriteValueS390X_OpXor32_0(v) 762 case OpXor64: 763 return rewriteValueS390X_OpXor64_0(v) 764 case OpXor8: 765 return rewriteValueS390X_OpXor8_0(v) 766 case OpZero: 767 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 768 case OpZeroExt16to32: 769 return rewriteValueS390X_OpZeroExt16to32_0(v) 770 case OpZeroExt16to64: 771 return rewriteValueS390X_OpZeroExt16to64_0(v) 772 case OpZeroExt32to64: 773 return rewriteValueS390X_OpZeroExt32to64_0(v) 774 case OpZeroExt8to16: 775 return rewriteValueS390X_OpZeroExt8to16_0(v) 776 case OpZeroExt8to32: 777 return rewriteValueS390X_OpZeroExt8to32_0(v) 778 case OpZeroExt8to64: 779 return rewriteValueS390X_OpZeroExt8to64_0(v) 780 } 781 return false 782 } 783 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 784 // match: (Add16 x y) 785 // cond: 786 // result: (ADDW x y) 787 for { 788 _ = v.Args[1] 789 x := v.Args[0] 790 y := v.Args[1] 791 v.reset(OpS390XADDW) 792 v.AddArg(x) 793 v.AddArg(y) 794 return true 795 } 796 } 797 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 798 // match: (Add32 x y) 799 // cond: 800 // result: (ADDW x y) 801 for { 802 _ = v.Args[1] 803 x := v.Args[0] 804 y := v.Args[1] 805 v.reset(OpS390XADDW) 806 v.AddArg(x) 807 v.AddArg(y) 808 return true 809 } 810 } 811 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 812 // match: (Add32F x y) 813 // cond: 814 // result: (FADDS x y) 815 for { 816 _ = v.Args[1] 817 x := v.Args[0] 818 y := v.Args[1] 819 v.reset(OpS390XFADDS) 820 v.AddArg(x) 821 v.AddArg(y) 822 return true 823 } 824 } 825 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 826 // match: (Add64 x y) 827 // cond: 828 // result: (ADD x y) 829 for { 830 _ = v.Args[1] 831 x := v.Args[0] 832 y := v.Args[1] 833 v.reset(OpS390XADD) 834 v.AddArg(x) 835 v.AddArg(y) 836 return true 837 } 838 } 839 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 840 // match: (Add64F x y) 841 // cond: 842 // result: (FADD x y) 843 for { 844 _ = v.Args[1] 845 x := v.Args[0] 846 y := v.Args[1] 847 v.reset(OpS390XFADD) 848 v.AddArg(x) 849 v.AddArg(y) 850 return true 851 } 852 } 853 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 854 // match: (Add8 x y) 855 // cond: 856 // result: (ADDW x y) 857 for { 858 _ = v.Args[1] 859 x := v.Args[0] 860 y := v.Args[1] 861 v.reset(OpS390XADDW) 862 v.AddArg(x) 863 v.AddArg(y) 864 return true 865 } 866 } 867 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 868 // match: (AddPtr x y) 869 // cond: 870 // result: (ADD x y) 871 for { 872 _ = v.Args[1] 873 x := v.Args[0] 874 y := v.Args[1] 875 v.reset(OpS390XADD) 876 v.AddArg(x) 877 v.AddArg(y) 878 return true 879 } 880 } 881 func rewriteValueS390X_OpAddr_0(v *Value) bool { 882 // match: (Addr {sym} base) 883 // cond: 884 // result: (MOVDaddr {sym} base) 885 for { 886 sym := v.Aux 887 base := v.Args[0] 888 v.reset(OpS390XMOVDaddr) 889 v.Aux = sym 890 v.AddArg(base) 891 return true 892 } 893 } 894 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 895 // match: (And16 x y) 896 // cond: 897 // result: (ANDW x y) 898 for { 899 _ = v.Args[1] 900 x := v.Args[0] 901 y := v.Args[1] 902 v.reset(OpS390XANDW) 903 v.AddArg(x) 904 v.AddArg(y) 905 return true 906 } 907 } 908 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 909 // match: (And32 x y) 910 // cond: 911 // result: (ANDW x y) 912 for { 913 _ = v.Args[1] 914 x := v.Args[0] 915 y := v.Args[1] 916 v.reset(OpS390XANDW) 917 v.AddArg(x) 918 v.AddArg(y) 919 return true 920 } 921 } 922 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 923 // match: (And64 x y) 924 // cond: 925 // result: (AND x y) 926 for { 927 _ = v.Args[1] 928 x := v.Args[0] 929 y := v.Args[1] 930 v.reset(OpS390XAND) 931 v.AddArg(x) 932 v.AddArg(y) 933 return true 934 } 935 } 936 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 937 // match: (And8 x y) 938 // cond: 939 // result: (ANDW x y) 940 for { 941 _ = v.Args[1] 942 x := v.Args[0] 943 y := v.Args[1] 944 v.reset(OpS390XANDW) 945 v.AddArg(x) 946 v.AddArg(y) 947 return true 948 } 949 } 950 func rewriteValueS390X_OpAndB_0(v *Value) bool { 951 // match: (AndB x y) 952 // cond: 953 // result: (ANDW x y) 954 for { 955 _ = v.Args[1] 956 x := v.Args[0] 957 y := v.Args[1] 958 v.reset(OpS390XANDW) 959 v.AddArg(x) 960 v.AddArg(y) 961 return true 962 } 963 } 964 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 965 b := v.Block 966 _ = b 967 typ := &b.Func.Config.Types 968 _ = typ 969 // match: (AtomicAdd32 ptr val mem) 970 // cond: 971 // result: (AddTupleFirst32 val (LAA ptr val mem)) 972 for { 973 _ = v.Args[2] 974 ptr := v.Args[0] 975 val := v.Args[1] 976 mem := v.Args[2] 977 v.reset(OpS390XAddTupleFirst32) 978 v.AddArg(val) 979 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 980 v0.AddArg(ptr) 981 v0.AddArg(val) 982 v0.AddArg(mem) 983 v.AddArg(v0) 984 return true 985 } 986 } 987 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 988 b := v.Block 989 _ = b 990 typ := &b.Func.Config.Types 991 _ = typ 992 // match: (AtomicAdd64 ptr val mem) 993 // cond: 994 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 995 for { 996 _ = v.Args[2] 997 ptr := v.Args[0] 998 val := v.Args[1] 999 mem := v.Args[2] 1000 v.reset(OpS390XAddTupleFirst64) 1001 v.AddArg(val) 1002 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 1003 v0.AddArg(ptr) 1004 v0.AddArg(val) 1005 v0.AddArg(mem) 1006 v.AddArg(v0) 1007 return true 1008 } 1009 } 1010 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 1011 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 1012 // cond: 1013 // result: (LoweredAtomicCas32 ptr old new_ mem) 1014 for { 1015 _ = v.Args[3] 1016 ptr := v.Args[0] 1017 old := v.Args[1] 1018 new_ := v.Args[2] 1019 mem := v.Args[3] 1020 v.reset(OpS390XLoweredAtomicCas32) 1021 v.AddArg(ptr) 1022 v.AddArg(old) 1023 v.AddArg(new_) 1024 v.AddArg(mem) 1025 return true 1026 } 1027 } 1028 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 1029 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 1030 // cond: 1031 // result: (LoweredAtomicCas64 ptr old new_ mem) 1032 for { 1033 _ = v.Args[3] 1034 ptr := v.Args[0] 1035 old := v.Args[1] 1036 new_ := v.Args[2] 1037 mem := v.Args[3] 1038 v.reset(OpS390XLoweredAtomicCas64) 1039 v.AddArg(ptr) 1040 v.AddArg(old) 1041 v.AddArg(new_) 1042 v.AddArg(mem) 1043 return true 1044 } 1045 } 1046 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 1047 // match: (AtomicExchange32 ptr val mem) 1048 // cond: 1049 // result: (LoweredAtomicExchange32 ptr val mem) 1050 for { 1051 _ = v.Args[2] 1052 ptr := v.Args[0] 1053 val := v.Args[1] 1054 mem := v.Args[2] 1055 v.reset(OpS390XLoweredAtomicExchange32) 1056 v.AddArg(ptr) 1057 v.AddArg(val) 1058 v.AddArg(mem) 1059 return true 1060 } 1061 } 1062 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1063 // match: (AtomicExchange64 ptr val mem) 1064 // cond: 1065 // result: (LoweredAtomicExchange64 ptr val mem) 1066 for { 1067 _ = v.Args[2] 1068 ptr := v.Args[0] 1069 val := v.Args[1] 1070 mem := v.Args[2] 1071 v.reset(OpS390XLoweredAtomicExchange64) 1072 v.AddArg(ptr) 1073 v.AddArg(val) 1074 v.AddArg(mem) 1075 return true 1076 } 1077 } 1078 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1079 // match: (AtomicLoad32 ptr mem) 1080 // cond: 1081 // result: (MOVWZatomicload ptr mem) 1082 for { 1083 _ = v.Args[1] 1084 ptr := v.Args[0] 1085 mem := v.Args[1] 1086 v.reset(OpS390XMOVWZatomicload) 1087 v.AddArg(ptr) 1088 v.AddArg(mem) 1089 return true 1090 } 1091 } 1092 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1093 // match: (AtomicLoad64 ptr mem) 1094 // cond: 1095 // result: (MOVDatomicload ptr mem) 1096 for { 1097 _ = v.Args[1] 1098 ptr := v.Args[0] 1099 mem := v.Args[1] 1100 v.reset(OpS390XMOVDatomicload) 1101 v.AddArg(ptr) 1102 v.AddArg(mem) 1103 return true 1104 } 1105 } 1106 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1107 // match: (AtomicLoadPtr ptr mem) 1108 // cond: 1109 // result: (MOVDatomicload ptr mem) 1110 for { 1111 _ = v.Args[1] 1112 ptr := v.Args[0] 1113 mem := v.Args[1] 1114 v.reset(OpS390XMOVDatomicload) 1115 v.AddArg(ptr) 1116 v.AddArg(mem) 1117 return true 1118 } 1119 } 1120 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1121 // match: (AtomicStore32 ptr val mem) 1122 // cond: 1123 // result: (MOVWatomicstore ptr val mem) 1124 for { 1125 _ = v.Args[2] 1126 ptr := v.Args[0] 1127 val := v.Args[1] 1128 mem := v.Args[2] 1129 v.reset(OpS390XMOVWatomicstore) 1130 v.AddArg(ptr) 1131 v.AddArg(val) 1132 v.AddArg(mem) 1133 return true 1134 } 1135 } 1136 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1137 // match: (AtomicStore64 ptr val mem) 1138 // cond: 1139 // result: (MOVDatomicstore ptr val mem) 1140 for { 1141 _ = v.Args[2] 1142 ptr := v.Args[0] 1143 val := v.Args[1] 1144 mem := v.Args[2] 1145 v.reset(OpS390XMOVDatomicstore) 1146 v.AddArg(ptr) 1147 v.AddArg(val) 1148 v.AddArg(mem) 1149 return true 1150 } 1151 } 1152 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1153 // match: (AtomicStorePtrNoWB ptr val mem) 1154 // cond: 1155 // result: (MOVDatomicstore ptr val mem) 1156 for { 1157 _ = v.Args[2] 1158 ptr := v.Args[0] 1159 val := v.Args[1] 1160 mem := v.Args[2] 1161 v.reset(OpS390XMOVDatomicstore) 1162 v.AddArg(ptr) 1163 v.AddArg(val) 1164 v.AddArg(mem) 1165 return true 1166 } 1167 } 1168 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1169 b := v.Block 1170 _ = b 1171 // match: (Avg64u <t> x y) 1172 // cond: 1173 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1174 for { 1175 t := v.Type 1176 _ = v.Args[1] 1177 x := v.Args[0] 1178 y := v.Args[1] 1179 v.reset(OpS390XADD) 1180 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1181 v0.AuxInt = 1 1182 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1183 v1.AddArg(x) 1184 v1.AddArg(y) 1185 v0.AddArg(v1) 1186 v.AddArg(v0) 1187 v.AddArg(y) 1188 return true 1189 } 1190 } 1191 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1192 b := v.Block 1193 _ = b 1194 typ := &b.Func.Config.Types 1195 _ = typ 1196 // match: (BitLen64 x) 1197 // cond: 1198 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1199 for { 1200 x := v.Args[0] 1201 v.reset(OpS390XSUB) 1202 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1203 v0.AuxInt = 64 1204 v.AddArg(v0) 1205 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1206 v1.AddArg(x) 1207 v.AddArg(v1) 1208 return true 1209 } 1210 } 1211 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1212 // match: (Bswap32 x) 1213 // cond: 1214 // result: (MOVWBR x) 1215 for { 1216 x := v.Args[0] 1217 v.reset(OpS390XMOVWBR) 1218 v.AddArg(x) 1219 return true 1220 } 1221 } 1222 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1223 // match: (Bswap64 x) 1224 // cond: 1225 // result: (MOVDBR x) 1226 for { 1227 x := v.Args[0] 1228 v.reset(OpS390XMOVDBR) 1229 v.AddArg(x) 1230 return true 1231 } 1232 } 1233 func rewriteValueS390X_OpCeil_0(v *Value) bool { 1234 // match: (Ceil x) 1235 // cond: 1236 // result: (FIDBR [6] x) 1237 for { 1238 x := v.Args[0] 1239 v.reset(OpS390XFIDBR) 1240 v.AuxInt = 6 1241 v.AddArg(x) 1242 return true 1243 } 1244 } 1245 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1246 // match: (ClosureCall [argwid] entry closure mem) 1247 // cond: 1248 // result: (CALLclosure [argwid] entry closure mem) 1249 for { 1250 argwid := v.AuxInt 1251 _ = v.Args[2] 1252 entry := v.Args[0] 1253 closure := v.Args[1] 1254 mem := v.Args[2] 1255 v.reset(OpS390XCALLclosure) 1256 v.AuxInt = argwid 1257 v.AddArg(entry) 1258 v.AddArg(closure) 1259 v.AddArg(mem) 1260 return true 1261 } 1262 } 1263 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1264 // match: (Com16 x) 1265 // cond: 1266 // result: (NOTW x) 1267 for { 1268 x := v.Args[0] 1269 v.reset(OpS390XNOTW) 1270 v.AddArg(x) 1271 return true 1272 } 1273 } 1274 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1275 // match: (Com32 x) 1276 // cond: 1277 // result: (NOTW x) 1278 for { 1279 x := v.Args[0] 1280 v.reset(OpS390XNOTW) 1281 v.AddArg(x) 1282 return true 1283 } 1284 } 1285 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1286 // match: (Com64 x) 1287 // cond: 1288 // result: (NOT x) 1289 for { 1290 x := v.Args[0] 1291 v.reset(OpS390XNOT) 1292 v.AddArg(x) 1293 return true 1294 } 1295 } 1296 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1297 // match: (Com8 x) 1298 // cond: 1299 // result: (NOTW x) 1300 for { 1301 x := v.Args[0] 1302 v.reset(OpS390XNOTW) 1303 v.AddArg(x) 1304 return true 1305 } 1306 } 1307 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1308 // match: (Const16 [val]) 1309 // cond: 1310 // result: (MOVDconst [val]) 1311 for { 1312 val := v.AuxInt 1313 v.reset(OpS390XMOVDconst) 1314 v.AuxInt = val 1315 return true 1316 } 1317 } 1318 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1319 // match: (Const32 [val]) 1320 // cond: 1321 // result: (MOVDconst [val]) 1322 for { 1323 val := v.AuxInt 1324 v.reset(OpS390XMOVDconst) 1325 v.AuxInt = val 1326 return true 1327 } 1328 } 1329 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1330 // match: (Const32F [val]) 1331 // cond: 1332 // result: (FMOVSconst [val]) 1333 for { 1334 val := v.AuxInt 1335 v.reset(OpS390XFMOVSconst) 1336 v.AuxInt = val 1337 return true 1338 } 1339 } 1340 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1341 // match: (Const64 [val]) 1342 // cond: 1343 // result: (MOVDconst [val]) 1344 for { 1345 val := v.AuxInt 1346 v.reset(OpS390XMOVDconst) 1347 v.AuxInt = val 1348 return true 1349 } 1350 } 1351 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1352 // match: (Const64F [val]) 1353 // cond: 1354 // result: (FMOVDconst [val]) 1355 for { 1356 val := v.AuxInt 1357 v.reset(OpS390XFMOVDconst) 1358 v.AuxInt = val 1359 return true 1360 } 1361 } 1362 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1363 // match: (Const8 [val]) 1364 // cond: 1365 // result: (MOVDconst [val]) 1366 for { 1367 val := v.AuxInt 1368 v.reset(OpS390XMOVDconst) 1369 v.AuxInt = val 1370 return true 1371 } 1372 } 1373 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1374 // match: (ConstBool [b]) 1375 // cond: 1376 // result: (MOVDconst [b]) 1377 for { 1378 b := v.AuxInt 1379 v.reset(OpS390XMOVDconst) 1380 v.AuxInt = b 1381 return true 1382 } 1383 } 1384 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1385 // match: (ConstNil) 1386 // cond: 1387 // result: (MOVDconst [0]) 1388 for { 1389 v.reset(OpS390XMOVDconst) 1390 v.AuxInt = 0 1391 return true 1392 } 1393 } 1394 func rewriteValueS390X_OpConvert_0(v *Value) bool { 1395 // match: (Convert <t> x mem) 1396 // cond: 1397 // result: (MOVDconvert <t> x mem) 1398 for { 1399 t := v.Type 1400 _ = v.Args[1] 1401 x := v.Args[0] 1402 mem := v.Args[1] 1403 v.reset(OpS390XMOVDconvert) 1404 v.Type = t 1405 v.AddArg(x) 1406 v.AddArg(mem) 1407 return true 1408 } 1409 } 1410 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1411 b := v.Block 1412 _ = b 1413 typ := &b.Func.Config.Types 1414 _ = typ 1415 // match: (Ctz32 <t> x) 1416 // cond: 1417 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1418 for { 1419 t := v.Type 1420 x := v.Args[0] 1421 v.reset(OpS390XSUB) 1422 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1423 v0.AuxInt = 64 1424 v.AddArg(v0) 1425 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1426 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1427 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1428 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1429 v4.AuxInt = 1 1430 v4.AddArg(x) 1431 v3.AddArg(v4) 1432 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1433 v5.AddArg(x) 1434 v3.AddArg(v5) 1435 v2.AddArg(v3) 1436 v1.AddArg(v2) 1437 v.AddArg(v1) 1438 return true 1439 } 1440 } 1441 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1442 b := v.Block 1443 _ = b 1444 typ := &b.Func.Config.Types 1445 _ = typ 1446 // match: (Ctz64 <t> x) 1447 // cond: 1448 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1449 for { 1450 t := v.Type 1451 x := v.Args[0] 1452 v.reset(OpS390XSUB) 1453 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1454 v0.AuxInt = 64 1455 v.AddArg(v0) 1456 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1457 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1458 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1459 v3.AuxInt = 1 1460 v3.AddArg(x) 1461 v2.AddArg(v3) 1462 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1463 v4.AddArg(x) 1464 v2.AddArg(v4) 1465 v1.AddArg(v2) 1466 v.AddArg(v1) 1467 return true 1468 } 1469 } 1470 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1471 // match: (Cvt32Fto32 x) 1472 // cond: 1473 // result: (CFEBRA x) 1474 for { 1475 x := v.Args[0] 1476 v.reset(OpS390XCFEBRA) 1477 v.AddArg(x) 1478 return true 1479 } 1480 } 1481 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1482 // match: (Cvt32Fto64 x) 1483 // cond: 1484 // result: (CGEBRA x) 1485 for { 1486 x := v.Args[0] 1487 v.reset(OpS390XCGEBRA) 1488 v.AddArg(x) 1489 return true 1490 } 1491 } 1492 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1493 // match: (Cvt32Fto64F x) 1494 // cond: 1495 // result: (LDEBR x) 1496 for { 1497 x := v.Args[0] 1498 v.reset(OpS390XLDEBR) 1499 v.AddArg(x) 1500 return true 1501 } 1502 } 1503 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1504 // match: (Cvt32to32F x) 1505 // cond: 1506 // result: (CEFBRA x) 1507 for { 1508 x := v.Args[0] 1509 v.reset(OpS390XCEFBRA) 1510 v.AddArg(x) 1511 return true 1512 } 1513 } 1514 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1515 // match: (Cvt32to64F x) 1516 // cond: 1517 // result: (CDFBRA x) 1518 for { 1519 x := v.Args[0] 1520 v.reset(OpS390XCDFBRA) 1521 v.AddArg(x) 1522 return true 1523 } 1524 } 1525 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1526 // match: (Cvt64Fto32 x) 1527 // cond: 1528 // result: (CFDBRA x) 1529 for { 1530 x := v.Args[0] 1531 v.reset(OpS390XCFDBRA) 1532 v.AddArg(x) 1533 return true 1534 } 1535 } 1536 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1537 // match: (Cvt64Fto32F x) 1538 // cond: 1539 // result: (LEDBR x) 1540 for { 1541 x := v.Args[0] 1542 v.reset(OpS390XLEDBR) 1543 v.AddArg(x) 1544 return true 1545 } 1546 } 1547 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1548 // match: (Cvt64Fto64 x) 1549 // cond: 1550 // result: (CGDBRA x) 1551 for { 1552 x := v.Args[0] 1553 v.reset(OpS390XCGDBRA) 1554 v.AddArg(x) 1555 return true 1556 } 1557 } 1558 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1559 // match: (Cvt64to32F x) 1560 // cond: 1561 // result: (CEGBRA x) 1562 for { 1563 x := v.Args[0] 1564 v.reset(OpS390XCEGBRA) 1565 v.AddArg(x) 1566 return true 1567 } 1568 } 1569 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1570 // match: (Cvt64to64F x) 1571 // cond: 1572 // result: (CDGBRA x) 1573 for { 1574 x := v.Args[0] 1575 v.reset(OpS390XCDGBRA) 1576 v.AddArg(x) 1577 return true 1578 } 1579 } 1580 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1581 b := v.Block 1582 _ = b 1583 typ := &b.Func.Config.Types 1584 _ = typ 1585 // match: (Div16 x y) 1586 // cond: 1587 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1588 for { 1589 _ = v.Args[1] 1590 x := v.Args[0] 1591 y := v.Args[1] 1592 v.reset(OpS390XDIVW) 1593 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1594 v0.AddArg(x) 1595 v.AddArg(v0) 1596 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1597 v1.AddArg(y) 1598 v.AddArg(v1) 1599 return true 1600 } 1601 } 1602 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1603 b := v.Block 1604 _ = b 1605 typ := &b.Func.Config.Types 1606 _ = typ 1607 // match: (Div16u x y) 1608 // cond: 1609 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1610 for { 1611 _ = v.Args[1] 1612 x := v.Args[0] 1613 y := v.Args[1] 1614 v.reset(OpS390XDIVWU) 1615 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1616 v0.AddArg(x) 1617 v.AddArg(v0) 1618 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1619 v1.AddArg(y) 1620 v.AddArg(v1) 1621 return true 1622 } 1623 } 1624 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1625 b := v.Block 1626 _ = b 1627 typ := &b.Func.Config.Types 1628 _ = typ 1629 // match: (Div32 x y) 1630 // cond: 1631 // result: (DIVW (MOVWreg x) y) 1632 for { 1633 _ = v.Args[1] 1634 x := v.Args[0] 1635 y := v.Args[1] 1636 v.reset(OpS390XDIVW) 1637 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1638 v0.AddArg(x) 1639 v.AddArg(v0) 1640 v.AddArg(y) 1641 return true 1642 } 1643 } 1644 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1645 // match: (Div32F x y) 1646 // cond: 1647 // result: (FDIVS x y) 1648 for { 1649 _ = v.Args[1] 1650 x := v.Args[0] 1651 y := v.Args[1] 1652 v.reset(OpS390XFDIVS) 1653 v.AddArg(x) 1654 v.AddArg(y) 1655 return true 1656 } 1657 } 1658 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1659 b := v.Block 1660 _ = b 1661 typ := &b.Func.Config.Types 1662 _ = typ 1663 // match: (Div32u x y) 1664 // cond: 1665 // result: (DIVWU (MOVWZreg x) y) 1666 for { 1667 _ = v.Args[1] 1668 x := v.Args[0] 1669 y := v.Args[1] 1670 v.reset(OpS390XDIVWU) 1671 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1672 v0.AddArg(x) 1673 v.AddArg(v0) 1674 v.AddArg(y) 1675 return true 1676 } 1677 } 1678 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1679 // match: (Div64 x y) 1680 // cond: 1681 // result: (DIVD x y) 1682 for { 1683 _ = v.Args[1] 1684 x := v.Args[0] 1685 y := v.Args[1] 1686 v.reset(OpS390XDIVD) 1687 v.AddArg(x) 1688 v.AddArg(y) 1689 return true 1690 } 1691 } 1692 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1693 // match: (Div64F x y) 1694 // cond: 1695 // result: (FDIV x y) 1696 for { 1697 _ = v.Args[1] 1698 x := v.Args[0] 1699 y := v.Args[1] 1700 v.reset(OpS390XFDIV) 1701 v.AddArg(x) 1702 v.AddArg(y) 1703 return true 1704 } 1705 } 1706 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1707 // match: (Div64u x y) 1708 // cond: 1709 // result: (DIVDU x y) 1710 for { 1711 _ = v.Args[1] 1712 x := v.Args[0] 1713 y := v.Args[1] 1714 v.reset(OpS390XDIVDU) 1715 v.AddArg(x) 1716 v.AddArg(y) 1717 return true 1718 } 1719 } 1720 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1721 b := v.Block 1722 _ = b 1723 typ := &b.Func.Config.Types 1724 _ = typ 1725 // match: (Div8 x y) 1726 // cond: 1727 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1728 for { 1729 _ = v.Args[1] 1730 x := v.Args[0] 1731 y := v.Args[1] 1732 v.reset(OpS390XDIVW) 1733 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1734 v0.AddArg(x) 1735 v.AddArg(v0) 1736 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1737 v1.AddArg(y) 1738 v.AddArg(v1) 1739 return true 1740 } 1741 } 1742 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1743 b := v.Block 1744 _ = b 1745 typ := &b.Func.Config.Types 1746 _ = typ 1747 // match: (Div8u x y) 1748 // cond: 1749 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1750 for { 1751 _ = v.Args[1] 1752 x := v.Args[0] 1753 y := v.Args[1] 1754 v.reset(OpS390XDIVWU) 1755 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1756 v0.AddArg(x) 1757 v.AddArg(v0) 1758 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1759 v1.AddArg(y) 1760 v.AddArg(v1) 1761 return true 1762 } 1763 } 1764 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1765 b := v.Block 1766 _ = b 1767 typ := &b.Func.Config.Types 1768 _ = typ 1769 // match: (Eq16 x y) 1770 // cond: 1771 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1772 for { 1773 _ = v.Args[1] 1774 x := v.Args[0] 1775 y := v.Args[1] 1776 v.reset(OpS390XMOVDEQ) 1777 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1778 v0.AuxInt = 0 1779 v.AddArg(v0) 1780 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1781 v1.AuxInt = 1 1782 v.AddArg(v1) 1783 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1784 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1785 v3.AddArg(x) 1786 v2.AddArg(v3) 1787 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1788 v4.AddArg(y) 1789 v2.AddArg(v4) 1790 v.AddArg(v2) 1791 return true 1792 } 1793 } 1794 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1795 b := v.Block 1796 _ = b 1797 typ := &b.Func.Config.Types 1798 _ = typ 1799 // match: (Eq32 x y) 1800 // cond: 1801 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1802 for { 1803 _ = v.Args[1] 1804 x := v.Args[0] 1805 y := v.Args[1] 1806 v.reset(OpS390XMOVDEQ) 1807 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1808 v0.AuxInt = 0 1809 v.AddArg(v0) 1810 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1811 v1.AuxInt = 1 1812 v.AddArg(v1) 1813 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1814 v2.AddArg(x) 1815 v2.AddArg(y) 1816 v.AddArg(v2) 1817 return true 1818 } 1819 } 1820 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1821 b := v.Block 1822 _ = b 1823 typ := &b.Func.Config.Types 1824 _ = typ 1825 // match: (Eq32F x y) 1826 // cond: 1827 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1828 for { 1829 _ = v.Args[1] 1830 x := v.Args[0] 1831 y := v.Args[1] 1832 v.reset(OpS390XMOVDEQ) 1833 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1834 v0.AuxInt = 0 1835 v.AddArg(v0) 1836 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1837 v1.AuxInt = 1 1838 v.AddArg(v1) 1839 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1840 v2.AddArg(x) 1841 v2.AddArg(y) 1842 v.AddArg(v2) 1843 return true 1844 } 1845 } 1846 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1847 b := v.Block 1848 _ = b 1849 typ := &b.Func.Config.Types 1850 _ = typ 1851 // match: (Eq64 x y) 1852 // cond: 1853 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1854 for { 1855 _ = v.Args[1] 1856 x := v.Args[0] 1857 y := v.Args[1] 1858 v.reset(OpS390XMOVDEQ) 1859 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1860 v0.AuxInt = 0 1861 v.AddArg(v0) 1862 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1863 v1.AuxInt = 1 1864 v.AddArg(v1) 1865 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1866 v2.AddArg(x) 1867 v2.AddArg(y) 1868 v.AddArg(v2) 1869 return true 1870 } 1871 } 1872 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1873 b := v.Block 1874 _ = b 1875 typ := &b.Func.Config.Types 1876 _ = typ 1877 // match: (Eq64F x y) 1878 // cond: 1879 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1880 for { 1881 _ = v.Args[1] 1882 x := v.Args[0] 1883 y := v.Args[1] 1884 v.reset(OpS390XMOVDEQ) 1885 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1886 v0.AuxInt = 0 1887 v.AddArg(v0) 1888 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1889 v1.AuxInt = 1 1890 v.AddArg(v1) 1891 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1892 v2.AddArg(x) 1893 v2.AddArg(y) 1894 v.AddArg(v2) 1895 return true 1896 } 1897 } 1898 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1899 b := v.Block 1900 _ = b 1901 typ := &b.Func.Config.Types 1902 _ = typ 1903 // match: (Eq8 x y) 1904 // cond: 1905 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1906 for { 1907 _ = v.Args[1] 1908 x := v.Args[0] 1909 y := v.Args[1] 1910 v.reset(OpS390XMOVDEQ) 1911 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1912 v0.AuxInt = 0 1913 v.AddArg(v0) 1914 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1915 v1.AuxInt = 1 1916 v.AddArg(v1) 1917 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1918 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1919 v3.AddArg(x) 1920 v2.AddArg(v3) 1921 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1922 v4.AddArg(y) 1923 v2.AddArg(v4) 1924 v.AddArg(v2) 1925 return true 1926 } 1927 } 1928 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1929 b := v.Block 1930 _ = b 1931 typ := &b.Func.Config.Types 1932 _ = typ 1933 // match: (EqB x y) 1934 // cond: 1935 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1936 for { 1937 _ = v.Args[1] 1938 x := v.Args[0] 1939 y := v.Args[1] 1940 v.reset(OpS390XMOVDEQ) 1941 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1942 v0.AuxInt = 0 1943 v.AddArg(v0) 1944 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1945 v1.AuxInt = 1 1946 v.AddArg(v1) 1947 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1948 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1949 v3.AddArg(x) 1950 v2.AddArg(v3) 1951 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1952 v4.AddArg(y) 1953 v2.AddArg(v4) 1954 v.AddArg(v2) 1955 return true 1956 } 1957 } 1958 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1959 b := v.Block 1960 _ = b 1961 typ := &b.Func.Config.Types 1962 _ = typ 1963 // match: (EqPtr x y) 1964 // cond: 1965 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1966 for { 1967 _ = v.Args[1] 1968 x := v.Args[0] 1969 y := v.Args[1] 1970 v.reset(OpS390XMOVDEQ) 1971 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1972 v0.AuxInt = 0 1973 v.AddArg(v0) 1974 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1975 v1.AuxInt = 1 1976 v.AddArg(v1) 1977 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1978 v2.AddArg(x) 1979 v2.AddArg(y) 1980 v.AddArg(v2) 1981 return true 1982 } 1983 } 1984 func rewriteValueS390X_OpFloor_0(v *Value) bool { 1985 // match: (Floor x) 1986 // cond: 1987 // result: (FIDBR [7] x) 1988 for { 1989 x := v.Args[0] 1990 v.reset(OpS390XFIDBR) 1991 v.AuxInt = 7 1992 v.AddArg(x) 1993 return true 1994 } 1995 } 1996 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 1997 b := v.Block 1998 _ = b 1999 typ := &b.Func.Config.Types 2000 _ = typ 2001 // match: (Geq16 x y) 2002 // cond: 2003 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2004 for { 2005 _ = v.Args[1] 2006 x := v.Args[0] 2007 y := v.Args[1] 2008 v.reset(OpS390XMOVDGE) 2009 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2010 v0.AuxInt = 0 2011 v.AddArg(v0) 2012 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2013 v1.AuxInt = 1 2014 v.AddArg(v1) 2015 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2016 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2017 v3.AddArg(x) 2018 v2.AddArg(v3) 2019 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2020 v4.AddArg(y) 2021 v2.AddArg(v4) 2022 v.AddArg(v2) 2023 return true 2024 } 2025 } 2026 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 2027 b := v.Block 2028 _ = b 2029 typ := &b.Func.Config.Types 2030 _ = typ 2031 // match: (Geq16U x y) 2032 // cond: 2033 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2034 for { 2035 _ = v.Args[1] 2036 x := v.Args[0] 2037 y := v.Args[1] 2038 v.reset(OpS390XMOVDGE) 2039 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2040 v0.AuxInt = 0 2041 v.AddArg(v0) 2042 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2043 v1.AuxInt = 1 2044 v.AddArg(v1) 2045 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2046 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2047 v3.AddArg(x) 2048 v2.AddArg(v3) 2049 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2050 v4.AddArg(y) 2051 v2.AddArg(v4) 2052 v.AddArg(v2) 2053 return true 2054 } 2055 } 2056 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 2057 b := v.Block 2058 _ = b 2059 typ := &b.Func.Config.Types 2060 _ = typ 2061 // match: (Geq32 x y) 2062 // cond: 2063 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2064 for { 2065 _ = v.Args[1] 2066 x := v.Args[0] 2067 y := v.Args[1] 2068 v.reset(OpS390XMOVDGE) 2069 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2070 v0.AuxInt = 0 2071 v.AddArg(v0) 2072 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2073 v1.AuxInt = 1 2074 v.AddArg(v1) 2075 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2076 v2.AddArg(x) 2077 v2.AddArg(y) 2078 v.AddArg(v2) 2079 return true 2080 } 2081 } 2082 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2083 b := v.Block 2084 _ = b 2085 typ := &b.Func.Config.Types 2086 _ = typ 2087 // match: (Geq32F x y) 2088 // cond: 2089 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2090 for { 2091 _ = v.Args[1] 2092 x := v.Args[0] 2093 y := v.Args[1] 2094 v.reset(OpS390XMOVDGEnoinv) 2095 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2096 v0.AuxInt = 0 2097 v.AddArg(v0) 2098 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2099 v1.AuxInt = 1 2100 v.AddArg(v1) 2101 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2102 v2.AddArg(x) 2103 v2.AddArg(y) 2104 v.AddArg(v2) 2105 return true 2106 } 2107 } 2108 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2109 b := v.Block 2110 _ = b 2111 typ := &b.Func.Config.Types 2112 _ = typ 2113 // match: (Geq32U x y) 2114 // cond: 2115 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2116 for { 2117 _ = v.Args[1] 2118 x := v.Args[0] 2119 y := v.Args[1] 2120 v.reset(OpS390XMOVDGE) 2121 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2122 v0.AuxInt = 0 2123 v.AddArg(v0) 2124 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2125 v1.AuxInt = 1 2126 v.AddArg(v1) 2127 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2128 v2.AddArg(x) 2129 v2.AddArg(y) 2130 v.AddArg(v2) 2131 return true 2132 } 2133 } 2134 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2135 b := v.Block 2136 _ = b 2137 typ := &b.Func.Config.Types 2138 _ = typ 2139 // match: (Geq64 x y) 2140 // cond: 2141 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2142 for { 2143 _ = v.Args[1] 2144 x := v.Args[0] 2145 y := v.Args[1] 2146 v.reset(OpS390XMOVDGE) 2147 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2148 v0.AuxInt = 0 2149 v.AddArg(v0) 2150 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2151 v1.AuxInt = 1 2152 v.AddArg(v1) 2153 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2154 v2.AddArg(x) 2155 v2.AddArg(y) 2156 v.AddArg(v2) 2157 return true 2158 } 2159 } 2160 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2161 b := v.Block 2162 _ = b 2163 typ := &b.Func.Config.Types 2164 _ = typ 2165 // match: (Geq64F x y) 2166 // cond: 2167 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2168 for { 2169 _ = v.Args[1] 2170 x := v.Args[0] 2171 y := v.Args[1] 2172 v.reset(OpS390XMOVDGEnoinv) 2173 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2174 v0.AuxInt = 0 2175 v.AddArg(v0) 2176 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2177 v1.AuxInt = 1 2178 v.AddArg(v1) 2179 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2180 v2.AddArg(x) 2181 v2.AddArg(y) 2182 v.AddArg(v2) 2183 return true 2184 } 2185 } 2186 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2187 b := v.Block 2188 _ = b 2189 typ := &b.Func.Config.Types 2190 _ = typ 2191 // match: (Geq64U x y) 2192 // cond: 2193 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2194 for { 2195 _ = v.Args[1] 2196 x := v.Args[0] 2197 y := v.Args[1] 2198 v.reset(OpS390XMOVDGE) 2199 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2200 v0.AuxInt = 0 2201 v.AddArg(v0) 2202 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2203 v1.AuxInt = 1 2204 v.AddArg(v1) 2205 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2206 v2.AddArg(x) 2207 v2.AddArg(y) 2208 v.AddArg(v2) 2209 return true 2210 } 2211 } 2212 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2213 b := v.Block 2214 _ = b 2215 typ := &b.Func.Config.Types 2216 _ = typ 2217 // match: (Geq8 x y) 2218 // cond: 2219 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2220 for { 2221 _ = v.Args[1] 2222 x := v.Args[0] 2223 y := v.Args[1] 2224 v.reset(OpS390XMOVDGE) 2225 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2226 v0.AuxInt = 0 2227 v.AddArg(v0) 2228 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2229 v1.AuxInt = 1 2230 v.AddArg(v1) 2231 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2232 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2233 v3.AddArg(x) 2234 v2.AddArg(v3) 2235 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2236 v4.AddArg(y) 2237 v2.AddArg(v4) 2238 v.AddArg(v2) 2239 return true 2240 } 2241 } 2242 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2243 b := v.Block 2244 _ = b 2245 typ := &b.Func.Config.Types 2246 _ = typ 2247 // match: (Geq8U x y) 2248 // cond: 2249 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2250 for { 2251 _ = v.Args[1] 2252 x := v.Args[0] 2253 y := v.Args[1] 2254 v.reset(OpS390XMOVDGE) 2255 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2256 v0.AuxInt = 0 2257 v.AddArg(v0) 2258 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2259 v1.AuxInt = 1 2260 v.AddArg(v1) 2261 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2262 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2263 v3.AddArg(x) 2264 v2.AddArg(v3) 2265 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2266 v4.AddArg(y) 2267 v2.AddArg(v4) 2268 v.AddArg(v2) 2269 return true 2270 } 2271 } 2272 func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool { 2273 // match: (GetCallerSP) 2274 // cond: 2275 // result: (LoweredGetCallerSP) 2276 for { 2277 v.reset(OpS390XLoweredGetCallerSP) 2278 return true 2279 } 2280 } 2281 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2282 // match: (GetClosurePtr) 2283 // cond: 2284 // result: (LoweredGetClosurePtr) 2285 for { 2286 v.reset(OpS390XLoweredGetClosurePtr) 2287 return true 2288 } 2289 } 2290 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2291 // match: (GetG mem) 2292 // cond: 2293 // result: (LoweredGetG mem) 2294 for { 2295 mem := v.Args[0] 2296 v.reset(OpS390XLoweredGetG) 2297 v.AddArg(mem) 2298 return true 2299 } 2300 } 2301 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2302 b := v.Block 2303 _ = b 2304 typ := &b.Func.Config.Types 2305 _ = typ 2306 // match: (Greater16 x y) 2307 // cond: 2308 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2309 for { 2310 _ = v.Args[1] 2311 x := v.Args[0] 2312 y := v.Args[1] 2313 v.reset(OpS390XMOVDGT) 2314 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2315 v0.AuxInt = 0 2316 v.AddArg(v0) 2317 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2318 v1.AuxInt = 1 2319 v.AddArg(v1) 2320 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2321 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2322 v3.AddArg(x) 2323 v2.AddArg(v3) 2324 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2325 v4.AddArg(y) 2326 v2.AddArg(v4) 2327 v.AddArg(v2) 2328 return true 2329 } 2330 } 2331 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2332 b := v.Block 2333 _ = b 2334 typ := &b.Func.Config.Types 2335 _ = typ 2336 // match: (Greater16U x y) 2337 // cond: 2338 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2339 for { 2340 _ = v.Args[1] 2341 x := v.Args[0] 2342 y := v.Args[1] 2343 v.reset(OpS390XMOVDGT) 2344 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2345 v0.AuxInt = 0 2346 v.AddArg(v0) 2347 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2348 v1.AuxInt = 1 2349 v.AddArg(v1) 2350 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2351 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2352 v3.AddArg(x) 2353 v2.AddArg(v3) 2354 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2355 v4.AddArg(y) 2356 v2.AddArg(v4) 2357 v.AddArg(v2) 2358 return true 2359 } 2360 } 2361 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2362 b := v.Block 2363 _ = b 2364 typ := &b.Func.Config.Types 2365 _ = typ 2366 // match: (Greater32 x y) 2367 // cond: 2368 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2369 for { 2370 _ = v.Args[1] 2371 x := v.Args[0] 2372 y := v.Args[1] 2373 v.reset(OpS390XMOVDGT) 2374 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2375 v0.AuxInt = 0 2376 v.AddArg(v0) 2377 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2378 v1.AuxInt = 1 2379 v.AddArg(v1) 2380 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2381 v2.AddArg(x) 2382 v2.AddArg(y) 2383 v.AddArg(v2) 2384 return true 2385 } 2386 } 2387 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2388 b := v.Block 2389 _ = b 2390 typ := &b.Func.Config.Types 2391 _ = typ 2392 // match: (Greater32F x y) 2393 // cond: 2394 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2395 for { 2396 _ = v.Args[1] 2397 x := v.Args[0] 2398 y := v.Args[1] 2399 v.reset(OpS390XMOVDGTnoinv) 2400 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2401 v0.AuxInt = 0 2402 v.AddArg(v0) 2403 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2404 v1.AuxInt = 1 2405 v.AddArg(v1) 2406 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2407 v2.AddArg(x) 2408 v2.AddArg(y) 2409 v.AddArg(v2) 2410 return true 2411 } 2412 } 2413 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2414 b := v.Block 2415 _ = b 2416 typ := &b.Func.Config.Types 2417 _ = typ 2418 // match: (Greater32U x y) 2419 // cond: 2420 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2421 for { 2422 _ = v.Args[1] 2423 x := v.Args[0] 2424 y := v.Args[1] 2425 v.reset(OpS390XMOVDGT) 2426 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2427 v0.AuxInt = 0 2428 v.AddArg(v0) 2429 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2430 v1.AuxInt = 1 2431 v.AddArg(v1) 2432 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2433 v2.AddArg(x) 2434 v2.AddArg(y) 2435 v.AddArg(v2) 2436 return true 2437 } 2438 } 2439 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2440 b := v.Block 2441 _ = b 2442 typ := &b.Func.Config.Types 2443 _ = typ 2444 // match: (Greater64 x y) 2445 // cond: 2446 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2447 for { 2448 _ = v.Args[1] 2449 x := v.Args[0] 2450 y := v.Args[1] 2451 v.reset(OpS390XMOVDGT) 2452 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2453 v0.AuxInt = 0 2454 v.AddArg(v0) 2455 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2456 v1.AuxInt = 1 2457 v.AddArg(v1) 2458 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2459 v2.AddArg(x) 2460 v2.AddArg(y) 2461 v.AddArg(v2) 2462 return true 2463 } 2464 } 2465 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2466 b := v.Block 2467 _ = b 2468 typ := &b.Func.Config.Types 2469 _ = typ 2470 // match: (Greater64F x y) 2471 // cond: 2472 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2473 for { 2474 _ = v.Args[1] 2475 x := v.Args[0] 2476 y := v.Args[1] 2477 v.reset(OpS390XMOVDGTnoinv) 2478 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2479 v0.AuxInt = 0 2480 v.AddArg(v0) 2481 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2482 v1.AuxInt = 1 2483 v.AddArg(v1) 2484 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2485 v2.AddArg(x) 2486 v2.AddArg(y) 2487 v.AddArg(v2) 2488 return true 2489 } 2490 } 2491 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2492 b := v.Block 2493 _ = b 2494 typ := &b.Func.Config.Types 2495 _ = typ 2496 // match: (Greater64U x y) 2497 // cond: 2498 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2499 for { 2500 _ = v.Args[1] 2501 x := v.Args[0] 2502 y := v.Args[1] 2503 v.reset(OpS390XMOVDGT) 2504 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2505 v0.AuxInt = 0 2506 v.AddArg(v0) 2507 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2508 v1.AuxInt = 1 2509 v.AddArg(v1) 2510 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2511 v2.AddArg(x) 2512 v2.AddArg(y) 2513 v.AddArg(v2) 2514 return true 2515 } 2516 } 2517 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2518 b := v.Block 2519 _ = b 2520 typ := &b.Func.Config.Types 2521 _ = typ 2522 // match: (Greater8 x y) 2523 // cond: 2524 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2525 for { 2526 _ = v.Args[1] 2527 x := v.Args[0] 2528 y := v.Args[1] 2529 v.reset(OpS390XMOVDGT) 2530 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2531 v0.AuxInt = 0 2532 v.AddArg(v0) 2533 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2534 v1.AuxInt = 1 2535 v.AddArg(v1) 2536 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2537 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2538 v3.AddArg(x) 2539 v2.AddArg(v3) 2540 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2541 v4.AddArg(y) 2542 v2.AddArg(v4) 2543 v.AddArg(v2) 2544 return true 2545 } 2546 } 2547 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2548 b := v.Block 2549 _ = b 2550 typ := &b.Func.Config.Types 2551 _ = typ 2552 // match: (Greater8U x y) 2553 // cond: 2554 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2555 for { 2556 _ = v.Args[1] 2557 x := v.Args[0] 2558 y := v.Args[1] 2559 v.reset(OpS390XMOVDGT) 2560 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2561 v0.AuxInt = 0 2562 v.AddArg(v0) 2563 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2564 v1.AuxInt = 1 2565 v.AddArg(v1) 2566 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2567 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2568 v3.AddArg(x) 2569 v2.AddArg(v3) 2570 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2571 v4.AddArg(y) 2572 v2.AddArg(v4) 2573 v.AddArg(v2) 2574 return true 2575 } 2576 } 2577 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2578 b := v.Block 2579 _ = b 2580 typ := &b.Func.Config.Types 2581 _ = typ 2582 // match: (Hmul32 x y) 2583 // cond: 2584 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2585 for { 2586 _ = v.Args[1] 2587 x := v.Args[0] 2588 y := v.Args[1] 2589 v.reset(OpS390XSRDconst) 2590 v.AuxInt = 32 2591 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2592 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2593 v1.AddArg(x) 2594 v0.AddArg(v1) 2595 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2596 v2.AddArg(y) 2597 v0.AddArg(v2) 2598 v.AddArg(v0) 2599 return true 2600 } 2601 } 2602 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2603 b := v.Block 2604 _ = b 2605 typ := &b.Func.Config.Types 2606 _ = typ 2607 // match: (Hmul32u x y) 2608 // cond: 2609 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2610 for { 2611 _ = v.Args[1] 2612 x := v.Args[0] 2613 y := v.Args[1] 2614 v.reset(OpS390XSRDconst) 2615 v.AuxInt = 32 2616 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2617 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2618 v1.AddArg(x) 2619 v0.AddArg(v1) 2620 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2621 v2.AddArg(y) 2622 v0.AddArg(v2) 2623 v.AddArg(v0) 2624 return true 2625 } 2626 } 2627 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2628 // match: (Hmul64 x y) 2629 // cond: 2630 // result: (MULHD x y) 2631 for { 2632 _ = v.Args[1] 2633 x := v.Args[0] 2634 y := v.Args[1] 2635 v.reset(OpS390XMULHD) 2636 v.AddArg(x) 2637 v.AddArg(y) 2638 return true 2639 } 2640 } 2641 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2642 // match: (Hmul64u x y) 2643 // cond: 2644 // result: (MULHDU x y) 2645 for { 2646 _ = v.Args[1] 2647 x := v.Args[0] 2648 y := v.Args[1] 2649 v.reset(OpS390XMULHDU) 2650 v.AddArg(x) 2651 v.AddArg(y) 2652 return true 2653 } 2654 } 2655 func rewriteValueS390X_OpITab_0(v *Value) bool { 2656 // match: (ITab (Load ptr mem)) 2657 // cond: 2658 // result: (MOVDload ptr mem) 2659 for { 2660 v_0 := v.Args[0] 2661 if v_0.Op != OpLoad { 2662 break 2663 } 2664 _ = v_0.Args[1] 2665 ptr := v_0.Args[0] 2666 mem := v_0.Args[1] 2667 v.reset(OpS390XMOVDload) 2668 v.AddArg(ptr) 2669 v.AddArg(mem) 2670 return true 2671 } 2672 return false 2673 } 2674 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2675 // match: (InterCall [argwid] entry mem) 2676 // cond: 2677 // result: (CALLinter [argwid] entry mem) 2678 for { 2679 argwid := v.AuxInt 2680 _ = v.Args[1] 2681 entry := v.Args[0] 2682 mem := v.Args[1] 2683 v.reset(OpS390XCALLinter) 2684 v.AuxInt = argwid 2685 v.AddArg(entry) 2686 v.AddArg(mem) 2687 return true 2688 } 2689 } 2690 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2691 b := v.Block 2692 _ = b 2693 typ := &b.Func.Config.Types 2694 _ = typ 2695 // match: (IsInBounds idx len) 2696 // cond: 2697 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2698 for { 2699 _ = v.Args[1] 2700 idx := v.Args[0] 2701 len := v.Args[1] 2702 v.reset(OpS390XMOVDLT) 2703 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2704 v0.AuxInt = 0 2705 v.AddArg(v0) 2706 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2707 v1.AuxInt = 1 2708 v.AddArg(v1) 2709 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2710 v2.AddArg(idx) 2711 v2.AddArg(len) 2712 v.AddArg(v2) 2713 return true 2714 } 2715 } 2716 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2717 b := v.Block 2718 _ = b 2719 typ := &b.Func.Config.Types 2720 _ = typ 2721 // match: (IsNonNil p) 2722 // cond: 2723 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2724 for { 2725 p := v.Args[0] 2726 v.reset(OpS390XMOVDNE) 2727 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2728 v0.AuxInt = 0 2729 v.AddArg(v0) 2730 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2731 v1.AuxInt = 1 2732 v.AddArg(v1) 2733 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2734 v2.AuxInt = 0 2735 v2.AddArg(p) 2736 v.AddArg(v2) 2737 return true 2738 } 2739 } 2740 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2741 b := v.Block 2742 _ = b 2743 typ := &b.Func.Config.Types 2744 _ = typ 2745 // match: (IsSliceInBounds idx len) 2746 // cond: 2747 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2748 for { 2749 _ = v.Args[1] 2750 idx := v.Args[0] 2751 len := v.Args[1] 2752 v.reset(OpS390XMOVDLE) 2753 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2754 v0.AuxInt = 0 2755 v.AddArg(v0) 2756 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2757 v1.AuxInt = 1 2758 v.AddArg(v1) 2759 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2760 v2.AddArg(idx) 2761 v2.AddArg(len) 2762 v.AddArg(v2) 2763 return true 2764 } 2765 } 2766 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2767 b := v.Block 2768 _ = b 2769 typ := &b.Func.Config.Types 2770 _ = typ 2771 // match: (Leq16 x y) 2772 // cond: 2773 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2774 for { 2775 _ = v.Args[1] 2776 x := v.Args[0] 2777 y := v.Args[1] 2778 v.reset(OpS390XMOVDLE) 2779 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2780 v0.AuxInt = 0 2781 v.AddArg(v0) 2782 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2783 v1.AuxInt = 1 2784 v.AddArg(v1) 2785 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2786 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2787 v3.AddArg(x) 2788 v2.AddArg(v3) 2789 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2790 v4.AddArg(y) 2791 v2.AddArg(v4) 2792 v.AddArg(v2) 2793 return true 2794 } 2795 } 2796 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2797 b := v.Block 2798 _ = b 2799 typ := &b.Func.Config.Types 2800 _ = typ 2801 // match: (Leq16U x y) 2802 // cond: 2803 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2804 for { 2805 _ = v.Args[1] 2806 x := v.Args[0] 2807 y := v.Args[1] 2808 v.reset(OpS390XMOVDLE) 2809 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2810 v0.AuxInt = 0 2811 v.AddArg(v0) 2812 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2813 v1.AuxInt = 1 2814 v.AddArg(v1) 2815 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2816 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2817 v3.AddArg(x) 2818 v2.AddArg(v3) 2819 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2820 v4.AddArg(y) 2821 v2.AddArg(v4) 2822 v.AddArg(v2) 2823 return true 2824 } 2825 } 2826 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2827 b := v.Block 2828 _ = b 2829 typ := &b.Func.Config.Types 2830 _ = typ 2831 // match: (Leq32 x y) 2832 // cond: 2833 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2834 for { 2835 _ = v.Args[1] 2836 x := v.Args[0] 2837 y := v.Args[1] 2838 v.reset(OpS390XMOVDLE) 2839 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2840 v0.AuxInt = 0 2841 v.AddArg(v0) 2842 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2843 v1.AuxInt = 1 2844 v.AddArg(v1) 2845 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2846 v2.AddArg(x) 2847 v2.AddArg(y) 2848 v.AddArg(v2) 2849 return true 2850 } 2851 } 2852 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2853 b := v.Block 2854 _ = b 2855 typ := &b.Func.Config.Types 2856 _ = typ 2857 // match: (Leq32F x y) 2858 // cond: 2859 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2860 for { 2861 _ = v.Args[1] 2862 x := v.Args[0] 2863 y := v.Args[1] 2864 v.reset(OpS390XMOVDGEnoinv) 2865 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2866 v0.AuxInt = 0 2867 v.AddArg(v0) 2868 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2869 v1.AuxInt = 1 2870 v.AddArg(v1) 2871 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2872 v2.AddArg(y) 2873 v2.AddArg(x) 2874 v.AddArg(v2) 2875 return true 2876 } 2877 } 2878 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2879 b := v.Block 2880 _ = b 2881 typ := &b.Func.Config.Types 2882 _ = typ 2883 // match: (Leq32U x y) 2884 // cond: 2885 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2886 for { 2887 _ = v.Args[1] 2888 x := v.Args[0] 2889 y := v.Args[1] 2890 v.reset(OpS390XMOVDLE) 2891 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2892 v0.AuxInt = 0 2893 v.AddArg(v0) 2894 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2895 v1.AuxInt = 1 2896 v.AddArg(v1) 2897 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2898 v2.AddArg(x) 2899 v2.AddArg(y) 2900 v.AddArg(v2) 2901 return true 2902 } 2903 } 2904 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2905 b := v.Block 2906 _ = b 2907 typ := &b.Func.Config.Types 2908 _ = typ 2909 // match: (Leq64 x y) 2910 // cond: 2911 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2912 for { 2913 _ = v.Args[1] 2914 x := v.Args[0] 2915 y := v.Args[1] 2916 v.reset(OpS390XMOVDLE) 2917 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2918 v0.AuxInt = 0 2919 v.AddArg(v0) 2920 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2921 v1.AuxInt = 1 2922 v.AddArg(v1) 2923 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2924 v2.AddArg(x) 2925 v2.AddArg(y) 2926 v.AddArg(v2) 2927 return true 2928 } 2929 } 2930 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2931 b := v.Block 2932 _ = b 2933 typ := &b.Func.Config.Types 2934 _ = typ 2935 // match: (Leq64F x y) 2936 // cond: 2937 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2938 for { 2939 _ = v.Args[1] 2940 x := v.Args[0] 2941 y := v.Args[1] 2942 v.reset(OpS390XMOVDGEnoinv) 2943 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2944 v0.AuxInt = 0 2945 v.AddArg(v0) 2946 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2947 v1.AuxInt = 1 2948 v.AddArg(v1) 2949 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2950 v2.AddArg(y) 2951 v2.AddArg(x) 2952 v.AddArg(v2) 2953 return true 2954 } 2955 } 2956 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2957 b := v.Block 2958 _ = b 2959 typ := &b.Func.Config.Types 2960 _ = typ 2961 // match: (Leq64U x y) 2962 // cond: 2963 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2964 for { 2965 _ = v.Args[1] 2966 x := v.Args[0] 2967 y := v.Args[1] 2968 v.reset(OpS390XMOVDLE) 2969 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2970 v0.AuxInt = 0 2971 v.AddArg(v0) 2972 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2973 v1.AuxInt = 1 2974 v.AddArg(v1) 2975 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2976 v2.AddArg(x) 2977 v2.AddArg(y) 2978 v.AddArg(v2) 2979 return true 2980 } 2981 } 2982 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 2983 b := v.Block 2984 _ = b 2985 typ := &b.Func.Config.Types 2986 _ = typ 2987 // match: (Leq8 x y) 2988 // cond: 2989 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2990 for { 2991 _ = v.Args[1] 2992 x := v.Args[0] 2993 y := v.Args[1] 2994 v.reset(OpS390XMOVDLE) 2995 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2996 v0.AuxInt = 0 2997 v.AddArg(v0) 2998 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2999 v1.AuxInt = 1 3000 v.AddArg(v1) 3001 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3002 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3003 v3.AddArg(x) 3004 v2.AddArg(v3) 3005 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3006 v4.AddArg(y) 3007 v2.AddArg(v4) 3008 v.AddArg(v2) 3009 return true 3010 } 3011 } 3012 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 3013 b := v.Block 3014 _ = b 3015 typ := &b.Func.Config.Types 3016 _ = typ 3017 // match: (Leq8U x y) 3018 // cond: 3019 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3020 for { 3021 _ = v.Args[1] 3022 x := v.Args[0] 3023 y := v.Args[1] 3024 v.reset(OpS390XMOVDLE) 3025 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3026 v0.AuxInt = 0 3027 v.AddArg(v0) 3028 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3029 v1.AuxInt = 1 3030 v.AddArg(v1) 3031 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3032 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3033 v3.AddArg(x) 3034 v2.AddArg(v3) 3035 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3036 v4.AddArg(y) 3037 v2.AddArg(v4) 3038 v.AddArg(v2) 3039 return true 3040 } 3041 } 3042 func rewriteValueS390X_OpLess16_0(v *Value) bool { 3043 b := v.Block 3044 _ = b 3045 typ := &b.Func.Config.Types 3046 _ = typ 3047 // match: (Less16 x y) 3048 // cond: 3049 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 3050 for { 3051 _ = v.Args[1] 3052 x := v.Args[0] 3053 y := v.Args[1] 3054 v.reset(OpS390XMOVDLT) 3055 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3056 v0.AuxInt = 0 3057 v.AddArg(v0) 3058 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3059 v1.AuxInt = 1 3060 v.AddArg(v1) 3061 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3062 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3063 v3.AddArg(x) 3064 v2.AddArg(v3) 3065 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3066 v4.AddArg(y) 3067 v2.AddArg(v4) 3068 v.AddArg(v2) 3069 return true 3070 } 3071 } 3072 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 3073 b := v.Block 3074 _ = b 3075 typ := &b.Func.Config.Types 3076 _ = typ 3077 // match: (Less16U x y) 3078 // cond: 3079 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 3080 for { 3081 _ = v.Args[1] 3082 x := v.Args[0] 3083 y := v.Args[1] 3084 v.reset(OpS390XMOVDLT) 3085 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3086 v0.AuxInt = 0 3087 v.AddArg(v0) 3088 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3089 v1.AuxInt = 1 3090 v.AddArg(v1) 3091 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3092 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3093 v3.AddArg(x) 3094 v2.AddArg(v3) 3095 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3096 v4.AddArg(y) 3097 v2.AddArg(v4) 3098 v.AddArg(v2) 3099 return true 3100 } 3101 } 3102 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3103 b := v.Block 3104 _ = b 3105 typ := &b.Func.Config.Types 3106 _ = typ 3107 // match: (Less32 x y) 3108 // cond: 3109 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3110 for { 3111 _ = v.Args[1] 3112 x := v.Args[0] 3113 y := v.Args[1] 3114 v.reset(OpS390XMOVDLT) 3115 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3116 v0.AuxInt = 0 3117 v.AddArg(v0) 3118 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3119 v1.AuxInt = 1 3120 v.AddArg(v1) 3121 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3122 v2.AddArg(x) 3123 v2.AddArg(y) 3124 v.AddArg(v2) 3125 return true 3126 } 3127 } 3128 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3129 b := v.Block 3130 _ = b 3131 typ := &b.Func.Config.Types 3132 _ = typ 3133 // match: (Less32F x y) 3134 // cond: 3135 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3136 for { 3137 _ = v.Args[1] 3138 x := v.Args[0] 3139 y := v.Args[1] 3140 v.reset(OpS390XMOVDGTnoinv) 3141 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3142 v0.AuxInt = 0 3143 v.AddArg(v0) 3144 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3145 v1.AuxInt = 1 3146 v.AddArg(v1) 3147 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3148 v2.AddArg(y) 3149 v2.AddArg(x) 3150 v.AddArg(v2) 3151 return true 3152 } 3153 } 3154 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3155 b := v.Block 3156 _ = b 3157 typ := &b.Func.Config.Types 3158 _ = typ 3159 // match: (Less32U x y) 3160 // cond: 3161 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3162 for { 3163 _ = v.Args[1] 3164 x := v.Args[0] 3165 y := v.Args[1] 3166 v.reset(OpS390XMOVDLT) 3167 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3168 v0.AuxInt = 0 3169 v.AddArg(v0) 3170 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3171 v1.AuxInt = 1 3172 v.AddArg(v1) 3173 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3174 v2.AddArg(x) 3175 v2.AddArg(y) 3176 v.AddArg(v2) 3177 return true 3178 } 3179 } 3180 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3181 b := v.Block 3182 _ = b 3183 typ := &b.Func.Config.Types 3184 _ = typ 3185 // match: (Less64 x y) 3186 // cond: 3187 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3188 for { 3189 _ = v.Args[1] 3190 x := v.Args[0] 3191 y := v.Args[1] 3192 v.reset(OpS390XMOVDLT) 3193 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3194 v0.AuxInt = 0 3195 v.AddArg(v0) 3196 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3197 v1.AuxInt = 1 3198 v.AddArg(v1) 3199 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3200 v2.AddArg(x) 3201 v2.AddArg(y) 3202 v.AddArg(v2) 3203 return true 3204 } 3205 } 3206 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3207 b := v.Block 3208 _ = b 3209 typ := &b.Func.Config.Types 3210 _ = typ 3211 // match: (Less64F x y) 3212 // cond: 3213 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3214 for { 3215 _ = v.Args[1] 3216 x := v.Args[0] 3217 y := v.Args[1] 3218 v.reset(OpS390XMOVDGTnoinv) 3219 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3220 v0.AuxInt = 0 3221 v.AddArg(v0) 3222 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3223 v1.AuxInt = 1 3224 v.AddArg(v1) 3225 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3226 v2.AddArg(y) 3227 v2.AddArg(x) 3228 v.AddArg(v2) 3229 return true 3230 } 3231 } 3232 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3233 b := v.Block 3234 _ = b 3235 typ := &b.Func.Config.Types 3236 _ = typ 3237 // match: (Less64U x y) 3238 // cond: 3239 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3240 for { 3241 _ = v.Args[1] 3242 x := v.Args[0] 3243 y := v.Args[1] 3244 v.reset(OpS390XMOVDLT) 3245 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3246 v0.AuxInt = 0 3247 v.AddArg(v0) 3248 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3249 v1.AuxInt = 1 3250 v.AddArg(v1) 3251 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3252 v2.AddArg(x) 3253 v2.AddArg(y) 3254 v.AddArg(v2) 3255 return true 3256 } 3257 } 3258 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3259 b := v.Block 3260 _ = b 3261 typ := &b.Func.Config.Types 3262 _ = typ 3263 // match: (Less8 x y) 3264 // cond: 3265 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3266 for { 3267 _ = v.Args[1] 3268 x := v.Args[0] 3269 y := v.Args[1] 3270 v.reset(OpS390XMOVDLT) 3271 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3272 v0.AuxInt = 0 3273 v.AddArg(v0) 3274 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3275 v1.AuxInt = 1 3276 v.AddArg(v1) 3277 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3278 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3279 v3.AddArg(x) 3280 v2.AddArg(v3) 3281 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3282 v4.AddArg(y) 3283 v2.AddArg(v4) 3284 v.AddArg(v2) 3285 return true 3286 } 3287 } 3288 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3289 b := v.Block 3290 _ = b 3291 typ := &b.Func.Config.Types 3292 _ = typ 3293 // match: (Less8U x y) 3294 // cond: 3295 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3296 for { 3297 _ = v.Args[1] 3298 x := v.Args[0] 3299 y := v.Args[1] 3300 v.reset(OpS390XMOVDLT) 3301 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3302 v0.AuxInt = 0 3303 v.AddArg(v0) 3304 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3305 v1.AuxInt = 1 3306 v.AddArg(v1) 3307 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3308 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3309 v3.AddArg(x) 3310 v2.AddArg(v3) 3311 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3312 v4.AddArg(y) 3313 v2.AddArg(v4) 3314 v.AddArg(v2) 3315 return true 3316 } 3317 } 3318 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3319 // match: (Load <t> ptr mem) 3320 // cond: (is64BitInt(t) || isPtr(t)) 3321 // result: (MOVDload ptr mem) 3322 for { 3323 t := v.Type 3324 _ = v.Args[1] 3325 ptr := v.Args[0] 3326 mem := v.Args[1] 3327 if !(is64BitInt(t) || isPtr(t)) { 3328 break 3329 } 3330 v.reset(OpS390XMOVDload) 3331 v.AddArg(ptr) 3332 v.AddArg(mem) 3333 return true 3334 } 3335 // match: (Load <t> ptr mem) 3336 // cond: is32BitInt(t) && isSigned(t) 3337 // result: (MOVWload ptr mem) 3338 for { 3339 t := v.Type 3340 _ = v.Args[1] 3341 ptr := v.Args[0] 3342 mem := v.Args[1] 3343 if !(is32BitInt(t) && isSigned(t)) { 3344 break 3345 } 3346 v.reset(OpS390XMOVWload) 3347 v.AddArg(ptr) 3348 v.AddArg(mem) 3349 return true 3350 } 3351 // match: (Load <t> ptr mem) 3352 // cond: is32BitInt(t) && !isSigned(t) 3353 // result: (MOVWZload ptr mem) 3354 for { 3355 t := v.Type 3356 _ = v.Args[1] 3357 ptr := v.Args[0] 3358 mem := v.Args[1] 3359 if !(is32BitInt(t) && !isSigned(t)) { 3360 break 3361 } 3362 v.reset(OpS390XMOVWZload) 3363 v.AddArg(ptr) 3364 v.AddArg(mem) 3365 return true 3366 } 3367 // match: (Load <t> ptr mem) 3368 // cond: is16BitInt(t) && isSigned(t) 3369 // result: (MOVHload ptr mem) 3370 for { 3371 t := v.Type 3372 _ = v.Args[1] 3373 ptr := v.Args[0] 3374 mem := v.Args[1] 3375 if !(is16BitInt(t) && isSigned(t)) { 3376 break 3377 } 3378 v.reset(OpS390XMOVHload) 3379 v.AddArg(ptr) 3380 v.AddArg(mem) 3381 return true 3382 } 3383 // match: (Load <t> ptr mem) 3384 // cond: is16BitInt(t) && !isSigned(t) 3385 // result: (MOVHZload ptr mem) 3386 for { 3387 t := v.Type 3388 _ = v.Args[1] 3389 ptr := v.Args[0] 3390 mem := v.Args[1] 3391 if !(is16BitInt(t) && !isSigned(t)) { 3392 break 3393 } 3394 v.reset(OpS390XMOVHZload) 3395 v.AddArg(ptr) 3396 v.AddArg(mem) 3397 return true 3398 } 3399 // match: (Load <t> ptr mem) 3400 // cond: is8BitInt(t) && isSigned(t) 3401 // result: (MOVBload ptr mem) 3402 for { 3403 t := v.Type 3404 _ = v.Args[1] 3405 ptr := v.Args[0] 3406 mem := v.Args[1] 3407 if !(is8BitInt(t) && isSigned(t)) { 3408 break 3409 } 3410 v.reset(OpS390XMOVBload) 3411 v.AddArg(ptr) 3412 v.AddArg(mem) 3413 return true 3414 } 3415 // match: (Load <t> ptr mem) 3416 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3417 // result: (MOVBZload ptr mem) 3418 for { 3419 t := v.Type 3420 _ = v.Args[1] 3421 ptr := v.Args[0] 3422 mem := v.Args[1] 3423 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3424 break 3425 } 3426 v.reset(OpS390XMOVBZload) 3427 v.AddArg(ptr) 3428 v.AddArg(mem) 3429 return true 3430 } 3431 // match: (Load <t> ptr mem) 3432 // cond: is32BitFloat(t) 3433 // result: (FMOVSload ptr mem) 3434 for { 3435 t := v.Type 3436 _ = v.Args[1] 3437 ptr := v.Args[0] 3438 mem := v.Args[1] 3439 if !(is32BitFloat(t)) { 3440 break 3441 } 3442 v.reset(OpS390XFMOVSload) 3443 v.AddArg(ptr) 3444 v.AddArg(mem) 3445 return true 3446 } 3447 // match: (Load <t> ptr mem) 3448 // cond: is64BitFloat(t) 3449 // result: (FMOVDload ptr mem) 3450 for { 3451 t := v.Type 3452 _ = v.Args[1] 3453 ptr := v.Args[0] 3454 mem := v.Args[1] 3455 if !(is64BitFloat(t)) { 3456 break 3457 } 3458 v.reset(OpS390XFMOVDload) 3459 v.AddArg(ptr) 3460 v.AddArg(mem) 3461 return true 3462 } 3463 return false 3464 } 3465 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3466 b := v.Block 3467 _ = b 3468 typ := &b.Func.Config.Types 3469 _ = typ 3470 // match: (Lsh16x16 <t> x y) 3471 // cond: 3472 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3473 for { 3474 t := v.Type 3475 _ = v.Args[1] 3476 x := v.Args[0] 3477 y := v.Args[1] 3478 v.reset(OpS390XANDW) 3479 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3480 v0.AddArg(x) 3481 v0.AddArg(y) 3482 v.AddArg(v0) 3483 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3484 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3485 v2.AuxInt = 31 3486 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3487 v3.AddArg(y) 3488 v2.AddArg(v3) 3489 v1.AddArg(v2) 3490 v.AddArg(v1) 3491 return true 3492 } 3493 } 3494 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3495 b := v.Block 3496 _ = b 3497 // match: (Lsh16x32 <t> x y) 3498 // cond: 3499 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3500 for { 3501 t := v.Type 3502 _ = v.Args[1] 3503 x := v.Args[0] 3504 y := v.Args[1] 3505 v.reset(OpS390XANDW) 3506 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3507 v0.AddArg(x) 3508 v0.AddArg(y) 3509 v.AddArg(v0) 3510 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3511 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3512 v2.AuxInt = 31 3513 v2.AddArg(y) 3514 v1.AddArg(v2) 3515 v.AddArg(v1) 3516 return true 3517 } 3518 } 3519 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3520 b := v.Block 3521 _ = b 3522 // match: (Lsh16x64 <t> x y) 3523 // cond: 3524 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3525 for { 3526 t := v.Type 3527 _ = v.Args[1] 3528 x := v.Args[0] 3529 y := v.Args[1] 3530 v.reset(OpS390XANDW) 3531 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3532 v0.AddArg(x) 3533 v0.AddArg(y) 3534 v.AddArg(v0) 3535 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3536 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3537 v2.AuxInt = 31 3538 v2.AddArg(y) 3539 v1.AddArg(v2) 3540 v.AddArg(v1) 3541 return true 3542 } 3543 } 3544 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3545 b := v.Block 3546 _ = b 3547 typ := &b.Func.Config.Types 3548 _ = typ 3549 // match: (Lsh16x8 <t> x y) 3550 // cond: 3551 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3552 for { 3553 t := v.Type 3554 _ = v.Args[1] 3555 x := v.Args[0] 3556 y := v.Args[1] 3557 v.reset(OpS390XANDW) 3558 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3559 v0.AddArg(x) 3560 v0.AddArg(y) 3561 v.AddArg(v0) 3562 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3563 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3564 v2.AuxInt = 31 3565 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3566 v3.AddArg(y) 3567 v2.AddArg(v3) 3568 v1.AddArg(v2) 3569 v.AddArg(v1) 3570 return true 3571 } 3572 } 3573 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3574 b := v.Block 3575 _ = b 3576 typ := &b.Func.Config.Types 3577 _ = typ 3578 // match: (Lsh32x16 <t> x y) 3579 // cond: 3580 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3581 for { 3582 t := v.Type 3583 _ = v.Args[1] 3584 x := v.Args[0] 3585 y := v.Args[1] 3586 v.reset(OpS390XANDW) 3587 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3588 v0.AddArg(x) 3589 v0.AddArg(y) 3590 v.AddArg(v0) 3591 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3592 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3593 v2.AuxInt = 31 3594 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3595 v3.AddArg(y) 3596 v2.AddArg(v3) 3597 v1.AddArg(v2) 3598 v.AddArg(v1) 3599 return true 3600 } 3601 } 3602 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3603 b := v.Block 3604 _ = b 3605 // match: (Lsh32x32 <t> x y) 3606 // cond: 3607 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3608 for { 3609 t := v.Type 3610 _ = v.Args[1] 3611 x := v.Args[0] 3612 y := v.Args[1] 3613 v.reset(OpS390XANDW) 3614 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3615 v0.AddArg(x) 3616 v0.AddArg(y) 3617 v.AddArg(v0) 3618 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3619 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3620 v2.AuxInt = 31 3621 v2.AddArg(y) 3622 v1.AddArg(v2) 3623 v.AddArg(v1) 3624 return true 3625 } 3626 } 3627 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3628 b := v.Block 3629 _ = b 3630 // match: (Lsh32x64 <t> x y) 3631 // cond: 3632 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3633 for { 3634 t := v.Type 3635 _ = v.Args[1] 3636 x := v.Args[0] 3637 y := v.Args[1] 3638 v.reset(OpS390XANDW) 3639 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3640 v0.AddArg(x) 3641 v0.AddArg(y) 3642 v.AddArg(v0) 3643 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3644 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3645 v2.AuxInt = 31 3646 v2.AddArg(y) 3647 v1.AddArg(v2) 3648 v.AddArg(v1) 3649 return true 3650 } 3651 } 3652 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3653 b := v.Block 3654 _ = b 3655 typ := &b.Func.Config.Types 3656 _ = typ 3657 // match: (Lsh32x8 <t> x y) 3658 // cond: 3659 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3660 for { 3661 t := v.Type 3662 _ = v.Args[1] 3663 x := v.Args[0] 3664 y := v.Args[1] 3665 v.reset(OpS390XANDW) 3666 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3667 v0.AddArg(x) 3668 v0.AddArg(y) 3669 v.AddArg(v0) 3670 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3671 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3672 v2.AuxInt = 31 3673 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3674 v3.AddArg(y) 3675 v2.AddArg(v3) 3676 v1.AddArg(v2) 3677 v.AddArg(v1) 3678 return true 3679 } 3680 } 3681 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3682 b := v.Block 3683 _ = b 3684 typ := &b.Func.Config.Types 3685 _ = typ 3686 // match: (Lsh64x16 <t> x y) 3687 // cond: 3688 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3689 for { 3690 t := v.Type 3691 _ = v.Args[1] 3692 x := v.Args[0] 3693 y := v.Args[1] 3694 v.reset(OpS390XAND) 3695 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3696 v0.AddArg(x) 3697 v0.AddArg(y) 3698 v.AddArg(v0) 3699 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3700 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3701 v2.AuxInt = 63 3702 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3703 v3.AddArg(y) 3704 v2.AddArg(v3) 3705 v1.AddArg(v2) 3706 v.AddArg(v1) 3707 return true 3708 } 3709 } 3710 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3711 b := v.Block 3712 _ = b 3713 // match: (Lsh64x32 <t> x y) 3714 // cond: 3715 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3716 for { 3717 t := v.Type 3718 _ = v.Args[1] 3719 x := v.Args[0] 3720 y := v.Args[1] 3721 v.reset(OpS390XAND) 3722 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3723 v0.AddArg(x) 3724 v0.AddArg(y) 3725 v.AddArg(v0) 3726 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3727 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3728 v2.AuxInt = 63 3729 v2.AddArg(y) 3730 v1.AddArg(v2) 3731 v.AddArg(v1) 3732 return true 3733 } 3734 } 3735 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3736 b := v.Block 3737 _ = b 3738 // match: (Lsh64x64 <t> x y) 3739 // cond: 3740 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3741 for { 3742 t := v.Type 3743 _ = v.Args[1] 3744 x := v.Args[0] 3745 y := v.Args[1] 3746 v.reset(OpS390XAND) 3747 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3748 v0.AddArg(x) 3749 v0.AddArg(y) 3750 v.AddArg(v0) 3751 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3752 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3753 v2.AuxInt = 63 3754 v2.AddArg(y) 3755 v1.AddArg(v2) 3756 v.AddArg(v1) 3757 return true 3758 } 3759 } 3760 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 3761 b := v.Block 3762 _ = b 3763 typ := &b.Func.Config.Types 3764 _ = typ 3765 // match: (Lsh64x8 <t> x y) 3766 // cond: 3767 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3768 for { 3769 t := v.Type 3770 _ = v.Args[1] 3771 x := v.Args[0] 3772 y := v.Args[1] 3773 v.reset(OpS390XAND) 3774 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3775 v0.AddArg(x) 3776 v0.AddArg(y) 3777 v.AddArg(v0) 3778 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3779 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3780 v2.AuxInt = 63 3781 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3782 v3.AddArg(y) 3783 v2.AddArg(v3) 3784 v1.AddArg(v2) 3785 v.AddArg(v1) 3786 return true 3787 } 3788 } 3789 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 3790 b := v.Block 3791 _ = b 3792 typ := &b.Func.Config.Types 3793 _ = typ 3794 // match: (Lsh8x16 <t> x y) 3795 // cond: 3796 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3797 for { 3798 t := v.Type 3799 _ = v.Args[1] 3800 x := v.Args[0] 3801 y := v.Args[1] 3802 v.reset(OpS390XANDW) 3803 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3804 v0.AddArg(x) 3805 v0.AddArg(y) 3806 v.AddArg(v0) 3807 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3808 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3809 v2.AuxInt = 31 3810 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3811 v3.AddArg(y) 3812 v2.AddArg(v3) 3813 v1.AddArg(v2) 3814 v.AddArg(v1) 3815 return true 3816 } 3817 } 3818 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 3819 b := v.Block 3820 _ = b 3821 // match: (Lsh8x32 <t> x y) 3822 // cond: 3823 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3824 for { 3825 t := v.Type 3826 _ = v.Args[1] 3827 x := v.Args[0] 3828 y := v.Args[1] 3829 v.reset(OpS390XANDW) 3830 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3831 v0.AddArg(x) 3832 v0.AddArg(y) 3833 v.AddArg(v0) 3834 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3835 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3836 v2.AuxInt = 31 3837 v2.AddArg(y) 3838 v1.AddArg(v2) 3839 v.AddArg(v1) 3840 return true 3841 } 3842 } 3843 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 3844 b := v.Block 3845 _ = b 3846 // match: (Lsh8x64 <t> x y) 3847 // cond: 3848 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3849 for { 3850 t := v.Type 3851 _ = v.Args[1] 3852 x := v.Args[0] 3853 y := v.Args[1] 3854 v.reset(OpS390XANDW) 3855 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3856 v0.AddArg(x) 3857 v0.AddArg(y) 3858 v.AddArg(v0) 3859 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3860 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3861 v2.AuxInt = 31 3862 v2.AddArg(y) 3863 v1.AddArg(v2) 3864 v.AddArg(v1) 3865 return true 3866 } 3867 } 3868 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 3869 b := v.Block 3870 _ = b 3871 typ := &b.Func.Config.Types 3872 _ = typ 3873 // match: (Lsh8x8 <t> x y) 3874 // cond: 3875 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3876 for { 3877 t := v.Type 3878 _ = v.Args[1] 3879 x := v.Args[0] 3880 y := v.Args[1] 3881 v.reset(OpS390XANDW) 3882 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3883 v0.AddArg(x) 3884 v0.AddArg(y) 3885 v.AddArg(v0) 3886 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3887 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3888 v2.AuxInt = 31 3889 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3890 v3.AddArg(y) 3891 v2.AddArg(v3) 3892 v1.AddArg(v2) 3893 v.AddArg(v1) 3894 return true 3895 } 3896 } 3897 func rewriteValueS390X_OpMod16_0(v *Value) bool { 3898 b := v.Block 3899 _ = b 3900 typ := &b.Func.Config.Types 3901 _ = typ 3902 // match: (Mod16 x y) 3903 // cond: 3904 // result: (MODW (MOVHreg x) (MOVHreg y)) 3905 for { 3906 _ = v.Args[1] 3907 x := v.Args[0] 3908 y := v.Args[1] 3909 v.reset(OpS390XMODW) 3910 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3911 v0.AddArg(x) 3912 v.AddArg(v0) 3913 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3914 v1.AddArg(y) 3915 v.AddArg(v1) 3916 return true 3917 } 3918 } 3919 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 3920 b := v.Block 3921 _ = b 3922 typ := &b.Func.Config.Types 3923 _ = typ 3924 // match: (Mod16u x y) 3925 // cond: 3926 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3927 for { 3928 _ = v.Args[1] 3929 x := v.Args[0] 3930 y := v.Args[1] 3931 v.reset(OpS390XMODWU) 3932 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3933 v0.AddArg(x) 3934 v.AddArg(v0) 3935 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3936 v1.AddArg(y) 3937 v.AddArg(v1) 3938 return true 3939 } 3940 } 3941 func rewriteValueS390X_OpMod32_0(v *Value) bool { 3942 b := v.Block 3943 _ = b 3944 typ := &b.Func.Config.Types 3945 _ = typ 3946 // match: (Mod32 x y) 3947 // cond: 3948 // result: (MODW (MOVWreg x) y) 3949 for { 3950 _ = v.Args[1] 3951 x := v.Args[0] 3952 y := v.Args[1] 3953 v.reset(OpS390XMODW) 3954 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 3955 v0.AddArg(x) 3956 v.AddArg(v0) 3957 v.AddArg(y) 3958 return true 3959 } 3960 } 3961 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 3962 b := v.Block 3963 _ = b 3964 typ := &b.Func.Config.Types 3965 _ = typ 3966 // match: (Mod32u x y) 3967 // cond: 3968 // result: (MODWU (MOVWZreg x) y) 3969 for { 3970 _ = v.Args[1] 3971 x := v.Args[0] 3972 y := v.Args[1] 3973 v.reset(OpS390XMODWU) 3974 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 3975 v0.AddArg(x) 3976 v.AddArg(v0) 3977 v.AddArg(y) 3978 return true 3979 } 3980 } 3981 func rewriteValueS390X_OpMod64_0(v *Value) bool { 3982 // match: (Mod64 x y) 3983 // cond: 3984 // result: (MODD x y) 3985 for { 3986 _ = v.Args[1] 3987 x := v.Args[0] 3988 y := v.Args[1] 3989 v.reset(OpS390XMODD) 3990 v.AddArg(x) 3991 v.AddArg(y) 3992 return true 3993 } 3994 } 3995 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 3996 // match: (Mod64u x y) 3997 // cond: 3998 // result: (MODDU x y) 3999 for { 4000 _ = v.Args[1] 4001 x := v.Args[0] 4002 y := v.Args[1] 4003 v.reset(OpS390XMODDU) 4004 v.AddArg(x) 4005 v.AddArg(y) 4006 return true 4007 } 4008 } 4009 func rewriteValueS390X_OpMod8_0(v *Value) bool { 4010 b := v.Block 4011 _ = b 4012 typ := &b.Func.Config.Types 4013 _ = typ 4014 // match: (Mod8 x y) 4015 // cond: 4016 // result: (MODW (MOVBreg x) (MOVBreg y)) 4017 for { 4018 _ = v.Args[1] 4019 x := v.Args[0] 4020 y := v.Args[1] 4021 v.reset(OpS390XMODW) 4022 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4023 v0.AddArg(x) 4024 v.AddArg(v0) 4025 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4026 v1.AddArg(y) 4027 v.AddArg(v1) 4028 return true 4029 } 4030 } 4031 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 4032 b := v.Block 4033 _ = b 4034 typ := &b.Func.Config.Types 4035 _ = typ 4036 // match: (Mod8u x y) 4037 // cond: 4038 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 4039 for { 4040 _ = v.Args[1] 4041 x := v.Args[0] 4042 y := v.Args[1] 4043 v.reset(OpS390XMODWU) 4044 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4045 v0.AddArg(x) 4046 v.AddArg(v0) 4047 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4048 v1.AddArg(y) 4049 v.AddArg(v1) 4050 return true 4051 } 4052 } 4053 func rewriteValueS390X_OpMove_0(v *Value) bool { 4054 b := v.Block 4055 _ = b 4056 typ := &b.Func.Config.Types 4057 _ = typ 4058 // match: (Move [0] _ _ mem) 4059 // cond: 4060 // result: mem 4061 for { 4062 if v.AuxInt != 0 { 4063 break 4064 } 4065 _ = v.Args[2] 4066 mem := v.Args[2] 4067 v.reset(OpCopy) 4068 v.Type = mem.Type 4069 v.AddArg(mem) 4070 return true 4071 } 4072 // match: (Move [1] dst src mem) 4073 // cond: 4074 // result: (MOVBstore dst (MOVBZload src mem) mem) 4075 for { 4076 if v.AuxInt != 1 { 4077 break 4078 } 4079 _ = v.Args[2] 4080 dst := v.Args[0] 4081 src := v.Args[1] 4082 mem := v.Args[2] 4083 v.reset(OpS390XMOVBstore) 4084 v.AddArg(dst) 4085 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4086 v0.AddArg(src) 4087 v0.AddArg(mem) 4088 v.AddArg(v0) 4089 v.AddArg(mem) 4090 return true 4091 } 4092 // match: (Move [2] dst src mem) 4093 // cond: 4094 // result: (MOVHstore dst (MOVHZload src mem) mem) 4095 for { 4096 if v.AuxInt != 2 { 4097 break 4098 } 4099 _ = v.Args[2] 4100 dst := v.Args[0] 4101 src := v.Args[1] 4102 mem := v.Args[2] 4103 v.reset(OpS390XMOVHstore) 4104 v.AddArg(dst) 4105 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4106 v0.AddArg(src) 4107 v0.AddArg(mem) 4108 v.AddArg(v0) 4109 v.AddArg(mem) 4110 return true 4111 } 4112 // match: (Move [4] dst src mem) 4113 // cond: 4114 // result: (MOVWstore dst (MOVWZload src mem) mem) 4115 for { 4116 if v.AuxInt != 4 { 4117 break 4118 } 4119 _ = v.Args[2] 4120 dst := v.Args[0] 4121 src := v.Args[1] 4122 mem := v.Args[2] 4123 v.reset(OpS390XMOVWstore) 4124 v.AddArg(dst) 4125 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4126 v0.AddArg(src) 4127 v0.AddArg(mem) 4128 v.AddArg(v0) 4129 v.AddArg(mem) 4130 return true 4131 } 4132 // match: (Move [8] dst src mem) 4133 // cond: 4134 // result: (MOVDstore dst (MOVDload src mem) mem) 4135 for { 4136 if v.AuxInt != 8 { 4137 break 4138 } 4139 _ = v.Args[2] 4140 dst := v.Args[0] 4141 src := v.Args[1] 4142 mem := v.Args[2] 4143 v.reset(OpS390XMOVDstore) 4144 v.AddArg(dst) 4145 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4146 v0.AddArg(src) 4147 v0.AddArg(mem) 4148 v.AddArg(v0) 4149 v.AddArg(mem) 4150 return true 4151 } 4152 // match: (Move [16] dst src mem) 4153 // cond: 4154 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4155 for { 4156 if v.AuxInt != 16 { 4157 break 4158 } 4159 _ = v.Args[2] 4160 dst := v.Args[0] 4161 src := v.Args[1] 4162 mem := v.Args[2] 4163 v.reset(OpS390XMOVDstore) 4164 v.AuxInt = 8 4165 v.AddArg(dst) 4166 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4167 v0.AuxInt = 8 4168 v0.AddArg(src) 4169 v0.AddArg(mem) 4170 v.AddArg(v0) 4171 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4172 v1.AddArg(dst) 4173 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4174 v2.AddArg(src) 4175 v2.AddArg(mem) 4176 v1.AddArg(v2) 4177 v1.AddArg(mem) 4178 v.AddArg(v1) 4179 return true 4180 } 4181 // match: (Move [24] dst src mem) 4182 // cond: 4183 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4184 for { 4185 if v.AuxInt != 24 { 4186 break 4187 } 4188 _ = v.Args[2] 4189 dst := v.Args[0] 4190 src := v.Args[1] 4191 mem := v.Args[2] 4192 v.reset(OpS390XMOVDstore) 4193 v.AuxInt = 16 4194 v.AddArg(dst) 4195 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4196 v0.AuxInt = 16 4197 v0.AddArg(src) 4198 v0.AddArg(mem) 4199 v.AddArg(v0) 4200 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4201 v1.AuxInt = 8 4202 v1.AddArg(dst) 4203 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4204 v2.AuxInt = 8 4205 v2.AddArg(src) 4206 v2.AddArg(mem) 4207 v1.AddArg(v2) 4208 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4209 v3.AddArg(dst) 4210 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4211 v4.AddArg(src) 4212 v4.AddArg(mem) 4213 v3.AddArg(v4) 4214 v3.AddArg(mem) 4215 v1.AddArg(v3) 4216 v.AddArg(v1) 4217 return true 4218 } 4219 // match: (Move [3] dst src mem) 4220 // cond: 4221 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4222 for { 4223 if v.AuxInt != 3 { 4224 break 4225 } 4226 _ = v.Args[2] 4227 dst := v.Args[0] 4228 src := v.Args[1] 4229 mem := v.Args[2] 4230 v.reset(OpS390XMOVBstore) 4231 v.AuxInt = 2 4232 v.AddArg(dst) 4233 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4234 v0.AuxInt = 2 4235 v0.AddArg(src) 4236 v0.AddArg(mem) 4237 v.AddArg(v0) 4238 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4239 v1.AddArg(dst) 4240 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4241 v2.AddArg(src) 4242 v2.AddArg(mem) 4243 v1.AddArg(v2) 4244 v1.AddArg(mem) 4245 v.AddArg(v1) 4246 return true 4247 } 4248 // match: (Move [5] dst src mem) 4249 // cond: 4250 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4251 for { 4252 if v.AuxInt != 5 { 4253 break 4254 } 4255 _ = v.Args[2] 4256 dst := v.Args[0] 4257 src := v.Args[1] 4258 mem := v.Args[2] 4259 v.reset(OpS390XMOVBstore) 4260 v.AuxInt = 4 4261 v.AddArg(dst) 4262 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4263 v0.AuxInt = 4 4264 v0.AddArg(src) 4265 v0.AddArg(mem) 4266 v.AddArg(v0) 4267 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4268 v1.AddArg(dst) 4269 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4270 v2.AddArg(src) 4271 v2.AddArg(mem) 4272 v1.AddArg(v2) 4273 v1.AddArg(mem) 4274 v.AddArg(v1) 4275 return true 4276 } 4277 // match: (Move [6] dst src mem) 4278 // cond: 4279 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4280 for { 4281 if v.AuxInt != 6 { 4282 break 4283 } 4284 _ = v.Args[2] 4285 dst := v.Args[0] 4286 src := v.Args[1] 4287 mem := v.Args[2] 4288 v.reset(OpS390XMOVHstore) 4289 v.AuxInt = 4 4290 v.AddArg(dst) 4291 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4292 v0.AuxInt = 4 4293 v0.AddArg(src) 4294 v0.AddArg(mem) 4295 v.AddArg(v0) 4296 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4297 v1.AddArg(dst) 4298 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4299 v2.AddArg(src) 4300 v2.AddArg(mem) 4301 v1.AddArg(v2) 4302 v1.AddArg(mem) 4303 v.AddArg(v1) 4304 return true 4305 } 4306 return false 4307 } 4308 func rewriteValueS390X_OpMove_10(v *Value) bool { 4309 b := v.Block 4310 _ = b 4311 typ := &b.Func.Config.Types 4312 _ = typ 4313 // match: (Move [7] dst src mem) 4314 // cond: 4315 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4316 for { 4317 if v.AuxInt != 7 { 4318 break 4319 } 4320 _ = v.Args[2] 4321 dst := v.Args[0] 4322 src := v.Args[1] 4323 mem := v.Args[2] 4324 v.reset(OpS390XMOVBstore) 4325 v.AuxInt = 6 4326 v.AddArg(dst) 4327 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4328 v0.AuxInt = 6 4329 v0.AddArg(src) 4330 v0.AddArg(mem) 4331 v.AddArg(v0) 4332 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4333 v1.AuxInt = 4 4334 v1.AddArg(dst) 4335 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4336 v2.AuxInt = 4 4337 v2.AddArg(src) 4338 v2.AddArg(mem) 4339 v1.AddArg(v2) 4340 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4341 v3.AddArg(dst) 4342 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4343 v4.AddArg(src) 4344 v4.AddArg(mem) 4345 v3.AddArg(v4) 4346 v3.AddArg(mem) 4347 v1.AddArg(v3) 4348 v.AddArg(v1) 4349 return true 4350 } 4351 // match: (Move [s] dst src mem) 4352 // cond: s > 0 && s <= 256 4353 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4354 for { 4355 s := v.AuxInt 4356 _ = v.Args[2] 4357 dst := v.Args[0] 4358 src := v.Args[1] 4359 mem := v.Args[2] 4360 if !(s > 0 && s <= 256) { 4361 break 4362 } 4363 v.reset(OpS390XMVC) 4364 v.AuxInt = makeValAndOff(s, 0) 4365 v.AddArg(dst) 4366 v.AddArg(src) 4367 v.AddArg(mem) 4368 return true 4369 } 4370 // match: (Move [s] dst src mem) 4371 // cond: s > 256 && s <= 512 4372 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4373 for { 4374 s := v.AuxInt 4375 _ = v.Args[2] 4376 dst := v.Args[0] 4377 src := v.Args[1] 4378 mem := v.Args[2] 4379 if !(s > 256 && s <= 512) { 4380 break 4381 } 4382 v.reset(OpS390XMVC) 4383 v.AuxInt = makeValAndOff(s-256, 256) 4384 v.AddArg(dst) 4385 v.AddArg(src) 4386 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4387 v0.AuxInt = makeValAndOff(256, 0) 4388 v0.AddArg(dst) 4389 v0.AddArg(src) 4390 v0.AddArg(mem) 4391 v.AddArg(v0) 4392 return true 4393 } 4394 // match: (Move [s] dst src mem) 4395 // cond: s > 512 && s <= 768 4396 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4397 for { 4398 s := v.AuxInt 4399 _ = v.Args[2] 4400 dst := v.Args[0] 4401 src := v.Args[1] 4402 mem := v.Args[2] 4403 if !(s > 512 && s <= 768) { 4404 break 4405 } 4406 v.reset(OpS390XMVC) 4407 v.AuxInt = makeValAndOff(s-512, 512) 4408 v.AddArg(dst) 4409 v.AddArg(src) 4410 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4411 v0.AuxInt = makeValAndOff(256, 256) 4412 v0.AddArg(dst) 4413 v0.AddArg(src) 4414 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4415 v1.AuxInt = makeValAndOff(256, 0) 4416 v1.AddArg(dst) 4417 v1.AddArg(src) 4418 v1.AddArg(mem) 4419 v0.AddArg(v1) 4420 v.AddArg(v0) 4421 return true 4422 } 4423 // match: (Move [s] dst src mem) 4424 // cond: s > 768 && s <= 1024 4425 // 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)))) 4426 for { 4427 s := v.AuxInt 4428 _ = v.Args[2] 4429 dst := v.Args[0] 4430 src := v.Args[1] 4431 mem := v.Args[2] 4432 if !(s > 768 && s <= 1024) { 4433 break 4434 } 4435 v.reset(OpS390XMVC) 4436 v.AuxInt = makeValAndOff(s-768, 768) 4437 v.AddArg(dst) 4438 v.AddArg(src) 4439 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4440 v0.AuxInt = makeValAndOff(256, 512) 4441 v0.AddArg(dst) 4442 v0.AddArg(src) 4443 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4444 v1.AuxInt = makeValAndOff(256, 256) 4445 v1.AddArg(dst) 4446 v1.AddArg(src) 4447 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4448 v2.AuxInt = makeValAndOff(256, 0) 4449 v2.AddArg(dst) 4450 v2.AddArg(src) 4451 v2.AddArg(mem) 4452 v1.AddArg(v2) 4453 v0.AddArg(v1) 4454 v.AddArg(v0) 4455 return true 4456 } 4457 // match: (Move [s] dst src mem) 4458 // cond: s > 1024 4459 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4460 for { 4461 s := v.AuxInt 4462 _ = v.Args[2] 4463 dst := v.Args[0] 4464 src := v.Args[1] 4465 mem := v.Args[2] 4466 if !(s > 1024) { 4467 break 4468 } 4469 v.reset(OpS390XLoweredMove) 4470 v.AuxInt = s % 256 4471 v.AddArg(dst) 4472 v.AddArg(src) 4473 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4474 v0.AuxInt = (s / 256) * 256 4475 v0.AddArg(src) 4476 v.AddArg(v0) 4477 v.AddArg(mem) 4478 return true 4479 } 4480 return false 4481 } 4482 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4483 // match: (Mul16 x y) 4484 // cond: 4485 // result: (MULLW x y) 4486 for { 4487 _ = v.Args[1] 4488 x := v.Args[0] 4489 y := v.Args[1] 4490 v.reset(OpS390XMULLW) 4491 v.AddArg(x) 4492 v.AddArg(y) 4493 return true 4494 } 4495 } 4496 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4497 // match: (Mul32 x y) 4498 // cond: 4499 // result: (MULLW x y) 4500 for { 4501 _ = v.Args[1] 4502 x := v.Args[0] 4503 y := v.Args[1] 4504 v.reset(OpS390XMULLW) 4505 v.AddArg(x) 4506 v.AddArg(y) 4507 return true 4508 } 4509 } 4510 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4511 // match: (Mul32F x y) 4512 // cond: 4513 // result: (FMULS x y) 4514 for { 4515 _ = v.Args[1] 4516 x := v.Args[0] 4517 y := v.Args[1] 4518 v.reset(OpS390XFMULS) 4519 v.AddArg(x) 4520 v.AddArg(y) 4521 return true 4522 } 4523 } 4524 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4525 // match: (Mul64 x y) 4526 // cond: 4527 // result: (MULLD x y) 4528 for { 4529 _ = v.Args[1] 4530 x := v.Args[0] 4531 y := v.Args[1] 4532 v.reset(OpS390XMULLD) 4533 v.AddArg(x) 4534 v.AddArg(y) 4535 return true 4536 } 4537 } 4538 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4539 // match: (Mul64F x y) 4540 // cond: 4541 // result: (FMUL x y) 4542 for { 4543 _ = v.Args[1] 4544 x := v.Args[0] 4545 y := v.Args[1] 4546 v.reset(OpS390XFMUL) 4547 v.AddArg(x) 4548 v.AddArg(y) 4549 return true 4550 } 4551 } 4552 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4553 // match: (Mul8 x y) 4554 // cond: 4555 // result: (MULLW x y) 4556 for { 4557 _ = v.Args[1] 4558 x := v.Args[0] 4559 y := v.Args[1] 4560 v.reset(OpS390XMULLW) 4561 v.AddArg(x) 4562 v.AddArg(y) 4563 return true 4564 } 4565 } 4566 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4567 b := v.Block 4568 _ = b 4569 typ := &b.Func.Config.Types 4570 _ = typ 4571 // match: (Neg16 x) 4572 // cond: 4573 // result: (NEGW (MOVHreg x)) 4574 for { 4575 x := v.Args[0] 4576 v.reset(OpS390XNEGW) 4577 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4578 v0.AddArg(x) 4579 v.AddArg(v0) 4580 return true 4581 } 4582 } 4583 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4584 // match: (Neg32 x) 4585 // cond: 4586 // result: (NEGW x) 4587 for { 4588 x := v.Args[0] 4589 v.reset(OpS390XNEGW) 4590 v.AddArg(x) 4591 return true 4592 } 4593 } 4594 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4595 // match: (Neg32F x) 4596 // cond: 4597 // result: (FNEGS x) 4598 for { 4599 x := v.Args[0] 4600 v.reset(OpS390XFNEGS) 4601 v.AddArg(x) 4602 return true 4603 } 4604 } 4605 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4606 // match: (Neg64 x) 4607 // cond: 4608 // result: (NEG x) 4609 for { 4610 x := v.Args[0] 4611 v.reset(OpS390XNEG) 4612 v.AddArg(x) 4613 return true 4614 } 4615 } 4616 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4617 // match: (Neg64F x) 4618 // cond: 4619 // result: (FNEG x) 4620 for { 4621 x := v.Args[0] 4622 v.reset(OpS390XFNEG) 4623 v.AddArg(x) 4624 return true 4625 } 4626 } 4627 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4628 b := v.Block 4629 _ = b 4630 typ := &b.Func.Config.Types 4631 _ = typ 4632 // match: (Neg8 x) 4633 // cond: 4634 // result: (NEGW (MOVBreg x)) 4635 for { 4636 x := v.Args[0] 4637 v.reset(OpS390XNEGW) 4638 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4639 v0.AddArg(x) 4640 v.AddArg(v0) 4641 return true 4642 } 4643 } 4644 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4645 b := v.Block 4646 _ = b 4647 typ := &b.Func.Config.Types 4648 _ = typ 4649 // match: (Neq16 x y) 4650 // cond: 4651 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4652 for { 4653 _ = v.Args[1] 4654 x := v.Args[0] 4655 y := v.Args[1] 4656 v.reset(OpS390XMOVDNE) 4657 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4658 v0.AuxInt = 0 4659 v.AddArg(v0) 4660 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4661 v1.AuxInt = 1 4662 v.AddArg(v1) 4663 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4664 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4665 v3.AddArg(x) 4666 v2.AddArg(v3) 4667 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4668 v4.AddArg(y) 4669 v2.AddArg(v4) 4670 v.AddArg(v2) 4671 return true 4672 } 4673 } 4674 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 4675 b := v.Block 4676 _ = b 4677 typ := &b.Func.Config.Types 4678 _ = typ 4679 // match: (Neq32 x y) 4680 // cond: 4681 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4682 for { 4683 _ = v.Args[1] 4684 x := v.Args[0] 4685 y := v.Args[1] 4686 v.reset(OpS390XMOVDNE) 4687 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4688 v0.AuxInt = 0 4689 v.AddArg(v0) 4690 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4691 v1.AuxInt = 1 4692 v.AddArg(v1) 4693 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4694 v2.AddArg(x) 4695 v2.AddArg(y) 4696 v.AddArg(v2) 4697 return true 4698 } 4699 } 4700 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 4701 b := v.Block 4702 _ = b 4703 typ := &b.Func.Config.Types 4704 _ = typ 4705 // match: (Neq32F x y) 4706 // cond: 4707 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4708 for { 4709 _ = v.Args[1] 4710 x := v.Args[0] 4711 y := v.Args[1] 4712 v.reset(OpS390XMOVDNE) 4713 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4714 v0.AuxInt = 0 4715 v.AddArg(v0) 4716 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4717 v1.AuxInt = 1 4718 v.AddArg(v1) 4719 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 4720 v2.AddArg(x) 4721 v2.AddArg(y) 4722 v.AddArg(v2) 4723 return true 4724 } 4725 } 4726 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 4727 b := v.Block 4728 _ = b 4729 typ := &b.Func.Config.Types 4730 _ = typ 4731 // match: (Neq64 x y) 4732 // cond: 4733 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4734 for { 4735 _ = v.Args[1] 4736 x := v.Args[0] 4737 y := v.Args[1] 4738 v.reset(OpS390XMOVDNE) 4739 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4740 v0.AuxInt = 0 4741 v.AddArg(v0) 4742 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4743 v1.AuxInt = 1 4744 v.AddArg(v1) 4745 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4746 v2.AddArg(x) 4747 v2.AddArg(y) 4748 v.AddArg(v2) 4749 return true 4750 } 4751 } 4752 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 4753 b := v.Block 4754 _ = b 4755 typ := &b.Func.Config.Types 4756 _ = typ 4757 // match: (Neq64F x y) 4758 // cond: 4759 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4760 for { 4761 _ = v.Args[1] 4762 x := v.Args[0] 4763 y := v.Args[1] 4764 v.reset(OpS390XMOVDNE) 4765 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4766 v0.AuxInt = 0 4767 v.AddArg(v0) 4768 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4769 v1.AuxInt = 1 4770 v.AddArg(v1) 4771 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 4772 v2.AddArg(x) 4773 v2.AddArg(y) 4774 v.AddArg(v2) 4775 return true 4776 } 4777 } 4778 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 4779 b := v.Block 4780 _ = b 4781 typ := &b.Func.Config.Types 4782 _ = typ 4783 // match: (Neq8 x y) 4784 // cond: 4785 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4786 for { 4787 _ = v.Args[1] 4788 x := v.Args[0] 4789 y := v.Args[1] 4790 v.reset(OpS390XMOVDNE) 4791 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4792 v0.AuxInt = 0 4793 v.AddArg(v0) 4794 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4795 v1.AuxInt = 1 4796 v.AddArg(v1) 4797 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4798 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4799 v3.AddArg(x) 4800 v2.AddArg(v3) 4801 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4802 v4.AddArg(y) 4803 v2.AddArg(v4) 4804 v.AddArg(v2) 4805 return true 4806 } 4807 } 4808 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 4809 b := v.Block 4810 _ = b 4811 typ := &b.Func.Config.Types 4812 _ = typ 4813 // match: (NeqB x y) 4814 // cond: 4815 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4816 for { 4817 _ = v.Args[1] 4818 x := v.Args[0] 4819 y := v.Args[1] 4820 v.reset(OpS390XMOVDNE) 4821 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4822 v0.AuxInt = 0 4823 v.AddArg(v0) 4824 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4825 v1.AuxInt = 1 4826 v.AddArg(v1) 4827 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4828 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4829 v3.AddArg(x) 4830 v2.AddArg(v3) 4831 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4832 v4.AddArg(y) 4833 v2.AddArg(v4) 4834 v.AddArg(v2) 4835 return true 4836 } 4837 } 4838 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 4839 b := v.Block 4840 _ = b 4841 typ := &b.Func.Config.Types 4842 _ = typ 4843 // match: (NeqPtr x y) 4844 // cond: 4845 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4846 for { 4847 _ = v.Args[1] 4848 x := v.Args[0] 4849 y := v.Args[1] 4850 v.reset(OpS390XMOVDNE) 4851 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4852 v0.AuxInt = 0 4853 v.AddArg(v0) 4854 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4855 v1.AuxInt = 1 4856 v.AddArg(v1) 4857 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4858 v2.AddArg(x) 4859 v2.AddArg(y) 4860 v.AddArg(v2) 4861 return true 4862 } 4863 } 4864 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 4865 // match: (NilCheck ptr mem) 4866 // cond: 4867 // result: (LoweredNilCheck ptr mem) 4868 for { 4869 _ = v.Args[1] 4870 ptr := v.Args[0] 4871 mem := v.Args[1] 4872 v.reset(OpS390XLoweredNilCheck) 4873 v.AddArg(ptr) 4874 v.AddArg(mem) 4875 return true 4876 } 4877 } 4878 func rewriteValueS390X_OpNot_0(v *Value) bool { 4879 // match: (Not x) 4880 // cond: 4881 // result: (XORWconst [1] x) 4882 for { 4883 x := v.Args[0] 4884 v.reset(OpS390XXORWconst) 4885 v.AuxInt = 1 4886 v.AddArg(x) 4887 return true 4888 } 4889 } 4890 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 4891 b := v.Block 4892 _ = b 4893 typ := &b.Func.Config.Types 4894 _ = typ 4895 // match: (OffPtr [off] ptr:(SP)) 4896 // cond: 4897 // result: (MOVDaddr [off] ptr) 4898 for { 4899 off := v.AuxInt 4900 ptr := v.Args[0] 4901 if ptr.Op != OpSP { 4902 break 4903 } 4904 v.reset(OpS390XMOVDaddr) 4905 v.AuxInt = off 4906 v.AddArg(ptr) 4907 return true 4908 } 4909 // match: (OffPtr [off] ptr) 4910 // cond: is32Bit(off) 4911 // result: (ADDconst [off] ptr) 4912 for { 4913 off := v.AuxInt 4914 ptr := v.Args[0] 4915 if !(is32Bit(off)) { 4916 break 4917 } 4918 v.reset(OpS390XADDconst) 4919 v.AuxInt = off 4920 v.AddArg(ptr) 4921 return true 4922 } 4923 // match: (OffPtr [off] ptr) 4924 // cond: 4925 // result: (ADD (MOVDconst [off]) ptr) 4926 for { 4927 off := v.AuxInt 4928 ptr := v.Args[0] 4929 v.reset(OpS390XADD) 4930 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4931 v0.AuxInt = off 4932 v.AddArg(v0) 4933 v.AddArg(ptr) 4934 return true 4935 } 4936 } 4937 func rewriteValueS390X_OpOr16_0(v *Value) bool { 4938 // match: (Or16 x y) 4939 // cond: 4940 // result: (ORW x y) 4941 for { 4942 _ = v.Args[1] 4943 x := v.Args[0] 4944 y := v.Args[1] 4945 v.reset(OpS390XORW) 4946 v.AddArg(x) 4947 v.AddArg(y) 4948 return true 4949 } 4950 } 4951 func rewriteValueS390X_OpOr32_0(v *Value) bool { 4952 // match: (Or32 x y) 4953 // cond: 4954 // result: (ORW x y) 4955 for { 4956 _ = v.Args[1] 4957 x := v.Args[0] 4958 y := v.Args[1] 4959 v.reset(OpS390XORW) 4960 v.AddArg(x) 4961 v.AddArg(y) 4962 return true 4963 } 4964 } 4965 func rewriteValueS390X_OpOr64_0(v *Value) bool { 4966 // match: (Or64 x y) 4967 // cond: 4968 // result: (OR x y) 4969 for { 4970 _ = v.Args[1] 4971 x := v.Args[0] 4972 y := v.Args[1] 4973 v.reset(OpS390XOR) 4974 v.AddArg(x) 4975 v.AddArg(y) 4976 return true 4977 } 4978 } 4979 func rewriteValueS390X_OpOr8_0(v *Value) bool { 4980 // match: (Or8 x y) 4981 // cond: 4982 // result: (ORW x y) 4983 for { 4984 _ = v.Args[1] 4985 x := v.Args[0] 4986 y := v.Args[1] 4987 v.reset(OpS390XORW) 4988 v.AddArg(x) 4989 v.AddArg(y) 4990 return true 4991 } 4992 } 4993 func rewriteValueS390X_OpOrB_0(v *Value) bool { 4994 // match: (OrB x y) 4995 // cond: 4996 // result: (ORW x y) 4997 for { 4998 _ = v.Args[1] 4999 x := v.Args[0] 5000 y := v.Args[1] 5001 v.reset(OpS390XORW) 5002 v.AddArg(x) 5003 v.AddArg(y) 5004 return true 5005 } 5006 } 5007 func rewriteValueS390X_OpRound_0(v *Value) bool { 5008 // match: (Round x) 5009 // cond: 5010 // result: (FIDBR [1] x) 5011 for { 5012 x := v.Args[0] 5013 v.reset(OpS390XFIDBR) 5014 v.AuxInt = 1 5015 v.AddArg(x) 5016 return true 5017 } 5018 } 5019 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 5020 // match: (Round32F x) 5021 // cond: 5022 // result: (LoweredRound32F x) 5023 for { 5024 x := v.Args[0] 5025 v.reset(OpS390XLoweredRound32F) 5026 v.AddArg(x) 5027 return true 5028 } 5029 } 5030 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 5031 // match: (Round64F x) 5032 // cond: 5033 // result: (LoweredRound64F x) 5034 for { 5035 x := v.Args[0] 5036 v.reset(OpS390XLoweredRound64F) 5037 v.AddArg(x) 5038 return true 5039 } 5040 } 5041 func rewriteValueS390X_OpRoundToEven_0(v *Value) bool { 5042 // match: (RoundToEven x) 5043 // cond: 5044 // result: (FIDBR [4] x) 5045 for { 5046 x := v.Args[0] 5047 v.reset(OpS390XFIDBR) 5048 v.AuxInt = 4 5049 v.AddArg(x) 5050 return true 5051 } 5052 } 5053 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 5054 b := v.Block 5055 _ = b 5056 typ := &b.Func.Config.Types 5057 _ = typ 5058 // match: (Rsh16Ux16 <t> x y) 5059 // cond: 5060 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 5061 for { 5062 t := v.Type 5063 _ = v.Args[1] 5064 x := v.Args[0] 5065 y := v.Args[1] 5066 v.reset(OpS390XANDW) 5067 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5068 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5069 v1.AddArg(x) 5070 v0.AddArg(v1) 5071 v0.AddArg(y) 5072 v.AddArg(v0) 5073 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5074 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5075 v3.AuxInt = 15 5076 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5077 v4.AddArg(y) 5078 v3.AddArg(v4) 5079 v2.AddArg(v3) 5080 v.AddArg(v2) 5081 return true 5082 } 5083 } 5084 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 5085 b := v.Block 5086 _ = b 5087 typ := &b.Func.Config.Types 5088 _ = typ 5089 // match: (Rsh16Ux32 <t> x y) 5090 // cond: 5091 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 5092 for { 5093 t := v.Type 5094 _ = v.Args[1] 5095 x := v.Args[0] 5096 y := v.Args[1] 5097 v.reset(OpS390XANDW) 5098 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5099 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5100 v1.AddArg(x) 5101 v0.AddArg(v1) 5102 v0.AddArg(y) 5103 v.AddArg(v0) 5104 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5105 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5106 v3.AuxInt = 15 5107 v3.AddArg(y) 5108 v2.AddArg(v3) 5109 v.AddArg(v2) 5110 return true 5111 } 5112 } 5113 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 5114 b := v.Block 5115 _ = b 5116 typ := &b.Func.Config.Types 5117 _ = typ 5118 // match: (Rsh16Ux64 <t> x y) 5119 // cond: 5120 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 5121 for { 5122 t := v.Type 5123 _ = v.Args[1] 5124 x := v.Args[0] 5125 y := v.Args[1] 5126 v.reset(OpS390XANDW) 5127 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5128 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5129 v1.AddArg(x) 5130 v0.AddArg(v1) 5131 v0.AddArg(y) 5132 v.AddArg(v0) 5133 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5134 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5135 v3.AuxInt = 15 5136 v3.AddArg(y) 5137 v2.AddArg(v3) 5138 v.AddArg(v2) 5139 return true 5140 } 5141 } 5142 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5143 b := v.Block 5144 _ = b 5145 typ := &b.Func.Config.Types 5146 _ = typ 5147 // match: (Rsh16Ux8 <t> x y) 5148 // cond: 5149 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 5150 for { 5151 t := v.Type 5152 _ = v.Args[1] 5153 x := v.Args[0] 5154 y := v.Args[1] 5155 v.reset(OpS390XANDW) 5156 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5157 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5158 v1.AddArg(x) 5159 v0.AddArg(v1) 5160 v0.AddArg(y) 5161 v.AddArg(v0) 5162 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5163 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5164 v3.AuxInt = 15 5165 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5166 v4.AddArg(y) 5167 v3.AddArg(v4) 5168 v2.AddArg(v3) 5169 v.AddArg(v2) 5170 return true 5171 } 5172 } 5173 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5174 b := v.Block 5175 _ = b 5176 typ := &b.Func.Config.Types 5177 _ = typ 5178 // match: (Rsh16x16 <t> x y) 5179 // cond: 5180 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 5181 for { 5182 t := v.Type 5183 _ = v.Args[1] 5184 x := v.Args[0] 5185 y := v.Args[1] 5186 v.reset(OpS390XSRAW) 5187 v.Type = t 5188 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5189 v0.AddArg(x) 5190 v.AddArg(v0) 5191 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5192 v1.AddArg(y) 5193 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5194 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5195 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5196 v4.AuxInt = 15 5197 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5198 v5.AddArg(y) 5199 v4.AddArg(v5) 5200 v3.AddArg(v4) 5201 v2.AddArg(v3) 5202 v1.AddArg(v2) 5203 v.AddArg(v1) 5204 return true 5205 } 5206 } 5207 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5208 b := v.Block 5209 _ = b 5210 typ := &b.Func.Config.Types 5211 _ = typ 5212 // match: (Rsh16x32 <t> x y) 5213 // cond: 5214 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 5215 for { 5216 t := v.Type 5217 _ = v.Args[1] 5218 x := v.Args[0] 5219 y := v.Args[1] 5220 v.reset(OpS390XSRAW) 5221 v.Type = t 5222 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5223 v0.AddArg(x) 5224 v.AddArg(v0) 5225 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5226 v1.AddArg(y) 5227 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5228 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5229 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5230 v4.AuxInt = 15 5231 v4.AddArg(y) 5232 v3.AddArg(v4) 5233 v2.AddArg(v3) 5234 v1.AddArg(v2) 5235 v.AddArg(v1) 5236 return true 5237 } 5238 } 5239 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5240 b := v.Block 5241 _ = b 5242 typ := &b.Func.Config.Types 5243 _ = typ 5244 // match: (Rsh16x64 <t> x y) 5245 // cond: 5246 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 5247 for { 5248 t := v.Type 5249 _ = v.Args[1] 5250 x := v.Args[0] 5251 y := v.Args[1] 5252 v.reset(OpS390XSRAW) 5253 v.Type = t 5254 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5255 v0.AddArg(x) 5256 v.AddArg(v0) 5257 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5258 v1.AddArg(y) 5259 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5260 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5261 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5262 v4.AuxInt = 15 5263 v4.AddArg(y) 5264 v3.AddArg(v4) 5265 v2.AddArg(v3) 5266 v1.AddArg(v2) 5267 v.AddArg(v1) 5268 return true 5269 } 5270 } 5271 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5272 b := v.Block 5273 _ = b 5274 typ := &b.Func.Config.Types 5275 _ = typ 5276 // match: (Rsh16x8 <t> x y) 5277 // cond: 5278 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 5279 for { 5280 t := v.Type 5281 _ = v.Args[1] 5282 x := v.Args[0] 5283 y := v.Args[1] 5284 v.reset(OpS390XSRAW) 5285 v.Type = t 5286 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5287 v0.AddArg(x) 5288 v.AddArg(v0) 5289 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5290 v1.AddArg(y) 5291 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5292 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5293 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5294 v4.AuxInt = 15 5295 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5296 v5.AddArg(y) 5297 v4.AddArg(v5) 5298 v3.AddArg(v4) 5299 v2.AddArg(v3) 5300 v1.AddArg(v2) 5301 v.AddArg(v1) 5302 return true 5303 } 5304 } 5305 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5306 b := v.Block 5307 _ = b 5308 typ := &b.Func.Config.Types 5309 _ = typ 5310 // match: (Rsh32Ux16 <t> x y) 5311 // cond: 5312 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5313 for { 5314 t := v.Type 5315 _ = v.Args[1] 5316 x := v.Args[0] 5317 y := v.Args[1] 5318 v.reset(OpS390XANDW) 5319 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5320 v0.AddArg(x) 5321 v0.AddArg(y) 5322 v.AddArg(v0) 5323 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5324 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5325 v2.AuxInt = 31 5326 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5327 v3.AddArg(y) 5328 v2.AddArg(v3) 5329 v1.AddArg(v2) 5330 v.AddArg(v1) 5331 return true 5332 } 5333 } 5334 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5335 b := v.Block 5336 _ = b 5337 // match: (Rsh32Ux32 <t> x y) 5338 // cond: 5339 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5340 for { 5341 t := v.Type 5342 _ = v.Args[1] 5343 x := v.Args[0] 5344 y := v.Args[1] 5345 v.reset(OpS390XANDW) 5346 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5347 v0.AddArg(x) 5348 v0.AddArg(y) 5349 v.AddArg(v0) 5350 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5351 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5352 v2.AuxInt = 31 5353 v2.AddArg(y) 5354 v1.AddArg(v2) 5355 v.AddArg(v1) 5356 return true 5357 } 5358 } 5359 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5360 b := v.Block 5361 _ = b 5362 // match: (Rsh32Ux64 <t> x y) 5363 // cond: 5364 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5365 for { 5366 t := v.Type 5367 _ = v.Args[1] 5368 x := v.Args[0] 5369 y := v.Args[1] 5370 v.reset(OpS390XANDW) 5371 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5372 v0.AddArg(x) 5373 v0.AddArg(y) 5374 v.AddArg(v0) 5375 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5376 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5377 v2.AuxInt = 31 5378 v2.AddArg(y) 5379 v1.AddArg(v2) 5380 v.AddArg(v1) 5381 return true 5382 } 5383 } 5384 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 5385 b := v.Block 5386 _ = b 5387 typ := &b.Func.Config.Types 5388 _ = typ 5389 // match: (Rsh32Ux8 <t> x y) 5390 // cond: 5391 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5392 for { 5393 t := v.Type 5394 _ = v.Args[1] 5395 x := v.Args[0] 5396 y := v.Args[1] 5397 v.reset(OpS390XANDW) 5398 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5399 v0.AddArg(x) 5400 v0.AddArg(y) 5401 v.AddArg(v0) 5402 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5403 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5404 v2.AuxInt = 31 5405 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5406 v3.AddArg(y) 5407 v2.AddArg(v3) 5408 v1.AddArg(v2) 5409 v.AddArg(v1) 5410 return true 5411 } 5412 } 5413 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 5414 b := v.Block 5415 _ = b 5416 typ := &b.Func.Config.Types 5417 _ = typ 5418 // match: (Rsh32x16 <t> x y) 5419 // cond: 5420 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5421 for { 5422 t := v.Type 5423 _ = v.Args[1] 5424 x := v.Args[0] 5425 y := v.Args[1] 5426 v.reset(OpS390XSRAW) 5427 v.Type = t 5428 v.AddArg(x) 5429 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5430 v0.AddArg(y) 5431 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5432 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5433 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5434 v3.AuxInt = 31 5435 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5436 v4.AddArg(y) 5437 v3.AddArg(v4) 5438 v2.AddArg(v3) 5439 v1.AddArg(v2) 5440 v0.AddArg(v1) 5441 v.AddArg(v0) 5442 return true 5443 } 5444 } 5445 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 5446 b := v.Block 5447 _ = b 5448 // match: (Rsh32x32 <t> x y) 5449 // cond: 5450 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5451 for { 5452 t := v.Type 5453 _ = v.Args[1] 5454 x := v.Args[0] 5455 y := v.Args[1] 5456 v.reset(OpS390XSRAW) 5457 v.Type = t 5458 v.AddArg(x) 5459 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5460 v0.AddArg(y) 5461 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5462 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5463 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5464 v3.AuxInt = 31 5465 v3.AddArg(y) 5466 v2.AddArg(v3) 5467 v1.AddArg(v2) 5468 v0.AddArg(v1) 5469 v.AddArg(v0) 5470 return true 5471 } 5472 } 5473 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 5474 b := v.Block 5475 _ = b 5476 // match: (Rsh32x64 <t> x y) 5477 // cond: 5478 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5479 for { 5480 t := v.Type 5481 _ = v.Args[1] 5482 x := v.Args[0] 5483 y := v.Args[1] 5484 v.reset(OpS390XSRAW) 5485 v.Type = t 5486 v.AddArg(x) 5487 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5488 v0.AddArg(y) 5489 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5490 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5491 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5492 v3.AuxInt = 31 5493 v3.AddArg(y) 5494 v2.AddArg(v3) 5495 v1.AddArg(v2) 5496 v0.AddArg(v1) 5497 v.AddArg(v0) 5498 return true 5499 } 5500 } 5501 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 5502 b := v.Block 5503 _ = b 5504 typ := &b.Func.Config.Types 5505 _ = typ 5506 // match: (Rsh32x8 <t> x y) 5507 // cond: 5508 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5509 for { 5510 t := v.Type 5511 _ = v.Args[1] 5512 x := v.Args[0] 5513 y := v.Args[1] 5514 v.reset(OpS390XSRAW) 5515 v.Type = t 5516 v.AddArg(x) 5517 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5518 v0.AddArg(y) 5519 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5520 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5521 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5522 v3.AuxInt = 31 5523 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5524 v4.AddArg(y) 5525 v3.AddArg(v4) 5526 v2.AddArg(v3) 5527 v1.AddArg(v2) 5528 v0.AddArg(v1) 5529 v.AddArg(v0) 5530 return true 5531 } 5532 } 5533 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 5534 b := v.Block 5535 _ = b 5536 typ := &b.Func.Config.Types 5537 _ = typ 5538 // match: (Rsh64Ux16 <t> x y) 5539 // cond: 5540 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5541 for { 5542 t := v.Type 5543 _ = v.Args[1] 5544 x := v.Args[0] 5545 y := v.Args[1] 5546 v.reset(OpS390XAND) 5547 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5548 v0.AddArg(x) 5549 v0.AddArg(y) 5550 v.AddArg(v0) 5551 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5552 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5553 v2.AuxInt = 63 5554 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5555 v3.AddArg(y) 5556 v2.AddArg(v3) 5557 v1.AddArg(v2) 5558 v.AddArg(v1) 5559 return true 5560 } 5561 } 5562 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 5563 b := v.Block 5564 _ = b 5565 // match: (Rsh64Ux32 <t> x y) 5566 // cond: 5567 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5568 for { 5569 t := v.Type 5570 _ = v.Args[1] 5571 x := v.Args[0] 5572 y := v.Args[1] 5573 v.reset(OpS390XAND) 5574 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5575 v0.AddArg(x) 5576 v0.AddArg(y) 5577 v.AddArg(v0) 5578 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5579 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5580 v2.AuxInt = 63 5581 v2.AddArg(y) 5582 v1.AddArg(v2) 5583 v.AddArg(v1) 5584 return true 5585 } 5586 } 5587 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 5588 b := v.Block 5589 _ = b 5590 // match: (Rsh64Ux64 <t> x y) 5591 // cond: 5592 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5593 for { 5594 t := v.Type 5595 _ = v.Args[1] 5596 x := v.Args[0] 5597 y := v.Args[1] 5598 v.reset(OpS390XAND) 5599 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5600 v0.AddArg(x) 5601 v0.AddArg(y) 5602 v.AddArg(v0) 5603 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5604 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5605 v2.AuxInt = 63 5606 v2.AddArg(y) 5607 v1.AddArg(v2) 5608 v.AddArg(v1) 5609 return true 5610 } 5611 } 5612 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 5613 b := v.Block 5614 _ = b 5615 typ := &b.Func.Config.Types 5616 _ = typ 5617 // match: (Rsh64Ux8 <t> x y) 5618 // cond: 5619 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5620 for { 5621 t := v.Type 5622 _ = v.Args[1] 5623 x := v.Args[0] 5624 y := v.Args[1] 5625 v.reset(OpS390XAND) 5626 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5627 v0.AddArg(x) 5628 v0.AddArg(y) 5629 v.AddArg(v0) 5630 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5631 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5632 v2.AuxInt = 63 5633 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5634 v3.AddArg(y) 5635 v2.AddArg(v3) 5636 v1.AddArg(v2) 5637 v.AddArg(v1) 5638 return true 5639 } 5640 } 5641 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 5642 b := v.Block 5643 _ = b 5644 typ := &b.Func.Config.Types 5645 _ = typ 5646 // match: (Rsh64x16 <t> x y) 5647 // cond: 5648 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5649 for { 5650 t := v.Type 5651 _ = v.Args[1] 5652 x := v.Args[0] 5653 y := v.Args[1] 5654 v.reset(OpS390XSRAD) 5655 v.Type = t 5656 v.AddArg(x) 5657 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5658 v0.AddArg(y) 5659 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5660 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5661 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5662 v3.AuxInt = 63 5663 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5664 v4.AddArg(y) 5665 v3.AddArg(v4) 5666 v2.AddArg(v3) 5667 v1.AddArg(v2) 5668 v0.AddArg(v1) 5669 v.AddArg(v0) 5670 return true 5671 } 5672 } 5673 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 5674 b := v.Block 5675 _ = b 5676 // match: (Rsh64x32 <t> x y) 5677 // cond: 5678 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5679 for { 5680 t := v.Type 5681 _ = v.Args[1] 5682 x := v.Args[0] 5683 y := v.Args[1] 5684 v.reset(OpS390XSRAD) 5685 v.Type = t 5686 v.AddArg(x) 5687 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5688 v0.AddArg(y) 5689 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5690 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5691 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5692 v3.AuxInt = 63 5693 v3.AddArg(y) 5694 v2.AddArg(v3) 5695 v1.AddArg(v2) 5696 v0.AddArg(v1) 5697 v.AddArg(v0) 5698 return true 5699 } 5700 } 5701 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 5702 b := v.Block 5703 _ = b 5704 // match: (Rsh64x64 <t> x y) 5705 // cond: 5706 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5707 for { 5708 t := v.Type 5709 _ = v.Args[1] 5710 x := v.Args[0] 5711 y := v.Args[1] 5712 v.reset(OpS390XSRAD) 5713 v.Type = t 5714 v.AddArg(x) 5715 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5716 v0.AddArg(y) 5717 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5718 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5719 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5720 v3.AuxInt = 63 5721 v3.AddArg(y) 5722 v2.AddArg(v3) 5723 v1.AddArg(v2) 5724 v0.AddArg(v1) 5725 v.AddArg(v0) 5726 return true 5727 } 5728 } 5729 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 5730 b := v.Block 5731 _ = b 5732 typ := &b.Func.Config.Types 5733 _ = typ 5734 // match: (Rsh64x8 <t> x y) 5735 // cond: 5736 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5737 for { 5738 t := v.Type 5739 _ = v.Args[1] 5740 x := v.Args[0] 5741 y := v.Args[1] 5742 v.reset(OpS390XSRAD) 5743 v.Type = t 5744 v.AddArg(x) 5745 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5746 v0.AddArg(y) 5747 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5748 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5749 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5750 v3.AuxInt = 63 5751 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5752 v4.AddArg(y) 5753 v3.AddArg(v4) 5754 v2.AddArg(v3) 5755 v1.AddArg(v2) 5756 v0.AddArg(v1) 5757 v.AddArg(v0) 5758 return true 5759 } 5760 } 5761 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 5762 b := v.Block 5763 _ = b 5764 typ := &b.Func.Config.Types 5765 _ = typ 5766 // match: (Rsh8Ux16 <t> x y) 5767 // cond: 5768 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5769 for { 5770 t := v.Type 5771 _ = v.Args[1] 5772 x := v.Args[0] 5773 y := v.Args[1] 5774 v.reset(OpS390XANDW) 5775 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5776 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5777 v1.AddArg(x) 5778 v0.AddArg(v1) 5779 v0.AddArg(y) 5780 v.AddArg(v0) 5781 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5782 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5783 v3.AuxInt = 7 5784 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5785 v4.AddArg(y) 5786 v3.AddArg(v4) 5787 v2.AddArg(v3) 5788 v.AddArg(v2) 5789 return true 5790 } 5791 } 5792 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 5793 b := v.Block 5794 _ = b 5795 typ := &b.Func.Config.Types 5796 _ = typ 5797 // match: (Rsh8Ux32 <t> x y) 5798 // cond: 5799 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5800 for { 5801 t := v.Type 5802 _ = v.Args[1] 5803 x := v.Args[0] 5804 y := v.Args[1] 5805 v.reset(OpS390XANDW) 5806 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5807 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5808 v1.AddArg(x) 5809 v0.AddArg(v1) 5810 v0.AddArg(y) 5811 v.AddArg(v0) 5812 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5813 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5814 v3.AuxInt = 7 5815 v3.AddArg(y) 5816 v2.AddArg(v3) 5817 v.AddArg(v2) 5818 return true 5819 } 5820 } 5821 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 5822 b := v.Block 5823 _ = b 5824 typ := &b.Func.Config.Types 5825 _ = typ 5826 // match: (Rsh8Ux64 <t> x y) 5827 // cond: 5828 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5829 for { 5830 t := v.Type 5831 _ = v.Args[1] 5832 x := v.Args[0] 5833 y := v.Args[1] 5834 v.reset(OpS390XANDW) 5835 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5836 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5837 v1.AddArg(x) 5838 v0.AddArg(v1) 5839 v0.AddArg(y) 5840 v.AddArg(v0) 5841 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5842 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5843 v3.AuxInt = 7 5844 v3.AddArg(y) 5845 v2.AddArg(v3) 5846 v.AddArg(v2) 5847 return true 5848 } 5849 } 5850 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 5851 b := v.Block 5852 _ = b 5853 typ := &b.Func.Config.Types 5854 _ = typ 5855 // match: (Rsh8Ux8 <t> x y) 5856 // cond: 5857 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5858 for { 5859 t := v.Type 5860 _ = v.Args[1] 5861 x := v.Args[0] 5862 y := v.Args[1] 5863 v.reset(OpS390XANDW) 5864 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5865 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5866 v1.AddArg(x) 5867 v0.AddArg(v1) 5868 v0.AddArg(y) 5869 v.AddArg(v0) 5870 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5871 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5872 v3.AuxInt = 7 5873 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5874 v4.AddArg(y) 5875 v3.AddArg(v4) 5876 v2.AddArg(v3) 5877 v.AddArg(v2) 5878 return true 5879 } 5880 } 5881 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 5882 b := v.Block 5883 _ = b 5884 typ := &b.Func.Config.Types 5885 _ = typ 5886 // match: (Rsh8x16 <t> x y) 5887 // cond: 5888 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5889 for { 5890 t := v.Type 5891 _ = v.Args[1] 5892 x := v.Args[0] 5893 y := v.Args[1] 5894 v.reset(OpS390XSRAW) 5895 v.Type = t 5896 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5897 v0.AddArg(x) 5898 v.AddArg(v0) 5899 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5900 v1.AddArg(y) 5901 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5902 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5903 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5904 v4.AuxInt = 7 5905 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5906 v5.AddArg(y) 5907 v4.AddArg(v5) 5908 v3.AddArg(v4) 5909 v2.AddArg(v3) 5910 v1.AddArg(v2) 5911 v.AddArg(v1) 5912 return true 5913 } 5914 } 5915 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 5916 b := v.Block 5917 _ = b 5918 typ := &b.Func.Config.Types 5919 _ = typ 5920 // match: (Rsh8x32 <t> x y) 5921 // cond: 5922 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5923 for { 5924 t := v.Type 5925 _ = v.Args[1] 5926 x := v.Args[0] 5927 y := v.Args[1] 5928 v.reset(OpS390XSRAW) 5929 v.Type = t 5930 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5931 v0.AddArg(x) 5932 v.AddArg(v0) 5933 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5934 v1.AddArg(y) 5935 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5936 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5937 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5938 v4.AuxInt = 7 5939 v4.AddArg(y) 5940 v3.AddArg(v4) 5941 v2.AddArg(v3) 5942 v1.AddArg(v2) 5943 v.AddArg(v1) 5944 return true 5945 } 5946 } 5947 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 5948 b := v.Block 5949 _ = b 5950 typ := &b.Func.Config.Types 5951 _ = typ 5952 // match: (Rsh8x64 <t> x y) 5953 // cond: 5954 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5955 for { 5956 t := v.Type 5957 _ = v.Args[1] 5958 x := v.Args[0] 5959 y := v.Args[1] 5960 v.reset(OpS390XSRAW) 5961 v.Type = t 5962 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5963 v0.AddArg(x) 5964 v.AddArg(v0) 5965 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5966 v1.AddArg(y) 5967 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5968 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5969 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5970 v4.AuxInt = 7 5971 v4.AddArg(y) 5972 v3.AddArg(v4) 5973 v2.AddArg(v3) 5974 v1.AddArg(v2) 5975 v.AddArg(v1) 5976 return true 5977 } 5978 } 5979 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 5980 b := v.Block 5981 _ = b 5982 typ := &b.Func.Config.Types 5983 _ = typ 5984 // match: (Rsh8x8 <t> x y) 5985 // cond: 5986 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5987 for { 5988 t := v.Type 5989 _ = v.Args[1] 5990 x := v.Args[0] 5991 y := v.Args[1] 5992 v.reset(OpS390XSRAW) 5993 v.Type = t 5994 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5995 v0.AddArg(x) 5996 v.AddArg(v0) 5997 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5998 v1.AddArg(y) 5999 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 6000 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 6001 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 6002 v4.AuxInt = 7 6003 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 6004 v5.AddArg(y) 6005 v4.AddArg(v5) 6006 v3.AddArg(v4) 6007 v2.AddArg(v3) 6008 v1.AddArg(v2) 6009 v.AddArg(v1) 6010 return true 6011 } 6012 } 6013 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 6014 // match: (ADD x (MOVDconst [c])) 6015 // cond: is32Bit(c) 6016 // result: (ADDconst [c] x) 6017 for { 6018 _ = v.Args[1] 6019 x := v.Args[0] 6020 v_1 := v.Args[1] 6021 if v_1.Op != OpS390XMOVDconst { 6022 break 6023 } 6024 c := v_1.AuxInt 6025 if !(is32Bit(c)) { 6026 break 6027 } 6028 v.reset(OpS390XADDconst) 6029 v.AuxInt = c 6030 v.AddArg(x) 6031 return true 6032 } 6033 // match: (ADD (MOVDconst [c]) x) 6034 // cond: is32Bit(c) 6035 // result: (ADDconst [c] x) 6036 for { 6037 _ = v.Args[1] 6038 v_0 := v.Args[0] 6039 if v_0.Op != OpS390XMOVDconst { 6040 break 6041 } 6042 c := v_0.AuxInt 6043 x := v.Args[1] 6044 if !(is32Bit(c)) { 6045 break 6046 } 6047 v.reset(OpS390XADDconst) 6048 v.AuxInt = c 6049 v.AddArg(x) 6050 return true 6051 } 6052 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 6053 // cond: d == 64-c 6054 // result: (RLLGconst [c] x) 6055 for { 6056 _ = v.Args[1] 6057 v_0 := v.Args[0] 6058 if v_0.Op != OpS390XSLDconst { 6059 break 6060 } 6061 c := v_0.AuxInt 6062 x := v_0.Args[0] 6063 v_1 := v.Args[1] 6064 if v_1.Op != OpS390XSRDconst { 6065 break 6066 } 6067 d := v_1.AuxInt 6068 if x != v_1.Args[0] { 6069 break 6070 } 6071 if !(d == 64-c) { 6072 break 6073 } 6074 v.reset(OpS390XRLLGconst) 6075 v.AuxInt = c 6076 v.AddArg(x) 6077 return true 6078 } 6079 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 6080 // cond: d == 64-c 6081 // result: (RLLGconst [c] x) 6082 for { 6083 _ = v.Args[1] 6084 v_0 := v.Args[0] 6085 if v_0.Op != OpS390XSRDconst { 6086 break 6087 } 6088 d := v_0.AuxInt 6089 x := v_0.Args[0] 6090 v_1 := v.Args[1] 6091 if v_1.Op != OpS390XSLDconst { 6092 break 6093 } 6094 c := v_1.AuxInt 6095 if x != v_1.Args[0] { 6096 break 6097 } 6098 if !(d == 64-c) { 6099 break 6100 } 6101 v.reset(OpS390XRLLGconst) 6102 v.AuxInt = c 6103 v.AddArg(x) 6104 return true 6105 } 6106 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 6107 // cond: ptr.Op != OpSB && idx.Op != OpSB 6108 // result: (MOVDaddridx [c] {s} ptr idx) 6109 for { 6110 _ = v.Args[1] 6111 idx := v.Args[0] 6112 v_1 := v.Args[1] 6113 if v_1.Op != OpS390XMOVDaddr { 6114 break 6115 } 6116 c := v_1.AuxInt 6117 s := v_1.Aux 6118 ptr := v_1.Args[0] 6119 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6120 break 6121 } 6122 v.reset(OpS390XMOVDaddridx) 6123 v.AuxInt = c 6124 v.Aux = s 6125 v.AddArg(ptr) 6126 v.AddArg(idx) 6127 return true 6128 } 6129 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 6130 // cond: ptr.Op != OpSB && idx.Op != OpSB 6131 // result: (MOVDaddridx [c] {s} ptr idx) 6132 for { 6133 _ = v.Args[1] 6134 v_0 := v.Args[0] 6135 if v_0.Op != OpS390XMOVDaddr { 6136 break 6137 } 6138 c := v_0.AuxInt 6139 s := v_0.Aux 6140 ptr := v_0.Args[0] 6141 idx := v.Args[1] 6142 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6143 break 6144 } 6145 v.reset(OpS390XMOVDaddridx) 6146 v.AuxInt = c 6147 v.Aux = s 6148 v.AddArg(ptr) 6149 v.AddArg(idx) 6150 return true 6151 } 6152 // match: (ADD x (NEG y)) 6153 // cond: 6154 // result: (SUB x y) 6155 for { 6156 _ = v.Args[1] 6157 x := v.Args[0] 6158 v_1 := v.Args[1] 6159 if v_1.Op != OpS390XNEG { 6160 break 6161 } 6162 y := v_1.Args[0] 6163 v.reset(OpS390XSUB) 6164 v.AddArg(x) 6165 v.AddArg(y) 6166 return true 6167 } 6168 // match: (ADD (NEG y) x) 6169 // cond: 6170 // result: (SUB x y) 6171 for { 6172 _ = v.Args[1] 6173 v_0 := v.Args[0] 6174 if v_0.Op != OpS390XNEG { 6175 break 6176 } 6177 y := v_0.Args[0] 6178 x := v.Args[1] 6179 v.reset(OpS390XSUB) 6180 v.AddArg(x) 6181 v.AddArg(y) 6182 return true 6183 } 6184 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6185 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6186 // result: (ADDload <t> [off] {sym} x ptr mem) 6187 for { 6188 t := v.Type 6189 _ = v.Args[1] 6190 x := v.Args[0] 6191 g := v.Args[1] 6192 if g.Op != OpS390XMOVDload { 6193 break 6194 } 6195 off := g.AuxInt 6196 sym := g.Aux 6197 _ = g.Args[1] 6198 ptr := g.Args[0] 6199 mem := g.Args[1] 6200 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6201 break 6202 } 6203 v.reset(OpS390XADDload) 6204 v.Type = t 6205 v.AuxInt = off 6206 v.Aux = sym 6207 v.AddArg(x) 6208 v.AddArg(ptr) 6209 v.AddArg(mem) 6210 return true 6211 } 6212 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6213 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6214 // result: (ADDload <t> [off] {sym} x ptr mem) 6215 for { 6216 t := v.Type 6217 _ = v.Args[1] 6218 g := v.Args[0] 6219 if g.Op != OpS390XMOVDload { 6220 break 6221 } 6222 off := g.AuxInt 6223 sym := g.Aux 6224 _ = g.Args[1] 6225 ptr := g.Args[0] 6226 mem := g.Args[1] 6227 x := v.Args[1] 6228 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6229 break 6230 } 6231 v.reset(OpS390XADDload) 6232 v.Type = t 6233 v.AuxInt = off 6234 v.Aux = sym 6235 v.AddArg(x) 6236 v.AddArg(ptr) 6237 v.AddArg(mem) 6238 return true 6239 } 6240 return false 6241 } 6242 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 6243 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6244 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6245 // result: (ADDload <t> [off] {sym} x ptr mem) 6246 for { 6247 t := v.Type 6248 _ = v.Args[1] 6249 g := v.Args[0] 6250 if g.Op != OpS390XMOVDload { 6251 break 6252 } 6253 off := g.AuxInt 6254 sym := g.Aux 6255 _ = g.Args[1] 6256 ptr := g.Args[0] 6257 mem := g.Args[1] 6258 x := v.Args[1] 6259 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6260 break 6261 } 6262 v.reset(OpS390XADDload) 6263 v.Type = t 6264 v.AuxInt = off 6265 v.Aux = sym 6266 v.AddArg(x) 6267 v.AddArg(ptr) 6268 v.AddArg(mem) 6269 return true 6270 } 6271 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6272 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6273 // result: (ADDload <t> [off] {sym} x ptr mem) 6274 for { 6275 t := v.Type 6276 _ = v.Args[1] 6277 x := v.Args[0] 6278 g := v.Args[1] 6279 if g.Op != OpS390XMOVDload { 6280 break 6281 } 6282 off := g.AuxInt 6283 sym := g.Aux 6284 _ = g.Args[1] 6285 ptr := g.Args[0] 6286 mem := g.Args[1] 6287 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6288 break 6289 } 6290 v.reset(OpS390XADDload) 6291 v.Type = t 6292 v.AuxInt = off 6293 v.Aux = sym 6294 v.AddArg(x) 6295 v.AddArg(ptr) 6296 v.AddArg(mem) 6297 return true 6298 } 6299 return false 6300 } 6301 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 6302 // match: (ADDW x (MOVDconst [c])) 6303 // cond: 6304 // result: (ADDWconst [int64(int32(c))] x) 6305 for { 6306 _ = v.Args[1] 6307 x := v.Args[0] 6308 v_1 := v.Args[1] 6309 if v_1.Op != OpS390XMOVDconst { 6310 break 6311 } 6312 c := v_1.AuxInt 6313 v.reset(OpS390XADDWconst) 6314 v.AuxInt = int64(int32(c)) 6315 v.AddArg(x) 6316 return true 6317 } 6318 // match: (ADDW (MOVDconst [c]) x) 6319 // cond: 6320 // result: (ADDWconst [int64(int32(c))] x) 6321 for { 6322 _ = v.Args[1] 6323 v_0 := v.Args[0] 6324 if v_0.Op != OpS390XMOVDconst { 6325 break 6326 } 6327 c := v_0.AuxInt 6328 x := v.Args[1] 6329 v.reset(OpS390XADDWconst) 6330 v.AuxInt = int64(int32(c)) 6331 v.AddArg(x) 6332 return true 6333 } 6334 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 6335 // cond: d == 32-c 6336 // result: (RLLconst [c] x) 6337 for { 6338 _ = v.Args[1] 6339 v_0 := v.Args[0] 6340 if v_0.Op != OpS390XSLWconst { 6341 break 6342 } 6343 c := v_0.AuxInt 6344 x := v_0.Args[0] 6345 v_1 := v.Args[1] 6346 if v_1.Op != OpS390XSRWconst { 6347 break 6348 } 6349 d := v_1.AuxInt 6350 if x != v_1.Args[0] { 6351 break 6352 } 6353 if !(d == 32-c) { 6354 break 6355 } 6356 v.reset(OpS390XRLLconst) 6357 v.AuxInt = c 6358 v.AddArg(x) 6359 return true 6360 } 6361 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6362 // cond: d == 32-c 6363 // result: (RLLconst [c] x) 6364 for { 6365 _ = v.Args[1] 6366 v_0 := v.Args[0] 6367 if v_0.Op != OpS390XSRWconst { 6368 break 6369 } 6370 d := v_0.AuxInt 6371 x := v_0.Args[0] 6372 v_1 := v.Args[1] 6373 if v_1.Op != OpS390XSLWconst { 6374 break 6375 } 6376 c := v_1.AuxInt 6377 if x != v_1.Args[0] { 6378 break 6379 } 6380 if !(d == 32-c) { 6381 break 6382 } 6383 v.reset(OpS390XRLLconst) 6384 v.AuxInt = c 6385 v.AddArg(x) 6386 return true 6387 } 6388 // match: (ADDW x (NEGW y)) 6389 // cond: 6390 // result: (SUBW x y) 6391 for { 6392 _ = v.Args[1] 6393 x := v.Args[0] 6394 v_1 := v.Args[1] 6395 if v_1.Op != OpS390XNEGW { 6396 break 6397 } 6398 y := v_1.Args[0] 6399 v.reset(OpS390XSUBW) 6400 v.AddArg(x) 6401 v.AddArg(y) 6402 return true 6403 } 6404 // match: (ADDW (NEGW y) x) 6405 // cond: 6406 // result: (SUBW x y) 6407 for { 6408 _ = v.Args[1] 6409 v_0 := v.Args[0] 6410 if v_0.Op != OpS390XNEGW { 6411 break 6412 } 6413 y := v_0.Args[0] 6414 x := v.Args[1] 6415 v.reset(OpS390XSUBW) 6416 v.AddArg(x) 6417 v.AddArg(y) 6418 return true 6419 } 6420 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6421 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6422 // result: (ADDWload <t> [off] {sym} x ptr mem) 6423 for { 6424 t := v.Type 6425 _ = v.Args[1] 6426 x := v.Args[0] 6427 g := v.Args[1] 6428 if g.Op != OpS390XMOVWload { 6429 break 6430 } 6431 off := g.AuxInt 6432 sym := g.Aux 6433 _ = g.Args[1] 6434 ptr := g.Args[0] 6435 mem := g.Args[1] 6436 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6437 break 6438 } 6439 v.reset(OpS390XADDWload) 6440 v.Type = t 6441 v.AuxInt = off 6442 v.Aux = sym 6443 v.AddArg(x) 6444 v.AddArg(ptr) 6445 v.AddArg(mem) 6446 return true 6447 } 6448 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6449 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6450 // result: (ADDWload <t> [off] {sym} x ptr mem) 6451 for { 6452 t := v.Type 6453 _ = v.Args[1] 6454 g := v.Args[0] 6455 if g.Op != OpS390XMOVWload { 6456 break 6457 } 6458 off := g.AuxInt 6459 sym := g.Aux 6460 _ = g.Args[1] 6461 ptr := g.Args[0] 6462 mem := g.Args[1] 6463 x := v.Args[1] 6464 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6465 break 6466 } 6467 v.reset(OpS390XADDWload) 6468 v.Type = t 6469 v.AuxInt = off 6470 v.Aux = sym 6471 v.AddArg(x) 6472 v.AddArg(ptr) 6473 v.AddArg(mem) 6474 return true 6475 } 6476 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6477 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6478 // result: (ADDWload <t> [off] {sym} x ptr mem) 6479 for { 6480 t := v.Type 6481 _ = v.Args[1] 6482 g := v.Args[0] 6483 if g.Op != OpS390XMOVWload { 6484 break 6485 } 6486 off := g.AuxInt 6487 sym := g.Aux 6488 _ = g.Args[1] 6489 ptr := g.Args[0] 6490 mem := g.Args[1] 6491 x := v.Args[1] 6492 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6493 break 6494 } 6495 v.reset(OpS390XADDWload) 6496 v.Type = t 6497 v.AuxInt = off 6498 v.Aux = sym 6499 v.AddArg(x) 6500 v.AddArg(ptr) 6501 v.AddArg(mem) 6502 return true 6503 } 6504 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6505 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6506 // result: (ADDWload <t> [off] {sym} x ptr mem) 6507 for { 6508 t := v.Type 6509 _ = v.Args[1] 6510 x := v.Args[0] 6511 g := v.Args[1] 6512 if g.Op != OpS390XMOVWload { 6513 break 6514 } 6515 off := g.AuxInt 6516 sym := g.Aux 6517 _ = g.Args[1] 6518 ptr := g.Args[0] 6519 mem := g.Args[1] 6520 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6521 break 6522 } 6523 v.reset(OpS390XADDWload) 6524 v.Type = t 6525 v.AuxInt = off 6526 v.Aux = sym 6527 v.AddArg(x) 6528 v.AddArg(ptr) 6529 v.AddArg(mem) 6530 return true 6531 } 6532 return false 6533 } 6534 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 6535 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6536 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6537 // result: (ADDWload <t> [off] {sym} x ptr mem) 6538 for { 6539 t := v.Type 6540 _ = v.Args[1] 6541 x := v.Args[0] 6542 g := v.Args[1] 6543 if g.Op != OpS390XMOVWZload { 6544 break 6545 } 6546 off := g.AuxInt 6547 sym := g.Aux 6548 _ = g.Args[1] 6549 ptr := g.Args[0] 6550 mem := g.Args[1] 6551 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6552 break 6553 } 6554 v.reset(OpS390XADDWload) 6555 v.Type = t 6556 v.AuxInt = off 6557 v.Aux = sym 6558 v.AddArg(x) 6559 v.AddArg(ptr) 6560 v.AddArg(mem) 6561 return true 6562 } 6563 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6564 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6565 // result: (ADDWload <t> [off] {sym} x ptr mem) 6566 for { 6567 t := v.Type 6568 _ = v.Args[1] 6569 g := v.Args[0] 6570 if g.Op != OpS390XMOVWZload { 6571 break 6572 } 6573 off := g.AuxInt 6574 sym := g.Aux 6575 _ = g.Args[1] 6576 ptr := g.Args[0] 6577 mem := g.Args[1] 6578 x := v.Args[1] 6579 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6580 break 6581 } 6582 v.reset(OpS390XADDWload) 6583 v.Type = t 6584 v.AuxInt = off 6585 v.Aux = sym 6586 v.AddArg(x) 6587 v.AddArg(ptr) 6588 v.AddArg(mem) 6589 return true 6590 } 6591 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6592 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6593 // result: (ADDWload <t> [off] {sym} x ptr mem) 6594 for { 6595 t := v.Type 6596 _ = v.Args[1] 6597 g := v.Args[0] 6598 if g.Op != OpS390XMOVWZload { 6599 break 6600 } 6601 off := g.AuxInt 6602 sym := g.Aux 6603 _ = g.Args[1] 6604 ptr := g.Args[0] 6605 mem := g.Args[1] 6606 x := v.Args[1] 6607 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6608 break 6609 } 6610 v.reset(OpS390XADDWload) 6611 v.Type = t 6612 v.AuxInt = off 6613 v.Aux = sym 6614 v.AddArg(x) 6615 v.AddArg(ptr) 6616 v.AddArg(mem) 6617 return true 6618 } 6619 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6620 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6621 // result: (ADDWload <t> [off] {sym} x ptr mem) 6622 for { 6623 t := v.Type 6624 _ = v.Args[1] 6625 x := v.Args[0] 6626 g := v.Args[1] 6627 if g.Op != OpS390XMOVWZload { 6628 break 6629 } 6630 off := g.AuxInt 6631 sym := g.Aux 6632 _ = g.Args[1] 6633 ptr := g.Args[0] 6634 mem := g.Args[1] 6635 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6636 break 6637 } 6638 v.reset(OpS390XADDWload) 6639 v.Type = t 6640 v.AuxInt = off 6641 v.Aux = sym 6642 v.AddArg(x) 6643 v.AddArg(ptr) 6644 v.AddArg(mem) 6645 return true 6646 } 6647 return false 6648 } 6649 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 6650 // match: (ADDWconst [c] x) 6651 // cond: int32(c)==0 6652 // result: x 6653 for { 6654 c := v.AuxInt 6655 x := v.Args[0] 6656 if !(int32(c) == 0) { 6657 break 6658 } 6659 v.reset(OpCopy) 6660 v.Type = x.Type 6661 v.AddArg(x) 6662 return true 6663 } 6664 // match: (ADDWconst [c] (MOVDconst [d])) 6665 // cond: 6666 // result: (MOVDconst [int64(int32(c+d))]) 6667 for { 6668 c := v.AuxInt 6669 v_0 := v.Args[0] 6670 if v_0.Op != OpS390XMOVDconst { 6671 break 6672 } 6673 d := v_0.AuxInt 6674 v.reset(OpS390XMOVDconst) 6675 v.AuxInt = int64(int32(c + d)) 6676 return true 6677 } 6678 // match: (ADDWconst [c] (ADDWconst [d] x)) 6679 // cond: 6680 // result: (ADDWconst [int64(int32(c+d))] x) 6681 for { 6682 c := v.AuxInt 6683 v_0 := v.Args[0] 6684 if v_0.Op != OpS390XADDWconst { 6685 break 6686 } 6687 d := v_0.AuxInt 6688 x := v_0.Args[0] 6689 v.reset(OpS390XADDWconst) 6690 v.AuxInt = int64(int32(c + d)) 6691 v.AddArg(x) 6692 return true 6693 } 6694 return false 6695 } 6696 func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { 6697 // match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 6698 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 6699 // result: (ADDWload [off1+off2] {sym} x ptr mem) 6700 for { 6701 off1 := v.AuxInt 6702 sym := v.Aux 6703 _ = v.Args[2] 6704 x := v.Args[0] 6705 v_1 := v.Args[1] 6706 if v_1.Op != OpS390XADDconst { 6707 break 6708 } 6709 off2 := v_1.AuxInt 6710 ptr := v_1.Args[0] 6711 mem := v.Args[2] 6712 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 6713 break 6714 } 6715 v.reset(OpS390XADDWload) 6716 v.AuxInt = off1 + off2 6717 v.Aux = sym 6718 v.AddArg(x) 6719 v.AddArg(ptr) 6720 v.AddArg(mem) 6721 return true 6722 } 6723 // match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 6724 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 6725 // result: (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 6726 for { 6727 o1 := v.AuxInt 6728 s1 := v.Aux 6729 _ = v.Args[2] 6730 x := v.Args[0] 6731 v_1 := v.Args[1] 6732 if v_1.Op != OpS390XMOVDaddr { 6733 break 6734 } 6735 o2 := v_1.AuxInt 6736 s2 := v_1.Aux 6737 ptr := v_1.Args[0] 6738 mem := v.Args[2] 6739 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 6740 break 6741 } 6742 v.reset(OpS390XADDWload) 6743 v.AuxInt = o1 + o2 6744 v.Aux = mergeSym(s1, s2) 6745 v.AddArg(x) 6746 v.AddArg(ptr) 6747 v.AddArg(mem) 6748 return true 6749 } 6750 return false 6751 } 6752 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 6753 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6754 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6755 // result: (MOVDaddr [c+d] {s} x) 6756 for { 6757 c := v.AuxInt 6758 v_0 := v.Args[0] 6759 if v_0.Op != OpS390XMOVDaddr { 6760 break 6761 } 6762 d := v_0.AuxInt 6763 s := v_0.Aux 6764 x := v_0.Args[0] 6765 if x.Op != OpSB { 6766 break 6767 } 6768 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6769 break 6770 } 6771 v.reset(OpS390XMOVDaddr) 6772 v.AuxInt = c + d 6773 v.Aux = s 6774 v.AddArg(x) 6775 return true 6776 } 6777 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6778 // cond: x.Op != OpSB && is20Bit(c+d) 6779 // result: (MOVDaddr [c+d] {s} x) 6780 for { 6781 c := v.AuxInt 6782 v_0 := v.Args[0] 6783 if v_0.Op != OpS390XMOVDaddr { 6784 break 6785 } 6786 d := v_0.AuxInt 6787 s := v_0.Aux 6788 x := v_0.Args[0] 6789 if !(x.Op != OpSB && is20Bit(c+d)) { 6790 break 6791 } 6792 v.reset(OpS390XMOVDaddr) 6793 v.AuxInt = c + d 6794 v.Aux = s 6795 v.AddArg(x) 6796 return true 6797 } 6798 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6799 // cond: is20Bit(c+d) 6800 // result: (MOVDaddridx [c+d] {s} x y) 6801 for { 6802 c := v.AuxInt 6803 v_0 := v.Args[0] 6804 if v_0.Op != OpS390XMOVDaddridx { 6805 break 6806 } 6807 d := v_0.AuxInt 6808 s := v_0.Aux 6809 _ = v_0.Args[1] 6810 x := v_0.Args[0] 6811 y := v_0.Args[1] 6812 if !(is20Bit(c + d)) { 6813 break 6814 } 6815 v.reset(OpS390XMOVDaddridx) 6816 v.AuxInt = c + d 6817 v.Aux = s 6818 v.AddArg(x) 6819 v.AddArg(y) 6820 return true 6821 } 6822 // match: (ADDconst [0] x) 6823 // cond: 6824 // result: x 6825 for { 6826 if v.AuxInt != 0 { 6827 break 6828 } 6829 x := v.Args[0] 6830 v.reset(OpCopy) 6831 v.Type = x.Type 6832 v.AddArg(x) 6833 return true 6834 } 6835 // match: (ADDconst [c] (MOVDconst [d])) 6836 // cond: 6837 // result: (MOVDconst [c+d]) 6838 for { 6839 c := v.AuxInt 6840 v_0 := v.Args[0] 6841 if v_0.Op != OpS390XMOVDconst { 6842 break 6843 } 6844 d := v_0.AuxInt 6845 v.reset(OpS390XMOVDconst) 6846 v.AuxInt = c + d 6847 return true 6848 } 6849 // match: (ADDconst [c] (ADDconst [d] x)) 6850 // cond: is32Bit(c+d) 6851 // result: (ADDconst [c+d] x) 6852 for { 6853 c := v.AuxInt 6854 v_0 := v.Args[0] 6855 if v_0.Op != OpS390XADDconst { 6856 break 6857 } 6858 d := v_0.AuxInt 6859 x := v_0.Args[0] 6860 if !(is32Bit(c + d)) { 6861 break 6862 } 6863 v.reset(OpS390XADDconst) 6864 v.AuxInt = c + d 6865 v.AddArg(x) 6866 return true 6867 } 6868 return false 6869 } 6870 func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { 6871 b := v.Block 6872 _ = b 6873 // match: (ADDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 6874 // cond: isSamePtr(ptr1, ptr2) 6875 // result: (ADD x (LGDR <t> y)) 6876 for { 6877 t := v.Type 6878 off := v.AuxInt 6879 sym := v.Aux 6880 _ = v.Args[2] 6881 x := v.Args[0] 6882 ptr1 := v.Args[1] 6883 v_2 := v.Args[2] 6884 if v_2.Op != OpS390XFMOVDstore { 6885 break 6886 } 6887 if v_2.AuxInt != off { 6888 break 6889 } 6890 if v_2.Aux != sym { 6891 break 6892 } 6893 _ = v_2.Args[2] 6894 ptr2 := v_2.Args[0] 6895 y := v_2.Args[1] 6896 if !(isSamePtr(ptr1, ptr2)) { 6897 break 6898 } 6899 v.reset(OpS390XADD) 6900 v.AddArg(x) 6901 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 6902 v0.AddArg(y) 6903 v.AddArg(v0) 6904 return true 6905 } 6906 // match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) 6907 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 6908 // result: (ADDload [off1+off2] {sym} x ptr mem) 6909 for { 6910 off1 := v.AuxInt 6911 sym := v.Aux 6912 _ = v.Args[2] 6913 x := v.Args[0] 6914 v_1 := v.Args[1] 6915 if v_1.Op != OpS390XADDconst { 6916 break 6917 } 6918 off2 := v_1.AuxInt 6919 ptr := v_1.Args[0] 6920 mem := v.Args[2] 6921 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 6922 break 6923 } 6924 v.reset(OpS390XADDload) 6925 v.AuxInt = off1 + off2 6926 v.Aux = sym 6927 v.AddArg(x) 6928 v.AddArg(ptr) 6929 v.AddArg(mem) 6930 return true 6931 } 6932 // match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 6933 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 6934 // result: (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 6935 for { 6936 o1 := v.AuxInt 6937 s1 := v.Aux 6938 _ = v.Args[2] 6939 x := v.Args[0] 6940 v_1 := v.Args[1] 6941 if v_1.Op != OpS390XMOVDaddr { 6942 break 6943 } 6944 o2 := v_1.AuxInt 6945 s2 := v_1.Aux 6946 ptr := v_1.Args[0] 6947 mem := v.Args[2] 6948 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 6949 break 6950 } 6951 v.reset(OpS390XADDload) 6952 v.AuxInt = o1 + o2 6953 v.Aux = mergeSym(s1, s2) 6954 v.AddArg(x) 6955 v.AddArg(ptr) 6956 v.AddArg(mem) 6957 return true 6958 } 6959 return false 6960 } 6961 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 6962 // match: (AND x (MOVDconst [c])) 6963 // cond: is32Bit(c) && c < 0 6964 // result: (ANDconst [c] x) 6965 for { 6966 _ = v.Args[1] 6967 x := v.Args[0] 6968 v_1 := v.Args[1] 6969 if v_1.Op != OpS390XMOVDconst { 6970 break 6971 } 6972 c := v_1.AuxInt 6973 if !(is32Bit(c) && c < 0) { 6974 break 6975 } 6976 v.reset(OpS390XANDconst) 6977 v.AuxInt = c 6978 v.AddArg(x) 6979 return true 6980 } 6981 // match: (AND (MOVDconst [c]) x) 6982 // cond: is32Bit(c) && c < 0 6983 // result: (ANDconst [c] x) 6984 for { 6985 _ = v.Args[1] 6986 v_0 := v.Args[0] 6987 if v_0.Op != OpS390XMOVDconst { 6988 break 6989 } 6990 c := v_0.AuxInt 6991 x := v.Args[1] 6992 if !(is32Bit(c) && c < 0) { 6993 break 6994 } 6995 v.reset(OpS390XANDconst) 6996 v.AuxInt = c 6997 v.AddArg(x) 6998 return true 6999 } 7000 // match: (AND x (MOVDconst [0xFF])) 7001 // cond: 7002 // result: (MOVBZreg x) 7003 for { 7004 _ = v.Args[1] 7005 x := v.Args[0] 7006 v_1 := v.Args[1] 7007 if v_1.Op != OpS390XMOVDconst { 7008 break 7009 } 7010 if v_1.AuxInt != 0xFF { 7011 break 7012 } 7013 v.reset(OpS390XMOVBZreg) 7014 v.AddArg(x) 7015 return true 7016 } 7017 // match: (AND (MOVDconst [0xFF]) x) 7018 // cond: 7019 // result: (MOVBZreg x) 7020 for { 7021 _ = v.Args[1] 7022 v_0 := v.Args[0] 7023 if v_0.Op != OpS390XMOVDconst { 7024 break 7025 } 7026 if v_0.AuxInt != 0xFF { 7027 break 7028 } 7029 x := v.Args[1] 7030 v.reset(OpS390XMOVBZreg) 7031 v.AddArg(x) 7032 return true 7033 } 7034 // match: (AND x (MOVDconst [0xFFFF])) 7035 // cond: 7036 // result: (MOVHZreg x) 7037 for { 7038 _ = v.Args[1] 7039 x := v.Args[0] 7040 v_1 := v.Args[1] 7041 if v_1.Op != OpS390XMOVDconst { 7042 break 7043 } 7044 if v_1.AuxInt != 0xFFFF { 7045 break 7046 } 7047 v.reset(OpS390XMOVHZreg) 7048 v.AddArg(x) 7049 return true 7050 } 7051 // match: (AND (MOVDconst [0xFFFF]) x) 7052 // cond: 7053 // result: (MOVHZreg x) 7054 for { 7055 _ = v.Args[1] 7056 v_0 := v.Args[0] 7057 if v_0.Op != OpS390XMOVDconst { 7058 break 7059 } 7060 if v_0.AuxInt != 0xFFFF { 7061 break 7062 } 7063 x := v.Args[1] 7064 v.reset(OpS390XMOVHZreg) 7065 v.AddArg(x) 7066 return true 7067 } 7068 // match: (AND x (MOVDconst [0xFFFFFFFF])) 7069 // cond: 7070 // result: (MOVWZreg x) 7071 for { 7072 _ = v.Args[1] 7073 x := v.Args[0] 7074 v_1 := v.Args[1] 7075 if v_1.Op != OpS390XMOVDconst { 7076 break 7077 } 7078 if v_1.AuxInt != 0xFFFFFFFF { 7079 break 7080 } 7081 v.reset(OpS390XMOVWZreg) 7082 v.AddArg(x) 7083 return true 7084 } 7085 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 7086 // cond: 7087 // result: (MOVWZreg x) 7088 for { 7089 _ = v.Args[1] 7090 v_0 := v.Args[0] 7091 if v_0.Op != OpS390XMOVDconst { 7092 break 7093 } 7094 if v_0.AuxInt != 0xFFFFFFFF { 7095 break 7096 } 7097 x := v.Args[1] 7098 v.reset(OpS390XMOVWZreg) 7099 v.AddArg(x) 7100 return true 7101 } 7102 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 7103 // cond: 7104 // result: (MOVDconst [c&d]) 7105 for { 7106 _ = v.Args[1] 7107 v_0 := v.Args[0] 7108 if v_0.Op != OpS390XMOVDconst { 7109 break 7110 } 7111 c := v_0.AuxInt 7112 v_1 := v.Args[1] 7113 if v_1.Op != OpS390XMOVDconst { 7114 break 7115 } 7116 d := v_1.AuxInt 7117 v.reset(OpS390XMOVDconst) 7118 v.AuxInt = c & d 7119 return true 7120 } 7121 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 7122 // cond: 7123 // result: (MOVDconst [c&d]) 7124 for { 7125 _ = v.Args[1] 7126 v_0 := v.Args[0] 7127 if v_0.Op != OpS390XMOVDconst { 7128 break 7129 } 7130 d := v_0.AuxInt 7131 v_1 := v.Args[1] 7132 if v_1.Op != OpS390XMOVDconst { 7133 break 7134 } 7135 c := v_1.AuxInt 7136 v.reset(OpS390XMOVDconst) 7137 v.AuxInt = c & d 7138 return true 7139 } 7140 return false 7141 } 7142 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 7143 // match: (AND x x) 7144 // cond: 7145 // result: x 7146 for { 7147 _ = v.Args[1] 7148 x := v.Args[0] 7149 if x != v.Args[1] { 7150 break 7151 } 7152 v.reset(OpCopy) 7153 v.Type = x.Type 7154 v.AddArg(x) 7155 return true 7156 } 7157 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 7158 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7159 // result: (ANDload <t> [off] {sym} x ptr mem) 7160 for { 7161 t := v.Type 7162 _ = v.Args[1] 7163 x := v.Args[0] 7164 g := v.Args[1] 7165 if g.Op != OpS390XMOVDload { 7166 break 7167 } 7168 off := g.AuxInt 7169 sym := g.Aux 7170 _ = g.Args[1] 7171 ptr := g.Args[0] 7172 mem := g.Args[1] 7173 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7174 break 7175 } 7176 v.reset(OpS390XANDload) 7177 v.Type = t 7178 v.AuxInt = off 7179 v.Aux = sym 7180 v.AddArg(x) 7181 v.AddArg(ptr) 7182 v.AddArg(mem) 7183 return true 7184 } 7185 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 7186 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7187 // result: (ANDload <t> [off] {sym} x ptr mem) 7188 for { 7189 t := v.Type 7190 _ = v.Args[1] 7191 g := v.Args[0] 7192 if g.Op != OpS390XMOVDload { 7193 break 7194 } 7195 off := g.AuxInt 7196 sym := g.Aux 7197 _ = g.Args[1] 7198 ptr := g.Args[0] 7199 mem := g.Args[1] 7200 x := v.Args[1] 7201 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7202 break 7203 } 7204 v.reset(OpS390XANDload) 7205 v.Type = t 7206 v.AuxInt = off 7207 v.Aux = sym 7208 v.AddArg(x) 7209 v.AddArg(ptr) 7210 v.AddArg(mem) 7211 return true 7212 } 7213 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 7214 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7215 // result: (ANDload <t> [off] {sym} x ptr mem) 7216 for { 7217 t := v.Type 7218 _ = v.Args[1] 7219 g := v.Args[0] 7220 if g.Op != OpS390XMOVDload { 7221 break 7222 } 7223 off := g.AuxInt 7224 sym := g.Aux 7225 _ = g.Args[1] 7226 ptr := g.Args[0] 7227 mem := g.Args[1] 7228 x := v.Args[1] 7229 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7230 break 7231 } 7232 v.reset(OpS390XANDload) 7233 v.Type = t 7234 v.AuxInt = off 7235 v.Aux = sym 7236 v.AddArg(x) 7237 v.AddArg(ptr) 7238 v.AddArg(mem) 7239 return true 7240 } 7241 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 7242 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7243 // result: (ANDload <t> [off] {sym} x ptr mem) 7244 for { 7245 t := v.Type 7246 _ = v.Args[1] 7247 x := v.Args[0] 7248 g := v.Args[1] 7249 if g.Op != OpS390XMOVDload { 7250 break 7251 } 7252 off := g.AuxInt 7253 sym := g.Aux 7254 _ = g.Args[1] 7255 ptr := g.Args[0] 7256 mem := g.Args[1] 7257 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7258 break 7259 } 7260 v.reset(OpS390XANDload) 7261 v.Type = t 7262 v.AuxInt = off 7263 v.Aux = sym 7264 v.AddArg(x) 7265 v.AddArg(ptr) 7266 v.AddArg(mem) 7267 return true 7268 } 7269 return false 7270 } 7271 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 7272 // match: (ANDW x (MOVDconst [c])) 7273 // cond: 7274 // result: (ANDWconst [int64(int32(c))] x) 7275 for { 7276 _ = v.Args[1] 7277 x := v.Args[0] 7278 v_1 := v.Args[1] 7279 if v_1.Op != OpS390XMOVDconst { 7280 break 7281 } 7282 c := v_1.AuxInt 7283 v.reset(OpS390XANDWconst) 7284 v.AuxInt = int64(int32(c)) 7285 v.AddArg(x) 7286 return true 7287 } 7288 // match: (ANDW (MOVDconst [c]) x) 7289 // cond: 7290 // result: (ANDWconst [int64(int32(c))] x) 7291 for { 7292 _ = v.Args[1] 7293 v_0 := v.Args[0] 7294 if v_0.Op != OpS390XMOVDconst { 7295 break 7296 } 7297 c := v_0.AuxInt 7298 x := v.Args[1] 7299 v.reset(OpS390XANDWconst) 7300 v.AuxInt = int64(int32(c)) 7301 v.AddArg(x) 7302 return true 7303 } 7304 // match: (ANDW x x) 7305 // cond: 7306 // result: x 7307 for { 7308 _ = v.Args[1] 7309 x := v.Args[0] 7310 if x != v.Args[1] { 7311 break 7312 } 7313 v.reset(OpCopy) 7314 v.Type = x.Type 7315 v.AddArg(x) 7316 return true 7317 } 7318 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7319 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7320 // result: (ANDWload <t> [off] {sym} x ptr mem) 7321 for { 7322 t := v.Type 7323 _ = v.Args[1] 7324 x := v.Args[0] 7325 g := v.Args[1] 7326 if g.Op != OpS390XMOVWload { 7327 break 7328 } 7329 off := g.AuxInt 7330 sym := g.Aux 7331 _ = g.Args[1] 7332 ptr := g.Args[0] 7333 mem := g.Args[1] 7334 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7335 break 7336 } 7337 v.reset(OpS390XANDWload) 7338 v.Type = t 7339 v.AuxInt = off 7340 v.Aux = sym 7341 v.AddArg(x) 7342 v.AddArg(ptr) 7343 v.AddArg(mem) 7344 return true 7345 } 7346 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7347 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7348 // result: (ANDWload <t> [off] {sym} x ptr mem) 7349 for { 7350 t := v.Type 7351 _ = v.Args[1] 7352 g := v.Args[0] 7353 if g.Op != OpS390XMOVWload { 7354 break 7355 } 7356 off := g.AuxInt 7357 sym := g.Aux 7358 _ = g.Args[1] 7359 ptr := g.Args[0] 7360 mem := g.Args[1] 7361 x := v.Args[1] 7362 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7363 break 7364 } 7365 v.reset(OpS390XANDWload) 7366 v.Type = t 7367 v.AuxInt = off 7368 v.Aux = sym 7369 v.AddArg(x) 7370 v.AddArg(ptr) 7371 v.AddArg(mem) 7372 return true 7373 } 7374 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7375 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7376 // result: (ANDWload <t> [off] {sym} x ptr mem) 7377 for { 7378 t := v.Type 7379 _ = v.Args[1] 7380 g := v.Args[0] 7381 if g.Op != OpS390XMOVWload { 7382 break 7383 } 7384 off := g.AuxInt 7385 sym := g.Aux 7386 _ = g.Args[1] 7387 ptr := g.Args[0] 7388 mem := g.Args[1] 7389 x := v.Args[1] 7390 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7391 break 7392 } 7393 v.reset(OpS390XANDWload) 7394 v.Type = t 7395 v.AuxInt = off 7396 v.Aux = sym 7397 v.AddArg(x) 7398 v.AddArg(ptr) 7399 v.AddArg(mem) 7400 return true 7401 } 7402 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7403 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7404 // result: (ANDWload <t> [off] {sym} x ptr mem) 7405 for { 7406 t := v.Type 7407 _ = v.Args[1] 7408 x := v.Args[0] 7409 g := v.Args[1] 7410 if g.Op != OpS390XMOVWload { 7411 break 7412 } 7413 off := g.AuxInt 7414 sym := g.Aux 7415 _ = g.Args[1] 7416 ptr := g.Args[0] 7417 mem := g.Args[1] 7418 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7419 break 7420 } 7421 v.reset(OpS390XANDWload) 7422 v.Type = t 7423 v.AuxInt = off 7424 v.Aux = sym 7425 v.AddArg(x) 7426 v.AddArg(ptr) 7427 v.AddArg(mem) 7428 return true 7429 } 7430 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7431 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7432 // result: (ANDWload <t> [off] {sym} x ptr mem) 7433 for { 7434 t := v.Type 7435 _ = v.Args[1] 7436 x := v.Args[0] 7437 g := v.Args[1] 7438 if g.Op != OpS390XMOVWZload { 7439 break 7440 } 7441 off := g.AuxInt 7442 sym := g.Aux 7443 _ = g.Args[1] 7444 ptr := g.Args[0] 7445 mem := g.Args[1] 7446 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7447 break 7448 } 7449 v.reset(OpS390XANDWload) 7450 v.Type = t 7451 v.AuxInt = off 7452 v.Aux = sym 7453 v.AddArg(x) 7454 v.AddArg(ptr) 7455 v.AddArg(mem) 7456 return true 7457 } 7458 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7459 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7460 // result: (ANDWload <t> [off] {sym} x ptr mem) 7461 for { 7462 t := v.Type 7463 _ = v.Args[1] 7464 g := v.Args[0] 7465 if g.Op != OpS390XMOVWZload { 7466 break 7467 } 7468 off := g.AuxInt 7469 sym := g.Aux 7470 _ = g.Args[1] 7471 ptr := g.Args[0] 7472 mem := g.Args[1] 7473 x := v.Args[1] 7474 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7475 break 7476 } 7477 v.reset(OpS390XANDWload) 7478 v.Type = t 7479 v.AuxInt = off 7480 v.Aux = sym 7481 v.AddArg(x) 7482 v.AddArg(ptr) 7483 v.AddArg(mem) 7484 return true 7485 } 7486 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7487 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7488 // result: (ANDWload <t> [off] {sym} x ptr mem) 7489 for { 7490 t := v.Type 7491 _ = v.Args[1] 7492 g := v.Args[0] 7493 if g.Op != OpS390XMOVWZload { 7494 break 7495 } 7496 off := g.AuxInt 7497 sym := g.Aux 7498 _ = g.Args[1] 7499 ptr := g.Args[0] 7500 mem := g.Args[1] 7501 x := v.Args[1] 7502 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7503 break 7504 } 7505 v.reset(OpS390XANDWload) 7506 v.Type = t 7507 v.AuxInt = off 7508 v.Aux = sym 7509 v.AddArg(x) 7510 v.AddArg(ptr) 7511 v.AddArg(mem) 7512 return true 7513 } 7514 return false 7515 } 7516 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 7517 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7518 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7519 // result: (ANDWload <t> [off] {sym} x ptr mem) 7520 for { 7521 t := v.Type 7522 _ = v.Args[1] 7523 x := v.Args[0] 7524 g := v.Args[1] 7525 if g.Op != OpS390XMOVWZload { 7526 break 7527 } 7528 off := g.AuxInt 7529 sym := g.Aux 7530 _ = g.Args[1] 7531 ptr := g.Args[0] 7532 mem := g.Args[1] 7533 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7534 break 7535 } 7536 v.reset(OpS390XANDWload) 7537 v.Type = t 7538 v.AuxInt = off 7539 v.Aux = sym 7540 v.AddArg(x) 7541 v.AddArg(ptr) 7542 v.AddArg(mem) 7543 return true 7544 } 7545 return false 7546 } 7547 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 7548 // match: (ANDWconst [c] (ANDWconst [d] x)) 7549 // cond: 7550 // result: (ANDWconst [c & d] x) 7551 for { 7552 c := v.AuxInt 7553 v_0 := v.Args[0] 7554 if v_0.Op != OpS390XANDWconst { 7555 break 7556 } 7557 d := v_0.AuxInt 7558 x := v_0.Args[0] 7559 v.reset(OpS390XANDWconst) 7560 v.AuxInt = c & d 7561 v.AddArg(x) 7562 return true 7563 } 7564 // match: (ANDWconst [0xFF] x) 7565 // cond: 7566 // result: (MOVBZreg x) 7567 for { 7568 if v.AuxInt != 0xFF { 7569 break 7570 } 7571 x := v.Args[0] 7572 v.reset(OpS390XMOVBZreg) 7573 v.AddArg(x) 7574 return true 7575 } 7576 // match: (ANDWconst [0xFFFF] x) 7577 // cond: 7578 // result: (MOVHZreg x) 7579 for { 7580 if v.AuxInt != 0xFFFF { 7581 break 7582 } 7583 x := v.Args[0] 7584 v.reset(OpS390XMOVHZreg) 7585 v.AddArg(x) 7586 return true 7587 } 7588 // match: (ANDWconst [c] _) 7589 // cond: int32(c)==0 7590 // result: (MOVDconst [0]) 7591 for { 7592 c := v.AuxInt 7593 if !(int32(c) == 0) { 7594 break 7595 } 7596 v.reset(OpS390XMOVDconst) 7597 v.AuxInt = 0 7598 return true 7599 } 7600 // match: (ANDWconst [c] x) 7601 // cond: int32(c)==-1 7602 // result: x 7603 for { 7604 c := v.AuxInt 7605 x := v.Args[0] 7606 if !(int32(c) == -1) { 7607 break 7608 } 7609 v.reset(OpCopy) 7610 v.Type = x.Type 7611 v.AddArg(x) 7612 return true 7613 } 7614 // match: (ANDWconst [c] (MOVDconst [d])) 7615 // cond: 7616 // result: (MOVDconst [c&d]) 7617 for { 7618 c := v.AuxInt 7619 v_0 := v.Args[0] 7620 if v_0.Op != OpS390XMOVDconst { 7621 break 7622 } 7623 d := v_0.AuxInt 7624 v.reset(OpS390XMOVDconst) 7625 v.AuxInt = c & d 7626 return true 7627 } 7628 return false 7629 } 7630 func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { 7631 // match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) 7632 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7633 // result: (ANDWload [off1+off2] {sym} x ptr mem) 7634 for { 7635 off1 := v.AuxInt 7636 sym := v.Aux 7637 _ = v.Args[2] 7638 x := v.Args[0] 7639 v_1 := v.Args[1] 7640 if v_1.Op != OpS390XADDconst { 7641 break 7642 } 7643 off2 := v_1.AuxInt 7644 ptr := v_1.Args[0] 7645 mem := v.Args[2] 7646 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7647 break 7648 } 7649 v.reset(OpS390XANDWload) 7650 v.AuxInt = off1 + off2 7651 v.Aux = sym 7652 v.AddArg(x) 7653 v.AddArg(ptr) 7654 v.AddArg(mem) 7655 return true 7656 } 7657 // match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7658 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7659 // result: (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7660 for { 7661 o1 := v.AuxInt 7662 s1 := v.Aux 7663 _ = v.Args[2] 7664 x := v.Args[0] 7665 v_1 := v.Args[1] 7666 if v_1.Op != OpS390XMOVDaddr { 7667 break 7668 } 7669 o2 := v_1.AuxInt 7670 s2 := v_1.Aux 7671 ptr := v_1.Args[0] 7672 mem := v.Args[2] 7673 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7674 break 7675 } 7676 v.reset(OpS390XANDWload) 7677 v.AuxInt = o1 + o2 7678 v.Aux = mergeSym(s1, s2) 7679 v.AddArg(x) 7680 v.AddArg(ptr) 7681 v.AddArg(mem) 7682 return true 7683 } 7684 return false 7685 } 7686 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 7687 // match: (ANDconst [c] (ANDconst [d] x)) 7688 // cond: 7689 // result: (ANDconst [c & d] x) 7690 for { 7691 c := v.AuxInt 7692 v_0 := v.Args[0] 7693 if v_0.Op != OpS390XANDconst { 7694 break 7695 } 7696 d := v_0.AuxInt 7697 x := v_0.Args[0] 7698 v.reset(OpS390XANDconst) 7699 v.AuxInt = c & d 7700 v.AddArg(x) 7701 return true 7702 } 7703 // match: (ANDconst [0] _) 7704 // cond: 7705 // result: (MOVDconst [0]) 7706 for { 7707 if v.AuxInt != 0 { 7708 break 7709 } 7710 v.reset(OpS390XMOVDconst) 7711 v.AuxInt = 0 7712 return true 7713 } 7714 // match: (ANDconst [-1] x) 7715 // cond: 7716 // result: x 7717 for { 7718 if v.AuxInt != -1 { 7719 break 7720 } 7721 x := v.Args[0] 7722 v.reset(OpCopy) 7723 v.Type = x.Type 7724 v.AddArg(x) 7725 return true 7726 } 7727 // match: (ANDconst [c] (MOVDconst [d])) 7728 // cond: 7729 // result: (MOVDconst [c&d]) 7730 for { 7731 c := v.AuxInt 7732 v_0 := v.Args[0] 7733 if v_0.Op != OpS390XMOVDconst { 7734 break 7735 } 7736 d := v_0.AuxInt 7737 v.reset(OpS390XMOVDconst) 7738 v.AuxInt = c & d 7739 return true 7740 } 7741 return false 7742 } 7743 func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { 7744 b := v.Block 7745 _ = b 7746 // match: (ANDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 7747 // cond: isSamePtr(ptr1, ptr2) 7748 // result: (AND x (LGDR <t> y)) 7749 for { 7750 t := v.Type 7751 off := v.AuxInt 7752 sym := v.Aux 7753 _ = v.Args[2] 7754 x := v.Args[0] 7755 ptr1 := v.Args[1] 7756 v_2 := v.Args[2] 7757 if v_2.Op != OpS390XFMOVDstore { 7758 break 7759 } 7760 if v_2.AuxInt != off { 7761 break 7762 } 7763 if v_2.Aux != sym { 7764 break 7765 } 7766 _ = v_2.Args[2] 7767 ptr2 := v_2.Args[0] 7768 y := v_2.Args[1] 7769 if !(isSamePtr(ptr1, ptr2)) { 7770 break 7771 } 7772 v.reset(OpS390XAND) 7773 v.AddArg(x) 7774 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 7775 v0.AddArg(y) 7776 v.AddArg(v0) 7777 return true 7778 } 7779 // match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) 7780 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 7781 // result: (ANDload [off1+off2] {sym} x ptr mem) 7782 for { 7783 off1 := v.AuxInt 7784 sym := v.Aux 7785 _ = v.Args[2] 7786 x := v.Args[0] 7787 v_1 := v.Args[1] 7788 if v_1.Op != OpS390XADDconst { 7789 break 7790 } 7791 off2 := v_1.AuxInt 7792 ptr := v_1.Args[0] 7793 mem := v.Args[2] 7794 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 7795 break 7796 } 7797 v.reset(OpS390XANDload) 7798 v.AuxInt = off1 + off2 7799 v.Aux = sym 7800 v.AddArg(x) 7801 v.AddArg(ptr) 7802 v.AddArg(mem) 7803 return true 7804 } 7805 // match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 7806 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 7807 // result: (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 7808 for { 7809 o1 := v.AuxInt 7810 s1 := v.Aux 7811 _ = v.Args[2] 7812 x := v.Args[0] 7813 v_1 := v.Args[1] 7814 if v_1.Op != OpS390XMOVDaddr { 7815 break 7816 } 7817 o2 := v_1.AuxInt 7818 s2 := v_1.Aux 7819 ptr := v_1.Args[0] 7820 mem := v.Args[2] 7821 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 7822 break 7823 } 7824 v.reset(OpS390XANDload) 7825 v.AuxInt = o1 + o2 7826 v.Aux = mergeSym(s1, s2) 7827 v.AddArg(x) 7828 v.AddArg(ptr) 7829 v.AddArg(mem) 7830 return true 7831 } 7832 return false 7833 } 7834 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 7835 b := v.Block 7836 _ = b 7837 // match: (CMP x (MOVDconst [c])) 7838 // cond: is32Bit(c) 7839 // result: (CMPconst x [c]) 7840 for { 7841 _ = v.Args[1] 7842 x := v.Args[0] 7843 v_1 := v.Args[1] 7844 if v_1.Op != OpS390XMOVDconst { 7845 break 7846 } 7847 c := v_1.AuxInt 7848 if !(is32Bit(c)) { 7849 break 7850 } 7851 v.reset(OpS390XCMPconst) 7852 v.AuxInt = c 7853 v.AddArg(x) 7854 return true 7855 } 7856 // match: (CMP (MOVDconst [c]) x) 7857 // cond: is32Bit(c) 7858 // result: (InvertFlags (CMPconst x [c])) 7859 for { 7860 _ = v.Args[1] 7861 v_0 := v.Args[0] 7862 if v_0.Op != OpS390XMOVDconst { 7863 break 7864 } 7865 c := v_0.AuxInt 7866 x := v.Args[1] 7867 if !(is32Bit(c)) { 7868 break 7869 } 7870 v.reset(OpS390XInvertFlags) 7871 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 7872 v0.AuxInt = c 7873 v0.AddArg(x) 7874 v.AddArg(v0) 7875 return true 7876 } 7877 return false 7878 } 7879 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 7880 b := v.Block 7881 _ = b 7882 // match: (CMPU x (MOVDconst [c])) 7883 // cond: isU32Bit(c) 7884 // result: (CMPUconst x [int64(int32(c))]) 7885 for { 7886 _ = v.Args[1] 7887 x := v.Args[0] 7888 v_1 := v.Args[1] 7889 if v_1.Op != OpS390XMOVDconst { 7890 break 7891 } 7892 c := v_1.AuxInt 7893 if !(isU32Bit(c)) { 7894 break 7895 } 7896 v.reset(OpS390XCMPUconst) 7897 v.AuxInt = int64(int32(c)) 7898 v.AddArg(x) 7899 return true 7900 } 7901 // match: (CMPU (MOVDconst [c]) x) 7902 // cond: isU32Bit(c) 7903 // result: (InvertFlags (CMPUconst x [int64(int32(c))])) 7904 for { 7905 _ = v.Args[1] 7906 v_0 := v.Args[0] 7907 if v_0.Op != OpS390XMOVDconst { 7908 break 7909 } 7910 c := v_0.AuxInt 7911 x := v.Args[1] 7912 if !(isU32Bit(c)) { 7913 break 7914 } 7915 v.reset(OpS390XInvertFlags) 7916 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 7917 v0.AuxInt = int64(int32(c)) 7918 v0.AddArg(x) 7919 v.AddArg(v0) 7920 return true 7921 } 7922 return false 7923 } 7924 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 7925 // match: (CMPUconst (MOVDconst [x]) [y]) 7926 // cond: uint64(x)==uint64(y) 7927 // result: (FlagEQ) 7928 for { 7929 y := v.AuxInt 7930 v_0 := v.Args[0] 7931 if v_0.Op != OpS390XMOVDconst { 7932 break 7933 } 7934 x := v_0.AuxInt 7935 if !(uint64(x) == uint64(y)) { 7936 break 7937 } 7938 v.reset(OpS390XFlagEQ) 7939 return true 7940 } 7941 // match: (CMPUconst (MOVDconst [x]) [y]) 7942 // cond: uint64(x)<uint64(y) 7943 // result: (FlagLT) 7944 for { 7945 y := v.AuxInt 7946 v_0 := v.Args[0] 7947 if v_0.Op != OpS390XMOVDconst { 7948 break 7949 } 7950 x := v_0.AuxInt 7951 if !(uint64(x) < uint64(y)) { 7952 break 7953 } 7954 v.reset(OpS390XFlagLT) 7955 return true 7956 } 7957 // match: (CMPUconst (MOVDconst [x]) [y]) 7958 // cond: uint64(x)>uint64(y) 7959 // result: (FlagGT) 7960 for { 7961 y := v.AuxInt 7962 v_0 := v.Args[0] 7963 if v_0.Op != OpS390XMOVDconst { 7964 break 7965 } 7966 x := v_0.AuxInt 7967 if !(uint64(x) > uint64(y)) { 7968 break 7969 } 7970 v.reset(OpS390XFlagGT) 7971 return true 7972 } 7973 return false 7974 } 7975 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 7976 b := v.Block 7977 _ = b 7978 // match: (CMPW x (MOVDconst [c])) 7979 // cond: 7980 // result: (CMPWconst x [int64(int32(c))]) 7981 for { 7982 _ = v.Args[1] 7983 x := v.Args[0] 7984 v_1 := v.Args[1] 7985 if v_1.Op != OpS390XMOVDconst { 7986 break 7987 } 7988 c := v_1.AuxInt 7989 v.reset(OpS390XCMPWconst) 7990 v.AuxInt = int64(int32(c)) 7991 v.AddArg(x) 7992 return true 7993 } 7994 // match: (CMPW (MOVDconst [c]) x) 7995 // cond: 7996 // result: (InvertFlags (CMPWconst x [int64(int32(c))])) 7997 for { 7998 _ = v.Args[1] 7999 v_0 := v.Args[0] 8000 if v_0.Op != OpS390XMOVDconst { 8001 break 8002 } 8003 c := v_0.AuxInt 8004 x := v.Args[1] 8005 v.reset(OpS390XInvertFlags) 8006 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 8007 v0.AuxInt = int64(int32(c)) 8008 v0.AddArg(x) 8009 v.AddArg(v0) 8010 return true 8011 } 8012 return false 8013 } 8014 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 8015 b := v.Block 8016 _ = b 8017 // match: (CMPWU x (MOVDconst [c])) 8018 // cond: 8019 // result: (CMPWUconst x [int64(int32(c))]) 8020 for { 8021 _ = v.Args[1] 8022 x := v.Args[0] 8023 v_1 := v.Args[1] 8024 if v_1.Op != OpS390XMOVDconst { 8025 break 8026 } 8027 c := v_1.AuxInt 8028 v.reset(OpS390XCMPWUconst) 8029 v.AuxInt = int64(int32(c)) 8030 v.AddArg(x) 8031 return true 8032 } 8033 // match: (CMPWU (MOVDconst [c]) x) 8034 // cond: 8035 // result: (InvertFlags (CMPWUconst x [int64(int32(c))])) 8036 for { 8037 _ = v.Args[1] 8038 v_0 := v.Args[0] 8039 if v_0.Op != OpS390XMOVDconst { 8040 break 8041 } 8042 c := v_0.AuxInt 8043 x := v.Args[1] 8044 v.reset(OpS390XInvertFlags) 8045 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 8046 v0.AuxInt = int64(int32(c)) 8047 v0.AddArg(x) 8048 v.AddArg(v0) 8049 return true 8050 } 8051 return false 8052 } 8053 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 8054 // match: (CMPWUconst (MOVDconst [x]) [y]) 8055 // cond: uint32(x)==uint32(y) 8056 // result: (FlagEQ) 8057 for { 8058 y := v.AuxInt 8059 v_0 := v.Args[0] 8060 if v_0.Op != OpS390XMOVDconst { 8061 break 8062 } 8063 x := v_0.AuxInt 8064 if !(uint32(x) == uint32(y)) { 8065 break 8066 } 8067 v.reset(OpS390XFlagEQ) 8068 return true 8069 } 8070 // match: (CMPWUconst (MOVDconst [x]) [y]) 8071 // cond: uint32(x)<uint32(y) 8072 // result: (FlagLT) 8073 for { 8074 y := v.AuxInt 8075 v_0 := v.Args[0] 8076 if v_0.Op != OpS390XMOVDconst { 8077 break 8078 } 8079 x := v_0.AuxInt 8080 if !(uint32(x) < uint32(y)) { 8081 break 8082 } 8083 v.reset(OpS390XFlagLT) 8084 return true 8085 } 8086 // match: (CMPWUconst (MOVDconst [x]) [y]) 8087 // cond: uint32(x)>uint32(y) 8088 // result: (FlagGT) 8089 for { 8090 y := v.AuxInt 8091 v_0 := v.Args[0] 8092 if v_0.Op != OpS390XMOVDconst { 8093 break 8094 } 8095 x := v_0.AuxInt 8096 if !(uint32(x) > uint32(y)) { 8097 break 8098 } 8099 v.reset(OpS390XFlagGT) 8100 return true 8101 } 8102 return false 8103 } 8104 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 8105 // match: (CMPWconst (MOVDconst [x]) [y]) 8106 // cond: int32(x)==int32(y) 8107 // result: (FlagEQ) 8108 for { 8109 y := v.AuxInt 8110 v_0 := v.Args[0] 8111 if v_0.Op != OpS390XMOVDconst { 8112 break 8113 } 8114 x := v_0.AuxInt 8115 if !(int32(x) == int32(y)) { 8116 break 8117 } 8118 v.reset(OpS390XFlagEQ) 8119 return true 8120 } 8121 // match: (CMPWconst (MOVDconst [x]) [y]) 8122 // cond: int32(x)<int32(y) 8123 // result: (FlagLT) 8124 for { 8125 y := v.AuxInt 8126 v_0 := v.Args[0] 8127 if v_0.Op != OpS390XMOVDconst { 8128 break 8129 } 8130 x := v_0.AuxInt 8131 if !(int32(x) < int32(y)) { 8132 break 8133 } 8134 v.reset(OpS390XFlagLT) 8135 return true 8136 } 8137 // match: (CMPWconst (MOVDconst [x]) [y]) 8138 // cond: int32(x)>int32(y) 8139 // result: (FlagGT) 8140 for { 8141 y := v.AuxInt 8142 v_0 := v.Args[0] 8143 if v_0.Op != OpS390XMOVDconst { 8144 break 8145 } 8146 x := v_0.AuxInt 8147 if !(int32(x) > int32(y)) { 8148 break 8149 } 8150 v.reset(OpS390XFlagGT) 8151 return true 8152 } 8153 // match: (CMPWconst (SRWconst _ [c]) [n]) 8154 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 8155 // result: (FlagLT) 8156 for { 8157 n := v.AuxInt 8158 v_0 := v.Args[0] 8159 if v_0.Op != OpS390XSRWconst { 8160 break 8161 } 8162 c := v_0.AuxInt 8163 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 8164 break 8165 } 8166 v.reset(OpS390XFlagLT) 8167 return true 8168 } 8169 // match: (CMPWconst (ANDWconst _ [m]) [n]) 8170 // cond: 0 <= int32(m) && int32(m) < int32(n) 8171 // result: (FlagLT) 8172 for { 8173 n := v.AuxInt 8174 v_0 := v.Args[0] 8175 if v_0.Op != OpS390XANDWconst { 8176 break 8177 } 8178 m := v_0.AuxInt 8179 if !(0 <= int32(m) && int32(m) < int32(n)) { 8180 break 8181 } 8182 v.reset(OpS390XFlagLT) 8183 return true 8184 } 8185 return false 8186 } 8187 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 8188 // match: (CMPconst (MOVDconst [x]) [y]) 8189 // cond: x==y 8190 // result: (FlagEQ) 8191 for { 8192 y := v.AuxInt 8193 v_0 := v.Args[0] 8194 if v_0.Op != OpS390XMOVDconst { 8195 break 8196 } 8197 x := v_0.AuxInt 8198 if !(x == y) { 8199 break 8200 } 8201 v.reset(OpS390XFlagEQ) 8202 return true 8203 } 8204 // match: (CMPconst (MOVDconst [x]) [y]) 8205 // cond: x<y 8206 // result: (FlagLT) 8207 for { 8208 y := v.AuxInt 8209 v_0 := v.Args[0] 8210 if v_0.Op != OpS390XMOVDconst { 8211 break 8212 } 8213 x := v_0.AuxInt 8214 if !(x < y) { 8215 break 8216 } 8217 v.reset(OpS390XFlagLT) 8218 return true 8219 } 8220 // match: (CMPconst (MOVDconst [x]) [y]) 8221 // cond: x>y 8222 // result: (FlagGT) 8223 for { 8224 y := v.AuxInt 8225 v_0 := v.Args[0] 8226 if v_0.Op != OpS390XMOVDconst { 8227 break 8228 } 8229 x := v_0.AuxInt 8230 if !(x > y) { 8231 break 8232 } 8233 v.reset(OpS390XFlagGT) 8234 return true 8235 } 8236 // match: (CMPconst (MOVBZreg _) [c]) 8237 // cond: 0xFF < c 8238 // result: (FlagLT) 8239 for { 8240 c := v.AuxInt 8241 v_0 := v.Args[0] 8242 if v_0.Op != OpS390XMOVBZreg { 8243 break 8244 } 8245 if !(0xFF < c) { 8246 break 8247 } 8248 v.reset(OpS390XFlagLT) 8249 return true 8250 } 8251 // match: (CMPconst (MOVHZreg _) [c]) 8252 // cond: 0xFFFF < c 8253 // result: (FlagLT) 8254 for { 8255 c := v.AuxInt 8256 v_0 := v.Args[0] 8257 if v_0.Op != OpS390XMOVHZreg { 8258 break 8259 } 8260 if !(0xFFFF < c) { 8261 break 8262 } 8263 v.reset(OpS390XFlagLT) 8264 return true 8265 } 8266 // match: (CMPconst (MOVWZreg _) [c]) 8267 // cond: 0xFFFFFFFF < c 8268 // result: (FlagLT) 8269 for { 8270 c := v.AuxInt 8271 v_0 := v.Args[0] 8272 if v_0.Op != OpS390XMOVWZreg { 8273 break 8274 } 8275 if !(0xFFFFFFFF < c) { 8276 break 8277 } 8278 v.reset(OpS390XFlagLT) 8279 return true 8280 } 8281 // match: (CMPconst (SRDconst _ [c]) [n]) 8282 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 8283 // result: (FlagLT) 8284 for { 8285 n := v.AuxInt 8286 v_0 := v.Args[0] 8287 if v_0.Op != OpS390XSRDconst { 8288 break 8289 } 8290 c := v_0.AuxInt 8291 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 8292 break 8293 } 8294 v.reset(OpS390XFlagLT) 8295 return true 8296 } 8297 // match: (CMPconst (ANDconst _ [m]) [n]) 8298 // cond: 0 <= m && m < n 8299 // result: (FlagLT) 8300 for { 8301 n := v.AuxInt 8302 v_0 := v.Args[0] 8303 if v_0.Op != OpS390XANDconst { 8304 break 8305 } 8306 m := v_0.AuxInt 8307 if !(0 <= m && m < n) { 8308 break 8309 } 8310 v.reset(OpS390XFlagLT) 8311 return true 8312 } 8313 return false 8314 } 8315 func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool { 8316 // match: (CPSDR y (FMOVDconst [c])) 8317 // cond: c & -1<<63 == 0 8318 // result: (LPDFR y) 8319 for { 8320 _ = v.Args[1] 8321 y := v.Args[0] 8322 v_1 := v.Args[1] 8323 if v_1.Op != OpS390XFMOVDconst { 8324 break 8325 } 8326 c := v_1.AuxInt 8327 if !(c&-1<<63 == 0) { 8328 break 8329 } 8330 v.reset(OpS390XLPDFR) 8331 v.AddArg(y) 8332 return true 8333 } 8334 // match: (CPSDR y (FMOVDconst [c])) 8335 // cond: c & -1<<63 != 0 8336 // result: (LNDFR y) 8337 for { 8338 _ = v.Args[1] 8339 y := v.Args[0] 8340 v_1 := v.Args[1] 8341 if v_1.Op != OpS390XFMOVDconst { 8342 break 8343 } 8344 c := v_1.AuxInt 8345 if !(c&-1<<63 != 0) { 8346 break 8347 } 8348 v.reset(OpS390XLNDFR) 8349 v.AddArg(y) 8350 return true 8351 } 8352 return false 8353 } 8354 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 8355 // match: (FADD (FMUL y z) x) 8356 // cond: 8357 // result: (FMADD x y z) 8358 for { 8359 _ = v.Args[1] 8360 v_0 := v.Args[0] 8361 if v_0.Op != OpS390XFMUL { 8362 break 8363 } 8364 _ = v_0.Args[1] 8365 y := v_0.Args[0] 8366 z := v_0.Args[1] 8367 x := v.Args[1] 8368 v.reset(OpS390XFMADD) 8369 v.AddArg(x) 8370 v.AddArg(y) 8371 v.AddArg(z) 8372 return true 8373 } 8374 // match: (FADD x (FMUL y z)) 8375 // cond: 8376 // result: (FMADD x y z) 8377 for { 8378 _ = v.Args[1] 8379 x := v.Args[0] 8380 v_1 := v.Args[1] 8381 if v_1.Op != OpS390XFMUL { 8382 break 8383 } 8384 _ = v_1.Args[1] 8385 y := v_1.Args[0] 8386 z := v_1.Args[1] 8387 v.reset(OpS390XFMADD) 8388 v.AddArg(x) 8389 v.AddArg(y) 8390 v.AddArg(z) 8391 return true 8392 } 8393 return false 8394 } 8395 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 8396 // match: (FADDS (FMULS y z) x) 8397 // cond: 8398 // result: (FMADDS x y z) 8399 for { 8400 _ = v.Args[1] 8401 v_0 := v.Args[0] 8402 if v_0.Op != OpS390XFMULS { 8403 break 8404 } 8405 _ = v_0.Args[1] 8406 y := v_0.Args[0] 8407 z := v_0.Args[1] 8408 x := v.Args[1] 8409 v.reset(OpS390XFMADDS) 8410 v.AddArg(x) 8411 v.AddArg(y) 8412 v.AddArg(z) 8413 return true 8414 } 8415 // match: (FADDS x (FMULS y z)) 8416 // cond: 8417 // result: (FMADDS x y z) 8418 for { 8419 _ = v.Args[1] 8420 x := v.Args[0] 8421 v_1 := v.Args[1] 8422 if v_1.Op != OpS390XFMULS { 8423 break 8424 } 8425 _ = v_1.Args[1] 8426 y := v_1.Args[0] 8427 z := v_1.Args[1] 8428 v.reset(OpS390XFMADDS) 8429 v.AddArg(x) 8430 v.AddArg(y) 8431 v.AddArg(z) 8432 return true 8433 } 8434 return false 8435 } 8436 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 8437 // match: (FMOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 8438 // cond: isSamePtr(ptr1, ptr2) 8439 // result: (LDGR x) 8440 for { 8441 off := v.AuxInt 8442 sym := v.Aux 8443 _ = v.Args[1] 8444 ptr1 := v.Args[0] 8445 v_1 := v.Args[1] 8446 if v_1.Op != OpS390XMOVDstore { 8447 break 8448 } 8449 if v_1.AuxInt != off { 8450 break 8451 } 8452 if v_1.Aux != sym { 8453 break 8454 } 8455 _ = v_1.Args[2] 8456 ptr2 := v_1.Args[0] 8457 x := v_1.Args[1] 8458 if !(isSamePtr(ptr1, ptr2)) { 8459 break 8460 } 8461 v.reset(OpS390XLDGR) 8462 v.AddArg(x) 8463 return true 8464 } 8465 // match: (FMOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 8466 // cond: isSamePtr(ptr1, ptr2) 8467 // result: x 8468 for { 8469 off := v.AuxInt 8470 sym := v.Aux 8471 _ = v.Args[1] 8472 ptr1 := v.Args[0] 8473 v_1 := v.Args[1] 8474 if v_1.Op != OpS390XFMOVDstore { 8475 break 8476 } 8477 if v_1.AuxInt != off { 8478 break 8479 } 8480 if v_1.Aux != sym { 8481 break 8482 } 8483 _ = v_1.Args[2] 8484 ptr2 := v_1.Args[0] 8485 x := v_1.Args[1] 8486 if !(isSamePtr(ptr1, ptr2)) { 8487 break 8488 } 8489 v.reset(OpCopy) 8490 v.Type = x.Type 8491 v.AddArg(x) 8492 return true 8493 } 8494 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 8495 // cond: is20Bit(off1+off2) 8496 // result: (FMOVDload [off1+off2] {sym} ptr mem) 8497 for { 8498 off1 := v.AuxInt 8499 sym := v.Aux 8500 _ = v.Args[1] 8501 v_0 := v.Args[0] 8502 if v_0.Op != OpS390XADDconst { 8503 break 8504 } 8505 off2 := v_0.AuxInt 8506 ptr := v_0.Args[0] 8507 mem := v.Args[1] 8508 if !(is20Bit(off1 + off2)) { 8509 break 8510 } 8511 v.reset(OpS390XFMOVDload) 8512 v.AuxInt = off1 + off2 8513 v.Aux = sym 8514 v.AddArg(ptr) 8515 v.AddArg(mem) 8516 return true 8517 } 8518 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8519 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8520 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8521 for { 8522 off1 := v.AuxInt 8523 sym1 := v.Aux 8524 _ = v.Args[1] 8525 v_0 := v.Args[0] 8526 if v_0.Op != OpS390XMOVDaddr { 8527 break 8528 } 8529 off2 := v_0.AuxInt 8530 sym2 := v_0.Aux 8531 base := v_0.Args[0] 8532 mem := v.Args[1] 8533 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8534 break 8535 } 8536 v.reset(OpS390XFMOVDload) 8537 v.AuxInt = off1 + off2 8538 v.Aux = mergeSym(sym1, sym2) 8539 v.AddArg(base) 8540 v.AddArg(mem) 8541 return true 8542 } 8543 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8544 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8545 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8546 for { 8547 off1 := v.AuxInt 8548 sym1 := v.Aux 8549 _ = v.Args[1] 8550 v_0 := v.Args[0] 8551 if v_0.Op != OpS390XMOVDaddridx { 8552 break 8553 } 8554 off2 := v_0.AuxInt 8555 sym2 := v_0.Aux 8556 _ = v_0.Args[1] 8557 ptr := v_0.Args[0] 8558 idx := v_0.Args[1] 8559 mem := v.Args[1] 8560 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8561 break 8562 } 8563 v.reset(OpS390XFMOVDloadidx) 8564 v.AuxInt = off1 + off2 8565 v.Aux = mergeSym(sym1, sym2) 8566 v.AddArg(ptr) 8567 v.AddArg(idx) 8568 v.AddArg(mem) 8569 return true 8570 } 8571 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 8572 // cond: ptr.Op != OpSB 8573 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 8574 for { 8575 off := v.AuxInt 8576 sym := v.Aux 8577 _ = v.Args[1] 8578 v_0 := v.Args[0] 8579 if v_0.Op != OpS390XADD { 8580 break 8581 } 8582 _ = v_0.Args[1] 8583 ptr := v_0.Args[0] 8584 idx := v_0.Args[1] 8585 mem := v.Args[1] 8586 if !(ptr.Op != OpSB) { 8587 break 8588 } 8589 v.reset(OpS390XFMOVDloadidx) 8590 v.AuxInt = off 8591 v.Aux = sym 8592 v.AddArg(ptr) 8593 v.AddArg(idx) 8594 v.AddArg(mem) 8595 return true 8596 } 8597 return false 8598 } 8599 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 8600 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8601 // cond: is20Bit(c+d) 8602 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8603 for { 8604 c := v.AuxInt 8605 sym := v.Aux 8606 _ = v.Args[2] 8607 v_0 := v.Args[0] 8608 if v_0.Op != OpS390XADDconst { 8609 break 8610 } 8611 d := v_0.AuxInt 8612 ptr := v_0.Args[0] 8613 idx := v.Args[1] 8614 mem := v.Args[2] 8615 if !(is20Bit(c + d)) { 8616 break 8617 } 8618 v.reset(OpS390XFMOVDloadidx) 8619 v.AuxInt = c + d 8620 v.Aux = sym 8621 v.AddArg(ptr) 8622 v.AddArg(idx) 8623 v.AddArg(mem) 8624 return true 8625 } 8626 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8627 // cond: is20Bit(c+d) 8628 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8629 for { 8630 c := v.AuxInt 8631 sym := v.Aux 8632 _ = v.Args[2] 8633 ptr := v.Args[0] 8634 v_1 := v.Args[1] 8635 if v_1.Op != OpS390XADDconst { 8636 break 8637 } 8638 d := v_1.AuxInt 8639 idx := v_1.Args[0] 8640 mem := v.Args[2] 8641 if !(is20Bit(c + d)) { 8642 break 8643 } 8644 v.reset(OpS390XFMOVDloadidx) 8645 v.AuxInt = c + d 8646 v.Aux = sym 8647 v.AddArg(ptr) 8648 v.AddArg(idx) 8649 v.AddArg(mem) 8650 return true 8651 } 8652 return false 8653 } 8654 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 8655 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8656 // cond: is20Bit(off1+off2) 8657 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 8658 for { 8659 off1 := v.AuxInt 8660 sym := v.Aux 8661 _ = v.Args[2] 8662 v_0 := v.Args[0] 8663 if v_0.Op != OpS390XADDconst { 8664 break 8665 } 8666 off2 := v_0.AuxInt 8667 ptr := v_0.Args[0] 8668 val := v.Args[1] 8669 mem := v.Args[2] 8670 if !(is20Bit(off1 + off2)) { 8671 break 8672 } 8673 v.reset(OpS390XFMOVDstore) 8674 v.AuxInt = off1 + off2 8675 v.Aux = sym 8676 v.AddArg(ptr) 8677 v.AddArg(val) 8678 v.AddArg(mem) 8679 return true 8680 } 8681 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8682 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8683 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8684 for { 8685 off1 := v.AuxInt 8686 sym1 := v.Aux 8687 _ = v.Args[2] 8688 v_0 := v.Args[0] 8689 if v_0.Op != OpS390XMOVDaddr { 8690 break 8691 } 8692 off2 := v_0.AuxInt 8693 sym2 := v_0.Aux 8694 base := v_0.Args[0] 8695 val := v.Args[1] 8696 mem := v.Args[2] 8697 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8698 break 8699 } 8700 v.reset(OpS390XFMOVDstore) 8701 v.AuxInt = off1 + off2 8702 v.Aux = mergeSym(sym1, sym2) 8703 v.AddArg(base) 8704 v.AddArg(val) 8705 v.AddArg(mem) 8706 return true 8707 } 8708 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8709 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8710 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8711 for { 8712 off1 := v.AuxInt 8713 sym1 := v.Aux 8714 _ = v.Args[2] 8715 v_0 := v.Args[0] 8716 if v_0.Op != OpS390XMOVDaddridx { 8717 break 8718 } 8719 off2 := v_0.AuxInt 8720 sym2 := v_0.Aux 8721 _ = v_0.Args[1] 8722 ptr := v_0.Args[0] 8723 idx := v_0.Args[1] 8724 val := v.Args[1] 8725 mem := v.Args[2] 8726 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8727 break 8728 } 8729 v.reset(OpS390XFMOVDstoreidx) 8730 v.AuxInt = off1 + off2 8731 v.Aux = mergeSym(sym1, sym2) 8732 v.AddArg(ptr) 8733 v.AddArg(idx) 8734 v.AddArg(val) 8735 v.AddArg(mem) 8736 return true 8737 } 8738 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 8739 // cond: ptr.Op != OpSB 8740 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 8741 for { 8742 off := v.AuxInt 8743 sym := v.Aux 8744 _ = v.Args[2] 8745 v_0 := v.Args[0] 8746 if v_0.Op != OpS390XADD { 8747 break 8748 } 8749 _ = v_0.Args[1] 8750 ptr := v_0.Args[0] 8751 idx := v_0.Args[1] 8752 val := v.Args[1] 8753 mem := v.Args[2] 8754 if !(ptr.Op != OpSB) { 8755 break 8756 } 8757 v.reset(OpS390XFMOVDstoreidx) 8758 v.AuxInt = off 8759 v.Aux = sym 8760 v.AddArg(ptr) 8761 v.AddArg(idx) 8762 v.AddArg(val) 8763 v.AddArg(mem) 8764 return true 8765 } 8766 return false 8767 } 8768 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 8769 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8770 // cond: is20Bit(c+d) 8771 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8772 for { 8773 c := v.AuxInt 8774 sym := v.Aux 8775 _ = v.Args[3] 8776 v_0 := v.Args[0] 8777 if v_0.Op != OpS390XADDconst { 8778 break 8779 } 8780 d := v_0.AuxInt 8781 ptr := v_0.Args[0] 8782 idx := v.Args[1] 8783 val := v.Args[2] 8784 mem := v.Args[3] 8785 if !(is20Bit(c + d)) { 8786 break 8787 } 8788 v.reset(OpS390XFMOVDstoreidx) 8789 v.AuxInt = c + d 8790 v.Aux = sym 8791 v.AddArg(ptr) 8792 v.AddArg(idx) 8793 v.AddArg(val) 8794 v.AddArg(mem) 8795 return true 8796 } 8797 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8798 // cond: is20Bit(c+d) 8799 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8800 for { 8801 c := v.AuxInt 8802 sym := v.Aux 8803 _ = v.Args[3] 8804 ptr := v.Args[0] 8805 v_1 := v.Args[1] 8806 if v_1.Op != OpS390XADDconst { 8807 break 8808 } 8809 d := v_1.AuxInt 8810 idx := v_1.Args[0] 8811 val := v.Args[2] 8812 mem := v.Args[3] 8813 if !(is20Bit(c + d)) { 8814 break 8815 } 8816 v.reset(OpS390XFMOVDstoreidx) 8817 v.AuxInt = c + d 8818 v.Aux = sym 8819 v.AddArg(ptr) 8820 v.AddArg(idx) 8821 v.AddArg(val) 8822 v.AddArg(mem) 8823 return true 8824 } 8825 return false 8826 } 8827 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 8828 // match: (FMOVSload [off] {sym} ptr1 (FMOVSstore [off] {sym} ptr2 x _)) 8829 // cond: isSamePtr(ptr1, ptr2) 8830 // result: x 8831 for { 8832 off := v.AuxInt 8833 sym := v.Aux 8834 _ = v.Args[1] 8835 ptr1 := v.Args[0] 8836 v_1 := v.Args[1] 8837 if v_1.Op != OpS390XFMOVSstore { 8838 break 8839 } 8840 if v_1.AuxInt != off { 8841 break 8842 } 8843 if v_1.Aux != sym { 8844 break 8845 } 8846 _ = v_1.Args[2] 8847 ptr2 := v_1.Args[0] 8848 x := v_1.Args[1] 8849 if !(isSamePtr(ptr1, ptr2)) { 8850 break 8851 } 8852 v.reset(OpCopy) 8853 v.Type = x.Type 8854 v.AddArg(x) 8855 return true 8856 } 8857 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 8858 // cond: is20Bit(off1+off2) 8859 // result: (FMOVSload [off1+off2] {sym} ptr mem) 8860 for { 8861 off1 := v.AuxInt 8862 sym := v.Aux 8863 _ = v.Args[1] 8864 v_0 := v.Args[0] 8865 if v_0.Op != OpS390XADDconst { 8866 break 8867 } 8868 off2 := v_0.AuxInt 8869 ptr := v_0.Args[0] 8870 mem := v.Args[1] 8871 if !(is20Bit(off1 + off2)) { 8872 break 8873 } 8874 v.reset(OpS390XFMOVSload) 8875 v.AuxInt = off1 + off2 8876 v.Aux = sym 8877 v.AddArg(ptr) 8878 v.AddArg(mem) 8879 return true 8880 } 8881 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8882 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8883 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8884 for { 8885 off1 := v.AuxInt 8886 sym1 := v.Aux 8887 _ = v.Args[1] 8888 v_0 := v.Args[0] 8889 if v_0.Op != OpS390XMOVDaddr { 8890 break 8891 } 8892 off2 := v_0.AuxInt 8893 sym2 := v_0.Aux 8894 base := v_0.Args[0] 8895 mem := v.Args[1] 8896 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8897 break 8898 } 8899 v.reset(OpS390XFMOVSload) 8900 v.AuxInt = off1 + off2 8901 v.Aux = mergeSym(sym1, sym2) 8902 v.AddArg(base) 8903 v.AddArg(mem) 8904 return true 8905 } 8906 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8907 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8908 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8909 for { 8910 off1 := v.AuxInt 8911 sym1 := v.Aux 8912 _ = v.Args[1] 8913 v_0 := v.Args[0] 8914 if v_0.Op != OpS390XMOVDaddridx { 8915 break 8916 } 8917 off2 := v_0.AuxInt 8918 sym2 := v_0.Aux 8919 _ = v_0.Args[1] 8920 ptr := v_0.Args[0] 8921 idx := v_0.Args[1] 8922 mem := v.Args[1] 8923 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8924 break 8925 } 8926 v.reset(OpS390XFMOVSloadidx) 8927 v.AuxInt = off1 + off2 8928 v.Aux = mergeSym(sym1, sym2) 8929 v.AddArg(ptr) 8930 v.AddArg(idx) 8931 v.AddArg(mem) 8932 return true 8933 } 8934 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8935 // cond: ptr.Op != OpSB 8936 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8937 for { 8938 off := v.AuxInt 8939 sym := v.Aux 8940 _ = v.Args[1] 8941 v_0 := v.Args[0] 8942 if v_0.Op != OpS390XADD { 8943 break 8944 } 8945 _ = v_0.Args[1] 8946 ptr := v_0.Args[0] 8947 idx := v_0.Args[1] 8948 mem := v.Args[1] 8949 if !(ptr.Op != OpSB) { 8950 break 8951 } 8952 v.reset(OpS390XFMOVSloadidx) 8953 v.AuxInt = off 8954 v.Aux = sym 8955 v.AddArg(ptr) 8956 v.AddArg(idx) 8957 v.AddArg(mem) 8958 return true 8959 } 8960 return false 8961 } 8962 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 8963 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8964 // cond: is20Bit(c+d) 8965 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8966 for { 8967 c := v.AuxInt 8968 sym := v.Aux 8969 _ = v.Args[2] 8970 v_0 := v.Args[0] 8971 if v_0.Op != OpS390XADDconst { 8972 break 8973 } 8974 d := v_0.AuxInt 8975 ptr := v_0.Args[0] 8976 idx := v.Args[1] 8977 mem := v.Args[2] 8978 if !(is20Bit(c + d)) { 8979 break 8980 } 8981 v.reset(OpS390XFMOVSloadidx) 8982 v.AuxInt = c + d 8983 v.Aux = sym 8984 v.AddArg(ptr) 8985 v.AddArg(idx) 8986 v.AddArg(mem) 8987 return true 8988 } 8989 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8990 // cond: is20Bit(c+d) 8991 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8992 for { 8993 c := v.AuxInt 8994 sym := v.Aux 8995 _ = v.Args[2] 8996 ptr := v.Args[0] 8997 v_1 := v.Args[1] 8998 if v_1.Op != OpS390XADDconst { 8999 break 9000 } 9001 d := v_1.AuxInt 9002 idx := v_1.Args[0] 9003 mem := v.Args[2] 9004 if !(is20Bit(c + d)) { 9005 break 9006 } 9007 v.reset(OpS390XFMOVSloadidx) 9008 v.AuxInt = c + d 9009 v.Aux = sym 9010 v.AddArg(ptr) 9011 v.AddArg(idx) 9012 v.AddArg(mem) 9013 return true 9014 } 9015 return false 9016 } 9017 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 9018 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9019 // cond: is20Bit(off1+off2) 9020 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 9021 for { 9022 off1 := v.AuxInt 9023 sym := v.Aux 9024 _ = v.Args[2] 9025 v_0 := v.Args[0] 9026 if v_0.Op != OpS390XADDconst { 9027 break 9028 } 9029 off2 := v_0.AuxInt 9030 ptr := v_0.Args[0] 9031 val := v.Args[1] 9032 mem := v.Args[2] 9033 if !(is20Bit(off1 + off2)) { 9034 break 9035 } 9036 v.reset(OpS390XFMOVSstore) 9037 v.AuxInt = off1 + off2 9038 v.Aux = sym 9039 v.AddArg(ptr) 9040 v.AddArg(val) 9041 v.AddArg(mem) 9042 return true 9043 } 9044 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9045 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9046 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9047 for { 9048 off1 := v.AuxInt 9049 sym1 := v.Aux 9050 _ = v.Args[2] 9051 v_0 := v.Args[0] 9052 if v_0.Op != OpS390XMOVDaddr { 9053 break 9054 } 9055 off2 := v_0.AuxInt 9056 sym2 := v_0.Aux 9057 base := v_0.Args[0] 9058 val := v.Args[1] 9059 mem := v.Args[2] 9060 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9061 break 9062 } 9063 v.reset(OpS390XFMOVSstore) 9064 v.AuxInt = off1 + off2 9065 v.Aux = mergeSym(sym1, sym2) 9066 v.AddArg(base) 9067 v.AddArg(val) 9068 v.AddArg(mem) 9069 return true 9070 } 9071 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9072 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9073 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9074 for { 9075 off1 := v.AuxInt 9076 sym1 := v.Aux 9077 _ = v.Args[2] 9078 v_0 := v.Args[0] 9079 if v_0.Op != OpS390XMOVDaddridx { 9080 break 9081 } 9082 off2 := v_0.AuxInt 9083 sym2 := v_0.Aux 9084 _ = v_0.Args[1] 9085 ptr := v_0.Args[0] 9086 idx := v_0.Args[1] 9087 val := v.Args[1] 9088 mem := v.Args[2] 9089 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9090 break 9091 } 9092 v.reset(OpS390XFMOVSstoreidx) 9093 v.AuxInt = off1 + off2 9094 v.Aux = mergeSym(sym1, sym2) 9095 v.AddArg(ptr) 9096 v.AddArg(idx) 9097 v.AddArg(val) 9098 v.AddArg(mem) 9099 return true 9100 } 9101 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 9102 // cond: ptr.Op != OpSB 9103 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 9104 for { 9105 off := v.AuxInt 9106 sym := v.Aux 9107 _ = v.Args[2] 9108 v_0 := v.Args[0] 9109 if v_0.Op != OpS390XADD { 9110 break 9111 } 9112 _ = v_0.Args[1] 9113 ptr := v_0.Args[0] 9114 idx := v_0.Args[1] 9115 val := v.Args[1] 9116 mem := v.Args[2] 9117 if !(ptr.Op != OpSB) { 9118 break 9119 } 9120 v.reset(OpS390XFMOVSstoreidx) 9121 v.AuxInt = off 9122 v.Aux = sym 9123 v.AddArg(ptr) 9124 v.AddArg(idx) 9125 v.AddArg(val) 9126 v.AddArg(mem) 9127 return true 9128 } 9129 return false 9130 } 9131 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 9132 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 9133 // cond: is20Bit(c+d) 9134 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 9135 for { 9136 c := v.AuxInt 9137 sym := v.Aux 9138 _ = v.Args[3] 9139 v_0 := v.Args[0] 9140 if v_0.Op != OpS390XADDconst { 9141 break 9142 } 9143 d := v_0.AuxInt 9144 ptr := v_0.Args[0] 9145 idx := v.Args[1] 9146 val := v.Args[2] 9147 mem := v.Args[3] 9148 if !(is20Bit(c + d)) { 9149 break 9150 } 9151 v.reset(OpS390XFMOVSstoreidx) 9152 v.AuxInt = c + d 9153 v.Aux = sym 9154 v.AddArg(ptr) 9155 v.AddArg(idx) 9156 v.AddArg(val) 9157 v.AddArg(mem) 9158 return true 9159 } 9160 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 9161 // cond: is20Bit(c+d) 9162 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 9163 for { 9164 c := v.AuxInt 9165 sym := v.Aux 9166 _ = v.Args[3] 9167 ptr := v.Args[0] 9168 v_1 := v.Args[1] 9169 if v_1.Op != OpS390XADDconst { 9170 break 9171 } 9172 d := v_1.AuxInt 9173 idx := v_1.Args[0] 9174 val := v.Args[2] 9175 mem := v.Args[3] 9176 if !(is20Bit(c + d)) { 9177 break 9178 } 9179 v.reset(OpS390XFMOVSstoreidx) 9180 v.AuxInt = c + d 9181 v.Aux = sym 9182 v.AddArg(ptr) 9183 v.AddArg(idx) 9184 v.AddArg(val) 9185 v.AddArg(mem) 9186 return true 9187 } 9188 return false 9189 } 9190 func rewriteValueS390X_OpS390XFNEG_0(v *Value) bool { 9191 // match: (FNEG (LPDFR x)) 9192 // cond: 9193 // result: (LNDFR x) 9194 for { 9195 v_0 := v.Args[0] 9196 if v_0.Op != OpS390XLPDFR { 9197 break 9198 } 9199 x := v_0.Args[0] 9200 v.reset(OpS390XLNDFR) 9201 v.AddArg(x) 9202 return true 9203 } 9204 // match: (FNEG (LNDFR x)) 9205 // cond: 9206 // result: (LPDFR x) 9207 for { 9208 v_0 := v.Args[0] 9209 if v_0.Op != OpS390XLNDFR { 9210 break 9211 } 9212 x := v_0.Args[0] 9213 v.reset(OpS390XLPDFR) 9214 v.AddArg(x) 9215 return true 9216 } 9217 return false 9218 } 9219 func rewriteValueS390X_OpS390XFNEGS_0(v *Value) bool { 9220 // match: (FNEGS (LPDFR x)) 9221 // cond: 9222 // result: (LNDFR x) 9223 for { 9224 v_0 := v.Args[0] 9225 if v_0.Op != OpS390XLPDFR { 9226 break 9227 } 9228 x := v_0.Args[0] 9229 v.reset(OpS390XLNDFR) 9230 v.AddArg(x) 9231 return true 9232 } 9233 // match: (FNEGS (LNDFR x)) 9234 // cond: 9235 // result: (LPDFR x) 9236 for { 9237 v_0 := v.Args[0] 9238 if v_0.Op != OpS390XLNDFR { 9239 break 9240 } 9241 x := v_0.Args[0] 9242 v.reset(OpS390XLPDFR) 9243 v.AddArg(x) 9244 return true 9245 } 9246 return false 9247 } 9248 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 9249 // match: (FSUB (FMUL y z) x) 9250 // cond: 9251 // result: (FMSUB x y z) 9252 for { 9253 _ = v.Args[1] 9254 v_0 := v.Args[0] 9255 if v_0.Op != OpS390XFMUL { 9256 break 9257 } 9258 _ = v_0.Args[1] 9259 y := v_0.Args[0] 9260 z := v_0.Args[1] 9261 x := v.Args[1] 9262 v.reset(OpS390XFMSUB) 9263 v.AddArg(x) 9264 v.AddArg(y) 9265 v.AddArg(z) 9266 return true 9267 } 9268 return false 9269 } 9270 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 9271 // match: (FSUBS (FMULS y z) x) 9272 // cond: 9273 // result: (FMSUBS x y z) 9274 for { 9275 _ = v.Args[1] 9276 v_0 := v.Args[0] 9277 if v_0.Op != OpS390XFMULS { 9278 break 9279 } 9280 _ = v_0.Args[1] 9281 y := v_0.Args[0] 9282 z := v_0.Args[1] 9283 x := v.Args[1] 9284 v.reset(OpS390XFMSUBS) 9285 v.AddArg(x) 9286 v.AddArg(y) 9287 v.AddArg(z) 9288 return true 9289 } 9290 return false 9291 } 9292 func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { 9293 b := v.Block 9294 _ = b 9295 // match: (LDGR <t> (SRDconst [1] (SLDconst [1] x))) 9296 // cond: 9297 // result: (LPDFR (LDGR <t> x)) 9298 for { 9299 t := v.Type 9300 v_0 := v.Args[0] 9301 if v_0.Op != OpS390XSRDconst { 9302 break 9303 } 9304 if v_0.AuxInt != 1 { 9305 break 9306 } 9307 v_0_0 := v_0.Args[0] 9308 if v_0_0.Op != OpS390XSLDconst { 9309 break 9310 } 9311 if v_0_0.AuxInt != 1 { 9312 break 9313 } 9314 x := v_0_0.Args[0] 9315 v.reset(OpS390XLPDFR) 9316 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 9317 v0.AddArg(x) 9318 v.AddArg(v0) 9319 return true 9320 } 9321 // match: (LDGR <t> (OR (MOVDconst [-1<<63]) x)) 9322 // cond: 9323 // result: (LNDFR (LDGR <t> x)) 9324 for { 9325 t := v.Type 9326 v_0 := v.Args[0] 9327 if v_0.Op != OpS390XOR { 9328 break 9329 } 9330 _ = v_0.Args[1] 9331 v_0_0 := v_0.Args[0] 9332 if v_0_0.Op != OpS390XMOVDconst { 9333 break 9334 } 9335 if v_0_0.AuxInt != -1<<63 { 9336 break 9337 } 9338 x := v_0.Args[1] 9339 v.reset(OpS390XLNDFR) 9340 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 9341 v0.AddArg(x) 9342 v.AddArg(v0) 9343 return true 9344 } 9345 // match: (LDGR <t> (OR x (MOVDconst [-1<<63]))) 9346 // cond: 9347 // result: (LNDFR (LDGR <t> x)) 9348 for { 9349 t := v.Type 9350 v_0 := v.Args[0] 9351 if v_0.Op != OpS390XOR { 9352 break 9353 } 9354 _ = v_0.Args[1] 9355 x := v_0.Args[0] 9356 v_0_1 := v_0.Args[1] 9357 if v_0_1.Op != OpS390XMOVDconst { 9358 break 9359 } 9360 if v_0_1.AuxInt != -1<<63 { 9361 break 9362 } 9363 v.reset(OpS390XLNDFR) 9364 v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) 9365 v0.AddArg(x) 9366 v.AddArg(v0) 9367 return true 9368 } 9369 // match: (LDGR <t> x:(ORload <t1> [off] {sym} (MOVDconst [-1<<63]) ptr mem)) 9370 // cond: x.Uses == 1 && clobber(x) 9371 // result: @x.Block (LNDFR <t> (LDGR <t> (MOVDload <t1> [off] {sym} ptr mem))) 9372 for { 9373 t := v.Type 9374 x := v.Args[0] 9375 if x.Op != OpS390XORload { 9376 break 9377 } 9378 t1 := x.Type 9379 off := x.AuxInt 9380 sym := x.Aux 9381 _ = x.Args[2] 9382 x_0 := x.Args[0] 9383 if x_0.Op != OpS390XMOVDconst { 9384 break 9385 } 9386 if x_0.AuxInt != -1<<63 { 9387 break 9388 } 9389 ptr := x.Args[1] 9390 mem := x.Args[2] 9391 if !(x.Uses == 1 && clobber(x)) { 9392 break 9393 } 9394 b = x.Block 9395 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, t) 9396 v.reset(OpCopy) 9397 v.AddArg(v0) 9398 v1 := b.NewValue0(v.Pos, OpS390XLDGR, t) 9399 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, t1) 9400 v2.AuxInt = off 9401 v2.Aux = sym 9402 v2.AddArg(ptr) 9403 v2.AddArg(mem) 9404 v1.AddArg(v2) 9405 v0.AddArg(v1) 9406 return true 9407 } 9408 // match: (LDGR (LGDR x)) 9409 // cond: 9410 // result: x 9411 for { 9412 v_0 := v.Args[0] 9413 if v_0.Op != OpS390XLGDR { 9414 break 9415 } 9416 x := v_0.Args[0] 9417 v.reset(OpCopy) 9418 v.Type = x.Type 9419 v.AddArg(x) 9420 return true 9421 } 9422 return false 9423 } 9424 func rewriteValueS390X_OpS390XLEDBR_0(v *Value) bool { 9425 // match: (LEDBR (LPDFR (LDEBR x))) 9426 // cond: 9427 // result: (LPDFR x) 9428 for { 9429 v_0 := v.Args[0] 9430 if v_0.Op != OpS390XLPDFR { 9431 break 9432 } 9433 v_0_0 := v_0.Args[0] 9434 if v_0_0.Op != OpS390XLDEBR { 9435 break 9436 } 9437 x := v_0_0.Args[0] 9438 v.reset(OpS390XLPDFR) 9439 v.AddArg(x) 9440 return true 9441 } 9442 // match: (LEDBR (LNDFR (LDEBR x))) 9443 // cond: 9444 // result: (LNDFR x) 9445 for { 9446 v_0 := v.Args[0] 9447 if v_0.Op != OpS390XLNDFR { 9448 break 9449 } 9450 v_0_0 := v_0.Args[0] 9451 if v_0_0.Op != OpS390XLDEBR { 9452 break 9453 } 9454 x := v_0_0.Args[0] 9455 v.reset(OpS390XLNDFR) 9456 v.AddArg(x) 9457 return true 9458 } 9459 return false 9460 } 9461 func rewriteValueS390X_OpS390XLGDR_0(v *Value) bool { 9462 // match: (LGDR (LDGR x)) 9463 // cond: 9464 // result: (MOVDreg x) 9465 for { 9466 v_0 := v.Args[0] 9467 if v_0.Op != OpS390XLDGR { 9468 break 9469 } 9470 x := v_0.Args[0] 9471 v.reset(OpS390XMOVDreg) 9472 v.AddArg(x) 9473 return true 9474 } 9475 return false 9476 } 9477 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 9478 // match: (LoweredRound32F x:(FMOVSconst)) 9479 // cond: 9480 // result: x 9481 for { 9482 x := v.Args[0] 9483 if x.Op != OpS390XFMOVSconst { 9484 break 9485 } 9486 v.reset(OpCopy) 9487 v.Type = x.Type 9488 v.AddArg(x) 9489 return true 9490 } 9491 return false 9492 } 9493 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 9494 // match: (LoweredRound64F x:(FMOVDconst)) 9495 // cond: 9496 // result: x 9497 for { 9498 x := v.Args[0] 9499 if x.Op != OpS390XFMOVDconst { 9500 break 9501 } 9502 v.reset(OpCopy) 9503 v.Type = x.Type 9504 v.AddArg(x) 9505 return true 9506 } 9507 return false 9508 } 9509 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 9510 // match: (MOVBZload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 9511 // cond: isSamePtr(ptr1, ptr2) 9512 // result: (MOVBZreg x) 9513 for { 9514 off := v.AuxInt 9515 sym := v.Aux 9516 _ = v.Args[1] 9517 ptr1 := v.Args[0] 9518 v_1 := v.Args[1] 9519 if v_1.Op != OpS390XMOVBstore { 9520 break 9521 } 9522 if v_1.AuxInt != off { 9523 break 9524 } 9525 if v_1.Aux != sym { 9526 break 9527 } 9528 _ = v_1.Args[2] 9529 ptr2 := v_1.Args[0] 9530 x := v_1.Args[1] 9531 if !(isSamePtr(ptr1, ptr2)) { 9532 break 9533 } 9534 v.reset(OpS390XMOVBZreg) 9535 v.AddArg(x) 9536 return true 9537 } 9538 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 9539 // cond: is20Bit(off1+off2) 9540 // result: (MOVBZload [off1+off2] {sym} ptr mem) 9541 for { 9542 off1 := v.AuxInt 9543 sym := v.Aux 9544 _ = v.Args[1] 9545 v_0 := v.Args[0] 9546 if v_0.Op != OpS390XADDconst { 9547 break 9548 } 9549 off2 := v_0.AuxInt 9550 ptr := v_0.Args[0] 9551 mem := v.Args[1] 9552 if !(is20Bit(off1 + off2)) { 9553 break 9554 } 9555 v.reset(OpS390XMOVBZload) 9556 v.AuxInt = off1 + off2 9557 v.Aux = sym 9558 v.AddArg(ptr) 9559 v.AddArg(mem) 9560 return true 9561 } 9562 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 9563 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9564 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 9565 for { 9566 off1 := v.AuxInt 9567 sym1 := v.Aux 9568 _ = v.Args[1] 9569 v_0 := v.Args[0] 9570 if v_0.Op != OpS390XMOVDaddr { 9571 break 9572 } 9573 off2 := v_0.AuxInt 9574 sym2 := v_0.Aux 9575 base := v_0.Args[0] 9576 mem := v.Args[1] 9577 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9578 break 9579 } 9580 v.reset(OpS390XMOVBZload) 9581 v.AuxInt = off1 + off2 9582 v.Aux = mergeSym(sym1, sym2) 9583 v.AddArg(base) 9584 v.AddArg(mem) 9585 return true 9586 } 9587 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 9588 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9589 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 9590 for { 9591 off1 := v.AuxInt 9592 sym1 := v.Aux 9593 _ = v.Args[1] 9594 v_0 := v.Args[0] 9595 if v_0.Op != OpS390XMOVDaddridx { 9596 break 9597 } 9598 off2 := v_0.AuxInt 9599 sym2 := v_0.Aux 9600 _ = v_0.Args[1] 9601 ptr := v_0.Args[0] 9602 idx := v_0.Args[1] 9603 mem := v.Args[1] 9604 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9605 break 9606 } 9607 v.reset(OpS390XMOVBZloadidx) 9608 v.AuxInt = off1 + off2 9609 v.Aux = mergeSym(sym1, sym2) 9610 v.AddArg(ptr) 9611 v.AddArg(idx) 9612 v.AddArg(mem) 9613 return true 9614 } 9615 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 9616 // cond: ptr.Op != OpSB 9617 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 9618 for { 9619 off := v.AuxInt 9620 sym := v.Aux 9621 _ = v.Args[1] 9622 v_0 := v.Args[0] 9623 if v_0.Op != OpS390XADD { 9624 break 9625 } 9626 _ = v_0.Args[1] 9627 ptr := v_0.Args[0] 9628 idx := v_0.Args[1] 9629 mem := v.Args[1] 9630 if !(ptr.Op != OpSB) { 9631 break 9632 } 9633 v.reset(OpS390XMOVBZloadidx) 9634 v.AuxInt = off 9635 v.Aux = sym 9636 v.AddArg(ptr) 9637 v.AddArg(idx) 9638 v.AddArg(mem) 9639 return true 9640 } 9641 return false 9642 } 9643 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 9644 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 9645 // cond: is20Bit(c+d) 9646 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 9647 for { 9648 c := v.AuxInt 9649 sym := v.Aux 9650 _ = v.Args[2] 9651 v_0 := v.Args[0] 9652 if v_0.Op != OpS390XADDconst { 9653 break 9654 } 9655 d := v_0.AuxInt 9656 ptr := v_0.Args[0] 9657 idx := v.Args[1] 9658 mem := v.Args[2] 9659 if !(is20Bit(c + d)) { 9660 break 9661 } 9662 v.reset(OpS390XMOVBZloadidx) 9663 v.AuxInt = c + d 9664 v.Aux = sym 9665 v.AddArg(ptr) 9666 v.AddArg(idx) 9667 v.AddArg(mem) 9668 return true 9669 } 9670 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 9671 // cond: is20Bit(c+d) 9672 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 9673 for { 9674 c := v.AuxInt 9675 sym := v.Aux 9676 _ = v.Args[2] 9677 idx := v.Args[0] 9678 v_1 := v.Args[1] 9679 if v_1.Op != OpS390XADDconst { 9680 break 9681 } 9682 d := v_1.AuxInt 9683 ptr := v_1.Args[0] 9684 mem := v.Args[2] 9685 if !(is20Bit(c + d)) { 9686 break 9687 } 9688 v.reset(OpS390XMOVBZloadidx) 9689 v.AuxInt = c + d 9690 v.Aux = sym 9691 v.AddArg(ptr) 9692 v.AddArg(idx) 9693 v.AddArg(mem) 9694 return true 9695 } 9696 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 9697 // cond: is20Bit(c+d) 9698 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 9699 for { 9700 c := v.AuxInt 9701 sym := v.Aux 9702 _ = v.Args[2] 9703 ptr := v.Args[0] 9704 v_1 := v.Args[1] 9705 if v_1.Op != OpS390XADDconst { 9706 break 9707 } 9708 d := v_1.AuxInt 9709 idx := v_1.Args[0] 9710 mem := v.Args[2] 9711 if !(is20Bit(c + d)) { 9712 break 9713 } 9714 v.reset(OpS390XMOVBZloadidx) 9715 v.AuxInt = c + d 9716 v.Aux = sym 9717 v.AddArg(ptr) 9718 v.AddArg(idx) 9719 v.AddArg(mem) 9720 return true 9721 } 9722 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 9723 // cond: is20Bit(c+d) 9724 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 9725 for { 9726 c := v.AuxInt 9727 sym := v.Aux 9728 _ = v.Args[2] 9729 v_0 := v.Args[0] 9730 if v_0.Op != OpS390XADDconst { 9731 break 9732 } 9733 d := v_0.AuxInt 9734 idx := v_0.Args[0] 9735 ptr := v.Args[1] 9736 mem := v.Args[2] 9737 if !(is20Bit(c + d)) { 9738 break 9739 } 9740 v.reset(OpS390XMOVBZloadidx) 9741 v.AuxInt = c + d 9742 v.Aux = sym 9743 v.AddArg(ptr) 9744 v.AddArg(idx) 9745 v.AddArg(mem) 9746 return true 9747 } 9748 return false 9749 } 9750 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 9751 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 9752 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9753 // result: (MOVDreg x) 9754 for { 9755 x := v.Args[0] 9756 if x.Op != OpS390XMOVDLT { 9757 break 9758 } 9759 _ = x.Args[2] 9760 x_0 := x.Args[0] 9761 if x_0.Op != OpS390XMOVDconst { 9762 break 9763 } 9764 c := x_0.AuxInt 9765 x_1 := x.Args[1] 9766 if x_1.Op != OpS390XMOVDconst { 9767 break 9768 } 9769 d := x_1.AuxInt 9770 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9771 break 9772 } 9773 v.reset(OpS390XMOVDreg) 9774 v.AddArg(x) 9775 return true 9776 } 9777 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 9778 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9779 // result: (MOVDreg x) 9780 for { 9781 x := v.Args[0] 9782 if x.Op != OpS390XMOVDLE { 9783 break 9784 } 9785 _ = x.Args[2] 9786 x_0 := x.Args[0] 9787 if x_0.Op != OpS390XMOVDconst { 9788 break 9789 } 9790 c := x_0.AuxInt 9791 x_1 := x.Args[1] 9792 if x_1.Op != OpS390XMOVDconst { 9793 break 9794 } 9795 d := x_1.AuxInt 9796 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9797 break 9798 } 9799 v.reset(OpS390XMOVDreg) 9800 v.AddArg(x) 9801 return true 9802 } 9803 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 9804 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9805 // result: (MOVDreg x) 9806 for { 9807 x := v.Args[0] 9808 if x.Op != OpS390XMOVDGT { 9809 break 9810 } 9811 _ = x.Args[2] 9812 x_0 := x.Args[0] 9813 if x_0.Op != OpS390XMOVDconst { 9814 break 9815 } 9816 c := x_0.AuxInt 9817 x_1 := x.Args[1] 9818 if x_1.Op != OpS390XMOVDconst { 9819 break 9820 } 9821 d := x_1.AuxInt 9822 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9823 break 9824 } 9825 v.reset(OpS390XMOVDreg) 9826 v.AddArg(x) 9827 return true 9828 } 9829 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 9830 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9831 // result: (MOVDreg x) 9832 for { 9833 x := v.Args[0] 9834 if x.Op != OpS390XMOVDGE { 9835 break 9836 } 9837 _ = x.Args[2] 9838 x_0 := x.Args[0] 9839 if x_0.Op != OpS390XMOVDconst { 9840 break 9841 } 9842 c := x_0.AuxInt 9843 x_1 := x.Args[1] 9844 if x_1.Op != OpS390XMOVDconst { 9845 break 9846 } 9847 d := x_1.AuxInt 9848 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9849 break 9850 } 9851 v.reset(OpS390XMOVDreg) 9852 v.AddArg(x) 9853 return true 9854 } 9855 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 9856 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9857 // result: (MOVDreg x) 9858 for { 9859 x := v.Args[0] 9860 if x.Op != OpS390XMOVDEQ { 9861 break 9862 } 9863 _ = x.Args[2] 9864 x_0 := x.Args[0] 9865 if x_0.Op != OpS390XMOVDconst { 9866 break 9867 } 9868 c := x_0.AuxInt 9869 x_1 := x.Args[1] 9870 if x_1.Op != OpS390XMOVDconst { 9871 break 9872 } 9873 d := x_1.AuxInt 9874 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9875 break 9876 } 9877 v.reset(OpS390XMOVDreg) 9878 v.AddArg(x) 9879 return true 9880 } 9881 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 9882 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9883 // result: (MOVDreg x) 9884 for { 9885 x := v.Args[0] 9886 if x.Op != OpS390XMOVDNE { 9887 break 9888 } 9889 _ = x.Args[2] 9890 x_0 := x.Args[0] 9891 if x_0.Op != OpS390XMOVDconst { 9892 break 9893 } 9894 c := x_0.AuxInt 9895 x_1 := x.Args[1] 9896 if x_1.Op != OpS390XMOVDconst { 9897 break 9898 } 9899 d := x_1.AuxInt 9900 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9901 break 9902 } 9903 v.reset(OpS390XMOVDreg) 9904 v.AddArg(x) 9905 return true 9906 } 9907 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9908 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9909 // result: (MOVDreg x) 9910 for { 9911 x := v.Args[0] 9912 if x.Op != OpS390XMOVDGTnoinv { 9913 break 9914 } 9915 _ = x.Args[2] 9916 x_0 := x.Args[0] 9917 if x_0.Op != OpS390XMOVDconst { 9918 break 9919 } 9920 c := x_0.AuxInt 9921 x_1 := x.Args[1] 9922 if x_1.Op != OpS390XMOVDconst { 9923 break 9924 } 9925 d := x_1.AuxInt 9926 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9927 break 9928 } 9929 v.reset(OpS390XMOVDreg) 9930 v.AddArg(x) 9931 return true 9932 } 9933 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9934 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9935 // result: (MOVDreg x) 9936 for { 9937 x := v.Args[0] 9938 if x.Op != OpS390XMOVDGEnoinv { 9939 break 9940 } 9941 _ = x.Args[2] 9942 x_0 := x.Args[0] 9943 if x_0.Op != OpS390XMOVDconst { 9944 break 9945 } 9946 c := x_0.AuxInt 9947 x_1 := x.Args[1] 9948 if x_1.Op != OpS390XMOVDconst { 9949 break 9950 } 9951 d := x_1.AuxInt 9952 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9953 break 9954 } 9955 v.reset(OpS390XMOVDreg) 9956 v.AddArg(x) 9957 return true 9958 } 9959 // match: (MOVBZreg x:(MOVBZload _ _)) 9960 // cond: 9961 // result: (MOVDreg x) 9962 for { 9963 x := v.Args[0] 9964 if x.Op != OpS390XMOVBZload { 9965 break 9966 } 9967 _ = x.Args[1] 9968 v.reset(OpS390XMOVDreg) 9969 v.AddArg(x) 9970 return true 9971 } 9972 // match: (MOVBZreg x:(Arg <t>)) 9973 // cond: is8BitInt(t) && !isSigned(t) 9974 // result: (MOVDreg x) 9975 for { 9976 x := v.Args[0] 9977 if x.Op != OpArg { 9978 break 9979 } 9980 t := x.Type 9981 if !(is8BitInt(t) && !isSigned(t)) { 9982 break 9983 } 9984 v.reset(OpS390XMOVDreg) 9985 v.AddArg(x) 9986 return true 9987 } 9988 return false 9989 } 9990 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 9991 b := v.Block 9992 _ = b 9993 // match: (MOVBZreg x:(MOVBZreg _)) 9994 // cond: 9995 // result: (MOVDreg x) 9996 for { 9997 x := v.Args[0] 9998 if x.Op != OpS390XMOVBZreg { 9999 break 10000 } 10001 v.reset(OpS390XMOVDreg) 10002 v.AddArg(x) 10003 return true 10004 } 10005 // match: (MOVBZreg (MOVDconst [c])) 10006 // cond: 10007 // result: (MOVDconst [int64(uint8(c))]) 10008 for { 10009 v_0 := v.Args[0] 10010 if v_0.Op != OpS390XMOVDconst { 10011 break 10012 } 10013 c := v_0.AuxInt 10014 v.reset(OpS390XMOVDconst) 10015 v.AuxInt = int64(uint8(c)) 10016 return true 10017 } 10018 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 10019 // cond: x.Uses == 1 && clobber(x) 10020 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 10021 for { 10022 x := v.Args[0] 10023 if x.Op != OpS390XMOVBZload { 10024 break 10025 } 10026 off := x.AuxInt 10027 sym := x.Aux 10028 _ = x.Args[1] 10029 ptr := x.Args[0] 10030 mem := x.Args[1] 10031 if !(x.Uses == 1 && clobber(x)) { 10032 break 10033 } 10034 b = x.Block 10035 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 10036 v.reset(OpCopy) 10037 v.AddArg(v0) 10038 v0.AuxInt = off 10039 v0.Aux = sym 10040 v0.AddArg(ptr) 10041 v0.AddArg(mem) 10042 return true 10043 } 10044 // match: (MOVBZreg x:(MOVBload [off] {sym} ptr mem)) 10045 // cond: x.Uses == 1 && clobber(x) 10046 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 10047 for { 10048 x := v.Args[0] 10049 if x.Op != OpS390XMOVBload { 10050 break 10051 } 10052 off := x.AuxInt 10053 sym := x.Aux 10054 _ = x.Args[1] 10055 ptr := x.Args[0] 10056 mem := x.Args[1] 10057 if !(x.Uses == 1 && clobber(x)) { 10058 break 10059 } 10060 b = x.Block 10061 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 10062 v.reset(OpCopy) 10063 v.AddArg(v0) 10064 v0.AuxInt = off 10065 v0.Aux = sym 10066 v0.AddArg(ptr) 10067 v0.AddArg(mem) 10068 return true 10069 } 10070 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 10071 // cond: x.Uses == 1 && clobber(x) 10072 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 10073 for { 10074 x := v.Args[0] 10075 if x.Op != OpS390XMOVBZloadidx { 10076 break 10077 } 10078 off := x.AuxInt 10079 sym := x.Aux 10080 _ = x.Args[2] 10081 ptr := x.Args[0] 10082 idx := x.Args[1] 10083 mem := x.Args[2] 10084 if !(x.Uses == 1 && clobber(x)) { 10085 break 10086 } 10087 b = x.Block 10088 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 10089 v.reset(OpCopy) 10090 v.AddArg(v0) 10091 v0.AuxInt = off 10092 v0.Aux = sym 10093 v0.AddArg(ptr) 10094 v0.AddArg(idx) 10095 v0.AddArg(mem) 10096 return true 10097 } 10098 // match: (MOVBZreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 10099 // cond: x.Uses == 1 && clobber(x) 10100 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 10101 for { 10102 x := v.Args[0] 10103 if x.Op != OpS390XMOVBloadidx { 10104 break 10105 } 10106 off := x.AuxInt 10107 sym := x.Aux 10108 _ = x.Args[2] 10109 ptr := x.Args[0] 10110 idx := x.Args[1] 10111 mem := x.Args[2] 10112 if !(x.Uses == 1 && clobber(x)) { 10113 break 10114 } 10115 b = x.Block 10116 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 10117 v.reset(OpCopy) 10118 v.AddArg(v0) 10119 v0.AuxInt = off 10120 v0.Aux = sym 10121 v0.AddArg(ptr) 10122 v0.AddArg(idx) 10123 v0.AddArg(mem) 10124 return true 10125 } 10126 return false 10127 } 10128 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 10129 // match: (MOVBload [off] {sym} ptr1 (MOVBstore [off] {sym} ptr2 x _)) 10130 // cond: isSamePtr(ptr1, ptr2) 10131 // result: (MOVBreg x) 10132 for { 10133 off := v.AuxInt 10134 sym := v.Aux 10135 _ = v.Args[1] 10136 ptr1 := v.Args[0] 10137 v_1 := v.Args[1] 10138 if v_1.Op != OpS390XMOVBstore { 10139 break 10140 } 10141 if v_1.AuxInt != off { 10142 break 10143 } 10144 if v_1.Aux != sym { 10145 break 10146 } 10147 _ = v_1.Args[2] 10148 ptr2 := v_1.Args[0] 10149 x := v_1.Args[1] 10150 if !(isSamePtr(ptr1, ptr2)) { 10151 break 10152 } 10153 v.reset(OpS390XMOVBreg) 10154 v.AddArg(x) 10155 return true 10156 } 10157 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 10158 // cond: is20Bit(off1+off2) 10159 // result: (MOVBload [off1+off2] {sym} ptr mem) 10160 for { 10161 off1 := v.AuxInt 10162 sym := v.Aux 10163 _ = v.Args[1] 10164 v_0 := v.Args[0] 10165 if v_0.Op != OpS390XADDconst { 10166 break 10167 } 10168 off2 := v_0.AuxInt 10169 ptr := v_0.Args[0] 10170 mem := v.Args[1] 10171 if !(is20Bit(off1 + off2)) { 10172 break 10173 } 10174 v.reset(OpS390XMOVBload) 10175 v.AuxInt = off1 + off2 10176 v.Aux = sym 10177 v.AddArg(ptr) 10178 v.AddArg(mem) 10179 return true 10180 } 10181 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10182 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10183 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10184 for { 10185 off1 := v.AuxInt 10186 sym1 := v.Aux 10187 _ = v.Args[1] 10188 v_0 := v.Args[0] 10189 if v_0.Op != OpS390XMOVDaddr { 10190 break 10191 } 10192 off2 := v_0.AuxInt 10193 sym2 := v_0.Aux 10194 base := v_0.Args[0] 10195 mem := v.Args[1] 10196 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10197 break 10198 } 10199 v.reset(OpS390XMOVBload) 10200 v.AuxInt = off1 + off2 10201 v.Aux = mergeSym(sym1, sym2) 10202 v.AddArg(base) 10203 v.AddArg(mem) 10204 return true 10205 } 10206 // match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10207 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10208 // result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10209 for { 10210 off1 := v.AuxInt 10211 sym1 := v.Aux 10212 _ = v.Args[1] 10213 v_0 := v.Args[0] 10214 if v_0.Op != OpS390XMOVDaddridx { 10215 break 10216 } 10217 off2 := v_0.AuxInt 10218 sym2 := v_0.Aux 10219 _ = v_0.Args[1] 10220 ptr := v_0.Args[0] 10221 idx := v_0.Args[1] 10222 mem := v.Args[1] 10223 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10224 break 10225 } 10226 v.reset(OpS390XMOVBloadidx) 10227 v.AuxInt = off1 + off2 10228 v.Aux = mergeSym(sym1, sym2) 10229 v.AddArg(ptr) 10230 v.AddArg(idx) 10231 v.AddArg(mem) 10232 return true 10233 } 10234 // match: (MOVBload [off] {sym} (ADD ptr idx) mem) 10235 // cond: ptr.Op != OpSB 10236 // result: (MOVBloadidx [off] {sym} ptr idx mem) 10237 for { 10238 off := v.AuxInt 10239 sym := v.Aux 10240 _ = v.Args[1] 10241 v_0 := v.Args[0] 10242 if v_0.Op != OpS390XADD { 10243 break 10244 } 10245 _ = v_0.Args[1] 10246 ptr := v_0.Args[0] 10247 idx := v_0.Args[1] 10248 mem := v.Args[1] 10249 if !(ptr.Op != OpSB) { 10250 break 10251 } 10252 v.reset(OpS390XMOVBloadidx) 10253 v.AuxInt = off 10254 v.Aux = sym 10255 v.AddArg(ptr) 10256 v.AddArg(idx) 10257 v.AddArg(mem) 10258 return true 10259 } 10260 return false 10261 } 10262 func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { 10263 // match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10264 // cond: is20Bit(c+d) 10265 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 10266 for { 10267 c := v.AuxInt 10268 sym := v.Aux 10269 _ = v.Args[2] 10270 v_0 := v.Args[0] 10271 if v_0.Op != OpS390XADDconst { 10272 break 10273 } 10274 d := v_0.AuxInt 10275 ptr := v_0.Args[0] 10276 idx := v.Args[1] 10277 mem := v.Args[2] 10278 if !(is20Bit(c + d)) { 10279 break 10280 } 10281 v.reset(OpS390XMOVBloadidx) 10282 v.AuxInt = c + d 10283 v.Aux = sym 10284 v.AddArg(ptr) 10285 v.AddArg(idx) 10286 v.AddArg(mem) 10287 return true 10288 } 10289 // match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 10290 // cond: is20Bit(c+d) 10291 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 10292 for { 10293 c := v.AuxInt 10294 sym := v.Aux 10295 _ = v.Args[2] 10296 idx := v.Args[0] 10297 v_1 := v.Args[1] 10298 if v_1.Op != OpS390XADDconst { 10299 break 10300 } 10301 d := v_1.AuxInt 10302 ptr := v_1.Args[0] 10303 mem := v.Args[2] 10304 if !(is20Bit(c + d)) { 10305 break 10306 } 10307 v.reset(OpS390XMOVBloadidx) 10308 v.AuxInt = c + d 10309 v.Aux = sym 10310 v.AddArg(ptr) 10311 v.AddArg(idx) 10312 v.AddArg(mem) 10313 return true 10314 } 10315 // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10316 // cond: is20Bit(c+d) 10317 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 10318 for { 10319 c := v.AuxInt 10320 sym := v.Aux 10321 _ = v.Args[2] 10322 ptr := v.Args[0] 10323 v_1 := v.Args[1] 10324 if v_1.Op != OpS390XADDconst { 10325 break 10326 } 10327 d := v_1.AuxInt 10328 idx := v_1.Args[0] 10329 mem := v.Args[2] 10330 if !(is20Bit(c + d)) { 10331 break 10332 } 10333 v.reset(OpS390XMOVBloadidx) 10334 v.AuxInt = c + d 10335 v.Aux = sym 10336 v.AddArg(ptr) 10337 v.AddArg(idx) 10338 v.AddArg(mem) 10339 return true 10340 } 10341 // match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 10342 // cond: is20Bit(c+d) 10343 // result: (MOVBloadidx [c+d] {sym} ptr idx mem) 10344 for { 10345 c := v.AuxInt 10346 sym := v.Aux 10347 _ = v.Args[2] 10348 v_0 := v.Args[0] 10349 if v_0.Op != OpS390XADDconst { 10350 break 10351 } 10352 d := v_0.AuxInt 10353 idx := v_0.Args[0] 10354 ptr := v.Args[1] 10355 mem := v.Args[2] 10356 if !(is20Bit(c + d)) { 10357 break 10358 } 10359 v.reset(OpS390XMOVBloadidx) 10360 v.AuxInt = c + d 10361 v.Aux = sym 10362 v.AddArg(ptr) 10363 v.AddArg(idx) 10364 v.AddArg(mem) 10365 return true 10366 } 10367 return false 10368 } 10369 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 10370 b := v.Block 10371 _ = b 10372 // match: (MOVBreg x:(MOVBload _ _)) 10373 // cond: 10374 // result: (MOVDreg x) 10375 for { 10376 x := v.Args[0] 10377 if x.Op != OpS390XMOVBload { 10378 break 10379 } 10380 _ = x.Args[1] 10381 v.reset(OpS390XMOVDreg) 10382 v.AddArg(x) 10383 return true 10384 } 10385 // match: (MOVBreg x:(Arg <t>)) 10386 // cond: is8BitInt(t) && isSigned(t) 10387 // result: (MOVDreg x) 10388 for { 10389 x := v.Args[0] 10390 if x.Op != OpArg { 10391 break 10392 } 10393 t := x.Type 10394 if !(is8BitInt(t) && isSigned(t)) { 10395 break 10396 } 10397 v.reset(OpS390XMOVDreg) 10398 v.AddArg(x) 10399 return true 10400 } 10401 // match: (MOVBreg x:(MOVBreg _)) 10402 // cond: 10403 // result: (MOVDreg x) 10404 for { 10405 x := v.Args[0] 10406 if x.Op != OpS390XMOVBreg { 10407 break 10408 } 10409 v.reset(OpS390XMOVDreg) 10410 v.AddArg(x) 10411 return true 10412 } 10413 // match: (MOVBreg (MOVDconst [c])) 10414 // cond: 10415 // result: (MOVDconst [int64(int8(c))]) 10416 for { 10417 v_0 := v.Args[0] 10418 if v_0.Op != OpS390XMOVDconst { 10419 break 10420 } 10421 c := v_0.AuxInt 10422 v.reset(OpS390XMOVDconst) 10423 v.AuxInt = int64(int8(c)) 10424 return true 10425 } 10426 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 10427 // cond: x.Uses == 1 && clobber(x) 10428 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 10429 for { 10430 x := v.Args[0] 10431 if x.Op != OpS390XMOVBZload { 10432 break 10433 } 10434 off := x.AuxInt 10435 sym := x.Aux 10436 _ = x.Args[1] 10437 ptr := x.Args[0] 10438 mem := x.Args[1] 10439 if !(x.Uses == 1 && clobber(x)) { 10440 break 10441 } 10442 b = x.Block 10443 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 10444 v.reset(OpCopy) 10445 v.AddArg(v0) 10446 v0.AuxInt = off 10447 v0.Aux = sym 10448 v0.AddArg(ptr) 10449 v0.AddArg(mem) 10450 return true 10451 } 10452 // match: (MOVBreg x:(MOVBload [off] {sym} ptr mem)) 10453 // cond: x.Uses == 1 && clobber(x) 10454 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 10455 for { 10456 x := v.Args[0] 10457 if x.Op != OpS390XMOVBload { 10458 break 10459 } 10460 off := x.AuxInt 10461 sym := x.Aux 10462 _ = x.Args[1] 10463 ptr := x.Args[0] 10464 mem := x.Args[1] 10465 if !(x.Uses == 1 && clobber(x)) { 10466 break 10467 } 10468 b = x.Block 10469 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 10470 v.reset(OpCopy) 10471 v.AddArg(v0) 10472 v0.AuxInt = off 10473 v0.Aux = sym 10474 v0.AddArg(ptr) 10475 v0.AddArg(mem) 10476 return true 10477 } 10478 // match: (MOVBreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 10479 // cond: x.Uses == 1 && clobber(x) 10480 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 10481 for { 10482 x := v.Args[0] 10483 if x.Op != OpS390XMOVBZloadidx { 10484 break 10485 } 10486 off := x.AuxInt 10487 sym := x.Aux 10488 _ = x.Args[2] 10489 ptr := x.Args[0] 10490 idx := x.Args[1] 10491 mem := x.Args[2] 10492 if !(x.Uses == 1 && clobber(x)) { 10493 break 10494 } 10495 b = x.Block 10496 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 10497 v.reset(OpCopy) 10498 v.AddArg(v0) 10499 v0.AuxInt = off 10500 v0.Aux = sym 10501 v0.AddArg(ptr) 10502 v0.AddArg(idx) 10503 v0.AddArg(mem) 10504 return true 10505 } 10506 // match: (MOVBreg x:(MOVBloadidx [off] {sym} ptr idx mem)) 10507 // cond: x.Uses == 1 && clobber(x) 10508 // result: @x.Block (MOVBloadidx <v.Type> [off] {sym} ptr idx mem) 10509 for { 10510 x := v.Args[0] 10511 if x.Op != OpS390XMOVBloadidx { 10512 break 10513 } 10514 off := x.AuxInt 10515 sym := x.Aux 10516 _ = x.Args[2] 10517 ptr := x.Args[0] 10518 idx := x.Args[1] 10519 mem := x.Args[2] 10520 if !(x.Uses == 1 && clobber(x)) { 10521 break 10522 } 10523 b = x.Block 10524 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, v.Type) 10525 v.reset(OpCopy) 10526 v.AddArg(v0) 10527 v0.AuxInt = off 10528 v0.Aux = sym 10529 v0.AddArg(ptr) 10530 v0.AddArg(idx) 10531 v0.AddArg(mem) 10532 return true 10533 } 10534 return false 10535 } 10536 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 10537 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 10538 // cond: 10539 // result: (MOVBstore [off] {sym} ptr x mem) 10540 for { 10541 off := v.AuxInt 10542 sym := v.Aux 10543 _ = v.Args[2] 10544 ptr := v.Args[0] 10545 v_1 := v.Args[1] 10546 if v_1.Op != OpS390XMOVBreg { 10547 break 10548 } 10549 x := v_1.Args[0] 10550 mem := v.Args[2] 10551 v.reset(OpS390XMOVBstore) 10552 v.AuxInt = off 10553 v.Aux = sym 10554 v.AddArg(ptr) 10555 v.AddArg(x) 10556 v.AddArg(mem) 10557 return true 10558 } 10559 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 10560 // cond: 10561 // result: (MOVBstore [off] {sym} ptr x mem) 10562 for { 10563 off := v.AuxInt 10564 sym := v.Aux 10565 _ = v.Args[2] 10566 ptr := v.Args[0] 10567 v_1 := v.Args[1] 10568 if v_1.Op != OpS390XMOVBZreg { 10569 break 10570 } 10571 x := v_1.Args[0] 10572 mem := v.Args[2] 10573 v.reset(OpS390XMOVBstore) 10574 v.AuxInt = off 10575 v.Aux = sym 10576 v.AddArg(ptr) 10577 v.AddArg(x) 10578 v.AddArg(mem) 10579 return true 10580 } 10581 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10582 // cond: is20Bit(off1+off2) 10583 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 10584 for { 10585 off1 := v.AuxInt 10586 sym := v.Aux 10587 _ = v.Args[2] 10588 v_0 := v.Args[0] 10589 if v_0.Op != OpS390XADDconst { 10590 break 10591 } 10592 off2 := v_0.AuxInt 10593 ptr := v_0.Args[0] 10594 val := v.Args[1] 10595 mem := v.Args[2] 10596 if !(is20Bit(off1 + off2)) { 10597 break 10598 } 10599 v.reset(OpS390XMOVBstore) 10600 v.AuxInt = off1 + off2 10601 v.Aux = sym 10602 v.AddArg(ptr) 10603 v.AddArg(val) 10604 v.AddArg(mem) 10605 return true 10606 } 10607 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 10608 // cond: is20Bit(off) && ptr.Op != OpSB 10609 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 10610 for { 10611 off := v.AuxInt 10612 sym := v.Aux 10613 _ = v.Args[2] 10614 ptr := v.Args[0] 10615 v_1 := v.Args[1] 10616 if v_1.Op != OpS390XMOVDconst { 10617 break 10618 } 10619 c := v_1.AuxInt 10620 mem := v.Args[2] 10621 if !(is20Bit(off) && ptr.Op != OpSB) { 10622 break 10623 } 10624 v.reset(OpS390XMOVBstoreconst) 10625 v.AuxInt = makeValAndOff(int64(int8(c)), off) 10626 v.Aux = sym 10627 v.AddArg(ptr) 10628 v.AddArg(mem) 10629 return true 10630 } 10631 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10632 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10633 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10634 for { 10635 off1 := v.AuxInt 10636 sym1 := v.Aux 10637 _ = v.Args[2] 10638 v_0 := v.Args[0] 10639 if v_0.Op != OpS390XMOVDaddr { 10640 break 10641 } 10642 off2 := v_0.AuxInt 10643 sym2 := v_0.Aux 10644 base := v_0.Args[0] 10645 val := v.Args[1] 10646 mem := v.Args[2] 10647 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10648 break 10649 } 10650 v.reset(OpS390XMOVBstore) 10651 v.AuxInt = off1 + off2 10652 v.Aux = mergeSym(sym1, sym2) 10653 v.AddArg(base) 10654 v.AddArg(val) 10655 v.AddArg(mem) 10656 return true 10657 } 10658 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10659 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10660 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10661 for { 10662 off1 := v.AuxInt 10663 sym1 := v.Aux 10664 _ = v.Args[2] 10665 v_0 := v.Args[0] 10666 if v_0.Op != OpS390XMOVDaddridx { 10667 break 10668 } 10669 off2 := v_0.AuxInt 10670 sym2 := v_0.Aux 10671 _ = v_0.Args[1] 10672 ptr := v_0.Args[0] 10673 idx := v_0.Args[1] 10674 val := v.Args[1] 10675 mem := v.Args[2] 10676 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10677 break 10678 } 10679 v.reset(OpS390XMOVBstoreidx) 10680 v.AuxInt = off1 + off2 10681 v.Aux = mergeSym(sym1, sym2) 10682 v.AddArg(ptr) 10683 v.AddArg(idx) 10684 v.AddArg(val) 10685 v.AddArg(mem) 10686 return true 10687 } 10688 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 10689 // cond: ptr.Op != OpSB 10690 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 10691 for { 10692 off := v.AuxInt 10693 sym := v.Aux 10694 _ = v.Args[2] 10695 v_0 := v.Args[0] 10696 if v_0.Op != OpS390XADD { 10697 break 10698 } 10699 _ = v_0.Args[1] 10700 ptr := v_0.Args[0] 10701 idx := v_0.Args[1] 10702 val := v.Args[1] 10703 mem := v.Args[2] 10704 if !(ptr.Op != OpSB) { 10705 break 10706 } 10707 v.reset(OpS390XMOVBstoreidx) 10708 v.AuxInt = off 10709 v.Aux = sym 10710 v.AddArg(ptr) 10711 v.AddArg(idx) 10712 v.AddArg(val) 10713 v.AddArg(mem) 10714 return true 10715 } 10716 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 10717 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10718 // result: (MOVHstore [i-1] {s} p w mem) 10719 for { 10720 i := v.AuxInt 10721 s := v.Aux 10722 _ = v.Args[2] 10723 p := v.Args[0] 10724 w := v.Args[1] 10725 x := v.Args[2] 10726 if x.Op != OpS390XMOVBstore { 10727 break 10728 } 10729 if x.AuxInt != i-1 { 10730 break 10731 } 10732 if x.Aux != s { 10733 break 10734 } 10735 _ = x.Args[2] 10736 if p != x.Args[0] { 10737 break 10738 } 10739 x_1 := x.Args[1] 10740 if x_1.Op != OpS390XSRDconst { 10741 break 10742 } 10743 if x_1.AuxInt != 8 { 10744 break 10745 } 10746 if w != x_1.Args[0] { 10747 break 10748 } 10749 mem := x.Args[2] 10750 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10751 break 10752 } 10753 v.reset(OpS390XMOVHstore) 10754 v.AuxInt = i - 1 10755 v.Aux = s 10756 v.AddArg(p) 10757 v.AddArg(w) 10758 v.AddArg(mem) 10759 return true 10760 } 10761 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 10762 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10763 // result: (MOVHstore [i-1] {s} p w0 mem) 10764 for { 10765 i := v.AuxInt 10766 s := v.Aux 10767 _ = v.Args[2] 10768 p := v.Args[0] 10769 w0 := v.Args[1] 10770 if w0.Op != OpS390XSRDconst { 10771 break 10772 } 10773 j := w0.AuxInt 10774 w := w0.Args[0] 10775 x := v.Args[2] 10776 if x.Op != OpS390XMOVBstore { 10777 break 10778 } 10779 if x.AuxInt != i-1 { 10780 break 10781 } 10782 if x.Aux != s { 10783 break 10784 } 10785 _ = x.Args[2] 10786 if p != x.Args[0] { 10787 break 10788 } 10789 x_1 := x.Args[1] 10790 if x_1.Op != OpS390XSRDconst { 10791 break 10792 } 10793 if x_1.AuxInt != j+8 { 10794 break 10795 } 10796 if w != x_1.Args[0] { 10797 break 10798 } 10799 mem := x.Args[2] 10800 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10801 break 10802 } 10803 v.reset(OpS390XMOVHstore) 10804 v.AuxInt = i - 1 10805 v.Aux = s 10806 v.AddArg(p) 10807 v.AddArg(w0) 10808 v.AddArg(mem) 10809 return true 10810 } 10811 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 10812 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10813 // result: (MOVHstore [i-1] {s} p w mem) 10814 for { 10815 i := v.AuxInt 10816 s := v.Aux 10817 _ = v.Args[2] 10818 p := v.Args[0] 10819 w := v.Args[1] 10820 x := v.Args[2] 10821 if x.Op != OpS390XMOVBstore { 10822 break 10823 } 10824 if x.AuxInt != i-1 { 10825 break 10826 } 10827 if x.Aux != s { 10828 break 10829 } 10830 _ = x.Args[2] 10831 if p != x.Args[0] { 10832 break 10833 } 10834 x_1 := x.Args[1] 10835 if x_1.Op != OpS390XSRWconst { 10836 break 10837 } 10838 if x_1.AuxInt != 8 { 10839 break 10840 } 10841 if w != x_1.Args[0] { 10842 break 10843 } 10844 mem := x.Args[2] 10845 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10846 break 10847 } 10848 v.reset(OpS390XMOVHstore) 10849 v.AuxInt = i - 1 10850 v.Aux = s 10851 v.AddArg(p) 10852 v.AddArg(w) 10853 v.AddArg(mem) 10854 return true 10855 } 10856 return false 10857 } 10858 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 10859 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 10860 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10861 // result: (MOVHstore [i-1] {s} p w0 mem) 10862 for { 10863 i := v.AuxInt 10864 s := v.Aux 10865 _ = v.Args[2] 10866 p := v.Args[0] 10867 w0 := v.Args[1] 10868 if w0.Op != OpS390XSRWconst { 10869 break 10870 } 10871 j := w0.AuxInt 10872 w := w0.Args[0] 10873 x := v.Args[2] 10874 if x.Op != OpS390XMOVBstore { 10875 break 10876 } 10877 if x.AuxInt != i-1 { 10878 break 10879 } 10880 if x.Aux != s { 10881 break 10882 } 10883 _ = x.Args[2] 10884 if p != x.Args[0] { 10885 break 10886 } 10887 x_1 := x.Args[1] 10888 if x_1.Op != OpS390XSRWconst { 10889 break 10890 } 10891 if x_1.AuxInt != j+8 { 10892 break 10893 } 10894 if w != x_1.Args[0] { 10895 break 10896 } 10897 mem := x.Args[2] 10898 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10899 break 10900 } 10901 v.reset(OpS390XMOVHstore) 10902 v.AuxInt = i - 1 10903 v.Aux = s 10904 v.AddArg(p) 10905 v.AddArg(w0) 10906 v.AddArg(mem) 10907 return true 10908 } 10909 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 10910 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10911 // result: (MOVHBRstore [i-1] {s} p w mem) 10912 for { 10913 i := v.AuxInt 10914 s := v.Aux 10915 _ = v.Args[2] 10916 p := v.Args[0] 10917 v_1 := v.Args[1] 10918 if v_1.Op != OpS390XSRDconst { 10919 break 10920 } 10921 if v_1.AuxInt != 8 { 10922 break 10923 } 10924 w := v_1.Args[0] 10925 x := v.Args[2] 10926 if x.Op != OpS390XMOVBstore { 10927 break 10928 } 10929 if x.AuxInt != i-1 { 10930 break 10931 } 10932 if x.Aux != s { 10933 break 10934 } 10935 _ = x.Args[2] 10936 if p != x.Args[0] { 10937 break 10938 } 10939 if w != x.Args[1] { 10940 break 10941 } 10942 mem := x.Args[2] 10943 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10944 break 10945 } 10946 v.reset(OpS390XMOVHBRstore) 10947 v.AuxInt = i - 1 10948 v.Aux = s 10949 v.AddArg(p) 10950 v.AddArg(w) 10951 v.AddArg(mem) 10952 return true 10953 } 10954 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 10955 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 10956 // result: (MOVHBRstore [i-1] {s} p w0 mem) 10957 for { 10958 i := v.AuxInt 10959 s := v.Aux 10960 _ = v.Args[2] 10961 p := v.Args[0] 10962 v_1 := v.Args[1] 10963 if v_1.Op != OpS390XSRDconst { 10964 break 10965 } 10966 j := v_1.AuxInt 10967 w := v_1.Args[0] 10968 x := v.Args[2] 10969 if x.Op != OpS390XMOVBstore { 10970 break 10971 } 10972 if x.AuxInt != i-1 { 10973 break 10974 } 10975 if x.Aux != s { 10976 break 10977 } 10978 _ = x.Args[2] 10979 if p != x.Args[0] { 10980 break 10981 } 10982 w0 := x.Args[1] 10983 if w0.Op != OpS390XSRDconst { 10984 break 10985 } 10986 if w0.AuxInt != j-8 { 10987 break 10988 } 10989 if w != w0.Args[0] { 10990 break 10991 } 10992 mem := x.Args[2] 10993 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10994 break 10995 } 10996 v.reset(OpS390XMOVHBRstore) 10997 v.AuxInt = i - 1 10998 v.Aux = s 10999 v.AddArg(p) 11000 v.AddArg(w0) 11001 v.AddArg(mem) 11002 return true 11003 } 11004 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 11005 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11006 // result: (MOVHBRstore [i-1] {s} p w mem) 11007 for { 11008 i := v.AuxInt 11009 s := v.Aux 11010 _ = v.Args[2] 11011 p := v.Args[0] 11012 v_1 := v.Args[1] 11013 if v_1.Op != OpS390XSRWconst { 11014 break 11015 } 11016 if v_1.AuxInt != 8 { 11017 break 11018 } 11019 w := v_1.Args[0] 11020 x := v.Args[2] 11021 if x.Op != OpS390XMOVBstore { 11022 break 11023 } 11024 if x.AuxInt != i-1 { 11025 break 11026 } 11027 if x.Aux != s { 11028 break 11029 } 11030 _ = x.Args[2] 11031 if p != x.Args[0] { 11032 break 11033 } 11034 if w != x.Args[1] { 11035 break 11036 } 11037 mem := x.Args[2] 11038 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11039 break 11040 } 11041 v.reset(OpS390XMOVHBRstore) 11042 v.AuxInt = i - 1 11043 v.Aux = s 11044 v.AddArg(p) 11045 v.AddArg(w) 11046 v.AddArg(mem) 11047 return true 11048 } 11049 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 11050 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11051 // result: (MOVHBRstore [i-1] {s} p w0 mem) 11052 for { 11053 i := v.AuxInt 11054 s := v.Aux 11055 _ = v.Args[2] 11056 p := v.Args[0] 11057 v_1 := v.Args[1] 11058 if v_1.Op != OpS390XSRWconst { 11059 break 11060 } 11061 j := v_1.AuxInt 11062 w := v_1.Args[0] 11063 x := v.Args[2] 11064 if x.Op != OpS390XMOVBstore { 11065 break 11066 } 11067 if x.AuxInt != i-1 { 11068 break 11069 } 11070 if x.Aux != s { 11071 break 11072 } 11073 _ = x.Args[2] 11074 if p != x.Args[0] { 11075 break 11076 } 11077 w0 := x.Args[1] 11078 if w0.Op != OpS390XSRWconst { 11079 break 11080 } 11081 if w0.AuxInt != j-8 { 11082 break 11083 } 11084 if w != w0.Args[0] { 11085 break 11086 } 11087 mem := x.Args[2] 11088 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11089 break 11090 } 11091 v.reset(OpS390XMOVHBRstore) 11092 v.AuxInt = i - 1 11093 v.Aux = s 11094 v.AddArg(p) 11095 v.AddArg(w0) 11096 v.AddArg(mem) 11097 return true 11098 } 11099 return false 11100 } 11101 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 11102 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 11103 // cond: is20Bit(ValAndOff(sc).Off()+off) 11104 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 11105 for { 11106 sc := v.AuxInt 11107 s := v.Aux 11108 _ = v.Args[1] 11109 v_0 := v.Args[0] 11110 if v_0.Op != OpS390XADDconst { 11111 break 11112 } 11113 off := v_0.AuxInt 11114 ptr := v_0.Args[0] 11115 mem := v.Args[1] 11116 if !(is20Bit(ValAndOff(sc).Off() + off)) { 11117 break 11118 } 11119 v.reset(OpS390XMOVBstoreconst) 11120 v.AuxInt = ValAndOff(sc).add(off) 11121 v.Aux = s 11122 v.AddArg(ptr) 11123 v.AddArg(mem) 11124 return true 11125 } 11126 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 11127 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 11128 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 11129 for { 11130 sc := v.AuxInt 11131 sym1 := v.Aux 11132 _ = v.Args[1] 11133 v_0 := v.Args[0] 11134 if v_0.Op != OpS390XMOVDaddr { 11135 break 11136 } 11137 off := v_0.AuxInt 11138 sym2 := v_0.Aux 11139 ptr := v_0.Args[0] 11140 mem := v.Args[1] 11141 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 11142 break 11143 } 11144 v.reset(OpS390XMOVBstoreconst) 11145 v.AuxInt = ValAndOff(sc).add(off) 11146 v.Aux = mergeSym(sym1, sym2) 11147 v.AddArg(ptr) 11148 v.AddArg(mem) 11149 return true 11150 } 11151 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 11152 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 11153 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 11154 for { 11155 c := v.AuxInt 11156 s := v.Aux 11157 _ = v.Args[1] 11158 p := v.Args[0] 11159 x := v.Args[1] 11160 if x.Op != OpS390XMOVBstoreconst { 11161 break 11162 } 11163 a := x.AuxInt 11164 if x.Aux != s { 11165 break 11166 } 11167 _ = x.Args[1] 11168 if p != x.Args[0] { 11169 break 11170 } 11171 mem := x.Args[1] 11172 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 11173 break 11174 } 11175 v.reset(OpS390XMOVHstoreconst) 11176 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 11177 v.Aux = s 11178 v.AddArg(p) 11179 v.AddArg(mem) 11180 return true 11181 } 11182 return false 11183 } 11184 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 11185 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 11186 // cond: is20Bit(c+d) 11187 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 11188 for { 11189 c := v.AuxInt 11190 sym := v.Aux 11191 _ = v.Args[3] 11192 v_0 := v.Args[0] 11193 if v_0.Op != OpS390XADDconst { 11194 break 11195 } 11196 d := v_0.AuxInt 11197 ptr := v_0.Args[0] 11198 idx := v.Args[1] 11199 val := v.Args[2] 11200 mem := v.Args[3] 11201 if !(is20Bit(c + d)) { 11202 break 11203 } 11204 v.reset(OpS390XMOVBstoreidx) 11205 v.AuxInt = c + d 11206 v.Aux = sym 11207 v.AddArg(ptr) 11208 v.AddArg(idx) 11209 v.AddArg(val) 11210 v.AddArg(mem) 11211 return true 11212 } 11213 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 11214 // cond: is20Bit(c+d) 11215 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 11216 for { 11217 c := v.AuxInt 11218 sym := v.Aux 11219 _ = v.Args[3] 11220 idx := v.Args[0] 11221 v_1 := v.Args[1] 11222 if v_1.Op != OpS390XADDconst { 11223 break 11224 } 11225 d := v_1.AuxInt 11226 ptr := v_1.Args[0] 11227 val := v.Args[2] 11228 mem := v.Args[3] 11229 if !(is20Bit(c + d)) { 11230 break 11231 } 11232 v.reset(OpS390XMOVBstoreidx) 11233 v.AuxInt = c + d 11234 v.Aux = sym 11235 v.AddArg(ptr) 11236 v.AddArg(idx) 11237 v.AddArg(val) 11238 v.AddArg(mem) 11239 return true 11240 } 11241 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 11242 // cond: is20Bit(c+d) 11243 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 11244 for { 11245 c := v.AuxInt 11246 sym := v.Aux 11247 _ = v.Args[3] 11248 ptr := v.Args[0] 11249 v_1 := v.Args[1] 11250 if v_1.Op != OpS390XADDconst { 11251 break 11252 } 11253 d := v_1.AuxInt 11254 idx := v_1.Args[0] 11255 val := v.Args[2] 11256 mem := v.Args[3] 11257 if !(is20Bit(c + d)) { 11258 break 11259 } 11260 v.reset(OpS390XMOVBstoreidx) 11261 v.AuxInt = c + d 11262 v.Aux = sym 11263 v.AddArg(ptr) 11264 v.AddArg(idx) 11265 v.AddArg(val) 11266 v.AddArg(mem) 11267 return true 11268 } 11269 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 11270 // cond: is20Bit(c+d) 11271 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 11272 for { 11273 c := v.AuxInt 11274 sym := v.Aux 11275 _ = v.Args[3] 11276 v_0 := v.Args[0] 11277 if v_0.Op != OpS390XADDconst { 11278 break 11279 } 11280 d := v_0.AuxInt 11281 idx := v_0.Args[0] 11282 ptr := v.Args[1] 11283 val := v.Args[2] 11284 mem := v.Args[3] 11285 if !(is20Bit(c + d)) { 11286 break 11287 } 11288 v.reset(OpS390XMOVBstoreidx) 11289 v.AuxInt = c + d 11290 v.Aux = sym 11291 v.AddArg(ptr) 11292 v.AddArg(idx) 11293 v.AddArg(val) 11294 v.AddArg(mem) 11295 return true 11296 } 11297 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 11298 // cond: x.Uses == 1 && clobber(x) 11299 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11300 for { 11301 i := v.AuxInt 11302 s := v.Aux 11303 _ = v.Args[3] 11304 p := v.Args[0] 11305 idx := v.Args[1] 11306 w := v.Args[2] 11307 x := v.Args[3] 11308 if x.Op != OpS390XMOVBstoreidx { 11309 break 11310 } 11311 if x.AuxInt != i-1 { 11312 break 11313 } 11314 if x.Aux != s { 11315 break 11316 } 11317 _ = x.Args[3] 11318 if p != x.Args[0] { 11319 break 11320 } 11321 if idx != x.Args[1] { 11322 break 11323 } 11324 x_2 := x.Args[2] 11325 if x_2.Op != OpS390XSRDconst { 11326 break 11327 } 11328 if x_2.AuxInt != 8 { 11329 break 11330 } 11331 if w != x_2.Args[0] { 11332 break 11333 } 11334 mem := x.Args[3] 11335 if !(x.Uses == 1 && clobber(x)) { 11336 break 11337 } 11338 v.reset(OpS390XMOVHstoreidx) 11339 v.AuxInt = i - 1 11340 v.Aux = s 11341 v.AddArg(p) 11342 v.AddArg(idx) 11343 v.AddArg(w) 11344 v.AddArg(mem) 11345 return true 11346 } 11347 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 11348 // cond: x.Uses == 1 && clobber(x) 11349 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11350 for { 11351 i := v.AuxInt 11352 s := v.Aux 11353 _ = v.Args[3] 11354 p := v.Args[0] 11355 idx := v.Args[1] 11356 w := v.Args[2] 11357 x := v.Args[3] 11358 if x.Op != OpS390XMOVBstoreidx { 11359 break 11360 } 11361 if x.AuxInt != i-1 { 11362 break 11363 } 11364 if x.Aux != s { 11365 break 11366 } 11367 _ = x.Args[3] 11368 if idx != x.Args[0] { 11369 break 11370 } 11371 if p != x.Args[1] { 11372 break 11373 } 11374 x_2 := x.Args[2] 11375 if x_2.Op != OpS390XSRDconst { 11376 break 11377 } 11378 if x_2.AuxInt != 8 { 11379 break 11380 } 11381 if w != x_2.Args[0] { 11382 break 11383 } 11384 mem := x.Args[3] 11385 if !(x.Uses == 1 && clobber(x)) { 11386 break 11387 } 11388 v.reset(OpS390XMOVHstoreidx) 11389 v.AuxInt = i - 1 11390 v.Aux = s 11391 v.AddArg(p) 11392 v.AddArg(idx) 11393 v.AddArg(w) 11394 v.AddArg(mem) 11395 return true 11396 } 11397 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 11398 // cond: x.Uses == 1 && clobber(x) 11399 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11400 for { 11401 i := v.AuxInt 11402 s := v.Aux 11403 _ = v.Args[3] 11404 idx := v.Args[0] 11405 p := v.Args[1] 11406 w := v.Args[2] 11407 x := v.Args[3] 11408 if x.Op != OpS390XMOVBstoreidx { 11409 break 11410 } 11411 if x.AuxInt != i-1 { 11412 break 11413 } 11414 if x.Aux != s { 11415 break 11416 } 11417 _ = x.Args[3] 11418 if p != x.Args[0] { 11419 break 11420 } 11421 if idx != x.Args[1] { 11422 break 11423 } 11424 x_2 := x.Args[2] 11425 if x_2.Op != OpS390XSRDconst { 11426 break 11427 } 11428 if x_2.AuxInt != 8 { 11429 break 11430 } 11431 if w != x_2.Args[0] { 11432 break 11433 } 11434 mem := x.Args[3] 11435 if !(x.Uses == 1 && clobber(x)) { 11436 break 11437 } 11438 v.reset(OpS390XMOVHstoreidx) 11439 v.AuxInt = i - 1 11440 v.Aux = s 11441 v.AddArg(p) 11442 v.AddArg(idx) 11443 v.AddArg(w) 11444 v.AddArg(mem) 11445 return true 11446 } 11447 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 11448 // cond: x.Uses == 1 && clobber(x) 11449 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11450 for { 11451 i := v.AuxInt 11452 s := v.Aux 11453 _ = v.Args[3] 11454 idx := v.Args[0] 11455 p := v.Args[1] 11456 w := v.Args[2] 11457 x := v.Args[3] 11458 if x.Op != OpS390XMOVBstoreidx { 11459 break 11460 } 11461 if x.AuxInt != i-1 { 11462 break 11463 } 11464 if x.Aux != s { 11465 break 11466 } 11467 _ = x.Args[3] 11468 if idx != x.Args[0] { 11469 break 11470 } 11471 if p != x.Args[1] { 11472 break 11473 } 11474 x_2 := x.Args[2] 11475 if x_2.Op != OpS390XSRDconst { 11476 break 11477 } 11478 if x_2.AuxInt != 8 { 11479 break 11480 } 11481 if w != x_2.Args[0] { 11482 break 11483 } 11484 mem := x.Args[3] 11485 if !(x.Uses == 1 && clobber(x)) { 11486 break 11487 } 11488 v.reset(OpS390XMOVHstoreidx) 11489 v.AuxInt = i - 1 11490 v.Aux = s 11491 v.AddArg(p) 11492 v.AddArg(idx) 11493 v.AddArg(w) 11494 v.AddArg(mem) 11495 return true 11496 } 11497 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 11498 // cond: x.Uses == 1 && clobber(x) 11499 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11500 for { 11501 i := v.AuxInt 11502 s := v.Aux 11503 _ = v.Args[3] 11504 p := v.Args[0] 11505 idx := v.Args[1] 11506 w0 := v.Args[2] 11507 if w0.Op != OpS390XSRDconst { 11508 break 11509 } 11510 j := w0.AuxInt 11511 w := w0.Args[0] 11512 x := v.Args[3] 11513 if x.Op != OpS390XMOVBstoreidx { 11514 break 11515 } 11516 if x.AuxInt != i-1 { 11517 break 11518 } 11519 if x.Aux != s { 11520 break 11521 } 11522 _ = x.Args[3] 11523 if p != x.Args[0] { 11524 break 11525 } 11526 if idx != x.Args[1] { 11527 break 11528 } 11529 x_2 := x.Args[2] 11530 if x_2.Op != OpS390XSRDconst { 11531 break 11532 } 11533 if x_2.AuxInt != j+8 { 11534 break 11535 } 11536 if w != x_2.Args[0] { 11537 break 11538 } 11539 mem := x.Args[3] 11540 if !(x.Uses == 1 && clobber(x)) { 11541 break 11542 } 11543 v.reset(OpS390XMOVHstoreidx) 11544 v.AuxInt = i - 1 11545 v.Aux = s 11546 v.AddArg(p) 11547 v.AddArg(idx) 11548 v.AddArg(w0) 11549 v.AddArg(mem) 11550 return true 11551 } 11552 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 11553 // cond: x.Uses == 1 && clobber(x) 11554 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11555 for { 11556 i := v.AuxInt 11557 s := v.Aux 11558 _ = v.Args[3] 11559 p := v.Args[0] 11560 idx := v.Args[1] 11561 w0 := v.Args[2] 11562 if w0.Op != OpS390XSRDconst { 11563 break 11564 } 11565 j := w0.AuxInt 11566 w := w0.Args[0] 11567 x := v.Args[3] 11568 if x.Op != OpS390XMOVBstoreidx { 11569 break 11570 } 11571 if x.AuxInt != i-1 { 11572 break 11573 } 11574 if x.Aux != s { 11575 break 11576 } 11577 _ = x.Args[3] 11578 if idx != x.Args[0] { 11579 break 11580 } 11581 if p != x.Args[1] { 11582 break 11583 } 11584 x_2 := x.Args[2] 11585 if x_2.Op != OpS390XSRDconst { 11586 break 11587 } 11588 if x_2.AuxInt != j+8 { 11589 break 11590 } 11591 if w != x_2.Args[0] { 11592 break 11593 } 11594 mem := x.Args[3] 11595 if !(x.Uses == 1 && clobber(x)) { 11596 break 11597 } 11598 v.reset(OpS390XMOVHstoreidx) 11599 v.AuxInt = i - 1 11600 v.Aux = s 11601 v.AddArg(p) 11602 v.AddArg(idx) 11603 v.AddArg(w0) 11604 v.AddArg(mem) 11605 return true 11606 } 11607 return false 11608 } 11609 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 11610 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 11611 // cond: x.Uses == 1 && clobber(x) 11612 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11613 for { 11614 i := v.AuxInt 11615 s := v.Aux 11616 _ = v.Args[3] 11617 idx := v.Args[0] 11618 p := v.Args[1] 11619 w0 := v.Args[2] 11620 if w0.Op != OpS390XSRDconst { 11621 break 11622 } 11623 j := w0.AuxInt 11624 w := w0.Args[0] 11625 x := v.Args[3] 11626 if x.Op != OpS390XMOVBstoreidx { 11627 break 11628 } 11629 if x.AuxInt != i-1 { 11630 break 11631 } 11632 if x.Aux != s { 11633 break 11634 } 11635 _ = x.Args[3] 11636 if p != x.Args[0] { 11637 break 11638 } 11639 if idx != x.Args[1] { 11640 break 11641 } 11642 x_2 := x.Args[2] 11643 if x_2.Op != OpS390XSRDconst { 11644 break 11645 } 11646 if x_2.AuxInt != j+8 { 11647 break 11648 } 11649 if w != x_2.Args[0] { 11650 break 11651 } 11652 mem := x.Args[3] 11653 if !(x.Uses == 1 && clobber(x)) { 11654 break 11655 } 11656 v.reset(OpS390XMOVHstoreidx) 11657 v.AuxInt = i - 1 11658 v.Aux = s 11659 v.AddArg(p) 11660 v.AddArg(idx) 11661 v.AddArg(w0) 11662 v.AddArg(mem) 11663 return true 11664 } 11665 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 11666 // cond: x.Uses == 1 && clobber(x) 11667 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11668 for { 11669 i := v.AuxInt 11670 s := v.Aux 11671 _ = v.Args[3] 11672 idx := v.Args[0] 11673 p := v.Args[1] 11674 w0 := v.Args[2] 11675 if w0.Op != OpS390XSRDconst { 11676 break 11677 } 11678 j := w0.AuxInt 11679 w := w0.Args[0] 11680 x := v.Args[3] 11681 if x.Op != OpS390XMOVBstoreidx { 11682 break 11683 } 11684 if x.AuxInt != i-1 { 11685 break 11686 } 11687 if x.Aux != s { 11688 break 11689 } 11690 _ = x.Args[3] 11691 if idx != x.Args[0] { 11692 break 11693 } 11694 if p != x.Args[1] { 11695 break 11696 } 11697 x_2 := x.Args[2] 11698 if x_2.Op != OpS390XSRDconst { 11699 break 11700 } 11701 if x_2.AuxInt != j+8 { 11702 break 11703 } 11704 if w != x_2.Args[0] { 11705 break 11706 } 11707 mem := x.Args[3] 11708 if !(x.Uses == 1 && clobber(x)) { 11709 break 11710 } 11711 v.reset(OpS390XMOVHstoreidx) 11712 v.AuxInt = i - 1 11713 v.Aux = s 11714 v.AddArg(p) 11715 v.AddArg(idx) 11716 v.AddArg(w0) 11717 v.AddArg(mem) 11718 return true 11719 } 11720 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 11721 // cond: x.Uses == 1 && clobber(x) 11722 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11723 for { 11724 i := v.AuxInt 11725 s := v.Aux 11726 _ = v.Args[3] 11727 p := v.Args[0] 11728 idx := v.Args[1] 11729 w := v.Args[2] 11730 x := v.Args[3] 11731 if x.Op != OpS390XMOVBstoreidx { 11732 break 11733 } 11734 if x.AuxInt != i-1 { 11735 break 11736 } 11737 if x.Aux != s { 11738 break 11739 } 11740 _ = x.Args[3] 11741 if p != x.Args[0] { 11742 break 11743 } 11744 if idx != x.Args[1] { 11745 break 11746 } 11747 x_2 := x.Args[2] 11748 if x_2.Op != OpS390XSRWconst { 11749 break 11750 } 11751 if x_2.AuxInt != 8 { 11752 break 11753 } 11754 if w != x_2.Args[0] { 11755 break 11756 } 11757 mem := x.Args[3] 11758 if !(x.Uses == 1 && clobber(x)) { 11759 break 11760 } 11761 v.reset(OpS390XMOVHstoreidx) 11762 v.AuxInt = i - 1 11763 v.Aux = s 11764 v.AddArg(p) 11765 v.AddArg(idx) 11766 v.AddArg(w) 11767 v.AddArg(mem) 11768 return true 11769 } 11770 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 11771 // cond: x.Uses == 1 && clobber(x) 11772 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11773 for { 11774 i := v.AuxInt 11775 s := v.Aux 11776 _ = v.Args[3] 11777 p := v.Args[0] 11778 idx := v.Args[1] 11779 w := v.Args[2] 11780 x := v.Args[3] 11781 if x.Op != OpS390XMOVBstoreidx { 11782 break 11783 } 11784 if x.AuxInt != i-1 { 11785 break 11786 } 11787 if x.Aux != s { 11788 break 11789 } 11790 _ = x.Args[3] 11791 if idx != x.Args[0] { 11792 break 11793 } 11794 if p != x.Args[1] { 11795 break 11796 } 11797 x_2 := x.Args[2] 11798 if x_2.Op != OpS390XSRWconst { 11799 break 11800 } 11801 if x_2.AuxInt != 8 { 11802 break 11803 } 11804 if w != x_2.Args[0] { 11805 break 11806 } 11807 mem := x.Args[3] 11808 if !(x.Uses == 1 && clobber(x)) { 11809 break 11810 } 11811 v.reset(OpS390XMOVHstoreidx) 11812 v.AuxInt = i - 1 11813 v.Aux = s 11814 v.AddArg(p) 11815 v.AddArg(idx) 11816 v.AddArg(w) 11817 v.AddArg(mem) 11818 return true 11819 } 11820 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 11821 // cond: x.Uses == 1 && clobber(x) 11822 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11823 for { 11824 i := v.AuxInt 11825 s := v.Aux 11826 _ = v.Args[3] 11827 idx := v.Args[0] 11828 p := v.Args[1] 11829 w := v.Args[2] 11830 x := v.Args[3] 11831 if x.Op != OpS390XMOVBstoreidx { 11832 break 11833 } 11834 if x.AuxInt != i-1 { 11835 break 11836 } 11837 if x.Aux != s { 11838 break 11839 } 11840 _ = x.Args[3] 11841 if p != x.Args[0] { 11842 break 11843 } 11844 if idx != x.Args[1] { 11845 break 11846 } 11847 x_2 := x.Args[2] 11848 if x_2.Op != OpS390XSRWconst { 11849 break 11850 } 11851 if x_2.AuxInt != 8 { 11852 break 11853 } 11854 if w != x_2.Args[0] { 11855 break 11856 } 11857 mem := x.Args[3] 11858 if !(x.Uses == 1 && clobber(x)) { 11859 break 11860 } 11861 v.reset(OpS390XMOVHstoreidx) 11862 v.AuxInt = i - 1 11863 v.Aux = s 11864 v.AddArg(p) 11865 v.AddArg(idx) 11866 v.AddArg(w) 11867 v.AddArg(mem) 11868 return true 11869 } 11870 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 11871 // cond: x.Uses == 1 && clobber(x) 11872 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 11873 for { 11874 i := v.AuxInt 11875 s := v.Aux 11876 _ = v.Args[3] 11877 idx := v.Args[0] 11878 p := v.Args[1] 11879 w := v.Args[2] 11880 x := v.Args[3] 11881 if x.Op != OpS390XMOVBstoreidx { 11882 break 11883 } 11884 if x.AuxInt != i-1 { 11885 break 11886 } 11887 if x.Aux != s { 11888 break 11889 } 11890 _ = x.Args[3] 11891 if idx != x.Args[0] { 11892 break 11893 } 11894 if p != x.Args[1] { 11895 break 11896 } 11897 x_2 := x.Args[2] 11898 if x_2.Op != OpS390XSRWconst { 11899 break 11900 } 11901 if x_2.AuxInt != 8 { 11902 break 11903 } 11904 if w != x_2.Args[0] { 11905 break 11906 } 11907 mem := x.Args[3] 11908 if !(x.Uses == 1 && clobber(x)) { 11909 break 11910 } 11911 v.reset(OpS390XMOVHstoreidx) 11912 v.AuxInt = i - 1 11913 v.Aux = s 11914 v.AddArg(p) 11915 v.AddArg(idx) 11916 v.AddArg(w) 11917 v.AddArg(mem) 11918 return true 11919 } 11920 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 11921 // cond: x.Uses == 1 && clobber(x) 11922 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11923 for { 11924 i := v.AuxInt 11925 s := v.Aux 11926 _ = v.Args[3] 11927 p := v.Args[0] 11928 idx := v.Args[1] 11929 w0 := v.Args[2] 11930 if w0.Op != OpS390XSRWconst { 11931 break 11932 } 11933 j := w0.AuxInt 11934 w := w0.Args[0] 11935 x := v.Args[3] 11936 if x.Op != OpS390XMOVBstoreidx { 11937 break 11938 } 11939 if x.AuxInt != i-1 { 11940 break 11941 } 11942 if x.Aux != s { 11943 break 11944 } 11945 _ = x.Args[3] 11946 if p != x.Args[0] { 11947 break 11948 } 11949 if idx != x.Args[1] { 11950 break 11951 } 11952 x_2 := x.Args[2] 11953 if x_2.Op != OpS390XSRWconst { 11954 break 11955 } 11956 if x_2.AuxInt != j+8 { 11957 break 11958 } 11959 if w != x_2.Args[0] { 11960 break 11961 } 11962 mem := x.Args[3] 11963 if !(x.Uses == 1 && clobber(x)) { 11964 break 11965 } 11966 v.reset(OpS390XMOVHstoreidx) 11967 v.AuxInt = i - 1 11968 v.Aux = s 11969 v.AddArg(p) 11970 v.AddArg(idx) 11971 v.AddArg(w0) 11972 v.AddArg(mem) 11973 return true 11974 } 11975 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 11976 // cond: x.Uses == 1 && clobber(x) 11977 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 11978 for { 11979 i := v.AuxInt 11980 s := v.Aux 11981 _ = v.Args[3] 11982 p := v.Args[0] 11983 idx := v.Args[1] 11984 w0 := v.Args[2] 11985 if w0.Op != OpS390XSRWconst { 11986 break 11987 } 11988 j := w0.AuxInt 11989 w := w0.Args[0] 11990 x := v.Args[3] 11991 if x.Op != OpS390XMOVBstoreidx { 11992 break 11993 } 11994 if x.AuxInt != i-1 { 11995 break 11996 } 11997 if x.Aux != s { 11998 break 11999 } 12000 _ = x.Args[3] 12001 if idx != x.Args[0] { 12002 break 12003 } 12004 if p != x.Args[1] { 12005 break 12006 } 12007 x_2 := x.Args[2] 12008 if x_2.Op != OpS390XSRWconst { 12009 break 12010 } 12011 if x_2.AuxInt != j+8 { 12012 break 12013 } 12014 if w != x_2.Args[0] { 12015 break 12016 } 12017 mem := x.Args[3] 12018 if !(x.Uses == 1 && clobber(x)) { 12019 break 12020 } 12021 v.reset(OpS390XMOVHstoreidx) 12022 v.AuxInt = i - 1 12023 v.Aux = s 12024 v.AddArg(p) 12025 v.AddArg(idx) 12026 v.AddArg(w0) 12027 v.AddArg(mem) 12028 return true 12029 } 12030 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 12031 // cond: x.Uses == 1 && clobber(x) 12032 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 12033 for { 12034 i := v.AuxInt 12035 s := v.Aux 12036 _ = v.Args[3] 12037 idx := v.Args[0] 12038 p := v.Args[1] 12039 w0 := v.Args[2] 12040 if w0.Op != OpS390XSRWconst { 12041 break 12042 } 12043 j := w0.AuxInt 12044 w := w0.Args[0] 12045 x := v.Args[3] 12046 if x.Op != OpS390XMOVBstoreidx { 12047 break 12048 } 12049 if x.AuxInt != i-1 { 12050 break 12051 } 12052 if x.Aux != s { 12053 break 12054 } 12055 _ = x.Args[3] 12056 if p != x.Args[0] { 12057 break 12058 } 12059 if idx != x.Args[1] { 12060 break 12061 } 12062 x_2 := x.Args[2] 12063 if x_2.Op != OpS390XSRWconst { 12064 break 12065 } 12066 if x_2.AuxInt != j+8 { 12067 break 12068 } 12069 if w != x_2.Args[0] { 12070 break 12071 } 12072 mem := x.Args[3] 12073 if !(x.Uses == 1 && clobber(x)) { 12074 break 12075 } 12076 v.reset(OpS390XMOVHstoreidx) 12077 v.AuxInt = i - 1 12078 v.Aux = s 12079 v.AddArg(p) 12080 v.AddArg(idx) 12081 v.AddArg(w0) 12082 v.AddArg(mem) 12083 return true 12084 } 12085 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 12086 // cond: x.Uses == 1 && clobber(x) 12087 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 12088 for { 12089 i := v.AuxInt 12090 s := v.Aux 12091 _ = v.Args[3] 12092 idx := v.Args[0] 12093 p := v.Args[1] 12094 w0 := v.Args[2] 12095 if w0.Op != OpS390XSRWconst { 12096 break 12097 } 12098 j := w0.AuxInt 12099 w := w0.Args[0] 12100 x := v.Args[3] 12101 if x.Op != OpS390XMOVBstoreidx { 12102 break 12103 } 12104 if x.AuxInt != i-1 { 12105 break 12106 } 12107 if x.Aux != s { 12108 break 12109 } 12110 _ = x.Args[3] 12111 if idx != x.Args[0] { 12112 break 12113 } 12114 if p != x.Args[1] { 12115 break 12116 } 12117 x_2 := x.Args[2] 12118 if x_2.Op != OpS390XSRWconst { 12119 break 12120 } 12121 if x_2.AuxInt != j+8 { 12122 break 12123 } 12124 if w != x_2.Args[0] { 12125 break 12126 } 12127 mem := x.Args[3] 12128 if !(x.Uses == 1 && clobber(x)) { 12129 break 12130 } 12131 v.reset(OpS390XMOVHstoreidx) 12132 v.AuxInt = i - 1 12133 v.Aux = s 12134 v.AddArg(p) 12135 v.AddArg(idx) 12136 v.AddArg(w0) 12137 v.AddArg(mem) 12138 return true 12139 } 12140 return false 12141 } 12142 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 12143 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 12144 // cond: x.Uses == 1 && clobber(x) 12145 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12146 for { 12147 i := v.AuxInt 12148 s := v.Aux 12149 _ = v.Args[3] 12150 p := v.Args[0] 12151 idx := v.Args[1] 12152 v_2 := v.Args[2] 12153 if v_2.Op != OpS390XSRDconst { 12154 break 12155 } 12156 if v_2.AuxInt != 8 { 12157 break 12158 } 12159 w := v_2.Args[0] 12160 x := v.Args[3] 12161 if x.Op != OpS390XMOVBstoreidx { 12162 break 12163 } 12164 if x.AuxInt != i-1 { 12165 break 12166 } 12167 if x.Aux != s { 12168 break 12169 } 12170 _ = x.Args[3] 12171 if p != x.Args[0] { 12172 break 12173 } 12174 if idx != x.Args[1] { 12175 break 12176 } 12177 if w != x.Args[2] { 12178 break 12179 } 12180 mem := x.Args[3] 12181 if !(x.Uses == 1 && clobber(x)) { 12182 break 12183 } 12184 v.reset(OpS390XMOVHBRstoreidx) 12185 v.AuxInt = i - 1 12186 v.Aux = s 12187 v.AddArg(p) 12188 v.AddArg(idx) 12189 v.AddArg(w) 12190 v.AddArg(mem) 12191 return true 12192 } 12193 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 12194 // cond: x.Uses == 1 && clobber(x) 12195 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12196 for { 12197 i := v.AuxInt 12198 s := v.Aux 12199 _ = v.Args[3] 12200 p := v.Args[0] 12201 idx := v.Args[1] 12202 v_2 := v.Args[2] 12203 if v_2.Op != OpS390XSRDconst { 12204 break 12205 } 12206 if v_2.AuxInt != 8 { 12207 break 12208 } 12209 w := v_2.Args[0] 12210 x := v.Args[3] 12211 if x.Op != OpS390XMOVBstoreidx { 12212 break 12213 } 12214 if x.AuxInt != i-1 { 12215 break 12216 } 12217 if x.Aux != s { 12218 break 12219 } 12220 _ = x.Args[3] 12221 if idx != x.Args[0] { 12222 break 12223 } 12224 if p != x.Args[1] { 12225 break 12226 } 12227 if w != x.Args[2] { 12228 break 12229 } 12230 mem := x.Args[3] 12231 if !(x.Uses == 1 && clobber(x)) { 12232 break 12233 } 12234 v.reset(OpS390XMOVHBRstoreidx) 12235 v.AuxInt = i - 1 12236 v.Aux = s 12237 v.AddArg(p) 12238 v.AddArg(idx) 12239 v.AddArg(w) 12240 v.AddArg(mem) 12241 return true 12242 } 12243 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 12244 // cond: x.Uses == 1 && clobber(x) 12245 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12246 for { 12247 i := v.AuxInt 12248 s := v.Aux 12249 _ = v.Args[3] 12250 idx := v.Args[0] 12251 p := v.Args[1] 12252 v_2 := v.Args[2] 12253 if v_2.Op != OpS390XSRDconst { 12254 break 12255 } 12256 if v_2.AuxInt != 8 { 12257 break 12258 } 12259 w := v_2.Args[0] 12260 x := v.Args[3] 12261 if x.Op != OpS390XMOVBstoreidx { 12262 break 12263 } 12264 if x.AuxInt != i-1 { 12265 break 12266 } 12267 if x.Aux != s { 12268 break 12269 } 12270 _ = x.Args[3] 12271 if p != x.Args[0] { 12272 break 12273 } 12274 if idx != x.Args[1] { 12275 break 12276 } 12277 if w != x.Args[2] { 12278 break 12279 } 12280 mem := x.Args[3] 12281 if !(x.Uses == 1 && clobber(x)) { 12282 break 12283 } 12284 v.reset(OpS390XMOVHBRstoreidx) 12285 v.AuxInt = i - 1 12286 v.Aux = s 12287 v.AddArg(p) 12288 v.AddArg(idx) 12289 v.AddArg(w) 12290 v.AddArg(mem) 12291 return true 12292 } 12293 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 12294 // cond: x.Uses == 1 && clobber(x) 12295 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12296 for { 12297 i := v.AuxInt 12298 s := v.Aux 12299 _ = v.Args[3] 12300 idx := v.Args[0] 12301 p := v.Args[1] 12302 v_2 := v.Args[2] 12303 if v_2.Op != OpS390XSRDconst { 12304 break 12305 } 12306 if v_2.AuxInt != 8 { 12307 break 12308 } 12309 w := v_2.Args[0] 12310 x := v.Args[3] 12311 if x.Op != OpS390XMOVBstoreidx { 12312 break 12313 } 12314 if x.AuxInt != i-1 { 12315 break 12316 } 12317 if x.Aux != s { 12318 break 12319 } 12320 _ = x.Args[3] 12321 if idx != x.Args[0] { 12322 break 12323 } 12324 if p != x.Args[1] { 12325 break 12326 } 12327 if w != x.Args[2] { 12328 break 12329 } 12330 mem := x.Args[3] 12331 if !(x.Uses == 1 && clobber(x)) { 12332 break 12333 } 12334 v.reset(OpS390XMOVHBRstoreidx) 12335 v.AuxInt = i - 1 12336 v.Aux = s 12337 v.AddArg(p) 12338 v.AddArg(idx) 12339 v.AddArg(w) 12340 v.AddArg(mem) 12341 return true 12342 } 12343 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 12344 // cond: x.Uses == 1 && clobber(x) 12345 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12346 for { 12347 i := v.AuxInt 12348 s := v.Aux 12349 _ = v.Args[3] 12350 p := v.Args[0] 12351 idx := v.Args[1] 12352 v_2 := v.Args[2] 12353 if v_2.Op != OpS390XSRDconst { 12354 break 12355 } 12356 j := v_2.AuxInt 12357 w := v_2.Args[0] 12358 x := v.Args[3] 12359 if x.Op != OpS390XMOVBstoreidx { 12360 break 12361 } 12362 if x.AuxInt != i-1 { 12363 break 12364 } 12365 if x.Aux != s { 12366 break 12367 } 12368 _ = x.Args[3] 12369 if p != x.Args[0] { 12370 break 12371 } 12372 if idx != x.Args[1] { 12373 break 12374 } 12375 w0 := x.Args[2] 12376 if w0.Op != OpS390XSRDconst { 12377 break 12378 } 12379 if w0.AuxInt != j-8 { 12380 break 12381 } 12382 if w != w0.Args[0] { 12383 break 12384 } 12385 mem := x.Args[3] 12386 if !(x.Uses == 1 && clobber(x)) { 12387 break 12388 } 12389 v.reset(OpS390XMOVHBRstoreidx) 12390 v.AuxInt = i - 1 12391 v.Aux = s 12392 v.AddArg(p) 12393 v.AddArg(idx) 12394 v.AddArg(w0) 12395 v.AddArg(mem) 12396 return true 12397 } 12398 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 12399 // cond: x.Uses == 1 && clobber(x) 12400 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12401 for { 12402 i := v.AuxInt 12403 s := v.Aux 12404 _ = v.Args[3] 12405 p := v.Args[0] 12406 idx := v.Args[1] 12407 v_2 := v.Args[2] 12408 if v_2.Op != OpS390XSRDconst { 12409 break 12410 } 12411 j := v_2.AuxInt 12412 w := v_2.Args[0] 12413 x := v.Args[3] 12414 if x.Op != OpS390XMOVBstoreidx { 12415 break 12416 } 12417 if x.AuxInt != i-1 { 12418 break 12419 } 12420 if x.Aux != s { 12421 break 12422 } 12423 _ = x.Args[3] 12424 if idx != x.Args[0] { 12425 break 12426 } 12427 if p != x.Args[1] { 12428 break 12429 } 12430 w0 := x.Args[2] 12431 if w0.Op != OpS390XSRDconst { 12432 break 12433 } 12434 if w0.AuxInt != j-8 { 12435 break 12436 } 12437 if w != w0.Args[0] { 12438 break 12439 } 12440 mem := x.Args[3] 12441 if !(x.Uses == 1 && clobber(x)) { 12442 break 12443 } 12444 v.reset(OpS390XMOVHBRstoreidx) 12445 v.AuxInt = i - 1 12446 v.Aux = s 12447 v.AddArg(p) 12448 v.AddArg(idx) 12449 v.AddArg(w0) 12450 v.AddArg(mem) 12451 return true 12452 } 12453 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 12454 // cond: x.Uses == 1 && clobber(x) 12455 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12456 for { 12457 i := v.AuxInt 12458 s := v.Aux 12459 _ = v.Args[3] 12460 idx := v.Args[0] 12461 p := v.Args[1] 12462 v_2 := v.Args[2] 12463 if v_2.Op != OpS390XSRDconst { 12464 break 12465 } 12466 j := v_2.AuxInt 12467 w := v_2.Args[0] 12468 x := v.Args[3] 12469 if x.Op != OpS390XMOVBstoreidx { 12470 break 12471 } 12472 if x.AuxInt != i-1 { 12473 break 12474 } 12475 if x.Aux != s { 12476 break 12477 } 12478 _ = x.Args[3] 12479 if p != x.Args[0] { 12480 break 12481 } 12482 if idx != x.Args[1] { 12483 break 12484 } 12485 w0 := x.Args[2] 12486 if w0.Op != OpS390XSRDconst { 12487 break 12488 } 12489 if w0.AuxInt != j-8 { 12490 break 12491 } 12492 if w != w0.Args[0] { 12493 break 12494 } 12495 mem := x.Args[3] 12496 if !(x.Uses == 1 && clobber(x)) { 12497 break 12498 } 12499 v.reset(OpS390XMOVHBRstoreidx) 12500 v.AuxInt = i - 1 12501 v.Aux = s 12502 v.AddArg(p) 12503 v.AddArg(idx) 12504 v.AddArg(w0) 12505 v.AddArg(mem) 12506 return true 12507 } 12508 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 12509 // cond: x.Uses == 1 && clobber(x) 12510 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12511 for { 12512 i := v.AuxInt 12513 s := v.Aux 12514 _ = v.Args[3] 12515 idx := v.Args[0] 12516 p := v.Args[1] 12517 v_2 := v.Args[2] 12518 if v_2.Op != OpS390XSRDconst { 12519 break 12520 } 12521 j := v_2.AuxInt 12522 w := v_2.Args[0] 12523 x := v.Args[3] 12524 if x.Op != OpS390XMOVBstoreidx { 12525 break 12526 } 12527 if x.AuxInt != i-1 { 12528 break 12529 } 12530 if x.Aux != s { 12531 break 12532 } 12533 _ = x.Args[3] 12534 if idx != x.Args[0] { 12535 break 12536 } 12537 if p != x.Args[1] { 12538 break 12539 } 12540 w0 := x.Args[2] 12541 if w0.Op != OpS390XSRDconst { 12542 break 12543 } 12544 if w0.AuxInt != j-8 { 12545 break 12546 } 12547 if w != w0.Args[0] { 12548 break 12549 } 12550 mem := x.Args[3] 12551 if !(x.Uses == 1 && clobber(x)) { 12552 break 12553 } 12554 v.reset(OpS390XMOVHBRstoreidx) 12555 v.AuxInt = i - 1 12556 v.Aux = s 12557 v.AddArg(p) 12558 v.AddArg(idx) 12559 v.AddArg(w0) 12560 v.AddArg(mem) 12561 return true 12562 } 12563 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 12564 // cond: x.Uses == 1 && clobber(x) 12565 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12566 for { 12567 i := v.AuxInt 12568 s := v.Aux 12569 _ = v.Args[3] 12570 p := v.Args[0] 12571 idx := v.Args[1] 12572 v_2 := v.Args[2] 12573 if v_2.Op != OpS390XSRWconst { 12574 break 12575 } 12576 if v_2.AuxInt != 8 { 12577 break 12578 } 12579 w := v_2.Args[0] 12580 x := v.Args[3] 12581 if x.Op != OpS390XMOVBstoreidx { 12582 break 12583 } 12584 if x.AuxInt != i-1 { 12585 break 12586 } 12587 if x.Aux != s { 12588 break 12589 } 12590 _ = x.Args[3] 12591 if p != x.Args[0] { 12592 break 12593 } 12594 if idx != x.Args[1] { 12595 break 12596 } 12597 if w != x.Args[2] { 12598 break 12599 } 12600 mem := x.Args[3] 12601 if !(x.Uses == 1 && clobber(x)) { 12602 break 12603 } 12604 v.reset(OpS390XMOVHBRstoreidx) 12605 v.AuxInt = i - 1 12606 v.Aux = s 12607 v.AddArg(p) 12608 v.AddArg(idx) 12609 v.AddArg(w) 12610 v.AddArg(mem) 12611 return true 12612 } 12613 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 12614 // cond: x.Uses == 1 && clobber(x) 12615 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12616 for { 12617 i := v.AuxInt 12618 s := v.Aux 12619 _ = v.Args[3] 12620 p := v.Args[0] 12621 idx := v.Args[1] 12622 v_2 := v.Args[2] 12623 if v_2.Op != OpS390XSRWconst { 12624 break 12625 } 12626 if v_2.AuxInt != 8 { 12627 break 12628 } 12629 w := v_2.Args[0] 12630 x := v.Args[3] 12631 if x.Op != OpS390XMOVBstoreidx { 12632 break 12633 } 12634 if x.AuxInt != i-1 { 12635 break 12636 } 12637 if x.Aux != s { 12638 break 12639 } 12640 _ = x.Args[3] 12641 if idx != x.Args[0] { 12642 break 12643 } 12644 if p != x.Args[1] { 12645 break 12646 } 12647 if w != x.Args[2] { 12648 break 12649 } 12650 mem := x.Args[3] 12651 if !(x.Uses == 1 && clobber(x)) { 12652 break 12653 } 12654 v.reset(OpS390XMOVHBRstoreidx) 12655 v.AuxInt = i - 1 12656 v.Aux = s 12657 v.AddArg(p) 12658 v.AddArg(idx) 12659 v.AddArg(w) 12660 v.AddArg(mem) 12661 return true 12662 } 12663 return false 12664 } 12665 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 12666 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 12667 // cond: x.Uses == 1 && clobber(x) 12668 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12669 for { 12670 i := v.AuxInt 12671 s := v.Aux 12672 _ = v.Args[3] 12673 idx := v.Args[0] 12674 p := v.Args[1] 12675 v_2 := v.Args[2] 12676 if v_2.Op != OpS390XSRWconst { 12677 break 12678 } 12679 if v_2.AuxInt != 8 { 12680 break 12681 } 12682 w := v_2.Args[0] 12683 x := v.Args[3] 12684 if x.Op != OpS390XMOVBstoreidx { 12685 break 12686 } 12687 if x.AuxInt != i-1 { 12688 break 12689 } 12690 if x.Aux != s { 12691 break 12692 } 12693 _ = x.Args[3] 12694 if p != x.Args[0] { 12695 break 12696 } 12697 if idx != x.Args[1] { 12698 break 12699 } 12700 if w != x.Args[2] { 12701 break 12702 } 12703 mem := x.Args[3] 12704 if !(x.Uses == 1 && clobber(x)) { 12705 break 12706 } 12707 v.reset(OpS390XMOVHBRstoreidx) 12708 v.AuxInt = i - 1 12709 v.Aux = s 12710 v.AddArg(p) 12711 v.AddArg(idx) 12712 v.AddArg(w) 12713 v.AddArg(mem) 12714 return true 12715 } 12716 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 12717 // cond: x.Uses == 1 && clobber(x) 12718 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 12719 for { 12720 i := v.AuxInt 12721 s := v.Aux 12722 _ = v.Args[3] 12723 idx := v.Args[0] 12724 p := v.Args[1] 12725 v_2 := v.Args[2] 12726 if v_2.Op != OpS390XSRWconst { 12727 break 12728 } 12729 if v_2.AuxInt != 8 { 12730 break 12731 } 12732 w := v_2.Args[0] 12733 x := v.Args[3] 12734 if x.Op != OpS390XMOVBstoreidx { 12735 break 12736 } 12737 if x.AuxInt != i-1 { 12738 break 12739 } 12740 if x.Aux != s { 12741 break 12742 } 12743 _ = x.Args[3] 12744 if idx != x.Args[0] { 12745 break 12746 } 12747 if p != x.Args[1] { 12748 break 12749 } 12750 if w != x.Args[2] { 12751 break 12752 } 12753 mem := x.Args[3] 12754 if !(x.Uses == 1 && clobber(x)) { 12755 break 12756 } 12757 v.reset(OpS390XMOVHBRstoreidx) 12758 v.AuxInt = i - 1 12759 v.Aux = s 12760 v.AddArg(p) 12761 v.AddArg(idx) 12762 v.AddArg(w) 12763 v.AddArg(mem) 12764 return true 12765 } 12766 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 12767 // cond: x.Uses == 1 && clobber(x) 12768 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12769 for { 12770 i := v.AuxInt 12771 s := v.Aux 12772 _ = v.Args[3] 12773 p := v.Args[0] 12774 idx := v.Args[1] 12775 v_2 := v.Args[2] 12776 if v_2.Op != OpS390XSRWconst { 12777 break 12778 } 12779 j := v_2.AuxInt 12780 w := v_2.Args[0] 12781 x := v.Args[3] 12782 if x.Op != OpS390XMOVBstoreidx { 12783 break 12784 } 12785 if x.AuxInt != i-1 { 12786 break 12787 } 12788 if x.Aux != s { 12789 break 12790 } 12791 _ = x.Args[3] 12792 if p != x.Args[0] { 12793 break 12794 } 12795 if idx != x.Args[1] { 12796 break 12797 } 12798 w0 := x.Args[2] 12799 if w0.Op != OpS390XSRWconst { 12800 break 12801 } 12802 if w0.AuxInt != j-8 { 12803 break 12804 } 12805 if w != w0.Args[0] { 12806 break 12807 } 12808 mem := x.Args[3] 12809 if !(x.Uses == 1 && clobber(x)) { 12810 break 12811 } 12812 v.reset(OpS390XMOVHBRstoreidx) 12813 v.AuxInt = i - 1 12814 v.Aux = s 12815 v.AddArg(p) 12816 v.AddArg(idx) 12817 v.AddArg(w0) 12818 v.AddArg(mem) 12819 return true 12820 } 12821 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 12822 // cond: x.Uses == 1 && clobber(x) 12823 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12824 for { 12825 i := v.AuxInt 12826 s := v.Aux 12827 _ = v.Args[3] 12828 p := v.Args[0] 12829 idx := v.Args[1] 12830 v_2 := v.Args[2] 12831 if v_2.Op != OpS390XSRWconst { 12832 break 12833 } 12834 j := v_2.AuxInt 12835 w := v_2.Args[0] 12836 x := v.Args[3] 12837 if x.Op != OpS390XMOVBstoreidx { 12838 break 12839 } 12840 if x.AuxInt != i-1 { 12841 break 12842 } 12843 if x.Aux != s { 12844 break 12845 } 12846 _ = x.Args[3] 12847 if idx != x.Args[0] { 12848 break 12849 } 12850 if p != x.Args[1] { 12851 break 12852 } 12853 w0 := x.Args[2] 12854 if w0.Op != OpS390XSRWconst { 12855 break 12856 } 12857 if w0.AuxInt != j-8 { 12858 break 12859 } 12860 if w != w0.Args[0] { 12861 break 12862 } 12863 mem := x.Args[3] 12864 if !(x.Uses == 1 && clobber(x)) { 12865 break 12866 } 12867 v.reset(OpS390XMOVHBRstoreidx) 12868 v.AuxInt = i - 1 12869 v.Aux = s 12870 v.AddArg(p) 12871 v.AddArg(idx) 12872 v.AddArg(w0) 12873 v.AddArg(mem) 12874 return true 12875 } 12876 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 12877 // cond: x.Uses == 1 && clobber(x) 12878 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12879 for { 12880 i := v.AuxInt 12881 s := v.Aux 12882 _ = v.Args[3] 12883 idx := v.Args[0] 12884 p := v.Args[1] 12885 v_2 := v.Args[2] 12886 if v_2.Op != OpS390XSRWconst { 12887 break 12888 } 12889 j := v_2.AuxInt 12890 w := v_2.Args[0] 12891 x := v.Args[3] 12892 if x.Op != OpS390XMOVBstoreidx { 12893 break 12894 } 12895 if x.AuxInt != i-1 { 12896 break 12897 } 12898 if x.Aux != s { 12899 break 12900 } 12901 _ = x.Args[3] 12902 if p != x.Args[0] { 12903 break 12904 } 12905 if idx != x.Args[1] { 12906 break 12907 } 12908 w0 := x.Args[2] 12909 if w0.Op != OpS390XSRWconst { 12910 break 12911 } 12912 if w0.AuxInt != j-8 { 12913 break 12914 } 12915 if w != w0.Args[0] { 12916 break 12917 } 12918 mem := x.Args[3] 12919 if !(x.Uses == 1 && clobber(x)) { 12920 break 12921 } 12922 v.reset(OpS390XMOVHBRstoreidx) 12923 v.AuxInt = i - 1 12924 v.Aux = s 12925 v.AddArg(p) 12926 v.AddArg(idx) 12927 v.AddArg(w0) 12928 v.AddArg(mem) 12929 return true 12930 } 12931 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 12932 // cond: x.Uses == 1 && clobber(x) 12933 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 12934 for { 12935 i := v.AuxInt 12936 s := v.Aux 12937 _ = v.Args[3] 12938 idx := v.Args[0] 12939 p := v.Args[1] 12940 v_2 := v.Args[2] 12941 if v_2.Op != OpS390XSRWconst { 12942 break 12943 } 12944 j := v_2.AuxInt 12945 w := v_2.Args[0] 12946 x := v.Args[3] 12947 if x.Op != OpS390XMOVBstoreidx { 12948 break 12949 } 12950 if x.AuxInt != i-1 { 12951 break 12952 } 12953 if x.Aux != s { 12954 break 12955 } 12956 _ = x.Args[3] 12957 if idx != x.Args[0] { 12958 break 12959 } 12960 if p != x.Args[1] { 12961 break 12962 } 12963 w0 := x.Args[2] 12964 if w0.Op != OpS390XSRWconst { 12965 break 12966 } 12967 if w0.AuxInt != j-8 { 12968 break 12969 } 12970 if w != w0.Args[0] { 12971 break 12972 } 12973 mem := x.Args[3] 12974 if !(x.Uses == 1 && clobber(x)) { 12975 break 12976 } 12977 v.reset(OpS390XMOVHBRstoreidx) 12978 v.AuxInt = i - 1 12979 v.Aux = s 12980 v.AddArg(p) 12981 v.AddArg(idx) 12982 v.AddArg(w0) 12983 v.AddArg(mem) 12984 return true 12985 } 12986 return false 12987 } 12988 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 12989 // match: (MOVDEQ x y (InvertFlags cmp)) 12990 // cond: 12991 // result: (MOVDEQ x y cmp) 12992 for { 12993 _ = v.Args[2] 12994 x := v.Args[0] 12995 y := v.Args[1] 12996 v_2 := v.Args[2] 12997 if v_2.Op != OpS390XInvertFlags { 12998 break 12999 } 13000 cmp := v_2.Args[0] 13001 v.reset(OpS390XMOVDEQ) 13002 v.AddArg(x) 13003 v.AddArg(y) 13004 v.AddArg(cmp) 13005 return true 13006 } 13007 // match: (MOVDEQ _ x (FlagEQ)) 13008 // cond: 13009 // result: x 13010 for { 13011 _ = v.Args[2] 13012 x := v.Args[1] 13013 v_2 := v.Args[2] 13014 if v_2.Op != OpS390XFlagEQ { 13015 break 13016 } 13017 v.reset(OpCopy) 13018 v.Type = x.Type 13019 v.AddArg(x) 13020 return true 13021 } 13022 // match: (MOVDEQ y _ (FlagLT)) 13023 // cond: 13024 // result: y 13025 for { 13026 _ = v.Args[2] 13027 y := v.Args[0] 13028 v_2 := v.Args[2] 13029 if v_2.Op != OpS390XFlagLT { 13030 break 13031 } 13032 v.reset(OpCopy) 13033 v.Type = y.Type 13034 v.AddArg(y) 13035 return true 13036 } 13037 // match: (MOVDEQ y _ (FlagGT)) 13038 // cond: 13039 // result: y 13040 for { 13041 _ = v.Args[2] 13042 y := v.Args[0] 13043 v_2 := v.Args[2] 13044 if v_2.Op != OpS390XFlagGT { 13045 break 13046 } 13047 v.reset(OpCopy) 13048 v.Type = y.Type 13049 v.AddArg(y) 13050 return true 13051 } 13052 return false 13053 } 13054 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 13055 // match: (MOVDGE x y (InvertFlags cmp)) 13056 // cond: 13057 // result: (MOVDLE x y cmp) 13058 for { 13059 _ = v.Args[2] 13060 x := v.Args[0] 13061 y := v.Args[1] 13062 v_2 := v.Args[2] 13063 if v_2.Op != OpS390XInvertFlags { 13064 break 13065 } 13066 cmp := v_2.Args[0] 13067 v.reset(OpS390XMOVDLE) 13068 v.AddArg(x) 13069 v.AddArg(y) 13070 v.AddArg(cmp) 13071 return true 13072 } 13073 // match: (MOVDGE _ x (FlagEQ)) 13074 // cond: 13075 // result: x 13076 for { 13077 _ = v.Args[2] 13078 x := v.Args[1] 13079 v_2 := v.Args[2] 13080 if v_2.Op != OpS390XFlagEQ { 13081 break 13082 } 13083 v.reset(OpCopy) 13084 v.Type = x.Type 13085 v.AddArg(x) 13086 return true 13087 } 13088 // match: (MOVDGE y _ (FlagLT)) 13089 // cond: 13090 // result: y 13091 for { 13092 _ = v.Args[2] 13093 y := v.Args[0] 13094 v_2 := v.Args[2] 13095 if v_2.Op != OpS390XFlagLT { 13096 break 13097 } 13098 v.reset(OpCopy) 13099 v.Type = y.Type 13100 v.AddArg(y) 13101 return true 13102 } 13103 // match: (MOVDGE _ x (FlagGT)) 13104 // cond: 13105 // result: x 13106 for { 13107 _ = v.Args[2] 13108 x := v.Args[1] 13109 v_2 := v.Args[2] 13110 if v_2.Op != OpS390XFlagGT { 13111 break 13112 } 13113 v.reset(OpCopy) 13114 v.Type = x.Type 13115 v.AddArg(x) 13116 return true 13117 } 13118 return false 13119 } 13120 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 13121 // match: (MOVDGT x y (InvertFlags cmp)) 13122 // cond: 13123 // result: (MOVDLT x y cmp) 13124 for { 13125 _ = v.Args[2] 13126 x := v.Args[0] 13127 y := v.Args[1] 13128 v_2 := v.Args[2] 13129 if v_2.Op != OpS390XInvertFlags { 13130 break 13131 } 13132 cmp := v_2.Args[0] 13133 v.reset(OpS390XMOVDLT) 13134 v.AddArg(x) 13135 v.AddArg(y) 13136 v.AddArg(cmp) 13137 return true 13138 } 13139 // match: (MOVDGT y _ (FlagEQ)) 13140 // cond: 13141 // result: y 13142 for { 13143 _ = v.Args[2] 13144 y := v.Args[0] 13145 v_2 := v.Args[2] 13146 if v_2.Op != OpS390XFlagEQ { 13147 break 13148 } 13149 v.reset(OpCopy) 13150 v.Type = y.Type 13151 v.AddArg(y) 13152 return true 13153 } 13154 // match: (MOVDGT y _ (FlagLT)) 13155 // cond: 13156 // result: y 13157 for { 13158 _ = v.Args[2] 13159 y := v.Args[0] 13160 v_2 := v.Args[2] 13161 if v_2.Op != OpS390XFlagLT { 13162 break 13163 } 13164 v.reset(OpCopy) 13165 v.Type = y.Type 13166 v.AddArg(y) 13167 return true 13168 } 13169 // match: (MOVDGT _ x (FlagGT)) 13170 // cond: 13171 // result: x 13172 for { 13173 _ = v.Args[2] 13174 x := v.Args[1] 13175 v_2 := v.Args[2] 13176 if v_2.Op != OpS390XFlagGT { 13177 break 13178 } 13179 v.reset(OpCopy) 13180 v.Type = x.Type 13181 v.AddArg(x) 13182 return true 13183 } 13184 return false 13185 } 13186 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 13187 // match: (MOVDLE x y (InvertFlags cmp)) 13188 // cond: 13189 // result: (MOVDGE x y cmp) 13190 for { 13191 _ = v.Args[2] 13192 x := v.Args[0] 13193 y := v.Args[1] 13194 v_2 := v.Args[2] 13195 if v_2.Op != OpS390XInvertFlags { 13196 break 13197 } 13198 cmp := v_2.Args[0] 13199 v.reset(OpS390XMOVDGE) 13200 v.AddArg(x) 13201 v.AddArg(y) 13202 v.AddArg(cmp) 13203 return true 13204 } 13205 // match: (MOVDLE _ x (FlagEQ)) 13206 // cond: 13207 // result: x 13208 for { 13209 _ = v.Args[2] 13210 x := v.Args[1] 13211 v_2 := v.Args[2] 13212 if v_2.Op != OpS390XFlagEQ { 13213 break 13214 } 13215 v.reset(OpCopy) 13216 v.Type = x.Type 13217 v.AddArg(x) 13218 return true 13219 } 13220 // match: (MOVDLE _ x (FlagLT)) 13221 // cond: 13222 // result: x 13223 for { 13224 _ = v.Args[2] 13225 x := v.Args[1] 13226 v_2 := v.Args[2] 13227 if v_2.Op != OpS390XFlagLT { 13228 break 13229 } 13230 v.reset(OpCopy) 13231 v.Type = x.Type 13232 v.AddArg(x) 13233 return true 13234 } 13235 // match: (MOVDLE y _ (FlagGT)) 13236 // cond: 13237 // result: y 13238 for { 13239 _ = v.Args[2] 13240 y := v.Args[0] 13241 v_2 := v.Args[2] 13242 if v_2.Op != OpS390XFlagGT { 13243 break 13244 } 13245 v.reset(OpCopy) 13246 v.Type = y.Type 13247 v.AddArg(y) 13248 return true 13249 } 13250 return false 13251 } 13252 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 13253 // match: (MOVDLT x y (InvertFlags cmp)) 13254 // cond: 13255 // result: (MOVDGT x y cmp) 13256 for { 13257 _ = v.Args[2] 13258 x := v.Args[0] 13259 y := v.Args[1] 13260 v_2 := v.Args[2] 13261 if v_2.Op != OpS390XInvertFlags { 13262 break 13263 } 13264 cmp := v_2.Args[0] 13265 v.reset(OpS390XMOVDGT) 13266 v.AddArg(x) 13267 v.AddArg(y) 13268 v.AddArg(cmp) 13269 return true 13270 } 13271 // match: (MOVDLT y _ (FlagEQ)) 13272 // cond: 13273 // result: y 13274 for { 13275 _ = v.Args[2] 13276 y := v.Args[0] 13277 v_2 := v.Args[2] 13278 if v_2.Op != OpS390XFlagEQ { 13279 break 13280 } 13281 v.reset(OpCopy) 13282 v.Type = y.Type 13283 v.AddArg(y) 13284 return true 13285 } 13286 // match: (MOVDLT _ x (FlagLT)) 13287 // cond: 13288 // result: x 13289 for { 13290 _ = v.Args[2] 13291 x := v.Args[1] 13292 v_2 := v.Args[2] 13293 if v_2.Op != OpS390XFlagLT { 13294 break 13295 } 13296 v.reset(OpCopy) 13297 v.Type = x.Type 13298 v.AddArg(x) 13299 return true 13300 } 13301 // match: (MOVDLT y _ (FlagGT)) 13302 // cond: 13303 // result: y 13304 for { 13305 _ = v.Args[2] 13306 y := v.Args[0] 13307 v_2 := v.Args[2] 13308 if v_2.Op != OpS390XFlagGT { 13309 break 13310 } 13311 v.reset(OpCopy) 13312 v.Type = y.Type 13313 v.AddArg(y) 13314 return true 13315 } 13316 return false 13317 } 13318 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 13319 // match: (MOVDNE x y (InvertFlags cmp)) 13320 // cond: 13321 // result: (MOVDNE x y cmp) 13322 for { 13323 _ = v.Args[2] 13324 x := v.Args[0] 13325 y := v.Args[1] 13326 v_2 := v.Args[2] 13327 if v_2.Op != OpS390XInvertFlags { 13328 break 13329 } 13330 cmp := v_2.Args[0] 13331 v.reset(OpS390XMOVDNE) 13332 v.AddArg(x) 13333 v.AddArg(y) 13334 v.AddArg(cmp) 13335 return true 13336 } 13337 // match: (MOVDNE y _ (FlagEQ)) 13338 // cond: 13339 // result: y 13340 for { 13341 _ = v.Args[2] 13342 y := v.Args[0] 13343 v_2 := v.Args[2] 13344 if v_2.Op != OpS390XFlagEQ { 13345 break 13346 } 13347 v.reset(OpCopy) 13348 v.Type = y.Type 13349 v.AddArg(y) 13350 return true 13351 } 13352 // match: (MOVDNE _ x (FlagLT)) 13353 // cond: 13354 // result: x 13355 for { 13356 _ = v.Args[2] 13357 x := v.Args[1] 13358 v_2 := v.Args[2] 13359 if v_2.Op != OpS390XFlagLT { 13360 break 13361 } 13362 v.reset(OpCopy) 13363 v.Type = x.Type 13364 v.AddArg(x) 13365 return true 13366 } 13367 // match: (MOVDNE _ x (FlagGT)) 13368 // cond: 13369 // result: x 13370 for { 13371 _ = v.Args[2] 13372 x := v.Args[1] 13373 v_2 := v.Args[2] 13374 if v_2.Op != OpS390XFlagGT { 13375 break 13376 } 13377 v.reset(OpCopy) 13378 v.Type = x.Type 13379 v.AddArg(x) 13380 return true 13381 } 13382 return false 13383 } 13384 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 13385 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 13386 // cond: is20Bit(c+d) && x.Op != OpSB 13387 // result: (MOVDaddridx [c+d] {s} x y) 13388 for { 13389 c := v.AuxInt 13390 s := v.Aux 13391 _ = v.Args[1] 13392 v_0 := v.Args[0] 13393 if v_0.Op != OpS390XADDconst { 13394 break 13395 } 13396 d := v_0.AuxInt 13397 x := v_0.Args[0] 13398 y := v.Args[1] 13399 if !(is20Bit(c+d) && x.Op != OpSB) { 13400 break 13401 } 13402 v.reset(OpS390XMOVDaddridx) 13403 v.AuxInt = c + d 13404 v.Aux = s 13405 v.AddArg(x) 13406 v.AddArg(y) 13407 return true 13408 } 13409 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 13410 // cond: is20Bit(c+d) && y.Op != OpSB 13411 // result: (MOVDaddridx [c+d] {s} x y) 13412 for { 13413 c := v.AuxInt 13414 s := v.Aux 13415 _ = v.Args[1] 13416 x := v.Args[0] 13417 v_1 := v.Args[1] 13418 if v_1.Op != OpS390XADDconst { 13419 break 13420 } 13421 d := v_1.AuxInt 13422 y := v_1.Args[0] 13423 if !(is20Bit(c+d) && y.Op != OpSB) { 13424 break 13425 } 13426 v.reset(OpS390XMOVDaddridx) 13427 v.AuxInt = c + d 13428 v.Aux = s 13429 v.AddArg(x) 13430 v.AddArg(y) 13431 return true 13432 } 13433 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 13434 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 13435 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 13436 for { 13437 off1 := v.AuxInt 13438 sym1 := v.Aux 13439 _ = v.Args[1] 13440 v_0 := v.Args[0] 13441 if v_0.Op != OpS390XMOVDaddr { 13442 break 13443 } 13444 off2 := v_0.AuxInt 13445 sym2 := v_0.Aux 13446 x := v_0.Args[0] 13447 y := v.Args[1] 13448 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 13449 break 13450 } 13451 v.reset(OpS390XMOVDaddridx) 13452 v.AuxInt = off1 + off2 13453 v.Aux = mergeSym(sym1, sym2) 13454 v.AddArg(x) 13455 v.AddArg(y) 13456 return true 13457 } 13458 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 13459 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 13460 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 13461 for { 13462 off1 := v.AuxInt 13463 sym1 := v.Aux 13464 _ = v.Args[1] 13465 x := v.Args[0] 13466 v_1 := v.Args[1] 13467 if v_1.Op != OpS390XMOVDaddr { 13468 break 13469 } 13470 off2 := v_1.AuxInt 13471 sym2 := v_1.Aux 13472 y := v_1.Args[0] 13473 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 13474 break 13475 } 13476 v.reset(OpS390XMOVDaddridx) 13477 v.AuxInt = off1 + off2 13478 v.Aux = mergeSym(sym1, sym2) 13479 v.AddArg(x) 13480 v.AddArg(y) 13481 return true 13482 } 13483 return false 13484 } 13485 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 13486 // match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) 13487 // cond: isSamePtr(ptr1, ptr2) 13488 // result: (MOVDreg x) 13489 for { 13490 off := v.AuxInt 13491 sym := v.Aux 13492 _ = v.Args[1] 13493 ptr1 := v.Args[0] 13494 v_1 := v.Args[1] 13495 if v_1.Op != OpS390XMOVDstore { 13496 break 13497 } 13498 if v_1.AuxInt != off { 13499 break 13500 } 13501 if v_1.Aux != sym { 13502 break 13503 } 13504 _ = v_1.Args[2] 13505 ptr2 := v_1.Args[0] 13506 x := v_1.Args[1] 13507 if !(isSamePtr(ptr1, ptr2)) { 13508 break 13509 } 13510 v.reset(OpS390XMOVDreg) 13511 v.AddArg(x) 13512 return true 13513 } 13514 // match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) 13515 // cond: isSamePtr(ptr1, ptr2) 13516 // result: (LGDR x) 13517 for { 13518 off := v.AuxInt 13519 sym := v.Aux 13520 _ = v.Args[1] 13521 ptr1 := v.Args[0] 13522 v_1 := v.Args[1] 13523 if v_1.Op != OpS390XFMOVDstore { 13524 break 13525 } 13526 if v_1.AuxInt != off { 13527 break 13528 } 13529 if v_1.Aux != sym { 13530 break 13531 } 13532 _ = v_1.Args[2] 13533 ptr2 := v_1.Args[0] 13534 x := v_1.Args[1] 13535 if !(isSamePtr(ptr1, ptr2)) { 13536 break 13537 } 13538 v.reset(OpS390XLGDR) 13539 v.AddArg(x) 13540 return true 13541 } 13542 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 13543 // cond: is20Bit(off1+off2) 13544 // result: (MOVDload [off1+off2] {sym} ptr mem) 13545 for { 13546 off1 := v.AuxInt 13547 sym := v.Aux 13548 _ = v.Args[1] 13549 v_0 := v.Args[0] 13550 if v_0.Op != OpS390XADDconst { 13551 break 13552 } 13553 off2 := v_0.AuxInt 13554 ptr := v_0.Args[0] 13555 mem := v.Args[1] 13556 if !(is20Bit(off1 + off2)) { 13557 break 13558 } 13559 v.reset(OpS390XMOVDload) 13560 v.AuxInt = off1 + off2 13561 v.Aux = sym 13562 v.AddArg(ptr) 13563 v.AddArg(mem) 13564 return true 13565 } 13566 // match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 13567 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 13568 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 13569 for { 13570 off1 := v.AuxInt 13571 sym1 := v.Aux 13572 _ = v.Args[1] 13573 v_0 := v.Args[0] 13574 if v_0.Op != OpS390XMOVDaddr { 13575 break 13576 } 13577 t := v_0.Type 13578 off2 := v_0.AuxInt 13579 sym2 := v_0.Aux 13580 base := v_0.Args[0] 13581 mem := v.Args[1] 13582 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 13583 break 13584 } 13585 v.reset(OpS390XMOVDload) 13586 v.AuxInt = off1 + off2 13587 v.Aux = mergeSym(sym1, sym2) 13588 v.AddArg(base) 13589 v.AddArg(mem) 13590 return true 13591 } 13592 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 13593 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13594 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 13595 for { 13596 off1 := v.AuxInt 13597 sym1 := v.Aux 13598 _ = v.Args[1] 13599 v_0 := v.Args[0] 13600 if v_0.Op != OpS390XMOVDaddridx { 13601 break 13602 } 13603 off2 := v_0.AuxInt 13604 sym2 := v_0.Aux 13605 _ = v_0.Args[1] 13606 ptr := v_0.Args[0] 13607 idx := v_0.Args[1] 13608 mem := v.Args[1] 13609 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13610 break 13611 } 13612 v.reset(OpS390XMOVDloadidx) 13613 v.AuxInt = off1 + off2 13614 v.Aux = mergeSym(sym1, sym2) 13615 v.AddArg(ptr) 13616 v.AddArg(idx) 13617 v.AddArg(mem) 13618 return true 13619 } 13620 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 13621 // cond: ptr.Op != OpSB 13622 // result: (MOVDloadidx [off] {sym} ptr idx mem) 13623 for { 13624 off := v.AuxInt 13625 sym := v.Aux 13626 _ = v.Args[1] 13627 v_0 := v.Args[0] 13628 if v_0.Op != OpS390XADD { 13629 break 13630 } 13631 _ = v_0.Args[1] 13632 ptr := v_0.Args[0] 13633 idx := v_0.Args[1] 13634 mem := v.Args[1] 13635 if !(ptr.Op != OpSB) { 13636 break 13637 } 13638 v.reset(OpS390XMOVDloadidx) 13639 v.AuxInt = off 13640 v.Aux = sym 13641 v.AddArg(ptr) 13642 v.AddArg(idx) 13643 v.AddArg(mem) 13644 return true 13645 } 13646 return false 13647 } 13648 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 13649 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 13650 // cond: is20Bit(c+d) 13651 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 13652 for { 13653 c := v.AuxInt 13654 sym := v.Aux 13655 _ = v.Args[2] 13656 v_0 := v.Args[0] 13657 if v_0.Op != OpS390XADDconst { 13658 break 13659 } 13660 d := v_0.AuxInt 13661 ptr := v_0.Args[0] 13662 idx := v.Args[1] 13663 mem := v.Args[2] 13664 if !(is20Bit(c + d)) { 13665 break 13666 } 13667 v.reset(OpS390XMOVDloadidx) 13668 v.AuxInt = c + d 13669 v.Aux = sym 13670 v.AddArg(ptr) 13671 v.AddArg(idx) 13672 v.AddArg(mem) 13673 return true 13674 } 13675 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 13676 // cond: is20Bit(c+d) 13677 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 13678 for { 13679 c := v.AuxInt 13680 sym := v.Aux 13681 _ = v.Args[2] 13682 idx := v.Args[0] 13683 v_1 := v.Args[1] 13684 if v_1.Op != OpS390XADDconst { 13685 break 13686 } 13687 d := v_1.AuxInt 13688 ptr := v_1.Args[0] 13689 mem := v.Args[2] 13690 if !(is20Bit(c + d)) { 13691 break 13692 } 13693 v.reset(OpS390XMOVDloadidx) 13694 v.AuxInt = c + d 13695 v.Aux = sym 13696 v.AddArg(ptr) 13697 v.AddArg(idx) 13698 v.AddArg(mem) 13699 return true 13700 } 13701 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 13702 // cond: is20Bit(c+d) 13703 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 13704 for { 13705 c := v.AuxInt 13706 sym := v.Aux 13707 _ = v.Args[2] 13708 ptr := v.Args[0] 13709 v_1 := v.Args[1] 13710 if v_1.Op != OpS390XADDconst { 13711 break 13712 } 13713 d := v_1.AuxInt 13714 idx := v_1.Args[0] 13715 mem := v.Args[2] 13716 if !(is20Bit(c + d)) { 13717 break 13718 } 13719 v.reset(OpS390XMOVDloadidx) 13720 v.AuxInt = c + d 13721 v.Aux = sym 13722 v.AddArg(ptr) 13723 v.AddArg(idx) 13724 v.AddArg(mem) 13725 return true 13726 } 13727 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 13728 // cond: is20Bit(c+d) 13729 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 13730 for { 13731 c := v.AuxInt 13732 sym := v.Aux 13733 _ = v.Args[2] 13734 v_0 := v.Args[0] 13735 if v_0.Op != OpS390XADDconst { 13736 break 13737 } 13738 d := v_0.AuxInt 13739 idx := v_0.Args[0] 13740 ptr := v.Args[1] 13741 mem := v.Args[2] 13742 if !(is20Bit(c + d)) { 13743 break 13744 } 13745 v.reset(OpS390XMOVDloadidx) 13746 v.AuxInt = c + d 13747 v.Aux = sym 13748 v.AddArg(ptr) 13749 v.AddArg(idx) 13750 v.AddArg(mem) 13751 return true 13752 } 13753 return false 13754 } 13755 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 13756 b := v.Block 13757 _ = b 13758 // match: (MOVDnop <t> x) 13759 // cond: t.Compare(x.Type) == types.CMPeq 13760 // result: x 13761 for { 13762 t := v.Type 13763 x := v.Args[0] 13764 if !(t.Compare(x.Type) == types.CMPeq) { 13765 break 13766 } 13767 v.reset(OpCopy) 13768 v.Type = x.Type 13769 v.AddArg(x) 13770 return true 13771 } 13772 // match: (MOVDnop (MOVDconst [c])) 13773 // cond: 13774 // result: (MOVDconst [c]) 13775 for { 13776 v_0 := v.Args[0] 13777 if v_0.Op != OpS390XMOVDconst { 13778 break 13779 } 13780 c := v_0.AuxInt 13781 v.reset(OpS390XMOVDconst) 13782 v.AuxInt = c 13783 return true 13784 } 13785 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 13786 // cond: x.Uses == 1 && clobber(x) 13787 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 13788 for { 13789 t := v.Type 13790 x := v.Args[0] 13791 if x.Op != OpS390XMOVBZload { 13792 break 13793 } 13794 off := x.AuxInt 13795 sym := x.Aux 13796 _ = x.Args[1] 13797 ptr := x.Args[0] 13798 mem := x.Args[1] 13799 if !(x.Uses == 1 && clobber(x)) { 13800 break 13801 } 13802 b = x.Block 13803 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 13804 v.reset(OpCopy) 13805 v.AddArg(v0) 13806 v0.AuxInt = off 13807 v0.Aux = sym 13808 v0.AddArg(ptr) 13809 v0.AddArg(mem) 13810 return true 13811 } 13812 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 13813 // cond: x.Uses == 1 && clobber(x) 13814 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 13815 for { 13816 t := v.Type 13817 x := v.Args[0] 13818 if x.Op != OpS390XMOVBload { 13819 break 13820 } 13821 off := x.AuxInt 13822 sym := x.Aux 13823 _ = x.Args[1] 13824 ptr := x.Args[0] 13825 mem := x.Args[1] 13826 if !(x.Uses == 1 && clobber(x)) { 13827 break 13828 } 13829 b = x.Block 13830 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 13831 v.reset(OpCopy) 13832 v.AddArg(v0) 13833 v0.AuxInt = off 13834 v0.Aux = sym 13835 v0.AddArg(ptr) 13836 v0.AddArg(mem) 13837 return true 13838 } 13839 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 13840 // cond: x.Uses == 1 && clobber(x) 13841 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 13842 for { 13843 t := v.Type 13844 x := v.Args[0] 13845 if x.Op != OpS390XMOVHZload { 13846 break 13847 } 13848 off := x.AuxInt 13849 sym := x.Aux 13850 _ = x.Args[1] 13851 ptr := x.Args[0] 13852 mem := x.Args[1] 13853 if !(x.Uses == 1 && clobber(x)) { 13854 break 13855 } 13856 b = x.Block 13857 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 13858 v.reset(OpCopy) 13859 v.AddArg(v0) 13860 v0.AuxInt = off 13861 v0.Aux = sym 13862 v0.AddArg(ptr) 13863 v0.AddArg(mem) 13864 return true 13865 } 13866 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 13867 // cond: x.Uses == 1 && clobber(x) 13868 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 13869 for { 13870 t := v.Type 13871 x := v.Args[0] 13872 if x.Op != OpS390XMOVHload { 13873 break 13874 } 13875 off := x.AuxInt 13876 sym := x.Aux 13877 _ = x.Args[1] 13878 ptr := x.Args[0] 13879 mem := x.Args[1] 13880 if !(x.Uses == 1 && clobber(x)) { 13881 break 13882 } 13883 b = x.Block 13884 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 13885 v.reset(OpCopy) 13886 v.AddArg(v0) 13887 v0.AuxInt = off 13888 v0.Aux = sym 13889 v0.AddArg(ptr) 13890 v0.AddArg(mem) 13891 return true 13892 } 13893 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 13894 // cond: x.Uses == 1 && clobber(x) 13895 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 13896 for { 13897 t := v.Type 13898 x := v.Args[0] 13899 if x.Op != OpS390XMOVWZload { 13900 break 13901 } 13902 off := x.AuxInt 13903 sym := x.Aux 13904 _ = x.Args[1] 13905 ptr := x.Args[0] 13906 mem := x.Args[1] 13907 if !(x.Uses == 1 && clobber(x)) { 13908 break 13909 } 13910 b = x.Block 13911 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 13912 v.reset(OpCopy) 13913 v.AddArg(v0) 13914 v0.AuxInt = off 13915 v0.Aux = sym 13916 v0.AddArg(ptr) 13917 v0.AddArg(mem) 13918 return true 13919 } 13920 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 13921 // cond: x.Uses == 1 && clobber(x) 13922 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 13923 for { 13924 t := v.Type 13925 x := v.Args[0] 13926 if x.Op != OpS390XMOVWload { 13927 break 13928 } 13929 off := x.AuxInt 13930 sym := x.Aux 13931 _ = x.Args[1] 13932 ptr := x.Args[0] 13933 mem := x.Args[1] 13934 if !(x.Uses == 1 && clobber(x)) { 13935 break 13936 } 13937 b = x.Block 13938 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 13939 v.reset(OpCopy) 13940 v.AddArg(v0) 13941 v0.AuxInt = off 13942 v0.Aux = sym 13943 v0.AddArg(ptr) 13944 v0.AddArg(mem) 13945 return true 13946 } 13947 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 13948 // cond: x.Uses == 1 && clobber(x) 13949 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 13950 for { 13951 t := v.Type 13952 x := v.Args[0] 13953 if x.Op != OpS390XMOVDload { 13954 break 13955 } 13956 off := x.AuxInt 13957 sym := x.Aux 13958 _ = x.Args[1] 13959 ptr := x.Args[0] 13960 mem := x.Args[1] 13961 if !(x.Uses == 1 && clobber(x)) { 13962 break 13963 } 13964 b = x.Block 13965 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 13966 v.reset(OpCopy) 13967 v.AddArg(v0) 13968 v0.AuxInt = off 13969 v0.Aux = sym 13970 v0.AddArg(ptr) 13971 v0.AddArg(mem) 13972 return true 13973 } 13974 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 13975 // cond: x.Uses == 1 && clobber(x) 13976 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 13977 for { 13978 t := v.Type 13979 x := v.Args[0] 13980 if x.Op != OpS390XMOVBZloadidx { 13981 break 13982 } 13983 off := x.AuxInt 13984 sym := x.Aux 13985 _ = x.Args[2] 13986 ptr := x.Args[0] 13987 idx := x.Args[1] 13988 mem := x.Args[2] 13989 if !(x.Uses == 1 && clobber(x)) { 13990 break 13991 } 13992 b = x.Block 13993 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 13994 v.reset(OpCopy) 13995 v.AddArg(v0) 13996 v0.AuxInt = off 13997 v0.Aux = sym 13998 v0.AddArg(ptr) 13999 v0.AddArg(idx) 14000 v0.AddArg(mem) 14001 return true 14002 } 14003 return false 14004 } 14005 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 14006 b := v.Block 14007 _ = b 14008 // match: (MOVDnop <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 14009 // cond: x.Uses == 1 && clobber(x) 14010 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 14011 for { 14012 t := v.Type 14013 x := v.Args[0] 14014 if x.Op != OpS390XMOVBloadidx { 14015 break 14016 } 14017 off := x.AuxInt 14018 sym := x.Aux 14019 _ = x.Args[2] 14020 ptr := x.Args[0] 14021 idx := x.Args[1] 14022 mem := x.Args[2] 14023 if !(x.Uses == 1 && clobber(x)) { 14024 break 14025 } 14026 b = x.Block 14027 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 14028 v.reset(OpCopy) 14029 v.AddArg(v0) 14030 v0.AuxInt = off 14031 v0.Aux = sym 14032 v0.AddArg(ptr) 14033 v0.AddArg(idx) 14034 v0.AddArg(mem) 14035 return true 14036 } 14037 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 14038 // cond: x.Uses == 1 && clobber(x) 14039 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 14040 for { 14041 t := v.Type 14042 x := v.Args[0] 14043 if x.Op != OpS390XMOVHZloadidx { 14044 break 14045 } 14046 off := x.AuxInt 14047 sym := x.Aux 14048 _ = x.Args[2] 14049 ptr := x.Args[0] 14050 idx := x.Args[1] 14051 mem := x.Args[2] 14052 if !(x.Uses == 1 && clobber(x)) { 14053 break 14054 } 14055 b = x.Block 14056 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 14057 v.reset(OpCopy) 14058 v.AddArg(v0) 14059 v0.AuxInt = off 14060 v0.Aux = sym 14061 v0.AddArg(ptr) 14062 v0.AddArg(idx) 14063 v0.AddArg(mem) 14064 return true 14065 } 14066 // match: (MOVDnop <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 14067 // cond: x.Uses == 1 && clobber(x) 14068 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 14069 for { 14070 t := v.Type 14071 x := v.Args[0] 14072 if x.Op != OpS390XMOVHloadidx { 14073 break 14074 } 14075 off := x.AuxInt 14076 sym := x.Aux 14077 _ = x.Args[2] 14078 ptr := x.Args[0] 14079 idx := x.Args[1] 14080 mem := x.Args[2] 14081 if !(x.Uses == 1 && clobber(x)) { 14082 break 14083 } 14084 b = x.Block 14085 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 14086 v.reset(OpCopy) 14087 v.AddArg(v0) 14088 v0.AuxInt = off 14089 v0.Aux = sym 14090 v0.AddArg(ptr) 14091 v0.AddArg(idx) 14092 v0.AddArg(mem) 14093 return true 14094 } 14095 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 14096 // cond: x.Uses == 1 && clobber(x) 14097 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 14098 for { 14099 t := v.Type 14100 x := v.Args[0] 14101 if x.Op != OpS390XMOVWZloadidx { 14102 break 14103 } 14104 off := x.AuxInt 14105 sym := x.Aux 14106 _ = x.Args[2] 14107 ptr := x.Args[0] 14108 idx := x.Args[1] 14109 mem := x.Args[2] 14110 if !(x.Uses == 1 && clobber(x)) { 14111 break 14112 } 14113 b = x.Block 14114 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 14115 v.reset(OpCopy) 14116 v.AddArg(v0) 14117 v0.AuxInt = off 14118 v0.Aux = sym 14119 v0.AddArg(ptr) 14120 v0.AddArg(idx) 14121 v0.AddArg(mem) 14122 return true 14123 } 14124 // match: (MOVDnop <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 14125 // cond: x.Uses == 1 && clobber(x) 14126 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 14127 for { 14128 t := v.Type 14129 x := v.Args[0] 14130 if x.Op != OpS390XMOVWloadidx { 14131 break 14132 } 14133 off := x.AuxInt 14134 sym := x.Aux 14135 _ = x.Args[2] 14136 ptr := x.Args[0] 14137 idx := x.Args[1] 14138 mem := x.Args[2] 14139 if !(x.Uses == 1 && clobber(x)) { 14140 break 14141 } 14142 b = x.Block 14143 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 14144 v.reset(OpCopy) 14145 v.AddArg(v0) 14146 v0.AuxInt = off 14147 v0.Aux = sym 14148 v0.AddArg(ptr) 14149 v0.AddArg(idx) 14150 v0.AddArg(mem) 14151 return true 14152 } 14153 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 14154 // cond: x.Uses == 1 && clobber(x) 14155 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 14156 for { 14157 t := v.Type 14158 x := v.Args[0] 14159 if x.Op != OpS390XMOVDloadidx { 14160 break 14161 } 14162 off := x.AuxInt 14163 sym := x.Aux 14164 _ = x.Args[2] 14165 ptr := x.Args[0] 14166 idx := x.Args[1] 14167 mem := x.Args[2] 14168 if !(x.Uses == 1 && clobber(x)) { 14169 break 14170 } 14171 b = x.Block 14172 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 14173 v.reset(OpCopy) 14174 v.AddArg(v0) 14175 v0.AuxInt = off 14176 v0.Aux = sym 14177 v0.AddArg(ptr) 14178 v0.AddArg(idx) 14179 v0.AddArg(mem) 14180 return true 14181 } 14182 return false 14183 } 14184 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 14185 b := v.Block 14186 _ = b 14187 // match: (MOVDreg <t> x) 14188 // cond: t.Compare(x.Type) == types.CMPeq 14189 // result: x 14190 for { 14191 t := v.Type 14192 x := v.Args[0] 14193 if !(t.Compare(x.Type) == types.CMPeq) { 14194 break 14195 } 14196 v.reset(OpCopy) 14197 v.Type = x.Type 14198 v.AddArg(x) 14199 return true 14200 } 14201 // match: (MOVDreg (MOVDconst [c])) 14202 // cond: 14203 // result: (MOVDconst [c]) 14204 for { 14205 v_0 := v.Args[0] 14206 if v_0.Op != OpS390XMOVDconst { 14207 break 14208 } 14209 c := v_0.AuxInt 14210 v.reset(OpS390XMOVDconst) 14211 v.AuxInt = c 14212 return true 14213 } 14214 // match: (MOVDreg x) 14215 // cond: x.Uses == 1 14216 // result: (MOVDnop x) 14217 for { 14218 x := v.Args[0] 14219 if !(x.Uses == 1) { 14220 break 14221 } 14222 v.reset(OpS390XMOVDnop) 14223 v.AddArg(x) 14224 return true 14225 } 14226 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 14227 // cond: x.Uses == 1 && clobber(x) 14228 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 14229 for { 14230 t := v.Type 14231 x := v.Args[0] 14232 if x.Op != OpS390XMOVBZload { 14233 break 14234 } 14235 off := x.AuxInt 14236 sym := x.Aux 14237 _ = x.Args[1] 14238 ptr := x.Args[0] 14239 mem := x.Args[1] 14240 if !(x.Uses == 1 && clobber(x)) { 14241 break 14242 } 14243 b = x.Block 14244 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 14245 v.reset(OpCopy) 14246 v.AddArg(v0) 14247 v0.AuxInt = off 14248 v0.Aux = sym 14249 v0.AddArg(ptr) 14250 v0.AddArg(mem) 14251 return true 14252 } 14253 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 14254 // cond: x.Uses == 1 && clobber(x) 14255 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 14256 for { 14257 t := v.Type 14258 x := v.Args[0] 14259 if x.Op != OpS390XMOVBload { 14260 break 14261 } 14262 off := x.AuxInt 14263 sym := x.Aux 14264 _ = x.Args[1] 14265 ptr := x.Args[0] 14266 mem := x.Args[1] 14267 if !(x.Uses == 1 && clobber(x)) { 14268 break 14269 } 14270 b = x.Block 14271 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 14272 v.reset(OpCopy) 14273 v.AddArg(v0) 14274 v0.AuxInt = off 14275 v0.Aux = sym 14276 v0.AddArg(ptr) 14277 v0.AddArg(mem) 14278 return true 14279 } 14280 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 14281 // cond: x.Uses == 1 && clobber(x) 14282 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 14283 for { 14284 t := v.Type 14285 x := v.Args[0] 14286 if x.Op != OpS390XMOVHZload { 14287 break 14288 } 14289 off := x.AuxInt 14290 sym := x.Aux 14291 _ = x.Args[1] 14292 ptr := x.Args[0] 14293 mem := x.Args[1] 14294 if !(x.Uses == 1 && clobber(x)) { 14295 break 14296 } 14297 b = x.Block 14298 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 14299 v.reset(OpCopy) 14300 v.AddArg(v0) 14301 v0.AuxInt = off 14302 v0.Aux = sym 14303 v0.AddArg(ptr) 14304 v0.AddArg(mem) 14305 return true 14306 } 14307 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 14308 // cond: x.Uses == 1 && clobber(x) 14309 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 14310 for { 14311 t := v.Type 14312 x := v.Args[0] 14313 if x.Op != OpS390XMOVHload { 14314 break 14315 } 14316 off := x.AuxInt 14317 sym := x.Aux 14318 _ = x.Args[1] 14319 ptr := x.Args[0] 14320 mem := x.Args[1] 14321 if !(x.Uses == 1 && clobber(x)) { 14322 break 14323 } 14324 b = x.Block 14325 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 14326 v.reset(OpCopy) 14327 v.AddArg(v0) 14328 v0.AuxInt = off 14329 v0.Aux = sym 14330 v0.AddArg(ptr) 14331 v0.AddArg(mem) 14332 return true 14333 } 14334 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 14335 // cond: x.Uses == 1 && clobber(x) 14336 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 14337 for { 14338 t := v.Type 14339 x := v.Args[0] 14340 if x.Op != OpS390XMOVWZload { 14341 break 14342 } 14343 off := x.AuxInt 14344 sym := x.Aux 14345 _ = x.Args[1] 14346 ptr := x.Args[0] 14347 mem := x.Args[1] 14348 if !(x.Uses == 1 && clobber(x)) { 14349 break 14350 } 14351 b = x.Block 14352 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 14353 v.reset(OpCopy) 14354 v.AddArg(v0) 14355 v0.AuxInt = off 14356 v0.Aux = sym 14357 v0.AddArg(ptr) 14358 v0.AddArg(mem) 14359 return true 14360 } 14361 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 14362 // cond: x.Uses == 1 && clobber(x) 14363 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 14364 for { 14365 t := v.Type 14366 x := v.Args[0] 14367 if x.Op != OpS390XMOVWload { 14368 break 14369 } 14370 off := x.AuxInt 14371 sym := x.Aux 14372 _ = x.Args[1] 14373 ptr := x.Args[0] 14374 mem := x.Args[1] 14375 if !(x.Uses == 1 && clobber(x)) { 14376 break 14377 } 14378 b = x.Block 14379 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 14380 v.reset(OpCopy) 14381 v.AddArg(v0) 14382 v0.AuxInt = off 14383 v0.Aux = sym 14384 v0.AddArg(ptr) 14385 v0.AddArg(mem) 14386 return true 14387 } 14388 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 14389 // cond: x.Uses == 1 && clobber(x) 14390 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 14391 for { 14392 t := v.Type 14393 x := v.Args[0] 14394 if x.Op != OpS390XMOVDload { 14395 break 14396 } 14397 off := x.AuxInt 14398 sym := x.Aux 14399 _ = x.Args[1] 14400 ptr := x.Args[0] 14401 mem := x.Args[1] 14402 if !(x.Uses == 1 && clobber(x)) { 14403 break 14404 } 14405 b = x.Block 14406 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 14407 v.reset(OpCopy) 14408 v.AddArg(v0) 14409 v0.AuxInt = off 14410 v0.Aux = sym 14411 v0.AddArg(ptr) 14412 v0.AddArg(mem) 14413 return true 14414 } 14415 return false 14416 } 14417 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 14418 b := v.Block 14419 _ = b 14420 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 14421 // cond: x.Uses == 1 && clobber(x) 14422 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 14423 for { 14424 t := v.Type 14425 x := v.Args[0] 14426 if x.Op != OpS390XMOVBZloadidx { 14427 break 14428 } 14429 off := x.AuxInt 14430 sym := x.Aux 14431 _ = x.Args[2] 14432 ptr := x.Args[0] 14433 idx := x.Args[1] 14434 mem := x.Args[2] 14435 if !(x.Uses == 1 && clobber(x)) { 14436 break 14437 } 14438 b = x.Block 14439 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 14440 v.reset(OpCopy) 14441 v.AddArg(v0) 14442 v0.AuxInt = off 14443 v0.Aux = sym 14444 v0.AddArg(ptr) 14445 v0.AddArg(idx) 14446 v0.AddArg(mem) 14447 return true 14448 } 14449 // match: (MOVDreg <t> x:(MOVBloadidx [off] {sym} ptr idx mem)) 14450 // cond: x.Uses == 1 && clobber(x) 14451 // result: @x.Block (MOVBloadidx <t> [off] {sym} ptr idx mem) 14452 for { 14453 t := v.Type 14454 x := v.Args[0] 14455 if x.Op != OpS390XMOVBloadidx { 14456 break 14457 } 14458 off := x.AuxInt 14459 sym := x.Aux 14460 _ = x.Args[2] 14461 ptr := x.Args[0] 14462 idx := x.Args[1] 14463 mem := x.Args[2] 14464 if !(x.Uses == 1 && clobber(x)) { 14465 break 14466 } 14467 b = x.Block 14468 v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) 14469 v.reset(OpCopy) 14470 v.AddArg(v0) 14471 v0.AuxInt = off 14472 v0.Aux = sym 14473 v0.AddArg(ptr) 14474 v0.AddArg(idx) 14475 v0.AddArg(mem) 14476 return true 14477 } 14478 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 14479 // cond: x.Uses == 1 && clobber(x) 14480 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 14481 for { 14482 t := v.Type 14483 x := v.Args[0] 14484 if x.Op != OpS390XMOVHZloadidx { 14485 break 14486 } 14487 off := x.AuxInt 14488 sym := x.Aux 14489 _ = x.Args[2] 14490 ptr := x.Args[0] 14491 idx := x.Args[1] 14492 mem := x.Args[2] 14493 if !(x.Uses == 1 && clobber(x)) { 14494 break 14495 } 14496 b = x.Block 14497 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 14498 v.reset(OpCopy) 14499 v.AddArg(v0) 14500 v0.AuxInt = off 14501 v0.Aux = sym 14502 v0.AddArg(ptr) 14503 v0.AddArg(idx) 14504 v0.AddArg(mem) 14505 return true 14506 } 14507 // match: (MOVDreg <t> x:(MOVHloadidx [off] {sym} ptr idx mem)) 14508 // cond: x.Uses == 1 && clobber(x) 14509 // result: @x.Block (MOVHloadidx <t> [off] {sym} ptr idx mem) 14510 for { 14511 t := v.Type 14512 x := v.Args[0] 14513 if x.Op != OpS390XMOVHloadidx { 14514 break 14515 } 14516 off := x.AuxInt 14517 sym := x.Aux 14518 _ = x.Args[2] 14519 ptr := x.Args[0] 14520 idx := x.Args[1] 14521 mem := x.Args[2] 14522 if !(x.Uses == 1 && clobber(x)) { 14523 break 14524 } 14525 b = x.Block 14526 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) 14527 v.reset(OpCopy) 14528 v.AddArg(v0) 14529 v0.AuxInt = off 14530 v0.Aux = sym 14531 v0.AddArg(ptr) 14532 v0.AddArg(idx) 14533 v0.AddArg(mem) 14534 return true 14535 } 14536 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 14537 // cond: x.Uses == 1 && clobber(x) 14538 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 14539 for { 14540 t := v.Type 14541 x := v.Args[0] 14542 if x.Op != OpS390XMOVWZloadidx { 14543 break 14544 } 14545 off := x.AuxInt 14546 sym := x.Aux 14547 _ = x.Args[2] 14548 ptr := x.Args[0] 14549 idx := x.Args[1] 14550 mem := x.Args[2] 14551 if !(x.Uses == 1 && clobber(x)) { 14552 break 14553 } 14554 b = x.Block 14555 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 14556 v.reset(OpCopy) 14557 v.AddArg(v0) 14558 v0.AuxInt = off 14559 v0.Aux = sym 14560 v0.AddArg(ptr) 14561 v0.AddArg(idx) 14562 v0.AddArg(mem) 14563 return true 14564 } 14565 // match: (MOVDreg <t> x:(MOVWloadidx [off] {sym} ptr idx mem)) 14566 // cond: x.Uses == 1 && clobber(x) 14567 // result: @x.Block (MOVWloadidx <t> [off] {sym} ptr idx mem) 14568 for { 14569 t := v.Type 14570 x := v.Args[0] 14571 if x.Op != OpS390XMOVWloadidx { 14572 break 14573 } 14574 off := x.AuxInt 14575 sym := x.Aux 14576 _ = x.Args[2] 14577 ptr := x.Args[0] 14578 idx := x.Args[1] 14579 mem := x.Args[2] 14580 if !(x.Uses == 1 && clobber(x)) { 14581 break 14582 } 14583 b = x.Block 14584 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) 14585 v.reset(OpCopy) 14586 v.AddArg(v0) 14587 v0.AuxInt = off 14588 v0.Aux = sym 14589 v0.AddArg(ptr) 14590 v0.AddArg(idx) 14591 v0.AddArg(mem) 14592 return true 14593 } 14594 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 14595 // cond: x.Uses == 1 && clobber(x) 14596 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 14597 for { 14598 t := v.Type 14599 x := v.Args[0] 14600 if x.Op != OpS390XMOVDloadidx { 14601 break 14602 } 14603 off := x.AuxInt 14604 sym := x.Aux 14605 _ = x.Args[2] 14606 ptr := x.Args[0] 14607 idx := x.Args[1] 14608 mem := x.Args[2] 14609 if !(x.Uses == 1 && clobber(x)) { 14610 break 14611 } 14612 b = x.Block 14613 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 14614 v.reset(OpCopy) 14615 v.AddArg(v0) 14616 v0.AuxInt = off 14617 v0.Aux = sym 14618 v0.AddArg(ptr) 14619 v0.AddArg(idx) 14620 v0.AddArg(mem) 14621 return true 14622 } 14623 return false 14624 } 14625 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 14626 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 14627 // cond: is20Bit(off1+off2) 14628 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 14629 for { 14630 off1 := v.AuxInt 14631 sym := v.Aux 14632 _ = v.Args[2] 14633 v_0 := v.Args[0] 14634 if v_0.Op != OpS390XADDconst { 14635 break 14636 } 14637 off2 := v_0.AuxInt 14638 ptr := v_0.Args[0] 14639 val := v.Args[1] 14640 mem := v.Args[2] 14641 if !(is20Bit(off1 + off2)) { 14642 break 14643 } 14644 v.reset(OpS390XMOVDstore) 14645 v.AuxInt = off1 + off2 14646 v.Aux = sym 14647 v.AddArg(ptr) 14648 v.AddArg(val) 14649 v.AddArg(mem) 14650 return true 14651 } 14652 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 14653 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 14654 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 14655 for { 14656 off := v.AuxInt 14657 sym := v.Aux 14658 _ = v.Args[2] 14659 ptr := v.Args[0] 14660 v_1 := v.Args[1] 14661 if v_1.Op != OpS390XMOVDconst { 14662 break 14663 } 14664 c := v_1.AuxInt 14665 mem := v.Args[2] 14666 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 14667 break 14668 } 14669 v.reset(OpS390XMOVDstoreconst) 14670 v.AuxInt = makeValAndOff(c, off) 14671 v.Aux = sym 14672 v.AddArg(ptr) 14673 v.AddArg(mem) 14674 return true 14675 } 14676 // match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 14677 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 14678 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 14679 for { 14680 off1 := v.AuxInt 14681 sym1 := v.Aux 14682 _ = v.Args[2] 14683 v_0 := v.Args[0] 14684 if v_0.Op != OpS390XMOVDaddr { 14685 break 14686 } 14687 t := v_0.Type 14688 off2 := v_0.AuxInt 14689 sym2 := v_0.Aux 14690 base := v_0.Args[0] 14691 val := v.Args[1] 14692 mem := v.Args[2] 14693 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 14694 break 14695 } 14696 v.reset(OpS390XMOVDstore) 14697 v.AuxInt = off1 + off2 14698 v.Aux = mergeSym(sym1, sym2) 14699 v.AddArg(base) 14700 v.AddArg(val) 14701 v.AddArg(mem) 14702 return true 14703 } 14704 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 14705 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14706 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 14707 for { 14708 off1 := v.AuxInt 14709 sym1 := v.Aux 14710 _ = v.Args[2] 14711 v_0 := v.Args[0] 14712 if v_0.Op != OpS390XMOVDaddridx { 14713 break 14714 } 14715 off2 := v_0.AuxInt 14716 sym2 := v_0.Aux 14717 _ = v_0.Args[1] 14718 ptr := v_0.Args[0] 14719 idx := v_0.Args[1] 14720 val := v.Args[1] 14721 mem := v.Args[2] 14722 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14723 break 14724 } 14725 v.reset(OpS390XMOVDstoreidx) 14726 v.AuxInt = off1 + off2 14727 v.Aux = mergeSym(sym1, sym2) 14728 v.AddArg(ptr) 14729 v.AddArg(idx) 14730 v.AddArg(val) 14731 v.AddArg(mem) 14732 return true 14733 } 14734 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 14735 // cond: ptr.Op != OpSB 14736 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 14737 for { 14738 off := v.AuxInt 14739 sym := v.Aux 14740 _ = v.Args[2] 14741 v_0 := v.Args[0] 14742 if v_0.Op != OpS390XADD { 14743 break 14744 } 14745 _ = v_0.Args[1] 14746 ptr := v_0.Args[0] 14747 idx := v_0.Args[1] 14748 val := v.Args[1] 14749 mem := v.Args[2] 14750 if !(ptr.Op != OpSB) { 14751 break 14752 } 14753 v.reset(OpS390XMOVDstoreidx) 14754 v.AuxInt = off 14755 v.Aux = sym 14756 v.AddArg(ptr) 14757 v.AddArg(idx) 14758 v.AddArg(val) 14759 v.AddArg(mem) 14760 return true 14761 } 14762 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 14763 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 14764 // result: (STMG2 [i-8] {s} p w0 w1 mem) 14765 for { 14766 i := v.AuxInt 14767 s := v.Aux 14768 _ = v.Args[2] 14769 p := v.Args[0] 14770 w1 := v.Args[1] 14771 x := v.Args[2] 14772 if x.Op != OpS390XMOVDstore { 14773 break 14774 } 14775 if x.AuxInt != i-8 { 14776 break 14777 } 14778 if x.Aux != s { 14779 break 14780 } 14781 _ = x.Args[2] 14782 if p != x.Args[0] { 14783 break 14784 } 14785 w0 := x.Args[1] 14786 mem := x.Args[2] 14787 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 14788 break 14789 } 14790 v.reset(OpS390XSTMG2) 14791 v.AuxInt = i - 8 14792 v.Aux = s 14793 v.AddArg(p) 14794 v.AddArg(w0) 14795 v.AddArg(w1) 14796 v.AddArg(mem) 14797 return true 14798 } 14799 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 14800 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 14801 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 14802 for { 14803 i := v.AuxInt 14804 s := v.Aux 14805 _ = v.Args[2] 14806 p := v.Args[0] 14807 w2 := v.Args[1] 14808 x := v.Args[2] 14809 if x.Op != OpS390XSTMG2 { 14810 break 14811 } 14812 if x.AuxInt != i-16 { 14813 break 14814 } 14815 if x.Aux != s { 14816 break 14817 } 14818 _ = x.Args[3] 14819 if p != x.Args[0] { 14820 break 14821 } 14822 w0 := x.Args[1] 14823 w1 := x.Args[2] 14824 mem := x.Args[3] 14825 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 14826 break 14827 } 14828 v.reset(OpS390XSTMG3) 14829 v.AuxInt = i - 16 14830 v.Aux = s 14831 v.AddArg(p) 14832 v.AddArg(w0) 14833 v.AddArg(w1) 14834 v.AddArg(w2) 14835 v.AddArg(mem) 14836 return true 14837 } 14838 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 14839 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 14840 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 14841 for { 14842 i := v.AuxInt 14843 s := v.Aux 14844 _ = v.Args[2] 14845 p := v.Args[0] 14846 w3 := v.Args[1] 14847 x := v.Args[2] 14848 if x.Op != OpS390XSTMG3 { 14849 break 14850 } 14851 if x.AuxInt != i-24 { 14852 break 14853 } 14854 if x.Aux != s { 14855 break 14856 } 14857 _ = x.Args[4] 14858 if p != x.Args[0] { 14859 break 14860 } 14861 w0 := x.Args[1] 14862 w1 := x.Args[2] 14863 w2 := x.Args[3] 14864 mem := x.Args[4] 14865 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 14866 break 14867 } 14868 v.reset(OpS390XSTMG4) 14869 v.AuxInt = i - 24 14870 v.Aux = s 14871 v.AddArg(p) 14872 v.AddArg(w0) 14873 v.AddArg(w1) 14874 v.AddArg(w2) 14875 v.AddArg(w3) 14876 v.AddArg(mem) 14877 return true 14878 } 14879 return false 14880 } 14881 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 14882 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 14883 // cond: isU12Bit(ValAndOff(sc).Off()+off) 14884 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 14885 for { 14886 sc := v.AuxInt 14887 s := v.Aux 14888 _ = v.Args[1] 14889 v_0 := v.Args[0] 14890 if v_0.Op != OpS390XADDconst { 14891 break 14892 } 14893 off := v_0.AuxInt 14894 ptr := v_0.Args[0] 14895 mem := v.Args[1] 14896 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 14897 break 14898 } 14899 v.reset(OpS390XMOVDstoreconst) 14900 v.AuxInt = ValAndOff(sc).add(off) 14901 v.Aux = s 14902 v.AddArg(ptr) 14903 v.AddArg(mem) 14904 return true 14905 } 14906 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 14907 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 14908 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 14909 for { 14910 sc := v.AuxInt 14911 sym1 := v.Aux 14912 _ = v.Args[1] 14913 v_0 := v.Args[0] 14914 if v_0.Op != OpS390XMOVDaddr { 14915 break 14916 } 14917 off := v_0.AuxInt 14918 sym2 := v_0.Aux 14919 ptr := v_0.Args[0] 14920 mem := v.Args[1] 14921 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 14922 break 14923 } 14924 v.reset(OpS390XMOVDstoreconst) 14925 v.AuxInt = ValAndOff(sc).add(off) 14926 v.Aux = mergeSym(sym1, sym2) 14927 v.AddArg(ptr) 14928 v.AddArg(mem) 14929 return true 14930 } 14931 return false 14932 } 14933 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 14934 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 14935 // cond: is20Bit(c+d) 14936 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 14937 for { 14938 c := v.AuxInt 14939 sym := v.Aux 14940 _ = v.Args[3] 14941 v_0 := v.Args[0] 14942 if v_0.Op != OpS390XADDconst { 14943 break 14944 } 14945 d := v_0.AuxInt 14946 ptr := v_0.Args[0] 14947 idx := v.Args[1] 14948 val := v.Args[2] 14949 mem := v.Args[3] 14950 if !(is20Bit(c + d)) { 14951 break 14952 } 14953 v.reset(OpS390XMOVDstoreidx) 14954 v.AuxInt = c + d 14955 v.Aux = sym 14956 v.AddArg(ptr) 14957 v.AddArg(idx) 14958 v.AddArg(val) 14959 v.AddArg(mem) 14960 return true 14961 } 14962 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 14963 // cond: is20Bit(c+d) 14964 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 14965 for { 14966 c := v.AuxInt 14967 sym := v.Aux 14968 _ = v.Args[3] 14969 idx := v.Args[0] 14970 v_1 := v.Args[1] 14971 if v_1.Op != OpS390XADDconst { 14972 break 14973 } 14974 d := v_1.AuxInt 14975 ptr := v_1.Args[0] 14976 val := v.Args[2] 14977 mem := v.Args[3] 14978 if !(is20Bit(c + d)) { 14979 break 14980 } 14981 v.reset(OpS390XMOVDstoreidx) 14982 v.AuxInt = c + d 14983 v.Aux = sym 14984 v.AddArg(ptr) 14985 v.AddArg(idx) 14986 v.AddArg(val) 14987 v.AddArg(mem) 14988 return true 14989 } 14990 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 14991 // cond: is20Bit(c+d) 14992 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 14993 for { 14994 c := v.AuxInt 14995 sym := v.Aux 14996 _ = v.Args[3] 14997 ptr := v.Args[0] 14998 v_1 := v.Args[1] 14999 if v_1.Op != OpS390XADDconst { 15000 break 15001 } 15002 d := v_1.AuxInt 15003 idx := v_1.Args[0] 15004 val := v.Args[2] 15005 mem := v.Args[3] 15006 if !(is20Bit(c + d)) { 15007 break 15008 } 15009 v.reset(OpS390XMOVDstoreidx) 15010 v.AuxInt = c + d 15011 v.Aux = sym 15012 v.AddArg(ptr) 15013 v.AddArg(idx) 15014 v.AddArg(val) 15015 v.AddArg(mem) 15016 return true 15017 } 15018 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15019 // cond: is20Bit(c+d) 15020 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 15021 for { 15022 c := v.AuxInt 15023 sym := v.Aux 15024 _ = v.Args[3] 15025 v_0 := v.Args[0] 15026 if v_0.Op != OpS390XADDconst { 15027 break 15028 } 15029 d := v_0.AuxInt 15030 idx := v_0.Args[0] 15031 ptr := v.Args[1] 15032 val := v.Args[2] 15033 mem := v.Args[3] 15034 if !(is20Bit(c + d)) { 15035 break 15036 } 15037 v.reset(OpS390XMOVDstoreidx) 15038 v.AuxInt = c + d 15039 v.Aux = sym 15040 v.AddArg(ptr) 15041 v.AddArg(idx) 15042 v.AddArg(val) 15043 v.AddArg(mem) 15044 return true 15045 } 15046 return false 15047 } 15048 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 15049 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 15050 // cond: x.Uses == 1 && clobber(x) 15051 // result: (MOVWBRstore [i-2] {s} p w mem) 15052 for { 15053 i := v.AuxInt 15054 s := v.Aux 15055 _ = v.Args[2] 15056 p := v.Args[0] 15057 v_1 := v.Args[1] 15058 if v_1.Op != OpS390XSRDconst { 15059 break 15060 } 15061 if v_1.AuxInt != 16 { 15062 break 15063 } 15064 w := v_1.Args[0] 15065 x := v.Args[2] 15066 if x.Op != OpS390XMOVHBRstore { 15067 break 15068 } 15069 if x.AuxInt != i-2 { 15070 break 15071 } 15072 if x.Aux != s { 15073 break 15074 } 15075 _ = x.Args[2] 15076 if p != x.Args[0] { 15077 break 15078 } 15079 if w != x.Args[1] { 15080 break 15081 } 15082 mem := x.Args[2] 15083 if !(x.Uses == 1 && clobber(x)) { 15084 break 15085 } 15086 v.reset(OpS390XMOVWBRstore) 15087 v.AuxInt = i - 2 15088 v.Aux = s 15089 v.AddArg(p) 15090 v.AddArg(w) 15091 v.AddArg(mem) 15092 return true 15093 } 15094 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 15095 // cond: x.Uses == 1 && clobber(x) 15096 // result: (MOVWBRstore [i-2] {s} p w0 mem) 15097 for { 15098 i := v.AuxInt 15099 s := v.Aux 15100 _ = v.Args[2] 15101 p := v.Args[0] 15102 v_1 := v.Args[1] 15103 if v_1.Op != OpS390XSRDconst { 15104 break 15105 } 15106 j := v_1.AuxInt 15107 w := v_1.Args[0] 15108 x := v.Args[2] 15109 if x.Op != OpS390XMOVHBRstore { 15110 break 15111 } 15112 if x.AuxInt != i-2 { 15113 break 15114 } 15115 if x.Aux != s { 15116 break 15117 } 15118 _ = x.Args[2] 15119 if p != x.Args[0] { 15120 break 15121 } 15122 w0 := x.Args[1] 15123 if w0.Op != OpS390XSRDconst { 15124 break 15125 } 15126 if w0.AuxInt != j-16 { 15127 break 15128 } 15129 if w != w0.Args[0] { 15130 break 15131 } 15132 mem := x.Args[2] 15133 if !(x.Uses == 1 && clobber(x)) { 15134 break 15135 } 15136 v.reset(OpS390XMOVWBRstore) 15137 v.AuxInt = i - 2 15138 v.Aux = s 15139 v.AddArg(p) 15140 v.AddArg(w0) 15141 v.AddArg(mem) 15142 return true 15143 } 15144 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 15145 // cond: x.Uses == 1 && clobber(x) 15146 // result: (MOVWBRstore [i-2] {s} p w mem) 15147 for { 15148 i := v.AuxInt 15149 s := v.Aux 15150 _ = v.Args[2] 15151 p := v.Args[0] 15152 v_1 := v.Args[1] 15153 if v_1.Op != OpS390XSRWconst { 15154 break 15155 } 15156 if v_1.AuxInt != 16 { 15157 break 15158 } 15159 w := v_1.Args[0] 15160 x := v.Args[2] 15161 if x.Op != OpS390XMOVHBRstore { 15162 break 15163 } 15164 if x.AuxInt != i-2 { 15165 break 15166 } 15167 if x.Aux != s { 15168 break 15169 } 15170 _ = x.Args[2] 15171 if p != x.Args[0] { 15172 break 15173 } 15174 if w != x.Args[1] { 15175 break 15176 } 15177 mem := x.Args[2] 15178 if !(x.Uses == 1 && clobber(x)) { 15179 break 15180 } 15181 v.reset(OpS390XMOVWBRstore) 15182 v.AuxInt = i - 2 15183 v.Aux = s 15184 v.AddArg(p) 15185 v.AddArg(w) 15186 v.AddArg(mem) 15187 return true 15188 } 15189 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 15190 // cond: x.Uses == 1 && clobber(x) 15191 // result: (MOVWBRstore [i-2] {s} p w0 mem) 15192 for { 15193 i := v.AuxInt 15194 s := v.Aux 15195 _ = v.Args[2] 15196 p := v.Args[0] 15197 v_1 := v.Args[1] 15198 if v_1.Op != OpS390XSRWconst { 15199 break 15200 } 15201 j := v_1.AuxInt 15202 w := v_1.Args[0] 15203 x := v.Args[2] 15204 if x.Op != OpS390XMOVHBRstore { 15205 break 15206 } 15207 if x.AuxInt != i-2 { 15208 break 15209 } 15210 if x.Aux != s { 15211 break 15212 } 15213 _ = x.Args[2] 15214 if p != x.Args[0] { 15215 break 15216 } 15217 w0 := x.Args[1] 15218 if w0.Op != OpS390XSRWconst { 15219 break 15220 } 15221 if w0.AuxInt != j-16 { 15222 break 15223 } 15224 if w != w0.Args[0] { 15225 break 15226 } 15227 mem := x.Args[2] 15228 if !(x.Uses == 1 && clobber(x)) { 15229 break 15230 } 15231 v.reset(OpS390XMOVWBRstore) 15232 v.AuxInt = i - 2 15233 v.Aux = s 15234 v.AddArg(p) 15235 v.AddArg(w0) 15236 v.AddArg(mem) 15237 return true 15238 } 15239 return false 15240 } 15241 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 15242 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 15243 // cond: x.Uses == 1 && clobber(x) 15244 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15245 for { 15246 i := v.AuxInt 15247 s := v.Aux 15248 _ = v.Args[3] 15249 p := v.Args[0] 15250 idx := v.Args[1] 15251 v_2 := v.Args[2] 15252 if v_2.Op != OpS390XSRDconst { 15253 break 15254 } 15255 if v_2.AuxInt != 16 { 15256 break 15257 } 15258 w := v_2.Args[0] 15259 x := v.Args[3] 15260 if x.Op != OpS390XMOVHBRstoreidx { 15261 break 15262 } 15263 if x.AuxInt != i-2 { 15264 break 15265 } 15266 if x.Aux != s { 15267 break 15268 } 15269 _ = x.Args[3] 15270 if p != x.Args[0] { 15271 break 15272 } 15273 if idx != x.Args[1] { 15274 break 15275 } 15276 if w != x.Args[2] { 15277 break 15278 } 15279 mem := x.Args[3] 15280 if !(x.Uses == 1 && clobber(x)) { 15281 break 15282 } 15283 v.reset(OpS390XMOVWBRstoreidx) 15284 v.AuxInt = i - 2 15285 v.Aux = s 15286 v.AddArg(p) 15287 v.AddArg(idx) 15288 v.AddArg(w) 15289 v.AddArg(mem) 15290 return true 15291 } 15292 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 15293 // cond: x.Uses == 1 && clobber(x) 15294 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15295 for { 15296 i := v.AuxInt 15297 s := v.Aux 15298 _ = v.Args[3] 15299 p := v.Args[0] 15300 idx := v.Args[1] 15301 v_2 := v.Args[2] 15302 if v_2.Op != OpS390XSRDconst { 15303 break 15304 } 15305 if v_2.AuxInt != 16 { 15306 break 15307 } 15308 w := v_2.Args[0] 15309 x := v.Args[3] 15310 if x.Op != OpS390XMOVHBRstoreidx { 15311 break 15312 } 15313 if x.AuxInt != i-2 { 15314 break 15315 } 15316 if x.Aux != s { 15317 break 15318 } 15319 _ = x.Args[3] 15320 if idx != x.Args[0] { 15321 break 15322 } 15323 if p != x.Args[1] { 15324 break 15325 } 15326 if w != x.Args[2] { 15327 break 15328 } 15329 mem := x.Args[3] 15330 if !(x.Uses == 1 && clobber(x)) { 15331 break 15332 } 15333 v.reset(OpS390XMOVWBRstoreidx) 15334 v.AuxInt = i - 2 15335 v.Aux = s 15336 v.AddArg(p) 15337 v.AddArg(idx) 15338 v.AddArg(w) 15339 v.AddArg(mem) 15340 return true 15341 } 15342 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 15343 // cond: x.Uses == 1 && clobber(x) 15344 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15345 for { 15346 i := v.AuxInt 15347 s := v.Aux 15348 _ = v.Args[3] 15349 idx := v.Args[0] 15350 p := v.Args[1] 15351 v_2 := v.Args[2] 15352 if v_2.Op != OpS390XSRDconst { 15353 break 15354 } 15355 if v_2.AuxInt != 16 { 15356 break 15357 } 15358 w := v_2.Args[0] 15359 x := v.Args[3] 15360 if x.Op != OpS390XMOVHBRstoreidx { 15361 break 15362 } 15363 if x.AuxInt != i-2 { 15364 break 15365 } 15366 if x.Aux != s { 15367 break 15368 } 15369 _ = x.Args[3] 15370 if p != x.Args[0] { 15371 break 15372 } 15373 if idx != x.Args[1] { 15374 break 15375 } 15376 if w != x.Args[2] { 15377 break 15378 } 15379 mem := x.Args[3] 15380 if !(x.Uses == 1 && clobber(x)) { 15381 break 15382 } 15383 v.reset(OpS390XMOVWBRstoreidx) 15384 v.AuxInt = i - 2 15385 v.Aux = s 15386 v.AddArg(p) 15387 v.AddArg(idx) 15388 v.AddArg(w) 15389 v.AddArg(mem) 15390 return true 15391 } 15392 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 15393 // cond: x.Uses == 1 && clobber(x) 15394 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15395 for { 15396 i := v.AuxInt 15397 s := v.Aux 15398 _ = v.Args[3] 15399 idx := v.Args[0] 15400 p := v.Args[1] 15401 v_2 := v.Args[2] 15402 if v_2.Op != OpS390XSRDconst { 15403 break 15404 } 15405 if v_2.AuxInt != 16 { 15406 break 15407 } 15408 w := v_2.Args[0] 15409 x := v.Args[3] 15410 if x.Op != OpS390XMOVHBRstoreidx { 15411 break 15412 } 15413 if x.AuxInt != i-2 { 15414 break 15415 } 15416 if x.Aux != s { 15417 break 15418 } 15419 _ = x.Args[3] 15420 if idx != x.Args[0] { 15421 break 15422 } 15423 if p != x.Args[1] { 15424 break 15425 } 15426 if w != x.Args[2] { 15427 break 15428 } 15429 mem := x.Args[3] 15430 if !(x.Uses == 1 && clobber(x)) { 15431 break 15432 } 15433 v.reset(OpS390XMOVWBRstoreidx) 15434 v.AuxInt = i - 2 15435 v.Aux = s 15436 v.AddArg(p) 15437 v.AddArg(idx) 15438 v.AddArg(w) 15439 v.AddArg(mem) 15440 return true 15441 } 15442 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 15443 // cond: x.Uses == 1 && clobber(x) 15444 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15445 for { 15446 i := v.AuxInt 15447 s := v.Aux 15448 _ = v.Args[3] 15449 p := v.Args[0] 15450 idx := v.Args[1] 15451 v_2 := v.Args[2] 15452 if v_2.Op != OpS390XSRDconst { 15453 break 15454 } 15455 j := v_2.AuxInt 15456 w := v_2.Args[0] 15457 x := v.Args[3] 15458 if x.Op != OpS390XMOVHBRstoreidx { 15459 break 15460 } 15461 if x.AuxInt != i-2 { 15462 break 15463 } 15464 if x.Aux != s { 15465 break 15466 } 15467 _ = x.Args[3] 15468 if p != x.Args[0] { 15469 break 15470 } 15471 if idx != x.Args[1] { 15472 break 15473 } 15474 w0 := x.Args[2] 15475 if w0.Op != OpS390XSRDconst { 15476 break 15477 } 15478 if w0.AuxInt != j-16 { 15479 break 15480 } 15481 if w != w0.Args[0] { 15482 break 15483 } 15484 mem := x.Args[3] 15485 if !(x.Uses == 1 && clobber(x)) { 15486 break 15487 } 15488 v.reset(OpS390XMOVWBRstoreidx) 15489 v.AuxInt = i - 2 15490 v.Aux = s 15491 v.AddArg(p) 15492 v.AddArg(idx) 15493 v.AddArg(w0) 15494 v.AddArg(mem) 15495 return true 15496 } 15497 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 15498 // cond: x.Uses == 1 && clobber(x) 15499 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15500 for { 15501 i := v.AuxInt 15502 s := v.Aux 15503 _ = v.Args[3] 15504 p := v.Args[0] 15505 idx := v.Args[1] 15506 v_2 := v.Args[2] 15507 if v_2.Op != OpS390XSRDconst { 15508 break 15509 } 15510 j := v_2.AuxInt 15511 w := v_2.Args[0] 15512 x := v.Args[3] 15513 if x.Op != OpS390XMOVHBRstoreidx { 15514 break 15515 } 15516 if x.AuxInt != i-2 { 15517 break 15518 } 15519 if x.Aux != s { 15520 break 15521 } 15522 _ = x.Args[3] 15523 if idx != x.Args[0] { 15524 break 15525 } 15526 if p != x.Args[1] { 15527 break 15528 } 15529 w0 := x.Args[2] 15530 if w0.Op != OpS390XSRDconst { 15531 break 15532 } 15533 if w0.AuxInt != j-16 { 15534 break 15535 } 15536 if w != w0.Args[0] { 15537 break 15538 } 15539 mem := x.Args[3] 15540 if !(x.Uses == 1 && clobber(x)) { 15541 break 15542 } 15543 v.reset(OpS390XMOVWBRstoreidx) 15544 v.AuxInt = i - 2 15545 v.Aux = s 15546 v.AddArg(p) 15547 v.AddArg(idx) 15548 v.AddArg(w0) 15549 v.AddArg(mem) 15550 return true 15551 } 15552 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 15553 // cond: x.Uses == 1 && clobber(x) 15554 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15555 for { 15556 i := v.AuxInt 15557 s := v.Aux 15558 _ = v.Args[3] 15559 idx := v.Args[0] 15560 p := v.Args[1] 15561 v_2 := v.Args[2] 15562 if v_2.Op != OpS390XSRDconst { 15563 break 15564 } 15565 j := v_2.AuxInt 15566 w := v_2.Args[0] 15567 x := v.Args[3] 15568 if x.Op != OpS390XMOVHBRstoreidx { 15569 break 15570 } 15571 if x.AuxInt != i-2 { 15572 break 15573 } 15574 if x.Aux != s { 15575 break 15576 } 15577 _ = x.Args[3] 15578 if p != x.Args[0] { 15579 break 15580 } 15581 if idx != x.Args[1] { 15582 break 15583 } 15584 w0 := x.Args[2] 15585 if w0.Op != OpS390XSRDconst { 15586 break 15587 } 15588 if w0.AuxInt != j-16 { 15589 break 15590 } 15591 if w != w0.Args[0] { 15592 break 15593 } 15594 mem := x.Args[3] 15595 if !(x.Uses == 1 && clobber(x)) { 15596 break 15597 } 15598 v.reset(OpS390XMOVWBRstoreidx) 15599 v.AuxInt = i - 2 15600 v.Aux = s 15601 v.AddArg(p) 15602 v.AddArg(idx) 15603 v.AddArg(w0) 15604 v.AddArg(mem) 15605 return true 15606 } 15607 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 15608 // cond: x.Uses == 1 && clobber(x) 15609 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15610 for { 15611 i := v.AuxInt 15612 s := v.Aux 15613 _ = v.Args[3] 15614 idx := v.Args[0] 15615 p := v.Args[1] 15616 v_2 := v.Args[2] 15617 if v_2.Op != OpS390XSRDconst { 15618 break 15619 } 15620 j := v_2.AuxInt 15621 w := v_2.Args[0] 15622 x := v.Args[3] 15623 if x.Op != OpS390XMOVHBRstoreidx { 15624 break 15625 } 15626 if x.AuxInt != i-2 { 15627 break 15628 } 15629 if x.Aux != s { 15630 break 15631 } 15632 _ = x.Args[3] 15633 if idx != x.Args[0] { 15634 break 15635 } 15636 if p != x.Args[1] { 15637 break 15638 } 15639 w0 := x.Args[2] 15640 if w0.Op != OpS390XSRDconst { 15641 break 15642 } 15643 if w0.AuxInt != j-16 { 15644 break 15645 } 15646 if w != w0.Args[0] { 15647 break 15648 } 15649 mem := x.Args[3] 15650 if !(x.Uses == 1 && clobber(x)) { 15651 break 15652 } 15653 v.reset(OpS390XMOVWBRstoreidx) 15654 v.AuxInt = i - 2 15655 v.Aux = s 15656 v.AddArg(p) 15657 v.AddArg(idx) 15658 v.AddArg(w0) 15659 v.AddArg(mem) 15660 return true 15661 } 15662 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 15663 // cond: x.Uses == 1 && clobber(x) 15664 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15665 for { 15666 i := v.AuxInt 15667 s := v.Aux 15668 _ = v.Args[3] 15669 p := v.Args[0] 15670 idx := v.Args[1] 15671 v_2 := v.Args[2] 15672 if v_2.Op != OpS390XSRWconst { 15673 break 15674 } 15675 if v_2.AuxInt != 16 { 15676 break 15677 } 15678 w := v_2.Args[0] 15679 x := v.Args[3] 15680 if x.Op != OpS390XMOVHBRstoreidx { 15681 break 15682 } 15683 if x.AuxInt != i-2 { 15684 break 15685 } 15686 if x.Aux != s { 15687 break 15688 } 15689 _ = x.Args[3] 15690 if p != x.Args[0] { 15691 break 15692 } 15693 if idx != x.Args[1] { 15694 break 15695 } 15696 if w != x.Args[2] { 15697 break 15698 } 15699 mem := x.Args[3] 15700 if !(x.Uses == 1 && clobber(x)) { 15701 break 15702 } 15703 v.reset(OpS390XMOVWBRstoreidx) 15704 v.AuxInt = i - 2 15705 v.Aux = s 15706 v.AddArg(p) 15707 v.AddArg(idx) 15708 v.AddArg(w) 15709 v.AddArg(mem) 15710 return true 15711 } 15712 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 15713 // cond: x.Uses == 1 && clobber(x) 15714 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15715 for { 15716 i := v.AuxInt 15717 s := v.Aux 15718 _ = v.Args[3] 15719 p := v.Args[0] 15720 idx := v.Args[1] 15721 v_2 := v.Args[2] 15722 if v_2.Op != OpS390XSRWconst { 15723 break 15724 } 15725 if v_2.AuxInt != 16 { 15726 break 15727 } 15728 w := v_2.Args[0] 15729 x := v.Args[3] 15730 if x.Op != OpS390XMOVHBRstoreidx { 15731 break 15732 } 15733 if x.AuxInt != i-2 { 15734 break 15735 } 15736 if x.Aux != s { 15737 break 15738 } 15739 _ = x.Args[3] 15740 if idx != x.Args[0] { 15741 break 15742 } 15743 if p != x.Args[1] { 15744 break 15745 } 15746 if w != x.Args[2] { 15747 break 15748 } 15749 mem := x.Args[3] 15750 if !(x.Uses == 1 && clobber(x)) { 15751 break 15752 } 15753 v.reset(OpS390XMOVWBRstoreidx) 15754 v.AuxInt = i - 2 15755 v.Aux = s 15756 v.AddArg(p) 15757 v.AddArg(idx) 15758 v.AddArg(w) 15759 v.AddArg(mem) 15760 return true 15761 } 15762 return false 15763 } 15764 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 15765 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 15766 // cond: x.Uses == 1 && clobber(x) 15767 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15768 for { 15769 i := v.AuxInt 15770 s := v.Aux 15771 _ = v.Args[3] 15772 idx := v.Args[0] 15773 p := v.Args[1] 15774 v_2 := v.Args[2] 15775 if v_2.Op != OpS390XSRWconst { 15776 break 15777 } 15778 if v_2.AuxInt != 16 { 15779 break 15780 } 15781 w := v_2.Args[0] 15782 x := v.Args[3] 15783 if x.Op != OpS390XMOVHBRstoreidx { 15784 break 15785 } 15786 if x.AuxInt != i-2 { 15787 break 15788 } 15789 if x.Aux != s { 15790 break 15791 } 15792 _ = x.Args[3] 15793 if p != x.Args[0] { 15794 break 15795 } 15796 if idx != x.Args[1] { 15797 break 15798 } 15799 if w != x.Args[2] { 15800 break 15801 } 15802 mem := x.Args[3] 15803 if !(x.Uses == 1 && clobber(x)) { 15804 break 15805 } 15806 v.reset(OpS390XMOVWBRstoreidx) 15807 v.AuxInt = i - 2 15808 v.Aux = s 15809 v.AddArg(p) 15810 v.AddArg(idx) 15811 v.AddArg(w) 15812 v.AddArg(mem) 15813 return true 15814 } 15815 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 15816 // cond: x.Uses == 1 && clobber(x) 15817 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 15818 for { 15819 i := v.AuxInt 15820 s := v.Aux 15821 _ = v.Args[3] 15822 idx := v.Args[0] 15823 p := v.Args[1] 15824 v_2 := v.Args[2] 15825 if v_2.Op != OpS390XSRWconst { 15826 break 15827 } 15828 if v_2.AuxInt != 16 { 15829 break 15830 } 15831 w := v_2.Args[0] 15832 x := v.Args[3] 15833 if x.Op != OpS390XMOVHBRstoreidx { 15834 break 15835 } 15836 if x.AuxInt != i-2 { 15837 break 15838 } 15839 if x.Aux != s { 15840 break 15841 } 15842 _ = x.Args[3] 15843 if idx != x.Args[0] { 15844 break 15845 } 15846 if p != x.Args[1] { 15847 break 15848 } 15849 if w != x.Args[2] { 15850 break 15851 } 15852 mem := x.Args[3] 15853 if !(x.Uses == 1 && clobber(x)) { 15854 break 15855 } 15856 v.reset(OpS390XMOVWBRstoreidx) 15857 v.AuxInt = i - 2 15858 v.Aux = s 15859 v.AddArg(p) 15860 v.AddArg(idx) 15861 v.AddArg(w) 15862 v.AddArg(mem) 15863 return true 15864 } 15865 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 15866 // cond: x.Uses == 1 && clobber(x) 15867 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15868 for { 15869 i := v.AuxInt 15870 s := v.Aux 15871 _ = v.Args[3] 15872 p := v.Args[0] 15873 idx := v.Args[1] 15874 v_2 := v.Args[2] 15875 if v_2.Op != OpS390XSRWconst { 15876 break 15877 } 15878 j := v_2.AuxInt 15879 w := v_2.Args[0] 15880 x := v.Args[3] 15881 if x.Op != OpS390XMOVHBRstoreidx { 15882 break 15883 } 15884 if x.AuxInt != i-2 { 15885 break 15886 } 15887 if x.Aux != s { 15888 break 15889 } 15890 _ = x.Args[3] 15891 if p != x.Args[0] { 15892 break 15893 } 15894 if idx != x.Args[1] { 15895 break 15896 } 15897 w0 := x.Args[2] 15898 if w0.Op != OpS390XSRWconst { 15899 break 15900 } 15901 if w0.AuxInt != j-16 { 15902 break 15903 } 15904 if w != w0.Args[0] { 15905 break 15906 } 15907 mem := x.Args[3] 15908 if !(x.Uses == 1 && clobber(x)) { 15909 break 15910 } 15911 v.reset(OpS390XMOVWBRstoreidx) 15912 v.AuxInt = i - 2 15913 v.Aux = s 15914 v.AddArg(p) 15915 v.AddArg(idx) 15916 v.AddArg(w0) 15917 v.AddArg(mem) 15918 return true 15919 } 15920 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 15921 // cond: x.Uses == 1 && clobber(x) 15922 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15923 for { 15924 i := v.AuxInt 15925 s := v.Aux 15926 _ = v.Args[3] 15927 p := v.Args[0] 15928 idx := v.Args[1] 15929 v_2 := v.Args[2] 15930 if v_2.Op != OpS390XSRWconst { 15931 break 15932 } 15933 j := v_2.AuxInt 15934 w := v_2.Args[0] 15935 x := v.Args[3] 15936 if x.Op != OpS390XMOVHBRstoreidx { 15937 break 15938 } 15939 if x.AuxInt != i-2 { 15940 break 15941 } 15942 if x.Aux != s { 15943 break 15944 } 15945 _ = x.Args[3] 15946 if idx != x.Args[0] { 15947 break 15948 } 15949 if p != x.Args[1] { 15950 break 15951 } 15952 w0 := x.Args[2] 15953 if w0.Op != OpS390XSRWconst { 15954 break 15955 } 15956 if w0.AuxInt != j-16 { 15957 break 15958 } 15959 if w != w0.Args[0] { 15960 break 15961 } 15962 mem := x.Args[3] 15963 if !(x.Uses == 1 && clobber(x)) { 15964 break 15965 } 15966 v.reset(OpS390XMOVWBRstoreidx) 15967 v.AuxInt = i - 2 15968 v.Aux = s 15969 v.AddArg(p) 15970 v.AddArg(idx) 15971 v.AddArg(w0) 15972 v.AddArg(mem) 15973 return true 15974 } 15975 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 15976 // cond: x.Uses == 1 && clobber(x) 15977 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 15978 for { 15979 i := v.AuxInt 15980 s := v.Aux 15981 _ = v.Args[3] 15982 idx := v.Args[0] 15983 p := v.Args[1] 15984 v_2 := v.Args[2] 15985 if v_2.Op != OpS390XSRWconst { 15986 break 15987 } 15988 j := v_2.AuxInt 15989 w := v_2.Args[0] 15990 x := v.Args[3] 15991 if x.Op != OpS390XMOVHBRstoreidx { 15992 break 15993 } 15994 if x.AuxInt != i-2 { 15995 break 15996 } 15997 if x.Aux != s { 15998 break 15999 } 16000 _ = x.Args[3] 16001 if p != x.Args[0] { 16002 break 16003 } 16004 if idx != x.Args[1] { 16005 break 16006 } 16007 w0 := x.Args[2] 16008 if w0.Op != OpS390XSRWconst { 16009 break 16010 } 16011 if w0.AuxInt != j-16 { 16012 break 16013 } 16014 if w != w0.Args[0] { 16015 break 16016 } 16017 mem := x.Args[3] 16018 if !(x.Uses == 1 && clobber(x)) { 16019 break 16020 } 16021 v.reset(OpS390XMOVWBRstoreidx) 16022 v.AuxInt = i - 2 16023 v.Aux = s 16024 v.AddArg(p) 16025 v.AddArg(idx) 16026 v.AddArg(w0) 16027 v.AddArg(mem) 16028 return true 16029 } 16030 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 16031 // cond: x.Uses == 1 && clobber(x) 16032 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 16033 for { 16034 i := v.AuxInt 16035 s := v.Aux 16036 _ = v.Args[3] 16037 idx := v.Args[0] 16038 p := v.Args[1] 16039 v_2 := v.Args[2] 16040 if v_2.Op != OpS390XSRWconst { 16041 break 16042 } 16043 j := v_2.AuxInt 16044 w := v_2.Args[0] 16045 x := v.Args[3] 16046 if x.Op != OpS390XMOVHBRstoreidx { 16047 break 16048 } 16049 if x.AuxInt != i-2 { 16050 break 16051 } 16052 if x.Aux != s { 16053 break 16054 } 16055 _ = x.Args[3] 16056 if idx != x.Args[0] { 16057 break 16058 } 16059 if p != x.Args[1] { 16060 break 16061 } 16062 w0 := x.Args[2] 16063 if w0.Op != OpS390XSRWconst { 16064 break 16065 } 16066 if w0.AuxInt != j-16 { 16067 break 16068 } 16069 if w != w0.Args[0] { 16070 break 16071 } 16072 mem := x.Args[3] 16073 if !(x.Uses == 1 && clobber(x)) { 16074 break 16075 } 16076 v.reset(OpS390XMOVWBRstoreidx) 16077 v.AuxInt = i - 2 16078 v.Aux = s 16079 v.AddArg(p) 16080 v.AddArg(idx) 16081 v.AddArg(w0) 16082 v.AddArg(mem) 16083 return true 16084 } 16085 return false 16086 } 16087 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 16088 // match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 16089 // cond: isSamePtr(ptr1, ptr2) 16090 // result: (MOVHZreg x) 16091 for { 16092 off := v.AuxInt 16093 sym := v.Aux 16094 _ = v.Args[1] 16095 ptr1 := v.Args[0] 16096 v_1 := v.Args[1] 16097 if v_1.Op != OpS390XMOVHstore { 16098 break 16099 } 16100 if v_1.AuxInt != off { 16101 break 16102 } 16103 if v_1.Aux != sym { 16104 break 16105 } 16106 _ = v_1.Args[2] 16107 ptr2 := v_1.Args[0] 16108 x := v_1.Args[1] 16109 if !(isSamePtr(ptr1, ptr2)) { 16110 break 16111 } 16112 v.reset(OpS390XMOVHZreg) 16113 v.AddArg(x) 16114 return true 16115 } 16116 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 16117 // cond: is20Bit(off1+off2) 16118 // result: (MOVHZload [off1+off2] {sym} ptr mem) 16119 for { 16120 off1 := v.AuxInt 16121 sym := v.Aux 16122 _ = v.Args[1] 16123 v_0 := v.Args[0] 16124 if v_0.Op != OpS390XADDconst { 16125 break 16126 } 16127 off2 := v_0.AuxInt 16128 ptr := v_0.Args[0] 16129 mem := v.Args[1] 16130 if !(is20Bit(off1 + off2)) { 16131 break 16132 } 16133 v.reset(OpS390XMOVHZload) 16134 v.AuxInt = off1 + off2 16135 v.Aux = sym 16136 v.AddArg(ptr) 16137 v.AddArg(mem) 16138 return true 16139 } 16140 // match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 16141 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 16142 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16143 for { 16144 off1 := v.AuxInt 16145 sym1 := v.Aux 16146 _ = v.Args[1] 16147 v_0 := v.Args[0] 16148 if v_0.Op != OpS390XMOVDaddr { 16149 break 16150 } 16151 t := v_0.Type 16152 off2 := v_0.AuxInt 16153 sym2 := v_0.Aux 16154 base := v_0.Args[0] 16155 mem := v.Args[1] 16156 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 16157 break 16158 } 16159 v.reset(OpS390XMOVHZload) 16160 v.AuxInt = off1 + off2 16161 v.Aux = mergeSym(sym1, sym2) 16162 v.AddArg(base) 16163 v.AddArg(mem) 16164 return true 16165 } 16166 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 16167 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16168 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 16169 for { 16170 off1 := v.AuxInt 16171 sym1 := v.Aux 16172 _ = v.Args[1] 16173 v_0 := v.Args[0] 16174 if v_0.Op != OpS390XMOVDaddridx { 16175 break 16176 } 16177 off2 := v_0.AuxInt 16178 sym2 := v_0.Aux 16179 _ = v_0.Args[1] 16180 ptr := v_0.Args[0] 16181 idx := v_0.Args[1] 16182 mem := v.Args[1] 16183 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16184 break 16185 } 16186 v.reset(OpS390XMOVHZloadidx) 16187 v.AuxInt = off1 + off2 16188 v.Aux = mergeSym(sym1, sym2) 16189 v.AddArg(ptr) 16190 v.AddArg(idx) 16191 v.AddArg(mem) 16192 return true 16193 } 16194 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 16195 // cond: ptr.Op != OpSB 16196 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 16197 for { 16198 off := v.AuxInt 16199 sym := v.Aux 16200 _ = v.Args[1] 16201 v_0 := v.Args[0] 16202 if v_0.Op != OpS390XADD { 16203 break 16204 } 16205 _ = v_0.Args[1] 16206 ptr := v_0.Args[0] 16207 idx := v_0.Args[1] 16208 mem := v.Args[1] 16209 if !(ptr.Op != OpSB) { 16210 break 16211 } 16212 v.reset(OpS390XMOVHZloadidx) 16213 v.AuxInt = off 16214 v.Aux = sym 16215 v.AddArg(ptr) 16216 v.AddArg(idx) 16217 v.AddArg(mem) 16218 return true 16219 } 16220 return false 16221 } 16222 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 16223 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 16224 // cond: is20Bit(c+d) 16225 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 16226 for { 16227 c := v.AuxInt 16228 sym := v.Aux 16229 _ = v.Args[2] 16230 v_0 := v.Args[0] 16231 if v_0.Op != OpS390XADDconst { 16232 break 16233 } 16234 d := v_0.AuxInt 16235 ptr := v_0.Args[0] 16236 idx := v.Args[1] 16237 mem := v.Args[2] 16238 if !(is20Bit(c + d)) { 16239 break 16240 } 16241 v.reset(OpS390XMOVHZloadidx) 16242 v.AuxInt = c + d 16243 v.Aux = sym 16244 v.AddArg(ptr) 16245 v.AddArg(idx) 16246 v.AddArg(mem) 16247 return true 16248 } 16249 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 16250 // cond: is20Bit(c+d) 16251 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 16252 for { 16253 c := v.AuxInt 16254 sym := v.Aux 16255 _ = v.Args[2] 16256 idx := v.Args[0] 16257 v_1 := v.Args[1] 16258 if v_1.Op != OpS390XADDconst { 16259 break 16260 } 16261 d := v_1.AuxInt 16262 ptr := v_1.Args[0] 16263 mem := v.Args[2] 16264 if !(is20Bit(c + d)) { 16265 break 16266 } 16267 v.reset(OpS390XMOVHZloadidx) 16268 v.AuxInt = c + d 16269 v.Aux = sym 16270 v.AddArg(ptr) 16271 v.AddArg(idx) 16272 v.AddArg(mem) 16273 return true 16274 } 16275 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 16276 // cond: is20Bit(c+d) 16277 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 16278 for { 16279 c := v.AuxInt 16280 sym := v.Aux 16281 _ = v.Args[2] 16282 ptr := v.Args[0] 16283 v_1 := v.Args[1] 16284 if v_1.Op != OpS390XADDconst { 16285 break 16286 } 16287 d := v_1.AuxInt 16288 idx := v_1.Args[0] 16289 mem := v.Args[2] 16290 if !(is20Bit(c + d)) { 16291 break 16292 } 16293 v.reset(OpS390XMOVHZloadidx) 16294 v.AuxInt = c + d 16295 v.Aux = sym 16296 v.AddArg(ptr) 16297 v.AddArg(idx) 16298 v.AddArg(mem) 16299 return true 16300 } 16301 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 16302 // cond: is20Bit(c+d) 16303 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 16304 for { 16305 c := v.AuxInt 16306 sym := v.Aux 16307 _ = v.Args[2] 16308 v_0 := v.Args[0] 16309 if v_0.Op != OpS390XADDconst { 16310 break 16311 } 16312 d := v_0.AuxInt 16313 idx := v_0.Args[0] 16314 ptr := v.Args[1] 16315 mem := v.Args[2] 16316 if !(is20Bit(c + d)) { 16317 break 16318 } 16319 v.reset(OpS390XMOVHZloadidx) 16320 v.AuxInt = c + d 16321 v.Aux = sym 16322 v.AddArg(ptr) 16323 v.AddArg(idx) 16324 v.AddArg(mem) 16325 return true 16326 } 16327 return false 16328 } 16329 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 16330 b := v.Block 16331 _ = b 16332 // match: (MOVHZreg x:(MOVBZload _ _)) 16333 // cond: 16334 // result: (MOVDreg x) 16335 for { 16336 x := v.Args[0] 16337 if x.Op != OpS390XMOVBZload { 16338 break 16339 } 16340 _ = x.Args[1] 16341 v.reset(OpS390XMOVDreg) 16342 v.AddArg(x) 16343 return true 16344 } 16345 // match: (MOVHZreg x:(MOVHZload _ _)) 16346 // cond: 16347 // result: (MOVDreg x) 16348 for { 16349 x := v.Args[0] 16350 if x.Op != OpS390XMOVHZload { 16351 break 16352 } 16353 _ = x.Args[1] 16354 v.reset(OpS390XMOVDreg) 16355 v.AddArg(x) 16356 return true 16357 } 16358 // match: (MOVHZreg x:(Arg <t>)) 16359 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 16360 // result: (MOVDreg x) 16361 for { 16362 x := v.Args[0] 16363 if x.Op != OpArg { 16364 break 16365 } 16366 t := x.Type 16367 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 16368 break 16369 } 16370 v.reset(OpS390XMOVDreg) 16371 v.AddArg(x) 16372 return true 16373 } 16374 // match: (MOVHZreg x:(MOVBZreg _)) 16375 // cond: 16376 // result: (MOVDreg x) 16377 for { 16378 x := v.Args[0] 16379 if x.Op != OpS390XMOVBZreg { 16380 break 16381 } 16382 v.reset(OpS390XMOVDreg) 16383 v.AddArg(x) 16384 return true 16385 } 16386 // match: (MOVHZreg x:(MOVHZreg _)) 16387 // cond: 16388 // result: (MOVDreg x) 16389 for { 16390 x := v.Args[0] 16391 if x.Op != OpS390XMOVHZreg { 16392 break 16393 } 16394 v.reset(OpS390XMOVDreg) 16395 v.AddArg(x) 16396 return true 16397 } 16398 // match: (MOVHZreg (MOVDconst [c])) 16399 // cond: 16400 // result: (MOVDconst [int64(uint16(c))]) 16401 for { 16402 v_0 := v.Args[0] 16403 if v_0.Op != OpS390XMOVDconst { 16404 break 16405 } 16406 c := v_0.AuxInt 16407 v.reset(OpS390XMOVDconst) 16408 v.AuxInt = int64(uint16(c)) 16409 return true 16410 } 16411 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 16412 // cond: x.Uses == 1 && clobber(x) 16413 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 16414 for { 16415 x := v.Args[0] 16416 if x.Op != OpS390XMOVHZload { 16417 break 16418 } 16419 off := x.AuxInt 16420 sym := x.Aux 16421 _ = x.Args[1] 16422 ptr := x.Args[0] 16423 mem := x.Args[1] 16424 if !(x.Uses == 1 && clobber(x)) { 16425 break 16426 } 16427 b = x.Block 16428 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 16429 v.reset(OpCopy) 16430 v.AddArg(v0) 16431 v0.AuxInt = off 16432 v0.Aux = sym 16433 v0.AddArg(ptr) 16434 v0.AddArg(mem) 16435 return true 16436 } 16437 // match: (MOVHZreg x:(MOVHload [off] {sym} ptr mem)) 16438 // cond: x.Uses == 1 && clobber(x) 16439 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 16440 for { 16441 x := v.Args[0] 16442 if x.Op != OpS390XMOVHload { 16443 break 16444 } 16445 off := x.AuxInt 16446 sym := x.Aux 16447 _ = x.Args[1] 16448 ptr := x.Args[0] 16449 mem := x.Args[1] 16450 if !(x.Uses == 1 && clobber(x)) { 16451 break 16452 } 16453 b = x.Block 16454 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 16455 v.reset(OpCopy) 16456 v.AddArg(v0) 16457 v0.AuxInt = off 16458 v0.Aux = sym 16459 v0.AddArg(ptr) 16460 v0.AddArg(mem) 16461 return true 16462 } 16463 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 16464 // cond: x.Uses == 1 && clobber(x) 16465 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 16466 for { 16467 x := v.Args[0] 16468 if x.Op != OpS390XMOVHZloadidx { 16469 break 16470 } 16471 off := x.AuxInt 16472 sym := x.Aux 16473 _ = x.Args[2] 16474 ptr := x.Args[0] 16475 idx := x.Args[1] 16476 mem := x.Args[2] 16477 if !(x.Uses == 1 && clobber(x)) { 16478 break 16479 } 16480 b = x.Block 16481 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 16482 v.reset(OpCopy) 16483 v.AddArg(v0) 16484 v0.AuxInt = off 16485 v0.Aux = sym 16486 v0.AddArg(ptr) 16487 v0.AddArg(idx) 16488 v0.AddArg(mem) 16489 return true 16490 } 16491 // match: (MOVHZreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 16492 // cond: x.Uses == 1 && clobber(x) 16493 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 16494 for { 16495 x := v.Args[0] 16496 if x.Op != OpS390XMOVHloadidx { 16497 break 16498 } 16499 off := x.AuxInt 16500 sym := x.Aux 16501 _ = x.Args[2] 16502 ptr := x.Args[0] 16503 idx := x.Args[1] 16504 mem := x.Args[2] 16505 if !(x.Uses == 1 && clobber(x)) { 16506 break 16507 } 16508 b = x.Block 16509 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 16510 v.reset(OpCopy) 16511 v.AddArg(v0) 16512 v0.AuxInt = off 16513 v0.Aux = sym 16514 v0.AddArg(ptr) 16515 v0.AddArg(idx) 16516 v0.AddArg(mem) 16517 return true 16518 } 16519 return false 16520 } 16521 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 16522 // match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) 16523 // cond: isSamePtr(ptr1, ptr2) 16524 // result: (MOVHreg x) 16525 for { 16526 off := v.AuxInt 16527 sym := v.Aux 16528 _ = v.Args[1] 16529 ptr1 := v.Args[0] 16530 v_1 := v.Args[1] 16531 if v_1.Op != OpS390XMOVHstore { 16532 break 16533 } 16534 if v_1.AuxInt != off { 16535 break 16536 } 16537 if v_1.Aux != sym { 16538 break 16539 } 16540 _ = v_1.Args[2] 16541 ptr2 := v_1.Args[0] 16542 x := v_1.Args[1] 16543 if !(isSamePtr(ptr1, ptr2)) { 16544 break 16545 } 16546 v.reset(OpS390XMOVHreg) 16547 v.AddArg(x) 16548 return true 16549 } 16550 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 16551 // cond: is20Bit(off1+off2) 16552 // result: (MOVHload [off1+off2] {sym} ptr mem) 16553 for { 16554 off1 := v.AuxInt 16555 sym := v.Aux 16556 _ = v.Args[1] 16557 v_0 := v.Args[0] 16558 if v_0.Op != OpS390XADDconst { 16559 break 16560 } 16561 off2 := v_0.AuxInt 16562 ptr := v_0.Args[0] 16563 mem := v.Args[1] 16564 if !(is20Bit(off1 + off2)) { 16565 break 16566 } 16567 v.reset(OpS390XMOVHload) 16568 v.AuxInt = off1 + off2 16569 v.Aux = sym 16570 v.AddArg(ptr) 16571 v.AddArg(mem) 16572 return true 16573 } 16574 // match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 16575 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 16576 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16577 for { 16578 off1 := v.AuxInt 16579 sym1 := v.Aux 16580 _ = v.Args[1] 16581 v_0 := v.Args[0] 16582 if v_0.Op != OpS390XMOVDaddr { 16583 break 16584 } 16585 t := v_0.Type 16586 off2 := v_0.AuxInt 16587 sym2 := v_0.Aux 16588 base := v_0.Args[0] 16589 mem := v.Args[1] 16590 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 16591 break 16592 } 16593 v.reset(OpS390XMOVHload) 16594 v.AuxInt = off1 + off2 16595 v.Aux = mergeSym(sym1, sym2) 16596 v.AddArg(base) 16597 v.AddArg(mem) 16598 return true 16599 } 16600 // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 16601 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16602 // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 16603 for { 16604 off1 := v.AuxInt 16605 sym1 := v.Aux 16606 _ = v.Args[1] 16607 v_0 := v.Args[0] 16608 if v_0.Op != OpS390XMOVDaddridx { 16609 break 16610 } 16611 off2 := v_0.AuxInt 16612 sym2 := v_0.Aux 16613 _ = v_0.Args[1] 16614 ptr := v_0.Args[0] 16615 idx := v_0.Args[1] 16616 mem := v.Args[1] 16617 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16618 break 16619 } 16620 v.reset(OpS390XMOVHloadidx) 16621 v.AuxInt = off1 + off2 16622 v.Aux = mergeSym(sym1, sym2) 16623 v.AddArg(ptr) 16624 v.AddArg(idx) 16625 v.AddArg(mem) 16626 return true 16627 } 16628 // match: (MOVHload [off] {sym} (ADD ptr idx) mem) 16629 // cond: ptr.Op != OpSB 16630 // result: (MOVHloadidx [off] {sym} ptr idx mem) 16631 for { 16632 off := v.AuxInt 16633 sym := v.Aux 16634 _ = v.Args[1] 16635 v_0 := v.Args[0] 16636 if v_0.Op != OpS390XADD { 16637 break 16638 } 16639 _ = v_0.Args[1] 16640 ptr := v_0.Args[0] 16641 idx := v_0.Args[1] 16642 mem := v.Args[1] 16643 if !(ptr.Op != OpSB) { 16644 break 16645 } 16646 v.reset(OpS390XMOVHloadidx) 16647 v.AuxInt = off 16648 v.Aux = sym 16649 v.AddArg(ptr) 16650 v.AddArg(idx) 16651 v.AddArg(mem) 16652 return true 16653 } 16654 return false 16655 } 16656 func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { 16657 // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 16658 // cond: is20Bit(c+d) 16659 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 16660 for { 16661 c := v.AuxInt 16662 sym := v.Aux 16663 _ = v.Args[2] 16664 v_0 := v.Args[0] 16665 if v_0.Op != OpS390XADDconst { 16666 break 16667 } 16668 d := v_0.AuxInt 16669 ptr := v_0.Args[0] 16670 idx := v.Args[1] 16671 mem := v.Args[2] 16672 if !(is20Bit(c + d)) { 16673 break 16674 } 16675 v.reset(OpS390XMOVHloadidx) 16676 v.AuxInt = c + d 16677 v.Aux = sym 16678 v.AddArg(ptr) 16679 v.AddArg(idx) 16680 v.AddArg(mem) 16681 return true 16682 } 16683 // match: (MOVHloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 16684 // cond: is20Bit(c+d) 16685 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 16686 for { 16687 c := v.AuxInt 16688 sym := v.Aux 16689 _ = v.Args[2] 16690 idx := v.Args[0] 16691 v_1 := v.Args[1] 16692 if v_1.Op != OpS390XADDconst { 16693 break 16694 } 16695 d := v_1.AuxInt 16696 ptr := v_1.Args[0] 16697 mem := v.Args[2] 16698 if !(is20Bit(c + d)) { 16699 break 16700 } 16701 v.reset(OpS390XMOVHloadidx) 16702 v.AuxInt = c + d 16703 v.Aux = sym 16704 v.AddArg(ptr) 16705 v.AddArg(idx) 16706 v.AddArg(mem) 16707 return true 16708 } 16709 // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 16710 // cond: is20Bit(c+d) 16711 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 16712 for { 16713 c := v.AuxInt 16714 sym := v.Aux 16715 _ = v.Args[2] 16716 ptr := v.Args[0] 16717 v_1 := v.Args[1] 16718 if v_1.Op != OpS390XADDconst { 16719 break 16720 } 16721 d := v_1.AuxInt 16722 idx := v_1.Args[0] 16723 mem := v.Args[2] 16724 if !(is20Bit(c + d)) { 16725 break 16726 } 16727 v.reset(OpS390XMOVHloadidx) 16728 v.AuxInt = c + d 16729 v.Aux = sym 16730 v.AddArg(ptr) 16731 v.AddArg(idx) 16732 v.AddArg(mem) 16733 return true 16734 } 16735 // match: (MOVHloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 16736 // cond: is20Bit(c+d) 16737 // result: (MOVHloadidx [c+d] {sym} ptr idx mem) 16738 for { 16739 c := v.AuxInt 16740 sym := v.Aux 16741 _ = v.Args[2] 16742 v_0 := v.Args[0] 16743 if v_0.Op != OpS390XADDconst { 16744 break 16745 } 16746 d := v_0.AuxInt 16747 idx := v_0.Args[0] 16748 ptr := v.Args[1] 16749 mem := v.Args[2] 16750 if !(is20Bit(c + d)) { 16751 break 16752 } 16753 v.reset(OpS390XMOVHloadidx) 16754 v.AuxInt = c + d 16755 v.Aux = sym 16756 v.AddArg(ptr) 16757 v.AddArg(idx) 16758 v.AddArg(mem) 16759 return true 16760 } 16761 return false 16762 } 16763 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 16764 b := v.Block 16765 _ = b 16766 // match: (MOVHreg x:(MOVBload _ _)) 16767 // cond: 16768 // result: (MOVDreg x) 16769 for { 16770 x := v.Args[0] 16771 if x.Op != OpS390XMOVBload { 16772 break 16773 } 16774 _ = x.Args[1] 16775 v.reset(OpS390XMOVDreg) 16776 v.AddArg(x) 16777 return true 16778 } 16779 // match: (MOVHreg x:(MOVBZload _ _)) 16780 // cond: 16781 // result: (MOVDreg x) 16782 for { 16783 x := v.Args[0] 16784 if x.Op != OpS390XMOVBZload { 16785 break 16786 } 16787 _ = x.Args[1] 16788 v.reset(OpS390XMOVDreg) 16789 v.AddArg(x) 16790 return true 16791 } 16792 // match: (MOVHreg x:(MOVHload _ _)) 16793 // cond: 16794 // result: (MOVDreg x) 16795 for { 16796 x := v.Args[0] 16797 if x.Op != OpS390XMOVHload { 16798 break 16799 } 16800 _ = x.Args[1] 16801 v.reset(OpS390XMOVDreg) 16802 v.AddArg(x) 16803 return true 16804 } 16805 // match: (MOVHreg x:(Arg <t>)) 16806 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 16807 // result: (MOVDreg x) 16808 for { 16809 x := v.Args[0] 16810 if x.Op != OpArg { 16811 break 16812 } 16813 t := x.Type 16814 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 16815 break 16816 } 16817 v.reset(OpS390XMOVDreg) 16818 v.AddArg(x) 16819 return true 16820 } 16821 // match: (MOVHreg x:(MOVBreg _)) 16822 // cond: 16823 // result: (MOVDreg x) 16824 for { 16825 x := v.Args[0] 16826 if x.Op != OpS390XMOVBreg { 16827 break 16828 } 16829 v.reset(OpS390XMOVDreg) 16830 v.AddArg(x) 16831 return true 16832 } 16833 // match: (MOVHreg x:(MOVBZreg _)) 16834 // cond: 16835 // result: (MOVDreg x) 16836 for { 16837 x := v.Args[0] 16838 if x.Op != OpS390XMOVBZreg { 16839 break 16840 } 16841 v.reset(OpS390XMOVDreg) 16842 v.AddArg(x) 16843 return true 16844 } 16845 // match: (MOVHreg x:(MOVHreg _)) 16846 // cond: 16847 // result: (MOVDreg x) 16848 for { 16849 x := v.Args[0] 16850 if x.Op != OpS390XMOVHreg { 16851 break 16852 } 16853 v.reset(OpS390XMOVDreg) 16854 v.AddArg(x) 16855 return true 16856 } 16857 // match: (MOVHreg (MOVDconst [c])) 16858 // cond: 16859 // result: (MOVDconst [int64(int16(c))]) 16860 for { 16861 v_0 := v.Args[0] 16862 if v_0.Op != OpS390XMOVDconst { 16863 break 16864 } 16865 c := v_0.AuxInt 16866 v.reset(OpS390XMOVDconst) 16867 v.AuxInt = int64(int16(c)) 16868 return true 16869 } 16870 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 16871 // cond: x.Uses == 1 && clobber(x) 16872 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 16873 for { 16874 x := v.Args[0] 16875 if x.Op != OpS390XMOVHZload { 16876 break 16877 } 16878 off := x.AuxInt 16879 sym := x.Aux 16880 _ = x.Args[1] 16881 ptr := x.Args[0] 16882 mem := x.Args[1] 16883 if !(x.Uses == 1 && clobber(x)) { 16884 break 16885 } 16886 b = x.Block 16887 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 16888 v.reset(OpCopy) 16889 v.AddArg(v0) 16890 v0.AuxInt = off 16891 v0.Aux = sym 16892 v0.AddArg(ptr) 16893 v0.AddArg(mem) 16894 return true 16895 } 16896 // match: (MOVHreg x:(MOVHload [off] {sym} ptr mem)) 16897 // cond: x.Uses == 1 && clobber(x) 16898 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 16899 for { 16900 x := v.Args[0] 16901 if x.Op != OpS390XMOVHload { 16902 break 16903 } 16904 off := x.AuxInt 16905 sym := x.Aux 16906 _ = x.Args[1] 16907 ptr := x.Args[0] 16908 mem := x.Args[1] 16909 if !(x.Uses == 1 && clobber(x)) { 16910 break 16911 } 16912 b = x.Block 16913 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 16914 v.reset(OpCopy) 16915 v.AddArg(v0) 16916 v0.AuxInt = off 16917 v0.Aux = sym 16918 v0.AddArg(ptr) 16919 v0.AddArg(mem) 16920 return true 16921 } 16922 return false 16923 } 16924 func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { 16925 b := v.Block 16926 _ = b 16927 // match: (MOVHreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 16928 // cond: x.Uses == 1 && clobber(x) 16929 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 16930 for { 16931 x := v.Args[0] 16932 if x.Op != OpS390XMOVHZloadidx { 16933 break 16934 } 16935 off := x.AuxInt 16936 sym := x.Aux 16937 _ = x.Args[2] 16938 ptr := x.Args[0] 16939 idx := x.Args[1] 16940 mem := x.Args[2] 16941 if !(x.Uses == 1 && clobber(x)) { 16942 break 16943 } 16944 b = x.Block 16945 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 16946 v.reset(OpCopy) 16947 v.AddArg(v0) 16948 v0.AuxInt = off 16949 v0.Aux = sym 16950 v0.AddArg(ptr) 16951 v0.AddArg(idx) 16952 v0.AddArg(mem) 16953 return true 16954 } 16955 // match: (MOVHreg x:(MOVHloadidx [off] {sym} ptr idx mem)) 16956 // cond: x.Uses == 1 && clobber(x) 16957 // result: @x.Block (MOVHloadidx <v.Type> [off] {sym} ptr idx mem) 16958 for { 16959 x := v.Args[0] 16960 if x.Op != OpS390XMOVHloadidx { 16961 break 16962 } 16963 off := x.AuxInt 16964 sym := x.Aux 16965 _ = x.Args[2] 16966 ptr := x.Args[0] 16967 idx := x.Args[1] 16968 mem := x.Args[2] 16969 if !(x.Uses == 1 && clobber(x)) { 16970 break 16971 } 16972 b = x.Block 16973 v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, v.Type) 16974 v.reset(OpCopy) 16975 v.AddArg(v0) 16976 v0.AuxInt = off 16977 v0.Aux = sym 16978 v0.AddArg(ptr) 16979 v0.AddArg(idx) 16980 v0.AddArg(mem) 16981 return true 16982 } 16983 return false 16984 } 16985 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 16986 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 16987 // cond: 16988 // result: (MOVHstore [off] {sym} ptr x mem) 16989 for { 16990 off := v.AuxInt 16991 sym := v.Aux 16992 _ = v.Args[2] 16993 ptr := v.Args[0] 16994 v_1 := v.Args[1] 16995 if v_1.Op != OpS390XMOVHreg { 16996 break 16997 } 16998 x := v_1.Args[0] 16999 mem := v.Args[2] 17000 v.reset(OpS390XMOVHstore) 17001 v.AuxInt = off 17002 v.Aux = sym 17003 v.AddArg(ptr) 17004 v.AddArg(x) 17005 v.AddArg(mem) 17006 return true 17007 } 17008 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 17009 // cond: 17010 // result: (MOVHstore [off] {sym} ptr x mem) 17011 for { 17012 off := v.AuxInt 17013 sym := v.Aux 17014 _ = v.Args[2] 17015 ptr := v.Args[0] 17016 v_1 := v.Args[1] 17017 if v_1.Op != OpS390XMOVHZreg { 17018 break 17019 } 17020 x := v_1.Args[0] 17021 mem := v.Args[2] 17022 v.reset(OpS390XMOVHstore) 17023 v.AuxInt = off 17024 v.Aux = sym 17025 v.AddArg(ptr) 17026 v.AddArg(x) 17027 v.AddArg(mem) 17028 return true 17029 } 17030 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17031 // cond: is20Bit(off1+off2) 17032 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 17033 for { 17034 off1 := v.AuxInt 17035 sym := v.Aux 17036 _ = v.Args[2] 17037 v_0 := v.Args[0] 17038 if v_0.Op != OpS390XADDconst { 17039 break 17040 } 17041 off2 := v_0.AuxInt 17042 ptr := v_0.Args[0] 17043 val := v.Args[1] 17044 mem := v.Args[2] 17045 if !(is20Bit(off1 + off2)) { 17046 break 17047 } 17048 v.reset(OpS390XMOVHstore) 17049 v.AuxInt = off1 + off2 17050 v.Aux = sym 17051 v.AddArg(ptr) 17052 v.AddArg(val) 17053 v.AddArg(mem) 17054 return true 17055 } 17056 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 17057 // cond: isU12Bit(off) && ptr.Op != OpSB 17058 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 17059 for { 17060 off := v.AuxInt 17061 sym := v.Aux 17062 _ = v.Args[2] 17063 ptr := v.Args[0] 17064 v_1 := v.Args[1] 17065 if v_1.Op != OpS390XMOVDconst { 17066 break 17067 } 17068 c := v_1.AuxInt 17069 mem := v.Args[2] 17070 if !(isU12Bit(off) && ptr.Op != OpSB) { 17071 break 17072 } 17073 v.reset(OpS390XMOVHstoreconst) 17074 v.AuxInt = makeValAndOff(int64(int16(c)), off) 17075 v.Aux = sym 17076 v.AddArg(ptr) 17077 v.AddArg(mem) 17078 return true 17079 } 17080 // match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 17081 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 17082 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17083 for { 17084 off1 := v.AuxInt 17085 sym1 := v.Aux 17086 _ = v.Args[2] 17087 v_0 := v.Args[0] 17088 if v_0.Op != OpS390XMOVDaddr { 17089 break 17090 } 17091 t := v_0.Type 17092 off2 := v_0.AuxInt 17093 sym2 := v_0.Aux 17094 base := v_0.Args[0] 17095 val := v.Args[1] 17096 mem := v.Args[2] 17097 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 17098 break 17099 } 17100 v.reset(OpS390XMOVHstore) 17101 v.AuxInt = off1 + off2 17102 v.Aux = mergeSym(sym1, sym2) 17103 v.AddArg(base) 17104 v.AddArg(val) 17105 v.AddArg(mem) 17106 return true 17107 } 17108 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17109 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17110 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17111 for { 17112 off1 := v.AuxInt 17113 sym1 := v.Aux 17114 _ = v.Args[2] 17115 v_0 := v.Args[0] 17116 if v_0.Op != OpS390XMOVDaddridx { 17117 break 17118 } 17119 off2 := v_0.AuxInt 17120 sym2 := v_0.Aux 17121 _ = v_0.Args[1] 17122 ptr := v_0.Args[0] 17123 idx := v_0.Args[1] 17124 val := v.Args[1] 17125 mem := v.Args[2] 17126 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17127 break 17128 } 17129 v.reset(OpS390XMOVHstoreidx) 17130 v.AuxInt = off1 + off2 17131 v.Aux = mergeSym(sym1, sym2) 17132 v.AddArg(ptr) 17133 v.AddArg(idx) 17134 v.AddArg(val) 17135 v.AddArg(mem) 17136 return true 17137 } 17138 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 17139 // cond: ptr.Op != OpSB 17140 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 17141 for { 17142 off := v.AuxInt 17143 sym := v.Aux 17144 _ = v.Args[2] 17145 v_0 := v.Args[0] 17146 if v_0.Op != OpS390XADD { 17147 break 17148 } 17149 _ = v_0.Args[1] 17150 ptr := v_0.Args[0] 17151 idx := v_0.Args[1] 17152 val := v.Args[1] 17153 mem := v.Args[2] 17154 if !(ptr.Op != OpSB) { 17155 break 17156 } 17157 v.reset(OpS390XMOVHstoreidx) 17158 v.AuxInt = off 17159 v.Aux = sym 17160 v.AddArg(ptr) 17161 v.AddArg(idx) 17162 v.AddArg(val) 17163 v.AddArg(mem) 17164 return true 17165 } 17166 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 17167 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17168 // result: (MOVWstore [i-2] {s} p w mem) 17169 for { 17170 i := v.AuxInt 17171 s := v.Aux 17172 _ = v.Args[2] 17173 p := v.Args[0] 17174 w := v.Args[1] 17175 x := v.Args[2] 17176 if x.Op != OpS390XMOVHstore { 17177 break 17178 } 17179 if x.AuxInt != i-2 { 17180 break 17181 } 17182 if x.Aux != s { 17183 break 17184 } 17185 _ = x.Args[2] 17186 if p != x.Args[0] { 17187 break 17188 } 17189 x_1 := x.Args[1] 17190 if x_1.Op != OpS390XSRDconst { 17191 break 17192 } 17193 if x_1.AuxInt != 16 { 17194 break 17195 } 17196 if w != x_1.Args[0] { 17197 break 17198 } 17199 mem := x.Args[2] 17200 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17201 break 17202 } 17203 v.reset(OpS390XMOVWstore) 17204 v.AuxInt = i - 2 17205 v.Aux = s 17206 v.AddArg(p) 17207 v.AddArg(w) 17208 v.AddArg(mem) 17209 return true 17210 } 17211 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 17212 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17213 // result: (MOVWstore [i-2] {s} p w0 mem) 17214 for { 17215 i := v.AuxInt 17216 s := v.Aux 17217 _ = v.Args[2] 17218 p := v.Args[0] 17219 w0 := v.Args[1] 17220 if w0.Op != OpS390XSRDconst { 17221 break 17222 } 17223 j := w0.AuxInt 17224 w := w0.Args[0] 17225 x := v.Args[2] 17226 if x.Op != OpS390XMOVHstore { 17227 break 17228 } 17229 if x.AuxInt != i-2 { 17230 break 17231 } 17232 if x.Aux != s { 17233 break 17234 } 17235 _ = x.Args[2] 17236 if p != x.Args[0] { 17237 break 17238 } 17239 x_1 := x.Args[1] 17240 if x_1.Op != OpS390XSRDconst { 17241 break 17242 } 17243 if x_1.AuxInt != j+16 { 17244 break 17245 } 17246 if w != x_1.Args[0] { 17247 break 17248 } 17249 mem := x.Args[2] 17250 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17251 break 17252 } 17253 v.reset(OpS390XMOVWstore) 17254 v.AuxInt = i - 2 17255 v.Aux = s 17256 v.AddArg(p) 17257 v.AddArg(w0) 17258 v.AddArg(mem) 17259 return true 17260 } 17261 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 17262 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17263 // result: (MOVWstore [i-2] {s} p w mem) 17264 for { 17265 i := v.AuxInt 17266 s := v.Aux 17267 _ = v.Args[2] 17268 p := v.Args[0] 17269 w := v.Args[1] 17270 x := v.Args[2] 17271 if x.Op != OpS390XMOVHstore { 17272 break 17273 } 17274 if x.AuxInt != i-2 { 17275 break 17276 } 17277 if x.Aux != s { 17278 break 17279 } 17280 _ = x.Args[2] 17281 if p != x.Args[0] { 17282 break 17283 } 17284 x_1 := x.Args[1] 17285 if x_1.Op != OpS390XSRWconst { 17286 break 17287 } 17288 if x_1.AuxInt != 16 { 17289 break 17290 } 17291 if w != x_1.Args[0] { 17292 break 17293 } 17294 mem := x.Args[2] 17295 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17296 break 17297 } 17298 v.reset(OpS390XMOVWstore) 17299 v.AuxInt = i - 2 17300 v.Aux = s 17301 v.AddArg(p) 17302 v.AddArg(w) 17303 v.AddArg(mem) 17304 return true 17305 } 17306 return false 17307 } 17308 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 17309 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 17310 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17311 // result: (MOVWstore [i-2] {s} p w0 mem) 17312 for { 17313 i := v.AuxInt 17314 s := v.Aux 17315 _ = v.Args[2] 17316 p := v.Args[0] 17317 w0 := v.Args[1] 17318 if w0.Op != OpS390XSRWconst { 17319 break 17320 } 17321 j := w0.AuxInt 17322 w := w0.Args[0] 17323 x := v.Args[2] 17324 if x.Op != OpS390XMOVHstore { 17325 break 17326 } 17327 if x.AuxInt != i-2 { 17328 break 17329 } 17330 if x.Aux != s { 17331 break 17332 } 17333 _ = x.Args[2] 17334 if p != x.Args[0] { 17335 break 17336 } 17337 x_1 := x.Args[1] 17338 if x_1.Op != OpS390XSRWconst { 17339 break 17340 } 17341 if x_1.AuxInt != j+16 { 17342 break 17343 } 17344 if w != x_1.Args[0] { 17345 break 17346 } 17347 mem := x.Args[2] 17348 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17349 break 17350 } 17351 v.reset(OpS390XMOVWstore) 17352 v.AuxInt = i - 2 17353 v.Aux = s 17354 v.AddArg(p) 17355 v.AddArg(w0) 17356 v.AddArg(mem) 17357 return true 17358 } 17359 return false 17360 } 17361 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 17362 b := v.Block 17363 _ = b 17364 typ := &b.Func.Config.Types 17365 _ = typ 17366 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 17367 // cond: isU12Bit(ValAndOff(sc).Off()+off) 17368 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 17369 for { 17370 sc := v.AuxInt 17371 s := v.Aux 17372 _ = v.Args[1] 17373 v_0 := v.Args[0] 17374 if v_0.Op != OpS390XADDconst { 17375 break 17376 } 17377 off := v_0.AuxInt 17378 ptr := v_0.Args[0] 17379 mem := v.Args[1] 17380 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 17381 break 17382 } 17383 v.reset(OpS390XMOVHstoreconst) 17384 v.AuxInt = ValAndOff(sc).add(off) 17385 v.Aux = s 17386 v.AddArg(ptr) 17387 v.AddArg(mem) 17388 return true 17389 } 17390 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 17391 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 17392 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 17393 for { 17394 sc := v.AuxInt 17395 sym1 := v.Aux 17396 _ = v.Args[1] 17397 v_0 := v.Args[0] 17398 if v_0.Op != OpS390XMOVDaddr { 17399 break 17400 } 17401 off := v_0.AuxInt 17402 sym2 := v_0.Aux 17403 ptr := v_0.Args[0] 17404 mem := v.Args[1] 17405 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 17406 break 17407 } 17408 v.reset(OpS390XMOVHstoreconst) 17409 v.AuxInt = ValAndOff(sc).add(off) 17410 v.Aux = mergeSym(sym1, sym2) 17411 v.AddArg(ptr) 17412 v.AddArg(mem) 17413 return true 17414 } 17415 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 17416 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 17417 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 17418 for { 17419 c := v.AuxInt 17420 s := v.Aux 17421 _ = v.Args[1] 17422 p := v.Args[0] 17423 x := v.Args[1] 17424 if x.Op != OpS390XMOVHstoreconst { 17425 break 17426 } 17427 a := x.AuxInt 17428 if x.Aux != s { 17429 break 17430 } 17431 _ = x.Args[1] 17432 if p != x.Args[0] { 17433 break 17434 } 17435 mem := x.Args[1] 17436 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 17437 break 17438 } 17439 v.reset(OpS390XMOVWstore) 17440 v.AuxInt = ValAndOff(a).Off() 17441 v.Aux = s 17442 v.AddArg(p) 17443 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 17444 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 17445 v.AddArg(v0) 17446 v.AddArg(mem) 17447 return true 17448 } 17449 return false 17450 } 17451 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 17452 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 17453 // cond: is20Bit(c+d) 17454 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 17455 for { 17456 c := v.AuxInt 17457 sym := v.Aux 17458 _ = v.Args[3] 17459 v_0 := v.Args[0] 17460 if v_0.Op != OpS390XADDconst { 17461 break 17462 } 17463 d := v_0.AuxInt 17464 ptr := v_0.Args[0] 17465 idx := v.Args[1] 17466 val := v.Args[2] 17467 mem := v.Args[3] 17468 if !(is20Bit(c + d)) { 17469 break 17470 } 17471 v.reset(OpS390XMOVHstoreidx) 17472 v.AuxInt = c + d 17473 v.Aux = sym 17474 v.AddArg(ptr) 17475 v.AddArg(idx) 17476 v.AddArg(val) 17477 v.AddArg(mem) 17478 return true 17479 } 17480 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 17481 // cond: is20Bit(c+d) 17482 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 17483 for { 17484 c := v.AuxInt 17485 sym := v.Aux 17486 _ = v.Args[3] 17487 idx := v.Args[0] 17488 v_1 := v.Args[1] 17489 if v_1.Op != OpS390XADDconst { 17490 break 17491 } 17492 d := v_1.AuxInt 17493 ptr := v_1.Args[0] 17494 val := v.Args[2] 17495 mem := v.Args[3] 17496 if !(is20Bit(c + d)) { 17497 break 17498 } 17499 v.reset(OpS390XMOVHstoreidx) 17500 v.AuxInt = c + d 17501 v.Aux = sym 17502 v.AddArg(ptr) 17503 v.AddArg(idx) 17504 v.AddArg(val) 17505 v.AddArg(mem) 17506 return true 17507 } 17508 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 17509 // cond: is20Bit(c+d) 17510 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 17511 for { 17512 c := v.AuxInt 17513 sym := v.Aux 17514 _ = v.Args[3] 17515 ptr := v.Args[0] 17516 v_1 := v.Args[1] 17517 if v_1.Op != OpS390XADDconst { 17518 break 17519 } 17520 d := v_1.AuxInt 17521 idx := v_1.Args[0] 17522 val := v.Args[2] 17523 mem := v.Args[3] 17524 if !(is20Bit(c + d)) { 17525 break 17526 } 17527 v.reset(OpS390XMOVHstoreidx) 17528 v.AuxInt = c + d 17529 v.Aux = sym 17530 v.AddArg(ptr) 17531 v.AddArg(idx) 17532 v.AddArg(val) 17533 v.AddArg(mem) 17534 return true 17535 } 17536 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 17537 // cond: is20Bit(c+d) 17538 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 17539 for { 17540 c := v.AuxInt 17541 sym := v.Aux 17542 _ = v.Args[3] 17543 v_0 := v.Args[0] 17544 if v_0.Op != OpS390XADDconst { 17545 break 17546 } 17547 d := v_0.AuxInt 17548 idx := v_0.Args[0] 17549 ptr := v.Args[1] 17550 val := v.Args[2] 17551 mem := v.Args[3] 17552 if !(is20Bit(c + d)) { 17553 break 17554 } 17555 v.reset(OpS390XMOVHstoreidx) 17556 v.AuxInt = c + d 17557 v.Aux = sym 17558 v.AddArg(ptr) 17559 v.AddArg(idx) 17560 v.AddArg(val) 17561 v.AddArg(mem) 17562 return true 17563 } 17564 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 17565 // cond: x.Uses == 1 && clobber(x) 17566 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 17567 for { 17568 i := v.AuxInt 17569 s := v.Aux 17570 _ = v.Args[3] 17571 p := v.Args[0] 17572 idx := v.Args[1] 17573 w := v.Args[2] 17574 x := v.Args[3] 17575 if x.Op != OpS390XMOVHstoreidx { 17576 break 17577 } 17578 if x.AuxInt != i-2 { 17579 break 17580 } 17581 if x.Aux != s { 17582 break 17583 } 17584 _ = x.Args[3] 17585 if p != x.Args[0] { 17586 break 17587 } 17588 if idx != x.Args[1] { 17589 break 17590 } 17591 x_2 := x.Args[2] 17592 if x_2.Op != OpS390XSRDconst { 17593 break 17594 } 17595 if x_2.AuxInt != 16 { 17596 break 17597 } 17598 if w != x_2.Args[0] { 17599 break 17600 } 17601 mem := x.Args[3] 17602 if !(x.Uses == 1 && clobber(x)) { 17603 break 17604 } 17605 v.reset(OpS390XMOVWstoreidx) 17606 v.AuxInt = i - 2 17607 v.Aux = s 17608 v.AddArg(p) 17609 v.AddArg(idx) 17610 v.AddArg(w) 17611 v.AddArg(mem) 17612 return true 17613 } 17614 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 17615 // cond: x.Uses == 1 && clobber(x) 17616 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 17617 for { 17618 i := v.AuxInt 17619 s := v.Aux 17620 _ = v.Args[3] 17621 p := v.Args[0] 17622 idx := v.Args[1] 17623 w := v.Args[2] 17624 x := v.Args[3] 17625 if x.Op != OpS390XMOVHstoreidx { 17626 break 17627 } 17628 if x.AuxInt != i-2 { 17629 break 17630 } 17631 if x.Aux != s { 17632 break 17633 } 17634 _ = x.Args[3] 17635 if idx != x.Args[0] { 17636 break 17637 } 17638 if p != x.Args[1] { 17639 break 17640 } 17641 x_2 := x.Args[2] 17642 if x_2.Op != OpS390XSRDconst { 17643 break 17644 } 17645 if x_2.AuxInt != 16 { 17646 break 17647 } 17648 if w != x_2.Args[0] { 17649 break 17650 } 17651 mem := x.Args[3] 17652 if !(x.Uses == 1 && clobber(x)) { 17653 break 17654 } 17655 v.reset(OpS390XMOVWstoreidx) 17656 v.AuxInt = i - 2 17657 v.Aux = s 17658 v.AddArg(p) 17659 v.AddArg(idx) 17660 v.AddArg(w) 17661 v.AddArg(mem) 17662 return true 17663 } 17664 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 17665 // cond: x.Uses == 1 && clobber(x) 17666 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 17667 for { 17668 i := v.AuxInt 17669 s := v.Aux 17670 _ = v.Args[3] 17671 idx := v.Args[0] 17672 p := v.Args[1] 17673 w := v.Args[2] 17674 x := v.Args[3] 17675 if x.Op != OpS390XMOVHstoreidx { 17676 break 17677 } 17678 if x.AuxInt != i-2 { 17679 break 17680 } 17681 if x.Aux != s { 17682 break 17683 } 17684 _ = x.Args[3] 17685 if p != x.Args[0] { 17686 break 17687 } 17688 if idx != x.Args[1] { 17689 break 17690 } 17691 x_2 := x.Args[2] 17692 if x_2.Op != OpS390XSRDconst { 17693 break 17694 } 17695 if x_2.AuxInt != 16 { 17696 break 17697 } 17698 if w != x_2.Args[0] { 17699 break 17700 } 17701 mem := x.Args[3] 17702 if !(x.Uses == 1 && clobber(x)) { 17703 break 17704 } 17705 v.reset(OpS390XMOVWstoreidx) 17706 v.AuxInt = i - 2 17707 v.Aux = s 17708 v.AddArg(p) 17709 v.AddArg(idx) 17710 v.AddArg(w) 17711 v.AddArg(mem) 17712 return true 17713 } 17714 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 17715 // cond: x.Uses == 1 && clobber(x) 17716 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 17717 for { 17718 i := v.AuxInt 17719 s := v.Aux 17720 _ = v.Args[3] 17721 idx := v.Args[0] 17722 p := v.Args[1] 17723 w := v.Args[2] 17724 x := v.Args[3] 17725 if x.Op != OpS390XMOVHstoreidx { 17726 break 17727 } 17728 if x.AuxInt != i-2 { 17729 break 17730 } 17731 if x.Aux != s { 17732 break 17733 } 17734 _ = x.Args[3] 17735 if idx != x.Args[0] { 17736 break 17737 } 17738 if p != x.Args[1] { 17739 break 17740 } 17741 x_2 := x.Args[2] 17742 if x_2.Op != OpS390XSRDconst { 17743 break 17744 } 17745 if x_2.AuxInt != 16 { 17746 break 17747 } 17748 if w != x_2.Args[0] { 17749 break 17750 } 17751 mem := x.Args[3] 17752 if !(x.Uses == 1 && clobber(x)) { 17753 break 17754 } 17755 v.reset(OpS390XMOVWstoreidx) 17756 v.AuxInt = i - 2 17757 v.Aux = s 17758 v.AddArg(p) 17759 v.AddArg(idx) 17760 v.AddArg(w) 17761 v.AddArg(mem) 17762 return true 17763 } 17764 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 17765 // cond: x.Uses == 1 && clobber(x) 17766 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 17767 for { 17768 i := v.AuxInt 17769 s := v.Aux 17770 _ = v.Args[3] 17771 p := v.Args[0] 17772 idx := v.Args[1] 17773 w0 := v.Args[2] 17774 if w0.Op != OpS390XSRDconst { 17775 break 17776 } 17777 j := w0.AuxInt 17778 w := w0.Args[0] 17779 x := v.Args[3] 17780 if x.Op != OpS390XMOVHstoreidx { 17781 break 17782 } 17783 if x.AuxInt != i-2 { 17784 break 17785 } 17786 if x.Aux != s { 17787 break 17788 } 17789 _ = x.Args[3] 17790 if p != x.Args[0] { 17791 break 17792 } 17793 if idx != x.Args[1] { 17794 break 17795 } 17796 x_2 := x.Args[2] 17797 if x_2.Op != OpS390XSRDconst { 17798 break 17799 } 17800 if x_2.AuxInt != j+16 { 17801 break 17802 } 17803 if w != x_2.Args[0] { 17804 break 17805 } 17806 mem := x.Args[3] 17807 if !(x.Uses == 1 && clobber(x)) { 17808 break 17809 } 17810 v.reset(OpS390XMOVWstoreidx) 17811 v.AuxInt = i - 2 17812 v.Aux = s 17813 v.AddArg(p) 17814 v.AddArg(idx) 17815 v.AddArg(w0) 17816 v.AddArg(mem) 17817 return true 17818 } 17819 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 17820 // cond: x.Uses == 1 && clobber(x) 17821 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 17822 for { 17823 i := v.AuxInt 17824 s := v.Aux 17825 _ = v.Args[3] 17826 p := v.Args[0] 17827 idx := v.Args[1] 17828 w0 := v.Args[2] 17829 if w0.Op != OpS390XSRDconst { 17830 break 17831 } 17832 j := w0.AuxInt 17833 w := w0.Args[0] 17834 x := v.Args[3] 17835 if x.Op != OpS390XMOVHstoreidx { 17836 break 17837 } 17838 if x.AuxInt != i-2 { 17839 break 17840 } 17841 if x.Aux != s { 17842 break 17843 } 17844 _ = x.Args[3] 17845 if idx != x.Args[0] { 17846 break 17847 } 17848 if p != x.Args[1] { 17849 break 17850 } 17851 x_2 := x.Args[2] 17852 if x_2.Op != OpS390XSRDconst { 17853 break 17854 } 17855 if x_2.AuxInt != j+16 { 17856 break 17857 } 17858 if w != x_2.Args[0] { 17859 break 17860 } 17861 mem := x.Args[3] 17862 if !(x.Uses == 1 && clobber(x)) { 17863 break 17864 } 17865 v.reset(OpS390XMOVWstoreidx) 17866 v.AuxInt = i - 2 17867 v.Aux = s 17868 v.AddArg(p) 17869 v.AddArg(idx) 17870 v.AddArg(w0) 17871 v.AddArg(mem) 17872 return true 17873 } 17874 return false 17875 } 17876 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 17877 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 17878 // cond: x.Uses == 1 && clobber(x) 17879 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 17880 for { 17881 i := v.AuxInt 17882 s := v.Aux 17883 _ = v.Args[3] 17884 idx := v.Args[0] 17885 p := v.Args[1] 17886 w0 := v.Args[2] 17887 if w0.Op != OpS390XSRDconst { 17888 break 17889 } 17890 j := w0.AuxInt 17891 w := w0.Args[0] 17892 x := v.Args[3] 17893 if x.Op != OpS390XMOVHstoreidx { 17894 break 17895 } 17896 if x.AuxInt != i-2 { 17897 break 17898 } 17899 if x.Aux != s { 17900 break 17901 } 17902 _ = x.Args[3] 17903 if p != x.Args[0] { 17904 break 17905 } 17906 if idx != x.Args[1] { 17907 break 17908 } 17909 x_2 := x.Args[2] 17910 if x_2.Op != OpS390XSRDconst { 17911 break 17912 } 17913 if x_2.AuxInt != j+16 { 17914 break 17915 } 17916 if w != x_2.Args[0] { 17917 break 17918 } 17919 mem := x.Args[3] 17920 if !(x.Uses == 1 && clobber(x)) { 17921 break 17922 } 17923 v.reset(OpS390XMOVWstoreidx) 17924 v.AuxInt = i - 2 17925 v.Aux = s 17926 v.AddArg(p) 17927 v.AddArg(idx) 17928 v.AddArg(w0) 17929 v.AddArg(mem) 17930 return true 17931 } 17932 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 17933 // cond: x.Uses == 1 && clobber(x) 17934 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 17935 for { 17936 i := v.AuxInt 17937 s := v.Aux 17938 _ = v.Args[3] 17939 idx := v.Args[0] 17940 p := v.Args[1] 17941 w0 := v.Args[2] 17942 if w0.Op != OpS390XSRDconst { 17943 break 17944 } 17945 j := w0.AuxInt 17946 w := w0.Args[0] 17947 x := v.Args[3] 17948 if x.Op != OpS390XMOVHstoreidx { 17949 break 17950 } 17951 if x.AuxInt != i-2 { 17952 break 17953 } 17954 if x.Aux != s { 17955 break 17956 } 17957 _ = x.Args[3] 17958 if idx != x.Args[0] { 17959 break 17960 } 17961 if p != x.Args[1] { 17962 break 17963 } 17964 x_2 := x.Args[2] 17965 if x_2.Op != OpS390XSRDconst { 17966 break 17967 } 17968 if x_2.AuxInt != j+16 { 17969 break 17970 } 17971 if w != x_2.Args[0] { 17972 break 17973 } 17974 mem := x.Args[3] 17975 if !(x.Uses == 1 && clobber(x)) { 17976 break 17977 } 17978 v.reset(OpS390XMOVWstoreidx) 17979 v.AuxInt = i - 2 17980 v.Aux = s 17981 v.AddArg(p) 17982 v.AddArg(idx) 17983 v.AddArg(w0) 17984 v.AddArg(mem) 17985 return true 17986 } 17987 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 17988 // cond: x.Uses == 1 && clobber(x) 17989 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 17990 for { 17991 i := v.AuxInt 17992 s := v.Aux 17993 _ = v.Args[3] 17994 p := v.Args[0] 17995 idx := v.Args[1] 17996 w := v.Args[2] 17997 x := v.Args[3] 17998 if x.Op != OpS390XMOVHstoreidx { 17999 break 18000 } 18001 if x.AuxInt != i-2 { 18002 break 18003 } 18004 if x.Aux != s { 18005 break 18006 } 18007 _ = x.Args[3] 18008 if p != x.Args[0] { 18009 break 18010 } 18011 if idx != x.Args[1] { 18012 break 18013 } 18014 x_2 := x.Args[2] 18015 if x_2.Op != OpS390XSRWconst { 18016 break 18017 } 18018 if x_2.AuxInt != 16 { 18019 break 18020 } 18021 if w != x_2.Args[0] { 18022 break 18023 } 18024 mem := x.Args[3] 18025 if !(x.Uses == 1 && clobber(x)) { 18026 break 18027 } 18028 v.reset(OpS390XMOVWstoreidx) 18029 v.AuxInt = i - 2 18030 v.Aux = s 18031 v.AddArg(p) 18032 v.AddArg(idx) 18033 v.AddArg(w) 18034 v.AddArg(mem) 18035 return true 18036 } 18037 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 18038 // cond: x.Uses == 1 && clobber(x) 18039 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 18040 for { 18041 i := v.AuxInt 18042 s := v.Aux 18043 _ = v.Args[3] 18044 p := v.Args[0] 18045 idx := v.Args[1] 18046 w := v.Args[2] 18047 x := v.Args[3] 18048 if x.Op != OpS390XMOVHstoreidx { 18049 break 18050 } 18051 if x.AuxInt != i-2 { 18052 break 18053 } 18054 if x.Aux != s { 18055 break 18056 } 18057 _ = x.Args[3] 18058 if idx != x.Args[0] { 18059 break 18060 } 18061 if p != x.Args[1] { 18062 break 18063 } 18064 x_2 := x.Args[2] 18065 if x_2.Op != OpS390XSRWconst { 18066 break 18067 } 18068 if x_2.AuxInt != 16 { 18069 break 18070 } 18071 if w != x_2.Args[0] { 18072 break 18073 } 18074 mem := x.Args[3] 18075 if !(x.Uses == 1 && clobber(x)) { 18076 break 18077 } 18078 v.reset(OpS390XMOVWstoreidx) 18079 v.AuxInt = i - 2 18080 v.Aux = s 18081 v.AddArg(p) 18082 v.AddArg(idx) 18083 v.AddArg(w) 18084 v.AddArg(mem) 18085 return true 18086 } 18087 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 18088 // cond: x.Uses == 1 && clobber(x) 18089 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 18090 for { 18091 i := v.AuxInt 18092 s := v.Aux 18093 _ = v.Args[3] 18094 idx := v.Args[0] 18095 p := v.Args[1] 18096 w := v.Args[2] 18097 x := v.Args[3] 18098 if x.Op != OpS390XMOVHstoreidx { 18099 break 18100 } 18101 if x.AuxInt != i-2 { 18102 break 18103 } 18104 if x.Aux != s { 18105 break 18106 } 18107 _ = x.Args[3] 18108 if p != x.Args[0] { 18109 break 18110 } 18111 if idx != x.Args[1] { 18112 break 18113 } 18114 x_2 := x.Args[2] 18115 if x_2.Op != OpS390XSRWconst { 18116 break 18117 } 18118 if x_2.AuxInt != 16 { 18119 break 18120 } 18121 if w != x_2.Args[0] { 18122 break 18123 } 18124 mem := x.Args[3] 18125 if !(x.Uses == 1 && clobber(x)) { 18126 break 18127 } 18128 v.reset(OpS390XMOVWstoreidx) 18129 v.AuxInt = i - 2 18130 v.Aux = s 18131 v.AddArg(p) 18132 v.AddArg(idx) 18133 v.AddArg(w) 18134 v.AddArg(mem) 18135 return true 18136 } 18137 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 18138 // cond: x.Uses == 1 && clobber(x) 18139 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 18140 for { 18141 i := v.AuxInt 18142 s := v.Aux 18143 _ = v.Args[3] 18144 idx := v.Args[0] 18145 p := v.Args[1] 18146 w := v.Args[2] 18147 x := v.Args[3] 18148 if x.Op != OpS390XMOVHstoreidx { 18149 break 18150 } 18151 if x.AuxInt != i-2 { 18152 break 18153 } 18154 if x.Aux != s { 18155 break 18156 } 18157 _ = x.Args[3] 18158 if idx != x.Args[0] { 18159 break 18160 } 18161 if p != x.Args[1] { 18162 break 18163 } 18164 x_2 := x.Args[2] 18165 if x_2.Op != OpS390XSRWconst { 18166 break 18167 } 18168 if x_2.AuxInt != 16 { 18169 break 18170 } 18171 if w != x_2.Args[0] { 18172 break 18173 } 18174 mem := x.Args[3] 18175 if !(x.Uses == 1 && clobber(x)) { 18176 break 18177 } 18178 v.reset(OpS390XMOVWstoreidx) 18179 v.AuxInt = i - 2 18180 v.Aux = s 18181 v.AddArg(p) 18182 v.AddArg(idx) 18183 v.AddArg(w) 18184 v.AddArg(mem) 18185 return true 18186 } 18187 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 18188 // cond: x.Uses == 1 && clobber(x) 18189 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 18190 for { 18191 i := v.AuxInt 18192 s := v.Aux 18193 _ = v.Args[3] 18194 p := v.Args[0] 18195 idx := v.Args[1] 18196 w0 := v.Args[2] 18197 if w0.Op != OpS390XSRWconst { 18198 break 18199 } 18200 j := w0.AuxInt 18201 w := w0.Args[0] 18202 x := v.Args[3] 18203 if x.Op != OpS390XMOVHstoreidx { 18204 break 18205 } 18206 if x.AuxInt != i-2 { 18207 break 18208 } 18209 if x.Aux != s { 18210 break 18211 } 18212 _ = x.Args[3] 18213 if p != x.Args[0] { 18214 break 18215 } 18216 if idx != x.Args[1] { 18217 break 18218 } 18219 x_2 := x.Args[2] 18220 if x_2.Op != OpS390XSRWconst { 18221 break 18222 } 18223 if x_2.AuxInt != j+16 { 18224 break 18225 } 18226 if w != x_2.Args[0] { 18227 break 18228 } 18229 mem := x.Args[3] 18230 if !(x.Uses == 1 && clobber(x)) { 18231 break 18232 } 18233 v.reset(OpS390XMOVWstoreidx) 18234 v.AuxInt = i - 2 18235 v.Aux = s 18236 v.AddArg(p) 18237 v.AddArg(idx) 18238 v.AddArg(w0) 18239 v.AddArg(mem) 18240 return true 18241 } 18242 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 18243 // cond: x.Uses == 1 && clobber(x) 18244 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 18245 for { 18246 i := v.AuxInt 18247 s := v.Aux 18248 _ = v.Args[3] 18249 p := v.Args[0] 18250 idx := v.Args[1] 18251 w0 := v.Args[2] 18252 if w0.Op != OpS390XSRWconst { 18253 break 18254 } 18255 j := w0.AuxInt 18256 w := w0.Args[0] 18257 x := v.Args[3] 18258 if x.Op != OpS390XMOVHstoreidx { 18259 break 18260 } 18261 if x.AuxInt != i-2 { 18262 break 18263 } 18264 if x.Aux != s { 18265 break 18266 } 18267 _ = x.Args[3] 18268 if idx != x.Args[0] { 18269 break 18270 } 18271 if p != x.Args[1] { 18272 break 18273 } 18274 x_2 := x.Args[2] 18275 if x_2.Op != OpS390XSRWconst { 18276 break 18277 } 18278 if x_2.AuxInt != j+16 { 18279 break 18280 } 18281 if w != x_2.Args[0] { 18282 break 18283 } 18284 mem := x.Args[3] 18285 if !(x.Uses == 1 && clobber(x)) { 18286 break 18287 } 18288 v.reset(OpS390XMOVWstoreidx) 18289 v.AuxInt = i - 2 18290 v.Aux = s 18291 v.AddArg(p) 18292 v.AddArg(idx) 18293 v.AddArg(w0) 18294 v.AddArg(mem) 18295 return true 18296 } 18297 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 18298 // cond: x.Uses == 1 && clobber(x) 18299 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 18300 for { 18301 i := v.AuxInt 18302 s := v.Aux 18303 _ = v.Args[3] 18304 idx := v.Args[0] 18305 p := v.Args[1] 18306 w0 := v.Args[2] 18307 if w0.Op != OpS390XSRWconst { 18308 break 18309 } 18310 j := w0.AuxInt 18311 w := w0.Args[0] 18312 x := v.Args[3] 18313 if x.Op != OpS390XMOVHstoreidx { 18314 break 18315 } 18316 if x.AuxInt != i-2 { 18317 break 18318 } 18319 if x.Aux != s { 18320 break 18321 } 18322 _ = x.Args[3] 18323 if p != x.Args[0] { 18324 break 18325 } 18326 if idx != x.Args[1] { 18327 break 18328 } 18329 x_2 := x.Args[2] 18330 if x_2.Op != OpS390XSRWconst { 18331 break 18332 } 18333 if x_2.AuxInt != j+16 { 18334 break 18335 } 18336 if w != x_2.Args[0] { 18337 break 18338 } 18339 mem := x.Args[3] 18340 if !(x.Uses == 1 && clobber(x)) { 18341 break 18342 } 18343 v.reset(OpS390XMOVWstoreidx) 18344 v.AuxInt = i - 2 18345 v.Aux = s 18346 v.AddArg(p) 18347 v.AddArg(idx) 18348 v.AddArg(w0) 18349 v.AddArg(mem) 18350 return true 18351 } 18352 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 18353 // cond: x.Uses == 1 && clobber(x) 18354 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 18355 for { 18356 i := v.AuxInt 18357 s := v.Aux 18358 _ = v.Args[3] 18359 idx := v.Args[0] 18360 p := v.Args[1] 18361 w0 := v.Args[2] 18362 if w0.Op != OpS390XSRWconst { 18363 break 18364 } 18365 j := w0.AuxInt 18366 w := w0.Args[0] 18367 x := v.Args[3] 18368 if x.Op != OpS390XMOVHstoreidx { 18369 break 18370 } 18371 if x.AuxInt != i-2 { 18372 break 18373 } 18374 if x.Aux != s { 18375 break 18376 } 18377 _ = x.Args[3] 18378 if idx != x.Args[0] { 18379 break 18380 } 18381 if p != x.Args[1] { 18382 break 18383 } 18384 x_2 := x.Args[2] 18385 if x_2.Op != OpS390XSRWconst { 18386 break 18387 } 18388 if x_2.AuxInt != j+16 { 18389 break 18390 } 18391 if w != x_2.Args[0] { 18392 break 18393 } 18394 mem := x.Args[3] 18395 if !(x.Uses == 1 && clobber(x)) { 18396 break 18397 } 18398 v.reset(OpS390XMOVWstoreidx) 18399 v.AuxInt = i - 2 18400 v.Aux = s 18401 v.AddArg(p) 18402 v.AddArg(idx) 18403 v.AddArg(w0) 18404 v.AddArg(mem) 18405 return true 18406 } 18407 return false 18408 } 18409 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 18410 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 18411 // cond: x.Uses == 1 && clobber(x) 18412 // result: (MOVDBRstore [i-4] {s} p w mem) 18413 for { 18414 i := v.AuxInt 18415 s := v.Aux 18416 _ = v.Args[2] 18417 p := v.Args[0] 18418 v_1 := v.Args[1] 18419 if v_1.Op != OpS390XSRDconst { 18420 break 18421 } 18422 if v_1.AuxInt != 32 { 18423 break 18424 } 18425 w := v_1.Args[0] 18426 x := v.Args[2] 18427 if x.Op != OpS390XMOVWBRstore { 18428 break 18429 } 18430 if x.AuxInt != i-4 { 18431 break 18432 } 18433 if x.Aux != s { 18434 break 18435 } 18436 _ = x.Args[2] 18437 if p != x.Args[0] { 18438 break 18439 } 18440 if w != x.Args[1] { 18441 break 18442 } 18443 mem := x.Args[2] 18444 if !(x.Uses == 1 && clobber(x)) { 18445 break 18446 } 18447 v.reset(OpS390XMOVDBRstore) 18448 v.AuxInt = i - 4 18449 v.Aux = s 18450 v.AddArg(p) 18451 v.AddArg(w) 18452 v.AddArg(mem) 18453 return true 18454 } 18455 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 18456 // cond: x.Uses == 1 && clobber(x) 18457 // result: (MOVDBRstore [i-4] {s} p w0 mem) 18458 for { 18459 i := v.AuxInt 18460 s := v.Aux 18461 _ = v.Args[2] 18462 p := v.Args[0] 18463 v_1 := v.Args[1] 18464 if v_1.Op != OpS390XSRDconst { 18465 break 18466 } 18467 j := v_1.AuxInt 18468 w := v_1.Args[0] 18469 x := v.Args[2] 18470 if x.Op != OpS390XMOVWBRstore { 18471 break 18472 } 18473 if x.AuxInt != i-4 { 18474 break 18475 } 18476 if x.Aux != s { 18477 break 18478 } 18479 _ = x.Args[2] 18480 if p != x.Args[0] { 18481 break 18482 } 18483 w0 := x.Args[1] 18484 if w0.Op != OpS390XSRDconst { 18485 break 18486 } 18487 if w0.AuxInt != j-32 { 18488 break 18489 } 18490 if w != w0.Args[0] { 18491 break 18492 } 18493 mem := x.Args[2] 18494 if !(x.Uses == 1 && clobber(x)) { 18495 break 18496 } 18497 v.reset(OpS390XMOVDBRstore) 18498 v.AuxInt = i - 4 18499 v.Aux = s 18500 v.AddArg(p) 18501 v.AddArg(w0) 18502 v.AddArg(mem) 18503 return true 18504 } 18505 return false 18506 } 18507 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 18508 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 18509 // cond: x.Uses == 1 && clobber(x) 18510 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 18511 for { 18512 i := v.AuxInt 18513 s := v.Aux 18514 _ = v.Args[3] 18515 p := v.Args[0] 18516 idx := v.Args[1] 18517 v_2 := v.Args[2] 18518 if v_2.Op != OpS390XSRDconst { 18519 break 18520 } 18521 if v_2.AuxInt != 32 { 18522 break 18523 } 18524 w := v_2.Args[0] 18525 x := v.Args[3] 18526 if x.Op != OpS390XMOVWBRstoreidx { 18527 break 18528 } 18529 if x.AuxInt != i-4 { 18530 break 18531 } 18532 if x.Aux != s { 18533 break 18534 } 18535 _ = x.Args[3] 18536 if p != x.Args[0] { 18537 break 18538 } 18539 if idx != x.Args[1] { 18540 break 18541 } 18542 if w != x.Args[2] { 18543 break 18544 } 18545 mem := x.Args[3] 18546 if !(x.Uses == 1 && clobber(x)) { 18547 break 18548 } 18549 v.reset(OpS390XMOVDBRstoreidx) 18550 v.AuxInt = i - 4 18551 v.Aux = s 18552 v.AddArg(p) 18553 v.AddArg(idx) 18554 v.AddArg(w) 18555 v.AddArg(mem) 18556 return true 18557 } 18558 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 18559 // cond: x.Uses == 1 && clobber(x) 18560 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 18561 for { 18562 i := v.AuxInt 18563 s := v.Aux 18564 _ = v.Args[3] 18565 p := v.Args[0] 18566 idx := v.Args[1] 18567 v_2 := v.Args[2] 18568 if v_2.Op != OpS390XSRDconst { 18569 break 18570 } 18571 if v_2.AuxInt != 32 { 18572 break 18573 } 18574 w := v_2.Args[0] 18575 x := v.Args[3] 18576 if x.Op != OpS390XMOVWBRstoreidx { 18577 break 18578 } 18579 if x.AuxInt != i-4 { 18580 break 18581 } 18582 if x.Aux != s { 18583 break 18584 } 18585 _ = x.Args[3] 18586 if idx != x.Args[0] { 18587 break 18588 } 18589 if p != x.Args[1] { 18590 break 18591 } 18592 if w != x.Args[2] { 18593 break 18594 } 18595 mem := x.Args[3] 18596 if !(x.Uses == 1 && clobber(x)) { 18597 break 18598 } 18599 v.reset(OpS390XMOVDBRstoreidx) 18600 v.AuxInt = i - 4 18601 v.Aux = s 18602 v.AddArg(p) 18603 v.AddArg(idx) 18604 v.AddArg(w) 18605 v.AddArg(mem) 18606 return true 18607 } 18608 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 18609 // cond: x.Uses == 1 && clobber(x) 18610 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 18611 for { 18612 i := v.AuxInt 18613 s := v.Aux 18614 _ = v.Args[3] 18615 idx := v.Args[0] 18616 p := v.Args[1] 18617 v_2 := v.Args[2] 18618 if v_2.Op != OpS390XSRDconst { 18619 break 18620 } 18621 if v_2.AuxInt != 32 { 18622 break 18623 } 18624 w := v_2.Args[0] 18625 x := v.Args[3] 18626 if x.Op != OpS390XMOVWBRstoreidx { 18627 break 18628 } 18629 if x.AuxInt != i-4 { 18630 break 18631 } 18632 if x.Aux != s { 18633 break 18634 } 18635 _ = x.Args[3] 18636 if p != x.Args[0] { 18637 break 18638 } 18639 if idx != x.Args[1] { 18640 break 18641 } 18642 if w != x.Args[2] { 18643 break 18644 } 18645 mem := x.Args[3] 18646 if !(x.Uses == 1 && clobber(x)) { 18647 break 18648 } 18649 v.reset(OpS390XMOVDBRstoreidx) 18650 v.AuxInt = i - 4 18651 v.Aux = s 18652 v.AddArg(p) 18653 v.AddArg(idx) 18654 v.AddArg(w) 18655 v.AddArg(mem) 18656 return true 18657 } 18658 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 18659 // cond: x.Uses == 1 && clobber(x) 18660 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 18661 for { 18662 i := v.AuxInt 18663 s := v.Aux 18664 _ = v.Args[3] 18665 idx := v.Args[0] 18666 p := v.Args[1] 18667 v_2 := v.Args[2] 18668 if v_2.Op != OpS390XSRDconst { 18669 break 18670 } 18671 if v_2.AuxInt != 32 { 18672 break 18673 } 18674 w := v_2.Args[0] 18675 x := v.Args[3] 18676 if x.Op != OpS390XMOVWBRstoreidx { 18677 break 18678 } 18679 if x.AuxInt != i-4 { 18680 break 18681 } 18682 if x.Aux != s { 18683 break 18684 } 18685 _ = x.Args[3] 18686 if idx != x.Args[0] { 18687 break 18688 } 18689 if p != x.Args[1] { 18690 break 18691 } 18692 if w != x.Args[2] { 18693 break 18694 } 18695 mem := x.Args[3] 18696 if !(x.Uses == 1 && clobber(x)) { 18697 break 18698 } 18699 v.reset(OpS390XMOVDBRstoreidx) 18700 v.AuxInt = i - 4 18701 v.Aux = s 18702 v.AddArg(p) 18703 v.AddArg(idx) 18704 v.AddArg(w) 18705 v.AddArg(mem) 18706 return true 18707 } 18708 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 18709 // cond: x.Uses == 1 && clobber(x) 18710 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 18711 for { 18712 i := v.AuxInt 18713 s := v.Aux 18714 _ = v.Args[3] 18715 p := v.Args[0] 18716 idx := v.Args[1] 18717 v_2 := v.Args[2] 18718 if v_2.Op != OpS390XSRDconst { 18719 break 18720 } 18721 j := v_2.AuxInt 18722 w := v_2.Args[0] 18723 x := v.Args[3] 18724 if x.Op != OpS390XMOVWBRstoreidx { 18725 break 18726 } 18727 if x.AuxInt != i-4 { 18728 break 18729 } 18730 if x.Aux != s { 18731 break 18732 } 18733 _ = x.Args[3] 18734 if p != x.Args[0] { 18735 break 18736 } 18737 if idx != x.Args[1] { 18738 break 18739 } 18740 w0 := x.Args[2] 18741 if w0.Op != OpS390XSRDconst { 18742 break 18743 } 18744 if w0.AuxInt != j-32 { 18745 break 18746 } 18747 if w != w0.Args[0] { 18748 break 18749 } 18750 mem := x.Args[3] 18751 if !(x.Uses == 1 && clobber(x)) { 18752 break 18753 } 18754 v.reset(OpS390XMOVDBRstoreidx) 18755 v.AuxInt = i - 4 18756 v.Aux = s 18757 v.AddArg(p) 18758 v.AddArg(idx) 18759 v.AddArg(w0) 18760 v.AddArg(mem) 18761 return true 18762 } 18763 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 18764 // cond: x.Uses == 1 && clobber(x) 18765 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 18766 for { 18767 i := v.AuxInt 18768 s := v.Aux 18769 _ = v.Args[3] 18770 p := v.Args[0] 18771 idx := v.Args[1] 18772 v_2 := v.Args[2] 18773 if v_2.Op != OpS390XSRDconst { 18774 break 18775 } 18776 j := v_2.AuxInt 18777 w := v_2.Args[0] 18778 x := v.Args[3] 18779 if x.Op != OpS390XMOVWBRstoreidx { 18780 break 18781 } 18782 if x.AuxInt != i-4 { 18783 break 18784 } 18785 if x.Aux != s { 18786 break 18787 } 18788 _ = x.Args[3] 18789 if idx != x.Args[0] { 18790 break 18791 } 18792 if p != x.Args[1] { 18793 break 18794 } 18795 w0 := x.Args[2] 18796 if w0.Op != OpS390XSRDconst { 18797 break 18798 } 18799 if w0.AuxInt != j-32 { 18800 break 18801 } 18802 if w != w0.Args[0] { 18803 break 18804 } 18805 mem := x.Args[3] 18806 if !(x.Uses == 1 && clobber(x)) { 18807 break 18808 } 18809 v.reset(OpS390XMOVDBRstoreidx) 18810 v.AuxInt = i - 4 18811 v.Aux = s 18812 v.AddArg(p) 18813 v.AddArg(idx) 18814 v.AddArg(w0) 18815 v.AddArg(mem) 18816 return true 18817 } 18818 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 18819 // cond: x.Uses == 1 && clobber(x) 18820 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 18821 for { 18822 i := v.AuxInt 18823 s := v.Aux 18824 _ = v.Args[3] 18825 idx := v.Args[0] 18826 p := v.Args[1] 18827 v_2 := v.Args[2] 18828 if v_2.Op != OpS390XSRDconst { 18829 break 18830 } 18831 j := v_2.AuxInt 18832 w := v_2.Args[0] 18833 x := v.Args[3] 18834 if x.Op != OpS390XMOVWBRstoreidx { 18835 break 18836 } 18837 if x.AuxInt != i-4 { 18838 break 18839 } 18840 if x.Aux != s { 18841 break 18842 } 18843 _ = x.Args[3] 18844 if p != x.Args[0] { 18845 break 18846 } 18847 if idx != x.Args[1] { 18848 break 18849 } 18850 w0 := x.Args[2] 18851 if w0.Op != OpS390XSRDconst { 18852 break 18853 } 18854 if w0.AuxInt != j-32 { 18855 break 18856 } 18857 if w != w0.Args[0] { 18858 break 18859 } 18860 mem := x.Args[3] 18861 if !(x.Uses == 1 && clobber(x)) { 18862 break 18863 } 18864 v.reset(OpS390XMOVDBRstoreidx) 18865 v.AuxInt = i - 4 18866 v.Aux = s 18867 v.AddArg(p) 18868 v.AddArg(idx) 18869 v.AddArg(w0) 18870 v.AddArg(mem) 18871 return true 18872 } 18873 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 18874 // cond: x.Uses == 1 && clobber(x) 18875 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 18876 for { 18877 i := v.AuxInt 18878 s := v.Aux 18879 _ = v.Args[3] 18880 idx := v.Args[0] 18881 p := v.Args[1] 18882 v_2 := v.Args[2] 18883 if v_2.Op != OpS390XSRDconst { 18884 break 18885 } 18886 j := v_2.AuxInt 18887 w := v_2.Args[0] 18888 x := v.Args[3] 18889 if x.Op != OpS390XMOVWBRstoreidx { 18890 break 18891 } 18892 if x.AuxInt != i-4 { 18893 break 18894 } 18895 if x.Aux != s { 18896 break 18897 } 18898 _ = x.Args[3] 18899 if idx != x.Args[0] { 18900 break 18901 } 18902 if p != x.Args[1] { 18903 break 18904 } 18905 w0 := x.Args[2] 18906 if w0.Op != OpS390XSRDconst { 18907 break 18908 } 18909 if w0.AuxInt != j-32 { 18910 break 18911 } 18912 if w != w0.Args[0] { 18913 break 18914 } 18915 mem := x.Args[3] 18916 if !(x.Uses == 1 && clobber(x)) { 18917 break 18918 } 18919 v.reset(OpS390XMOVDBRstoreidx) 18920 v.AuxInt = i - 4 18921 v.Aux = s 18922 v.AddArg(p) 18923 v.AddArg(idx) 18924 v.AddArg(w0) 18925 v.AddArg(mem) 18926 return true 18927 } 18928 return false 18929 } 18930 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 18931 // match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 18932 // cond: isSamePtr(ptr1, ptr2) 18933 // result: (MOVWZreg x) 18934 for { 18935 off := v.AuxInt 18936 sym := v.Aux 18937 _ = v.Args[1] 18938 ptr1 := v.Args[0] 18939 v_1 := v.Args[1] 18940 if v_1.Op != OpS390XMOVWstore { 18941 break 18942 } 18943 if v_1.AuxInt != off { 18944 break 18945 } 18946 if v_1.Aux != sym { 18947 break 18948 } 18949 _ = v_1.Args[2] 18950 ptr2 := v_1.Args[0] 18951 x := v_1.Args[1] 18952 if !(isSamePtr(ptr1, ptr2)) { 18953 break 18954 } 18955 v.reset(OpS390XMOVWZreg) 18956 v.AddArg(x) 18957 return true 18958 } 18959 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 18960 // cond: is20Bit(off1+off2) 18961 // result: (MOVWZload [off1+off2] {sym} ptr mem) 18962 for { 18963 off1 := v.AuxInt 18964 sym := v.Aux 18965 _ = v.Args[1] 18966 v_0 := v.Args[0] 18967 if v_0.Op != OpS390XADDconst { 18968 break 18969 } 18970 off2 := v_0.AuxInt 18971 ptr := v_0.Args[0] 18972 mem := v.Args[1] 18973 if !(is20Bit(off1 + off2)) { 18974 break 18975 } 18976 v.reset(OpS390XMOVWZload) 18977 v.AuxInt = off1 + off2 18978 v.Aux = sym 18979 v.AddArg(ptr) 18980 v.AddArg(mem) 18981 return true 18982 } 18983 // match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 18984 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 18985 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 18986 for { 18987 off1 := v.AuxInt 18988 sym1 := v.Aux 18989 _ = v.Args[1] 18990 v_0 := v.Args[0] 18991 if v_0.Op != OpS390XMOVDaddr { 18992 break 18993 } 18994 t := v_0.Type 18995 off2 := v_0.AuxInt 18996 sym2 := v_0.Aux 18997 base := v_0.Args[0] 18998 mem := v.Args[1] 18999 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 19000 break 19001 } 19002 v.reset(OpS390XMOVWZload) 19003 v.AuxInt = off1 + off2 19004 v.Aux = mergeSym(sym1, sym2) 19005 v.AddArg(base) 19006 v.AddArg(mem) 19007 return true 19008 } 19009 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 19010 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 19011 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 19012 for { 19013 off1 := v.AuxInt 19014 sym1 := v.Aux 19015 _ = v.Args[1] 19016 v_0 := v.Args[0] 19017 if v_0.Op != OpS390XMOVDaddridx { 19018 break 19019 } 19020 off2 := v_0.AuxInt 19021 sym2 := v_0.Aux 19022 _ = v_0.Args[1] 19023 ptr := v_0.Args[0] 19024 idx := v_0.Args[1] 19025 mem := v.Args[1] 19026 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 19027 break 19028 } 19029 v.reset(OpS390XMOVWZloadidx) 19030 v.AuxInt = off1 + off2 19031 v.Aux = mergeSym(sym1, sym2) 19032 v.AddArg(ptr) 19033 v.AddArg(idx) 19034 v.AddArg(mem) 19035 return true 19036 } 19037 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 19038 // cond: ptr.Op != OpSB 19039 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 19040 for { 19041 off := v.AuxInt 19042 sym := v.Aux 19043 _ = v.Args[1] 19044 v_0 := v.Args[0] 19045 if v_0.Op != OpS390XADD { 19046 break 19047 } 19048 _ = v_0.Args[1] 19049 ptr := v_0.Args[0] 19050 idx := v_0.Args[1] 19051 mem := v.Args[1] 19052 if !(ptr.Op != OpSB) { 19053 break 19054 } 19055 v.reset(OpS390XMOVWZloadidx) 19056 v.AuxInt = off 19057 v.Aux = sym 19058 v.AddArg(ptr) 19059 v.AddArg(idx) 19060 v.AddArg(mem) 19061 return true 19062 } 19063 return false 19064 } 19065 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 19066 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 19067 // cond: is20Bit(c+d) 19068 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 19069 for { 19070 c := v.AuxInt 19071 sym := v.Aux 19072 _ = v.Args[2] 19073 v_0 := v.Args[0] 19074 if v_0.Op != OpS390XADDconst { 19075 break 19076 } 19077 d := v_0.AuxInt 19078 ptr := v_0.Args[0] 19079 idx := v.Args[1] 19080 mem := v.Args[2] 19081 if !(is20Bit(c + d)) { 19082 break 19083 } 19084 v.reset(OpS390XMOVWZloadidx) 19085 v.AuxInt = c + d 19086 v.Aux = sym 19087 v.AddArg(ptr) 19088 v.AddArg(idx) 19089 v.AddArg(mem) 19090 return true 19091 } 19092 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 19093 // cond: is20Bit(c+d) 19094 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 19095 for { 19096 c := v.AuxInt 19097 sym := v.Aux 19098 _ = v.Args[2] 19099 idx := v.Args[0] 19100 v_1 := v.Args[1] 19101 if v_1.Op != OpS390XADDconst { 19102 break 19103 } 19104 d := v_1.AuxInt 19105 ptr := v_1.Args[0] 19106 mem := v.Args[2] 19107 if !(is20Bit(c + d)) { 19108 break 19109 } 19110 v.reset(OpS390XMOVWZloadidx) 19111 v.AuxInt = c + d 19112 v.Aux = sym 19113 v.AddArg(ptr) 19114 v.AddArg(idx) 19115 v.AddArg(mem) 19116 return true 19117 } 19118 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 19119 // cond: is20Bit(c+d) 19120 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 19121 for { 19122 c := v.AuxInt 19123 sym := v.Aux 19124 _ = v.Args[2] 19125 ptr := v.Args[0] 19126 v_1 := v.Args[1] 19127 if v_1.Op != OpS390XADDconst { 19128 break 19129 } 19130 d := v_1.AuxInt 19131 idx := v_1.Args[0] 19132 mem := v.Args[2] 19133 if !(is20Bit(c + d)) { 19134 break 19135 } 19136 v.reset(OpS390XMOVWZloadidx) 19137 v.AuxInt = c + d 19138 v.Aux = sym 19139 v.AddArg(ptr) 19140 v.AddArg(idx) 19141 v.AddArg(mem) 19142 return true 19143 } 19144 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 19145 // cond: is20Bit(c+d) 19146 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 19147 for { 19148 c := v.AuxInt 19149 sym := v.Aux 19150 _ = v.Args[2] 19151 v_0 := v.Args[0] 19152 if v_0.Op != OpS390XADDconst { 19153 break 19154 } 19155 d := v_0.AuxInt 19156 idx := v_0.Args[0] 19157 ptr := v.Args[1] 19158 mem := v.Args[2] 19159 if !(is20Bit(c + d)) { 19160 break 19161 } 19162 v.reset(OpS390XMOVWZloadidx) 19163 v.AuxInt = c + d 19164 v.Aux = sym 19165 v.AddArg(ptr) 19166 v.AddArg(idx) 19167 v.AddArg(mem) 19168 return true 19169 } 19170 return false 19171 } 19172 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 19173 b := v.Block 19174 _ = b 19175 // match: (MOVWZreg x:(MOVBZload _ _)) 19176 // cond: 19177 // result: (MOVDreg x) 19178 for { 19179 x := v.Args[0] 19180 if x.Op != OpS390XMOVBZload { 19181 break 19182 } 19183 _ = x.Args[1] 19184 v.reset(OpS390XMOVDreg) 19185 v.AddArg(x) 19186 return true 19187 } 19188 // match: (MOVWZreg x:(MOVHZload _ _)) 19189 // cond: 19190 // result: (MOVDreg x) 19191 for { 19192 x := v.Args[0] 19193 if x.Op != OpS390XMOVHZload { 19194 break 19195 } 19196 _ = x.Args[1] 19197 v.reset(OpS390XMOVDreg) 19198 v.AddArg(x) 19199 return true 19200 } 19201 // match: (MOVWZreg x:(MOVWZload _ _)) 19202 // cond: 19203 // result: (MOVDreg x) 19204 for { 19205 x := v.Args[0] 19206 if x.Op != OpS390XMOVWZload { 19207 break 19208 } 19209 _ = x.Args[1] 19210 v.reset(OpS390XMOVDreg) 19211 v.AddArg(x) 19212 return true 19213 } 19214 // match: (MOVWZreg x:(Arg <t>)) 19215 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 19216 // result: (MOVDreg x) 19217 for { 19218 x := v.Args[0] 19219 if x.Op != OpArg { 19220 break 19221 } 19222 t := x.Type 19223 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 19224 break 19225 } 19226 v.reset(OpS390XMOVDreg) 19227 v.AddArg(x) 19228 return true 19229 } 19230 // match: (MOVWZreg x:(MOVBZreg _)) 19231 // cond: 19232 // result: (MOVDreg x) 19233 for { 19234 x := v.Args[0] 19235 if x.Op != OpS390XMOVBZreg { 19236 break 19237 } 19238 v.reset(OpS390XMOVDreg) 19239 v.AddArg(x) 19240 return true 19241 } 19242 // match: (MOVWZreg x:(MOVHZreg _)) 19243 // cond: 19244 // result: (MOVDreg x) 19245 for { 19246 x := v.Args[0] 19247 if x.Op != OpS390XMOVHZreg { 19248 break 19249 } 19250 v.reset(OpS390XMOVDreg) 19251 v.AddArg(x) 19252 return true 19253 } 19254 // match: (MOVWZreg x:(MOVWZreg _)) 19255 // cond: 19256 // result: (MOVDreg x) 19257 for { 19258 x := v.Args[0] 19259 if x.Op != OpS390XMOVWZreg { 19260 break 19261 } 19262 v.reset(OpS390XMOVDreg) 19263 v.AddArg(x) 19264 return true 19265 } 19266 // match: (MOVWZreg (MOVDconst [c])) 19267 // cond: 19268 // result: (MOVDconst [int64(uint32(c))]) 19269 for { 19270 v_0 := v.Args[0] 19271 if v_0.Op != OpS390XMOVDconst { 19272 break 19273 } 19274 c := v_0.AuxInt 19275 v.reset(OpS390XMOVDconst) 19276 v.AuxInt = int64(uint32(c)) 19277 return true 19278 } 19279 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 19280 // cond: x.Uses == 1 && clobber(x) 19281 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 19282 for { 19283 x := v.Args[0] 19284 if x.Op != OpS390XMOVWZload { 19285 break 19286 } 19287 off := x.AuxInt 19288 sym := x.Aux 19289 _ = x.Args[1] 19290 ptr := x.Args[0] 19291 mem := x.Args[1] 19292 if !(x.Uses == 1 && clobber(x)) { 19293 break 19294 } 19295 b = x.Block 19296 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 19297 v.reset(OpCopy) 19298 v.AddArg(v0) 19299 v0.AuxInt = off 19300 v0.Aux = sym 19301 v0.AddArg(ptr) 19302 v0.AddArg(mem) 19303 return true 19304 } 19305 // match: (MOVWZreg x:(MOVWload [off] {sym} ptr mem)) 19306 // cond: x.Uses == 1 && clobber(x) 19307 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 19308 for { 19309 x := v.Args[0] 19310 if x.Op != OpS390XMOVWload { 19311 break 19312 } 19313 off := x.AuxInt 19314 sym := x.Aux 19315 _ = x.Args[1] 19316 ptr := x.Args[0] 19317 mem := x.Args[1] 19318 if !(x.Uses == 1 && clobber(x)) { 19319 break 19320 } 19321 b = x.Block 19322 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 19323 v.reset(OpCopy) 19324 v.AddArg(v0) 19325 v0.AuxInt = off 19326 v0.Aux = sym 19327 v0.AddArg(ptr) 19328 v0.AddArg(mem) 19329 return true 19330 } 19331 return false 19332 } 19333 func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { 19334 b := v.Block 19335 _ = b 19336 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 19337 // cond: x.Uses == 1 && clobber(x) 19338 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 19339 for { 19340 x := v.Args[0] 19341 if x.Op != OpS390XMOVWZloadidx { 19342 break 19343 } 19344 off := x.AuxInt 19345 sym := x.Aux 19346 _ = x.Args[2] 19347 ptr := x.Args[0] 19348 idx := x.Args[1] 19349 mem := x.Args[2] 19350 if !(x.Uses == 1 && clobber(x)) { 19351 break 19352 } 19353 b = x.Block 19354 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 19355 v.reset(OpCopy) 19356 v.AddArg(v0) 19357 v0.AuxInt = off 19358 v0.Aux = sym 19359 v0.AddArg(ptr) 19360 v0.AddArg(idx) 19361 v0.AddArg(mem) 19362 return true 19363 } 19364 // match: (MOVWZreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 19365 // cond: x.Uses == 1 && clobber(x) 19366 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 19367 for { 19368 x := v.Args[0] 19369 if x.Op != OpS390XMOVWloadidx { 19370 break 19371 } 19372 off := x.AuxInt 19373 sym := x.Aux 19374 _ = x.Args[2] 19375 ptr := x.Args[0] 19376 idx := x.Args[1] 19377 mem := x.Args[2] 19378 if !(x.Uses == 1 && clobber(x)) { 19379 break 19380 } 19381 b = x.Block 19382 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 19383 v.reset(OpCopy) 19384 v.AddArg(v0) 19385 v0.AuxInt = off 19386 v0.Aux = sym 19387 v0.AddArg(ptr) 19388 v0.AddArg(idx) 19389 v0.AddArg(mem) 19390 return true 19391 } 19392 return false 19393 } 19394 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 19395 // match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) 19396 // cond: isSamePtr(ptr1, ptr2) 19397 // result: (MOVWreg x) 19398 for { 19399 off := v.AuxInt 19400 sym := v.Aux 19401 _ = v.Args[1] 19402 ptr1 := v.Args[0] 19403 v_1 := v.Args[1] 19404 if v_1.Op != OpS390XMOVWstore { 19405 break 19406 } 19407 if v_1.AuxInt != off { 19408 break 19409 } 19410 if v_1.Aux != sym { 19411 break 19412 } 19413 _ = v_1.Args[2] 19414 ptr2 := v_1.Args[0] 19415 x := v_1.Args[1] 19416 if !(isSamePtr(ptr1, ptr2)) { 19417 break 19418 } 19419 v.reset(OpS390XMOVWreg) 19420 v.AddArg(x) 19421 return true 19422 } 19423 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 19424 // cond: is20Bit(off1+off2) 19425 // result: (MOVWload [off1+off2] {sym} ptr mem) 19426 for { 19427 off1 := v.AuxInt 19428 sym := v.Aux 19429 _ = v.Args[1] 19430 v_0 := v.Args[0] 19431 if v_0.Op != OpS390XADDconst { 19432 break 19433 } 19434 off2 := v_0.AuxInt 19435 ptr := v_0.Args[0] 19436 mem := v.Args[1] 19437 if !(is20Bit(off1 + off2)) { 19438 break 19439 } 19440 v.reset(OpS390XMOVWload) 19441 v.AuxInt = off1 + off2 19442 v.Aux = sym 19443 v.AddArg(ptr) 19444 v.AddArg(mem) 19445 return true 19446 } 19447 // match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 19448 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 19449 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 19450 for { 19451 off1 := v.AuxInt 19452 sym1 := v.Aux 19453 _ = v.Args[1] 19454 v_0 := v.Args[0] 19455 if v_0.Op != OpS390XMOVDaddr { 19456 break 19457 } 19458 t := v_0.Type 19459 off2 := v_0.AuxInt 19460 sym2 := v_0.Aux 19461 base := v_0.Args[0] 19462 mem := v.Args[1] 19463 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 19464 break 19465 } 19466 v.reset(OpS390XMOVWload) 19467 v.AuxInt = off1 + off2 19468 v.Aux = mergeSym(sym1, sym2) 19469 v.AddArg(base) 19470 v.AddArg(mem) 19471 return true 19472 } 19473 // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 19474 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 19475 // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 19476 for { 19477 off1 := v.AuxInt 19478 sym1 := v.Aux 19479 _ = v.Args[1] 19480 v_0 := v.Args[0] 19481 if v_0.Op != OpS390XMOVDaddridx { 19482 break 19483 } 19484 off2 := v_0.AuxInt 19485 sym2 := v_0.Aux 19486 _ = v_0.Args[1] 19487 ptr := v_0.Args[0] 19488 idx := v_0.Args[1] 19489 mem := v.Args[1] 19490 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 19491 break 19492 } 19493 v.reset(OpS390XMOVWloadidx) 19494 v.AuxInt = off1 + off2 19495 v.Aux = mergeSym(sym1, sym2) 19496 v.AddArg(ptr) 19497 v.AddArg(idx) 19498 v.AddArg(mem) 19499 return true 19500 } 19501 // match: (MOVWload [off] {sym} (ADD ptr idx) mem) 19502 // cond: ptr.Op != OpSB 19503 // result: (MOVWloadidx [off] {sym} ptr idx mem) 19504 for { 19505 off := v.AuxInt 19506 sym := v.Aux 19507 _ = v.Args[1] 19508 v_0 := v.Args[0] 19509 if v_0.Op != OpS390XADD { 19510 break 19511 } 19512 _ = v_0.Args[1] 19513 ptr := v_0.Args[0] 19514 idx := v_0.Args[1] 19515 mem := v.Args[1] 19516 if !(ptr.Op != OpSB) { 19517 break 19518 } 19519 v.reset(OpS390XMOVWloadidx) 19520 v.AuxInt = off 19521 v.Aux = sym 19522 v.AddArg(ptr) 19523 v.AddArg(idx) 19524 v.AddArg(mem) 19525 return true 19526 } 19527 return false 19528 } 19529 func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { 19530 // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 19531 // cond: is20Bit(c+d) 19532 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 19533 for { 19534 c := v.AuxInt 19535 sym := v.Aux 19536 _ = v.Args[2] 19537 v_0 := v.Args[0] 19538 if v_0.Op != OpS390XADDconst { 19539 break 19540 } 19541 d := v_0.AuxInt 19542 ptr := v_0.Args[0] 19543 idx := v.Args[1] 19544 mem := v.Args[2] 19545 if !(is20Bit(c + d)) { 19546 break 19547 } 19548 v.reset(OpS390XMOVWloadidx) 19549 v.AuxInt = c + d 19550 v.Aux = sym 19551 v.AddArg(ptr) 19552 v.AddArg(idx) 19553 v.AddArg(mem) 19554 return true 19555 } 19556 // match: (MOVWloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 19557 // cond: is20Bit(c+d) 19558 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 19559 for { 19560 c := v.AuxInt 19561 sym := v.Aux 19562 _ = v.Args[2] 19563 idx := v.Args[0] 19564 v_1 := v.Args[1] 19565 if v_1.Op != OpS390XADDconst { 19566 break 19567 } 19568 d := v_1.AuxInt 19569 ptr := v_1.Args[0] 19570 mem := v.Args[2] 19571 if !(is20Bit(c + d)) { 19572 break 19573 } 19574 v.reset(OpS390XMOVWloadidx) 19575 v.AuxInt = c + d 19576 v.Aux = sym 19577 v.AddArg(ptr) 19578 v.AddArg(idx) 19579 v.AddArg(mem) 19580 return true 19581 } 19582 // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 19583 // cond: is20Bit(c+d) 19584 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 19585 for { 19586 c := v.AuxInt 19587 sym := v.Aux 19588 _ = v.Args[2] 19589 ptr := v.Args[0] 19590 v_1 := v.Args[1] 19591 if v_1.Op != OpS390XADDconst { 19592 break 19593 } 19594 d := v_1.AuxInt 19595 idx := v_1.Args[0] 19596 mem := v.Args[2] 19597 if !(is20Bit(c + d)) { 19598 break 19599 } 19600 v.reset(OpS390XMOVWloadidx) 19601 v.AuxInt = c + d 19602 v.Aux = sym 19603 v.AddArg(ptr) 19604 v.AddArg(idx) 19605 v.AddArg(mem) 19606 return true 19607 } 19608 // match: (MOVWloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 19609 // cond: is20Bit(c+d) 19610 // result: (MOVWloadidx [c+d] {sym} ptr idx mem) 19611 for { 19612 c := v.AuxInt 19613 sym := v.Aux 19614 _ = v.Args[2] 19615 v_0 := v.Args[0] 19616 if v_0.Op != OpS390XADDconst { 19617 break 19618 } 19619 d := v_0.AuxInt 19620 idx := v_0.Args[0] 19621 ptr := v.Args[1] 19622 mem := v.Args[2] 19623 if !(is20Bit(c + d)) { 19624 break 19625 } 19626 v.reset(OpS390XMOVWloadidx) 19627 v.AuxInt = c + d 19628 v.Aux = sym 19629 v.AddArg(ptr) 19630 v.AddArg(idx) 19631 v.AddArg(mem) 19632 return true 19633 } 19634 return false 19635 } 19636 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 19637 // match: (MOVWreg x:(MOVBload _ _)) 19638 // cond: 19639 // result: (MOVDreg x) 19640 for { 19641 x := v.Args[0] 19642 if x.Op != OpS390XMOVBload { 19643 break 19644 } 19645 _ = x.Args[1] 19646 v.reset(OpS390XMOVDreg) 19647 v.AddArg(x) 19648 return true 19649 } 19650 // match: (MOVWreg x:(MOVBZload _ _)) 19651 // cond: 19652 // result: (MOVDreg x) 19653 for { 19654 x := v.Args[0] 19655 if x.Op != OpS390XMOVBZload { 19656 break 19657 } 19658 _ = x.Args[1] 19659 v.reset(OpS390XMOVDreg) 19660 v.AddArg(x) 19661 return true 19662 } 19663 // match: (MOVWreg x:(MOVHload _ _)) 19664 // cond: 19665 // result: (MOVDreg x) 19666 for { 19667 x := v.Args[0] 19668 if x.Op != OpS390XMOVHload { 19669 break 19670 } 19671 _ = x.Args[1] 19672 v.reset(OpS390XMOVDreg) 19673 v.AddArg(x) 19674 return true 19675 } 19676 // match: (MOVWreg x:(MOVHZload _ _)) 19677 // cond: 19678 // result: (MOVDreg x) 19679 for { 19680 x := v.Args[0] 19681 if x.Op != OpS390XMOVHZload { 19682 break 19683 } 19684 _ = x.Args[1] 19685 v.reset(OpS390XMOVDreg) 19686 v.AddArg(x) 19687 return true 19688 } 19689 // match: (MOVWreg x:(MOVWload _ _)) 19690 // cond: 19691 // result: (MOVDreg x) 19692 for { 19693 x := v.Args[0] 19694 if x.Op != OpS390XMOVWload { 19695 break 19696 } 19697 _ = x.Args[1] 19698 v.reset(OpS390XMOVDreg) 19699 v.AddArg(x) 19700 return true 19701 } 19702 // match: (MOVWreg x:(Arg <t>)) 19703 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 19704 // result: (MOVDreg x) 19705 for { 19706 x := v.Args[0] 19707 if x.Op != OpArg { 19708 break 19709 } 19710 t := x.Type 19711 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 19712 break 19713 } 19714 v.reset(OpS390XMOVDreg) 19715 v.AddArg(x) 19716 return true 19717 } 19718 // match: (MOVWreg x:(MOVBreg _)) 19719 // cond: 19720 // result: (MOVDreg x) 19721 for { 19722 x := v.Args[0] 19723 if x.Op != OpS390XMOVBreg { 19724 break 19725 } 19726 v.reset(OpS390XMOVDreg) 19727 v.AddArg(x) 19728 return true 19729 } 19730 // match: (MOVWreg x:(MOVBZreg _)) 19731 // cond: 19732 // result: (MOVDreg x) 19733 for { 19734 x := v.Args[0] 19735 if x.Op != OpS390XMOVBZreg { 19736 break 19737 } 19738 v.reset(OpS390XMOVDreg) 19739 v.AddArg(x) 19740 return true 19741 } 19742 // match: (MOVWreg x:(MOVHreg _)) 19743 // cond: 19744 // result: (MOVDreg x) 19745 for { 19746 x := v.Args[0] 19747 if x.Op != OpS390XMOVHreg { 19748 break 19749 } 19750 v.reset(OpS390XMOVDreg) 19751 v.AddArg(x) 19752 return true 19753 } 19754 // match: (MOVWreg x:(MOVHreg _)) 19755 // cond: 19756 // result: (MOVDreg x) 19757 for { 19758 x := v.Args[0] 19759 if x.Op != OpS390XMOVHreg { 19760 break 19761 } 19762 v.reset(OpS390XMOVDreg) 19763 v.AddArg(x) 19764 return true 19765 } 19766 return false 19767 } 19768 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 19769 b := v.Block 19770 _ = b 19771 // match: (MOVWreg x:(MOVWreg _)) 19772 // cond: 19773 // result: (MOVDreg x) 19774 for { 19775 x := v.Args[0] 19776 if x.Op != OpS390XMOVWreg { 19777 break 19778 } 19779 v.reset(OpS390XMOVDreg) 19780 v.AddArg(x) 19781 return true 19782 } 19783 // match: (MOVWreg (MOVDconst [c])) 19784 // cond: 19785 // result: (MOVDconst [int64(int32(c))]) 19786 for { 19787 v_0 := v.Args[0] 19788 if v_0.Op != OpS390XMOVDconst { 19789 break 19790 } 19791 c := v_0.AuxInt 19792 v.reset(OpS390XMOVDconst) 19793 v.AuxInt = int64(int32(c)) 19794 return true 19795 } 19796 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 19797 // cond: x.Uses == 1 && clobber(x) 19798 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 19799 for { 19800 x := v.Args[0] 19801 if x.Op != OpS390XMOVWZload { 19802 break 19803 } 19804 off := x.AuxInt 19805 sym := x.Aux 19806 _ = x.Args[1] 19807 ptr := x.Args[0] 19808 mem := x.Args[1] 19809 if !(x.Uses == 1 && clobber(x)) { 19810 break 19811 } 19812 b = x.Block 19813 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 19814 v.reset(OpCopy) 19815 v.AddArg(v0) 19816 v0.AuxInt = off 19817 v0.Aux = sym 19818 v0.AddArg(ptr) 19819 v0.AddArg(mem) 19820 return true 19821 } 19822 // match: (MOVWreg x:(MOVWload [off] {sym} ptr mem)) 19823 // cond: x.Uses == 1 && clobber(x) 19824 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 19825 for { 19826 x := v.Args[0] 19827 if x.Op != OpS390XMOVWload { 19828 break 19829 } 19830 off := x.AuxInt 19831 sym := x.Aux 19832 _ = x.Args[1] 19833 ptr := x.Args[0] 19834 mem := x.Args[1] 19835 if !(x.Uses == 1 && clobber(x)) { 19836 break 19837 } 19838 b = x.Block 19839 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 19840 v.reset(OpCopy) 19841 v.AddArg(v0) 19842 v0.AuxInt = off 19843 v0.Aux = sym 19844 v0.AddArg(ptr) 19845 v0.AddArg(mem) 19846 return true 19847 } 19848 // match: (MOVWreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 19849 // cond: x.Uses == 1 && clobber(x) 19850 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 19851 for { 19852 x := v.Args[0] 19853 if x.Op != OpS390XMOVWZloadidx { 19854 break 19855 } 19856 off := x.AuxInt 19857 sym := x.Aux 19858 _ = x.Args[2] 19859 ptr := x.Args[0] 19860 idx := x.Args[1] 19861 mem := x.Args[2] 19862 if !(x.Uses == 1 && clobber(x)) { 19863 break 19864 } 19865 b = x.Block 19866 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 19867 v.reset(OpCopy) 19868 v.AddArg(v0) 19869 v0.AuxInt = off 19870 v0.Aux = sym 19871 v0.AddArg(ptr) 19872 v0.AddArg(idx) 19873 v0.AddArg(mem) 19874 return true 19875 } 19876 // match: (MOVWreg x:(MOVWloadidx [off] {sym} ptr idx mem)) 19877 // cond: x.Uses == 1 && clobber(x) 19878 // result: @x.Block (MOVWloadidx <v.Type> [off] {sym} ptr idx mem) 19879 for { 19880 x := v.Args[0] 19881 if x.Op != OpS390XMOVWloadidx { 19882 break 19883 } 19884 off := x.AuxInt 19885 sym := x.Aux 19886 _ = x.Args[2] 19887 ptr := x.Args[0] 19888 idx := x.Args[1] 19889 mem := x.Args[2] 19890 if !(x.Uses == 1 && clobber(x)) { 19891 break 19892 } 19893 b = x.Block 19894 v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, v.Type) 19895 v.reset(OpCopy) 19896 v.AddArg(v0) 19897 v0.AuxInt = off 19898 v0.Aux = sym 19899 v0.AddArg(ptr) 19900 v0.AddArg(idx) 19901 v0.AddArg(mem) 19902 return true 19903 } 19904 return false 19905 } 19906 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 19907 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 19908 // cond: 19909 // result: (MOVWstore [off] {sym} ptr x mem) 19910 for { 19911 off := v.AuxInt 19912 sym := v.Aux 19913 _ = v.Args[2] 19914 ptr := v.Args[0] 19915 v_1 := v.Args[1] 19916 if v_1.Op != OpS390XMOVWreg { 19917 break 19918 } 19919 x := v_1.Args[0] 19920 mem := v.Args[2] 19921 v.reset(OpS390XMOVWstore) 19922 v.AuxInt = off 19923 v.Aux = sym 19924 v.AddArg(ptr) 19925 v.AddArg(x) 19926 v.AddArg(mem) 19927 return true 19928 } 19929 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 19930 // cond: 19931 // result: (MOVWstore [off] {sym} ptr x mem) 19932 for { 19933 off := v.AuxInt 19934 sym := v.Aux 19935 _ = v.Args[2] 19936 ptr := v.Args[0] 19937 v_1 := v.Args[1] 19938 if v_1.Op != OpS390XMOVWZreg { 19939 break 19940 } 19941 x := v_1.Args[0] 19942 mem := v.Args[2] 19943 v.reset(OpS390XMOVWstore) 19944 v.AuxInt = off 19945 v.Aux = sym 19946 v.AddArg(ptr) 19947 v.AddArg(x) 19948 v.AddArg(mem) 19949 return true 19950 } 19951 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 19952 // cond: is20Bit(off1+off2) 19953 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 19954 for { 19955 off1 := v.AuxInt 19956 sym := v.Aux 19957 _ = v.Args[2] 19958 v_0 := v.Args[0] 19959 if v_0.Op != OpS390XADDconst { 19960 break 19961 } 19962 off2 := v_0.AuxInt 19963 ptr := v_0.Args[0] 19964 val := v.Args[1] 19965 mem := v.Args[2] 19966 if !(is20Bit(off1 + off2)) { 19967 break 19968 } 19969 v.reset(OpS390XMOVWstore) 19970 v.AuxInt = off1 + off2 19971 v.Aux = sym 19972 v.AddArg(ptr) 19973 v.AddArg(val) 19974 v.AddArg(mem) 19975 return true 19976 } 19977 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 19978 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 19979 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 19980 for { 19981 off := v.AuxInt 19982 sym := v.Aux 19983 _ = v.Args[2] 19984 ptr := v.Args[0] 19985 v_1 := v.Args[1] 19986 if v_1.Op != OpS390XMOVDconst { 19987 break 19988 } 19989 c := v_1.AuxInt 19990 mem := v.Args[2] 19991 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 19992 break 19993 } 19994 v.reset(OpS390XMOVWstoreconst) 19995 v.AuxInt = makeValAndOff(int64(int32(c)), off) 19996 v.Aux = sym 19997 v.AddArg(ptr) 19998 v.AddArg(mem) 19999 return true 20000 } 20001 // match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 20002 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 20003 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 20004 for { 20005 off1 := v.AuxInt 20006 sym1 := v.Aux 20007 _ = v.Args[2] 20008 v_0 := v.Args[0] 20009 if v_0.Op != OpS390XMOVDaddr { 20010 break 20011 } 20012 t := v_0.Type 20013 off2 := v_0.AuxInt 20014 sym2 := v_0.Aux 20015 base := v_0.Args[0] 20016 val := v.Args[1] 20017 mem := v.Args[2] 20018 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 20019 break 20020 } 20021 v.reset(OpS390XMOVWstore) 20022 v.AuxInt = off1 + off2 20023 v.Aux = mergeSym(sym1, sym2) 20024 v.AddArg(base) 20025 v.AddArg(val) 20026 v.AddArg(mem) 20027 return true 20028 } 20029 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 20030 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 20031 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 20032 for { 20033 off1 := v.AuxInt 20034 sym1 := v.Aux 20035 _ = v.Args[2] 20036 v_0 := v.Args[0] 20037 if v_0.Op != OpS390XMOVDaddridx { 20038 break 20039 } 20040 off2 := v_0.AuxInt 20041 sym2 := v_0.Aux 20042 _ = v_0.Args[1] 20043 ptr := v_0.Args[0] 20044 idx := v_0.Args[1] 20045 val := v.Args[1] 20046 mem := v.Args[2] 20047 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 20048 break 20049 } 20050 v.reset(OpS390XMOVWstoreidx) 20051 v.AuxInt = off1 + off2 20052 v.Aux = mergeSym(sym1, sym2) 20053 v.AddArg(ptr) 20054 v.AddArg(idx) 20055 v.AddArg(val) 20056 v.AddArg(mem) 20057 return true 20058 } 20059 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 20060 // cond: ptr.Op != OpSB 20061 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 20062 for { 20063 off := v.AuxInt 20064 sym := v.Aux 20065 _ = v.Args[2] 20066 v_0 := v.Args[0] 20067 if v_0.Op != OpS390XADD { 20068 break 20069 } 20070 _ = v_0.Args[1] 20071 ptr := v_0.Args[0] 20072 idx := v_0.Args[1] 20073 val := v.Args[1] 20074 mem := v.Args[2] 20075 if !(ptr.Op != OpSB) { 20076 break 20077 } 20078 v.reset(OpS390XMOVWstoreidx) 20079 v.AuxInt = off 20080 v.Aux = sym 20081 v.AddArg(ptr) 20082 v.AddArg(idx) 20083 v.AddArg(val) 20084 v.AddArg(mem) 20085 return true 20086 } 20087 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 20088 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 20089 // result: (MOVDstore [i-4] {s} p w mem) 20090 for { 20091 i := v.AuxInt 20092 s := v.Aux 20093 _ = v.Args[2] 20094 p := v.Args[0] 20095 v_1 := v.Args[1] 20096 if v_1.Op != OpS390XSRDconst { 20097 break 20098 } 20099 if v_1.AuxInt != 32 { 20100 break 20101 } 20102 w := v_1.Args[0] 20103 x := v.Args[2] 20104 if x.Op != OpS390XMOVWstore { 20105 break 20106 } 20107 if x.AuxInt != i-4 { 20108 break 20109 } 20110 if x.Aux != s { 20111 break 20112 } 20113 _ = x.Args[2] 20114 if p != x.Args[0] { 20115 break 20116 } 20117 if w != x.Args[1] { 20118 break 20119 } 20120 mem := x.Args[2] 20121 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 20122 break 20123 } 20124 v.reset(OpS390XMOVDstore) 20125 v.AuxInt = i - 4 20126 v.Aux = s 20127 v.AddArg(p) 20128 v.AddArg(w) 20129 v.AddArg(mem) 20130 return true 20131 } 20132 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 20133 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 20134 // result: (MOVDstore [i-4] {s} p w0 mem) 20135 for { 20136 i := v.AuxInt 20137 s := v.Aux 20138 _ = v.Args[2] 20139 p := v.Args[0] 20140 w0 := v.Args[1] 20141 if w0.Op != OpS390XSRDconst { 20142 break 20143 } 20144 j := w0.AuxInt 20145 w := w0.Args[0] 20146 x := v.Args[2] 20147 if x.Op != OpS390XMOVWstore { 20148 break 20149 } 20150 if x.AuxInt != i-4 { 20151 break 20152 } 20153 if x.Aux != s { 20154 break 20155 } 20156 _ = x.Args[2] 20157 if p != x.Args[0] { 20158 break 20159 } 20160 x_1 := x.Args[1] 20161 if x_1.Op != OpS390XSRDconst { 20162 break 20163 } 20164 if x_1.AuxInt != j+32 { 20165 break 20166 } 20167 if w != x_1.Args[0] { 20168 break 20169 } 20170 mem := x.Args[2] 20171 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 20172 break 20173 } 20174 v.reset(OpS390XMOVDstore) 20175 v.AuxInt = i - 4 20176 v.Aux = s 20177 v.AddArg(p) 20178 v.AddArg(w0) 20179 v.AddArg(mem) 20180 return true 20181 } 20182 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 20183 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 20184 // result: (STM2 [i-4] {s} p w0 w1 mem) 20185 for { 20186 i := v.AuxInt 20187 s := v.Aux 20188 _ = v.Args[2] 20189 p := v.Args[0] 20190 w1 := v.Args[1] 20191 x := v.Args[2] 20192 if x.Op != OpS390XMOVWstore { 20193 break 20194 } 20195 if x.AuxInt != i-4 { 20196 break 20197 } 20198 if x.Aux != s { 20199 break 20200 } 20201 _ = x.Args[2] 20202 if p != x.Args[0] { 20203 break 20204 } 20205 w0 := x.Args[1] 20206 mem := x.Args[2] 20207 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 20208 break 20209 } 20210 v.reset(OpS390XSTM2) 20211 v.AuxInt = i - 4 20212 v.Aux = s 20213 v.AddArg(p) 20214 v.AddArg(w0) 20215 v.AddArg(w1) 20216 v.AddArg(mem) 20217 return true 20218 } 20219 return false 20220 } 20221 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 20222 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 20223 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 20224 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 20225 for { 20226 i := v.AuxInt 20227 s := v.Aux 20228 _ = v.Args[2] 20229 p := v.Args[0] 20230 w2 := v.Args[1] 20231 x := v.Args[2] 20232 if x.Op != OpS390XSTM2 { 20233 break 20234 } 20235 if x.AuxInt != i-8 { 20236 break 20237 } 20238 if x.Aux != s { 20239 break 20240 } 20241 _ = x.Args[3] 20242 if p != x.Args[0] { 20243 break 20244 } 20245 w0 := x.Args[1] 20246 w1 := x.Args[2] 20247 mem := x.Args[3] 20248 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 20249 break 20250 } 20251 v.reset(OpS390XSTM3) 20252 v.AuxInt = i - 8 20253 v.Aux = s 20254 v.AddArg(p) 20255 v.AddArg(w0) 20256 v.AddArg(w1) 20257 v.AddArg(w2) 20258 v.AddArg(mem) 20259 return true 20260 } 20261 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 20262 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 20263 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 20264 for { 20265 i := v.AuxInt 20266 s := v.Aux 20267 _ = v.Args[2] 20268 p := v.Args[0] 20269 w3 := v.Args[1] 20270 x := v.Args[2] 20271 if x.Op != OpS390XSTM3 { 20272 break 20273 } 20274 if x.AuxInt != i-12 { 20275 break 20276 } 20277 if x.Aux != s { 20278 break 20279 } 20280 _ = x.Args[4] 20281 if p != x.Args[0] { 20282 break 20283 } 20284 w0 := x.Args[1] 20285 w1 := x.Args[2] 20286 w2 := x.Args[3] 20287 mem := x.Args[4] 20288 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 20289 break 20290 } 20291 v.reset(OpS390XSTM4) 20292 v.AuxInt = i - 12 20293 v.Aux = s 20294 v.AddArg(p) 20295 v.AddArg(w0) 20296 v.AddArg(w1) 20297 v.AddArg(w2) 20298 v.AddArg(w3) 20299 v.AddArg(mem) 20300 return true 20301 } 20302 return false 20303 } 20304 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 20305 b := v.Block 20306 _ = b 20307 typ := &b.Func.Config.Types 20308 _ = typ 20309 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 20310 // cond: isU12Bit(ValAndOff(sc).Off()+off) 20311 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 20312 for { 20313 sc := v.AuxInt 20314 s := v.Aux 20315 _ = v.Args[1] 20316 v_0 := v.Args[0] 20317 if v_0.Op != OpS390XADDconst { 20318 break 20319 } 20320 off := v_0.AuxInt 20321 ptr := v_0.Args[0] 20322 mem := v.Args[1] 20323 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 20324 break 20325 } 20326 v.reset(OpS390XMOVWstoreconst) 20327 v.AuxInt = ValAndOff(sc).add(off) 20328 v.Aux = s 20329 v.AddArg(ptr) 20330 v.AddArg(mem) 20331 return true 20332 } 20333 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 20334 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 20335 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 20336 for { 20337 sc := v.AuxInt 20338 sym1 := v.Aux 20339 _ = v.Args[1] 20340 v_0 := v.Args[0] 20341 if v_0.Op != OpS390XMOVDaddr { 20342 break 20343 } 20344 off := v_0.AuxInt 20345 sym2 := v_0.Aux 20346 ptr := v_0.Args[0] 20347 mem := v.Args[1] 20348 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 20349 break 20350 } 20351 v.reset(OpS390XMOVWstoreconst) 20352 v.AuxInt = ValAndOff(sc).add(off) 20353 v.Aux = mergeSym(sym1, sym2) 20354 v.AddArg(ptr) 20355 v.AddArg(mem) 20356 return true 20357 } 20358 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 20359 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 20360 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 20361 for { 20362 c := v.AuxInt 20363 s := v.Aux 20364 _ = v.Args[1] 20365 p := v.Args[0] 20366 x := v.Args[1] 20367 if x.Op != OpS390XMOVWstoreconst { 20368 break 20369 } 20370 a := x.AuxInt 20371 if x.Aux != s { 20372 break 20373 } 20374 _ = x.Args[1] 20375 if p != x.Args[0] { 20376 break 20377 } 20378 mem := x.Args[1] 20379 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 20380 break 20381 } 20382 v.reset(OpS390XMOVDstore) 20383 v.AuxInt = ValAndOff(a).Off() 20384 v.Aux = s 20385 v.AddArg(p) 20386 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 20387 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 20388 v.AddArg(v0) 20389 v.AddArg(mem) 20390 return true 20391 } 20392 return false 20393 } 20394 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 20395 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 20396 // cond: is20Bit(c+d) 20397 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 20398 for { 20399 c := v.AuxInt 20400 sym := v.Aux 20401 _ = v.Args[3] 20402 v_0 := v.Args[0] 20403 if v_0.Op != OpS390XADDconst { 20404 break 20405 } 20406 d := v_0.AuxInt 20407 ptr := v_0.Args[0] 20408 idx := v.Args[1] 20409 val := v.Args[2] 20410 mem := v.Args[3] 20411 if !(is20Bit(c + d)) { 20412 break 20413 } 20414 v.reset(OpS390XMOVWstoreidx) 20415 v.AuxInt = c + d 20416 v.Aux = sym 20417 v.AddArg(ptr) 20418 v.AddArg(idx) 20419 v.AddArg(val) 20420 v.AddArg(mem) 20421 return true 20422 } 20423 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 20424 // cond: is20Bit(c+d) 20425 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 20426 for { 20427 c := v.AuxInt 20428 sym := v.Aux 20429 _ = v.Args[3] 20430 idx := v.Args[0] 20431 v_1 := v.Args[1] 20432 if v_1.Op != OpS390XADDconst { 20433 break 20434 } 20435 d := v_1.AuxInt 20436 ptr := v_1.Args[0] 20437 val := v.Args[2] 20438 mem := v.Args[3] 20439 if !(is20Bit(c + d)) { 20440 break 20441 } 20442 v.reset(OpS390XMOVWstoreidx) 20443 v.AuxInt = c + d 20444 v.Aux = sym 20445 v.AddArg(ptr) 20446 v.AddArg(idx) 20447 v.AddArg(val) 20448 v.AddArg(mem) 20449 return true 20450 } 20451 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 20452 // cond: is20Bit(c+d) 20453 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 20454 for { 20455 c := v.AuxInt 20456 sym := v.Aux 20457 _ = v.Args[3] 20458 ptr := v.Args[0] 20459 v_1 := v.Args[1] 20460 if v_1.Op != OpS390XADDconst { 20461 break 20462 } 20463 d := v_1.AuxInt 20464 idx := v_1.Args[0] 20465 val := v.Args[2] 20466 mem := v.Args[3] 20467 if !(is20Bit(c + d)) { 20468 break 20469 } 20470 v.reset(OpS390XMOVWstoreidx) 20471 v.AuxInt = c + d 20472 v.Aux = sym 20473 v.AddArg(ptr) 20474 v.AddArg(idx) 20475 v.AddArg(val) 20476 v.AddArg(mem) 20477 return true 20478 } 20479 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 20480 // cond: is20Bit(c+d) 20481 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 20482 for { 20483 c := v.AuxInt 20484 sym := v.Aux 20485 _ = v.Args[3] 20486 v_0 := v.Args[0] 20487 if v_0.Op != OpS390XADDconst { 20488 break 20489 } 20490 d := v_0.AuxInt 20491 idx := v_0.Args[0] 20492 ptr := v.Args[1] 20493 val := v.Args[2] 20494 mem := v.Args[3] 20495 if !(is20Bit(c + d)) { 20496 break 20497 } 20498 v.reset(OpS390XMOVWstoreidx) 20499 v.AuxInt = c + d 20500 v.Aux = sym 20501 v.AddArg(ptr) 20502 v.AddArg(idx) 20503 v.AddArg(val) 20504 v.AddArg(mem) 20505 return true 20506 } 20507 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 20508 // cond: x.Uses == 1 && clobber(x) 20509 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 20510 for { 20511 i := v.AuxInt 20512 s := v.Aux 20513 _ = v.Args[3] 20514 p := v.Args[0] 20515 idx := v.Args[1] 20516 w := v.Args[2] 20517 x := v.Args[3] 20518 if x.Op != OpS390XMOVWstoreidx { 20519 break 20520 } 20521 if x.AuxInt != i-4 { 20522 break 20523 } 20524 if x.Aux != s { 20525 break 20526 } 20527 _ = x.Args[3] 20528 if p != x.Args[0] { 20529 break 20530 } 20531 if idx != x.Args[1] { 20532 break 20533 } 20534 x_2 := x.Args[2] 20535 if x_2.Op != OpS390XSRDconst { 20536 break 20537 } 20538 if x_2.AuxInt != 32 { 20539 break 20540 } 20541 if w != x_2.Args[0] { 20542 break 20543 } 20544 mem := x.Args[3] 20545 if !(x.Uses == 1 && clobber(x)) { 20546 break 20547 } 20548 v.reset(OpS390XMOVDstoreidx) 20549 v.AuxInt = i - 4 20550 v.Aux = s 20551 v.AddArg(p) 20552 v.AddArg(idx) 20553 v.AddArg(w) 20554 v.AddArg(mem) 20555 return true 20556 } 20557 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 20558 // cond: x.Uses == 1 && clobber(x) 20559 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 20560 for { 20561 i := v.AuxInt 20562 s := v.Aux 20563 _ = v.Args[3] 20564 p := v.Args[0] 20565 idx := v.Args[1] 20566 w := v.Args[2] 20567 x := v.Args[3] 20568 if x.Op != OpS390XMOVWstoreidx { 20569 break 20570 } 20571 if x.AuxInt != i-4 { 20572 break 20573 } 20574 if x.Aux != s { 20575 break 20576 } 20577 _ = x.Args[3] 20578 if idx != x.Args[0] { 20579 break 20580 } 20581 if p != x.Args[1] { 20582 break 20583 } 20584 x_2 := x.Args[2] 20585 if x_2.Op != OpS390XSRDconst { 20586 break 20587 } 20588 if x_2.AuxInt != 32 { 20589 break 20590 } 20591 if w != x_2.Args[0] { 20592 break 20593 } 20594 mem := x.Args[3] 20595 if !(x.Uses == 1 && clobber(x)) { 20596 break 20597 } 20598 v.reset(OpS390XMOVDstoreidx) 20599 v.AuxInt = i - 4 20600 v.Aux = s 20601 v.AddArg(p) 20602 v.AddArg(idx) 20603 v.AddArg(w) 20604 v.AddArg(mem) 20605 return true 20606 } 20607 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 20608 // cond: x.Uses == 1 && clobber(x) 20609 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 20610 for { 20611 i := v.AuxInt 20612 s := v.Aux 20613 _ = v.Args[3] 20614 idx := v.Args[0] 20615 p := v.Args[1] 20616 w := v.Args[2] 20617 x := v.Args[3] 20618 if x.Op != OpS390XMOVWstoreidx { 20619 break 20620 } 20621 if x.AuxInt != i-4 { 20622 break 20623 } 20624 if x.Aux != s { 20625 break 20626 } 20627 _ = x.Args[3] 20628 if p != x.Args[0] { 20629 break 20630 } 20631 if idx != x.Args[1] { 20632 break 20633 } 20634 x_2 := x.Args[2] 20635 if x_2.Op != OpS390XSRDconst { 20636 break 20637 } 20638 if x_2.AuxInt != 32 { 20639 break 20640 } 20641 if w != x_2.Args[0] { 20642 break 20643 } 20644 mem := x.Args[3] 20645 if !(x.Uses == 1 && clobber(x)) { 20646 break 20647 } 20648 v.reset(OpS390XMOVDstoreidx) 20649 v.AuxInt = i - 4 20650 v.Aux = s 20651 v.AddArg(p) 20652 v.AddArg(idx) 20653 v.AddArg(w) 20654 v.AddArg(mem) 20655 return true 20656 } 20657 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 20658 // cond: x.Uses == 1 && clobber(x) 20659 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 20660 for { 20661 i := v.AuxInt 20662 s := v.Aux 20663 _ = v.Args[3] 20664 idx := v.Args[0] 20665 p := v.Args[1] 20666 w := v.Args[2] 20667 x := v.Args[3] 20668 if x.Op != OpS390XMOVWstoreidx { 20669 break 20670 } 20671 if x.AuxInt != i-4 { 20672 break 20673 } 20674 if x.Aux != s { 20675 break 20676 } 20677 _ = x.Args[3] 20678 if idx != x.Args[0] { 20679 break 20680 } 20681 if p != x.Args[1] { 20682 break 20683 } 20684 x_2 := x.Args[2] 20685 if x_2.Op != OpS390XSRDconst { 20686 break 20687 } 20688 if x_2.AuxInt != 32 { 20689 break 20690 } 20691 if w != x_2.Args[0] { 20692 break 20693 } 20694 mem := x.Args[3] 20695 if !(x.Uses == 1 && clobber(x)) { 20696 break 20697 } 20698 v.reset(OpS390XMOVDstoreidx) 20699 v.AuxInt = i - 4 20700 v.Aux = s 20701 v.AddArg(p) 20702 v.AddArg(idx) 20703 v.AddArg(w) 20704 v.AddArg(mem) 20705 return true 20706 } 20707 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 20708 // cond: x.Uses == 1 && clobber(x) 20709 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 20710 for { 20711 i := v.AuxInt 20712 s := v.Aux 20713 _ = v.Args[3] 20714 p := v.Args[0] 20715 idx := v.Args[1] 20716 w0 := v.Args[2] 20717 if w0.Op != OpS390XSRDconst { 20718 break 20719 } 20720 j := w0.AuxInt 20721 w := w0.Args[0] 20722 x := v.Args[3] 20723 if x.Op != OpS390XMOVWstoreidx { 20724 break 20725 } 20726 if x.AuxInt != i-4 { 20727 break 20728 } 20729 if x.Aux != s { 20730 break 20731 } 20732 _ = x.Args[3] 20733 if p != x.Args[0] { 20734 break 20735 } 20736 if idx != x.Args[1] { 20737 break 20738 } 20739 x_2 := x.Args[2] 20740 if x_2.Op != OpS390XSRDconst { 20741 break 20742 } 20743 if x_2.AuxInt != j+32 { 20744 break 20745 } 20746 if w != x_2.Args[0] { 20747 break 20748 } 20749 mem := x.Args[3] 20750 if !(x.Uses == 1 && clobber(x)) { 20751 break 20752 } 20753 v.reset(OpS390XMOVDstoreidx) 20754 v.AuxInt = i - 4 20755 v.Aux = s 20756 v.AddArg(p) 20757 v.AddArg(idx) 20758 v.AddArg(w0) 20759 v.AddArg(mem) 20760 return true 20761 } 20762 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 20763 // cond: x.Uses == 1 && clobber(x) 20764 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 20765 for { 20766 i := v.AuxInt 20767 s := v.Aux 20768 _ = v.Args[3] 20769 p := v.Args[0] 20770 idx := v.Args[1] 20771 w0 := v.Args[2] 20772 if w0.Op != OpS390XSRDconst { 20773 break 20774 } 20775 j := w0.AuxInt 20776 w := w0.Args[0] 20777 x := v.Args[3] 20778 if x.Op != OpS390XMOVWstoreidx { 20779 break 20780 } 20781 if x.AuxInt != i-4 { 20782 break 20783 } 20784 if x.Aux != s { 20785 break 20786 } 20787 _ = x.Args[3] 20788 if idx != x.Args[0] { 20789 break 20790 } 20791 if p != x.Args[1] { 20792 break 20793 } 20794 x_2 := x.Args[2] 20795 if x_2.Op != OpS390XSRDconst { 20796 break 20797 } 20798 if x_2.AuxInt != j+32 { 20799 break 20800 } 20801 if w != x_2.Args[0] { 20802 break 20803 } 20804 mem := x.Args[3] 20805 if !(x.Uses == 1 && clobber(x)) { 20806 break 20807 } 20808 v.reset(OpS390XMOVDstoreidx) 20809 v.AuxInt = i - 4 20810 v.Aux = s 20811 v.AddArg(p) 20812 v.AddArg(idx) 20813 v.AddArg(w0) 20814 v.AddArg(mem) 20815 return true 20816 } 20817 return false 20818 } 20819 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 20820 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 20821 // cond: x.Uses == 1 && clobber(x) 20822 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 20823 for { 20824 i := v.AuxInt 20825 s := v.Aux 20826 _ = v.Args[3] 20827 idx := v.Args[0] 20828 p := v.Args[1] 20829 w0 := v.Args[2] 20830 if w0.Op != OpS390XSRDconst { 20831 break 20832 } 20833 j := w0.AuxInt 20834 w := w0.Args[0] 20835 x := v.Args[3] 20836 if x.Op != OpS390XMOVWstoreidx { 20837 break 20838 } 20839 if x.AuxInt != i-4 { 20840 break 20841 } 20842 if x.Aux != s { 20843 break 20844 } 20845 _ = x.Args[3] 20846 if p != x.Args[0] { 20847 break 20848 } 20849 if idx != x.Args[1] { 20850 break 20851 } 20852 x_2 := x.Args[2] 20853 if x_2.Op != OpS390XSRDconst { 20854 break 20855 } 20856 if x_2.AuxInt != j+32 { 20857 break 20858 } 20859 if w != x_2.Args[0] { 20860 break 20861 } 20862 mem := x.Args[3] 20863 if !(x.Uses == 1 && clobber(x)) { 20864 break 20865 } 20866 v.reset(OpS390XMOVDstoreidx) 20867 v.AuxInt = i - 4 20868 v.Aux = s 20869 v.AddArg(p) 20870 v.AddArg(idx) 20871 v.AddArg(w0) 20872 v.AddArg(mem) 20873 return true 20874 } 20875 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 20876 // cond: x.Uses == 1 && clobber(x) 20877 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 20878 for { 20879 i := v.AuxInt 20880 s := v.Aux 20881 _ = v.Args[3] 20882 idx := v.Args[0] 20883 p := v.Args[1] 20884 w0 := v.Args[2] 20885 if w0.Op != OpS390XSRDconst { 20886 break 20887 } 20888 j := w0.AuxInt 20889 w := w0.Args[0] 20890 x := v.Args[3] 20891 if x.Op != OpS390XMOVWstoreidx { 20892 break 20893 } 20894 if x.AuxInt != i-4 { 20895 break 20896 } 20897 if x.Aux != s { 20898 break 20899 } 20900 _ = x.Args[3] 20901 if idx != x.Args[0] { 20902 break 20903 } 20904 if p != x.Args[1] { 20905 break 20906 } 20907 x_2 := x.Args[2] 20908 if x_2.Op != OpS390XSRDconst { 20909 break 20910 } 20911 if x_2.AuxInt != j+32 { 20912 break 20913 } 20914 if w != x_2.Args[0] { 20915 break 20916 } 20917 mem := x.Args[3] 20918 if !(x.Uses == 1 && clobber(x)) { 20919 break 20920 } 20921 v.reset(OpS390XMOVDstoreidx) 20922 v.AuxInt = i - 4 20923 v.Aux = s 20924 v.AddArg(p) 20925 v.AddArg(idx) 20926 v.AddArg(w0) 20927 v.AddArg(mem) 20928 return true 20929 } 20930 return false 20931 } 20932 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 20933 // match: (MULLD x (MOVDconst [c])) 20934 // cond: is32Bit(c) 20935 // result: (MULLDconst [c] x) 20936 for { 20937 _ = v.Args[1] 20938 x := v.Args[0] 20939 v_1 := v.Args[1] 20940 if v_1.Op != OpS390XMOVDconst { 20941 break 20942 } 20943 c := v_1.AuxInt 20944 if !(is32Bit(c)) { 20945 break 20946 } 20947 v.reset(OpS390XMULLDconst) 20948 v.AuxInt = c 20949 v.AddArg(x) 20950 return true 20951 } 20952 // match: (MULLD (MOVDconst [c]) x) 20953 // cond: is32Bit(c) 20954 // result: (MULLDconst [c] x) 20955 for { 20956 _ = v.Args[1] 20957 v_0 := v.Args[0] 20958 if v_0.Op != OpS390XMOVDconst { 20959 break 20960 } 20961 c := v_0.AuxInt 20962 x := v.Args[1] 20963 if !(is32Bit(c)) { 20964 break 20965 } 20966 v.reset(OpS390XMULLDconst) 20967 v.AuxInt = c 20968 v.AddArg(x) 20969 return true 20970 } 20971 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 20972 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 20973 // result: (MULLDload <t> [off] {sym} x ptr mem) 20974 for { 20975 t := v.Type 20976 _ = v.Args[1] 20977 x := v.Args[0] 20978 g := v.Args[1] 20979 if g.Op != OpS390XMOVDload { 20980 break 20981 } 20982 off := g.AuxInt 20983 sym := g.Aux 20984 _ = g.Args[1] 20985 ptr := g.Args[0] 20986 mem := g.Args[1] 20987 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 20988 break 20989 } 20990 v.reset(OpS390XMULLDload) 20991 v.Type = t 20992 v.AuxInt = off 20993 v.Aux = sym 20994 v.AddArg(x) 20995 v.AddArg(ptr) 20996 v.AddArg(mem) 20997 return true 20998 } 20999 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 21000 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21001 // result: (MULLDload <t> [off] {sym} x ptr mem) 21002 for { 21003 t := v.Type 21004 _ = v.Args[1] 21005 g := v.Args[0] 21006 if g.Op != OpS390XMOVDload { 21007 break 21008 } 21009 off := g.AuxInt 21010 sym := g.Aux 21011 _ = g.Args[1] 21012 ptr := g.Args[0] 21013 mem := g.Args[1] 21014 x := v.Args[1] 21015 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21016 break 21017 } 21018 v.reset(OpS390XMULLDload) 21019 v.Type = t 21020 v.AuxInt = off 21021 v.Aux = sym 21022 v.AddArg(x) 21023 v.AddArg(ptr) 21024 v.AddArg(mem) 21025 return true 21026 } 21027 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 21028 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21029 // result: (MULLDload <t> [off] {sym} x ptr mem) 21030 for { 21031 t := v.Type 21032 _ = v.Args[1] 21033 g := v.Args[0] 21034 if g.Op != OpS390XMOVDload { 21035 break 21036 } 21037 off := g.AuxInt 21038 sym := g.Aux 21039 _ = g.Args[1] 21040 ptr := g.Args[0] 21041 mem := g.Args[1] 21042 x := v.Args[1] 21043 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21044 break 21045 } 21046 v.reset(OpS390XMULLDload) 21047 v.Type = t 21048 v.AuxInt = off 21049 v.Aux = sym 21050 v.AddArg(x) 21051 v.AddArg(ptr) 21052 v.AddArg(mem) 21053 return true 21054 } 21055 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 21056 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21057 // result: (MULLDload <t> [off] {sym} x ptr mem) 21058 for { 21059 t := v.Type 21060 _ = v.Args[1] 21061 x := v.Args[0] 21062 g := v.Args[1] 21063 if g.Op != OpS390XMOVDload { 21064 break 21065 } 21066 off := g.AuxInt 21067 sym := g.Aux 21068 _ = g.Args[1] 21069 ptr := g.Args[0] 21070 mem := g.Args[1] 21071 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21072 break 21073 } 21074 v.reset(OpS390XMULLDload) 21075 v.Type = t 21076 v.AuxInt = off 21077 v.Aux = sym 21078 v.AddArg(x) 21079 v.AddArg(ptr) 21080 v.AddArg(mem) 21081 return true 21082 } 21083 return false 21084 } 21085 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 21086 b := v.Block 21087 _ = b 21088 // match: (MULLDconst [-1] x) 21089 // cond: 21090 // result: (NEG x) 21091 for { 21092 if v.AuxInt != -1 { 21093 break 21094 } 21095 x := v.Args[0] 21096 v.reset(OpS390XNEG) 21097 v.AddArg(x) 21098 return true 21099 } 21100 // match: (MULLDconst [0] _) 21101 // cond: 21102 // result: (MOVDconst [0]) 21103 for { 21104 if v.AuxInt != 0 { 21105 break 21106 } 21107 v.reset(OpS390XMOVDconst) 21108 v.AuxInt = 0 21109 return true 21110 } 21111 // match: (MULLDconst [1] x) 21112 // cond: 21113 // result: x 21114 for { 21115 if v.AuxInt != 1 { 21116 break 21117 } 21118 x := v.Args[0] 21119 v.reset(OpCopy) 21120 v.Type = x.Type 21121 v.AddArg(x) 21122 return true 21123 } 21124 // match: (MULLDconst [c] x) 21125 // cond: isPowerOfTwo(c) 21126 // result: (SLDconst [log2(c)] x) 21127 for { 21128 c := v.AuxInt 21129 x := v.Args[0] 21130 if !(isPowerOfTwo(c)) { 21131 break 21132 } 21133 v.reset(OpS390XSLDconst) 21134 v.AuxInt = log2(c) 21135 v.AddArg(x) 21136 return true 21137 } 21138 // match: (MULLDconst [c] x) 21139 // cond: isPowerOfTwo(c+1) && c >= 15 21140 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 21141 for { 21142 c := v.AuxInt 21143 x := v.Args[0] 21144 if !(isPowerOfTwo(c+1) && c >= 15) { 21145 break 21146 } 21147 v.reset(OpS390XSUB) 21148 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21149 v0.AuxInt = log2(c + 1) 21150 v0.AddArg(x) 21151 v.AddArg(v0) 21152 v.AddArg(x) 21153 return true 21154 } 21155 // match: (MULLDconst [c] x) 21156 // cond: isPowerOfTwo(c-1) && c >= 17 21157 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 21158 for { 21159 c := v.AuxInt 21160 x := v.Args[0] 21161 if !(isPowerOfTwo(c-1) && c >= 17) { 21162 break 21163 } 21164 v.reset(OpS390XADD) 21165 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21166 v0.AuxInt = log2(c - 1) 21167 v0.AddArg(x) 21168 v.AddArg(v0) 21169 v.AddArg(x) 21170 return true 21171 } 21172 // match: (MULLDconst [c] (MOVDconst [d])) 21173 // cond: 21174 // result: (MOVDconst [c*d]) 21175 for { 21176 c := v.AuxInt 21177 v_0 := v.Args[0] 21178 if v_0.Op != OpS390XMOVDconst { 21179 break 21180 } 21181 d := v_0.AuxInt 21182 v.reset(OpS390XMOVDconst) 21183 v.AuxInt = c * d 21184 return true 21185 } 21186 return false 21187 } 21188 func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { 21189 b := v.Block 21190 _ = b 21191 // match: (MULLDload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 21192 // cond: isSamePtr(ptr1, ptr2) 21193 // result: (MULLD x (LGDR <t> y)) 21194 for { 21195 t := v.Type 21196 off := v.AuxInt 21197 sym := v.Aux 21198 _ = v.Args[2] 21199 x := v.Args[0] 21200 ptr1 := v.Args[1] 21201 v_2 := v.Args[2] 21202 if v_2.Op != OpS390XFMOVDstore { 21203 break 21204 } 21205 if v_2.AuxInt != off { 21206 break 21207 } 21208 if v_2.Aux != sym { 21209 break 21210 } 21211 _ = v_2.Args[2] 21212 ptr2 := v_2.Args[0] 21213 y := v_2.Args[1] 21214 if !(isSamePtr(ptr1, ptr2)) { 21215 break 21216 } 21217 v.reset(OpS390XMULLD) 21218 v.AddArg(x) 21219 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 21220 v0.AddArg(y) 21221 v.AddArg(v0) 21222 return true 21223 } 21224 // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) 21225 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 21226 // result: (MULLDload [off1+off2] {sym} x ptr mem) 21227 for { 21228 off1 := v.AuxInt 21229 sym := v.Aux 21230 _ = v.Args[2] 21231 x := v.Args[0] 21232 v_1 := v.Args[1] 21233 if v_1.Op != OpS390XADDconst { 21234 break 21235 } 21236 off2 := v_1.AuxInt 21237 ptr := v_1.Args[0] 21238 mem := v.Args[2] 21239 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 21240 break 21241 } 21242 v.reset(OpS390XMULLDload) 21243 v.AuxInt = off1 + off2 21244 v.Aux = sym 21245 v.AddArg(x) 21246 v.AddArg(ptr) 21247 v.AddArg(mem) 21248 return true 21249 } 21250 // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 21251 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 21252 // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 21253 for { 21254 o1 := v.AuxInt 21255 s1 := v.Aux 21256 _ = v.Args[2] 21257 x := v.Args[0] 21258 v_1 := v.Args[1] 21259 if v_1.Op != OpS390XMOVDaddr { 21260 break 21261 } 21262 o2 := v_1.AuxInt 21263 s2 := v_1.Aux 21264 ptr := v_1.Args[0] 21265 mem := v.Args[2] 21266 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 21267 break 21268 } 21269 v.reset(OpS390XMULLDload) 21270 v.AuxInt = o1 + o2 21271 v.Aux = mergeSym(s1, s2) 21272 v.AddArg(x) 21273 v.AddArg(ptr) 21274 v.AddArg(mem) 21275 return true 21276 } 21277 return false 21278 } 21279 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 21280 // match: (MULLW x (MOVDconst [c])) 21281 // cond: 21282 // result: (MULLWconst [int64(int32(c))] x) 21283 for { 21284 _ = v.Args[1] 21285 x := v.Args[0] 21286 v_1 := v.Args[1] 21287 if v_1.Op != OpS390XMOVDconst { 21288 break 21289 } 21290 c := v_1.AuxInt 21291 v.reset(OpS390XMULLWconst) 21292 v.AuxInt = int64(int32(c)) 21293 v.AddArg(x) 21294 return true 21295 } 21296 // match: (MULLW (MOVDconst [c]) x) 21297 // cond: 21298 // result: (MULLWconst [int64(int32(c))] x) 21299 for { 21300 _ = v.Args[1] 21301 v_0 := v.Args[0] 21302 if v_0.Op != OpS390XMOVDconst { 21303 break 21304 } 21305 c := v_0.AuxInt 21306 x := v.Args[1] 21307 v.reset(OpS390XMULLWconst) 21308 v.AuxInt = int64(int32(c)) 21309 v.AddArg(x) 21310 return true 21311 } 21312 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 21313 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21314 // result: (MULLWload <t> [off] {sym} x ptr mem) 21315 for { 21316 t := v.Type 21317 _ = v.Args[1] 21318 x := v.Args[0] 21319 g := v.Args[1] 21320 if g.Op != OpS390XMOVWload { 21321 break 21322 } 21323 off := g.AuxInt 21324 sym := g.Aux 21325 _ = g.Args[1] 21326 ptr := g.Args[0] 21327 mem := g.Args[1] 21328 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21329 break 21330 } 21331 v.reset(OpS390XMULLWload) 21332 v.Type = t 21333 v.AuxInt = off 21334 v.Aux = sym 21335 v.AddArg(x) 21336 v.AddArg(ptr) 21337 v.AddArg(mem) 21338 return true 21339 } 21340 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 21341 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21342 // result: (MULLWload <t> [off] {sym} x ptr mem) 21343 for { 21344 t := v.Type 21345 _ = v.Args[1] 21346 g := v.Args[0] 21347 if g.Op != OpS390XMOVWload { 21348 break 21349 } 21350 off := g.AuxInt 21351 sym := g.Aux 21352 _ = g.Args[1] 21353 ptr := g.Args[0] 21354 mem := g.Args[1] 21355 x := v.Args[1] 21356 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21357 break 21358 } 21359 v.reset(OpS390XMULLWload) 21360 v.Type = t 21361 v.AuxInt = off 21362 v.Aux = sym 21363 v.AddArg(x) 21364 v.AddArg(ptr) 21365 v.AddArg(mem) 21366 return true 21367 } 21368 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 21369 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21370 // result: (MULLWload <t> [off] {sym} x ptr mem) 21371 for { 21372 t := v.Type 21373 _ = v.Args[1] 21374 g := v.Args[0] 21375 if g.Op != OpS390XMOVWload { 21376 break 21377 } 21378 off := g.AuxInt 21379 sym := g.Aux 21380 _ = g.Args[1] 21381 ptr := g.Args[0] 21382 mem := g.Args[1] 21383 x := v.Args[1] 21384 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21385 break 21386 } 21387 v.reset(OpS390XMULLWload) 21388 v.Type = t 21389 v.AuxInt = off 21390 v.Aux = sym 21391 v.AddArg(x) 21392 v.AddArg(ptr) 21393 v.AddArg(mem) 21394 return true 21395 } 21396 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 21397 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21398 // result: (MULLWload <t> [off] {sym} x ptr mem) 21399 for { 21400 t := v.Type 21401 _ = v.Args[1] 21402 x := v.Args[0] 21403 g := v.Args[1] 21404 if g.Op != OpS390XMOVWload { 21405 break 21406 } 21407 off := g.AuxInt 21408 sym := g.Aux 21409 _ = g.Args[1] 21410 ptr := g.Args[0] 21411 mem := g.Args[1] 21412 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21413 break 21414 } 21415 v.reset(OpS390XMULLWload) 21416 v.Type = t 21417 v.AuxInt = off 21418 v.Aux = sym 21419 v.AddArg(x) 21420 v.AddArg(ptr) 21421 v.AddArg(mem) 21422 return true 21423 } 21424 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 21425 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21426 // result: (MULLWload <t> [off] {sym} x ptr mem) 21427 for { 21428 t := v.Type 21429 _ = v.Args[1] 21430 x := v.Args[0] 21431 g := v.Args[1] 21432 if g.Op != OpS390XMOVWZload { 21433 break 21434 } 21435 off := g.AuxInt 21436 sym := g.Aux 21437 _ = g.Args[1] 21438 ptr := g.Args[0] 21439 mem := g.Args[1] 21440 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21441 break 21442 } 21443 v.reset(OpS390XMULLWload) 21444 v.Type = t 21445 v.AuxInt = off 21446 v.Aux = sym 21447 v.AddArg(x) 21448 v.AddArg(ptr) 21449 v.AddArg(mem) 21450 return true 21451 } 21452 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 21453 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21454 // result: (MULLWload <t> [off] {sym} x ptr mem) 21455 for { 21456 t := v.Type 21457 _ = v.Args[1] 21458 g := v.Args[0] 21459 if g.Op != OpS390XMOVWZload { 21460 break 21461 } 21462 off := g.AuxInt 21463 sym := g.Aux 21464 _ = g.Args[1] 21465 ptr := g.Args[0] 21466 mem := g.Args[1] 21467 x := v.Args[1] 21468 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21469 break 21470 } 21471 v.reset(OpS390XMULLWload) 21472 v.Type = t 21473 v.AuxInt = off 21474 v.Aux = sym 21475 v.AddArg(x) 21476 v.AddArg(ptr) 21477 v.AddArg(mem) 21478 return true 21479 } 21480 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 21481 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21482 // result: (MULLWload <t> [off] {sym} x ptr mem) 21483 for { 21484 t := v.Type 21485 _ = v.Args[1] 21486 g := v.Args[0] 21487 if g.Op != OpS390XMOVWZload { 21488 break 21489 } 21490 off := g.AuxInt 21491 sym := g.Aux 21492 _ = g.Args[1] 21493 ptr := g.Args[0] 21494 mem := g.Args[1] 21495 x := v.Args[1] 21496 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21497 break 21498 } 21499 v.reset(OpS390XMULLWload) 21500 v.Type = t 21501 v.AuxInt = off 21502 v.Aux = sym 21503 v.AddArg(x) 21504 v.AddArg(ptr) 21505 v.AddArg(mem) 21506 return true 21507 } 21508 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 21509 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 21510 // result: (MULLWload <t> [off] {sym} x ptr mem) 21511 for { 21512 t := v.Type 21513 _ = v.Args[1] 21514 x := v.Args[0] 21515 g := v.Args[1] 21516 if g.Op != OpS390XMOVWZload { 21517 break 21518 } 21519 off := g.AuxInt 21520 sym := g.Aux 21521 _ = g.Args[1] 21522 ptr := g.Args[0] 21523 mem := g.Args[1] 21524 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 21525 break 21526 } 21527 v.reset(OpS390XMULLWload) 21528 v.Type = t 21529 v.AuxInt = off 21530 v.Aux = sym 21531 v.AddArg(x) 21532 v.AddArg(ptr) 21533 v.AddArg(mem) 21534 return true 21535 } 21536 return false 21537 } 21538 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 21539 b := v.Block 21540 _ = b 21541 // match: (MULLWconst [-1] x) 21542 // cond: 21543 // result: (NEGW x) 21544 for { 21545 if v.AuxInt != -1 { 21546 break 21547 } 21548 x := v.Args[0] 21549 v.reset(OpS390XNEGW) 21550 v.AddArg(x) 21551 return true 21552 } 21553 // match: (MULLWconst [0] _) 21554 // cond: 21555 // result: (MOVDconst [0]) 21556 for { 21557 if v.AuxInt != 0 { 21558 break 21559 } 21560 v.reset(OpS390XMOVDconst) 21561 v.AuxInt = 0 21562 return true 21563 } 21564 // match: (MULLWconst [1] x) 21565 // cond: 21566 // result: x 21567 for { 21568 if v.AuxInt != 1 { 21569 break 21570 } 21571 x := v.Args[0] 21572 v.reset(OpCopy) 21573 v.Type = x.Type 21574 v.AddArg(x) 21575 return true 21576 } 21577 // match: (MULLWconst [c] x) 21578 // cond: isPowerOfTwo(c) 21579 // result: (SLWconst [log2(c)] x) 21580 for { 21581 c := v.AuxInt 21582 x := v.Args[0] 21583 if !(isPowerOfTwo(c)) { 21584 break 21585 } 21586 v.reset(OpS390XSLWconst) 21587 v.AuxInt = log2(c) 21588 v.AddArg(x) 21589 return true 21590 } 21591 // match: (MULLWconst [c] x) 21592 // cond: isPowerOfTwo(c+1) && c >= 15 21593 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 21594 for { 21595 c := v.AuxInt 21596 x := v.Args[0] 21597 if !(isPowerOfTwo(c+1) && c >= 15) { 21598 break 21599 } 21600 v.reset(OpS390XSUBW) 21601 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 21602 v0.AuxInt = log2(c + 1) 21603 v0.AddArg(x) 21604 v.AddArg(v0) 21605 v.AddArg(x) 21606 return true 21607 } 21608 // match: (MULLWconst [c] x) 21609 // cond: isPowerOfTwo(c-1) && c >= 17 21610 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 21611 for { 21612 c := v.AuxInt 21613 x := v.Args[0] 21614 if !(isPowerOfTwo(c-1) && c >= 17) { 21615 break 21616 } 21617 v.reset(OpS390XADDW) 21618 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 21619 v0.AuxInt = log2(c - 1) 21620 v0.AddArg(x) 21621 v.AddArg(v0) 21622 v.AddArg(x) 21623 return true 21624 } 21625 // match: (MULLWconst [c] (MOVDconst [d])) 21626 // cond: 21627 // result: (MOVDconst [int64(int32(c*d))]) 21628 for { 21629 c := v.AuxInt 21630 v_0 := v.Args[0] 21631 if v_0.Op != OpS390XMOVDconst { 21632 break 21633 } 21634 d := v_0.AuxInt 21635 v.reset(OpS390XMOVDconst) 21636 v.AuxInt = int64(int32(c * d)) 21637 return true 21638 } 21639 return false 21640 } 21641 func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { 21642 // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) 21643 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 21644 // result: (MULLWload [off1+off2] {sym} x ptr mem) 21645 for { 21646 off1 := v.AuxInt 21647 sym := v.Aux 21648 _ = v.Args[2] 21649 x := v.Args[0] 21650 v_1 := v.Args[1] 21651 if v_1.Op != OpS390XADDconst { 21652 break 21653 } 21654 off2 := v_1.AuxInt 21655 ptr := v_1.Args[0] 21656 mem := v.Args[2] 21657 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 21658 break 21659 } 21660 v.reset(OpS390XMULLWload) 21661 v.AuxInt = off1 + off2 21662 v.Aux = sym 21663 v.AddArg(x) 21664 v.AddArg(ptr) 21665 v.AddArg(mem) 21666 return true 21667 } 21668 // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 21669 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 21670 // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 21671 for { 21672 o1 := v.AuxInt 21673 s1 := v.Aux 21674 _ = v.Args[2] 21675 x := v.Args[0] 21676 v_1 := v.Args[1] 21677 if v_1.Op != OpS390XMOVDaddr { 21678 break 21679 } 21680 o2 := v_1.AuxInt 21681 s2 := v_1.Aux 21682 ptr := v_1.Args[0] 21683 mem := v.Args[2] 21684 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 21685 break 21686 } 21687 v.reset(OpS390XMULLWload) 21688 v.AuxInt = o1 + o2 21689 v.Aux = mergeSym(s1, s2) 21690 v.AddArg(x) 21691 v.AddArg(ptr) 21692 v.AddArg(mem) 21693 return true 21694 } 21695 return false 21696 } 21697 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 21698 // match: (NEG (MOVDconst [c])) 21699 // cond: 21700 // result: (MOVDconst [-c]) 21701 for { 21702 v_0 := v.Args[0] 21703 if v_0.Op != OpS390XMOVDconst { 21704 break 21705 } 21706 c := v_0.AuxInt 21707 v.reset(OpS390XMOVDconst) 21708 v.AuxInt = -c 21709 return true 21710 } 21711 // match: (NEG (ADDconst [c] (NEG x))) 21712 // cond: c != -(1<<31) 21713 // result: (ADDconst [-c] x) 21714 for { 21715 v_0 := v.Args[0] 21716 if v_0.Op != OpS390XADDconst { 21717 break 21718 } 21719 c := v_0.AuxInt 21720 v_0_0 := v_0.Args[0] 21721 if v_0_0.Op != OpS390XNEG { 21722 break 21723 } 21724 x := v_0_0.Args[0] 21725 if !(c != -(1 << 31)) { 21726 break 21727 } 21728 v.reset(OpS390XADDconst) 21729 v.AuxInt = -c 21730 v.AddArg(x) 21731 return true 21732 } 21733 return false 21734 } 21735 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 21736 // match: (NEGW (MOVDconst [c])) 21737 // cond: 21738 // result: (MOVDconst [int64(int32(-c))]) 21739 for { 21740 v_0 := v.Args[0] 21741 if v_0.Op != OpS390XMOVDconst { 21742 break 21743 } 21744 c := v_0.AuxInt 21745 v.reset(OpS390XMOVDconst) 21746 v.AuxInt = int64(int32(-c)) 21747 return true 21748 } 21749 return false 21750 } 21751 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 21752 b := v.Block 21753 _ = b 21754 typ := &b.Func.Config.Types 21755 _ = typ 21756 // match: (NOT x) 21757 // cond: true 21758 // result: (XOR (MOVDconst [-1]) x) 21759 for { 21760 x := v.Args[0] 21761 if !(true) { 21762 break 21763 } 21764 v.reset(OpS390XXOR) 21765 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 21766 v0.AuxInt = -1 21767 v.AddArg(v0) 21768 v.AddArg(x) 21769 return true 21770 } 21771 return false 21772 } 21773 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 21774 // match: (NOTW x) 21775 // cond: true 21776 // result: (XORWconst [-1] x) 21777 for { 21778 x := v.Args[0] 21779 if !(true) { 21780 break 21781 } 21782 v.reset(OpS390XXORWconst) 21783 v.AuxInt = -1 21784 v.AddArg(x) 21785 return true 21786 } 21787 return false 21788 } 21789 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 21790 b := v.Block 21791 _ = b 21792 // match: (OR x (MOVDconst [c])) 21793 // cond: isU32Bit(c) 21794 // result: (ORconst [c] x) 21795 for { 21796 _ = v.Args[1] 21797 x := v.Args[0] 21798 v_1 := v.Args[1] 21799 if v_1.Op != OpS390XMOVDconst { 21800 break 21801 } 21802 c := v_1.AuxInt 21803 if !(isU32Bit(c)) { 21804 break 21805 } 21806 v.reset(OpS390XORconst) 21807 v.AuxInt = c 21808 v.AddArg(x) 21809 return true 21810 } 21811 // match: (OR (MOVDconst [c]) x) 21812 // cond: isU32Bit(c) 21813 // result: (ORconst [c] x) 21814 for { 21815 _ = v.Args[1] 21816 v_0 := v.Args[0] 21817 if v_0.Op != OpS390XMOVDconst { 21818 break 21819 } 21820 c := v_0.AuxInt 21821 x := v.Args[1] 21822 if !(isU32Bit(c)) { 21823 break 21824 } 21825 v.reset(OpS390XORconst) 21826 v.AuxInt = c 21827 v.AddArg(x) 21828 return true 21829 } 21830 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 21831 // cond: d == 64-c 21832 // result: (RLLGconst [c] x) 21833 for { 21834 _ = v.Args[1] 21835 v_0 := v.Args[0] 21836 if v_0.Op != OpS390XSLDconst { 21837 break 21838 } 21839 c := v_0.AuxInt 21840 x := v_0.Args[0] 21841 v_1 := v.Args[1] 21842 if v_1.Op != OpS390XSRDconst { 21843 break 21844 } 21845 d := v_1.AuxInt 21846 if x != v_1.Args[0] { 21847 break 21848 } 21849 if !(d == 64-c) { 21850 break 21851 } 21852 v.reset(OpS390XRLLGconst) 21853 v.AuxInt = c 21854 v.AddArg(x) 21855 return true 21856 } 21857 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 21858 // cond: d == 64-c 21859 // result: (RLLGconst [c] x) 21860 for { 21861 _ = v.Args[1] 21862 v_0 := v.Args[0] 21863 if v_0.Op != OpS390XSRDconst { 21864 break 21865 } 21866 d := v_0.AuxInt 21867 x := v_0.Args[0] 21868 v_1 := v.Args[1] 21869 if v_1.Op != OpS390XSLDconst { 21870 break 21871 } 21872 c := v_1.AuxInt 21873 if x != v_1.Args[0] { 21874 break 21875 } 21876 if !(d == 64-c) { 21877 break 21878 } 21879 v.reset(OpS390XRLLGconst) 21880 v.AuxInt = c 21881 v.AddArg(x) 21882 return true 21883 } 21884 // match: (OR (MOVDconst [-1<<63]) (LGDR <t> x)) 21885 // cond: 21886 // result: (LGDR <t> (LNDFR <x.Type> x)) 21887 for { 21888 _ = v.Args[1] 21889 v_0 := v.Args[0] 21890 if v_0.Op != OpS390XMOVDconst { 21891 break 21892 } 21893 if v_0.AuxInt != -1<<63 { 21894 break 21895 } 21896 v_1 := v.Args[1] 21897 if v_1.Op != OpS390XLGDR { 21898 break 21899 } 21900 t := v_1.Type 21901 x := v_1.Args[0] 21902 v.reset(OpS390XLGDR) 21903 v.Type = t 21904 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 21905 v0.AddArg(x) 21906 v.AddArg(v0) 21907 return true 21908 } 21909 // match: (OR (LGDR <t> x) (MOVDconst [-1<<63])) 21910 // cond: 21911 // result: (LGDR <t> (LNDFR <x.Type> x)) 21912 for { 21913 _ = v.Args[1] 21914 v_0 := v.Args[0] 21915 if v_0.Op != OpS390XLGDR { 21916 break 21917 } 21918 t := v_0.Type 21919 x := v_0.Args[0] 21920 v_1 := v.Args[1] 21921 if v_1.Op != OpS390XMOVDconst { 21922 break 21923 } 21924 if v_1.AuxInt != -1<<63 { 21925 break 21926 } 21927 v.reset(OpS390XLGDR) 21928 v.Type = t 21929 v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) 21930 v0.AddArg(x) 21931 v.AddArg(v0) 21932 return true 21933 } 21934 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR <t> y))) 21935 // cond: 21936 // result: (LGDR (CPSDR <t> y x)) 21937 for { 21938 _ = v.Args[1] 21939 v_0 := v.Args[0] 21940 if v_0.Op != OpS390XSLDconst { 21941 break 21942 } 21943 if v_0.AuxInt != 63 { 21944 break 21945 } 21946 v_0_0 := v_0.Args[0] 21947 if v_0_0.Op != OpS390XSRDconst { 21948 break 21949 } 21950 if v_0_0.AuxInt != 63 { 21951 break 21952 } 21953 v_0_0_0 := v_0_0.Args[0] 21954 if v_0_0_0.Op != OpS390XLGDR { 21955 break 21956 } 21957 x := v_0_0_0.Args[0] 21958 v_1 := v.Args[1] 21959 if v_1.Op != OpS390XLGDR { 21960 break 21961 } 21962 v_1_0 := v_1.Args[0] 21963 if v_1_0.Op != OpS390XLPDFR { 21964 break 21965 } 21966 t := v_1_0.Type 21967 y := v_1_0.Args[0] 21968 v.reset(OpS390XLGDR) 21969 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 21970 v0.AddArg(y) 21971 v0.AddArg(x) 21972 v.AddArg(v0) 21973 return true 21974 } 21975 // match: (OR (LGDR (LPDFR <t> y)) (SLDconst [63] (SRDconst [63] (LGDR x)))) 21976 // cond: 21977 // result: (LGDR (CPSDR <t> y x)) 21978 for { 21979 _ = v.Args[1] 21980 v_0 := v.Args[0] 21981 if v_0.Op != OpS390XLGDR { 21982 break 21983 } 21984 v_0_0 := v_0.Args[0] 21985 if v_0_0.Op != OpS390XLPDFR { 21986 break 21987 } 21988 t := v_0_0.Type 21989 y := v_0_0.Args[0] 21990 v_1 := v.Args[1] 21991 if v_1.Op != OpS390XSLDconst { 21992 break 21993 } 21994 if v_1.AuxInt != 63 { 21995 break 21996 } 21997 v_1_0 := v_1.Args[0] 21998 if v_1_0.Op != OpS390XSRDconst { 21999 break 22000 } 22001 if v_1_0.AuxInt != 63 { 22002 break 22003 } 22004 v_1_0_0 := v_1_0.Args[0] 22005 if v_1_0_0.Op != OpS390XLGDR { 22006 break 22007 } 22008 x := v_1_0_0.Args[0] 22009 v.reset(OpS390XLGDR) 22010 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) 22011 v0.AddArg(y) 22012 v0.AddArg(x) 22013 v.AddArg(v0) 22014 return true 22015 } 22016 // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) 22017 // cond: c & -1<<63 == 0 22018 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 22019 for { 22020 _ = v.Args[1] 22021 v_0 := v.Args[0] 22022 if v_0.Op != OpS390XSLDconst { 22023 break 22024 } 22025 if v_0.AuxInt != 63 { 22026 break 22027 } 22028 v_0_0 := v_0.Args[0] 22029 if v_0_0.Op != OpS390XSRDconst { 22030 break 22031 } 22032 if v_0_0.AuxInt != 63 { 22033 break 22034 } 22035 v_0_0_0 := v_0_0.Args[0] 22036 if v_0_0_0.Op != OpS390XLGDR { 22037 break 22038 } 22039 x := v_0_0_0.Args[0] 22040 v_1 := v.Args[1] 22041 if v_1.Op != OpS390XMOVDconst { 22042 break 22043 } 22044 c := v_1.AuxInt 22045 if !(c&-1<<63 == 0) { 22046 break 22047 } 22048 v.reset(OpS390XLGDR) 22049 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 22050 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 22051 v1.AuxInt = c 22052 v0.AddArg(v1) 22053 v0.AddArg(x) 22054 v.AddArg(v0) 22055 return true 22056 } 22057 // match: (OR (MOVDconst [c]) (SLDconst [63] (SRDconst [63] (LGDR x)))) 22058 // cond: c & -1<<63 == 0 22059 // result: (LGDR (CPSDR <x.Type> (FMOVDconst <x.Type> [c]) x)) 22060 for { 22061 _ = v.Args[1] 22062 v_0 := v.Args[0] 22063 if v_0.Op != OpS390XMOVDconst { 22064 break 22065 } 22066 c := v_0.AuxInt 22067 v_1 := v.Args[1] 22068 if v_1.Op != OpS390XSLDconst { 22069 break 22070 } 22071 if v_1.AuxInt != 63 { 22072 break 22073 } 22074 v_1_0 := v_1.Args[0] 22075 if v_1_0.Op != OpS390XSRDconst { 22076 break 22077 } 22078 if v_1_0.AuxInt != 63 { 22079 break 22080 } 22081 v_1_0_0 := v_1_0.Args[0] 22082 if v_1_0_0.Op != OpS390XLGDR { 22083 break 22084 } 22085 x := v_1_0_0.Args[0] 22086 if !(c&-1<<63 == 0) { 22087 break 22088 } 22089 v.reset(OpS390XLGDR) 22090 v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) 22091 v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) 22092 v1.AuxInt = c 22093 v0.AddArg(v1) 22094 v0.AddArg(x) 22095 v.AddArg(v0) 22096 return true 22097 } 22098 return false 22099 } 22100 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 22101 b := v.Block 22102 _ = b 22103 typ := &b.Func.Config.Types 22104 _ = typ 22105 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 22106 // cond: 22107 // result: (MOVDconst [c|d]) 22108 for { 22109 _ = v.Args[1] 22110 v_0 := v.Args[0] 22111 if v_0.Op != OpS390XMOVDconst { 22112 break 22113 } 22114 c := v_0.AuxInt 22115 v_1 := v.Args[1] 22116 if v_1.Op != OpS390XMOVDconst { 22117 break 22118 } 22119 d := v_1.AuxInt 22120 v.reset(OpS390XMOVDconst) 22121 v.AuxInt = c | d 22122 return true 22123 } 22124 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 22125 // cond: 22126 // result: (MOVDconst [c|d]) 22127 for { 22128 _ = v.Args[1] 22129 v_0 := v.Args[0] 22130 if v_0.Op != OpS390XMOVDconst { 22131 break 22132 } 22133 d := v_0.AuxInt 22134 v_1 := v.Args[1] 22135 if v_1.Op != OpS390XMOVDconst { 22136 break 22137 } 22138 c := v_1.AuxInt 22139 v.reset(OpS390XMOVDconst) 22140 v.AuxInt = c | d 22141 return true 22142 } 22143 // match: (OR x x) 22144 // cond: 22145 // result: x 22146 for { 22147 _ = v.Args[1] 22148 x := v.Args[0] 22149 if x != v.Args[1] { 22150 break 22151 } 22152 v.reset(OpCopy) 22153 v.Type = x.Type 22154 v.AddArg(x) 22155 return true 22156 } 22157 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 22158 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22159 // result: (ORload <t> [off] {sym} x ptr mem) 22160 for { 22161 t := v.Type 22162 _ = v.Args[1] 22163 x := v.Args[0] 22164 g := v.Args[1] 22165 if g.Op != OpS390XMOVDload { 22166 break 22167 } 22168 off := g.AuxInt 22169 sym := g.Aux 22170 _ = g.Args[1] 22171 ptr := g.Args[0] 22172 mem := g.Args[1] 22173 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22174 break 22175 } 22176 v.reset(OpS390XORload) 22177 v.Type = t 22178 v.AuxInt = off 22179 v.Aux = sym 22180 v.AddArg(x) 22181 v.AddArg(ptr) 22182 v.AddArg(mem) 22183 return true 22184 } 22185 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 22186 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22187 // result: (ORload <t> [off] {sym} x ptr mem) 22188 for { 22189 t := v.Type 22190 _ = v.Args[1] 22191 g := v.Args[0] 22192 if g.Op != OpS390XMOVDload { 22193 break 22194 } 22195 off := g.AuxInt 22196 sym := g.Aux 22197 _ = g.Args[1] 22198 ptr := g.Args[0] 22199 mem := g.Args[1] 22200 x := v.Args[1] 22201 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22202 break 22203 } 22204 v.reset(OpS390XORload) 22205 v.Type = t 22206 v.AuxInt = off 22207 v.Aux = sym 22208 v.AddArg(x) 22209 v.AddArg(ptr) 22210 v.AddArg(mem) 22211 return true 22212 } 22213 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 22214 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22215 // result: (ORload <t> [off] {sym} x ptr mem) 22216 for { 22217 t := v.Type 22218 _ = v.Args[1] 22219 g := v.Args[0] 22220 if g.Op != OpS390XMOVDload { 22221 break 22222 } 22223 off := g.AuxInt 22224 sym := g.Aux 22225 _ = g.Args[1] 22226 ptr := g.Args[0] 22227 mem := g.Args[1] 22228 x := v.Args[1] 22229 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22230 break 22231 } 22232 v.reset(OpS390XORload) 22233 v.Type = t 22234 v.AuxInt = off 22235 v.Aux = sym 22236 v.AddArg(x) 22237 v.AddArg(ptr) 22238 v.AddArg(mem) 22239 return true 22240 } 22241 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 22242 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 22243 // result: (ORload <t> [off] {sym} x ptr mem) 22244 for { 22245 t := v.Type 22246 _ = v.Args[1] 22247 x := v.Args[0] 22248 g := v.Args[1] 22249 if g.Op != OpS390XMOVDload { 22250 break 22251 } 22252 off := g.AuxInt 22253 sym := g.Aux 22254 _ = g.Args[1] 22255 ptr := g.Args[0] 22256 mem := g.Args[1] 22257 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 22258 break 22259 } 22260 v.reset(OpS390XORload) 22261 v.Type = t 22262 v.AuxInt = off 22263 v.Aux = sym 22264 v.AddArg(x) 22265 v.AddArg(ptr) 22266 v.AddArg(mem) 22267 return true 22268 } 22269 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 22270 // 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) 22271 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 22272 for { 22273 _ = v.Args[1] 22274 x1 := v.Args[0] 22275 if x1.Op != OpS390XMOVBZload { 22276 break 22277 } 22278 i1 := x1.AuxInt 22279 s := x1.Aux 22280 _ = x1.Args[1] 22281 p := x1.Args[0] 22282 mem := x1.Args[1] 22283 sh := v.Args[1] 22284 if sh.Op != OpS390XSLDconst { 22285 break 22286 } 22287 if sh.AuxInt != 8 { 22288 break 22289 } 22290 x0 := sh.Args[0] 22291 if x0.Op != OpS390XMOVBZload { 22292 break 22293 } 22294 i0 := x0.AuxInt 22295 if x0.Aux != s { 22296 break 22297 } 22298 _ = x0.Args[1] 22299 if p != x0.Args[0] { 22300 break 22301 } 22302 if mem != x0.Args[1] { 22303 break 22304 } 22305 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)) { 22306 break 22307 } 22308 b = mergePoint(b, x0, x1) 22309 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22310 v.reset(OpCopy) 22311 v.AddArg(v0) 22312 v0.AuxInt = i0 22313 v0.Aux = s 22314 v0.AddArg(p) 22315 v0.AddArg(mem) 22316 return true 22317 } 22318 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 22319 // 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) 22320 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 22321 for { 22322 _ = v.Args[1] 22323 sh := v.Args[0] 22324 if sh.Op != OpS390XSLDconst { 22325 break 22326 } 22327 if sh.AuxInt != 8 { 22328 break 22329 } 22330 x0 := sh.Args[0] 22331 if x0.Op != OpS390XMOVBZload { 22332 break 22333 } 22334 i0 := x0.AuxInt 22335 s := x0.Aux 22336 _ = x0.Args[1] 22337 p := x0.Args[0] 22338 mem := x0.Args[1] 22339 x1 := v.Args[1] 22340 if x1.Op != OpS390XMOVBZload { 22341 break 22342 } 22343 i1 := x1.AuxInt 22344 if x1.Aux != s { 22345 break 22346 } 22347 _ = x1.Args[1] 22348 if p != x1.Args[0] { 22349 break 22350 } 22351 if mem != x1.Args[1] { 22352 break 22353 } 22354 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)) { 22355 break 22356 } 22357 b = mergePoint(b, x0, x1) 22358 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22359 v.reset(OpCopy) 22360 v.AddArg(v0) 22361 v0.AuxInt = i0 22362 v0.Aux = s 22363 v0.AddArg(p) 22364 v0.AddArg(mem) 22365 return true 22366 } 22367 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 22368 // 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) 22369 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 22370 for { 22371 _ = v.Args[1] 22372 x1 := v.Args[0] 22373 if x1.Op != OpS390XMOVHZload { 22374 break 22375 } 22376 i1 := x1.AuxInt 22377 s := x1.Aux 22378 _ = x1.Args[1] 22379 p := x1.Args[0] 22380 mem := x1.Args[1] 22381 sh := v.Args[1] 22382 if sh.Op != OpS390XSLDconst { 22383 break 22384 } 22385 if sh.AuxInt != 16 { 22386 break 22387 } 22388 x0 := sh.Args[0] 22389 if x0.Op != OpS390XMOVHZload { 22390 break 22391 } 22392 i0 := x0.AuxInt 22393 if x0.Aux != s { 22394 break 22395 } 22396 _ = x0.Args[1] 22397 if p != x0.Args[0] { 22398 break 22399 } 22400 if mem != x0.Args[1] { 22401 break 22402 } 22403 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)) { 22404 break 22405 } 22406 b = mergePoint(b, x0, x1) 22407 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 22408 v.reset(OpCopy) 22409 v.AddArg(v0) 22410 v0.AuxInt = i0 22411 v0.Aux = s 22412 v0.AddArg(p) 22413 v0.AddArg(mem) 22414 return true 22415 } 22416 return false 22417 } 22418 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 22419 b := v.Block 22420 _ = b 22421 typ := &b.Func.Config.Types 22422 _ = typ 22423 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 22424 // 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) 22425 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 22426 for { 22427 _ = v.Args[1] 22428 sh := v.Args[0] 22429 if sh.Op != OpS390XSLDconst { 22430 break 22431 } 22432 if sh.AuxInt != 16 { 22433 break 22434 } 22435 x0 := sh.Args[0] 22436 if x0.Op != OpS390XMOVHZload { 22437 break 22438 } 22439 i0 := x0.AuxInt 22440 s := x0.Aux 22441 _ = x0.Args[1] 22442 p := x0.Args[0] 22443 mem := x0.Args[1] 22444 x1 := v.Args[1] 22445 if x1.Op != OpS390XMOVHZload { 22446 break 22447 } 22448 i1 := x1.AuxInt 22449 if x1.Aux != s { 22450 break 22451 } 22452 _ = x1.Args[1] 22453 if p != x1.Args[0] { 22454 break 22455 } 22456 if mem != x1.Args[1] { 22457 break 22458 } 22459 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)) { 22460 break 22461 } 22462 b = mergePoint(b, x0, x1) 22463 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 22464 v.reset(OpCopy) 22465 v.AddArg(v0) 22466 v0.AuxInt = i0 22467 v0.Aux = s 22468 v0.AddArg(p) 22469 v0.AddArg(mem) 22470 return true 22471 } 22472 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 22473 // 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) 22474 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 22475 for { 22476 _ = v.Args[1] 22477 x1 := v.Args[0] 22478 if x1.Op != OpS390XMOVWZload { 22479 break 22480 } 22481 i1 := x1.AuxInt 22482 s := x1.Aux 22483 _ = x1.Args[1] 22484 p := x1.Args[0] 22485 mem := x1.Args[1] 22486 sh := v.Args[1] 22487 if sh.Op != OpS390XSLDconst { 22488 break 22489 } 22490 if sh.AuxInt != 32 { 22491 break 22492 } 22493 x0 := sh.Args[0] 22494 if x0.Op != OpS390XMOVWZload { 22495 break 22496 } 22497 i0 := x0.AuxInt 22498 if x0.Aux != s { 22499 break 22500 } 22501 _ = x0.Args[1] 22502 if p != x0.Args[0] { 22503 break 22504 } 22505 if mem != x0.Args[1] { 22506 break 22507 } 22508 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)) { 22509 break 22510 } 22511 b = mergePoint(b, x0, x1) 22512 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 22513 v.reset(OpCopy) 22514 v.AddArg(v0) 22515 v0.AuxInt = i0 22516 v0.Aux = s 22517 v0.AddArg(p) 22518 v0.AddArg(mem) 22519 return true 22520 } 22521 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 22522 // 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) 22523 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 22524 for { 22525 _ = v.Args[1] 22526 sh := v.Args[0] 22527 if sh.Op != OpS390XSLDconst { 22528 break 22529 } 22530 if sh.AuxInt != 32 { 22531 break 22532 } 22533 x0 := sh.Args[0] 22534 if x0.Op != OpS390XMOVWZload { 22535 break 22536 } 22537 i0 := x0.AuxInt 22538 s := x0.Aux 22539 _ = x0.Args[1] 22540 p := x0.Args[0] 22541 mem := x0.Args[1] 22542 x1 := v.Args[1] 22543 if x1.Op != OpS390XMOVWZload { 22544 break 22545 } 22546 i1 := x1.AuxInt 22547 if x1.Aux != s { 22548 break 22549 } 22550 _ = x1.Args[1] 22551 if p != x1.Args[0] { 22552 break 22553 } 22554 if mem != x1.Args[1] { 22555 break 22556 } 22557 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)) { 22558 break 22559 } 22560 b = mergePoint(b, x0, x1) 22561 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 22562 v.reset(OpCopy) 22563 v.AddArg(v0) 22564 v0.AuxInt = i0 22565 v0.Aux = s 22566 v0.AddArg(p) 22567 v0.AddArg(mem) 22568 return true 22569 } 22570 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 22571 // 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) 22572 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 22573 for { 22574 _ = v.Args[1] 22575 s0 := v.Args[0] 22576 if s0.Op != OpS390XSLDconst { 22577 break 22578 } 22579 j0 := s0.AuxInt 22580 x0 := s0.Args[0] 22581 if x0.Op != OpS390XMOVBZload { 22582 break 22583 } 22584 i0 := x0.AuxInt 22585 s := x0.Aux 22586 _ = x0.Args[1] 22587 p := x0.Args[0] 22588 mem := x0.Args[1] 22589 or := v.Args[1] 22590 if or.Op != OpS390XOR { 22591 break 22592 } 22593 _ = or.Args[1] 22594 s1 := or.Args[0] 22595 if s1.Op != OpS390XSLDconst { 22596 break 22597 } 22598 j1 := s1.AuxInt 22599 x1 := s1.Args[0] 22600 if x1.Op != OpS390XMOVBZload { 22601 break 22602 } 22603 i1 := x1.AuxInt 22604 if x1.Aux != s { 22605 break 22606 } 22607 _ = x1.Args[1] 22608 if p != x1.Args[0] { 22609 break 22610 } 22611 if mem != x1.Args[1] { 22612 break 22613 } 22614 y := or.Args[1] 22615 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)) { 22616 break 22617 } 22618 b = mergePoint(b, x0, x1) 22619 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22620 v.reset(OpCopy) 22621 v.AddArg(v0) 22622 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22623 v1.AuxInt = j1 22624 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22625 v2.AuxInt = i0 22626 v2.Aux = s 22627 v2.AddArg(p) 22628 v2.AddArg(mem) 22629 v1.AddArg(v2) 22630 v0.AddArg(v1) 22631 v0.AddArg(y) 22632 return true 22633 } 22634 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 22635 // 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) 22636 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 22637 for { 22638 _ = v.Args[1] 22639 s0 := v.Args[0] 22640 if s0.Op != OpS390XSLDconst { 22641 break 22642 } 22643 j0 := s0.AuxInt 22644 x0 := s0.Args[0] 22645 if x0.Op != OpS390XMOVBZload { 22646 break 22647 } 22648 i0 := x0.AuxInt 22649 s := x0.Aux 22650 _ = x0.Args[1] 22651 p := x0.Args[0] 22652 mem := x0.Args[1] 22653 or := v.Args[1] 22654 if or.Op != OpS390XOR { 22655 break 22656 } 22657 _ = or.Args[1] 22658 y := or.Args[0] 22659 s1 := or.Args[1] 22660 if s1.Op != OpS390XSLDconst { 22661 break 22662 } 22663 j1 := s1.AuxInt 22664 x1 := s1.Args[0] 22665 if x1.Op != OpS390XMOVBZload { 22666 break 22667 } 22668 i1 := x1.AuxInt 22669 if x1.Aux != s { 22670 break 22671 } 22672 _ = x1.Args[1] 22673 if p != x1.Args[0] { 22674 break 22675 } 22676 if mem != x1.Args[1] { 22677 break 22678 } 22679 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)) { 22680 break 22681 } 22682 b = mergePoint(b, x0, x1) 22683 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22684 v.reset(OpCopy) 22685 v.AddArg(v0) 22686 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22687 v1.AuxInt = j1 22688 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22689 v2.AuxInt = i0 22690 v2.Aux = s 22691 v2.AddArg(p) 22692 v2.AddArg(mem) 22693 v1.AddArg(v2) 22694 v0.AddArg(v1) 22695 v0.AddArg(y) 22696 return true 22697 } 22698 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 22699 // 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) 22700 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 22701 for { 22702 _ = v.Args[1] 22703 or := v.Args[0] 22704 if or.Op != OpS390XOR { 22705 break 22706 } 22707 _ = or.Args[1] 22708 s1 := or.Args[0] 22709 if s1.Op != OpS390XSLDconst { 22710 break 22711 } 22712 j1 := s1.AuxInt 22713 x1 := s1.Args[0] 22714 if x1.Op != OpS390XMOVBZload { 22715 break 22716 } 22717 i1 := x1.AuxInt 22718 s := x1.Aux 22719 _ = x1.Args[1] 22720 p := x1.Args[0] 22721 mem := x1.Args[1] 22722 y := or.Args[1] 22723 s0 := v.Args[1] 22724 if s0.Op != OpS390XSLDconst { 22725 break 22726 } 22727 j0 := s0.AuxInt 22728 x0 := s0.Args[0] 22729 if x0.Op != OpS390XMOVBZload { 22730 break 22731 } 22732 i0 := x0.AuxInt 22733 if x0.Aux != s { 22734 break 22735 } 22736 _ = x0.Args[1] 22737 if p != x0.Args[0] { 22738 break 22739 } 22740 if mem != x0.Args[1] { 22741 break 22742 } 22743 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)) { 22744 break 22745 } 22746 b = mergePoint(b, x0, x1) 22747 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22748 v.reset(OpCopy) 22749 v.AddArg(v0) 22750 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22751 v1.AuxInt = j1 22752 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22753 v2.AuxInt = i0 22754 v2.Aux = s 22755 v2.AddArg(p) 22756 v2.AddArg(mem) 22757 v1.AddArg(v2) 22758 v0.AddArg(v1) 22759 v0.AddArg(y) 22760 return true 22761 } 22762 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 22763 // 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) 22764 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 22765 for { 22766 _ = v.Args[1] 22767 or := v.Args[0] 22768 if or.Op != OpS390XOR { 22769 break 22770 } 22771 _ = or.Args[1] 22772 y := or.Args[0] 22773 s1 := or.Args[1] 22774 if s1.Op != OpS390XSLDconst { 22775 break 22776 } 22777 j1 := s1.AuxInt 22778 x1 := s1.Args[0] 22779 if x1.Op != OpS390XMOVBZload { 22780 break 22781 } 22782 i1 := x1.AuxInt 22783 s := x1.Aux 22784 _ = x1.Args[1] 22785 p := x1.Args[0] 22786 mem := x1.Args[1] 22787 s0 := v.Args[1] 22788 if s0.Op != OpS390XSLDconst { 22789 break 22790 } 22791 j0 := s0.AuxInt 22792 x0 := s0.Args[0] 22793 if x0.Op != OpS390XMOVBZload { 22794 break 22795 } 22796 i0 := x0.AuxInt 22797 if x0.Aux != s { 22798 break 22799 } 22800 _ = x0.Args[1] 22801 if p != x0.Args[0] { 22802 break 22803 } 22804 if mem != x0.Args[1] { 22805 break 22806 } 22807 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)) { 22808 break 22809 } 22810 b = mergePoint(b, x0, x1) 22811 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22812 v.reset(OpCopy) 22813 v.AddArg(v0) 22814 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22815 v1.AuxInt = j1 22816 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 22817 v2.AuxInt = i0 22818 v2.Aux = s 22819 v2.AddArg(p) 22820 v2.AddArg(mem) 22821 v1.AddArg(v2) 22822 v0.AddArg(v1) 22823 v0.AddArg(y) 22824 return true 22825 } 22826 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 22827 // 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) 22828 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 22829 for { 22830 _ = v.Args[1] 22831 s0 := v.Args[0] 22832 if s0.Op != OpS390XSLDconst { 22833 break 22834 } 22835 j0 := s0.AuxInt 22836 x0 := s0.Args[0] 22837 if x0.Op != OpS390XMOVHZload { 22838 break 22839 } 22840 i0 := x0.AuxInt 22841 s := x0.Aux 22842 _ = x0.Args[1] 22843 p := x0.Args[0] 22844 mem := x0.Args[1] 22845 or := v.Args[1] 22846 if or.Op != OpS390XOR { 22847 break 22848 } 22849 _ = or.Args[1] 22850 s1 := or.Args[0] 22851 if s1.Op != OpS390XSLDconst { 22852 break 22853 } 22854 j1 := s1.AuxInt 22855 x1 := s1.Args[0] 22856 if x1.Op != OpS390XMOVHZload { 22857 break 22858 } 22859 i1 := x1.AuxInt 22860 if x1.Aux != s { 22861 break 22862 } 22863 _ = x1.Args[1] 22864 if p != x1.Args[0] { 22865 break 22866 } 22867 if mem != x1.Args[1] { 22868 break 22869 } 22870 y := or.Args[1] 22871 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)) { 22872 break 22873 } 22874 b = mergePoint(b, x0, x1) 22875 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22876 v.reset(OpCopy) 22877 v.AddArg(v0) 22878 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22879 v1.AuxInt = j1 22880 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 22881 v2.AuxInt = i0 22882 v2.Aux = s 22883 v2.AddArg(p) 22884 v2.AddArg(mem) 22885 v1.AddArg(v2) 22886 v0.AddArg(v1) 22887 v0.AddArg(y) 22888 return true 22889 } 22890 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 22891 // 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) 22892 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 22893 for { 22894 _ = v.Args[1] 22895 s0 := v.Args[0] 22896 if s0.Op != OpS390XSLDconst { 22897 break 22898 } 22899 j0 := s0.AuxInt 22900 x0 := s0.Args[0] 22901 if x0.Op != OpS390XMOVHZload { 22902 break 22903 } 22904 i0 := x0.AuxInt 22905 s := x0.Aux 22906 _ = x0.Args[1] 22907 p := x0.Args[0] 22908 mem := x0.Args[1] 22909 or := v.Args[1] 22910 if or.Op != OpS390XOR { 22911 break 22912 } 22913 _ = or.Args[1] 22914 y := or.Args[0] 22915 s1 := or.Args[1] 22916 if s1.Op != OpS390XSLDconst { 22917 break 22918 } 22919 j1 := s1.AuxInt 22920 x1 := s1.Args[0] 22921 if x1.Op != OpS390XMOVHZload { 22922 break 22923 } 22924 i1 := x1.AuxInt 22925 if x1.Aux != s { 22926 break 22927 } 22928 _ = x1.Args[1] 22929 if p != x1.Args[0] { 22930 break 22931 } 22932 if mem != x1.Args[1] { 22933 break 22934 } 22935 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)) { 22936 break 22937 } 22938 b = mergePoint(b, x0, x1) 22939 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22940 v.reset(OpCopy) 22941 v.AddArg(v0) 22942 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22943 v1.AuxInt = j1 22944 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 22945 v2.AuxInt = i0 22946 v2.Aux = s 22947 v2.AddArg(p) 22948 v2.AddArg(mem) 22949 v1.AddArg(v2) 22950 v0.AddArg(v1) 22951 v0.AddArg(y) 22952 return true 22953 } 22954 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 22955 // 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) 22956 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 22957 for { 22958 _ = v.Args[1] 22959 or := v.Args[0] 22960 if or.Op != OpS390XOR { 22961 break 22962 } 22963 _ = or.Args[1] 22964 s1 := or.Args[0] 22965 if s1.Op != OpS390XSLDconst { 22966 break 22967 } 22968 j1 := s1.AuxInt 22969 x1 := s1.Args[0] 22970 if x1.Op != OpS390XMOVHZload { 22971 break 22972 } 22973 i1 := x1.AuxInt 22974 s := x1.Aux 22975 _ = x1.Args[1] 22976 p := x1.Args[0] 22977 mem := x1.Args[1] 22978 y := or.Args[1] 22979 s0 := v.Args[1] 22980 if s0.Op != OpS390XSLDconst { 22981 break 22982 } 22983 j0 := s0.AuxInt 22984 x0 := s0.Args[0] 22985 if x0.Op != OpS390XMOVHZload { 22986 break 22987 } 22988 i0 := x0.AuxInt 22989 if x0.Aux != s { 22990 break 22991 } 22992 _ = x0.Args[1] 22993 if p != x0.Args[0] { 22994 break 22995 } 22996 if mem != x0.Args[1] { 22997 break 22998 } 22999 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)) { 23000 break 23001 } 23002 b = mergePoint(b, x0, x1) 23003 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23004 v.reset(OpCopy) 23005 v.AddArg(v0) 23006 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23007 v1.AuxInt = j1 23008 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 23009 v2.AuxInt = i0 23010 v2.Aux = s 23011 v2.AddArg(p) 23012 v2.AddArg(mem) 23013 v1.AddArg(v2) 23014 v0.AddArg(v1) 23015 v0.AddArg(y) 23016 return true 23017 } 23018 return false 23019 } 23020 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 23021 b := v.Block 23022 _ = b 23023 typ := &b.Func.Config.Types 23024 _ = typ 23025 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 23026 // 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) 23027 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 23028 for { 23029 _ = v.Args[1] 23030 or := v.Args[0] 23031 if or.Op != OpS390XOR { 23032 break 23033 } 23034 _ = or.Args[1] 23035 y := or.Args[0] 23036 s1 := or.Args[1] 23037 if s1.Op != OpS390XSLDconst { 23038 break 23039 } 23040 j1 := s1.AuxInt 23041 x1 := s1.Args[0] 23042 if x1.Op != OpS390XMOVHZload { 23043 break 23044 } 23045 i1 := x1.AuxInt 23046 s := x1.Aux 23047 _ = x1.Args[1] 23048 p := x1.Args[0] 23049 mem := x1.Args[1] 23050 s0 := v.Args[1] 23051 if s0.Op != OpS390XSLDconst { 23052 break 23053 } 23054 j0 := s0.AuxInt 23055 x0 := s0.Args[0] 23056 if x0.Op != OpS390XMOVHZload { 23057 break 23058 } 23059 i0 := x0.AuxInt 23060 if x0.Aux != s { 23061 break 23062 } 23063 _ = x0.Args[1] 23064 if p != x0.Args[0] { 23065 break 23066 } 23067 if mem != x0.Args[1] { 23068 break 23069 } 23070 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)) { 23071 break 23072 } 23073 b = mergePoint(b, x0, x1) 23074 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23075 v.reset(OpCopy) 23076 v.AddArg(v0) 23077 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23078 v1.AuxInt = j1 23079 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 23080 v2.AuxInt = i0 23081 v2.Aux = s 23082 v2.AddArg(p) 23083 v2.AddArg(mem) 23084 v1.AddArg(v2) 23085 v0.AddArg(v1) 23086 v0.AddArg(y) 23087 return true 23088 } 23089 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 23090 // 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) 23091 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23092 for { 23093 _ = v.Args[1] 23094 x1 := v.Args[0] 23095 if x1.Op != OpS390XMOVBZloadidx { 23096 break 23097 } 23098 i1 := x1.AuxInt 23099 s := x1.Aux 23100 _ = x1.Args[2] 23101 p := x1.Args[0] 23102 idx := x1.Args[1] 23103 mem := x1.Args[2] 23104 sh := v.Args[1] 23105 if sh.Op != OpS390XSLDconst { 23106 break 23107 } 23108 if sh.AuxInt != 8 { 23109 break 23110 } 23111 x0 := sh.Args[0] 23112 if x0.Op != OpS390XMOVBZloadidx { 23113 break 23114 } 23115 i0 := x0.AuxInt 23116 if x0.Aux != s { 23117 break 23118 } 23119 _ = x0.Args[2] 23120 if p != x0.Args[0] { 23121 break 23122 } 23123 if idx != x0.Args[1] { 23124 break 23125 } 23126 if mem != x0.Args[2] { 23127 break 23128 } 23129 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)) { 23130 break 23131 } 23132 b = mergePoint(b, x0, x1) 23133 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23134 v.reset(OpCopy) 23135 v.AddArg(v0) 23136 v0.AuxInt = i0 23137 v0.Aux = s 23138 v0.AddArg(p) 23139 v0.AddArg(idx) 23140 v0.AddArg(mem) 23141 return true 23142 } 23143 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 23144 // 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) 23145 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23146 for { 23147 _ = v.Args[1] 23148 x1 := v.Args[0] 23149 if x1.Op != OpS390XMOVBZloadidx { 23150 break 23151 } 23152 i1 := x1.AuxInt 23153 s := x1.Aux 23154 _ = x1.Args[2] 23155 idx := x1.Args[0] 23156 p := x1.Args[1] 23157 mem := x1.Args[2] 23158 sh := v.Args[1] 23159 if sh.Op != OpS390XSLDconst { 23160 break 23161 } 23162 if sh.AuxInt != 8 { 23163 break 23164 } 23165 x0 := sh.Args[0] 23166 if x0.Op != OpS390XMOVBZloadidx { 23167 break 23168 } 23169 i0 := x0.AuxInt 23170 if x0.Aux != s { 23171 break 23172 } 23173 _ = x0.Args[2] 23174 if p != x0.Args[0] { 23175 break 23176 } 23177 if idx != x0.Args[1] { 23178 break 23179 } 23180 if mem != x0.Args[2] { 23181 break 23182 } 23183 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)) { 23184 break 23185 } 23186 b = mergePoint(b, x0, x1) 23187 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23188 v.reset(OpCopy) 23189 v.AddArg(v0) 23190 v0.AuxInt = i0 23191 v0.Aux = s 23192 v0.AddArg(p) 23193 v0.AddArg(idx) 23194 v0.AddArg(mem) 23195 return true 23196 } 23197 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 23198 // 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) 23199 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23200 for { 23201 _ = v.Args[1] 23202 x1 := v.Args[0] 23203 if x1.Op != OpS390XMOVBZloadidx { 23204 break 23205 } 23206 i1 := x1.AuxInt 23207 s := x1.Aux 23208 _ = x1.Args[2] 23209 p := x1.Args[0] 23210 idx := x1.Args[1] 23211 mem := x1.Args[2] 23212 sh := v.Args[1] 23213 if sh.Op != OpS390XSLDconst { 23214 break 23215 } 23216 if sh.AuxInt != 8 { 23217 break 23218 } 23219 x0 := sh.Args[0] 23220 if x0.Op != OpS390XMOVBZloadidx { 23221 break 23222 } 23223 i0 := x0.AuxInt 23224 if x0.Aux != s { 23225 break 23226 } 23227 _ = x0.Args[2] 23228 if idx != x0.Args[0] { 23229 break 23230 } 23231 if p != x0.Args[1] { 23232 break 23233 } 23234 if mem != x0.Args[2] { 23235 break 23236 } 23237 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)) { 23238 break 23239 } 23240 b = mergePoint(b, x0, x1) 23241 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23242 v.reset(OpCopy) 23243 v.AddArg(v0) 23244 v0.AuxInt = i0 23245 v0.Aux = s 23246 v0.AddArg(p) 23247 v0.AddArg(idx) 23248 v0.AddArg(mem) 23249 return true 23250 } 23251 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 23252 // 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) 23253 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23254 for { 23255 _ = v.Args[1] 23256 x1 := v.Args[0] 23257 if x1.Op != OpS390XMOVBZloadidx { 23258 break 23259 } 23260 i1 := x1.AuxInt 23261 s := x1.Aux 23262 _ = x1.Args[2] 23263 idx := x1.Args[0] 23264 p := x1.Args[1] 23265 mem := x1.Args[2] 23266 sh := v.Args[1] 23267 if sh.Op != OpS390XSLDconst { 23268 break 23269 } 23270 if sh.AuxInt != 8 { 23271 break 23272 } 23273 x0 := sh.Args[0] 23274 if x0.Op != OpS390XMOVBZloadidx { 23275 break 23276 } 23277 i0 := x0.AuxInt 23278 if x0.Aux != s { 23279 break 23280 } 23281 _ = x0.Args[2] 23282 if idx != x0.Args[0] { 23283 break 23284 } 23285 if p != x0.Args[1] { 23286 break 23287 } 23288 if mem != x0.Args[2] { 23289 break 23290 } 23291 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)) { 23292 break 23293 } 23294 b = mergePoint(b, x0, x1) 23295 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23296 v.reset(OpCopy) 23297 v.AddArg(v0) 23298 v0.AuxInt = i0 23299 v0.Aux = s 23300 v0.AddArg(p) 23301 v0.AddArg(idx) 23302 v0.AddArg(mem) 23303 return true 23304 } 23305 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 23306 // 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) 23307 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23308 for { 23309 _ = v.Args[1] 23310 sh := v.Args[0] 23311 if sh.Op != OpS390XSLDconst { 23312 break 23313 } 23314 if sh.AuxInt != 8 { 23315 break 23316 } 23317 x0 := sh.Args[0] 23318 if x0.Op != OpS390XMOVBZloadidx { 23319 break 23320 } 23321 i0 := x0.AuxInt 23322 s := x0.Aux 23323 _ = x0.Args[2] 23324 p := x0.Args[0] 23325 idx := x0.Args[1] 23326 mem := x0.Args[2] 23327 x1 := v.Args[1] 23328 if x1.Op != OpS390XMOVBZloadidx { 23329 break 23330 } 23331 i1 := x1.AuxInt 23332 if x1.Aux != s { 23333 break 23334 } 23335 _ = x1.Args[2] 23336 if p != x1.Args[0] { 23337 break 23338 } 23339 if idx != x1.Args[1] { 23340 break 23341 } 23342 if mem != x1.Args[2] { 23343 break 23344 } 23345 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)) { 23346 break 23347 } 23348 b = mergePoint(b, x0, x1) 23349 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23350 v.reset(OpCopy) 23351 v.AddArg(v0) 23352 v0.AuxInt = i0 23353 v0.Aux = s 23354 v0.AddArg(p) 23355 v0.AddArg(idx) 23356 v0.AddArg(mem) 23357 return true 23358 } 23359 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 23360 // 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) 23361 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23362 for { 23363 _ = v.Args[1] 23364 sh := v.Args[0] 23365 if sh.Op != OpS390XSLDconst { 23366 break 23367 } 23368 if sh.AuxInt != 8 { 23369 break 23370 } 23371 x0 := sh.Args[0] 23372 if x0.Op != OpS390XMOVBZloadidx { 23373 break 23374 } 23375 i0 := x0.AuxInt 23376 s := x0.Aux 23377 _ = x0.Args[2] 23378 idx := x0.Args[0] 23379 p := x0.Args[1] 23380 mem := x0.Args[2] 23381 x1 := v.Args[1] 23382 if x1.Op != OpS390XMOVBZloadidx { 23383 break 23384 } 23385 i1 := x1.AuxInt 23386 if x1.Aux != s { 23387 break 23388 } 23389 _ = x1.Args[2] 23390 if p != x1.Args[0] { 23391 break 23392 } 23393 if idx != x1.Args[1] { 23394 break 23395 } 23396 if mem != x1.Args[2] { 23397 break 23398 } 23399 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)) { 23400 break 23401 } 23402 b = mergePoint(b, x0, x1) 23403 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23404 v.reset(OpCopy) 23405 v.AddArg(v0) 23406 v0.AuxInt = i0 23407 v0.Aux = s 23408 v0.AddArg(p) 23409 v0.AddArg(idx) 23410 v0.AddArg(mem) 23411 return true 23412 } 23413 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 23414 // 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) 23415 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23416 for { 23417 _ = v.Args[1] 23418 sh := v.Args[0] 23419 if sh.Op != OpS390XSLDconst { 23420 break 23421 } 23422 if sh.AuxInt != 8 { 23423 break 23424 } 23425 x0 := sh.Args[0] 23426 if x0.Op != OpS390XMOVBZloadidx { 23427 break 23428 } 23429 i0 := x0.AuxInt 23430 s := x0.Aux 23431 _ = x0.Args[2] 23432 p := x0.Args[0] 23433 idx := x0.Args[1] 23434 mem := x0.Args[2] 23435 x1 := v.Args[1] 23436 if x1.Op != OpS390XMOVBZloadidx { 23437 break 23438 } 23439 i1 := x1.AuxInt 23440 if x1.Aux != s { 23441 break 23442 } 23443 _ = x1.Args[2] 23444 if idx != x1.Args[0] { 23445 break 23446 } 23447 if p != x1.Args[1] { 23448 break 23449 } 23450 if mem != x1.Args[2] { 23451 break 23452 } 23453 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)) { 23454 break 23455 } 23456 b = mergePoint(b, x0, x1) 23457 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23458 v.reset(OpCopy) 23459 v.AddArg(v0) 23460 v0.AuxInt = i0 23461 v0.Aux = s 23462 v0.AddArg(p) 23463 v0.AddArg(idx) 23464 v0.AddArg(mem) 23465 return true 23466 } 23467 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 23468 // 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) 23469 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 23470 for { 23471 _ = v.Args[1] 23472 sh := v.Args[0] 23473 if sh.Op != OpS390XSLDconst { 23474 break 23475 } 23476 if sh.AuxInt != 8 { 23477 break 23478 } 23479 x0 := sh.Args[0] 23480 if x0.Op != OpS390XMOVBZloadidx { 23481 break 23482 } 23483 i0 := x0.AuxInt 23484 s := x0.Aux 23485 _ = x0.Args[2] 23486 idx := x0.Args[0] 23487 p := x0.Args[1] 23488 mem := x0.Args[2] 23489 x1 := v.Args[1] 23490 if x1.Op != OpS390XMOVBZloadidx { 23491 break 23492 } 23493 i1 := x1.AuxInt 23494 if x1.Aux != s { 23495 break 23496 } 23497 _ = x1.Args[2] 23498 if idx != x1.Args[0] { 23499 break 23500 } 23501 if p != x1.Args[1] { 23502 break 23503 } 23504 if mem != x1.Args[2] { 23505 break 23506 } 23507 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)) { 23508 break 23509 } 23510 b = mergePoint(b, x0, x1) 23511 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23512 v.reset(OpCopy) 23513 v.AddArg(v0) 23514 v0.AuxInt = i0 23515 v0.Aux = s 23516 v0.AddArg(p) 23517 v0.AddArg(idx) 23518 v0.AddArg(mem) 23519 return true 23520 } 23521 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 23522 // 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) 23523 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23524 for { 23525 _ = v.Args[1] 23526 x1 := v.Args[0] 23527 if x1.Op != OpS390XMOVHZloadidx { 23528 break 23529 } 23530 i1 := x1.AuxInt 23531 s := x1.Aux 23532 _ = x1.Args[2] 23533 p := x1.Args[0] 23534 idx := x1.Args[1] 23535 mem := x1.Args[2] 23536 sh := v.Args[1] 23537 if sh.Op != OpS390XSLDconst { 23538 break 23539 } 23540 if sh.AuxInt != 16 { 23541 break 23542 } 23543 x0 := sh.Args[0] 23544 if x0.Op != OpS390XMOVHZloadidx { 23545 break 23546 } 23547 i0 := x0.AuxInt 23548 if x0.Aux != s { 23549 break 23550 } 23551 _ = x0.Args[2] 23552 if p != x0.Args[0] { 23553 break 23554 } 23555 if idx != x0.Args[1] { 23556 break 23557 } 23558 if mem != x0.Args[2] { 23559 break 23560 } 23561 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)) { 23562 break 23563 } 23564 b = mergePoint(b, x0, x1) 23565 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23566 v.reset(OpCopy) 23567 v.AddArg(v0) 23568 v0.AuxInt = i0 23569 v0.Aux = s 23570 v0.AddArg(p) 23571 v0.AddArg(idx) 23572 v0.AddArg(mem) 23573 return true 23574 } 23575 return false 23576 } 23577 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 23578 b := v.Block 23579 _ = b 23580 typ := &b.Func.Config.Types 23581 _ = typ 23582 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 23583 // 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) 23584 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23585 for { 23586 _ = v.Args[1] 23587 x1 := v.Args[0] 23588 if x1.Op != OpS390XMOVHZloadidx { 23589 break 23590 } 23591 i1 := x1.AuxInt 23592 s := x1.Aux 23593 _ = x1.Args[2] 23594 idx := x1.Args[0] 23595 p := x1.Args[1] 23596 mem := x1.Args[2] 23597 sh := v.Args[1] 23598 if sh.Op != OpS390XSLDconst { 23599 break 23600 } 23601 if sh.AuxInt != 16 { 23602 break 23603 } 23604 x0 := sh.Args[0] 23605 if x0.Op != OpS390XMOVHZloadidx { 23606 break 23607 } 23608 i0 := x0.AuxInt 23609 if x0.Aux != s { 23610 break 23611 } 23612 _ = x0.Args[2] 23613 if p != x0.Args[0] { 23614 break 23615 } 23616 if idx != x0.Args[1] { 23617 break 23618 } 23619 if mem != x0.Args[2] { 23620 break 23621 } 23622 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)) { 23623 break 23624 } 23625 b = mergePoint(b, x0, x1) 23626 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23627 v.reset(OpCopy) 23628 v.AddArg(v0) 23629 v0.AuxInt = i0 23630 v0.Aux = s 23631 v0.AddArg(p) 23632 v0.AddArg(idx) 23633 v0.AddArg(mem) 23634 return true 23635 } 23636 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 23637 // 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) 23638 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23639 for { 23640 _ = v.Args[1] 23641 x1 := v.Args[0] 23642 if x1.Op != OpS390XMOVHZloadidx { 23643 break 23644 } 23645 i1 := x1.AuxInt 23646 s := x1.Aux 23647 _ = x1.Args[2] 23648 p := x1.Args[0] 23649 idx := x1.Args[1] 23650 mem := x1.Args[2] 23651 sh := v.Args[1] 23652 if sh.Op != OpS390XSLDconst { 23653 break 23654 } 23655 if sh.AuxInt != 16 { 23656 break 23657 } 23658 x0 := sh.Args[0] 23659 if x0.Op != OpS390XMOVHZloadidx { 23660 break 23661 } 23662 i0 := x0.AuxInt 23663 if x0.Aux != s { 23664 break 23665 } 23666 _ = x0.Args[2] 23667 if idx != x0.Args[0] { 23668 break 23669 } 23670 if p != x0.Args[1] { 23671 break 23672 } 23673 if mem != x0.Args[2] { 23674 break 23675 } 23676 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)) { 23677 break 23678 } 23679 b = mergePoint(b, x0, x1) 23680 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23681 v.reset(OpCopy) 23682 v.AddArg(v0) 23683 v0.AuxInt = i0 23684 v0.Aux = s 23685 v0.AddArg(p) 23686 v0.AddArg(idx) 23687 v0.AddArg(mem) 23688 return true 23689 } 23690 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 23691 // 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) 23692 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23693 for { 23694 _ = v.Args[1] 23695 x1 := v.Args[0] 23696 if x1.Op != OpS390XMOVHZloadidx { 23697 break 23698 } 23699 i1 := x1.AuxInt 23700 s := x1.Aux 23701 _ = x1.Args[2] 23702 idx := x1.Args[0] 23703 p := x1.Args[1] 23704 mem := x1.Args[2] 23705 sh := v.Args[1] 23706 if sh.Op != OpS390XSLDconst { 23707 break 23708 } 23709 if sh.AuxInt != 16 { 23710 break 23711 } 23712 x0 := sh.Args[0] 23713 if x0.Op != OpS390XMOVHZloadidx { 23714 break 23715 } 23716 i0 := x0.AuxInt 23717 if x0.Aux != s { 23718 break 23719 } 23720 _ = x0.Args[2] 23721 if idx != x0.Args[0] { 23722 break 23723 } 23724 if p != x0.Args[1] { 23725 break 23726 } 23727 if mem != x0.Args[2] { 23728 break 23729 } 23730 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)) { 23731 break 23732 } 23733 b = mergePoint(b, x0, x1) 23734 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23735 v.reset(OpCopy) 23736 v.AddArg(v0) 23737 v0.AuxInt = i0 23738 v0.Aux = s 23739 v0.AddArg(p) 23740 v0.AddArg(idx) 23741 v0.AddArg(mem) 23742 return true 23743 } 23744 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 23745 // 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) 23746 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23747 for { 23748 _ = v.Args[1] 23749 sh := v.Args[0] 23750 if sh.Op != OpS390XSLDconst { 23751 break 23752 } 23753 if sh.AuxInt != 16 { 23754 break 23755 } 23756 x0 := sh.Args[0] 23757 if x0.Op != OpS390XMOVHZloadidx { 23758 break 23759 } 23760 i0 := x0.AuxInt 23761 s := x0.Aux 23762 _ = x0.Args[2] 23763 p := x0.Args[0] 23764 idx := x0.Args[1] 23765 mem := x0.Args[2] 23766 x1 := v.Args[1] 23767 if x1.Op != OpS390XMOVHZloadidx { 23768 break 23769 } 23770 i1 := x1.AuxInt 23771 if x1.Aux != s { 23772 break 23773 } 23774 _ = x1.Args[2] 23775 if p != x1.Args[0] { 23776 break 23777 } 23778 if idx != x1.Args[1] { 23779 break 23780 } 23781 if mem != x1.Args[2] { 23782 break 23783 } 23784 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)) { 23785 break 23786 } 23787 b = mergePoint(b, x0, x1) 23788 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23789 v.reset(OpCopy) 23790 v.AddArg(v0) 23791 v0.AuxInt = i0 23792 v0.Aux = s 23793 v0.AddArg(p) 23794 v0.AddArg(idx) 23795 v0.AddArg(mem) 23796 return true 23797 } 23798 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 23799 // 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) 23800 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23801 for { 23802 _ = v.Args[1] 23803 sh := v.Args[0] 23804 if sh.Op != OpS390XSLDconst { 23805 break 23806 } 23807 if sh.AuxInt != 16 { 23808 break 23809 } 23810 x0 := sh.Args[0] 23811 if x0.Op != OpS390XMOVHZloadidx { 23812 break 23813 } 23814 i0 := x0.AuxInt 23815 s := x0.Aux 23816 _ = x0.Args[2] 23817 idx := x0.Args[0] 23818 p := x0.Args[1] 23819 mem := x0.Args[2] 23820 x1 := v.Args[1] 23821 if x1.Op != OpS390XMOVHZloadidx { 23822 break 23823 } 23824 i1 := x1.AuxInt 23825 if x1.Aux != s { 23826 break 23827 } 23828 _ = x1.Args[2] 23829 if p != x1.Args[0] { 23830 break 23831 } 23832 if idx != x1.Args[1] { 23833 break 23834 } 23835 if mem != x1.Args[2] { 23836 break 23837 } 23838 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)) { 23839 break 23840 } 23841 b = mergePoint(b, x0, x1) 23842 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23843 v.reset(OpCopy) 23844 v.AddArg(v0) 23845 v0.AuxInt = i0 23846 v0.Aux = s 23847 v0.AddArg(p) 23848 v0.AddArg(idx) 23849 v0.AddArg(mem) 23850 return true 23851 } 23852 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 23853 // 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) 23854 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23855 for { 23856 _ = v.Args[1] 23857 sh := v.Args[0] 23858 if sh.Op != OpS390XSLDconst { 23859 break 23860 } 23861 if sh.AuxInt != 16 { 23862 break 23863 } 23864 x0 := sh.Args[0] 23865 if x0.Op != OpS390XMOVHZloadidx { 23866 break 23867 } 23868 i0 := x0.AuxInt 23869 s := x0.Aux 23870 _ = x0.Args[2] 23871 p := x0.Args[0] 23872 idx := x0.Args[1] 23873 mem := x0.Args[2] 23874 x1 := v.Args[1] 23875 if x1.Op != OpS390XMOVHZloadidx { 23876 break 23877 } 23878 i1 := x1.AuxInt 23879 if x1.Aux != s { 23880 break 23881 } 23882 _ = x1.Args[2] 23883 if idx != x1.Args[0] { 23884 break 23885 } 23886 if p != x1.Args[1] { 23887 break 23888 } 23889 if mem != x1.Args[2] { 23890 break 23891 } 23892 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)) { 23893 break 23894 } 23895 b = mergePoint(b, x0, x1) 23896 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23897 v.reset(OpCopy) 23898 v.AddArg(v0) 23899 v0.AuxInt = i0 23900 v0.Aux = s 23901 v0.AddArg(p) 23902 v0.AddArg(idx) 23903 v0.AddArg(mem) 23904 return true 23905 } 23906 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 23907 // 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) 23908 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 23909 for { 23910 _ = v.Args[1] 23911 sh := v.Args[0] 23912 if sh.Op != OpS390XSLDconst { 23913 break 23914 } 23915 if sh.AuxInt != 16 { 23916 break 23917 } 23918 x0 := sh.Args[0] 23919 if x0.Op != OpS390XMOVHZloadidx { 23920 break 23921 } 23922 i0 := x0.AuxInt 23923 s := x0.Aux 23924 _ = x0.Args[2] 23925 idx := x0.Args[0] 23926 p := x0.Args[1] 23927 mem := x0.Args[2] 23928 x1 := v.Args[1] 23929 if x1.Op != OpS390XMOVHZloadidx { 23930 break 23931 } 23932 i1 := x1.AuxInt 23933 if x1.Aux != s { 23934 break 23935 } 23936 _ = x1.Args[2] 23937 if idx != x1.Args[0] { 23938 break 23939 } 23940 if p != x1.Args[1] { 23941 break 23942 } 23943 if mem != x1.Args[2] { 23944 break 23945 } 23946 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)) { 23947 break 23948 } 23949 b = mergePoint(b, x0, x1) 23950 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23951 v.reset(OpCopy) 23952 v.AddArg(v0) 23953 v0.AuxInt = i0 23954 v0.Aux = s 23955 v0.AddArg(p) 23956 v0.AddArg(idx) 23957 v0.AddArg(mem) 23958 return true 23959 } 23960 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 23961 // 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) 23962 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 23963 for { 23964 _ = v.Args[1] 23965 x1 := v.Args[0] 23966 if x1.Op != OpS390XMOVWZloadidx { 23967 break 23968 } 23969 i1 := x1.AuxInt 23970 s := x1.Aux 23971 _ = x1.Args[2] 23972 p := x1.Args[0] 23973 idx := x1.Args[1] 23974 mem := x1.Args[2] 23975 sh := v.Args[1] 23976 if sh.Op != OpS390XSLDconst { 23977 break 23978 } 23979 if sh.AuxInt != 32 { 23980 break 23981 } 23982 x0 := sh.Args[0] 23983 if x0.Op != OpS390XMOVWZloadidx { 23984 break 23985 } 23986 i0 := x0.AuxInt 23987 if x0.Aux != s { 23988 break 23989 } 23990 _ = x0.Args[2] 23991 if p != x0.Args[0] { 23992 break 23993 } 23994 if idx != x0.Args[1] { 23995 break 23996 } 23997 if mem != x0.Args[2] { 23998 break 23999 } 24000 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)) { 24001 break 24002 } 24003 b = mergePoint(b, x0, x1) 24004 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24005 v.reset(OpCopy) 24006 v.AddArg(v0) 24007 v0.AuxInt = i0 24008 v0.Aux = s 24009 v0.AddArg(p) 24010 v0.AddArg(idx) 24011 v0.AddArg(mem) 24012 return true 24013 } 24014 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 24015 // 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) 24016 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24017 for { 24018 _ = v.Args[1] 24019 x1 := v.Args[0] 24020 if x1.Op != OpS390XMOVWZloadidx { 24021 break 24022 } 24023 i1 := x1.AuxInt 24024 s := x1.Aux 24025 _ = x1.Args[2] 24026 idx := x1.Args[0] 24027 p := x1.Args[1] 24028 mem := x1.Args[2] 24029 sh := v.Args[1] 24030 if sh.Op != OpS390XSLDconst { 24031 break 24032 } 24033 if sh.AuxInt != 32 { 24034 break 24035 } 24036 x0 := sh.Args[0] 24037 if x0.Op != OpS390XMOVWZloadidx { 24038 break 24039 } 24040 i0 := x0.AuxInt 24041 if x0.Aux != s { 24042 break 24043 } 24044 _ = x0.Args[2] 24045 if p != x0.Args[0] { 24046 break 24047 } 24048 if idx != x0.Args[1] { 24049 break 24050 } 24051 if mem != x0.Args[2] { 24052 break 24053 } 24054 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)) { 24055 break 24056 } 24057 b = mergePoint(b, x0, x1) 24058 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24059 v.reset(OpCopy) 24060 v.AddArg(v0) 24061 v0.AuxInt = i0 24062 v0.Aux = s 24063 v0.AddArg(p) 24064 v0.AddArg(idx) 24065 v0.AddArg(mem) 24066 return true 24067 } 24068 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 24069 // 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) 24070 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24071 for { 24072 _ = v.Args[1] 24073 x1 := v.Args[0] 24074 if x1.Op != OpS390XMOVWZloadidx { 24075 break 24076 } 24077 i1 := x1.AuxInt 24078 s := x1.Aux 24079 _ = x1.Args[2] 24080 p := x1.Args[0] 24081 idx := x1.Args[1] 24082 mem := x1.Args[2] 24083 sh := v.Args[1] 24084 if sh.Op != OpS390XSLDconst { 24085 break 24086 } 24087 if sh.AuxInt != 32 { 24088 break 24089 } 24090 x0 := sh.Args[0] 24091 if x0.Op != OpS390XMOVWZloadidx { 24092 break 24093 } 24094 i0 := x0.AuxInt 24095 if x0.Aux != s { 24096 break 24097 } 24098 _ = x0.Args[2] 24099 if idx != x0.Args[0] { 24100 break 24101 } 24102 if p != x0.Args[1] { 24103 break 24104 } 24105 if mem != x0.Args[2] { 24106 break 24107 } 24108 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)) { 24109 break 24110 } 24111 b = mergePoint(b, x0, x1) 24112 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24113 v.reset(OpCopy) 24114 v.AddArg(v0) 24115 v0.AuxInt = i0 24116 v0.Aux = s 24117 v0.AddArg(p) 24118 v0.AddArg(idx) 24119 v0.AddArg(mem) 24120 return true 24121 } 24122 return false 24123 } 24124 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 24125 b := v.Block 24126 _ = b 24127 typ := &b.Func.Config.Types 24128 _ = typ 24129 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx 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) (MOVDloadidx [i0] {s} p idx mem) 24132 for { 24133 _ = v.Args[1] 24134 x1 := v.Args[0] 24135 if x1.Op != OpS390XMOVWZloadidx { 24136 break 24137 } 24138 i1 := x1.AuxInt 24139 s := x1.Aux 24140 _ = x1.Args[2] 24141 idx := x1.Args[0] 24142 p := x1.Args[1] 24143 mem := x1.Args[2] 24144 sh := v.Args[1] 24145 if sh.Op != OpS390XSLDconst { 24146 break 24147 } 24148 if sh.AuxInt != 32 { 24149 break 24150 } 24151 x0 := sh.Args[0] 24152 if x0.Op != OpS390XMOVWZloadidx { 24153 break 24154 } 24155 i0 := x0.AuxInt 24156 if x0.Aux != s { 24157 break 24158 } 24159 _ = x0.Args[2] 24160 if idx != x0.Args[0] { 24161 break 24162 } 24163 if p != x0.Args[1] { 24164 break 24165 } 24166 if mem != x0.Args[2] { 24167 break 24168 } 24169 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)) { 24170 break 24171 } 24172 b = mergePoint(b, x0, x1) 24173 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24174 v.reset(OpCopy) 24175 v.AddArg(v0) 24176 v0.AuxInt = i0 24177 v0.Aux = s 24178 v0.AddArg(p) 24179 v0.AddArg(idx) 24180 v0.AddArg(mem) 24181 return true 24182 } 24183 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 24184 // 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) 24185 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24186 for { 24187 _ = v.Args[1] 24188 sh := v.Args[0] 24189 if sh.Op != OpS390XSLDconst { 24190 break 24191 } 24192 if sh.AuxInt != 32 { 24193 break 24194 } 24195 x0 := sh.Args[0] 24196 if x0.Op != OpS390XMOVWZloadidx { 24197 break 24198 } 24199 i0 := x0.AuxInt 24200 s := x0.Aux 24201 _ = x0.Args[2] 24202 p := x0.Args[0] 24203 idx := x0.Args[1] 24204 mem := x0.Args[2] 24205 x1 := v.Args[1] 24206 if x1.Op != OpS390XMOVWZloadidx { 24207 break 24208 } 24209 i1 := x1.AuxInt 24210 if x1.Aux != s { 24211 break 24212 } 24213 _ = x1.Args[2] 24214 if p != x1.Args[0] { 24215 break 24216 } 24217 if idx != x1.Args[1] { 24218 break 24219 } 24220 if mem != x1.Args[2] { 24221 break 24222 } 24223 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)) { 24224 break 24225 } 24226 b = mergePoint(b, x0, x1) 24227 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24228 v.reset(OpCopy) 24229 v.AddArg(v0) 24230 v0.AuxInt = i0 24231 v0.Aux = s 24232 v0.AddArg(p) 24233 v0.AddArg(idx) 24234 v0.AddArg(mem) 24235 return true 24236 } 24237 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 24238 // 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) 24239 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24240 for { 24241 _ = v.Args[1] 24242 sh := v.Args[0] 24243 if sh.Op != OpS390XSLDconst { 24244 break 24245 } 24246 if sh.AuxInt != 32 { 24247 break 24248 } 24249 x0 := sh.Args[0] 24250 if x0.Op != OpS390XMOVWZloadidx { 24251 break 24252 } 24253 i0 := x0.AuxInt 24254 s := x0.Aux 24255 _ = x0.Args[2] 24256 idx := x0.Args[0] 24257 p := x0.Args[1] 24258 mem := x0.Args[2] 24259 x1 := v.Args[1] 24260 if x1.Op != OpS390XMOVWZloadidx { 24261 break 24262 } 24263 i1 := x1.AuxInt 24264 if x1.Aux != s { 24265 break 24266 } 24267 _ = x1.Args[2] 24268 if p != x1.Args[0] { 24269 break 24270 } 24271 if idx != x1.Args[1] { 24272 break 24273 } 24274 if mem != x1.Args[2] { 24275 break 24276 } 24277 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)) { 24278 break 24279 } 24280 b = mergePoint(b, x0, x1) 24281 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24282 v.reset(OpCopy) 24283 v.AddArg(v0) 24284 v0.AuxInt = i0 24285 v0.Aux = s 24286 v0.AddArg(p) 24287 v0.AddArg(idx) 24288 v0.AddArg(mem) 24289 return true 24290 } 24291 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 24292 // 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) 24293 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24294 for { 24295 _ = v.Args[1] 24296 sh := v.Args[0] 24297 if sh.Op != OpS390XSLDconst { 24298 break 24299 } 24300 if sh.AuxInt != 32 { 24301 break 24302 } 24303 x0 := sh.Args[0] 24304 if x0.Op != OpS390XMOVWZloadidx { 24305 break 24306 } 24307 i0 := x0.AuxInt 24308 s := x0.Aux 24309 _ = x0.Args[2] 24310 p := x0.Args[0] 24311 idx := x0.Args[1] 24312 mem := x0.Args[2] 24313 x1 := v.Args[1] 24314 if x1.Op != OpS390XMOVWZloadidx { 24315 break 24316 } 24317 i1 := x1.AuxInt 24318 if x1.Aux != s { 24319 break 24320 } 24321 _ = x1.Args[2] 24322 if idx != x1.Args[0] { 24323 break 24324 } 24325 if p != x1.Args[1] { 24326 break 24327 } 24328 if mem != x1.Args[2] { 24329 break 24330 } 24331 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)) { 24332 break 24333 } 24334 b = mergePoint(b, x0, x1) 24335 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24336 v.reset(OpCopy) 24337 v.AddArg(v0) 24338 v0.AuxInt = i0 24339 v0.Aux = s 24340 v0.AddArg(p) 24341 v0.AddArg(idx) 24342 v0.AddArg(mem) 24343 return true 24344 } 24345 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 24346 // 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) 24347 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 24348 for { 24349 _ = v.Args[1] 24350 sh := v.Args[0] 24351 if sh.Op != OpS390XSLDconst { 24352 break 24353 } 24354 if sh.AuxInt != 32 { 24355 break 24356 } 24357 x0 := sh.Args[0] 24358 if x0.Op != OpS390XMOVWZloadidx { 24359 break 24360 } 24361 i0 := x0.AuxInt 24362 s := x0.Aux 24363 _ = x0.Args[2] 24364 idx := x0.Args[0] 24365 p := x0.Args[1] 24366 mem := x0.Args[2] 24367 x1 := v.Args[1] 24368 if x1.Op != OpS390XMOVWZloadidx { 24369 break 24370 } 24371 i1 := x1.AuxInt 24372 if x1.Aux != s { 24373 break 24374 } 24375 _ = x1.Args[2] 24376 if idx != x1.Args[0] { 24377 break 24378 } 24379 if p != x1.Args[1] { 24380 break 24381 } 24382 if mem != x1.Args[2] { 24383 break 24384 } 24385 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)) { 24386 break 24387 } 24388 b = mergePoint(b, x0, x1) 24389 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 24390 v.reset(OpCopy) 24391 v.AddArg(v0) 24392 v0.AuxInt = i0 24393 v0.Aux = s 24394 v0.AddArg(p) 24395 v0.AddArg(idx) 24396 v0.AddArg(mem) 24397 return true 24398 } 24399 // 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)) 24400 // 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) 24401 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24402 for { 24403 _ = v.Args[1] 24404 s0 := v.Args[0] 24405 if s0.Op != OpS390XSLDconst { 24406 break 24407 } 24408 j0 := s0.AuxInt 24409 x0 := s0.Args[0] 24410 if x0.Op != OpS390XMOVBZloadidx { 24411 break 24412 } 24413 i0 := x0.AuxInt 24414 s := x0.Aux 24415 _ = x0.Args[2] 24416 p := x0.Args[0] 24417 idx := x0.Args[1] 24418 mem := x0.Args[2] 24419 or := v.Args[1] 24420 if or.Op != OpS390XOR { 24421 break 24422 } 24423 _ = or.Args[1] 24424 s1 := or.Args[0] 24425 if s1.Op != OpS390XSLDconst { 24426 break 24427 } 24428 j1 := s1.AuxInt 24429 x1 := s1.Args[0] 24430 if x1.Op != OpS390XMOVBZloadidx { 24431 break 24432 } 24433 i1 := x1.AuxInt 24434 if x1.Aux != s { 24435 break 24436 } 24437 _ = x1.Args[2] 24438 if p != x1.Args[0] { 24439 break 24440 } 24441 if idx != x1.Args[1] { 24442 break 24443 } 24444 if mem != x1.Args[2] { 24445 break 24446 } 24447 y := or.Args[1] 24448 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)) { 24449 break 24450 } 24451 b = mergePoint(b, x0, x1) 24452 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24453 v.reset(OpCopy) 24454 v.AddArg(v0) 24455 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24456 v1.AuxInt = j1 24457 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24458 v2.AuxInt = i0 24459 v2.Aux = s 24460 v2.AddArg(p) 24461 v2.AddArg(idx) 24462 v2.AddArg(mem) 24463 v1.AddArg(v2) 24464 v0.AddArg(v1) 24465 v0.AddArg(y) 24466 return true 24467 } 24468 // 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)) 24469 // 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) 24470 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24471 for { 24472 _ = v.Args[1] 24473 s0 := v.Args[0] 24474 if s0.Op != OpS390XSLDconst { 24475 break 24476 } 24477 j0 := s0.AuxInt 24478 x0 := s0.Args[0] 24479 if x0.Op != OpS390XMOVBZloadidx { 24480 break 24481 } 24482 i0 := x0.AuxInt 24483 s := x0.Aux 24484 _ = x0.Args[2] 24485 idx := x0.Args[0] 24486 p := x0.Args[1] 24487 mem := x0.Args[2] 24488 or := v.Args[1] 24489 if or.Op != OpS390XOR { 24490 break 24491 } 24492 _ = or.Args[1] 24493 s1 := or.Args[0] 24494 if s1.Op != OpS390XSLDconst { 24495 break 24496 } 24497 j1 := s1.AuxInt 24498 x1 := s1.Args[0] 24499 if x1.Op != OpS390XMOVBZloadidx { 24500 break 24501 } 24502 i1 := x1.AuxInt 24503 if x1.Aux != s { 24504 break 24505 } 24506 _ = x1.Args[2] 24507 if p != x1.Args[0] { 24508 break 24509 } 24510 if idx != x1.Args[1] { 24511 break 24512 } 24513 if mem != x1.Args[2] { 24514 break 24515 } 24516 y := or.Args[1] 24517 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)) { 24518 break 24519 } 24520 b = mergePoint(b, x0, x1) 24521 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24522 v.reset(OpCopy) 24523 v.AddArg(v0) 24524 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24525 v1.AuxInt = j1 24526 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24527 v2.AuxInt = i0 24528 v2.Aux = s 24529 v2.AddArg(p) 24530 v2.AddArg(idx) 24531 v2.AddArg(mem) 24532 v1.AddArg(v2) 24533 v0.AddArg(v1) 24534 v0.AddArg(y) 24535 return true 24536 } 24537 // 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)) 24538 // 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) 24539 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24540 for { 24541 _ = v.Args[1] 24542 s0 := v.Args[0] 24543 if s0.Op != OpS390XSLDconst { 24544 break 24545 } 24546 j0 := s0.AuxInt 24547 x0 := s0.Args[0] 24548 if x0.Op != OpS390XMOVBZloadidx { 24549 break 24550 } 24551 i0 := x0.AuxInt 24552 s := x0.Aux 24553 _ = x0.Args[2] 24554 p := x0.Args[0] 24555 idx := x0.Args[1] 24556 mem := x0.Args[2] 24557 or := v.Args[1] 24558 if or.Op != OpS390XOR { 24559 break 24560 } 24561 _ = or.Args[1] 24562 s1 := or.Args[0] 24563 if s1.Op != OpS390XSLDconst { 24564 break 24565 } 24566 j1 := s1.AuxInt 24567 x1 := s1.Args[0] 24568 if x1.Op != OpS390XMOVBZloadidx { 24569 break 24570 } 24571 i1 := x1.AuxInt 24572 if x1.Aux != s { 24573 break 24574 } 24575 _ = x1.Args[2] 24576 if idx != x1.Args[0] { 24577 break 24578 } 24579 if p != x1.Args[1] { 24580 break 24581 } 24582 if mem != x1.Args[2] { 24583 break 24584 } 24585 y := or.Args[1] 24586 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)) { 24587 break 24588 } 24589 b = mergePoint(b, x0, x1) 24590 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24591 v.reset(OpCopy) 24592 v.AddArg(v0) 24593 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24594 v1.AuxInt = j1 24595 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24596 v2.AuxInt = i0 24597 v2.Aux = s 24598 v2.AddArg(p) 24599 v2.AddArg(idx) 24600 v2.AddArg(mem) 24601 v1.AddArg(v2) 24602 v0.AddArg(v1) 24603 v0.AddArg(y) 24604 return true 24605 } 24606 // 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)) 24607 // 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) 24608 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24609 for { 24610 _ = v.Args[1] 24611 s0 := v.Args[0] 24612 if s0.Op != OpS390XSLDconst { 24613 break 24614 } 24615 j0 := s0.AuxInt 24616 x0 := s0.Args[0] 24617 if x0.Op != OpS390XMOVBZloadidx { 24618 break 24619 } 24620 i0 := x0.AuxInt 24621 s := x0.Aux 24622 _ = x0.Args[2] 24623 idx := x0.Args[0] 24624 p := x0.Args[1] 24625 mem := x0.Args[2] 24626 or := v.Args[1] 24627 if or.Op != OpS390XOR { 24628 break 24629 } 24630 _ = or.Args[1] 24631 s1 := or.Args[0] 24632 if s1.Op != OpS390XSLDconst { 24633 break 24634 } 24635 j1 := s1.AuxInt 24636 x1 := s1.Args[0] 24637 if x1.Op != OpS390XMOVBZloadidx { 24638 break 24639 } 24640 i1 := x1.AuxInt 24641 if x1.Aux != s { 24642 break 24643 } 24644 _ = x1.Args[2] 24645 if idx != x1.Args[0] { 24646 break 24647 } 24648 if p != x1.Args[1] { 24649 break 24650 } 24651 if mem != x1.Args[2] { 24652 break 24653 } 24654 y := or.Args[1] 24655 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)) { 24656 break 24657 } 24658 b = mergePoint(b, x0, x1) 24659 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24660 v.reset(OpCopy) 24661 v.AddArg(v0) 24662 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24663 v1.AuxInt = j1 24664 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24665 v2.AuxInt = i0 24666 v2.Aux = s 24667 v2.AddArg(p) 24668 v2.AddArg(idx) 24669 v2.AddArg(mem) 24670 v1.AddArg(v2) 24671 v0.AddArg(v1) 24672 v0.AddArg(y) 24673 return true 24674 } 24675 // 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)))) 24676 // 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) 24677 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24678 for { 24679 _ = v.Args[1] 24680 s0 := v.Args[0] 24681 if s0.Op != OpS390XSLDconst { 24682 break 24683 } 24684 j0 := s0.AuxInt 24685 x0 := s0.Args[0] 24686 if x0.Op != OpS390XMOVBZloadidx { 24687 break 24688 } 24689 i0 := x0.AuxInt 24690 s := x0.Aux 24691 _ = x0.Args[2] 24692 p := x0.Args[0] 24693 idx := x0.Args[1] 24694 mem := x0.Args[2] 24695 or := v.Args[1] 24696 if or.Op != OpS390XOR { 24697 break 24698 } 24699 _ = or.Args[1] 24700 y := or.Args[0] 24701 s1 := or.Args[1] 24702 if s1.Op != OpS390XSLDconst { 24703 break 24704 } 24705 j1 := s1.AuxInt 24706 x1 := s1.Args[0] 24707 if x1.Op != OpS390XMOVBZloadidx { 24708 break 24709 } 24710 i1 := x1.AuxInt 24711 if x1.Aux != s { 24712 break 24713 } 24714 _ = x1.Args[2] 24715 if p != x1.Args[0] { 24716 break 24717 } 24718 if idx != x1.Args[1] { 24719 break 24720 } 24721 if mem != x1.Args[2] { 24722 break 24723 } 24724 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)) { 24725 break 24726 } 24727 b = mergePoint(b, x0, x1) 24728 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24729 v.reset(OpCopy) 24730 v.AddArg(v0) 24731 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24732 v1.AuxInt = j1 24733 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24734 v2.AuxInt = i0 24735 v2.Aux = s 24736 v2.AddArg(p) 24737 v2.AddArg(idx) 24738 v2.AddArg(mem) 24739 v1.AddArg(v2) 24740 v0.AddArg(v1) 24741 v0.AddArg(y) 24742 return true 24743 } 24744 return false 24745 } 24746 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 24747 b := v.Block 24748 _ = b 24749 typ := &b.Func.Config.Types 24750 _ = typ 24751 // 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)))) 24752 // 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) 24753 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24754 for { 24755 _ = v.Args[1] 24756 s0 := v.Args[0] 24757 if s0.Op != OpS390XSLDconst { 24758 break 24759 } 24760 j0 := s0.AuxInt 24761 x0 := s0.Args[0] 24762 if x0.Op != OpS390XMOVBZloadidx { 24763 break 24764 } 24765 i0 := x0.AuxInt 24766 s := x0.Aux 24767 _ = x0.Args[2] 24768 idx := x0.Args[0] 24769 p := x0.Args[1] 24770 mem := x0.Args[2] 24771 or := v.Args[1] 24772 if or.Op != OpS390XOR { 24773 break 24774 } 24775 _ = or.Args[1] 24776 y := or.Args[0] 24777 s1 := or.Args[1] 24778 if s1.Op != OpS390XSLDconst { 24779 break 24780 } 24781 j1 := s1.AuxInt 24782 x1 := s1.Args[0] 24783 if x1.Op != OpS390XMOVBZloadidx { 24784 break 24785 } 24786 i1 := x1.AuxInt 24787 if x1.Aux != s { 24788 break 24789 } 24790 _ = x1.Args[2] 24791 if p != x1.Args[0] { 24792 break 24793 } 24794 if idx != x1.Args[1] { 24795 break 24796 } 24797 if mem != x1.Args[2] { 24798 break 24799 } 24800 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)) { 24801 break 24802 } 24803 b = mergePoint(b, x0, x1) 24804 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24805 v.reset(OpCopy) 24806 v.AddArg(v0) 24807 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24808 v1.AuxInt = j1 24809 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24810 v2.AuxInt = i0 24811 v2.Aux = s 24812 v2.AddArg(p) 24813 v2.AddArg(idx) 24814 v2.AddArg(mem) 24815 v1.AddArg(v2) 24816 v0.AddArg(v1) 24817 v0.AddArg(y) 24818 return true 24819 } 24820 // 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)))) 24821 // 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) 24822 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24823 for { 24824 _ = v.Args[1] 24825 s0 := v.Args[0] 24826 if s0.Op != OpS390XSLDconst { 24827 break 24828 } 24829 j0 := s0.AuxInt 24830 x0 := s0.Args[0] 24831 if x0.Op != OpS390XMOVBZloadidx { 24832 break 24833 } 24834 i0 := x0.AuxInt 24835 s := x0.Aux 24836 _ = x0.Args[2] 24837 p := x0.Args[0] 24838 idx := x0.Args[1] 24839 mem := x0.Args[2] 24840 or := v.Args[1] 24841 if or.Op != OpS390XOR { 24842 break 24843 } 24844 _ = or.Args[1] 24845 y := or.Args[0] 24846 s1 := or.Args[1] 24847 if s1.Op != OpS390XSLDconst { 24848 break 24849 } 24850 j1 := s1.AuxInt 24851 x1 := s1.Args[0] 24852 if x1.Op != OpS390XMOVBZloadidx { 24853 break 24854 } 24855 i1 := x1.AuxInt 24856 if x1.Aux != s { 24857 break 24858 } 24859 _ = x1.Args[2] 24860 if idx != x1.Args[0] { 24861 break 24862 } 24863 if p != x1.Args[1] { 24864 break 24865 } 24866 if mem != x1.Args[2] { 24867 break 24868 } 24869 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)) { 24870 break 24871 } 24872 b = mergePoint(b, x0, x1) 24873 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24874 v.reset(OpCopy) 24875 v.AddArg(v0) 24876 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24877 v1.AuxInt = j1 24878 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24879 v2.AuxInt = i0 24880 v2.Aux = s 24881 v2.AddArg(p) 24882 v2.AddArg(idx) 24883 v2.AddArg(mem) 24884 v1.AddArg(v2) 24885 v0.AddArg(v1) 24886 v0.AddArg(y) 24887 return true 24888 } 24889 // 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)))) 24890 // 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) 24891 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24892 for { 24893 _ = v.Args[1] 24894 s0 := v.Args[0] 24895 if s0.Op != OpS390XSLDconst { 24896 break 24897 } 24898 j0 := s0.AuxInt 24899 x0 := s0.Args[0] 24900 if x0.Op != OpS390XMOVBZloadidx { 24901 break 24902 } 24903 i0 := x0.AuxInt 24904 s := x0.Aux 24905 _ = x0.Args[2] 24906 idx := x0.Args[0] 24907 p := x0.Args[1] 24908 mem := x0.Args[2] 24909 or := v.Args[1] 24910 if or.Op != OpS390XOR { 24911 break 24912 } 24913 _ = or.Args[1] 24914 y := or.Args[0] 24915 s1 := or.Args[1] 24916 if s1.Op != OpS390XSLDconst { 24917 break 24918 } 24919 j1 := s1.AuxInt 24920 x1 := s1.Args[0] 24921 if x1.Op != OpS390XMOVBZloadidx { 24922 break 24923 } 24924 i1 := x1.AuxInt 24925 if x1.Aux != s { 24926 break 24927 } 24928 _ = x1.Args[2] 24929 if idx != x1.Args[0] { 24930 break 24931 } 24932 if p != x1.Args[1] { 24933 break 24934 } 24935 if mem != x1.Args[2] { 24936 break 24937 } 24938 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)) { 24939 break 24940 } 24941 b = mergePoint(b, x0, x1) 24942 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24943 v.reset(OpCopy) 24944 v.AddArg(v0) 24945 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24946 v1.AuxInt = j1 24947 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 24948 v2.AuxInt = i0 24949 v2.Aux = s 24950 v2.AddArg(p) 24951 v2.AddArg(idx) 24952 v2.AddArg(mem) 24953 v1.AddArg(v2) 24954 v0.AddArg(v1) 24955 v0.AddArg(y) 24956 return true 24957 } 24958 // 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))) 24959 // 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) 24960 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 24961 for { 24962 _ = v.Args[1] 24963 or := v.Args[0] 24964 if or.Op != OpS390XOR { 24965 break 24966 } 24967 _ = or.Args[1] 24968 s1 := or.Args[0] 24969 if s1.Op != OpS390XSLDconst { 24970 break 24971 } 24972 j1 := s1.AuxInt 24973 x1 := s1.Args[0] 24974 if x1.Op != OpS390XMOVBZloadidx { 24975 break 24976 } 24977 i1 := x1.AuxInt 24978 s := x1.Aux 24979 _ = x1.Args[2] 24980 p := x1.Args[0] 24981 idx := x1.Args[1] 24982 mem := x1.Args[2] 24983 y := or.Args[1] 24984 s0 := v.Args[1] 24985 if s0.Op != OpS390XSLDconst { 24986 break 24987 } 24988 j0 := s0.AuxInt 24989 x0 := s0.Args[0] 24990 if x0.Op != OpS390XMOVBZloadidx { 24991 break 24992 } 24993 i0 := x0.AuxInt 24994 if x0.Aux != s { 24995 break 24996 } 24997 _ = x0.Args[2] 24998 if p != x0.Args[0] { 24999 break 25000 } 25001 if idx != x0.Args[1] { 25002 break 25003 } 25004 if mem != x0.Args[2] { 25005 break 25006 } 25007 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)) { 25008 break 25009 } 25010 b = mergePoint(b, x0, x1) 25011 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25012 v.reset(OpCopy) 25013 v.AddArg(v0) 25014 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25015 v1.AuxInt = j1 25016 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25017 v2.AuxInt = i0 25018 v2.Aux = s 25019 v2.AddArg(p) 25020 v2.AddArg(idx) 25021 v2.AddArg(mem) 25022 v1.AddArg(v2) 25023 v0.AddArg(v1) 25024 v0.AddArg(y) 25025 return true 25026 } 25027 // 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))) 25028 // 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) 25029 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25030 for { 25031 _ = v.Args[1] 25032 or := v.Args[0] 25033 if or.Op != OpS390XOR { 25034 break 25035 } 25036 _ = or.Args[1] 25037 s1 := or.Args[0] 25038 if s1.Op != OpS390XSLDconst { 25039 break 25040 } 25041 j1 := s1.AuxInt 25042 x1 := s1.Args[0] 25043 if x1.Op != OpS390XMOVBZloadidx { 25044 break 25045 } 25046 i1 := x1.AuxInt 25047 s := x1.Aux 25048 _ = x1.Args[2] 25049 idx := x1.Args[0] 25050 p := x1.Args[1] 25051 mem := x1.Args[2] 25052 y := or.Args[1] 25053 s0 := v.Args[1] 25054 if s0.Op != OpS390XSLDconst { 25055 break 25056 } 25057 j0 := s0.AuxInt 25058 x0 := s0.Args[0] 25059 if x0.Op != OpS390XMOVBZloadidx { 25060 break 25061 } 25062 i0 := x0.AuxInt 25063 if x0.Aux != s { 25064 break 25065 } 25066 _ = x0.Args[2] 25067 if p != x0.Args[0] { 25068 break 25069 } 25070 if idx != x0.Args[1] { 25071 break 25072 } 25073 if mem != x0.Args[2] { 25074 break 25075 } 25076 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)) { 25077 break 25078 } 25079 b = mergePoint(b, x0, x1) 25080 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25081 v.reset(OpCopy) 25082 v.AddArg(v0) 25083 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25084 v1.AuxInt = j1 25085 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25086 v2.AuxInt = i0 25087 v2.Aux = s 25088 v2.AddArg(p) 25089 v2.AddArg(idx) 25090 v2.AddArg(mem) 25091 v1.AddArg(v2) 25092 v0.AddArg(v1) 25093 v0.AddArg(y) 25094 return true 25095 } 25096 // 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))) 25097 // 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) 25098 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25099 for { 25100 _ = v.Args[1] 25101 or := v.Args[0] 25102 if or.Op != OpS390XOR { 25103 break 25104 } 25105 _ = or.Args[1] 25106 y := or.Args[0] 25107 s1 := or.Args[1] 25108 if s1.Op != OpS390XSLDconst { 25109 break 25110 } 25111 j1 := s1.AuxInt 25112 x1 := s1.Args[0] 25113 if x1.Op != OpS390XMOVBZloadidx { 25114 break 25115 } 25116 i1 := x1.AuxInt 25117 s := x1.Aux 25118 _ = x1.Args[2] 25119 p := x1.Args[0] 25120 idx := x1.Args[1] 25121 mem := x1.Args[2] 25122 s0 := v.Args[1] 25123 if s0.Op != OpS390XSLDconst { 25124 break 25125 } 25126 j0 := s0.AuxInt 25127 x0 := s0.Args[0] 25128 if x0.Op != OpS390XMOVBZloadidx { 25129 break 25130 } 25131 i0 := x0.AuxInt 25132 if x0.Aux != s { 25133 break 25134 } 25135 _ = x0.Args[2] 25136 if p != x0.Args[0] { 25137 break 25138 } 25139 if idx != x0.Args[1] { 25140 break 25141 } 25142 if mem != x0.Args[2] { 25143 break 25144 } 25145 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)) { 25146 break 25147 } 25148 b = mergePoint(b, x0, x1) 25149 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25150 v.reset(OpCopy) 25151 v.AddArg(v0) 25152 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25153 v1.AuxInt = j1 25154 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25155 v2.AuxInt = i0 25156 v2.Aux = s 25157 v2.AddArg(p) 25158 v2.AddArg(idx) 25159 v2.AddArg(mem) 25160 v1.AddArg(v2) 25161 v0.AddArg(v1) 25162 v0.AddArg(y) 25163 return true 25164 } 25165 // 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))) 25166 // 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) 25167 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25168 for { 25169 _ = v.Args[1] 25170 or := v.Args[0] 25171 if or.Op != OpS390XOR { 25172 break 25173 } 25174 _ = or.Args[1] 25175 y := or.Args[0] 25176 s1 := or.Args[1] 25177 if s1.Op != OpS390XSLDconst { 25178 break 25179 } 25180 j1 := s1.AuxInt 25181 x1 := s1.Args[0] 25182 if x1.Op != OpS390XMOVBZloadidx { 25183 break 25184 } 25185 i1 := x1.AuxInt 25186 s := x1.Aux 25187 _ = x1.Args[2] 25188 idx := x1.Args[0] 25189 p := x1.Args[1] 25190 mem := x1.Args[2] 25191 s0 := v.Args[1] 25192 if s0.Op != OpS390XSLDconst { 25193 break 25194 } 25195 j0 := s0.AuxInt 25196 x0 := s0.Args[0] 25197 if x0.Op != OpS390XMOVBZloadidx { 25198 break 25199 } 25200 i0 := x0.AuxInt 25201 if x0.Aux != s { 25202 break 25203 } 25204 _ = x0.Args[2] 25205 if p != x0.Args[0] { 25206 break 25207 } 25208 if idx != x0.Args[1] { 25209 break 25210 } 25211 if mem != x0.Args[2] { 25212 break 25213 } 25214 if !(i1 == i0+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)) { 25215 break 25216 } 25217 b = mergePoint(b, x0, x1) 25218 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25219 v.reset(OpCopy) 25220 v.AddArg(v0) 25221 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25222 v1.AuxInt = j1 25223 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25224 v2.AuxInt = i0 25225 v2.Aux = s 25226 v2.AddArg(p) 25227 v2.AddArg(idx) 25228 v2.AddArg(mem) 25229 v1.AddArg(v2) 25230 v0.AddArg(v1) 25231 v0.AddArg(y) 25232 return true 25233 } 25234 // 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))) 25235 // 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) 25236 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25237 for { 25238 _ = v.Args[1] 25239 or := v.Args[0] 25240 if or.Op != OpS390XOR { 25241 break 25242 } 25243 _ = or.Args[1] 25244 s1 := or.Args[0] 25245 if s1.Op != OpS390XSLDconst { 25246 break 25247 } 25248 j1 := s1.AuxInt 25249 x1 := s1.Args[0] 25250 if x1.Op != OpS390XMOVBZloadidx { 25251 break 25252 } 25253 i1 := x1.AuxInt 25254 s := x1.Aux 25255 _ = x1.Args[2] 25256 p := x1.Args[0] 25257 idx := x1.Args[1] 25258 mem := x1.Args[2] 25259 y := or.Args[1] 25260 s0 := v.Args[1] 25261 if s0.Op != OpS390XSLDconst { 25262 break 25263 } 25264 j0 := s0.AuxInt 25265 x0 := s0.Args[0] 25266 if x0.Op != OpS390XMOVBZloadidx { 25267 break 25268 } 25269 i0 := x0.AuxInt 25270 if x0.Aux != s { 25271 break 25272 } 25273 _ = x0.Args[2] 25274 if idx != x0.Args[0] { 25275 break 25276 } 25277 if p != x0.Args[1] { 25278 break 25279 } 25280 if mem != x0.Args[2] { 25281 break 25282 } 25283 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)) { 25284 break 25285 } 25286 b = mergePoint(b, x0, x1) 25287 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25288 v.reset(OpCopy) 25289 v.AddArg(v0) 25290 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25291 v1.AuxInt = j1 25292 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25293 v2.AuxInt = i0 25294 v2.Aux = s 25295 v2.AddArg(p) 25296 v2.AddArg(idx) 25297 v2.AddArg(mem) 25298 v1.AddArg(v2) 25299 v0.AddArg(v1) 25300 v0.AddArg(y) 25301 return true 25302 } 25303 // 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))) 25304 // 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) 25305 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25306 for { 25307 _ = v.Args[1] 25308 or := v.Args[0] 25309 if or.Op != OpS390XOR { 25310 break 25311 } 25312 _ = or.Args[1] 25313 s1 := or.Args[0] 25314 if s1.Op != OpS390XSLDconst { 25315 break 25316 } 25317 j1 := s1.AuxInt 25318 x1 := s1.Args[0] 25319 if x1.Op != OpS390XMOVBZloadidx { 25320 break 25321 } 25322 i1 := x1.AuxInt 25323 s := x1.Aux 25324 _ = x1.Args[2] 25325 idx := x1.Args[0] 25326 p := x1.Args[1] 25327 mem := x1.Args[2] 25328 y := or.Args[1] 25329 s0 := v.Args[1] 25330 if s0.Op != OpS390XSLDconst { 25331 break 25332 } 25333 j0 := s0.AuxInt 25334 x0 := s0.Args[0] 25335 if x0.Op != OpS390XMOVBZloadidx { 25336 break 25337 } 25338 i0 := x0.AuxInt 25339 if x0.Aux != s { 25340 break 25341 } 25342 _ = x0.Args[2] 25343 if idx != x0.Args[0] { 25344 break 25345 } 25346 if p != x0.Args[1] { 25347 break 25348 } 25349 if mem != x0.Args[2] { 25350 break 25351 } 25352 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)) { 25353 break 25354 } 25355 b = mergePoint(b, x0, x1) 25356 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25357 v.reset(OpCopy) 25358 v.AddArg(v0) 25359 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25360 v1.AuxInt = j1 25361 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25362 v2.AuxInt = i0 25363 v2.Aux = s 25364 v2.AddArg(p) 25365 v2.AddArg(idx) 25366 v2.AddArg(mem) 25367 v1.AddArg(v2) 25368 v0.AddArg(v1) 25369 v0.AddArg(y) 25370 return true 25371 } 25372 // 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))) 25373 // 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) 25374 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25375 for { 25376 _ = v.Args[1] 25377 or := v.Args[0] 25378 if or.Op != OpS390XOR { 25379 break 25380 } 25381 _ = or.Args[1] 25382 y := or.Args[0] 25383 s1 := or.Args[1] 25384 if s1.Op != OpS390XSLDconst { 25385 break 25386 } 25387 j1 := s1.AuxInt 25388 x1 := s1.Args[0] 25389 if x1.Op != OpS390XMOVBZloadidx { 25390 break 25391 } 25392 i1 := x1.AuxInt 25393 s := x1.Aux 25394 _ = x1.Args[2] 25395 p := x1.Args[0] 25396 idx := x1.Args[1] 25397 mem := x1.Args[2] 25398 s0 := v.Args[1] 25399 if s0.Op != OpS390XSLDconst { 25400 break 25401 } 25402 j0 := s0.AuxInt 25403 x0 := s0.Args[0] 25404 if x0.Op != OpS390XMOVBZloadidx { 25405 break 25406 } 25407 i0 := x0.AuxInt 25408 if x0.Aux != s { 25409 break 25410 } 25411 _ = x0.Args[2] 25412 if idx != x0.Args[0] { 25413 break 25414 } 25415 if p != x0.Args[1] { 25416 break 25417 } 25418 if mem != x0.Args[2] { 25419 break 25420 } 25421 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)) { 25422 break 25423 } 25424 b = mergePoint(b, x0, x1) 25425 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25426 v.reset(OpCopy) 25427 v.AddArg(v0) 25428 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25429 v1.AuxInt = j1 25430 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25431 v2.AuxInt = i0 25432 v2.Aux = s 25433 v2.AddArg(p) 25434 v2.AddArg(idx) 25435 v2.AddArg(mem) 25436 v1.AddArg(v2) 25437 v0.AddArg(v1) 25438 v0.AddArg(y) 25439 return true 25440 } 25441 return false 25442 } 25443 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 25444 b := v.Block 25445 _ = b 25446 typ := &b.Func.Config.Types 25447 _ = typ 25448 // 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))) 25449 // 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) 25450 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 25451 for { 25452 _ = v.Args[1] 25453 or := v.Args[0] 25454 if or.Op != OpS390XOR { 25455 break 25456 } 25457 _ = or.Args[1] 25458 y := or.Args[0] 25459 s1 := or.Args[1] 25460 if s1.Op != OpS390XSLDconst { 25461 break 25462 } 25463 j1 := s1.AuxInt 25464 x1 := s1.Args[0] 25465 if x1.Op != OpS390XMOVBZloadidx { 25466 break 25467 } 25468 i1 := x1.AuxInt 25469 s := x1.Aux 25470 _ = x1.Args[2] 25471 idx := x1.Args[0] 25472 p := x1.Args[1] 25473 mem := x1.Args[2] 25474 s0 := v.Args[1] 25475 if s0.Op != OpS390XSLDconst { 25476 break 25477 } 25478 j0 := s0.AuxInt 25479 x0 := s0.Args[0] 25480 if x0.Op != OpS390XMOVBZloadidx { 25481 break 25482 } 25483 i0 := x0.AuxInt 25484 if x0.Aux != s { 25485 break 25486 } 25487 _ = x0.Args[2] 25488 if idx != x0.Args[0] { 25489 break 25490 } 25491 if p != x0.Args[1] { 25492 break 25493 } 25494 if mem != x0.Args[2] { 25495 break 25496 } 25497 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)) { 25498 break 25499 } 25500 b = mergePoint(b, x0, x1) 25501 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25502 v.reset(OpCopy) 25503 v.AddArg(v0) 25504 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25505 v1.AuxInt = j1 25506 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 25507 v2.AuxInt = i0 25508 v2.Aux = s 25509 v2.AddArg(p) 25510 v2.AddArg(idx) 25511 v2.AddArg(mem) 25512 v1.AddArg(v2) 25513 v0.AddArg(v1) 25514 v0.AddArg(y) 25515 return true 25516 } 25517 // 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)) 25518 // 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) 25519 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25520 for { 25521 _ = v.Args[1] 25522 s0 := v.Args[0] 25523 if s0.Op != OpS390XSLDconst { 25524 break 25525 } 25526 j0 := s0.AuxInt 25527 x0 := s0.Args[0] 25528 if x0.Op != OpS390XMOVHZloadidx { 25529 break 25530 } 25531 i0 := x0.AuxInt 25532 s := x0.Aux 25533 _ = x0.Args[2] 25534 p := x0.Args[0] 25535 idx := x0.Args[1] 25536 mem := x0.Args[2] 25537 or := v.Args[1] 25538 if or.Op != OpS390XOR { 25539 break 25540 } 25541 _ = or.Args[1] 25542 s1 := or.Args[0] 25543 if s1.Op != OpS390XSLDconst { 25544 break 25545 } 25546 j1 := s1.AuxInt 25547 x1 := s1.Args[0] 25548 if x1.Op != OpS390XMOVHZloadidx { 25549 break 25550 } 25551 i1 := x1.AuxInt 25552 if x1.Aux != s { 25553 break 25554 } 25555 _ = x1.Args[2] 25556 if p != x1.Args[0] { 25557 break 25558 } 25559 if idx != x1.Args[1] { 25560 break 25561 } 25562 if mem != x1.Args[2] { 25563 break 25564 } 25565 y := or.Args[1] 25566 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)) { 25567 break 25568 } 25569 b = mergePoint(b, x0, x1) 25570 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25571 v.reset(OpCopy) 25572 v.AddArg(v0) 25573 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25574 v1.AuxInt = j1 25575 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25576 v2.AuxInt = i0 25577 v2.Aux = s 25578 v2.AddArg(p) 25579 v2.AddArg(idx) 25580 v2.AddArg(mem) 25581 v1.AddArg(v2) 25582 v0.AddArg(v1) 25583 v0.AddArg(y) 25584 return true 25585 } 25586 // 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)) 25587 // 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) 25588 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25589 for { 25590 _ = v.Args[1] 25591 s0 := v.Args[0] 25592 if s0.Op != OpS390XSLDconst { 25593 break 25594 } 25595 j0 := s0.AuxInt 25596 x0 := s0.Args[0] 25597 if x0.Op != OpS390XMOVHZloadidx { 25598 break 25599 } 25600 i0 := x0.AuxInt 25601 s := x0.Aux 25602 _ = x0.Args[2] 25603 idx := x0.Args[0] 25604 p := x0.Args[1] 25605 mem := x0.Args[2] 25606 or := v.Args[1] 25607 if or.Op != OpS390XOR { 25608 break 25609 } 25610 _ = or.Args[1] 25611 s1 := or.Args[0] 25612 if s1.Op != OpS390XSLDconst { 25613 break 25614 } 25615 j1 := s1.AuxInt 25616 x1 := s1.Args[0] 25617 if x1.Op != OpS390XMOVHZloadidx { 25618 break 25619 } 25620 i1 := x1.AuxInt 25621 if x1.Aux != s { 25622 break 25623 } 25624 _ = x1.Args[2] 25625 if p != x1.Args[0] { 25626 break 25627 } 25628 if idx != x1.Args[1] { 25629 break 25630 } 25631 if mem != x1.Args[2] { 25632 break 25633 } 25634 y := or.Args[1] 25635 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)) { 25636 break 25637 } 25638 b = mergePoint(b, x0, x1) 25639 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25640 v.reset(OpCopy) 25641 v.AddArg(v0) 25642 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25643 v1.AuxInt = j1 25644 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25645 v2.AuxInt = i0 25646 v2.Aux = s 25647 v2.AddArg(p) 25648 v2.AddArg(idx) 25649 v2.AddArg(mem) 25650 v1.AddArg(v2) 25651 v0.AddArg(v1) 25652 v0.AddArg(y) 25653 return true 25654 } 25655 // 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)) 25656 // 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) 25657 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25658 for { 25659 _ = v.Args[1] 25660 s0 := v.Args[0] 25661 if s0.Op != OpS390XSLDconst { 25662 break 25663 } 25664 j0 := s0.AuxInt 25665 x0 := s0.Args[0] 25666 if x0.Op != OpS390XMOVHZloadidx { 25667 break 25668 } 25669 i0 := x0.AuxInt 25670 s := x0.Aux 25671 _ = x0.Args[2] 25672 p := x0.Args[0] 25673 idx := x0.Args[1] 25674 mem := x0.Args[2] 25675 or := v.Args[1] 25676 if or.Op != OpS390XOR { 25677 break 25678 } 25679 _ = or.Args[1] 25680 s1 := or.Args[0] 25681 if s1.Op != OpS390XSLDconst { 25682 break 25683 } 25684 j1 := s1.AuxInt 25685 x1 := s1.Args[0] 25686 if x1.Op != OpS390XMOVHZloadidx { 25687 break 25688 } 25689 i1 := x1.AuxInt 25690 if x1.Aux != s { 25691 break 25692 } 25693 _ = x1.Args[2] 25694 if idx != x1.Args[0] { 25695 break 25696 } 25697 if p != x1.Args[1] { 25698 break 25699 } 25700 if mem != x1.Args[2] { 25701 break 25702 } 25703 y := or.Args[1] 25704 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)) { 25705 break 25706 } 25707 b = mergePoint(b, x0, x1) 25708 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25709 v.reset(OpCopy) 25710 v.AddArg(v0) 25711 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25712 v1.AuxInt = j1 25713 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25714 v2.AuxInt = i0 25715 v2.Aux = s 25716 v2.AddArg(p) 25717 v2.AddArg(idx) 25718 v2.AddArg(mem) 25719 v1.AddArg(v2) 25720 v0.AddArg(v1) 25721 v0.AddArg(y) 25722 return true 25723 } 25724 // 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)) 25725 // 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) 25726 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25727 for { 25728 _ = v.Args[1] 25729 s0 := v.Args[0] 25730 if s0.Op != OpS390XSLDconst { 25731 break 25732 } 25733 j0 := s0.AuxInt 25734 x0 := s0.Args[0] 25735 if x0.Op != OpS390XMOVHZloadidx { 25736 break 25737 } 25738 i0 := x0.AuxInt 25739 s := x0.Aux 25740 _ = x0.Args[2] 25741 idx := x0.Args[0] 25742 p := x0.Args[1] 25743 mem := x0.Args[2] 25744 or := v.Args[1] 25745 if or.Op != OpS390XOR { 25746 break 25747 } 25748 _ = or.Args[1] 25749 s1 := or.Args[0] 25750 if s1.Op != OpS390XSLDconst { 25751 break 25752 } 25753 j1 := s1.AuxInt 25754 x1 := s1.Args[0] 25755 if x1.Op != OpS390XMOVHZloadidx { 25756 break 25757 } 25758 i1 := x1.AuxInt 25759 if x1.Aux != s { 25760 break 25761 } 25762 _ = x1.Args[2] 25763 if idx != x1.Args[0] { 25764 break 25765 } 25766 if p != x1.Args[1] { 25767 break 25768 } 25769 if mem != x1.Args[2] { 25770 break 25771 } 25772 y := or.Args[1] 25773 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)) { 25774 break 25775 } 25776 b = mergePoint(b, x0, x1) 25777 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25778 v.reset(OpCopy) 25779 v.AddArg(v0) 25780 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25781 v1.AuxInt = j1 25782 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25783 v2.AuxInt = i0 25784 v2.Aux = s 25785 v2.AddArg(p) 25786 v2.AddArg(idx) 25787 v2.AddArg(mem) 25788 v1.AddArg(v2) 25789 v0.AddArg(v1) 25790 v0.AddArg(y) 25791 return true 25792 } 25793 // 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)))) 25794 // 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) 25795 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25796 for { 25797 _ = v.Args[1] 25798 s0 := v.Args[0] 25799 if s0.Op != OpS390XSLDconst { 25800 break 25801 } 25802 j0 := s0.AuxInt 25803 x0 := s0.Args[0] 25804 if x0.Op != OpS390XMOVHZloadidx { 25805 break 25806 } 25807 i0 := x0.AuxInt 25808 s := x0.Aux 25809 _ = x0.Args[2] 25810 p := x0.Args[0] 25811 idx := x0.Args[1] 25812 mem := x0.Args[2] 25813 or := v.Args[1] 25814 if or.Op != OpS390XOR { 25815 break 25816 } 25817 _ = or.Args[1] 25818 y := or.Args[0] 25819 s1 := or.Args[1] 25820 if s1.Op != OpS390XSLDconst { 25821 break 25822 } 25823 j1 := s1.AuxInt 25824 x1 := s1.Args[0] 25825 if x1.Op != OpS390XMOVHZloadidx { 25826 break 25827 } 25828 i1 := x1.AuxInt 25829 if x1.Aux != s { 25830 break 25831 } 25832 _ = x1.Args[2] 25833 if p != x1.Args[0] { 25834 break 25835 } 25836 if idx != x1.Args[1] { 25837 break 25838 } 25839 if mem != x1.Args[2] { 25840 break 25841 } 25842 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)) { 25843 break 25844 } 25845 b = mergePoint(b, x0, x1) 25846 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25847 v.reset(OpCopy) 25848 v.AddArg(v0) 25849 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25850 v1.AuxInt = j1 25851 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25852 v2.AuxInt = i0 25853 v2.Aux = s 25854 v2.AddArg(p) 25855 v2.AddArg(idx) 25856 v2.AddArg(mem) 25857 v1.AddArg(v2) 25858 v0.AddArg(v1) 25859 v0.AddArg(y) 25860 return true 25861 } 25862 // 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)))) 25863 // 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) 25864 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25865 for { 25866 _ = v.Args[1] 25867 s0 := v.Args[0] 25868 if s0.Op != OpS390XSLDconst { 25869 break 25870 } 25871 j0 := s0.AuxInt 25872 x0 := s0.Args[0] 25873 if x0.Op != OpS390XMOVHZloadidx { 25874 break 25875 } 25876 i0 := x0.AuxInt 25877 s := x0.Aux 25878 _ = x0.Args[2] 25879 idx := x0.Args[0] 25880 p := x0.Args[1] 25881 mem := x0.Args[2] 25882 or := v.Args[1] 25883 if or.Op != OpS390XOR { 25884 break 25885 } 25886 _ = or.Args[1] 25887 y := or.Args[0] 25888 s1 := or.Args[1] 25889 if s1.Op != OpS390XSLDconst { 25890 break 25891 } 25892 j1 := s1.AuxInt 25893 x1 := s1.Args[0] 25894 if x1.Op != OpS390XMOVHZloadidx { 25895 break 25896 } 25897 i1 := x1.AuxInt 25898 if x1.Aux != s { 25899 break 25900 } 25901 _ = x1.Args[2] 25902 if p != x1.Args[0] { 25903 break 25904 } 25905 if idx != x1.Args[1] { 25906 break 25907 } 25908 if mem != x1.Args[2] { 25909 break 25910 } 25911 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)) { 25912 break 25913 } 25914 b = mergePoint(b, x0, x1) 25915 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25916 v.reset(OpCopy) 25917 v.AddArg(v0) 25918 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25919 v1.AuxInt = j1 25920 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25921 v2.AuxInt = i0 25922 v2.Aux = s 25923 v2.AddArg(p) 25924 v2.AddArg(idx) 25925 v2.AddArg(mem) 25926 v1.AddArg(v2) 25927 v0.AddArg(v1) 25928 v0.AddArg(y) 25929 return true 25930 } 25931 // 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)))) 25932 // 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) 25933 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 25934 for { 25935 _ = v.Args[1] 25936 s0 := v.Args[0] 25937 if s0.Op != OpS390XSLDconst { 25938 break 25939 } 25940 j0 := s0.AuxInt 25941 x0 := s0.Args[0] 25942 if x0.Op != OpS390XMOVHZloadidx { 25943 break 25944 } 25945 i0 := x0.AuxInt 25946 s := x0.Aux 25947 _ = x0.Args[2] 25948 p := x0.Args[0] 25949 idx := x0.Args[1] 25950 mem := x0.Args[2] 25951 or := v.Args[1] 25952 if or.Op != OpS390XOR { 25953 break 25954 } 25955 _ = or.Args[1] 25956 y := or.Args[0] 25957 s1 := or.Args[1] 25958 if s1.Op != OpS390XSLDconst { 25959 break 25960 } 25961 j1 := s1.AuxInt 25962 x1 := s1.Args[0] 25963 if x1.Op != OpS390XMOVHZloadidx { 25964 break 25965 } 25966 i1 := x1.AuxInt 25967 if x1.Aux != s { 25968 break 25969 } 25970 _ = x1.Args[2] 25971 if idx != x1.Args[0] { 25972 break 25973 } 25974 if p != x1.Args[1] { 25975 break 25976 } 25977 if mem != x1.Args[2] { 25978 break 25979 } 25980 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)) { 25981 break 25982 } 25983 b = mergePoint(b, x0, x1) 25984 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25985 v.reset(OpCopy) 25986 v.AddArg(v0) 25987 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25988 v1.AuxInt = j1 25989 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 25990 v2.AuxInt = i0 25991 v2.Aux = s 25992 v2.AddArg(p) 25993 v2.AddArg(idx) 25994 v2.AddArg(mem) 25995 v1.AddArg(v2) 25996 v0.AddArg(v1) 25997 v0.AddArg(y) 25998 return true 25999 } 26000 // 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)))) 26001 // 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) 26002 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26003 for { 26004 _ = v.Args[1] 26005 s0 := v.Args[0] 26006 if s0.Op != OpS390XSLDconst { 26007 break 26008 } 26009 j0 := s0.AuxInt 26010 x0 := s0.Args[0] 26011 if x0.Op != OpS390XMOVHZloadidx { 26012 break 26013 } 26014 i0 := x0.AuxInt 26015 s := x0.Aux 26016 _ = x0.Args[2] 26017 idx := x0.Args[0] 26018 p := x0.Args[1] 26019 mem := x0.Args[2] 26020 or := v.Args[1] 26021 if or.Op != OpS390XOR { 26022 break 26023 } 26024 _ = or.Args[1] 26025 y := or.Args[0] 26026 s1 := or.Args[1] 26027 if s1.Op != OpS390XSLDconst { 26028 break 26029 } 26030 j1 := s1.AuxInt 26031 x1 := s1.Args[0] 26032 if x1.Op != OpS390XMOVHZloadidx { 26033 break 26034 } 26035 i1 := x1.AuxInt 26036 if x1.Aux != s { 26037 break 26038 } 26039 _ = x1.Args[2] 26040 if idx != x1.Args[0] { 26041 break 26042 } 26043 if p != x1.Args[1] { 26044 break 26045 } 26046 if mem != x1.Args[2] { 26047 break 26048 } 26049 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)) { 26050 break 26051 } 26052 b = mergePoint(b, x0, x1) 26053 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26054 v.reset(OpCopy) 26055 v.AddArg(v0) 26056 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26057 v1.AuxInt = j1 26058 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26059 v2.AuxInt = i0 26060 v2.Aux = s 26061 v2.AddArg(p) 26062 v2.AddArg(idx) 26063 v2.AddArg(mem) 26064 v1.AddArg(v2) 26065 v0.AddArg(v1) 26066 v0.AddArg(y) 26067 return true 26068 } 26069 // 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))) 26070 // 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) 26071 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26072 for { 26073 _ = v.Args[1] 26074 or := v.Args[0] 26075 if or.Op != OpS390XOR { 26076 break 26077 } 26078 _ = or.Args[1] 26079 s1 := or.Args[0] 26080 if s1.Op != OpS390XSLDconst { 26081 break 26082 } 26083 j1 := s1.AuxInt 26084 x1 := s1.Args[0] 26085 if x1.Op != OpS390XMOVHZloadidx { 26086 break 26087 } 26088 i1 := x1.AuxInt 26089 s := x1.Aux 26090 _ = x1.Args[2] 26091 p := x1.Args[0] 26092 idx := x1.Args[1] 26093 mem := x1.Args[2] 26094 y := or.Args[1] 26095 s0 := v.Args[1] 26096 if s0.Op != OpS390XSLDconst { 26097 break 26098 } 26099 j0 := s0.AuxInt 26100 x0 := s0.Args[0] 26101 if x0.Op != OpS390XMOVHZloadidx { 26102 break 26103 } 26104 i0 := x0.AuxInt 26105 if x0.Aux != s { 26106 break 26107 } 26108 _ = x0.Args[2] 26109 if p != x0.Args[0] { 26110 break 26111 } 26112 if idx != x0.Args[1] { 26113 break 26114 } 26115 if mem != x0.Args[2] { 26116 break 26117 } 26118 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)) { 26119 break 26120 } 26121 b = mergePoint(b, x0, x1) 26122 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26123 v.reset(OpCopy) 26124 v.AddArg(v0) 26125 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26126 v1.AuxInt = j1 26127 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26128 v2.AuxInt = i0 26129 v2.Aux = s 26130 v2.AddArg(p) 26131 v2.AddArg(idx) 26132 v2.AddArg(mem) 26133 v1.AddArg(v2) 26134 v0.AddArg(v1) 26135 v0.AddArg(y) 26136 return true 26137 } 26138 return false 26139 } 26140 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 26141 b := v.Block 26142 _ = b 26143 typ := &b.Func.Config.Types 26144 _ = typ 26145 // 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))) 26146 // 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) 26147 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26148 for { 26149 _ = v.Args[1] 26150 or := v.Args[0] 26151 if or.Op != OpS390XOR { 26152 break 26153 } 26154 _ = or.Args[1] 26155 s1 := or.Args[0] 26156 if s1.Op != OpS390XSLDconst { 26157 break 26158 } 26159 j1 := s1.AuxInt 26160 x1 := s1.Args[0] 26161 if x1.Op != OpS390XMOVHZloadidx { 26162 break 26163 } 26164 i1 := x1.AuxInt 26165 s := x1.Aux 26166 _ = x1.Args[2] 26167 idx := x1.Args[0] 26168 p := x1.Args[1] 26169 mem := x1.Args[2] 26170 y := or.Args[1] 26171 s0 := v.Args[1] 26172 if s0.Op != OpS390XSLDconst { 26173 break 26174 } 26175 j0 := s0.AuxInt 26176 x0 := s0.Args[0] 26177 if x0.Op != OpS390XMOVHZloadidx { 26178 break 26179 } 26180 i0 := x0.AuxInt 26181 if x0.Aux != s { 26182 break 26183 } 26184 _ = x0.Args[2] 26185 if p != x0.Args[0] { 26186 break 26187 } 26188 if idx != x0.Args[1] { 26189 break 26190 } 26191 if mem != x0.Args[2] { 26192 break 26193 } 26194 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)) { 26195 break 26196 } 26197 b = mergePoint(b, x0, x1) 26198 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26199 v.reset(OpCopy) 26200 v.AddArg(v0) 26201 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26202 v1.AuxInt = j1 26203 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26204 v2.AuxInt = i0 26205 v2.Aux = s 26206 v2.AddArg(p) 26207 v2.AddArg(idx) 26208 v2.AddArg(mem) 26209 v1.AddArg(v2) 26210 v0.AddArg(v1) 26211 v0.AddArg(y) 26212 return true 26213 } 26214 // 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))) 26215 // 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) 26216 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26217 for { 26218 _ = v.Args[1] 26219 or := v.Args[0] 26220 if or.Op != OpS390XOR { 26221 break 26222 } 26223 _ = or.Args[1] 26224 y := or.Args[0] 26225 s1 := or.Args[1] 26226 if s1.Op != OpS390XSLDconst { 26227 break 26228 } 26229 j1 := s1.AuxInt 26230 x1 := s1.Args[0] 26231 if x1.Op != OpS390XMOVHZloadidx { 26232 break 26233 } 26234 i1 := x1.AuxInt 26235 s := x1.Aux 26236 _ = x1.Args[2] 26237 p := x1.Args[0] 26238 idx := x1.Args[1] 26239 mem := x1.Args[2] 26240 s0 := v.Args[1] 26241 if s0.Op != OpS390XSLDconst { 26242 break 26243 } 26244 j0 := s0.AuxInt 26245 x0 := s0.Args[0] 26246 if x0.Op != OpS390XMOVHZloadidx { 26247 break 26248 } 26249 i0 := x0.AuxInt 26250 if x0.Aux != s { 26251 break 26252 } 26253 _ = x0.Args[2] 26254 if p != x0.Args[0] { 26255 break 26256 } 26257 if idx != x0.Args[1] { 26258 break 26259 } 26260 if mem != x0.Args[2] { 26261 break 26262 } 26263 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)) { 26264 break 26265 } 26266 b = mergePoint(b, x0, x1) 26267 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26268 v.reset(OpCopy) 26269 v.AddArg(v0) 26270 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26271 v1.AuxInt = j1 26272 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26273 v2.AuxInt = i0 26274 v2.Aux = s 26275 v2.AddArg(p) 26276 v2.AddArg(idx) 26277 v2.AddArg(mem) 26278 v1.AddArg(v2) 26279 v0.AddArg(v1) 26280 v0.AddArg(y) 26281 return true 26282 } 26283 // 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))) 26284 // 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) 26285 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26286 for { 26287 _ = v.Args[1] 26288 or := v.Args[0] 26289 if or.Op != OpS390XOR { 26290 break 26291 } 26292 _ = or.Args[1] 26293 y := or.Args[0] 26294 s1 := or.Args[1] 26295 if s1.Op != OpS390XSLDconst { 26296 break 26297 } 26298 j1 := s1.AuxInt 26299 x1 := s1.Args[0] 26300 if x1.Op != OpS390XMOVHZloadidx { 26301 break 26302 } 26303 i1 := x1.AuxInt 26304 s := x1.Aux 26305 _ = x1.Args[2] 26306 idx := x1.Args[0] 26307 p := x1.Args[1] 26308 mem := x1.Args[2] 26309 s0 := v.Args[1] 26310 if s0.Op != OpS390XSLDconst { 26311 break 26312 } 26313 j0 := s0.AuxInt 26314 x0 := s0.Args[0] 26315 if x0.Op != OpS390XMOVHZloadidx { 26316 break 26317 } 26318 i0 := x0.AuxInt 26319 if x0.Aux != s { 26320 break 26321 } 26322 _ = x0.Args[2] 26323 if p != x0.Args[0] { 26324 break 26325 } 26326 if idx != x0.Args[1] { 26327 break 26328 } 26329 if mem != x0.Args[2] { 26330 break 26331 } 26332 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)) { 26333 break 26334 } 26335 b = mergePoint(b, x0, x1) 26336 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26337 v.reset(OpCopy) 26338 v.AddArg(v0) 26339 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26340 v1.AuxInt = j1 26341 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26342 v2.AuxInt = i0 26343 v2.Aux = s 26344 v2.AddArg(p) 26345 v2.AddArg(idx) 26346 v2.AddArg(mem) 26347 v1.AddArg(v2) 26348 v0.AddArg(v1) 26349 v0.AddArg(y) 26350 return true 26351 } 26352 // 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))) 26353 // 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) 26354 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26355 for { 26356 _ = v.Args[1] 26357 or := v.Args[0] 26358 if or.Op != OpS390XOR { 26359 break 26360 } 26361 _ = or.Args[1] 26362 s1 := or.Args[0] 26363 if s1.Op != OpS390XSLDconst { 26364 break 26365 } 26366 j1 := s1.AuxInt 26367 x1 := s1.Args[0] 26368 if x1.Op != OpS390XMOVHZloadidx { 26369 break 26370 } 26371 i1 := x1.AuxInt 26372 s := x1.Aux 26373 _ = x1.Args[2] 26374 p := x1.Args[0] 26375 idx := x1.Args[1] 26376 mem := x1.Args[2] 26377 y := or.Args[1] 26378 s0 := v.Args[1] 26379 if s0.Op != OpS390XSLDconst { 26380 break 26381 } 26382 j0 := s0.AuxInt 26383 x0 := s0.Args[0] 26384 if x0.Op != OpS390XMOVHZloadidx { 26385 break 26386 } 26387 i0 := x0.AuxInt 26388 if x0.Aux != s { 26389 break 26390 } 26391 _ = x0.Args[2] 26392 if idx != x0.Args[0] { 26393 break 26394 } 26395 if p != x0.Args[1] { 26396 break 26397 } 26398 if mem != x0.Args[2] { 26399 break 26400 } 26401 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)) { 26402 break 26403 } 26404 b = mergePoint(b, x0, x1) 26405 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26406 v.reset(OpCopy) 26407 v.AddArg(v0) 26408 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26409 v1.AuxInt = j1 26410 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26411 v2.AuxInt = i0 26412 v2.Aux = s 26413 v2.AddArg(p) 26414 v2.AddArg(idx) 26415 v2.AddArg(mem) 26416 v1.AddArg(v2) 26417 v0.AddArg(v1) 26418 v0.AddArg(y) 26419 return true 26420 } 26421 // 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))) 26422 // 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) 26423 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26424 for { 26425 _ = v.Args[1] 26426 or := v.Args[0] 26427 if or.Op != OpS390XOR { 26428 break 26429 } 26430 _ = or.Args[1] 26431 s1 := or.Args[0] 26432 if s1.Op != OpS390XSLDconst { 26433 break 26434 } 26435 j1 := s1.AuxInt 26436 x1 := s1.Args[0] 26437 if x1.Op != OpS390XMOVHZloadidx { 26438 break 26439 } 26440 i1 := x1.AuxInt 26441 s := x1.Aux 26442 _ = x1.Args[2] 26443 idx := x1.Args[0] 26444 p := x1.Args[1] 26445 mem := x1.Args[2] 26446 y := or.Args[1] 26447 s0 := v.Args[1] 26448 if s0.Op != OpS390XSLDconst { 26449 break 26450 } 26451 j0 := s0.AuxInt 26452 x0 := s0.Args[0] 26453 if x0.Op != OpS390XMOVHZloadidx { 26454 break 26455 } 26456 i0 := x0.AuxInt 26457 if x0.Aux != s { 26458 break 26459 } 26460 _ = x0.Args[2] 26461 if idx != x0.Args[0] { 26462 break 26463 } 26464 if p != x0.Args[1] { 26465 break 26466 } 26467 if mem != x0.Args[2] { 26468 break 26469 } 26470 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)) { 26471 break 26472 } 26473 b = mergePoint(b, x0, x1) 26474 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26475 v.reset(OpCopy) 26476 v.AddArg(v0) 26477 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26478 v1.AuxInt = j1 26479 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26480 v2.AuxInt = i0 26481 v2.Aux = s 26482 v2.AddArg(p) 26483 v2.AddArg(idx) 26484 v2.AddArg(mem) 26485 v1.AddArg(v2) 26486 v0.AddArg(v1) 26487 v0.AddArg(y) 26488 return true 26489 } 26490 // 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))) 26491 // 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) 26492 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26493 for { 26494 _ = v.Args[1] 26495 or := v.Args[0] 26496 if or.Op != OpS390XOR { 26497 break 26498 } 26499 _ = or.Args[1] 26500 y := or.Args[0] 26501 s1 := or.Args[1] 26502 if s1.Op != OpS390XSLDconst { 26503 break 26504 } 26505 j1 := s1.AuxInt 26506 x1 := s1.Args[0] 26507 if x1.Op != OpS390XMOVHZloadidx { 26508 break 26509 } 26510 i1 := x1.AuxInt 26511 s := x1.Aux 26512 _ = x1.Args[2] 26513 p := x1.Args[0] 26514 idx := x1.Args[1] 26515 mem := x1.Args[2] 26516 s0 := v.Args[1] 26517 if s0.Op != OpS390XSLDconst { 26518 break 26519 } 26520 j0 := s0.AuxInt 26521 x0 := s0.Args[0] 26522 if x0.Op != OpS390XMOVHZloadidx { 26523 break 26524 } 26525 i0 := x0.AuxInt 26526 if x0.Aux != s { 26527 break 26528 } 26529 _ = x0.Args[2] 26530 if idx != x0.Args[0] { 26531 break 26532 } 26533 if p != x0.Args[1] { 26534 break 26535 } 26536 if mem != x0.Args[2] { 26537 break 26538 } 26539 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)) { 26540 break 26541 } 26542 b = mergePoint(b, x0, x1) 26543 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26544 v.reset(OpCopy) 26545 v.AddArg(v0) 26546 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26547 v1.AuxInt = j1 26548 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26549 v2.AuxInt = i0 26550 v2.Aux = s 26551 v2.AddArg(p) 26552 v2.AddArg(idx) 26553 v2.AddArg(mem) 26554 v1.AddArg(v2) 26555 v0.AddArg(v1) 26556 v0.AddArg(y) 26557 return true 26558 } 26559 // 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))) 26560 // 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) 26561 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 26562 for { 26563 _ = v.Args[1] 26564 or := v.Args[0] 26565 if or.Op != OpS390XOR { 26566 break 26567 } 26568 _ = or.Args[1] 26569 y := or.Args[0] 26570 s1 := or.Args[1] 26571 if s1.Op != OpS390XSLDconst { 26572 break 26573 } 26574 j1 := s1.AuxInt 26575 x1 := s1.Args[0] 26576 if x1.Op != OpS390XMOVHZloadidx { 26577 break 26578 } 26579 i1 := x1.AuxInt 26580 s := x1.Aux 26581 _ = x1.Args[2] 26582 idx := x1.Args[0] 26583 p := x1.Args[1] 26584 mem := x1.Args[2] 26585 s0 := v.Args[1] 26586 if s0.Op != OpS390XSLDconst { 26587 break 26588 } 26589 j0 := s0.AuxInt 26590 x0 := s0.Args[0] 26591 if x0.Op != OpS390XMOVHZloadidx { 26592 break 26593 } 26594 i0 := x0.AuxInt 26595 if x0.Aux != s { 26596 break 26597 } 26598 _ = x0.Args[2] 26599 if idx != x0.Args[0] { 26600 break 26601 } 26602 if p != x0.Args[1] { 26603 break 26604 } 26605 if mem != x0.Args[2] { 26606 break 26607 } 26608 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)) { 26609 break 26610 } 26611 b = mergePoint(b, x0, x1) 26612 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26613 v.reset(OpCopy) 26614 v.AddArg(v0) 26615 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26616 v1.AuxInt = j1 26617 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 26618 v2.AuxInt = i0 26619 v2.Aux = s 26620 v2.AddArg(p) 26621 v2.AddArg(idx) 26622 v2.AddArg(mem) 26623 v1.AddArg(v2) 26624 v0.AddArg(v1) 26625 v0.AddArg(y) 26626 return true 26627 } 26628 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 26629 // 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) 26630 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 26631 for { 26632 _ = v.Args[1] 26633 x0 := v.Args[0] 26634 if x0.Op != OpS390XMOVBZload { 26635 break 26636 } 26637 i0 := x0.AuxInt 26638 s := x0.Aux 26639 _ = x0.Args[1] 26640 p := x0.Args[0] 26641 mem := x0.Args[1] 26642 sh := v.Args[1] 26643 if sh.Op != OpS390XSLDconst { 26644 break 26645 } 26646 if sh.AuxInt != 8 { 26647 break 26648 } 26649 x1 := sh.Args[0] 26650 if x1.Op != OpS390XMOVBZload { 26651 break 26652 } 26653 i1 := x1.AuxInt 26654 if x1.Aux != s { 26655 break 26656 } 26657 _ = x1.Args[1] 26658 if p != x1.Args[0] { 26659 break 26660 } 26661 if mem != x1.Args[1] { 26662 break 26663 } 26664 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)) { 26665 break 26666 } 26667 b = mergePoint(b, x0, x1) 26668 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26669 v.reset(OpCopy) 26670 v.AddArg(v0) 26671 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 26672 v1.AuxInt = i0 26673 v1.Aux = s 26674 v1.AddArg(p) 26675 v1.AddArg(mem) 26676 v0.AddArg(v1) 26677 return true 26678 } 26679 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 26680 // 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) 26681 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 26682 for { 26683 _ = v.Args[1] 26684 sh := v.Args[0] 26685 if sh.Op != OpS390XSLDconst { 26686 break 26687 } 26688 if sh.AuxInt != 8 { 26689 break 26690 } 26691 x1 := sh.Args[0] 26692 if x1.Op != OpS390XMOVBZload { 26693 break 26694 } 26695 i1 := x1.AuxInt 26696 s := x1.Aux 26697 _ = x1.Args[1] 26698 p := x1.Args[0] 26699 mem := x1.Args[1] 26700 x0 := v.Args[1] 26701 if x0.Op != OpS390XMOVBZload { 26702 break 26703 } 26704 i0 := x0.AuxInt 26705 if x0.Aux != s { 26706 break 26707 } 26708 _ = x0.Args[1] 26709 if p != x0.Args[0] { 26710 break 26711 } 26712 if mem != x0.Args[1] { 26713 break 26714 } 26715 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)) { 26716 break 26717 } 26718 b = mergePoint(b, x0, x1) 26719 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26720 v.reset(OpCopy) 26721 v.AddArg(v0) 26722 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 26723 v1.AuxInt = i0 26724 v1.Aux = s 26725 v1.AddArg(p) 26726 v1.AddArg(mem) 26727 v0.AddArg(v1) 26728 return true 26729 } 26730 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 26731 // 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) 26732 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 26733 for { 26734 _ = v.Args[1] 26735 r0 := v.Args[0] 26736 if r0.Op != OpS390XMOVHZreg { 26737 break 26738 } 26739 x0 := r0.Args[0] 26740 if x0.Op != OpS390XMOVHBRload { 26741 break 26742 } 26743 i0 := x0.AuxInt 26744 s := x0.Aux 26745 _ = x0.Args[1] 26746 p := x0.Args[0] 26747 mem := x0.Args[1] 26748 sh := v.Args[1] 26749 if sh.Op != OpS390XSLDconst { 26750 break 26751 } 26752 if sh.AuxInt != 16 { 26753 break 26754 } 26755 r1 := sh.Args[0] 26756 if r1.Op != OpS390XMOVHZreg { 26757 break 26758 } 26759 x1 := r1.Args[0] 26760 if x1.Op != OpS390XMOVHBRload { 26761 break 26762 } 26763 i1 := x1.AuxInt 26764 if x1.Aux != s { 26765 break 26766 } 26767 _ = x1.Args[1] 26768 if p != x1.Args[0] { 26769 break 26770 } 26771 if mem != x1.Args[1] { 26772 break 26773 } 26774 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)) { 26775 break 26776 } 26777 b = mergePoint(b, x0, x1) 26778 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26779 v.reset(OpCopy) 26780 v.AddArg(v0) 26781 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 26782 v1.AuxInt = i0 26783 v1.Aux = s 26784 v1.AddArg(p) 26785 v1.AddArg(mem) 26786 v0.AddArg(v1) 26787 return true 26788 } 26789 return false 26790 } 26791 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 26792 b := v.Block 26793 _ = b 26794 typ := &b.Func.Config.Types 26795 _ = typ 26796 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 26797 // 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) 26798 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 26799 for { 26800 _ = v.Args[1] 26801 sh := v.Args[0] 26802 if sh.Op != OpS390XSLDconst { 26803 break 26804 } 26805 if sh.AuxInt != 16 { 26806 break 26807 } 26808 r1 := sh.Args[0] 26809 if r1.Op != OpS390XMOVHZreg { 26810 break 26811 } 26812 x1 := r1.Args[0] 26813 if x1.Op != OpS390XMOVHBRload { 26814 break 26815 } 26816 i1 := x1.AuxInt 26817 s := x1.Aux 26818 _ = x1.Args[1] 26819 p := x1.Args[0] 26820 mem := x1.Args[1] 26821 r0 := v.Args[1] 26822 if r0.Op != OpS390XMOVHZreg { 26823 break 26824 } 26825 x0 := r0.Args[0] 26826 if x0.Op != OpS390XMOVHBRload { 26827 break 26828 } 26829 i0 := x0.AuxInt 26830 if x0.Aux != s { 26831 break 26832 } 26833 _ = x0.Args[1] 26834 if p != x0.Args[0] { 26835 break 26836 } 26837 if mem != x0.Args[1] { 26838 break 26839 } 26840 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)) { 26841 break 26842 } 26843 b = mergePoint(b, x0, x1) 26844 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26845 v.reset(OpCopy) 26846 v.AddArg(v0) 26847 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 26848 v1.AuxInt = i0 26849 v1.Aux = s 26850 v1.AddArg(p) 26851 v1.AddArg(mem) 26852 v0.AddArg(v1) 26853 return true 26854 } 26855 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 26856 // 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) 26857 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 26858 for { 26859 _ = v.Args[1] 26860 r0 := v.Args[0] 26861 if r0.Op != OpS390XMOVWZreg { 26862 break 26863 } 26864 x0 := r0.Args[0] 26865 if x0.Op != OpS390XMOVWBRload { 26866 break 26867 } 26868 i0 := x0.AuxInt 26869 s := x0.Aux 26870 _ = x0.Args[1] 26871 p := x0.Args[0] 26872 mem := x0.Args[1] 26873 sh := v.Args[1] 26874 if sh.Op != OpS390XSLDconst { 26875 break 26876 } 26877 if sh.AuxInt != 32 { 26878 break 26879 } 26880 r1 := sh.Args[0] 26881 if r1.Op != OpS390XMOVWZreg { 26882 break 26883 } 26884 x1 := r1.Args[0] 26885 if x1.Op != OpS390XMOVWBRload { 26886 break 26887 } 26888 i1 := x1.AuxInt 26889 if x1.Aux != s { 26890 break 26891 } 26892 _ = x1.Args[1] 26893 if p != x1.Args[0] { 26894 break 26895 } 26896 if mem != x1.Args[1] { 26897 break 26898 } 26899 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)) { 26900 break 26901 } 26902 b = mergePoint(b, x0, x1) 26903 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 26904 v.reset(OpCopy) 26905 v.AddArg(v0) 26906 v0.AuxInt = i0 26907 v0.Aux = s 26908 v0.AddArg(p) 26909 v0.AddArg(mem) 26910 return true 26911 } 26912 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 26913 // 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) 26914 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 26915 for { 26916 _ = v.Args[1] 26917 sh := v.Args[0] 26918 if sh.Op != OpS390XSLDconst { 26919 break 26920 } 26921 if sh.AuxInt != 32 { 26922 break 26923 } 26924 r1 := sh.Args[0] 26925 if r1.Op != OpS390XMOVWZreg { 26926 break 26927 } 26928 x1 := r1.Args[0] 26929 if x1.Op != OpS390XMOVWBRload { 26930 break 26931 } 26932 i1 := x1.AuxInt 26933 s := x1.Aux 26934 _ = x1.Args[1] 26935 p := x1.Args[0] 26936 mem := x1.Args[1] 26937 r0 := v.Args[1] 26938 if r0.Op != OpS390XMOVWZreg { 26939 break 26940 } 26941 x0 := r0.Args[0] 26942 if x0.Op != OpS390XMOVWBRload { 26943 break 26944 } 26945 i0 := x0.AuxInt 26946 if x0.Aux != s { 26947 break 26948 } 26949 _ = x0.Args[1] 26950 if p != x0.Args[0] { 26951 break 26952 } 26953 if mem != x0.Args[1] { 26954 break 26955 } 26956 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)) { 26957 break 26958 } 26959 b = mergePoint(b, x0, x1) 26960 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 26961 v.reset(OpCopy) 26962 v.AddArg(v0) 26963 v0.AuxInt = i0 26964 v0.Aux = s 26965 v0.AddArg(p) 26966 v0.AddArg(mem) 26967 return true 26968 } 26969 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 26970 // 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) 26971 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 26972 for { 26973 _ = v.Args[1] 26974 s1 := v.Args[0] 26975 if s1.Op != OpS390XSLDconst { 26976 break 26977 } 26978 j1 := s1.AuxInt 26979 x1 := s1.Args[0] 26980 if x1.Op != OpS390XMOVBZload { 26981 break 26982 } 26983 i1 := x1.AuxInt 26984 s := x1.Aux 26985 _ = x1.Args[1] 26986 p := x1.Args[0] 26987 mem := x1.Args[1] 26988 or := v.Args[1] 26989 if or.Op != OpS390XOR { 26990 break 26991 } 26992 _ = or.Args[1] 26993 s0 := or.Args[0] 26994 if s0.Op != OpS390XSLDconst { 26995 break 26996 } 26997 j0 := s0.AuxInt 26998 x0 := s0.Args[0] 26999 if x0.Op != OpS390XMOVBZload { 27000 break 27001 } 27002 i0 := x0.AuxInt 27003 if x0.Aux != s { 27004 break 27005 } 27006 _ = x0.Args[1] 27007 if p != x0.Args[0] { 27008 break 27009 } 27010 if mem != x0.Args[1] { 27011 break 27012 } 27013 y := or.Args[1] 27014 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)) { 27015 break 27016 } 27017 b = mergePoint(b, x0, x1) 27018 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27019 v.reset(OpCopy) 27020 v.AddArg(v0) 27021 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27022 v1.AuxInt = j0 27023 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27024 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 27025 v3.AuxInt = i0 27026 v3.Aux = s 27027 v3.AddArg(p) 27028 v3.AddArg(mem) 27029 v2.AddArg(v3) 27030 v1.AddArg(v2) 27031 v0.AddArg(v1) 27032 v0.AddArg(y) 27033 return true 27034 } 27035 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 27036 // 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) 27037 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 27038 for { 27039 _ = v.Args[1] 27040 s1 := v.Args[0] 27041 if s1.Op != OpS390XSLDconst { 27042 break 27043 } 27044 j1 := s1.AuxInt 27045 x1 := s1.Args[0] 27046 if x1.Op != OpS390XMOVBZload { 27047 break 27048 } 27049 i1 := x1.AuxInt 27050 s := x1.Aux 27051 _ = x1.Args[1] 27052 p := x1.Args[0] 27053 mem := x1.Args[1] 27054 or := v.Args[1] 27055 if or.Op != OpS390XOR { 27056 break 27057 } 27058 _ = or.Args[1] 27059 y := or.Args[0] 27060 s0 := or.Args[1] 27061 if s0.Op != OpS390XSLDconst { 27062 break 27063 } 27064 j0 := s0.AuxInt 27065 x0 := s0.Args[0] 27066 if x0.Op != OpS390XMOVBZload { 27067 break 27068 } 27069 i0 := x0.AuxInt 27070 if x0.Aux != s { 27071 break 27072 } 27073 _ = x0.Args[1] 27074 if p != x0.Args[0] { 27075 break 27076 } 27077 if mem != x0.Args[1] { 27078 break 27079 } 27080 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)) { 27081 break 27082 } 27083 b = mergePoint(b, x0, x1) 27084 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27085 v.reset(OpCopy) 27086 v.AddArg(v0) 27087 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27088 v1.AuxInt = j0 27089 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27090 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 27091 v3.AuxInt = i0 27092 v3.Aux = s 27093 v3.AddArg(p) 27094 v3.AddArg(mem) 27095 v2.AddArg(v3) 27096 v1.AddArg(v2) 27097 v0.AddArg(v1) 27098 v0.AddArg(y) 27099 return true 27100 } 27101 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 27102 // 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) 27103 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 27104 for { 27105 _ = v.Args[1] 27106 or := v.Args[0] 27107 if or.Op != OpS390XOR { 27108 break 27109 } 27110 _ = or.Args[1] 27111 s0 := or.Args[0] 27112 if s0.Op != OpS390XSLDconst { 27113 break 27114 } 27115 j0 := s0.AuxInt 27116 x0 := s0.Args[0] 27117 if x0.Op != OpS390XMOVBZload { 27118 break 27119 } 27120 i0 := x0.AuxInt 27121 s := x0.Aux 27122 _ = x0.Args[1] 27123 p := x0.Args[0] 27124 mem := x0.Args[1] 27125 y := or.Args[1] 27126 s1 := v.Args[1] 27127 if s1.Op != OpS390XSLDconst { 27128 break 27129 } 27130 j1 := s1.AuxInt 27131 x1 := s1.Args[0] 27132 if x1.Op != OpS390XMOVBZload { 27133 break 27134 } 27135 i1 := x1.AuxInt 27136 if x1.Aux != s { 27137 break 27138 } 27139 _ = x1.Args[1] 27140 if p != x1.Args[0] { 27141 break 27142 } 27143 if mem != x1.Args[1] { 27144 break 27145 } 27146 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)) { 27147 break 27148 } 27149 b = mergePoint(b, x0, x1) 27150 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27151 v.reset(OpCopy) 27152 v.AddArg(v0) 27153 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27154 v1.AuxInt = j0 27155 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27156 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 27157 v3.AuxInt = i0 27158 v3.Aux = s 27159 v3.AddArg(p) 27160 v3.AddArg(mem) 27161 v2.AddArg(v3) 27162 v1.AddArg(v2) 27163 v0.AddArg(v1) 27164 v0.AddArg(y) 27165 return true 27166 } 27167 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 27168 // 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) 27169 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 27170 for { 27171 _ = v.Args[1] 27172 or := v.Args[0] 27173 if or.Op != OpS390XOR { 27174 break 27175 } 27176 _ = or.Args[1] 27177 y := or.Args[0] 27178 s0 := or.Args[1] 27179 if s0.Op != OpS390XSLDconst { 27180 break 27181 } 27182 j0 := s0.AuxInt 27183 x0 := s0.Args[0] 27184 if x0.Op != OpS390XMOVBZload { 27185 break 27186 } 27187 i0 := x0.AuxInt 27188 s := x0.Aux 27189 _ = x0.Args[1] 27190 p := x0.Args[0] 27191 mem := x0.Args[1] 27192 s1 := v.Args[1] 27193 if s1.Op != OpS390XSLDconst { 27194 break 27195 } 27196 j1 := s1.AuxInt 27197 x1 := s1.Args[0] 27198 if x1.Op != OpS390XMOVBZload { 27199 break 27200 } 27201 i1 := x1.AuxInt 27202 if x1.Aux != s { 27203 break 27204 } 27205 _ = x1.Args[1] 27206 if p != x1.Args[0] { 27207 break 27208 } 27209 if mem != x1.Args[1] { 27210 break 27211 } 27212 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)) { 27213 break 27214 } 27215 b = mergePoint(b, x0, x1) 27216 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27217 v.reset(OpCopy) 27218 v.AddArg(v0) 27219 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27220 v1.AuxInt = j0 27221 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27222 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 27223 v3.AuxInt = i0 27224 v3.Aux = s 27225 v3.AddArg(p) 27226 v3.AddArg(mem) 27227 v2.AddArg(v3) 27228 v1.AddArg(v2) 27229 v0.AddArg(v1) 27230 v0.AddArg(y) 27231 return true 27232 } 27233 // 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)) 27234 // 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) 27235 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 27236 for { 27237 _ = v.Args[1] 27238 s1 := v.Args[0] 27239 if s1.Op != OpS390XSLDconst { 27240 break 27241 } 27242 j1 := s1.AuxInt 27243 r1 := s1.Args[0] 27244 if r1.Op != OpS390XMOVHZreg { 27245 break 27246 } 27247 x1 := r1.Args[0] 27248 if x1.Op != OpS390XMOVHBRload { 27249 break 27250 } 27251 i1 := x1.AuxInt 27252 s := x1.Aux 27253 _ = x1.Args[1] 27254 p := x1.Args[0] 27255 mem := x1.Args[1] 27256 or := v.Args[1] 27257 if or.Op != OpS390XOR { 27258 break 27259 } 27260 _ = or.Args[1] 27261 s0 := or.Args[0] 27262 if s0.Op != OpS390XSLDconst { 27263 break 27264 } 27265 j0 := s0.AuxInt 27266 r0 := s0.Args[0] 27267 if r0.Op != OpS390XMOVHZreg { 27268 break 27269 } 27270 x0 := r0.Args[0] 27271 if x0.Op != OpS390XMOVHBRload { 27272 break 27273 } 27274 i0 := x0.AuxInt 27275 if x0.Aux != s { 27276 break 27277 } 27278 _ = x0.Args[1] 27279 if p != x0.Args[0] { 27280 break 27281 } 27282 if mem != x0.Args[1] { 27283 break 27284 } 27285 y := or.Args[1] 27286 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)) { 27287 break 27288 } 27289 b = mergePoint(b, x0, x1) 27290 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27291 v.reset(OpCopy) 27292 v.AddArg(v0) 27293 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27294 v1.AuxInt = j0 27295 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27296 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 27297 v3.AuxInt = i0 27298 v3.Aux = s 27299 v3.AddArg(p) 27300 v3.AddArg(mem) 27301 v2.AddArg(v3) 27302 v1.AddArg(v2) 27303 v0.AddArg(v1) 27304 v0.AddArg(y) 27305 return true 27306 } 27307 // 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))))) 27308 // 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) 27309 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 27310 for { 27311 _ = v.Args[1] 27312 s1 := v.Args[0] 27313 if s1.Op != OpS390XSLDconst { 27314 break 27315 } 27316 j1 := s1.AuxInt 27317 r1 := s1.Args[0] 27318 if r1.Op != OpS390XMOVHZreg { 27319 break 27320 } 27321 x1 := r1.Args[0] 27322 if x1.Op != OpS390XMOVHBRload { 27323 break 27324 } 27325 i1 := x1.AuxInt 27326 s := x1.Aux 27327 _ = x1.Args[1] 27328 p := x1.Args[0] 27329 mem := x1.Args[1] 27330 or := v.Args[1] 27331 if or.Op != OpS390XOR { 27332 break 27333 } 27334 _ = or.Args[1] 27335 y := or.Args[0] 27336 s0 := or.Args[1] 27337 if s0.Op != OpS390XSLDconst { 27338 break 27339 } 27340 j0 := s0.AuxInt 27341 r0 := s0.Args[0] 27342 if r0.Op != OpS390XMOVHZreg { 27343 break 27344 } 27345 x0 := r0.Args[0] 27346 if x0.Op != OpS390XMOVHBRload { 27347 break 27348 } 27349 i0 := x0.AuxInt 27350 if x0.Aux != s { 27351 break 27352 } 27353 _ = x0.Args[1] 27354 if p != x0.Args[0] { 27355 break 27356 } 27357 if mem != x0.Args[1] { 27358 break 27359 } 27360 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)) { 27361 break 27362 } 27363 b = mergePoint(b, x0, x1) 27364 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27365 v.reset(OpCopy) 27366 v.AddArg(v0) 27367 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27368 v1.AuxInt = j0 27369 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27370 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 27371 v3.AuxInt = i0 27372 v3.Aux = s 27373 v3.AddArg(p) 27374 v3.AddArg(mem) 27375 v2.AddArg(v3) 27376 v1.AddArg(v2) 27377 v0.AddArg(v1) 27378 v0.AddArg(y) 27379 return true 27380 } 27381 // 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)))) 27382 // 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) 27383 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 27384 for { 27385 _ = v.Args[1] 27386 or := v.Args[0] 27387 if or.Op != OpS390XOR { 27388 break 27389 } 27390 _ = or.Args[1] 27391 s0 := or.Args[0] 27392 if s0.Op != OpS390XSLDconst { 27393 break 27394 } 27395 j0 := s0.AuxInt 27396 r0 := s0.Args[0] 27397 if r0.Op != OpS390XMOVHZreg { 27398 break 27399 } 27400 x0 := r0.Args[0] 27401 if x0.Op != OpS390XMOVHBRload { 27402 break 27403 } 27404 i0 := x0.AuxInt 27405 s := x0.Aux 27406 _ = x0.Args[1] 27407 p := x0.Args[0] 27408 mem := x0.Args[1] 27409 y := or.Args[1] 27410 s1 := v.Args[1] 27411 if s1.Op != OpS390XSLDconst { 27412 break 27413 } 27414 j1 := s1.AuxInt 27415 r1 := s1.Args[0] 27416 if r1.Op != OpS390XMOVHZreg { 27417 break 27418 } 27419 x1 := r1.Args[0] 27420 if x1.Op != OpS390XMOVHBRload { 27421 break 27422 } 27423 i1 := x1.AuxInt 27424 if x1.Aux != s { 27425 break 27426 } 27427 _ = x1.Args[1] 27428 if p != x1.Args[0] { 27429 break 27430 } 27431 if mem != x1.Args[1] { 27432 break 27433 } 27434 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)) { 27435 break 27436 } 27437 b = mergePoint(b, x0, x1) 27438 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27439 v.reset(OpCopy) 27440 v.AddArg(v0) 27441 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27442 v1.AuxInt = j0 27443 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27444 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 27445 v3.AuxInt = i0 27446 v3.Aux = s 27447 v3.AddArg(p) 27448 v3.AddArg(mem) 27449 v2.AddArg(v3) 27450 v1.AddArg(v2) 27451 v0.AddArg(v1) 27452 v0.AddArg(y) 27453 return true 27454 } 27455 return false 27456 } 27457 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 27458 b := v.Block 27459 _ = b 27460 typ := &b.Func.Config.Types 27461 _ = typ 27462 // 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)))) 27463 // 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) 27464 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 27465 for { 27466 _ = v.Args[1] 27467 or := v.Args[0] 27468 if or.Op != OpS390XOR { 27469 break 27470 } 27471 _ = or.Args[1] 27472 y := or.Args[0] 27473 s0 := or.Args[1] 27474 if s0.Op != OpS390XSLDconst { 27475 break 27476 } 27477 j0 := s0.AuxInt 27478 r0 := s0.Args[0] 27479 if r0.Op != OpS390XMOVHZreg { 27480 break 27481 } 27482 x0 := r0.Args[0] 27483 if x0.Op != OpS390XMOVHBRload { 27484 break 27485 } 27486 i0 := x0.AuxInt 27487 s := x0.Aux 27488 _ = x0.Args[1] 27489 p := x0.Args[0] 27490 mem := x0.Args[1] 27491 s1 := v.Args[1] 27492 if s1.Op != OpS390XSLDconst { 27493 break 27494 } 27495 j1 := s1.AuxInt 27496 r1 := s1.Args[0] 27497 if r1.Op != OpS390XMOVHZreg { 27498 break 27499 } 27500 x1 := r1.Args[0] 27501 if x1.Op != OpS390XMOVHBRload { 27502 break 27503 } 27504 i1 := x1.AuxInt 27505 if x1.Aux != s { 27506 break 27507 } 27508 _ = x1.Args[1] 27509 if p != x1.Args[0] { 27510 break 27511 } 27512 if mem != x1.Args[1] { 27513 break 27514 } 27515 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)) { 27516 break 27517 } 27518 b = mergePoint(b, x0, x1) 27519 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27520 v.reset(OpCopy) 27521 v.AddArg(v0) 27522 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27523 v1.AuxInt = j0 27524 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27525 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 27526 v3.AuxInt = i0 27527 v3.Aux = s 27528 v3.AddArg(p) 27529 v3.AddArg(mem) 27530 v2.AddArg(v3) 27531 v1.AddArg(v2) 27532 v0.AddArg(v1) 27533 v0.AddArg(y) 27534 return true 27535 } 27536 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 27537 // 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) 27538 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27539 for { 27540 _ = v.Args[1] 27541 x0 := v.Args[0] 27542 if x0.Op != OpS390XMOVBZloadidx { 27543 break 27544 } 27545 i0 := x0.AuxInt 27546 s := x0.Aux 27547 _ = x0.Args[2] 27548 p := x0.Args[0] 27549 idx := x0.Args[1] 27550 mem := x0.Args[2] 27551 sh := v.Args[1] 27552 if sh.Op != OpS390XSLDconst { 27553 break 27554 } 27555 if sh.AuxInt != 8 { 27556 break 27557 } 27558 x1 := sh.Args[0] 27559 if x1.Op != OpS390XMOVBZloadidx { 27560 break 27561 } 27562 i1 := x1.AuxInt 27563 if x1.Aux != s { 27564 break 27565 } 27566 _ = x1.Args[2] 27567 if p != x1.Args[0] { 27568 break 27569 } 27570 if idx != x1.Args[1] { 27571 break 27572 } 27573 if mem != x1.Args[2] { 27574 break 27575 } 27576 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)) { 27577 break 27578 } 27579 b = mergePoint(b, x0, x1) 27580 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27581 v.reset(OpCopy) 27582 v.AddArg(v0) 27583 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27584 v1.AuxInt = i0 27585 v1.Aux = s 27586 v1.AddArg(p) 27587 v1.AddArg(idx) 27588 v1.AddArg(mem) 27589 v0.AddArg(v1) 27590 return true 27591 } 27592 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 27593 // 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) 27594 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27595 for { 27596 _ = v.Args[1] 27597 x0 := v.Args[0] 27598 if x0.Op != OpS390XMOVBZloadidx { 27599 break 27600 } 27601 i0 := x0.AuxInt 27602 s := x0.Aux 27603 _ = x0.Args[2] 27604 idx := x0.Args[0] 27605 p := x0.Args[1] 27606 mem := x0.Args[2] 27607 sh := v.Args[1] 27608 if sh.Op != OpS390XSLDconst { 27609 break 27610 } 27611 if sh.AuxInt != 8 { 27612 break 27613 } 27614 x1 := sh.Args[0] 27615 if x1.Op != OpS390XMOVBZloadidx { 27616 break 27617 } 27618 i1 := x1.AuxInt 27619 if x1.Aux != s { 27620 break 27621 } 27622 _ = x1.Args[2] 27623 if p != x1.Args[0] { 27624 break 27625 } 27626 if idx != x1.Args[1] { 27627 break 27628 } 27629 if mem != x1.Args[2] { 27630 break 27631 } 27632 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)) { 27633 break 27634 } 27635 b = mergePoint(b, x0, x1) 27636 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27637 v.reset(OpCopy) 27638 v.AddArg(v0) 27639 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27640 v1.AuxInt = i0 27641 v1.Aux = s 27642 v1.AddArg(p) 27643 v1.AddArg(idx) 27644 v1.AddArg(mem) 27645 v0.AddArg(v1) 27646 return true 27647 } 27648 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 27649 // 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) 27650 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27651 for { 27652 _ = v.Args[1] 27653 x0 := v.Args[0] 27654 if x0.Op != OpS390XMOVBZloadidx { 27655 break 27656 } 27657 i0 := x0.AuxInt 27658 s := x0.Aux 27659 _ = x0.Args[2] 27660 p := x0.Args[0] 27661 idx := x0.Args[1] 27662 mem := x0.Args[2] 27663 sh := v.Args[1] 27664 if sh.Op != OpS390XSLDconst { 27665 break 27666 } 27667 if sh.AuxInt != 8 { 27668 break 27669 } 27670 x1 := sh.Args[0] 27671 if x1.Op != OpS390XMOVBZloadidx { 27672 break 27673 } 27674 i1 := x1.AuxInt 27675 if x1.Aux != s { 27676 break 27677 } 27678 _ = x1.Args[2] 27679 if idx != x1.Args[0] { 27680 break 27681 } 27682 if p != x1.Args[1] { 27683 break 27684 } 27685 if mem != x1.Args[2] { 27686 break 27687 } 27688 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)) { 27689 break 27690 } 27691 b = mergePoint(b, x0, x1) 27692 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27693 v.reset(OpCopy) 27694 v.AddArg(v0) 27695 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27696 v1.AuxInt = i0 27697 v1.Aux = s 27698 v1.AddArg(p) 27699 v1.AddArg(idx) 27700 v1.AddArg(mem) 27701 v0.AddArg(v1) 27702 return true 27703 } 27704 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 27705 // 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) 27706 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27707 for { 27708 _ = v.Args[1] 27709 x0 := v.Args[0] 27710 if x0.Op != OpS390XMOVBZloadidx { 27711 break 27712 } 27713 i0 := x0.AuxInt 27714 s := x0.Aux 27715 _ = x0.Args[2] 27716 idx := x0.Args[0] 27717 p := x0.Args[1] 27718 mem := x0.Args[2] 27719 sh := v.Args[1] 27720 if sh.Op != OpS390XSLDconst { 27721 break 27722 } 27723 if sh.AuxInt != 8 { 27724 break 27725 } 27726 x1 := sh.Args[0] 27727 if x1.Op != OpS390XMOVBZloadidx { 27728 break 27729 } 27730 i1 := x1.AuxInt 27731 if x1.Aux != s { 27732 break 27733 } 27734 _ = x1.Args[2] 27735 if idx != x1.Args[0] { 27736 break 27737 } 27738 if p != x1.Args[1] { 27739 break 27740 } 27741 if mem != x1.Args[2] { 27742 break 27743 } 27744 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)) { 27745 break 27746 } 27747 b = mergePoint(b, x0, x1) 27748 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27749 v.reset(OpCopy) 27750 v.AddArg(v0) 27751 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27752 v1.AuxInt = i0 27753 v1.Aux = s 27754 v1.AddArg(p) 27755 v1.AddArg(idx) 27756 v1.AddArg(mem) 27757 v0.AddArg(v1) 27758 return true 27759 } 27760 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 27761 // 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) 27762 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27763 for { 27764 _ = v.Args[1] 27765 sh := v.Args[0] 27766 if sh.Op != OpS390XSLDconst { 27767 break 27768 } 27769 if sh.AuxInt != 8 { 27770 break 27771 } 27772 x1 := sh.Args[0] 27773 if x1.Op != OpS390XMOVBZloadidx { 27774 break 27775 } 27776 i1 := x1.AuxInt 27777 s := x1.Aux 27778 _ = x1.Args[2] 27779 p := x1.Args[0] 27780 idx := x1.Args[1] 27781 mem := x1.Args[2] 27782 x0 := v.Args[1] 27783 if x0.Op != OpS390XMOVBZloadidx { 27784 break 27785 } 27786 i0 := x0.AuxInt 27787 if x0.Aux != s { 27788 break 27789 } 27790 _ = x0.Args[2] 27791 if p != x0.Args[0] { 27792 break 27793 } 27794 if idx != x0.Args[1] { 27795 break 27796 } 27797 if mem != x0.Args[2] { 27798 break 27799 } 27800 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)) { 27801 break 27802 } 27803 b = mergePoint(b, x0, x1) 27804 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27805 v.reset(OpCopy) 27806 v.AddArg(v0) 27807 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27808 v1.AuxInt = i0 27809 v1.Aux = s 27810 v1.AddArg(p) 27811 v1.AddArg(idx) 27812 v1.AddArg(mem) 27813 v0.AddArg(v1) 27814 return true 27815 } 27816 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 27817 // 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) 27818 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27819 for { 27820 _ = v.Args[1] 27821 sh := v.Args[0] 27822 if sh.Op != OpS390XSLDconst { 27823 break 27824 } 27825 if sh.AuxInt != 8 { 27826 break 27827 } 27828 x1 := sh.Args[0] 27829 if x1.Op != OpS390XMOVBZloadidx { 27830 break 27831 } 27832 i1 := x1.AuxInt 27833 s := x1.Aux 27834 _ = x1.Args[2] 27835 idx := x1.Args[0] 27836 p := x1.Args[1] 27837 mem := x1.Args[2] 27838 x0 := v.Args[1] 27839 if x0.Op != OpS390XMOVBZloadidx { 27840 break 27841 } 27842 i0 := x0.AuxInt 27843 if x0.Aux != s { 27844 break 27845 } 27846 _ = x0.Args[2] 27847 if p != x0.Args[0] { 27848 break 27849 } 27850 if idx != x0.Args[1] { 27851 break 27852 } 27853 if mem != x0.Args[2] { 27854 break 27855 } 27856 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)) { 27857 break 27858 } 27859 b = mergePoint(b, x0, x1) 27860 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27861 v.reset(OpCopy) 27862 v.AddArg(v0) 27863 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27864 v1.AuxInt = i0 27865 v1.Aux = s 27866 v1.AddArg(p) 27867 v1.AddArg(idx) 27868 v1.AddArg(mem) 27869 v0.AddArg(v1) 27870 return true 27871 } 27872 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 27873 // 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) 27874 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27875 for { 27876 _ = v.Args[1] 27877 sh := v.Args[0] 27878 if sh.Op != OpS390XSLDconst { 27879 break 27880 } 27881 if sh.AuxInt != 8 { 27882 break 27883 } 27884 x1 := sh.Args[0] 27885 if x1.Op != OpS390XMOVBZloadidx { 27886 break 27887 } 27888 i1 := x1.AuxInt 27889 s := x1.Aux 27890 _ = x1.Args[2] 27891 p := x1.Args[0] 27892 idx := x1.Args[1] 27893 mem := x1.Args[2] 27894 x0 := v.Args[1] 27895 if x0.Op != OpS390XMOVBZloadidx { 27896 break 27897 } 27898 i0 := x0.AuxInt 27899 if x0.Aux != s { 27900 break 27901 } 27902 _ = x0.Args[2] 27903 if idx != x0.Args[0] { 27904 break 27905 } 27906 if p != x0.Args[1] { 27907 break 27908 } 27909 if mem != x0.Args[2] { 27910 break 27911 } 27912 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)) { 27913 break 27914 } 27915 b = mergePoint(b, x0, x1) 27916 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27917 v.reset(OpCopy) 27918 v.AddArg(v0) 27919 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27920 v1.AuxInt = i0 27921 v1.Aux = s 27922 v1.AddArg(p) 27923 v1.AddArg(idx) 27924 v1.AddArg(mem) 27925 v0.AddArg(v1) 27926 return true 27927 } 27928 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 27929 // 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) 27930 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 27931 for { 27932 _ = v.Args[1] 27933 sh := v.Args[0] 27934 if sh.Op != OpS390XSLDconst { 27935 break 27936 } 27937 if sh.AuxInt != 8 { 27938 break 27939 } 27940 x1 := sh.Args[0] 27941 if x1.Op != OpS390XMOVBZloadidx { 27942 break 27943 } 27944 i1 := x1.AuxInt 27945 s := x1.Aux 27946 _ = x1.Args[2] 27947 idx := x1.Args[0] 27948 p := x1.Args[1] 27949 mem := x1.Args[2] 27950 x0 := v.Args[1] 27951 if x0.Op != OpS390XMOVBZloadidx { 27952 break 27953 } 27954 i0 := x0.AuxInt 27955 if x0.Aux != s { 27956 break 27957 } 27958 _ = x0.Args[2] 27959 if idx != x0.Args[0] { 27960 break 27961 } 27962 if p != x0.Args[1] { 27963 break 27964 } 27965 if mem != x0.Args[2] { 27966 break 27967 } 27968 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)) { 27969 break 27970 } 27971 b = mergePoint(b, x0, x1) 27972 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27973 v.reset(OpCopy) 27974 v.AddArg(v0) 27975 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27976 v1.AuxInt = i0 27977 v1.Aux = s 27978 v1.AddArg(p) 27979 v1.AddArg(idx) 27980 v1.AddArg(mem) 27981 v0.AddArg(v1) 27982 return true 27983 } 27984 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27985 // 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) 27986 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 27987 for { 27988 _ = v.Args[1] 27989 r0 := v.Args[0] 27990 if r0.Op != OpS390XMOVHZreg { 27991 break 27992 } 27993 x0 := r0.Args[0] 27994 if x0.Op != OpS390XMOVHBRloadidx { 27995 break 27996 } 27997 i0 := x0.AuxInt 27998 s := x0.Aux 27999 _ = x0.Args[2] 28000 p := x0.Args[0] 28001 idx := x0.Args[1] 28002 mem := x0.Args[2] 28003 sh := v.Args[1] 28004 if sh.Op != OpS390XSLDconst { 28005 break 28006 } 28007 if sh.AuxInt != 16 { 28008 break 28009 } 28010 r1 := sh.Args[0] 28011 if r1.Op != OpS390XMOVHZreg { 28012 break 28013 } 28014 x1 := r1.Args[0] 28015 if x1.Op != OpS390XMOVHBRloadidx { 28016 break 28017 } 28018 i1 := x1.AuxInt 28019 if x1.Aux != s { 28020 break 28021 } 28022 _ = x1.Args[2] 28023 if p != x1.Args[0] { 28024 break 28025 } 28026 if idx != x1.Args[1] { 28027 break 28028 } 28029 if mem != x1.Args[2] { 28030 break 28031 } 28032 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)) { 28033 break 28034 } 28035 b = mergePoint(b, x0, x1) 28036 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28037 v.reset(OpCopy) 28038 v.AddArg(v0) 28039 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28040 v1.AuxInt = i0 28041 v1.Aux = s 28042 v1.AddArg(p) 28043 v1.AddArg(idx) 28044 v1.AddArg(mem) 28045 v0.AddArg(v1) 28046 return true 28047 } 28048 return false 28049 } 28050 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 28051 b := v.Block 28052 _ = b 28053 typ := &b.Func.Config.Types 28054 _ = typ 28055 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 28056 // 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) 28057 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28058 for { 28059 _ = v.Args[1] 28060 r0 := v.Args[0] 28061 if r0.Op != OpS390XMOVHZreg { 28062 break 28063 } 28064 x0 := r0.Args[0] 28065 if x0.Op != OpS390XMOVHBRloadidx { 28066 break 28067 } 28068 i0 := x0.AuxInt 28069 s := x0.Aux 28070 _ = x0.Args[2] 28071 idx := x0.Args[0] 28072 p := x0.Args[1] 28073 mem := x0.Args[2] 28074 sh := v.Args[1] 28075 if sh.Op != OpS390XSLDconst { 28076 break 28077 } 28078 if sh.AuxInt != 16 { 28079 break 28080 } 28081 r1 := sh.Args[0] 28082 if r1.Op != OpS390XMOVHZreg { 28083 break 28084 } 28085 x1 := r1.Args[0] 28086 if x1.Op != OpS390XMOVHBRloadidx { 28087 break 28088 } 28089 i1 := x1.AuxInt 28090 if x1.Aux != s { 28091 break 28092 } 28093 _ = x1.Args[2] 28094 if p != x1.Args[0] { 28095 break 28096 } 28097 if idx != x1.Args[1] { 28098 break 28099 } 28100 if mem != x1.Args[2] { 28101 break 28102 } 28103 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)) { 28104 break 28105 } 28106 b = mergePoint(b, x0, x1) 28107 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28108 v.reset(OpCopy) 28109 v.AddArg(v0) 28110 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28111 v1.AuxInt = i0 28112 v1.Aux = s 28113 v1.AddArg(p) 28114 v1.AddArg(idx) 28115 v1.AddArg(mem) 28116 v0.AddArg(v1) 28117 return true 28118 } 28119 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 28120 // 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) 28121 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28122 for { 28123 _ = v.Args[1] 28124 r0 := v.Args[0] 28125 if r0.Op != OpS390XMOVHZreg { 28126 break 28127 } 28128 x0 := r0.Args[0] 28129 if x0.Op != OpS390XMOVHBRloadidx { 28130 break 28131 } 28132 i0 := x0.AuxInt 28133 s := x0.Aux 28134 _ = x0.Args[2] 28135 p := x0.Args[0] 28136 idx := x0.Args[1] 28137 mem := x0.Args[2] 28138 sh := v.Args[1] 28139 if sh.Op != OpS390XSLDconst { 28140 break 28141 } 28142 if sh.AuxInt != 16 { 28143 break 28144 } 28145 r1 := sh.Args[0] 28146 if r1.Op != OpS390XMOVHZreg { 28147 break 28148 } 28149 x1 := r1.Args[0] 28150 if x1.Op != OpS390XMOVHBRloadidx { 28151 break 28152 } 28153 i1 := x1.AuxInt 28154 if x1.Aux != s { 28155 break 28156 } 28157 _ = x1.Args[2] 28158 if idx != x1.Args[0] { 28159 break 28160 } 28161 if p != x1.Args[1] { 28162 break 28163 } 28164 if mem != x1.Args[2] { 28165 break 28166 } 28167 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)) { 28168 break 28169 } 28170 b = mergePoint(b, x0, x1) 28171 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28172 v.reset(OpCopy) 28173 v.AddArg(v0) 28174 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28175 v1.AuxInt = i0 28176 v1.Aux = s 28177 v1.AddArg(p) 28178 v1.AddArg(idx) 28179 v1.AddArg(mem) 28180 v0.AddArg(v1) 28181 return true 28182 } 28183 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 28184 // 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) 28185 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28186 for { 28187 _ = v.Args[1] 28188 r0 := v.Args[0] 28189 if r0.Op != OpS390XMOVHZreg { 28190 break 28191 } 28192 x0 := r0.Args[0] 28193 if x0.Op != OpS390XMOVHBRloadidx { 28194 break 28195 } 28196 i0 := x0.AuxInt 28197 s := x0.Aux 28198 _ = x0.Args[2] 28199 idx := x0.Args[0] 28200 p := x0.Args[1] 28201 mem := x0.Args[2] 28202 sh := v.Args[1] 28203 if sh.Op != OpS390XSLDconst { 28204 break 28205 } 28206 if sh.AuxInt != 16 { 28207 break 28208 } 28209 r1 := sh.Args[0] 28210 if r1.Op != OpS390XMOVHZreg { 28211 break 28212 } 28213 x1 := r1.Args[0] 28214 if x1.Op != OpS390XMOVHBRloadidx { 28215 break 28216 } 28217 i1 := x1.AuxInt 28218 if x1.Aux != s { 28219 break 28220 } 28221 _ = x1.Args[2] 28222 if idx != x1.Args[0] { 28223 break 28224 } 28225 if p != x1.Args[1] { 28226 break 28227 } 28228 if mem != x1.Args[2] { 28229 break 28230 } 28231 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)) { 28232 break 28233 } 28234 b = mergePoint(b, x0, x1) 28235 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28236 v.reset(OpCopy) 28237 v.AddArg(v0) 28238 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28239 v1.AuxInt = i0 28240 v1.Aux = s 28241 v1.AddArg(p) 28242 v1.AddArg(idx) 28243 v1.AddArg(mem) 28244 v0.AddArg(v1) 28245 return true 28246 } 28247 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 28248 // 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) 28249 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28250 for { 28251 _ = v.Args[1] 28252 sh := v.Args[0] 28253 if sh.Op != OpS390XSLDconst { 28254 break 28255 } 28256 if sh.AuxInt != 16 { 28257 break 28258 } 28259 r1 := sh.Args[0] 28260 if r1.Op != OpS390XMOVHZreg { 28261 break 28262 } 28263 x1 := r1.Args[0] 28264 if x1.Op != OpS390XMOVHBRloadidx { 28265 break 28266 } 28267 i1 := x1.AuxInt 28268 s := x1.Aux 28269 _ = x1.Args[2] 28270 p := x1.Args[0] 28271 idx := x1.Args[1] 28272 mem := x1.Args[2] 28273 r0 := v.Args[1] 28274 if r0.Op != OpS390XMOVHZreg { 28275 break 28276 } 28277 x0 := r0.Args[0] 28278 if x0.Op != OpS390XMOVHBRloadidx { 28279 break 28280 } 28281 i0 := x0.AuxInt 28282 if x0.Aux != s { 28283 break 28284 } 28285 _ = x0.Args[2] 28286 if p != x0.Args[0] { 28287 break 28288 } 28289 if idx != x0.Args[1] { 28290 break 28291 } 28292 if mem != x0.Args[2] { 28293 break 28294 } 28295 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)) { 28296 break 28297 } 28298 b = mergePoint(b, x0, x1) 28299 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28300 v.reset(OpCopy) 28301 v.AddArg(v0) 28302 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28303 v1.AuxInt = i0 28304 v1.Aux = s 28305 v1.AddArg(p) 28306 v1.AddArg(idx) 28307 v1.AddArg(mem) 28308 v0.AddArg(v1) 28309 return true 28310 } 28311 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 28312 // 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) 28313 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28314 for { 28315 _ = v.Args[1] 28316 sh := v.Args[0] 28317 if sh.Op != OpS390XSLDconst { 28318 break 28319 } 28320 if sh.AuxInt != 16 { 28321 break 28322 } 28323 r1 := sh.Args[0] 28324 if r1.Op != OpS390XMOVHZreg { 28325 break 28326 } 28327 x1 := r1.Args[0] 28328 if x1.Op != OpS390XMOVHBRloadidx { 28329 break 28330 } 28331 i1 := x1.AuxInt 28332 s := x1.Aux 28333 _ = x1.Args[2] 28334 idx := x1.Args[0] 28335 p := x1.Args[1] 28336 mem := x1.Args[2] 28337 r0 := v.Args[1] 28338 if r0.Op != OpS390XMOVHZreg { 28339 break 28340 } 28341 x0 := r0.Args[0] 28342 if x0.Op != OpS390XMOVHBRloadidx { 28343 break 28344 } 28345 i0 := x0.AuxInt 28346 if x0.Aux != s { 28347 break 28348 } 28349 _ = x0.Args[2] 28350 if p != x0.Args[0] { 28351 break 28352 } 28353 if idx != x0.Args[1] { 28354 break 28355 } 28356 if mem != x0.Args[2] { 28357 break 28358 } 28359 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)) { 28360 break 28361 } 28362 b = mergePoint(b, x0, x1) 28363 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28364 v.reset(OpCopy) 28365 v.AddArg(v0) 28366 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28367 v1.AuxInt = i0 28368 v1.Aux = s 28369 v1.AddArg(p) 28370 v1.AddArg(idx) 28371 v1.AddArg(mem) 28372 v0.AddArg(v1) 28373 return true 28374 } 28375 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 28376 // 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) 28377 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28378 for { 28379 _ = v.Args[1] 28380 sh := v.Args[0] 28381 if sh.Op != OpS390XSLDconst { 28382 break 28383 } 28384 if sh.AuxInt != 16 { 28385 break 28386 } 28387 r1 := sh.Args[0] 28388 if r1.Op != OpS390XMOVHZreg { 28389 break 28390 } 28391 x1 := r1.Args[0] 28392 if x1.Op != OpS390XMOVHBRloadidx { 28393 break 28394 } 28395 i1 := x1.AuxInt 28396 s := x1.Aux 28397 _ = x1.Args[2] 28398 p := x1.Args[0] 28399 idx := x1.Args[1] 28400 mem := x1.Args[2] 28401 r0 := v.Args[1] 28402 if r0.Op != OpS390XMOVHZreg { 28403 break 28404 } 28405 x0 := r0.Args[0] 28406 if x0.Op != OpS390XMOVHBRloadidx { 28407 break 28408 } 28409 i0 := x0.AuxInt 28410 if x0.Aux != s { 28411 break 28412 } 28413 _ = x0.Args[2] 28414 if idx != x0.Args[0] { 28415 break 28416 } 28417 if p != x0.Args[1] { 28418 break 28419 } 28420 if mem != x0.Args[2] { 28421 break 28422 } 28423 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)) { 28424 break 28425 } 28426 b = mergePoint(b, x0, x1) 28427 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28428 v.reset(OpCopy) 28429 v.AddArg(v0) 28430 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28431 v1.AuxInt = i0 28432 v1.Aux = s 28433 v1.AddArg(p) 28434 v1.AddArg(idx) 28435 v1.AddArg(mem) 28436 v0.AddArg(v1) 28437 return true 28438 } 28439 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 28440 // 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) 28441 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 28442 for { 28443 _ = v.Args[1] 28444 sh := v.Args[0] 28445 if sh.Op != OpS390XSLDconst { 28446 break 28447 } 28448 if sh.AuxInt != 16 { 28449 break 28450 } 28451 r1 := sh.Args[0] 28452 if r1.Op != OpS390XMOVHZreg { 28453 break 28454 } 28455 x1 := r1.Args[0] 28456 if x1.Op != OpS390XMOVHBRloadidx { 28457 break 28458 } 28459 i1 := x1.AuxInt 28460 s := x1.Aux 28461 _ = x1.Args[2] 28462 idx := x1.Args[0] 28463 p := x1.Args[1] 28464 mem := x1.Args[2] 28465 r0 := v.Args[1] 28466 if r0.Op != OpS390XMOVHZreg { 28467 break 28468 } 28469 x0 := r0.Args[0] 28470 if x0.Op != OpS390XMOVHBRloadidx { 28471 break 28472 } 28473 i0 := x0.AuxInt 28474 if x0.Aux != s { 28475 break 28476 } 28477 _ = x0.Args[2] 28478 if idx != x0.Args[0] { 28479 break 28480 } 28481 if p != x0.Args[1] { 28482 break 28483 } 28484 if mem != x0.Args[2] { 28485 break 28486 } 28487 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)) { 28488 break 28489 } 28490 b = mergePoint(b, x0, x1) 28491 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28492 v.reset(OpCopy) 28493 v.AddArg(v0) 28494 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28495 v1.AuxInt = i0 28496 v1.Aux = s 28497 v1.AddArg(p) 28498 v1.AddArg(idx) 28499 v1.AddArg(mem) 28500 v0.AddArg(v1) 28501 return true 28502 } 28503 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 28504 // 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) 28505 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28506 for { 28507 _ = v.Args[1] 28508 r0 := v.Args[0] 28509 if r0.Op != OpS390XMOVWZreg { 28510 break 28511 } 28512 x0 := r0.Args[0] 28513 if x0.Op != OpS390XMOVWBRloadidx { 28514 break 28515 } 28516 i0 := x0.AuxInt 28517 s := x0.Aux 28518 _ = x0.Args[2] 28519 p := x0.Args[0] 28520 idx := x0.Args[1] 28521 mem := x0.Args[2] 28522 sh := v.Args[1] 28523 if sh.Op != OpS390XSLDconst { 28524 break 28525 } 28526 if sh.AuxInt != 32 { 28527 break 28528 } 28529 r1 := sh.Args[0] 28530 if r1.Op != OpS390XMOVWZreg { 28531 break 28532 } 28533 x1 := r1.Args[0] 28534 if x1.Op != OpS390XMOVWBRloadidx { 28535 break 28536 } 28537 i1 := x1.AuxInt 28538 if x1.Aux != s { 28539 break 28540 } 28541 _ = x1.Args[2] 28542 if p != x1.Args[0] { 28543 break 28544 } 28545 if idx != x1.Args[1] { 28546 break 28547 } 28548 if mem != x1.Args[2] { 28549 break 28550 } 28551 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)) { 28552 break 28553 } 28554 b = mergePoint(b, x0, x1) 28555 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28556 v.reset(OpCopy) 28557 v.AddArg(v0) 28558 v0.AuxInt = i0 28559 v0.Aux = s 28560 v0.AddArg(p) 28561 v0.AddArg(idx) 28562 v0.AddArg(mem) 28563 return true 28564 } 28565 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 28566 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 28567 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28568 for { 28569 _ = v.Args[1] 28570 r0 := v.Args[0] 28571 if r0.Op != OpS390XMOVWZreg { 28572 break 28573 } 28574 x0 := r0.Args[0] 28575 if x0.Op != OpS390XMOVWBRloadidx { 28576 break 28577 } 28578 i0 := x0.AuxInt 28579 s := x0.Aux 28580 _ = x0.Args[2] 28581 idx := x0.Args[0] 28582 p := x0.Args[1] 28583 mem := x0.Args[2] 28584 sh := v.Args[1] 28585 if sh.Op != OpS390XSLDconst { 28586 break 28587 } 28588 if sh.AuxInt != 32 { 28589 break 28590 } 28591 r1 := sh.Args[0] 28592 if r1.Op != OpS390XMOVWZreg { 28593 break 28594 } 28595 x1 := r1.Args[0] 28596 if x1.Op != OpS390XMOVWBRloadidx { 28597 break 28598 } 28599 i1 := x1.AuxInt 28600 if x1.Aux != s { 28601 break 28602 } 28603 _ = x1.Args[2] 28604 if p != x1.Args[0] { 28605 break 28606 } 28607 if idx != x1.Args[1] { 28608 break 28609 } 28610 if mem != x1.Args[2] { 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(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28618 v.reset(OpCopy) 28619 v.AddArg(v0) 28620 v0.AuxInt = i0 28621 v0.Aux = s 28622 v0.AddArg(p) 28623 v0.AddArg(idx) 28624 v0.AddArg(mem) 28625 return true 28626 } 28627 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 28628 // 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) 28629 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28630 for { 28631 _ = v.Args[1] 28632 r0 := v.Args[0] 28633 if r0.Op != OpS390XMOVWZreg { 28634 break 28635 } 28636 x0 := r0.Args[0] 28637 if x0.Op != OpS390XMOVWBRloadidx { 28638 break 28639 } 28640 i0 := x0.AuxInt 28641 s := x0.Aux 28642 _ = x0.Args[2] 28643 p := x0.Args[0] 28644 idx := x0.Args[1] 28645 mem := x0.Args[2] 28646 sh := v.Args[1] 28647 if sh.Op != OpS390XSLDconst { 28648 break 28649 } 28650 if sh.AuxInt != 32 { 28651 break 28652 } 28653 r1 := sh.Args[0] 28654 if r1.Op != OpS390XMOVWZreg { 28655 break 28656 } 28657 x1 := r1.Args[0] 28658 if x1.Op != OpS390XMOVWBRloadidx { 28659 break 28660 } 28661 i1 := x1.AuxInt 28662 if x1.Aux != s { 28663 break 28664 } 28665 _ = x1.Args[2] 28666 if idx != x1.Args[0] { 28667 break 28668 } 28669 if p != x1.Args[1] { 28670 break 28671 } 28672 if mem != x1.Args[2] { 28673 break 28674 } 28675 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)) { 28676 break 28677 } 28678 b = mergePoint(b, x0, x1) 28679 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28680 v.reset(OpCopy) 28681 v.AddArg(v0) 28682 v0.AuxInt = i0 28683 v0.Aux = s 28684 v0.AddArg(p) 28685 v0.AddArg(idx) 28686 v0.AddArg(mem) 28687 return true 28688 } 28689 return false 28690 } 28691 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 28692 b := v.Block 28693 _ = b 28694 typ := &b.Func.Config.Types 28695 _ = typ 28696 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 28697 // 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) 28698 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28699 for { 28700 _ = v.Args[1] 28701 r0 := v.Args[0] 28702 if r0.Op != OpS390XMOVWZreg { 28703 break 28704 } 28705 x0 := r0.Args[0] 28706 if x0.Op != OpS390XMOVWBRloadidx { 28707 break 28708 } 28709 i0 := x0.AuxInt 28710 s := x0.Aux 28711 _ = x0.Args[2] 28712 idx := x0.Args[0] 28713 p := x0.Args[1] 28714 mem := x0.Args[2] 28715 sh := v.Args[1] 28716 if sh.Op != OpS390XSLDconst { 28717 break 28718 } 28719 if sh.AuxInt != 32 { 28720 break 28721 } 28722 r1 := sh.Args[0] 28723 if r1.Op != OpS390XMOVWZreg { 28724 break 28725 } 28726 x1 := r1.Args[0] 28727 if x1.Op != OpS390XMOVWBRloadidx { 28728 break 28729 } 28730 i1 := x1.AuxInt 28731 if x1.Aux != s { 28732 break 28733 } 28734 _ = x1.Args[2] 28735 if idx != x1.Args[0] { 28736 break 28737 } 28738 if p != x1.Args[1] { 28739 break 28740 } 28741 if mem != x1.Args[2] { 28742 break 28743 } 28744 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)) { 28745 break 28746 } 28747 b = mergePoint(b, x0, x1) 28748 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28749 v.reset(OpCopy) 28750 v.AddArg(v0) 28751 v0.AuxInt = i0 28752 v0.Aux = s 28753 v0.AddArg(p) 28754 v0.AddArg(idx) 28755 v0.AddArg(mem) 28756 return true 28757 } 28758 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 28759 // 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) 28760 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28761 for { 28762 _ = v.Args[1] 28763 sh := v.Args[0] 28764 if sh.Op != OpS390XSLDconst { 28765 break 28766 } 28767 if sh.AuxInt != 32 { 28768 break 28769 } 28770 r1 := sh.Args[0] 28771 if r1.Op != OpS390XMOVWZreg { 28772 break 28773 } 28774 x1 := r1.Args[0] 28775 if x1.Op != OpS390XMOVWBRloadidx { 28776 break 28777 } 28778 i1 := x1.AuxInt 28779 s := x1.Aux 28780 _ = x1.Args[2] 28781 p := x1.Args[0] 28782 idx := x1.Args[1] 28783 mem := x1.Args[2] 28784 r0 := v.Args[1] 28785 if r0.Op != OpS390XMOVWZreg { 28786 break 28787 } 28788 x0 := r0.Args[0] 28789 if x0.Op != OpS390XMOVWBRloadidx { 28790 break 28791 } 28792 i0 := x0.AuxInt 28793 if x0.Aux != s { 28794 break 28795 } 28796 _ = x0.Args[2] 28797 if p != x0.Args[0] { 28798 break 28799 } 28800 if idx != x0.Args[1] { 28801 break 28802 } 28803 if mem != x0.Args[2] { 28804 break 28805 } 28806 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)) { 28807 break 28808 } 28809 b = mergePoint(b, x0, x1) 28810 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28811 v.reset(OpCopy) 28812 v.AddArg(v0) 28813 v0.AuxInt = i0 28814 v0.Aux = s 28815 v0.AddArg(p) 28816 v0.AddArg(idx) 28817 v0.AddArg(mem) 28818 return true 28819 } 28820 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 28821 // 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) 28822 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28823 for { 28824 _ = v.Args[1] 28825 sh := v.Args[0] 28826 if sh.Op != OpS390XSLDconst { 28827 break 28828 } 28829 if sh.AuxInt != 32 { 28830 break 28831 } 28832 r1 := sh.Args[0] 28833 if r1.Op != OpS390XMOVWZreg { 28834 break 28835 } 28836 x1 := r1.Args[0] 28837 if x1.Op != OpS390XMOVWBRloadidx { 28838 break 28839 } 28840 i1 := x1.AuxInt 28841 s := x1.Aux 28842 _ = x1.Args[2] 28843 idx := x1.Args[0] 28844 p := x1.Args[1] 28845 mem := x1.Args[2] 28846 r0 := v.Args[1] 28847 if r0.Op != OpS390XMOVWZreg { 28848 break 28849 } 28850 x0 := r0.Args[0] 28851 if x0.Op != OpS390XMOVWBRloadidx { 28852 break 28853 } 28854 i0 := x0.AuxInt 28855 if x0.Aux != s { 28856 break 28857 } 28858 _ = x0.Args[2] 28859 if p != x0.Args[0] { 28860 break 28861 } 28862 if idx != x0.Args[1] { 28863 break 28864 } 28865 if mem != x0.Args[2] { 28866 break 28867 } 28868 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)) { 28869 break 28870 } 28871 b = mergePoint(b, x0, x1) 28872 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28873 v.reset(OpCopy) 28874 v.AddArg(v0) 28875 v0.AuxInt = i0 28876 v0.Aux = s 28877 v0.AddArg(p) 28878 v0.AddArg(idx) 28879 v0.AddArg(mem) 28880 return true 28881 } 28882 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 28883 // 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) 28884 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28885 for { 28886 _ = v.Args[1] 28887 sh := v.Args[0] 28888 if sh.Op != OpS390XSLDconst { 28889 break 28890 } 28891 if sh.AuxInt != 32 { 28892 break 28893 } 28894 r1 := sh.Args[0] 28895 if r1.Op != OpS390XMOVWZreg { 28896 break 28897 } 28898 x1 := r1.Args[0] 28899 if x1.Op != OpS390XMOVWBRloadidx { 28900 break 28901 } 28902 i1 := x1.AuxInt 28903 s := x1.Aux 28904 _ = x1.Args[2] 28905 p := x1.Args[0] 28906 idx := x1.Args[1] 28907 mem := x1.Args[2] 28908 r0 := v.Args[1] 28909 if r0.Op != OpS390XMOVWZreg { 28910 break 28911 } 28912 x0 := r0.Args[0] 28913 if x0.Op != OpS390XMOVWBRloadidx { 28914 break 28915 } 28916 i0 := x0.AuxInt 28917 if x0.Aux != s { 28918 break 28919 } 28920 _ = x0.Args[2] 28921 if idx != x0.Args[0] { 28922 break 28923 } 28924 if p != x0.Args[1] { 28925 break 28926 } 28927 if mem != x0.Args[2] { 28928 break 28929 } 28930 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)) { 28931 break 28932 } 28933 b = mergePoint(b, x0, x1) 28934 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28935 v.reset(OpCopy) 28936 v.AddArg(v0) 28937 v0.AuxInt = i0 28938 v0.Aux = s 28939 v0.AddArg(p) 28940 v0.AddArg(idx) 28941 v0.AddArg(mem) 28942 return true 28943 } 28944 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 28945 // 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) 28946 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 28947 for { 28948 _ = v.Args[1] 28949 sh := v.Args[0] 28950 if sh.Op != OpS390XSLDconst { 28951 break 28952 } 28953 if sh.AuxInt != 32 { 28954 break 28955 } 28956 r1 := sh.Args[0] 28957 if r1.Op != OpS390XMOVWZreg { 28958 break 28959 } 28960 x1 := r1.Args[0] 28961 if x1.Op != OpS390XMOVWBRloadidx { 28962 break 28963 } 28964 i1 := x1.AuxInt 28965 s := x1.Aux 28966 _ = x1.Args[2] 28967 idx := x1.Args[0] 28968 p := x1.Args[1] 28969 mem := x1.Args[2] 28970 r0 := v.Args[1] 28971 if r0.Op != OpS390XMOVWZreg { 28972 break 28973 } 28974 x0 := r0.Args[0] 28975 if x0.Op != OpS390XMOVWBRloadidx { 28976 break 28977 } 28978 i0 := x0.AuxInt 28979 if x0.Aux != s { 28980 break 28981 } 28982 _ = x0.Args[2] 28983 if idx != x0.Args[0] { 28984 break 28985 } 28986 if p != x0.Args[1] { 28987 break 28988 } 28989 if mem != x0.Args[2] { 28990 break 28991 } 28992 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)) { 28993 break 28994 } 28995 b = mergePoint(b, x0, x1) 28996 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 28997 v.reset(OpCopy) 28998 v.AddArg(v0) 28999 v0.AuxInt = i0 29000 v0.Aux = s 29001 v0.AddArg(p) 29002 v0.AddArg(idx) 29003 v0.AddArg(mem) 29004 return true 29005 } 29006 // 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)) 29007 // 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) 29008 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29009 for { 29010 _ = v.Args[1] 29011 s1 := v.Args[0] 29012 if s1.Op != OpS390XSLDconst { 29013 break 29014 } 29015 j1 := s1.AuxInt 29016 x1 := s1.Args[0] 29017 if x1.Op != OpS390XMOVBZloadidx { 29018 break 29019 } 29020 i1 := x1.AuxInt 29021 s := x1.Aux 29022 _ = x1.Args[2] 29023 p := x1.Args[0] 29024 idx := x1.Args[1] 29025 mem := x1.Args[2] 29026 or := v.Args[1] 29027 if or.Op != OpS390XOR { 29028 break 29029 } 29030 _ = or.Args[1] 29031 s0 := or.Args[0] 29032 if s0.Op != OpS390XSLDconst { 29033 break 29034 } 29035 j0 := s0.AuxInt 29036 x0 := s0.Args[0] 29037 if x0.Op != OpS390XMOVBZloadidx { 29038 break 29039 } 29040 i0 := x0.AuxInt 29041 if x0.Aux != s { 29042 break 29043 } 29044 _ = x0.Args[2] 29045 if p != x0.Args[0] { 29046 break 29047 } 29048 if idx != x0.Args[1] { 29049 break 29050 } 29051 if mem != x0.Args[2] { 29052 break 29053 } 29054 y := or.Args[1] 29055 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)) { 29056 break 29057 } 29058 b = mergePoint(b, x0, x1) 29059 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29060 v.reset(OpCopy) 29061 v.AddArg(v0) 29062 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29063 v1.AuxInt = j0 29064 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29065 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29066 v3.AuxInt = i0 29067 v3.Aux = s 29068 v3.AddArg(p) 29069 v3.AddArg(idx) 29070 v3.AddArg(mem) 29071 v2.AddArg(v3) 29072 v1.AddArg(v2) 29073 v0.AddArg(v1) 29074 v0.AddArg(y) 29075 return true 29076 } 29077 // 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)) 29078 // 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) 29079 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29080 for { 29081 _ = v.Args[1] 29082 s1 := v.Args[0] 29083 if s1.Op != OpS390XSLDconst { 29084 break 29085 } 29086 j1 := s1.AuxInt 29087 x1 := s1.Args[0] 29088 if x1.Op != OpS390XMOVBZloadidx { 29089 break 29090 } 29091 i1 := x1.AuxInt 29092 s := x1.Aux 29093 _ = x1.Args[2] 29094 idx := x1.Args[0] 29095 p := x1.Args[1] 29096 mem := x1.Args[2] 29097 or := v.Args[1] 29098 if or.Op != OpS390XOR { 29099 break 29100 } 29101 _ = or.Args[1] 29102 s0 := or.Args[0] 29103 if s0.Op != OpS390XSLDconst { 29104 break 29105 } 29106 j0 := s0.AuxInt 29107 x0 := s0.Args[0] 29108 if x0.Op != OpS390XMOVBZloadidx { 29109 break 29110 } 29111 i0 := x0.AuxInt 29112 if x0.Aux != s { 29113 break 29114 } 29115 _ = x0.Args[2] 29116 if p != x0.Args[0] { 29117 break 29118 } 29119 if idx != x0.Args[1] { 29120 break 29121 } 29122 if mem != x0.Args[2] { 29123 break 29124 } 29125 y := or.Args[1] 29126 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)) { 29127 break 29128 } 29129 b = mergePoint(b, x0, x1) 29130 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29131 v.reset(OpCopy) 29132 v.AddArg(v0) 29133 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29134 v1.AuxInt = j0 29135 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29136 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29137 v3.AuxInt = i0 29138 v3.Aux = s 29139 v3.AddArg(p) 29140 v3.AddArg(idx) 29141 v3.AddArg(mem) 29142 v2.AddArg(v3) 29143 v1.AddArg(v2) 29144 v0.AddArg(v1) 29145 v0.AddArg(y) 29146 return true 29147 } 29148 // 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)) 29149 // 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) 29150 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29151 for { 29152 _ = v.Args[1] 29153 s1 := v.Args[0] 29154 if s1.Op != OpS390XSLDconst { 29155 break 29156 } 29157 j1 := s1.AuxInt 29158 x1 := s1.Args[0] 29159 if x1.Op != OpS390XMOVBZloadidx { 29160 break 29161 } 29162 i1 := x1.AuxInt 29163 s := x1.Aux 29164 _ = x1.Args[2] 29165 p := x1.Args[0] 29166 idx := x1.Args[1] 29167 mem := x1.Args[2] 29168 or := v.Args[1] 29169 if or.Op != OpS390XOR { 29170 break 29171 } 29172 _ = or.Args[1] 29173 s0 := or.Args[0] 29174 if s0.Op != OpS390XSLDconst { 29175 break 29176 } 29177 j0 := s0.AuxInt 29178 x0 := s0.Args[0] 29179 if x0.Op != OpS390XMOVBZloadidx { 29180 break 29181 } 29182 i0 := x0.AuxInt 29183 if x0.Aux != s { 29184 break 29185 } 29186 _ = x0.Args[2] 29187 if idx != x0.Args[0] { 29188 break 29189 } 29190 if p != x0.Args[1] { 29191 break 29192 } 29193 if mem != x0.Args[2] { 29194 break 29195 } 29196 y := or.Args[1] 29197 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)) { 29198 break 29199 } 29200 b = mergePoint(b, x0, x1) 29201 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29202 v.reset(OpCopy) 29203 v.AddArg(v0) 29204 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29205 v1.AuxInt = j0 29206 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29207 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29208 v3.AuxInt = i0 29209 v3.Aux = s 29210 v3.AddArg(p) 29211 v3.AddArg(idx) 29212 v3.AddArg(mem) 29213 v2.AddArg(v3) 29214 v1.AddArg(v2) 29215 v0.AddArg(v1) 29216 v0.AddArg(y) 29217 return true 29218 } 29219 // 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)) 29220 // 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) 29221 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29222 for { 29223 _ = v.Args[1] 29224 s1 := v.Args[0] 29225 if s1.Op != OpS390XSLDconst { 29226 break 29227 } 29228 j1 := s1.AuxInt 29229 x1 := s1.Args[0] 29230 if x1.Op != OpS390XMOVBZloadidx { 29231 break 29232 } 29233 i1 := x1.AuxInt 29234 s := x1.Aux 29235 _ = x1.Args[2] 29236 idx := x1.Args[0] 29237 p := x1.Args[1] 29238 mem := x1.Args[2] 29239 or := v.Args[1] 29240 if or.Op != OpS390XOR { 29241 break 29242 } 29243 _ = or.Args[1] 29244 s0 := or.Args[0] 29245 if s0.Op != OpS390XSLDconst { 29246 break 29247 } 29248 j0 := s0.AuxInt 29249 x0 := s0.Args[0] 29250 if x0.Op != OpS390XMOVBZloadidx { 29251 break 29252 } 29253 i0 := x0.AuxInt 29254 if x0.Aux != s { 29255 break 29256 } 29257 _ = x0.Args[2] 29258 if idx != x0.Args[0] { 29259 break 29260 } 29261 if p != x0.Args[1] { 29262 break 29263 } 29264 if mem != x0.Args[2] { 29265 break 29266 } 29267 y := or.Args[1] 29268 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)) { 29269 break 29270 } 29271 b = mergePoint(b, x0, x1) 29272 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29273 v.reset(OpCopy) 29274 v.AddArg(v0) 29275 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29276 v1.AuxInt = j0 29277 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29278 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29279 v3.AuxInt = i0 29280 v3.Aux = s 29281 v3.AddArg(p) 29282 v3.AddArg(idx) 29283 v3.AddArg(mem) 29284 v2.AddArg(v3) 29285 v1.AddArg(v2) 29286 v0.AddArg(v1) 29287 v0.AddArg(y) 29288 return true 29289 } 29290 // 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)))) 29291 // 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) 29292 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29293 for { 29294 _ = v.Args[1] 29295 s1 := v.Args[0] 29296 if s1.Op != OpS390XSLDconst { 29297 break 29298 } 29299 j1 := s1.AuxInt 29300 x1 := s1.Args[0] 29301 if x1.Op != OpS390XMOVBZloadidx { 29302 break 29303 } 29304 i1 := x1.AuxInt 29305 s := x1.Aux 29306 _ = x1.Args[2] 29307 p := x1.Args[0] 29308 idx := x1.Args[1] 29309 mem := x1.Args[2] 29310 or := v.Args[1] 29311 if or.Op != OpS390XOR { 29312 break 29313 } 29314 _ = or.Args[1] 29315 y := or.Args[0] 29316 s0 := or.Args[1] 29317 if s0.Op != OpS390XSLDconst { 29318 break 29319 } 29320 j0 := s0.AuxInt 29321 x0 := s0.Args[0] 29322 if x0.Op != OpS390XMOVBZloadidx { 29323 break 29324 } 29325 i0 := x0.AuxInt 29326 if x0.Aux != s { 29327 break 29328 } 29329 _ = x0.Args[2] 29330 if p != x0.Args[0] { 29331 break 29332 } 29333 if idx != x0.Args[1] { 29334 break 29335 } 29336 if mem != x0.Args[2] { 29337 break 29338 } 29339 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)) { 29340 break 29341 } 29342 b = mergePoint(b, x0, x1) 29343 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29344 v.reset(OpCopy) 29345 v.AddArg(v0) 29346 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29347 v1.AuxInt = j0 29348 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29349 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29350 v3.AuxInt = i0 29351 v3.Aux = s 29352 v3.AddArg(p) 29353 v3.AddArg(idx) 29354 v3.AddArg(mem) 29355 v2.AddArg(v3) 29356 v1.AddArg(v2) 29357 v0.AddArg(v1) 29358 v0.AddArg(y) 29359 return true 29360 } 29361 return false 29362 } 29363 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 29364 b := v.Block 29365 _ = b 29366 typ := &b.Func.Config.Types 29367 _ = typ 29368 // 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)))) 29369 // 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) 29370 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29371 for { 29372 _ = v.Args[1] 29373 s1 := v.Args[0] 29374 if s1.Op != OpS390XSLDconst { 29375 break 29376 } 29377 j1 := s1.AuxInt 29378 x1 := s1.Args[0] 29379 if x1.Op != OpS390XMOVBZloadidx { 29380 break 29381 } 29382 i1 := x1.AuxInt 29383 s := x1.Aux 29384 _ = x1.Args[2] 29385 idx := x1.Args[0] 29386 p := x1.Args[1] 29387 mem := x1.Args[2] 29388 or := v.Args[1] 29389 if or.Op != OpS390XOR { 29390 break 29391 } 29392 _ = or.Args[1] 29393 y := or.Args[0] 29394 s0 := or.Args[1] 29395 if s0.Op != OpS390XSLDconst { 29396 break 29397 } 29398 j0 := s0.AuxInt 29399 x0 := s0.Args[0] 29400 if x0.Op != OpS390XMOVBZloadidx { 29401 break 29402 } 29403 i0 := x0.AuxInt 29404 if x0.Aux != s { 29405 break 29406 } 29407 _ = x0.Args[2] 29408 if p != x0.Args[0] { 29409 break 29410 } 29411 if idx != x0.Args[1] { 29412 break 29413 } 29414 if mem != x0.Args[2] { 29415 break 29416 } 29417 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)) { 29418 break 29419 } 29420 b = mergePoint(b, x0, x1) 29421 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29422 v.reset(OpCopy) 29423 v.AddArg(v0) 29424 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29425 v1.AuxInt = j0 29426 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29427 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29428 v3.AuxInt = i0 29429 v3.Aux = s 29430 v3.AddArg(p) 29431 v3.AddArg(idx) 29432 v3.AddArg(mem) 29433 v2.AddArg(v3) 29434 v1.AddArg(v2) 29435 v0.AddArg(v1) 29436 v0.AddArg(y) 29437 return true 29438 } 29439 // 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)))) 29440 // 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) 29441 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29442 for { 29443 _ = v.Args[1] 29444 s1 := v.Args[0] 29445 if s1.Op != OpS390XSLDconst { 29446 break 29447 } 29448 j1 := s1.AuxInt 29449 x1 := s1.Args[0] 29450 if x1.Op != OpS390XMOVBZloadidx { 29451 break 29452 } 29453 i1 := x1.AuxInt 29454 s := x1.Aux 29455 _ = x1.Args[2] 29456 p := x1.Args[0] 29457 idx := x1.Args[1] 29458 mem := x1.Args[2] 29459 or := v.Args[1] 29460 if or.Op != OpS390XOR { 29461 break 29462 } 29463 _ = or.Args[1] 29464 y := or.Args[0] 29465 s0 := or.Args[1] 29466 if s0.Op != OpS390XSLDconst { 29467 break 29468 } 29469 j0 := s0.AuxInt 29470 x0 := s0.Args[0] 29471 if x0.Op != OpS390XMOVBZloadidx { 29472 break 29473 } 29474 i0 := x0.AuxInt 29475 if x0.Aux != s { 29476 break 29477 } 29478 _ = x0.Args[2] 29479 if idx != x0.Args[0] { 29480 break 29481 } 29482 if p != x0.Args[1] { 29483 break 29484 } 29485 if mem != x0.Args[2] { 29486 break 29487 } 29488 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)) { 29489 break 29490 } 29491 b = mergePoint(b, x0, x1) 29492 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29493 v.reset(OpCopy) 29494 v.AddArg(v0) 29495 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29496 v1.AuxInt = j0 29497 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29498 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29499 v3.AuxInt = i0 29500 v3.Aux = s 29501 v3.AddArg(p) 29502 v3.AddArg(idx) 29503 v3.AddArg(mem) 29504 v2.AddArg(v3) 29505 v1.AddArg(v2) 29506 v0.AddArg(v1) 29507 v0.AddArg(y) 29508 return true 29509 } 29510 // 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)))) 29511 // 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) 29512 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29513 for { 29514 _ = v.Args[1] 29515 s1 := v.Args[0] 29516 if s1.Op != OpS390XSLDconst { 29517 break 29518 } 29519 j1 := s1.AuxInt 29520 x1 := s1.Args[0] 29521 if x1.Op != OpS390XMOVBZloadidx { 29522 break 29523 } 29524 i1 := x1.AuxInt 29525 s := x1.Aux 29526 _ = x1.Args[2] 29527 idx := x1.Args[0] 29528 p := x1.Args[1] 29529 mem := x1.Args[2] 29530 or := v.Args[1] 29531 if or.Op != OpS390XOR { 29532 break 29533 } 29534 _ = or.Args[1] 29535 y := or.Args[0] 29536 s0 := or.Args[1] 29537 if s0.Op != OpS390XSLDconst { 29538 break 29539 } 29540 j0 := s0.AuxInt 29541 x0 := s0.Args[0] 29542 if x0.Op != OpS390XMOVBZloadidx { 29543 break 29544 } 29545 i0 := x0.AuxInt 29546 if x0.Aux != s { 29547 break 29548 } 29549 _ = x0.Args[2] 29550 if idx != x0.Args[0] { 29551 break 29552 } 29553 if p != x0.Args[1] { 29554 break 29555 } 29556 if mem != x0.Args[2] { 29557 break 29558 } 29559 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)) { 29560 break 29561 } 29562 b = mergePoint(b, x0, x1) 29563 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29564 v.reset(OpCopy) 29565 v.AddArg(v0) 29566 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29567 v1.AuxInt = j0 29568 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29569 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29570 v3.AuxInt = i0 29571 v3.Aux = s 29572 v3.AddArg(p) 29573 v3.AddArg(idx) 29574 v3.AddArg(mem) 29575 v2.AddArg(v3) 29576 v1.AddArg(v2) 29577 v0.AddArg(v1) 29578 v0.AddArg(y) 29579 return true 29580 } 29581 // 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))) 29582 // 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) 29583 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29584 for { 29585 _ = v.Args[1] 29586 or := v.Args[0] 29587 if or.Op != OpS390XOR { 29588 break 29589 } 29590 _ = or.Args[1] 29591 s0 := or.Args[0] 29592 if s0.Op != OpS390XSLDconst { 29593 break 29594 } 29595 j0 := s0.AuxInt 29596 x0 := s0.Args[0] 29597 if x0.Op != OpS390XMOVBZloadidx { 29598 break 29599 } 29600 i0 := x0.AuxInt 29601 s := x0.Aux 29602 _ = x0.Args[2] 29603 p := x0.Args[0] 29604 idx := x0.Args[1] 29605 mem := x0.Args[2] 29606 y := or.Args[1] 29607 s1 := v.Args[1] 29608 if s1.Op != OpS390XSLDconst { 29609 break 29610 } 29611 j1 := s1.AuxInt 29612 x1 := s1.Args[0] 29613 if x1.Op != OpS390XMOVBZloadidx { 29614 break 29615 } 29616 i1 := x1.AuxInt 29617 if x1.Aux != s { 29618 break 29619 } 29620 _ = x1.Args[2] 29621 if p != x1.Args[0] { 29622 break 29623 } 29624 if idx != x1.Args[1] { 29625 break 29626 } 29627 if mem != x1.Args[2] { 29628 break 29629 } 29630 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)) { 29631 break 29632 } 29633 b = mergePoint(b, x0, x1) 29634 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29635 v.reset(OpCopy) 29636 v.AddArg(v0) 29637 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29638 v1.AuxInt = j0 29639 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29640 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29641 v3.AuxInt = i0 29642 v3.Aux = s 29643 v3.AddArg(p) 29644 v3.AddArg(idx) 29645 v3.AddArg(mem) 29646 v2.AddArg(v3) 29647 v1.AddArg(v2) 29648 v0.AddArg(v1) 29649 v0.AddArg(y) 29650 return true 29651 } 29652 // 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))) 29653 // 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) 29654 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29655 for { 29656 _ = v.Args[1] 29657 or := v.Args[0] 29658 if or.Op != OpS390XOR { 29659 break 29660 } 29661 _ = or.Args[1] 29662 s0 := or.Args[0] 29663 if s0.Op != OpS390XSLDconst { 29664 break 29665 } 29666 j0 := s0.AuxInt 29667 x0 := s0.Args[0] 29668 if x0.Op != OpS390XMOVBZloadidx { 29669 break 29670 } 29671 i0 := x0.AuxInt 29672 s := x0.Aux 29673 _ = x0.Args[2] 29674 idx := x0.Args[0] 29675 p := x0.Args[1] 29676 mem := x0.Args[2] 29677 y := or.Args[1] 29678 s1 := v.Args[1] 29679 if s1.Op != OpS390XSLDconst { 29680 break 29681 } 29682 j1 := s1.AuxInt 29683 x1 := s1.Args[0] 29684 if x1.Op != OpS390XMOVBZloadidx { 29685 break 29686 } 29687 i1 := x1.AuxInt 29688 if x1.Aux != s { 29689 break 29690 } 29691 _ = x1.Args[2] 29692 if p != x1.Args[0] { 29693 break 29694 } 29695 if idx != x1.Args[1] { 29696 break 29697 } 29698 if mem != x1.Args[2] { 29699 break 29700 } 29701 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)) { 29702 break 29703 } 29704 b = mergePoint(b, x0, x1) 29705 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29706 v.reset(OpCopy) 29707 v.AddArg(v0) 29708 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29709 v1.AuxInt = j0 29710 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29711 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29712 v3.AuxInt = i0 29713 v3.Aux = s 29714 v3.AddArg(p) 29715 v3.AddArg(idx) 29716 v3.AddArg(mem) 29717 v2.AddArg(v3) 29718 v1.AddArg(v2) 29719 v0.AddArg(v1) 29720 v0.AddArg(y) 29721 return true 29722 } 29723 // 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))) 29724 // 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) 29725 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29726 for { 29727 _ = v.Args[1] 29728 or := v.Args[0] 29729 if or.Op != OpS390XOR { 29730 break 29731 } 29732 _ = or.Args[1] 29733 y := or.Args[0] 29734 s0 := or.Args[1] 29735 if s0.Op != OpS390XSLDconst { 29736 break 29737 } 29738 j0 := s0.AuxInt 29739 x0 := s0.Args[0] 29740 if x0.Op != OpS390XMOVBZloadidx { 29741 break 29742 } 29743 i0 := x0.AuxInt 29744 s := x0.Aux 29745 _ = x0.Args[2] 29746 p := x0.Args[0] 29747 idx := x0.Args[1] 29748 mem := x0.Args[2] 29749 s1 := v.Args[1] 29750 if s1.Op != OpS390XSLDconst { 29751 break 29752 } 29753 j1 := s1.AuxInt 29754 x1 := s1.Args[0] 29755 if x1.Op != OpS390XMOVBZloadidx { 29756 break 29757 } 29758 i1 := x1.AuxInt 29759 if x1.Aux != s { 29760 break 29761 } 29762 _ = x1.Args[2] 29763 if p != x1.Args[0] { 29764 break 29765 } 29766 if idx != x1.Args[1] { 29767 break 29768 } 29769 if mem != x1.Args[2] { 29770 break 29771 } 29772 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)) { 29773 break 29774 } 29775 b = mergePoint(b, x0, x1) 29776 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29777 v.reset(OpCopy) 29778 v.AddArg(v0) 29779 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29780 v1.AuxInt = j0 29781 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29782 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29783 v3.AuxInt = i0 29784 v3.Aux = s 29785 v3.AddArg(p) 29786 v3.AddArg(idx) 29787 v3.AddArg(mem) 29788 v2.AddArg(v3) 29789 v1.AddArg(v2) 29790 v0.AddArg(v1) 29791 v0.AddArg(y) 29792 return true 29793 } 29794 // 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))) 29795 // 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) 29796 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29797 for { 29798 _ = v.Args[1] 29799 or := v.Args[0] 29800 if or.Op != OpS390XOR { 29801 break 29802 } 29803 _ = or.Args[1] 29804 y := or.Args[0] 29805 s0 := or.Args[1] 29806 if s0.Op != OpS390XSLDconst { 29807 break 29808 } 29809 j0 := s0.AuxInt 29810 x0 := s0.Args[0] 29811 if x0.Op != OpS390XMOVBZloadidx { 29812 break 29813 } 29814 i0 := x0.AuxInt 29815 s := x0.Aux 29816 _ = x0.Args[2] 29817 idx := x0.Args[0] 29818 p := x0.Args[1] 29819 mem := x0.Args[2] 29820 s1 := v.Args[1] 29821 if s1.Op != OpS390XSLDconst { 29822 break 29823 } 29824 j1 := s1.AuxInt 29825 x1 := s1.Args[0] 29826 if x1.Op != OpS390XMOVBZloadidx { 29827 break 29828 } 29829 i1 := x1.AuxInt 29830 if x1.Aux != s { 29831 break 29832 } 29833 _ = x1.Args[2] 29834 if p != x1.Args[0] { 29835 break 29836 } 29837 if idx != x1.Args[1] { 29838 break 29839 } 29840 if mem != x1.Args[2] { 29841 break 29842 } 29843 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)) { 29844 break 29845 } 29846 b = mergePoint(b, x0, x1) 29847 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29848 v.reset(OpCopy) 29849 v.AddArg(v0) 29850 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29851 v1.AuxInt = j0 29852 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29853 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29854 v3.AuxInt = i0 29855 v3.Aux = s 29856 v3.AddArg(p) 29857 v3.AddArg(idx) 29858 v3.AddArg(mem) 29859 v2.AddArg(v3) 29860 v1.AddArg(v2) 29861 v0.AddArg(v1) 29862 v0.AddArg(y) 29863 return true 29864 } 29865 // 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))) 29866 // 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) 29867 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29868 for { 29869 _ = v.Args[1] 29870 or := v.Args[0] 29871 if or.Op != OpS390XOR { 29872 break 29873 } 29874 _ = or.Args[1] 29875 s0 := or.Args[0] 29876 if s0.Op != OpS390XSLDconst { 29877 break 29878 } 29879 j0 := s0.AuxInt 29880 x0 := s0.Args[0] 29881 if x0.Op != OpS390XMOVBZloadidx { 29882 break 29883 } 29884 i0 := x0.AuxInt 29885 s := x0.Aux 29886 _ = x0.Args[2] 29887 p := x0.Args[0] 29888 idx := x0.Args[1] 29889 mem := x0.Args[2] 29890 y := or.Args[1] 29891 s1 := v.Args[1] 29892 if s1.Op != OpS390XSLDconst { 29893 break 29894 } 29895 j1 := s1.AuxInt 29896 x1 := s1.Args[0] 29897 if x1.Op != OpS390XMOVBZloadidx { 29898 break 29899 } 29900 i1 := x1.AuxInt 29901 if x1.Aux != s { 29902 break 29903 } 29904 _ = x1.Args[2] 29905 if idx != x1.Args[0] { 29906 break 29907 } 29908 if p != x1.Args[1] { 29909 break 29910 } 29911 if mem != x1.Args[2] { 29912 break 29913 } 29914 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)) { 29915 break 29916 } 29917 b = mergePoint(b, x0, x1) 29918 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29919 v.reset(OpCopy) 29920 v.AddArg(v0) 29921 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29922 v1.AuxInt = j0 29923 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29924 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29925 v3.AuxInt = i0 29926 v3.Aux = s 29927 v3.AddArg(p) 29928 v3.AddArg(idx) 29929 v3.AddArg(mem) 29930 v2.AddArg(v3) 29931 v1.AddArg(v2) 29932 v0.AddArg(v1) 29933 v0.AddArg(y) 29934 return true 29935 } 29936 // 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))) 29937 // 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) 29938 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 29939 for { 29940 _ = v.Args[1] 29941 or := v.Args[0] 29942 if or.Op != OpS390XOR { 29943 break 29944 } 29945 _ = or.Args[1] 29946 s0 := or.Args[0] 29947 if s0.Op != OpS390XSLDconst { 29948 break 29949 } 29950 j0 := s0.AuxInt 29951 x0 := s0.Args[0] 29952 if x0.Op != OpS390XMOVBZloadidx { 29953 break 29954 } 29955 i0 := x0.AuxInt 29956 s := x0.Aux 29957 _ = x0.Args[2] 29958 idx := x0.Args[0] 29959 p := x0.Args[1] 29960 mem := x0.Args[2] 29961 y := or.Args[1] 29962 s1 := v.Args[1] 29963 if s1.Op != OpS390XSLDconst { 29964 break 29965 } 29966 j1 := s1.AuxInt 29967 x1 := s1.Args[0] 29968 if x1.Op != OpS390XMOVBZloadidx { 29969 break 29970 } 29971 i1 := x1.AuxInt 29972 if x1.Aux != s { 29973 break 29974 } 29975 _ = x1.Args[2] 29976 if idx != x1.Args[0] { 29977 break 29978 } 29979 if p != x1.Args[1] { 29980 break 29981 } 29982 if mem != x1.Args[2] { 29983 break 29984 } 29985 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)) { 29986 break 29987 } 29988 b = mergePoint(b, x0, x1) 29989 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29990 v.reset(OpCopy) 29991 v.AddArg(v0) 29992 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29993 v1.AuxInt = j0 29994 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 29995 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 29996 v3.AuxInt = i0 29997 v3.Aux = s 29998 v3.AddArg(p) 29999 v3.AddArg(idx) 30000 v3.AddArg(mem) 30001 v2.AddArg(v3) 30002 v1.AddArg(v2) 30003 v0.AddArg(v1) 30004 v0.AddArg(y) 30005 return true 30006 } 30007 // 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))) 30008 // 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) 30009 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30010 for { 30011 _ = v.Args[1] 30012 or := v.Args[0] 30013 if or.Op != OpS390XOR { 30014 break 30015 } 30016 _ = or.Args[1] 30017 y := or.Args[0] 30018 s0 := or.Args[1] 30019 if s0.Op != OpS390XSLDconst { 30020 break 30021 } 30022 j0 := s0.AuxInt 30023 x0 := s0.Args[0] 30024 if x0.Op != OpS390XMOVBZloadidx { 30025 break 30026 } 30027 i0 := x0.AuxInt 30028 s := x0.Aux 30029 _ = x0.Args[2] 30030 p := x0.Args[0] 30031 idx := x0.Args[1] 30032 mem := x0.Args[2] 30033 s1 := v.Args[1] 30034 if s1.Op != OpS390XSLDconst { 30035 break 30036 } 30037 j1 := s1.AuxInt 30038 x1 := s1.Args[0] 30039 if x1.Op != OpS390XMOVBZloadidx { 30040 break 30041 } 30042 i1 := x1.AuxInt 30043 if x1.Aux != s { 30044 break 30045 } 30046 _ = x1.Args[2] 30047 if idx != x1.Args[0] { 30048 break 30049 } 30050 if p != x1.Args[1] { 30051 break 30052 } 30053 if mem != x1.Args[2] { 30054 break 30055 } 30056 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)) { 30057 break 30058 } 30059 b = mergePoint(b, x0, x1) 30060 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30061 v.reset(OpCopy) 30062 v.AddArg(v0) 30063 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30064 v1.AuxInt = j0 30065 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30066 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30067 v3.AuxInt = i0 30068 v3.Aux = s 30069 v3.AddArg(p) 30070 v3.AddArg(idx) 30071 v3.AddArg(mem) 30072 v2.AddArg(v3) 30073 v1.AddArg(v2) 30074 v0.AddArg(v1) 30075 v0.AddArg(y) 30076 return true 30077 } 30078 return false 30079 } 30080 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 30081 b := v.Block 30082 _ = b 30083 typ := &b.Func.Config.Types 30084 _ = typ 30085 // 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))) 30086 // 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) 30087 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 30088 for { 30089 _ = v.Args[1] 30090 or := v.Args[0] 30091 if or.Op != OpS390XOR { 30092 break 30093 } 30094 _ = or.Args[1] 30095 y := or.Args[0] 30096 s0 := or.Args[1] 30097 if s0.Op != OpS390XSLDconst { 30098 break 30099 } 30100 j0 := s0.AuxInt 30101 x0 := s0.Args[0] 30102 if x0.Op != OpS390XMOVBZloadidx { 30103 break 30104 } 30105 i0 := x0.AuxInt 30106 s := x0.Aux 30107 _ = x0.Args[2] 30108 idx := x0.Args[0] 30109 p := x0.Args[1] 30110 mem := x0.Args[2] 30111 s1 := v.Args[1] 30112 if s1.Op != OpS390XSLDconst { 30113 break 30114 } 30115 j1 := s1.AuxInt 30116 x1 := s1.Args[0] 30117 if x1.Op != OpS390XMOVBZloadidx { 30118 break 30119 } 30120 i1 := x1.AuxInt 30121 if x1.Aux != s { 30122 break 30123 } 30124 _ = x1.Args[2] 30125 if idx != x1.Args[0] { 30126 break 30127 } 30128 if p != x1.Args[1] { 30129 break 30130 } 30131 if mem != x1.Args[2] { 30132 break 30133 } 30134 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)) { 30135 break 30136 } 30137 b = mergePoint(b, x0, x1) 30138 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30139 v.reset(OpCopy) 30140 v.AddArg(v0) 30141 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30142 v1.AuxInt = j0 30143 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 30144 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 30145 v3.AuxInt = i0 30146 v3.Aux = s 30147 v3.AddArg(p) 30148 v3.AddArg(idx) 30149 v3.AddArg(mem) 30150 v2.AddArg(v3) 30151 v1.AddArg(v2) 30152 v0.AddArg(v1) 30153 v0.AddArg(y) 30154 return true 30155 } 30156 // 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)) 30157 // 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) 30158 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30159 for { 30160 _ = v.Args[1] 30161 s1 := v.Args[0] 30162 if s1.Op != OpS390XSLDconst { 30163 break 30164 } 30165 j1 := s1.AuxInt 30166 r1 := s1.Args[0] 30167 if r1.Op != OpS390XMOVHZreg { 30168 break 30169 } 30170 x1 := r1.Args[0] 30171 if x1.Op != OpS390XMOVHBRloadidx { 30172 break 30173 } 30174 i1 := x1.AuxInt 30175 s := x1.Aux 30176 _ = x1.Args[2] 30177 p := x1.Args[0] 30178 idx := x1.Args[1] 30179 mem := x1.Args[2] 30180 or := v.Args[1] 30181 if or.Op != OpS390XOR { 30182 break 30183 } 30184 _ = or.Args[1] 30185 s0 := or.Args[0] 30186 if s0.Op != OpS390XSLDconst { 30187 break 30188 } 30189 j0 := s0.AuxInt 30190 r0 := s0.Args[0] 30191 if r0.Op != OpS390XMOVHZreg { 30192 break 30193 } 30194 x0 := r0.Args[0] 30195 if x0.Op != OpS390XMOVHBRloadidx { 30196 break 30197 } 30198 i0 := x0.AuxInt 30199 if x0.Aux != s { 30200 break 30201 } 30202 _ = x0.Args[2] 30203 if p != x0.Args[0] { 30204 break 30205 } 30206 if idx != x0.Args[1] { 30207 break 30208 } 30209 if mem != x0.Args[2] { 30210 break 30211 } 30212 y := or.Args[1] 30213 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)) { 30214 break 30215 } 30216 b = mergePoint(b, x0, x1) 30217 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30218 v.reset(OpCopy) 30219 v.AddArg(v0) 30220 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30221 v1.AuxInt = j0 30222 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30223 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30224 v3.AuxInt = i0 30225 v3.Aux = s 30226 v3.AddArg(p) 30227 v3.AddArg(idx) 30228 v3.AddArg(mem) 30229 v2.AddArg(v3) 30230 v1.AddArg(v2) 30231 v0.AddArg(v1) 30232 v0.AddArg(y) 30233 return true 30234 } 30235 // 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)) 30236 // 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) 30237 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30238 for { 30239 _ = v.Args[1] 30240 s1 := v.Args[0] 30241 if s1.Op != OpS390XSLDconst { 30242 break 30243 } 30244 j1 := s1.AuxInt 30245 r1 := s1.Args[0] 30246 if r1.Op != OpS390XMOVHZreg { 30247 break 30248 } 30249 x1 := r1.Args[0] 30250 if x1.Op != OpS390XMOVHBRloadidx { 30251 break 30252 } 30253 i1 := x1.AuxInt 30254 s := x1.Aux 30255 _ = x1.Args[2] 30256 idx := x1.Args[0] 30257 p := x1.Args[1] 30258 mem := x1.Args[2] 30259 or := v.Args[1] 30260 if or.Op != OpS390XOR { 30261 break 30262 } 30263 _ = or.Args[1] 30264 s0 := or.Args[0] 30265 if s0.Op != OpS390XSLDconst { 30266 break 30267 } 30268 j0 := s0.AuxInt 30269 r0 := s0.Args[0] 30270 if r0.Op != OpS390XMOVHZreg { 30271 break 30272 } 30273 x0 := r0.Args[0] 30274 if x0.Op != OpS390XMOVHBRloadidx { 30275 break 30276 } 30277 i0 := x0.AuxInt 30278 if x0.Aux != s { 30279 break 30280 } 30281 _ = x0.Args[2] 30282 if p != x0.Args[0] { 30283 break 30284 } 30285 if idx != x0.Args[1] { 30286 break 30287 } 30288 if mem != x0.Args[2] { 30289 break 30290 } 30291 y := or.Args[1] 30292 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)) { 30293 break 30294 } 30295 b = mergePoint(b, x0, x1) 30296 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30297 v.reset(OpCopy) 30298 v.AddArg(v0) 30299 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30300 v1.AuxInt = j0 30301 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30302 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30303 v3.AuxInt = i0 30304 v3.Aux = s 30305 v3.AddArg(p) 30306 v3.AddArg(idx) 30307 v3.AddArg(mem) 30308 v2.AddArg(v3) 30309 v1.AddArg(v2) 30310 v0.AddArg(v1) 30311 v0.AddArg(y) 30312 return true 30313 } 30314 // 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)) 30315 // 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) 30316 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30317 for { 30318 _ = v.Args[1] 30319 s1 := v.Args[0] 30320 if s1.Op != OpS390XSLDconst { 30321 break 30322 } 30323 j1 := s1.AuxInt 30324 r1 := s1.Args[0] 30325 if r1.Op != OpS390XMOVHZreg { 30326 break 30327 } 30328 x1 := r1.Args[0] 30329 if x1.Op != OpS390XMOVHBRloadidx { 30330 break 30331 } 30332 i1 := x1.AuxInt 30333 s := x1.Aux 30334 _ = x1.Args[2] 30335 p := x1.Args[0] 30336 idx := x1.Args[1] 30337 mem := x1.Args[2] 30338 or := v.Args[1] 30339 if or.Op != OpS390XOR { 30340 break 30341 } 30342 _ = or.Args[1] 30343 s0 := or.Args[0] 30344 if s0.Op != OpS390XSLDconst { 30345 break 30346 } 30347 j0 := s0.AuxInt 30348 r0 := s0.Args[0] 30349 if r0.Op != OpS390XMOVHZreg { 30350 break 30351 } 30352 x0 := r0.Args[0] 30353 if x0.Op != OpS390XMOVHBRloadidx { 30354 break 30355 } 30356 i0 := x0.AuxInt 30357 if x0.Aux != s { 30358 break 30359 } 30360 _ = x0.Args[2] 30361 if idx != x0.Args[0] { 30362 break 30363 } 30364 if p != x0.Args[1] { 30365 break 30366 } 30367 if mem != x0.Args[2] { 30368 break 30369 } 30370 y := or.Args[1] 30371 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)) { 30372 break 30373 } 30374 b = mergePoint(b, x0, x1) 30375 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30376 v.reset(OpCopy) 30377 v.AddArg(v0) 30378 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30379 v1.AuxInt = j0 30380 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30381 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30382 v3.AuxInt = i0 30383 v3.Aux = s 30384 v3.AddArg(p) 30385 v3.AddArg(idx) 30386 v3.AddArg(mem) 30387 v2.AddArg(v3) 30388 v1.AddArg(v2) 30389 v0.AddArg(v1) 30390 v0.AddArg(y) 30391 return true 30392 } 30393 // 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)) 30394 // 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) 30395 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30396 for { 30397 _ = v.Args[1] 30398 s1 := v.Args[0] 30399 if s1.Op != OpS390XSLDconst { 30400 break 30401 } 30402 j1 := s1.AuxInt 30403 r1 := s1.Args[0] 30404 if r1.Op != OpS390XMOVHZreg { 30405 break 30406 } 30407 x1 := r1.Args[0] 30408 if x1.Op != OpS390XMOVHBRloadidx { 30409 break 30410 } 30411 i1 := x1.AuxInt 30412 s := x1.Aux 30413 _ = x1.Args[2] 30414 idx := x1.Args[0] 30415 p := x1.Args[1] 30416 mem := x1.Args[2] 30417 or := v.Args[1] 30418 if or.Op != OpS390XOR { 30419 break 30420 } 30421 _ = or.Args[1] 30422 s0 := or.Args[0] 30423 if s0.Op != OpS390XSLDconst { 30424 break 30425 } 30426 j0 := s0.AuxInt 30427 r0 := s0.Args[0] 30428 if r0.Op != OpS390XMOVHZreg { 30429 break 30430 } 30431 x0 := r0.Args[0] 30432 if x0.Op != OpS390XMOVHBRloadidx { 30433 break 30434 } 30435 i0 := x0.AuxInt 30436 if x0.Aux != s { 30437 break 30438 } 30439 _ = x0.Args[2] 30440 if idx != x0.Args[0] { 30441 break 30442 } 30443 if p != x0.Args[1] { 30444 break 30445 } 30446 if mem != x0.Args[2] { 30447 break 30448 } 30449 y := or.Args[1] 30450 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)) { 30451 break 30452 } 30453 b = mergePoint(b, x0, x1) 30454 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30455 v.reset(OpCopy) 30456 v.AddArg(v0) 30457 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30458 v1.AuxInt = j0 30459 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30460 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30461 v3.AuxInt = i0 30462 v3.Aux = s 30463 v3.AddArg(p) 30464 v3.AddArg(idx) 30465 v3.AddArg(mem) 30466 v2.AddArg(v3) 30467 v1.AddArg(v2) 30468 v0.AddArg(v1) 30469 v0.AddArg(y) 30470 return true 30471 } 30472 // 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))))) 30473 // 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) 30474 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30475 for { 30476 _ = v.Args[1] 30477 s1 := v.Args[0] 30478 if s1.Op != OpS390XSLDconst { 30479 break 30480 } 30481 j1 := s1.AuxInt 30482 r1 := s1.Args[0] 30483 if r1.Op != OpS390XMOVHZreg { 30484 break 30485 } 30486 x1 := r1.Args[0] 30487 if x1.Op != OpS390XMOVHBRloadidx { 30488 break 30489 } 30490 i1 := x1.AuxInt 30491 s := x1.Aux 30492 _ = x1.Args[2] 30493 p := x1.Args[0] 30494 idx := x1.Args[1] 30495 mem := x1.Args[2] 30496 or := v.Args[1] 30497 if or.Op != OpS390XOR { 30498 break 30499 } 30500 _ = or.Args[1] 30501 y := or.Args[0] 30502 s0 := or.Args[1] 30503 if s0.Op != OpS390XSLDconst { 30504 break 30505 } 30506 j0 := s0.AuxInt 30507 r0 := s0.Args[0] 30508 if r0.Op != OpS390XMOVHZreg { 30509 break 30510 } 30511 x0 := r0.Args[0] 30512 if x0.Op != OpS390XMOVHBRloadidx { 30513 break 30514 } 30515 i0 := x0.AuxInt 30516 if x0.Aux != s { 30517 break 30518 } 30519 _ = x0.Args[2] 30520 if p != x0.Args[0] { 30521 break 30522 } 30523 if idx != x0.Args[1] { 30524 break 30525 } 30526 if mem != x0.Args[2] { 30527 break 30528 } 30529 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)) { 30530 break 30531 } 30532 b = mergePoint(b, x0, x1) 30533 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30534 v.reset(OpCopy) 30535 v.AddArg(v0) 30536 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30537 v1.AuxInt = j0 30538 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30539 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30540 v3.AuxInt = i0 30541 v3.Aux = s 30542 v3.AddArg(p) 30543 v3.AddArg(idx) 30544 v3.AddArg(mem) 30545 v2.AddArg(v3) 30546 v1.AddArg(v2) 30547 v0.AddArg(v1) 30548 v0.AddArg(y) 30549 return true 30550 } 30551 // 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))))) 30552 // 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) 30553 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30554 for { 30555 _ = v.Args[1] 30556 s1 := v.Args[0] 30557 if s1.Op != OpS390XSLDconst { 30558 break 30559 } 30560 j1 := s1.AuxInt 30561 r1 := s1.Args[0] 30562 if r1.Op != OpS390XMOVHZreg { 30563 break 30564 } 30565 x1 := r1.Args[0] 30566 if x1.Op != OpS390XMOVHBRloadidx { 30567 break 30568 } 30569 i1 := x1.AuxInt 30570 s := x1.Aux 30571 _ = x1.Args[2] 30572 idx := x1.Args[0] 30573 p := x1.Args[1] 30574 mem := x1.Args[2] 30575 or := v.Args[1] 30576 if or.Op != OpS390XOR { 30577 break 30578 } 30579 _ = or.Args[1] 30580 y := or.Args[0] 30581 s0 := or.Args[1] 30582 if s0.Op != OpS390XSLDconst { 30583 break 30584 } 30585 j0 := s0.AuxInt 30586 r0 := s0.Args[0] 30587 if r0.Op != OpS390XMOVHZreg { 30588 break 30589 } 30590 x0 := r0.Args[0] 30591 if x0.Op != OpS390XMOVHBRloadidx { 30592 break 30593 } 30594 i0 := x0.AuxInt 30595 if x0.Aux != s { 30596 break 30597 } 30598 _ = x0.Args[2] 30599 if p != x0.Args[0] { 30600 break 30601 } 30602 if idx != x0.Args[1] { 30603 break 30604 } 30605 if mem != x0.Args[2] { 30606 break 30607 } 30608 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)) { 30609 break 30610 } 30611 b = mergePoint(b, x0, x1) 30612 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30613 v.reset(OpCopy) 30614 v.AddArg(v0) 30615 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30616 v1.AuxInt = j0 30617 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30618 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30619 v3.AuxInt = i0 30620 v3.Aux = s 30621 v3.AddArg(p) 30622 v3.AddArg(idx) 30623 v3.AddArg(mem) 30624 v2.AddArg(v3) 30625 v1.AddArg(v2) 30626 v0.AddArg(v1) 30627 v0.AddArg(y) 30628 return true 30629 } 30630 // 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))))) 30631 // 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) 30632 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30633 for { 30634 _ = v.Args[1] 30635 s1 := v.Args[0] 30636 if s1.Op != OpS390XSLDconst { 30637 break 30638 } 30639 j1 := s1.AuxInt 30640 r1 := s1.Args[0] 30641 if r1.Op != OpS390XMOVHZreg { 30642 break 30643 } 30644 x1 := r1.Args[0] 30645 if x1.Op != OpS390XMOVHBRloadidx { 30646 break 30647 } 30648 i1 := x1.AuxInt 30649 s := x1.Aux 30650 _ = x1.Args[2] 30651 p := x1.Args[0] 30652 idx := x1.Args[1] 30653 mem := x1.Args[2] 30654 or := v.Args[1] 30655 if or.Op != OpS390XOR { 30656 break 30657 } 30658 _ = or.Args[1] 30659 y := or.Args[0] 30660 s0 := or.Args[1] 30661 if s0.Op != OpS390XSLDconst { 30662 break 30663 } 30664 j0 := s0.AuxInt 30665 r0 := s0.Args[0] 30666 if r0.Op != OpS390XMOVHZreg { 30667 break 30668 } 30669 x0 := r0.Args[0] 30670 if x0.Op != OpS390XMOVHBRloadidx { 30671 break 30672 } 30673 i0 := x0.AuxInt 30674 if x0.Aux != s { 30675 break 30676 } 30677 _ = x0.Args[2] 30678 if idx != x0.Args[0] { 30679 break 30680 } 30681 if p != x0.Args[1] { 30682 break 30683 } 30684 if mem != x0.Args[2] { 30685 break 30686 } 30687 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)) { 30688 break 30689 } 30690 b = mergePoint(b, x0, x1) 30691 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30692 v.reset(OpCopy) 30693 v.AddArg(v0) 30694 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30695 v1.AuxInt = j0 30696 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30697 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30698 v3.AuxInt = i0 30699 v3.Aux = s 30700 v3.AddArg(p) 30701 v3.AddArg(idx) 30702 v3.AddArg(mem) 30703 v2.AddArg(v3) 30704 v1.AddArg(v2) 30705 v0.AddArg(v1) 30706 v0.AddArg(y) 30707 return true 30708 } 30709 // 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))))) 30710 // 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) 30711 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30712 for { 30713 _ = v.Args[1] 30714 s1 := v.Args[0] 30715 if s1.Op != OpS390XSLDconst { 30716 break 30717 } 30718 j1 := s1.AuxInt 30719 r1 := s1.Args[0] 30720 if r1.Op != OpS390XMOVHZreg { 30721 break 30722 } 30723 x1 := r1.Args[0] 30724 if x1.Op != OpS390XMOVHBRloadidx { 30725 break 30726 } 30727 i1 := x1.AuxInt 30728 s := x1.Aux 30729 _ = x1.Args[2] 30730 idx := x1.Args[0] 30731 p := x1.Args[1] 30732 mem := x1.Args[2] 30733 or := v.Args[1] 30734 if or.Op != OpS390XOR { 30735 break 30736 } 30737 _ = or.Args[1] 30738 y := or.Args[0] 30739 s0 := or.Args[1] 30740 if s0.Op != OpS390XSLDconst { 30741 break 30742 } 30743 j0 := s0.AuxInt 30744 r0 := s0.Args[0] 30745 if r0.Op != OpS390XMOVHZreg { 30746 break 30747 } 30748 x0 := r0.Args[0] 30749 if x0.Op != OpS390XMOVHBRloadidx { 30750 break 30751 } 30752 i0 := x0.AuxInt 30753 if x0.Aux != s { 30754 break 30755 } 30756 _ = x0.Args[2] 30757 if idx != x0.Args[0] { 30758 break 30759 } 30760 if p != x0.Args[1] { 30761 break 30762 } 30763 if mem != x0.Args[2] { 30764 break 30765 } 30766 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)) { 30767 break 30768 } 30769 b = mergePoint(b, x0, x1) 30770 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30771 v.reset(OpCopy) 30772 v.AddArg(v0) 30773 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30774 v1.AuxInt = j0 30775 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30776 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30777 v3.AuxInt = i0 30778 v3.Aux = s 30779 v3.AddArg(p) 30780 v3.AddArg(idx) 30781 v3.AddArg(mem) 30782 v2.AddArg(v3) 30783 v1.AddArg(v2) 30784 v0.AddArg(v1) 30785 v0.AddArg(y) 30786 return true 30787 } 30788 // 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)))) 30789 // 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) 30790 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30791 for { 30792 _ = v.Args[1] 30793 or := v.Args[0] 30794 if or.Op != OpS390XOR { 30795 break 30796 } 30797 _ = or.Args[1] 30798 s0 := or.Args[0] 30799 if s0.Op != OpS390XSLDconst { 30800 break 30801 } 30802 j0 := s0.AuxInt 30803 r0 := s0.Args[0] 30804 if r0.Op != OpS390XMOVHZreg { 30805 break 30806 } 30807 x0 := r0.Args[0] 30808 if x0.Op != OpS390XMOVHBRloadidx { 30809 break 30810 } 30811 i0 := x0.AuxInt 30812 s := x0.Aux 30813 _ = x0.Args[2] 30814 p := x0.Args[0] 30815 idx := x0.Args[1] 30816 mem := x0.Args[2] 30817 y := or.Args[1] 30818 s1 := v.Args[1] 30819 if s1.Op != OpS390XSLDconst { 30820 break 30821 } 30822 j1 := s1.AuxInt 30823 r1 := s1.Args[0] 30824 if r1.Op != OpS390XMOVHZreg { 30825 break 30826 } 30827 x1 := r1.Args[0] 30828 if x1.Op != OpS390XMOVHBRloadidx { 30829 break 30830 } 30831 i1 := x1.AuxInt 30832 if x1.Aux != s { 30833 break 30834 } 30835 _ = x1.Args[2] 30836 if p != x1.Args[0] { 30837 break 30838 } 30839 if idx != x1.Args[1] { 30840 break 30841 } 30842 if mem != x1.Args[2] { 30843 break 30844 } 30845 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)) { 30846 break 30847 } 30848 b = mergePoint(b, x0, x1) 30849 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30850 v.reset(OpCopy) 30851 v.AddArg(v0) 30852 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30853 v1.AuxInt = j0 30854 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30855 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30856 v3.AuxInt = i0 30857 v3.Aux = s 30858 v3.AddArg(p) 30859 v3.AddArg(idx) 30860 v3.AddArg(mem) 30861 v2.AddArg(v3) 30862 v1.AddArg(v2) 30863 v0.AddArg(v1) 30864 v0.AddArg(y) 30865 return true 30866 } 30867 return false 30868 } 30869 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 30870 b := v.Block 30871 _ = b 30872 typ := &b.Func.Config.Types 30873 _ = typ 30874 // 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)))) 30875 // 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) 30876 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30877 for { 30878 _ = v.Args[1] 30879 or := v.Args[0] 30880 if or.Op != OpS390XOR { 30881 break 30882 } 30883 _ = or.Args[1] 30884 s0 := or.Args[0] 30885 if s0.Op != OpS390XSLDconst { 30886 break 30887 } 30888 j0 := s0.AuxInt 30889 r0 := s0.Args[0] 30890 if r0.Op != OpS390XMOVHZreg { 30891 break 30892 } 30893 x0 := r0.Args[0] 30894 if x0.Op != OpS390XMOVHBRloadidx { 30895 break 30896 } 30897 i0 := x0.AuxInt 30898 s := x0.Aux 30899 _ = x0.Args[2] 30900 idx := x0.Args[0] 30901 p := x0.Args[1] 30902 mem := x0.Args[2] 30903 y := or.Args[1] 30904 s1 := v.Args[1] 30905 if s1.Op != OpS390XSLDconst { 30906 break 30907 } 30908 j1 := s1.AuxInt 30909 r1 := s1.Args[0] 30910 if r1.Op != OpS390XMOVHZreg { 30911 break 30912 } 30913 x1 := r1.Args[0] 30914 if x1.Op != OpS390XMOVHBRloadidx { 30915 break 30916 } 30917 i1 := x1.AuxInt 30918 if x1.Aux != s { 30919 break 30920 } 30921 _ = x1.Args[2] 30922 if p != x1.Args[0] { 30923 break 30924 } 30925 if idx != x1.Args[1] { 30926 break 30927 } 30928 if mem != x1.Args[2] { 30929 break 30930 } 30931 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)) { 30932 break 30933 } 30934 b = mergePoint(b, x0, x1) 30935 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 30936 v.reset(OpCopy) 30937 v.AddArg(v0) 30938 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 30939 v1.AuxInt = j0 30940 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 30941 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 30942 v3.AuxInt = i0 30943 v3.Aux = s 30944 v3.AddArg(p) 30945 v3.AddArg(idx) 30946 v3.AddArg(mem) 30947 v2.AddArg(v3) 30948 v1.AddArg(v2) 30949 v0.AddArg(v1) 30950 v0.AddArg(y) 30951 return true 30952 } 30953 // 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)))) 30954 // 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) 30955 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 30956 for { 30957 _ = v.Args[1] 30958 or := v.Args[0] 30959 if or.Op != OpS390XOR { 30960 break 30961 } 30962 _ = or.Args[1] 30963 y := or.Args[0] 30964 s0 := or.Args[1] 30965 if s0.Op != OpS390XSLDconst { 30966 break 30967 } 30968 j0 := s0.AuxInt 30969 r0 := s0.Args[0] 30970 if r0.Op != OpS390XMOVHZreg { 30971 break 30972 } 30973 x0 := r0.Args[0] 30974 if x0.Op != OpS390XMOVHBRloadidx { 30975 break 30976 } 30977 i0 := x0.AuxInt 30978 s := x0.Aux 30979 _ = x0.Args[2] 30980 p := x0.Args[0] 30981 idx := x0.Args[1] 30982 mem := x0.Args[2] 30983 s1 := v.Args[1] 30984 if s1.Op != OpS390XSLDconst { 30985 break 30986 } 30987 j1 := s1.AuxInt 30988 r1 := s1.Args[0] 30989 if r1.Op != OpS390XMOVHZreg { 30990 break 30991 } 30992 x1 := r1.Args[0] 30993 if x1.Op != OpS390XMOVHBRloadidx { 30994 break 30995 } 30996 i1 := x1.AuxInt 30997 if x1.Aux != s { 30998 break 30999 } 31000 _ = x1.Args[2] 31001 if p != x1.Args[0] { 31002 break 31003 } 31004 if idx != x1.Args[1] { 31005 break 31006 } 31007 if mem != x1.Args[2] { 31008 break 31009 } 31010 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)) { 31011 break 31012 } 31013 b = mergePoint(b, x0, x1) 31014 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31015 v.reset(OpCopy) 31016 v.AddArg(v0) 31017 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31018 v1.AuxInt = j0 31019 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31020 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31021 v3.AuxInt = i0 31022 v3.Aux = s 31023 v3.AddArg(p) 31024 v3.AddArg(idx) 31025 v3.AddArg(mem) 31026 v2.AddArg(v3) 31027 v1.AddArg(v2) 31028 v0.AddArg(v1) 31029 v0.AddArg(y) 31030 return true 31031 } 31032 // 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)))) 31033 // 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) 31034 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31035 for { 31036 _ = v.Args[1] 31037 or := v.Args[0] 31038 if or.Op != OpS390XOR { 31039 break 31040 } 31041 _ = or.Args[1] 31042 y := or.Args[0] 31043 s0 := or.Args[1] 31044 if s0.Op != OpS390XSLDconst { 31045 break 31046 } 31047 j0 := s0.AuxInt 31048 r0 := s0.Args[0] 31049 if r0.Op != OpS390XMOVHZreg { 31050 break 31051 } 31052 x0 := r0.Args[0] 31053 if x0.Op != OpS390XMOVHBRloadidx { 31054 break 31055 } 31056 i0 := x0.AuxInt 31057 s := x0.Aux 31058 _ = x0.Args[2] 31059 idx := x0.Args[0] 31060 p := x0.Args[1] 31061 mem := x0.Args[2] 31062 s1 := v.Args[1] 31063 if s1.Op != OpS390XSLDconst { 31064 break 31065 } 31066 j1 := s1.AuxInt 31067 r1 := s1.Args[0] 31068 if r1.Op != OpS390XMOVHZreg { 31069 break 31070 } 31071 x1 := r1.Args[0] 31072 if x1.Op != OpS390XMOVHBRloadidx { 31073 break 31074 } 31075 i1 := x1.AuxInt 31076 if x1.Aux != s { 31077 break 31078 } 31079 _ = x1.Args[2] 31080 if p != x1.Args[0] { 31081 break 31082 } 31083 if idx != x1.Args[1] { 31084 break 31085 } 31086 if mem != x1.Args[2] { 31087 break 31088 } 31089 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)) { 31090 break 31091 } 31092 b = mergePoint(b, x0, x1) 31093 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31094 v.reset(OpCopy) 31095 v.AddArg(v0) 31096 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31097 v1.AuxInt = j0 31098 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31099 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31100 v3.AuxInt = i0 31101 v3.Aux = s 31102 v3.AddArg(p) 31103 v3.AddArg(idx) 31104 v3.AddArg(mem) 31105 v2.AddArg(v3) 31106 v1.AddArg(v2) 31107 v0.AddArg(v1) 31108 v0.AddArg(y) 31109 return true 31110 } 31111 // 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)))) 31112 // 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) 31113 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31114 for { 31115 _ = v.Args[1] 31116 or := v.Args[0] 31117 if or.Op != OpS390XOR { 31118 break 31119 } 31120 _ = or.Args[1] 31121 s0 := or.Args[0] 31122 if s0.Op != OpS390XSLDconst { 31123 break 31124 } 31125 j0 := s0.AuxInt 31126 r0 := s0.Args[0] 31127 if r0.Op != OpS390XMOVHZreg { 31128 break 31129 } 31130 x0 := r0.Args[0] 31131 if x0.Op != OpS390XMOVHBRloadidx { 31132 break 31133 } 31134 i0 := x0.AuxInt 31135 s := x0.Aux 31136 _ = x0.Args[2] 31137 p := x0.Args[0] 31138 idx := x0.Args[1] 31139 mem := x0.Args[2] 31140 y := or.Args[1] 31141 s1 := v.Args[1] 31142 if s1.Op != OpS390XSLDconst { 31143 break 31144 } 31145 j1 := s1.AuxInt 31146 r1 := s1.Args[0] 31147 if r1.Op != OpS390XMOVHZreg { 31148 break 31149 } 31150 x1 := r1.Args[0] 31151 if x1.Op != OpS390XMOVHBRloadidx { 31152 break 31153 } 31154 i1 := x1.AuxInt 31155 if x1.Aux != s { 31156 break 31157 } 31158 _ = x1.Args[2] 31159 if idx != x1.Args[0] { 31160 break 31161 } 31162 if p != x1.Args[1] { 31163 break 31164 } 31165 if mem != x1.Args[2] { 31166 break 31167 } 31168 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)) { 31169 break 31170 } 31171 b = mergePoint(b, x0, x1) 31172 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31173 v.reset(OpCopy) 31174 v.AddArg(v0) 31175 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31176 v1.AuxInt = j0 31177 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31178 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31179 v3.AuxInt = i0 31180 v3.Aux = s 31181 v3.AddArg(p) 31182 v3.AddArg(idx) 31183 v3.AddArg(mem) 31184 v2.AddArg(v3) 31185 v1.AddArg(v2) 31186 v0.AddArg(v1) 31187 v0.AddArg(y) 31188 return true 31189 } 31190 // 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)))) 31191 // 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) 31192 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31193 for { 31194 _ = v.Args[1] 31195 or := v.Args[0] 31196 if or.Op != OpS390XOR { 31197 break 31198 } 31199 _ = or.Args[1] 31200 s0 := or.Args[0] 31201 if s0.Op != OpS390XSLDconst { 31202 break 31203 } 31204 j0 := s0.AuxInt 31205 r0 := s0.Args[0] 31206 if r0.Op != OpS390XMOVHZreg { 31207 break 31208 } 31209 x0 := r0.Args[0] 31210 if x0.Op != OpS390XMOVHBRloadidx { 31211 break 31212 } 31213 i0 := x0.AuxInt 31214 s := x0.Aux 31215 _ = x0.Args[2] 31216 idx := x0.Args[0] 31217 p := x0.Args[1] 31218 mem := x0.Args[2] 31219 y := or.Args[1] 31220 s1 := v.Args[1] 31221 if s1.Op != OpS390XSLDconst { 31222 break 31223 } 31224 j1 := s1.AuxInt 31225 r1 := s1.Args[0] 31226 if r1.Op != OpS390XMOVHZreg { 31227 break 31228 } 31229 x1 := r1.Args[0] 31230 if x1.Op != OpS390XMOVHBRloadidx { 31231 break 31232 } 31233 i1 := x1.AuxInt 31234 if x1.Aux != s { 31235 break 31236 } 31237 _ = x1.Args[2] 31238 if idx != x1.Args[0] { 31239 break 31240 } 31241 if p != x1.Args[1] { 31242 break 31243 } 31244 if mem != x1.Args[2] { 31245 break 31246 } 31247 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)) { 31248 break 31249 } 31250 b = mergePoint(b, x0, x1) 31251 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31252 v.reset(OpCopy) 31253 v.AddArg(v0) 31254 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31255 v1.AuxInt = j0 31256 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31257 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31258 v3.AuxInt = i0 31259 v3.Aux = s 31260 v3.AddArg(p) 31261 v3.AddArg(idx) 31262 v3.AddArg(mem) 31263 v2.AddArg(v3) 31264 v1.AddArg(v2) 31265 v0.AddArg(v1) 31266 v0.AddArg(y) 31267 return true 31268 } 31269 // 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)))) 31270 // 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) 31271 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31272 for { 31273 _ = v.Args[1] 31274 or := v.Args[0] 31275 if or.Op != OpS390XOR { 31276 break 31277 } 31278 _ = or.Args[1] 31279 y := or.Args[0] 31280 s0 := or.Args[1] 31281 if s0.Op != OpS390XSLDconst { 31282 break 31283 } 31284 j0 := s0.AuxInt 31285 r0 := s0.Args[0] 31286 if r0.Op != OpS390XMOVHZreg { 31287 break 31288 } 31289 x0 := r0.Args[0] 31290 if x0.Op != OpS390XMOVHBRloadidx { 31291 break 31292 } 31293 i0 := x0.AuxInt 31294 s := x0.Aux 31295 _ = x0.Args[2] 31296 p := x0.Args[0] 31297 idx := x0.Args[1] 31298 mem := x0.Args[2] 31299 s1 := v.Args[1] 31300 if s1.Op != OpS390XSLDconst { 31301 break 31302 } 31303 j1 := s1.AuxInt 31304 r1 := s1.Args[0] 31305 if r1.Op != OpS390XMOVHZreg { 31306 break 31307 } 31308 x1 := r1.Args[0] 31309 if x1.Op != OpS390XMOVHBRloadidx { 31310 break 31311 } 31312 i1 := x1.AuxInt 31313 if x1.Aux != s { 31314 break 31315 } 31316 _ = x1.Args[2] 31317 if idx != x1.Args[0] { 31318 break 31319 } 31320 if p != x1.Args[1] { 31321 break 31322 } 31323 if mem != x1.Args[2] { 31324 break 31325 } 31326 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)) { 31327 break 31328 } 31329 b = mergePoint(b, x0, x1) 31330 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31331 v.reset(OpCopy) 31332 v.AddArg(v0) 31333 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31334 v1.AuxInt = j0 31335 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31336 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31337 v3.AuxInt = i0 31338 v3.Aux = s 31339 v3.AddArg(p) 31340 v3.AddArg(idx) 31341 v3.AddArg(mem) 31342 v2.AddArg(v3) 31343 v1.AddArg(v2) 31344 v0.AddArg(v1) 31345 v0.AddArg(y) 31346 return true 31347 } 31348 // 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)))) 31349 // 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) 31350 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 31351 for { 31352 _ = v.Args[1] 31353 or := v.Args[0] 31354 if or.Op != OpS390XOR { 31355 break 31356 } 31357 _ = or.Args[1] 31358 y := or.Args[0] 31359 s0 := or.Args[1] 31360 if s0.Op != OpS390XSLDconst { 31361 break 31362 } 31363 j0 := s0.AuxInt 31364 r0 := s0.Args[0] 31365 if r0.Op != OpS390XMOVHZreg { 31366 break 31367 } 31368 x0 := r0.Args[0] 31369 if x0.Op != OpS390XMOVHBRloadidx { 31370 break 31371 } 31372 i0 := x0.AuxInt 31373 s := x0.Aux 31374 _ = x0.Args[2] 31375 idx := x0.Args[0] 31376 p := x0.Args[1] 31377 mem := x0.Args[2] 31378 s1 := v.Args[1] 31379 if s1.Op != OpS390XSLDconst { 31380 break 31381 } 31382 j1 := s1.AuxInt 31383 r1 := s1.Args[0] 31384 if r1.Op != OpS390XMOVHZreg { 31385 break 31386 } 31387 x1 := r1.Args[0] 31388 if x1.Op != OpS390XMOVHBRloadidx { 31389 break 31390 } 31391 i1 := x1.AuxInt 31392 if x1.Aux != s { 31393 break 31394 } 31395 _ = x1.Args[2] 31396 if idx != x1.Args[0] { 31397 break 31398 } 31399 if p != x1.Args[1] { 31400 break 31401 } 31402 if mem != x1.Args[2] { 31403 break 31404 } 31405 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)) { 31406 break 31407 } 31408 b = mergePoint(b, x0, x1) 31409 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 31410 v.reset(OpCopy) 31411 v.AddArg(v0) 31412 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 31413 v1.AuxInt = j0 31414 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 31415 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 31416 v3.AuxInt = i0 31417 v3.Aux = s 31418 v3.AddArg(p) 31419 v3.AddArg(idx) 31420 v3.AddArg(mem) 31421 v2.AddArg(v3) 31422 v1.AddArg(v2) 31423 v0.AddArg(v1) 31424 v0.AddArg(y) 31425 return true 31426 } 31427 return false 31428 } 31429 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 31430 // match: (ORW x (MOVDconst [c])) 31431 // cond: 31432 // result: (ORWconst [int64(int32(c))] x) 31433 for { 31434 _ = v.Args[1] 31435 x := v.Args[0] 31436 v_1 := v.Args[1] 31437 if v_1.Op != OpS390XMOVDconst { 31438 break 31439 } 31440 c := v_1.AuxInt 31441 v.reset(OpS390XORWconst) 31442 v.AuxInt = int64(int32(c)) 31443 v.AddArg(x) 31444 return true 31445 } 31446 // match: (ORW (MOVDconst [c]) x) 31447 // cond: 31448 // result: (ORWconst [int64(int32(c))] x) 31449 for { 31450 _ = v.Args[1] 31451 v_0 := v.Args[0] 31452 if v_0.Op != OpS390XMOVDconst { 31453 break 31454 } 31455 c := v_0.AuxInt 31456 x := v.Args[1] 31457 v.reset(OpS390XORWconst) 31458 v.AuxInt = int64(int32(c)) 31459 v.AddArg(x) 31460 return true 31461 } 31462 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 31463 // cond: d == 32-c 31464 // result: (RLLconst [c] x) 31465 for { 31466 _ = v.Args[1] 31467 v_0 := v.Args[0] 31468 if v_0.Op != OpS390XSLWconst { 31469 break 31470 } 31471 c := v_0.AuxInt 31472 x := v_0.Args[0] 31473 v_1 := v.Args[1] 31474 if v_1.Op != OpS390XSRWconst { 31475 break 31476 } 31477 d := v_1.AuxInt 31478 if x != v_1.Args[0] { 31479 break 31480 } 31481 if !(d == 32-c) { 31482 break 31483 } 31484 v.reset(OpS390XRLLconst) 31485 v.AuxInt = c 31486 v.AddArg(x) 31487 return true 31488 } 31489 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 31490 // cond: d == 32-c 31491 // result: (RLLconst [c] x) 31492 for { 31493 _ = v.Args[1] 31494 v_0 := v.Args[0] 31495 if v_0.Op != OpS390XSRWconst { 31496 break 31497 } 31498 d := v_0.AuxInt 31499 x := v_0.Args[0] 31500 v_1 := v.Args[1] 31501 if v_1.Op != OpS390XSLWconst { 31502 break 31503 } 31504 c := v_1.AuxInt 31505 if x != v_1.Args[0] { 31506 break 31507 } 31508 if !(d == 32-c) { 31509 break 31510 } 31511 v.reset(OpS390XRLLconst) 31512 v.AuxInt = c 31513 v.AddArg(x) 31514 return true 31515 } 31516 // match: (ORW x x) 31517 // cond: 31518 // result: x 31519 for { 31520 _ = v.Args[1] 31521 x := v.Args[0] 31522 if x != v.Args[1] { 31523 break 31524 } 31525 v.reset(OpCopy) 31526 v.Type = x.Type 31527 v.AddArg(x) 31528 return true 31529 } 31530 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 31531 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31532 // result: (ORWload <t> [off] {sym} x ptr mem) 31533 for { 31534 t := v.Type 31535 _ = v.Args[1] 31536 x := v.Args[0] 31537 g := v.Args[1] 31538 if g.Op != OpS390XMOVWload { 31539 break 31540 } 31541 off := g.AuxInt 31542 sym := g.Aux 31543 _ = g.Args[1] 31544 ptr := g.Args[0] 31545 mem := g.Args[1] 31546 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31547 break 31548 } 31549 v.reset(OpS390XORWload) 31550 v.Type = t 31551 v.AuxInt = off 31552 v.Aux = sym 31553 v.AddArg(x) 31554 v.AddArg(ptr) 31555 v.AddArg(mem) 31556 return true 31557 } 31558 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 31559 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31560 // result: (ORWload <t> [off] {sym} x ptr mem) 31561 for { 31562 t := v.Type 31563 _ = v.Args[1] 31564 g := v.Args[0] 31565 if g.Op != OpS390XMOVWload { 31566 break 31567 } 31568 off := g.AuxInt 31569 sym := g.Aux 31570 _ = g.Args[1] 31571 ptr := g.Args[0] 31572 mem := g.Args[1] 31573 x := v.Args[1] 31574 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31575 break 31576 } 31577 v.reset(OpS390XORWload) 31578 v.Type = t 31579 v.AuxInt = off 31580 v.Aux = sym 31581 v.AddArg(x) 31582 v.AddArg(ptr) 31583 v.AddArg(mem) 31584 return true 31585 } 31586 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 31587 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31588 // result: (ORWload <t> [off] {sym} x ptr mem) 31589 for { 31590 t := v.Type 31591 _ = v.Args[1] 31592 g := v.Args[0] 31593 if g.Op != OpS390XMOVWload { 31594 break 31595 } 31596 off := g.AuxInt 31597 sym := g.Aux 31598 _ = g.Args[1] 31599 ptr := g.Args[0] 31600 mem := g.Args[1] 31601 x := v.Args[1] 31602 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31603 break 31604 } 31605 v.reset(OpS390XORWload) 31606 v.Type = t 31607 v.AuxInt = off 31608 v.Aux = sym 31609 v.AddArg(x) 31610 v.AddArg(ptr) 31611 v.AddArg(mem) 31612 return true 31613 } 31614 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 31615 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31616 // result: (ORWload <t> [off] {sym} x ptr mem) 31617 for { 31618 t := v.Type 31619 _ = v.Args[1] 31620 x := v.Args[0] 31621 g := v.Args[1] 31622 if g.Op != OpS390XMOVWload { 31623 break 31624 } 31625 off := g.AuxInt 31626 sym := g.Aux 31627 _ = g.Args[1] 31628 ptr := g.Args[0] 31629 mem := g.Args[1] 31630 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31631 break 31632 } 31633 v.reset(OpS390XORWload) 31634 v.Type = t 31635 v.AuxInt = off 31636 v.Aux = sym 31637 v.AddArg(x) 31638 v.AddArg(ptr) 31639 v.AddArg(mem) 31640 return true 31641 } 31642 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 31643 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31644 // result: (ORWload <t> [off] {sym} x ptr mem) 31645 for { 31646 t := v.Type 31647 _ = v.Args[1] 31648 x := v.Args[0] 31649 g := v.Args[1] 31650 if g.Op != OpS390XMOVWZload { 31651 break 31652 } 31653 off := g.AuxInt 31654 sym := g.Aux 31655 _ = g.Args[1] 31656 ptr := g.Args[0] 31657 mem := g.Args[1] 31658 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31659 break 31660 } 31661 v.reset(OpS390XORWload) 31662 v.Type = t 31663 v.AuxInt = off 31664 v.Aux = sym 31665 v.AddArg(x) 31666 v.AddArg(ptr) 31667 v.AddArg(mem) 31668 return true 31669 } 31670 return false 31671 } 31672 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 31673 b := v.Block 31674 _ = b 31675 typ := &b.Func.Config.Types 31676 _ = typ 31677 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 31678 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31679 // result: (ORWload <t> [off] {sym} x ptr mem) 31680 for { 31681 t := v.Type 31682 _ = v.Args[1] 31683 g := v.Args[0] 31684 if g.Op != OpS390XMOVWZload { 31685 break 31686 } 31687 off := g.AuxInt 31688 sym := g.Aux 31689 _ = g.Args[1] 31690 ptr := g.Args[0] 31691 mem := g.Args[1] 31692 x := v.Args[1] 31693 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31694 break 31695 } 31696 v.reset(OpS390XORWload) 31697 v.Type = t 31698 v.AuxInt = off 31699 v.Aux = sym 31700 v.AddArg(x) 31701 v.AddArg(ptr) 31702 v.AddArg(mem) 31703 return true 31704 } 31705 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 31706 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31707 // result: (ORWload <t> [off] {sym} x ptr mem) 31708 for { 31709 t := v.Type 31710 _ = v.Args[1] 31711 g := v.Args[0] 31712 if g.Op != OpS390XMOVWZload { 31713 break 31714 } 31715 off := g.AuxInt 31716 sym := g.Aux 31717 _ = g.Args[1] 31718 ptr := g.Args[0] 31719 mem := g.Args[1] 31720 x := v.Args[1] 31721 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31722 break 31723 } 31724 v.reset(OpS390XORWload) 31725 v.Type = t 31726 v.AuxInt = off 31727 v.Aux = sym 31728 v.AddArg(x) 31729 v.AddArg(ptr) 31730 v.AddArg(mem) 31731 return true 31732 } 31733 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 31734 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 31735 // result: (ORWload <t> [off] {sym} x ptr mem) 31736 for { 31737 t := v.Type 31738 _ = v.Args[1] 31739 x := v.Args[0] 31740 g := v.Args[1] 31741 if g.Op != OpS390XMOVWZload { 31742 break 31743 } 31744 off := g.AuxInt 31745 sym := g.Aux 31746 _ = g.Args[1] 31747 ptr := g.Args[0] 31748 mem := g.Args[1] 31749 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 31750 break 31751 } 31752 v.reset(OpS390XORWload) 31753 v.Type = t 31754 v.AuxInt = off 31755 v.Aux = sym 31756 v.AddArg(x) 31757 v.AddArg(ptr) 31758 v.AddArg(mem) 31759 return true 31760 } 31761 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 31762 // 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) 31763 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 31764 for { 31765 _ = v.Args[1] 31766 x1 := v.Args[0] 31767 if x1.Op != OpS390XMOVBZload { 31768 break 31769 } 31770 i1 := x1.AuxInt 31771 s := x1.Aux 31772 _ = x1.Args[1] 31773 p := x1.Args[0] 31774 mem := x1.Args[1] 31775 sh := v.Args[1] 31776 if sh.Op != OpS390XSLWconst { 31777 break 31778 } 31779 if sh.AuxInt != 8 { 31780 break 31781 } 31782 x0 := sh.Args[0] 31783 if x0.Op != OpS390XMOVBZload { 31784 break 31785 } 31786 i0 := x0.AuxInt 31787 if x0.Aux != s { 31788 break 31789 } 31790 _ = x0.Args[1] 31791 if p != x0.Args[0] { 31792 break 31793 } 31794 if mem != x0.Args[1] { 31795 break 31796 } 31797 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)) { 31798 break 31799 } 31800 b = mergePoint(b, x0, x1) 31801 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 31802 v.reset(OpCopy) 31803 v.AddArg(v0) 31804 v0.AuxInt = i0 31805 v0.Aux = s 31806 v0.AddArg(p) 31807 v0.AddArg(mem) 31808 return true 31809 } 31810 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 31811 // 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) 31812 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 31813 for { 31814 _ = v.Args[1] 31815 sh := v.Args[0] 31816 if sh.Op != OpS390XSLWconst { 31817 break 31818 } 31819 if sh.AuxInt != 8 { 31820 break 31821 } 31822 x0 := sh.Args[0] 31823 if x0.Op != OpS390XMOVBZload { 31824 break 31825 } 31826 i0 := x0.AuxInt 31827 s := x0.Aux 31828 _ = x0.Args[1] 31829 p := x0.Args[0] 31830 mem := x0.Args[1] 31831 x1 := v.Args[1] 31832 if x1.Op != OpS390XMOVBZload { 31833 break 31834 } 31835 i1 := x1.AuxInt 31836 if x1.Aux != s { 31837 break 31838 } 31839 _ = x1.Args[1] 31840 if p != x1.Args[0] { 31841 break 31842 } 31843 if mem != x1.Args[1] { 31844 break 31845 } 31846 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)) { 31847 break 31848 } 31849 b = mergePoint(b, x0, x1) 31850 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 31851 v.reset(OpCopy) 31852 v.AddArg(v0) 31853 v0.AuxInt = i0 31854 v0.Aux = s 31855 v0.AddArg(p) 31856 v0.AddArg(mem) 31857 return true 31858 } 31859 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 31860 // 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) 31861 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 31862 for { 31863 _ = v.Args[1] 31864 x1 := v.Args[0] 31865 if x1.Op != OpS390XMOVHZload { 31866 break 31867 } 31868 i1 := x1.AuxInt 31869 s := x1.Aux 31870 _ = x1.Args[1] 31871 p := x1.Args[0] 31872 mem := x1.Args[1] 31873 sh := v.Args[1] 31874 if sh.Op != OpS390XSLWconst { 31875 break 31876 } 31877 if sh.AuxInt != 16 { 31878 break 31879 } 31880 x0 := sh.Args[0] 31881 if x0.Op != OpS390XMOVHZload { 31882 break 31883 } 31884 i0 := x0.AuxInt 31885 if x0.Aux != s { 31886 break 31887 } 31888 _ = x0.Args[1] 31889 if p != x0.Args[0] { 31890 break 31891 } 31892 if mem != x0.Args[1] { 31893 break 31894 } 31895 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)) { 31896 break 31897 } 31898 b = mergePoint(b, x0, x1) 31899 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 31900 v.reset(OpCopy) 31901 v.AddArg(v0) 31902 v0.AuxInt = i0 31903 v0.Aux = s 31904 v0.AddArg(p) 31905 v0.AddArg(mem) 31906 return true 31907 } 31908 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 31909 // 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) 31910 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 31911 for { 31912 _ = v.Args[1] 31913 sh := v.Args[0] 31914 if sh.Op != OpS390XSLWconst { 31915 break 31916 } 31917 if sh.AuxInt != 16 { 31918 break 31919 } 31920 x0 := sh.Args[0] 31921 if x0.Op != OpS390XMOVHZload { 31922 break 31923 } 31924 i0 := x0.AuxInt 31925 s := x0.Aux 31926 _ = x0.Args[1] 31927 p := x0.Args[0] 31928 mem := x0.Args[1] 31929 x1 := v.Args[1] 31930 if x1.Op != OpS390XMOVHZload { 31931 break 31932 } 31933 i1 := x1.AuxInt 31934 if x1.Aux != s { 31935 break 31936 } 31937 _ = x1.Args[1] 31938 if p != x1.Args[0] { 31939 break 31940 } 31941 if mem != x1.Args[1] { 31942 break 31943 } 31944 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)) { 31945 break 31946 } 31947 b = mergePoint(b, x0, x1) 31948 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 31949 v.reset(OpCopy) 31950 v.AddArg(v0) 31951 v0.AuxInt = i0 31952 v0.Aux = s 31953 v0.AddArg(p) 31954 v0.AddArg(mem) 31955 return true 31956 } 31957 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 31958 // 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) 31959 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 31960 for { 31961 _ = v.Args[1] 31962 s0 := v.Args[0] 31963 if s0.Op != OpS390XSLWconst { 31964 break 31965 } 31966 j0 := s0.AuxInt 31967 x0 := s0.Args[0] 31968 if x0.Op != OpS390XMOVBZload { 31969 break 31970 } 31971 i0 := x0.AuxInt 31972 s := x0.Aux 31973 _ = x0.Args[1] 31974 p := x0.Args[0] 31975 mem := x0.Args[1] 31976 or := v.Args[1] 31977 if or.Op != OpS390XORW { 31978 break 31979 } 31980 _ = or.Args[1] 31981 s1 := or.Args[0] 31982 if s1.Op != OpS390XSLWconst { 31983 break 31984 } 31985 j1 := s1.AuxInt 31986 x1 := s1.Args[0] 31987 if x1.Op != OpS390XMOVBZload { 31988 break 31989 } 31990 i1 := x1.AuxInt 31991 if x1.Aux != s { 31992 break 31993 } 31994 _ = x1.Args[1] 31995 if p != x1.Args[0] { 31996 break 31997 } 31998 if mem != x1.Args[1] { 31999 break 32000 } 32001 y := or.Args[1] 32002 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)) { 32003 break 32004 } 32005 b = mergePoint(b, x0, x1) 32006 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32007 v.reset(OpCopy) 32008 v.AddArg(v0) 32009 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32010 v1.AuxInt = j1 32011 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 32012 v2.AuxInt = i0 32013 v2.Aux = s 32014 v2.AddArg(p) 32015 v2.AddArg(mem) 32016 v1.AddArg(v2) 32017 v0.AddArg(v1) 32018 v0.AddArg(y) 32019 return true 32020 } 32021 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 32022 // 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) 32023 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 32024 for { 32025 _ = v.Args[1] 32026 s0 := v.Args[0] 32027 if s0.Op != OpS390XSLWconst { 32028 break 32029 } 32030 j0 := s0.AuxInt 32031 x0 := s0.Args[0] 32032 if x0.Op != OpS390XMOVBZload { 32033 break 32034 } 32035 i0 := x0.AuxInt 32036 s := x0.Aux 32037 _ = x0.Args[1] 32038 p := x0.Args[0] 32039 mem := x0.Args[1] 32040 or := v.Args[1] 32041 if or.Op != OpS390XORW { 32042 break 32043 } 32044 _ = or.Args[1] 32045 y := or.Args[0] 32046 s1 := or.Args[1] 32047 if s1.Op != OpS390XSLWconst { 32048 break 32049 } 32050 j1 := s1.AuxInt 32051 x1 := s1.Args[0] 32052 if x1.Op != OpS390XMOVBZload { 32053 break 32054 } 32055 i1 := x1.AuxInt 32056 if x1.Aux != s { 32057 break 32058 } 32059 _ = x1.Args[1] 32060 if p != x1.Args[0] { 32061 break 32062 } 32063 if mem != x1.Args[1] { 32064 break 32065 } 32066 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)) { 32067 break 32068 } 32069 b = mergePoint(b, x0, x1) 32070 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32071 v.reset(OpCopy) 32072 v.AddArg(v0) 32073 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32074 v1.AuxInt = j1 32075 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 32076 v2.AuxInt = i0 32077 v2.Aux = s 32078 v2.AddArg(p) 32079 v2.AddArg(mem) 32080 v1.AddArg(v2) 32081 v0.AddArg(v1) 32082 v0.AddArg(y) 32083 return true 32084 } 32085 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 32086 // 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) 32087 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 32088 for { 32089 _ = v.Args[1] 32090 or := v.Args[0] 32091 if or.Op != OpS390XORW { 32092 break 32093 } 32094 _ = or.Args[1] 32095 s1 := or.Args[0] 32096 if s1.Op != OpS390XSLWconst { 32097 break 32098 } 32099 j1 := s1.AuxInt 32100 x1 := s1.Args[0] 32101 if x1.Op != OpS390XMOVBZload { 32102 break 32103 } 32104 i1 := x1.AuxInt 32105 s := x1.Aux 32106 _ = x1.Args[1] 32107 p := x1.Args[0] 32108 mem := x1.Args[1] 32109 y := or.Args[1] 32110 s0 := v.Args[1] 32111 if s0.Op != OpS390XSLWconst { 32112 break 32113 } 32114 j0 := s0.AuxInt 32115 x0 := s0.Args[0] 32116 if x0.Op != OpS390XMOVBZload { 32117 break 32118 } 32119 i0 := x0.AuxInt 32120 if x0.Aux != s { 32121 break 32122 } 32123 _ = x0.Args[1] 32124 if p != x0.Args[0] { 32125 break 32126 } 32127 if mem != x0.Args[1] { 32128 break 32129 } 32130 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)) { 32131 break 32132 } 32133 b = mergePoint(b, x0, x1) 32134 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32135 v.reset(OpCopy) 32136 v.AddArg(v0) 32137 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32138 v1.AuxInt = j1 32139 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 32140 v2.AuxInt = i0 32141 v2.Aux = s 32142 v2.AddArg(p) 32143 v2.AddArg(mem) 32144 v1.AddArg(v2) 32145 v0.AddArg(v1) 32146 v0.AddArg(y) 32147 return true 32148 } 32149 return false 32150 } 32151 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 32152 b := v.Block 32153 _ = b 32154 typ := &b.Func.Config.Types 32155 _ = typ 32156 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 32157 // 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) 32158 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 32159 for { 32160 _ = v.Args[1] 32161 or := v.Args[0] 32162 if or.Op != OpS390XORW { 32163 break 32164 } 32165 _ = or.Args[1] 32166 y := or.Args[0] 32167 s1 := or.Args[1] 32168 if s1.Op != OpS390XSLWconst { 32169 break 32170 } 32171 j1 := s1.AuxInt 32172 x1 := s1.Args[0] 32173 if x1.Op != OpS390XMOVBZload { 32174 break 32175 } 32176 i1 := x1.AuxInt 32177 s := x1.Aux 32178 _ = x1.Args[1] 32179 p := x1.Args[0] 32180 mem := x1.Args[1] 32181 s0 := v.Args[1] 32182 if s0.Op != OpS390XSLWconst { 32183 break 32184 } 32185 j0 := s0.AuxInt 32186 x0 := s0.Args[0] 32187 if x0.Op != OpS390XMOVBZload { 32188 break 32189 } 32190 i0 := x0.AuxInt 32191 if x0.Aux != s { 32192 break 32193 } 32194 _ = x0.Args[1] 32195 if p != x0.Args[0] { 32196 break 32197 } 32198 if mem != x0.Args[1] { 32199 break 32200 } 32201 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)) { 32202 break 32203 } 32204 b = mergePoint(b, x0, x1) 32205 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32206 v.reset(OpCopy) 32207 v.AddArg(v0) 32208 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32209 v1.AuxInt = j1 32210 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 32211 v2.AuxInt = i0 32212 v2.Aux = s 32213 v2.AddArg(p) 32214 v2.AddArg(mem) 32215 v1.AddArg(v2) 32216 v0.AddArg(v1) 32217 v0.AddArg(y) 32218 return true 32219 } 32220 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 32221 // 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) 32222 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32223 for { 32224 _ = v.Args[1] 32225 x1 := v.Args[0] 32226 if x1.Op != OpS390XMOVBZloadidx { 32227 break 32228 } 32229 i1 := x1.AuxInt 32230 s := x1.Aux 32231 _ = x1.Args[2] 32232 p := x1.Args[0] 32233 idx := x1.Args[1] 32234 mem := x1.Args[2] 32235 sh := v.Args[1] 32236 if sh.Op != OpS390XSLWconst { 32237 break 32238 } 32239 if sh.AuxInt != 8 { 32240 break 32241 } 32242 x0 := sh.Args[0] 32243 if x0.Op != OpS390XMOVBZloadidx { 32244 break 32245 } 32246 i0 := x0.AuxInt 32247 if x0.Aux != s { 32248 break 32249 } 32250 _ = x0.Args[2] 32251 if p != x0.Args[0] { 32252 break 32253 } 32254 if idx != x0.Args[1] { 32255 break 32256 } 32257 if mem != x0.Args[2] { 32258 break 32259 } 32260 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)) { 32261 break 32262 } 32263 b = mergePoint(b, x0, x1) 32264 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32265 v.reset(OpCopy) 32266 v.AddArg(v0) 32267 v0.AuxInt = i0 32268 v0.Aux = s 32269 v0.AddArg(p) 32270 v0.AddArg(idx) 32271 v0.AddArg(mem) 32272 return true 32273 } 32274 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 32275 // 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) 32276 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32277 for { 32278 _ = v.Args[1] 32279 x1 := v.Args[0] 32280 if x1.Op != OpS390XMOVBZloadidx { 32281 break 32282 } 32283 i1 := x1.AuxInt 32284 s := x1.Aux 32285 _ = x1.Args[2] 32286 idx := x1.Args[0] 32287 p := x1.Args[1] 32288 mem := x1.Args[2] 32289 sh := v.Args[1] 32290 if sh.Op != OpS390XSLWconst { 32291 break 32292 } 32293 if sh.AuxInt != 8 { 32294 break 32295 } 32296 x0 := sh.Args[0] 32297 if x0.Op != OpS390XMOVBZloadidx { 32298 break 32299 } 32300 i0 := x0.AuxInt 32301 if x0.Aux != s { 32302 break 32303 } 32304 _ = x0.Args[2] 32305 if p != x0.Args[0] { 32306 break 32307 } 32308 if idx != x0.Args[1] { 32309 break 32310 } 32311 if mem != x0.Args[2] { 32312 break 32313 } 32314 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)) { 32315 break 32316 } 32317 b = mergePoint(b, x0, x1) 32318 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32319 v.reset(OpCopy) 32320 v.AddArg(v0) 32321 v0.AuxInt = i0 32322 v0.Aux = s 32323 v0.AddArg(p) 32324 v0.AddArg(idx) 32325 v0.AddArg(mem) 32326 return true 32327 } 32328 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 32329 // 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) 32330 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32331 for { 32332 _ = v.Args[1] 32333 x1 := v.Args[0] 32334 if x1.Op != OpS390XMOVBZloadidx { 32335 break 32336 } 32337 i1 := x1.AuxInt 32338 s := x1.Aux 32339 _ = x1.Args[2] 32340 p := x1.Args[0] 32341 idx := x1.Args[1] 32342 mem := x1.Args[2] 32343 sh := v.Args[1] 32344 if sh.Op != OpS390XSLWconst { 32345 break 32346 } 32347 if sh.AuxInt != 8 { 32348 break 32349 } 32350 x0 := sh.Args[0] 32351 if x0.Op != OpS390XMOVBZloadidx { 32352 break 32353 } 32354 i0 := x0.AuxInt 32355 if x0.Aux != s { 32356 break 32357 } 32358 _ = x0.Args[2] 32359 if idx != x0.Args[0] { 32360 break 32361 } 32362 if p != x0.Args[1] { 32363 break 32364 } 32365 if mem != x0.Args[2] { 32366 break 32367 } 32368 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)) { 32369 break 32370 } 32371 b = mergePoint(b, x0, x1) 32372 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32373 v.reset(OpCopy) 32374 v.AddArg(v0) 32375 v0.AuxInt = i0 32376 v0.Aux = s 32377 v0.AddArg(p) 32378 v0.AddArg(idx) 32379 v0.AddArg(mem) 32380 return true 32381 } 32382 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 32383 // 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) 32384 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32385 for { 32386 _ = v.Args[1] 32387 x1 := v.Args[0] 32388 if x1.Op != OpS390XMOVBZloadidx { 32389 break 32390 } 32391 i1 := x1.AuxInt 32392 s := x1.Aux 32393 _ = x1.Args[2] 32394 idx := x1.Args[0] 32395 p := x1.Args[1] 32396 mem := x1.Args[2] 32397 sh := v.Args[1] 32398 if sh.Op != OpS390XSLWconst { 32399 break 32400 } 32401 if sh.AuxInt != 8 { 32402 break 32403 } 32404 x0 := sh.Args[0] 32405 if x0.Op != OpS390XMOVBZloadidx { 32406 break 32407 } 32408 i0 := x0.AuxInt 32409 if x0.Aux != s { 32410 break 32411 } 32412 _ = x0.Args[2] 32413 if idx != x0.Args[0] { 32414 break 32415 } 32416 if p != x0.Args[1] { 32417 break 32418 } 32419 if mem != x0.Args[2] { 32420 break 32421 } 32422 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)) { 32423 break 32424 } 32425 b = mergePoint(b, x0, x1) 32426 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32427 v.reset(OpCopy) 32428 v.AddArg(v0) 32429 v0.AuxInt = i0 32430 v0.Aux = s 32431 v0.AddArg(p) 32432 v0.AddArg(idx) 32433 v0.AddArg(mem) 32434 return true 32435 } 32436 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 32437 // 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) 32438 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32439 for { 32440 _ = v.Args[1] 32441 sh := v.Args[0] 32442 if sh.Op != OpS390XSLWconst { 32443 break 32444 } 32445 if sh.AuxInt != 8 { 32446 break 32447 } 32448 x0 := sh.Args[0] 32449 if x0.Op != OpS390XMOVBZloadidx { 32450 break 32451 } 32452 i0 := x0.AuxInt 32453 s := x0.Aux 32454 _ = x0.Args[2] 32455 p := x0.Args[0] 32456 idx := x0.Args[1] 32457 mem := x0.Args[2] 32458 x1 := v.Args[1] 32459 if x1.Op != OpS390XMOVBZloadidx { 32460 break 32461 } 32462 i1 := x1.AuxInt 32463 if x1.Aux != s { 32464 break 32465 } 32466 _ = x1.Args[2] 32467 if p != x1.Args[0] { 32468 break 32469 } 32470 if idx != x1.Args[1] { 32471 break 32472 } 32473 if mem != x1.Args[2] { 32474 break 32475 } 32476 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)) { 32477 break 32478 } 32479 b = mergePoint(b, x0, x1) 32480 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32481 v.reset(OpCopy) 32482 v.AddArg(v0) 32483 v0.AuxInt = i0 32484 v0.Aux = s 32485 v0.AddArg(p) 32486 v0.AddArg(idx) 32487 v0.AddArg(mem) 32488 return true 32489 } 32490 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 32491 // 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) 32492 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32493 for { 32494 _ = v.Args[1] 32495 sh := v.Args[0] 32496 if sh.Op != OpS390XSLWconst { 32497 break 32498 } 32499 if sh.AuxInt != 8 { 32500 break 32501 } 32502 x0 := sh.Args[0] 32503 if x0.Op != OpS390XMOVBZloadidx { 32504 break 32505 } 32506 i0 := x0.AuxInt 32507 s := x0.Aux 32508 _ = x0.Args[2] 32509 idx := x0.Args[0] 32510 p := x0.Args[1] 32511 mem := x0.Args[2] 32512 x1 := v.Args[1] 32513 if x1.Op != OpS390XMOVBZloadidx { 32514 break 32515 } 32516 i1 := x1.AuxInt 32517 if x1.Aux != s { 32518 break 32519 } 32520 _ = x1.Args[2] 32521 if p != x1.Args[0] { 32522 break 32523 } 32524 if idx != x1.Args[1] { 32525 break 32526 } 32527 if mem != x1.Args[2] { 32528 break 32529 } 32530 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)) { 32531 break 32532 } 32533 b = mergePoint(b, x0, x1) 32534 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32535 v.reset(OpCopy) 32536 v.AddArg(v0) 32537 v0.AuxInt = i0 32538 v0.Aux = s 32539 v0.AddArg(p) 32540 v0.AddArg(idx) 32541 v0.AddArg(mem) 32542 return true 32543 } 32544 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 32545 // 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) 32546 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32547 for { 32548 _ = v.Args[1] 32549 sh := v.Args[0] 32550 if sh.Op != OpS390XSLWconst { 32551 break 32552 } 32553 if sh.AuxInt != 8 { 32554 break 32555 } 32556 x0 := sh.Args[0] 32557 if x0.Op != OpS390XMOVBZloadidx { 32558 break 32559 } 32560 i0 := x0.AuxInt 32561 s := x0.Aux 32562 _ = x0.Args[2] 32563 p := x0.Args[0] 32564 idx := x0.Args[1] 32565 mem := x0.Args[2] 32566 x1 := v.Args[1] 32567 if x1.Op != OpS390XMOVBZloadidx { 32568 break 32569 } 32570 i1 := x1.AuxInt 32571 if x1.Aux != s { 32572 break 32573 } 32574 _ = x1.Args[2] 32575 if idx != x1.Args[0] { 32576 break 32577 } 32578 if p != x1.Args[1] { 32579 break 32580 } 32581 if mem != x1.Args[2] { 32582 break 32583 } 32584 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)) { 32585 break 32586 } 32587 b = mergePoint(b, x0, x1) 32588 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32589 v.reset(OpCopy) 32590 v.AddArg(v0) 32591 v0.AuxInt = i0 32592 v0.Aux = s 32593 v0.AddArg(p) 32594 v0.AddArg(idx) 32595 v0.AddArg(mem) 32596 return true 32597 } 32598 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 32599 // 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) 32600 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 32601 for { 32602 _ = v.Args[1] 32603 sh := v.Args[0] 32604 if sh.Op != OpS390XSLWconst { 32605 break 32606 } 32607 if sh.AuxInt != 8 { 32608 break 32609 } 32610 x0 := sh.Args[0] 32611 if x0.Op != OpS390XMOVBZloadidx { 32612 break 32613 } 32614 i0 := x0.AuxInt 32615 s := x0.Aux 32616 _ = x0.Args[2] 32617 idx := x0.Args[0] 32618 p := x0.Args[1] 32619 mem := x0.Args[2] 32620 x1 := v.Args[1] 32621 if x1.Op != OpS390XMOVBZloadidx { 32622 break 32623 } 32624 i1 := x1.AuxInt 32625 if x1.Aux != s { 32626 break 32627 } 32628 _ = x1.Args[2] 32629 if idx != x1.Args[0] { 32630 break 32631 } 32632 if p != x1.Args[1] { 32633 break 32634 } 32635 if mem != x1.Args[2] { 32636 break 32637 } 32638 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)) { 32639 break 32640 } 32641 b = mergePoint(b, x0, x1) 32642 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 32643 v.reset(OpCopy) 32644 v.AddArg(v0) 32645 v0.AuxInt = i0 32646 v0.Aux = s 32647 v0.AddArg(p) 32648 v0.AddArg(idx) 32649 v0.AddArg(mem) 32650 return true 32651 } 32652 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 32653 // 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) 32654 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32655 for { 32656 _ = v.Args[1] 32657 x1 := v.Args[0] 32658 if x1.Op != OpS390XMOVHZloadidx { 32659 break 32660 } 32661 i1 := x1.AuxInt 32662 s := x1.Aux 32663 _ = x1.Args[2] 32664 p := x1.Args[0] 32665 idx := x1.Args[1] 32666 mem := x1.Args[2] 32667 sh := v.Args[1] 32668 if sh.Op != OpS390XSLWconst { 32669 break 32670 } 32671 if sh.AuxInt != 16 { 32672 break 32673 } 32674 x0 := sh.Args[0] 32675 if x0.Op != OpS390XMOVHZloadidx { 32676 break 32677 } 32678 i0 := x0.AuxInt 32679 if x0.Aux != s { 32680 break 32681 } 32682 _ = x0.Args[2] 32683 if p != x0.Args[0] { 32684 break 32685 } 32686 if idx != x0.Args[1] { 32687 break 32688 } 32689 if mem != x0.Args[2] { 32690 break 32691 } 32692 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)) { 32693 break 32694 } 32695 b = mergePoint(b, x0, x1) 32696 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32697 v.reset(OpCopy) 32698 v.AddArg(v0) 32699 v0.AuxInt = i0 32700 v0.Aux = s 32701 v0.AddArg(p) 32702 v0.AddArg(idx) 32703 v0.AddArg(mem) 32704 return true 32705 } 32706 return false 32707 } 32708 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 32709 b := v.Block 32710 _ = b 32711 typ := &b.Func.Config.Types 32712 _ = typ 32713 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 32714 // 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) 32715 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32716 for { 32717 _ = v.Args[1] 32718 x1 := v.Args[0] 32719 if x1.Op != OpS390XMOVHZloadidx { 32720 break 32721 } 32722 i1 := x1.AuxInt 32723 s := x1.Aux 32724 _ = x1.Args[2] 32725 idx := x1.Args[0] 32726 p := x1.Args[1] 32727 mem := x1.Args[2] 32728 sh := v.Args[1] 32729 if sh.Op != OpS390XSLWconst { 32730 break 32731 } 32732 if sh.AuxInt != 16 { 32733 break 32734 } 32735 x0 := sh.Args[0] 32736 if x0.Op != OpS390XMOVHZloadidx { 32737 break 32738 } 32739 i0 := x0.AuxInt 32740 if x0.Aux != s { 32741 break 32742 } 32743 _ = x0.Args[2] 32744 if p != x0.Args[0] { 32745 break 32746 } 32747 if idx != x0.Args[1] { 32748 break 32749 } 32750 if mem != x0.Args[2] { 32751 break 32752 } 32753 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)) { 32754 break 32755 } 32756 b = mergePoint(b, x0, x1) 32757 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32758 v.reset(OpCopy) 32759 v.AddArg(v0) 32760 v0.AuxInt = i0 32761 v0.Aux = s 32762 v0.AddArg(p) 32763 v0.AddArg(idx) 32764 v0.AddArg(mem) 32765 return true 32766 } 32767 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 32768 // 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) 32769 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32770 for { 32771 _ = v.Args[1] 32772 x1 := v.Args[0] 32773 if x1.Op != OpS390XMOVHZloadidx { 32774 break 32775 } 32776 i1 := x1.AuxInt 32777 s := x1.Aux 32778 _ = x1.Args[2] 32779 p := x1.Args[0] 32780 idx := x1.Args[1] 32781 mem := x1.Args[2] 32782 sh := v.Args[1] 32783 if sh.Op != OpS390XSLWconst { 32784 break 32785 } 32786 if sh.AuxInt != 16 { 32787 break 32788 } 32789 x0 := sh.Args[0] 32790 if x0.Op != OpS390XMOVHZloadidx { 32791 break 32792 } 32793 i0 := x0.AuxInt 32794 if x0.Aux != s { 32795 break 32796 } 32797 _ = x0.Args[2] 32798 if idx != x0.Args[0] { 32799 break 32800 } 32801 if p != x0.Args[1] { 32802 break 32803 } 32804 if mem != x0.Args[2] { 32805 break 32806 } 32807 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)) { 32808 break 32809 } 32810 b = mergePoint(b, x0, x1) 32811 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32812 v.reset(OpCopy) 32813 v.AddArg(v0) 32814 v0.AuxInt = i0 32815 v0.Aux = s 32816 v0.AddArg(p) 32817 v0.AddArg(idx) 32818 v0.AddArg(mem) 32819 return true 32820 } 32821 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 32822 // 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) 32823 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32824 for { 32825 _ = v.Args[1] 32826 x1 := v.Args[0] 32827 if x1.Op != OpS390XMOVHZloadidx { 32828 break 32829 } 32830 i1 := x1.AuxInt 32831 s := x1.Aux 32832 _ = x1.Args[2] 32833 idx := x1.Args[0] 32834 p := x1.Args[1] 32835 mem := x1.Args[2] 32836 sh := v.Args[1] 32837 if sh.Op != OpS390XSLWconst { 32838 break 32839 } 32840 if sh.AuxInt != 16 { 32841 break 32842 } 32843 x0 := sh.Args[0] 32844 if x0.Op != OpS390XMOVHZloadidx { 32845 break 32846 } 32847 i0 := x0.AuxInt 32848 if x0.Aux != s { 32849 break 32850 } 32851 _ = x0.Args[2] 32852 if idx != x0.Args[0] { 32853 break 32854 } 32855 if p != x0.Args[1] { 32856 break 32857 } 32858 if mem != x0.Args[2] { 32859 break 32860 } 32861 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)) { 32862 break 32863 } 32864 b = mergePoint(b, x0, x1) 32865 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32866 v.reset(OpCopy) 32867 v.AddArg(v0) 32868 v0.AuxInt = i0 32869 v0.Aux = s 32870 v0.AddArg(p) 32871 v0.AddArg(idx) 32872 v0.AddArg(mem) 32873 return true 32874 } 32875 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 32876 // 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) 32877 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32878 for { 32879 _ = v.Args[1] 32880 sh := v.Args[0] 32881 if sh.Op != OpS390XSLWconst { 32882 break 32883 } 32884 if sh.AuxInt != 16 { 32885 break 32886 } 32887 x0 := sh.Args[0] 32888 if x0.Op != OpS390XMOVHZloadidx { 32889 break 32890 } 32891 i0 := x0.AuxInt 32892 s := x0.Aux 32893 _ = x0.Args[2] 32894 p := x0.Args[0] 32895 idx := x0.Args[1] 32896 mem := x0.Args[2] 32897 x1 := v.Args[1] 32898 if x1.Op != OpS390XMOVHZloadidx { 32899 break 32900 } 32901 i1 := x1.AuxInt 32902 if x1.Aux != s { 32903 break 32904 } 32905 _ = x1.Args[2] 32906 if p != x1.Args[0] { 32907 break 32908 } 32909 if idx != x1.Args[1] { 32910 break 32911 } 32912 if mem != x1.Args[2] { 32913 break 32914 } 32915 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)) { 32916 break 32917 } 32918 b = mergePoint(b, x0, x1) 32919 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32920 v.reset(OpCopy) 32921 v.AddArg(v0) 32922 v0.AuxInt = i0 32923 v0.Aux = s 32924 v0.AddArg(p) 32925 v0.AddArg(idx) 32926 v0.AddArg(mem) 32927 return true 32928 } 32929 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 32930 // 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) 32931 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32932 for { 32933 _ = v.Args[1] 32934 sh := v.Args[0] 32935 if sh.Op != OpS390XSLWconst { 32936 break 32937 } 32938 if sh.AuxInt != 16 { 32939 break 32940 } 32941 x0 := sh.Args[0] 32942 if x0.Op != OpS390XMOVHZloadidx { 32943 break 32944 } 32945 i0 := x0.AuxInt 32946 s := x0.Aux 32947 _ = x0.Args[2] 32948 idx := x0.Args[0] 32949 p := x0.Args[1] 32950 mem := x0.Args[2] 32951 x1 := v.Args[1] 32952 if x1.Op != OpS390XMOVHZloadidx { 32953 break 32954 } 32955 i1 := x1.AuxInt 32956 if x1.Aux != s { 32957 break 32958 } 32959 _ = x1.Args[2] 32960 if p != x1.Args[0] { 32961 break 32962 } 32963 if idx != x1.Args[1] { 32964 break 32965 } 32966 if mem != x1.Args[2] { 32967 break 32968 } 32969 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)) { 32970 break 32971 } 32972 b = mergePoint(b, x0, x1) 32973 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 32974 v.reset(OpCopy) 32975 v.AddArg(v0) 32976 v0.AuxInt = i0 32977 v0.Aux = s 32978 v0.AddArg(p) 32979 v0.AddArg(idx) 32980 v0.AddArg(mem) 32981 return true 32982 } 32983 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 32984 // 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) 32985 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 32986 for { 32987 _ = v.Args[1] 32988 sh := v.Args[0] 32989 if sh.Op != OpS390XSLWconst { 32990 break 32991 } 32992 if sh.AuxInt != 16 { 32993 break 32994 } 32995 x0 := sh.Args[0] 32996 if x0.Op != OpS390XMOVHZloadidx { 32997 break 32998 } 32999 i0 := x0.AuxInt 33000 s := x0.Aux 33001 _ = x0.Args[2] 33002 p := x0.Args[0] 33003 idx := x0.Args[1] 33004 mem := x0.Args[2] 33005 x1 := v.Args[1] 33006 if x1.Op != OpS390XMOVHZloadidx { 33007 break 33008 } 33009 i1 := x1.AuxInt 33010 if x1.Aux != s { 33011 break 33012 } 33013 _ = x1.Args[2] 33014 if idx != x1.Args[0] { 33015 break 33016 } 33017 if p != x1.Args[1] { 33018 break 33019 } 33020 if mem != x1.Args[2] { 33021 break 33022 } 33023 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)) { 33024 break 33025 } 33026 b = mergePoint(b, x0, x1) 33027 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 33028 v.reset(OpCopy) 33029 v.AddArg(v0) 33030 v0.AuxInt = i0 33031 v0.Aux = s 33032 v0.AddArg(p) 33033 v0.AddArg(idx) 33034 v0.AddArg(mem) 33035 return true 33036 } 33037 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 33038 // 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) 33039 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 33040 for { 33041 _ = v.Args[1] 33042 sh := v.Args[0] 33043 if sh.Op != OpS390XSLWconst { 33044 break 33045 } 33046 if sh.AuxInt != 16 { 33047 break 33048 } 33049 x0 := sh.Args[0] 33050 if x0.Op != OpS390XMOVHZloadidx { 33051 break 33052 } 33053 i0 := x0.AuxInt 33054 s := x0.Aux 33055 _ = x0.Args[2] 33056 idx := x0.Args[0] 33057 p := x0.Args[1] 33058 mem := x0.Args[2] 33059 x1 := v.Args[1] 33060 if x1.Op != OpS390XMOVHZloadidx { 33061 break 33062 } 33063 i1 := x1.AuxInt 33064 if x1.Aux != s { 33065 break 33066 } 33067 _ = x1.Args[2] 33068 if idx != x1.Args[0] { 33069 break 33070 } 33071 if p != x1.Args[1] { 33072 break 33073 } 33074 if mem != x1.Args[2] { 33075 break 33076 } 33077 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)) { 33078 break 33079 } 33080 b = mergePoint(b, x0, x1) 33081 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 33082 v.reset(OpCopy) 33083 v.AddArg(v0) 33084 v0.AuxInt = i0 33085 v0.Aux = s 33086 v0.AddArg(p) 33087 v0.AddArg(idx) 33088 v0.AddArg(mem) 33089 return true 33090 } 33091 // 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)) 33092 // 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) 33093 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33094 for { 33095 _ = v.Args[1] 33096 s0 := v.Args[0] 33097 if s0.Op != OpS390XSLWconst { 33098 break 33099 } 33100 j0 := s0.AuxInt 33101 x0 := s0.Args[0] 33102 if x0.Op != OpS390XMOVBZloadidx { 33103 break 33104 } 33105 i0 := x0.AuxInt 33106 s := x0.Aux 33107 _ = x0.Args[2] 33108 p := x0.Args[0] 33109 idx := x0.Args[1] 33110 mem := x0.Args[2] 33111 or := v.Args[1] 33112 if or.Op != OpS390XORW { 33113 break 33114 } 33115 _ = or.Args[1] 33116 s1 := or.Args[0] 33117 if s1.Op != OpS390XSLWconst { 33118 break 33119 } 33120 j1 := s1.AuxInt 33121 x1 := s1.Args[0] 33122 if x1.Op != OpS390XMOVBZloadidx { 33123 break 33124 } 33125 i1 := x1.AuxInt 33126 if x1.Aux != s { 33127 break 33128 } 33129 _ = x1.Args[2] 33130 if p != x1.Args[0] { 33131 break 33132 } 33133 if idx != x1.Args[1] { 33134 break 33135 } 33136 if mem != x1.Args[2] { 33137 break 33138 } 33139 y := or.Args[1] 33140 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)) { 33141 break 33142 } 33143 b = mergePoint(b, x0, x1) 33144 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33145 v.reset(OpCopy) 33146 v.AddArg(v0) 33147 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33148 v1.AuxInt = j1 33149 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33150 v2.AuxInt = i0 33151 v2.Aux = s 33152 v2.AddArg(p) 33153 v2.AddArg(idx) 33154 v2.AddArg(mem) 33155 v1.AddArg(v2) 33156 v0.AddArg(v1) 33157 v0.AddArg(y) 33158 return true 33159 } 33160 // 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)) 33161 // 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) 33162 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33163 for { 33164 _ = v.Args[1] 33165 s0 := v.Args[0] 33166 if s0.Op != OpS390XSLWconst { 33167 break 33168 } 33169 j0 := s0.AuxInt 33170 x0 := s0.Args[0] 33171 if x0.Op != OpS390XMOVBZloadidx { 33172 break 33173 } 33174 i0 := x0.AuxInt 33175 s := x0.Aux 33176 _ = x0.Args[2] 33177 idx := x0.Args[0] 33178 p := x0.Args[1] 33179 mem := x0.Args[2] 33180 or := v.Args[1] 33181 if or.Op != OpS390XORW { 33182 break 33183 } 33184 _ = or.Args[1] 33185 s1 := or.Args[0] 33186 if s1.Op != OpS390XSLWconst { 33187 break 33188 } 33189 j1 := s1.AuxInt 33190 x1 := s1.Args[0] 33191 if x1.Op != OpS390XMOVBZloadidx { 33192 break 33193 } 33194 i1 := x1.AuxInt 33195 if x1.Aux != s { 33196 break 33197 } 33198 _ = x1.Args[2] 33199 if p != x1.Args[0] { 33200 break 33201 } 33202 if idx != x1.Args[1] { 33203 break 33204 } 33205 if mem != x1.Args[2] { 33206 break 33207 } 33208 y := or.Args[1] 33209 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)) { 33210 break 33211 } 33212 b = mergePoint(b, x0, x1) 33213 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33214 v.reset(OpCopy) 33215 v.AddArg(v0) 33216 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33217 v1.AuxInt = j1 33218 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33219 v2.AuxInt = i0 33220 v2.Aux = s 33221 v2.AddArg(p) 33222 v2.AddArg(idx) 33223 v2.AddArg(mem) 33224 v1.AddArg(v2) 33225 v0.AddArg(v1) 33226 v0.AddArg(y) 33227 return true 33228 } 33229 // 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)) 33230 // 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) 33231 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33232 for { 33233 _ = v.Args[1] 33234 s0 := v.Args[0] 33235 if s0.Op != OpS390XSLWconst { 33236 break 33237 } 33238 j0 := s0.AuxInt 33239 x0 := s0.Args[0] 33240 if x0.Op != OpS390XMOVBZloadidx { 33241 break 33242 } 33243 i0 := x0.AuxInt 33244 s := x0.Aux 33245 _ = x0.Args[2] 33246 p := x0.Args[0] 33247 idx := x0.Args[1] 33248 mem := x0.Args[2] 33249 or := v.Args[1] 33250 if or.Op != OpS390XORW { 33251 break 33252 } 33253 _ = or.Args[1] 33254 s1 := or.Args[0] 33255 if s1.Op != OpS390XSLWconst { 33256 break 33257 } 33258 j1 := s1.AuxInt 33259 x1 := s1.Args[0] 33260 if x1.Op != OpS390XMOVBZloadidx { 33261 break 33262 } 33263 i1 := x1.AuxInt 33264 if x1.Aux != s { 33265 break 33266 } 33267 _ = x1.Args[2] 33268 if idx != x1.Args[0] { 33269 break 33270 } 33271 if p != x1.Args[1] { 33272 break 33273 } 33274 if mem != x1.Args[2] { 33275 break 33276 } 33277 y := or.Args[1] 33278 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)) { 33279 break 33280 } 33281 b = mergePoint(b, x0, x1) 33282 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33283 v.reset(OpCopy) 33284 v.AddArg(v0) 33285 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33286 v1.AuxInt = j1 33287 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33288 v2.AuxInt = i0 33289 v2.Aux = s 33290 v2.AddArg(p) 33291 v2.AddArg(idx) 33292 v2.AddArg(mem) 33293 v1.AddArg(v2) 33294 v0.AddArg(v1) 33295 v0.AddArg(y) 33296 return true 33297 } 33298 return false 33299 } 33300 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 33301 b := v.Block 33302 _ = b 33303 typ := &b.Func.Config.Types 33304 _ = typ 33305 // 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)) 33306 // 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) 33307 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33308 for { 33309 _ = v.Args[1] 33310 s0 := v.Args[0] 33311 if s0.Op != OpS390XSLWconst { 33312 break 33313 } 33314 j0 := s0.AuxInt 33315 x0 := s0.Args[0] 33316 if x0.Op != OpS390XMOVBZloadidx { 33317 break 33318 } 33319 i0 := x0.AuxInt 33320 s := x0.Aux 33321 _ = x0.Args[2] 33322 idx := x0.Args[0] 33323 p := x0.Args[1] 33324 mem := x0.Args[2] 33325 or := v.Args[1] 33326 if or.Op != OpS390XORW { 33327 break 33328 } 33329 _ = or.Args[1] 33330 s1 := or.Args[0] 33331 if s1.Op != OpS390XSLWconst { 33332 break 33333 } 33334 j1 := s1.AuxInt 33335 x1 := s1.Args[0] 33336 if x1.Op != OpS390XMOVBZloadidx { 33337 break 33338 } 33339 i1 := x1.AuxInt 33340 if x1.Aux != s { 33341 break 33342 } 33343 _ = x1.Args[2] 33344 if idx != x1.Args[0] { 33345 break 33346 } 33347 if p != x1.Args[1] { 33348 break 33349 } 33350 if mem != x1.Args[2] { 33351 break 33352 } 33353 y := or.Args[1] 33354 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)) { 33355 break 33356 } 33357 b = mergePoint(b, x0, x1) 33358 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33359 v.reset(OpCopy) 33360 v.AddArg(v0) 33361 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33362 v1.AuxInt = j1 33363 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33364 v2.AuxInt = i0 33365 v2.Aux = s 33366 v2.AddArg(p) 33367 v2.AddArg(idx) 33368 v2.AddArg(mem) 33369 v1.AddArg(v2) 33370 v0.AddArg(v1) 33371 v0.AddArg(y) 33372 return true 33373 } 33374 // 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)))) 33375 // 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) 33376 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33377 for { 33378 _ = v.Args[1] 33379 s0 := v.Args[0] 33380 if s0.Op != OpS390XSLWconst { 33381 break 33382 } 33383 j0 := s0.AuxInt 33384 x0 := s0.Args[0] 33385 if x0.Op != OpS390XMOVBZloadidx { 33386 break 33387 } 33388 i0 := x0.AuxInt 33389 s := x0.Aux 33390 _ = x0.Args[2] 33391 p := x0.Args[0] 33392 idx := x0.Args[1] 33393 mem := x0.Args[2] 33394 or := v.Args[1] 33395 if or.Op != OpS390XORW { 33396 break 33397 } 33398 _ = or.Args[1] 33399 y := or.Args[0] 33400 s1 := or.Args[1] 33401 if s1.Op != OpS390XSLWconst { 33402 break 33403 } 33404 j1 := s1.AuxInt 33405 x1 := s1.Args[0] 33406 if x1.Op != OpS390XMOVBZloadidx { 33407 break 33408 } 33409 i1 := x1.AuxInt 33410 if x1.Aux != s { 33411 break 33412 } 33413 _ = x1.Args[2] 33414 if p != x1.Args[0] { 33415 break 33416 } 33417 if idx != x1.Args[1] { 33418 break 33419 } 33420 if mem != x1.Args[2] { 33421 break 33422 } 33423 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)) { 33424 break 33425 } 33426 b = mergePoint(b, x0, x1) 33427 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33428 v.reset(OpCopy) 33429 v.AddArg(v0) 33430 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33431 v1.AuxInt = j1 33432 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33433 v2.AuxInt = i0 33434 v2.Aux = s 33435 v2.AddArg(p) 33436 v2.AddArg(idx) 33437 v2.AddArg(mem) 33438 v1.AddArg(v2) 33439 v0.AddArg(v1) 33440 v0.AddArg(y) 33441 return true 33442 } 33443 // 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)))) 33444 // 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) 33445 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33446 for { 33447 _ = v.Args[1] 33448 s0 := v.Args[0] 33449 if s0.Op != OpS390XSLWconst { 33450 break 33451 } 33452 j0 := s0.AuxInt 33453 x0 := s0.Args[0] 33454 if x0.Op != OpS390XMOVBZloadidx { 33455 break 33456 } 33457 i0 := x0.AuxInt 33458 s := x0.Aux 33459 _ = x0.Args[2] 33460 idx := x0.Args[0] 33461 p := x0.Args[1] 33462 mem := x0.Args[2] 33463 or := v.Args[1] 33464 if or.Op != OpS390XORW { 33465 break 33466 } 33467 _ = or.Args[1] 33468 y := or.Args[0] 33469 s1 := or.Args[1] 33470 if s1.Op != OpS390XSLWconst { 33471 break 33472 } 33473 j1 := s1.AuxInt 33474 x1 := s1.Args[0] 33475 if x1.Op != OpS390XMOVBZloadidx { 33476 break 33477 } 33478 i1 := x1.AuxInt 33479 if x1.Aux != s { 33480 break 33481 } 33482 _ = x1.Args[2] 33483 if p != x1.Args[0] { 33484 break 33485 } 33486 if idx != x1.Args[1] { 33487 break 33488 } 33489 if mem != x1.Args[2] { 33490 break 33491 } 33492 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)) { 33493 break 33494 } 33495 b = mergePoint(b, x0, x1) 33496 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33497 v.reset(OpCopy) 33498 v.AddArg(v0) 33499 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33500 v1.AuxInt = j1 33501 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33502 v2.AuxInt = i0 33503 v2.Aux = s 33504 v2.AddArg(p) 33505 v2.AddArg(idx) 33506 v2.AddArg(mem) 33507 v1.AddArg(v2) 33508 v0.AddArg(v1) 33509 v0.AddArg(y) 33510 return true 33511 } 33512 // 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)))) 33513 // 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) 33514 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33515 for { 33516 _ = v.Args[1] 33517 s0 := v.Args[0] 33518 if s0.Op != OpS390XSLWconst { 33519 break 33520 } 33521 j0 := s0.AuxInt 33522 x0 := s0.Args[0] 33523 if x0.Op != OpS390XMOVBZloadidx { 33524 break 33525 } 33526 i0 := x0.AuxInt 33527 s := x0.Aux 33528 _ = x0.Args[2] 33529 p := x0.Args[0] 33530 idx := x0.Args[1] 33531 mem := x0.Args[2] 33532 or := v.Args[1] 33533 if or.Op != OpS390XORW { 33534 break 33535 } 33536 _ = or.Args[1] 33537 y := or.Args[0] 33538 s1 := or.Args[1] 33539 if s1.Op != OpS390XSLWconst { 33540 break 33541 } 33542 j1 := s1.AuxInt 33543 x1 := s1.Args[0] 33544 if x1.Op != OpS390XMOVBZloadidx { 33545 break 33546 } 33547 i1 := x1.AuxInt 33548 if x1.Aux != s { 33549 break 33550 } 33551 _ = x1.Args[2] 33552 if idx != x1.Args[0] { 33553 break 33554 } 33555 if p != x1.Args[1] { 33556 break 33557 } 33558 if mem != x1.Args[2] { 33559 break 33560 } 33561 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)) { 33562 break 33563 } 33564 b = mergePoint(b, x0, x1) 33565 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33566 v.reset(OpCopy) 33567 v.AddArg(v0) 33568 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33569 v1.AuxInt = j1 33570 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33571 v2.AuxInt = i0 33572 v2.Aux = s 33573 v2.AddArg(p) 33574 v2.AddArg(idx) 33575 v2.AddArg(mem) 33576 v1.AddArg(v2) 33577 v0.AddArg(v1) 33578 v0.AddArg(y) 33579 return true 33580 } 33581 // 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)))) 33582 // 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) 33583 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33584 for { 33585 _ = v.Args[1] 33586 s0 := v.Args[0] 33587 if s0.Op != OpS390XSLWconst { 33588 break 33589 } 33590 j0 := s0.AuxInt 33591 x0 := s0.Args[0] 33592 if x0.Op != OpS390XMOVBZloadidx { 33593 break 33594 } 33595 i0 := x0.AuxInt 33596 s := x0.Aux 33597 _ = x0.Args[2] 33598 idx := x0.Args[0] 33599 p := x0.Args[1] 33600 mem := x0.Args[2] 33601 or := v.Args[1] 33602 if or.Op != OpS390XORW { 33603 break 33604 } 33605 _ = or.Args[1] 33606 y := or.Args[0] 33607 s1 := or.Args[1] 33608 if s1.Op != OpS390XSLWconst { 33609 break 33610 } 33611 j1 := s1.AuxInt 33612 x1 := s1.Args[0] 33613 if x1.Op != OpS390XMOVBZloadidx { 33614 break 33615 } 33616 i1 := x1.AuxInt 33617 if x1.Aux != s { 33618 break 33619 } 33620 _ = x1.Args[2] 33621 if idx != x1.Args[0] { 33622 break 33623 } 33624 if p != x1.Args[1] { 33625 break 33626 } 33627 if mem != x1.Args[2] { 33628 break 33629 } 33630 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)) { 33631 break 33632 } 33633 b = mergePoint(b, x0, x1) 33634 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33635 v.reset(OpCopy) 33636 v.AddArg(v0) 33637 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33638 v1.AuxInt = j1 33639 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33640 v2.AuxInt = i0 33641 v2.Aux = s 33642 v2.AddArg(p) 33643 v2.AddArg(idx) 33644 v2.AddArg(mem) 33645 v1.AddArg(v2) 33646 v0.AddArg(v1) 33647 v0.AddArg(y) 33648 return true 33649 } 33650 // 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))) 33651 // 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) 33652 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33653 for { 33654 _ = v.Args[1] 33655 or := v.Args[0] 33656 if or.Op != OpS390XORW { 33657 break 33658 } 33659 _ = or.Args[1] 33660 s1 := or.Args[0] 33661 if s1.Op != OpS390XSLWconst { 33662 break 33663 } 33664 j1 := s1.AuxInt 33665 x1 := s1.Args[0] 33666 if x1.Op != OpS390XMOVBZloadidx { 33667 break 33668 } 33669 i1 := x1.AuxInt 33670 s := x1.Aux 33671 _ = x1.Args[2] 33672 p := x1.Args[0] 33673 idx := x1.Args[1] 33674 mem := x1.Args[2] 33675 y := or.Args[1] 33676 s0 := v.Args[1] 33677 if s0.Op != OpS390XSLWconst { 33678 break 33679 } 33680 j0 := s0.AuxInt 33681 x0 := s0.Args[0] 33682 if x0.Op != OpS390XMOVBZloadidx { 33683 break 33684 } 33685 i0 := x0.AuxInt 33686 if x0.Aux != s { 33687 break 33688 } 33689 _ = x0.Args[2] 33690 if p != x0.Args[0] { 33691 break 33692 } 33693 if idx != x0.Args[1] { 33694 break 33695 } 33696 if mem != x0.Args[2] { 33697 break 33698 } 33699 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)) { 33700 break 33701 } 33702 b = mergePoint(b, x0, x1) 33703 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33704 v.reset(OpCopy) 33705 v.AddArg(v0) 33706 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33707 v1.AuxInt = j1 33708 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33709 v2.AuxInt = i0 33710 v2.Aux = s 33711 v2.AddArg(p) 33712 v2.AddArg(idx) 33713 v2.AddArg(mem) 33714 v1.AddArg(v2) 33715 v0.AddArg(v1) 33716 v0.AddArg(y) 33717 return true 33718 } 33719 // 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))) 33720 // 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) 33721 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33722 for { 33723 _ = v.Args[1] 33724 or := v.Args[0] 33725 if or.Op != OpS390XORW { 33726 break 33727 } 33728 _ = or.Args[1] 33729 s1 := or.Args[0] 33730 if s1.Op != OpS390XSLWconst { 33731 break 33732 } 33733 j1 := s1.AuxInt 33734 x1 := s1.Args[0] 33735 if x1.Op != OpS390XMOVBZloadidx { 33736 break 33737 } 33738 i1 := x1.AuxInt 33739 s := x1.Aux 33740 _ = x1.Args[2] 33741 idx := x1.Args[0] 33742 p := x1.Args[1] 33743 mem := x1.Args[2] 33744 y := or.Args[1] 33745 s0 := v.Args[1] 33746 if s0.Op != OpS390XSLWconst { 33747 break 33748 } 33749 j0 := s0.AuxInt 33750 x0 := s0.Args[0] 33751 if x0.Op != OpS390XMOVBZloadidx { 33752 break 33753 } 33754 i0 := x0.AuxInt 33755 if x0.Aux != s { 33756 break 33757 } 33758 _ = x0.Args[2] 33759 if p != x0.Args[0] { 33760 break 33761 } 33762 if idx != x0.Args[1] { 33763 break 33764 } 33765 if mem != x0.Args[2] { 33766 break 33767 } 33768 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)) { 33769 break 33770 } 33771 b = mergePoint(b, x0, x1) 33772 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33773 v.reset(OpCopy) 33774 v.AddArg(v0) 33775 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33776 v1.AuxInt = j1 33777 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33778 v2.AuxInt = i0 33779 v2.Aux = s 33780 v2.AddArg(p) 33781 v2.AddArg(idx) 33782 v2.AddArg(mem) 33783 v1.AddArg(v2) 33784 v0.AddArg(v1) 33785 v0.AddArg(y) 33786 return true 33787 } 33788 // 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))) 33789 // 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) 33790 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33791 for { 33792 _ = v.Args[1] 33793 or := v.Args[0] 33794 if or.Op != OpS390XORW { 33795 break 33796 } 33797 _ = or.Args[1] 33798 y := or.Args[0] 33799 s1 := or.Args[1] 33800 if s1.Op != OpS390XSLWconst { 33801 break 33802 } 33803 j1 := s1.AuxInt 33804 x1 := s1.Args[0] 33805 if x1.Op != OpS390XMOVBZloadidx { 33806 break 33807 } 33808 i1 := x1.AuxInt 33809 s := x1.Aux 33810 _ = x1.Args[2] 33811 p := x1.Args[0] 33812 idx := x1.Args[1] 33813 mem := x1.Args[2] 33814 s0 := v.Args[1] 33815 if s0.Op != OpS390XSLWconst { 33816 break 33817 } 33818 j0 := s0.AuxInt 33819 x0 := s0.Args[0] 33820 if x0.Op != OpS390XMOVBZloadidx { 33821 break 33822 } 33823 i0 := x0.AuxInt 33824 if x0.Aux != s { 33825 break 33826 } 33827 _ = x0.Args[2] 33828 if p != x0.Args[0] { 33829 break 33830 } 33831 if idx != x0.Args[1] { 33832 break 33833 } 33834 if mem != x0.Args[2] { 33835 break 33836 } 33837 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)) { 33838 break 33839 } 33840 b = mergePoint(b, x0, x1) 33841 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33842 v.reset(OpCopy) 33843 v.AddArg(v0) 33844 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33845 v1.AuxInt = j1 33846 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33847 v2.AuxInt = i0 33848 v2.Aux = s 33849 v2.AddArg(p) 33850 v2.AddArg(idx) 33851 v2.AddArg(mem) 33852 v1.AddArg(v2) 33853 v0.AddArg(v1) 33854 v0.AddArg(y) 33855 return true 33856 } 33857 // 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))) 33858 // 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) 33859 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33860 for { 33861 _ = v.Args[1] 33862 or := v.Args[0] 33863 if or.Op != OpS390XORW { 33864 break 33865 } 33866 _ = or.Args[1] 33867 y := or.Args[0] 33868 s1 := or.Args[1] 33869 if s1.Op != OpS390XSLWconst { 33870 break 33871 } 33872 j1 := s1.AuxInt 33873 x1 := s1.Args[0] 33874 if x1.Op != OpS390XMOVBZloadidx { 33875 break 33876 } 33877 i1 := x1.AuxInt 33878 s := x1.Aux 33879 _ = x1.Args[2] 33880 idx := x1.Args[0] 33881 p := x1.Args[1] 33882 mem := x1.Args[2] 33883 s0 := v.Args[1] 33884 if s0.Op != OpS390XSLWconst { 33885 break 33886 } 33887 j0 := s0.AuxInt 33888 x0 := s0.Args[0] 33889 if x0.Op != OpS390XMOVBZloadidx { 33890 break 33891 } 33892 i0 := x0.AuxInt 33893 if x0.Aux != s { 33894 break 33895 } 33896 _ = x0.Args[2] 33897 if p != x0.Args[0] { 33898 break 33899 } 33900 if idx != x0.Args[1] { 33901 break 33902 } 33903 if mem != x0.Args[2] { 33904 break 33905 } 33906 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)) { 33907 break 33908 } 33909 b = mergePoint(b, x0, x1) 33910 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33911 v.reset(OpCopy) 33912 v.AddArg(v0) 33913 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33914 v1.AuxInt = j1 33915 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33916 v2.AuxInt = i0 33917 v2.Aux = s 33918 v2.AddArg(p) 33919 v2.AddArg(idx) 33920 v2.AddArg(mem) 33921 v1.AddArg(v2) 33922 v0.AddArg(v1) 33923 v0.AddArg(y) 33924 return true 33925 } 33926 // 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))) 33927 // 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) 33928 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 33929 for { 33930 _ = v.Args[1] 33931 or := v.Args[0] 33932 if or.Op != OpS390XORW { 33933 break 33934 } 33935 _ = or.Args[1] 33936 s1 := or.Args[0] 33937 if s1.Op != OpS390XSLWconst { 33938 break 33939 } 33940 j1 := s1.AuxInt 33941 x1 := s1.Args[0] 33942 if x1.Op != OpS390XMOVBZloadidx { 33943 break 33944 } 33945 i1 := x1.AuxInt 33946 s := x1.Aux 33947 _ = x1.Args[2] 33948 p := x1.Args[0] 33949 idx := x1.Args[1] 33950 mem := x1.Args[2] 33951 y := or.Args[1] 33952 s0 := v.Args[1] 33953 if s0.Op != OpS390XSLWconst { 33954 break 33955 } 33956 j0 := s0.AuxInt 33957 x0 := s0.Args[0] 33958 if x0.Op != OpS390XMOVBZloadidx { 33959 break 33960 } 33961 i0 := x0.AuxInt 33962 if x0.Aux != s { 33963 break 33964 } 33965 _ = x0.Args[2] 33966 if idx != x0.Args[0] { 33967 break 33968 } 33969 if p != x0.Args[1] { 33970 break 33971 } 33972 if mem != x0.Args[2] { 33973 break 33974 } 33975 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)) { 33976 break 33977 } 33978 b = mergePoint(b, x0, x1) 33979 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33980 v.reset(OpCopy) 33981 v.AddArg(v0) 33982 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33983 v1.AuxInt = j1 33984 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 33985 v2.AuxInt = i0 33986 v2.Aux = s 33987 v2.AddArg(p) 33988 v2.AddArg(idx) 33989 v2.AddArg(mem) 33990 v1.AddArg(v2) 33991 v0.AddArg(v1) 33992 v0.AddArg(y) 33993 return true 33994 } 33995 return false 33996 } 33997 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 33998 b := v.Block 33999 _ = b 34000 typ := &b.Func.Config.Types 34001 _ = typ 34002 // 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))) 34003 // 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) 34004 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34005 for { 34006 _ = v.Args[1] 34007 or := v.Args[0] 34008 if or.Op != OpS390XORW { 34009 break 34010 } 34011 _ = or.Args[1] 34012 s1 := or.Args[0] 34013 if s1.Op != OpS390XSLWconst { 34014 break 34015 } 34016 j1 := s1.AuxInt 34017 x1 := s1.Args[0] 34018 if x1.Op != OpS390XMOVBZloadidx { 34019 break 34020 } 34021 i1 := x1.AuxInt 34022 s := x1.Aux 34023 _ = x1.Args[2] 34024 idx := x1.Args[0] 34025 p := x1.Args[1] 34026 mem := x1.Args[2] 34027 y := or.Args[1] 34028 s0 := v.Args[1] 34029 if s0.Op != OpS390XSLWconst { 34030 break 34031 } 34032 j0 := s0.AuxInt 34033 x0 := s0.Args[0] 34034 if x0.Op != OpS390XMOVBZloadidx { 34035 break 34036 } 34037 i0 := x0.AuxInt 34038 if x0.Aux != s { 34039 break 34040 } 34041 _ = x0.Args[2] 34042 if idx != x0.Args[0] { 34043 break 34044 } 34045 if p != x0.Args[1] { 34046 break 34047 } 34048 if mem != x0.Args[2] { 34049 break 34050 } 34051 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)) { 34052 break 34053 } 34054 b = mergePoint(b, x0, x1) 34055 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34056 v.reset(OpCopy) 34057 v.AddArg(v0) 34058 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34059 v1.AuxInt = j1 34060 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34061 v2.AuxInt = i0 34062 v2.Aux = s 34063 v2.AddArg(p) 34064 v2.AddArg(idx) 34065 v2.AddArg(mem) 34066 v1.AddArg(v2) 34067 v0.AddArg(v1) 34068 v0.AddArg(y) 34069 return true 34070 } 34071 // 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))) 34072 // 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) 34073 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34074 for { 34075 _ = v.Args[1] 34076 or := v.Args[0] 34077 if or.Op != OpS390XORW { 34078 break 34079 } 34080 _ = or.Args[1] 34081 y := or.Args[0] 34082 s1 := or.Args[1] 34083 if s1.Op != OpS390XSLWconst { 34084 break 34085 } 34086 j1 := s1.AuxInt 34087 x1 := s1.Args[0] 34088 if x1.Op != OpS390XMOVBZloadidx { 34089 break 34090 } 34091 i1 := x1.AuxInt 34092 s := x1.Aux 34093 _ = x1.Args[2] 34094 p := x1.Args[0] 34095 idx := x1.Args[1] 34096 mem := x1.Args[2] 34097 s0 := v.Args[1] 34098 if s0.Op != OpS390XSLWconst { 34099 break 34100 } 34101 j0 := s0.AuxInt 34102 x0 := s0.Args[0] 34103 if x0.Op != OpS390XMOVBZloadidx { 34104 break 34105 } 34106 i0 := x0.AuxInt 34107 if x0.Aux != s { 34108 break 34109 } 34110 _ = x0.Args[2] 34111 if idx != x0.Args[0] { 34112 break 34113 } 34114 if p != x0.Args[1] { 34115 break 34116 } 34117 if mem != x0.Args[2] { 34118 break 34119 } 34120 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)) { 34121 break 34122 } 34123 b = mergePoint(b, x0, x1) 34124 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34125 v.reset(OpCopy) 34126 v.AddArg(v0) 34127 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34128 v1.AuxInt = j1 34129 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34130 v2.AuxInt = i0 34131 v2.Aux = s 34132 v2.AddArg(p) 34133 v2.AddArg(idx) 34134 v2.AddArg(mem) 34135 v1.AddArg(v2) 34136 v0.AddArg(v1) 34137 v0.AddArg(y) 34138 return true 34139 } 34140 // 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))) 34141 // 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) 34142 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 34143 for { 34144 _ = v.Args[1] 34145 or := v.Args[0] 34146 if or.Op != OpS390XORW { 34147 break 34148 } 34149 _ = or.Args[1] 34150 y := or.Args[0] 34151 s1 := or.Args[1] 34152 if s1.Op != OpS390XSLWconst { 34153 break 34154 } 34155 j1 := s1.AuxInt 34156 x1 := s1.Args[0] 34157 if x1.Op != OpS390XMOVBZloadidx { 34158 break 34159 } 34160 i1 := x1.AuxInt 34161 s := x1.Aux 34162 _ = x1.Args[2] 34163 idx := x1.Args[0] 34164 p := x1.Args[1] 34165 mem := x1.Args[2] 34166 s0 := v.Args[1] 34167 if s0.Op != OpS390XSLWconst { 34168 break 34169 } 34170 j0 := s0.AuxInt 34171 x0 := s0.Args[0] 34172 if x0.Op != OpS390XMOVBZloadidx { 34173 break 34174 } 34175 i0 := x0.AuxInt 34176 if x0.Aux != s { 34177 break 34178 } 34179 _ = x0.Args[2] 34180 if idx != x0.Args[0] { 34181 break 34182 } 34183 if p != x0.Args[1] { 34184 break 34185 } 34186 if mem != x0.Args[2] { 34187 break 34188 } 34189 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)) { 34190 break 34191 } 34192 b = mergePoint(b, x0, x1) 34193 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34194 v.reset(OpCopy) 34195 v.AddArg(v0) 34196 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34197 v1.AuxInt = j1 34198 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 34199 v2.AuxInt = i0 34200 v2.Aux = s 34201 v2.AddArg(p) 34202 v2.AddArg(idx) 34203 v2.AddArg(mem) 34204 v1.AddArg(v2) 34205 v0.AddArg(v1) 34206 v0.AddArg(y) 34207 return true 34208 } 34209 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 34210 // 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) 34211 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 34212 for { 34213 _ = v.Args[1] 34214 x0 := v.Args[0] 34215 if x0.Op != OpS390XMOVBZload { 34216 break 34217 } 34218 i0 := x0.AuxInt 34219 s := x0.Aux 34220 _ = x0.Args[1] 34221 p := x0.Args[0] 34222 mem := x0.Args[1] 34223 sh := v.Args[1] 34224 if sh.Op != OpS390XSLWconst { 34225 break 34226 } 34227 if sh.AuxInt != 8 { 34228 break 34229 } 34230 x1 := sh.Args[0] 34231 if x1.Op != OpS390XMOVBZload { 34232 break 34233 } 34234 i1 := x1.AuxInt 34235 if x1.Aux != s { 34236 break 34237 } 34238 _ = x1.Args[1] 34239 if p != x1.Args[0] { 34240 break 34241 } 34242 if mem != x1.Args[1] { 34243 break 34244 } 34245 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)) { 34246 break 34247 } 34248 b = mergePoint(b, x0, x1) 34249 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34250 v.reset(OpCopy) 34251 v.AddArg(v0) 34252 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34253 v1.AuxInt = i0 34254 v1.Aux = s 34255 v1.AddArg(p) 34256 v1.AddArg(mem) 34257 v0.AddArg(v1) 34258 return true 34259 } 34260 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 34261 // 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) 34262 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 34263 for { 34264 _ = v.Args[1] 34265 sh := v.Args[0] 34266 if sh.Op != OpS390XSLWconst { 34267 break 34268 } 34269 if sh.AuxInt != 8 { 34270 break 34271 } 34272 x1 := sh.Args[0] 34273 if x1.Op != OpS390XMOVBZload { 34274 break 34275 } 34276 i1 := x1.AuxInt 34277 s := x1.Aux 34278 _ = x1.Args[1] 34279 p := x1.Args[0] 34280 mem := x1.Args[1] 34281 x0 := v.Args[1] 34282 if x0.Op != OpS390XMOVBZload { 34283 break 34284 } 34285 i0 := x0.AuxInt 34286 if x0.Aux != s { 34287 break 34288 } 34289 _ = x0.Args[1] 34290 if p != x0.Args[0] { 34291 break 34292 } 34293 if mem != x0.Args[1] { 34294 break 34295 } 34296 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)) { 34297 break 34298 } 34299 b = mergePoint(b, x0, x1) 34300 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34301 v.reset(OpCopy) 34302 v.AddArg(v0) 34303 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34304 v1.AuxInt = i0 34305 v1.Aux = s 34306 v1.AddArg(p) 34307 v1.AddArg(mem) 34308 v0.AddArg(v1) 34309 return true 34310 } 34311 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 34312 // 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) 34313 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 34314 for { 34315 _ = v.Args[1] 34316 r0 := v.Args[0] 34317 if r0.Op != OpS390XMOVHZreg { 34318 break 34319 } 34320 x0 := r0.Args[0] 34321 if x0.Op != OpS390XMOVHBRload { 34322 break 34323 } 34324 i0 := x0.AuxInt 34325 s := x0.Aux 34326 _ = x0.Args[1] 34327 p := x0.Args[0] 34328 mem := x0.Args[1] 34329 sh := v.Args[1] 34330 if sh.Op != OpS390XSLWconst { 34331 break 34332 } 34333 if sh.AuxInt != 16 { 34334 break 34335 } 34336 r1 := sh.Args[0] 34337 if r1.Op != OpS390XMOVHZreg { 34338 break 34339 } 34340 x1 := r1.Args[0] 34341 if x1.Op != OpS390XMOVHBRload { 34342 break 34343 } 34344 i1 := x1.AuxInt 34345 if x1.Aux != s { 34346 break 34347 } 34348 _ = x1.Args[1] 34349 if p != x1.Args[0] { 34350 break 34351 } 34352 if mem != x1.Args[1] { 34353 break 34354 } 34355 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)) { 34356 break 34357 } 34358 b = mergePoint(b, x0, x1) 34359 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 34360 v.reset(OpCopy) 34361 v.AddArg(v0) 34362 v0.AuxInt = i0 34363 v0.Aux = s 34364 v0.AddArg(p) 34365 v0.AddArg(mem) 34366 return true 34367 } 34368 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 34369 // 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) 34370 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 34371 for { 34372 _ = v.Args[1] 34373 sh := v.Args[0] 34374 if sh.Op != OpS390XSLWconst { 34375 break 34376 } 34377 if sh.AuxInt != 16 { 34378 break 34379 } 34380 r1 := sh.Args[0] 34381 if r1.Op != OpS390XMOVHZreg { 34382 break 34383 } 34384 x1 := r1.Args[0] 34385 if x1.Op != OpS390XMOVHBRload { 34386 break 34387 } 34388 i1 := x1.AuxInt 34389 s := x1.Aux 34390 _ = x1.Args[1] 34391 p := x1.Args[0] 34392 mem := x1.Args[1] 34393 r0 := v.Args[1] 34394 if r0.Op != OpS390XMOVHZreg { 34395 break 34396 } 34397 x0 := r0.Args[0] 34398 if x0.Op != OpS390XMOVHBRload { 34399 break 34400 } 34401 i0 := x0.AuxInt 34402 if x0.Aux != s { 34403 break 34404 } 34405 _ = x0.Args[1] 34406 if p != x0.Args[0] { 34407 break 34408 } 34409 if mem != x0.Args[1] { 34410 break 34411 } 34412 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)) { 34413 break 34414 } 34415 b = mergePoint(b, x0, x1) 34416 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 34417 v.reset(OpCopy) 34418 v.AddArg(v0) 34419 v0.AuxInt = i0 34420 v0.Aux = s 34421 v0.AddArg(p) 34422 v0.AddArg(mem) 34423 return true 34424 } 34425 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 34426 // 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) 34427 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 34428 for { 34429 _ = v.Args[1] 34430 s1 := v.Args[0] 34431 if s1.Op != OpS390XSLWconst { 34432 break 34433 } 34434 j1 := s1.AuxInt 34435 x1 := s1.Args[0] 34436 if x1.Op != OpS390XMOVBZload { 34437 break 34438 } 34439 i1 := x1.AuxInt 34440 s := x1.Aux 34441 _ = x1.Args[1] 34442 p := x1.Args[0] 34443 mem := x1.Args[1] 34444 or := v.Args[1] 34445 if or.Op != OpS390XORW { 34446 break 34447 } 34448 _ = or.Args[1] 34449 s0 := or.Args[0] 34450 if s0.Op != OpS390XSLWconst { 34451 break 34452 } 34453 j0 := s0.AuxInt 34454 x0 := s0.Args[0] 34455 if x0.Op != OpS390XMOVBZload { 34456 break 34457 } 34458 i0 := x0.AuxInt 34459 if x0.Aux != s { 34460 break 34461 } 34462 _ = x0.Args[1] 34463 if p != x0.Args[0] { 34464 break 34465 } 34466 if mem != x0.Args[1] { 34467 break 34468 } 34469 y := or.Args[1] 34470 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)) { 34471 break 34472 } 34473 b = mergePoint(b, x0, x1) 34474 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34475 v.reset(OpCopy) 34476 v.AddArg(v0) 34477 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34478 v1.AuxInt = j0 34479 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34480 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34481 v3.AuxInt = i0 34482 v3.Aux = s 34483 v3.AddArg(p) 34484 v3.AddArg(mem) 34485 v2.AddArg(v3) 34486 v1.AddArg(v2) 34487 v0.AddArg(v1) 34488 v0.AddArg(y) 34489 return true 34490 } 34491 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 34492 // 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) 34493 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 34494 for { 34495 _ = v.Args[1] 34496 s1 := v.Args[0] 34497 if s1.Op != OpS390XSLWconst { 34498 break 34499 } 34500 j1 := s1.AuxInt 34501 x1 := s1.Args[0] 34502 if x1.Op != OpS390XMOVBZload { 34503 break 34504 } 34505 i1 := x1.AuxInt 34506 s := x1.Aux 34507 _ = x1.Args[1] 34508 p := x1.Args[0] 34509 mem := x1.Args[1] 34510 or := v.Args[1] 34511 if or.Op != OpS390XORW { 34512 break 34513 } 34514 _ = or.Args[1] 34515 y := or.Args[0] 34516 s0 := or.Args[1] 34517 if s0.Op != OpS390XSLWconst { 34518 break 34519 } 34520 j0 := s0.AuxInt 34521 x0 := s0.Args[0] 34522 if x0.Op != OpS390XMOVBZload { 34523 break 34524 } 34525 i0 := x0.AuxInt 34526 if x0.Aux != s { 34527 break 34528 } 34529 _ = x0.Args[1] 34530 if p != x0.Args[0] { 34531 break 34532 } 34533 if mem != x0.Args[1] { 34534 break 34535 } 34536 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)) { 34537 break 34538 } 34539 b = mergePoint(b, x0, x1) 34540 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34541 v.reset(OpCopy) 34542 v.AddArg(v0) 34543 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34544 v1.AuxInt = j0 34545 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34546 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34547 v3.AuxInt = i0 34548 v3.Aux = s 34549 v3.AddArg(p) 34550 v3.AddArg(mem) 34551 v2.AddArg(v3) 34552 v1.AddArg(v2) 34553 v0.AddArg(v1) 34554 v0.AddArg(y) 34555 return true 34556 } 34557 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 34558 // 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) 34559 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 34560 for { 34561 _ = v.Args[1] 34562 or := v.Args[0] 34563 if or.Op != OpS390XORW { 34564 break 34565 } 34566 _ = or.Args[1] 34567 s0 := or.Args[0] 34568 if s0.Op != OpS390XSLWconst { 34569 break 34570 } 34571 j0 := s0.AuxInt 34572 x0 := s0.Args[0] 34573 if x0.Op != OpS390XMOVBZload { 34574 break 34575 } 34576 i0 := x0.AuxInt 34577 s := x0.Aux 34578 _ = x0.Args[1] 34579 p := x0.Args[0] 34580 mem := x0.Args[1] 34581 y := or.Args[1] 34582 s1 := v.Args[1] 34583 if s1.Op != OpS390XSLWconst { 34584 break 34585 } 34586 j1 := s1.AuxInt 34587 x1 := s1.Args[0] 34588 if x1.Op != OpS390XMOVBZload { 34589 break 34590 } 34591 i1 := x1.AuxInt 34592 if x1.Aux != s { 34593 break 34594 } 34595 _ = x1.Args[1] 34596 if p != x1.Args[0] { 34597 break 34598 } 34599 if mem != x1.Args[1] { 34600 break 34601 } 34602 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)) { 34603 break 34604 } 34605 b = mergePoint(b, x0, x1) 34606 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34607 v.reset(OpCopy) 34608 v.AddArg(v0) 34609 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34610 v1.AuxInt = j0 34611 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34612 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34613 v3.AuxInt = i0 34614 v3.Aux = s 34615 v3.AddArg(p) 34616 v3.AddArg(mem) 34617 v2.AddArg(v3) 34618 v1.AddArg(v2) 34619 v0.AddArg(v1) 34620 v0.AddArg(y) 34621 return true 34622 } 34623 return false 34624 } 34625 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 34626 b := v.Block 34627 _ = b 34628 typ := &b.Func.Config.Types 34629 _ = typ 34630 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 34631 // 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) 34632 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 34633 for { 34634 _ = v.Args[1] 34635 or := v.Args[0] 34636 if or.Op != OpS390XORW { 34637 break 34638 } 34639 _ = or.Args[1] 34640 y := or.Args[0] 34641 s0 := or.Args[1] 34642 if s0.Op != OpS390XSLWconst { 34643 break 34644 } 34645 j0 := s0.AuxInt 34646 x0 := s0.Args[0] 34647 if x0.Op != OpS390XMOVBZload { 34648 break 34649 } 34650 i0 := x0.AuxInt 34651 s := x0.Aux 34652 _ = x0.Args[1] 34653 p := x0.Args[0] 34654 mem := x0.Args[1] 34655 s1 := v.Args[1] 34656 if s1.Op != OpS390XSLWconst { 34657 break 34658 } 34659 j1 := s1.AuxInt 34660 x1 := s1.Args[0] 34661 if x1.Op != OpS390XMOVBZload { 34662 break 34663 } 34664 i1 := x1.AuxInt 34665 if x1.Aux != s { 34666 break 34667 } 34668 _ = x1.Args[1] 34669 if p != x1.Args[0] { 34670 break 34671 } 34672 if mem != x1.Args[1] { 34673 break 34674 } 34675 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)) { 34676 break 34677 } 34678 b = mergePoint(b, x0, x1) 34679 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34680 v.reset(OpCopy) 34681 v.AddArg(v0) 34682 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34683 v1.AuxInt = j0 34684 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34685 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 34686 v3.AuxInt = i0 34687 v3.Aux = s 34688 v3.AddArg(p) 34689 v3.AddArg(mem) 34690 v2.AddArg(v3) 34691 v1.AddArg(v2) 34692 v0.AddArg(v1) 34693 v0.AddArg(y) 34694 return true 34695 } 34696 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 34697 // 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) 34698 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34699 for { 34700 _ = v.Args[1] 34701 x0 := v.Args[0] 34702 if x0.Op != OpS390XMOVBZloadidx { 34703 break 34704 } 34705 i0 := x0.AuxInt 34706 s := x0.Aux 34707 _ = x0.Args[2] 34708 p := x0.Args[0] 34709 idx := x0.Args[1] 34710 mem := x0.Args[2] 34711 sh := v.Args[1] 34712 if sh.Op != OpS390XSLWconst { 34713 break 34714 } 34715 if sh.AuxInt != 8 { 34716 break 34717 } 34718 x1 := sh.Args[0] 34719 if x1.Op != OpS390XMOVBZloadidx { 34720 break 34721 } 34722 i1 := x1.AuxInt 34723 if x1.Aux != s { 34724 break 34725 } 34726 _ = x1.Args[2] 34727 if p != x1.Args[0] { 34728 break 34729 } 34730 if idx != x1.Args[1] { 34731 break 34732 } 34733 if mem != x1.Args[2] { 34734 break 34735 } 34736 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)) { 34737 break 34738 } 34739 b = mergePoint(b, x0, x1) 34740 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34741 v.reset(OpCopy) 34742 v.AddArg(v0) 34743 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34744 v1.AuxInt = i0 34745 v1.Aux = s 34746 v1.AddArg(p) 34747 v1.AddArg(idx) 34748 v1.AddArg(mem) 34749 v0.AddArg(v1) 34750 return true 34751 } 34752 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 34753 // 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) 34754 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34755 for { 34756 _ = v.Args[1] 34757 x0 := v.Args[0] 34758 if x0.Op != OpS390XMOVBZloadidx { 34759 break 34760 } 34761 i0 := x0.AuxInt 34762 s := x0.Aux 34763 _ = x0.Args[2] 34764 idx := x0.Args[0] 34765 p := x0.Args[1] 34766 mem := x0.Args[2] 34767 sh := v.Args[1] 34768 if sh.Op != OpS390XSLWconst { 34769 break 34770 } 34771 if sh.AuxInt != 8 { 34772 break 34773 } 34774 x1 := sh.Args[0] 34775 if x1.Op != OpS390XMOVBZloadidx { 34776 break 34777 } 34778 i1 := x1.AuxInt 34779 if x1.Aux != s { 34780 break 34781 } 34782 _ = x1.Args[2] 34783 if p != x1.Args[0] { 34784 break 34785 } 34786 if idx != x1.Args[1] { 34787 break 34788 } 34789 if mem != x1.Args[2] { 34790 break 34791 } 34792 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)) { 34793 break 34794 } 34795 b = mergePoint(b, x0, x1) 34796 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34797 v.reset(OpCopy) 34798 v.AddArg(v0) 34799 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34800 v1.AuxInt = i0 34801 v1.Aux = s 34802 v1.AddArg(p) 34803 v1.AddArg(idx) 34804 v1.AddArg(mem) 34805 v0.AddArg(v1) 34806 return true 34807 } 34808 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 34809 // 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) 34810 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34811 for { 34812 _ = v.Args[1] 34813 x0 := v.Args[0] 34814 if x0.Op != OpS390XMOVBZloadidx { 34815 break 34816 } 34817 i0 := x0.AuxInt 34818 s := x0.Aux 34819 _ = x0.Args[2] 34820 p := x0.Args[0] 34821 idx := x0.Args[1] 34822 mem := x0.Args[2] 34823 sh := v.Args[1] 34824 if sh.Op != OpS390XSLWconst { 34825 break 34826 } 34827 if sh.AuxInt != 8 { 34828 break 34829 } 34830 x1 := sh.Args[0] 34831 if x1.Op != OpS390XMOVBZloadidx { 34832 break 34833 } 34834 i1 := x1.AuxInt 34835 if x1.Aux != s { 34836 break 34837 } 34838 _ = x1.Args[2] 34839 if idx != x1.Args[0] { 34840 break 34841 } 34842 if p != x1.Args[1] { 34843 break 34844 } 34845 if mem != x1.Args[2] { 34846 break 34847 } 34848 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)) { 34849 break 34850 } 34851 b = mergePoint(b, x0, x1) 34852 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34853 v.reset(OpCopy) 34854 v.AddArg(v0) 34855 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34856 v1.AuxInt = i0 34857 v1.Aux = s 34858 v1.AddArg(p) 34859 v1.AddArg(idx) 34860 v1.AddArg(mem) 34861 v0.AddArg(v1) 34862 return true 34863 } 34864 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 34865 // 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) 34866 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34867 for { 34868 _ = v.Args[1] 34869 x0 := v.Args[0] 34870 if x0.Op != OpS390XMOVBZloadidx { 34871 break 34872 } 34873 i0 := x0.AuxInt 34874 s := x0.Aux 34875 _ = x0.Args[2] 34876 idx := x0.Args[0] 34877 p := x0.Args[1] 34878 mem := x0.Args[2] 34879 sh := v.Args[1] 34880 if sh.Op != OpS390XSLWconst { 34881 break 34882 } 34883 if sh.AuxInt != 8 { 34884 break 34885 } 34886 x1 := sh.Args[0] 34887 if x1.Op != OpS390XMOVBZloadidx { 34888 break 34889 } 34890 i1 := x1.AuxInt 34891 if x1.Aux != s { 34892 break 34893 } 34894 _ = x1.Args[2] 34895 if idx != x1.Args[0] { 34896 break 34897 } 34898 if p != x1.Args[1] { 34899 break 34900 } 34901 if mem != x1.Args[2] { 34902 break 34903 } 34904 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)) { 34905 break 34906 } 34907 b = mergePoint(b, x0, x1) 34908 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34909 v.reset(OpCopy) 34910 v.AddArg(v0) 34911 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34912 v1.AuxInt = i0 34913 v1.Aux = s 34914 v1.AddArg(p) 34915 v1.AddArg(idx) 34916 v1.AddArg(mem) 34917 v0.AddArg(v1) 34918 return true 34919 } 34920 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 34921 // 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) 34922 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34923 for { 34924 _ = v.Args[1] 34925 sh := v.Args[0] 34926 if sh.Op != OpS390XSLWconst { 34927 break 34928 } 34929 if sh.AuxInt != 8 { 34930 break 34931 } 34932 x1 := sh.Args[0] 34933 if x1.Op != OpS390XMOVBZloadidx { 34934 break 34935 } 34936 i1 := x1.AuxInt 34937 s := x1.Aux 34938 _ = x1.Args[2] 34939 p := x1.Args[0] 34940 idx := x1.Args[1] 34941 mem := x1.Args[2] 34942 x0 := v.Args[1] 34943 if x0.Op != OpS390XMOVBZloadidx { 34944 break 34945 } 34946 i0 := x0.AuxInt 34947 if x0.Aux != s { 34948 break 34949 } 34950 _ = x0.Args[2] 34951 if p != x0.Args[0] { 34952 break 34953 } 34954 if idx != x0.Args[1] { 34955 break 34956 } 34957 if mem != x0.Args[2] { 34958 break 34959 } 34960 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)) { 34961 break 34962 } 34963 b = mergePoint(b, x0, x1) 34964 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34965 v.reset(OpCopy) 34966 v.AddArg(v0) 34967 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34968 v1.AuxInt = i0 34969 v1.Aux = s 34970 v1.AddArg(p) 34971 v1.AddArg(idx) 34972 v1.AddArg(mem) 34973 v0.AddArg(v1) 34974 return true 34975 } 34976 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 34977 // 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) 34978 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 34979 for { 34980 _ = v.Args[1] 34981 sh := v.Args[0] 34982 if sh.Op != OpS390XSLWconst { 34983 break 34984 } 34985 if sh.AuxInt != 8 { 34986 break 34987 } 34988 x1 := sh.Args[0] 34989 if x1.Op != OpS390XMOVBZloadidx { 34990 break 34991 } 34992 i1 := x1.AuxInt 34993 s := x1.Aux 34994 _ = x1.Args[2] 34995 idx := x1.Args[0] 34996 p := x1.Args[1] 34997 mem := x1.Args[2] 34998 x0 := v.Args[1] 34999 if x0.Op != OpS390XMOVBZloadidx { 35000 break 35001 } 35002 i0 := x0.AuxInt 35003 if x0.Aux != s { 35004 break 35005 } 35006 _ = x0.Args[2] 35007 if p != x0.Args[0] { 35008 break 35009 } 35010 if idx != x0.Args[1] { 35011 break 35012 } 35013 if mem != x0.Args[2] { 35014 break 35015 } 35016 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)) { 35017 break 35018 } 35019 b = mergePoint(b, x0, x1) 35020 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35021 v.reset(OpCopy) 35022 v.AddArg(v0) 35023 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35024 v1.AuxInt = i0 35025 v1.Aux = s 35026 v1.AddArg(p) 35027 v1.AddArg(idx) 35028 v1.AddArg(mem) 35029 v0.AddArg(v1) 35030 return true 35031 } 35032 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 35033 // 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) 35034 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 35035 for { 35036 _ = v.Args[1] 35037 sh := v.Args[0] 35038 if sh.Op != OpS390XSLWconst { 35039 break 35040 } 35041 if sh.AuxInt != 8 { 35042 break 35043 } 35044 x1 := sh.Args[0] 35045 if x1.Op != OpS390XMOVBZloadidx { 35046 break 35047 } 35048 i1 := x1.AuxInt 35049 s := x1.Aux 35050 _ = x1.Args[2] 35051 p := x1.Args[0] 35052 idx := x1.Args[1] 35053 mem := x1.Args[2] 35054 x0 := v.Args[1] 35055 if x0.Op != OpS390XMOVBZloadidx { 35056 break 35057 } 35058 i0 := x0.AuxInt 35059 if x0.Aux != s { 35060 break 35061 } 35062 _ = x0.Args[2] 35063 if idx != x0.Args[0] { 35064 break 35065 } 35066 if p != x0.Args[1] { 35067 break 35068 } 35069 if mem != x0.Args[2] { 35070 break 35071 } 35072 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)) { 35073 break 35074 } 35075 b = mergePoint(b, x0, x1) 35076 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35077 v.reset(OpCopy) 35078 v.AddArg(v0) 35079 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35080 v1.AuxInt = i0 35081 v1.Aux = s 35082 v1.AddArg(p) 35083 v1.AddArg(idx) 35084 v1.AddArg(mem) 35085 v0.AddArg(v1) 35086 return true 35087 } 35088 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 35089 // 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) 35090 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 35091 for { 35092 _ = v.Args[1] 35093 sh := v.Args[0] 35094 if sh.Op != OpS390XSLWconst { 35095 break 35096 } 35097 if sh.AuxInt != 8 { 35098 break 35099 } 35100 x1 := sh.Args[0] 35101 if x1.Op != OpS390XMOVBZloadidx { 35102 break 35103 } 35104 i1 := x1.AuxInt 35105 s := x1.Aux 35106 _ = x1.Args[2] 35107 idx := x1.Args[0] 35108 p := x1.Args[1] 35109 mem := x1.Args[2] 35110 x0 := v.Args[1] 35111 if x0.Op != OpS390XMOVBZloadidx { 35112 break 35113 } 35114 i0 := x0.AuxInt 35115 if x0.Aux != s { 35116 break 35117 } 35118 _ = x0.Args[2] 35119 if idx != x0.Args[0] { 35120 break 35121 } 35122 if p != x0.Args[1] { 35123 break 35124 } 35125 if mem != x0.Args[2] { 35126 break 35127 } 35128 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)) { 35129 break 35130 } 35131 b = mergePoint(b, x0, x1) 35132 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35133 v.reset(OpCopy) 35134 v.AddArg(v0) 35135 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35136 v1.AuxInt = i0 35137 v1.Aux = s 35138 v1.AddArg(p) 35139 v1.AddArg(idx) 35140 v1.AddArg(mem) 35141 v0.AddArg(v1) 35142 return true 35143 } 35144 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 35145 // 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) 35146 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35147 for { 35148 _ = v.Args[1] 35149 r0 := v.Args[0] 35150 if r0.Op != OpS390XMOVHZreg { 35151 break 35152 } 35153 x0 := r0.Args[0] 35154 if x0.Op != OpS390XMOVHBRloadidx { 35155 break 35156 } 35157 i0 := x0.AuxInt 35158 s := x0.Aux 35159 _ = x0.Args[2] 35160 p := x0.Args[0] 35161 idx := x0.Args[1] 35162 mem := x0.Args[2] 35163 sh := v.Args[1] 35164 if sh.Op != OpS390XSLWconst { 35165 break 35166 } 35167 if sh.AuxInt != 16 { 35168 break 35169 } 35170 r1 := sh.Args[0] 35171 if r1.Op != OpS390XMOVHZreg { 35172 break 35173 } 35174 x1 := r1.Args[0] 35175 if x1.Op != OpS390XMOVHBRloadidx { 35176 break 35177 } 35178 i1 := x1.AuxInt 35179 if x1.Aux != s { 35180 break 35181 } 35182 _ = x1.Args[2] 35183 if p != x1.Args[0] { 35184 break 35185 } 35186 if idx != x1.Args[1] { 35187 break 35188 } 35189 if mem != x1.Args[2] { 35190 break 35191 } 35192 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)) { 35193 break 35194 } 35195 b = mergePoint(b, x0, x1) 35196 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35197 v.reset(OpCopy) 35198 v.AddArg(v0) 35199 v0.AuxInt = i0 35200 v0.Aux = s 35201 v0.AddArg(p) 35202 v0.AddArg(idx) 35203 v0.AddArg(mem) 35204 return true 35205 } 35206 return false 35207 } 35208 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 35209 b := v.Block 35210 _ = b 35211 typ := &b.Func.Config.Types 35212 _ = typ 35213 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 35214 // 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) 35215 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35216 for { 35217 _ = v.Args[1] 35218 r0 := v.Args[0] 35219 if r0.Op != OpS390XMOVHZreg { 35220 break 35221 } 35222 x0 := r0.Args[0] 35223 if x0.Op != OpS390XMOVHBRloadidx { 35224 break 35225 } 35226 i0 := x0.AuxInt 35227 s := x0.Aux 35228 _ = x0.Args[2] 35229 idx := x0.Args[0] 35230 p := x0.Args[1] 35231 mem := x0.Args[2] 35232 sh := v.Args[1] 35233 if sh.Op != OpS390XSLWconst { 35234 break 35235 } 35236 if sh.AuxInt != 16 { 35237 break 35238 } 35239 r1 := sh.Args[0] 35240 if r1.Op != OpS390XMOVHZreg { 35241 break 35242 } 35243 x1 := r1.Args[0] 35244 if x1.Op != OpS390XMOVHBRloadidx { 35245 break 35246 } 35247 i1 := x1.AuxInt 35248 if x1.Aux != s { 35249 break 35250 } 35251 _ = x1.Args[2] 35252 if p != x1.Args[0] { 35253 break 35254 } 35255 if idx != x1.Args[1] { 35256 break 35257 } 35258 if mem != x1.Args[2] { 35259 break 35260 } 35261 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)) { 35262 break 35263 } 35264 b = mergePoint(b, x0, x1) 35265 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35266 v.reset(OpCopy) 35267 v.AddArg(v0) 35268 v0.AuxInt = i0 35269 v0.Aux = s 35270 v0.AddArg(p) 35271 v0.AddArg(idx) 35272 v0.AddArg(mem) 35273 return true 35274 } 35275 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 35276 // 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) 35277 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35278 for { 35279 _ = v.Args[1] 35280 r0 := v.Args[0] 35281 if r0.Op != OpS390XMOVHZreg { 35282 break 35283 } 35284 x0 := r0.Args[0] 35285 if x0.Op != OpS390XMOVHBRloadidx { 35286 break 35287 } 35288 i0 := x0.AuxInt 35289 s := x0.Aux 35290 _ = x0.Args[2] 35291 p := x0.Args[0] 35292 idx := x0.Args[1] 35293 mem := x0.Args[2] 35294 sh := v.Args[1] 35295 if sh.Op != OpS390XSLWconst { 35296 break 35297 } 35298 if sh.AuxInt != 16 { 35299 break 35300 } 35301 r1 := sh.Args[0] 35302 if r1.Op != OpS390XMOVHZreg { 35303 break 35304 } 35305 x1 := r1.Args[0] 35306 if x1.Op != OpS390XMOVHBRloadidx { 35307 break 35308 } 35309 i1 := x1.AuxInt 35310 if x1.Aux != s { 35311 break 35312 } 35313 _ = x1.Args[2] 35314 if idx != x1.Args[0] { 35315 break 35316 } 35317 if p != x1.Args[1] { 35318 break 35319 } 35320 if mem != x1.Args[2] { 35321 break 35322 } 35323 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)) { 35324 break 35325 } 35326 b = mergePoint(b, x0, x1) 35327 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35328 v.reset(OpCopy) 35329 v.AddArg(v0) 35330 v0.AuxInt = i0 35331 v0.Aux = s 35332 v0.AddArg(p) 35333 v0.AddArg(idx) 35334 v0.AddArg(mem) 35335 return true 35336 } 35337 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 35338 // 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) 35339 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35340 for { 35341 _ = v.Args[1] 35342 r0 := v.Args[0] 35343 if r0.Op != OpS390XMOVHZreg { 35344 break 35345 } 35346 x0 := r0.Args[0] 35347 if x0.Op != OpS390XMOVHBRloadidx { 35348 break 35349 } 35350 i0 := x0.AuxInt 35351 s := x0.Aux 35352 _ = x0.Args[2] 35353 idx := x0.Args[0] 35354 p := x0.Args[1] 35355 mem := x0.Args[2] 35356 sh := v.Args[1] 35357 if sh.Op != OpS390XSLWconst { 35358 break 35359 } 35360 if sh.AuxInt != 16 { 35361 break 35362 } 35363 r1 := sh.Args[0] 35364 if r1.Op != OpS390XMOVHZreg { 35365 break 35366 } 35367 x1 := r1.Args[0] 35368 if x1.Op != OpS390XMOVHBRloadidx { 35369 break 35370 } 35371 i1 := x1.AuxInt 35372 if x1.Aux != s { 35373 break 35374 } 35375 _ = x1.Args[2] 35376 if idx != x1.Args[0] { 35377 break 35378 } 35379 if p != x1.Args[1] { 35380 break 35381 } 35382 if mem != x1.Args[2] { 35383 break 35384 } 35385 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)) { 35386 break 35387 } 35388 b = mergePoint(b, x0, x1) 35389 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35390 v.reset(OpCopy) 35391 v.AddArg(v0) 35392 v0.AuxInt = i0 35393 v0.Aux = s 35394 v0.AddArg(p) 35395 v0.AddArg(idx) 35396 v0.AddArg(mem) 35397 return true 35398 } 35399 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 35400 // 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) 35401 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35402 for { 35403 _ = v.Args[1] 35404 sh := v.Args[0] 35405 if sh.Op != OpS390XSLWconst { 35406 break 35407 } 35408 if sh.AuxInt != 16 { 35409 break 35410 } 35411 r1 := sh.Args[0] 35412 if r1.Op != OpS390XMOVHZreg { 35413 break 35414 } 35415 x1 := r1.Args[0] 35416 if x1.Op != OpS390XMOVHBRloadidx { 35417 break 35418 } 35419 i1 := x1.AuxInt 35420 s := x1.Aux 35421 _ = x1.Args[2] 35422 p := x1.Args[0] 35423 idx := x1.Args[1] 35424 mem := x1.Args[2] 35425 r0 := v.Args[1] 35426 if r0.Op != OpS390XMOVHZreg { 35427 break 35428 } 35429 x0 := r0.Args[0] 35430 if x0.Op != OpS390XMOVHBRloadidx { 35431 break 35432 } 35433 i0 := x0.AuxInt 35434 if x0.Aux != s { 35435 break 35436 } 35437 _ = x0.Args[2] 35438 if p != x0.Args[0] { 35439 break 35440 } 35441 if idx != x0.Args[1] { 35442 break 35443 } 35444 if mem != x0.Args[2] { 35445 break 35446 } 35447 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)) { 35448 break 35449 } 35450 b = mergePoint(b, x0, x1) 35451 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35452 v.reset(OpCopy) 35453 v.AddArg(v0) 35454 v0.AuxInt = i0 35455 v0.Aux = s 35456 v0.AddArg(p) 35457 v0.AddArg(idx) 35458 v0.AddArg(mem) 35459 return true 35460 } 35461 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 35462 // 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) 35463 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35464 for { 35465 _ = v.Args[1] 35466 sh := v.Args[0] 35467 if sh.Op != OpS390XSLWconst { 35468 break 35469 } 35470 if sh.AuxInt != 16 { 35471 break 35472 } 35473 r1 := sh.Args[0] 35474 if r1.Op != OpS390XMOVHZreg { 35475 break 35476 } 35477 x1 := r1.Args[0] 35478 if x1.Op != OpS390XMOVHBRloadidx { 35479 break 35480 } 35481 i1 := x1.AuxInt 35482 s := x1.Aux 35483 _ = x1.Args[2] 35484 idx := x1.Args[0] 35485 p := x1.Args[1] 35486 mem := x1.Args[2] 35487 r0 := v.Args[1] 35488 if r0.Op != OpS390XMOVHZreg { 35489 break 35490 } 35491 x0 := r0.Args[0] 35492 if x0.Op != OpS390XMOVHBRloadidx { 35493 break 35494 } 35495 i0 := x0.AuxInt 35496 if x0.Aux != s { 35497 break 35498 } 35499 _ = x0.Args[2] 35500 if p != x0.Args[0] { 35501 break 35502 } 35503 if idx != x0.Args[1] { 35504 break 35505 } 35506 if mem != x0.Args[2] { 35507 break 35508 } 35509 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)) { 35510 break 35511 } 35512 b = mergePoint(b, x0, x1) 35513 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35514 v.reset(OpCopy) 35515 v.AddArg(v0) 35516 v0.AuxInt = i0 35517 v0.Aux = s 35518 v0.AddArg(p) 35519 v0.AddArg(idx) 35520 v0.AddArg(mem) 35521 return true 35522 } 35523 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 35524 // 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) 35525 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35526 for { 35527 _ = v.Args[1] 35528 sh := v.Args[0] 35529 if sh.Op != OpS390XSLWconst { 35530 break 35531 } 35532 if sh.AuxInt != 16 { 35533 break 35534 } 35535 r1 := sh.Args[0] 35536 if r1.Op != OpS390XMOVHZreg { 35537 break 35538 } 35539 x1 := r1.Args[0] 35540 if x1.Op != OpS390XMOVHBRloadidx { 35541 break 35542 } 35543 i1 := x1.AuxInt 35544 s := x1.Aux 35545 _ = x1.Args[2] 35546 p := x1.Args[0] 35547 idx := x1.Args[1] 35548 mem := x1.Args[2] 35549 r0 := v.Args[1] 35550 if r0.Op != OpS390XMOVHZreg { 35551 break 35552 } 35553 x0 := r0.Args[0] 35554 if x0.Op != OpS390XMOVHBRloadidx { 35555 break 35556 } 35557 i0 := x0.AuxInt 35558 if x0.Aux != s { 35559 break 35560 } 35561 _ = x0.Args[2] 35562 if idx != x0.Args[0] { 35563 break 35564 } 35565 if p != x0.Args[1] { 35566 break 35567 } 35568 if mem != x0.Args[2] { 35569 break 35570 } 35571 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)) { 35572 break 35573 } 35574 b = mergePoint(b, x0, x1) 35575 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35576 v.reset(OpCopy) 35577 v.AddArg(v0) 35578 v0.AuxInt = i0 35579 v0.Aux = s 35580 v0.AddArg(p) 35581 v0.AddArg(idx) 35582 v0.AddArg(mem) 35583 return true 35584 } 35585 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 35586 // 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) 35587 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 35588 for { 35589 _ = v.Args[1] 35590 sh := v.Args[0] 35591 if sh.Op != OpS390XSLWconst { 35592 break 35593 } 35594 if sh.AuxInt != 16 { 35595 break 35596 } 35597 r1 := sh.Args[0] 35598 if r1.Op != OpS390XMOVHZreg { 35599 break 35600 } 35601 x1 := r1.Args[0] 35602 if x1.Op != OpS390XMOVHBRloadidx { 35603 break 35604 } 35605 i1 := x1.AuxInt 35606 s := x1.Aux 35607 _ = x1.Args[2] 35608 idx := x1.Args[0] 35609 p := x1.Args[1] 35610 mem := x1.Args[2] 35611 r0 := v.Args[1] 35612 if r0.Op != OpS390XMOVHZreg { 35613 break 35614 } 35615 x0 := r0.Args[0] 35616 if x0.Op != OpS390XMOVHBRloadidx { 35617 break 35618 } 35619 i0 := x0.AuxInt 35620 if x0.Aux != s { 35621 break 35622 } 35623 _ = x0.Args[2] 35624 if idx != x0.Args[0] { 35625 break 35626 } 35627 if p != x0.Args[1] { 35628 break 35629 } 35630 if mem != x0.Args[2] { 35631 break 35632 } 35633 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)) { 35634 break 35635 } 35636 b = mergePoint(b, x0, x1) 35637 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 35638 v.reset(OpCopy) 35639 v.AddArg(v0) 35640 v0.AuxInt = i0 35641 v0.Aux = s 35642 v0.AddArg(p) 35643 v0.AddArg(idx) 35644 v0.AddArg(mem) 35645 return true 35646 } 35647 // 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)) 35648 // 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) 35649 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 35650 for { 35651 _ = v.Args[1] 35652 s1 := v.Args[0] 35653 if s1.Op != OpS390XSLWconst { 35654 break 35655 } 35656 j1 := s1.AuxInt 35657 x1 := s1.Args[0] 35658 if x1.Op != OpS390XMOVBZloadidx { 35659 break 35660 } 35661 i1 := x1.AuxInt 35662 s := x1.Aux 35663 _ = x1.Args[2] 35664 p := x1.Args[0] 35665 idx := x1.Args[1] 35666 mem := x1.Args[2] 35667 or := v.Args[1] 35668 if or.Op != OpS390XORW { 35669 break 35670 } 35671 _ = or.Args[1] 35672 s0 := or.Args[0] 35673 if s0.Op != OpS390XSLWconst { 35674 break 35675 } 35676 j0 := s0.AuxInt 35677 x0 := s0.Args[0] 35678 if x0.Op != OpS390XMOVBZloadidx { 35679 break 35680 } 35681 i0 := x0.AuxInt 35682 if x0.Aux != s { 35683 break 35684 } 35685 _ = x0.Args[2] 35686 if p != x0.Args[0] { 35687 break 35688 } 35689 if idx != x0.Args[1] { 35690 break 35691 } 35692 if mem != x0.Args[2] { 35693 break 35694 } 35695 y := or.Args[1] 35696 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)) { 35697 break 35698 } 35699 b = mergePoint(b, x0, x1) 35700 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35701 v.reset(OpCopy) 35702 v.AddArg(v0) 35703 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35704 v1.AuxInt = j0 35705 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35706 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35707 v3.AuxInt = i0 35708 v3.Aux = s 35709 v3.AddArg(p) 35710 v3.AddArg(idx) 35711 v3.AddArg(mem) 35712 v2.AddArg(v3) 35713 v1.AddArg(v2) 35714 v0.AddArg(v1) 35715 v0.AddArg(y) 35716 return true 35717 } 35718 // 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)) 35719 // 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) 35720 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 35721 for { 35722 _ = v.Args[1] 35723 s1 := v.Args[0] 35724 if s1.Op != OpS390XSLWconst { 35725 break 35726 } 35727 j1 := s1.AuxInt 35728 x1 := s1.Args[0] 35729 if x1.Op != OpS390XMOVBZloadidx { 35730 break 35731 } 35732 i1 := x1.AuxInt 35733 s := x1.Aux 35734 _ = x1.Args[2] 35735 idx := x1.Args[0] 35736 p := x1.Args[1] 35737 mem := x1.Args[2] 35738 or := v.Args[1] 35739 if or.Op != OpS390XORW { 35740 break 35741 } 35742 _ = or.Args[1] 35743 s0 := or.Args[0] 35744 if s0.Op != OpS390XSLWconst { 35745 break 35746 } 35747 j0 := s0.AuxInt 35748 x0 := s0.Args[0] 35749 if x0.Op != OpS390XMOVBZloadidx { 35750 break 35751 } 35752 i0 := x0.AuxInt 35753 if x0.Aux != s { 35754 break 35755 } 35756 _ = x0.Args[2] 35757 if p != x0.Args[0] { 35758 break 35759 } 35760 if idx != x0.Args[1] { 35761 break 35762 } 35763 if mem != x0.Args[2] { 35764 break 35765 } 35766 y := or.Args[1] 35767 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)) { 35768 break 35769 } 35770 b = mergePoint(b, x0, x1) 35771 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35772 v.reset(OpCopy) 35773 v.AddArg(v0) 35774 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35775 v1.AuxInt = j0 35776 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35777 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35778 v3.AuxInt = i0 35779 v3.Aux = s 35780 v3.AddArg(p) 35781 v3.AddArg(idx) 35782 v3.AddArg(mem) 35783 v2.AddArg(v3) 35784 v1.AddArg(v2) 35785 v0.AddArg(v1) 35786 v0.AddArg(y) 35787 return true 35788 } 35789 // 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)) 35790 // 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) 35791 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 35792 for { 35793 _ = v.Args[1] 35794 s1 := v.Args[0] 35795 if s1.Op != OpS390XSLWconst { 35796 break 35797 } 35798 j1 := s1.AuxInt 35799 x1 := s1.Args[0] 35800 if x1.Op != OpS390XMOVBZloadidx { 35801 break 35802 } 35803 i1 := x1.AuxInt 35804 s := x1.Aux 35805 _ = x1.Args[2] 35806 p := x1.Args[0] 35807 idx := x1.Args[1] 35808 mem := x1.Args[2] 35809 or := v.Args[1] 35810 if or.Op != OpS390XORW { 35811 break 35812 } 35813 _ = or.Args[1] 35814 s0 := or.Args[0] 35815 if s0.Op != OpS390XSLWconst { 35816 break 35817 } 35818 j0 := s0.AuxInt 35819 x0 := s0.Args[0] 35820 if x0.Op != OpS390XMOVBZloadidx { 35821 break 35822 } 35823 i0 := x0.AuxInt 35824 if x0.Aux != s { 35825 break 35826 } 35827 _ = x0.Args[2] 35828 if idx != x0.Args[0] { 35829 break 35830 } 35831 if p != x0.Args[1] { 35832 break 35833 } 35834 if mem != x0.Args[2] { 35835 break 35836 } 35837 y := or.Args[1] 35838 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)) { 35839 break 35840 } 35841 b = mergePoint(b, x0, x1) 35842 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35843 v.reset(OpCopy) 35844 v.AddArg(v0) 35845 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35846 v1.AuxInt = j0 35847 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35848 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35849 v3.AuxInt = i0 35850 v3.Aux = s 35851 v3.AddArg(p) 35852 v3.AddArg(idx) 35853 v3.AddArg(mem) 35854 v2.AddArg(v3) 35855 v1.AddArg(v2) 35856 v0.AddArg(v1) 35857 v0.AddArg(y) 35858 return true 35859 } 35860 return false 35861 } 35862 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 35863 b := v.Block 35864 _ = b 35865 typ := &b.Func.Config.Types 35866 _ = typ 35867 // 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)) 35868 // 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) 35869 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 35870 for { 35871 _ = v.Args[1] 35872 s1 := v.Args[0] 35873 if s1.Op != OpS390XSLWconst { 35874 break 35875 } 35876 j1 := s1.AuxInt 35877 x1 := s1.Args[0] 35878 if x1.Op != OpS390XMOVBZloadidx { 35879 break 35880 } 35881 i1 := x1.AuxInt 35882 s := x1.Aux 35883 _ = x1.Args[2] 35884 idx := x1.Args[0] 35885 p := x1.Args[1] 35886 mem := x1.Args[2] 35887 or := v.Args[1] 35888 if or.Op != OpS390XORW { 35889 break 35890 } 35891 _ = or.Args[1] 35892 s0 := or.Args[0] 35893 if s0.Op != OpS390XSLWconst { 35894 break 35895 } 35896 j0 := s0.AuxInt 35897 x0 := s0.Args[0] 35898 if x0.Op != OpS390XMOVBZloadidx { 35899 break 35900 } 35901 i0 := x0.AuxInt 35902 if x0.Aux != s { 35903 break 35904 } 35905 _ = x0.Args[2] 35906 if idx != x0.Args[0] { 35907 break 35908 } 35909 if p != x0.Args[1] { 35910 break 35911 } 35912 if mem != x0.Args[2] { 35913 break 35914 } 35915 y := or.Args[1] 35916 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)) { 35917 break 35918 } 35919 b = mergePoint(b, x0, x1) 35920 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35921 v.reset(OpCopy) 35922 v.AddArg(v0) 35923 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35924 v1.AuxInt = j0 35925 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35926 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35927 v3.AuxInt = i0 35928 v3.Aux = s 35929 v3.AddArg(p) 35930 v3.AddArg(idx) 35931 v3.AddArg(mem) 35932 v2.AddArg(v3) 35933 v1.AddArg(v2) 35934 v0.AddArg(v1) 35935 v0.AddArg(y) 35936 return true 35937 } 35938 // 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)))) 35939 // 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) 35940 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 35941 for { 35942 _ = v.Args[1] 35943 s1 := v.Args[0] 35944 if s1.Op != OpS390XSLWconst { 35945 break 35946 } 35947 j1 := s1.AuxInt 35948 x1 := s1.Args[0] 35949 if x1.Op != OpS390XMOVBZloadidx { 35950 break 35951 } 35952 i1 := x1.AuxInt 35953 s := x1.Aux 35954 _ = x1.Args[2] 35955 p := x1.Args[0] 35956 idx := x1.Args[1] 35957 mem := x1.Args[2] 35958 or := v.Args[1] 35959 if or.Op != OpS390XORW { 35960 break 35961 } 35962 _ = or.Args[1] 35963 y := or.Args[0] 35964 s0 := or.Args[1] 35965 if s0.Op != OpS390XSLWconst { 35966 break 35967 } 35968 j0 := s0.AuxInt 35969 x0 := s0.Args[0] 35970 if x0.Op != OpS390XMOVBZloadidx { 35971 break 35972 } 35973 i0 := x0.AuxInt 35974 if x0.Aux != s { 35975 break 35976 } 35977 _ = x0.Args[2] 35978 if p != x0.Args[0] { 35979 break 35980 } 35981 if idx != x0.Args[1] { 35982 break 35983 } 35984 if mem != x0.Args[2] { 35985 break 35986 } 35987 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)) { 35988 break 35989 } 35990 b = mergePoint(b, x0, x1) 35991 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 35992 v.reset(OpCopy) 35993 v.AddArg(v0) 35994 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 35995 v1.AuxInt = j0 35996 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 35997 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 35998 v3.AuxInt = i0 35999 v3.Aux = s 36000 v3.AddArg(p) 36001 v3.AddArg(idx) 36002 v3.AddArg(mem) 36003 v2.AddArg(v3) 36004 v1.AddArg(v2) 36005 v0.AddArg(v1) 36006 v0.AddArg(y) 36007 return true 36008 } 36009 // 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)))) 36010 // 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) 36011 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36012 for { 36013 _ = v.Args[1] 36014 s1 := v.Args[0] 36015 if s1.Op != OpS390XSLWconst { 36016 break 36017 } 36018 j1 := s1.AuxInt 36019 x1 := s1.Args[0] 36020 if x1.Op != OpS390XMOVBZloadidx { 36021 break 36022 } 36023 i1 := x1.AuxInt 36024 s := x1.Aux 36025 _ = x1.Args[2] 36026 idx := x1.Args[0] 36027 p := x1.Args[1] 36028 mem := x1.Args[2] 36029 or := v.Args[1] 36030 if or.Op != OpS390XORW { 36031 break 36032 } 36033 _ = or.Args[1] 36034 y := or.Args[0] 36035 s0 := or.Args[1] 36036 if s0.Op != OpS390XSLWconst { 36037 break 36038 } 36039 j0 := s0.AuxInt 36040 x0 := s0.Args[0] 36041 if x0.Op != OpS390XMOVBZloadidx { 36042 break 36043 } 36044 i0 := x0.AuxInt 36045 if x0.Aux != s { 36046 break 36047 } 36048 _ = x0.Args[2] 36049 if p != x0.Args[0] { 36050 break 36051 } 36052 if idx != x0.Args[1] { 36053 break 36054 } 36055 if mem != x0.Args[2] { 36056 break 36057 } 36058 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)) { 36059 break 36060 } 36061 b = mergePoint(b, x0, x1) 36062 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36063 v.reset(OpCopy) 36064 v.AddArg(v0) 36065 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36066 v1.AuxInt = j0 36067 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36068 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36069 v3.AuxInt = i0 36070 v3.Aux = s 36071 v3.AddArg(p) 36072 v3.AddArg(idx) 36073 v3.AddArg(mem) 36074 v2.AddArg(v3) 36075 v1.AddArg(v2) 36076 v0.AddArg(v1) 36077 v0.AddArg(y) 36078 return true 36079 } 36080 // 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)))) 36081 // 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) 36082 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36083 for { 36084 _ = v.Args[1] 36085 s1 := v.Args[0] 36086 if s1.Op != OpS390XSLWconst { 36087 break 36088 } 36089 j1 := s1.AuxInt 36090 x1 := s1.Args[0] 36091 if x1.Op != OpS390XMOVBZloadidx { 36092 break 36093 } 36094 i1 := x1.AuxInt 36095 s := x1.Aux 36096 _ = x1.Args[2] 36097 p := x1.Args[0] 36098 idx := x1.Args[1] 36099 mem := x1.Args[2] 36100 or := v.Args[1] 36101 if or.Op != OpS390XORW { 36102 break 36103 } 36104 _ = or.Args[1] 36105 y := or.Args[0] 36106 s0 := or.Args[1] 36107 if s0.Op != OpS390XSLWconst { 36108 break 36109 } 36110 j0 := s0.AuxInt 36111 x0 := s0.Args[0] 36112 if x0.Op != OpS390XMOVBZloadidx { 36113 break 36114 } 36115 i0 := x0.AuxInt 36116 if x0.Aux != s { 36117 break 36118 } 36119 _ = x0.Args[2] 36120 if idx != x0.Args[0] { 36121 break 36122 } 36123 if p != x0.Args[1] { 36124 break 36125 } 36126 if mem != x0.Args[2] { 36127 break 36128 } 36129 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)) { 36130 break 36131 } 36132 b = mergePoint(b, x0, x1) 36133 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36134 v.reset(OpCopy) 36135 v.AddArg(v0) 36136 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36137 v1.AuxInt = j0 36138 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36139 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36140 v3.AuxInt = i0 36141 v3.Aux = s 36142 v3.AddArg(p) 36143 v3.AddArg(idx) 36144 v3.AddArg(mem) 36145 v2.AddArg(v3) 36146 v1.AddArg(v2) 36147 v0.AddArg(v1) 36148 v0.AddArg(y) 36149 return true 36150 } 36151 // 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)))) 36152 // 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) 36153 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36154 for { 36155 _ = v.Args[1] 36156 s1 := v.Args[0] 36157 if s1.Op != OpS390XSLWconst { 36158 break 36159 } 36160 j1 := s1.AuxInt 36161 x1 := s1.Args[0] 36162 if x1.Op != OpS390XMOVBZloadidx { 36163 break 36164 } 36165 i1 := x1.AuxInt 36166 s := x1.Aux 36167 _ = x1.Args[2] 36168 idx := x1.Args[0] 36169 p := x1.Args[1] 36170 mem := x1.Args[2] 36171 or := v.Args[1] 36172 if or.Op != OpS390XORW { 36173 break 36174 } 36175 _ = or.Args[1] 36176 y := or.Args[0] 36177 s0 := or.Args[1] 36178 if s0.Op != OpS390XSLWconst { 36179 break 36180 } 36181 j0 := s0.AuxInt 36182 x0 := s0.Args[0] 36183 if x0.Op != OpS390XMOVBZloadidx { 36184 break 36185 } 36186 i0 := x0.AuxInt 36187 if x0.Aux != s { 36188 break 36189 } 36190 _ = x0.Args[2] 36191 if idx != x0.Args[0] { 36192 break 36193 } 36194 if p != x0.Args[1] { 36195 break 36196 } 36197 if mem != x0.Args[2] { 36198 break 36199 } 36200 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)) { 36201 break 36202 } 36203 b = mergePoint(b, x0, x1) 36204 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36205 v.reset(OpCopy) 36206 v.AddArg(v0) 36207 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36208 v1.AuxInt = j0 36209 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36210 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36211 v3.AuxInt = i0 36212 v3.Aux = s 36213 v3.AddArg(p) 36214 v3.AddArg(idx) 36215 v3.AddArg(mem) 36216 v2.AddArg(v3) 36217 v1.AddArg(v2) 36218 v0.AddArg(v1) 36219 v0.AddArg(y) 36220 return true 36221 } 36222 // 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))) 36223 // 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) 36224 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36225 for { 36226 _ = v.Args[1] 36227 or := v.Args[0] 36228 if or.Op != OpS390XORW { 36229 break 36230 } 36231 _ = or.Args[1] 36232 s0 := or.Args[0] 36233 if s0.Op != OpS390XSLWconst { 36234 break 36235 } 36236 j0 := s0.AuxInt 36237 x0 := s0.Args[0] 36238 if x0.Op != OpS390XMOVBZloadidx { 36239 break 36240 } 36241 i0 := x0.AuxInt 36242 s := x0.Aux 36243 _ = x0.Args[2] 36244 p := x0.Args[0] 36245 idx := x0.Args[1] 36246 mem := x0.Args[2] 36247 y := or.Args[1] 36248 s1 := v.Args[1] 36249 if s1.Op != OpS390XSLWconst { 36250 break 36251 } 36252 j1 := s1.AuxInt 36253 x1 := s1.Args[0] 36254 if x1.Op != OpS390XMOVBZloadidx { 36255 break 36256 } 36257 i1 := x1.AuxInt 36258 if x1.Aux != s { 36259 break 36260 } 36261 _ = x1.Args[2] 36262 if p != x1.Args[0] { 36263 break 36264 } 36265 if idx != x1.Args[1] { 36266 break 36267 } 36268 if mem != x1.Args[2] { 36269 break 36270 } 36271 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)) { 36272 break 36273 } 36274 b = mergePoint(b, x0, x1) 36275 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36276 v.reset(OpCopy) 36277 v.AddArg(v0) 36278 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36279 v1.AuxInt = j0 36280 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36281 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36282 v3.AuxInt = i0 36283 v3.Aux = s 36284 v3.AddArg(p) 36285 v3.AddArg(idx) 36286 v3.AddArg(mem) 36287 v2.AddArg(v3) 36288 v1.AddArg(v2) 36289 v0.AddArg(v1) 36290 v0.AddArg(y) 36291 return true 36292 } 36293 // 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))) 36294 // 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) 36295 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36296 for { 36297 _ = v.Args[1] 36298 or := v.Args[0] 36299 if or.Op != OpS390XORW { 36300 break 36301 } 36302 _ = or.Args[1] 36303 s0 := or.Args[0] 36304 if s0.Op != OpS390XSLWconst { 36305 break 36306 } 36307 j0 := s0.AuxInt 36308 x0 := s0.Args[0] 36309 if x0.Op != OpS390XMOVBZloadidx { 36310 break 36311 } 36312 i0 := x0.AuxInt 36313 s := x0.Aux 36314 _ = x0.Args[2] 36315 idx := x0.Args[0] 36316 p := x0.Args[1] 36317 mem := x0.Args[2] 36318 y := or.Args[1] 36319 s1 := v.Args[1] 36320 if s1.Op != OpS390XSLWconst { 36321 break 36322 } 36323 j1 := s1.AuxInt 36324 x1 := s1.Args[0] 36325 if x1.Op != OpS390XMOVBZloadidx { 36326 break 36327 } 36328 i1 := x1.AuxInt 36329 if x1.Aux != s { 36330 break 36331 } 36332 _ = x1.Args[2] 36333 if p != x1.Args[0] { 36334 break 36335 } 36336 if idx != x1.Args[1] { 36337 break 36338 } 36339 if mem != x1.Args[2] { 36340 break 36341 } 36342 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)) { 36343 break 36344 } 36345 b = mergePoint(b, x0, x1) 36346 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36347 v.reset(OpCopy) 36348 v.AddArg(v0) 36349 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36350 v1.AuxInt = j0 36351 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36352 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36353 v3.AuxInt = i0 36354 v3.Aux = s 36355 v3.AddArg(p) 36356 v3.AddArg(idx) 36357 v3.AddArg(mem) 36358 v2.AddArg(v3) 36359 v1.AddArg(v2) 36360 v0.AddArg(v1) 36361 v0.AddArg(y) 36362 return true 36363 } 36364 // 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))) 36365 // 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) 36366 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36367 for { 36368 _ = v.Args[1] 36369 or := v.Args[0] 36370 if or.Op != OpS390XORW { 36371 break 36372 } 36373 _ = or.Args[1] 36374 y := or.Args[0] 36375 s0 := or.Args[1] 36376 if s0.Op != OpS390XSLWconst { 36377 break 36378 } 36379 j0 := s0.AuxInt 36380 x0 := s0.Args[0] 36381 if x0.Op != OpS390XMOVBZloadidx { 36382 break 36383 } 36384 i0 := x0.AuxInt 36385 s := x0.Aux 36386 _ = x0.Args[2] 36387 p := x0.Args[0] 36388 idx := x0.Args[1] 36389 mem := x0.Args[2] 36390 s1 := v.Args[1] 36391 if s1.Op != OpS390XSLWconst { 36392 break 36393 } 36394 j1 := s1.AuxInt 36395 x1 := s1.Args[0] 36396 if x1.Op != OpS390XMOVBZloadidx { 36397 break 36398 } 36399 i1 := x1.AuxInt 36400 if x1.Aux != s { 36401 break 36402 } 36403 _ = x1.Args[2] 36404 if p != x1.Args[0] { 36405 break 36406 } 36407 if idx != x1.Args[1] { 36408 break 36409 } 36410 if mem != x1.Args[2] { 36411 break 36412 } 36413 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)) { 36414 break 36415 } 36416 b = mergePoint(b, x0, x1) 36417 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36418 v.reset(OpCopy) 36419 v.AddArg(v0) 36420 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36421 v1.AuxInt = j0 36422 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36423 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36424 v3.AuxInt = i0 36425 v3.Aux = s 36426 v3.AddArg(p) 36427 v3.AddArg(idx) 36428 v3.AddArg(mem) 36429 v2.AddArg(v3) 36430 v1.AddArg(v2) 36431 v0.AddArg(v1) 36432 v0.AddArg(y) 36433 return true 36434 } 36435 // 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))) 36436 // 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) 36437 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36438 for { 36439 _ = v.Args[1] 36440 or := v.Args[0] 36441 if or.Op != OpS390XORW { 36442 break 36443 } 36444 _ = or.Args[1] 36445 y := or.Args[0] 36446 s0 := or.Args[1] 36447 if s0.Op != OpS390XSLWconst { 36448 break 36449 } 36450 j0 := s0.AuxInt 36451 x0 := s0.Args[0] 36452 if x0.Op != OpS390XMOVBZloadidx { 36453 break 36454 } 36455 i0 := x0.AuxInt 36456 s := x0.Aux 36457 _ = x0.Args[2] 36458 idx := x0.Args[0] 36459 p := x0.Args[1] 36460 mem := x0.Args[2] 36461 s1 := v.Args[1] 36462 if s1.Op != OpS390XSLWconst { 36463 break 36464 } 36465 j1 := s1.AuxInt 36466 x1 := s1.Args[0] 36467 if x1.Op != OpS390XMOVBZloadidx { 36468 break 36469 } 36470 i1 := x1.AuxInt 36471 if x1.Aux != s { 36472 break 36473 } 36474 _ = x1.Args[2] 36475 if p != x1.Args[0] { 36476 break 36477 } 36478 if idx != x1.Args[1] { 36479 break 36480 } 36481 if mem != x1.Args[2] { 36482 break 36483 } 36484 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)) { 36485 break 36486 } 36487 b = mergePoint(b, x0, x1) 36488 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36489 v.reset(OpCopy) 36490 v.AddArg(v0) 36491 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36492 v1.AuxInt = j0 36493 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36494 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36495 v3.AuxInt = i0 36496 v3.Aux = s 36497 v3.AddArg(p) 36498 v3.AddArg(idx) 36499 v3.AddArg(mem) 36500 v2.AddArg(v3) 36501 v1.AddArg(v2) 36502 v0.AddArg(v1) 36503 v0.AddArg(y) 36504 return true 36505 } 36506 // 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))) 36507 // 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) 36508 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36509 for { 36510 _ = v.Args[1] 36511 or := v.Args[0] 36512 if or.Op != OpS390XORW { 36513 break 36514 } 36515 _ = or.Args[1] 36516 s0 := or.Args[0] 36517 if s0.Op != OpS390XSLWconst { 36518 break 36519 } 36520 j0 := s0.AuxInt 36521 x0 := s0.Args[0] 36522 if x0.Op != OpS390XMOVBZloadidx { 36523 break 36524 } 36525 i0 := x0.AuxInt 36526 s := x0.Aux 36527 _ = x0.Args[2] 36528 p := x0.Args[0] 36529 idx := x0.Args[1] 36530 mem := x0.Args[2] 36531 y := or.Args[1] 36532 s1 := v.Args[1] 36533 if s1.Op != OpS390XSLWconst { 36534 break 36535 } 36536 j1 := s1.AuxInt 36537 x1 := s1.Args[0] 36538 if x1.Op != OpS390XMOVBZloadidx { 36539 break 36540 } 36541 i1 := x1.AuxInt 36542 if x1.Aux != s { 36543 break 36544 } 36545 _ = x1.Args[2] 36546 if idx != x1.Args[0] { 36547 break 36548 } 36549 if p != x1.Args[1] { 36550 break 36551 } 36552 if mem != x1.Args[2] { 36553 break 36554 } 36555 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)) { 36556 break 36557 } 36558 b = mergePoint(b, x0, x1) 36559 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36560 v.reset(OpCopy) 36561 v.AddArg(v0) 36562 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36563 v1.AuxInt = j0 36564 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36565 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36566 v3.AuxInt = i0 36567 v3.Aux = s 36568 v3.AddArg(p) 36569 v3.AddArg(idx) 36570 v3.AddArg(mem) 36571 v2.AddArg(v3) 36572 v1.AddArg(v2) 36573 v0.AddArg(v1) 36574 v0.AddArg(y) 36575 return true 36576 } 36577 return false 36578 } 36579 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 36580 b := v.Block 36581 _ = b 36582 typ := &b.Func.Config.Types 36583 _ = typ 36584 // 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))) 36585 // 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) 36586 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36587 for { 36588 _ = v.Args[1] 36589 or := v.Args[0] 36590 if or.Op != OpS390XORW { 36591 break 36592 } 36593 _ = or.Args[1] 36594 s0 := or.Args[0] 36595 if s0.Op != OpS390XSLWconst { 36596 break 36597 } 36598 j0 := s0.AuxInt 36599 x0 := s0.Args[0] 36600 if x0.Op != OpS390XMOVBZloadidx { 36601 break 36602 } 36603 i0 := x0.AuxInt 36604 s := x0.Aux 36605 _ = x0.Args[2] 36606 idx := x0.Args[0] 36607 p := x0.Args[1] 36608 mem := x0.Args[2] 36609 y := or.Args[1] 36610 s1 := v.Args[1] 36611 if s1.Op != OpS390XSLWconst { 36612 break 36613 } 36614 j1 := s1.AuxInt 36615 x1 := s1.Args[0] 36616 if x1.Op != OpS390XMOVBZloadidx { 36617 break 36618 } 36619 i1 := x1.AuxInt 36620 if x1.Aux != s { 36621 break 36622 } 36623 _ = x1.Args[2] 36624 if idx != x1.Args[0] { 36625 break 36626 } 36627 if p != x1.Args[1] { 36628 break 36629 } 36630 if mem != x1.Args[2] { 36631 break 36632 } 36633 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)) { 36634 break 36635 } 36636 b = mergePoint(b, x0, x1) 36637 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36638 v.reset(OpCopy) 36639 v.AddArg(v0) 36640 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36641 v1.AuxInt = j0 36642 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36643 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36644 v3.AuxInt = i0 36645 v3.Aux = s 36646 v3.AddArg(p) 36647 v3.AddArg(idx) 36648 v3.AddArg(mem) 36649 v2.AddArg(v3) 36650 v1.AddArg(v2) 36651 v0.AddArg(v1) 36652 v0.AddArg(y) 36653 return true 36654 } 36655 // 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))) 36656 // 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) 36657 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36658 for { 36659 _ = v.Args[1] 36660 or := v.Args[0] 36661 if or.Op != OpS390XORW { 36662 break 36663 } 36664 _ = or.Args[1] 36665 y := or.Args[0] 36666 s0 := or.Args[1] 36667 if s0.Op != OpS390XSLWconst { 36668 break 36669 } 36670 j0 := s0.AuxInt 36671 x0 := s0.Args[0] 36672 if x0.Op != OpS390XMOVBZloadidx { 36673 break 36674 } 36675 i0 := x0.AuxInt 36676 s := x0.Aux 36677 _ = x0.Args[2] 36678 p := x0.Args[0] 36679 idx := x0.Args[1] 36680 mem := x0.Args[2] 36681 s1 := v.Args[1] 36682 if s1.Op != OpS390XSLWconst { 36683 break 36684 } 36685 j1 := s1.AuxInt 36686 x1 := s1.Args[0] 36687 if x1.Op != OpS390XMOVBZloadidx { 36688 break 36689 } 36690 i1 := x1.AuxInt 36691 if x1.Aux != s { 36692 break 36693 } 36694 _ = x1.Args[2] 36695 if idx != x1.Args[0] { 36696 break 36697 } 36698 if p != x1.Args[1] { 36699 break 36700 } 36701 if mem != x1.Args[2] { 36702 break 36703 } 36704 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)) { 36705 break 36706 } 36707 b = mergePoint(b, x0, x1) 36708 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36709 v.reset(OpCopy) 36710 v.AddArg(v0) 36711 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36712 v1.AuxInt = j0 36713 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36714 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36715 v3.AuxInt = i0 36716 v3.Aux = s 36717 v3.AddArg(p) 36718 v3.AddArg(idx) 36719 v3.AddArg(mem) 36720 v2.AddArg(v3) 36721 v1.AddArg(v2) 36722 v0.AddArg(v1) 36723 v0.AddArg(y) 36724 return true 36725 } 36726 // 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))) 36727 // 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) 36728 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 36729 for { 36730 _ = v.Args[1] 36731 or := v.Args[0] 36732 if or.Op != OpS390XORW { 36733 break 36734 } 36735 _ = or.Args[1] 36736 y := or.Args[0] 36737 s0 := or.Args[1] 36738 if s0.Op != OpS390XSLWconst { 36739 break 36740 } 36741 j0 := s0.AuxInt 36742 x0 := s0.Args[0] 36743 if x0.Op != OpS390XMOVBZloadidx { 36744 break 36745 } 36746 i0 := x0.AuxInt 36747 s := x0.Aux 36748 _ = x0.Args[2] 36749 idx := x0.Args[0] 36750 p := x0.Args[1] 36751 mem := x0.Args[2] 36752 s1 := v.Args[1] 36753 if s1.Op != OpS390XSLWconst { 36754 break 36755 } 36756 j1 := s1.AuxInt 36757 x1 := s1.Args[0] 36758 if x1.Op != OpS390XMOVBZloadidx { 36759 break 36760 } 36761 i1 := x1.AuxInt 36762 if x1.Aux != s { 36763 break 36764 } 36765 _ = x1.Args[2] 36766 if idx != x1.Args[0] { 36767 break 36768 } 36769 if p != x1.Args[1] { 36770 break 36771 } 36772 if mem != x1.Args[2] { 36773 break 36774 } 36775 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)) { 36776 break 36777 } 36778 b = mergePoint(b, x0, x1) 36779 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 36780 v.reset(OpCopy) 36781 v.AddArg(v0) 36782 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 36783 v1.AuxInt = j0 36784 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 36785 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 36786 v3.AuxInt = i0 36787 v3.Aux = s 36788 v3.AddArg(p) 36789 v3.AddArg(idx) 36790 v3.AddArg(mem) 36791 v2.AddArg(v3) 36792 v1.AddArg(v2) 36793 v0.AddArg(v1) 36794 v0.AddArg(y) 36795 return true 36796 } 36797 return false 36798 } 36799 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 36800 // match: (ORWconst [c] x) 36801 // cond: int32(c)==0 36802 // result: x 36803 for { 36804 c := v.AuxInt 36805 x := v.Args[0] 36806 if !(int32(c) == 0) { 36807 break 36808 } 36809 v.reset(OpCopy) 36810 v.Type = x.Type 36811 v.AddArg(x) 36812 return true 36813 } 36814 // match: (ORWconst [c] _) 36815 // cond: int32(c)==-1 36816 // result: (MOVDconst [-1]) 36817 for { 36818 c := v.AuxInt 36819 if !(int32(c) == -1) { 36820 break 36821 } 36822 v.reset(OpS390XMOVDconst) 36823 v.AuxInt = -1 36824 return true 36825 } 36826 // match: (ORWconst [c] (MOVDconst [d])) 36827 // cond: 36828 // result: (MOVDconst [c|d]) 36829 for { 36830 c := v.AuxInt 36831 v_0 := v.Args[0] 36832 if v_0.Op != OpS390XMOVDconst { 36833 break 36834 } 36835 d := v_0.AuxInt 36836 v.reset(OpS390XMOVDconst) 36837 v.AuxInt = c | d 36838 return true 36839 } 36840 return false 36841 } 36842 func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { 36843 // match: (ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 36844 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 36845 // result: (ORWload [off1+off2] {sym} x ptr mem) 36846 for { 36847 off1 := v.AuxInt 36848 sym := v.Aux 36849 _ = v.Args[2] 36850 x := v.Args[0] 36851 v_1 := v.Args[1] 36852 if v_1.Op != OpS390XADDconst { 36853 break 36854 } 36855 off2 := v_1.AuxInt 36856 ptr := v_1.Args[0] 36857 mem := v.Args[2] 36858 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 36859 break 36860 } 36861 v.reset(OpS390XORWload) 36862 v.AuxInt = off1 + off2 36863 v.Aux = sym 36864 v.AddArg(x) 36865 v.AddArg(ptr) 36866 v.AddArg(mem) 36867 return true 36868 } 36869 // match: (ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 36870 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 36871 // result: (ORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 36872 for { 36873 o1 := v.AuxInt 36874 s1 := v.Aux 36875 _ = v.Args[2] 36876 x := v.Args[0] 36877 v_1 := v.Args[1] 36878 if v_1.Op != OpS390XMOVDaddr { 36879 break 36880 } 36881 o2 := v_1.AuxInt 36882 s2 := v_1.Aux 36883 ptr := v_1.Args[0] 36884 mem := v.Args[2] 36885 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 36886 break 36887 } 36888 v.reset(OpS390XORWload) 36889 v.AuxInt = o1 + o2 36890 v.Aux = mergeSym(s1, s2) 36891 v.AddArg(x) 36892 v.AddArg(ptr) 36893 v.AddArg(mem) 36894 return true 36895 } 36896 return false 36897 } 36898 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 36899 // match: (ORconst [0] x) 36900 // cond: 36901 // result: x 36902 for { 36903 if v.AuxInt != 0 { 36904 break 36905 } 36906 x := v.Args[0] 36907 v.reset(OpCopy) 36908 v.Type = x.Type 36909 v.AddArg(x) 36910 return true 36911 } 36912 // match: (ORconst [-1] _) 36913 // cond: 36914 // result: (MOVDconst [-1]) 36915 for { 36916 if v.AuxInt != -1 { 36917 break 36918 } 36919 v.reset(OpS390XMOVDconst) 36920 v.AuxInt = -1 36921 return true 36922 } 36923 // match: (ORconst [c] (MOVDconst [d])) 36924 // cond: 36925 // result: (MOVDconst [c|d]) 36926 for { 36927 c := v.AuxInt 36928 v_0 := v.Args[0] 36929 if v_0.Op != OpS390XMOVDconst { 36930 break 36931 } 36932 d := v_0.AuxInt 36933 v.reset(OpS390XMOVDconst) 36934 v.AuxInt = c | d 36935 return true 36936 } 36937 return false 36938 } 36939 func rewriteValueS390X_OpS390XORload_0(v *Value) bool { 36940 b := v.Block 36941 _ = b 36942 // match: (ORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 36943 // cond: isSamePtr(ptr1, ptr2) 36944 // result: (OR x (LGDR <t> y)) 36945 for { 36946 t := v.Type 36947 off := v.AuxInt 36948 sym := v.Aux 36949 _ = v.Args[2] 36950 x := v.Args[0] 36951 ptr1 := v.Args[1] 36952 v_2 := v.Args[2] 36953 if v_2.Op != OpS390XFMOVDstore { 36954 break 36955 } 36956 if v_2.AuxInt != off { 36957 break 36958 } 36959 if v_2.Aux != sym { 36960 break 36961 } 36962 _ = v_2.Args[2] 36963 ptr2 := v_2.Args[0] 36964 y := v_2.Args[1] 36965 if !(isSamePtr(ptr1, ptr2)) { 36966 break 36967 } 36968 v.reset(OpS390XOR) 36969 v.AddArg(x) 36970 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 36971 v0.AddArg(y) 36972 v.AddArg(v0) 36973 return true 36974 } 36975 // match: (ORload [off1] {sym} x (ADDconst [off2] ptr) mem) 36976 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 36977 // result: (ORload [off1+off2] {sym} x ptr mem) 36978 for { 36979 off1 := v.AuxInt 36980 sym := v.Aux 36981 _ = v.Args[2] 36982 x := v.Args[0] 36983 v_1 := v.Args[1] 36984 if v_1.Op != OpS390XADDconst { 36985 break 36986 } 36987 off2 := v_1.AuxInt 36988 ptr := v_1.Args[0] 36989 mem := v.Args[2] 36990 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 36991 break 36992 } 36993 v.reset(OpS390XORload) 36994 v.AuxInt = off1 + off2 36995 v.Aux = sym 36996 v.AddArg(x) 36997 v.AddArg(ptr) 36998 v.AddArg(mem) 36999 return true 37000 } 37001 // match: (ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 37002 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 37003 // result: (ORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 37004 for { 37005 o1 := v.AuxInt 37006 s1 := v.Aux 37007 _ = v.Args[2] 37008 x := v.Args[0] 37009 v_1 := v.Args[1] 37010 if v_1.Op != OpS390XMOVDaddr { 37011 break 37012 } 37013 o2 := v_1.AuxInt 37014 s2 := v_1.Aux 37015 ptr := v_1.Args[0] 37016 mem := v.Args[2] 37017 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 37018 break 37019 } 37020 v.reset(OpS390XORload) 37021 v.AuxInt = o1 + o2 37022 v.Aux = mergeSym(s1, s2) 37023 v.AddArg(x) 37024 v.AddArg(ptr) 37025 v.AddArg(mem) 37026 return true 37027 } 37028 return false 37029 } 37030 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 37031 // match: (SLD x (MOVDconst [c])) 37032 // cond: 37033 // result: (SLDconst [c&63] x) 37034 for { 37035 _ = v.Args[1] 37036 x := v.Args[0] 37037 v_1 := v.Args[1] 37038 if v_1.Op != OpS390XMOVDconst { 37039 break 37040 } 37041 c := v_1.AuxInt 37042 v.reset(OpS390XSLDconst) 37043 v.AuxInt = c & 63 37044 v.AddArg(x) 37045 return true 37046 } 37047 // match: (SLD x (ANDconst [63] y)) 37048 // cond: 37049 // result: (SLD x y) 37050 for { 37051 _ = v.Args[1] 37052 x := v.Args[0] 37053 v_1 := v.Args[1] 37054 if v_1.Op != OpS390XANDconst { 37055 break 37056 } 37057 if v_1.AuxInt != 63 { 37058 break 37059 } 37060 y := v_1.Args[0] 37061 v.reset(OpS390XSLD) 37062 v.AddArg(x) 37063 v.AddArg(y) 37064 return true 37065 } 37066 return false 37067 } 37068 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 37069 // match: (SLW x (MOVDconst [c])) 37070 // cond: 37071 // result: (SLWconst [c&63] x) 37072 for { 37073 _ = v.Args[1] 37074 x := v.Args[0] 37075 v_1 := v.Args[1] 37076 if v_1.Op != OpS390XMOVDconst { 37077 break 37078 } 37079 c := v_1.AuxInt 37080 v.reset(OpS390XSLWconst) 37081 v.AuxInt = c & 63 37082 v.AddArg(x) 37083 return true 37084 } 37085 // match: (SLW x (ANDWconst [63] y)) 37086 // cond: 37087 // result: (SLW x y) 37088 for { 37089 _ = v.Args[1] 37090 x := v.Args[0] 37091 v_1 := v.Args[1] 37092 if v_1.Op != OpS390XANDWconst { 37093 break 37094 } 37095 if v_1.AuxInt != 63 { 37096 break 37097 } 37098 y := v_1.Args[0] 37099 v.reset(OpS390XSLW) 37100 v.AddArg(x) 37101 v.AddArg(y) 37102 return true 37103 } 37104 return false 37105 } 37106 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 37107 // match: (SRAD x (MOVDconst [c])) 37108 // cond: 37109 // result: (SRADconst [c&63] x) 37110 for { 37111 _ = v.Args[1] 37112 x := v.Args[0] 37113 v_1 := v.Args[1] 37114 if v_1.Op != OpS390XMOVDconst { 37115 break 37116 } 37117 c := v_1.AuxInt 37118 v.reset(OpS390XSRADconst) 37119 v.AuxInt = c & 63 37120 v.AddArg(x) 37121 return true 37122 } 37123 // match: (SRAD x (ANDconst [63] y)) 37124 // cond: 37125 // result: (SRAD x y) 37126 for { 37127 _ = v.Args[1] 37128 x := v.Args[0] 37129 v_1 := v.Args[1] 37130 if v_1.Op != OpS390XANDconst { 37131 break 37132 } 37133 if v_1.AuxInt != 63 { 37134 break 37135 } 37136 y := v_1.Args[0] 37137 v.reset(OpS390XSRAD) 37138 v.AddArg(x) 37139 v.AddArg(y) 37140 return true 37141 } 37142 return false 37143 } 37144 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 37145 // match: (SRADconst [c] (MOVDconst [d])) 37146 // cond: 37147 // result: (MOVDconst [d>>uint64(c)]) 37148 for { 37149 c := v.AuxInt 37150 v_0 := v.Args[0] 37151 if v_0.Op != OpS390XMOVDconst { 37152 break 37153 } 37154 d := v_0.AuxInt 37155 v.reset(OpS390XMOVDconst) 37156 v.AuxInt = d >> uint64(c) 37157 return true 37158 } 37159 return false 37160 } 37161 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 37162 // match: (SRAW x (MOVDconst [c])) 37163 // cond: 37164 // result: (SRAWconst [c&63] x) 37165 for { 37166 _ = v.Args[1] 37167 x := v.Args[0] 37168 v_1 := v.Args[1] 37169 if v_1.Op != OpS390XMOVDconst { 37170 break 37171 } 37172 c := v_1.AuxInt 37173 v.reset(OpS390XSRAWconst) 37174 v.AuxInt = c & 63 37175 v.AddArg(x) 37176 return true 37177 } 37178 // match: (SRAW x (ANDWconst [63] y)) 37179 // cond: 37180 // result: (SRAW x y) 37181 for { 37182 _ = v.Args[1] 37183 x := v.Args[0] 37184 v_1 := v.Args[1] 37185 if v_1.Op != OpS390XANDWconst { 37186 break 37187 } 37188 if v_1.AuxInt != 63 { 37189 break 37190 } 37191 y := v_1.Args[0] 37192 v.reset(OpS390XSRAW) 37193 v.AddArg(x) 37194 v.AddArg(y) 37195 return true 37196 } 37197 return false 37198 } 37199 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 37200 // match: (SRAWconst [c] (MOVDconst [d])) 37201 // cond: 37202 // result: (MOVDconst [int64(int32(d))>>uint64(c)]) 37203 for { 37204 c := v.AuxInt 37205 v_0 := v.Args[0] 37206 if v_0.Op != OpS390XMOVDconst { 37207 break 37208 } 37209 d := v_0.AuxInt 37210 v.reset(OpS390XMOVDconst) 37211 v.AuxInt = int64(int32(d)) >> uint64(c) 37212 return true 37213 } 37214 return false 37215 } 37216 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 37217 // match: (SRD x (MOVDconst [c])) 37218 // cond: 37219 // result: (SRDconst [c&63] x) 37220 for { 37221 _ = v.Args[1] 37222 x := v.Args[0] 37223 v_1 := v.Args[1] 37224 if v_1.Op != OpS390XMOVDconst { 37225 break 37226 } 37227 c := v_1.AuxInt 37228 v.reset(OpS390XSRDconst) 37229 v.AuxInt = c & 63 37230 v.AddArg(x) 37231 return true 37232 } 37233 // match: (SRD x (ANDconst [63] y)) 37234 // cond: 37235 // result: (SRD x y) 37236 for { 37237 _ = v.Args[1] 37238 x := v.Args[0] 37239 v_1 := v.Args[1] 37240 if v_1.Op != OpS390XANDconst { 37241 break 37242 } 37243 if v_1.AuxInt != 63 { 37244 break 37245 } 37246 y := v_1.Args[0] 37247 v.reset(OpS390XSRD) 37248 v.AddArg(x) 37249 v.AddArg(y) 37250 return true 37251 } 37252 return false 37253 } 37254 func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool { 37255 b := v.Block 37256 _ = b 37257 // match: (SRDconst [1] (SLDconst [1] (LGDR <t> x))) 37258 // cond: 37259 // result: (LGDR <t> (LPDFR <x.Type> x)) 37260 for { 37261 if v.AuxInt != 1 { 37262 break 37263 } 37264 v_0 := v.Args[0] 37265 if v_0.Op != OpS390XSLDconst { 37266 break 37267 } 37268 if v_0.AuxInt != 1 { 37269 break 37270 } 37271 v_0_0 := v_0.Args[0] 37272 if v_0_0.Op != OpS390XLGDR { 37273 break 37274 } 37275 t := v_0_0.Type 37276 x := v_0_0.Args[0] 37277 v.reset(OpS390XLGDR) 37278 v.Type = t 37279 v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) 37280 v0.AddArg(x) 37281 v.AddArg(v0) 37282 return true 37283 } 37284 return false 37285 } 37286 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 37287 // match: (SRW x (MOVDconst [c])) 37288 // cond: 37289 // result: (SRWconst [c&63] x) 37290 for { 37291 _ = v.Args[1] 37292 x := v.Args[0] 37293 v_1 := v.Args[1] 37294 if v_1.Op != OpS390XMOVDconst { 37295 break 37296 } 37297 c := v_1.AuxInt 37298 v.reset(OpS390XSRWconst) 37299 v.AuxInt = c & 63 37300 v.AddArg(x) 37301 return true 37302 } 37303 // match: (SRW x (ANDWconst [63] y)) 37304 // cond: 37305 // result: (SRW x y) 37306 for { 37307 _ = v.Args[1] 37308 x := v.Args[0] 37309 v_1 := v.Args[1] 37310 if v_1.Op != OpS390XANDWconst { 37311 break 37312 } 37313 if v_1.AuxInt != 63 { 37314 break 37315 } 37316 y := v_1.Args[0] 37317 v.reset(OpS390XSRW) 37318 v.AddArg(x) 37319 v.AddArg(y) 37320 return true 37321 } 37322 return false 37323 } 37324 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 37325 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 37326 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 37327 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 37328 for { 37329 i := v.AuxInt 37330 s := v.Aux 37331 _ = v.Args[3] 37332 p := v.Args[0] 37333 w2 := v.Args[1] 37334 w3 := v.Args[2] 37335 x := v.Args[3] 37336 if x.Op != OpS390XSTM2 { 37337 break 37338 } 37339 if x.AuxInt != i-8 { 37340 break 37341 } 37342 if x.Aux != s { 37343 break 37344 } 37345 _ = x.Args[3] 37346 if p != x.Args[0] { 37347 break 37348 } 37349 w0 := x.Args[1] 37350 w1 := x.Args[2] 37351 mem := x.Args[3] 37352 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 37353 break 37354 } 37355 v.reset(OpS390XSTM4) 37356 v.AuxInt = i - 8 37357 v.Aux = s 37358 v.AddArg(p) 37359 v.AddArg(w0) 37360 v.AddArg(w1) 37361 v.AddArg(w2) 37362 v.AddArg(w3) 37363 v.AddArg(mem) 37364 return true 37365 } 37366 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 37367 // cond: 37368 // result: (MOVDstore [i] {s} p x mem) 37369 for { 37370 i := v.AuxInt 37371 s := v.Aux 37372 _ = v.Args[3] 37373 p := v.Args[0] 37374 v_1 := v.Args[1] 37375 if v_1.Op != OpS390XSRDconst { 37376 break 37377 } 37378 if v_1.AuxInt != 32 { 37379 break 37380 } 37381 x := v_1.Args[0] 37382 if x != v.Args[2] { 37383 break 37384 } 37385 mem := v.Args[3] 37386 v.reset(OpS390XMOVDstore) 37387 v.AuxInt = i 37388 v.Aux = s 37389 v.AddArg(p) 37390 v.AddArg(x) 37391 v.AddArg(mem) 37392 return true 37393 } 37394 return false 37395 } 37396 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 37397 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 37398 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 37399 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 37400 for { 37401 i := v.AuxInt 37402 s := v.Aux 37403 _ = v.Args[3] 37404 p := v.Args[0] 37405 w2 := v.Args[1] 37406 w3 := v.Args[2] 37407 x := v.Args[3] 37408 if x.Op != OpS390XSTMG2 { 37409 break 37410 } 37411 if x.AuxInt != i-16 { 37412 break 37413 } 37414 if x.Aux != s { 37415 break 37416 } 37417 _ = x.Args[3] 37418 if p != x.Args[0] { 37419 break 37420 } 37421 w0 := x.Args[1] 37422 w1 := x.Args[2] 37423 mem := x.Args[3] 37424 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 37425 break 37426 } 37427 v.reset(OpS390XSTMG4) 37428 v.AuxInt = i - 16 37429 v.Aux = s 37430 v.AddArg(p) 37431 v.AddArg(w0) 37432 v.AddArg(w1) 37433 v.AddArg(w2) 37434 v.AddArg(w3) 37435 v.AddArg(mem) 37436 return true 37437 } 37438 return false 37439 } 37440 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 37441 b := v.Block 37442 _ = b 37443 // match: (SUB x (MOVDconst [c])) 37444 // cond: is32Bit(c) 37445 // result: (SUBconst x [c]) 37446 for { 37447 _ = v.Args[1] 37448 x := v.Args[0] 37449 v_1 := v.Args[1] 37450 if v_1.Op != OpS390XMOVDconst { 37451 break 37452 } 37453 c := v_1.AuxInt 37454 if !(is32Bit(c)) { 37455 break 37456 } 37457 v.reset(OpS390XSUBconst) 37458 v.AuxInt = c 37459 v.AddArg(x) 37460 return true 37461 } 37462 // match: (SUB (MOVDconst [c]) x) 37463 // cond: is32Bit(c) 37464 // result: (NEG (SUBconst <v.Type> x [c])) 37465 for { 37466 _ = v.Args[1] 37467 v_0 := v.Args[0] 37468 if v_0.Op != OpS390XMOVDconst { 37469 break 37470 } 37471 c := v_0.AuxInt 37472 x := v.Args[1] 37473 if !(is32Bit(c)) { 37474 break 37475 } 37476 v.reset(OpS390XNEG) 37477 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 37478 v0.AuxInt = c 37479 v0.AddArg(x) 37480 v.AddArg(v0) 37481 return true 37482 } 37483 // match: (SUB x x) 37484 // cond: 37485 // result: (MOVDconst [0]) 37486 for { 37487 _ = v.Args[1] 37488 x := v.Args[0] 37489 if x != v.Args[1] { 37490 break 37491 } 37492 v.reset(OpS390XMOVDconst) 37493 v.AuxInt = 0 37494 return true 37495 } 37496 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 37497 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 37498 // result: (SUBload <t> [off] {sym} x ptr mem) 37499 for { 37500 t := v.Type 37501 _ = v.Args[1] 37502 x := v.Args[0] 37503 g := v.Args[1] 37504 if g.Op != OpS390XMOVDload { 37505 break 37506 } 37507 off := g.AuxInt 37508 sym := g.Aux 37509 _ = g.Args[1] 37510 ptr := g.Args[0] 37511 mem := g.Args[1] 37512 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 37513 break 37514 } 37515 v.reset(OpS390XSUBload) 37516 v.Type = t 37517 v.AuxInt = off 37518 v.Aux = sym 37519 v.AddArg(x) 37520 v.AddArg(ptr) 37521 v.AddArg(mem) 37522 return true 37523 } 37524 return false 37525 } 37526 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool { 37527 // match: (SUBEWcarrymask (FlagEQ)) 37528 // cond: 37529 // result: (MOVDconst [-1]) 37530 for { 37531 v_0 := v.Args[0] 37532 if v_0.Op != OpS390XFlagEQ { 37533 break 37534 } 37535 v.reset(OpS390XMOVDconst) 37536 v.AuxInt = -1 37537 return true 37538 } 37539 // match: (SUBEWcarrymask (FlagLT)) 37540 // cond: 37541 // result: (MOVDconst [-1]) 37542 for { 37543 v_0 := v.Args[0] 37544 if v_0.Op != OpS390XFlagLT { 37545 break 37546 } 37547 v.reset(OpS390XMOVDconst) 37548 v.AuxInt = -1 37549 return true 37550 } 37551 // match: (SUBEWcarrymask (FlagGT)) 37552 // cond: 37553 // result: (MOVDconst [0]) 37554 for { 37555 v_0 := v.Args[0] 37556 if v_0.Op != OpS390XFlagGT { 37557 break 37558 } 37559 v.reset(OpS390XMOVDconst) 37560 v.AuxInt = 0 37561 return true 37562 } 37563 return false 37564 } 37565 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool { 37566 // match: (SUBEcarrymask (FlagEQ)) 37567 // cond: 37568 // result: (MOVDconst [-1]) 37569 for { 37570 v_0 := v.Args[0] 37571 if v_0.Op != OpS390XFlagEQ { 37572 break 37573 } 37574 v.reset(OpS390XMOVDconst) 37575 v.AuxInt = -1 37576 return true 37577 } 37578 // match: (SUBEcarrymask (FlagLT)) 37579 // cond: 37580 // result: (MOVDconst [-1]) 37581 for { 37582 v_0 := v.Args[0] 37583 if v_0.Op != OpS390XFlagLT { 37584 break 37585 } 37586 v.reset(OpS390XMOVDconst) 37587 v.AuxInt = -1 37588 return true 37589 } 37590 // match: (SUBEcarrymask (FlagGT)) 37591 // cond: 37592 // result: (MOVDconst [0]) 37593 for { 37594 v_0 := v.Args[0] 37595 if v_0.Op != OpS390XFlagGT { 37596 break 37597 } 37598 v.reset(OpS390XMOVDconst) 37599 v.AuxInt = 0 37600 return true 37601 } 37602 return false 37603 } 37604 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 37605 b := v.Block 37606 _ = b 37607 // match: (SUBW x (MOVDconst [c])) 37608 // cond: 37609 // result: (SUBWconst x [int64(int32(c))]) 37610 for { 37611 _ = v.Args[1] 37612 x := v.Args[0] 37613 v_1 := v.Args[1] 37614 if v_1.Op != OpS390XMOVDconst { 37615 break 37616 } 37617 c := v_1.AuxInt 37618 v.reset(OpS390XSUBWconst) 37619 v.AuxInt = int64(int32(c)) 37620 v.AddArg(x) 37621 return true 37622 } 37623 // match: (SUBW (MOVDconst [c]) x) 37624 // cond: 37625 // result: (NEGW (SUBWconst <v.Type> x [int64(int32(c))])) 37626 for { 37627 _ = v.Args[1] 37628 v_0 := v.Args[0] 37629 if v_0.Op != OpS390XMOVDconst { 37630 break 37631 } 37632 c := v_0.AuxInt 37633 x := v.Args[1] 37634 v.reset(OpS390XNEGW) 37635 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 37636 v0.AuxInt = int64(int32(c)) 37637 v0.AddArg(x) 37638 v.AddArg(v0) 37639 return true 37640 } 37641 // match: (SUBW x x) 37642 // cond: 37643 // result: (MOVDconst [0]) 37644 for { 37645 _ = v.Args[1] 37646 x := v.Args[0] 37647 if x != v.Args[1] { 37648 break 37649 } 37650 v.reset(OpS390XMOVDconst) 37651 v.AuxInt = 0 37652 return true 37653 } 37654 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 37655 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 37656 // result: (SUBWload <t> [off] {sym} x ptr mem) 37657 for { 37658 t := v.Type 37659 _ = v.Args[1] 37660 x := v.Args[0] 37661 g := v.Args[1] 37662 if g.Op != OpS390XMOVWload { 37663 break 37664 } 37665 off := g.AuxInt 37666 sym := g.Aux 37667 _ = g.Args[1] 37668 ptr := g.Args[0] 37669 mem := g.Args[1] 37670 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 37671 break 37672 } 37673 v.reset(OpS390XSUBWload) 37674 v.Type = t 37675 v.AuxInt = off 37676 v.Aux = sym 37677 v.AddArg(x) 37678 v.AddArg(ptr) 37679 v.AddArg(mem) 37680 return true 37681 } 37682 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 37683 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 37684 // result: (SUBWload <t> [off] {sym} x ptr mem) 37685 for { 37686 t := v.Type 37687 _ = v.Args[1] 37688 x := v.Args[0] 37689 g := v.Args[1] 37690 if g.Op != OpS390XMOVWZload { 37691 break 37692 } 37693 off := g.AuxInt 37694 sym := g.Aux 37695 _ = g.Args[1] 37696 ptr := g.Args[0] 37697 mem := g.Args[1] 37698 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 37699 break 37700 } 37701 v.reset(OpS390XSUBWload) 37702 v.Type = t 37703 v.AuxInt = off 37704 v.Aux = sym 37705 v.AddArg(x) 37706 v.AddArg(ptr) 37707 v.AddArg(mem) 37708 return true 37709 } 37710 return false 37711 } 37712 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 37713 // match: (SUBWconst [c] x) 37714 // cond: int32(c) == 0 37715 // result: x 37716 for { 37717 c := v.AuxInt 37718 x := v.Args[0] 37719 if !(int32(c) == 0) { 37720 break 37721 } 37722 v.reset(OpCopy) 37723 v.Type = x.Type 37724 v.AddArg(x) 37725 return true 37726 } 37727 // match: (SUBWconst [c] x) 37728 // cond: 37729 // result: (ADDWconst [int64(int32(-c))] x) 37730 for { 37731 c := v.AuxInt 37732 x := v.Args[0] 37733 v.reset(OpS390XADDWconst) 37734 v.AuxInt = int64(int32(-c)) 37735 v.AddArg(x) 37736 return true 37737 } 37738 } 37739 func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { 37740 // match: (SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) 37741 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 37742 // result: (SUBWload [off1+off2] {sym} x ptr mem) 37743 for { 37744 off1 := v.AuxInt 37745 sym := v.Aux 37746 _ = v.Args[2] 37747 x := v.Args[0] 37748 v_1 := v.Args[1] 37749 if v_1.Op != OpS390XADDconst { 37750 break 37751 } 37752 off2 := v_1.AuxInt 37753 ptr := v_1.Args[0] 37754 mem := v.Args[2] 37755 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 37756 break 37757 } 37758 v.reset(OpS390XSUBWload) 37759 v.AuxInt = off1 + off2 37760 v.Aux = sym 37761 v.AddArg(x) 37762 v.AddArg(ptr) 37763 v.AddArg(mem) 37764 return true 37765 } 37766 // match: (SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 37767 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 37768 // result: (SUBWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 37769 for { 37770 o1 := v.AuxInt 37771 s1 := v.Aux 37772 _ = v.Args[2] 37773 x := v.Args[0] 37774 v_1 := v.Args[1] 37775 if v_1.Op != OpS390XMOVDaddr { 37776 break 37777 } 37778 o2 := v_1.AuxInt 37779 s2 := v_1.Aux 37780 ptr := v_1.Args[0] 37781 mem := v.Args[2] 37782 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 37783 break 37784 } 37785 v.reset(OpS390XSUBWload) 37786 v.AuxInt = o1 + o2 37787 v.Aux = mergeSym(s1, s2) 37788 v.AddArg(x) 37789 v.AddArg(ptr) 37790 v.AddArg(mem) 37791 return true 37792 } 37793 return false 37794 } 37795 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 37796 // match: (SUBconst [0] x) 37797 // cond: 37798 // result: x 37799 for { 37800 if v.AuxInt != 0 { 37801 break 37802 } 37803 x := v.Args[0] 37804 v.reset(OpCopy) 37805 v.Type = x.Type 37806 v.AddArg(x) 37807 return true 37808 } 37809 // match: (SUBconst [c] x) 37810 // cond: c != -(1<<31) 37811 // result: (ADDconst [-c] x) 37812 for { 37813 c := v.AuxInt 37814 x := v.Args[0] 37815 if !(c != -(1 << 31)) { 37816 break 37817 } 37818 v.reset(OpS390XADDconst) 37819 v.AuxInt = -c 37820 v.AddArg(x) 37821 return true 37822 } 37823 // match: (SUBconst (MOVDconst [d]) [c]) 37824 // cond: 37825 // result: (MOVDconst [d-c]) 37826 for { 37827 c := v.AuxInt 37828 v_0 := v.Args[0] 37829 if v_0.Op != OpS390XMOVDconst { 37830 break 37831 } 37832 d := v_0.AuxInt 37833 v.reset(OpS390XMOVDconst) 37834 v.AuxInt = d - c 37835 return true 37836 } 37837 // match: (SUBconst (SUBconst x [d]) [c]) 37838 // cond: is32Bit(-c-d) 37839 // result: (ADDconst [-c-d] x) 37840 for { 37841 c := v.AuxInt 37842 v_0 := v.Args[0] 37843 if v_0.Op != OpS390XSUBconst { 37844 break 37845 } 37846 d := v_0.AuxInt 37847 x := v_0.Args[0] 37848 if !(is32Bit(-c - d)) { 37849 break 37850 } 37851 v.reset(OpS390XADDconst) 37852 v.AuxInt = -c - d 37853 v.AddArg(x) 37854 return true 37855 } 37856 return false 37857 } 37858 func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { 37859 b := v.Block 37860 _ = b 37861 // match: (SUBload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 37862 // cond: isSamePtr(ptr1, ptr2) 37863 // result: (SUB x (LGDR <t> y)) 37864 for { 37865 t := v.Type 37866 off := v.AuxInt 37867 sym := v.Aux 37868 _ = v.Args[2] 37869 x := v.Args[0] 37870 ptr1 := v.Args[1] 37871 v_2 := v.Args[2] 37872 if v_2.Op != OpS390XFMOVDstore { 37873 break 37874 } 37875 if v_2.AuxInt != off { 37876 break 37877 } 37878 if v_2.Aux != sym { 37879 break 37880 } 37881 _ = v_2.Args[2] 37882 ptr2 := v_2.Args[0] 37883 y := v_2.Args[1] 37884 if !(isSamePtr(ptr1, ptr2)) { 37885 break 37886 } 37887 v.reset(OpS390XSUB) 37888 v.AddArg(x) 37889 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 37890 v0.AddArg(y) 37891 v.AddArg(v0) 37892 return true 37893 } 37894 // match: (SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) 37895 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 37896 // result: (SUBload [off1+off2] {sym} x ptr mem) 37897 for { 37898 off1 := v.AuxInt 37899 sym := v.Aux 37900 _ = v.Args[2] 37901 x := v.Args[0] 37902 v_1 := v.Args[1] 37903 if v_1.Op != OpS390XADDconst { 37904 break 37905 } 37906 off2 := v_1.AuxInt 37907 ptr := v_1.Args[0] 37908 mem := v.Args[2] 37909 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 37910 break 37911 } 37912 v.reset(OpS390XSUBload) 37913 v.AuxInt = off1 + off2 37914 v.Aux = sym 37915 v.AddArg(x) 37916 v.AddArg(ptr) 37917 v.AddArg(mem) 37918 return true 37919 } 37920 // match: (SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 37921 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 37922 // result: (SUBload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 37923 for { 37924 o1 := v.AuxInt 37925 s1 := v.Aux 37926 _ = v.Args[2] 37927 x := v.Args[0] 37928 v_1 := v.Args[1] 37929 if v_1.Op != OpS390XMOVDaddr { 37930 break 37931 } 37932 o2 := v_1.AuxInt 37933 s2 := v_1.Aux 37934 ptr := v_1.Args[0] 37935 mem := v.Args[2] 37936 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 37937 break 37938 } 37939 v.reset(OpS390XSUBload) 37940 v.AuxInt = o1 + o2 37941 v.Aux = mergeSym(s1, s2) 37942 v.AddArg(x) 37943 v.AddArg(ptr) 37944 v.AddArg(mem) 37945 return true 37946 } 37947 return false 37948 } 37949 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 37950 // match: (XOR x (MOVDconst [c])) 37951 // cond: isU32Bit(c) 37952 // result: (XORconst [c] x) 37953 for { 37954 _ = v.Args[1] 37955 x := v.Args[0] 37956 v_1 := v.Args[1] 37957 if v_1.Op != OpS390XMOVDconst { 37958 break 37959 } 37960 c := v_1.AuxInt 37961 if !(isU32Bit(c)) { 37962 break 37963 } 37964 v.reset(OpS390XXORconst) 37965 v.AuxInt = c 37966 v.AddArg(x) 37967 return true 37968 } 37969 // match: (XOR (MOVDconst [c]) x) 37970 // cond: isU32Bit(c) 37971 // result: (XORconst [c] x) 37972 for { 37973 _ = v.Args[1] 37974 v_0 := v.Args[0] 37975 if v_0.Op != OpS390XMOVDconst { 37976 break 37977 } 37978 c := v_0.AuxInt 37979 x := v.Args[1] 37980 if !(isU32Bit(c)) { 37981 break 37982 } 37983 v.reset(OpS390XXORconst) 37984 v.AuxInt = c 37985 v.AddArg(x) 37986 return true 37987 } 37988 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 37989 // cond: d == 64-c 37990 // result: (RLLGconst [c] x) 37991 for { 37992 _ = v.Args[1] 37993 v_0 := v.Args[0] 37994 if v_0.Op != OpS390XSLDconst { 37995 break 37996 } 37997 c := v_0.AuxInt 37998 x := v_0.Args[0] 37999 v_1 := v.Args[1] 38000 if v_1.Op != OpS390XSRDconst { 38001 break 38002 } 38003 d := v_1.AuxInt 38004 if x != v_1.Args[0] { 38005 break 38006 } 38007 if !(d == 64-c) { 38008 break 38009 } 38010 v.reset(OpS390XRLLGconst) 38011 v.AuxInt = c 38012 v.AddArg(x) 38013 return true 38014 } 38015 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 38016 // cond: d == 64-c 38017 // result: (RLLGconst [c] x) 38018 for { 38019 _ = v.Args[1] 38020 v_0 := v.Args[0] 38021 if v_0.Op != OpS390XSRDconst { 38022 break 38023 } 38024 d := v_0.AuxInt 38025 x := v_0.Args[0] 38026 v_1 := v.Args[1] 38027 if v_1.Op != OpS390XSLDconst { 38028 break 38029 } 38030 c := v_1.AuxInt 38031 if x != v_1.Args[0] { 38032 break 38033 } 38034 if !(d == 64-c) { 38035 break 38036 } 38037 v.reset(OpS390XRLLGconst) 38038 v.AuxInt = c 38039 v.AddArg(x) 38040 return true 38041 } 38042 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 38043 // cond: 38044 // result: (MOVDconst [c^d]) 38045 for { 38046 _ = v.Args[1] 38047 v_0 := v.Args[0] 38048 if v_0.Op != OpS390XMOVDconst { 38049 break 38050 } 38051 c := v_0.AuxInt 38052 v_1 := v.Args[1] 38053 if v_1.Op != OpS390XMOVDconst { 38054 break 38055 } 38056 d := v_1.AuxInt 38057 v.reset(OpS390XMOVDconst) 38058 v.AuxInt = c ^ d 38059 return true 38060 } 38061 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 38062 // cond: 38063 // result: (MOVDconst [c^d]) 38064 for { 38065 _ = v.Args[1] 38066 v_0 := v.Args[0] 38067 if v_0.Op != OpS390XMOVDconst { 38068 break 38069 } 38070 d := v_0.AuxInt 38071 v_1 := v.Args[1] 38072 if v_1.Op != OpS390XMOVDconst { 38073 break 38074 } 38075 c := v_1.AuxInt 38076 v.reset(OpS390XMOVDconst) 38077 v.AuxInt = c ^ d 38078 return true 38079 } 38080 // match: (XOR x x) 38081 // cond: 38082 // result: (MOVDconst [0]) 38083 for { 38084 _ = v.Args[1] 38085 x := v.Args[0] 38086 if x != v.Args[1] { 38087 break 38088 } 38089 v.reset(OpS390XMOVDconst) 38090 v.AuxInt = 0 38091 return true 38092 } 38093 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 38094 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38095 // result: (XORload <t> [off] {sym} x ptr mem) 38096 for { 38097 t := v.Type 38098 _ = v.Args[1] 38099 x := v.Args[0] 38100 g := v.Args[1] 38101 if g.Op != OpS390XMOVDload { 38102 break 38103 } 38104 off := g.AuxInt 38105 sym := g.Aux 38106 _ = g.Args[1] 38107 ptr := g.Args[0] 38108 mem := g.Args[1] 38109 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38110 break 38111 } 38112 v.reset(OpS390XXORload) 38113 v.Type = t 38114 v.AuxInt = off 38115 v.Aux = sym 38116 v.AddArg(x) 38117 v.AddArg(ptr) 38118 v.AddArg(mem) 38119 return true 38120 } 38121 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 38122 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38123 // result: (XORload <t> [off] {sym} x ptr mem) 38124 for { 38125 t := v.Type 38126 _ = v.Args[1] 38127 g := v.Args[0] 38128 if g.Op != OpS390XMOVDload { 38129 break 38130 } 38131 off := g.AuxInt 38132 sym := g.Aux 38133 _ = g.Args[1] 38134 ptr := g.Args[0] 38135 mem := g.Args[1] 38136 x := v.Args[1] 38137 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38138 break 38139 } 38140 v.reset(OpS390XXORload) 38141 v.Type = t 38142 v.AuxInt = off 38143 v.Aux = sym 38144 v.AddArg(x) 38145 v.AddArg(ptr) 38146 v.AddArg(mem) 38147 return true 38148 } 38149 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 38150 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38151 // result: (XORload <t> [off] {sym} x ptr mem) 38152 for { 38153 t := v.Type 38154 _ = v.Args[1] 38155 g := v.Args[0] 38156 if g.Op != OpS390XMOVDload { 38157 break 38158 } 38159 off := g.AuxInt 38160 sym := g.Aux 38161 _ = g.Args[1] 38162 ptr := g.Args[0] 38163 mem := g.Args[1] 38164 x := v.Args[1] 38165 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38166 break 38167 } 38168 v.reset(OpS390XXORload) 38169 v.Type = t 38170 v.AuxInt = off 38171 v.Aux = sym 38172 v.AddArg(x) 38173 v.AddArg(ptr) 38174 v.AddArg(mem) 38175 return true 38176 } 38177 return false 38178 } 38179 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 38180 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 38181 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38182 // result: (XORload <t> [off] {sym} x ptr mem) 38183 for { 38184 t := v.Type 38185 _ = v.Args[1] 38186 x := v.Args[0] 38187 g := v.Args[1] 38188 if g.Op != OpS390XMOVDload { 38189 break 38190 } 38191 off := g.AuxInt 38192 sym := g.Aux 38193 _ = g.Args[1] 38194 ptr := g.Args[0] 38195 mem := g.Args[1] 38196 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38197 break 38198 } 38199 v.reset(OpS390XXORload) 38200 v.Type = t 38201 v.AuxInt = off 38202 v.Aux = sym 38203 v.AddArg(x) 38204 v.AddArg(ptr) 38205 v.AddArg(mem) 38206 return true 38207 } 38208 return false 38209 } 38210 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 38211 // match: (XORW x (MOVDconst [c])) 38212 // cond: 38213 // result: (XORWconst [int64(int32(c))] x) 38214 for { 38215 _ = v.Args[1] 38216 x := v.Args[0] 38217 v_1 := v.Args[1] 38218 if v_1.Op != OpS390XMOVDconst { 38219 break 38220 } 38221 c := v_1.AuxInt 38222 v.reset(OpS390XXORWconst) 38223 v.AuxInt = int64(int32(c)) 38224 v.AddArg(x) 38225 return true 38226 } 38227 // match: (XORW (MOVDconst [c]) x) 38228 // cond: 38229 // result: (XORWconst [int64(int32(c))] x) 38230 for { 38231 _ = v.Args[1] 38232 v_0 := v.Args[0] 38233 if v_0.Op != OpS390XMOVDconst { 38234 break 38235 } 38236 c := v_0.AuxInt 38237 x := v.Args[1] 38238 v.reset(OpS390XXORWconst) 38239 v.AuxInt = int64(int32(c)) 38240 v.AddArg(x) 38241 return true 38242 } 38243 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 38244 // cond: d == 32-c 38245 // result: (RLLconst [c] x) 38246 for { 38247 _ = v.Args[1] 38248 v_0 := v.Args[0] 38249 if v_0.Op != OpS390XSLWconst { 38250 break 38251 } 38252 c := v_0.AuxInt 38253 x := v_0.Args[0] 38254 v_1 := v.Args[1] 38255 if v_1.Op != OpS390XSRWconst { 38256 break 38257 } 38258 d := v_1.AuxInt 38259 if x != v_1.Args[0] { 38260 break 38261 } 38262 if !(d == 32-c) { 38263 break 38264 } 38265 v.reset(OpS390XRLLconst) 38266 v.AuxInt = c 38267 v.AddArg(x) 38268 return true 38269 } 38270 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 38271 // cond: d == 32-c 38272 // result: (RLLconst [c] x) 38273 for { 38274 _ = v.Args[1] 38275 v_0 := v.Args[0] 38276 if v_0.Op != OpS390XSRWconst { 38277 break 38278 } 38279 d := v_0.AuxInt 38280 x := v_0.Args[0] 38281 v_1 := v.Args[1] 38282 if v_1.Op != OpS390XSLWconst { 38283 break 38284 } 38285 c := v_1.AuxInt 38286 if x != v_1.Args[0] { 38287 break 38288 } 38289 if !(d == 32-c) { 38290 break 38291 } 38292 v.reset(OpS390XRLLconst) 38293 v.AuxInt = c 38294 v.AddArg(x) 38295 return true 38296 } 38297 // match: (XORW x x) 38298 // cond: 38299 // result: (MOVDconst [0]) 38300 for { 38301 _ = v.Args[1] 38302 x := v.Args[0] 38303 if x != v.Args[1] { 38304 break 38305 } 38306 v.reset(OpS390XMOVDconst) 38307 v.AuxInt = 0 38308 return true 38309 } 38310 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 38311 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38312 // result: (XORWload <t> [off] {sym} x ptr mem) 38313 for { 38314 t := v.Type 38315 _ = v.Args[1] 38316 x := v.Args[0] 38317 g := v.Args[1] 38318 if g.Op != OpS390XMOVWload { 38319 break 38320 } 38321 off := g.AuxInt 38322 sym := g.Aux 38323 _ = g.Args[1] 38324 ptr := g.Args[0] 38325 mem := g.Args[1] 38326 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38327 break 38328 } 38329 v.reset(OpS390XXORWload) 38330 v.Type = t 38331 v.AuxInt = off 38332 v.Aux = sym 38333 v.AddArg(x) 38334 v.AddArg(ptr) 38335 v.AddArg(mem) 38336 return true 38337 } 38338 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 38339 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38340 // result: (XORWload <t> [off] {sym} x ptr mem) 38341 for { 38342 t := v.Type 38343 _ = v.Args[1] 38344 g := v.Args[0] 38345 if g.Op != OpS390XMOVWload { 38346 break 38347 } 38348 off := g.AuxInt 38349 sym := g.Aux 38350 _ = g.Args[1] 38351 ptr := g.Args[0] 38352 mem := g.Args[1] 38353 x := v.Args[1] 38354 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38355 break 38356 } 38357 v.reset(OpS390XXORWload) 38358 v.Type = t 38359 v.AuxInt = off 38360 v.Aux = sym 38361 v.AddArg(x) 38362 v.AddArg(ptr) 38363 v.AddArg(mem) 38364 return true 38365 } 38366 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 38367 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38368 // result: (XORWload <t> [off] {sym} x ptr mem) 38369 for { 38370 t := v.Type 38371 _ = v.Args[1] 38372 g := v.Args[0] 38373 if g.Op != OpS390XMOVWload { 38374 break 38375 } 38376 off := g.AuxInt 38377 sym := g.Aux 38378 _ = g.Args[1] 38379 ptr := g.Args[0] 38380 mem := g.Args[1] 38381 x := v.Args[1] 38382 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38383 break 38384 } 38385 v.reset(OpS390XXORWload) 38386 v.Type = t 38387 v.AuxInt = off 38388 v.Aux = sym 38389 v.AddArg(x) 38390 v.AddArg(ptr) 38391 v.AddArg(mem) 38392 return true 38393 } 38394 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 38395 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38396 // result: (XORWload <t> [off] {sym} x ptr mem) 38397 for { 38398 t := v.Type 38399 _ = v.Args[1] 38400 x := v.Args[0] 38401 g := v.Args[1] 38402 if g.Op != OpS390XMOVWload { 38403 break 38404 } 38405 off := g.AuxInt 38406 sym := g.Aux 38407 _ = g.Args[1] 38408 ptr := g.Args[0] 38409 mem := g.Args[1] 38410 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38411 break 38412 } 38413 v.reset(OpS390XXORWload) 38414 v.Type = t 38415 v.AuxInt = off 38416 v.Aux = sym 38417 v.AddArg(x) 38418 v.AddArg(ptr) 38419 v.AddArg(mem) 38420 return true 38421 } 38422 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 38423 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38424 // result: (XORWload <t> [off] {sym} x ptr mem) 38425 for { 38426 t := v.Type 38427 _ = v.Args[1] 38428 x := v.Args[0] 38429 g := v.Args[1] 38430 if g.Op != OpS390XMOVWZload { 38431 break 38432 } 38433 off := g.AuxInt 38434 sym := g.Aux 38435 _ = g.Args[1] 38436 ptr := g.Args[0] 38437 mem := g.Args[1] 38438 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38439 break 38440 } 38441 v.reset(OpS390XXORWload) 38442 v.Type = t 38443 v.AuxInt = off 38444 v.Aux = sym 38445 v.AddArg(x) 38446 v.AddArg(ptr) 38447 v.AddArg(mem) 38448 return true 38449 } 38450 return false 38451 } 38452 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 38453 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 38454 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38455 // result: (XORWload <t> [off] {sym} x ptr mem) 38456 for { 38457 t := v.Type 38458 _ = v.Args[1] 38459 g := v.Args[0] 38460 if g.Op != OpS390XMOVWZload { 38461 break 38462 } 38463 off := g.AuxInt 38464 sym := g.Aux 38465 _ = g.Args[1] 38466 ptr := g.Args[0] 38467 mem := g.Args[1] 38468 x := v.Args[1] 38469 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38470 break 38471 } 38472 v.reset(OpS390XXORWload) 38473 v.Type = t 38474 v.AuxInt = off 38475 v.Aux = sym 38476 v.AddArg(x) 38477 v.AddArg(ptr) 38478 v.AddArg(mem) 38479 return true 38480 } 38481 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 38482 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38483 // result: (XORWload <t> [off] {sym} x ptr mem) 38484 for { 38485 t := v.Type 38486 _ = v.Args[1] 38487 g := v.Args[0] 38488 if g.Op != OpS390XMOVWZload { 38489 break 38490 } 38491 off := g.AuxInt 38492 sym := g.Aux 38493 _ = g.Args[1] 38494 ptr := g.Args[0] 38495 mem := g.Args[1] 38496 x := v.Args[1] 38497 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38498 break 38499 } 38500 v.reset(OpS390XXORWload) 38501 v.Type = t 38502 v.AuxInt = off 38503 v.Aux = sym 38504 v.AddArg(x) 38505 v.AddArg(ptr) 38506 v.AddArg(mem) 38507 return true 38508 } 38509 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 38510 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 38511 // result: (XORWload <t> [off] {sym} x ptr mem) 38512 for { 38513 t := v.Type 38514 _ = v.Args[1] 38515 x := v.Args[0] 38516 g := v.Args[1] 38517 if g.Op != OpS390XMOVWZload { 38518 break 38519 } 38520 off := g.AuxInt 38521 sym := g.Aux 38522 _ = g.Args[1] 38523 ptr := g.Args[0] 38524 mem := g.Args[1] 38525 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 38526 break 38527 } 38528 v.reset(OpS390XXORWload) 38529 v.Type = t 38530 v.AuxInt = off 38531 v.Aux = sym 38532 v.AddArg(x) 38533 v.AddArg(ptr) 38534 v.AddArg(mem) 38535 return true 38536 } 38537 return false 38538 } 38539 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 38540 // match: (XORWconst [c] x) 38541 // cond: int32(c)==0 38542 // result: x 38543 for { 38544 c := v.AuxInt 38545 x := v.Args[0] 38546 if !(int32(c) == 0) { 38547 break 38548 } 38549 v.reset(OpCopy) 38550 v.Type = x.Type 38551 v.AddArg(x) 38552 return true 38553 } 38554 // match: (XORWconst [c] (MOVDconst [d])) 38555 // cond: 38556 // result: (MOVDconst [c^d]) 38557 for { 38558 c := v.AuxInt 38559 v_0 := v.Args[0] 38560 if v_0.Op != OpS390XMOVDconst { 38561 break 38562 } 38563 d := v_0.AuxInt 38564 v.reset(OpS390XMOVDconst) 38565 v.AuxInt = c ^ d 38566 return true 38567 } 38568 return false 38569 } 38570 func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { 38571 // match: (XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) 38572 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38573 // result: (XORWload [off1+off2] {sym} x ptr mem) 38574 for { 38575 off1 := v.AuxInt 38576 sym := v.Aux 38577 _ = v.Args[2] 38578 x := v.Args[0] 38579 v_1 := v.Args[1] 38580 if v_1.Op != OpS390XADDconst { 38581 break 38582 } 38583 off2 := v_1.AuxInt 38584 ptr := v_1.Args[0] 38585 mem := v.Args[2] 38586 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38587 break 38588 } 38589 v.reset(OpS390XXORWload) 38590 v.AuxInt = off1 + off2 38591 v.Aux = sym 38592 v.AddArg(x) 38593 v.AddArg(ptr) 38594 v.AddArg(mem) 38595 return true 38596 } 38597 // match: (XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38598 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38599 // result: (XORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38600 for { 38601 o1 := v.AuxInt 38602 s1 := v.Aux 38603 _ = v.Args[2] 38604 x := v.Args[0] 38605 v_1 := v.Args[1] 38606 if v_1.Op != OpS390XMOVDaddr { 38607 break 38608 } 38609 o2 := v_1.AuxInt 38610 s2 := v_1.Aux 38611 ptr := v_1.Args[0] 38612 mem := v.Args[2] 38613 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38614 break 38615 } 38616 v.reset(OpS390XXORWload) 38617 v.AuxInt = o1 + o2 38618 v.Aux = mergeSym(s1, s2) 38619 v.AddArg(x) 38620 v.AddArg(ptr) 38621 v.AddArg(mem) 38622 return true 38623 } 38624 return false 38625 } 38626 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 38627 // match: (XORconst [0] x) 38628 // cond: 38629 // result: x 38630 for { 38631 if v.AuxInt != 0 { 38632 break 38633 } 38634 x := v.Args[0] 38635 v.reset(OpCopy) 38636 v.Type = x.Type 38637 v.AddArg(x) 38638 return true 38639 } 38640 // match: (XORconst [c] (MOVDconst [d])) 38641 // cond: 38642 // result: (MOVDconst [c^d]) 38643 for { 38644 c := v.AuxInt 38645 v_0 := v.Args[0] 38646 if v_0.Op != OpS390XMOVDconst { 38647 break 38648 } 38649 d := v_0.AuxInt 38650 v.reset(OpS390XMOVDconst) 38651 v.AuxInt = c ^ d 38652 return true 38653 } 38654 return false 38655 } 38656 func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { 38657 b := v.Block 38658 _ = b 38659 // match: (XORload <t> [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) 38660 // cond: isSamePtr(ptr1, ptr2) 38661 // result: (XOR x (LGDR <t> y)) 38662 for { 38663 t := v.Type 38664 off := v.AuxInt 38665 sym := v.Aux 38666 _ = v.Args[2] 38667 x := v.Args[0] 38668 ptr1 := v.Args[1] 38669 v_2 := v.Args[2] 38670 if v_2.Op != OpS390XFMOVDstore { 38671 break 38672 } 38673 if v_2.AuxInt != off { 38674 break 38675 } 38676 if v_2.Aux != sym { 38677 break 38678 } 38679 _ = v_2.Args[2] 38680 ptr2 := v_2.Args[0] 38681 y := v_2.Args[1] 38682 if !(isSamePtr(ptr1, ptr2)) { 38683 break 38684 } 38685 v.reset(OpS390XXOR) 38686 v.AddArg(x) 38687 v0 := b.NewValue0(v.Pos, OpS390XLGDR, t) 38688 v0.AddArg(y) 38689 v.AddArg(v0) 38690 return true 38691 } 38692 // match: (XORload [off1] {sym} x (ADDconst [off2] ptr) mem) 38693 // cond: ptr.Op != OpSB && is20Bit(off1+off2) 38694 // result: (XORload [off1+off2] {sym} x ptr mem) 38695 for { 38696 off1 := v.AuxInt 38697 sym := v.Aux 38698 _ = v.Args[2] 38699 x := v.Args[0] 38700 v_1 := v.Args[1] 38701 if v_1.Op != OpS390XADDconst { 38702 break 38703 } 38704 off2 := v_1.AuxInt 38705 ptr := v_1.Args[0] 38706 mem := v.Args[2] 38707 if !(ptr.Op != OpSB && is20Bit(off1+off2)) { 38708 break 38709 } 38710 v.reset(OpS390XXORload) 38711 v.AuxInt = off1 + off2 38712 v.Aux = sym 38713 v.AddArg(x) 38714 v.AddArg(ptr) 38715 v.AddArg(mem) 38716 return true 38717 } 38718 // match: (XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) 38719 // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) 38720 // result: (XORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) 38721 for { 38722 o1 := v.AuxInt 38723 s1 := v.Aux 38724 _ = v.Args[2] 38725 x := v.Args[0] 38726 v_1 := v.Args[1] 38727 if v_1.Op != OpS390XMOVDaddr { 38728 break 38729 } 38730 o2 := v_1.AuxInt 38731 s2 := v_1.Aux 38732 ptr := v_1.Args[0] 38733 mem := v.Args[2] 38734 if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { 38735 break 38736 } 38737 v.reset(OpS390XXORload) 38738 v.AuxInt = o1 + o2 38739 v.Aux = mergeSym(s1, s2) 38740 v.AddArg(x) 38741 v.AddArg(ptr) 38742 v.AddArg(mem) 38743 return true 38744 } 38745 return false 38746 } 38747 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 38748 b := v.Block 38749 _ = b 38750 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 38751 // cond: 38752 // result: (ADDW val (Select0 <t> tuple)) 38753 for { 38754 t := v.Type 38755 v_0 := v.Args[0] 38756 if v_0.Op != OpS390XAddTupleFirst32 { 38757 break 38758 } 38759 _ = v_0.Args[1] 38760 val := v_0.Args[0] 38761 tuple := v_0.Args[1] 38762 v.reset(OpS390XADDW) 38763 v.AddArg(val) 38764 v0 := b.NewValue0(v.Pos, OpSelect0, t) 38765 v0.AddArg(tuple) 38766 v.AddArg(v0) 38767 return true 38768 } 38769 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 38770 // cond: 38771 // result: (ADD val (Select0 <t> tuple)) 38772 for { 38773 t := v.Type 38774 v_0 := v.Args[0] 38775 if v_0.Op != OpS390XAddTupleFirst64 { 38776 break 38777 } 38778 _ = v_0.Args[1] 38779 val := v_0.Args[0] 38780 tuple := v_0.Args[1] 38781 v.reset(OpS390XADD) 38782 v.AddArg(val) 38783 v0 := b.NewValue0(v.Pos, OpSelect0, t) 38784 v0.AddArg(tuple) 38785 v.AddArg(v0) 38786 return true 38787 } 38788 return false 38789 } 38790 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 38791 // match: (Select1 (AddTupleFirst32 _ tuple)) 38792 // cond: 38793 // result: (Select1 tuple) 38794 for { 38795 v_0 := v.Args[0] 38796 if v_0.Op != OpS390XAddTupleFirst32 { 38797 break 38798 } 38799 _ = v_0.Args[1] 38800 tuple := v_0.Args[1] 38801 v.reset(OpSelect1) 38802 v.AddArg(tuple) 38803 return true 38804 } 38805 // match: (Select1 (AddTupleFirst64 _ tuple)) 38806 // cond: 38807 // result: (Select1 tuple) 38808 for { 38809 v_0 := v.Args[0] 38810 if v_0.Op != OpS390XAddTupleFirst64 { 38811 break 38812 } 38813 _ = v_0.Args[1] 38814 tuple := v_0.Args[1] 38815 v.reset(OpSelect1) 38816 v.AddArg(tuple) 38817 return true 38818 } 38819 return false 38820 } 38821 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 38822 // match: (SignExt16to32 x) 38823 // cond: 38824 // result: (MOVHreg x) 38825 for { 38826 x := v.Args[0] 38827 v.reset(OpS390XMOVHreg) 38828 v.AddArg(x) 38829 return true 38830 } 38831 } 38832 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 38833 // match: (SignExt16to64 x) 38834 // cond: 38835 // result: (MOVHreg x) 38836 for { 38837 x := v.Args[0] 38838 v.reset(OpS390XMOVHreg) 38839 v.AddArg(x) 38840 return true 38841 } 38842 } 38843 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 38844 // match: (SignExt32to64 x) 38845 // cond: 38846 // result: (MOVWreg x) 38847 for { 38848 x := v.Args[0] 38849 v.reset(OpS390XMOVWreg) 38850 v.AddArg(x) 38851 return true 38852 } 38853 } 38854 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 38855 // match: (SignExt8to16 x) 38856 // cond: 38857 // result: (MOVBreg x) 38858 for { 38859 x := v.Args[0] 38860 v.reset(OpS390XMOVBreg) 38861 v.AddArg(x) 38862 return true 38863 } 38864 } 38865 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 38866 // match: (SignExt8to32 x) 38867 // cond: 38868 // result: (MOVBreg x) 38869 for { 38870 x := v.Args[0] 38871 v.reset(OpS390XMOVBreg) 38872 v.AddArg(x) 38873 return true 38874 } 38875 } 38876 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 38877 // match: (SignExt8to64 x) 38878 // cond: 38879 // result: (MOVBreg x) 38880 for { 38881 x := v.Args[0] 38882 v.reset(OpS390XMOVBreg) 38883 v.AddArg(x) 38884 return true 38885 } 38886 } 38887 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 38888 b := v.Block 38889 _ = b 38890 // match: (Slicemask <t> x) 38891 // cond: 38892 // result: (SRADconst (NEG <t> x) [63]) 38893 for { 38894 t := v.Type 38895 x := v.Args[0] 38896 v.reset(OpS390XSRADconst) 38897 v.AuxInt = 63 38898 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 38899 v0.AddArg(x) 38900 v.AddArg(v0) 38901 return true 38902 } 38903 } 38904 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 38905 // match: (Sqrt x) 38906 // cond: 38907 // result: (FSQRT x) 38908 for { 38909 x := v.Args[0] 38910 v.reset(OpS390XFSQRT) 38911 v.AddArg(x) 38912 return true 38913 } 38914 } 38915 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 38916 // match: (StaticCall [argwid] {target} mem) 38917 // cond: 38918 // result: (CALLstatic [argwid] {target} mem) 38919 for { 38920 argwid := v.AuxInt 38921 target := v.Aux 38922 mem := v.Args[0] 38923 v.reset(OpS390XCALLstatic) 38924 v.AuxInt = argwid 38925 v.Aux = target 38926 v.AddArg(mem) 38927 return true 38928 } 38929 } 38930 func rewriteValueS390X_OpStore_0(v *Value) bool { 38931 // match: (Store {t} ptr val mem) 38932 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 38933 // result: (FMOVDstore ptr val mem) 38934 for { 38935 t := v.Aux 38936 _ = v.Args[2] 38937 ptr := v.Args[0] 38938 val := v.Args[1] 38939 mem := v.Args[2] 38940 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 38941 break 38942 } 38943 v.reset(OpS390XFMOVDstore) 38944 v.AddArg(ptr) 38945 v.AddArg(val) 38946 v.AddArg(mem) 38947 return true 38948 } 38949 // match: (Store {t} ptr val mem) 38950 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 38951 // result: (FMOVSstore ptr val mem) 38952 for { 38953 t := v.Aux 38954 _ = v.Args[2] 38955 ptr := v.Args[0] 38956 val := v.Args[1] 38957 mem := v.Args[2] 38958 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 38959 break 38960 } 38961 v.reset(OpS390XFMOVSstore) 38962 v.AddArg(ptr) 38963 v.AddArg(val) 38964 v.AddArg(mem) 38965 return true 38966 } 38967 // match: (Store {t} ptr val mem) 38968 // cond: t.(*types.Type).Size() == 8 38969 // result: (MOVDstore ptr val mem) 38970 for { 38971 t := v.Aux 38972 _ = v.Args[2] 38973 ptr := v.Args[0] 38974 val := v.Args[1] 38975 mem := v.Args[2] 38976 if !(t.(*types.Type).Size() == 8) { 38977 break 38978 } 38979 v.reset(OpS390XMOVDstore) 38980 v.AddArg(ptr) 38981 v.AddArg(val) 38982 v.AddArg(mem) 38983 return true 38984 } 38985 // match: (Store {t} ptr val mem) 38986 // cond: t.(*types.Type).Size() == 4 38987 // result: (MOVWstore ptr val mem) 38988 for { 38989 t := v.Aux 38990 _ = v.Args[2] 38991 ptr := v.Args[0] 38992 val := v.Args[1] 38993 mem := v.Args[2] 38994 if !(t.(*types.Type).Size() == 4) { 38995 break 38996 } 38997 v.reset(OpS390XMOVWstore) 38998 v.AddArg(ptr) 38999 v.AddArg(val) 39000 v.AddArg(mem) 39001 return true 39002 } 39003 // match: (Store {t} ptr val mem) 39004 // cond: t.(*types.Type).Size() == 2 39005 // result: (MOVHstore ptr val mem) 39006 for { 39007 t := v.Aux 39008 _ = v.Args[2] 39009 ptr := v.Args[0] 39010 val := v.Args[1] 39011 mem := v.Args[2] 39012 if !(t.(*types.Type).Size() == 2) { 39013 break 39014 } 39015 v.reset(OpS390XMOVHstore) 39016 v.AddArg(ptr) 39017 v.AddArg(val) 39018 v.AddArg(mem) 39019 return true 39020 } 39021 // match: (Store {t} ptr val mem) 39022 // cond: t.(*types.Type).Size() == 1 39023 // result: (MOVBstore ptr val mem) 39024 for { 39025 t := v.Aux 39026 _ = v.Args[2] 39027 ptr := v.Args[0] 39028 val := v.Args[1] 39029 mem := v.Args[2] 39030 if !(t.(*types.Type).Size() == 1) { 39031 break 39032 } 39033 v.reset(OpS390XMOVBstore) 39034 v.AddArg(ptr) 39035 v.AddArg(val) 39036 v.AddArg(mem) 39037 return true 39038 } 39039 return false 39040 } 39041 func rewriteValueS390X_OpSub16_0(v *Value) bool { 39042 // match: (Sub16 x y) 39043 // cond: 39044 // result: (SUBW x y) 39045 for { 39046 _ = v.Args[1] 39047 x := v.Args[0] 39048 y := v.Args[1] 39049 v.reset(OpS390XSUBW) 39050 v.AddArg(x) 39051 v.AddArg(y) 39052 return true 39053 } 39054 } 39055 func rewriteValueS390X_OpSub32_0(v *Value) bool { 39056 // match: (Sub32 x y) 39057 // cond: 39058 // result: (SUBW x y) 39059 for { 39060 _ = v.Args[1] 39061 x := v.Args[0] 39062 y := v.Args[1] 39063 v.reset(OpS390XSUBW) 39064 v.AddArg(x) 39065 v.AddArg(y) 39066 return true 39067 } 39068 } 39069 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 39070 // match: (Sub32F x y) 39071 // cond: 39072 // result: (FSUBS x y) 39073 for { 39074 _ = v.Args[1] 39075 x := v.Args[0] 39076 y := v.Args[1] 39077 v.reset(OpS390XFSUBS) 39078 v.AddArg(x) 39079 v.AddArg(y) 39080 return true 39081 } 39082 } 39083 func rewriteValueS390X_OpSub64_0(v *Value) bool { 39084 // match: (Sub64 x y) 39085 // cond: 39086 // result: (SUB x y) 39087 for { 39088 _ = v.Args[1] 39089 x := v.Args[0] 39090 y := v.Args[1] 39091 v.reset(OpS390XSUB) 39092 v.AddArg(x) 39093 v.AddArg(y) 39094 return true 39095 } 39096 } 39097 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 39098 // match: (Sub64F x y) 39099 // cond: 39100 // result: (FSUB x y) 39101 for { 39102 _ = v.Args[1] 39103 x := v.Args[0] 39104 y := v.Args[1] 39105 v.reset(OpS390XFSUB) 39106 v.AddArg(x) 39107 v.AddArg(y) 39108 return true 39109 } 39110 } 39111 func rewriteValueS390X_OpSub8_0(v *Value) bool { 39112 // match: (Sub8 x y) 39113 // cond: 39114 // result: (SUBW x y) 39115 for { 39116 _ = v.Args[1] 39117 x := v.Args[0] 39118 y := v.Args[1] 39119 v.reset(OpS390XSUBW) 39120 v.AddArg(x) 39121 v.AddArg(y) 39122 return true 39123 } 39124 } 39125 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 39126 // match: (SubPtr x y) 39127 // cond: 39128 // result: (SUB x y) 39129 for { 39130 _ = v.Args[1] 39131 x := v.Args[0] 39132 y := v.Args[1] 39133 v.reset(OpS390XSUB) 39134 v.AddArg(x) 39135 v.AddArg(y) 39136 return true 39137 } 39138 } 39139 func rewriteValueS390X_OpTrunc_0(v *Value) bool { 39140 // match: (Trunc x) 39141 // cond: 39142 // result: (FIDBR [5] x) 39143 for { 39144 x := v.Args[0] 39145 v.reset(OpS390XFIDBR) 39146 v.AuxInt = 5 39147 v.AddArg(x) 39148 return true 39149 } 39150 } 39151 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 39152 // match: (Trunc16to8 x) 39153 // cond: 39154 // result: x 39155 for { 39156 x := v.Args[0] 39157 v.reset(OpCopy) 39158 v.Type = x.Type 39159 v.AddArg(x) 39160 return true 39161 } 39162 } 39163 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 39164 // match: (Trunc32to16 x) 39165 // cond: 39166 // result: x 39167 for { 39168 x := v.Args[0] 39169 v.reset(OpCopy) 39170 v.Type = x.Type 39171 v.AddArg(x) 39172 return true 39173 } 39174 } 39175 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 39176 // match: (Trunc32to8 x) 39177 // cond: 39178 // result: x 39179 for { 39180 x := v.Args[0] 39181 v.reset(OpCopy) 39182 v.Type = x.Type 39183 v.AddArg(x) 39184 return true 39185 } 39186 } 39187 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 39188 // match: (Trunc64to16 x) 39189 // cond: 39190 // result: x 39191 for { 39192 x := v.Args[0] 39193 v.reset(OpCopy) 39194 v.Type = x.Type 39195 v.AddArg(x) 39196 return true 39197 } 39198 } 39199 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 39200 // match: (Trunc64to32 x) 39201 // cond: 39202 // result: x 39203 for { 39204 x := v.Args[0] 39205 v.reset(OpCopy) 39206 v.Type = x.Type 39207 v.AddArg(x) 39208 return true 39209 } 39210 } 39211 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 39212 // match: (Trunc64to8 x) 39213 // cond: 39214 // result: x 39215 for { 39216 x := v.Args[0] 39217 v.reset(OpCopy) 39218 v.Type = x.Type 39219 v.AddArg(x) 39220 return true 39221 } 39222 } 39223 func rewriteValueS390X_OpWB_0(v *Value) bool { 39224 // match: (WB {fn} destptr srcptr mem) 39225 // cond: 39226 // result: (LoweredWB {fn} destptr srcptr mem) 39227 for { 39228 fn := v.Aux 39229 _ = v.Args[2] 39230 destptr := v.Args[0] 39231 srcptr := v.Args[1] 39232 mem := v.Args[2] 39233 v.reset(OpS390XLoweredWB) 39234 v.Aux = fn 39235 v.AddArg(destptr) 39236 v.AddArg(srcptr) 39237 v.AddArg(mem) 39238 return true 39239 } 39240 } 39241 func rewriteValueS390X_OpXor16_0(v *Value) bool { 39242 // match: (Xor16 x y) 39243 // cond: 39244 // result: (XORW x y) 39245 for { 39246 _ = v.Args[1] 39247 x := v.Args[0] 39248 y := v.Args[1] 39249 v.reset(OpS390XXORW) 39250 v.AddArg(x) 39251 v.AddArg(y) 39252 return true 39253 } 39254 } 39255 func rewriteValueS390X_OpXor32_0(v *Value) bool { 39256 // match: (Xor32 x y) 39257 // cond: 39258 // result: (XORW x y) 39259 for { 39260 _ = v.Args[1] 39261 x := v.Args[0] 39262 y := v.Args[1] 39263 v.reset(OpS390XXORW) 39264 v.AddArg(x) 39265 v.AddArg(y) 39266 return true 39267 } 39268 } 39269 func rewriteValueS390X_OpXor64_0(v *Value) bool { 39270 // match: (Xor64 x y) 39271 // cond: 39272 // result: (XOR x y) 39273 for { 39274 _ = v.Args[1] 39275 x := v.Args[0] 39276 y := v.Args[1] 39277 v.reset(OpS390XXOR) 39278 v.AddArg(x) 39279 v.AddArg(y) 39280 return true 39281 } 39282 } 39283 func rewriteValueS390X_OpXor8_0(v *Value) bool { 39284 // match: (Xor8 x y) 39285 // cond: 39286 // result: (XORW x y) 39287 for { 39288 _ = v.Args[1] 39289 x := v.Args[0] 39290 y := v.Args[1] 39291 v.reset(OpS390XXORW) 39292 v.AddArg(x) 39293 v.AddArg(y) 39294 return true 39295 } 39296 } 39297 func rewriteValueS390X_OpZero_0(v *Value) bool { 39298 b := v.Block 39299 _ = b 39300 // match: (Zero [0] _ mem) 39301 // cond: 39302 // result: mem 39303 for { 39304 if v.AuxInt != 0 { 39305 break 39306 } 39307 _ = v.Args[1] 39308 mem := v.Args[1] 39309 v.reset(OpCopy) 39310 v.Type = mem.Type 39311 v.AddArg(mem) 39312 return true 39313 } 39314 // match: (Zero [1] destptr mem) 39315 // cond: 39316 // result: (MOVBstoreconst [0] destptr mem) 39317 for { 39318 if v.AuxInt != 1 { 39319 break 39320 } 39321 _ = v.Args[1] 39322 destptr := v.Args[0] 39323 mem := v.Args[1] 39324 v.reset(OpS390XMOVBstoreconst) 39325 v.AuxInt = 0 39326 v.AddArg(destptr) 39327 v.AddArg(mem) 39328 return true 39329 } 39330 // match: (Zero [2] destptr mem) 39331 // cond: 39332 // result: (MOVHstoreconst [0] destptr mem) 39333 for { 39334 if v.AuxInt != 2 { 39335 break 39336 } 39337 _ = v.Args[1] 39338 destptr := v.Args[0] 39339 mem := v.Args[1] 39340 v.reset(OpS390XMOVHstoreconst) 39341 v.AuxInt = 0 39342 v.AddArg(destptr) 39343 v.AddArg(mem) 39344 return true 39345 } 39346 // match: (Zero [4] destptr mem) 39347 // cond: 39348 // result: (MOVWstoreconst [0] destptr mem) 39349 for { 39350 if v.AuxInt != 4 { 39351 break 39352 } 39353 _ = v.Args[1] 39354 destptr := v.Args[0] 39355 mem := v.Args[1] 39356 v.reset(OpS390XMOVWstoreconst) 39357 v.AuxInt = 0 39358 v.AddArg(destptr) 39359 v.AddArg(mem) 39360 return true 39361 } 39362 // match: (Zero [8] destptr mem) 39363 // cond: 39364 // result: (MOVDstoreconst [0] destptr mem) 39365 for { 39366 if v.AuxInt != 8 { 39367 break 39368 } 39369 _ = v.Args[1] 39370 destptr := v.Args[0] 39371 mem := v.Args[1] 39372 v.reset(OpS390XMOVDstoreconst) 39373 v.AuxInt = 0 39374 v.AddArg(destptr) 39375 v.AddArg(mem) 39376 return true 39377 } 39378 // match: (Zero [3] destptr mem) 39379 // cond: 39380 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 39381 for { 39382 if v.AuxInt != 3 { 39383 break 39384 } 39385 _ = v.Args[1] 39386 destptr := v.Args[0] 39387 mem := v.Args[1] 39388 v.reset(OpS390XMOVBstoreconst) 39389 v.AuxInt = makeValAndOff(0, 2) 39390 v.AddArg(destptr) 39391 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 39392 v0.AuxInt = 0 39393 v0.AddArg(destptr) 39394 v0.AddArg(mem) 39395 v.AddArg(v0) 39396 return true 39397 } 39398 // match: (Zero [5] destptr mem) 39399 // cond: 39400 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 39401 for { 39402 if v.AuxInt != 5 { 39403 break 39404 } 39405 _ = v.Args[1] 39406 destptr := v.Args[0] 39407 mem := v.Args[1] 39408 v.reset(OpS390XMOVBstoreconst) 39409 v.AuxInt = makeValAndOff(0, 4) 39410 v.AddArg(destptr) 39411 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 39412 v0.AuxInt = 0 39413 v0.AddArg(destptr) 39414 v0.AddArg(mem) 39415 v.AddArg(v0) 39416 return true 39417 } 39418 // match: (Zero [6] destptr mem) 39419 // cond: 39420 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 39421 for { 39422 if v.AuxInt != 6 { 39423 break 39424 } 39425 _ = v.Args[1] 39426 destptr := v.Args[0] 39427 mem := v.Args[1] 39428 v.reset(OpS390XMOVHstoreconst) 39429 v.AuxInt = makeValAndOff(0, 4) 39430 v.AddArg(destptr) 39431 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 39432 v0.AuxInt = 0 39433 v0.AddArg(destptr) 39434 v0.AddArg(mem) 39435 v.AddArg(v0) 39436 return true 39437 } 39438 // match: (Zero [7] destptr mem) 39439 // cond: 39440 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 39441 for { 39442 if v.AuxInt != 7 { 39443 break 39444 } 39445 _ = v.Args[1] 39446 destptr := v.Args[0] 39447 mem := v.Args[1] 39448 v.reset(OpS390XMOVWstoreconst) 39449 v.AuxInt = makeValAndOff(0, 3) 39450 v.AddArg(destptr) 39451 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 39452 v0.AuxInt = 0 39453 v0.AddArg(destptr) 39454 v0.AddArg(mem) 39455 v.AddArg(v0) 39456 return true 39457 } 39458 // match: (Zero [s] destptr mem) 39459 // cond: s > 0 && s <= 1024 39460 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 39461 for { 39462 s := v.AuxInt 39463 _ = v.Args[1] 39464 destptr := v.Args[0] 39465 mem := v.Args[1] 39466 if !(s > 0 && s <= 1024) { 39467 break 39468 } 39469 v.reset(OpS390XCLEAR) 39470 v.AuxInt = makeValAndOff(s, 0) 39471 v.AddArg(destptr) 39472 v.AddArg(mem) 39473 return true 39474 } 39475 return false 39476 } 39477 func rewriteValueS390X_OpZero_10(v *Value) bool { 39478 b := v.Block 39479 _ = b 39480 // match: (Zero [s] destptr mem) 39481 // cond: s > 1024 39482 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 39483 for { 39484 s := v.AuxInt 39485 _ = v.Args[1] 39486 destptr := v.Args[0] 39487 mem := v.Args[1] 39488 if !(s > 1024) { 39489 break 39490 } 39491 v.reset(OpS390XLoweredZero) 39492 v.AuxInt = s % 256 39493 v.AddArg(destptr) 39494 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 39495 v0.AuxInt = (s / 256) * 256 39496 v0.AddArg(destptr) 39497 v.AddArg(v0) 39498 v.AddArg(mem) 39499 return true 39500 } 39501 return false 39502 } 39503 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 39504 // match: (ZeroExt16to32 x) 39505 // cond: 39506 // result: (MOVHZreg x) 39507 for { 39508 x := v.Args[0] 39509 v.reset(OpS390XMOVHZreg) 39510 v.AddArg(x) 39511 return true 39512 } 39513 } 39514 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 39515 // match: (ZeroExt16to64 x) 39516 // cond: 39517 // result: (MOVHZreg x) 39518 for { 39519 x := v.Args[0] 39520 v.reset(OpS390XMOVHZreg) 39521 v.AddArg(x) 39522 return true 39523 } 39524 } 39525 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 39526 // match: (ZeroExt32to64 x) 39527 // cond: 39528 // result: (MOVWZreg x) 39529 for { 39530 x := v.Args[0] 39531 v.reset(OpS390XMOVWZreg) 39532 v.AddArg(x) 39533 return true 39534 } 39535 } 39536 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 39537 // match: (ZeroExt8to16 x) 39538 // cond: 39539 // result: (MOVBZreg x) 39540 for { 39541 x := v.Args[0] 39542 v.reset(OpS390XMOVBZreg) 39543 v.AddArg(x) 39544 return true 39545 } 39546 } 39547 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 39548 // match: (ZeroExt8to32 x) 39549 // cond: 39550 // result: (MOVBZreg x) 39551 for { 39552 x := v.Args[0] 39553 v.reset(OpS390XMOVBZreg) 39554 v.AddArg(x) 39555 return true 39556 } 39557 } 39558 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 39559 // match: (ZeroExt8to64 x) 39560 // cond: 39561 // result: (MOVBZreg x) 39562 for { 39563 x := v.Args[0] 39564 v.reset(OpS390XMOVBZreg) 39565 v.AddArg(x) 39566 return true 39567 } 39568 } 39569 func rewriteBlockS390X(b *Block) bool { 39570 config := b.Func.Config 39571 _ = config 39572 fe := b.Func.fe 39573 _ = fe 39574 typ := &config.Types 39575 _ = typ 39576 switch b.Kind { 39577 case BlockS390XEQ: 39578 // match: (EQ (InvertFlags cmp) yes no) 39579 // cond: 39580 // result: (EQ cmp yes no) 39581 for { 39582 v := b.Control 39583 if v.Op != OpS390XInvertFlags { 39584 break 39585 } 39586 cmp := v.Args[0] 39587 b.Kind = BlockS390XEQ 39588 b.SetControl(cmp) 39589 b.Aux = nil 39590 return true 39591 } 39592 // match: (EQ (FlagEQ) yes no) 39593 // cond: 39594 // result: (First nil yes no) 39595 for { 39596 v := b.Control 39597 if v.Op != OpS390XFlagEQ { 39598 break 39599 } 39600 b.Kind = BlockFirst 39601 b.SetControl(nil) 39602 b.Aux = nil 39603 return true 39604 } 39605 // match: (EQ (FlagLT) yes no) 39606 // cond: 39607 // result: (First nil no yes) 39608 for { 39609 v := b.Control 39610 if v.Op != OpS390XFlagLT { 39611 break 39612 } 39613 b.Kind = BlockFirst 39614 b.SetControl(nil) 39615 b.Aux = nil 39616 b.swapSuccessors() 39617 return true 39618 } 39619 // match: (EQ (FlagGT) yes no) 39620 // cond: 39621 // result: (First nil no yes) 39622 for { 39623 v := b.Control 39624 if v.Op != OpS390XFlagGT { 39625 break 39626 } 39627 b.Kind = BlockFirst 39628 b.SetControl(nil) 39629 b.Aux = nil 39630 b.swapSuccessors() 39631 return true 39632 } 39633 case BlockS390XGE: 39634 // match: (GE (InvertFlags cmp) yes no) 39635 // cond: 39636 // result: (LE cmp yes no) 39637 for { 39638 v := b.Control 39639 if v.Op != OpS390XInvertFlags { 39640 break 39641 } 39642 cmp := v.Args[0] 39643 b.Kind = BlockS390XLE 39644 b.SetControl(cmp) 39645 b.Aux = nil 39646 return true 39647 } 39648 // match: (GE (FlagEQ) yes no) 39649 // cond: 39650 // result: (First nil yes no) 39651 for { 39652 v := b.Control 39653 if v.Op != OpS390XFlagEQ { 39654 break 39655 } 39656 b.Kind = BlockFirst 39657 b.SetControl(nil) 39658 b.Aux = nil 39659 return true 39660 } 39661 // match: (GE (FlagLT) yes no) 39662 // cond: 39663 // result: (First nil no yes) 39664 for { 39665 v := b.Control 39666 if v.Op != OpS390XFlagLT { 39667 break 39668 } 39669 b.Kind = BlockFirst 39670 b.SetControl(nil) 39671 b.Aux = nil 39672 b.swapSuccessors() 39673 return true 39674 } 39675 // match: (GE (FlagGT) yes no) 39676 // cond: 39677 // result: (First nil yes no) 39678 for { 39679 v := b.Control 39680 if v.Op != OpS390XFlagGT { 39681 break 39682 } 39683 b.Kind = BlockFirst 39684 b.SetControl(nil) 39685 b.Aux = nil 39686 return true 39687 } 39688 case BlockS390XGT: 39689 // match: (GT (InvertFlags cmp) yes no) 39690 // cond: 39691 // result: (LT cmp yes no) 39692 for { 39693 v := b.Control 39694 if v.Op != OpS390XInvertFlags { 39695 break 39696 } 39697 cmp := v.Args[0] 39698 b.Kind = BlockS390XLT 39699 b.SetControl(cmp) 39700 b.Aux = nil 39701 return true 39702 } 39703 // match: (GT (FlagEQ) yes no) 39704 // cond: 39705 // result: (First nil no yes) 39706 for { 39707 v := b.Control 39708 if v.Op != OpS390XFlagEQ { 39709 break 39710 } 39711 b.Kind = BlockFirst 39712 b.SetControl(nil) 39713 b.Aux = nil 39714 b.swapSuccessors() 39715 return true 39716 } 39717 // match: (GT (FlagLT) yes no) 39718 // cond: 39719 // result: (First nil no yes) 39720 for { 39721 v := b.Control 39722 if v.Op != OpS390XFlagLT { 39723 break 39724 } 39725 b.Kind = BlockFirst 39726 b.SetControl(nil) 39727 b.Aux = nil 39728 b.swapSuccessors() 39729 return true 39730 } 39731 // match: (GT (FlagGT) yes no) 39732 // cond: 39733 // result: (First nil yes no) 39734 for { 39735 v := b.Control 39736 if v.Op != OpS390XFlagGT { 39737 break 39738 } 39739 b.Kind = BlockFirst 39740 b.SetControl(nil) 39741 b.Aux = nil 39742 return true 39743 } 39744 case BlockIf: 39745 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39746 // cond: 39747 // result: (LT cmp yes no) 39748 for { 39749 v := b.Control 39750 if v.Op != OpS390XMOVDLT { 39751 break 39752 } 39753 _ = v.Args[2] 39754 v_0 := v.Args[0] 39755 if v_0.Op != OpS390XMOVDconst { 39756 break 39757 } 39758 if v_0.AuxInt != 0 { 39759 break 39760 } 39761 v_1 := v.Args[1] 39762 if v_1.Op != OpS390XMOVDconst { 39763 break 39764 } 39765 if v_1.AuxInt != 1 { 39766 break 39767 } 39768 cmp := v.Args[2] 39769 b.Kind = BlockS390XLT 39770 b.SetControl(cmp) 39771 b.Aux = nil 39772 return true 39773 } 39774 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39775 // cond: 39776 // result: (LE cmp yes no) 39777 for { 39778 v := b.Control 39779 if v.Op != OpS390XMOVDLE { 39780 break 39781 } 39782 _ = v.Args[2] 39783 v_0 := v.Args[0] 39784 if v_0.Op != OpS390XMOVDconst { 39785 break 39786 } 39787 if v_0.AuxInt != 0 { 39788 break 39789 } 39790 v_1 := v.Args[1] 39791 if v_1.Op != OpS390XMOVDconst { 39792 break 39793 } 39794 if v_1.AuxInt != 1 { 39795 break 39796 } 39797 cmp := v.Args[2] 39798 b.Kind = BlockS390XLE 39799 b.SetControl(cmp) 39800 b.Aux = nil 39801 return true 39802 } 39803 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39804 // cond: 39805 // result: (GT cmp yes no) 39806 for { 39807 v := b.Control 39808 if v.Op != OpS390XMOVDGT { 39809 break 39810 } 39811 _ = v.Args[2] 39812 v_0 := v.Args[0] 39813 if v_0.Op != OpS390XMOVDconst { 39814 break 39815 } 39816 if v_0.AuxInt != 0 { 39817 break 39818 } 39819 v_1 := v.Args[1] 39820 if v_1.Op != OpS390XMOVDconst { 39821 break 39822 } 39823 if v_1.AuxInt != 1 { 39824 break 39825 } 39826 cmp := v.Args[2] 39827 b.Kind = BlockS390XGT 39828 b.SetControl(cmp) 39829 b.Aux = nil 39830 return true 39831 } 39832 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39833 // cond: 39834 // result: (GE cmp yes no) 39835 for { 39836 v := b.Control 39837 if v.Op != OpS390XMOVDGE { 39838 break 39839 } 39840 _ = v.Args[2] 39841 v_0 := v.Args[0] 39842 if v_0.Op != OpS390XMOVDconst { 39843 break 39844 } 39845 if v_0.AuxInt != 0 { 39846 break 39847 } 39848 v_1 := v.Args[1] 39849 if v_1.Op != OpS390XMOVDconst { 39850 break 39851 } 39852 if v_1.AuxInt != 1 { 39853 break 39854 } 39855 cmp := v.Args[2] 39856 b.Kind = BlockS390XGE 39857 b.SetControl(cmp) 39858 b.Aux = nil 39859 return true 39860 } 39861 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39862 // cond: 39863 // result: (EQ cmp yes no) 39864 for { 39865 v := b.Control 39866 if v.Op != OpS390XMOVDEQ { 39867 break 39868 } 39869 _ = v.Args[2] 39870 v_0 := v.Args[0] 39871 if v_0.Op != OpS390XMOVDconst { 39872 break 39873 } 39874 if v_0.AuxInt != 0 { 39875 break 39876 } 39877 v_1 := v.Args[1] 39878 if v_1.Op != OpS390XMOVDconst { 39879 break 39880 } 39881 if v_1.AuxInt != 1 { 39882 break 39883 } 39884 cmp := v.Args[2] 39885 b.Kind = BlockS390XEQ 39886 b.SetControl(cmp) 39887 b.Aux = nil 39888 return true 39889 } 39890 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39891 // cond: 39892 // result: (NE cmp yes no) 39893 for { 39894 v := b.Control 39895 if v.Op != OpS390XMOVDNE { 39896 break 39897 } 39898 _ = v.Args[2] 39899 v_0 := v.Args[0] 39900 if v_0.Op != OpS390XMOVDconst { 39901 break 39902 } 39903 if v_0.AuxInt != 0 { 39904 break 39905 } 39906 v_1 := v.Args[1] 39907 if v_1.Op != OpS390XMOVDconst { 39908 break 39909 } 39910 if v_1.AuxInt != 1 { 39911 break 39912 } 39913 cmp := v.Args[2] 39914 b.Kind = BlockS390XNE 39915 b.SetControl(cmp) 39916 b.Aux = nil 39917 return true 39918 } 39919 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39920 // cond: 39921 // result: (GTF cmp yes no) 39922 for { 39923 v := b.Control 39924 if v.Op != OpS390XMOVDGTnoinv { 39925 break 39926 } 39927 _ = v.Args[2] 39928 v_0 := v.Args[0] 39929 if v_0.Op != OpS390XMOVDconst { 39930 break 39931 } 39932 if v_0.AuxInt != 0 { 39933 break 39934 } 39935 v_1 := v.Args[1] 39936 if v_1.Op != OpS390XMOVDconst { 39937 break 39938 } 39939 if v_1.AuxInt != 1 { 39940 break 39941 } 39942 cmp := v.Args[2] 39943 b.Kind = BlockS390XGTF 39944 b.SetControl(cmp) 39945 b.Aux = nil 39946 return true 39947 } 39948 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 39949 // cond: 39950 // result: (GEF cmp yes no) 39951 for { 39952 v := b.Control 39953 if v.Op != OpS390XMOVDGEnoinv { 39954 break 39955 } 39956 _ = v.Args[2] 39957 v_0 := v.Args[0] 39958 if v_0.Op != OpS390XMOVDconst { 39959 break 39960 } 39961 if v_0.AuxInt != 0 { 39962 break 39963 } 39964 v_1 := v.Args[1] 39965 if v_1.Op != OpS390XMOVDconst { 39966 break 39967 } 39968 if v_1.AuxInt != 1 { 39969 break 39970 } 39971 cmp := v.Args[2] 39972 b.Kind = BlockS390XGEF 39973 b.SetControl(cmp) 39974 b.Aux = nil 39975 return true 39976 } 39977 // match: (If cond yes no) 39978 // cond: 39979 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 39980 for { 39981 v := b.Control 39982 _ = v 39983 cond := b.Control 39984 b.Kind = BlockS390XNE 39985 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 39986 v0.AuxInt = 0 39987 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 39988 v1.AddArg(cond) 39989 v0.AddArg(v1) 39990 b.SetControl(v0) 39991 b.Aux = nil 39992 return true 39993 } 39994 case BlockS390XLE: 39995 // match: (LE (InvertFlags cmp) yes no) 39996 // cond: 39997 // result: (GE cmp yes no) 39998 for { 39999 v := b.Control 40000 if v.Op != OpS390XInvertFlags { 40001 break 40002 } 40003 cmp := v.Args[0] 40004 b.Kind = BlockS390XGE 40005 b.SetControl(cmp) 40006 b.Aux = nil 40007 return true 40008 } 40009 // match: (LE (FlagEQ) yes no) 40010 // cond: 40011 // result: (First nil yes no) 40012 for { 40013 v := b.Control 40014 if v.Op != OpS390XFlagEQ { 40015 break 40016 } 40017 b.Kind = BlockFirst 40018 b.SetControl(nil) 40019 b.Aux = nil 40020 return true 40021 } 40022 // match: (LE (FlagLT) yes no) 40023 // cond: 40024 // result: (First nil yes no) 40025 for { 40026 v := b.Control 40027 if v.Op != OpS390XFlagLT { 40028 break 40029 } 40030 b.Kind = BlockFirst 40031 b.SetControl(nil) 40032 b.Aux = nil 40033 return true 40034 } 40035 // match: (LE (FlagGT) yes no) 40036 // cond: 40037 // result: (First nil no yes) 40038 for { 40039 v := b.Control 40040 if v.Op != OpS390XFlagGT { 40041 break 40042 } 40043 b.Kind = BlockFirst 40044 b.SetControl(nil) 40045 b.Aux = nil 40046 b.swapSuccessors() 40047 return true 40048 } 40049 case BlockS390XLT: 40050 // match: (LT (InvertFlags cmp) yes no) 40051 // cond: 40052 // result: (GT cmp yes no) 40053 for { 40054 v := b.Control 40055 if v.Op != OpS390XInvertFlags { 40056 break 40057 } 40058 cmp := v.Args[0] 40059 b.Kind = BlockS390XGT 40060 b.SetControl(cmp) 40061 b.Aux = nil 40062 return true 40063 } 40064 // match: (LT (FlagEQ) yes no) 40065 // cond: 40066 // result: (First nil no yes) 40067 for { 40068 v := b.Control 40069 if v.Op != OpS390XFlagEQ { 40070 break 40071 } 40072 b.Kind = BlockFirst 40073 b.SetControl(nil) 40074 b.Aux = nil 40075 b.swapSuccessors() 40076 return true 40077 } 40078 // match: (LT (FlagLT) yes no) 40079 // cond: 40080 // result: (First nil yes no) 40081 for { 40082 v := b.Control 40083 if v.Op != OpS390XFlagLT { 40084 break 40085 } 40086 b.Kind = BlockFirst 40087 b.SetControl(nil) 40088 b.Aux = nil 40089 return true 40090 } 40091 // match: (LT (FlagGT) yes no) 40092 // cond: 40093 // result: (First nil no yes) 40094 for { 40095 v := b.Control 40096 if v.Op != OpS390XFlagGT { 40097 break 40098 } 40099 b.Kind = BlockFirst 40100 b.SetControl(nil) 40101 b.Aux = nil 40102 b.swapSuccessors() 40103 return true 40104 } 40105 case BlockS390XNE: 40106 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40107 // cond: 40108 // result: (LT cmp yes no) 40109 for { 40110 v := b.Control 40111 if v.Op != OpS390XCMPWconst { 40112 break 40113 } 40114 if v.AuxInt != 0 { 40115 break 40116 } 40117 v_0 := v.Args[0] 40118 if v_0.Op != OpS390XMOVDLT { 40119 break 40120 } 40121 _ = v_0.Args[2] 40122 v_0_0 := v_0.Args[0] 40123 if v_0_0.Op != OpS390XMOVDconst { 40124 break 40125 } 40126 if v_0_0.AuxInt != 0 { 40127 break 40128 } 40129 v_0_1 := v_0.Args[1] 40130 if v_0_1.Op != OpS390XMOVDconst { 40131 break 40132 } 40133 if v_0_1.AuxInt != 1 { 40134 break 40135 } 40136 cmp := v_0.Args[2] 40137 b.Kind = BlockS390XLT 40138 b.SetControl(cmp) 40139 b.Aux = nil 40140 return true 40141 } 40142 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40143 // cond: 40144 // result: (LE cmp yes no) 40145 for { 40146 v := b.Control 40147 if v.Op != OpS390XCMPWconst { 40148 break 40149 } 40150 if v.AuxInt != 0 { 40151 break 40152 } 40153 v_0 := v.Args[0] 40154 if v_0.Op != OpS390XMOVDLE { 40155 break 40156 } 40157 _ = v_0.Args[2] 40158 v_0_0 := v_0.Args[0] 40159 if v_0_0.Op != OpS390XMOVDconst { 40160 break 40161 } 40162 if v_0_0.AuxInt != 0 { 40163 break 40164 } 40165 v_0_1 := v_0.Args[1] 40166 if v_0_1.Op != OpS390XMOVDconst { 40167 break 40168 } 40169 if v_0_1.AuxInt != 1 { 40170 break 40171 } 40172 cmp := v_0.Args[2] 40173 b.Kind = BlockS390XLE 40174 b.SetControl(cmp) 40175 b.Aux = nil 40176 return true 40177 } 40178 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40179 // cond: 40180 // result: (GT cmp yes no) 40181 for { 40182 v := b.Control 40183 if v.Op != OpS390XCMPWconst { 40184 break 40185 } 40186 if v.AuxInt != 0 { 40187 break 40188 } 40189 v_0 := v.Args[0] 40190 if v_0.Op != OpS390XMOVDGT { 40191 break 40192 } 40193 _ = v_0.Args[2] 40194 v_0_0 := v_0.Args[0] 40195 if v_0_0.Op != OpS390XMOVDconst { 40196 break 40197 } 40198 if v_0_0.AuxInt != 0 { 40199 break 40200 } 40201 v_0_1 := v_0.Args[1] 40202 if v_0_1.Op != OpS390XMOVDconst { 40203 break 40204 } 40205 if v_0_1.AuxInt != 1 { 40206 break 40207 } 40208 cmp := v_0.Args[2] 40209 b.Kind = BlockS390XGT 40210 b.SetControl(cmp) 40211 b.Aux = nil 40212 return true 40213 } 40214 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40215 // cond: 40216 // result: (GE cmp yes no) 40217 for { 40218 v := b.Control 40219 if v.Op != OpS390XCMPWconst { 40220 break 40221 } 40222 if v.AuxInt != 0 { 40223 break 40224 } 40225 v_0 := v.Args[0] 40226 if v_0.Op != OpS390XMOVDGE { 40227 break 40228 } 40229 _ = v_0.Args[2] 40230 v_0_0 := v_0.Args[0] 40231 if v_0_0.Op != OpS390XMOVDconst { 40232 break 40233 } 40234 if v_0_0.AuxInt != 0 { 40235 break 40236 } 40237 v_0_1 := v_0.Args[1] 40238 if v_0_1.Op != OpS390XMOVDconst { 40239 break 40240 } 40241 if v_0_1.AuxInt != 1 { 40242 break 40243 } 40244 cmp := v_0.Args[2] 40245 b.Kind = BlockS390XGE 40246 b.SetControl(cmp) 40247 b.Aux = nil 40248 return true 40249 } 40250 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40251 // cond: 40252 // result: (EQ cmp yes no) 40253 for { 40254 v := b.Control 40255 if v.Op != OpS390XCMPWconst { 40256 break 40257 } 40258 if v.AuxInt != 0 { 40259 break 40260 } 40261 v_0 := v.Args[0] 40262 if v_0.Op != OpS390XMOVDEQ { 40263 break 40264 } 40265 _ = v_0.Args[2] 40266 v_0_0 := v_0.Args[0] 40267 if v_0_0.Op != OpS390XMOVDconst { 40268 break 40269 } 40270 if v_0_0.AuxInt != 0 { 40271 break 40272 } 40273 v_0_1 := v_0.Args[1] 40274 if v_0_1.Op != OpS390XMOVDconst { 40275 break 40276 } 40277 if v_0_1.AuxInt != 1 { 40278 break 40279 } 40280 cmp := v_0.Args[2] 40281 b.Kind = BlockS390XEQ 40282 b.SetControl(cmp) 40283 b.Aux = nil 40284 return true 40285 } 40286 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40287 // cond: 40288 // result: (NE cmp yes no) 40289 for { 40290 v := b.Control 40291 if v.Op != OpS390XCMPWconst { 40292 break 40293 } 40294 if v.AuxInt != 0 { 40295 break 40296 } 40297 v_0 := v.Args[0] 40298 if v_0.Op != OpS390XMOVDNE { 40299 break 40300 } 40301 _ = v_0.Args[2] 40302 v_0_0 := v_0.Args[0] 40303 if v_0_0.Op != OpS390XMOVDconst { 40304 break 40305 } 40306 if v_0_0.AuxInt != 0 { 40307 break 40308 } 40309 v_0_1 := v_0.Args[1] 40310 if v_0_1.Op != OpS390XMOVDconst { 40311 break 40312 } 40313 if v_0_1.AuxInt != 1 { 40314 break 40315 } 40316 cmp := v_0.Args[2] 40317 b.Kind = BlockS390XNE 40318 b.SetControl(cmp) 40319 b.Aux = nil 40320 return true 40321 } 40322 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40323 // cond: 40324 // result: (GTF cmp yes no) 40325 for { 40326 v := b.Control 40327 if v.Op != OpS390XCMPWconst { 40328 break 40329 } 40330 if v.AuxInt != 0 { 40331 break 40332 } 40333 v_0 := v.Args[0] 40334 if v_0.Op != OpS390XMOVDGTnoinv { 40335 break 40336 } 40337 _ = v_0.Args[2] 40338 v_0_0 := v_0.Args[0] 40339 if v_0_0.Op != OpS390XMOVDconst { 40340 break 40341 } 40342 if v_0_0.AuxInt != 0 { 40343 break 40344 } 40345 v_0_1 := v_0.Args[1] 40346 if v_0_1.Op != OpS390XMOVDconst { 40347 break 40348 } 40349 if v_0_1.AuxInt != 1 { 40350 break 40351 } 40352 cmp := v_0.Args[2] 40353 b.Kind = BlockS390XGTF 40354 b.SetControl(cmp) 40355 b.Aux = nil 40356 return true 40357 } 40358 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 40359 // cond: 40360 // result: (GEF cmp yes no) 40361 for { 40362 v := b.Control 40363 if v.Op != OpS390XCMPWconst { 40364 break 40365 } 40366 if v.AuxInt != 0 { 40367 break 40368 } 40369 v_0 := v.Args[0] 40370 if v_0.Op != OpS390XMOVDGEnoinv { 40371 break 40372 } 40373 _ = v_0.Args[2] 40374 v_0_0 := v_0.Args[0] 40375 if v_0_0.Op != OpS390XMOVDconst { 40376 break 40377 } 40378 if v_0_0.AuxInt != 0 { 40379 break 40380 } 40381 v_0_1 := v_0.Args[1] 40382 if v_0_1.Op != OpS390XMOVDconst { 40383 break 40384 } 40385 if v_0_1.AuxInt != 1 { 40386 break 40387 } 40388 cmp := v_0.Args[2] 40389 b.Kind = BlockS390XGEF 40390 b.SetControl(cmp) 40391 b.Aux = nil 40392 return true 40393 } 40394 // match: (NE (InvertFlags cmp) yes no) 40395 // cond: 40396 // result: (NE cmp yes no) 40397 for { 40398 v := b.Control 40399 if v.Op != OpS390XInvertFlags { 40400 break 40401 } 40402 cmp := v.Args[0] 40403 b.Kind = BlockS390XNE 40404 b.SetControl(cmp) 40405 b.Aux = nil 40406 return true 40407 } 40408 // match: (NE (FlagEQ) yes no) 40409 // cond: 40410 // result: (First nil no yes) 40411 for { 40412 v := b.Control 40413 if v.Op != OpS390XFlagEQ { 40414 break 40415 } 40416 b.Kind = BlockFirst 40417 b.SetControl(nil) 40418 b.Aux = nil 40419 b.swapSuccessors() 40420 return true 40421 } 40422 // match: (NE (FlagLT) yes no) 40423 // cond: 40424 // result: (First nil yes no) 40425 for { 40426 v := b.Control 40427 if v.Op != OpS390XFlagLT { 40428 break 40429 } 40430 b.Kind = BlockFirst 40431 b.SetControl(nil) 40432 b.Aux = nil 40433 return true 40434 } 40435 // match: (NE (FlagGT) yes no) 40436 // cond: 40437 // result: (First nil yes no) 40438 for { 40439 v := b.Control 40440 if v.Op != OpS390XFlagGT { 40441 break 40442 } 40443 b.Kind = BlockFirst 40444 b.SetControl(nil) 40445 b.Aux = nil 40446 return true 40447 } 40448 } 40449 return false 40450 }