github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/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 OpClosureCall: 77 return rewriteValueS390X_OpClosureCall_0(v) 78 case OpCom16: 79 return rewriteValueS390X_OpCom16_0(v) 80 case OpCom32: 81 return rewriteValueS390X_OpCom32_0(v) 82 case OpCom64: 83 return rewriteValueS390X_OpCom64_0(v) 84 case OpCom8: 85 return rewriteValueS390X_OpCom8_0(v) 86 case OpConst16: 87 return rewriteValueS390X_OpConst16_0(v) 88 case OpConst32: 89 return rewriteValueS390X_OpConst32_0(v) 90 case OpConst32F: 91 return rewriteValueS390X_OpConst32F_0(v) 92 case OpConst64: 93 return rewriteValueS390X_OpConst64_0(v) 94 case OpConst64F: 95 return rewriteValueS390X_OpConst64F_0(v) 96 case OpConst8: 97 return rewriteValueS390X_OpConst8_0(v) 98 case OpConstBool: 99 return rewriteValueS390X_OpConstBool_0(v) 100 case OpConstNil: 101 return rewriteValueS390X_OpConstNil_0(v) 102 case OpConvert: 103 return rewriteValueS390X_OpConvert_0(v) 104 case OpCtz32: 105 return rewriteValueS390X_OpCtz32_0(v) 106 case OpCtz64: 107 return rewriteValueS390X_OpCtz64_0(v) 108 case OpCvt32Fto32: 109 return rewriteValueS390X_OpCvt32Fto32_0(v) 110 case OpCvt32Fto64: 111 return rewriteValueS390X_OpCvt32Fto64_0(v) 112 case OpCvt32Fto64F: 113 return rewriteValueS390X_OpCvt32Fto64F_0(v) 114 case OpCvt32to32F: 115 return rewriteValueS390X_OpCvt32to32F_0(v) 116 case OpCvt32to64F: 117 return rewriteValueS390X_OpCvt32to64F_0(v) 118 case OpCvt64Fto32: 119 return rewriteValueS390X_OpCvt64Fto32_0(v) 120 case OpCvt64Fto32F: 121 return rewriteValueS390X_OpCvt64Fto32F_0(v) 122 case OpCvt64Fto64: 123 return rewriteValueS390X_OpCvt64Fto64_0(v) 124 case OpCvt64to32F: 125 return rewriteValueS390X_OpCvt64to32F_0(v) 126 case OpCvt64to64F: 127 return rewriteValueS390X_OpCvt64to64F_0(v) 128 case OpDiv16: 129 return rewriteValueS390X_OpDiv16_0(v) 130 case OpDiv16u: 131 return rewriteValueS390X_OpDiv16u_0(v) 132 case OpDiv32: 133 return rewriteValueS390X_OpDiv32_0(v) 134 case OpDiv32F: 135 return rewriteValueS390X_OpDiv32F_0(v) 136 case OpDiv32u: 137 return rewriteValueS390X_OpDiv32u_0(v) 138 case OpDiv64: 139 return rewriteValueS390X_OpDiv64_0(v) 140 case OpDiv64F: 141 return rewriteValueS390X_OpDiv64F_0(v) 142 case OpDiv64u: 143 return rewriteValueS390X_OpDiv64u_0(v) 144 case OpDiv8: 145 return rewriteValueS390X_OpDiv8_0(v) 146 case OpDiv8u: 147 return rewriteValueS390X_OpDiv8u_0(v) 148 case OpEq16: 149 return rewriteValueS390X_OpEq16_0(v) 150 case OpEq32: 151 return rewriteValueS390X_OpEq32_0(v) 152 case OpEq32F: 153 return rewriteValueS390X_OpEq32F_0(v) 154 case OpEq64: 155 return rewriteValueS390X_OpEq64_0(v) 156 case OpEq64F: 157 return rewriteValueS390X_OpEq64F_0(v) 158 case OpEq8: 159 return rewriteValueS390X_OpEq8_0(v) 160 case OpEqB: 161 return rewriteValueS390X_OpEqB_0(v) 162 case OpEqPtr: 163 return rewriteValueS390X_OpEqPtr_0(v) 164 case OpGeq16: 165 return rewriteValueS390X_OpGeq16_0(v) 166 case OpGeq16U: 167 return rewriteValueS390X_OpGeq16U_0(v) 168 case OpGeq32: 169 return rewriteValueS390X_OpGeq32_0(v) 170 case OpGeq32F: 171 return rewriteValueS390X_OpGeq32F_0(v) 172 case OpGeq32U: 173 return rewriteValueS390X_OpGeq32U_0(v) 174 case OpGeq64: 175 return rewriteValueS390X_OpGeq64_0(v) 176 case OpGeq64F: 177 return rewriteValueS390X_OpGeq64F_0(v) 178 case OpGeq64U: 179 return rewriteValueS390X_OpGeq64U_0(v) 180 case OpGeq8: 181 return rewriteValueS390X_OpGeq8_0(v) 182 case OpGeq8U: 183 return rewriteValueS390X_OpGeq8U_0(v) 184 case OpGetClosurePtr: 185 return rewriteValueS390X_OpGetClosurePtr_0(v) 186 case OpGetG: 187 return rewriteValueS390X_OpGetG_0(v) 188 case OpGreater16: 189 return rewriteValueS390X_OpGreater16_0(v) 190 case OpGreater16U: 191 return rewriteValueS390X_OpGreater16U_0(v) 192 case OpGreater32: 193 return rewriteValueS390X_OpGreater32_0(v) 194 case OpGreater32F: 195 return rewriteValueS390X_OpGreater32F_0(v) 196 case OpGreater32U: 197 return rewriteValueS390X_OpGreater32U_0(v) 198 case OpGreater64: 199 return rewriteValueS390X_OpGreater64_0(v) 200 case OpGreater64F: 201 return rewriteValueS390X_OpGreater64F_0(v) 202 case OpGreater64U: 203 return rewriteValueS390X_OpGreater64U_0(v) 204 case OpGreater8: 205 return rewriteValueS390X_OpGreater8_0(v) 206 case OpGreater8U: 207 return rewriteValueS390X_OpGreater8U_0(v) 208 case OpHmul32: 209 return rewriteValueS390X_OpHmul32_0(v) 210 case OpHmul32u: 211 return rewriteValueS390X_OpHmul32u_0(v) 212 case OpHmul64: 213 return rewriteValueS390X_OpHmul64_0(v) 214 case OpHmul64u: 215 return rewriteValueS390X_OpHmul64u_0(v) 216 case OpITab: 217 return rewriteValueS390X_OpITab_0(v) 218 case OpInterCall: 219 return rewriteValueS390X_OpInterCall_0(v) 220 case OpIsInBounds: 221 return rewriteValueS390X_OpIsInBounds_0(v) 222 case OpIsNonNil: 223 return rewriteValueS390X_OpIsNonNil_0(v) 224 case OpIsSliceInBounds: 225 return rewriteValueS390X_OpIsSliceInBounds_0(v) 226 case OpLeq16: 227 return rewriteValueS390X_OpLeq16_0(v) 228 case OpLeq16U: 229 return rewriteValueS390X_OpLeq16U_0(v) 230 case OpLeq32: 231 return rewriteValueS390X_OpLeq32_0(v) 232 case OpLeq32F: 233 return rewriteValueS390X_OpLeq32F_0(v) 234 case OpLeq32U: 235 return rewriteValueS390X_OpLeq32U_0(v) 236 case OpLeq64: 237 return rewriteValueS390X_OpLeq64_0(v) 238 case OpLeq64F: 239 return rewriteValueS390X_OpLeq64F_0(v) 240 case OpLeq64U: 241 return rewriteValueS390X_OpLeq64U_0(v) 242 case OpLeq8: 243 return rewriteValueS390X_OpLeq8_0(v) 244 case OpLeq8U: 245 return rewriteValueS390X_OpLeq8U_0(v) 246 case OpLess16: 247 return rewriteValueS390X_OpLess16_0(v) 248 case OpLess16U: 249 return rewriteValueS390X_OpLess16U_0(v) 250 case OpLess32: 251 return rewriteValueS390X_OpLess32_0(v) 252 case OpLess32F: 253 return rewriteValueS390X_OpLess32F_0(v) 254 case OpLess32U: 255 return rewriteValueS390X_OpLess32U_0(v) 256 case OpLess64: 257 return rewriteValueS390X_OpLess64_0(v) 258 case OpLess64F: 259 return rewriteValueS390X_OpLess64F_0(v) 260 case OpLess64U: 261 return rewriteValueS390X_OpLess64U_0(v) 262 case OpLess8: 263 return rewriteValueS390X_OpLess8_0(v) 264 case OpLess8U: 265 return rewriteValueS390X_OpLess8U_0(v) 266 case OpLoad: 267 return rewriteValueS390X_OpLoad_0(v) 268 case OpLsh16x16: 269 return rewriteValueS390X_OpLsh16x16_0(v) 270 case OpLsh16x32: 271 return rewriteValueS390X_OpLsh16x32_0(v) 272 case OpLsh16x64: 273 return rewriteValueS390X_OpLsh16x64_0(v) 274 case OpLsh16x8: 275 return rewriteValueS390X_OpLsh16x8_0(v) 276 case OpLsh32x16: 277 return rewriteValueS390X_OpLsh32x16_0(v) 278 case OpLsh32x32: 279 return rewriteValueS390X_OpLsh32x32_0(v) 280 case OpLsh32x64: 281 return rewriteValueS390X_OpLsh32x64_0(v) 282 case OpLsh32x8: 283 return rewriteValueS390X_OpLsh32x8_0(v) 284 case OpLsh64x16: 285 return rewriteValueS390X_OpLsh64x16_0(v) 286 case OpLsh64x32: 287 return rewriteValueS390X_OpLsh64x32_0(v) 288 case OpLsh64x64: 289 return rewriteValueS390X_OpLsh64x64_0(v) 290 case OpLsh64x8: 291 return rewriteValueS390X_OpLsh64x8_0(v) 292 case OpLsh8x16: 293 return rewriteValueS390X_OpLsh8x16_0(v) 294 case OpLsh8x32: 295 return rewriteValueS390X_OpLsh8x32_0(v) 296 case OpLsh8x64: 297 return rewriteValueS390X_OpLsh8x64_0(v) 298 case OpLsh8x8: 299 return rewriteValueS390X_OpLsh8x8_0(v) 300 case OpMod16: 301 return rewriteValueS390X_OpMod16_0(v) 302 case OpMod16u: 303 return rewriteValueS390X_OpMod16u_0(v) 304 case OpMod32: 305 return rewriteValueS390X_OpMod32_0(v) 306 case OpMod32u: 307 return rewriteValueS390X_OpMod32u_0(v) 308 case OpMod64: 309 return rewriteValueS390X_OpMod64_0(v) 310 case OpMod64u: 311 return rewriteValueS390X_OpMod64u_0(v) 312 case OpMod8: 313 return rewriteValueS390X_OpMod8_0(v) 314 case OpMod8u: 315 return rewriteValueS390X_OpMod8u_0(v) 316 case OpMove: 317 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 318 case OpMul16: 319 return rewriteValueS390X_OpMul16_0(v) 320 case OpMul32: 321 return rewriteValueS390X_OpMul32_0(v) 322 case OpMul32F: 323 return rewriteValueS390X_OpMul32F_0(v) 324 case OpMul64: 325 return rewriteValueS390X_OpMul64_0(v) 326 case OpMul64F: 327 return rewriteValueS390X_OpMul64F_0(v) 328 case OpMul8: 329 return rewriteValueS390X_OpMul8_0(v) 330 case OpNeg16: 331 return rewriteValueS390X_OpNeg16_0(v) 332 case OpNeg32: 333 return rewriteValueS390X_OpNeg32_0(v) 334 case OpNeg32F: 335 return rewriteValueS390X_OpNeg32F_0(v) 336 case OpNeg64: 337 return rewriteValueS390X_OpNeg64_0(v) 338 case OpNeg64F: 339 return rewriteValueS390X_OpNeg64F_0(v) 340 case OpNeg8: 341 return rewriteValueS390X_OpNeg8_0(v) 342 case OpNeq16: 343 return rewriteValueS390X_OpNeq16_0(v) 344 case OpNeq32: 345 return rewriteValueS390X_OpNeq32_0(v) 346 case OpNeq32F: 347 return rewriteValueS390X_OpNeq32F_0(v) 348 case OpNeq64: 349 return rewriteValueS390X_OpNeq64_0(v) 350 case OpNeq64F: 351 return rewriteValueS390X_OpNeq64F_0(v) 352 case OpNeq8: 353 return rewriteValueS390X_OpNeq8_0(v) 354 case OpNeqB: 355 return rewriteValueS390X_OpNeqB_0(v) 356 case OpNeqPtr: 357 return rewriteValueS390X_OpNeqPtr_0(v) 358 case OpNilCheck: 359 return rewriteValueS390X_OpNilCheck_0(v) 360 case OpNot: 361 return rewriteValueS390X_OpNot_0(v) 362 case OpOffPtr: 363 return rewriteValueS390X_OpOffPtr_0(v) 364 case OpOr16: 365 return rewriteValueS390X_OpOr16_0(v) 366 case OpOr32: 367 return rewriteValueS390X_OpOr32_0(v) 368 case OpOr64: 369 return rewriteValueS390X_OpOr64_0(v) 370 case OpOr8: 371 return rewriteValueS390X_OpOr8_0(v) 372 case OpOrB: 373 return rewriteValueS390X_OpOrB_0(v) 374 case OpRound32F: 375 return rewriteValueS390X_OpRound32F_0(v) 376 case OpRound64F: 377 return rewriteValueS390X_OpRound64F_0(v) 378 case OpRsh16Ux16: 379 return rewriteValueS390X_OpRsh16Ux16_0(v) 380 case OpRsh16Ux32: 381 return rewriteValueS390X_OpRsh16Ux32_0(v) 382 case OpRsh16Ux64: 383 return rewriteValueS390X_OpRsh16Ux64_0(v) 384 case OpRsh16Ux8: 385 return rewriteValueS390X_OpRsh16Ux8_0(v) 386 case OpRsh16x16: 387 return rewriteValueS390X_OpRsh16x16_0(v) 388 case OpRsh16x32: 389 return rewriteValueS390X_OpRsh16x32_0(v) 390 case OpRsh16x64: 391 return rewriteValueS390X_OpRsh16x64_0(v) 392 case OpRsh16x8: 393 return rewriteValueS390X_OpRsh16x8_0(v) 394 case OpRsh32Ux16: 395 return rewriteValueS390X_OpRsh32Ux16_0(v) 396 case OpRsh32Ux32: 397 return rewriteValueS390X_OpRsh32Ux32_0(v) 398 case OpRsh32Ux64: 399 return rewriteValueS390X_OpRsh32Ux64_0(v) 400 case OpRsh32Ux8: 401 return rewriteValueS390X_OpRsh32Ux8_0(v) 402 case OpRsh32x16: 403 return rewriteValueS390X_OpRsh32x16_0(v) 404 case OpRsh32x32: 405 return rewriteValueS390X_OpRsh32x32_0(v) 406 case OpRsh32x64: 407 return rewriteValueS390X_OpRsh32x64_0(v) 408 case OpRsh32x8: 409 return rewriteValueS390X_OpRsh32x8_0(v) 410 case OpRsh64Ux16: 411 return rewriteValueS390X_OpRsh64Ux16_0(v) 412 case OpRsh64Ux32: 413 return rewriteValueS390X_OpRsh64Ux32_0(v) 414 case OpRsh64Ux64: 415 return rewriteValueS390X_OpRsh64Ux64_0(v) 416 case OpRsh64Ux8: 417 return rewriteValueS390X_OpRsh64Ux8_0(v) 418 case OpRsh64x16: 419 return rewriteValueS390X_OpRsh64x16_0(v) 420 case OpRsh64x32: 421 return rewriteValueS390X_OpRsh64x32_0(v) 422 case OpRsh64x64: 423 return rewriteValueS390X_OpRsh64x64_0(v) 424 case OpRsh64x8: 425 return rewriteValueS390X_OpRsh64x8_0(v) 426 case OpRsh8Ux16: 427 return rewriteValueS390X_OpRsh8Ux16_0(v) 428 case OpRsh8Ux32: 429 return rewriteValueS390X_OpRsh8Ux32_0(v) 430 case OpRsh8Ux64: 431 return rewriteValueS390X_OpRsh8Ux64_0(v) 432 case OpRsh8Ux8: 433 return rewriteValueS390X_OpRsh8Ux8_0(v) 434 case OpRsh8x16: 435 return rewriteValueS390X_OpRsh8x16_0(v) 436 case OpRsh8x32: 437 return rewriteValueS390X_OpRsh8x32_0(v) 438 case OpRsh8x64: 439 return rewriteValueS390X_OpRsh8x64_0(v) 440 case OpRsh8x8: 441 return rewriteValueS390X_OpRsh8x8_0(v) 442 case OpS390XADD: 443 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 444 case OpS390XADDW: 445 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 446 case OpS390XADDWconst: 447 return rewriteValueS390X_OpS390XADDWconst_0(v) 448 case OpS390XADDconst: 449 return rewriteValueS390X_OpS390XADDconst_0(v) 450 case OpS390XAND: 451 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 452 case OpS390XANDW: 453 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 454 case OpS390XANDWconst: 455 return rewriteValueS390X_OpS390XANDWconst_0(v) 456 case OpS390XANDconst: 457 return rewriteValueS390X_OpS390XANDconst_0(v) 458 case OpS390XCMP: 459 return rewriteValueS390X_OpS390XCMP_0(v) 460 case OpS390XCMPU: 461 return rewriteValueS390X_OpS390XCMPU_0(v) 462 case OpS390XCMPUconst: 463 return rewriteValueS390X_OpS390XCMPUconst_0(v) 464 case OpS390XCMPW: 465 return rewriteValueS390X_OpS390XCMPW_0(v) 466 case OpS390XCMPWU: 467 return rewriteValueS390X_OpS390XCMPWU_0(v) 468 case OpS390XCMPWUconst: 469 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 470 case OpS390XCMPWconst: 471 return rewriteValueS390X_OpS390XCMPWconst_0(v) 472 case OpS390XCMPconst: 473 return rewriteValueS390X_OpS390XCMPconst_0(v) 474 case OpS390XFADD: 475 return rewriteValueS390X_OpS390XFADD_0(v) 476 case OpS390XFADDS: 477 return rewriteValueS390X_OpS390XFADDS_0(v) 478 case OpS390XFMOVDload: 479 return rewriteValueS390X_OpS390XFMOVDload_0(v) 480 case OpS390XFMOVDloadidx: 481 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 482 case OpS390XFMOVDstore: 483 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 484 case OpS390XFMOVDstoreidx: 485 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 486 case OpS390XFMOVSload: 487 return rewriteValueS390X_OpS390XFMOVSload_0(v) 488 case OpS390XFMOVSloadidx: 489 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 490 case OpS390XFMOVSstore: 491 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 492 case OpS390XFMOVSstoreidx: 493 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 494 case OpS390XFSUB: 495 return rewriteValueS390X_OpS390XFSUB_0(v) 496 case OpS390XFSUBS: 497 return rewriteValueS390X_OpS390XFSUBS_0(v) 498 case OpS390XLoweredRound32F: 499 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 500 case OpS390XLoweredRound64F: 501 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 502 case OpS390XMOVBZload: 503 return rewriteValueS390X_OpS390XMOVBZload_0(v) 504 case OpS390XMOVBZloadidx: 505 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 506 case OpS390XMOVBZreg: 507 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 508 case OpS390XMOVBload: 509 return rewriteValueS390X_OpS390XMOVBload_0(v) 510 case OpS390XMOVBreg: 511 return rewriteValueS390X_OpS390XMOVBreg_0(v) 512 case OpS390XMOVBstore: 513 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 514 case OpS390XMOVBstoreconst: 515 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 516 case OpS390XMOVBstoreidx: 517 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 518 case OpS390XMOVDEQ: 519 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 520 case OpS390XMOVDGE: 521 return rewriteValueS390X_OpS390XMOVDGE_0(v) 522 case OpS390XMOVDGT: 523 return rewriteValueS390X_OpS390XMOVDGT_0(v) 524 case OpS390XMOVDLE: 525 return rewriteValueS390X_OpS390XMOVDLE_0(v) 526 case OpS390XMOVDLT: 527 return rewriteValueS390X_OpS390XMOVDLT_0(v) 528 case OpS390XMOVDNE: 529 return rewriteValueS390X_OpS390XMOVDNE_0(v) 530 case OpS390XMOVDaddridx: 531 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 532 case OpS390XMOVDload: 533 return rewriteValueS390X_OpS390XMOVDload_0(v) 534 case OpS390XMOVDloadidx: 535 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 536 case OpS390XMOVDnop: 537 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 538 case OpS390XMOVDreg: 539 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 540 case OpS390XMOVDstore: 541 return rewriteValueS390X_OpS390XMOVDstore_0(v) 542 case OpS390XMOVDstoreconst: 543 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 544 case OpS390XMOVDstoreidx: 545 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 546 case OpS390XMOVHBRstore: 547 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 548 case OpS390XMOVHBRstoreidx: 549 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 550 case OpS390XMOVHZload: 551 return rewriteValueS390X_OpS390XMOVHZload_0(v) 552 case OpS390XMOVHZloadidx: 553 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 554 case OpS390XMOVHZreg: 555 return rewriteValueS390X_OpS390XMOVHZreg_0(v) 556 case OpS390XMOVHload: 557 return rewriteValueS390X_OpS390XMOVHload_0(v) 558 case OpS390XMOVHreg: 559 return rewriteValueS390X_OpS390XMOVHreg_0(v) 560 case OpS390XMOVHstore: 561 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 562 case OpS390XMOVHstoreconst: 563 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 564 case OpS390XMOVHstoreidx: 565 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 566 case OpS390XMOVWBRstore: 567 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 568 case OpS390XMOVWBRstoreidx: 569 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 570 case OpS390XMOVWZload: 571 return rewriteValueS390X_OpS390XMOVWZload_0(v) 572 case OpS390XMOVWZloadidx: 573 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 574 case OpS390XMOVWZreg: 575 return rewriteValueS390X_OpS390XMOVWZreg_0(v) 576 case OpS390XMOVWload: 577 return rewriteValueS390X_OpS390XMOVWload_0(v) 578 case OpS390XMOVWreg: 579 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 580 case OpS390XMOVWstore: 581 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 582 case OpS390XMOVWstoreconst: 583 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 584 case OpS390XMOVWstoreidx: 585 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 586 case OpS390XMULLD: 587 return rewriteValueS390X_OpS390XMULLD_0(v) 588 case OpS390XMULLDconst: 589 return rewriteValueS390X_OpS390XMULLDconst_0(v) 590 case OpS390XMULLW: 591 return rewriteValueS390X_OpS390XMULLW_0(v) 592 case OpS390XMULLWconst: 593 return rewriteValueS390X_OpS390XMULLWconst_0(v) 594 case OpS390XNEG: 595 return rewriteValueS390X_OpS390XNEG_0(v) 596 case OpS390XNEGW: 597 return rewriteValueS390X_OpS390XNEGW_0(v) 598 case OpS390XNOT: 599 return rewriteValueS390X_OpS390XNOT_0(v) 600 case OpS390XNOTW: 601 return rewriteValueS390X_OpS390XNOTW_0(v) 602 case OpS390XOR: 603 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) 604 case OpS390XORW: 605 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) 606 case OpS390XORWconst: 607 return rewriteValueS390X_OpS390XORWconst_0(v) 608 case OpS390XORconst: 609 return rewriteValueS390X_OpS390XORconst_0(v) 610 case OpS390XSLD: 611 return rewriteValueS390X_OpS390XSLD_0(v) 612 case OpS390XSLW: 613 return rewriteValueS390X_OpS390XSLW_0(v) 614 case OpS390XSRAD: 615 return rewriteValueS390X_OpS390XSRAD_0(v) 616 case OpS390XSRADconst: 617 return rewriteValueS390X_OpS390XSRADconst_0(v) 618 case OpS390XSRAW: 619 return rewriteValueS390X_OpS390XSRAW_0(v) 620 case OpS390XSRAWconst: 621 return rewriteValueS390X_OpS390XSRAWconst_0(v) 622 case OpS390XSRD: 623 return rewriteValueS390X_OpS390XSRD_0(v) 624 case OpS390XSRW: 625 return rewriteValueS390X_OpS390XSRW_0(v) 626 case OpS390XSTM2: 627 return rewriteValueS390X_OpS390XSTM2_0(v) 628 case OpS390XSTMG2: 629 return rewriteValueS390X_OpS390XSTMG2_0(v) 630 case OpS390XSUB: 631 return rewriteValueS390X_OpS390XSUB_0(v) 632 case OpS390XSUBEWcarrymask: 633 return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v) 634 case OpS390XSUBEcarrymask: 635 return rewriteValueS390X_OpS390XSUBEcarrymask_0(v) 636 case OpS390XSUBW: 637 return rewriteValueS390X_OpS390XSUBW_0(v) 638 case OpS390XSUBWconst: 639 return rewriteValueS390X_OpS390XSUBWconst_0(v) 640 case OpS390XSUBconst: 641 return rewriteValueS390X_OpS390XSUBconst_0(v) 642 case OpS390XXOR: 643 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 644 case OpS390XXORW: 645 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 646 case OpS390XXORWconst: 647 return rewriteValueS390X_OpS390XXORWconst_0(v) 648 case OpS390XXORconst: 649 return rewriteValueS390X_OpS390XXORconst_0(v) 650 case OpSelect0: 651 return rewriteValueS390X_OpSelect0_0(v) 652 case OpSelect1: 653 return rewriteValueS390X_OpSelect1_0(v) 654 case OpSignExt16to32: 655 return rewriteValueS390X_OpSignExt16to32_0(v) 656 case OpSignExt16to64: 657 return rewriteValueS390X_OpSignExt16to64_0(v) 658 case OpSignExt32to64: 659 return rewriteValueS390X_OpSignExt32to64_0(v) 660 case OpSignExt8to16: 661 return rewriteValueS390X_OpSignExt8to16_0(v) 662 case OpSignExt8to32: 663 return rewriteValueS390X_OpSignExt8to32_0(v) 664 case OpSignExt8to64: 665 return rewriteValueS390X_OpSignExt8to64_0(v) 666 case OpSlicemask: 667 return rewriteValueS390X_OpSlicemask_0(v) 668 case OpSqrt: 669 return rewriteValueS390X_OpSqrt_0(v) 670 case OpStaticCall: 671 return rewriteValueS390X_OpStaticCall_0(v) 672 case OpStore: 673 return rewriteValueS390X_OpStore_0(v) 674 case OpSub16: 675 return rewriteValueS390X_OpSub16_0(v) 676 case OpSub32: 677 return rewriteValueS390X_OpSub32_0(v) 678 case OpSub32F: 679 return rewriteValueS390X_OpSub32F_0(v) 680 case OpSub64: 681 return rewriteValueS390X_OpSub64_0(v) 682 case OpSub64F: 683 return rewriteValueS390X_OpSub64F_0(v) 684 case OpSub8: 685 return rewriteValueS390X_OpSub8_0(v) 686 case OpSubPtr: 687 return rewriteValueS390X_OpSubPtr_0(v) 688 case OpTrunc16to8: 689 return rewriteValueS390X_OpTrunc16to8_0(v) 690 case OpTrunc32to16: 691 return rewriteValueS390X_OpTrunc32to16_0(v) 692 case OpTrunc32to8: 693 return rewriteValueS390X_OpTrunc32to8_0(v) 694 case OpTrunc64to16: 695 return rewriteValueS390X_OpTrunc64to16_0(v) 696 case OpTrunc64to32: 697 return rewriteValueS390X_OpTrunc64to32_0(v) 698 case OpTrunc64to8: 699 return rewriteValueS390X_OpTrunc64to8_0(v) 700 case OpXor16: 701 return rewriteValueS390X_OpXor16_0(v) 702 case OpXor32: 703 return rewriteValueS390X_OpXor32_0(v) 704 case OpXor64: 705 return rewriteValueS390X_OpXor64_0(v) 706 case OpXor8: 707 return rewriteValueS390X_OpXor8_0(v) 708 case OpZero: 709 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 710 case OpZeroExt16to32: 711 return rewriteValueS390X_OpZeroExt16to32_0(v) 712 case OpZeroExt16to64: 713 return rewriteValueS390X_OpZeroExt16to64_0(v) 714 case OpZeroExt32to64: 715 return rewriteValueS390X_OpZeroExt32to64_0(v) 716 case OpZeroExt8to16: 717 return rewriteValueS390X_OpZeroExt8to16_0(v) 718 case OpZeroExt8to32: 719 return rewriteValueS390X_OpZeroExt8to32_0(v) 720 case OpZeroExt8to64: 721 return rewriteValueS390X_OpZeroExt8to64_0(v) 722 } 723 return false 724 } 725 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 726 // match: (Add16 x y) 727 // cond: 728 // result: (ADDW x y) 729 for { 730 _ = v.Args[1] 731 x := v.Args[0] 732 y := v.Args[1] 733 v.reset(OpS390XADDW) 734 v.AddArg(x) 735 v.AddArg(y) 736 return true 737 } 738 } 739 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 740 // match: (Add32 x y) 741 // cond: 742 // result: (ADDW x y) 743 for { 744 _ = v.Args[1] 745 x := v.Args[0] 746 y := v.Args[1] 747 v.reset(OpS390XADDW) 748 v.AddArg(x) 749 v.AddArg(y) 750 return true 751 } 752 } 753 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 754 // match: (Add32F x y) 755 // cond: 756 // result: (FADDS x y) 757 for { 758 _ = v.Args[1] 759 x := v.Args[0] 760 y := v.Args[1] 761 v.reset(OpS390XFADDS) 762 v.AddArg(x) 763 v.AddArg(y) 764 return true 765 } 766 } 767 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 768 // match: (Add64 x y) 769 // cond: 770 // result: (ADD x y) 771 for { 772 _ = v.Args[1] 773 x := v.Args[0] 774 y := v.Args[1] 775 v.reset(OpS390XADD) 776 v.AddArg(x) 777 v.AddArg(y) 778 return true 779 } 780 } 781 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 782 // match: (Add64F x y) 783 // cond: 784 // result: (FADD x y) 785 for { 786 _ = v.Args[1] 787 x := v.Args[0] 788 y := v.Args[1] 789 v.reset(OpS390XFADD) 790 v.AddArg(x) 791 v.AddArg(y) 792 return true 793 } 794 } 795 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 796 // match: (Add8 x y) 797 // cond: 798 // result: (ADDW x y) 799 for { 800 _ = v.Args[1] 801 x := v.Args[0] 802 y := v.Args[1] 803 v.reset(OpS390XADDW) 804 v.AddArg(x) 805 v.AddArg(y) 806 return true 807 } 808 } 809 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 810 // match: (AddPtr x y) 811 // cond: 812 // result: (ADD x y) 813 for { 814 _ = v.Args[1] 815 x := v.Args[0] 816 y := v.Args[1] 817 v.reset(OpS390XADD) 818 v.AddArg(x) 819 v.AddArg(y) 820 return true 821 } 822 } 823 func rewriteValueS390X_OpAddr_0(v *Value) bool { 824 // match: (Addr {sym} base) 825 // cond: 826 // result: (MOVDaddr {sym} base) 827 for { 828 sym := v.Aux 829 base := v.Args[0] 830 v.reset(OpS390XMOVDaddr) 831 v.Aux = sym 832 v.AddArg(base) 833 return true 834 } 835 } 836 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 837 // match: (And16 x y) 838 // cond: 839 // result: (ANDW x y) 840 for { 841 _ = v.Args[1] 842 x := v.Args[0] 843 y := v.Args[1] 844 v.reset(OpS390XANDW) 845 v.AddArg(x) 846 v.AddArg(y) 847 return true 848 } 849 } 850 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 851 // match: (And32 x y) 852 // cond: 853 // result: (ANDW x y) 854 for { 855 _ = v.Args[1] 856 x := v.Args[0] 857 y := v.Args[1] 858 v.reset(OpS390XANDW) 859 v.AddArg(x) 860 v.AddArg(y) 861 return true 862 } 863 } 864 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 865 // match: (And64 x y) 866 // cond: 867 // result: (AND x y) 868 for { 869 _ = v.Args[1] 870 x := v.Args[0] 871 y := v.Args[1] 872 v.reset(OpS390XAND) 873 v.AddArg(x) 874 v.AddArg(y) 875 return true 876 } 877 } 878 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 879 // match: (And8 x y) 880 // cond: 881 // result: (ANDW x y) 882 for { 883 _ = v.Args[1] 884 x := v.Args[0] 885 y := v.Args[1] 886 v.reset(OpS390XANDW) 887 v.AddArg(x) 888 v.AddArg(y) 889 return true 890 } 891 } 892 func rewriteValueS390X_OpAndB_0(v *Value) bool { 893 // match: (AndB x y) 894 // cond: 895 // result: (ANDW x y) 896 for { 897 _ = v.Args[1] 898 x := v.Args[0] 899 y := v.Args[1] 900 v.reset(OpS390XANDW) 901 v.AddArg(x) 902 v.AddArg(y) 903 return true 904 } 905 } 906 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 907 b := v.Block 908 _ = b 909 typ := &b.Func.Config.Types 910 _ = typ 911 // match: (AtomicAdd32 ptr val mem) 912 // cond: 913 // result: (AddTupleFirst32 val (LAA ptr val mem)) 914 for { 915 _ = v.Args[2] 916 ptr := v.Args[0] 917 val := v.Args[1] 918 mem := v.Args[2] 919 v.reset(OpS390XAddTupleFirst32) 920 v.AddArg(val) 921 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 922 v0.AddArg(ptr) 923 v0.AddArg(val) 924 v0.AddArg(mem) 925 v.AddArg(v0) 926 return true 927 } 928 } 929 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 930 b := v.Block 931 _ = b 932 typ := &b.Func.Config.Types 933 _ = typ 934 // match: (AtomicAdd64 ptr val mem) 935 // cond: 936 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 937 for { 938 _ = v.Args[2] 939 ptr := v.Args[0] 940 val := v.Args[1] 941 mem := v.Args[2] 942 v.reset(OpS390XAddTupleFirst64) 943 v.AddArg(val) 944 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 945 v0.AddArg(ptr) 946 v0.AddArg(val) 947 v0.AddArg(mem) 948 v.AddArg(v0) 949 return true 950 } 951 } 952 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 953 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 954 // cond: 955 // result: (LoweredAtomicCas32 ptr old new_ mem) 956 for { 957 _ = v.Args[3] 958 ptr := v.Args[0] 959 old := v.Args[1] 960 new_ := v.Args[2] 961 mem := v.Args[3] 962 v.reset(OpS390XLoweredAtomicCas32) 963 v.AddArg(ptr) 964 v.AddArg(old) 965 v.AddArg(new_) 966 v.AddArg(mem) 967 return true 968 } 969 } 970 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 971 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 972 // cond: 973 // result: (LoweredAtomicCas64 ptr old new_ mem) 974 for { 975 _ = v.Args[3] 976 ptr := v.Args[0] 977 old := v.Args[1] 978 new_ := v.Args[2] 979 mem := v.Args[3] 980 v.reset(OpS390XLoweredAtomicCas64) 981 v.AddArg(ptr) 982 v.AddArg(old) 983 v.AddArg(new_) 984 v.AddArg(mem) 985 return true 986 } 987 } 988 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 989 // match: (AtomicExchange32 ptr val mem) 990 // cond: 991 // result: (LoweredAtomicExchange32 ptr val mem) 992 for { 993 _ = v.Args[2] 994 ptr := v.Args[0] 995 val := v.Args[1] 996 mem := v.Args[2] 997 v.reset(OpS390XLoweredAtomicExchange32) 998 v.AddArg(ptr) 999 v.AddArg(val) 1000 v.AddArg(mem) 1001 return true 1002 } 1003 } 1004 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1005 // match: (AtomicExchange64 ptr val mem) 1006 // cond: 1007 // result: (LoweredAtomicExchange64 ptr val mem) 1008 for { 1009 _ = v.Args[2] 1010 ptr := v.Args[0] 1011 val := v.Args[1] 1012 mem := v.Args[2] 1013 v.reset(OpS390XLoweredAtomicExchange64) 1014 v.AddArg(ptr) 1015 v.AddArg(val) 1016 v.AddArg(mem) 1017 return true 1018 } 1019 } 1020 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1021 // match: (AtomicLoad32 ptr mem) 1022 // cond: 1023 // result: (MOVWZatomicload ptr mem) 1024 for { 1025 _ = v.Args[1] 1026 ptr := v.Args[0] 1027 mem := v.Args[1] 1028 v.reset(OpS390XMOVWZatomicload) 1029 v.AddArg(ptr) 1030 v.AddArg(mem) 1031 return true 1032 } 1033 } 1034 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1035 // match: (AtomicLoad64 ptr mem) 1036 // cond: 1037 // result: (MOVDatomicload ptr mem) 1038 for { 1039 _ = v.Args[1] 1040 ptr := v.Args[0] 1041 mem := v.Args[1] 1042 v.reset(OpS390XMOVDatomicload) 1043 v.AddArg(ptr) 1044 v.AddArg(mem) 1045 return true 1046 } 1047 } 1048 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1049 // match: (AtomicLoadPtr ptr mem) 1050 // cond: 1051 // result: (MOVDatomicload ptr mem) 1052 for { 1053 _ = v.Args[1] 1054 ptr := v.Args[0] 1055 mem := v.Args[1] 1056 v.reset(OpS390XMOVDatomicload) 1057 v.AddArg(ptr) 1058 v.AddArg(mem) 1059 return true 1060 } 1061 } 1062 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1063 // match: (AtomicStore32 ptr val mem) 1064 // cond: 1065 // result: (MOVWatomicstore 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(OpS390XMOVWatomicstore) 1072 v.AddArg(ptr) 1073 v.AddArg(val) 1074 v.AddArg(mem) 1075 return true 1076 } 1077 } 1078 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1079 // match: (AtomicStore64 ptr val mem) 1080 // cond: 1081 // result: (MOVDatomicstore ptr val mem) 1082 for { 1083 _ = v.Args[2] 1084 ptr := v.Args[0] 1085 val := v.Args[1] 1086 mem := v.Args[2] 1087 v.reset(OpS390XMOVDatomicstore) 1088 v.AddArg(ptr) 1089 v.AddArg(val) 1090 v.AddArg(mem) 1091 return true 1092 } 1093 } 1094 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1095 // match: (AtomicStorePtrNoWB ptr val mem) 1096 // cond: 1097 // result: (MOVDatomicstore ptr val mem) 1098 for { 1099 _ = v.Args[2] 1100 ptr := v.Args[0] 1101 val := v.Args[1] 1102 mem := v.Args[2] 1103 v.reset(OpS390XMOVDatomicstore) 1104 v.AddArg(ptr) 1105 v.AddArg(val) 1106 v.AddArg(mem) 1107 return true 1108 } 1109 } 1110 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1111 b := v.Block 1112 _ = b 1113 // match: (Avg64u <t> x y) 1114 // cond: 1115 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1116 for { 1117 t := v.Type 1118 _ = v.Args[1] 1119 x := v.Args[0] 1120 y := v.Args[1] 1121 v.reset(OpS390XADD) 1122 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1123 v0.AuxInt = 1 1124 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1125 v1.AddArg(x) 1126 v1.AddArg(y) 1127 v0.AddArg(v1) 1128 v.AddArg(v0) 1129 v.AddArg(y) 1130 return true 1131 } 1132 } 1133 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1134 b := v.Block 1135 _ = b 1136 typ := &b.Func.Config.Types 1137 _ = typ 1138 // match: (BitLen64 x) 1139 // cond: 1140 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1141 for { 1142 x := v.Args[0] 1143 v.reset(OpS390XSUB) 1144 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1145 v0.AuxInt = 64 1146 v.AddArg(v0) 1147 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1148 v1.AddArg(x) 1149 v.AddArg(v1) 1150 return true 1151 } 1152 } 1153 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1154 // match: (Bswap32 x) 1155 // cond: 1156 // result: (MOVWBR x) 1157 for { 1158 x := v.Args[0] 1159 v.reset(OpS390XMOVWBR) 1160 v.AddArg(x) 1161 return true 1162 } 1163 } 1164 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1165 // match: (Bswap64 x) 1166 // cond: 1167 // result: (MOVDBR x) 1168 for { 1169 x := v.Args[0] 1170 v.reset(OpS390XMOVDBR) 1171 v.AddArg(x) 1172 return true 1173 } 1174 } 1175 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1176 // match: (ClosureCall [argwid] entry closure mem) 1177 // cond: 1178 // result: (CALLclosure [argwid] entry closure mem) 1179 for { 1180 argwid := v.AuxInt 1181 _ = v.Args[2] 1182 entry := v.Args[0] 1183 closure := v.Args[1] 1184 mem := v.Args[2] 1185 v.reset(OpS390XCALLclosure) 1186 v.AuxInt = argwid 1187 v.AddArg(entry) 1188 v.AddArg(closure) 1189 v.AddArg(mem) 1190 return true 1191 } 1192 } 1193 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1194 // match: (Com16 x) 1195 // cond: 1196 // result: (NOTW x) 1197 for { 1198 x := v.Args[0] 1199 v.reset(OpS390XNOTW) 1200 v.AddArg(x) 1201 return true 1202 } 1203 } 1204 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1205 // match: (Com32 x) 1206 // cond: 1207 // result: (NOTW x) 1208 for { 1209 x := v.Args[0] 1210 v.reset(OpS390XNOTW) 1211 v.AddArg(x) 1212 return true 1213 } 1214 } 1215 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1216 // match: (Com64 x) 1217 // cond: 1218 // result: (NOT x) 1219 for { 1220 x := v.Args[0] 1221 v.reset(OpS390XNOT) 1222 v.AddArg(x) 1223 return true 1224 } 1225 } 1226 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1227 // match: (Com8 x) 1228 // cond: 1229 // result: (NOTW x) 1230 for { 1231 x := v.Args[0] 1232 v.reset(OpS390XNOTW) 1233 v.AddArg(x) 1234 return true 1235 } 1236 } 1237 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1238 // match: (Const16 [val]) 1239 // cond: 1240 // result: (MOVDconst [val]) 1241 for { 1242 val := v.AuxInt 1243 v.reset(OpS390XMOVDconst) 1244 v.AuxInt = val 1245 return true 1246 } 1247 } 1248 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1249 // match: (Const32 [val]) 1250 // cond: 1251 // result: (MOVDconst [val]) 1252 for { 1253 val := v.AuxInt 1254 v.reset(OpS390XMOVDconst) 1255 v.AuxInt = val 1256 return true 1257 } 1258 } 1259 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1260 // match: (Const32F [val]) 1261 // cond: 1262 // result: (FMOVSconst [val]) 1263 for { 1264 val := v.AuxInt 1265 v.reset(OpS390XFMOVSconst) 1266 v.AuxInt = val 1267 return true 1268 } 1269 } 1270 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1271 // match: (Const64 [val]) 1272 // cond: 1273 // result: (MOVDconst [val]) 1274 for { 1275 val := v.AuxInt 1276 v.reset(OpS390XMOVDconst) 1277 v.AuxInt = val 1278 return true 1279 } 1280 } 1281 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1282 // match: (Const64F [val]) 1283 // cond: 1284 // result: (FMOVDconst [val]) 1285 for { 1286 val := v.AuxInt 1287 v.reset(OpS390XFMOVDconst) 1288 v.AuxInt = val 1289 return true 1290 } 1291 } 1292 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1293 // match: (Const8 [val]) 1294 // cond: 1295 // result: (MOVDconst [val]) 1296 for { 1297 val := v.AuxInt 1298 v.reset(OpS390XMOVDconst) 1299 v.AuxInt = val 1300 return true 1301 } 1302 } 1303 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1304 // match: (ConstBool [b]) 1305 // cond: 1306 // result: (MOVDconst [b]) 1307 for { 1308 b := v.AuxInt 1309 v.reset(OpS390XMOVDconst) 1310 v.AuxInt = b 1311 return true 1312 } 1313 } 1314 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1315 // match: (ConstNil) 1316 // cond: 1317 // result: (MOVDconst [0]) 1318 for { 1319 v.reset(OpS390XMOVDconst) 1320 v.AuxInt = 0 1321 return true 1322 } 1323 } 1324 func rewriteValueS390X_OpConvert_0(v *Value) bool { 1325 // match: (Convert <t> x mem) 1326 // cond: 1327 // result: (MOVDconvert <t> x mem) 1328 for { 1329 t := v.Type 1330 _ = v.Args[1] 1331 x := v.Args[0] 1332 mem := v.Args[1] 1333 v.reset(OpS390XMOVDconvert) 1334 v.Type = t 1335 v.AddArg(x) 1336 v.AddArg(mem) 1337 return true 1338 } 1339 } 1340 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1341 b := v.Block 1342 _ = b 1343 typ := &b.Func.Config.Types 1344 _ = typ 1345 // match: (Ctz32 <t> x) 1346 // cond: 1347 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1348 for { 1349 t := v.Type 1350 x := v.Args[0] 1351 v.reset(OpS390XSUB) 1352 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1353 v0.AuxInt = 64 1354 v.AddArg(v0) 1355 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1356 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1357 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1358 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1359 v4.AuxInt = 1 1360 v4.AddArg(x) 1361 v3.AddArg(v4) 1362 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1363 v5.AddArg(x) 1364 v3.AddArg(v5) 1365 v2.AddArg(v3) 1366 v1.AddArg(v2) 1367 v.AddArg(v1) 1368 return true 1369 } 1370 } 1371 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1372 b := v.Block 1373 _ = b 1374 typ := &b.Func.Config.Types 1375 _ = typ 1376 // match: (Ctz64 <t> x) 1377 // cond: 1378 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1379 for { 1380 t := v.Type 1381 x := v.Args[0] 1382 v.reset(OpS390XSUB) 1383 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1384 v0.AuxInt = 64 1385 v.AddArg(v0) 1386 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1387 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1388 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1389 v3.AuxInt = 1 1390 v3.AddArg(x) 1391 v2.AddArg(v3) 1392 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1393 v4.AddArg(x) 1394 v2.AddArg(v4) 1395 v1.AddArg(v2) 1396 v.AddArg(v1) 1397 return true 1398 } 1399 } 1400 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1401 // match: (Cvt32Fto32 x) 1402 // cond: 1403 // result: (CFEBRA x) 1404 for { 1405 x := v.Args[0] 1406 v.reset(OpS390XCFEBRA) 1407 v.AddArg(x) 1408 return true 1409 } 1410 } 1411 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1412 // match: (Cvt32Fto64 x) 1413 // cond: 1414 // result: (CGEBRA x) 1415 for { 1416 x := v.Args[0] 1417 v.reset(OpS390XCGEBRA) 1418 v.AddArg(x) 1419 return true 1420 } 1421 } 1422 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1423 // match: (Cvt32Fto64F x) 1424 // cond: 1425 // result: (LDEBR x) 1426 for { 1427 x := v.Args[0] 1428 v.reset(OpS390XLDEBR) 1429 v.AddArg(x) 1430 return true 1431 } 1432 } 1433 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1434 // match: (Cvt32to32F x) 1435 // cond: 1436 // result: (CEFBRA x) 1437 for { 1438 x := v.Args[0] 1439 v.reset(OpS390XCEFBRA) 1440 v.AddArg(x) 1441 return true 1442 } 1443 } 1444 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1445 // match: (Cvt32to64F x) 1446 // cond: 1447 // result: (CDFBRA x) 1448 for { 1449 x := v.Args[0] 1450 v.reset(OpS390XCDFBRA) 1451 v.AddArg(x) 1452 return true 1453 } 1454 } 1455 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1456 // match: (Cvt64Fto32 x) 1457 // cond: 1458 // result: (CFDBRA x) 1459 for { 1460 x := v.Args[0] 1461 v.reset(OpS390XCFDBRA) 1462 v.AddArg(x) 1463 return true 1464 } 1465 } 1466 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1467 // match: (Cvt64Fto32F x) 1468 // cond: 1469 // result: (LEDBR x) 1470 for { 1471 x := v.Args[0] 1472 v.reset(OpS390XLEDBR) 1473 v.AddArg(x) 1474 return true 1475 } 1476 } 1477 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1478 // match: (Cvt64Fto64 x) 1479 // cond: 1480 // result: (CGDBRA x) 1481 for { 1482 x := v.Args[0] 1483 v.reset(OpS390XCGDBRA) 1484 v.AddArg(x) 1485 return true 1486 } 1487 } 1488 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1489 // match: (Cvt64to32F x) 1490 // cond: 1491 // result: (CEGBRA x) 1492 for { 1493 x := v.Args[0] 1494 v.reset(OpS390XCEGBRA) 1495 v.AddArg(x) 1496 return true 1497 } 1498 } 1499 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1500 // match: (Cvt64to64F x) 1501 // cond: 1502 // result: (CDGBRA x) 1503 for { 1504 x := v.Args[0] 1505 v.reset(OpS390XCDGBRA) 1506 v.AddArg(x) 1507 return true 1508 } 1509 } 1510 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1511 b := v.Block 1512 _ = b 1513 typ := &b.Func.Config.Types 1514 _ = typ 1515 // match: (Div16 x y) 1516 // cond: 1517 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1518 for { 1519 _ = v.Args[1] 1520 x := v.Args[0] 1521 y := v.Args[1] 1522 v.reset(OpS390XDIVW) 1523 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1524 v0.AddArg(x) 1525 v.AddArg(v0) 1526 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1527 v1.AddArg(y) 1528 v.AddArg(v1) 1529 return true 1530 } 1531 } 1532 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1533 b := v.Block 1534 _ = b 1535 typ := &b.Func.Config.Types 1536 _ = typ 1537 // match: (Div16u x y) 1538 // cond: 1539 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1540 for { 1541 _ = v.Args[1] 1542 x := v.Args[0] 1543 y := v.Args[1] 1544 v.reset(OpS390XDIVWU) 1545 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1546 v0.AddArg(x) 1547 v.AddArg(v0) 1548 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1549 v1.AddArg(y) 1550 v.AddArg(v1) 1551 return true 1552 } 1553 } 1554 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1555 b := v.Block 1556 _ = b 1557 typ := &b.Func.Config.Types 1558 _ = typ 1559 // match: (Div32 x y) 1560 // cond: 1561 // result: (DIVW (MOVWreg x) y) 1562 for { 1563 _ = v.Args[1] 1564 x := v.Args[0] 1565 y := v.Args[1] 1566 v.reset(OpS390XDIVW) 1567 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1568 v0.AddArg(x) 1569 v.AddArg(v0) 1570 v.AddArg(y) 1571 return true 1572 } 1573 } 1574 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1575 // match: (Div32F x y) 1576 // cond: 1577 // result: (FDIVS x y) 1578 for { 1579 _ = v.Args[1] 1580 x := v.Args[0] 1581 y := v.Args[1] 1582 v.reset(OpS390XFDIVS) 1583 v.AddArg(x) 1584 v.AddArg(y) 1585 return true 1586 } 1587 } 1588 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1589 b := v.Block 1590 _ = b 1591 typ := &b.Func.Config.Types 1592 _ = typ 1593 // match: (Div32u x y) 1594 // cond: 1595 // result: (DIVWU (MOVWZreg x) y) 1596 for { 1597 _ = v.Args[1] 1598 x := v.Args[0] 1599 y := v.Args[1] 1600 v.reset(OpS390XDIVWU) 1601 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1602 v0.AddArg(x) 1603 v.AddArg(v0) 1604 v.AddArg(y) 1605 return true 1606 } 1607 } 1608 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1609 // match: (Div64 x y) 1610 // cond: 1611 // result: (DIVD x y) 1612 for { 1613 _ = v.Args[1] 1614 x := v.Args[0] 1615 y := v.Args[1] 1616 v.reset(OpS390XDIVD) 1617 v.AddArg(x) 1618 v.AddArg(y) 1619 return true 1620 } 1621 } 1622 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1623 // match: (Div64F x y) 1624 // cond: 1625 // result: (FDIV x y) 1626 for { 1627 _ = v.Args[1] 1628 x := v.Args[0] 1629 y := v.Args[1] 1630 v.reset(OpS390XFDIV) 1631 v.AddArg(x) 1632 v.AddArg(y) 1633 return true 1634 } 1635 } 1636 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1637 // match: (Div64u x y) 1638 // cond: 1639 // result: (DIVDU x y) 1640 for { 1641 _ = v.Args[1] 1642 x := v.Args[0] 1643 y := v.Args[1] 1644 v.reset(OpS390XDIVDU) 1645 v.AddArg(x) 1646 v.AddArg(y) 1647 return true 1648 } 1649 } 1650 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1651 b := v.Block 1652 _ = b 1653 typ := &b.Func.Config.Types 1654 _ = typ 1655 // match: (Div8 x y) 1656 // cond: 1657 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1658 for { 1659 _ = v.Args[1] 1660 x := v.Args[0] 1661 y := v.Args[1] 1662 v.reset(OpS390XDIVW) 1663 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1664 v0.AddArg(x) 1665 v.AddArg(v0) 1666 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1667 v1.AddArg(y) 1668 v.AddArg(v1) 1669 return true 1670 } 1671 } 1672 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1673 b := v.Block 1674 _ = b 1675 typ := &b.Func.Config.Types 1676 _ = typ 1677 // match: (Div8u x y) 1678 // cond: 1679 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1680 for { 1681 _ = v.Args[1] 1682 x := v.Args[0] 1683 y := v.Args[1] 1684 v.reset(OpS390XDIVWU) 1685 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1686 v0.AddArg(x) 1687 v.AddArg(v0) 1688 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1689 v1.AddArg(y) 1690 v.AddArg(v1) 1691 return true 1692 } 1693 } 1694 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1695 b := v.Block 1696 _ = b 1697 typ := &b.Func.Config.Types 1698 _ = typ 1699 // match: (Eq16 x y) 1700 // cond: 1701 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1702 for { 1703 _ = v.Args[1] 1704 x := v.Args[0] 1705 y := v.Args[1] 1706 v.reset(OpS390XMOVDEQ) 1707 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1708 v0.AuxInt = 0 1709 v.AddArg(v0) 1710 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1711 v1.AuxInt = 1 1712 v.AddArg(v1) 1713 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1714 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1715 v3.AddArg(x) 1716 v2.AddArg(v3) 1717 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1718 v4.AddArg(y) 1719 v2.AddArg(v4) 1720 v.AddArg(v2) 1721 return true 1722 } 1723 } 1724 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1725 b := v.Block 1726 _ = b 1727 typ := &b.Func.Config.Types 1728 _ = typ 1729 // match: (Eq32 x y) 1730 // cond: 1731 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1732 for { 1733 _ = v.Args[1] 1734 x := v.Args[0] 1735 y := v.Args[1] 1736 v.reset(OpS390XMOVDEQ) 1737 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1738 v0.AuxInt = 0 1739 v.AddArg(v0) 1740 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1741 v1.AuxInt = 1 1742 v.AddArg(v1) 1743 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1744 v2.AddArg(x) 1745 v2.AddArg(y) 1746 v.AddArg(v2) 1747 return true 1748 } 1749 } 1750 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1751 b := v.Block 1752 _ = b 1753 typ := &b.Func.Config.Types 1754 _ = typ 1755 // match: (Eq32F x y) 1756 // cond: 1757 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1758 for { 1759 _ = v.Args[1] 1760 x := v.Args[0] 1761 y := v.Args[1] 1762 v.reset(OpS390XMOVDEQ) 1763 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1764 v0.AuxInt = 0 1765 v.AddArg(v0) 1766 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1767 v1.AuxInt = 1 1768 v.AddArg(v1) 1769 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1770 v2.AddArg(x) 1771 v2.AddArg(y) 1772 v.AddArg(v2) 1773 return true 1774 } 1775 } 1776 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1777 b := v.Block 1778 _ = b 1779 typ := &b.Func.Config.Types 1780 _ = typ 1781 // match: (Eq64 x y) 1782 // cond: 1783 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1784 for { 1785 _ = v.Args[1] 1786 x := v.Args[0] 1787 y := v.Args[1] 1788 v.reset(OpS390XMOVDEQ) 1789 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1790 v0.AuxInt = 0 1791 v.AddArg(v0) 1792 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1793 v1.AuxInt = 1 1794 v.AddArg(v1) 1795 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1796 v2.AddArg(x) 1797 v2.AddArg(y) 1798 v.AddArg(v2) 1799 return true 1800 } 1801 } 1802 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1803 b := v.Block 1804 _ = b 1805 typ := &b.Func.Config.Types 1806 _ = typ 1807 // match: (Eq64F x y) 1808 // cond: 1809 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1810 for { 1811 _ = v.Args[1] 1812 x := v.Args[0] 1813 y := v.Args[1] 1814 v.reset(OpS390XMOVDEQ) 1815 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1816 v0.AuxInt = 0 1817 v.AddArg(v0) 1818 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1819 v1.AuxInt = 1 1820 v.AddArg(v1) 1821 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1822 v2.AddArg(x) 1823 v2.AddArg(y) 1824 v.AddArg(v2) 1825 return true 1826 } 1827 } 1828 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1829 b := v.Block 1830 _ = b 1831 typ := &b.Func.Config.Types 1832 _ = typ 1833 // match: (Eq8 x y) 1834 // cond: 1835 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1836 for { 1837 _ = v.Args[1] 1838 x := v.Args[0] 1839 y := v.Args[1] 1840 v.reset(OpS390XMOVDEQ) 1841 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1842 v0.AuxInt = 0 1843 v.AddArg(v0) 1844 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1845 v1.AuxInt = 1 1846 v.AddArg(v1) 1847 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1848 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1849 v3.AddArg(x) 1850 v2.AddArg(v3) 1851 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1852 v4.AddArg(y) 1853 v2.AddArg(v4) 1854 v.AddArg(v2) 1855 return true 1856 } 1857 } 1858 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1859 b := v.Block 1860 _ = b 1861 typ := &b.Func.Config.Types 1862 _ = typ 1863 // match: (EqB x y) 1864 // cond: 1865 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1866 for { 1867 _ = v.Args[1] 1868 x := v.Args[0] 1869 y := v.Args[1] 1870 v.reset(OpS390XMOVDEQ) 1871 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1872 v0.AuxInt = 0 1873 v.AddArg(v0) 1874 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1875 v1.AuxInt = 1 1876 v.AddArg(v1) 1877 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1878 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1879 v3.AddArg(x) 1880 v2.AddArg(v3) 1881 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1882 v4.AddArg(y) 1883 v2.AddArg(v4) 1884 v.AddArg(v2) 1885 return true 1886 } 1887 } 1888 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1889 b := v.Block 1890 _ = b 1891 typ := &b.Func.Config.Types 1892 _ = typ 1893 // match: (EqPtr x y) 1894 // cond: 1895 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1896 for { 1897 _ = v.Args[1] 1898 x := v.Args[0] 1899 y := v.Args[1] 1900 v.reset(OpS390XMOVDEQ) 1901 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1902 v0.AuxInt = 0 1903 v.AddArg(v0) 1904 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1905 v1.AuxInt = 1 1906 v.AddArg(v1) 1907 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1908 v2.AddArg(x) 1909 v2.AddArg(y) 1910 v.AddArg(v2) 1911 return true 1912 } 1913 } 1914 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 1915 b := v.Block 1916 _ = b 1917 typ := &b.Func.Config.Types 1918 _ = typ 1919 // match: (Geq16 x y) 1920 // cond: 1921 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1922 for { 1923 _ = v.Args[1] 1924 x := v.Args[0] 1925 y := v.Args[1] 1926 v.reset(OpS390XMOVDGE) 1927 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1928 v0.AuxInt = 0 1929 v.AddArg(v0) 1930 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1931 v1.AuxInt = 1 1932 v.AddArg(v1) 1933 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1934 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1935 v3.AddArg(x) 1936 v2.AddArg(v3) 1937 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1938 v4.AddArg(y) 1939 v2.AddArg(v4) 1940 v.AddArg(v2) 1941 return true 1942 } 1943 } 1944 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 1945 b := v.Block 1946 _ = b 1947 typ := &b.Func.Config.Types 1948 _ = typ 1949 // match: (Geq16U x y) 1950 // cond: 1951 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1952 for { 1953 _ = v.Args[1] 1954 x := v.Args[0] 1955 y := v.Args[1] 1956 v.reset(OpS390XMOVDGE) 1957 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1958 v0.AuxInt = 0 1959 v.AddArg(v0) 1960 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1961 v1.AuxInt = 1 1962 v.AddArg(v1) 1963 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 1964 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1965 v3.AddArg(x) 1966 v2.AddArg(v3) 1967 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1968 v4.AddArg(y) 1969 v2.AddArg(v4) 1970 v.AddArg(v2) 1971 return true 1972 } 1973 } 1974 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 1975 b := v.Block 1976 _ = b 1977 typ := &b.Func.Config.Types 1978 _ = typ 1979 // match: (Geq32 x y) 1980 // cond: 1981 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1982 for { 1983 _ = v.Args[1] 1984 x := v.Args[0] 1985 y := v.Args[1] 1986 v.reset(OpS390XMOVDGE) 1987 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1988 v0.AuxInt = 0 1989 v.AddArg(v0) 1990 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1991 v1.AuxInt = 1 1992 v.AddArg(v1) 1993 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1994 v2.AddArg(x) 1995 v2.AddArg(y) 1996 v.AddArg(v2) 1997 return true 1998 } 1999 } 2000 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2001 b := v.Block 2002 _ = b 2003 typ := &b.Func.Config.Types 2004 _ = typ 2005 // match: (Geq32F x y) 2006 // cond: 2007 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2008 for { 2009 _ = v.Args[1] 2010 x := v.Args[0] 2011 y := v.Args[1] 2012 v.reset(OpS390XMOVDGEnoinv) 2013 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2014 v0.AuxInt = 0 2015 v.AddArg(v0) 2016 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2017 v1.AuxInt = 1 2018 v.AddArg(v1) 2019 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2020 v2.AddArg(x) 2021 v2.AddArg(y) 2022 v.AddArg(v2) 2023 return true 2024 } 2025 } 2026 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2027 b := v.Block 2028 _ = b 2029 typ := &b.Func.Config.Types 2030 _ = typ 2031 // match: (Geq32U x y) 2032 // cond: 2033 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x 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, OpS390XCMPWU, types.TypeFlags) 2046 v2.AddArg(x) 2047 v2.AddArg(y) 2048 v.AddArg(v2) 2049 return true 2050 } 2051 } 2052 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2053 b := v.Block 2054 _ = b 2055 typ := &b.Func.Config.Types 2056 _ = typ 2057 // match: (Geq64 x y) 2058 // cond: 2059 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2060 for { 2061 _ = v.Args[1] 2062 x := v.Args[0] 2063 y := v.Args[1] 2064 v.reset(OpS390XMOVDGE) 2065 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2066 v0.AuxInt = 0 2067 v.AddArg(v0) 2068 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2069 v1.AuxInt = 1 2070 v.AddArg(v1) 2071 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2072 v2.AddArg(x) 2073 v2.AddArg(y) 2074 v.AddArg(v2) 2075 return true 2076 } 2077 } 2078 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2079 b := v.Block 2080 _ = b 2081 typ := &b.Func.Config.Types 2082 _ = typ 2083 // match: (Geq64F x y) 2084 // cond: 2085 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2086 for { 2087 _ = v.Args[1] 2088 x := v.Args[0] 2089 y := v.Args[1] 2090 v.reset(OpS390XMOVDGEnoinv) 2091 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2092 v0.AuxInt = 0 2093 v.AddArg(v0) 2094 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2095 v1.AuxInt = 1 2096 v.AddArg(v1) 2097 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2098 v2.AddArg(x) 2099 v2.AddArg(y) 2100 v.AddArg(v2) 2101 return true 2102 } 2103 } 2104 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2105 b := v.Block 2106 _ = b 2107 typ := &b.Func.Config.Types 2108 _ = typ 2109 // match: (Geq64U x y) 2110 // cond: 2111 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2112 for { 2113 _ = v.Args[1] 2114 x := v.Args[0] 2115 y := v.Args[1] 2116 v.reset(OpS390XMOVDGE) 2117 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2118 v0.AuxInt = 0 2119 v.AddArg(v0) 2120 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2121 v1.AuxInt = 1 2122 v.AddArg(v1) 2123 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2124 v2.AddArg(x) 2125 v2.AddArg(y) 2126 v.AddArg(v2) 2127 return true 2128 } 2129 } 2130 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2131 b := v.Block 2132 _ = b 2133 typ := &b.Func.Config.Types 2134 _ = typ 2135 // match: (Geq8 x y) 2136 // cond: 2137 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2138 for { 2139 _ = v.Args[1] 2140 x := v.Args[0] 2141 y := v.Args[1] 2142 v.reset(OpS390XMOVDGE) 2143 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2144 v0.AuxInt = 0 2145 v.AddArg(v0) 2146 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2147 v1.AuxInt = 1 2148 v.AddArg(v1) 2149 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2150 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2151 v3.AddArg(x) 2152 v2.AddArg(v3) 2153 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2154 v4.AddArg(y) 2155 v2.AddArg(v4) 2156 v.AddArg(v2) 2157 return true 2158 } 2159 } 2160 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2161 b := v.Block 2162 _ = b 2163 typ := &b.Func.Config.Types 2164 _ = typ 2165 // match: (Geq8U x y) 2166 // cond: 2167 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2168 for { 2169 _ = v.Args[1] 2170 x := v.Args[0] 2171 y := v.Args[1] 2172 v.reset(OpS390XMOVDGE) 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, OpS390XCMPU, types.TypeFlags) 2180 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2181 v3.AddArg(x) 2182 v2.AddArg(v3) 2183 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2184 v4.AddArg(y) 2185 v2.AddArg(v4) 2186 v.AddArg(v2) 2187 return true 2188 } 2189 } 2190 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2191 // match: (GetClosurePtr) 2192 // cond: 2193 // result: (LoweredGetClosurePtr) 2194 for { 2195 v.reset(OpS390XLoweredGetClosurePtr) 2196 return true 2197 } 2198 } 2199 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2200 // match: (GetG mem) 2201 // cond: 2202 // result: (LoweredGetG mem) 2203 for { 2204 mem := v.Args[0] 2205 v.reset(OpS390XLoweredGetG) 2206 v.AddArg(mem) 2207 return true 2208 } 2209 } 2210 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2211 b := v.Block 2212 _ = b 2213 typ := &b.Func.Config.Types 2214 _ = typ 2215 // match: (Greater16 x y) 2216 // cond: 2217 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2218 for { 2219 _ = v.Args[1] 2220 x := v.Args[0] 2221 y := v.Args[1] 2222 v.reset(OpS390XMOVDGT) 2223 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2224 v0.AuxInt = 0 2225 v.AddArg(v0) 2226 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2227 v1.AuxInt = 1 2228 v.AddArg(v1) 2229 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2230 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2231 v3.AddArg(x) 2232 v2.AddArg(v3) 2233 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2234 v4.AddArg(y) 2235 v2.AddArg(v4) 2236 v.AddArg(v2) 2237 return true 2238 } 2239 } 2240 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2241 b := v.Block 2242 _ = b 2243 typ := &b.Func.Config.Types 2244 _ = typ 2245 // match: (Greater16U x y) 2246 // cond: 2247 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2248 for { 2249 _ = v.Args[1] 2250 x := v.Args[0] 2251 y := v.Args[1] 2252 v.reset(OpS390XMOVDGT) 2253 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2254 v0.AuxInt = 0 2255 v.AddArg(v0) 2256 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2257 v1.AuxInt = 1 2258 v.AddArg(v1) 2259 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2260 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2261 v3.AddArg(x) 2262 v2.AddArg(v3) 2263 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2264 v4.AddArg(y) 2265 v2.AddArg(v4) 2266 v.AddArg(v2) 2267 return true 2268 } 2269 } 2270 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2271 b := v.Block 2272 _ = b 2273 typ := &b.Func.Config.Types 2274 _ = typ 2275 // match: (Greater32 x y) 2276 // cond: 2277 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2278 for { 2279 _ = v.Args[1] 2280 x := v.Args[0] 2281 y := v.Args[1] 2282 v.reset(OpS390XMOVDGT) 2283 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2284 v0.AuxInt = 0 2285 v.AddArg(v0) 2286 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2287 v1.AuxInt = 1 2288 v.AddArg(v1) 2289 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2290 v2.AddArg(x) 2291 v2.AddArg(y) 2292 v.AddArg(v2) 2293 return true 2294 } 2295 } 2296 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2297 b := v.Block 2298 _ = b 2299 typ := &b.Func.Config.Types 2300 _ = typ 2301 // match: (Greater32F x y) 2302 // cond: 2303 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2304 for { 2305 _ = v.Args[1] 2306 x := v.Args[0] 2307 y := v.Args[1] 2308 v.reset(OpS390XMOVDGTnoinv) 2309 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2310 v0.AuxInt = 0 2311 v.AddArg(v0) 2312 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2313 v1.AuxInt = 1 2314 v.AddArg(v1) 2315 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2316 v2.AddArg(x) 2317 v2.AddArg(y) 2318 v.AddArg(v2) 2319 return true 2320 } 2321 } 2322 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2323 b := v.Block 2324 _ = b 2325 typ := &b.Func.Config.Types 2326 _ = typ 2327 // match: (Greater32U x y) 2328 // cond: 2329 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2330 for { 2331 _ = v.Args[1] 2332 x := v.Args[0] 2333 y := v.Args[1] 2334 v.reset(OpS390XMOVDGT) 2335 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2336 v0.AuxInt = 0 2337 v.AddArg(v0) 2338 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2339 v1.AuxInt = 1 2340 v.AddArg(v1) 2341 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2342 v2.AddArg(x) 2343 v2.AddArg(y) 2344 v.AddArg(v2) 2345 return true 2346 } 2347 } 2348 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2349 b := v.Block 2350 _ = b 2351 typ := &b.Func.Config.Types 2352 _ = typ 2353 // match: (Greater64 x y) 2354 // cond: 2355 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2356 for { 2357 _ = v.Args[1] 2358 x := v.Args[0] 2359 y := v.Args[1] 2360 v.reset(OpS390XMOVDGT) 2361 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2362 v0.AuxInt = 0 2363 v.AddArg(v0) 2364 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2365 v1.AuxInt = 1 2366 v.AddArg(v1) 2367 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2368 v2.AddArg(x) 2369 v2.AddArg(y) 2370 v.AddArg(v2) 2371 return true 2372 } 2373 } 2374 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2375 b := v.Block 2376 _ = b 2377 typ := &b.Func.Config.Types 2378 _ = typ 2379 // match: (Greater64F x y) 2380 // cond: 2381 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2382 for { 2383 _ = v.Args[1] 2384 x := v.Args[0] 2385 y := v.Args[1] 2386 v.reset(OpS390XMOVDGTnoinv) 2387 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2388 v0.AuxInt = 0 2389 v.AddArg(v0) 2390 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2391 v1.AuxInt = 1 2392 v.AddArg(v1) 2393 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2394 v2.AddArg(x) 2395 v2.AddArg(y) 2396 v.AddArg(v2) 2397 return true 2398 } 2399 } 2400 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2401 b := v.Block 2402 _ = b 2403 typ := &b.Func.Config.Types 2404 _ = typ 2405 // match: (Greater64U x y) 2406 // cond: 2407 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2408 for { 2409 _ = v.Args[1] 2410 x := v.Args[0] 2411 y := v.Args[1] 2412 v.reset(OpS390XMOVDGT) 2413 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2414 v0.AuxInt = 0 2415 v.AddArg(v0) 2416 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2417 v1.AuxInt = 1 2418 v.AddArg(v1) 2419 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2420 v2.AddArg(x) 2421 v2.AddArg(y) 2422 v.AddArg(v2) 2423 return true 2424 } 2425 } 2426 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2427 b := v.Block 2428 _ = b 2429 typ := &b.Func.Config.Types 2430 _ = typ 2431 // match: (Greater8 x y) 2432 // cond: 2433 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2434 for { 2435 _ = v.Args[1] 2436 x := v.Args[0] 2437 y := v.Args[1] 2438 v.reset(OpS390XMOVDGT) 2439 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2440 v0.AuxInt = 0 2441 v.AddArg(v0) 2442 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2443 v1.AuxInt = 1 2444 v.AddArg(v1) 2445 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2446 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2447 v3.AddArg(x) 2448 v2.AddArg(v3) 2449 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2450 v4.AddArg(y) 2451 v2.AddArg(v4) 2452 v.AddArg(v2) 2453 return true 2454 } 2455 } 2456 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2457 b := v.Block 2458 _ = b 2459 typ := &b.Func.Config.Types 2460 _ = typ 2461 // match: (Greater8U x y) 2462 // cond: 2463 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2464 for { 2465 _ = v.Args[1] 2466 x := v.Args[0] 2467 y := v.Args[1] 2468 v.reset(OpS390XMOVDGT) 2469 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2470 v0.AuxInt = 0 2471 v.AddArg(v0) 2472 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2473 v1.AuxInt = 1 2474 v.AddArg(v1) 2475 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2476 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2477 v3.AddArg(x) 2478 v2.AddArg(v3) 2479 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2480 v4.AddArg(y) 2481 v2.AddArg(v4) 2482 v.AddArg(v2) 2483 return true 2484 } 2485 } 2486 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2487 b := v.Block 2488 _ = b 2489 typ := &b.Func.Config.Types 2490 _ = typ 2491 // match: (Hmul32 x y) 2492 // cond: 2493 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2494 for { 2495 _ = v.Args[1] 2496 x := v.Args[0] 2497 y := v.Args[1] 2498 v.reset(OpS390XSRDconst) 2499 v.AuxInt = 32 2500 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2501 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2502 v1.AddArg(x) 2503 v0.AddArg(v1) 2504 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2505 v2.AddArg(y) 2506 v0.AddArg(v2) 2507 v.AddArg(v0) 2508 return true 2509 } 2510 } 2511 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2512 b := v.Block 2513 _ = b 2514 typ := &b.Func.Config.Types 2515 _ = typ 2516 // match: (Hmul32u x y) 2517 // cond: 2518 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2519 for { 2520 _ = v.Args[1] 2521 x := v.Args[0] 2522 y := v.Args[1] 2523 v.reset(OpS390XSRDconst) 2524 v.AuxInt = 32 2525 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2526 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2527 v1.AddArg(x) 2528 v0.AddArg(v1) 2529 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2530 v2.AddArg(y) 2531 v0.AddArg(v2) 2532 v.AddArg(v0) 2533 return true 2534 } 2535 } 2536 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2537 // match: (Hmul64 x y) 2538 // cond: 2539 // result: (MULHD x y) 2540 for { 2541 _ = v.Args[1] 2542 x := v.Args[0] 2543 y := v.Args[1] 2544 v.reset(OpS390XMULHD) 2545 v.AddArg(x) 2546 v.AddArg(y) 2547 return true 2548 } 2549 } 2550 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2551 // match: (Hmul64u x y) 2552 // cond: 2553 // result: (MULHDU x y) 2554 for { 2555 _ = v.Args[1] 2556 x := v.Args[0] 2557 y := v.Args[1] 2558 v.reset(OpS390XMULHDU) 2559 v.AddArg(x) 2560 v.AddArg(y) 2561 return true 2562 } 2563 } 2564 func rewriteValueS390X_OpITab_0(v *Value) bool { 2565 // match: (ITab (Load ptr mem)) 2566 // cond: 2567 // result: (MOVDload ptr mem) 2568 for { 2569 v_0 := v.Args[0] 2570 if v_0.Op != OpLoad { 2571 break 2572 } 2573 _ = v_0.Args[1] 2574 ptr := v_0.Args[0] 2575 mem := v_0.Args[1] 2576 v.reset(OpS390XMOVDload) 2577 v.AddArg(ptr) 2578 v.AddArg(mem) 2579 return true 2580 } 2581 return false 2582 } 2583 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2584 // match: (InterCall [argwid] entry mem) 2585 // cond: 2586 // result: (CALLinter [argwid] entry mem) 2587 for { 2588 argwid := v.AuxInt 2589 _ = v.Args[1] 2590 entry := v.Args[0] 2591 mem := v.Args[1] 2592 v.reset(OpS390XCALLinter) 2593 v.AuxInt = argwid 2594 v.AddArg(entry) 2595 v.AddArg(mem) 2596 return true 2597 } 2598 } 2599 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2600 b := v.Block 2601 _ = b 2602 typ := &b.Func.Config.Types 2603 _ = typ 2604 // match: (IsInBounds idx len) 2605 // cond: 2606 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2607 for { 2608 _ = v.Args[1] 2609 idx := v.Args[0] 2610 len := v.Args[1] 2611 v.reset(OpS390XMOVDLT) 2612 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2613 v0.AuxInt = 0 2614 v.AddArg(v0) 2615 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2616 v1.AuxInt = 1 2617 v.AddArg(v1) 2618 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2619 v2.AddArg(idx) 2620 v2.AddArg(len) 2621 v.AddArg(v2) 2622 return true 2623 } 2624 } 2625 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2626 b := v.Block 2627 _ = b 2628 typ := &b.Func.Config.Types 2629 _ = typ 2630 // match: (IsNonNil p) 2631 // cond: 2632 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2633 for { 2634 p := v.Args[0] 2635 v.reset(OpS390XMOVDNE) 2636 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2637 v0.AuxInt = 0 2638 v.AddArg(v0) 2639 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2640 v1.AuxInt = 1 2641 v.AddArg(v1) 2642 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2643 v2.AuxInt = 0 2644 v2.AddArg(p) 2645 v.AddArg(v2) 2646 return true 2647 } 2648 } 2649 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2650 b := v.Block 2651 _ = b 2652 typ := &b.Func.Config.Types 2653 _ = typ 2654 // match: (IsSliceInBounds idx len) 2655 // cond: 2656 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2657 for { 2658 _ = v.Args[1] 2659 idx := v.Args[0] 2660 len := v.Args[1] 2661 v.reset(OpS390XMOVDLE) 2662 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2663 v0.AuxInt = 0 2664 v.AddArg(v0) 2665 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2666 v1.AuxInt = 1 2667 v.AddArg(v1) 2668 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2669 v2.AddArg(idx) 2670 v2.AddArg(len) 2671 v.AddArg(v2) 2672 return true 2673 } 2674 } 2675 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2676 b := v.Block 2677 _ = b 2678 typ := &b.Func.Config.Types 2679 _ = typ 2680 // match: (Leq16 x y) 2681 // cond: 2682 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2683 for { 2684 _ = v.Args[1] 2685 x := v.Args[0] 2686 y := v.Args[1] 2687 v.reset(OpS390XMOVDLE) 2688 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2689 v0.AuxInt = 0 2690 v.AddArg(v0) 2691 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2692 v1.AuxInt = 1 2693 v.AddArg(v1) 2694 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2695 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2696 v3.AddArg(x) 2697 v2.AddArg(v3) 2698 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2699 v4.AddArg(y) 2700 v2.AddArg(v4) 2701 v.AddArg(v2) 2702 return true 2703 } 2704 } 2705 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2706 b := v.Block 2707 _ = b 2708 typ := &b.Func.Config.Types 2709 _ = typ 2710 // match: (Leq16U x y) 2711 // cond: 2712 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2713 for { 2714 _ = v.Args[1] 2715 x := v.Args[0] 2716 y := v.Args[1] 2717 v.reset(OpS390XMOVDLE) 2718 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2719 v0.AuxInt = 0 2720 v.AddArg(v0) 2721 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2722 v1.AuxInt = 1 2723 v.AddArg(v1) 2724 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2725 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2726 v3.AddArg(x) 2727 v2.AddArg(v3) 2728 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2729 v4.AddArg(y) 2730 v2.AddArg(v4) 2731 v.AddArg(v2) 2732 return true 2733 } 2734 } 2735 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2736 b := v.Block 2737 _ = b 2738 typ := &b.Func.Config.Types 2739 _ = typ 2740 // match: (Leq32 x y) 2741 // cond: 2742 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2743 for { 2744 _ = v.Args[1] 2745 x := v.Args[0] 2746 y := v.Args[1] 2747 v.reset(OpS390XMOVDLE) 2748 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2749 v0.AuxInt = 0 2750 v.AddArg(v0) 2751 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2752 v1.AuxInt = 1 2753 v.AddArg(v1) 2754 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2755 v2.AddArg(x) 2756 v2.AddArg(y) 2757 v.AddArg(v2) 2758 return true 2759 } 2760 } 2761 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2762 b := v.Block 2763 _ = b 2764 typ := &b.Func.Config.Types 2765 _ = typ 2766 // match: (Leq32F x y) 2767 // cond: 2768 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2769 for { 2770 _ = v.Args[1] 2771 x := v.Args[0] 2772 y := v.Args[1] 2773 v.reset(OpS390XMOVDGEnoinv) 2774 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2775 v0.AuxInt = 0 2776 v.AddArg(v0) 2777 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2778 v1.AuxInt = 1 2779 v.AddArg(v1) 2780 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2781 v2.AddArg(y) 2782 v2.AddArg(x) 2783 v.AddArg(v2) 2784 return true 2785 } 2786 } 2787 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2788 b := v.Block 2789 _ = b 2790 typ := &b.Func.Config.Types 2791 _ = typ 2792 // match: (Leq32U x y) 2793 // cond: 2794 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2795 for { 2796 _ = v.Args[1] 2797 x := v.Args[0] 2798 y := v.Args[1] 2799 v.reset(OpS390XMOVDLE) 2800 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2801 v0.AuxInt = 0 2802 v.AddArg(v0) 2803 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2804 v1.AuxInt = 1 2805 v.AddArg(v1) 2806 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2807 v2.AddArg(x) 2808 v2.AddArg(y) 2809 v.AddArg(v2) 2810 return true 2811 } 2812 } 2813 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2814 b := v.Block 2815 _ = b 2816 typ := &b.Func.Config.Types 2817 _ = typ 2818 // match: (Leq64 x y) 2819 // cond: 2820 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2821 for { 2822 _ = v.Args[1] 2823 x := v.Args[0] 2824 y := v.Args[1] 2825 v.reset(OpS390XMOVDLE) 2826 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2827 v0.AuxInt = 0 2828 v.AddArg(v0) 2829 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2830 v1.AuxInt = 1 2831 v.AddArg(v1) 2832 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2833 v2.AddArg(x) 2834 v2.AddArg(y) 2835 v.AddArg(v2) 2836 return true 2837 } 2838 } 2839 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2840 b := v.Block 2841 _ = b 2842 typ := &b.Func.Config.Types 2843 _ = typ 2844 // match: (Leq64F x y) 2845 // cond: 2846 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2847 for { 2848 _ = v.Args[1] 2849 x := v.Args[0] 2850 y := v.Args[1] 2851 v.reset(OpS390XMOVDGEnoinv) 2852 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2853 v0.AuxInt = 0 2854 v.AddArg(v0) 2855 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2856 v1.AuxInt = 1 2857 v.AddArg(v1) 2858 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2859 v2.AddArg(y) 2860 v2.AddArg(x) 2861 v.AddArg(v2) 2862 return true 2863 } 2864 } 2865 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2866 b := v.Block 2867 _ = b 2868 typ := &b.Func.Config.Types 2869 _ = typ 2870 // match: (Leq64U x y) 2871 // cond: 2872 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2873 for { 2874 _ = v.Args[1] 2875 x := v.Args[0] 2876 y := v.Args[1] 2877 v.reset(OpS390XMOVDLE) 2878 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2879 v0.AuxInt = 0 2880 v.AddArg(v0) 2881 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2882 v1.AuxInt = 1 2883 v.AddArg(v1) 2884 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2885 v2.AddArg(x) 2886 v2.AddArg(y) 2887 v.AddArg(v2) 2888 return true 2889 } 2890 } 2891 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 2892 b := v.Block 2893 _ = b 2894 typ := &b.Func.Config.Types 2895 _ = typ 2896 // match: (Leq8 x y) 2897 // cond: 2898 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2899 for { 2900 _ = v.Args[1] 2901 x := v.Args[0] 2902 y := v.Args[1] 2903 v.reset(OpS390XMOVDLE) 2904 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2905 v0.AuxInt = 0 2906 v.AddArg(v0) 2907 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2908 v1.AuxInt = 1 2909 v.AddArg(v1) 2910 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2911 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2912 v3.AddArg(x) 2913 v2.AddArg(v3) 2914 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2915 v4.AddArg(y) 2916 v2.AddArg(v4) 2917 v.AddArg(v2) 2918 return true 2919 } 2920 } 2921 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 2922 b := v.Block 2923 _ = b 2924 typ := &b.Func.Config.Types 2925 _ = typ 2926 // match: (Leq8U x y) 2927 // cond: 2928 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2929 for { 2930 _ = v.Args[1] 2931 x := v.Args[0] 2932 y := v.Args[1] 2933 v.reset(OpS390XMOVDLE) 2934 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2935 v0.AuxInt = 0 2936 v.AddArg(v0) 2937 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2938 v1.AuxInt = 1 2939 v.AddArg(v1) 2940 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2941 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2942 v3.AddArg(x) 2943 v2.AddArg(v3) 2944 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2945 v4.AddArg(y) 2946 v2.AddArg(v4) 2947 v.AddArg(v2) 2948 return true 2949 } 2950 } 2951 func rewriteValueS390X_OpLess16_0(v *Value) bool { 2952 b := v.Block 2953 _ = b 2954 typ := &b.Func.Config.Types 2955 _ = typ 2956 // match: (Less16 x y) 2957 // cond: 2958 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2959 for { 2960 _ = v.Args[1] 2961 x := v.Args[0] 2962 y := v.Args[1] 2963 v.reset(OpS390XMOVDLT) 2964 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2965 v0.AuxInt = 0 2966 v.AddArg(v0) 2967 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2968 v1.AuxInt = 1 2969 v.AddArg(v1) 2970 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2971 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2972 v3.AddArg(x) 2973 v2.AddArg(v3) 2974 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2975 v4.AddArg(y) 2976 v2.AddArg(v4) 2977 v.AddArg(v2) 2978 return true 2979 } 2980 } 2981 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 2982 b := v.Block 2983 _ = b 2984 typ := &b.Func.Config.Types 2985 _ = typ 2986 // match: (Less16U x y) 2987 // cond: 2988 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2989 for { 2990 _ = v.Args[1] 2991 x := v.Args[0] 2992 y := v.Args[1] 2993 v.reset(OpS390XMOVDLT) 2994 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2995 v0.AuxInt = 0 2996 v.AddArg(v0) 2997 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2998 v1.AuxInt = 1 2999 v.AddArg(v1) 3000 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3001 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3002 v3.AddArg(x) 3003 v2.AddArg(v3) 3004 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3005 v4.AddArg(y) 3006 v2.AddArg(v4) 3007 v.AddArg(v2) 3008 return true 3009 } 3010 } 3011 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3012 b := v.Block 3013 _ = b 3014 typ := &b.Func.Config.Types 3015 _ = typ 3016 // match: (Less32 x y) 3017 // cond: 3018 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3019 for { 3020 _ = v.Args[1] 3021 x := v.Args[0] 3022 y := v.Args[1] 3023 v.reset(OpS390XMOVDLT) 3024 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3025 v0.AuxInt = 0 3026 v.AddArg(v0) 3027 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3028 v1.AuxInt = 1 3029 v.AddArg(v1) 3030 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3031 v2.AddArg(x) 3032 v2.AddArg(y) 3033 v.AddArg(v2) 3034 return true 3035 } 3036 } 3037 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3038 b := v.Block 3039 _ = b 3040 typ := &b.Func.Config.Types 3041 _ = typ 3042 // match: (Less32F x y) 3043 // cond: 3044 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3045 for { 3046 _ = v.Args[1] 3047 x := v.Args[0] 3048 y := v.Args[1] 3049 v.reset(OpS390XMOVDGTnoinv) 3050 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3051 v0.AuxInt = 0 3052 v.AddArg(v0) 3053 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3054 v1.AuxInt = 1 3055 v.AddArg(v1) 3056 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3057 v2.AddArg(y) 3058 v2.AddArg(x) 3059 v.AddArg(v2) 3060 return true 3061 } 3062 } 3063 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3064 b := v.Block 3065 _ = b 3066 typ := &b.Func.Config.Types 3067 _ = typ 3068 // match: (Less32U x y) 3069 // cond: 3070 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3071 for { 3072 _ = v.Args[1] 3073 x := v.Args[0] 3074 y := v.Args[1] 3075 v.reset(OpS390XMOVDLT) 3076 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3077 v0.AuxInt = 0 3078 v.AddArg(v0) 3079 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3080 v1.AuxInt = 1 3081 v.AddArg(v1) 3082 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3083 v2.AddArg(x) 3084 v2.AddArg(y) 3085 v.AddArg(v2) 3086 return true 3087 } 3088 } 3089 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3090 b := v.Block 3091 _ = b 3092 typ := &b.Func.Config.Types 3093 _ = typ 3094 // match: (Less64 x y) 3095 // cond: 3096 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3097 for { 3098 _ = v.Args[1] 3099 x := v.Args[0] 3100 y := v.Args[1] 3101 v.reset(OpS390XMOVDLT) 3102 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3103 v0.AuxInt = 0 3104 v.AddArg(v0) 3105 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3106 v1.AuxInt = 1 3107 v.AddArg(v1) 3108 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3109 v2.AddArg(x) 3110 v2.AddArg(y) 3111 v.AddArg(v2) 3112 return true 3113 } 3114 } 3115 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3116 b := v.Block 3117 _ = b 3118 typ := &b.Func.Config.Types 3119 _ = typ 3120 // match: (Less64F x y) 3121 // cond: 3122 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3123 for { 3124 _ = v.Args[1] 3125 x := v.Args[0] 3126 y := v.Args[1] 3127 v.reset(OpS390XMOVDGTnoinv) 3128 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3129 v0.AuxInt = 0 3130 v.AddArg(v0) 3131 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3132 v1.AuxInt = 1 3133 v.AddArg(v1) 3134 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3135 v2.AddArg(y) 3136 v2.AddArg(x) 3137 v.AddArg(v2) 3138 return true 3139 } 3140 } 3141 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3142 b := v.Block 3143 _ = b 3144 typ := &b.Func.Config.Types 3145 _ = typ 3146 // match: (Less64U x y) 3147 // cond: 3148 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3149 for { 3150 _ = v.Args[1] 3151 x := v.Args[0] 3152 y := v.Args[1] 3153 v.reset(OpS390XMOVDLT) 3154 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3155 v0.AuxInt = 0 3156 v.AddArg(v0) 3157 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3158 v1.AuxInt = 1 3159 v.AddArg(v1) 3160 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3161 v2.AddArg(x) 3162 v2.AddArg(y) 3163 v.AddArg(v2) 3164 return true 3165 } 3166 } 3167 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3168 b := v.Block 3169 _ = b 3170 typ := &b.Func.Config.Types 3171 _ = typ 3172 // match: (Less8 x y) 3173 // cond: 3174 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3175 for { 3176 _ = v.Args[1] 3177 x := v.Args[0] 3178 y := v.Args[1] 3179 v.reset(OpS390XMOVDLT) 3180 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3181 v0.AuxInt = 0 3182 v.AddArg(v0) 3183 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3184 v1.AuxInt = 1 3185 v.AddArg(v1) 3186 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3187 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3188 v3.AddArg(x) 3189 v2.AddArg(v3) 3190 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3191 v4.AddArg(y) 3192 v2.AddArg(v4) 3193 v.AddArg(v2) 3194 return true 3195 } 3196 } 3197 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3198 b := v.Block 3199 _ = b 3200 typ := &b.Func.Config.Types 3201 _ = typ 3202 // match: (Less8U x y) 3203 // cond: 3204 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3205 for { 3206 _ = v.Args[1] 3207 x := v.Args[0] 3208 y := v.Args[1] 3209 v.reset(OpS390XMOVDLT) 3210 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3211 v0.AuxInt = 0 3212 v.AddArg(v0) 3213 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3214 v1.AuxInt = 1 3215 v.AddArg(v1) 3216 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3217 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3218 v3.AddArg(x) 3219 v2.AddArg(v3) 3220 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3221 v4.AddArg(y) 3222 v2.AddArg(v4) 3223 v.AddArg(v2) 3224 return true 3225 } 3226 } 3227 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3228 // match: (Load <t> ptr mem) 3229 // cond: (is64BitInt(t) || isPtr(t)) 3230 // result: (MOVDload ptr mem) 3231 for { 3232 t := v.Type 3233 _ = v.Args[1] 3234 ptr := v.Args[0] 3235 mem := v.Args[1] 3236 if !(is64BitInt(t) || isPtr(t)) { 3237 break 3238 } 3239 v.reset(OpS390XMOVDload) 3240 v.AddArg(ptr) 3241 v.AddArg(mem) 3242 return true 3243 } 3244 // match: (Load <t> ptr mem) 3245 // cond: is32BitInt(t) && isSigned(t) 3246 // result: (MOVWload ptr mem) 3247 for { 3248 t := v.Type 3249 _ = v.Args[1] 3250 ptr := v.Args[0] 3251 mem := v.Args[1] 3252 if !(is32BitInt(t) && isSigned(t)) { 3253 break 3254 } 3255 v.reset(OpS390XMOVWload) 3256 v.AddArg(ptr) 3257 v.AddArg(mem) 3258 return true 3259 } 3260 // match: (Load <t> ptr mem) 3261 // cond: is32BitInt(t) && !isSigned(t) 3262 // result: (MOVWZload ptr mem) 3263 for { 3264 t := v.Type 3265 _ = v.Args[1] 3266 ptr := v.Args[0] 3267 mem := v.Args[1] 3268 if !(is32BitInt(t) && !isSigned(t)) { 3269 break 3270 } 3271 v.reset(OpS390XMOVWZload) 3272 v.AddArg(ptr) 3273 v.AddArg(mem) 3274 return true 3275 } 3276 // match: (Load <t> ptr mem) 3277 // cond: is16BitInt(t) && isSigned(t) 3278 // result: (MOVHload ptr mem) 3279 for { 3280 t := v.Type 3281 _ = v.Args[1] 3282 ptr := v.Args[0] 3283 mem := v.Args[1] 3284 if !(is16BitInt(t) && isSigned(t)) { 3285 break 3286 } 3287 v.reset(OpS390XMOVHload) 3288 v.AddArg(ptr) 3289 v.AddArg(mem) 3290 return true 3291 } 3292 // match: (Load <t> ptr mem) 3293 // cond: is16BitInt(t) && !isSigned(t) 3294 // result: (MOVHZload ptr mem) 3295 for { 3296 t := v.Type 3297 _ = v.Args[1] 3298 ptr := v.Args[0] 3299 mem := v.Args[1] 3300 if !(is16BitInt(t) && !isSigned(t)) { 3301 break 3302 } 3303 v.reset(OpS390XMOVHZload) 3304 v.AddArg(ptr) 3305 v.AddArg(mem) 3306 return true 3307 } 3308 // match: (Load <t> ptr mem) 3309 // cond: is8BitInt(t) && isSigned(t) 3310 // result: (MOVBload ptr mem) 3311 for { 3312 t := v.Type 3313 _ = v.Args[1] 3314 ptr := v.Args[0] 3315 mem := v.Args[1] 3316 if !(is8BitInt(t) && isSigned(t)) { 3317 break 3318 } 3319 v.reset(OpS390XMOVBload) 3320 v.AddArg(ptr) 3321 v.AddArg(mem) 3322 return true 3323 } 3324 // match: (Load <t> ptr mem) 3325 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3326 // result: (MOVBZload ptr mem) 3327 for { 3328 t := v.Type 3329 _ = v.Args[1] 3330 ptr := v.Args[0] 3331 mem := v.Args[1] 3332 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3333 break 3334 } 3335 v.reset(OpS390XMOVBZload) 3336 v.AddArg(ptr) 3337 v.AddArg(mem) 3338 return true 3339 } 3340 // match: (Load <t> ptr mem) 3341 // cond: is32BitFloat(t) 3342 // result: (FMOVSload ptr mem) 3343 for { 3344 t := v.Type 3345 _ = v.Args[1] 3346 ptr := v.Args[0] 3347 mem := v.Args[1] 3348 if !(is32BitFloat(t)) { 3349 break 3350 } 3351 v.reset(OpS390XFMOVSload) 3352 v.AddArg(ptr) 3353 v.AddArg(mem) 3354 return true 3355 } 3356 // match: (Load <t> ptr mem) 3357 // cond: is64BitFloat(t) 3358 // result: (FMOVDload ptr mem) 3359 for { 3360 t := v.Type 3361 _ = v.Args[1] 3362 ptr := v.Args[0] 3363 mem := v.Args[1] 3364 if !(is64BitFloat(t)) { 3365 break 3366 } 3367 v.reset(OpS390XFMOVDload) 3368 v.AddArg(ptr) 3369 v.AddArg(mem) 3370 return true 3371 } 3372 return false 3373 } 3374 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3375 b := v.Block 3376 _ = b 3377 typ := &b.Func.Config.Types 3378 _ = typ 3379 // match: (Lsh16x16 <t> x y) 3380 // cond: 3381 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3382 for { 3383 t := v.Type 3384 _ = v.Args[1] 3385 x := v.Args[0] 3386 y := v.Args[1] 3387 v.reset(OpS390XANDW) 3388 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3389 v0.AddArg(x) 3390 v0.AddArg(y) 3391 v.AddArg(v0) 3392 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3393 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3394 v2.AuxInt = 31 3395 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3396 v3.AddArg(y) 3397 v2.AddArg(v3) 3398 v1.AddArg(v2) 3399 v.AddArg(v1) 3400 return true 3401 } 3402 } 3403 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3404 b := v.Block 3405 _ = b 3406 // match: (Lsh16x32 <t> x y) 3407 // cond: 3408 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3409 for { 3410 t := v.Type 3411 _ = v.Args[1] 3412 x := v.Args[0] 3413 y := v.Args[1] 3414 v.reset(OpS390XANDW) 3415 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3416 v0.AddArg(x) 3417 v0.AddArg(y) 3418 v.AddArg(v0) 3419 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3420 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3421 v2.AuxInt = 31 3422 v2.AddArg(y) 3423 v1.AddArg(v2) 3424 v.AddArg(v1) 3425 return true 3426 } 3427 } 3428 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3429 b := v.Block 3430 _ = b 3431 // match: (Lsh16x64 <t> x y) 3432 // cond: 3433 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3434 for { 3435 t := v.Type 3436 _ = v.Args[1] 3437 x := v.Args[0] 3438 y := v.Args[1] 3439 v.reset(OpS390XANDW) 3440 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3441 v0.AddArg(x) 3442 v0.AddArg(y) 3443 v.AddArg(v0) 3444 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3445 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3446 v2.AuxInt = 31 3447 v2.AddArg(y) 3448 v1.AddArg(v2) 3449 v.AddArg(v1) 3450 return true 3451 } 3452 } 3453 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3454 b := v.Block 3455 _ = b 3456 typ := &b.Func.Config.Types 3457 _ = typ 3458 // match: (Lsh16x8 <t> x y) 3459 // cond: 3460 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3461 for { 3462 t := v.Type 3463 _ = v.Args[1] 3464 x := v.Args[0] 3465 y := v.Args[1] 3466 v.reset(OpS390XANDW) 3467 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3468 v0.AddArg(x) 3469 v0.AddArg(y) 3470 v.AddArg(v0) 3471 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3472 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3473 v2.AuxInt = 31 3474 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3475 v3.AddArg(y) 3476 v2.AddArg(v3) 3477 v1.AddArg(v2) 3478 v.AddArg(v1) 3479 return true 3480 } 3481 } 3482 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3483 b := v.Block 3484 _ = b 3485 typ := &b.Func.Config.Types 3486 _ = typ 3487 // match: (Lsh32x16 <t> x y) 3488 // cond: 3489 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3490 for { 3491 t := v.Type 3492 _ = v.Args[1] 3493 x := v.Args[0] 3494 y := v.Args[1] 3495 v.reset(OpS390XANDW) 3496 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3497 v0.AddArg(x) 3498 v0.AddArg(y) 3499 v.AddArg(v0) 3500 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3501 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3502 v2.AuxInt = 31 3503 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3504 v3.AddArg(y) 3505 v2.AddArg(v3) 3506 v1.AddArg(v2) 3507 v.AddArg(v1) 3508 return true 3509 } 3510 } 3511 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3512 b := v.Block 3513 _ = b 3514 // match: (Lsh32x32 <t> x y) 3515 // cond: 3516 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3517 for { 3518 t := v.Type 3519 _ = v.Args[1] 3520 x := v.Args[0] 3521 y := v.Args[1] 3522 v.reset(OpS390XANDW) 3523 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3524 v0.AddArg(x) 3525 v0.AddArg(y) 3526 v.AddArg(v0) 3527 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3528 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3529 v2.AuxInt = 31 3530 v2.AddArg(y) 3531 v1.AddArg(v2) 3532 v.AddArg(v1) 3533 return true 3534 } 3535 } 3536 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3537 b := v.Block 3538 _ = b 3539 // match: (Lsh32x64 <t> x y) 3540 // cond: 3541 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3542 for { 3543 t := v.Type 3544 _ = v.Args[1] 3545 x := v.Args[0] 3546 y := v.Args[1] 3547 v.reset(OpS390XANDW) 3548 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3549 v0.AddArg(x) 3550 v0.AddArg(y) 3551 v.AddArg(v0) 3552 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3553 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3554 v2.AuxInt = 31 3555 v2.AddArg(y) 3556 v1.AddArg(v2) 3557 v.AddArg(v1) 3558 return true 3559 } 3560 } 3561 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3562 b := v.Block 3563 _ = b 3564 typ := &b.Func.Config.Types 3565 _ = typ 3566 // match: (Lsh32x8 <t> x y) 3567 // cond: 3568 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3569 for { 3570 t := v.Type 3571 _ = v.Args[1] 3572 x := v.Args[0] 3573 y := v.Args[1] 3574 v.reset(OpS390XANDW) 3575 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3576 v0.AddArg(x) 3577 v0.AddArg(y) 3578 v.AddArg(v0) 3579 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3580 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3581 v2.AuxInt = 31 3582 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3583 v3.AddArg(y) 3584 v2.AddArg(v3) 3585 v1.AddArg(v2) 3586 v.AddArg(v1) 3587 return true 3588 } 3589 } 3590 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3591 b := v.Block 3592 _ = b 3593 typ := &b.Func.Config.Types 3594 _ = typ 3595 // match: (Lsh64x16 <t> x y) 3596 // cond: 3597 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3598 for { 3599 t := v.Type 3600 _ = v.Args[1] 3601 x := v.Args[0] 3602 y := v.Args[1] 3603 v.reset(OpS390XAND) 3604 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3605 v0.AddArg(x) 3606 v0.AddArg(y) 3607 v.AddArg(v0) 3608 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3609 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3610 v2.AuxInt = 63 3611 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3612 v3.AddArg(y) 3613 v2.AddArg(v3) 3614 v1.AddArg(v2) 3615 v.AddArg(v1) 3616 return true 3617 } 3618 } 3619 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3620 b := v.Block 3621 _ = b 3622 // match: (Lsh64x32 <t> x y) 3623 // cond: 3624 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3625 for { 3626 t := v.Type 3627 _ = v.Args[1] 3628 x := v.Args[0] 3629 y := v.Args[1] 3630 v.reset(OpS390XAND) 3631 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3632 v0.AddArg(x) 3633 v0.AddArg(y) 3634 v.AddArg(v0) 3635 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3636 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3637 v2.AuxInt = 63 3638 v2.AddArg(y) 3639 v1.AddArg(v2) 3640 v.AddArg(v1) 3641 return true 3642 } 3643 } 3644 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3645 b := v.Block 3646 _ = b 3647 // match: (Lsh64x64 <t> x y) 3648 // cond: 3649 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3650 for { 3651 t := v.Type 3652 _ = v.Args[1] 3653 x := v.Args[0] 3654 y := v.Args[1] 3655 v.reset(OpS390XAND) 3656 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3657 v0.AddArg(x) 3658 v0.AddArg(y) 3659 v.AddArg(v0) 3660 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3661 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3662 v2.AuxInt = 63 3663 v2.AddArg(y) 3664 v1.AddArg(v2) 3665 v.AddArg(v1) 3666 return true 3667 } 3668 } 3669 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 3670 b := v.Block 3671 _ = b 3672 typ := &b.Func.Config.Types 3673 _ = typ 3674 // match: (Lsh64x8 <t> x y) 3675 // cond: 3676 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3677 for { 3678 t := v.Type 3679 _ = v.Args[1] 3680 x := v.Args[0] 3681 y := v.Args[1] 3682 v.reset(OpS390XAND) 3683 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3684 v0.AddArg(x) 3685 v0.AddArg(y) 3686 v.AddArg(v0) 3687 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3688 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3689 v2.AuxInt = 63 3690 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3691 v3.AddArg(y) 3692 v2.AddArg(v3) 3693 v1.AddArg(v2) 3694 v.AddArg(v1) 3695 return true 3696 } 3697 } 3698 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 3699 b := v.Block 3700 _ = b 3701 typ := &b.Func.Config.Types 3702 _ = typ 3703 // match: (Lsh8x16 <t> x y) 3704 // cond: 3705 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3706 for { 3707 t := v.Type 3708 _ = v.Args[1] 3709 x := v.Args[0] 3710 y := v.Args[1] 3711 v.reset(OpS390XANDW) 3712 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3713 v0.AddArg(x) 3714 v0.AddArg(y) 3715 v.AddArg(v0) 3716 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3717 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3718 v2.AuxInt = 31 3719 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3720 v3.AddArg(y) 3721 v2.AddArg(v3) 3722 v1.AddArg(v2) 3723 v.AddArg(v1) 3724 return true 3725 } 3726 } 3727 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 3728 b := v.Block 3729 _ = b 3730 // match: (Lsh8x32 <t> x y) 3731 // cond: 3732 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3733 for { 3734 t := v.Type 3735 _ = v.Args[1] 3736 x := v.Args[0] 3737 y := v.Args[1] 3738 v.reset(OpS390XANDW) 3739 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3740 v0.AddArg(x) 3741 v0.AddArg(y) 3742 v.AddArg(v0) 3743 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3744 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3745 v2.AuxInt = 31 3746 v2.AddArg(y) 3747 v1.AddArg(v2) 3748 v.AddArg(v1) 3749 return true 3750 } 3751 } 3752 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 3753 b := v.Block 3754 _ = b 3755 // match: (Lsh8x64 <t> x y) 3756 // cond: 3757 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3758 for { 3759 t := v.Type 3760 _ = v.Args[1] 3761 x := v.Args[0] 3762 y := v.Args[1] 3763 v.reset(OpS390XANDW) 3764 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3765 v0.AddArg(x) 3766 v0.AddArg(y) 3767 v.AddArg(v0) 3768 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3769 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3770 v2.AuxInt = 31 3771 v2.AddArg(y) 3772 v1.AddArg(v2) 3773 v.AddArg(v1) 3774 return true 3775 } 3776 } 3777 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 3778 b := v.Block 3779 _ = b 3780 typ := &b.Func.Config.Types 3781 _ = typ 3782 // match: (Lsh8x8 <t> x y) 3783 // cond: 3784 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3785 for { 3786 t := v.Type 3787 _ = v.Args[1] 3788 x := v.Args[0] 3789 y := v.Args[1] 3790 v.reset(OpS390XANDW) 3791 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3792 v0.AddArg(x) 3793 v0.AddArg(y) 3794 v.AddArg(v0) 3795 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3796 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3797 v2.AuxInt = 31 3798 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3799 v3.AddArg(y) 3800 v2.AddArg(v3) 3801 v1.AddArg(v2) 3802 v.AddArg(v1) 3803 return true 3804 } 3805 } 3806 func rewriteValueS390X_OpMod16_0(v *Value) bool { 3807 b := v.Block 3808 _ = b 3809 typ := &b.Func.Config.Types 3810 _ = typ 3811 // match: (Mod16 x y) 3812 // cond: 3813 // result: (MODW (MOVHreg x) (MOVHreg y)) 3814 for { 3815 _ = v.Args[1] 3816 x := v.Args[0] 3817 y := v.Args[1] 3818 v.reset(OpS390XMODW) 3819 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3820 v0.AddArg(x) 3821 v.AddArg(v0) 3822 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3823 v1.AddArg(y) 3824 v.AddArg(v1) 3825 return true 3826 } 3827 } 3828 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 3829 b := v.Block 3830 _ = b 3831 typ := &b.Func.Config.Types 3832 _ = typ 3833 // match: (Mod16u x y) 3834 // cond: 3835 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3836 for { 3837 _ = v.Args[1] 3838 x := v.Args[0] 3839 y := v.Args[1] 3840 v.reset(OpS390XMODWU) 3841 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3842 v0.AddArg(x) 3843 v.AddArg(v0) 3844 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3845 v1.AddArg(y) 3846 v.AddArg(v1) 3847 return true 3848 } 3849 } 3850 func rewriteValueS390X_OpMod32_0(v *Value) bool { 3851 b := v.Block 3852 _ = b 3853 typ := &b.Func.Config.Types 3854 _ = typ 3855 // match: (Mod32 x y) 3856 // cond: 3857 // result: (MODW (MOVWreg x) y) 3858 for { 3859 _ = v.Args[1] 3860 x := v.Args[0] 3861 y := v.Args[1] 3862 v.reset(OpS390XMODW) 3863 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 3864 v0.AddArg(x) 3865 v.AddArg(v0) 3866 v.AddArg(y) 3867 return true 3868 } 3869 } 3870 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 3871 b := v.Block 3872 _ = b 3873 typ := &b.Func.Config.Types 3874 _ = typ 3875 // match: (Mod32u x y) 3876 // cond: 3877 // result: (MODWU (MOVWZreg x) y) 3878 for { 3879 _ = v.Args[1] 3880 x := v.Args[0] 3881 y := v.Args[1] 3882 v.reset(OpS390XMODWU) 3883 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 3884 v0.AddArg(x) 3885 v.AddArg(v0) 3886 v.AddArg(y) 3887 return true 3888 } 3889 } 3890 func rewriteValueS390X_OpMod64_0(v *Value) bool { 3891 // match: (Mod64 x y) 3892 // cond: 3893 // result: (MODD x y) 3894 for { 3895 _ = v.Args[1] 3896 x := v.Args[0] 3897 y := v.Args[1] 3898 v.reset(OpS390XMODD) 3899 v.AddArg(x) 3900 v.AddArg(y) 3901 return true 3902 } 3903 } 3904 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 3905 // match: (Mod64u x y) 3906 // cond: 3907 // result: (MODDU x y) 3908 for { 3909 _ = v.Args[1] 3910 x := v.Args[0] 3911 y := v.Args[1] 3912 v.reset(OpS390XMODDU) 3913 v.AddArg(x) 3914 v.AddArg(y) 3915 return true 3916 } 3917 } 3918 func rewriteValueS390X_OpMod8_0(v *Value) bool { 3919 b := v.Block 3920 _ = b 3921 typ := &b.Func.Config.Types 3922 _ = typ 3923 // match: (Mod8 x y) 3924 // cond: 3925 // result: (MODW (MOVBreg x) (MOVBreg y)) 3926 for { 3927 _ = v.Args[1] 3928 x := v.Args[0] 3929 y := v.Args[1] 3930 v.reset(OpS390XMODW) 3931 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3932 v0.AddArg(x) 3933 v.AddArg(v0) 3934 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3935 v1.AddArg(y) 3936 v.AddArg(v1) 3937 return true 3938 } 3939 } 3940 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 3941 b := v.Block 3942 _ = b 3943 typ := &b.Func.Config.Types 3944 _ = typ 3945 // match: (Mod8u x y) 3946 // cond: 3947 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3948 for { 3949 _ = v.Args[1] 3950 x := v.Args[0] 3951 y := v.Args[1] 3952 v.reset(OpS390XMODWU) 3953 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3954 v0.AddArg(x) 3955 v.AddArg(v0) 3956 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3957 v1.AddArg(y) 3958 v.AddArg(v1) 3959 return true 3960 } 3961 } 3962 func rewriteValueS390X_OpMove_0(v *Value) bool { 3963 b := v.Block 3964 _ = b 3965 typ := &b.Func.Config.Types 3966 _ = typ 3967 // match: (Move [0] _ _ mem) 3968 // cond: 3969 // result: mem 3970 for { 3971 if v.AuxInt != 0 { 3972 break 3973 } 3974 _ = v.Args[2] 3975 mem := v.Args[2] 3976 v.reset(OpCopy) 3977 v.Type = mem.Type 3978 v.AddArg(mem) 3979 return true 3980 } 3981 // match: (Move [1] dst src mem) 3982 // cond: 3983 // result: (MOVBstore dst (MOVBZload src mem) mem) 3984 for { 3985 if v.AuxInt != 1 { 3986 break 3987 } 3988 _ = v.Args[2] 3989 dst := v.Args[0] 3990 src := v.Args[1] 3991 mem := v.Args[2] 3992 v.reset(OpS390XMOVBstore) 3993 v.AddArg(dst) 3994 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 3995 v0.AddArg(src) 3996 v0.AddArg(mem) 3997 v.AddArg(v0) 3998 v.AddArg(mem) 3999 return true 4000 } 4001 // match: (Move [2] dst src mem) 4002 // cond: 4003 // result: (MOVHstore dst (MOVHZload src mem) mem) 4004 for { 4005 if v.AuxInt != 2 { 4006 break 4007 } 4008 _ = v.Args[2] 4009 dst := v.Args[0] 4010 src := v.Args[1] 4011 mem := v.Args[2] 4012 v.reset(OpS390XMOVHstore) 4013 v.AddArg(dst) 4014 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4015 v0.AddArg(src) 4016 v0.AddArg(mem) 4017 v.AddArg(v0) 4018 v.AddArg(mem) 4019 return true 4020 } 4021 // match: (Move [4] dst src mem) 4022 // cond: 4023 // result: (MOVWstore dst (MOVWZload src mem) mem) 4024 for { 4025 if v.AuxInt != 4 { 4026 break 4027 } 4028 _ = v.Args[2] 4029 dst := v.Args[0] 4030 src := v.Args[1] 4031 mem := v.Args[2] 4032 v.reset(OpS390XMOVWstore) 4033 v.AddArg(dst) 4034 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4035 v0.AddArg(src) 4036 v0.AddArg(mem) 4037 v.AddArg(v0) 4038 v.AddArg(mem) 4039 return true 4040 } 4041 // match: (Move [8] dst src mem) 4042 // cond: 4043 // result: (MOVDstore dst (MOVDload src mem) mem) 4044 for { 4045 if v.AuxInt != 8 { 4046 break 4047 } 4048 _ = v.Args[2] 4049 dst := v.Args[0] 4050 src := v.Args[1] 4051 mem := v.Args[2] 4052 v.reset(OpS390XMOVDstore) 4053 v.AddArg(dst) 4054 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4055 v0.AddArg(src) 4056 v0.AddArg(mem) 4057 v.AddArg(v0) 4058 v.AddArg(mem) 4059 return true 4060 } 4061 // match: (Move [16] dst src mem) 4062 // cond: 4063 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4064 for { 4065 if v.AuxInt != 16 { 4066 break 4067 } 4068 _ = v.Args[2] 4069 dst := v.Args[0] 4070 src := v.Args[1] 4071 mem := v.Args[2] 4072 v.reset(OpS390XMOVDstore) 4073 v.AuxInt = 8 4074 v.AddArg(dst) 4075 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4076 v0.AuxInt = 8 4077 v0.AddArg(src) 4078 v0.AddArg(mem) 4079 v.AddArg(v0) 4080 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4081 v1.AddArg(dst) 4082 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4083 v2.AddArg(src) 4084 v2.AddArg(mem) 4085 v1.AddArg(v2) 4086 v1.AddArg(mem) 4087 v.AddArg(v1) 4088 return true 4089 } 4090 // match: (Move [24] dst src mem) 4091 // cond: 4092 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4093 for { 4094 if v.AuxInt != 24 { 4095 break 4096 } 4097 _ = v.Args[2] 4098 dst := v.Args[0] 4099 src := v.Args[1] 4100 mem := v.Args[2] 4101 v.reset(OpS390XMOVDstore) 4102 v.AuxInt = 16 4103 v.AddArg(dst) 4104 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4105 v0.AuxInt = 16 4106 v0.AddArg(src) 4107 v0.AddArg(mem) 4108 v.AddArg(v0) 4109 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4110 v1.AuxInt = 8 4111 v1.AddArg(dst) 4112 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4113 v2.AuxInt = 8 4114 v2.AddArg(src) 4115 v2.AddArg(mem) 4116 v1.AddArg(v2) 4117 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4118 v3.AddArg(dst) 4119 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4120 v4.AddArg(src) 4121 v4.AddArg(mem) 4122 v3.AddArg(v4) 4123 v3.AddArg(mem) 4124 v1.AddArg(v3) 4125 v.AddArg(v1) 4126 return true 4127 } 4128 // match: (Move [3] dst src mem) 4129 // cond: 4130 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4131 for { 4132 if v.AuxInt != 3 { 4133 break 4134 } 4135 _ = v.Args[2] 4136 dst := v.Args[0] 4137 src := v.Args[1] 4138 mem := v.Args[2] 4139 v.reset(OpS390XMOVBstore) 4140 v.AuxInt = 2 4141 v.AddArg(dst) 4142 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4143 v0.AuxInt = 2 4144 v0.AddArg(src) 4145 v0.AddArg(mem) 4146 v.AddArg(v0) 4147 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4148 v1.AddArg(dst) 4149 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4150 v2.AddArg(src) 4151 v2.AddArg(mem) 4152 v1.AddArg(v2) 4153 v1.AddArg(mem) 4154 v.AddArg(v1) 4155 return true 4156 } 4157 // match: (Move [5] dst src mem) 4158 // cond: 4159 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4160 for { 4161 if v.AuxInt != 5 { 4162 break 4163 } 4164 _ = v.Args[2] 4165 dst := v.Args[0] 4166 src := v.Args[1] 4167 mem := v.Args[2] 4168 v.reset(OpS390XMOVBstore) 4169 v.AuxInt = 4 4170 v.AddArg(dst) 4171 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4172 v0.AuxInt = 4 4173 v0.AddArg(src) 4174 v0.AddArg(mem) 4175 v.AddArg(v0) 4176 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4177 v1.AddArg(dst) 4178 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4179 v2.AddArg(src) 4180 v2.AddArg(mem) 4181 v1.AddArg(v2) 4182 v1.AddArg(mem) 4183 v.AddArg(v1) 4184 return true 4185 } 4186 // match: (Move [6] dst src mem) 4187 // cond: 4188 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4189 for { 4190 if v.AuxInt != 6 { 4191 break 4192 } 4193 _ = v.Args[2] 4194 dst := v.Args[0] 4195 src := v.Args[1] 4196 mem := v.Args[2] 4197 v.reset(OpS390XMOVHstore) 4198 v.AuxInt = 4 4199 v.AddArg(dst) 4200 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4201 v0.AuxInt = 4 4202 v0.AddArg(src) 4203 v0.AddArg(mem) 4204 v.AddArg(v0) 4205 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4206 v1.AddArg(dst) 4207 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4208 v2.AddArg(src) 4209 v2.AddArg(mem) 4210 v1.AddArg(v2) 4211 v1.AddArg(mem) 4212 v.AddArg(v1) 4213 return true 4214 } 4215 return false 4216 } 4217 func rewriteValueS390X_OpMove_10(v *Value) bool { 4218 b := v.Block 4219 _ = b 4220 typ := &b.Func.Config.Types 4221 _ = typ 4222 // match: (Move [7] dst src mem) 4223 // cond: 4224 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4225 for { 4226 if v.AuxInt != 7 { 4227 break 4228 } 4229 _ = v.Args[2] 4230 dst := v.Args[0] 4231 src := v.Args[1] 4232 mem := v.Args[2] 4233 v.reset(OpS390XMOVBstore) 4234 v.AuxInt = 6 4235 v.AddArg(dst) 4236 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4237 v0.AuxInt = 6 4238 v0.AddArg(src) 4239 v0.AddArg(mem) 4240 v.AddArg(v0) 4241 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4242 v1.AuxInt = 4 4243 v1.AddArg(dst) 4244 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4245 v2.AuxInt = 4 4246 v2.AddArg(src) 4247 v2.AddArg(mem) 4248 v1.AddArg(v2) 4249 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4250 v3.AddArg(dst) 4251 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4252 v4.AddArg(src) 4253 v4.AddArg(mem) 4254 v3.AddArg(v4) 4255 v3.AddArg(mem) 4256 v1.AddArg(v3) 4257 v.AddArg(v1) 4258 return true 4259 } 4260 // match: (Move [s] dst src mem) 4261 // cond: s > 0 && s <= 256 4262 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4263 for { 4264 s := v.AuxInt 4265 _ = v.Args[2] 4266 dst := v.Args[0] 4267 src := v.Args[1] 4268 mem := v.Args[2] 4269 if !(s > 0 && s <= 256) { 4270 break 4271 } 4272 v.reset(OpS390XMVC) 4273 v.AuxInt = makeValAndOff(s, 0) 4274 v.AddArg(dst) 4275 v.AddArg(src) 4276 v.AddArg(mem) 4277 return true 4278 } 4279 // match: (Move [s] dst src mem) 4280 // cond: s > 256 && s <= 512 4281 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4282 for { 4283 s := v.AuxInt 4284 _ = v.Args[2] 4285 dst := v.Args[0] 4286 src := v.Args[1] 4287 mem := v.Args[2] 4288 if !(s > 256 && s <= 512) { 4289 break 4290 } 4291 v.reset(OpS390XMVC) 4292 v.AuxInt = makeValAndOff(s-256, 256) 4293 v.AddArg(dst) 4294 v.AddArg(src) 4295 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4296 v0.AuxInt = makeValAndOff(256, 0) 4297 v0.AddArg(dst) 4298 v0.AddArg(src) 4299 v0.AddArg(mem) 4300 v.AddArg(v0) 4301 return true 4302 } 4303 // match: (Move [s] dst src mem) 4304 // cond: s > 512 && s <= 768 4305 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4306 for { 4307 s := v.AuxInt 4308 _ = v.Args[2] 4309 dst := v.Args[0] 4310 src := v.Args[1] 4311 mem := v.Args[2] 4312 if !(s > 512 && s <= 768) { 4313 break 4314 } 4315 v.reset(OpS390XMVC) 4316 v.AuxInt = makeValAndOff(s-512, 512) 4317 v.AddArg(dst) 4318 v.AddArg(src) 4319 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4320 v0.AuxInt = makeValAndOff(256, 256) 4321 v0.AddArg(dst) 4322 v0.AddArg(src) 4323 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4324 v1.AuxInt = makeValAndOff(256, 0) 4325 v1.AddArg(dst) 4326 v1.AddArg(src) 4327 v1.AddArg(mem) 4328 v0.AddArg(v1) 4329 v.AddArg(v0) 4330 return true 4331 } 4332 // match: (Move [s] dst src mem) 4333 // cond: s > 768 && s <= 1024 4334 // 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)))) 4335 for { 4336 s := v.AuxInt 4337 _ = v.Args[2] 4338 dst := v.Args[0] 4339 src := v.Args[1] 4340 mem := v.Args[2] 4341 if !(s > 768 && s <= 1024) { 4342 break 4343 } 4344 v.reset(OpS390XMVC) 4345 v.AuxInt = makeValAndOff(s-768, 768) 4346 v.AddArg(dst) 4347 v.AddArg(src) 4348 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4349 v0.AuxInt = makeValAndOff(256, 512) 4350 v0.AddArg(dst) 4351 v0.AddArg(src) 4352 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4353 v1.AuxInt = makeValAndOff(256, 256) 4354 v1.AddArg(dst) 4355 v1.AddArg(src) 4356 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4357 v2.AuxInt = makeValAndOff(256, 0) 4358 v2.AddArg(dst) 4359 v2.AddArg(src) 4360 v2.AddArg(mem) 4361 v1.AddArg(v2) 4362 v0.AddArg(v1) 4363 v.AddArg(v0) 4364 return true 4365 } 4366 // match: (Move [s] dst src mem) 4367 // cond: s > 1024 4368 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4369 for { 4370 s := v.AuxInt 4371 _ = v.Args[2] 4372 dst := v.Args[0] 4373 src := v.Args[1] 4374 mem := v.Args[2] 4375 if !(s > 1024) { 4376 break 4377 } 4378 v.reset(OpS390XLoweredMove) 4379 v.AuxInt = s % 256 4380 v.AddArg(dst) 4381 v.AddArg(src) 4382 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4383 v0.AuxInt = (s / 256) * 256 4384 v0.AddArg(src) 4385 v.AddArg(v0) 4386 v.AddArg(mem) 4387 return true 4388 } 4389 return false 4390 } 4391 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4392 // match: (Mul16 x y) 4393 // cond: 4394 // result: (MULLW x y) 4395 for { 4396 _ = v.Args[1] 4397 x := v.Args[0] 4398 y := v.Args[1] 4399 v.reset(OpS390XMULLW) 4400 v.AddArg(x) 4401 v.AddArg(y) 4402 return true 4403 } 4404 } 4405 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4406 // match: (Mul32 x y) 4407 // cond: 4408 // result: (MULLW x y) 4409 for { 4410 _ = v.Args[1] 4411 x := v.Args[0] 4412 y := v.Args[1] 4413 v.reset(OpS390XMULLW) 4414 v.AddArg(x) 4415 v.AddArg(y) 4416 return true 4417 } 4418 } 4419 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4420 // match: (Mul32F x y) 4421 // cond: 4422 // result: (FMULS x y) 4423 for { 4424 _ = v.Args[1] 4425 x := v.Args[0] 4426 y := v.Args[1] 4427 v.reset(OpS390XFMULS) 4428 v.AddArg(x) 4429 v.AddArg(y) 4430 return true 4431 } 4432 } 4433 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4434 // match: (Mul64 x y) 4435 // cond: 4436 // result: (MULLD x y) 4437 for { 4438 _ = v.Args[1] 4439 x := v.Args[0] 4440 y := v.Args[1] 4441 v.reset(OpS390XMULLD) 4442 v.AddArg(x) 4443 v.AddArg(y) 4444 return true 4445 } 4446 } 4447 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4448 // match: (Mul64F x y) 4449 // cond: 4450 // result: (FMUL x y) 4451 for { 4452 _ = v.Args[1] 4453 x := v.Args[0] 4454 y := v.Args[1] 4455 v.reset(OpS390XFMUL) 4456 v.AddArg(x) 4457 v.AddArg(y) 4458 return true 4459 } 4460 } 4461 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4462 // match: (Mul8 x y) 4463 // cond: 4464 // result: (MULLW x y) 4465 for { 4466 _ = v.Args[1] 4467 x := v.Args[0] 4468 y := v.Args[1] 4469 v.reset(OpS390XMULLW) 4470 v.AddArg(x) 4471 v.AddArg(y) 4472 return true 4473 } 4474 } 4475 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4476 b := v.Block 4477 _ = b 4478 typ := &b.Func.Config.Types 4479 _ = typ 4480 // match: (Neg16 x) 4481 // cond: 4482 // result: (NEGW (MOVHreg x)) 4483 for { 4484 x := v.Args[0] 4485 v.reset(OpS390XNEGW) 4486 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4487 v0.AddArg(x) 4488 v.AddArg(v0) 4489 return true 4490 } 4491 } 4492 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4493 // match: (Neg32 x) 4494 // cond: 4495 // result: (NEGW x) 4496 for { 4497 x := v.Args[0] 4498 v.reset(OpS390XNEGW) 4499 v.AddArg(x) 4500 return true 4501 } 4502 } 4503 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4504 // match: (Neg32F x) 4505 // cond: 4506 // result: (FNEGS x) 4507 for { 4508 x := v.Args[0] 4509 v.reset(OpS390XFNEGS) 4510 v.AddArg(x) 4511 return true 4512 } 4513 } 4514 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4515 // match: (Neg64 x) 4516 // cond: 4517 // result: (NEG x) 4518 for { 4519 x := v.Args[0] 4520 v.reset(OpS390XNEG) 4521 v.AddArg(x) 4522 return true 4523 } 4524 } 4525 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4526 // match: (Neg64F x) 4527 // cond: 4528 // result: (FNEG x) 4529 for { 4530 x := v.Args[0] 4531 v.reset(OpS390XFNEG) 4532 v.AddArg(x) 4533 return true 4534 } 4535 } 4536 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4537 b := v.Block 4538 _ = b 4539 typ := &b.Func.Config.Types 4540 _ = typ 4541 // match: (Neg8 x) 4542 // cond: 4543 // result: (NEGW (MOVBreg x)) 4544 for { 4545 x := v.Args[0] 4546 v.reset(OpS390XNEGW) 4547 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4548 v0.AddArg(x) 4549 v.AddArg(v0) 4550 return true 4551 } 4552 } 4553 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4554 b := v.Block 4555 _ = b 4556 typ := &b.Func.Config.Types 4557 _ = typ 4558 // match: (Neq16 x y) 4559 // cond: 4560 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4561 for { 4562 _ = v.Args[1] 4563 x := v.Args[0] 4564 y := v.Args[1] 4565 v.reset(OpS390XMOVDNE) 4566 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4567 v0.AuxInt = 0 4568 v.AddArg(v0) 4569 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4570 v1.AuxInt = 1 4571 v.AddArg(v1) 4572 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4573 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4574 v3.AddArg(x) 4575 v2.AddArg(v3) 4576 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4577 v4.AddArg(y) 4578 v2.AddArg(v4) 4579 v.AddArg(v2) 4580 return true 4581 } 4582 } 4583 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 4584 b := v.Block 4585 _ = b 4586 typ := &b.Func.Config.Types 4587 _ = typ 4588 // match: (Neq32 x y) 4589 // cond: 4590 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4591 for { 4592 _ = v.Args[1] 4593 x := v.Args[0] 4594 y := v.Args[1] 4595 v.reset(OpS390XMOVDNE) 4596 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4597 v0.AuxInt = 0 4598 v.AddArg(v0) 4599 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4600 v1.AuxInt = 1 4601 v.AddArg(v1) 4602 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4603 v2.AddArg(x) 4604 v2.AddArg(y) 4605 v.AddArg(v2) 4606 return true 4607 } 4608 } 4609 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 4610 b := v.Block 4611 _ = b 4612 typ := &b.Func.Config.Types 4613 _ = typ 4614 // match: (Neq32F x y) 4615 // cond: 4616 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4617 for { 4618 _ = v.Args[1] 4619 x := v.Args[0] 4620 y := v.Args[1] 4621 v.reset(OpS390XMOVDNE) 4622 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4623 v0.AuxInt = 0 4624 v.AddArg(v0) 4625 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4626 v1.AuxInt = 1 4627 v.AddArg(v1) 4628 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 4629 v2.AddArg(x) 4630 v2.AddArg(y) 4631 v.AddArg(v2) 4632 return true 4633 } 4634 } 4635 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 4636 b := v.Block 4637 _ = b 4638 typ := &b.Func.Config.Types 4639 _ = typ 4640 // match: (Neq64 x y) 4641 // cond: 4642 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4643 for { 4644 _ = v.Args[1] 4645 x := v.Args[0] 4646 y := v.Args[1] 4647 v.reset(OpS390XMOVDNE) 4648 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4649 v0.AuxInt = 0 4650 v.AddArg(v0) 4651 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4652 v1.AuxInt = 1 4653 v.AddArg(v1) 4654 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4655 v2.AddArg(x) 4656 v2.AddArg(y) 4657 v.AddArg(v2) 4658 return true 4659 } 4660 } 4661 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 4662 b := v.Block 4663 _ = b 4664 typ := &b.Func.Config.Types 4665 _ = typ 4666 // match: (Neq64F x y) 4667 // cond: 4668 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4669 for { 4670 _ = v.Args[1] 4671 x := v.Args[0] 4672 y := v.Args[1] 4673 v.reset(OpS390XMOVDNE) 4674 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4675 v0.AuxInt = 0 4676 v.AddArg(v0) 4677 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4678 v1.AuxInt = 1 4679 v.AddArg(v1) 4680 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 4681 v2.AddArg(x) 4682 v2.AddArg(y) 4683 v.AddArg(v2) 4684 return true 4685 } 4686 } 4687 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 4688 b := v.Block 4689 _ = b 4690 typ := &b.Func.Config.Types 4691 _ = typ 4692 // match: (Neq8 x y) 4693 // cond: 4694 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4695 for { 4696 _ = v.Args[1] 4697 x := v.Args[0] 4698 y := v.Args[1] 4699 v.reset(OpS390XMOVDNE) 4700 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4701 v0.AuxInt = 0 4702 v.AddArg(v0) 4703 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4704 v1.AuxInt = 1 4705 v.AddArg(v1) 4706 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4707 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4708 v3.AddArg(x) 4709 v2.AddArg(v3) 4710 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4711 v4.AddArg(y) 4712 v2.AddArg(v4) 4713 v.AddArg(v2) 4714 return true 4715 } 4716 } 4717 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 4718 b := v.Block 4719 _ = b 4720 typ := &b.Func.Config.Types 4721 _ = typ 4722 // match: (NeqB x y) 4723 // cond: 4724 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4725 for { 4726 _ = v.Args[1] 4727 x := v.Args[0] 4728 y := v.Args[1] 4729 v.reset(OpS390XMOVDNE) 4730 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4731 v0.AuxInt = 0 4732 v.AddArg(v0) 4733 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4734 v1.AuxInt = 1 4735 v.AddArg(v1) 4736 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4737 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4738 v3.AddArg(x) 4739 v2.AddArg(v3) 4740 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4741 v4.AddArg(y) 4742 v2.AddArg(v4) 4743 v.AddArg(v2) 4744 return true 4745 } 4746 } 4747 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 4748 b := v.Block 4749 _ = b 4750 typ := &b.Func.Config.Types 4751 _ = typ 4752 // match: (NeqPtr x y) 4753 // cond: 4754 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4755 for { 4756 _ = v.Args[1] 4757 x := v.Args[0] 4758 y := v.Args[1] 4759 v.reset(OpS390XMOVDNE) 4760 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4761 v0.AuxInt = 0 4762 v.AddArg(v0) 4763 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4764 v1.AuxInt = 1 4765 v.AddArg(v1) 4766 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4767 v2.AddArg(x) 4768 v2.AddArg(y) 4769 v.AddArg(v2) 4770 return true 4771 } 4772 } 4773 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 4774 // match: (NilCheck ptr mem) 4775 // cond: 4776 // result: (LoweredNilCheck ptr mem) 4777 for { 4778 _ = v.Args[1] 4779 ptr := v.Args[0] 4780 mem := v.Args[1] 4781 v.reset(OpS390XLoweredNilCheck) 4782 v.AddArg(ptr) 4783 v.AddArg(mem) 4784 return true 4785 } 4786 } 4787 func rewriteValueS390X_OpNot_0(v *Value) bool { 4788 // match: (Not x) 4789 // cond: 4790 // result: (XORWconst [1] x) 4791 for { 4792 x := v.Args[0] 4793 v.reset(OpS390XXORWconst) 4794 v.AuxInt = 1 4795 v.AddArg(x) 4796 return true 4797 } 4798 } 4799 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 4800 b := v.Block 4801 _ = b 4802 typ := &b.Func.Config.Types 4803 _ = typ 4804 // match: (OffPtr [off] ptr:(SP)) 4805 // cond: 4806 // result: (MOVDaddr [off] ptr) 4807 for { 4808 off := v.AuxInt 4809 ptr := v.Args[0] 4810 if ptr.Op != OpSP { 4811 break 4812 } 4813 v.reset(OpS390XMOVDaddr) 4814 v.AuxInt = off 4815 v.AddArg(ptr) 4816 return true 4817 } 4818 // match: (OffPtr [off] ptr) 4819 // cond: is32Bit(off) 4820 // result: (ADDconst [off] ptr) 4821 for { 4822 off := v.AuxInt 4823 ptr := v.Args[0] 4824 if !(is32Bit(off)) { 4825 break 4826 } 4827 v.reset(OpS390XADDconst) 4828 v.AuxInt = off 4829 v.AddArg(ptr) 4830 return true 4831 } 4832 // match: (OffPtr [off] ptr) 4833 // cond: 4834 // result: (ADD (MOVDconst [off]) ptr) 4835 for { 4836 off := v.AuxInt 4837 ptr := v.Args[0] 4838 v.reset(OpS390XADD) 4839 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4840 v0.AuxInt = off 4841 v.AddArg(v0) 4842 v.AddArg(ptr) 4843 return true 4844 } 4845 } 4846 func rewriteValueS390X_OpOr16_0(v *Value) bool { 4847 // match: (Or16 x y) 4848 // cond: 4849 // result: (ORW x y) 4850 for { 4851 _ = v.Args[1] 4852 x := v.Args[0] 4853 y := v.Args[1] 4854 v.reset(OpS390XORW) 4855 v.AddArg(x) 4856 v.AddArg(y) 4857 return true 4858 } 4859 } 4860 func rewriteValueS390X_OpOr32_0(v *Value) bool { 4861 // match: (Or32 x y) 4862 // cond: 4863 // result: (ORW x y) 4864 for { 4865 _ = v.Args[1] 4866 x := v.Args[0] 4867 y := v.Args[1] 4868 v.reset(OpS390XORW) 4869 v.AddArg(x) 4870 v.AddArg(y) 4871 return true 4872 } 4873 } 4874 func rewriteValueS390X_OpOr64_0(v *Value) bool { 4875 // match: (Or64 x y) 4876 // cond: 4877 // result: (OR x y) 4878 for { 4879 _ = v.Args[1] 4880 x := v.Args[0] 4881 y := v.Args[1] 4882 v.reset(OpS390XOR) 4883 v.AddArg(x) 4884 v.AddArg(y) 4885 return true 4886 } 4887 } 4888 func rewriteValueS390X_OpOr8_0(v *Value) bool { 4889 // match: (Or8 x y) 4890 // cond: 4891 // result: (ORW x y) 4892 for { 4893 _ = v.Args[1] 4894 x := v.Args[0] 4895 y := v.Args[1] 4896 v.reset(OpS390XORW) 4897 v.AddArg(x) 4898 v.AddArg(y) 4899 return true 4900 } 4901 } 4902 func rewriteValueS390X_OpOrB_0(v *Value) bool { 4903 // match: (OrB x y) 4904 // cond: 4905 // result: (ORW x y) 4906 for { 4907 _ = v.Args[1] 4908 x := v.Args[0] 4909 y := v.Args[1] 4910 v.reset(OpS390XORW) 4911 v.AddArg(x) 4912 v.AddArg(y) 4913 return true 4914 } 4915 } 4916 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 4917 // match: (Round32F x) 4918 // cond: 4919 // result: (LoweredRound32F x) 4920 for { 4921 x := v.Args[0] 4922 v.reset(OpS390XLoweredRound32F) 4923 v.AddArg(x) 4924 return true 4925 } 4926 } 4927 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 4928 // match: (Round64F x) 4929 // cond: 4930 // result: (LoweredRound64F x) 4931 for { 4932 x := v.Args[0] 4933 v.reset(OpS390XLoweredRound64F) 4934 v.AddArg(x) 4935 return true 4936 } 4937 } 4938 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 4939 b := v.Block 4940 _ = b 4941 typ := &b.Func.Config.Types 4942 _ = typ 4943 // match: (Rsh16Ux16 <t> x y) 4944 // cond: 4945 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 4946 for { 4947 t := v.Type 4948 _ = v.Args[1] 4949 x := v.Args[0] 4950 y := v.Args[1] 4951 v.reset(OpS390XANDW) 4952 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4953 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4954 v1.AddArg(x) 4955 v0.AddArg(v1) 4956 v0.AddArg(y) 4957 v.AddArg(v0) 4958 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4959 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4960 v3.AuxInt = 15 4961 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4962 v4.AddArg(y) 4963 v3.AddArg(v4) 4964 v2.AddArg(v3) 4965 v.AddArg(v2) 4966 return true 4967 } 4968 } 4969 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 4970 b := v.Block 4971 _ = b 4972 typ := &b.Func.Config.Types 4973 _ = typ 4974 // match: (Rsh16Ux32 <t> x y) 4975 // cond: 4976 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 4977 for { 4978 t := v.Type 4979 _ = v.Args[1] 4980 x := v.Args[0] 4981 y := v.Args[1] 4982 v.reset(OpS390XANDW) 4983 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4984 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4985 v1.AddArg(x) 4986 v0.AddArg(v1) 4987 v0.AddArg(y) 4988 v.AddArg(v0) 4989 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4990 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4991 v3.AuxInt = 15 4992 v3.AddArg(y) 4993 v2.AddArg(v3) 4994 v.AddArg(v2) 4995 return true 4996 } 4997 } 4998 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 4999 b := v.Block 5000 _ = b 5001 typ := &b.Func.Config.Types 5002 _ = typ 5003 // match: (Rsh16Ux64 <t> x y) 5004 // cond: 5005 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 5006 for { 5007 t := v.Type 5008 _ = v.Args[1] 5009 x := v.Args[0] 5010 y := v.Args[1] 5011 v.reset(OpS390XANDW) 5012 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5013 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5014 v1.AddArg(x) 5015 v0.AddArg(v1) 5016 v0.AddArg(y) 5017 v.AddArg(v0) 5018 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5019 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5020 v3.AuxInt = 15 5021 v3.AddArg(y) 5022 v2.AddArg(v3) 5023 v.AddArg(v2) 5024 return true 5025 } 5026 } 5027 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5028 b := v.Block 5029 _ = b 5030 typ := &b.Func.Config.Types 5031 _ = typ 5032 // match: (Rsh16Ux8 <t> x y) 5033 // cond: 5034 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 5035 for { 5036 t := v.Type 5037 _ = v.Args[1] 5038 x := v.Args[0] 5039 y := v.Args[1] 5040 v.reset(OpS390XANDW) 5041 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5042 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5043 v1.AddArg(x) 5044 v0.AddArg(v1) 5045 v0.AddArg(y) 5046 v.AddArg(v0) 5047 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5048 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5049 v3.AuxInt = 15 5050 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5051 v4.AddArg(y) 5052 v3.AddArg(v4) 5053 v2.AddArg(v3) 5054 v.AddArg(v2) 5055 return true 5056 } 5057 } 5058 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5059 b := v.Block 5060 _ = b 5061 typ := &b.Func.Config.Types 5062 _ = typ 5063 // match: (Rsh16x16 <t> x y) 5064 // cond: 5065 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 5066 for { 5067 t := v.Type 5068 _ = v.Args[1] 5069 x := v.Args[0] 5070 y := v.Args[1] 5071 v.reset(OpS390XSRAW) 5072 v.Type = t 5073 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5074 v0.AddArg(x) 5075 v.AddArg(v0) 5076 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5077 v1.AddArg(y) 5078 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5079 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5080 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5081 v4.AuxInt = 15 5082 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5083 v5.AddArg(y) 5084 v4.AddArg(v5) 5085 v3.AddArg(v4) 5086 v2.AddArg(v3) 5087 v1.AddArg(v2) 5088 v.AddArg(v1) 5089 return true 5090 } 5091 } 5092 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5093 b := v.Block 5094 _ = b 5095 typ := &b.Func.Config.Types 5096 _ = typ 5097 // match: (Rsh16x32 <t> x y) 5098 // cond: 5099 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 5100 for { 5101 t := v.Type 5102 _ = v.Args[1] 5103 x := v.Args[0] 5104 y := v.Args[1] 5105 v.reset(OpS390XSRAW) 5106 v.Type = t 5107 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5108 v0.AddArg(x) 5109 v.AddArg(v0) 5110 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5111 v1.AddArg(y) 5112 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5113 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5114 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5115 v4.AuxInt = 15 5116 v4.AddArg(y) 5117 v3.AddArg(v4) 5118 v2.AddArg(v3) 5119 v1.AddArg(v2) 5120 v.AddArg(v1) 5121 return true 5122 } 5123 } 5124 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5125 b := v.Block 5126 _ = b 5127 typ := &b.Func.Config.Types 5128 _ = typ 5129 // match: (Rsh16x64 <t> x y) 5130 // cond: 5131 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 5132 for { 5133 t := v.Type 5134 _ = v.Args[1] 5135 x := v.Args[0] 5136 y := v.Args[1] 5137 v.reset(OpS390XSRAW) 5138 v.Type = t 5139 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5140 v0.AddArg(x) 5141 v.AddArg(v0) 5142 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5143 v1.AddArg(y) 5144 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5145 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5146 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5147 v4.AuxInt = 15 5148 v4.AddArg(y) 5149 v3.AddArg(v4) 5150 v2.AddArg(v3) 5151 v1.AddArg(v2) 5152 v.AddArg(v1) 5153 return true 5154 } 5155 } 5156 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5157 b := v.Block 5158 _ = b 5159 typ := &b.Func.Config.Types 5160 _ = typ 5161 // match: (Rsh16x8 <t> x y) 5162 // cond: 5163 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 5164 for { 5165 t := v.Type 5166 _ = v.Args[1] 5167 x := v.Args[0] 5168 y := v.Args[1] 5169 v.reset(OpS390XSRAW) 5170 v.Type = t 5171 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5172 v0.AddArg(x) 5173 v.AddArg(v0) 5174 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5175 v1.AddArg(y) 5176 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5177 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5178 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5179 v4.AuxInt = 15 5180 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5181 v5.AddArg(y) 5182 v4.AddArg(v5) 5183 v3.AddArg(v4) 5184 v2.AddArg(v3) 5185 v1.AddArg(v2) 5186 v.AddArg(v1) 5187 return true 5188 } 5189 } 5190 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5191 b := v.Block 5192 _ = b 5193 typ := &b.Func.Config.Types 5194 _ = typ 5195 // match: (Rsh32Ux16 <t> x y) 5196 // cond: 5197 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5198 for { 5199 t := v.Type 5200 _ = v.Args[1] 5201 x := v.Args[0] 5202 y := v.Args[1] 5203 v.reset(OpS390XANDW) 5204 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5205 v0.AddArg(x) 5206 v0.AddArg(y) 5207 v.AddArg(v0) 5208 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5209 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5210 v2.AuxInt = 31 5211 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5212 v3.AddArg(y) 5213 v2.AddArg(v3) 5214 v1.AddArg(v2) 5215 v.AddArg(v1) 5216 return true 5217 } 5218 } 5219 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5220 b := v.Block 5221 _ = b 5222 // match: (Rsh32Ux32 <t> x y) 5223 // cond: 5224 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5225 for { 5226 t := v.Type 5227 _ = v.Args[1] 5228 x := v.Args[0] 5229 y := v.Args[1] 5230 v.reset(OpS390XANDW) 5231 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5232 v0.AddArg(x) 5233 v0.AddArg(y) 5234 v.AddArg(v0) 5235 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5236 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5237 v2.AuxInt = 31 5238 v2.AddArg(y) 5239 v1.AddArg(v2) 5240 v.AddArg(v1) 5241 return true 5242 } 5243 } 5244 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5245 b := v.Block 5246 _ = b 5247 // match: (Rsh32Ux64 <t> x y) 5248 // cond: 5249 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5250 for { 5251 t := v.Type 5252 _ = v.Args[1] 5253 x := v.Args[0] 5254 y := v.Args[1] 5255 v.reset(OpS390XANDW) 5256 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5257 v0.AddArg(x) 5258 v0.AddArg(y) 5259 v.AddArg(v0) 5260 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5261 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5262 v2.AuxInt = 31 5263 v2.AddArg(y) 5264 v1.AddArg(v2) 5265 v.AddArg(v1) 5266 return true 5267 } 5268 } 5269 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 5270 b := v.Block 5271 _ = b 5272 typ := &b.Func.Config.Types 5273 _ = typ 5274 // match: (Rsh32Ux8 <t> x y) 5275 // cond: 5276 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5277 for { 5278 t := v.Type 5279 _ = v.Args[1] 5280 x := v.Args[0] 5281 y := v.Args[1] 5282 v.reset(OpS390XANDW) 5283 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5284 v0.AddArg(x) 5285 v0.AddArg(y) 5286 v.AddArg(v0) 5287 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5288 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5289 v2.AuxInt = 31 5290 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5291 v3.AddArg(y) 5292 v2.AddArg(v3) 5293 v1.AddArg(v2) 5294 v.AddArg(v1) 5295 return true 5296 } 5297 } 5298 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 5299 b := v.Block 5300 _ = b 5301 typ := &b.Func.Config.Types 5302 _ = typ 5303 // match: (Rsh32x16 <t> x y) 5304 // cond: 5305 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5306 for { 5307 t := v.Type 5308 _ = v.Args[1] 5309 x := v.Args[0] 5310 y := v.Args[1] 5311 v.reset(OpS390XSRAW) 5312 v.Type = t 5313 v.AddArg(x) 5314 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5315 v0.AddArg(y) 5316 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5317 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5318 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5319 v3.AuxInt = 31 5320 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5321 v4.AddArg(y) 5322 v3.AddArg(v4) 5323 v2.AddArg(v3) 5324 v1.AddArg(v2) 5325 v0.AddArg(v1) 5326 v.AddArg(v0) 5327 return true 5328 } 5329 } 5330 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 5331 b := v.Block 5332 _ = b 5333 // match: (Rsh32x32 <t> x y) 5334 // cond: 5335 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5336 for { 5337 t := v.Type 5338 _ = v.Args[1] 5339 x := v.Args[0] 5340 y := v.Args[1] 5341 v.reset(OpS390XSRAW) 5342 v.Type = t 5343 v.AddArg(x) 5344 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5345 v0.AddArg(y) 5346 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5347 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5348 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5349 v3.AuxInt = 31 5350 v3.AddArg(y) 5351 v2.AddArg(v3) 5352 v1.AddArg(v2) 5353 v0.AddArg(v1) 5354 v.AddArg(v0) 5355 return true 5356 } 5357 } 5358 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 5359 b := v.Block 5360 _ = b 5361 // match: (Rsh32x64 <t> x y) 5362 // cond: 5363 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5364 for { 5365 t := v.Type 5366 _ = v.Args[1] 5367 x := v.Args[0] 5368 y := v.Args[1] 5369 v.reset(OpS390XSRAW) 5370 v.Type = t 5371 v.AddArg(x) 5372 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5373 v0.AddArg(y) 5374 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5375 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5376 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5377 v3.AuxInt = 31 5378 v3.AddArg(y) 5379 v2.AddArg(v3) 5380 v1.AddArg(v2) 5381 v0.AddArg(v1) 5382 v.AddArg(v0) 5383 return true 5384 } 5385 } 5386 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 5387 b := v.Block 5388 _ = b 5389 typ := &b.Func.Config.Types 5390 _ = typ 5391 // match: (Rsh32x8 <t> x y) 5392 // cond: 5393 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5394 for { 5395 t := v.Type 5396 _ = v.Args[1] 5397 x := v.Args[0] 5398 y := v.Args[1] 5399 v.reset(OpS390XSRAW) 5400 v.Type = t 5401 v.AddArg(x) 5402 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5403 v0.AddArg(y) 5404 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5405 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5406 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5407 v3.AuxInt = 31 5408 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5409 v4.AddArg(y) 5410 v3.AddArg(v4) 5411 v2.AddArg(v3) 5412 v1.AddArg(v2) 5413 v0.AddArg(v1) 5414 v.AddArg(v0) 5415 return true 5416 } 5417 } 5418 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 5419 b := v.Block 5420 _ = b 5421 typ := &b.Func.Config.Types 5422 _ = typ 5423 // match: (Rsh64Ux16 <t> x y) 5424 // cond: 5425 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5426 for { 5427 t := v.Type 5428 _ = v.Args[1] 5429 x := v.Args[0] 5430 y := v.Args[1] 5431 v.reset(OpS390XAND) 5432 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5433 v0.AddArg(x) 5434 v0.AddArg(y) 5435 v.AddArg(v0) 5436 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5437 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5438 v2.AuxInt = 63 5439 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5440 v3.AddArg(y) 5441 v2.AddArg(v3) 5442 v1.AddArg(v2) 5443 v.AddArg(v1) 5444 return true 5445 } 5446 } 5447 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 5448 b := v.Block 5449 _ = b 5450 // match: (Rsh64Ux32 <t> x y) 5451 // cond: 5452 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5453 for { 5454 t := v.Type 5455 _ = v.Args[1] 5456 x := v.Args[0] 5457 y := v.Args[1] 5458 v.reset(OpS390XAND) 5459 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5460 v0.AddArg(x) 5461 v0.AddArg(y) 5462 v.AddArg(v0) 5463 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5464 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5465 v2.AuxInt = 63 5466 v2.AddArg(y) 5467 v1.AddArg(v2) 5468 v.AddArg(v1) 5469 return true 5470 } 5471 } 5472 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 5473 b := v.Block 5474 _ = b 5475 // match: (Rsh64Ux64 <t> x y) 5476 // cond: 5477 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5478 for { 5479 t := v.Type 5480 _ = v.Args[1] 5481 x := v.Args[0] 5482 y := v.Args[1] 5483 v.reset(OpS390XAND) 5484 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5485 v0.AddArg(x) 5486 v0.AddArg(y) 5487 v.AddArg(v0) 5488 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5489 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5490 v2.AuxInt = 63 5491 v2.AddArg(y) 5492 v1.AddArg(v2) 5493 v.AddArg(v1) 5494 return true 5495 } 5496 } 5497 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 5498 b := v.Block 5499 _ = b 5500 typ := &b.Func.Config.Types 5501 _ = typ 5502 // match: (Rsh64Ux8 <t> x y) 5503 // cond: 5504 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5505 for { 5506 t := v.Type 5507 _ = v.Args[1] 5508 x := v.Args[0] 5509 y := v.Args[1] 5510 v.reset(OpS390XAND) 5511 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5512 v0.AddArg(x) 5513 v0.AddArg(y) 5514 v.AddArg(v0) 5515 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5516 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5517 v2.AuxInt = 63 5518 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5519 v3.AddArg(y) 5520 v2.AddArg(v3) 5521 v1.AddArg(v2) 5522 v.AddArg(v1) 5523 return true 5524 } 5525 } 5526 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 5527 b := v.Block 5528 _ = b 5529 typ := &b.Func.Config.Types 5530 _ = typ 5531 // match: (Rsh64x16 <t> x y) 5532 // cond: 5533 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5534 for { 5535 t := v.Type 5536 _ = v.Args[1] 5537 x := v.Args[0] 5538 y := v.Args[1] 5539 v.reset(OpS390XSRAD) 5540 v.Type = t 5541 v.AddArg(x) 5542 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5543 v0.AddArg(y) 5544 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5545 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5546 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5547 v3.AuxInt = 63 5548 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5549 v4.AddArg(y) 5550 v3.AddArg(v4) 5551 v2.AddArg(v3) 5552 v1.AddArg(v2) 5553 v0.AddArg(v1) 5554 v.AddArg(v0) 5555 return true 5556 } 5557 } 5558 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 5559 b := v.Block 5560 _ = b 5561 // match: (Rsh64x32 <t> x y) 5562 // cond: 5563 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5564 for { 5565 t := v.Type 5566 _ = v.Args[1] 5567 x := v.Args[0] 5568 y := v.Args[1] 5569 v.reset(OpS390XSRAD) 5570 v.Type = t 5571 v.AddArg(x) 5572 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5573 v0.AddArg(y) 5574 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5575 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5576 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5577 v3.AuxInt = 63 5578 v3.AddArg(y) 5579 v2.AddArg(v3) 5580 v1.AddArg(v2) 5581 v0.AddArg(v1) 5582 v.AddArg(v0) 5583 return true 5584 } 5585 } 5586 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 5587 b := v.Block 5588 _ = b 5589 // match: (Rsh64x64 <t> x y) 5590 // cond: 5591 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5592 for { 5593 t := v.Type 5594 _ = v.Args[1] 5595 x := v.Args[0] 5596 y := v.Args[1] 5597 v.reset(OpS390XSRAD) 5598 v.Type = t 5599 v.AddArg(x) 5600 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5601 v0.AddArg(y) 5602 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5603 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5604 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5605 v3.AuxInt = 63 5606 v3.AddArg(y) 5607 v2.AddArg(v3) 5608 v1.AddArg(v2) 5609 v0.AddArg(v1) 5610 v.AddArg(v0) 5611 return true 5612 } 5613 } 5614 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 5615 b := v.Block 5616 _ = b 5617 typ := &b.Func.Config.Types 5618 _ = typ 5619 // match: (Rsh64x8 <t> x y) 5620 // cond: 5621 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5622 for { 5623 t := v.Type 5624 _ = v.Args[1] 5625 x := v.Args[0] 5626 y := v.Args[1] 5627 v.reset(OpS390XSRAD) 5628 v.Type = t 5629 v.AddArg(x) 5630 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5631 v0.AddArg(y) 5632 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5633 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5634 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5635 v3.AuxInt = 63 5636 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5637 v4.AddArg(y) 5638 v3.AddArg(v4) 5639 v2.AddArg(v3) 5640 v1.AddArg(v2) 5641 v0.AddArg(v1) 5642 v.AddArg(v0) 5643 return true 5644 } 5645 } 5646 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 5647 b := v.Block 5648 _ = b 5649 typ := &b.Func.Config.Types 5650 _ = typ 5651 // match: (Rsh8Ux16 <t> x y) 5652 // cond: 5653 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5654 for { 5655 t := v.Type 5656 _ = v.Args[1] 5657 x := v.Args[0] 5658 y := v.Args[1] 5659 v.reset(OpS390XANDW) 5660 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5661 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5662 v1.AddArg(x) 5663 v0.AddArg(v1) 5664 v0.AddArg(y) 5665 v.AddArg(v0) 5666 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5667 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5668 v3.AuxInt = 7 5669 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5670 v4.AddArg(y) 5671 v3.AddArg(v4) 5672 v2.AddArg(v3) 5673 v.AddArg(v2) 5674 return true 5675 } 5676 } 5677 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 5678 b := v.Block 5679 _ = b 5680 typ := &b.Func.Config.Types 5681 _ = typ 5682 // match: (Rsh8Ux32 <t> x y) 5683 // cond: 5684 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5685 for { 5686 t := v.Type 5687 _ = v.Args[1] 5688 x := v.Args[0] 5689 y := v.Args[1] 5690 v.reset(OpS390XANDW) 5691 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5692 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5693 v1.AddArg(x) 5694 v0.AddArg(v1) 5695 v0.AddArg(y) 5696 v.AddArg(v0) 5697 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5698 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5699 v3.AuxInt = 7 5700 v3.AddArg(y) 5701 v2.AddArg(v3) 5702 v.AddArg(v2) 5703 return true 5704 } 5705 } 5706 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 5707 b := v.Block 5708 _ = b 5709 typ := &b.Func.Config.Types 5710 _ = typ 5711 // match: (Rsh8Ux64 <t> x y) 5712 // cond: 5713 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5714 for { 5715 t := v.Type 5716 _ = v.Args[1] 5717 x := v.Args[0] 5718 y := v.Args[1] 5719 v.reset(OpS390XANDW) 5720 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5721 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5722 v1.AddArg(x) 5723 v0.AddArg(v1) 5724 v0.AddArg(y) 5725 v.AddArg(v0) 5726 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5727 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5728 v3.AuxInt = 7 5729 v3.AddArg(y) 5730 v2.AddArg(v3) 5731 v.AddArg(v2) 5732 return true 5733 } 5734 } 5735 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 5736 b := v.Block 5737 _ = b 5738 typ := &b.Func.Config.Types 5739 _ = typ 5740 // match: (Rsh8Ux8 <t> x y) 5741 // cond: 5742 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5743 for { 5744 t := v.Type 5745 _ = v.Args[1] 5746 x := v.Args[0] 5747 y := v.Args[1] 5748 v.reset(OpS390XANDW) 5749 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5750 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5751 v1.AddArg(x) 5752 v0.AddArg(v1) 5753 v0.AddArg(y) 5754 v.AddArg(v0) 5755 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5756 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5757 v3.AuxInt = 7 5758 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5759 v4.AddArg(y) 5760 v3.AddArg(v4) 5761 v2.AddArg(v3) 5762 v.AddArg(v2) 5763 return true 5764 } 5765 } 5766 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 5767 b := v.Block 5768 _ = b 5769 typ := &b.Func.Config.Types 5770 _ = typ 5771 // match: (Rsh8x16 <t> x y) 5772 // cond: 5773 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5774 for { 5775 t := v.Type 5776 _ = v.Args[1] 5777 x := v.Args[0] 5778 y := v.Args[1] 5779 v.reset(OpS390XSRAW) 5780 v.Type = t 5781 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5782 v0.AddArg(x) 5783 v.AddArg(v0) 5784 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5785 v1.AddArg(y) 5786 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5787 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5788 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5789 v4.AuxInt = 7 5790 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5791 v5.AddArg(y) 5792 v4.AddArg(v5) 5793 v3.AddArg(v4) 5794 v2.AddArg(v3) 5795 v1.AddArg(v2) 5796 v.AddArg(v1) 5797 return true 5798 } 5799 } 5800 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 5801 b := v.Block 5802 _ = b 5803 typ := &b.Func.Config.Types 5804 _ = typ 5805 // match: (Rsh8x32 <t> x y) 5806 // cond: 5807 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5808 for { 5809 t := v.Type 5810 _ = v.Args[1] 5811 x := v.Args[0] 5812 y := v.Args[1] 5813 v.reset(OpS390XSRAW) 5814 v.Type = t 5815 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5816 v0.AddArg(x) 5817 v.AddArg(v0) 5818 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5819 v1.AddArg(y) 5820 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5821 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5822 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5823 v4.AuxInt = 7 5824 v4.AddArg(y) 5825 v3.AddArg(v4) 5826 v2.AddArg(v3) 5827 v1.AddArg(v2) 5828 v.AddArg(v1) 5829 return true 5830 } 5831 } 5832 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 5833 b := v.Block 5834 _ = b 5835 typ := &b.Func.Config.Types 5836 _ = typ 5837 // match: (Rsh8x64 <t> x y) 5838 // cond: 5839 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5840 for { 5841 t := v.Type 5842 _ = v.Args[1] 5843 x := v.Args[0] 5844 y := v.Args[1] 5845 v.reset(OpS390XSRAW) 5846 v.Type = t 5847 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5848 v0.AddArg(x) 5849 v.AddArg(v0) 5850 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5851 v1.AddArg(y) 5852 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5853 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5854 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5855 v4.AuxInt = 7 5856 v4.AddArg(y) 5857 v3.AddArg(v4) 5858 v2.AddArg(v3) 5859 v1.AddArg(v2) 5860 v.AddArg(v1) 5861 return true 5862 } 5863 } 5864 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 5865 b := v.Block 5866 _ = b 5867 typ := &b.Func.Config.Types 5868 _ = typ 5869 // match: (Rsh8x8 <t> x y) 5870 // cond: 5871 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5872 for { 5873 t := v.Type 5874 _ = v.Args[1] 5875 x := v.Args[0] 5876 y := v.Args[1] 5877 v.reset(OpS390XSRAW) 5878 v.Type = t 5879 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5880 v0.AddArg(x) 5881 v.AddArg(v0) 5882 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5883 v1.AddArg(y) 5884 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5885 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5886 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5887 v4.AuxInt = 7 5888 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5889 v5.AddArg(y) 5890 v4.AddArg(v5) 5891 v3.AddArg(v4) 5892 v2.AddArg(v3) 5893 v1.AddArg(v2) 5894 v.AddArg(v1) 5895 return true 5896 } 5897 } 5898 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 5899 // match: (ADD x (MOVDconst [c])) 5900 // cond: is32Bit(c) 5901 // result: (ADDconst [c] x) 5902 for { 5903 _ = v.Args[1] 5904 x := v.Args[0] 5905 v_1 := v.Args[1] 5906 if v_1.Op != OpS390XMOVDconst { 5907 break 5908 } 5909 c := v_1.AuxInt 5910 if !(is32Bit(c)) { 5911 break 5912 } 5913 v.reset(OpS390XADDconst) 5914 v.AuxInt = c 5915 v.AddArg(x) 5916 return true 5917 } 5918 // match: (ADD (MOVDconst [c]) x) 5919 // cond: is32Bit(c) 5920 // result: (ADDconst [c] x) 5921 for { 5922 _ = v.Args[1] 5923 v_0 := v.Args[0] 5924 if v_0.Op != OpS390XMOVDconst { 5925 break 5926 } 5927 c := v_0.AuxInt 5928 x := v.Args[1] 5929 if !(is32Bit(c)) { 5930 break 5931 } 5932 v.reset(OpS390XADDconst) 5933 v.AuxInt = c 5934 v.AddArg(x) 5935 return true 5936 } 5937 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 5938 // cond: d == 64-c 5939 // result: (RLLGconst [c] x) 5940 for { 5941 _ = v.Args[1] 5942 v_0 := v.Args[0] 5943 if v_0.Op != OpS390XSLDconst { 5944 break 5945 } 5946 c := v_0.AuxInt 5947 x := v_0.Args[0] 5948 v_1 := v.Args[1] 5949 if v_1.Op != OpS390XSRDconst { 5950 break 5951 } 5952 d := v_1.AuxInt 5953 if x != v_1.Args[0] { 5954 break 5955 } 5956 if !(d == 64-c) { 5957 break 5958 } 5959 v.reset(OpS390XRLLGconst) 5960 v.AuxInt = c 5961 v.AddArg(x) 5962 return true 5963 } 5964 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 5965 // cond: d == 64-c 5966 // result: (RLLGconst [c] x) 5967 for { 5968 _ = v.Args[1] 5969 v_0 := v.Args[0] 5970 if v_0.Op != OpS390XSRDconst { 5971 break 5972 } 5973 d := v_0.AuxInt 5974 x := v_0.Args[0] 5975 v_1 := v.Args[1] 5976 if v_1.Op != OpS390XSLDconst { 5977 break 5978 } 5979 c := v_1.AuxInt 5980 if x != v_1.Args[0] { 5981 break 5982 } 5983 if !(d == 64-c) { 5984 break 5985 } 5986 v.reset(OpS390XRLLGconst) 5987 v.AuxInt = c 5988 v.AddArg(x) 5989 return true 5990 } 5991 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 5992 // cond: ptr.Op != OpSB && idx.Op != OpSB 5993 // result: (MOVDaddridx [c] {s} ptr idx) 5994 for { 5995 _ = v.Args[1] 5996 idx := v.Args[0] 5997 v_1 := v.Args[1] 5998 if v_1.Op != OpS390XMOVDaddr { 5999 break 6000 } 6001 c := v_1.AuxInt 6002 s := v_1.Aux 6003 ptr := v_1.Args[0] 6004 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6005 break 6006 } 6007 v.reset(OpS390XMOVDaddridx) 6008 v.AuxInt = c 6009 v.Aux = s 6010 v.AddArg(ptr) 6011 v.AddArg(idx) 6012 return true 6013 } 6014 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 6015 // cond: ptr.Op != OpSB && idx.Op != OpSB 6016 // result: (MOVDaddridx [c] {s} ptr idx) 6017 for { 6018 _ = v.Args[1] 6019 v_0 := v.Args[0] 6020 if v_0.Op != OpS390XMOVDaddr { 6021 break 6022 } 6023 c := v_0.AuxInt 6024 s := v_0.Aux 6025 ptr := v_0.Args[0] 6026 idx := v.Args[1] 6027 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6028 break 6029 } 6030 v.reset(OpS390XMOVDaddridx) 6031 v.AuxInt = c 6032 v.Aux = s 6033 v.AddArg(ptr) 6034 v.AddArg(idx) 6035 return true 6036 } 6037 // match: (ADD x (NEG y)) 6038 // cond: 6039 // result: (SUB x y) 6040 for { 6041 _ = v.Args[1] 6042 x := v.Args[0] 6043 v_1 := v.Args[1] 6044 if v_1.Op != OpS390XNEG { 6045 break 6046 } 6047 y := v_1.Args[0] 6048 v.reset(OpS390XSUB) 6049 v.AddArg(x) 6050 v.AddArg(y) 6051 return true 6052 } 6053 // match: (ADD (NEG y) x) 6054 // cond: 6055 // result: (SUB x y) 6056 for { 6057 _ = v.Args[1] 6058 v_0 := v.Args[0] 6059 if v_0.Op != OpS390XNEG { 6060 break 6061 } 6062 y := v_0.Args[0] 6063 x := v.Args[1] 6064 v.reset(OpS390XSUB) 6065 v.AddArg(x) 6066 v.AddArg(y) 6067 return true 6068 } 6069 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6070 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6071 // result: (ADDload <t> [off] {sym} x ptr mem) 6072 for { 6073 t := v.Type 6074 _ = v.Args[1] 6075 x := v.Args[0] 6076 g := v.Args[1] 6077 if g.Op != OpS390XMOVDload { 6078 break 6079 } 6080 off := g.AuxInt 6081 sym := g.Aux 6082 _ = g.Args[1] 6083 ptr := g.Args[0] 6084 mem := g.Args[1] 6085 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6086 break 6087 } 6088 v.reset(OpS390XADDload) 6089 v.Type = t 6090 v.AuxInt = off 6091 v.Aux = sym 6092 v.AddArg(x) 6093 v.AddArg(ptr) 6094 v.AddArg(mem) 6095 return true 6096 } 6097 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6098 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6099 // result: (ADDload <t> [off] {sym} x ptr mem) 6100 for { 6101 t := v.Type 6102 _ = v.Args[1] 6103 g := v.Args[0] 6104 if g.Op != OpS390XMOVDload { 6105 break 6106 } 6107 off := g.AuxInt 6108 sym := g.Aux 6109 _ = g.Args[1] 6110 ptr := g.Args[0] 6111 mem := g.Args[1] 6112 x := v.Args[1] 6113 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6114 break 6115 } 6116 v.reset(OpS390XADDload) 6117 v.Type = t 6118 v.AuxInt = off 6119 v.Aux = sym 6120 v.AddArg(x) 6121 v.AddArg(ptr) 6122 v.AddArg(mem) 6123 return true 6124 } 6125 return false 6126 } 6127 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 6128 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6129 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6130 // result: (ADDload <t> [off] {sym} x ptr mem) 6131 for { 6132 t := v.Type 6133 _ = v.Args[1] 6134 g := v.Args[0] 6135 if g.Op != OpS390XMOVDload { 6136 break 6137 } 6138 off := g.AuxInt 6139 sym := g.Aux 6140 _ = g.Args[1] 6141 ptr := g.Args[0] 6142 mem := g.Args[1] 6143 x := v.Args[1] 6144 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6145 break 6146 } 6147 v.reset(OpS390XADDload) 6148 v.Type = t 6149 v.AuxInt = off 6150 v.Aux = sym 6151 v.AddArg(x) 6152 v.AddArg(ptr) 6153 v.AddArg(mem) 6154 return true 6155 } 6156 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6157 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6158 // result: (ADDload <t> [off] {sym} x ptr mem) 6159 for { 6160 t := v.Type 6161 _ = v.Args[1] 6162 x := v.Args[0] 6163 g := v.Args[1] 6164 if g.Op != OpS390XMOVDload { 6165 break 6166 } 6167 off := g.AuxInt 6168 sym := g.Aux 6169 _ = g.Args[1] 6170 ptr := g.Args[0] 6171 mem := g.Args[1] 6172 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6173 break 6174 } 6175 v.reset(OpS390XADDload) 6176 v.Type = t 6177 v.AuxInt = off 6178 v.Aux = sym 6179 v.AddArg(x) 6180 v.AddArg(ptr) 6181 v.AddArg(mem) 6182 return true 6183 } 6184 return false 6185 } 6186 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 6187 // match: (ADDW x (MOVDconst [c])) 6188 // cond: 6189 // result: (ADDWconst [c] x) 6190 for { 6191 _ = v.Args[1] 6192 x := v.Args[0] 6193 v_1 := v.Args[1] 6194 if v_1.Op != OpS390XMOVDconst { 6195 break 6196 } 6197 c := v_1.AuxInt 6198 v.reset(OpS390XADDWconst) 6199 v.AuxInt = c 6200 v.AddArg(x) 6201 return true 6202 } 6203 // match: (ADDW (MOVDconst [c]) x) 6204 // cond: 6205 // result: (ADDWconst [c] x) 6206 for { 6207 _ = v.Args[1] 6208 v_0 := v.Args[0] 6209 if v_0.Op != OpS390XMOVDconst { 6210 break 6211 } 6212 c := v_0.AuxInt 6213 x := v.Args[1] 6214 v.reset(OpS390XADDWconst) 6215 v.AuxInt = c 6216 v.AddArg(x) 6217 return true 6218 } 6219 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 6220 // cond: d == 32-c 6221 // result: (RLLconst [c] x) 6222 for { 6223 _ = v.Args[1] 6224 v_0 := v.Args[0] 6225 if v_0.Op != OpS390XSLWconst { 6226 break 6227 } 6228 c := v_0.AuxInt 6229 x := v_0.Args[0] 6230 v_1 := v.Args[1] 6231 if v_1.Op != OpS390XSRWconst { 6232 break 6233 } 6234 d := v_1.AuxInt 6235 if x != v_1.Args[0] { 6236 break 6237 } 6238 if !(d == 32-c) { 6239 break 6240 } 6241 v.reset(OpS390XRLLconst) 6242 v.AuxInt = c 6243 v.AddArg(x) 6244 return true 6245 } 6246 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6247 // cond: d == 32-c 6248 // result: (RLLconst [c] x) 6249 for { 6250 _ = v.Args[1] 6251 v_0 := v.Args[0] 6252 if v_0.Op != OpS390XSRWconst { 6253 break 6254 } 6255 d := v_0.AuxInt 6256 x := v_0.Args[0] 6257 v_1 := v.Args[1] 6258 if v_1.Op != OpS390XSLWconst { 6259 break 6260 } 6261 c := v_1.AuxInt 6262 if x != v_1.Args[0] { 6263 break 6264 } 6265 if !(d == 32-c) { 6266 break 6267 } 6268 v.reset(OpS390XRLLconst) 6269 v.AuxInt = c 6270 v.AddArg(x) 6271 return true 6272 } 6273 // match: (ADDW x (NEGW y)) 6274 // cond: 6275 // result: (SUBW x y) 6276 for { 6277 _ = v.Args[1] 6278 x := v.Args[0] 6279 v_1 := v.Args[1] 6280 if v_1.Op != OpS390XNEGW { 6281 break 6282 } 6283 y := v_1.Args[0] 6284 v.reset(OpS390XSUBW) 6285 v.AddArg(x) 6286 v.AddArg(y) 6287 return true 6288 } 6289 // match: (ADDW (NEGW y) x) 6290 // cond: 6291 // result: (SUBW x y) 6292 for { 6293 _ = v.Args[1] 6294 v_0 := v.Args[0] 6295 if v_0.Op != OpS390XNEGW { 6296 break 6297 } 6298 y := v_0.Args[0] 6299 x := v.Args[1] 6300 v.reset(OpS390XSUBW) 6301 v.AddArg(x) 6302 v.AddArg(y) 6303 return true 6304 } 6305 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6306 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6307 // result: (ADDWload <t> [off] {sym} x ptr mem) 6308 for { 6309 t := v.Type 6310 _ = v.Args[1] 6311 x := v.Args[0] 6312 g := v.Args[1] 6313 if g.Op != OpS390XMOVWload { 6314 break 6315 } 6316 off := g.AuxInt 6317 sym := g.Aux 6318 _ = g.Args[1] 6319 ptr := g.Args[0] 6320 mem := g.Args[1] 6321 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6322 break 6323 } 6324 v.reset(OpS390XADDWload) 6325 v.Type = t 6326 v.AuxInt = off 6327 v.Aux = sym 6328 v.AddArg(x) 6329 v.AddArg(ptr) 6330 v.AddArg(mem) 6331 return true 6332 } 6333 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6334 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6335 // result: (ADDWload <t> [off] {sym} x ptr mem) 6336 for { 6337 t := v.Type 6338 _ = v.Args[1] 6339 g := v.Args[0] 6340 if g.Op != OpS390XMOVWload { 6341 break 6342 } 6343 off := g.AuxInt 6344 sym := g.Aux 6345 _ = g.Args[1] 6346 ptr := g.Args[0] 6347 mem := g.Args[1] 6348 x := v.Args[1] 6349 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6350 break 6351 } 6352 v.reset(OpS390XADDWload) 6353 v.Type = t 6354 v.AuxInt = off 6355 v.Aux = sym 6356 v.AddArg(x) 6357 v.AddArg(ptr) 6358 v.AddArg(mem) 6359 return true 6360 } 6361 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6362 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6363 // result: (ADDWload <t> [off] {sym} x ptr mem) 6364 for { 6365 t := v.Type 6366 _ = v.Args[1] 6367 g := v.Args[0] 6368 if g.Op != OpS390XMOVWload { 6369 break 6370 } 6371 off := g.AuxInt 6372 sym := g.Aux 6373 _ = g.Args[1] 6374 ptr := g.Args[0] 6375 mem := g.Args[1] 6376 x := v.Args[1] 6377 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6378 break 6379 } 6380 v.reset(OpS390XADDWload) 6381 v.Type = t 6382 v.AuxInt = off 6383 v.Aux = sym 6384 v.AddArg(x) 6385 v.AddArg(ptr) 6386 v.AddArg(mem) 6387 return true 6388 } 6389 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6390 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6391 // result: (ADDWload <t> [off] {sym} x ptr mem) 6392 for { 6393 t := v.Type 6394 _ = v.Args[1] 6395 x := v.Args[0] 6396 g := v.Args[1] 6397 if g.Op != OpS390XMOVWload { 6398 break 6399 } 6400 off := g.AuxInt 6401 sym := g.Aux 6402 _ = g.Args[1] 6403 ptr := g.Args[0] 6404 mem := g.Args[1] 6405 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6406 break 6407 } 6408 v.reset(OpS390XADDWload) 6409 v.Type = t 6410 v.AuxInt = off 6411 v.Aux = sym 6412 v.AddArg(x) 6413 v.AddArg(ptr) 6414 v.AddArg(mem) 6415 return true 6416 } 6417 return false 6418 } 6419 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 6420 // match: (ADDW <t> x g:(MOVWZload [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 != OpS390XMOVWZload { 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:(MOVWZload [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 != OpS390XMOVWZload { 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:(MOVWZload [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 != OpS390XMOVWZload { 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:(MOVWZload [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 != OpS390XMOVWZload { 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_OpS390XADDWconst_0(v *Value) bool { 6535 // match: (ADDWconst [c] x) 6536 // cond: int32(c)==0 6537 // result: x 6538 for { 6539 c := v.AuxInt 6540 x := v.Args[0] 6541 if !(int32(c) == 0) { 6542 break 6543 } 6544 v.reset(OpCopy) 6545 v.Type = x.Type 6546 v.AddArg(x) 6547 return true 6548 } 6549 // match: (ADDWconst [c] (MOVDconst [d])) 6550 // cond: 6551 // result: (MOVDconst [int64(int32(c+d))]) 6552 for { 6553 c := v.AuxInt 6554 v_0 := v.Args[0] 6555 if v_0.Op != OpS390XMOVDconst { 6556 break 6557 } 6558 d := v_0.AuxInt 6559 v.reset(OpS390XMOVDconst) 6560 v.AuxInt = int64(int32(c + d)) 6561 return true 6562 } 6563 // match: (ADDWconst [c] (ADDWconst [d] x)) 6564 // cond: 6565 // result: (ADDWconst [int64(int32(c+d))] x) 6566 for { 6567 c := v.AuxInt 6568 v_0 := v.Args[0] 6569 if v_0.Op != OpS390XADDWconst { 6570 break 6571 } 6572 d := v_0.AuxInt 6573 x := v_0.Args[0] 6574 v.reset(OpS390XADDWconst) 6575 v.AuxInt = int64(int32(c + d)) 6576 v.AddArg(x) 6577 return true 6578 } 6579 return false 6580 } 6581 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 6582 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6583 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6584 // result: (MOVDaddr [c+d] {s} x) 6585 for { 6586 c := v.AuxInt 6587 v_0 := v.Args[0] 6588 if v_0.Op != OpS390XMOVDaddr { 6589 break 6590 } 6591 d := v_0.AuxInt 6592 s := v_0.Aux 6593 x := v_0.Args[0] 6594 if x.Op != OpSB { 6595 break 6596 } 6597 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6598 break 6599 } 6600 v.reset(OpS390XMOVDaddr) 6601 v.AuxInt = c + d 6602 v.Aux = s 6603 v.AddArg(x) 6604 return true 6605 } 6606 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6607 // cond: x.Op != OpSB && is20Bit(c+d) 6608 // result: (MOVDaddr [c+d] {s} x) 6609 for { 6610 c := v.AuxInt 6611 v_0 := v.Args[0] 6612 if v_0.Op != OpS390XMOVDaddr { 6613 break 6614 } 6615 d := v_0.AuxInt 6616 s := v_0.Aux 6617 x := v_0.Args[0] 6618 if !(x.Op != OpSB && is20Bit(c+d)) { 6619 break 6620 } 6621 v.reset(OpS390XMOVDaddr) 6622 v.AuxInt = c + d 6623 v.Aux = s 6624 v.AddArg(x) 6625 return true 6626 } 6627 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6628 // cond: is20Bit(c+d) 6629 // result: (MOVDaddridx [c+d] {s} x y) 6630 for { 6631 c := v.AuxInt 6632 v_0 := v.Args[0] 6633 if v_0.Op != OpS390XMOVDaddridx { 6634 break 6635 } 6636 d := v_0.AuxInt 6637 s := v_0.Aux 6638 _ = v_0.Args[1] 6639 x := v_0.Args[0] 6640 y := v_0.Args[1] 6641 if !(is20Bit(c + d)) { 6642 break 6643 } 6644 v.reset(OpS390XMOVDaddridx) 6645 v.AuxInt = c + d 6646 v.Aux = s 6647 v.AddArg(x) 6648 v.AddArg(y) 6649 return true 6650 } 6651 // match: (ADDconst [0] x) 6652 // cond: 6653 // result: x 6654 for { 6655 if v.AuxInt != 0 { 6656 break 6657 } 6658 x := v.Args[0] 6659 v.reset(OpCopy) 6660 v.Type = x.Type 6661 v.AddArg(x) 6662 return true 6663 } 6664 // match: (ADDconst [c] (MOVDconst [d])) 6665 // cond: 6666 // result: (MOVDconst [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 = c + d 6676 return true 6677 } 6678 // match: (ADDconst [c] (ADDconst [d] x)) 6679 // cond: is32Bit(c+d) 6680 // result: (ADDconst [c+d] x) 6681 for { 6682 c := v.AuxInt 6683 v_0 := v.Args[0] 6684 if v_0.Op != OpS390XADDconst { 6685 break 6686 } 6687 d := v_0.AuxInt 6688 x := v_0.Args[0] 6689 if !(is32Bit(c + d)) { 6690 break 6691 } 6692 v.reset(OpS390XADDconst) 6693 v.AuxInt = c + d 6694 v.AddArg(x) 6695 return true 6696 } 6697 return false 6698 } 6699 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 6700 // match: (AND x (MOVDconst [c])) 6701 // cond: is32Bit(c) && c < 0 6702 // result: (ANDconst [c] x) 6703 for { 6704 _ = v.Args[1] 6705 x := v.Args[0] 6706 v_1 := v.Args[1] 6707 if v_1.Op != OpS390XMOVDconst { 6708 break 6709 } 6710 c := v_1.AuxInt 6711 if !(is32Bit(c) && c < 0) { 6712 break 6713 } 6714 v.reset(OpS390XANDconst) 6715 v.AuxInt = c 6716 v.AddArg(x) 6717 return true 6718 } 6719 // match: (AND (MOVDconst [c]) x) 6720 // cond: is32Bit(c) && c < 0 6721 // result: (ANDconst [c] x) 6722 for { 6723 _ = v.Args[1] 6724 v_0 := v.Args[0] 6725 if v_0.Op != OpS390XMOVDconst { 6726 break 6727 } 6728 c := v_0.AuxInt 6729 x := v.Args[1] 6730 if !(is32Bit(c) && c < 0) { 6731 break 6732 } 6733 v.reset(OpS390XANDconst) 6734 v.AuxInt = c 6735 v.AddArg(x) 6736 return true 6737 } 6738 // match: (AND x (MOVDconst [0xFF])) 6739 // cond: 6740 // result: (MOVBZreg x) 6741 for { 6742 _ = v.Args[1] 6743 x := v.Args[0] 6744 v_1 := v.Args[1] 6745 if v_1.Op != OpS390XMOVDconst { 6746 break 6747 } 6748 if v_1.AuxInt != 0xFF { 6749 break 6750 } 6751 v.reset(OpS390XMOVBZreg) 6752 v.AddArg(x) 6753 return true 6754 } 6755 // match: (AND (MOVDconst [0xFF]) x) 6756 // cond: 6757 // result: (MOVBZreg x) 6758 for { 6759 _ = v.Args[1] 6760 v_0 := v.Args[0] 6761 if v_0.Op != OpS390XMOVDconst { 6762 break 6763 } 6764 if v_0.AuxInt != 0xFF { 6765 break 6766 } 6767 x := v.Args[1] 6768 v.reset(OpS390XMOVBZreg) 6769 v.AddArg(x) 6770 return true 6771 } 6772 // match: (AND x (MOVDconst [0xFFFF])) 6773 // cond: 6774 // result: (MOVHZreg x) 6775 for { 6776 _ = v.Args[1] 6777 x := v.Args[0] 6778 v_1 := v.Args[1] 6779 if v_1.Op != OpS390XMOVDconst { 6780 break 6781 } 6782 if v_1.AuxInt != 0xFFFF { 6783 break 6784 } 6785 v.reset(OpS390XMOVHZreg) 6786 v.AddArg(x) 6787 return true 6788 } 6789 // match: (AND (MOVDconst [0xFFFF]) x) 6790 // cond: 6791 // result: (MOVHZreg x) 6792 for { 6793 _ = v.Args[1] 6794 v_0 := v.Args[0] 6795 if v_0.Op != OpS390XMOVDconst { 6796 break 6797 } 6798 if v_0.AuxInt != 0xFFFF { 6799 break 6800 } 6801 x := v.Args[1] 6802 v.reset(OpS390XMOVHZreg) 6803 v.AddArg(x) 6804 return true 6805 } 6806 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6807 // cond: 6808 // result: (MOVWZreg x) 6809 for { 6810 _ = v.Args[1] 6811 x := v.Args[0] 6812 v_1 := v.Args[1] 6813 if v_1.Op != OpS390XMOVDconst { 6814 break 6815 } 6816 if v_1.AuxInt != 0xFFFFFFFF { 6817 break 6818 } 6819 v.reset(OpS390XMOVWZreg) 6820 v.AddArg(x) 6821 return true 6822 } 6823 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6824 // cond: 6825 // result: (MOVWZreg x) 6826 for { 6827 _ = v.Args[1] 6828 v_0 := v.Args[0] 6829 if v_0.Op != OpS390XMOVDconst { 6830 break 6831 } 6832 if v_0.AuxInt != 0xFFFFFFFF { 6833 break 6834 } 6835 x := v.Args[1] 6836 v.reset(OpS390XMOVWZreg) 6837 v.AddArg(x) 6838 return true 6839 } 6840 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6841 // cond: 6842 // result: (MOVDconst [c&d]) 6843 for { 6844 _ = v.Args[1] 6845 v_0 := v.Args[0] 6846 if v_0.Op != OpS390XMOVDconst { 6847 break 6848 } 6849 c := v_0.AuxInt 6850 v_1 := v.Args[1] 6851 if v_1.Op != OpS390XMOVDconst { 6852 break 6853 } 6854 d := v_1.AuxInt 6855 v.reset(OpS390XMOVDconst) 6856 v.AuxInt = c & d 6857 return true 6858 } 6859 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 6860 // cond: 6861 // result: (MOVDconst [c&d]) 6862 for { 6863 _ = v.Args[1] 6864 v_0 := v.Args[0] 6865 if v_0.Op != OpS390XMOVDconst { 6866 break 6867 } 6868 d := v_0.AuxInt 6869 v_1 := v.Args[1] 6870 if v_1.Op != OpS390XMOVDconst { 6871 break 6872 } 6873 c := v_1.AuxInt 6874 v.reset(OpS390XMOVDconst) 6875 v.AuxInt = c & d 6876 return true 6877 } 6878 return false 6879 } 6880 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 6881 // match: (AND x x) 6882 // cond: 6883 // result: x 6884 for { 6885 _ = v.Args[1] 6886 x := v.Args[0] 6887 if x != v.Args[1] { 6888 break 6889 } 6890 v.reset(OpCopy) 6891 v.Type = x.Type 6892 v.AddArg(x) 6893 return true 6894 } 6895 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6896 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6897 // result: (ANDload <t> [off] {sym} x ptr mem) 6898 for { 6899 t := v.Type 6900 _ = v.Args[1] 6901 x := v.Args[0] 6902 g := v.Args[1] 6903 if g.Op != OpS390XMOVDload { 6904 break 6905 } 6906 off := g.AuxInt 6907 sym := g.Aux 6908 _ = g.Args[1] 6909 ptr := g.Args[0] 6910 mem := g.Args[1] 6911 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6912 break 6913 } 6914 v.reset(OpS390XANDload) 6915 v.Type = t 6916 v.AuxInt = off 6917 v.Aux = sym 6918 v.AddArg(x) 6919 v.AddArg(ptr) 6920 v.AddArg(mem) 6921 return true 6922 } 6923 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6924 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6925 // result: (ANDload <t> [off] {sym} x ptr mem) 6926 for { 6927 t := v.Type 6928 _ = v.Args[1] 6929 g := v.Args[0] 6930 if g.Op != OpS390XMOVDload { 6931 break 6932 } 6933 off := g.AuxInt 6934 sym := g.Aux 6935 _ = g.Args[1] 6936 ptr := g.Args[0] 6937 mem := g.Args[1] 6938 x := v.Args[1] 6939 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6940 break 6941 } 6942 v.reset(OpS390XANDload) 6943 v.Type = t 6944 v.AuxInt = off 6945 v.Aux = sym 6946 v.AddArg(x) 6947 v.AddArg(ptr) 6948 v.AddArg(mem) 6949 return true 6950 } 6951 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6952 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6953 // result: (ANDload <t> [off] {sym} x ptr mem) 6954 for { 6955 t := v.Type 6956 _ = v.Args[1] 6957 g := v.Args[0] 6958 if g.Op != OpS390XMOVDload { 6959 break 6960 } 6961 off := g.AuxInt 6962 sym := g.Aux 6963 _ = g.Args[1] 6964 ptr := g.Args[0] 6965 mem := g.Args[1] 6966 x := v.Args[1] 6967 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6968 break 6969 } 6970 v.reset(OpS390XANDload) 6971 v.Type = t 6972 v.AuxInt = off 6973 v.Aux = sym 6974 v.AddArg(x) 6975 v.AddArg(ptr) 6976 v.AddArg(mem) 6977 return true 6978 } 6979 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6980 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6981 // result: (ANDload <t> [off] {sym} x ptr mem) 6982 for { 6983 t := v.Type 6984 _ = v.Args[1] 6985 x := v.Args[0] 6986 g := v.Args[1] 6987 if g.Op != OpS390XMOVDload { 6988 break 6989 } 6990 off := g.AuxInt 6991 sym := g.Aux 6992 _ = g.Args[1] 6993 ptr := g.Args[0] 6994 mem := g.Args[1] 6995 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6996 break 6997 } 6998 v.reset(OpS390XANDload) 6999 v.Type = t 7000 v.AuxInt = off 7001 v.Aux = sym 7002 v.AddArg(x) 7003 v.AddArg(ptr) 7004 v.AddArg(mem) 7005 return true 7006 } 7007 return false 7008 } 7009 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 7010 // match: (ANDW x (MOVDconst [c])) 7011 // cond: 7012 // result: (ANDWconst [c] x) 7013 for { 7014 _ = v.Args[1] 7015 x := v.Args[0] 7016 v_1 := v.Args[1] 7017 if v_1.Op != OpS390XMOVDconst { 7018 break 7019 } 7020 c := v_1.AuxInt 7021 v.reset(OpS390XANDWconst) 7022 v.AuxInt = c 7023 v.AddArg(x) 7024 return true 7025 } 7026 // match: (ANDW (MOVDconst [c]) x) 7027 // cond: 7028 // result: (ANDWconst [c] x) 7029 for { 7030 _ = v.Args[1] 7031 v_0 := v.Args[0] 7032 if v_0.Op != OpS390XMOVDconst { 7033 break 7034 } 7035 c := v_0.AuxInt 7036 x := v.Args[1] 7037 v.reset(OpS390XANDWconst) 7038 v.AuxInt = c 7039 v.AddArg(x) 7040 return true 7041 } 7042 // match: (ANDW x x) 7043 // cond: 7044 // result: x 7045 for { 7046 _ = v.Args[1] 7047 x := v.Args[0] 7048 if x != v.Args[1] { 7049 break 7050 } 7051 v.reset(OpCopy) 7052 v.Type = x.Type 7053 v.AddArg(x) 7054 return true 7055 } 7056 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7057 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7058 // result: (ANDWload <t> [off] {sym} x ptr mem) 7059 for { 7060 t := v.Type 7061 _ = v.Args[1] 7062 x := v.Args[0] 7063 g := v.Args[1] 7064 if g.Op != OpS390XMOVWload { 7065 break 7066 } 7067 off := g.AuxInt 7068 sym := g.Aux 7069 _ = g.Args[1] 7070 ptr := g.Args[0] 7071 mem := g.Args[1] 7072 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7073 break 7074 } 7075 v.reset(OpS390XANDWload) 7076 v.Type = t 7077 v.AuxInt = off 7078 v.Aux = sym 7079 v.AddArg(x) 7080 v.AddArg(ptr) 7081 v.AddArg(mem) 7082 return true 7083 } 7084 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7085 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7086 // result: (ANDWload <t> [off] {sym} x ptr mem) 7087 for { 7088 t := v.Type 7089 _ = v.Args[1] 7090 g := v.Args[0] 7091 if g.Op != OpS390XMOVWload { 7092 break 7093 } 7094 off := g.AuxInt 7095 sym := g.Aux 7096 _ = g.Args[1] 7097 ptr := g.Args[0] 7098 mem := g.Args[1] 7099 x := v.Args[1] 7100 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7101 break 7102 } 7103 v.reset(OpS390XANDWload) 7104 v.Type = t 7105 v.AuxInt = off 7106 v.Aux = sym 7107 v.AddArg(x) 7108 v.AddArg(ptr) 7109 v.AddArg(mem) 7110 return true 7111 } 7112 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7113 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7114 // result: (ANDWload <t> [off] {sym} x ptr mem) 7115 for { 7116 t := v.Type 7117 _ = v.Args[1] 7118 g := v.Args[0] 7119 if g.Op != OpS390XMOVWload { 7120 break 7121 } 7122 off := g.AuxInt 7123 sym := g.Aux 7124 _ = g.Args[1] 7125 ptr := g.Args[0] 7126 mem := g.Args[1] 7127 x := v.Args[1] 7128 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7129 break 7130 } 7131 v.reset(OpS390XANDWload) 7132 v.Type = t 7133 v.AuxInt = off 7134 v.Aux = sym 7135 v.AddArg(x) 7136 v.AddArg(ptr) 7137 v.AddArg(mem) 7138 return true 7139 } 7140 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7141 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7142 // result: (ANDWload <t> [off] {sym} x ptr mem) 7143 for { 7144 t := v.Type 7145 _ = v.Args[1] 7146 x := v.Args[0] 7147 g := v.Args[1] 7148 if g.Op != OpS390XMOVWload { 7149 break 7150 } 7151 off := g.AuxInt 7152 sym := g.Aux 7153 _ = g.Args[1] 7154 ptr := g.Args[0] 7155 mem := g.Args[1] 7156 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7157 break 7158 } 7159 v.reset(OpS390XANDWload) 7160 v.Type = t 7161 v.AuxInt = off 7162 v.Aux = sym 7163 v.AddArg(x) 7164 v.AddArg(ptr) 7165 v.AddArg(mem) 7166 return true 7167 } 7168 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7169 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7170 // result: (ANDWload <t> [off] {sym} x ptr mem) 7171 for { 7172 t := v.Type 7173 _ = v.Args[1] 7174 x := v.Args[0] 7175 g := v.Args[1] 7176 if g.Op != OpS390XMOVWZload { 7177 break 7178 } 7179 off := g.AuxInt 7180 sym := g.Aux 7181 _ = g.Args[1] 7182 ptr := g.Args[0] 7183 mem := g.Args[1] 7184 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7185 break 7186 } 7187 v.reset(OpS390XANDWload) 7188 v.Type = t 7189 v.AuxInt = off 7190 v.Aux = sym 7191 v.AddArg(x) 7192 v.AddArg(ptr) 7193 v.AddArg(mem) 7194 return true 7195 } 7196 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7197 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7198 // result: (ANDWload <t> [off] {sym} x ptr mem) 7199 for { 7200 t := v.Type 7201 _ = v.Args[1] 7202 g := v.Args[0] 7203 if g.Op != OpS390XMOVWZload { 7204 break 7205 } 7206 off := g.AuxInt 7207 sym := g.Aux 7208 _ = g.Args[1] 7209 ptr := g.Args[0] 7210 mem := g.Args[1] 7211 x := v.Args[1] 7212 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7213 break 7214 } 7215 v.reset(OpS390XANDWload) 7216 v.Type = t 7217 v.AuxInt = off 7218 v.Aux = sym 7219 v.AddArg(x) 7220 v.AddArg(ptr) 7221 v.AddArg(mem) 7222 return true 7223 } 7224 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7225 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7226 // result: (ANDWload <t> [off] {sym} x ptr mem) 7227 for { 7228 t := v.Type 7229 _ = v.Args[1] 7230 g := v.Args[0] 7231 if g.Op != OpS390XMOVWZload { 7232 break 7233 } 7234 off := g.AuxInt 7235 sym := g.Aux 7236 _ = g.Args[1] 7237 ptr := g.Args[0] 7238 mem := g.Args[1] 7239 x := v.Args[1] 7240 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7241 break 7242 } 7243 v.reset(OpS390XANDWload) 7244 v.Type = t 7245 v.AuxInt = off 7246 v.Aux = sym 7247 v.AddArg(x) 7248 v.AddArg(ptr) 7249 v.AddArg(mem) 7250 return true 7251 } 7252 return false 7253 } 7254 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 7255 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7256 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7257 // result: (ANDWload <t> [off] {sym} x ptr mem) 7258 for { 7259 t := v.Type 7260 _ = v.Args[1] 7261 x := v.Args[0] 7262 g := v.Args[1] 7263 if g.Op != OpS390XMOVWZload { 7264 break 7265 } 7266 off := g.AuxInt 7267 sym := g.Aux 7268 _ = g.Args[1] 7269 ptr := g.Args[0] 7270 mem := g.Args[1] 7271 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7272 break 7273 } 7274 v.reset(OpS390XANDWload) 7275 v.Type = t 7276 v.AuxInt = off 7277 v.Aux = sym 7278 v.AddArg(x) 7279 v.AddArg(ptr) 7280 v.AddArg(mem) 7281 return true 7282 } 7283 return false 7284 } 7285 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 7286 // match: (ANDWconst [c] (ANDWconst [d] x)) 7287 // cond: 7288 // result: (ANDWconst [c & d] x) 7289 for { 7290 c := v.AuxInt 7291 v_0 := v.Args[0] 7292 if v_0.Op != OpS390XANDWconst { 7293 break 7294 } 7295 d := v_0.AuxInt 7296 x := v_0.Args[0] 7297 v.reset(OpS390XANDWconst) 7298 v.AuxInt = c & d 7299 v.AddArg(x) 7300 return true 7301 } 7302 // match: (ANDWconst [0xFF] x) 7303 // cond: 7304 // result: (MOVBZreg x) 7305 for { 7306 if v.AuxInt != 0xFF { 7307 break 7308 } 7309 x := v.Args[0] 7310 v.reset(OpS390XMOVBZreg) 7311 v.AddArg(x) 7312 return true 7313 } 7314 // match: (ANDWconst [0xFFFF] x) 7315 // cond: 7316 // result: (MOVHZreg x) 7317 for { 7318 if v.AuxInt != 0xFFFF { 7319 break 7320 } 7321 x := v.Args[0] 7322 v.reset(OpS390XMOVHZreg) 7323 v.AddArg(x) 7324 return true 7325 } 7326 // match: (ANDWconst [c] _) 7327 // cond: int32(c)==0 7328 // result: (MOVDconst [0]) 7329 for { 7330 c := v.AuxInt 7331 if !(int32(c) == 0) { 7332 break 7333 } 7334 v.reset(OpS390XMOVDconst) 7335 v.AuxInt = 0 7336 return true 7337 } 7338 // match: (ANDWconst [c] x) 7339 // cond: int32(c)==-1 7340 // result: x 7341 for { 7342 c := v.AuxInt 7343 x := v.Args[0] 7344 if !(int32(c) == -1) { 7345 break 7346 } 7347 v.reset(OpCopy) 7348 v.Type = x.Type 7349 v.AddArg(x) 7350 return true 7351 } 7352 // match: (ANDWconst [c] (MOVDconst [d])) 7353 // cond: 7354 // result: (MOVDconst [c&d]) 7355 for { 7356 c := v.AuxInt 7357 v_0 := v.Args[0] 7358 if v_0.Op != OpS390XMOVDconst { 7359 break 7360 } 7361 d := v_0.AuxInt 7362 v.reset(OpS390XMOVDconst) 7363 v.AuxInt = c & d 7364 return true 7365 } 7366 return false 7367 } 7368 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 7369 // match: (ANDconst [c] (ANDconst [d] x)) 7370 // cond: 7371 // result: (ANDconst [c & d] x) 7372 for { 7373 c := v.AuxInt 7374 v_0 := v.Args[0] 7375 if v_0.Op != OpS390XANDconst { 7376 break 7377 } 7378 d := v_0.AuxInt 7379 x := v_0.Args[0] 7380 v.reset(OpS390XANDconst) 7381 v.AuxInt = c & d 7382 v.AddArg(x) 7383 return true 7384 } 7385 // match: (ANDconst [0] _) 7386 // cond: 7387 // result: (MOVDconst [0]) 7388 for { 7389 if v.AuxInt != 0 { 7390 break 7391 } 7392 v.reset(OpS390XMOVDconst) 7393 v.AuxInt = 0 7394 return true 7395 } 7396 // match: (ANDconst [-1] x) 7397 // cond: 7398 // result: x 7399 for { 7400 if v.AuxInt != -1 { 7401 break 7402 } 7403 x := v.Args[0] 7404 v.reset(OpCopy) 7405 v.Type = x.Type 7406 v.AddArg(x) 7407 return true 7408 } 7409 // match: (ANDconst [c] (MOVDconst [d])) 7410 // cond: 7411 // result: (MOVDconst [c&d]) 7412 for { 7413 c := v.AuxInt 7414 v_0 := v.Args[0] 7415 if v_0.Op != OpS390XMOVDconst { 7416 break 7417 } 7418 d := v_0.AuxInt 7419 v.reset(OpS390XMOVDconst) 7420 v.AuxInt = c & d 7421 return true 7422 } 7423 return false 7424 } 7425 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 7426 b := v.Block 7427 _ = b 7428 // match: (CMP x (MOVDconst [c])) 7429 // cond: is32Bit(c) 7430 // result: (CMPconst x [c]) 7431 for { 7432 _ = v.Args[1] 7433 x := v.Args[0] 7434 v_1 := v.Args[1] 7435 if v_1.Op != OpS390XMOVDconst { 7436 break 7437 } 7438 c := v_1.AuxInt 7439 if !(is32Bit(c)) { 7440 break 7441 } 7442 v.reset(OpS390XCMPconst) 7443 v.AuxInt = c 7444 v.AddArg(x) 7445 return true 7446 } 7447 // match: (CMP (MOVDconst [c]) x) 7448 // cond: is32Bit(c) 7449 // result: (InvertFlags (CMPconst x [c])) 7450 for { 7451 _ = v.Args[1] 7452 v_0 := v.Args[0] 7453 if v_0.Op != OpS390XMOVDconst { 7454 break 7455 } 7456 c := v_0.AuxInt 7457 x := v.Args[1] 7458 if !(is32Bit(c)) { 7459 break 7460 } 7461 v.reset(OpS390XInvertFlags) 7462 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 7463 v0.AuxInt = c 7464 v0.AddArg(x) 7465 v.AddArg(v0) 7466 return true 7467 } 7468 return false 7469 } 7470 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 7471 b := v.Block 7472 _ = b 7473 // match: (CMPU x (MOVDconst [c])) 7474 // cond: isU32Bit(c) 7475 // result: (CMPUconst x [int64(uint32(c))]) 7476 for { 7477 _ = v.Args[1] 7478 x := v.Args[0] 7479 v_1 := v.Args[1] 7480 if v_1.Op != OpS390XMOVDconst { 7481 break 7482 } 7483 c := v_1.AuxInt 7484 if !(isU32Bit(c)) { 7485 break 7486 } 7487 v.reset(OpS390XCMPUconst) 7488 v.AuxInt = int64(uint32(c)) 7489 v.AddArg(x) 7490 return true 7491 } 7492 // match: (CMPU (MOVDconst [c]) x) 7493 // cond: isU32Bit(c) 7494 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 7495 for { 7496 _ = v.Args[1] 7497 v_0 := v.Args[0] 7498 if v_0.Op != OpS390XMOVDconst { 7499 break 7500 } 7501 c := v_0.AuxInt 7502 x := v.Args[1] 7503 if !(isU32Bit(c)) { 7504 break 7505 } 7506 v.reset(OpS390XInvertFlags) 7507 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 7508 v0.AuxInt = int64(uint32(c)) 7509 v0.AddArg(x) 7510 v.AddArg(v0) 7511 return true 7512 } 7513 return false 7514 } 7515 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 7516 // match: (CMPUconst (MOVDconst [x]) [y]) 7517 // cond: uint64(x)==uint64(y) 7518 // result: (FlagEQ) 7519 for { 7520 y := v.AuxInt 7521 v_0 := v.Args[0] 7522 if v_0.Op != OpS390XMOVDconst { 7523 break 7524 } 7525 x := v_0.AuxInt 7526 if !(uint64(x) == uint64(y)) { 7527 break 7528 } 7529 v.reset(OpS390XFlagEQ) 7530 return true 7531 } 7532 // match: (CMPUconst (MOVDconst [x]) [y]) 7533 // cond: uint64(x)<uint64(y) 7534 // result: (FlagLT) 7535 for { 7536 y := v.AuxInt 7537 v_0 := v.Args[0] 7538 if v_0.Op != OpS390XMOVDconst { 7539 break 7540 } 7541 x := v_0.AuxInt 7542 if !(uint64(x) < uint64(y)) { 7543 break 7544 } 7545 v.reset(OpS390XFlagLT) 7546 return true 7547 } 7548 // match: (CMPUconst (MOVDconst [x]) [y]) 7549 // cond: uint64(x)>uint64(y) 7550 // result: (FlagGT) 7551 for { 7552 y := v.AuxInt 7553 v_0 := v.Args[0] 7554 if v_0.Op != OpS390XMOVDconst { 7555 break 7556 } 7557 x := v_0.AuxInt 7558 if !(uint64(x) > uint64(y)) { 7559 break 7560 } 7561 v.reset(OpS390XFlagGT) 7562 return true 7563 } 7564 return false 7565 } 7566 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 7567 b := v.Block 7568 _ = b 7569 // match: (CMPW x (MOVDconst [c])) 7570 // cond: 7571 // result: (CMPWconst x [c]) 7572 for { 7573 _ = v.Args[1] 7574 x := v.Args[0] 7575 v_1 := v.Args[1] 7576 if v_1.Op != OpS390XMOVDconst { 7577 break 7578 } 7579 c := v_1.AuxInt 7580 v.reset(OpS390XCMPWconst) 7581 v.AuxInt = c 7582 v.AddArg(x) 7583 return true 7584 } 7585 // match: (CMPW (MOVDconst [c]) x) 7586 // cond: 7587 // result: (InvertFlags (CMPWconst x [c])) 7588 for { 7589 _ = v.Args[1] 7590 v_0 := v.Args[0] 7591 if v_0.Op != OpS390XMOVDconst { 7592 break 7593 } 7594 c := v_0.AuxInt 7595 x := v.Args[1] 7596 v.reset(OpS390XInvertFlags) 7597 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 7598 v0.AuxInt = c 7599 v0.AddArg(x) 7600 v.AddArg(v0) 7601 return true 7602 } 7603 return false 7604 } 7605 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 7606 b := v.Block 7607 _ = b 7608 // match: (CMPWU x (MOVDconst [c])) 7609 // cond: 7610 // result: (CMPWUconst x [int64(uint32(c))]) 7611 for { 7612 _ = v.Args[1] 7613 x := v.Args[0] 7614 v_1 := v.Args[1] 7615 if v_1.Op != OpS390XMOVDconst { 7616 break 7617 } 7618 c := v_1.AuxInt 7619 v.reset(OpS390XCMPWUconst) 7620 v.AuxInt = int64(uint32(c)) 7621 v.AddArg(x) 7622 return true 7623 } 7624 // match: (CMPWU (MOVDconst [c]) x) 7625 // cond: 7626 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 7627 for { 7628 _ = v.Args[1] 7629 v_0 := v.Args[0] 7630 if v_0.Op != OpS390XMOVDconst { 7631 break 7632 } 7633 c := v_0.AuxInt 7634 x := v.Args[1] 7635 v.reset(OpS390XInvertFlags) 7636 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 7637 v0.AuxInt = int64(uint32(c)) 7638 v0.AddArg(x) 7639 v.AddArg(v0) 7640 return true 7641 } 7642 return false 7643 } 7644 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 7645 // match: (CMPWUconst (MOVDconst [x]) [y]) 7646 // cond: uint32(x)==uint32(y) 7647 // result: (FlagEQ) 7648 for { 7649 y := v.AuxInt 7650 v_0 := v.Args[0] 7651 if v_0.Op != OpS390XMOVDconst { 7652 break 7653 } 7654 x := v_0.AuxInt 7655 if !(uint32(x) == uint32(y)) { 7656 break 7657 } 7658 v.reset(OpS390XFlagEQ) 7659 return true 7660 } 7661 // match: (CMPWUconst (MOVDconst [x]) [y]) 7662 // cond: uint32(x)<uint32(y) 7663 // result: (FlagLT) 7664 for { 7665 y := v.AuxInt 7666 v_0 := v.Args[0] 7667 if v_0.Op != OpS390XMOVDconst { 7668 break 7669 } 7670 x := v_0.AuxInt 7671 if !(uint32(x) < uint32(y)) { 7672 break 7673 } 7674 v.reset(OpS390XFlagLT) 7675 return true 7676 } 7677 // match: (CMPWUconst (MOVDconst [x]) [y]) 7678 // cond: uint32(x)>uint32(y) 7679 // result: (FlagGT) 7680 for { 7681 y := v.AuxInt 7682 v_0 := v.Args[0] 7683 if v_0.Op != OpS390XMOVDconst { 7684 break 7685 } 7686 x := v_0.AuxInt 7687 if !(uint32(x) > uint32(y)) { 7688 break 7689 } 7690 v.reset(OpS390XFlagGT) 7691 return true 7692 } 7693 return false 7694 } 7695 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 7696 // match: (CMPWconst (MOVDconst [x]) [y]) 7697 // cond: int32(x)==int32(y) 7698 // result: (FlagEQ) 7699 for { 7700 y := v.AuxInt 7701 v_0 := v.Args[0] 7702 if v_0.Op != OpS390XMOVDconst { 7703 break 7704 } 7705 x := v_0.AuxInt 7706 if !(int32(x) == int32(y)) { 7707 break 7708 } 7709 v.reset(OpS390XFlagEQ) 7710 return true 7711 } 7712 // match: (CMPWconst (MOVDconst [x]) [y]) 7713 // cond: int32(x)<int32(y) 7714 // result: (FlagLT) 7715 for { 7716 y := v.AuxInt 7717 v_0 := v.Args[0] 7718 if v_0.Op != OpS390XMOVDconst { 7719 break 7720 } 7721 x := v_0.AuxInt 7722 if !(int32(x) < int32(y)) { 7723 break 7724 } 7725 v.reset(OpS390XFlagLT) 7726 return true 7727 } 7728 // match: (CMPWconst (MOVDconst [x]) [y]) 7729 // cond: int32(x)>int32(y) 7730 // result: (FlagGT) 7731 for { 7732 y := v.AuxInt 7733 v_0 := v.Args[0] 7734 if v_0.Op != OpS390XMOVDconst { 7735 break 7736 } 7737 x := v_0.AuxInt 7738 if !(int32(x) > int32(y)) { 7739 break 7740 } 7741 v.reset(OpS390XFlagGT) 7742 return true 7743 } 7744 // match: (CMPWconst (SRWconst _ [c]) [n]) 7745 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7746 // result: (FlagLT) 7747 for { 7748 n := v.AuxInt 7749 v_0 := v.Args[0] 7750 if v_0.Op != OpS390XSRWconst { 7751 break 7752 } 7753 c := v_0.AuxInt 7754 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7755 break 7756 } 7757 v.reset(OpS390XFlagLT) 7758 return true 7759 } 7760 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7761 // cond: 0 <= int32(m) && int32(m) < int32(n) 7762 // result: (FlagLT) 7763 for { 7764 n := v.AuxInt 7765 v_0 := v.Args[0] 7766 if v_0.Op != OpS390XANDWconst { 7767 break 7768 } 7769 m := v_0.AuxInt 7770 if !(0 <= int32(m) && int32(m) < int32(n)) { 7771 break 7772 } 7773 v.reset(OpS390XFlagLT) 7774 return true 7775 } 7776 return false 7777 } 7778 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 7779 // match: (CMPconst (MOVDconst [x]) [y]) 7780 // cond: x==y 7781 // result: (FlagEQ) 7782 for { 7783 y := v.AuxInt 7784 v_0 := v.Args[0] 7785 if v_0.Op != OpS390XMOVDconst { 7786 break 7787 } 7788 x := v_0.AuxInt 7789 if !(x == y) { 7790 break 7791 } 7792 v.reset(OpS390XFlagEQ) 7793 return true 7794 } 7795 // match: (CMPconst (MOVDconst [x]) [y]) 7796 // cond: x<y 7797 // result: (FlagLT) 7798 for { 7799 y := v.AuxInt 7800 v_0 := v.Args[0] 7801 if v_0.Op != OpS390XMOVDconst { 7802 break 7803 } 7804 x := v_0.AuxInt 7805 if !(x < y) { 7806 break 7807 } 7808 v.reset(OpS390XFlagLT) 7809 return true 7810 } 7811 // match: (CMPconst (MOVDconst [x]) [y]) 7812 // cond: x>y 7813 // result: (FlagGT) 7814 for { 7815 y := v.AuxInt 7816 v_0 := v.Args[0] 7817 if v_0.Op != OpS390XMOVDconst { 7818 break 7819 } 7820 x := v_0.AuxInt 7821 if !(x > y) { 7822 break 7823 } 7824 v.reset(OpS390XFlagGT) 7825 return true 7826 } 7827 // match: (CMPconst (MOVBZreg _) [c]) 7828 // cond: 0xFF < c 7829 // result: (FlagLT) 7830 for { 7831 c := v.AuxInt 7832 v_0 := v.Args[0] 7833 if v_0.Op != OpS390XMOVBZreg { 7834 break 7835 } 7836 if !(0xFF < c) { 7837 break 7838 } 7839 v.reset(OpS390XFlagLT) 7840 return true 7841 } 7842 // match: (CMPconst (MOVHZreg _) [c]) 7843 // cond: 0xFFFF < c 7844 // result: (FlagLT) 7845 for { 7846 c := v.AuxInt 7847 v_0 := v.Args[0] 7848 if v_0.Op != OpS390XMOVHZreg { 7849 break 7850 } 7851 if !(0xFFFF < c) { 7852 break 7853 } 7854 v.reset(OpS390XFlagLT) 7855 return true 7856 } 7857 // match: (CMPconst (MOVWZreg _) [c]) 7858 // cond: 0xFFFFFFFF < c 7859 // result: (FlagLT) 7860 for { 7861 c := v.AuxInt 7862 v_0 := v.Args[0] 7863 if v_0.Op != OpS390XMOVWZreg { 7864 break 7865 } 7866 if !(0xFFFFFFFF < c) { 7867 break 7868 } 7869 v.reset(OpS390XFlagLT) 7870 return true 7871 } 7872 // match: (CMPconst (SRDconst _ [c]) [n]) 7873 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7874 // result: (FlagLT) 7875 for { 7876 n := v.AuxInt 7877 v_0 := v.Args[0] 7878 if v_0.Op != OpS390XSRDconst { 7879 break 7880 } 7881 c := v_0.AuxInt 7882 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7883 break 7884 } 7885 v.reset(OpS390XFlagLT) 7886 return true 7887 } 7888 // match: (CMPconst (ANDconst _ [m]) [n]) 7889 // cond: 0 <= m && m < n 7890 // result: (FlagLT) 7891 for { 7892 n := v.AuxInt 7893 v_0 := v.Args[0] 7894 if v_0.Op != OpS390XANDconst { 7895 break 7896 } 7897 m := v_0.AuxInt 7898 if !(0 <= m && m < n) { 7899 break 7900 } 7901 v.reset(OpS390XFlagLT) 7902 return true 7903 } 7904 return false 7905 } 7906 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 7907 // match: (FADD (FMUL y z) x) 7908 // cond: 7909 // result: (FMADD x y z) 7910 for { 7911 _ = v.Args[1] 7912 v_0 := v.Args[0] 7913 if v_0.Op != OpS390XFMUL { 7914 break 7915 } 7916 _ = v_0.Args[1] 7917 y := v_0.Args[0] 7918 z := v_0.Args[1] 7919 x := v.Args[1] 7920 v.reset(OpS390XFMADD) 7921 v.AddArg(x) 7922 v.AddArg(y) 7923 v.AddArg(z) 7924 return true 7925 } 7926 // match: (FADD x (FMUL y z)) 7927 // cond: 7928 // result: (FMADD x y z) 7929 for { 7930 _ = v.Args[1] 7931 x := v.Args[0] 7932 v_1 := v.Args[1] 7933 if v_1.Op != OpS390XFMUL { 7934 break 7935 } 7936 _ = v_1.Args[1] 7937 y := v_1.Args[0] 7938 z := v_1.Args[1] 7939 v.reset(OpS390XFMADD) 7940 v.AddArg(x) 7941 v.AddArg(y) 7942 v.AddArg(z) 7943 return true 7944 } 7945 return false 7946 } 7947 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 7948 // match: (FADDS (FMULS y z) x) 7949 // cond: 7950 // result: (FMADDS x y z) 7951 for { 7952 _ = v.Args[1] 7953 v_0 := v.Args[0] 7954 if v_0.Op != OpS390XFMULS { 7955 break 7956 } 7957 _ = v_0.Args[1] 7958 y := v_0.Args[0] 7959 z := v_0.Args[1] 7960 x := v.Args[1] 7961 v.reset(OpS390XFMADDS) 7962 v.AddArg(x) 7963 v.AddArg(y) 7964 v.AddArg(z) 7965 return true 7966 } 7967 // match: (FADDS x (FMULS y z)) 7968 // cond: 7969 // result: (FMADDS x y z) 7970 for { 7971 _ = v.Args[1] 7972 x := v.Args[0] 7973 v_1 := v.Args[1] 7974 if v_1.Op != OpS390XFMULS { 7975 break 7976 } 7977 _ = v_1.Args[1] 7978 y := v_1.Args[0] 7979 z := v_1.Args[1] 7980 v.reset(OpS390XFMADDS) 7981 v.AddArg(x) 7982 v.AddArg(y) 7983 v.AddArg(z) 7984 return true 7985 } 7986 return false 7987 } 7988 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 7989 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7990 // cond: is20Bit(off1+off2) 7991 // result: (FMOVDload [off1+off2] {sym} ptr mem) 7992 for { 7993 off1 := v.AuxInt 7994 sym := v.Aux 7995 _ = v.Args[1] 7996 v_0 := v.Args[0] 7997 if v_0.Op != OpS390XADDconst { 7998 break 7999 } 8000 off2 := v_0.AuxInt 8001 ptr := v_0.Args[0] 8002 mem := v.Args[1] 8003 if !(is20Bit(off1 + off2)) { 8004 break 8005 } 8006 v.reset(OpS390XFMOVDload) 8007 v.AuxInt = off1 + off2 8008 v.Aux = sym 8009 v.AddArg(ptr) 8010 v.AddArg(mem) 8011 return true 8012 } 8013 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8014 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8015 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8016 for { 8017 off1 := v.AuxInt 8018 sym1 := v.Aux 8019 _ = v.Args[1] 8020 v_0 := v.Args[0] 8021 if v_0.Op != OpS390XMOVDaddr { 8022 break 8023 } 8024 off2 := v_0.AuxInt 8025 sym2 := v_0.Aux 8026 base := v_0.Args[0] 8027 mem := v.Args[1] 8028 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8029 break 8030 } 8031 v.reset(OpS390XFMOVDload) 8032 v.AuxInt = off1 + off2 8033 v.Aux = mergeSym(sym1, sym2) 8034 v.AddArg(base) 8035 v.AddArg(mem) 8036 return true 8037 } 8038 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8039 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8040 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8041 for { 8042 off1 := v.AuxInt 8043 sym1 := v.Aux 8044 _ = v.Args[1] 8045 v_0 := v.Args[0] 8046 if v_0.Op != OpS390XMOVDaddridx { 8047 break 8048 } 8049 off2 := v_0.AuxInt 8050 sym2 := v_0.Aux 8051 _ = v_0.Args[1] 8052 ptr := v_0.Args[0] 8053 idx := v_0.Args[1] 8054 mem := v.Args[1] 8055 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8056 break 8057 } 8058 v.reset(OpS390XFMOVDloadidx) 8059 v.AuxInt = off1 + off2 8060 v.Aux = mergeSym(sym1, sym2) 8061 v.AddArg(ptr) 8062 v.AddArg(idx) 8063 v.AddArg(mem) 8064 return true 8065 } 8066 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 8067 // cond: ptr.Op != OpSB 8068 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 8069 for { 8070 off := v.AuxInt 8071 sym := v.Aux 8072 _ = v.Args[1] 8073 v_0 := v.Args[0] 8074 if v_0.Op != OpS390XADD { 8075 break 8076 } 8077 _ = v_0.Args[1] 8078 ptr := v_0.Args[0] 8079 idx := v_0.Args[1] 8080 mem := v.Args[1] 8081 if !(ptr.Op != OpSB) { 8082 break 8083 } 8084 v.reset(OpS390XFMOVDloadidx) 8085 v.AuxInt = off 8086 v.Aux = sym 8087 v.AddArg(ptr) 8088 v.AddArg(idx) 8089 v.AddArg(mem) 8090 return true 8091 } 8092 return false 8093 } 8094 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 8095 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8096 // cond: 8097 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8098 for { 8099 c := v.AuxInt 8100 sym := v.Aux 8101 _ = v.Args[2] 8102 v_0 := v.Args[0] 8103 if v_0.Op != OpS390XADDconst { 8104 break 8105 } 8106 d := v_0.AuxInt 8107 ptr := v_0.Args[0] 8108 idx := v.Args[1] 8109 mem := v.Args[2] 8110 v.reset(OpS390XFMOVDloadidx) 8111 v.AuxInt = c + d 8112 v.Aux = sym 8113 v.AddArg(ptr) 8114 v.AddArg(idx) 8115 v.AddArg(mem) 8116 return true 8117 } 8118 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8119 // cond: 8120 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8121 for { 8122 c := v.AuxInt 8123 sym := v.Aux 8124 _ = v.Args[2] 8125 ptr := v.Args[0] 8126 v_1 := v.Args[1] 8127 if v_1.Op != OpS390XADDconst { 8128 break 8129 } 8130 d := v_1.AuxInt 8131 idx := v_1.Args[0] 8132 mem := v.Args[2] 8133 v.reset(OpS390XFMOVDloadidx) 8134 v.AuxInt = c + d 8135 v.Aux = sym 8136 v.AddArg(ptr) 8137 v.AddArg(idx) 8138 v.AddArg(mem) 8139 return true 8140 } 8141 return false 8142 } 8143 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 8144 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8145 // cond: is20Bit(off1+off2) 8146 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 8147 for { 8148 off1 := v.AuxInt 8149 sym := v.Aux 8150 _ = v.Args[2] 8151 v_0 := v.Args[0] 8152 if v_0.Op != OpS390XADDconst { 8153 break 8154 } 8155 off2 := v_0.AuxInt 8156 ptr := v_0.Args[0] 8157 val := v.Args[1] 8158 mem := v.Args[2] 8159 if !(is20Bit(off1 + off2)) { 8160 break 8161 } 8162 v.reset(OpS390XFMOVDstore) 8163 v.AuxInt = off1 + off2 8164 v.Aux = sym 8165 v.AddArg(ptr) 8166 v.AddArg(val) 8167 v.AddArg(mem) 8168 return true 8169 } 8170 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8171 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8172 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8173 for { 8174 off1 := v.AuxInt 8175 sym1 := v.Aux 8176 _ = v.Args[2] 8177 v_0 := v.Args[0] 8178 if v_0.Op != OpS390XMOVDaddr { 8179 break 8180 } 8181 off2 := v_0.AuxInt 8182 sym2 := v_0.Aux 8183 base := v_0.Args[0] 8184 val := v.Args[1] 8185 mem := v.Args[2] 8186 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8187 break 8188 } 8189 v.reset(OpS390XFMOVDstore) 8190 v.AuxInt = off1 + off2 8191 v.Aux = mergeSym(sym1, sym2) 8192 v.AddArg(base) 8193 v.AddArg(val) 8194 v.AddArg(mem) 8195 return true 8196 } 8197 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8198 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8199 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8200 for { 8201 off1 := v.AuxInt 8202 sym1 := v.Aux 8203 _ = v.Args[2] 8204 v_0 := v.Args[0] 8205 if v_0.Op != OpS390XMOVDaddridx { 8206 break 8207 } 8208 off2 := v_0.AuxInt 8209 sym2 := v_0.Aux 8210 _ = v_0.Args[1] 8211 ptr := v_0.Args[0] 8212 idx := v_0.Args[1] 8213 val := v.Args[1] 8214 mem := v.Args[2] 8215 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8216 break 8217 } 8218 v.reset(OpS390XFMOVDstoreidx) 8219 v.AuxInt = off1 + off2 8220 v.Aux = mergeSym(sym1, sym2) 8221 v.AddArg(ptr) 8222 v.AddArg(idx) 8223 v.AddArg(val) 8224 v.AddArg(mem) 8225 return true 8226 } 8227 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 8228 // cond: ptr.Op != OpSB 8229 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 8230 for { 8231 off := v.AuxInt 8232 sym := v.Aux 8233 _ = v.Args[2] 8234 v_0 := v.Args[0] 8235 if v_0.Op != OpS390XADD { 8236 break 8237 } 8238 _ = v_0.Args[1] 8239 ptr := v_0.Args[0] 8240 idx := v_0.Args[1] 8241 val := v.Args[1] 8242 mem := v.Args[2] 8243 if !(ptr.Op != OpSB) { 8244 break 8245 } 8246 v.reset(OpS390XFMOVDstoreidx) 8247 v.AuxInt = off 8248 v.Aux = sym 8249 v.AddArg(ptr) 8250 v.AddArg(idx) 8251 v.AddArg(val) 8252 v.AddArg(mem) 8253 return true 8254 } 8255 return false 8256 } 8257 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 8258 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8259 // cond: 8260 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8261 for { 8262 c := v.AuxInt 8263 sym := v.Aux 8264 _ = v.Args[3] 8265 v_0 := v.Args[0] 8266 if v_0.Op != OpS390XADDconst { 8267 break 8268 } 8269 d := v_0.AuxInt 8270 ptr := v_0.Args[0] 8271 idx := v.Args[1] 8272 val := v.Args[2] 8273 mem := v.Args[3] 8274 v.reset(OpS390XFMOVDstoreidx) 8275 v.AuxInt = c + d 8276 v.Aux = sym 8277 v.AddArg(ptr) 8278 v.AddArg(idx) 8279 v.AddArg(val) 8280 v.AddArg(mem) 8281 return true 8282 } 8283 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8284 // cond: 8285 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8286 for { 8287 c := v.AuxInt 8288 sym := v.Aux 8289 _ = v.Args[3] 8290 ptr := v.Args[0] 8291 v_1 := v.Args[1] 8292 if v_1.Op != OpS390XADDconst { 8293 break 8294 } 8295 d := v_1.AuxInt 8296 idx := v_1.Args[0] 8297 val := v.Args[2] 8298 mem := v.Args[3] 8299 v.reset(OpS390XFMOVDstoreidx) 8300 v.AuxInt = c + d 8301 v.Aux = sym 8302 v.AddArg(ptr) 8303 v.AddArg(idx) 8304 v.AddArg(val) 8305 v.AddArg(mem) 8306 return true 8307 } 8308 return false 8309 } 8310 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 8311 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 8312 // cond: is20Bit(off1+off2) 8313 // result: (FMOVSload [off1+off2] {sym} ptr mem) 8314 for { 8315 off1 := v.AuxInt 8316 sym := v.Aux 8317 _ = v.Args[1] 8318 v_0 := v.Args[0] 8319 if v_0.Op != OpS390XADDconst { 8320 break 8321 } 8322 off2 := v_0.AuxInt 8323 ptr := v_0.Args[0] 8324 mem := v.Args[1] 8325 if !(is20Bit(off1 + off2)) { 8326 break 8327 } 8328 v.reset(OpS390XFMOVSload) 8329 v.AuxInt = off1 + off2 8330 v.Aux = sym 8331 v.AddArg(ptr) 8332 v.AddArg(mem) 8333 return true 8334 } 8335 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8336 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8337 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8338 for { 8339 off1 := v.AuxInt 8340 sym1 := v.Aux 8341 _ = v.Args[1] 8342 v_0 := v.Args[0] 8343 if v_0.Op != OpS390XMOVDaddr { 8344 break 8345 } 8346 off2 := v_0.AuxInt 8347 sym2 := v_0.Aux 8348 base := v_0.Args[0] 8349 mem := v.Args[1] 8350 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8351 break 8352 } 8353 v.reset(OpS390XFMOVSload) 8354 v.AuxInt = off1 + off2 8355 v.Aux = mergeSym(sym1, sym2) 8356 v.AddArg(base) 8357 v.AddArg(mem) 8358 return true 8359 } 8360 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8361 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8362 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8363 for { 8364 off1 := v.AuxInt 8365 sym1 := v.Aux 8366 _ = v.Args[1] 8367 v_0 := v.Args[0] 8368 if v_0.Op != OpS390XMOVDaddridx { 8369 break 8370 } 8371 off2 := v_0.AuxInt 8372 sym2 := v_0.Aux 8373 _ = v_0.Args[1] 8374 ptr := v_0.Args[0] 8375 idx := v_0.Args[1] 8376 mem := v.Args[1] 8377 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8378 break 8379 } 8380 v.reset(OpS390XFMOVSloadidx) 8381 v.AuxInt = off1 + off2 8382 v.Aux = mergeSym(sym1, sym2) 8383 v.AddArg(ptr) 8384 v.AddArg(idx) 8385 v.AddArg(mem) 8386 return true 8387 } 8388 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8389 // cond: ptr.Op != OpSB 8390 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8391 for { 8392 off := v.AuxInt 8393 sym := v.Aux 8394 _ = v.Args[1] 8395 v_0 := v.Args[0] 8396 if v_0.Op != OpS390XADD { 8397 break 8398 } 8399 _ = v_0.Args[1] 8400 ptr := v_0.Args[0] 8401 idx := v_0.Args[1] 8402 mem := v.Args[1] 8403 if !(ptr.Op != OpSB) { 8404 break 8405 } 8406 v.reset(OpS390XFMOVSloadidx) 8407 v.AuxInt = off 8408 v.Aux = sym 8409 v.AddArg(ptr) 8410 v.AddArg(idx) 8411 v.AddArg(mem) 8412 return true 8413 } 8414 return false 8415 } 8416 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 8417 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8418 // cond: 8419 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8420 for { 8421 c := v.AuxInt 8422 sym := v.Aux 8423 _ = v.Args[2] 8424 v_0 := v.Args[0] 8425 if v_0.Op != OpS390XADDconst { 8426 break 8427 } 8428 d := v_0.AuxInt 8429 ptr := v_0.Args[0] 8430 idx := v.Args[1] 8431 mem := v.Args[2] 8432 v.reset(OpS390XFMOVSloadidx) 8433 v.AuxInt = c + d 8434 v.Aux = sym 8435 v.AddArg(ptr) 8436 v.AddArg(idx) 8437 v.AddArg(mem) 8438 return true 8439 } 8440 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8441 // cond: 8442 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8443 for { 8444 c := v.AuxInt 8445 sym := v.Aux 8446 _ = v.Args[2] 8447 ptr := v.Args[0] 8448 v_1 := v.Args[1] 8449 if v_1.Op != OpS390XADDconst { 8450 break 8451 } 8452 d := v_1.AuxInt 8453 idx := v_1.Args[0] 8454 mem := v.Args[2] 8455 v.reset(OpS390XFMOVSloadidx) 8456 v.AuxInt = c + d 8457 v.Aux = sym 8458 v.AddArg(ptr) 8459 v.AddArg(idx) 8460 v.AddArg(mem) 8461 return true 8462 } 8463 return false 8464 } 8465 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 8466 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8467 // cond: is20Bit(off1+off2) 8468 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 8469 for { 8470 off1 := v.AuxInt 8471 sym := v.Aux 8472 _ = v.Args[2] 8473 v_0 := v.Args[0] 8474 if v_0.Op != OpS390XADDconst { 8475 break 8476 } 8477 off2 := v_0.AuxInt 8478 ptr := v_0.Args[0] 8479 val := v.Args[1] 8480 mem := v.Args[2] 8481 if !(is20Bit(off1 + off2)) { 8482 break 8483 } 8484 v.reset(OpS390XFMOVSstore) 8485 v.AuxInt = off1 + off2 8486 v.Aux = sym 8487 v.AddArg(ptr) 8488 v.AddArg(val) 8489 v.AddArg(mem) 8490 return true 8491 } 8492 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8493 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8494 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8495 for { 8496 off1 := v.AuxInt 8497 sym1 := v.Aux 8498 _ = v.Args[2] 8499 v_0 := v.Args[0] 8500 if v_0.Op != OpS390XMOVDaddr { 8501 break 8502 } 8503 off2 := v_0.AuxInt 8504 sym2 := v_0.Aux 8505 base := v_0.Args[0] 8506 val := v.Args[1] 8507 mem := v.Args[2] 8508 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8509 break 8510 } 8511 v.reset(OpS390XFMOVSstore) 8512 v.AuxInt = off1 + off2 8513 v.Aux = mergeSym(sym1, sym2) 8514 v.AddArg(base) 8515 v.AddArg(val) 8516 v.AddArg(mem) 8517 return true 8518 } 8519 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8520 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8521 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8522 for { 8523 off1 := v.AuxInt 8524 sym1 := v.Aux 8525 _ = v.Args[2] 8526 v_0 := v.Args[0] 8527 if v_0.Op != OpS390XMOVDaddridx { 8528 break 8529 } 8530 off2 := v_0.AuxInt 8531 sym2 := v_0.Aux 8532 _ = v_0.Args[1] 8533 ptr := v_0.Args[0] 8534 idx := v_0.Args[1] 8535 val := v.Args[1] 8536 mem := v.Args[2] 8537 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8538 break 8539 } 8540 v.reset(OpS390XFMOVSstoreidx) 8541 v.AuxInt = off1 + off2 8542 v.Aux = mergeSym(sym1, sym2) 8543 v.AddArg(ptr) 8544 v.AddArg(idx) 8545 v.AddArg(val) 8546 v.AddArg(mem) 8547 return true 8548 } 8549 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 8550 // cond: ptr.Op != OpSB 8551 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 8552 for { 8553 off := v.AuxInt 8554 sym := v.Aux 8555 _ = v.Args[2] 8556 v_0 := v.Args[0] 8557 if v_0.Op != OpS390XADD { 8558 break 8559 } 8560 _ = v_0.Args[1] 8561 ptr := v_0.Args[0] 8562 idx := v_0.Args[1] 8563 val := v.Args[1] 8564 mem := v.Args[2] 8565 if !(ptr.Op != OpSB) { 8566 break 8567 } 8568 v.reset(OpS390XFMOVSstoreidx) 8569 v.AuxInt = off 8570 v.Aux = sym 8571 v.AddArg(ptr) 8572 v.AddArg(idx) 8573 v.AddArg(val) 8574 v.AddArg(mem) 8575 return true 8576 } 8577 return false 8578 } 8579 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 8580 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8581 // cond: 8582 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8583 for { 8584 c := v.AuxInt 8585 sym := v.Aux 8586 _ = v.Args[3] 8587 v_0 := v.Args[0] 8588 if v_0.Op != OpS390XADDconst { 8589 break 8590 } 8591 d := v_0.AuxInt 8592 ptr := v_0.Args[0] 8593 idx := v.Args[1] 8594 val := v.Args[2] 8595 mem := v.Args[3] 8596 v.reset(OpS390XFMOVSstoreidx) 8597 v.AuxInt = c + d 8598 v.Aux = sym 8599 v.AddArg(ptr) 8600 v.AddArg(idx) 8601 v.AddArg(val) 8602 v.AddArg(mem) 8603 return true 8604 } 8605 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8606 // cond: 8607 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8608 for { 8609 c := v.AuxInt 8610 sym := v.Aux 8611 _ = v.Args[3] 8612 ptr := v.Args[0] 8613 v_1 := v.Args[1] 8614 if v_1.Op != OpS390XADDconst { 8615 break 8616 } 8617 d := v_1.AuxInt 8618 idx := v_1.Args[0] 8619 val := v.Args[2] 8620 mem := v.Args[3] 8621 v.reset(OpS390XFMOVSstoreidx) 8622 v.AuxInt = c + d 8623 v.Aux = sym 8624 v.AddArg(ptr) 8625 v.AddArg(idx) 8626 v.AddArg(val) 8627 v.AddArg(mem) 8628 return true 8629 } 8630 return false 8631 } 8632 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 8633 // match: (FSUB (FMUL y z) x) 8634 // cond: 8635 // result: (FMSUB x y z) 8636 for { 8637 _ = v.Args[1] 8638 v_0 := v.Args[0] 8639 if v_0.Op != OpS390XFMUL { 8640 break 8641 } 8642 _ = v_0.Args[1] 8643 y := v_0.Args[0] 8644 z := v_0.Args[1] 8645 x := v.Args[1] 8646 v.reset(OpS390XFMSUB) 8647 v.AddArg(x) 8648 v.AddArg(y) 8649 v.AddArg(z) 8650 return true 8651 } 8652 return false 8653 } 8654 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 8655 // match: (FSUBS (FMULS y z) x) 8656 // cond: 8657 // result: (FMSUBS x y z) 8658 for { 8659 _ = v.Args[1] 8660 v_0 := v.Args[0] 8661 if v_0.Op != OpS390XFMULS { 8662 break 8663 } 8664 _ = v_0.Args[1] 8665 y := v_0.Args[0] 8666 z := v_0.Args[1] 8667 x := v.Args[1] 8668 v.reset(OpS390XFMSUBS) 8669 v.AddArg(x) 8670 v.AddArg(y) 8671 v.AddArg(z) 8672 return true 8673 } 8674 return false 8675 } 8676 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 8677 // match: (LoweredRound32F x:(FMOVSconst)) 8678 // cond: 8679 // result: x 8680 for { 8681 x := v.Args[0] 8682 if x.Op != OpS390XFMOVSconst { 8683 break 8684 } 8685 v.reset(OpCopy) 8686 v.Type = x.Type 8687 v.AddArg(x) 8688 return true 8689 } 8690 return false 8691 } 8692 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 8693 // match: (LoweredRound64F x:(FMOVDconst)) 8694 // cond: 8695 // result: x 8696 for { 8697 x := v.Args[0] 8698 if x.Op != OpS390XFMOVDconst { 8699 break 8700 } 8701 v.reset(OpCopy) 8702 v.Type = x.Type 8703 v.AddArg(x) 8704 return true 8705 } 8706 return false 8707 } 8708 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 8709 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 8710 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8711 // result: (MOVBZreg x) 8712 for { 8713 off := v.AuxInt 8714 sym := v.Aux 8715 _ = v.Args[1] 8716 ptr := v.Args[0] 8717 v_1 := v.Args[1] 8718 if v_1.Op != OpS390XMOVBstore { 8719 break 8720 } 8721 off2 := v_1.AuxInt 8722 sym2 := v_1.Aux 8723 _ = v_1.Args[2] 8724 ptr2 := v_1.Args[0] 8725 x := v_1.Args[1] 8726 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8727 break 8728 } 8729 v.reset(OpS390XMOVBZreg) 8730 v.AddArg(x) 8731 return true 8732 } 8733 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 8734 // cond: is20Bit(off1+off2) 8735 // result: (MOVBZload [off1+off2] {sym} ptr mem) 8736 for { 8737 off1 := v.AuxInt 8738 sym := v.Aux 8739 _ = v.Args[1] 8740 v_0 := v.Args[0] 8741 if v_0.Op != OpS390XADDconst { 8742 break 8743 } 8744 off2 := v_0.AuxInt 8745 ptr := v_0.Args[0] 8746 mem := v.Args[1] 8747 if !(is20Bit(off1 + off2)) { 8748 break 8749 } 8750 v.reset(OpS390XMOVBZload) 8751 v.AuxInt = off1 + off2 8752 v.Aux = sym 8753 v.AddArg(ptr) 8754 v.AddArg(mem) 8755 return true 8756 } 8757 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8758 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8759 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8760 for { 8761 off1 := v.AuxInt 8762 sym1 := v.Aux 8763 _ = v.Args[1] 8764 v_0 := v.Args[0] 8765 if v_0.Op != OpS390XMOVDaddr { 8766 break 8767 } 8768 off2 := v_0.AuxInt 8769 sym2 := v_0.Aux 8770 base := v_0.Args[0] 8771 mem := v.Args[1] 8772 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8773 break 8774 } 8775 v.reset(OpS390XMOVBZload) 8776 v.AuxInt = off1 + off2 8777 v.Aux = mergeSym(sym1, sym2) 8778 v.AddArg(base) 8779 v.AddArg(mem) 8780 return true 8781 } 8782 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8783 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8784 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8785 for { 8786 off1 := v.AuxInt 8787 sym1 := v.Aux 8788 _ = v.Args[1] 8789 v_0 := v.Args[0] 8790 if v_0.Op != OpS390XMOVDaddridx { 8791 break 8792 } 8793 off2 := v_0.AuxInt 8794 sym2 := v_0.Aux 8795 _ = v_0.Args[1] 8796 ptr := v_0.Args[0] 8797 idx := v_0.Args[1] 8798 mem := v.Args[1] 8799 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8800 break 8801 } 8802 v.reset(OpS390XMOVBZloadidx) 8803 v.AuxInt = off1 + off2 8804 v.Aux = mergeSym(sym1, sym2) 8805 v.AddArg(ptr) 8806 v.AddArg(idx) 8807 v.AddArg(mem) 8808 return true 8809 } 8810 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 8811 // cond: ptr.Op != OpSB 8812 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 8813 for { 8814 off := v.AuxInt 8815 sym := v.Aux 8816 _ = v.Args[1] 8817 v_0 := v.Args[0] 8818 if v_0.Op != OpS390XADD { 8819 break 8820 } 8821 _ = v_0.Args[1] 8822 ptr := v_0.Args[0] 8823 idx := v_0.Args[1] 8824 mem := v.Args[1] 8825 if !(ptr.Op != OpSB) { 8826 break 8827 } 8828 v.reset(OpS390XMOVBZloadidx) 8829 v.AuxInt = off 8830 v.Aux = sym 8831 v.AddArg(ptr) 8832 v.AddArg(idx) 8833 v.AddArg(mem) 8834 return true 8835 } 8836 return false 8837 } 8838 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 8839 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8840 // cond: 8841 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8842 for { 8843 c := v.AuxInt 8844 sym := v.Aux 8845 _ = v.Args[2] 8846 v_0 := v.Args[0] 8847 if v_0.Op != OpS390XADDconst { 8848 break 8849 } 8850 d := v_0.AuxInt 8851 ptr := v_0.Args[0] 8852 idx := v.Args[1] 8853 mem := v.Args[2] 8854 v.reset(OpS390XMOVBZloadidx) 8855 v.AuxInt = c + d 8856 v.Aux = sym 8857 v.AddArg(ptr) 8858 v.AddArg(idx) 8859 v.AddArg(mem) 8860 return true 8861 } 8862 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 8863 // cond: 8864 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8865 for { 8866 c := v.AuxInt 8867 sym := v.Aux 8868 _ = v.Args[2] 8869 idx := v.Args[0] 8870 v_1 := v.Args[1] 8871 if v_1.Op != OpS390XADDconst { 8872 break 8873 } 8874 d := v_1.AuxInt 8875 ptr := v_1.Args[0] 8876 mem := v.Args[2] 8877 v.reset(OpS390XMOVBZloadidx) 8878 v.AuxInt = c + d 8879 v.Aux = sym 8880 v.AddArg(ptr) 8881 v.AddArg(idx) 8882 v.AddArg(mem) 8883 return true 8884 } 8885 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8886 // cond: 8887 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8888 for { 8889 c := v.AuxInt 8890 sym := v.Aux 8891 _ = v.Args[2] 8892 ptr := v.Args[0] 8893 v_1 := v.Args[1] 8894 if v_1.Op != OpS390XADDconst { 8895 break 8896 } 8897 d := v_1.AuxInt 8898 idx := v_1.Args[0] 8899 mem := v.Args[2] 8900 v.reset(OpS390XMOVBZloadidx) 8901 v.AuxInt = c + d 8902 v.Aux = sym 8903 v.AddArg(ptr) 8904 v.AddArg(idx) 8905 v.AddArg(mem) 8906 return true 8907 } 8908 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 8909 // cond: 8910 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8911 for { 8912 c := v.AuxInt 8913 sym := v.Aux 8914 _ = v.Args[2] 8915 v_0 := v.Args[0] 8916 if v_0.Op != OpS390XADDconst { 8917 break 8918 } 8919 d := v_0.AuxInt 8920 idx := v_0.Args[0] 8921 ptr := v.Args[1] 8922 mem := v.Args[2] 8923 v.reset(OpS390XMOVBZloadidx) 8924 v.AuxInt = c + d 8925 v.Aux = sym 8926 v.AddArg(ptr) 8927 v.AddArg(idx) 8928 v.AddArg(mem) 8929 return true 8930 } 8931 return false 8932 } 8933 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 8934 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8935 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8936 // result: (MOVDreg x) 8937 for { 8938 x := v.Args[0] 8939 if x.Op != OpS390XMOVDLT { 8940 break 8941 } 8942 _ = x.Args[2] 8943 x_0 := x.Args[0] 8944 if x_0.Op != OpS390XMOVDconst { 8945 break 8946 } 8947 c := x_0.AuxInt 8948 x_1 := x.Args[1] 8949 if x_1.Op != OpS390XMOVDconst { 8950 break 8951 } 8952 d := x_1.AuxInt 8953 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8954 break 8955 } 8956 v.reset(OpS390XMOVDreg) 8957 v.AddArg(x) 8958 return true 8959 } 8960 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 8961 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8962 // result: (MOVDreg x) 8963 for { 8964 x := v.Args[0] 8965 if x.Op != OpS390XMOVDLE { 8966 break 8967 } 8968 _ = x.Args[2] 8969 x_0 := x.Args[0] 8970 if x_0.Op != OpS390XMOVDconst { 8971 break 8972 } 8973 c := x_0.AuxInt 8974 x_1 := x.Args[1] 8975 if x_1.Op != OpS390XMOVDconst { 8976 break 8977 } 8978 d := x_1.AuxInt 8979 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8980 break 8981 } 8982 v.reset(OpS390XMOVDreg) 8983 v.AddArg(x) 8984 return true 8985 } 8986 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 8987 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8988 // result: (MOVDreg x) 8989 for { 8990 x := v.Args[0] 8991 if x.Op != OpS390XMOVDGT { 8992 break 8993 } 8994 _ = x.Args[2] 8995 x_0 := x.Args[0] 8996 if x_0.Op != OpS390XMOVDconst { 8997 break 8998 } 8999 c := x_0.AuxInt 9000 x_1 := x.Args[1] 9001 if x_1.Op != OpS390XMOVDconst { 9002 break 9003 } 9004 d := x_1.AuxInt 9005 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9006 break 9007 } 9008 v.reset(OpS390XMOVDreg) 9009 v.AddArg(x) 9010 return true 9011 } 9012 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 9013 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9014 // result: (MOVDreg x) 9015 for { 9016 x := v.Args[0] 9017 if x.Op != OpS390XMOVDGE { 9018 break 9019 } 9020 _ = x.Args[2] 9021 x_0 := x.Args[0] 9022 if x_0.Op != OpS390XMOVDconst { 9023 break 9024 } 9025 c := x_0.AuxInt 9026 x_1 := x.Args[1] 9027 if x_1.Op != OpS390XMOVDconst { 9028 break 9029 } 9030 d := x_1.AuxInt 9031 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9032 break 9033 } 9034 v.reset(OpS390XMOVDreg) 9035 v.AddArg(x) 9036 return true 9037 } 9038 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 9039 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9040 // result: (MOVDreg x) 9041 for { 9042 x := v.Args[0] 9043 if x.Op != OpS390XMOVDEQ { 9044 break 9045 } 9046 _ = x.Args[2] 9047 x_0 := x.Args[0] 9048 if x_0.Op != OpS390XMOVDconst { 9049 break 9050 } 9051 c := x_0.AuxInt 9052 x_1 := x.Args[1] 9053 if x_1.Op != OpS390XMOVDconst { 9054 break 9055 } 9056 d := x_1.AuxInt 9057 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9058 break 9059 } 9060 v.reset(OpS390XMOVDreg) 9061 v.AddArg(x) 9062 return true 9063 } 9064 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 9065 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9066 // result: (MOVDreg x) 9067 for { 9068 x := v.Args[0] 9069 if x.Op != OpS390XMOVDNE { 9070 break 9071 } 9072 _ = x.Args[2] 9073 x_0 := x.Args[0] 9074 if x_0.Op != OpS390XMOVDconst { 9075 break 9076 } 9077 c := x_0.AuxInt 9078 x_1 := x.Args[1] 9079 if x_1.Op != OpS390XMOVDconst { 9080 break 9081 } 9082 d := x_1.AuxInt 9083 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9084 break 9085 } 9086 v.reset(OpS390XMOVDreg) 9087 v.AddArg(x) 9088 return true 9089 } 9090 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9091 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9092 // result: (MOVDreg x) 9093 for { 9094 x := v.Args[0] 9095 if x.Op != OpS390XMOVDGTnoinv { 9096 break 9097 } 9098 _ = x.Args[2] 9099 x_0 := x.Args[0] 9100 if x_0.Op != OpS390XMOVDconst { 9101 break 9102 } 9103 c := x_0.AuxInt 9104 x_1 := x.Args[1] 9105 if x_1.Op != OpS390XMOVDconst { 9106 break 9107 } 9108 d := x_1.AuxInt 9109 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9110 break 9111 } 9112 v.reset(OpS390XMOVDreg) 9113 v.AddArg(x) 9114 return true 9115 } 9116 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9117 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9118 // result: (MOVDreg x) 9119 for { 9120 x := v.Args[0] 9121 if x.Op != OpS390XMOVDGEnoinv { 9122 break 9123 } 9124 _ = x.Args[2] 9125 x_0 := x.Args[0] 9126 if x_0.Op != OpS390XMOVDconst { 9127 break 9128 } 9129 c := x_0.AuxInt 9130 x_1 := x.Args[1] 9131 if x_1.Op != OpS390XMOVDconst { 9132 break 9133 } 9134 d := x_1.AuxInt 9135 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9136 break 9137 } 9138 v.reset(OpS390XMOVDreg) 9139 v.AddArg(x) 9140 return true 9141 } 9142 // match: (MOVBZreg x:(MOVBZload _ _)) 9143 // cond: 9144 // result: (MOVDreg x) 9145 for { 9146 x := v.Args[0] 9147 if x.Op != OpS390XMOVBZload { 9148 break 9149 } 9150 _ = x.Args[1] 9151 v.reset(OpS390XMOVDreg) 9152 v.AddArg(x) 9153 return true 9154 } 9155 // match: (MOVBZreg x:(Arg <t>)) 9156 // cond: is8BitInt(t) && !isSigned(t) 9157 // result: (MOVDreg x) 9158 for { 9159 x := v.Args[0] 9160 if x.Op != OpArg { 9161 break 9162 } 9163 t := x.Type 9164 if !(is8BitInt(t) && !isSigned(t)) { 9165 break 9166 } 9167 v.reset(OpS390XMOVDreg) 9168 v.AddArg(x) 9169 return true 9170 } 9171 return false 9172 } 9173 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 9174 b := v.Block 9175 _ = b 9176 // match: (MOVBZreg x:(MOVBZreg _)) 9177 // cond: 9178 // result: (MOVDreg x) 9179 for { 9180 x := v.Args[0] 9181 if x.Op != OpS390XMOVBZreg { 9182 break 9183 } 9184 v.reset(OpS390XMOVDreg) 9185 v.AddArg(x) 9186 return true 9187 } 9188 // match: (MOVBZreg (MOVDconst [c])) 9189 // cond: 9190 // result: (MOVDconst [int64(uint8(c))]) 9191 for { 9192 v_0 := v.Args[0] 9193 if v_0.Op != OpS390XMOVDconst { 9194 break 9195 } 9196 c := v_0.AuxInt 9197 v.reset(OpS390XMOVDconst) 9198 v.AuxInt = int64(uint8(c)) 9199 return true 9200 } 9201 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 9202 // cond: x.Uses == 1 && clobber(x) 9203 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 9204 for { 9205 x := v.Args[0] 9206 if x.Op != OpS390XMOVBZload { 9207 break 9208 } 9209 off := x.AuxInt 9210 sym := x.Aux 9211 _ = x.Args[1] 9212 ptr := x.Args[0] 9213 mem := x.Args[1] 9214 if !(x.Uses == 1 && clobber(x)) { 9215 break 9216 } 9217 b = x.Block 9218 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 9219 v.reset(OpCopy) 9220 v.AddArg(v0) 9221 v0.AuxInt = off 9222 v0.Aux = sym 9223 v0.AddArg(ptr) 9224 v0.AddArg(mem) 9225 return true 9226 } 9227 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 9228 // cond: x.Uses == 1 && clobber(x) 9229 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 9230 for { 9231 x := v.Args[0] 9232 if x.Op != OpS390XMOVBZloadidx { 9233 break 9234 } 9235 off := x.AuxInt 9236 sym := x.Aux 9237 _ = x.Args[2] 9238 ptr := x.Args[0] 9239 idx := x.Args[1] 9240 mem := x.Args[2] 9241 if !(x.Uses == 1 && clobber(x)) { 9242 break 9243 } 9244 b = x.Block 9245 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 9246 v.reset(OpCopy) 9247 v.AddArg(v0) 9248 v0.AuxInt = off 9249 v0.Aux = sym 9250 v0.AddArg(ptr) 9251 v0.AddArg(idx) 9252 v0.AddArg(mem) 9253 return true 9254 } 9255 return false 9256 } 9257 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 9258 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 9259 // cond: is20Bit(off1+off2) 9260 // result: (MOVBload [off1+off2] {sym} ptr mem) 9261 for { 9262 off1 := v.AuxInt 9263 sym := v.Aux 9264 _ = v.Args[1] 9265 v_0 := v.Args[0] 9266 if v_0.Op != OpS390XADDconst { 9267 break 9268 } 9269 off2 := v_0.AuxInt 9270 ptr := v_0.Args[0] 9271 mem := v.Args[1] 9272 if !(is20Bit(off1 + off2)) { 9273 break 9274 } 9275 v.reset(OpS390XMOVBload) 9276 v.AuxInt = off1 + off2 9277 v.Aux = sym 9278 v.AddArg(ptr) 9279 v.AddArg(mem) 9280 return true 9281 } 9282 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 9283 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9284 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 9285 for { 9286 off1 := v.AuxInt 9287 sym1 := v.Aux 9288 _ = v.Args[1] 9289 v_0 := v.Args[0] 9290 if v_0.Op != OpS390XMOVDaddr { 9291 break 9292 } 9293 off2 := v_0.AuxInt 9294 sym2 := v_0.Aux 9295 base := v_0.Args[0] 9296 mem := v.Args[1] 9297 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9298 break 9299 } 9300 v.reset(OpS390XMOVBload) 9301 v.AuxInt = off1 + off2 9302 v.Aux = mergeSym(sym1, sym2) 9303 v.AddArg(base) 9304 v.AddArg(mem) 9305 return true 9306 } 9307 return false 9308 } 9309 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 9310 b := v.Block 9311 _ = b 9312 // match: (MOVBreg x:(MOVBload _ _)) 9313 // cond: 9314 // result: (MOVDreg x) 9315 for { 9316 x := v.Args[0] 9317 if x.Op != OpS390XMOVBload { 9318 break 9319 } 9320 _ = x.Args[1] 9321 v.reset(OpS390XMOVDreg) 9322 v.AddArg(x) 9323 return true 9324 } 9325 // match: (MOVBreg x:(Arg <t>)) 9326 // cond: is8BitInt(t) && isSigned(t) 9327 // result: (MOVDreg x) 9328 for { 9329 x := v.Args[0] 9330 if x.Op != OpArg { 9331 break 9332 } 9333 t := x.Type 9334 if !(is8BitInt(t) && isSigned(t)) { 9335 break 9336 } 9337 v.reset(OpS390XMOVDreg) 9338 v.AddArg(x) 9339 return true 9340 } 9341 // match: (MOVBreg x:(MOVBreg _)) 9342 // cond: 9343 // result: (MOVDreg x) 9344 for { 9345 x := v.Args[0] 9346 if x.Op != OpS390XMOVBreg { 9347 break 9348 } 9349 v.reset(OpS390XMOVDreg) 9350 v.AddArg(x) 9351 return true 9352 } 9353 // match: (MOVBreg (MOVDconst [c])) 9354 // cond: 9355 // result: (MOVDconst [int64(int8(c))]) 9356 for { 9357 v_0 := v.Args[0] 9358 if v_0.Op != OpS390XMOVDconst { 9359 break 9360 } 9361 c := v_0.AuxInt 9362 v.reset(OpS390XMOVDconst) 9363 v.AuxInt = int64(int8(c)) 9364 return true 9365 } 9366 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 9367 // cond: x.Uses == 1 && clobber(x) 9368 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 9369 for { 9370 x := v.Args[0] 9371 if x.Op != OpS390XMOVBZload { 9372 break 9373 } 9374 off := x.AuxInt 9375 sym := x.Aux 9376 _ = x.Args[1] 9377 ptr := x.Args[0] 9378 mem := x.Args[1] 9379 if !(x.Uses == 1 && clobber(x)) { 9380 break 9381 } 9382 b = x.Block 9383 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 9384 v.reset(OpCopy) 9385 v.AddArg(v0) 9386 v0.AuxInt = off 9387 v0.Aux = sym 9388 v0.AddArg(ptr) 9389 v0.AddArg(mem) 9390 return true 9391 } 9392 return false 9393 } 9394 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 9395 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 9396 // cond: 9397 // result: (MOVBstore [off] {sym} ptr x mem) 9398 for { 9399 off := v.AuxInt 9400 sym := v.Aux 9401 _ = v.Args[2] 9402 ptr := v.Args[0] 9403 v_1 := v.Args[1] 9404 if v_1.Op != OpS390XMOVBreg { 9405 break 9406 } 9407 x := v_1.Args[0] 9408 mem := v.Args[2] 9409 v.reset(OpS390XMOVBstore) 9410 v.AuxInt = off 9411 v.Aux = sym 9412 v.AddArg(ptr) 9413 v.AddArg(x) 9414 v.AddArg(mem) 9415 return true 9416 } 9417 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 9418 // cond: 9419 // result: (MOVBstore [off] {sym} ptr x mem) 9420 for { 9421 off := v.AuxInt 9422 sym := v.Aux 9423 _ = v.Args[2] 9424 ptr := v.Args[0] 9425 v_1 := v.Args[1] 9426 if v_1.Op != OpS390XMOVBZreg { 9427 break 9428 } 9429 x := v_1.Args[0] 9430 mem := v.Args[2] 9431 v.reset(OpS390XMOVBstore) 9432 v.AuxInt = off 9433 v.Aux = sym 9434 v.AddArg(ptr) 9435 v.AddArg(x) 9436 v.AddArg(mem) 9437 return true 9438 } 9439 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9440 // cond: is20Bit(off1+off2) 9441 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 9442 for { 9443 off1 := v.AuxInt 9444 sym := v.Aux 9445 _ = v.Args[2] 9446 v_0 := v.Args[0] 9447 if v_0.Op != OpS390XADDconst { 9448 break 9449 } 9450 off2 := v_0.AuxInt 9451 ptr := v_0.Args[0] 9452 val := v.Args[1] 9453 mem := v.Args[2] 9454 if !(is20Bit(off1 + off2)) { 9455 break 9456 } 9457 v.reset(OpS390XMOVBstore) 9458 v.AuxInt = off1 + off2 9459 v.Aux = sym 9460 v.AddArg(ptr) 9461 v.AddArg(val) 9462 v.AddArg(mem) 9463 return true 9464 } 9465 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 9466 // cond: is20Bit(off) && ptr.Op != OpSB 9467 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 9468 for { 9469 off := v.AuxInt 9470 sym := v.Aux 9471 _ = v.Args[2] 9472 ptr := v.Args[0] 9473 v_1 := v.Args[1] 9474 if v_1.Op != OpS390XMOVDconst { 9475 break 9476 } 9477 c := v_1.AuxInt 9478 mem := v.Args[2] 9479 if !(is20Bit(off) && ptr.Op != OpSB) { 9480 break 9481 } 9482 v.reset(OpS390XMOVBstoreconst) 9483 v.AuxInt = makeValAndOff(int64(int8(c)), off) 9484 v.Aux = sym 9485 v.AddArg(ptr) 9486 v.AddArg(mem) 9487 return true 9488 } 9489 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9490 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9491 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9492 for { 9493 off1 := v.AuxInt 9494 sym1 := v.Aux 9495 _ = v.Args[2] 9496 v_0 := v.Args[0] 9497 if v_0.Op != OpS390XMOVDaddr { 9498 break 9499 } 9500 off2 := v_0.AuxInt 9501 sym2 := v_0.Aux 9502 base := v_0.Args[0] 9503 val := v.Args[1] 9504 mem := v.Args[2] 9505 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9506 break 9507 } 9508 v.reset(OpS390XMOVBstore) 9509 v.AuxInt = off1 + off2 9510 v.Aux = mergeSym(sym1, sym2) 9511 v.AddArg(base) 9512 v.AddArg(val) 9513 v.AddArg(mem) 9514 return true 9515 } 9516 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9517 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9518 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9519 for { 9520 off1 := v.AuxInt 9521 sym1 := v.Aux 9522 _ = v.Args[2] 9523 v_0 := v.Args[0] 9524 if v_0.Op != OpS390XMOVDaddridx { 9525 break 9526 } 9527 off2 := v_0.AuxInt 9528 sym2 := v_0.Aux 9529 _ = v_0.Args[1] 9530 ptr := v_0.Args[0] 9531 idx := v_0.Args[1] 9532 val := v.Args[1] 9533 mem := v.Args[2] 9534 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9535 break 9536 } 9537 v.reset(OpS390XMOVBstoreidx) 9538 v.AuxInt = off1 + off2 9539 v.Aux = mergeSym(sym1, sym2) 9540 v.AddArg(ptr) 9541 v.AddArg(idx) 9542 v.AddArg(val) 9543 v.AddArg(mem) 9544 return true 9545 } 9546 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 9547 // cond: ptr.Op != OpSB 9548 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 9549 for { 9550 off := v.AuxInt 9551 sym := v.Aux 9552 _ = v.Args[2] 9553 v_0 := v.Args[0] 9554 if v_0.Op != OpS390XADD { 9555 break 9556 } 9557 _ = v_0.Args[1] 9558 ptr := v_0.Args[0] 9559 idx := v_0.Args[1] 9560 val := v.Args[1] 9561 mem := v.Args[2] 9562 if !(ptr.Op != OpSB) { 9563 break 9564 } 9565 v.reset(OpS390XMOVBstoreidx) 9566 v.AuxInt = off 9567 v.Aux = sym 9568 v.AddArg(ptr) 9569 v.AddArg(idx) 9570 v.AddArg(val) 9571 v.AddArg(mem) 9572 return true 9573 } 9574 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 9575 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9576 // result: (MOVHstore [i-1] {s} p w mem) 9577 for { 9578 i := v.AuxInt 9579 s := v.Aux 9580 _ = v.Args[2] 9581 p := v.Args[0] 9582 w := v.Args[1] 9583 x := v.Args[2] 9584 if x.Op != OpS390XMOVBstore { 9585 break 9586 } 9587 if x.AuxInt != i-1 { 9588 break 9589 } 9590 if x.Aux != s { 9591 break 9592 } 9593 _ = x.Args[2] 9594 if p != x.Args[0] { 9595 break 9596 } 9597 x_1 := x.Args[1] 9598 if x_1.Op != OpS390XSRDconst { 9599 break 9600 } 9601 if x_1.AuxInt != 8 { 9602 break 9603 } 9604 if w != x_1.Args[0] { 9605 break 9606 } 9607 mem := x.Args[2] 9608 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9609 break 9610 } 9611 v.reset(OpS390XMOVHstore) 9612 v.AuxInt = i - 1 9613 v.Aux = s 9614 v.AddArg(p) 9615 v.AddArg(w) 9616 v.AddArg(mem) 9617 return true 9618 } 9619 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 9620 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9621 // result: (MOVHstore [i-1] {s} p w0 mem) 9622 for { 9623 i := v.AuxInt 9624 s := v.Aux 9625 _ = v.Args[2] 9626 p := v.Args[0] 9627 w0 := v.Args[1] 9628 if w0.Op != OpS390XSRDconst { 9629 break 9630 } 9631 j := w0.AuxInt 9632 w := w0.Args[0] 9633 x := v.Args[2] 9634 if x.Op != OpS390XMOVBstore { 9635 break 9636 } 9637 if x.AuxInt != i-1 { 9638 break 9639 } 9640 if x.Aux != s { 9641 break 9642 } 9643 _ = x.Args[2] 9644 if p != x.Args[0] { 9645 break 9646 } 9647 x_1 := x.Args[1] 9648 if x_1.Op != OpS390XSRDconst { 9649 break 9650 } 9651 if x_1.AuxInt != j+8 { 9652 break 9653 } 9654 if w != x_1.Args[0] { 9655 break 9656 } 9657 mem := x.Args[2] 9658 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9659 break 9660 } 9661 v.reset(OpS390XMOVHstore) 9662 v.AuxInt = i - 1 9663 v.Aux = s 9664 v.AddArg(p) 9665 v.AddArg(w0) 9666 v.AddArg(mem) 9667 return true 9668 } 9669 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 9670 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9671 // result: (MOVHstore [i-1] {s} p w mem) 9672 for { 9673 i := v.AuxInt 9674 s := v.Aux 9675 _ = v.Args[2] 9676 p := v.Args[0] 9677 w := v.Args[1] 9678 x := v.Args[2] 9679 if x.Op != OpS390XMOVBstore { 9680 break 9681 } 9682 if x.AuxInt != i-1 { 9683 break 9684 } 9685 if x.Aux != s { 9686 break 9687 } 9688 _ = x.Args[2] 9689 if p != x.Args[0] { 9690 break 9691 } 9692 x_1 := x.Args[1] 9693 if x_1.Op != OpS390XSRWconst { 9694 break 9695 } 9696 if x_1.AuxInt != 8 { 9697 break 9698 } 9699 if w != x_1.Args[0] { 9700 break 9701 } 9702 mem := x.Args[2] 9703 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9704 break 9705 } 9706 v.reset(OpS390XMOVHstore) 9707 v.AuxInt = i - 1 9708 v.Aux = s 9709 v.AddArg(p) 9710 v.AddArg(w) 9711 v.AddArg(mem) 9712 return true 9713 } 9714 return false 9715 } 9716 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 9717 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 9718 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9719 // result: (MOVHstore [i-1] {s} p w0 mem) 9720 for { 9721 i := v.AuxInt 9722 s := v.Aux 9723 _ = v.Args[2] 9724 p := v.Args[0] 9725 w0 := v.Args[1] 9726 if w0.Op != OpS390XSRWconst { 9727 break 9728 } 9729 j := w0.AuxInt 9730 w := w0.Args[0] 9731 x := v.Args[2] 9732 if x.Op != OpS390XMOVBstore { 9733 break 9734 } 9735 if x.AuxInt != i-1 { 9736 break 9737 } 9738 if x.Aux != s { 9739 break 9740 } 9741 _ = x.Args[2] 9742 if p != x.Args[0] { 9743 break 9744 } 9745 x_1 := x.Args[1] 9746 if x_1.Op != OpS390XSRWconst { 9747 break 9748 } 9749 if x_1.AuxInt != j+8 { 9750 break 9751 } 9752 if w != x_1.Args[0] { 9753 break 9754 } 9755 mem := x.Args[2] 9756 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9757 break 9758 } 9759 v.reset(OpS390XMOVHstore) 9760 v.AuxInt = i - 1 9761 v.Aux = s 9762 v.AddArg(p) 9763 v.AddArg(w0) 9764 v.AddArg(mem) 9765 return true 9766 } 9767 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9768 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9769 // result: (MOVHBRstore [i-1] {s} p w mem) 9770 for { 9771 i := v.AuxInt 9772 s := v.Aux 9773 _ = v.Args[2] 9774 p := v.Args[0] 9775 v_1 := v.Args[1] 9776 if v_1.Op != OpS390XSRDconst { 9777 break 9778 } 9779 if v_1.AuxInt != 8 { 9780 break 9781 } 9782 w := v_1.Args[0] 9783 x := v.Args[2] 9784 if x.Op != OpS390XMOVBstore { 9785 break 9786 } 9787 if x.AuxInt != i-1 { 9788 break 9789 } 9790 if x.Aux != s { 9791 break 9792 } 9793 _ = x.Args[2] 9794 if p != x.Args[0] { 9795 break 9796 } 9797 if w != x.Args[1] { 9798 break 9799 } 9800 mem := x.Args[2] 9801 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9802 break 9803 } 9804 v.reset(OpS390XMOVHBRstore) 9805 v.AuxInt = i - 1 9806 v.Aux = s 9807 v.AddArg(p) 9808 v.AddArg(w) 9809 v.AddArg(mem) 9810 return true 9811 } 9812 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 9813 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9814 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9815 for { 9816 i := v.AuxInt 9817 s := v.Aux 9818 _ = v.Args[2] 9819 p := v.Args[0] 9820 v_1 := v.Args[1] 9821 if v_1.Op != OpS390XSRDconst { 9822 break 9823 } 9824 j := v_1.AuxInt 9825 w := v_1.Args[0] 9826 x := v.Args[2] 9827 if x.Op != OpS390XMOVBstore { 9828 break 9829 } 9830 if x.AuxInt != i-1 { 9831 break 9832 } 9833 if x.Aux != s { 9834 break 9835 } 9836 _ = x.Args[2] 9837 if p != x.Args[0] { 9838 break 9839 } 9840 w0 := x.Args[1] 9841 if w0.Op != OpS390XSRDconst { 9842 break 9843 } 9844 if w0.AuxInt != j-8 { 9845 break 9846 } 9847 if w != w0.Args[0] { 9848 break 9849 } 9850 mem := x.Args[2] 9851 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9852 break 9853 } 9854 v.reset(OpS390XMOVHBRstore) 9855 v.AuxInt = i - 1 9856 v.Aux = s 9857 v.AddArg(p) 9858 v.AddArg(w0) 9859 v.AddArg(mem) 9860 return true 9861 } 9862 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9863 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9864 // result: (MOVHBRstore [i-1] {s} p w mem) 9865 for { 9866 i := v.AuxInt 9867 s := v.Aux 9868 _ = v.Args[2] 9869 p := v.Args[0] 9870 v_1 := v.Args[1] 9871 if v_1.Op != OpS390XSRWconst { 9872 break 9873 } 9874 if v_1.AuxInt != 8 { 9875 break 9876 } 9877 w := v_1.Args[0] 9878 x := v.Args[2] 9879 if x.Op != OpS390XMOVBstore { 9880 break 9881 } 9882 if x.AuxInt != i-1 { 9883 break 9884 } 9885 if x.Aux != s { 9886 break 9887 } 9888 _ = x.Args[2] 9889 if p != x.Args[0] { 9890 break 9891 } 9892 if w != x.Args[1] { 9893 break 9894 } 9895 mem := x.Args[2] 9896 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9897 break 9898 } 9899 v.reset(OpS390XMOVHBRstore) 9900 v.AuxInt = i - 1 9901 v.Aux = s 9902 v.AddArg(p) 9903 v.AddArg(w) 9904 v.AddArg(mem) 9905 return true 9906 } 9907 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 9908 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9909 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9910 for { 9911 i := v.AuxInt 9912 s := v.Aux 9913 _ = v.Args[2] 9914 p := v.Args[0] 9915 v_1 := v.Args[1] 9916 if v_1.Op != OpS390XSRWconst { 9917 break 9918 } 9919 j := v_1.AuxInt 9920 w := v_1.Args[0] 9921 x := v.Args[2] 9922 if x.Op != OpS390XMOVBstore { 9923 break 9924 } 9925 if x.AuxInt != i-1 { 9926 break 9927 } 9928 if x.Aux != s { 9929 break 9930 } 9931 _ = x.Args[2] 9932 if p != x.Args[0] { 9933 break 9934 } 9935 w0 := x.Args[1] 9936 if w0.Op != OpS390XSRWconst { 9937 break 9938 } 9939 if w0.AuxInt != j-8 { 9940 break 9941 } 9942 if w != w0.Args[0] { 9943 break 9944 } 9945 mem := x.Args[2] 9946 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9947 break 9948 } 9949 v.reset(OpS390XMOVHBRstore) 9950 v.AuxInt = i - 1 9951 v.Aux = s 9952 v.AddArg(p) 9953 v.AddArg(w0) 9954 v.AddArg(mem) 9955 return true 9956 } 9957 return false 9958 } 9959 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 9960 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 9961 // cond: is20Bit(ValAndOff(sc).Off()+off) 9962 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 9963 for { 9964 sc := v.AuxInt 9965 s := v.Aux 9966 _ = v.Args[1] 9967 v_0 := v.Args[0] 9968 if v_0.Op != OpS390XADDconst { 9969 break 9970 } 9971 off := v_0.AuxInt 9972 ptr := v_0.Args[0] 9973 mem := v.Args[1] 9974 if !(is20Bit(ValAndOff(sc).Off() + off)) { 9975 break 9976 } 9977 v.reset(OpS390XMOVBstoreconst) 9978 v.AuxInt = ValAndOff(sc).add(off) 9979 v.Aux = s 9980 v.AddArg(ptr) 9981 v.AddArg(mem) 9982 return true 9983 } 9984 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 9985 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 9986 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 9987 for { 9988 sc := v.AuxInt 9989 sym1 := v.Aux 9990 _ = v.Args[1] 9991 v_0 := v.Args[0] 9992 if v_0.Op != OpS390XMOVDaddr { 9993 break 9994 } 9995 off := v_0.AuxInt 9996 sym2 := v_0.Aux 9997 ptr := v_0.Args[0] 9998 mem := v.Args[1] 9999 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 10000 break 10001 } 10002 v.reset(OpS390XMOVBstoreconst) 10003 v.AuxInt = ValAndOff(sc).add(off) 10004 v.Aux = mergeSym(sym1, sym2) 10005 v.AddArg(ptr) 10006 v.AddArg(mem) 10007 return true 10008 } 10009 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 10010 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 10011 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 10012 for { 10013 c := v.AuxInt 10014 s := v.Aux 10015 _ = v.Args[1] 10016 p := v.Args[0] 10017 x := v.Args[1] 10018 if x.Op != OpS390XMOVBstoreconst { 10019 break 10020 } 10021 a := x.AuxInt 10022 if x.Aux != s { 10023 break 10024 } 10025 _ = x.Args[1] 10026 if p != x.Args[0] { 10027 break 10028 } 10029 mem := x.Args[1] 10030 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 10031 break 10032 } 10033 v.reset(OpS390XMOVHstoreconst) 10034 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 10035 v.Aux = s 10036 v.AddArg(p) 10037 v.AddArg(mem) 10038 return true 10039 } 10040 return false 10041 } 10042 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 10043 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10044 // cond: 10045 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10046 for { 10047 c := v.AuxInt 10048 sym := v.Aux 10049 _ = v.Args[3] 10050 v_0 := v.Args[0] 10051 if v_0.Op != OpS390XADDconst { 10052 break 10053 } 10054 d := v_0.AuxInt 10055 ptr := v_0.Args[0] 10056 idx := v.Args[1] 10057 val := v.Args[2] 10058 mem := v.Args[3] 10059 v.reset(OpS390XMOVBstoreidx) 10060 v.AuxInt = c + d 10061 v.Aux = sym 10062 v.AddArg(ptr) 10063 v.AddArg(idx) 10064 v.AddArg(val) 10065 v.AddArg(mem) 10066 return true 10067 } 10068 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 10069 // cond: 10070 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10071 for { 10072 c := v.AuxInt 10073 sym := v.Aux 10074 _ = v.Args[3] 10075 idx := v.Args[0] 10076 v_1 := v.Args[1] 10077 if v_1.Op != OpS390XADDconst { 10078 break 10079 } 10080 d := v_1.AuxInt 10081 ptr := v_1.Args[0] 10082 val := v.Args[2] 10083 mem := v.Args[3] 10084 v.reset(OpS390XMOVBstoreidx) 10085 v.AuxInt = c + d 10086 v.Aux = sym 10087 v.AddArg(ptr) 10088 v.AddArg(idx) 10089 v.AddArg(val) 10090 v.AddArg(mem) 10091 return true 10092 } 10093 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10094 // cond: 10095 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10096 for { 10097 c := v.AuxInt 10098 sym := v.Aux 10099 _ = v.Args[3] 10100 ptr := v.Args[0] 10101 v_1 := v.Args[1] 10102 if v_1.Op != OpS390XADDconst { 10103 break 10104 } 10105 d := v_1.AuxInt 10106 idx := v_1.Args[0] 10107 val := v.Args[2] 10108 mem := v.Args[3] 10109 v.reset(OpS390XMOVBstoreidx) 10110 v.AuxInt = c + d 10111 v.Aux = sym 10112 v.AddArg(ptr) 10113 v.AddArg(idx) 10114 v.AddArg(val) 10115 v.AddArg(mem) 10116 return true 10117 } 10118 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 10119 // cond: 10120 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10121 for { 10122 c := v.AuxInt 10123 sym := v.Aux 10124 _ = v.Args[3] 10125 v_0 := v.Args[0] 10126 if v_0.Op != OpS390XADDconst { 10127 break 10128 } 10129 d := v_0.AuxInt 10130 idx := v_0.Args[0] 10131 ptr := v.Args[1] 10132 val := v.Args[2] 10133 mem := v.Args[3] 10134 v.reset(OpS390XMOVBstoreidx) 10135 v.AuxInt = c + d 10136 v.Aux = sym 10137 v.AddArg(ptr) 10138 v.AddArg(idx) 10139 v.AddArg(val) 10140 v.AddArg(mem) 10141 return true 10142 } 10143 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10144 // cond: x.Uses == 1 && clobber(x) 10145 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10146 for { 10147 i := v.AuxInt 10148 s := v.Aux 10149 _ = v.Args[3] 10150 p := v.Args[0] 10151 idx := v.Args[1] 10152 w := v.Args[2] 10153 x := v.Args[3] 10154 if x.Op != OpS390XMOVBstoreidx { 10155 break 10156 } 10157 if x.AuxInt != i-1 { 10158 break 10159 } 10160 if x.Aux != s { 10161 break 10162 } 10163 _ = x.Args[3] 10164 if p != x.Args[0] { 10165 break 10166 } 10167 if idx != x.Args[1] { 10168 break 10169 } 10170 x_2 := x.Args[2] 10171 if x_2.Op != OpS390XSRDconst { 10172 break 10173 } 10174 if x_2.AuxInt != 8 { 10175 break 10176 } 10177 if w != x_2.Args[0] { 10178 break 10179 } 10180 mem := x.Args[3] 10181 if !(x.Uses == 1 && clobber(x)) { 10182 break 10183 } 10184 v.reset(OpS390XMOVHstoreidx) 10185 v.AuxInt = i - 1 10186 v.Aux = s 10187 v.AddArg(p) 10188 v.AddArg(idx) 10189 v.AddArg(w) 10190 v.AddArg(mem) 10191 return true 10192 } 10193 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10194 // cond: x.Uses == 1 && clobber(x) 10195 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10196 for { 10197 i := v.AuxInt 10198 s := v.Aux 10199 _ = v.Args[3] 10200 p := v.Args[0] 10201 idx := v.Args[1] 10202 w := v.Args[2] 10203 x := v.Args[3] 10204 if x.Op != OpS390XMOVBstoreidx { 10205 break 10206 } 10207 if x.AuxInt != i-1 { 10208 break 10209 } 10210 if x.Aux != s { 10211 break 10212 } 10213 _ = x.Args[3] 10214 if idx != x.Args[0] { 10215 break 10216 } 10217 if p != x.Args[1] { 10218 break 10219 } 10220 x_2 := x.Args[2] 10221 if x_2.Op != OpS390XSRDconst { 10222 break 10223 } 10224 if x_2.AuxInt != 8 { 10225 break 10226 } 10227 if w != x_2.Args[0] { 10228 break 10229 } 10230 mem := x.Args[3] 10231 if !(x.Uses == 1 && clobber(x)) { 10232 break 10233 } 10234 v.reset(OpS390XMOVHstoreidx) 10235 v.AuxInt = i - 1 10236 v.Aux = s 10237 v.AddArg(p) 10238 v.AddArg(idx) 10239 v.AddArg(w) 10240 v.AddArg(mem) 10241 return true 10242 } 10243 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10244 // cond: x.Uses == 1 && clobber(x) 10245 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10246 for { 10247 i := v.AuxInt 10248 s := v.Aux 10249 _ = v.Args[3] 10250 idx := v.Args[0] 10251 p := v.Args[1] 10252 w := v.Args[2] 10253 x := v.Args[3] 10254 if x.Op != OpS390XMOVBstoreidx { 10255 break 10256 } 10257 if x.AuxInt != i-1 { 10258 break 10259 } 10260 if x.Aux != s { 10261 break 10262 } 10263 _ = x.Args[3] 10264 if p != x.Args[0] { 10265 break 10266 } 10267 if idx != x.Args[1] { 10268 break 10269 } 10270 x_2 := x.Args[2] 10271 if x_2.Op != OpS390XSRDconst { 10272 break 10273 } 10274 if x_2.AuxInt != 8 { 10275 break 10276 } 10277 if w != x_2.Args[0] { 10278 break 10279 } 10280 mem := x.Args[3] 10281 if !(x.Uses == 1 && clobber(x)) { 10282 break 10283 } 10284 v.reset(OpS390XMOVHstoreidx) 10285 v.AuxInt = i - 1 10286 v.Aux = s 10287 v.AddArg(p) 10288 v.AddArg(idx) 10289 v.AddArg(w) 10290 v.AddArg(mem) 10291 return true 10292 } 10293 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10294 // cond: x.Uses == 1 && clobber(x) 10295 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10296 for { 10297 i := v.AuxInt 10298 s := v.Aux 10299 _ = v.Args[3] 10300 idx := v.Args[0] 10301 p := v.Args[1] 10302 w := v.Args[2] 10303 x := v.Args[3] 10304 if x.Op != OpS390XMOVBstoreidx { 10305 break 10306 } 10307 if x.AuxInt != i-1 { 10308 break 10309 } 10310 if x.Aux != s { 10311 break 10312 } 10313 _ = x.Args[3] 10314 if idx != x.Args[0] { 10315 break 10316 } 10317 if p != x.Args[1] { 10318 break 10319 } 10320 x_2 := x.Args[2] 10321 if x_2.Op != OpS390XSRDconst { 10322 break 10323 } 10324 if x_2.AuxInt != 8 { 10325 break 10326 } 10327 if w != x_2.Args[0] { 10328 break 10329 } 10330 mem := x.Args[3] 10331 if !(x.Uses == 1 && clobber(x)) { 10332 break 10333 } 10334 v.reset(OpS390XMOVHstoreidx) 10335 v.AuxInt = i - 1 10336 v.Aux = s 10337 v.AddArg(p) 10338 v.AddArg(idx) 10339 v.AddArg(w) 10340 v.AddArg(mem) 10341 return true 10342 } 10343 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10344 // cond: x.Uses == 1 && clobber(x) 10345 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10346 for { 10347 i := v.AuxInt 10348 s := v.Aux 10349 _ = v.Args[3] 10350 p := v.Args[0] 10351 idx := v.Args[1] 10352 w0 := v.Args[2] 10353 if w0.Op != OpS390XSRDconst { 10354 break 10355 } 10356 j := w0.AuxInt 10357 w := w0.Args[0] 10358 x := v.Args[3] 10359 if x.Op != OpS390XMOVBstoreidx { 10360 break 10361 } 10362 if x.AuxInt != i-1 { 10363 break 10364 } 10365 if x.Aux != s { 10366 break 10367 } 10368 _ = x.Args[3] 10369 if p != x.Args[0] { 10370 break 10371 } 10372 if idx != x.Args[1] { 10373 break 10374 } 10375 x_2 := x.Args[2] 10376 if x_2.Op != OpS390XSRDconst { 10377 break 10378 } 10379 if x_2.AuxInt != j+8 { 10380 break 10381 } 10382 if w != x_2.Args[0] { 10383 break 10384 } 10385 mem := x.Args[3] 10386 if !(x.Uses == 1 && clobber(x)) { 10387 break 10388 } 10389 v.reset(OpS390XMOVHstoreidx) 10390 v.AuxInt = i - 1 10391 v.Aux = s 10392 v.AddArg(p) 10393 v.AddArg(idx) 10394 v.AddArg(w0) 10395 v.AddArg(mem) 10396 return true 10397 } 10398 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10399 // cond: x.Uses == 1 && clobber(x) 10400 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10401 for { 10402 i := v.AuxInt 10403 s := v.Aux 10404 _ = v.Args[3] 10405 p := v.Args[0] 10406 idx := v.Args[1] 10407 w0 := v.Args[2] 10408 if w0.Op != OpS390XSRDconst { 10409 break 10410 } 10411 j := w0.AuxInt 10412 w := w0.Args[0] 10413 x := v.Args[3] 10414 if x.Op != OpS390XMOVBstoreidx { 10415 break 10416 } 10417 if x.AuxInt != i-1 { 10418 break 10419 } 10420 if x.Aux != s { 10421 break 10422 } 10423 _ = x.Args[3] 10424 if idx != x.Args[0] { 10425 break 10426 } 10427 if p != x.Args[1] { 10428 break 10429 } 10430 x_2 := x.Args[2] 10431 if x_2.Op != OpS390XSRDconst { 10432 break 10433 } 10434 if x_2.AuxInt != j+8 { 10435 break 10436 } 10437 if w != x_2.Args[0] { 10438 break 10439 } 10440 mem := x.Args[3] 10441 if !(x.Uses == 1 && clobber(x)) { 10442 break 10443 } 10444 v.reset(OpS390XMOVHstoreidx) 10445 v.AuxInt = i - 1 10446 v.Aux = s 10447 v.AddArg(p) 10448 v.AddArg(idx) 10449 v.AddArg(w0) 10450 v.AddArg(mem) 10451 return true 10452 } 10453 return false 10454 } 10455 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 10456 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10457 // cond: x.Uses == 1 && clobber(x) 10458 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10459 for { 10460 i := v.AuxInt 10461 s := v.Aux 10462 _ = v.Args[3] 10463 idx := v.Args[0] 10464 p := v.Args[1] 10465 w0 := v.Args[2] 10466 if w0.Op != OpS390XSRDconst { 10467 break 10468 } 10469 j := w0.AuxInt 10470 w := w0.Args[0] 10471 x := v.Args[3] 10472 if x.Op != OpS390XMOVBstoreidx { 10473 break 10474 } 10475 if x.AuxInt != i-1 { 10476 break 10477 } 10478 if x.Aux != s { 10479 break 10480 } 10481 _ = x.Args[3] 10482 if p != x.Args[0] { 10483 break 10484 } 10485 if idx != x.Args[1] { 10486 break 10487 } 10488 x_2 := x.Args[2] 10489 if x_2.Op != OpS390XSRDconst { 10490 break 10491 } 10492 if x_2.AuxInt != j+8 { 10493 break 10494 } 10495 if w != x_2.Args[0] { 10496 break 10497 } 10498 mem := x.Args[3] 10499 if !(x.Uses == 1 && clobber(x)) { 10500 break 10501 } 10502 v.reset(OpS390XMOVHstoreidx) 10503 v.AuxInt = i - 1 10504 v.Aux = s 10505 v.AddArg(p) 10506 v.AddArg(idx) 10507 v.AddArg(w0) 10508 v.AddArg(mem) 10509 return true 10510 } 10511 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10512 // cond: x.Uses == 1 && clobber(x) 10513 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10514 for { 10515 i := v.AuxInt 10516 s := v.Aux 10517 _ = v.Args[3] 10518 idx := v.Args[0] 10519 p := v.Args[1] 10520 w0 := v.Args[2] 10521 if w0.Op != OpS390XSRDconst { 10522 break 10523 } 10524 j := w0.AuxInt 10525 w := w0.Args[0] 10526 x := v.Args[3] 10527 if x.Op != OpS390XMOVBstoreidx { 10528 break 10529 } 10530 if x.AuxInt != i-1 { 10531 break 10532 } 10533 if x.Aux != s { 10534 break 10535 } 10536 _ = x.Args[3] 10537 if idx != x.Args[0] { 10538 break 10539 } 10540 if p != x.Args[1] { 10541 break 10542 } 10543 x_2 := x.Args[2] 10544 if x_2.Op != OpS390XSRDconst { 10545 break 10546 } 10547 if x_2.AuxInt != j+8 { 10548 break 10549 } 10550 if w != x_2.Args[0] { 10551 break 10552 } 10553 mem := x.Args[3] 10554 if !(x.Uses == 1 && clobber(x)) { 10555 break 10556 } 10557 v.reset(OpS390XMOVHstoreidx) 10558 v.AuxInt = i - 1 10559 v.Aux = s 10560 v.AddArg(p) 10561 v.AddArg(idx) 10562 v.AddArg(w0) 10563 v.AddArg(mem) 10564 return true 10565 } 10566 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10567 // cond: x.Uses == 1 && clobber(x) 10568 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10569 for { 10570 i := v.AuxInt 10571 s := v.Aux 10572 _ = v.Args[3] 10573 p := v.Args[0] 10574 idx := v.Args[1] 10575 w := v.Args[2] 10576 x := v.Args[3] 10577 if x.Op != OpS390XMOVBstoreidx { 10578 break 10579 } 10580 if x.AuxInt != i-1 { 10581 break 10582 } 10583 if x.Aux != s { 10584 break 10585 } 10586 _ = x.Args[3] 10587 if p != x.Args[0] { 10588 break 10589 } 10590 if idx != x.Args[1] { 10591 break 10592 } 10593 x_2 := x.Args[2] 10594 if x_2.Op != OpS390XSRWconst { 10595 break 10596 } 10597 if x_2.AuxInt != 8 { 10598 break 10599 } 10600 if w != x_2.Args[0] { 10601 break 10602 } 10603 mem := x.Args[3] 10604 if !(x.Uses == 1 && clobber(x)) { 10605 break 10606 } 10607 v.reset(OpS390XMOVHstoreidx) 10608 v.AuxInt = i - 1 10609 v.Aux = s 10610 v.AddArg(p) 10611 v.AddArg(idx) 10612 v.AddArg(w) 10613 v.AddArg(mem) 10614 return true 10615 } 10616 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10617 // cond: x.Uses == 1 && clobber(x) 10618 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10619 for { 10620 i := v.AuxInt 10621 s := v.Aux 10622 _ = v.Args[3] 10623 p := v.Args[0] 10624 idx := v.Args[1] 10625 w := v.Args[2] 10626 x := v.Args[3] 10627 if x.Op != OpS390XMOVBstoreidx { 10628 break 10629 } 10630 if x.AuxInt != i-1 { 10631 break 10632 } 10633 if x.Aux != s { 10634 break 10635 } 10636 _ = x.Args[3] 10637 if idx != x.Args[0] { 10638 break 10639 } 10640 if p != x.Args[1] { 10641 break 10642 } 10643 x_2 := x.Args[2] 10644 if x_2.Op != OpS390XSRWconst { 10645 break 10646 } 10647 if x_2.AuxInt != 8 { 10648 break 10649 } 10650 if w != x_2.Args[0] { 10651 break 10652 } 10653 mem := x.Args[3] 10654 if !(x.Uses == 1 && clobber(x)) { 10655 break 10656 } 10657 v.reset(OpS390XMOVHstoreidx) 10658 v.AuxInt = i - 1 10659 v.Aux = s 10660 v.AddArg(p) 10661 v.AddArg(idx) 10662 v.AddArg(w) 10663 v.AddArg(mem) 10664 return true 10665 } 10666 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10667 // cond: x.Uses == 1 && clobber(x) 10668 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10669 for { 10670 i := v.AuxInt 10671 s := v.Aux 10672 _ = v.Args[3] 10673 idx := v.Args[0] 10674 p := v.Args[1] 10675 w := v.Args[2] 10676 x := v.Args[3] 10677 if x.Op != OpS390XMOVBstoreidx { 10678 break 10679 } 10680 if x.AuxInt != i-1 { 10681 break 10682 } 10683 if x.Aux != s { 10684 break 10685 } 10686 _ = x.Args[3] 10687 if p != x.Args[0] { 10688 break 10689 } 10690 if idx != x.Args[1] { 10691 break 10692 } 10693 x_2 := x.Args[2] 10694 if x_2.Op != OpS390XSRWconst { 10695 break 10696 } 10697 if x_2.AuxInt != 8 { 10698 break 10699 } 10700 if w != x_2.Args[0] { 10701 break 10702 } 10703 mem := x.Args[3] 10704 if !(x.Uses == 1 && clobber(x)) { 10705 break 10706 } 10707 v.reset(OpS390XMOVHstoreidx) 10708 v.AuxInt = i - 1 10709 v.Aux = s 10710 v.AddArg(p) 10711 v.AddArg(idx) 10712 v.AddArg(w) 10713 v.AddArg(mem) 10714 return true 10715 } 10716 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10717 // cond: x.Uses == 1 && clobber(x) 10718 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10719 for { 10720 i := v.AuxInt 10721 s := v.Aux 10722 _ = v.Args[3] 10723 idx := v.Args[0] 10724 p := v.Args[1] 10725 w := v.Args[2] 10726 x := v.Args[3] 10727 if x.Op != OpS390XMOVBstoreidx { 10728 break 10729 } 10730 if x.AuxInt != i-1 { 10731 break 10732 } 10733 if x.Aux != s { 10734 break 10735 } 10736 _ = x.Args[3] 10737 if idx != x.Args[0] { 10738 break 10739 } 10740 if p != x.Args[1] { 10741 break 10742 } 10743 x_2 := x.Args[2] 10744 if x_2.Op != OpS390XSRWconst { 10745 break 10746 } 10747 if x_2.AuxInt != 8 { 10748 break 10749 } 10750 if w != x_2.Args[0] { 10751 break 10752 } 10753 mem := x.Args[3] 10754 if !(x.Uses == 1 && clobber(x)) { 10755 break 10756 } 10757 v.reset(OpS390XMOVHstoreidx) 10758 v.AuxInt = i - 1 10759 v.Aux = s 10760 v.AddArg(p) 10761 v.AddArg(idx) 10762 v.AddArg(w) 10763 v.AddArg(mem) 10764 return true 10765 } 10766 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10767 // cond: x.Uses == 1 && clobber(x) 10768 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10769 for { 10770 i := v.AuxInt 10771 s := v.Aux 10772 _ = v.Args[3] 10773 p := v.Args[0] 10774 idx := v.Args[1] 10775 w0 := v.Args[2] 10776 if w0.Op != OpS390XSRWconst { 10777 break 10778 } 10779 j := w0.AuxInt 10780 w := w0.Args[0] 10781 x := v.Args[3] 10782 if x.Op != OpS390XMOVBstoreidx { 10783 break 10784 } 10785 if x.AuxInt != i-1 { 10786 break 10787 } 10788 if x.Aux != s { 10789 break 10790 } 10791 _ = x.Args[3] 10792 if p != x.Args[0] { 10793 break 10794 } 10795 if idx != x.Args[1] { 10796 break 10797 } 10798 x_2 := x.Args[2] 10799 if x_2.Op != OpS390XSRWconst { 10800 break 10801 } 10802 if x_2.AuxInt != j+8 { 10803 break 10804 } 10805 if w != x_2.Args[0] { 10806 break 10807 } 10808 mem := x.Args[3] 10809 if !(x.Uses == 1 && clobber(x)) { 10810 break 10811 } 10812 v.reset(OpS390XMOVHstoreidx) 10813 v.AuxInt = i - 1 10814 v.Aux = s 10815 v.AddArg(p) 10816 v.AddArg(idx) 10817 v.AddArg(w0) 10818 v.AddArg(mem) 10819 return true 10820 } 10821 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10822 // cond: x.Uses == 1 && clobber(x) 10823 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10824 for { 10825 i := v.AuxInt 10826 s := v.Aux 10827 _ = v.Args[3] 10828 p := v.Args[0] 10829 idx := v.Args[1] 10830 w0 := v.Args[2] 10831 if w0.Op != OpS390XSRWconst { 10832 break 10833 } 10834 j := w0.AuxInt 10835 w := w0.Args[0] 10836 x := v.Args[3] 10837 if x.Op != OpS390XMOVBstoreidx { 10838 break 10839 } 10840 if x.AuxInt != i-1 { 10841 break 10842 } 10843 if x.Aux != s { 10844 break 10845 } 10846 _ = x.Args[3] 10847 if idx != x.Args[0] { 10848 break 10849 } 10850 if p != x.Args[1] { 10851 break 10852 } 10853 x_2 := x.Args[2] 10854 if x_2.Op != OpS390XSRWconst { 10855 break 10856 } 10857 if x_2.AuxInt != j+8 { 10858 break 10859 } 10860 if w != x_2.Args[0] { 10861 break 10862 } 10863 mem := x.Args[3] 10864 if !(x.Uses == 1 && clobber(x)) { 10865 break 10866 } 10867 v.reset(OpS390XMOVHstoreidx) 10868 v.AuxInt = i - 1 10869 v.Aux = s 10870 v.AddArg(p) 10871 v.AddArg(idx) 10872 v.AddArg(w0) 10873 v.AddArg(mem) 10874 return true 10875 } 10876 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10877 // cond: x.Uses == 1 && clobber(x) 10878 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10879 for { 10880 i := v.AuxInt 10881 s := v.Aux 10882 _ = v.Args[3] 10883 idx := v.Args[0] 10884 p := v.Args[1] 10885 w0 := v.Args[2] 10886 if w0.Op != OpS390XSRWconst { 10887 break 10888 } 10889 j := w0.AuxInt 10890 w := w0.Args[0] 10891 x := v.Args[3] 10892 if x.Op != OpS390XMOVBstoreidx { 10893 break 10894 } 10895 if x.AuxInt != i-1 { 10896 break 10897 } 10898 if x.Aux != s { 10899 break 10900 } 10901 _ = x.Args[3] 10902 if p != x.Args[0] { 10903 break 10904 } 10905 if idx != x.Args[1] { 10906 break 10907 } 10908 x_2 := x.Args[2] 10909 if x_2.Op != OpS390XSRWconst { 10910 break 10911 } 10912 if x_2.AuxInt != j+8 { 10913 break 10914 } 10915 if w != x_2.Args[0] { 10916 break 10917 } 10918 mem := x.Args[3] 10919 if !(x.Uses == 1 && clobber(x)) { 10920 break 10921 } 10922 v.reset(OpS390XMOVHstoreidx) 10923 v.AuxInt = i - 1 10924 v.Aux = s 10925 v.AddArg(p) 10926 v.AddArg(idx) 10927 v.AddArg(w0) 10928 v.AddArg(mem) 10929 return true 10930 } 10931 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10932 // cond: x.Uses == 1 && clobber(x) 10933 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10934 for { 10935 i := v.AuxInt 10936 s := v.Aux 10937 _ = v.Args[3] 10938 idx := v.Args[0] 10939 p := v.Args[1] 10940 w0 := v.Args[2] 10941 if w0.Op != OpS390XSRWconst { 10942 break 10943 } 10944 j := w0.AuxInt 10945 w := w0.Args[0] 10946 x := v.Args[3] 10947 if x.Op != OpS390XMOVBstoreidx { 10948 break 10949 } 10950 if x.AuxInt != i-1 { 10951 break 10952 } 10953 if x.Aux != s { 10954 break 10955 } 10956 _ = x.Args[3] 10957 if idx != x.Args[0] { 10958 break 10959 } 10960 if p != x.Args[1] { 10961 break 10962 } 10963 x_2 := x.Args[2] 10964 if x_2.Op != OpS390XSRWconst { 10965 break 10966 } 10967 if x_2.AuxInt != j+8 { 10968 break 10969 } 10970 if w != x_2.Args[0] { 10971 break 10972 } 10973 mem := x.Args[3] 10974 if !(x.Uses == 1 && clobber(x)) { 10975 break 10976 } 10977 v.reset(OpS390XMOVHstoreidx) 10978 v.AuxInt = i - 1 10979 v.Aux = s 10980 v.AddArg(p) 10981 v.AddArg(idx) 10982 v.AddArg(w0) 10983 v.AddArg(mem) 10984 return true 10985 } 10986 return false 10987 } 10988 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 10989 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10990 // cond: x.Uses == 1 && clobber(x) 10991 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10992 for { 10993 i := v.AuxInt 10994 s := v.Aux 10995 _ = v.Args[3] 10996 p := v.Args[0] 10997 idx := v.Args[1] 10998 v_2 := v.Args[2] 10999 if v_2.Op != OpS390XSRDconst { 11000 break 11001 } 11002 if v_2.AuxInt != 8 { 11003 break 11004 } 11005 w := v_2.Args[0] 11006 x := v.Args[3] 11007 if x.Op != OpS390XMOVBstoreidx { 11008 break 11009 } 11010 if x.AuxInt != i-1 { 11011 break 11012 } 11013 if x.Aux != s { 11014 break 11015 } 11016 _ = x.Args[3] 11017 if p != x.Args[0] { 11018 break 11019 } 11020 if idx != x.Args[1] { 11021 break 11022 } 11023 if w != x.Args[2] { 11024 break 11025 } 11026 mem := x.Args[3] 11027 if !(x.Uses == 1 && clobber(x)) { 11028 break 11029 } 11030 v.reset(OpS390XMOVHBRstoreidx) 11031 v.AuxInt = i - 1 11032 v.Aux = s 11033 v.AddArg(p) 11034 v.AddArg(idx) 11035 v.AddArg(w) 11036 v.AddArg(mem) 11037 return true 11038 } 11039 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11040 // cond: x.Uses == 1 && clobber(x) 11041 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11042 for { 11043 i := v.AuxInt 11044 s := v.Aux 11045 _ = v.Args[3] 11046 p := v.Args[0] 11047 idx := v.Args[1] 11048 v_2 := v.Args[2] 11049 if v_2.Op != OpS390XSRDconst { 11050 break 11051 } 11052 if v_2.AuxInt != 8 { 11053 break 11054 } 11055 w := v_2.Args[0] 11056 x := v.Args[3] 11057 if x.Op != OpS390XMOVBstoreidx { 11058 break 11059 } 11060 if x.AuxInt != i-1 { 11061 break 11062 } 11063 if x.Aux != s { 11064 break 11065 } 11066 _ = x.Args[3] 11067 if idx != x.Args[0] { 11068 break 11069 } 11070 if p != x.Args[1] { 11071 break 11072 } 11073 if w != x.Args[2] { 11074 break 11075 } 11076 mem := x.Args[3] 11077 if !(x.Uses == 1 && clobber(x)) { 11078 break 11079 } 11080 v.reset(OpS390XMOVHBRstoreidx) 11081 v.AuxInt = i - 1 11082 v.Aux = s 11083 v.AddArg(p) 11084 v.AddArg(idx) 11085 v.AddArg(w) 11086 v.AddArg(mem) 11087 return true 11088 } 11089 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11090 // cond: x.Uses == 1 && clobber(x) 11091 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11092 for { 11093 i := v.AuxInt 11094 s := v.Aux 11095 _ = v.Args[3] 11096 idx := v.Args[0] 11097 p := v.Args[1] 11098 v_2 := v.Args[2] 11099 if v_2.Op != OpS390XSRDconst { 11100 break 11101 } 11102 if v_2.AuxInt != 8 { 11103 break 11104 } 11105 w := v_2.Args[0] 11106 x := v.Args[3] 11107 if x.Op != OpS390XMOVBstoreidx { 11108 break 11109 } 11110 if x.AuxInt != i-1 { 11111 break 11112 } 11113 if x.Aux != s { 11114 break 11115 } 11116 _ = x.Args[3] 11117 if p != x.Args[0] { 11118 break 11119 } 11120 if idx != x.Args[1] { 11121 break 11122 } 11123 if w != x.Args[2] { 11124 break 11125 } 11126 mem := x.Args[3] 11127 if !(x.Uses == 1 && clobber(x)) { 11128 break 11129 } 11130 v.reset(OpS390XMOVHBRstoreidx) 11131 v.AuxInt = i - 1 11132 v.Aux = s 11133 v.AddArg(p) 11134 v.AddArg(idx) 11135 v.AddArg(w) 11136 v.AddArg(mem) 11137 return true 11138 } 11139 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11140 // cond: x.Uses == 1 && clobber(x) 11141 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11142 for { 11143 i := v.AuxInt 11144 s := v.Aux 11145 _ = v.Args[3] 11146 idx := v.Args[0] 11147 p := v.Args[1] 11148 v_2 := v.Args[2] 11149 if v_2.Op != OpS390XSRDconst { 11150 break 11151 } 11152 if v_2.AuxInt != 8 { 11153 break 11154 } 11155 w := v_2.Args[0] 11156 x := v.Args[3] 11157 if x.Op != OpS390XMOVBstoreidx { 11158 break 11159 } 11160 if x.AuxInt != i-1 { 11161 break 11162 } 11163 if x.Aux != s { 11164 break 11165 } 11166 _ = x.Args[3] 11167 if idx != x.Args[0] { 11168 break 11169 } 11170 if p != x.Args[1] { 11171 break 11172 } 11173 if w != x.Args[2] { 11174 break 11175 } 11176 mem := x.Args[3] 11177 if !(x.Uses == 1 && clobber(x)) { 11178 break 11179 } 11180 v.reset(OpS390XMOVHBRstoreidx) 11181 v.AuxInt = i - 1 11182 v.Aux = s 11183 v.AddArg(p) 11184 v.AddArg(idx) 11185 v.AddArg(w) 11186 v.AddArg(mem) 11187 return true 11188 } 11189 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 11190 // cond: x.Uses == 1 && clobber(x) 11191 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11192 for { 11193 i := v.AuxInt 11194 s := v.Aux 11195 _ = v.Args[3] 11196 p := v.Args[0] 11197 idx := v.Args[1] 11198 v_2 := v.Args[2] 11199 if v_2.Op != OpS390XSRDconst { 11200 break 11201 } 11202 j := v_2.AuxInt 11203 w := v_2.Args[0] 11204 x := v.Args[3] 11205 if x.Op != OpS390XMOVBstoreidx { 11206 break 11207 } 11208 if x.AuxInt != i-1 { 11209 break 11210 } 11211 if x.Aux != s { 11212 break 11213 } 11214 _ = x.Args[3] 11215 if p != x.Args[0] { 11216 break 11217 } 11218 if idx != x.Args[1] { 11219 break 11220 } 11221 w0 := x.Args[2] 11222 if w0.Op != OpS390XSRDconst { 11223 break 11224 } 11225 if w0.AuxInt != j-8 { 11226 break 11227 } 11228 if w != w0.Args[0] { 11229 break 11230 } 11231 mem := x.Args[3] 11232 if !(x.Uses == 1 && clobber(x)) { 11233 break 11234 } 11235 v.reset(OpS390XMOVHBRstoreidx) 11236 v.AuxInt = i - 1 11237 v.Aux = s 11238 v.AddArg(p) 11239 v.AddArg(idx) 11240 v.AddArg(w0) 11241 v.AddArg(mem) 11242 return true 11243 } 11244 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 11245 // cond: x.Uses == 1 && clobber(x) 11246 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11247 for { 11248 i := v.AuxInt 11249 s := v.Aux 11250 _ = v.Args[3] 11251 p := v.Args[0] 11252 idx := v.Args[1] 11253 v_2 := v.Args[2] 11254 if v_2.Op != OpS390XSRDconst { 11255 break 11256 } 11257 j := v_2.AuxInt 11258 w := v_2.Args[0] 11259 x := v.Args[3] 11260 if x.Op != OpS390XMOVBstoreidx { 11261 break 11262 } 11263 if x.AuxInt != i-1 { 11264 break 11265 } 11266 if x.Aux != s { 11267 break 11268 } 11269 _ = x.Args[3] 11270 if idx != x.Args[0] { 11271 break 11272 } 11273 if p != x.Args[1] { 11274 break 11275 } 11276 w0 := x.Args[2] 11277 if w0.Op != OpS390XSRDconst { 11278 break 11279 } 11280 if w0.AuxInt != j-8 { 11281 break 11282 } 11283 if w != w0.Args[0] { 11284 break 11285 } 11286 mem := x.Args[3] 11287 if !(x.Uses == 1 && clobber(x)) { 11288 break 11289 } 11290 v.reset(OpS390XMOVHBRstoreidx) 11291 v.AuxInt = i - 1 11292 v.Aux = s 11293 v.AddArg(p) 11294 v.AddArg(idx) 11295 v.AddArg(w0) 11296 v.AddArg(mem) 11297 return true 11298 } 11299 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 11300 // cond: x.Uses == 1 && clobber(x) 11301 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11302 for { 11303 i := v.AuxInt 11304 s := v.Aux 11305 _ = v.Args[3] 11306 idx := v.Args[0] 11307 p := v.Args[1] 11308 v_2 := v.Args[2] 11309 if v_2.Op != OpS390XSRDconst { 11310 break 11311 } 11312 j := v_2.AuxInt 11313 w := v_2.Args[0] 11314 x := v.Args[3] 11315 if x.Op != OpS390XMOVBstoreidx { 11316 break 11317 } 11318 if x.AuxInt != i-1 { 11319 break 11320 } 11321 if x.Aux != s { 11322 break 11323 } 11324 _ = x.Args[3] 11325 if p != x.Args[0] { 11326 break 11327 } 11328 if idx != x.Args[1] { 11329 break 11330 } 11331 w0 := x.Args[2] 11332 if w0.Op != OpS390XSRDconst { 11333 break 11334 } 11335 if w0.AuxInt != j-8 { 11336 break 11337 } 11338 if w != w0.Args[0] { 11339 break 11340 } 11341 mem := x.Args[3] 11342 if !(x.Uses == 1 && clobber(x)) { 11343 break 11344 } 11345 v.reset(OpS390XMOVHBRstoreidx) 11346 v.AuxInt = i - 1 11347 v.Aux = s 11348 v.AddArg(p) 11349 v.AddArg(idx) 11350 v.AddArg(w0) 11351 v.AddArg(mem) 11352 return true 11353 } 11354 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 11355 // cond: x.Uses == 1 && clobber(x) 11356 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11357 for { 11358 i := v.AuxInt 11359 s := v.Aux 11360 _ = v.Args[3] 11361 idx := v.Args[0] 11362 p := v.Args[1] 11363 v_2 := v.Args[2] 11364 if v_2.Op != OpS390XSRDconst { 11365 break 11366 } 11367 j := v_2.AuxInt 11368 w := v_2.Args[0] 11369 x := v.Args[3] 11370 if x.Op != OpS390XMOVBstoreidx { 11371 break 11372 } 11373 if x.AuxInt != i-1 { 11374 break 11375 } 11376 if x.Aux != s { 11377 break 11378 } 11379 _ = x.Args[3] 11380 if idx != x.Args[0] { 11381 break 11382 } 11383 if p != x.Args[1] { 11384 break 11385 } 11386 w0 := x.Args[2] 11387 if w0.Op != OpS390XSRDconst { 11388 break 11389 } 11390 if w0.AuxInt != j-8 { 11391 break 11392 } 11393 if w != w0.Args[0] { 11394 break 11395 } 11396 mem := x.Args[3] 11397 if !(x.Uses == 1 && clobber(x)) { 11398 break 11399 } 11400 v.reset(OpS390XMOVHBRstoreidx) 11401 v.AuxInt = i - 1 11402 v.Aux = s 11403 v.AddArg(p) 11404 v.AddArg(idx) 11405 v.AddArg(w0) 11406 v.AddArg(mem) 11407 return true 11408 } 11409 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11410 // cond: x.Uses == 1 && clobber(x) 11411 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11412 for { 11413 i := v.AuxInt 11414 s := v.Aux 11415 _ = v.Args[3] 11416 p := v.Args[0] 11417 idx := v.Args[1] 11418 v_2 := v.Args[2] 11419 if v_2.Op != OpS390XSRWconst { 11420 break 11421 } 11422 if v_2.AuxInt != 8 { 11423 break 11424 } 11425 w := v_2.Args[0] 11426 x := v.Args[3] 11427 if x.Op != OpS390XMOVBstoreidx { 11428 break 11429 } 11430 if x.AuxInt != i-1 { 11431 break 11432 } 11433 if x.Aux != s { 11434 break 11435 } 11436 _ = x.Args[3] 11437 if p != x.Args[0] { 11438 break 11439 } 11440 if idx != x.Args[1] { 11441 break 11442 } 11443 if w != x.Args[2] { 11444 break 11445 } 11446 mem := x.Args[3] 11447 if !(x.Uses == 1 && clobber(x)) { 11448 break 11449 } 11450 v.reset(OpS390XMOVHBRstoreidx) 11451 v.AuxInt = i - 1 11452 v.Aux = s 11453 v.AddArg(p) 11454 v.AddArg(idx) 11455 v.AddArg(w) 11456 v.AddArg(mem) 11457 return true 11458 } 11459 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11460 // cond: x.Uses == 1 && clobber(x) 11461 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11462 for { 11463 i := v.AuxInt 11464 s := v.Aux 11465 _ = v.Args[3] 11466 p := v.Args[0] 11467 idx := v.Args[1] 11468 v_2 := v.Args[2] 11469 if v_2.Op != OpS390XSRWconst { 11470 break 11471 } 11472 if v_2.AuxInt != 8 { 11473 break 11474 } 11475 w := v_2.Args[0] 11476 x := v.Args[3] 11477 if x.Op != OpS390XMOVBstoreidx { 11478 break 11479 } 11480 if x.AuxInt != i-1 { 11481 break 11482 } 11483 if x.Aux != s { 11484 break 11485 } 11486 _ = x.Args[3] 11487 if idx != x.Args[0] { 11488 break 11489 } 11490 if p != x.Args[1] { 11491 break 11492 } 11493 if w != x.Args[2] { 11494 break 11495 } 11496 mem := x.Args[3] 11497 if !(x.Uses == 1 && clobber(x)) { 11498 break 11499 } 11500 v.reset(OpS390XMOVHBRstoreidx) 11501 v.AuxInt = i - 1 11502 v.Aux = s 11503 v.AddArg(p) 11504 v.AddArg(idx) 11505 v.AddArg(w) 11506 v.AddArg(mem) 11507 return true 11508 } 11509 return false 11510 } 11511 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 11512 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11513 // cond: x.Uses == 1 && clobber(x) 11514 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11515 for { 11516 i := v.AuxInt 11517 s := v.Aux 11518 _ = v.Args[3] 11519 idx := v.Args[0] 11520 p := v.Args[1] 11521 v_2 := v.Args[2] 11522 if v_2.Op != OpS390XSRWconst { 11523 break 11524 } 11525 if v_2.AuxInt != 8 { 11526 break 11527 } 11528 w := v_2.Args[0] 11529 x := v.Args[3] 11530 if x.Op != OpS390XMOVBstoreidx { 11531 break 11532 } 11533 if x.AuxInt != i-1 { 11534 break 11535 } 11536 if x.Aux != s { 11537 break 11538 } 11539 _ = x.Args[3] 11540 if p != x.Args[0] { 11541 break 11542 } 11543 if idx != x.Args[1] { 11544 break 11545 } 11546 if w != x.Args[2] { 11547 break 11548 } 11549 mem := x.Args[3] 11550 if !(x.Uses == 1 && clobber(x)) { 11551 break 11552 } 11553 v.reset(OpS390XMOVHBRstoreidx) 11554 v.AuxInt = i - 1 11555 v.Aux = s 11556 v.AddArg(p) 11557 v.AddArg(idx) 11558 v.AddArg(w) 11559 v.AddArg(mem) 11560 return true 11561 } 11562 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11563 // cond: x.Uses == 1 && clobber(x) 11564 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11565 for { 11566 i := v.AuxInt 11567 s := v.Aux 11568 _ = v.Args[3] 11569 idx := v.Args[0] 11570 p := v.Args[1] 11571 v_2 := v.Args[2] 11572 if v_2.Op != OpS390XSRWconst { 11573 break 11574 } 11575 if v_2.AuxInt != 8 { 11576 break 11577 } 11578 w := v_2.Args[0] 11579 x := v.Args[3] 11580 if x.Op != OpS390XMOVBstoreidx { 11581 break 11582 } 11583 if x.AuxInt != i-1 { 11584 break 11585 } 11586 if x.Aux != s { 11587 break 11588 } 11589 _ = x.Args[3] 11590 if idx != x.Args[0] { 11591 break 11592 } 11593 if p != x.Args[1] { 11594 break 11595 } 11596 if w != x.Args[2] { 11597 break 11598 } 11599 mem := x.Args[3] 11600 if !(x.Uses == 1 && clobber(x)) { 11601 break 11602 } 11603 v.reset(OpS390XMOVHBRstoreidx) 11604 v.AuxInt = i - 1 11605 v.Aux = s 11606 v.AddArg(p) 11607 v.AddArg(idx) 11608 v.AddArg(w) 11609 v.AddArg(mem) 11610 return true 11611 } 11612 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11613 // cond: x.Uses == 1 && clobber(x) 11614 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11615 for { 11616 i := v.AuxInt 11617 s := v.Aux 11618 _ = v.Args[3] 11619 p := v.Args[0] 11620 idx := v.Args[1] 11621 v_2 := v.Args[2] 11622 if v_2.Op != OpS390XSRWconst { 11623 break 11624 } 11625 j := v_2.AuxInt 11626 w := v_2.Args[0] 11627 x := v.Args[3] 11628 if x.Op != OpS390XMOVBstoreidx { 11629 break 11630 } 11631 if x.AuxInt != i-1 { 11632 break 11633 } 11634 if x.Aux != s { 11635 break 11636 } 11637 _ = x.Args[3] 11638 if p != x.Args[0] { 11639 break 11640 } 11641 if idx != x.Args[1] { 11642 break 11643 } 11644 w0 := x.Args[2] 11645 if w0.Op != OpS390XSRWconst { 11646 break 11647 } 11648 if w0.AuxInt != j-8 { 11649 break 11650 } 11651 if w != w0.Args[0] { 11652 break 11653 } 11654 mem := x.Args[3] 11655 if !(x.Uses == 1 && clobber(x)) { 11656 break 11657 } 11658 v.reset(OpS390XMOVHBRstoreidx) 11659 v.AuxInt = i - 1 11660 v.Aux = s 11661 v.AddArg(p) 11662 v.AddArg(idx) 11663 v.AddArg(w0) 11664 v.AddArg(mem) 11665 return true 11666 } 11667 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11668 // cond: x.Uses == 1 && clobber(x) 11669 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11670 for { 11671 i := v.AuxInt 11672 s := v.Aux 11673 _ = v.Args[3] 11674 p := v.Args[0] 11675 idx := v.Args[1] 11676 v_2 := v.Args[2] 11677 if v_2.Op != OpS390XSRWconst { 11678 break 11679 } 11680 j := v_2.AuxInt 11681 w := v_2.Args[0] 11682 x := v.Args[3] 11683 if x.Op != OpS390XMOVBstoreidx { 11684 break 11685 } 11686 if x.AuxInt != i-1 { 11687 break 11688 } 11689 if x.Aux != s { 11690 break 11691 } 11692 _ = x.Args[3] 11693 if idx != x.Args[0] { 11694 break 11695 } 11696 if p != x.Args[1] { 11697 break 11698 } 11699 w0 := x.Args[2] 11700 if w0.Op != OpS390XSRWconst { 11701 break 11702 } 11703 if w0.AuxInt != j-8 { 11704 break 11705 } 11706 if w != w0.Args[0] { 11707 break 11708 } 11709 mem := x.Args[3] 11710 if !(x.Uses == 1 && clobber(x)) { 11711 break 11712 } 11713 v.reset(OpS390XMOVHBRstoreidx) 11714 v.AuxInt = i - 1 11715 v.Aux = s 11716 v.AddArg(p) 11717 v.AddArg(idx) 11718 v.AddArg(w0) 11719 v.AddArg(mem) 11720 return true 11721 } 11722 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11723 // cond: x.Uses == 1 && clobber(x) 11724 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11725 for { 11726 i := v.AuxInt 11727 s := v.Aux 11728 _ = v.Args[3] 11729 idx := v.Args[0] 11730 p := v.Args[1] 11731 v_2 := v.Args[2] 11732 if v_2.Op != OpS390XSRWconst { 11733 break 11734 } 11735 j := v_2.AuxInt 11736 w := v_2.Args[0] 11737 x := v.Args[3] 11738 if x.Op != OpS390XMOVBstoreidx { 11739 break 11740 } 11741 if x.AuxInt != i-1 { 11742 break 11743 } 11744 if x.Aux != s { 11745 break 11746 } 11747 _ = x.Args[3] 11748 if p != x.Args[0] { 11749 break 11750 } 11751 if idx != x.Args[1] { 11752 break 11753 } 11754 w0 := x.Args[2] 11755 if w0.Op != OpS390XSRWconst { 11756 break 11757 } 11758 if w0.AuxInt != j-8 { 11759 break 11760 } 11761 if w != w0.Args[0] { 11762 break 11763 } 11764 mem := x.Args[3] 11765 if !(x.Uses == 1 && clobber(x)) { 11766 break 11767 } 11768 v.reset(OpS390XMOVHBRstoreidx) 11769 v.AuxInt = i - 1 11770 v.Aux = s 11771 v.AddArg(p) 11772 v.AddArg(idx) 11773 v.AddArg(w0) 11774 v.AddArg(mem) 11775 return true 11776 } 11777 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11778 // cond: x.Uses == 1 && clobber(x) 11779 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11780 for { 11781 i := v.AuxInt 11782 s := v.Aux 11783 _ = v.Args[3] 11784 idx := v.Args[0] 11785 p := v.Args[1] 11786 v_2 := v.Args[2] 11787 if v_2.Op != OpS390XSRWconst { 11788 break 11789 } 11790 j := v_2.AuxInt 11791 w := v_2.Args[0] 11792 x := v.Args[3] 11793 if x.Op != OpS390XMOVBstoreidx { 11794 break 11795 } 11796 if x.AuxInt != i-1 { 11797 break 11798 } 11799 if x.Aux != s { 11800 break 11801 } 11802 _ = x.Args[3] 11803 if idx != x.Args[0] { 11804 break 11805 } 11806 if p != x.Args[1] { 11807 break 11808 } 11809 w0 := x.Args[2] 11810 if w0.Op != OpS390XSRWconst { 11811 break 11812 } 11813 if w0.AuxInt != j-8 { 11814 break 11815 } 11816 if w != w0.Args[0] { 11817 break 11818 } 11819 mem := x.Args[3] 11820 if !(x.Uses == 1 && clobber(x)) { 11821 break 11822 } 11823 v.reset(OpS390XMOVHBRstoreidx) 11824 v.AuxInt = i - 1 11825 v.Aux = s 11826 v.AddArg(p) 11827 v.AddArg(idx) 11828 v.AddArg(w0) 11829 v.AddArg(mem) 11830 return true 11831 } 11832 return false 11833 } 11834 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 11835 // match: (MOVDEQ x y (InvertFlags cmp)) 11836 // cond: 11837 // result: (MOVDEQ x y cmp) 11838 for { 11839 _ = v.Args[2] 11840 x := v.Args[0] 11841 y := v.Args[1] 11842 v_2 := v.Args[2] 11843 if v_2.Op != OpS390XInvertFlags { 11844 break 11845 } 11846 cmp := v_2.Args[0] 11847 v.reset(OpS390XMOVDEQ) 11848 v.AddArg(x) 11849 v.AddArg(y) 11850 v.AddArg(cmp) 11851 return true 11852 } 11853 // match: (MOVDEQ _ x (FlagEQ)) 11854 // cond: 11855 // result: x 11856 for { 11857 _ = v.Args[2] 11858 x := v.Args[1] 11859 v_2 := v.Args[2] 11860 if v_2.Op != OpS390XFlagEQ { 11861 break 11862 } 11863 v.reset(OpCopy) 11864 v.Type = x.Type 11865 v.AddArg(x) 11866 return true 11867 } 11868 // match: (MOVDEQ y _ (FlagLT)) 11869 // cond: 11870 // result: y 11871 for { 11872 _ = v.Args[2] 11873 y := v.Args[0] 11874 v_2 := v.Args[2] 11875 if v_2.Op != OpS390XFlagLT { 11876 break 11877 } 11878 v.reset(OpCopy) 11879 v.Type = y.Type 11880 v.AddArg(y) 11881 return true 11882 } 11883 // match: (MOVDEQ y _ (FlagGT)) 11884 // cond: 11885 // result: y 11886 for { 11887 _ = v.Args[2] 11888 y := v.Args[0] 11889 v_2 := v.Args[2] 11890 if v_2.Op != OpS390XFlagGT { 11891 break 11892 } 11893 v.reset(OpCopy) 11894 v.Type = y.Type 11895 v.AddArg(y) 11896 return true 11897 } 11898 return false 11899 } 11900 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 11901 // match: (MOVDGE x y (InvertFlags cmp)) 11902 // cond: 11903 // result: (MOVDLE x y cmp) 11904 for { 11905 _ = v.Args[2] 11906 x := v.Args[0] 11907 y := v.Args[1] 11908 v_2 := v.Args[2] 11909 if v_2.Op != OpS390XInvertFlags { 11910 break 11911 } 11912 cmp := v_2.Args[0] 11913 v.reset(OpS390XMOVDLE) 11914 v.AddArg(x) 11915 v.AddArg(y) 11916 v.AddArg(cmp) 11917 return true 11918 } 11919 // match: (MOVDGE _ x (FlagEQ)) 11920 // cond: 11921 // result: x 11922 for { 11923 _ = v.Args[2] 11924 x := v.Args[1] 11925 v_2 := v.Args[2] 11926 if v_2.Op != OpS390XFlagEQ { 11927 break 11928 } 11929 v.reset(OpCopy) 11930 v.Type = x.Type 11931 v.AddArg(x) 11932 return true 11933 } 11934 // match: (MOVDGE y _ (FlagLT)) 11935 // cond: 11936 // result: y 11937 for { 11938 _ = v.Args[2] 11939 y := v.Args[0] 11940 v_2 := v.Args[2] 11941 if v_2.Op != OpS390XFlagLT { 11942 break 11943 } 11944 v.reset(OpCopy) 11945 v.Type = y.Type 11946 v.AddArg(y) 11947 return true 11948 } 11949 // match: (MOVDGE _ x (FlagGT)) 11950 // cond: 11951 // result: x 11952 for { 11953 _ = v.Args[2] 11954 x := v.Args[1] 11955 v_2 := v.Args[2] 11956 if v_2.Op != OpS390XFlagGT { 11957 break 11958 } 11959 v.reset(OpCopy) 11960 v.Type = x.Type 11961 v.AddArg(x) 11962 return true 11963 } 11964 return false 11965 } 11966 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 11967 // match: (MOVDGT x y (InvertFlags cmp)) 11968 // cond: 11969 // result: (MOVDLT x y cmp) 11970 for { 11971 _ = v.Args[2] 11972 x := v.Args[0] 11973 y := v.Args[1] 11974 v_2 := v.Args[2] 11975 if v_2.Op != OpS390XInvertFlags { 11976 break 11977 } 11978 cmp := v_2.Args[0] 11979 v.reset(OpS390XMOVDLT) 11980 v.AddArg(x) 11981 v.AddArg(y) 11982 v.AddArg(cmp) 11983 return true 11984 } 11985 // match: (MOVDGT y _ (FlagEQ)) 11986 // cond: 11987 // result: y 11988 for { 11989 _ = v.Args[2] 11990 y := v.Args[0] 11991 v_2 := v.Args[2] 11992 if v_2.Op != OpS390XFlagEQ { 11993 break 11994 } 11995 v.reset(OpCopy) 11996 v.Type = y.Type 11997 v.AddArg(y) 11998 return true 11999 } 12000 // match: (MOVDGT y _ (FlagLT)) 12001 // cond: 12002 // result: y 12003 for { 12004 _ = v.Args[2] 12005 y := v.Args[0] 12006 v_2 := v.Args[2] 12007 if v_2.Op != OpS390XFlagLT { 12008 break 12009 } 12010 v.reset(OpCopy) 12011 v.Type = y.Type 12012 v.AddArg(y) 12013 return true 12014 } 12015 // match: (MOVDGT _ x (FlagGT)) 12016 // cond: 12017 // result: x 12018 for { 12019 _ = v.Args[2] 12020 x := v.Args[1] 12021 v_2 := v.Args[2] 12022 if v_2.Op != OpS390XFlagGT { 12023 break 12024 } 12025 v.reset(OpCopy) 12026 v.Type = x.Type 12027 v.AddArg(x) 12028 return true 12029 } 12030 return false 12031 } 12032 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 12033 // match: (MOVDLE x y (InvertFlags cmp)) 12034 // cond: 12035 // result: (MOVDGE x y cmp) 12036 for { 12037 _ = v.Args[2] 12038 x := v.Args[0] 12039 y := v.Args[1] 12040 v_2 := v.Args[2] 12041 if v_2.Op != OpS390XInvertFlags { 12042 break 12043 } 12044 cmp := v_2.Args[0] 12045 v.reset(OpS390XMOVDGE) 12046 v.AddArg(x) 12047 v.AddArg(y) 12048 v.AddArg(cmp) 12049 return true 12050 } 12051 // match: (MOVDLE _ x (FlagEQ)) 12052 // cond: 12053 // result: x 12054 for { 12055 _ = v.Args[2] 12056 x := v.Args[1] 12057 v_2 := v.Args[2] 12058 if v_2.Op != OpS390XFlagEQ { 12059 break 12060 } 12061 v.reset(OpCopy) 12062 v.Type = x.Type 12063 v.AddArg(x) 12064 return true 12065 } 12066 // match: (MOVDLE _ x (FlagLT)) 12067 // cond: 12068 // result: x 12069 for { 12070 _ = v.Args[2] 12071 x := v.Args[1] 12072 v_2 := v.Args[2] 12073 if v_2.Op != OpS390XFlagLT { 12074 break 12075 } 12076 v.reset(OpCopy) 12077 v.Type = x.Type 12078 v.AddArg(x) 12079 return true 12080 } 12081 // match: (MOVDLE y _ (FlagGT)) 12082 // cond: 12083 // result: y 12084 for { 12085 _ = v.Args[2] 12086 y := v.Args[0] 12087 v_2 := v.Args[2] 12088 if v_2.Op != OpS390XFlagGT { 12089 break 12090 } 12091 v.reset(OpCopy) 12092 v.Type = y.Type 12093 v.AddArg(y) 12094 return true 12095 } 12096 return false 12097 } 12098 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 12099 // match: (MOVDLT x y (InvertFlags cmp)) 12100 // cond: 12101 // result: (MOVDGT x y cmp) 12102 for { 12103 _ = v.Args[2] 12104 x := v.Args[0] 12105 y := v.Args[1] 12106 v_2 := v.Args[2] 12107 if v_2.Op != OpS390XInvertFlags { 12108 break 12109 } 12110 cmp := v_2.Args[0] 12111 v.reset(OpS390XMOVDGT) 12112 v.AddArg(x) 12113 v.AddArg(y) 12114 v.AddArg(cmp) 12115 return true 12116 } 12117 // match: (MOVDLT y _ (FlagEQ)) 12118 // cond: 12119 // result: y 12120 for { 12121 _ = v.Args[2] 12122 y := v.Args[0] 12123 v_2 := v.Args[2] 12124 if v_2.Op != OpS390XFlagEQ { 12125 break 12126 } 12127 v.reset(OpCopy) 12128 v.Type = y.Type 12129 v.AddArg(y) 12130 return true 12131 } 12132 // match: (MOVDLT _ x (FlagLT)) 12133 // cond: 12134 // result: x 12135 for { 12136 _ = v.Args[2] 12137 x := v.Args[1] 12138 v_2 := v.Args[2] 12139 if v_2.Op != OpS390XFlagLT { 12140 break 12141 } 12142 v.reset(OpCopy) 12143 v.Type = x.Type 12144 v.AddArg(x) 12145 return true 12146 } 12147 // match: (MOVDLT y _ (FlagGT)) 12148 // cond: 12149 // result: y 12150 for { 12151 _ = v.Args[2] 12152 y := v.Args[0] 12153 v_2 := v.Args[2] 12154 if v_2.Op != OpS390XFlagGT { 12155 break 12156 } 12157 v.reset(OpCopy) 12158 v.Type = y.Type 12159 v.AddArg(y) 12160 return true 12161 } 12162 return false 12163 } 12164 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 12165 // match: (MOVDNE x y (InvertFlags cmp)) 12166 // cond: 12167 // result: (MOVDNE x y cmp) 12168 for { 12169 _ = v.Args[2] 12170 x := v.Args[0] 12171 y := v.Args[1] 12172 v_2 := v.Args[2] 12173 if v_2.Op != OpS390XInvertFlags { 12174 break 12175 } 12176 cmp := v_2.Args[0] 12177 v.reset(OpS390XMOVDNE) 12178 v.AddArg(x) 12179 v.AddArg(y) 12180 v.AddArg(cmp) 12181 return true 12182 } 12183 // match: (MOVDNE y _ (FlagEQ)) 12184 // cond: 12185 // result: y 12186 for { 12187 _ = v.Args[2] 12188 y := v.Args[0] 12189 v_2 := v.Args[2] 12190 if v_2.Op != OpS390XFlagEQ { 12191 break 12192 } 12193 v.reset(OpCopy) 12194 v.Type = y.Type 12195 v.AddArg(y) 12196 return true 12197 } 12198 // match: (MOVDNE _ x (FlagLT)) 12199 // cond: 12200 // result: x 12201 for { 12202 _ = v.Args[2] 12203 x := v.Args[1] 12204 v_2 := v.Args[2] 12205 if v_2.Op != OpS390XFlagLT { 12206 break 12207 } 12208 v.reset(OpCopy) 12209 v.Type = x.Type 12210 v.AddArg(x) 12211 return true 12212 } 12213 // match: (MOVDNE _ x (FlagGT)) 12214 // cond: 12215 // result: x 12216 for { 12217 _ = v.Args[2] 12218 x := v.Args[1] 12219 v_2 := v.Args[2] 12220 if v_2.Op != OpS390XFlagGT { 12221 break 12222 } 12223 v.reset(OpCopy) 12224 v.Type = x.Type 12225 v.AddArg(x) 12226 return true 12227 } 12228 return false 12229 } 12230 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 12231 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 12232 // cond: is20Bit(c+d) && x.Op != OpSB 12233 // result: (MOVDaddridx [c+d] {s} x y) 12234 for { 12235 c := v.AuxInt 12236 s := v.Aux 12237 _ = v.Args[1] 12238 v_0 := v.Args[0] 12239 if v_0.Op != OpS390XADDconst { 12240 break 12241 } 12242 d := v_0.AuxInt 12243 x := v_0.Args[0] 12244 y := v.Args[1] 12245 if !(is20Bit(c+d) && x.Op != OpSB) { 12246 break 12247 } 12248 v.reset(OpS390XMOVDaddridx) 12249 v.AuxInt = c + d 12250 v.Aux = s 12251 v.AddArg(x) 12252 v.AddArg(y) 12253 return true 12254 } 12255 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 12256 // cond: is20Bit(c+d) && y.Op != OpSB 12257 // result: (MOVDaddridx [c+d] {s} x y) 12258 for { 12259 c := v.AuxInt 12260 s := v.Aux 12261 _ = v.Args[1] 12262 x := v.Args[0] 12263 v_1 := v.Args[1] 12264 if v_1.Op != OpS390XADDconst { 12265 break 12266 } 12267 d := v_1.AuxInt 12268 y := v_1.Args[0] 12269 if !(is20Bit(c+d) && y.Op != OpSB) { 12270 break 12271 } 12272 v.reset(OpS390XMOVDaddridx) 12273 v.AuxInt = c + d 12274 v.Aux = s 12275 v.AddArg(x) 12276 v.AddArg(y) 12277 return true 12278 } 12279 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 12280 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 12281 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12282 for { 12283 off1 := v.AuxInt 12284 sym1 := v.Aux 12285 _ = v.Args[1] 12286 v_0 := v.Args[0] 12287 if v_0.Op != OpS390XMOVDaddr { 12288 break 12289 } 12290 off2 := v_0.AuxInt 12291 sym2 := v_0.Aux 12292 x := v_0.Args[0] 12293 y := v.Args[1] 12294 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 12295 break 12296 } 12297 v.reset(OpS390XMOVDaddridx) 12298 v.AuxInt = off1 + off2 12299 v.Aux = mergeSym(sym1, sym2) 12300 v.AddArg(x) 12301 v.AddArg(y) 12302 return true 12303 } 12304 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 12305 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 12306 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12307 for { 12308 off1 := v.AuxInt 12309 sym1 := v.Aux 12310 _ = v.Args[1] 12311 x := v.Args[0] 12312 v_1 := v.Args[1] 12313 if v_1.Op != OpS390XMOVDaddr { 12314 break 12315 } 12316 off2 := v_1.AuxInt 12317 sym2 := v_1.Aux 12318 y := v_1.Args[0] 12319 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 12320 break 12321 } 12322 v.reset(OpS390XMOVDaddridx) 12323 v.AuxInt = off1 + off2 12324 v.Aux = mergeSym(sym1, sym2) 12325 v.AddArg(x) 12326 v.AddArg(y) 12327 return true 12328 } 12329 return false 12330 } 12331 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 12332 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 12333 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 12334 // result: (MOVDreg x) 12335 for { 12336 off := v.AuxInt 12337 sym := v.Aux 12338 _ = v.Args[1] 12339 ptr := v.Args[0] 12340 v_1 := v.Args[1] 12341 if v_1.Op != OpS390XMOVDstore { 12342 break 12343 } 12344 off2 := v_1.AuxInt 12345 sym2 := v_1.Aux 12346 _ = v_1.Args[2] 12347 ptr2 := v_1.Args[0] 12348 x := v_1.Args[1] 12349 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 12350 break 12351 } 12352 v.reset(OpS390XMOVDreg) 12353 v.AddArg(x) 12354 return true 12355 } 12356 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 12357 // cond: is20Bit(off1+off2) 12358 // result: (MOVDload [off1+off2] {sym} ptr mem) 12359 for { 12360 off1 := v.AuxInt 12361 sym := v.Aux 12362 _ = v.Args[1] 12363 v_0 := v.Args[0] 12364 if v_0.Op != OpS390XADDconst { 12365 break 12366 } 12367 off2 := v_0.AuxInt 12368 ptr := v_0.Args[0] 12369 mem := v.Args[1] 12370 if !(is20Bit(off1 + off2)) { 12371 break 12372 } 12373 v.reset(OpS390XMOVDload) 12374 v.AuxInt = off1 + off2 12375 v.Aux = sym 12376 v.AddArg(ptr) 12377 v.AddArg(mem) 12378 return true 12379 } 12380 // match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 12381 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 12382 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 12383 for { 12384 off1 := v.AuxInt 12385 sym1 := v.Aux 12386 _ = v.Args[1] 12387 v_0 := v.Args[0] 12388 if v_0.Op != OpS390XMOVDaddr { 12389 break 12390 } 12391 t := v_0.Type 12392 off2 := v_0.AuxInt 12393 sym2 := v_0.Aux 12394 base := v_0.Args[0] 12395 mem := v.Args[1] 12396 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 12397 break 12398 } 12399 v.reset(OpS390XMOVDload) 12400 v.AuxInt = off1 + off2 12401 v.Aux = mergeSym(sym1, sym2) 12402 v.AddArg(base) 12403 v.AddArg(mem) 12404 return true 12405 } 12406 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 12407 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12408 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 12409 for { 12410 off1 := v.AuxInt 12411 sym1 := v.Aux 12412 _ = v.Args[1] 12413 v_0 := v.Args[0] 12414 if v_0.Op != OpS390XMOVDaddridx { 12415 break 12416 } 12417 off2 := v_0.AuxInt 12418 sym2 := v_0.Aux 12419 _ = v_0.Args[1] 12420 ptr := v_0.Args[0] 12421 idx := v_0.Args[1] 12422 mem := v.Args[1] 12423 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12424 break 12425 } 12426 v.reset(OpS390XMOVDloadidx) 12427 v.AuxInt = off1 + off2 12428 v.Aux = mergeSym(sym1, sym2) 12429 v.AddArg(ptr) 12430 v.AddArg(idx) 12431 v.AddArg(mem) 12432 return true 12433 } 12434 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 12435 // cond: ptr.Op != OpSB 12436 // result: (MOVDloadidx [off] {sym} ptr idx mem) 12437 for { 12438 off := v.AuxInt 12439 sym := v.Aux 12440 _ = v.Args[1] 12441 v_0 := v.Args[0] 12442 if v_0.Op != OpS390XADD { 12443 break 12444 } 12445 _ = v_0.Args[1] 12446 ptr := v_0.Args[0] 12447 idx := v_0.Args[1] 12448 mem := v.Args[1] 12449 if !(ptr.Op != OpSB) { 12450 break 12451 } 12452 v.reset(OpS390XMOVDloadidx) 12453 v.AuxInt = off 12454 v.Aux = sym 12455 v.AddArg(ptr) 12456 v.AddArg(idx) 12457 v.AddArg(mem) 12458 return true 12459 } 12460 return false 12461 } 12462 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 12463 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 12464 // cond: 12465 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12466 for { 12467 c := v.AuxInt 12468 sym := v.Aux 12469 _ = v.Args[2] 12470 v_0 := v.Args[0] 12471 if v_0.Op != OpS390XADDconst { 12472 break 12473 } 12474 d := v_0.AuxInt 12475 ptr := v_0.Args[0] 12476 idx := v.Args[1] 12477 mem := v.Args[2] 12478 v.reset(OpS390XMOVDloadidx) 12479 v.AuxInt = c + d 12480 v.Aux = sym 12481 v.AddArg(ptr) 12482 v.AddArg(idx) 12483 v.AddArg(mem) 12484 return true 12485 } 12486 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 12487 // cond: 12488 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12489 for { 12490 c := v.AuxInt 12491 sym := v.Aux 12492 _ = v.Args[2] 12493 idx := v.Args[0] 12494 v_1 := v.Args[1] 12495 if v_1.Op != OpS390XADDconst { 12496 break 12497 } 12498 d := v_1.AuxInt 12499 ptr := v_1.Args[0] 12500 mem := v.Args[2] 12501 v.reset(OpS390XMOVDloadidx) 12502 v.AuxInt = c + d 12503 v.Aux = sym 12504 v.AddArg(ptr) 12505 v.AddArg(idx) 12506 v.AddArg(mem) 12507 return true 12508 } 12509 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 12510 // cond: 12511 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12512 for { 12513 c := v.AuxInt 12514 sym := v.Aux 12515 _ = v.Args[2] 12516 ptr := v.Args[0] 12517 v_1 := v.Args[1] 12518 if v_1.Op != OpS390XADDconst { 12519 break 12520 } 12521 d := v_1.AuxInt 12522 idx := v_1.Args[0] 12523 mem := v.Args[2] 12524 v.reset(OpS390XMOVDloadidx) 12525 v.AuxInt = c + d 12526 v.Aux = sym 12527 v.AddArg(ptr) 12528 v.AddArg(idx) 12529 v.AddArg(mem) 12530 return true 12531 } 12532 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 12533 // cond: 12534 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12535 for { 12536 c := v.AuxInt 12537 sym := v.Aux 12538 _ = v.Args[2] 12539 v_0 := v.Args[0] 12540 if v_0.Op != OpS390XADDconst { 12541 break 12542 } 12543 d := v_0.AuxInt 12544 idx := v_0.Args[0] 12545 ptr := v.Args[1] 12546 mem := v.Args[2] 12547 v.reset(OpS390XMOVDloadidx) 12548 v.AuxInt = c + d 12549 v.Aux = sym 12550 v.AddArg(ptr) 12551 v.AddArg(idx) 12552 v.AddArg(mem) 12553 return true 12554 } 12555 return false 12556 } 12557 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 12558 b := v.Block 12559 _ = b 12560 // match: (MOVDnop <t> x) 12561 // cond: t.Compare(x.Type) == types.CMPeq 12562 // result: x 12563 for { 12564 t := v.Type 12565 x := v.Args[0] 12566 if !(t.Compare(x.Type) == types.CMPeq) { 12567 break 12568 } 12569 v.reset(OpCopy) 12570 v.Type = x.Type 12571 v.AddArg(x) 12572 return true 12573 } 12574 // match: (MOVDnop (MOVDconst [c])) 12575 // cond: 12576 // result: (MOVDconst [c]) 12577 for { 12578 v_0 := v.Args[0] 12579 if v_0.Op != OpS390XMOVDconst { 12580 break 12581 } 12582 c := v_0.AuxInt 12583 v.reset(OpS390XMOVDconst) 12584 v.AuxInt = c 12585 return true 12586 } 12587 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 12588 // cond: x.Uses == 1 && clobber(x) 12589 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12590 for { 12591 t := v.Type 12592 x := v.Args[0] 12593 if x.Op != OpS390XMOVBZload { 12594 break 12595 } 12596 off := x.AuxInt 12597 sym := x.Aux 12598 _ = x.Args[1] 12599 ptr := x.Args[0] 12600 mem := x.Args[1] 12601 if !(x.Uses == 1 && clobber(x)) { 12602 break 12603 } 12604 b = x.Block 12605 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12606 v.reset(OpCopy) 12607 v.AddArg(v0) 12608 v0.AuxInt = off 12609 v0.Aux = sym 12610 v0.AddArg(ptr) 12611 v0.AddArg(mem) 12612 return true 12613 } 12614 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 12615 // cond: x.Uses == 1 && clobber(x) 12616 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12617 for { 12618 t := v.Type 12619 x := v.Args[0] 12620 if x.Op != OpS390XMOVBload { 12621 break 12622 } 12623 off := x.AuxInt 12624 sym := x.Aux 12625 _ = x.Args[1] 12626 ptr := x.Args[0] 12627 mem := x.Args[1] 12628 if !(x.Uses == 1 && clobber(x)) { 12629 break 12630 } 12631 b = x.Block 12632 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12633 v.reset(OpCopy) 12634 v.AddArg(v0) 12635 v0.AuxInt = off 12636 v0.Aux = sym 12637 v0.AddArg(ptr) 12638 v0.AddArg(mem) 12639 return true 12640 } 12641 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 12642 // cond: x.Uses == 1 && clobber(x) 12643 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12644 for { 12645 t := v.Type 12646 x := v.Args[0] 12647 if x.Op != OpS390XMOVHZload { 12648 break 12649 } 12650 off := x.AuxInt 12651 sym := x.Aux 12652 _ = x.Args[1] 12653 ptr := x.Args[0] 12654 mem := x.Args[1] 12655 if !(x.Uses == 1 && clobber(x)) { 12656 break 12657 } 12658 b = x.Block 12659 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12660 v.reset(OpCopy) 12661 v.AddArg(v0) 12662 v0.AuxInt = off 12663 v0.Aux = sym 12664 v0.AddArg(ptr) 12665 v0.AddArg(mem) 12666 return true 12667 } 12668 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 12669 // cond: x.Uses == 1 && clobber(x) 12670 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12671 for { 12672 t := v.Type 12673 x := v.Args[0] 12674 if x.Op != OpS390XMOVHload { 12675 break 12676 } 12677 off := x.AuxInt 12678 sym := x.Aux 12679 _ = x.Args[1] 12680 ptr := x.Args[0] 12681 mem := x.Args[1] 12682 if !(x.Uses == 1 && clobber(x)) { 12683 break 12684 } 12685 b = x.Block 12686 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12687 v.reset(OpCopy) 12688 v.AddArg(v0) 12689 v0.AuxInt = off 12690 v0.Aux = sym 12691 v0.AddArg(ptr) 12692 v0.AddArg(mem) 12693 return true 12694 } 12695 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 12696 // cond: x.Uses == 1 && clobber(x) 12697 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12698 for { 12699 t := v.Type 12700 x := v.Args[0] 12701 if x.Op != OpS390XMOVWZload { 12702 break 12703 } 12704 off := x.AuxInt 12705 sym := x.Aux 12706 _ = x.Args[1] 12707 ptr := x.Args[0] 12708 mem := x.Args[1] 12709 if !(x.Uses == 1 && clobber(x)) { 12710 break 12711 } 12712 b = x.Block 12713 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12714 v.reset(OpCopy) 12715 v.AddArg(v0) 12716 v0.AuxInt = off 12717 v0.Aux = sym 12718 v0.AddArg(ptr) 12719 v0.AddArg(mem) 12720 return true 12721 } 12722 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 12723 // cond: x.Uses == 1 && clobber(x) 12724 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12725 for { 12726 t := v.Type 12727 x := v.Args[0] 12728 if x.Op != OpS390XMOVWload { 12729 break 12730 } 12731 off := x.AuxInt 12732 sym := x.Aux 12733 _ = x.Args[1] 12734 ptr := x.Args[0] 12735 mem := x.Args[1] 12736 if !(x.Uses == 1 && clobber(x)) { 12737 break 12738 } 12739 b = x.Block 12740 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12741 v.reset(OpCopy) 12742 v.AddArg(v0) 12743 v0.AuxInt = off 12744 v0.Aux = sym 12745 v0.AddArg(ptr) 12746 v0.AddArg(mem) 12747 return true 12748 } 12749 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 12750 // cond: x.Uses == 1 && clobber(x) 12751 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12752 for { 12753 t := v.Type 12754 x := v.Args[0] 12755 if x.Op != OpS390XMOVDload { 12756 break 12757 } 12758 off := x.AuxInt 12759 sym := x.Aux 12760 _ = x.Args[1] 12761 ptr := x.Args[0] 12762 mem := x.Args[1] 12763 if !(x.Uses == 1 && clobber(x)) { 12764 break 12765 } 12766 b = x.Block 12767 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12768 v.reset(OpCopy) 12769 v.AddArg(v0) 12770 v0.AuxInt = off 12771 v0.Aux = sym 12772 v0.AddArg(ptr) 12773 v0.AddArg(mem) 12774 return true 12775 } 12776 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12777 // cond: x.Uses == 1 && clobber(x) 12778 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12779 for { 12780 t := v.Type 12781 x := v.Args[0] 12782 if x.Op != OpS390XMOVBZloadidx { 12783 break 12784 } 12785 off := x.AuxInt 12786 sym := x.Aux 12787 _ = x.Args[2] 12788 ptr := x.Args[0] 12789 idx := x.Args[1] 12790 mem := x.Args[2] 12791 if !(x.Uses == 1 && clobber(x)) { 12792 break 12793 } 12794 b = x.Block 12795 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12796 v.reset(OpCopy) 12797 v.AddArg(v0) 12798 v0.AuxInt = off 12799 v0.Aux = sym 12800 v0.AddArg(ptr) 12801 v0.AddArg(idx) 12802 v0.AddArg(mem) 12803 return true 12804 } 12805 return false 12806 } 12807 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 12808 b := v.Block 12809 _ = b 12810 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12811 // cond: x.Uses == 1 && clobber(x) 12812 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12813 for { 12814 t := v.Type 12815 x := v.Args[0] 12816 if x.Op != OpS390XMOVHZloadidx { 12817 break 12818 } 12819 off := x.AuxInt 12820 sym := x.Aux 12821 _ = x.Args[2] 12822 ptr := x.Args[0] 12823 idx := x.Args[1] 12824 mem := x.Args[2] 12825 if !(x.Uses == 1 && clobber(x)) { 12826 break 12827 } 12828 b = x.Block 12829 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12830 v.reset(OpCopy) 12831 v.AddArg(v0) 12832 v0.AuxInt = off 12833 v0.Aux = sym 12834 v0.AddArg(ptr) 12835 v0.AddArg(idx) 12836 v0.AddArg(mem) 12837 return true 12838 } 12839 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12840 // cond: x.Uses == 1 && clobber(x) 12841 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12842 for { 12843 t := v.Type 12844 x := v.Args[0] 12845 if x.Op != OpS390XMOVWZloadidx { 12846 break 12847 } 12848 off := x.AuxInt 12849 sym := x.Aux 12850 _ = x.Args[2] 12851 ptr := x.Args[0] 12852 idx := x.Args[1] 12853 mem := x.Args[2] 12854 if !(x.Uses == 1 && clobber(x)) { 12855 break 12856 } 12857 b = x.Block 12858 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12859 v.reset(OpCopy) 12860 v.AddArg(v0) 12861 v0.AuxInt = off 12862 v0.Aux = sym 12863 v0.AddArg(ptr) 12864 v0.AddArg(idx) 12865 v0.AddArg(mem) 12866 return true 12867 } 12868 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12869 // cond: x.Uses == 1 && clobber(x) 12870 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12871 for { 12872 t := v.Type 12873 x := v.Args[0] 12874 if x.Op != OpS390XMOVDloadidx { 12875 break 12876 } 12877 off := x.AuxInt 12878 sym := x.Aux 12879 _ = x.Args[2] 12880 ptr := x.Args[0] 12881 idx := x.Args[1] 12882 mem := x.Args[2] 12883 if !(x.Uses == 1 && clobber(x)) { 12884 break 12885 } 12886 b = x.Block 12887 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12888 v.reset(OpCopy) 12889 v.AddArg(v0) 12890 v0.AuxInt = off 12891 v0.Aux = sym 12892 v0.AddArg(ptr) 12893 v0.AddArg(idx) 12894 v0.AddArg(mem) 12895 return true 12896 } 12897 return false 12898 } 12899 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 12900 b := v.Block 12901 _ = b 12902 // match: (MOVDreg <t> x) 12903 // cond: t.Compare(x.Type) == types.CMPeq 12904 // result: x 12905 for { 12906 t := v.Type 12907 x := v.Args[0] 12908 if !(t.Compare(x.Type) == types.CMPeq) { 12909 break 12910 } 12911 v.reset(OpCopy) 12912 v.Type = x.Type 12913 v.AddArg(x) 12914 return true 12915 } 12916 // match: (MOVDreg (MOVDconst [c])) 12917 // cond: 12918 // result: (MOVDconst [c]) 12919 for { 12920 v_0 := v.Args[0] 12921 if v_0.Op != OpS390XMOVDconst { 12922 break 12923 } 12924 c := v_0.AuxInt 12925 v.reset(OpS390XMOVDconst) 12926 v.AuxInt = c 12927 return true 12928 } 12929 // match: (MOVDreg x) 12930 // cond: x.Uses == 1 12931 // result: (MOVDnop x) 12932 for { 12933 x := v.Args[0] 12934 if !(x.Uses == 1) { 12935 break 12936 } 12937 v.reset(OpS390XMOVDnop) 12938 v.AddArg(x) 12939 return true 12940 } 12941 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 12942 // cond: x.Uses == 1 && clobber(x) 12943 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12944 for { 12945 t := v.Type 12946 x := v.Args[0] 12947 if x.Op != OpS390XMOVBZload { 12948 break 12949 } 12950 off := x.AuxInt 12951 sym := x.Aux 12952 _ = x.Args[1] 12953 ptr := x.Args[0] 12954 mem := x.Args[1] 12955 if !(x.Uses == 1 && clobber(x)) { 12956 break 12957 } 12958 b = x.Block 12959 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12960 v.reset(OpCopy) 12961 v.AddArg(v0) 12962 v0.AuxInt = off 12963 v0.Aux = sym 12964 v0.AddArg(ptr) 12965 v0.AddArg(mem) 12966 return true 12967 } 12968 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 12969 // cond: x.Uses == 1 && clobber(x) 12970 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12971 for { 12972 t := v.Type 12973 x := v.Args[0] 12974 if x.Op != OpS390XMOVBload { 12975 break 12976 } 12977 off := x.AuxInt 12978 sym := x.Aux 12979 _ = x.Args[1] 12980 ptr := x.Args[0] 12981 mem := x.Args[1] 12982 if !(x.Uses == 1 && clobber(x)) { 12983 break 12984 } 12985 b = x.Block 12986 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12987 v.reset(OpCopy) 12988 v.AddArg(v0) 12989 v0.AuxInt = off 12990 v0.Aux = sym 12991 v0.AddArg(ptr) 12992 v0.AddArg(mem) 12993 return true 12994 } 12995 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 12996 // cond: x.Uses == 1 && clobber(x) 12997 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12998 for { 12999 t := v.Type 13000 x := v.Args[0] 13001 if x.Op != OpS390XMOVHZload { 13002 break 13003 } 13004 off := x.AuxInt 13005 sym := x.Aux 13006 _ = x.Args[1] 13007 ptr := x.Args[0] 13008 mem := x.Args[1] 13009 if !(x.Uses == 1 && clobber(x)) { 13010 break 13011 } 13012 b = x.Block 13013 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 13014 v.reset(OpCopy) 13015 v.AddArg(v0) 13016 v0.AuxInt = off 13017 v0.Aux = sym 13018 v0.AddArg(ptr) 13019 v0.AddArg(mem) 13020 return true 13021 } 13022 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 13023 // cond: x.Uses == 1 && clobber(x) 13024 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 13025 for { 13026 t := v.Type 13027 x := v.Args[0] 13028 if x.Op != OpS390XMOVHload { 13029 break 13030 } 13031 off := x.AuxInt 13032 sym := x.Aux 13033 _ = x.Args[1] 13034 ptr := x.Args[0] 13035 mem := x.Args[1] 13036 if !(x.Uses == 1 && clobber(x)) { 13037 break 13038 } 13039 b = x.Block 13040 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 13041 v.reset(OpCopy) 13042 v.AddArg(v0) 13043 v0.AuxInt = off 13044 v0.Aux = sym 13045 v0.AddArg(ptr) 13046 v0.AddArg(mem) 13047 return true 13048 } 13049 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 13050 // cond: x.Uses == 1 && clobber(x) 13051 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 13052 for { 13053 t := v.Type 13054 x := v.Args[0] 13055 if x.Op != OpS390XMOVWZload { 13056 break 13057 } 13058 off := x.AuxInt 13059 sym := x.Aux 13060 _ = x.Args[1] 13061 ptr := x.Args[0] 13062 mem := x.Args[1] 13063 if !(x.Uses == 1 && clobber(x)) { 13064 break 13065 } 13066 b = x.Block 13067 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 13068 v.reset(OpCopy) 13069 v.AddArg(v0) 13070 v0.AuxInt = off 13071 v0.Aux = sym 13072 v0.AddArg(ptr) 13073 v0.AddArg(mem) 13074 return true 13075 } 13076 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 13077 // cond: x.Uses == 1 && clobber(x) 13078 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 13079 for { 13080 t := v.Type 13081 x := v.Args[0] 13082 if x.Op != OpS390XMOVWload { 13083 break 13084 } 13085 off := x.AuxInt 13086 sym := x.Aux 13087 _ = x.Args[1] 13088 ptr := x.Args[0] 13089 mem := x.Args[1] 13090 if !(x.Uses == 1 && clobber(x)) { 13091 break 13092 } 13093 b = x.Block 13094 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 13095 v.reset(OpCopy) 13096 v.AddArg(v0) 13097 v0.AuxInt = off 13098 v0.Aux = sym 13099 v0.AddArg(ptr) 13100 v0.AddArg(mem) 13101 return true 13102 } 13103 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 13104 // cond: x.Uses == 1 && clobber(x) 13105 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 13106 for { 13107 t := v.Type 13108 x := v.Args[0] 13109 if x.Op != OpS390XMOVDload { 13110 break 13111 } 13112 off := x.AuxInt 13113 sym := x.Aux 13114 _ = x.Args[1] 13115 ptr := x.Args[0] 13116 mem := x.Args[1] 13117 if !(x.Uses == 1 && clobber(x)) { 13118 break 13119 } 13120 b = x.Block 13121 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 13122 v.reset(OpCopy) 13123 v.AddArg(v0) 13124 v0.AuxInt = off 13125 v0.Aux = sym 13126 v0.AddArg(ptr) 13127 v0.AddArg(mem) 13128 return true 13129 } 13130 return false 13131 } 13132 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 13133 b := v.Block 13134 _ = b 13135 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 13136 // cond: x.Uses == 1 && clobber(x) 13137 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 13138 for { 13139 t := v.Type 13140 x := v.Args[0] 13141 if x.Op != OpS390XMOVBZloadidx { 13142 break 13143 } 13144 off := x.AuxInt 13145 sym := x.Aux 13146 _ = x.Args[2] 13147 ptr := x.Args[0] 13148 idx := x.Args[1] 13149 mem := x.Args[2] 13150 if !(x.Uses == 1 && clobber(x)) { 13151 break 13152 } 13153 b = x.Block 13154 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 13155 v.reset(OpCopy) 13156 v.AddArg(v0) 13157 v0.AuxInt = off 13158 v0.Aux = sym 13159 v0.AddArg(ptr) 13160 v0.AddArg(idx) 13161 v0.AddArg(mem) 13162 return true 13163 } 13164 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 13165 // cond: x.Uses == 1 && clobber(x) 13166 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 13167 for { 13168 t := v.Type 13169 x := v.Args[0] 13170 if x.Op != OpS390XMOVHZloadidx { 13171 break 13172 } 13173 off := x.AuxInt 13174 sym := x.Aux 13175 _ = x.Args[2] 13176 ptr := x.Args[0] 13177 idx := x.Args[1] 13178 mem := x.Args[2] 13179 if !(x.Uses == 1 && clobber(x)) { 13180 break 13181 } 13182 b = x.Block 13183 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 13184 v.reset(OpCopy) 13185 v.AddArg(v0) 13186 v0.AuxInt = off 13187 v0.Aux = sym 13188 v0.AddArg(ptr) 13189 v0.AddArg(idx) 13190 v0.AddArg(mem) 13191 return true 13192 } 13193 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 13194 // cond: x.Uses == 1 && clobber(x) 13195 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 13196 for { 13197 t := v.Type 13198 x := v.Args[0] 13199 if x.Op != OpS390XMOVWZloadidx { 13200 break 13201 } 13202 off := x.AuxInt 13203 sym := x.Aux 13204 _ = x.Args[2] 13205 ptr := x.Args[0] 13206 idx := x.Args[1] 13207 mem := x.Args[2] 13208 if !(x.Uses == 1 && clobber(x)) { 13209 break 13210 } 13211 b = x.Block 13212 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 13213 v.reset(OpCopy) 13214 v.AddArg(v0) 13215 v0.AuxInt = off 13216 v0.Aux = sym 13217 v0.AddArg(ptr) 13218 v0.AddArg(idx) 13219 v0.AddArg(mem) 13220 return true 13221 } 13222 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 13223 // cond: x.Uses == 1 && clobber(x) 13224 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 13225 for { 13226 t := v.Type 13227 x := v.Args[0] 13228 if x.Op != OpS390XMOVDloadidx { 13229 break 13230 } 13231 off := x.AuxInt 13232 sym := x.Aux 13233 _ = x.Args[2] 13234 ptr := x.Args[0] 13235 idx := x.Args[1] 13236 mem := x.Args[2] 13237 if !(x.Uses == 1 && clobber(x)) { 13238 break 13239 } 13240 b = x.Block 13241 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 13242 v.reset(OpCopy) 13243 v.AddArg(v0) 13244 v0.AuxInt = off 13245 v0.Aux = sym 13246 v0.AddArg(ptr) 13247 v0.AddArg(idx) 13248 v0.AddArg(mem) 13249 return true 13250 } 13251 return false 13252 } 13253 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 13254 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 13255 // cond: is20Bit(off1+off2) 13256 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 13257 for { 13258 off1 := v.AuxInt 13259 sym := v.Aux 13260 _ = v.Args[2] 13261 v_0 := v.Args[0] 13262 if v_0.Op != OpS390XADDconst { 13263 break 13264 } 13265 off2 := v_0.AuxInt 13266 ptr := v_0.Args[0] 13267 val := v.Args[1] 13268 mem := v.Args[2] 13269 if !(is20Bit(off1 + off2)) { 13270 break 13271 } 13272 v.reset(OpS390XMOVDstore) 13273 v.AuxInt = off1 + off2 13274 v.Aux = sym 13275 v.AddArg(ptr) 13276 v.AddArg(val) 13277 v.AddArg(mem) 13278 return true 13279 } 13280 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 13281 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 13282 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 13283 for { 13284 off := v.AuxInt 13285 sym := v.Aux 13286 _ = v.Args[2] 13287 ptr := v.Args[0] 13288 v_1 := v.Args[1] 13289 if v_1.Op != OpS390XMOVDconst { 13290 break 13291 } 13292 c := v_1.AuxInt 13293 mem := v.Args[2] 13294 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 13295 break 13296 } 13297 v.reset(OpS390XMOVDstoreconst) 13298 v.AuxInt = makeValAndOff(c, off) 13299 v.Aux = sym 13300 v.AddArg(ptr) 13301 v.AddArg(mem) 13302 return true 13303 } 13304 // match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 13305 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 13306 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 13307 for { 13308 off1 := v.AuxInt 13309 sym1 := v.Aux 13310 _ = v.Args[2] 13311 v_0 := v.Args[0] 13312 if v_0.Op != OpS390XMOVDaddr { 13313 break 13314 } 13315 t := v_0.Type 13316 off2 := v_0.AuxInt 13317 sym2 := v_0.Aux 13318 base := v_0.Args[0] 13319 val := v.Args[1] 13320 mem := v.Args[2] 13321 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 13322 break 13323 } 13324 v.reset(OpS390XMOVDstore) 13325 v.AuxInt = off1 + off2 13326 v.Aux = mergeSym(sym1, sym2) 13327 v.AddArg(base) 13328 v.AddArg(val) 13329 v.AddArg(mem) 13330 return true 13331 } 13332 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 13333 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13334 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 13335 for { 13336 off1 := v.AuxInt 13337 sym1 := v.Aux 13338 _ = v.Args[2] 13339 v_0 := v.Args[0] 13340 if v_0.Op != OpS390XMOVDaddridx { 13341 break 13342 } 13343 off2 := v_0.AuxInt 13344 sym2 := v_0.Aux 13345 _ = v_0.Args[1] 13346 ptr := v_0.Args[0] 13347 idx := v_0.Args[1] 13348 val := v.Args[1] 13349 mem := v.Args[2] 13350 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13351 break 13352 } 13353 v.reset(OpS390XMOVDstoreidx) 13354 v.AuxInt = off1 + off2 13355 v.Aux = mergeSym(sym1, sym2) 13356 v.AddArg(ptr) 13357 v.AddArg(idx) 13358 v.AddArg(val) 13359 v.AddArg(mem) 13360 return true 13361 } 13362 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 13363 // cond: ptr.Op != OpSB 13364 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 13365 for { 13366 off := v.AuxInt 13367 sym := v.Aux 13368 _ = v.Args[2] 13369 v_0 := v.Args[0] 13370 if v_0.Op != OpS390XADD { 13371 break 13372 } 13373 _ = v_0.Args[1] 13374 ptr := v_0.Args[0] 13375 idx := v_0.Args[1] 13376 val := v.Args[1] 13377 mem := v.Args[2] 13378 if !(ptr.Op != OpSB) { 13379 break 13380 } 13381 v.reset(OpS390XMOVDstoreidx) 13382 v.AuxInt = off 13383 v.Aux = sym 13384 v.AddArg(ptr) 13385 v.AddArg(idx) 13386 v.AddArg(val) 13387 v.AddArg(mem) 13388 return true 13389 } 13390 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 13391 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 13392 // result: (STMG2 [i-8] {s} p w0 w1 mem) 13393 for { 13394 i := v.AuxInt 13395 s := v.Aux 13396 _ = v.Args[2] 13397 p := v.Args[0] 13398 w1 := v.Args[1] 13399 x := v.Args[2] 13400 if x.Op != OpS390XMOVDstore { 13401 break 13402 } 13403 if x.AuxInt != i-8 { 13404 break 13405 } 13406 if x.Aux != s { 13407 break 13408 } 13409 _ = x.Args[2] 13410 if p != x.Args[0] { 13411 break 13412 } 13413 w0 := x.Args[1] 13414 mem := x.Args[2] 13415 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 13416 break 13417 } 13418 v.reset(OpS390XSTMG2) 13419 v.AuxInt = i - 8 13420 v.Aux = s 13421 v.AddArg(p) 13422 v.AddArg(w0) 13423 v.AddArg(w1) 13424 v.AddArg(mem) 13425 return true 13426 } 13427 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 13428 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 13429 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 13430 for { 13431 i := v.AuxInt 13432 s := v.Aux 13433 _ = v.Args[2] 13434 p := v.Args[0] 13435 w2 := v.Args[1] 13436 x := v.Args[2] 13437 if x.Op != OpS390XSTMG2 { 13438 break 13439 } 13440 if x.AuxInt != i-16 { 13441 break 13442 } 13443 if x.Aux != s { 13444 break 13445 } 13446 _ = x.Args[3] 13447 if p != x.Args[0] { 13448 break 13449 } 13450 w0 := x.Args[1] 13451 w1 := x.Args[2] 13452 mem := x.Args[3] 13453 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 13454 break 13455 } 13456 v.reset(OpS390XSTMG3) 13457 v.AuxInt = i - 16 13458 v.Aux = s 13459 v.AddArg(p) 13460 v.AddArg(w0) 13461 v.AddArg(w1) 13462 v.AddArg(w2) 13463 v.AddArg(mem) 13464 return true 13465 } 13466 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 13467 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 13468 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 13469 for { 13470 i := v.AuxInt 13471 s := v.Aux 13472 _ = v.Args[2] 13473 p := v.Args[0] 13474 w3 := v.Args[1] 13475 x := v.Args[2] 13476 if x.Op != OpS390XSTMG3 { 13477 break 13478 } 13479 if x.AuxInt != i-24 { 13480 break 13481 } 13482 if x.Aux != s { 13483 break 13484 } 13485 _ = x.Args[4] 13486 if p != x.Args[0] { 13487 break 13488 } 13489 w0 := x.Args[1] 13490 w1 := x.Args[2] 13491 w2 := x.Args[3] 13492 mem := x.Args[4] 13493 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 13494 break 13495 } 13496 v.reset(OpS390XSTMG4) 13497 v.AuxInt = i - 24 13498 v.Aux = s 13499 v.AddArg(p) 13500 v.AddArg(w0) 13501 v.AddArg(w1) 13502 v.AddArg(w2) 13503 v.AddArg(w3) 13504 v.AddArg(mem) 13505 return true 13506 } 13507 return false 13508 } 13509 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 13510 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 13511 // cond: isU12Bit(ValAndOff(sc).Off()+off) 13512 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 13513 for { 13514 sc := v.AuxInt 13515 s := v.Aux 13516 _ = v.Args[1] 13517 v_0 := v.Args[0] 13518 if v_0.Op != OpS390XADDconst { 13519 break 13520 } 13521 off := v_0.AuxInt 13522 ptr := v_0.Args[0] 13523 mem := v.Args[1] 13524 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 13525 break 13526 } 13527 v.reset(OpS390XMOVDstoreconst) 13528 v.AuxInt = ValAndOff(sc).add(off) 13529 v.Aux = s 13530 v.AddArg(ptr) 13531 v.AddArg(mem) 13532 return true 13533 } 13534 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 13535 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 13536 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 13537 for { 13538 sc := v.AuxInt 13539 sym1 := v.Aux 13540 _ = v.Args[1] 13541 v_0 := v.Args[0] 13542 if v_0.Op != OpS390XMOVDaddr { 13543 break 13544 } 13545 off := v_0.AuxInt 13546 sym2 := v_0.Aux 13547 ptr := v_0.Args[0] 13548 mem := v.Args[1] 13549 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 13550 break 13551 } 13552 v.reset(OpS390XMOVDstoreconst) 13553 v.AuxInt = ValAndOff(sc).add(off) 13554 v.Aux = mergeSym(sym1, sym2) 13555 v.AddArg(ptr) 13556 v.AddArg(mem) 13557 return true 13558 } 13559 return false 13560 } 13561 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 13562 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 13563 // cond: 13564 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13565 for { 13566 c := v.AuxInt 13567 sym := v.Aux 13568 _ = v.Args[3] 13569 v_0 := v.Args[0] 13570 if v_0.Op != OpS390XADDconst { 13571 break 13572 } 13573 d := v_0.AuxInt 13574 ptr := v_0.Args[0] 13575 idx := v.Args[1] 13576 val := v.Args[2] 13577 mem := v.Args[3] 13578 v.reset(OpS390XMOVDstoreidx) 13579 v.AuxInt = c + d 13580 v.Aux = sym 13581 v.AddArg(ptr) 13582 v.AddArg(idx) 13583 v.AddArg(val) 13584 v.AddArg(mem) 13585 return true 13586 } 13587 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 13588 // cond: 13589 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13590 for { 13591 c := v.AuxInt 13592 sym := v.Aux 13593 _ = v.Args[3] 13594 idx := v.Args[0] 13595 v_1 := v.Args[1] 13596 if v_1.Op != OpS390XADDconst { 13597 break 13598 } 13599 d := v_1.AuxInt 13600 ptr := v_1.Args[0] 13601 val := v.Args[2] 13602 mem := v.Args[3] 13603 v.reset(OpS390XMOVDstoreidx) 13604 v.AuxInt = c + d 13605 v.Aux = sym 13606 v.AddArg(ptr) 13607 v.AddArg(idx) 13608 v.AddArg(val) 13609 v.AddArg(mem) 13610 return true 13611 } 13612 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13613 // cond: 13614 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13615 for { 13616 c := v.AuxInt 13617 sym := v.Aux 13618 _ = v.Args[3] 13619 ptr := v.Args[0] 13620 v_1 := v.Args[1] 13621 if v_1.Op != OpS390XADDconst { 13622 break 13623 } 13624 d := v_1.AuxInt 13625 idx := v_1.Args[0] 13626 val := v.Args[2] 13627 mem := v.Args[3] 13628 v.reset(OpS390XMOVDstoreidx) 13629 v.AuxInt = c + d 13630 v.Aux = sym 13631 v.AddArg(ptr) 13632 v.AddArg(idx) 13633 v.AddArg(val) 13634 v.AddArg(mem) 13635 return true 13636 } 13637 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 13638 // cond: 13639 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13640 for { 13641 c := v.AuxInt 13642 sym := v.Aux 13643 _ = v.Args[3] 13644 v_0 := v.Args[0] 13645 if v_0.Op != OpS390XADDconst { 13646 break 13647 } 13648 d := v_0.AuxInt 13649 idx := v_0.Args[0] 13650 ptr := v.Args[1] 13651 val := v.Args[2] 13652 mem := v.Args[3] 13653 v.reset(OpS390XMOVDstoreidx) 13654 v.AuxInt = c + d 13655 v.Aux = sym 13656 v.AddArg(ptr) 13657 v.AddArg(idx) 13658 v.AddArg(val) 13659 v.AddArg(mem) 13660 return true 13661 } 13662 return false 13663 } 13664 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 13665 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13666 // cond: x.Uses == 1 && clobber(x) 13667 // result: (MOVWBRstore [i-2] {s} p w mem) 13668 for { 13669 i := v.AuxInt 13670 s := v.Aux 13671 _ = v.Args[2] 13672 p := v.Args[0] 13673 v_1 := v.Args[1] 13674 if v_1.Op != OpS390XSRDconst { 13675 break 13676 } 13677 if v_1.AuxInt != 16 { 13678 break 13679 } 13680 w := v_1.Args[0] 13681 x := v.Args[2] 13682 if x.Op != OpS390XMOVHBRstore { 13683 break 13684 } 13685 if x.AuxInt != i-2 { 13686 break 13687 } 13688 if x.Aux != s { 13689 break 13690 } 13691 _ = x.Args[2] 13692 if p != x.Args[0] { 13693 break 13694 } 13695 if w != x.Args[1] { 13696 break 13697 } 13698 mem := x.Args[2] 13699 if !(x.Uses == 1 && clobber(x)) { 13700 break 13701 } 13702 v.reset(OpS390XMOVWBRstore) 13703 v.AuxInt = i - 2 13704 v.Aux = s 13705 v.AddArg(p) 13706 v.AddArg(w) 13707 v.AddArg(mem) 13708 return true 13709 } 13710 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 13711 // cond: x.Uses == 1 && clobber(x) 13712 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13713 for { 13714 i := v.AuxInt 13715 s := v.Aux 13716 _ = v.Args[2] 13717 p := v.Args[0] 13718 v_1 := v.Args[1] 13719 if v_1.Op != OpS390XSRDconst { 13720 break 13721 } 13722 j := v_1.AuxInt 13723 w := v_1.Args[0] 13724 x := v.Args[2] 13725 if x.Op != OpS390XMOVHBRstore { 13726 break 13727 } 13728 if x.AuxInt != i-2 { 13729 break 13730 } 13731 if x.Aux != s { 13732 break 13733 } 13734 _ = x.Args[2] 13735 if p != x.Args[0] { 13736 break 13737 } 13738 w0 := x.Args[1] 13739 if w0.Op != OpS390XSRDconst { 13740 break 13741 } 13742 if w0.AuxInt != j-16 { 13743 break 13744 } 13745 if w != w0.Args[0] { 13746 break 13747 } 13748 mem := x.Args[2] 13749 if !(x.Uses == 1 && clobber(x)) { 13750 break 13751 } 13752 v.reset(OpS390XMOVWBRstore) 13753 v.AuxInt = i - 2 13754 v.Aux = s 13755 v.AddArg(p) 13756 v.AddArg(w0) 13757 v.AddArg(mem) 13758 return true 13759 } 13760 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13761 // cond: x.Uses == 1 && clobber(x) 13762 // result: (MOVWBRstore [i-2] {s} p w mem) 13763 for { 13764 i := v.AuxInt 13765 s := v.Aux 13766 _ = v.Args[2] 13767 p := v.Args[0] 13768 v_1 := v.Args[1] 13769 if v_1.Op != OpS390XSRWconst { 13770 break 13771 } 13772 if v_1.AuxInt != 16 { 13773 break 13774 } 13775 w := v_1.Args[0] 13776 x := v.Args[2] 13777 if x.Op != OpS390XMOVHBRstore { 13778 break 13779 } 13780 if x.AuxInt != i-2 { 13781 break 13782 } 13783 if x.Aux != s { 13784 break 13785 } 13786 _ = x.Args[2] 13787 if p != x.Args[0] { 13788 break 13789 } 13790 if w != x.Args[1] { 13791 break 13792 } 13793 mem := x.Args[2] 13794 if !(x.Uses == 1 && clobber(x)) { 13795 break 13796 } 13797 v.reset(OpS390XMOVWBRstore) 13798 v.AuxInt = i - 2 13799 v.Aux = s 13800 v.AddArg(p) 13801 v.AddArg(w) 13802 v.AddArg(mem) 13803 return true 13804 } 13805 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 13806 // cond: x.Uses == 1 && clobber(x) 13807 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13808 for { 13809 i := v.AuxInt 13810 s := v.Aux 13811 _ = v.Args[2] 13812 p := v.Args[0] 13813 v_1 := v.Args[1] 13814 if v_1.Op != OpS390XSRWconst { 13815 break 13816 } 13817 j := v_1.AuxInt 13818 w := v_1.Args[0] 13819 x := v.Args[2] 13820 if x.Op != OpS390XMOVHBRstore { 13821 break 13822 } 13823 if x.AuxInt != i-2 { 13824 break 13825 } 13826 if x.Aux != s { 13827 break 13828 } 13829 _ = x.Args[2] 13830 if p != x.Args[0] { 13831 break 13832 } 13833 w0 := x.Args[1] 13834 if w0.Op != OpS390XSRWconst { 13835 break 13836 } 13837 if w0.AuxInt != j-16 { 13838 break 13839 } 13840 if w != w0.Args[0] { 13841 break 13842 } 13843 mem := x.Args[2] 13844 if !(x.Uses == 1 && clobber(x)) { 13845 break 13846 } 13847 v.reset(OpS390XMOVWBRstore) 13848 v.AuxInt = i - 2 13849 v.Aux = s 13850 v.AddArg(p) 13851 v.AddArg(w0) 13852 v.AddArg(mem) 13853 return true 13854 } 13855 return false 13856 } 13857 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 13858 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13859 // cond: x.Uses == 1 && clobber(x) 13860 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13861 for { 13862 i := v.AuxInt 13863 s := v.Aux 13864 _ = v.Args[3] 13865 p := v.Args[0] 13866 idx := v.Args[1] 13867 v_2 := v.Args[2] 13868 if v_2.Op != OpS390XSRDconst { 13869 break 13870 } 13871 if v_2.AuxInt != 16 { 13872 break 13873 } 13874 w := v_2.Args[0] 13875 x := v.Args[3] 13876 if x.Op != OpS390XMOVHBRstoreidx { 13877 break 13878 } 13879 if x.AuxInt != i-2 { 13880 break 13881 } 13882 if x.Aux != s { 13883 break 13884 } 13885 _ = x.Args[3] 13886 if p != x.Args[0] { 13887 break 13888 } 13889 if idx != x.Args[1] { 13890 break 13891 } 13892 if w != x.Args[2] { 13893 break 13894 } 13895 mem := x.Args[3] 13896 if !(x.Uses == 1 && clobber(x)) { 13897 break 13898 } 13899 v.reset(OpS390XMOVWBRstoreidx) 13900 v.AuxInt = i - 2 13901 v.Aux = s 13902 v.AddArg(p) 13903 v.AddArg(idx) 13904 v.AddArg(w) 13905 v.AddArg(mem) 13906 return true 13907 } 13908 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13909 // cond: x.Uses == 1 && clobber(x) 13910 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13911 for { 13912 i := v.AuxInt 13913 s := v.Aux 13914 _ = v.Args[3] 13915 p := v.Args[0] 13916 idx := v.Args[1] 13917 v_2 := v.Args[2] 13918 if v_2.Op != OpS390XSRDconst { 13919 break 13920 } 13921 if v_2.AuxInt != 16 { 13922 break 13923 } 13924 w := v_2.Args[0] 13925 x := v.Args[3] 13926 if x.Op != OpS390XMOVHBRstoreidx { 13927 break 13928 } 13929 if x.AuxInt != i-2 { 13930 break 13931 } 13932 if x.Aux != s { 13933 break 13934 } 13935 _ = x.Args[3] 13936 if idx != x.Args[0] { 13937 break 13938 } 13939 if p != x.Args[1] { 13940 break 13941 } 13942 if w != x.Args[2] { 13943 break 13944 } 13945 mem := x.Args[3] 13946 if !(x.Uses == 1 && clobber(x)) { 13947 break 13948 } 13949 v.reset(OpS390XMOVWBRstoreidx) 13950 v.AuxInt = i - 2 13951 v.Aux = s 13952 v.AddArg(p) 13953 v.AddArg(idx) 13954 v.AddArg(w) 13955 v.AddArg(mem) 13956 return true 13957 } 13958 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13959 // cond: x.Uses == 1 && clobber(x) 13960 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13961 for { 13962 i := v.AuxInt 13963 s := v.Aux 13964 _ = v.Args[3] 13965 idx := v.Args[0] 13966 p := v.Args[1] 13967 v_2 := v.Args[2] 13968 if v_2.Op != OpS390XSRDconst { 13969 break 13970 } 13971 if v_2.AuxInt != 16 { 13972 break 13973 } 13974 w := v_2.Args[0] 13975 x := v.Args[3] 13976 if x.Op != OpS390XMOVHBRstoreidx { 13977 break 13978 } 13979 if x.AuxInt != i-2 { 13980 break 13981 } 13982 if x.Aux != s { 13983 break 13984 } 13985 _ = x.Args[3] 13986 if p != x.Args[0] { 13987 break 13988 } 13989 if idx != x.Args[1] { 13990 break 13991 } 13992 if w != x.Args[2] { 13993 break 13994 } 13995 mem := x.Args[3] 13996 if !(x.Uses == 1 && clobber(x)) { 13997 break 13998 } 13999 v.reset(OpS390XMOVWBRstoreidx) 14000 v.AuxInt = i - 2 14001 v.Aux = s 14002 v.AddArg(p) 14003 v.AddArg(idx) 14004 v.AddArg(w) 14005 v.AddArg(mem) 14006 return true 14007 } 14008 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14009 // cond: x.Uses == 1 && clobber(x) 14010 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14011 for { 14012 i := v.AuxInt 14013 s := v.Aux 14014 _ = v.Args[3] 14015 idx := v.Args[0] 14016 p := v.Args[1] 14017 v_2 := v.Args[2] 14018 if v_2.Op != OpS390XSRDconst { 14019 break 14020 } 14021 if v_2.AuxInt != 16 { 14022 break 14023 } 14024 w := v_2.Args[0] 14025 x := v.Args[3] 14026 if x.Op != OpS390XMOVHBRstoreidx { 14027 break 14028 } 14029 if x.AuxInt != i-2 { 14030 break 14031 } 14032 if x.Aux != s { 14033 break 14034 } 14035 _ = x.Args[3] 14036 if idx != x.Args[0] { 14037 break 14038 } 14039 if p != x.Args[1] { 14040 break 14041 } 14042 if w != x.Args[2] { 14043 break 14044 } 14045 mem := x.Args[3] 14046 if !(x.Uses == 1 && clobber(x)) { 14047 break 14048 } 14049 v.reset(OpS390XMOVWBRstoreidx) 14050 v.AuxInt = i - 2 14051 v.Aux = s 14052 v.AddArg(p) 14053 v.AddArg(idx) 14054 v.AddArg(w) 14055 v.AddArg(mem) 14056 return true 14057 } 14058 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 14059 // cond: x.Uses == 1 && clobber(x) 14060 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14061 for { 14062 i := v.AuxInt 14063 s := v.Aux 14064 _ = v.Args[3] 14065 p := v.Args[0] 14066 idx := v.Args[1] 14067 v_2 := v.Args[2] 14068 if v_2.Op != OpS390XSRDconst { 14069 break 14070 } 14071 j := v_2.AuxInt 14072 w := v_2.Args[0] 14073 x := v.Args[3] 14074 if x.Op != OpS390XMOVHBRstoreidx { 14075 break 14076 } 14077 if x.AuxInt != i-2 { 14078 break 14079 } 14080 if x.Aux != s { 14081 break 14082 } 14083 _ = x.Args[3] 14084 if p != x.Args[0] { 14085 break 14086 } 14087 if idx != x.Args[1] { 14088 break 14089 } 14090 w0 := x.Args[2] 14091 if w0.Op != OpS390XSRDconst { 14092 break 14093 } 14094 if w0.AuxInt != j-16 { 14095 break 14096 } 14097 if w != w0.Args[0] { 14098 break 14099 } 14100 mem := x.Args[3] 14101 if !(x.Uses == 1 && clobber(x)) { 14102 break 14103 } 14104 v.reset(OpS390XMOVWBRstoreidx) 14105 v.AuxInt = i - 2 14106 v.Aux = s 14107 v.AddArg(p) 14108 v.AddArg(idx) 14109 v.AddArg(w0) 14110 v.AddArg(mem) 14111 return true 14112 } 14113 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 14114 // cond: x.Uses == 1 && clobber(x) 14115 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14116 for { 14117 i := v.AuxInt 14118 s := v.Aux 14119 _ = v.Args[3] 14120 p := v.Args[0] 14121 idx := v.Args[1] 14122 v_2 := v.Args[2] 14123 if v_2.Op != OpS390XSRDconst { 14124 break 14125 } 14126 j := v_2.AuxInt 14127 w := v_2.Args[0] 14128 x := v.Args[3] 14129 if x.Op != OpS390XMOVHBRstoreidx { 14130 break 14131 } 14132 if x.AuxInt != i-2 { 14133 break 14134 } 14135 if x.Aux != s { 14136 break 14137 } 14138 _ = x.Args[3] 14139 if idx != x.Args[0] { 14140 break 14141 } 14142 if p != x.Args[1] { 14143 break 14144 } 14145 w0 := x.Args[2] 14146 if w0.Op != OpS390XSRDconst { 14147 break 14148 } 14149 if w0.AuxInt != j-16 { 14150 break 14151 } 14152 if w != w0.Args[0] { 14153 break 14154 } 14155 mem := x.Args[3] 14156 if !(x.Uses == 1 && clobber(x)) { 14157 break 14158 } 14159 v.reset(OpS390XMOVWBRstoreidx) 14160 v.AuxInt = i - 2 14161 v.Aux = s 14162 v.AddArg(p) 14163 v.AddArg(idx) 14164 v.AddArg(w0) 14165 v.AddArg(mem) 14166 return true 14167 } 14168 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 14169 // cond: x.Uses == 1 && clobber(x) 14170 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14171 for { 14172 i := v.AuxInt 14173 s := v.Aux 14174 _ = v.Args[3] 14175 idx := v.Args[0] 14176 p := v.Args[1] 14177 v_2 := v.Args[2] 14178 if v_2.Op != OpS390XSRDconst { 14179 break 14180 } 14181 j := v_2.AuxInt 14182 w := v_2.Args[0] 14183 x := v.Args[3] 14184 if x.Op != OpS390XMOVHBRstoreidx { 14185 break 14186 } 14187 if x.AuxInt != i-2 { 14188 break 14189 } 14190 if x.Aux != s { 14191 break 14192 } 14193 _ = x.Args[3] 14194 if p != x.Args[0] { 14195 break 14196 } 14197 if idx != x.Args[1] { 14198 break 14199 } 14200 w0 := x.Args[2] 14201 if w0.Op != OpS390XSRDconst { 14202 break 14203 } 14204 if w0.AuxInt != j-16 { 14205 break 14206 } 14207 if w != w0.Args[0] { 14208 break 14209 } 14210 mem := x.Args[3] 14211 if !(x.Uses == 1 && clobber(x)) { 14212 break 14213 } 14214 v.reset(OpS390XMOVWBRstoreidx) 14215 v.AuxInt = i - 2 14216 v.Aux = s 14217 v.AddArg(p) 14218 v.AddArg(idx) 14219 v.AddArg(w0) 14220 v.AddArg(mem) 14221 return true 14222 } 14223 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 14224 // cond: x.Uses == 1 && clobber(x) 14225 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14226 for { 14227 i := v.AuxInt 14228 s := v.Aux 14229 _ = v.Args[3] 14230 idx := v.Args[0] 14231 p := v.Args[1] 14232 v_2 := v.Args[2] 14233 if v_2.Op != OpS390XSRDconst { 14234 break 14235 } 14236 j := v_2.AuxInt 14237 w := v_2.Args[0] 14238 x := v.Args[3] 14239 if x.Op != OpS390XMOVHBRstoreidx { 14240 break 14241 } 14242 if x.AuxInt != i-2 { 14243 break 14244 } 14245 if x.Aux != s { 14246 break 14247 } 14248 _ = x.Args[3] 14249 if idx != x.Args[0] { 14250 break 14251 } 14252 if p != x.Args[1] { 14253 break 14254 } 14255 w0 := x.Args[2] 14256 if w0.Op != OpS390XSRDconst { 14257 break 14258 } 14259 if w0.AuxInt != j-16 { 14260 break 14261 } 14262 if w != w0.Args[0] { 14263 break 14264 } 14265 mem := x.Args[3] 14266 if !(x.Uses == 1 && clobber(x)) { 14267 break 14268 } 14269 v.reset(OpS390XMOVWBRstoreidx) 14270 v.AuxInt = i - 2 14271 v.Aux = s 14272 v.AddArg(p) 14273 v.AddArg(idx) 14274 v.AddArg(w0) 14275 v.AddArg(mem) 14276 return true 14277 } 14278 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14279 // cond: x.Uses == 1 && clobber(x) 14280 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14281 for { 14282 i := v.AuxInt 14283 s := v.Aux 14284 _ = v.Args[3] 14285 p := v.Args[0] 14286 idx := v.Args[1] 14287 v_2 := v.Args[2] 14288 if v_2.Op != OpS390XSRWconst { 14289 break 14290 } 14291 if v_2.AuxInt != 16 { 14292 break 14293 } 14294 w := v_2.Args[0] 14295 x := v.Args[3] 14296 if x.Op != OpS390XMOVHBRstoreidx { 14297 break 14298 } 14299 if x.AuxInt != i-2 { 14300 break 14301 } 14302 if x.Aux != s { 14303 break 14304 } 14305 _ = x.Args[3] 14306 if p != x.Args[0] { 14307 break 14308 } 14309 if idx != x.Args[1] { 14310 break 14311 } 14312 if w != x.Args[2] { 14313 break 14314 } 14315 mem := x.Args[3] 14316 if !(x.Uses == 1 && clobber(x)) { 14317 break 14318 } 14319 v.reset(OpS390XMOVWBRstoreidx) 14320 v.AuxInt = i - 2 14321 v.Aux = s 14322 v.AddArg(p) 14323 v.AddArg(idx) 14324 v.AddArg(w) 14325 v.AddArg(mem) 14326 return true 14327 } 14328 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14329 // cond: x.Uses == 1 && clobber(x) 14330 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14331 for { 14332 i := v.AuxInt 14333 s := v.Aux 14334 _ = v.Args[3] 14335 p := v.Args[0] 14336 idx := v.Args[1] 14337 v_2 := v.Args[2] 14338 if v_2.Op != OpS390XSRWconst { 14339 break 14340 } 14341 if v_2.AuxInt != 16 { 14342 break 14343 } 14344 w := v_2.Args[0] 14345 x := v.Args[3] 14346 if x.Op != OpS390XMOVHBRstoreidx { 14347 break 14348 } 14349 if x.AuxInt != i-2 { 14350 break 14351 } 14352 if x.Aux != s { 14353 break 14354 } 14355 _ = x.Args[3] 14356 if idx != x.Args[0] { 14357 break 14358 } 14359 if p != x.Args[1] { 14360 break 14361 } 14362 if w != x.Args[2] { 14363 break 14364 } 14365 mem := x.Args[3] 14366 if !(x.Uses == 1 && clobber(x)) { 14367 break 14368 } 14369 v.reset(OpS390XMOVWBRstoreidx) 14370 v.AuxInt = i - 2 14371 v.Aux = s 14372 v.AddArg(p) 14373 v.AddArg(idx) 14374 v.AddArg(w) 14375 v.AddArg(mem) 14376 return true 14377 } 14378 return false 14379 } 14380 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 14381 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14382 // cond: x.Uses == 1 && clobber(x) 14383 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14384 for { 14385 i := v.AuxInt 14386 s := v.Aux 14387 _ = v.Args[3] 14388 idx := v.Args[0] 14389 p := v.Args[1] 14390 v_2 := v.Args[2] 14391 if v_2.Op != OpS390XSRWconst { 14392 break 14393 } 14394 if v_2.AuxInt != 16 { 14395 break 14396 } 14397 w := v_2.Args[0] 14398 x := v.Args[3] 14399 if x.Op != OpS390XMOVHBRstoreidx { 14400 break 14401 } 14402 if x.AuxInt != i-2 { 14403 break 14404 } 14405 if x.Aux != s { 14406 break 14407 } 14408 _ = x.Args[3] 14409 if p != x.Args[0] { 14410 break 14411 } 14412 if idx != x.Args[1] { 14413 break 14414 } 14415 if w != x.Args[2] { 14416 break 14417 } 14418 mem := x.Args[3] 14419 if !(x.Uses == 1 && clobber(x)) { 14420 break 14421 } 14422 v.reset(OpS390XMOVWBRstoreidx) 14423 v.AuxInt = i - 2 14424 v.Aux = s 14425 v.AddArg(p) 14426 v.AddArg(idx) 14427 v.AddArg(w) 14428 v.AddArg(mem) 14429 return true 14430 } 14431 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14432 // cond: x.Uses == 1 && clobber(x) 14433 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14434 for { 14435 i := v.AuxInt 14436 s := v.Aux 14437 _ = v.Args[3] 14438 idx := v.Args[0] 14439 p := v.Args[1] 14440 v_2 := v.Args[2] 14441 if v_2.Op != OpS390XSRWconst { 14442 break 14443 } 14444 if v_2.AuxInt != 16 { 14445 break 14446 } 14447 w := v_2.Args[0] 14448 x := v.Args[3] 14449 if x.Op != OpS390XMOVHBRstoreidx { 14450 break 14451 } 14452 if x.AuxInt != i-2 { 14453 break 14454 } 14455 if x.Aux != s { 14456 break 14457 } 14458 _ = x.Args[3] 14459 if idx != x.Args[0] { 14460 break 14461 } 14462 if p != x.Args[1] { 14463 break 14464 } 14465 if w != x.Args[2] { 14466 break 14467 } 14468 mem := x.Args[3] 14469 if !(x.Uses == 1 && clobber(x)) { 14470 break 14471 } 14472 v.reset(OpS390XMOVWBRstoreidx) 14473 v.AuxInt = i - 2 14474 v.Aux = s 14475 v.AddArg(p) 14476 v.AddArg(idx) 14477 v.AddArg(w) 14478 v.AddArg(mem) 14479 return true 14480 } 14481 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 14482 // cond: x.Uses == 1 && clobber(x) 14483 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14484 for { 14485 i := v.AuxInt 14486 s := v.Aux 14487 _ = v.Args[3] 14488 p := v.Args[0] 14489 idx := v.Args[1] 14490 v_2 := v.Args[2] 14491 if v_2.Op != OpS390XSRWconst { 14492 break 14493 } 14494 j := v_2.AuxInt 14495 w := v_2.Args[0] 14496 x := v.Args[3] 14497 if x.Op != OpS390XMOVHBRstoreidx { 14498 break 14499 } 14500 if x.AuxInt != i-2 { 14501 break 14502 } 14503 if x.Aux != s { 14504 break 14505 } 14506 _ = x.Args[3] 14507 if p != x.Args[0] { 14508 break 14509 } 14510 if idx != x.Args[1] { 14511 break 14512 } 14513 w0 := x.Args[2] 14514 if w0.Op != OpS390XSRWconst { 14515 break 14516 } 14517 if w0.AuxInt != j-16 { 14518 break 14519 } 14520 if w != w0.Args[0] { 14521 break 14522 } 14523 mem := x.Args[3] 14524 if !(x.Uses == 1 && clobber(x)) { 14525 break 14526 } 14527 v.reset(OpS390XMOVWBRstoreidx) 14528 v.AuxInt = i - 2 14529 v.Aux = s 14530 v.AddArg(p) 14531 v.AddArg(idx) 14532 v.AddArg(w0) 14533 v.AddArg(mem) 14534 return true 14535 } 14536 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14537 // cond: x.Uses == 1 && clobber(x) 14538 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14539 for { 14540 i := v.AuxInt 14541 s := v.Aux 14542 _ = v.Args[3] 14543 p := v.Args[0] 14544 idx := v.Args[1] 14545 v_2 := v.Args[2] 14546 if v_2.Op != OpS390XSRWconst { 14547 break 14548 } 14549 j := v_2.AuxInt 14550 w := v_2.Args[0] 14551 x := v.Args[3] 14552 if x.Op != OpS390XMOVHBRstoreidx { 14553 break 14554 } 14555 if x.AuxInt != i-2 { 14556 break 14557 } 14558 if x.Aux != s { 14559 break 14560 } 14561 _ = x.Args[3] 14562 if idx != x.Args[0] { 14563 break 14564 } 14565 if p != x.Args[1] { 14566 break 14567 } 14568 w0 := x.Args[2] 14569 if w0.Op != OpS390XSRWconst { 14570 break 14571 } 14572 if w0.AuxInt != j-16 { 14573 break 14574 } 14575 if w != w0.Args[0] { 14576 break 14577 } 14578 mem := x.Args[3] 14579 if !(x.Uses == 1 && clobber(x)) { 14580 break 14581 } 14582 v.reset(OpS390XMOVWBRstoreidx) 14583 v.AuxInt = i - 2 14584 v.Aux = s 14585 v.AddArg(p) 14586 v.AddArg(idx) 14587 v.AddArg(w0) 14588 v.AddArg(mem) 14589 return true 14590 } 14591 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 14592 // cond: x.Uses == 1 && clobber(x) 14593 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14594 for { 14595 i := v.AuxInt 14596 s := v.Aux 14597 _ = v.Args[3] 14598 idx := v.Args[0] 14599 p := v.Args[1] 14600 v_2 := v.Args[2] 14601 if v_2.Op != OpS390XSRWconst { 14602 break 14603 } 14604 j := v_2.AuxInt 14605 w := v_2.Args[0] 14606 x := v.Args[3] 14607 if x.Op != OpS390XMOVHBRstoreidx { 14608 break 14609 } 14610 if x.AuxInt != i-2 { 14611 break 14612 } 14613 if x.Aux != s { 14614 break 14615 } 14616 _ = x.Args[3] 14617 if p != x.Args[0] { 14618 break 14619 } 14620 if idx != x.Args[1] { 14621 break 14622 } 14623 w0 := x.Args[2] 14624 if w0.Op != OpS390XSRWconst { 14625 break 14626 } 14627 if w0.AuxInt != j-16 { 14628 break 14629 } 14630 if w != w0.Args[0] { 14631 break 14632 } 14633 mem := x.Args[3] 14634 if !(x.Uses == 1 && clobber(x)) { 14635 break 14636 } 14637 v.reset(OpS390XMOVWBRstoreidx) 14638 v.AuxInt = i - 2 14639 v.Aux = s 14640 v.AddArg(p) 14641 v.AddArg(idx) 14642 v.AddArg(w0) 14643 v.AddArg(mem) 14644 return true 14645 } 14646 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14647 // cond: x.Uses == 1 && clobber(x) 14648 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14649 for { 14650 i := v.AuxInt 14651 s := v.Aux 14652 _ = v.Args[3] 14653 idx := v.Args[0] 14654 p := v.Args[1] 14655 v_2 := v.Args[2] 14656 if v_2.Op != OpS390XSRWconst { 14657 break 14658 } 14659 j := v_2.AuxInt 14660 w := v_2.Args[0] 14661 x := v.Args[3] 14662 if x.Op != OpS390XMOVHBRstoreidx { 14663 break 14664 } 14665 if x.AuxInt != i-2 { 14666 break 14667 } 14668 if x.Aux != s { 14669 break 14670 } 14671 _ = x.Args[3] 14672 if idx != x.Args[0] { 14673 break 14674 } 14675 if p != x.Args[1] { 14676 break 14677 } 14678 w0 := x.Args[2] 14679 if w0.Op != OpS390XSRWconst { 14680 break 14681 } 14682 if w0.AuxInt != j-16 { 14683 break 14684 } 14685 if w != w0.Args[0] { 14686 break 14687 } 14688 mem := x.Args[3] 14689 if !(x.Uses == 1 && clobber(x)) { 14690 break 14691 } 14692 v.reset(OpS390XMOVWBRstoreidx) 14693 v.AuxInt = i - 2 14694 v.Aux = s 14695 v.AddArg(p) 14696 v.AddArg(idx) 14697 v.AddArg(w0) 14698 v.AddArg(mem) 14699 return true 14700 } 14701 return false 14702 } 14703 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 14704 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 14705 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 14706 // result: (MOVHZreg x) 14707 for { 14708 off := v.AuxInt 14709 sym := v.Aux 14710 _ = v.Args[1] 14711 ptr := v.Args[0] 14712 v_1 := v.Args[1] 14713 if v_1.Op != OpS390XMOVHstore { 14714 break 14715 } 14716 off2 := v_1.AuxInt 14717 sym2 := v_1.Aux 14718 _ = v_1.Args[2] 14719 ptr2 := v_1.Args[0] 14720 x := v_1.Args[1] 14721 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 14722 break 14723 } 14724 v.reset(OpS390XMOVHZreg) 14725 v.AddArg(x) 14726 return true 14727 } 14728 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 14729 // cond: is20Bit(off1+off2) 14730 // result: (MOVHZload [off1+off2] {sym} ptr mem) 14731 for { 14732 off1 := v.AuxInt 14733 sym := v.Aux 14734 _ = v.Args[1] 14735 v_0 := v.Args[0] 14736 if v_0.Op != OpS390XADDconst { 14737 break 14738 } 14739 off2 := v_0.AuxInt 14740 ptr := v_0.Args[0] 14741 mem := v.Args[1] 14742 if !(is20Bit(off1 + off2)) { 14743 break 14744 } 14745 v.reset(OpS390XMOVHZload) 14746 v.AuxInt = off1 + off2 14747 v.Aux = sym 14748 v.AddArg(ptr) 14749 v.AddArg(mem) 14750 return true 14751 } 14752 // match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 14753 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 14754 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14755 for { 14756 off1 := v.AuxInt 14757 sym1 := v.Aux 14758 _ = v.Args[1] 14759 v_0 := v.Args[0] 14760 if v_0.Op != OpS390XMOVDaddr { 14761 break 14762 } 14763 t := v_0.Type 14764 off2 := v_0.AuxInt 14765 sym2 := v_0.Aux 14766 base := v_0.Args[0] 14767 mem := v.Args[1] 14768 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 14769 break 14770 } 14771 v.reset(OpS390XMOVHZload) 14772 v.AuxInt = off1 + off2 14773 v.Aux = mergeSym(sym1, sym2) 14774 v.AddArg(base) 14775 v.AddArg(mem) 14776 return true 14777 } 14778 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 14779 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14780 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 14781 for { 14782 off1 := v.AuxInt 14783 sym1 := v.Aux 14784 _ = v.Args[1] 14785 v_0 := v.Args[0] 14786 if v_0.Op != OpS390XMOVDaddridx { 14787 break 14788 } 14789 off2 := v_0.AuxInt 14790 sym2 := v_0.Aux 14791 _ = v_0.Args[1] 14792 ptr := v_0.Args[0] 14793 idx := v_0.Args[1] 14794 mem := v.Args[1] 14795 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14796 break 14797 } 14798 v.reset(OpS390XMOVHZloadidx) 14799 v.AuxInt = off1 + off2 14800 v.Aux = mergeSym(sym1, sym2) 14801 v.AddArg(ptr) 14802 v.AddArg(idx) 14803 v.AddArg(mem) 14804 return true 14805 } 14806 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 14807 // cond: ptr.Op != OpSB 14808 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 14809 for { 14810 off := v.AuxInt 14811 sym := v.Aux 14812 _ = v.Args[1] 14813 v_0 := v.Args[0] 14814 if v_0.Op != OpS390XADD { 14815 break 14816 } 14817 _ = v_0.Args[1] 14818 ptr := v_0.Args[0] 14819 idx := v_0.Args[1] 14820 mem := v.Args[1] 14821 if !(ptr.Op != OpSB) { 14822 break 14823 } 14824 v.reset(OpS390XMOVHZloadidx) 14825 v.AuxInt = off 14826 v.Aux = sym 14827 v.AddArg(ptr) 14828 v.AddArg(idx) 14829 v.AddArg(mem) 14830 return true 14831 } 14832 return false 14833 } 14834 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 14835 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 14836 // cond: 14837 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14838 for { 14839 c := v.AuxInt 14840 sym := v.Aux 14841 _ = v.Args[2] 14842 v_0 := v.Args[0] 14843 if v_0.Op != OpS390XADDconst { 14844 break 14845 } 14846 d := v_0.AuxInt 14847 ptr := v_0.Args[0] 14848 idx := v.Args[1] 14849 mem := v.Args[2] 14850 v.reset(OpS390XMOVHZloadidx) 14851 v.AuxInt = c + d 14852 v.Aux = sym 14853 v.AddArg(ptr) 14854 v.AddArg(idx) 14855 v.AddArg(mem) 14856 return true 14857 } 14858 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 14859 // cond: 14860 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14861 for { 14862 c := v.AuxInt 14863 sym := v.Aux 14864 _ = v.Args[2] 14865 idx := v.Args[0] 14866 v_1 := v.Args[1] 14867 if v_1.Op != OpS390XADDconst { 14868 break 14869 } 14870 d := v_1.AuxInt 14871 ptr := v_1.Args[0] 14872 mem := v.Args[2] 14873 v.reset(OpS390XMOVHZloadidx) 14874 v.AuxInt = c + d 14875 v.Aux = sym 14876 v.AddArg(ptr) 14877 v.AddArg(idx) 14878 v.AddArg(mem) 14879 return true 14880 } 14881 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 14882 // cond: 14883 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14884 for { 14885 c := v.AuxInt 14886 sym := v.Aux 14887 _ = v.Args[2] 14888 ptr := v.Args[0] 14889 v_1 := v.Args[1] 14890 if v_1.Op != OpS390XADDconst { 14891 break 14892 } 14893 d := v_1.AuxInt 14894 idx := v_1.Args[0] 14895 mem := v.Args[2] 14896 v.reset(OpS390XMOVHZloadidx) 14897 v.AuxInt = c + d 14898 v.Aux = sym 14899 v.AddArg(ptr) 14900 v.AddArg(idx) 14901 v.AddArg(mem) 14902 return true 14903 } 14904 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 14905 // cond: 14906 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14907 for { 14908 c := v.AuxInt 14909 sym := v.Aux 14910 _ = v.Args[2] 14911 v_0 := v.Args[0] 14912 if v_0.Op != OpS390XADDconst { 14913 break 14914 } 14915 d := v_0.AuxInt 14916 idx := v_0.Args[0] 14917 ptr := v.Args[1] 14918 mem := v.Args[2] 14919 v.reset(OpS390XMOVHZloadidx) 14920 v.AuxInt = c + d 14921 v.Aux = sym 14922 v.AddArg(ptr) 14923 v.AddArg(idx) 14924 v.AddArg(mem) 14925 return true 14926 } 14927 return false 14928 } 14929 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 14930 b := v.Block 14931 _ = b 14932 // match: (MOVHZreg x:(MOVBZload _ _)) 14933 // cond: 14934 // result: (MOVDreg x) 14935 for { 14936 x := v.Args[0] 14937 if x.Op != OpS390XMOVBZload { 14938 break 14939 } 14940 _ = x.Args[1] 14941 v.reset(OpS390XMOVDreg) 14942 v.AddArg(x) 14943 return true 14944 } 14945 // match: (MOVHZreg x:(MOVHZload _ _)) 14946 // cond: 14947 // result: (MOVDreg x) 14948 for { 14949 x := v.Args[0] 14950 if x.Op != OpS390XMOVHZload { 14951 break 14952 } 14953 _ = x.Args[1] 14954 v.reset(OpS390XMOVDreg) 14955 v.AddArg(x) 14956 return true 14957 } 14958 // match: (MOVHZreg x:(Arg <t>)) 14959 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 14960 // result: (MOVDreg x) 14961 for { 14962 x := v.Args[0] 14963 if x.Op != OpArg { 14964 break 14965 } 14966 t := x.Type 14967 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 14968 break 14969 } 14970 v.reset(OpS390XMOVDreg) 14971 v.AddArg(x) 14972 return true 14973 } 14974 // match: (MOVHZreg x:(MOVBZreg _)) 14975 // cond: 14976 // result: (MOVDreg x) 14977 for { 14978 x := v.Args[0] 14979 if x.Op != OpS390XMOVBZreg { 14980 break 14981 } 14982 v.reset(OpS390XMOVDreg) 14983 v.AddArg(x) 14984 return true 14985 } 14986 // match: (MOVHZreg x:(MOVHZreg _)) 14987 // cond: 14988 // result: (MOVDreg x) 14989 for { 14990 x := v.Args[0] 14991 if x.Op != OpS390XMOVHZreg { 14992 break 14993 } 14994 v.reset(OpS390XMOVDreg) 14995 v.AddArg(x) 14996 return true 14997 } 14998 // match: (MOVHZreg (MOVDconst [c])) 14999 // cond: 15000 // result: (MOVDconst [int64(uint16(c))]) 15001 for { 15002 v_0 := v.Args[0] 15003 if v_0.Op != OpS390XMOVDconst { 15004 break 15005 } 15006 c := v_0.AuxInt 15007 v.reset(OpS390XMOVDconst) 15008 v.AuxInt = int64(uint16(c)) 15009 return true 15010 } 15011 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 15012 // cond: x.Uses == 1 && clobber(x) 15013 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 15014 for { 15015 x := v.Args[0] 15016 if x.Op != OpS390XMOVHZload { 15017 break 15018 } 15019 off := x.AuxInt 15020 sym := x.Aux 15021 _ = x.Args[1] 15022 ptr := x.Args[0] 15023 mem := x.Args[1] 15024 if !(x.Uses == 1 && clobber(x)) { 15025 break 15026 } 15027 b = x.Block 15028 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 15029 v.reset(OpCopy) 15030 v.AddArg(v0) 15031 v0.AuxInt = off 15032 v0.Aux = sym 15033 v0.AddArg(ptr) 15034 v0.AddArg(mem) 15035 return true 15036 } 15037 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 15038 // cond: x.Uses == 1 && clobber(x) 15039 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 15040 for { 15041 x := v.Args[0] 15042 if x.Op != OpS390XMOVHZloadidx { 15043 break 15044 } 15045 off := x.AuxInt 15046 sym := x.Aux 15047 _ = x.Args[2] 15048 ptr := x.Args[0] 15049 idx := x.Args[1] 15050 mem := x.Args[2] 15051 if !(x.Uses == 1 && clobber(x)) { 15052 break 15053 } 15054 b = x.Block 15055 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 15056 v.reset(OpCopy) 15057 v.AddArg(v0) 15058 v0.AuxInt = off 15059 v0.Aux = sym 15060 v0.AddArg(ptr) 15061 v0.AddArg(idx) 15062 v0.AddArg(mem) 15063 return true 15064 } 15065 return false 15066 } 15067 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 15068 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 15069 // cond: is20Bit(off1+off2) 15070 // result: (MOVHload [off1+off2] {sym} ptr mem) 15071 for { 15072 off1 := v.AuxInt 15073 sym := v.Aux 15074 _ = v.Args[1] 15075 v_0 := v.Args[0] 15076 if v_0.Op != OpS390XADDconst { 15077 break 15078 } 15079 off2 := v_0.AuxInt 15080 ptr := v_0.Args[0] 15081 mem := v.Args[1] 15082 if !(is20Bit(off1 + off2)) { 15083 break 15084 } 15085 v.reset(OpS390XMOVHload) 15086 v.AuxInt = off1 + off2 15087 v.Aux = sym 15088 v.AddArg(ptr) 15089 v.AddArg(mem) 15090 return true 15091 } 15092 // match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 15093 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 15094 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 15095 for { 15096 off1 := v.AuxInt 15097 sym1 := v.Aux 15098 _ = v.Args[1] 15099 v_0 := v.Args[0] 15100 if v_0.Op != OpS390XMOVDaddr { 15101 break 15102 } 15103 t := v_0.Type 15104 off2 := v_0.AuxInt 15105 sym2 := v_0.Aux 15106 base := v_0.Args[0] 15107 mem := v.Args[1] 15108 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 15109 break 15110 } 15111 v.reset(OpS390XMOVHload) 15112 v.AuxInt = off1 + off2 15113 v.Aux = mergeSym(sym1, sym2) 15114 v.AddArg(base) 15115 v.AddArg(mem) 15116 return true 15117 } 15118 return false 15119 } 15120 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 15121 b := v.Block 15122 _ = b 15123 // match: (MOVHreg x:(MOVBload _ _)) 15124 // cond: 15125 // result: (MOVDreg x) 15126 for { 15127 x := v.Args[0] 15128 if x.Op != OpS390XMOVBload { 15129 break 15130 } 15131 _ = x.Args[1] 15132 v.reset(OpS390XMOVDreg) 15133 v.AddArg(x) 15134 return true 15135 } 15136 // match: (MOVHreg x:(MOVBZload _ _)) 15137 // cond: 15138 // result: (MOVDreg x) 15139 for { 15140 x := v.Args[0] 15141 if x.Op != OpS390XMOVBZload { 15142 break 15143 } 15144 _ = x.Args[1] 15145 v.reset(OpS390XMOVDreg) 15146 v.AddArg(x) 15147 return true 15148 } 15149 // match: (MOVHreg x:(MOVHload _ _)) 15150 // cond: 15151 // result: (MOVDreg x) 15152 for { 15153 x := v.Args[0] 15154 if x.Op != OpS390XMOVHload { 15155 break 15156 } 15157 _ = x.Args[1] 15158 v.reset(OpS390XMOVDreg) 15159 v.AddArg(x) 15160 return true 15161 } 15162 // match: (MOVHreg x:(Arg <t>)) 15163 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 15164 // result: (MOVDreg x) 15165 for { 15166 x := v.Args[0] 15167 if x.Op != OpArg { 15168 break 15169 } 15170 t := x.Type 15171 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 15172 break 15173 } 15174 v.reset(OpS390XMOVDreg) 15175 v.AddArg(x) 15176 return true 15177 } 15178 // match: (MOVHreg x:(MOVBreg _)) 15179 // cond: 15180 // result: (MOVDreg x) 15181 for { 15182 x := v.Args[0] 15183 if x.Op != OpS390XMOVBreg { 15184 break 15185 } 15186 v.reset(OpS390XMOVDreg) 15187 v.AddArg(x) 15188 return true 15189 } 15190 // match: (MOVHreg x:(MOVBZreg _)) 15191 // cond: 15192 // result: (MOVDreg x) 15193 for { 15194 x := v.Args[0] 15195 if x.Op != OpS390XMOVBZreg { 15196 break 15197 } 15198 v.reset(OpS390XMOVDreg) 15199 v.AddArg(x) 15200 return true 15201 } 15202 // match: (MOVHreg x:(MOVHreg _)) 15203 // cond: 15204 // result: (MOVDreg x) 15205 for { 15206 x := v.Args[0] 15207 if x.Op != OpS390XMOVHreg { 15208 break 15209 } 15210 v.reset(OpS390XMOVDreg) 15211 v.AddArg(x) 15212 return true 15213 } 15214 // match: (MOVHreg (MOVDconst [c])) 15215 // cond: 15216 // result: (MOVDconst [int64(int16(c))]) 15217 for { 15218 v_0 := v.Args[0] 15219 if v_0.Op != OpS390XMOVDconst { 15220 break 15221 } 15222 c := v_0.AuxInt 15223 v.reset(OpS390XMOVDconst) 15224 v.AuxInt = int64(int16(c)) 15225 return true 15226 } 15227 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 15228 // cond: x.Uses == 1 && clobber(x) 15229 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 15230 for { 15231 x := v.Args[0] 15232 if x.Op != OpS390XMOVHZload { 15233 break 15234 } 15235 off := x.AuxInt 15236 sym := x.Aux 15237 _ = x.Args[1] 15238 ptr := x.Args[0] 15239 mem := x.Args[1] 15240 if !(x.Uses == 1 && clobber(x)) { 15241 break 15242 } 15243 b = x.Block 15244 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 15245 v.reset(OpCopy) 15246 v.AddArg(v0) 15247 v0.AuxInt = off 15248 v0.Aux = sym 15249 v0.AddArg(ptr) 15250 v0.AddArg(mem) 15251 return true 15252 } 15253 return false 15254 } 15255 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 15256 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 15257 // cond: 15258 // result: (MOVHstore [off] {sym} ptr x mem) 15259 for { 15260 off := v.AuxInt 15261 sym := v.Aux 15262 _ = v.Args[2] 15263 ptr := v.Args[0] 15264 v_1 := v.Args[1] 15265 if v_1.Op != OpS390XMOVHreg { 15266 break 15267 } 15268 x := v_1.Args[0] 15269 mem := v.Args[2] 15270 v.reset(OpS390XMOVHstore) 15271 v.AuxInt = off 15272 v.Aux = sym 15273 v.AddArg(ptr) 15274 v.AddArg(x) 15275 v.AddArg(mem) 15276 return true 15277 } 15278 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 15279 // cond: 15280 // result: (MOVHstore [off] {sym} ptr x mem) 15281 for { 15282 off := v.AuxInt 15283 sym := v.Aux 15284 _ = v.Args[2] 15285 ptr := v.Args[0] 15286 v_1 := v.Args[1] 15287 if v_1.Op != OpS390XMOVHZreg { 15288 break 15289 } 15290 x := v_1.Args[0] 15291 mem := v.Args[2] 15292 v.reset(OpS390XMOVHstore) 15293 v.AuxInt = off 15294 v.Aux = sym 15295 v.AddArg(ptr) 15296 v.AddArg(x) 15297 v.AddArg(mem) 15298 return true 15299 } 15300 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 15301 // cond: is20Bit(off1+off2) 15302 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 15303 for { 15304 off1 := v.AuxInt 15305 sym := v.Aux 15306 _ = v.Args[2] 15307 v_0 := v.Args[0] 15308 if v_0.Op != OpS390XADDconst { 15309 break 15310 } 15311 off2 := v_0.AuxInt 15312 ptr := v_0.Args[0] 15313 val := v.Args[1] 15314 mem := v.Args[2] 15315 if !(is20Bit(off1 + off2)) { 15316 break 15317 } 15318 v.reset(OpS390XMOVHstore) 15319 v.AuxInt = off1 + off2 15320 v.Aux = sym 15321 v.AddArg(ptr) 15322 v.AddArg(val) 15323 v.AddArg(mem) 15324 return true 15325 } 15326 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 15327 // cond: isU12Bit(off) && ptr.Op != OpSB 15328 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 15329 for { 15330 off := v.AuxInt 15331 sym := v.Aux 15332 _ = v.Args[2] 15333 ptr := v.Args[0] 15334 v_1 := v.Args[1] 15335 if v_1.Op != OpS390XMOVDconst { 15336 break 15337 } 15338 c := v_1.AuxInt 15339 mem := v.Args[2] 15340 if !(isU12Bit(off) && ptr.Op != OpSB) { 15341 break 15342 } 15343 v.reset(OpS390XMOVHstoreconst) 15344 v.AuxInt = makeValAndOff(int64(int16(c)), off) 15345 v.Aux = sym 15346 v.AddArg(ptr) 15347 v.AddArg(mem) 15348 return true 15349 } 15350 // match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 15351 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 15352 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 15353 for { 15354 off1 := v.AuxInt 15355 sym1 := v.Aux 15356 _ = v.Args[2] 15357 v_0 := v.Args[0] 15358 if v_0.Op != OpS390XMOVDaddr { 15359 break 15360 } 15361 t := v_0.Type 15362 off2 := v_0.AuxInt 15363 sym2 := v_0.Aux 15364 base := v_0.Args[0] 15365 val := v.Args[1] 15366 mem := v.Args[2] 15367 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 15368 break 15369 } 15370 v.reset(OpS390XMOVHstore) 15371 v.AuxInt = off1 + off2 15372 v.Aux = mergeSym(sym1, sym2) 15373 v.AddArg(base) 15374 v.AddArg(val) 15375 v.AddArg(mem) 15376 return true 15377 } 15378 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 15379 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15380 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 15381 for { 15382 off1 := v.AuxInt 15383 sym1 := v.Aux 15384 _ = v.Args[2] 15385 v_0 := v.Args[0] 15386 if v_0.Op != OpS390XMOVDaddridx { 15387 break 15388 } 15389 off2 := v_0.AuxInt 15390 sym2 := v_0.Aux 15391 _ = v_0.Args[1] 15392 ptr := v_0.Args[0] 15393 idx := v_0.Args[1] 15394 val := v.Args[1] 15395 mem := v.Args[2] 15396 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15397 break 15398 } 15399 v.reset(OpS390XMOVHstoreidx) 15400 v.AuxInt = off1 + off2 15401 v.Aux = mergeSym(sym1, sym2) 15402 v.AddArg(ptr) 15403 v.AddArg(idx) 15404 v.AddArg(val) 15405 v.AddArg(mem) 15406 return true 15407 } 15408 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 15409 // cond: ptr.Op != OpSB 15410 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 15411 for { 15412 off := v.AuxInt 15413 sym := v.Aux 15414 _ = v.Args[2] 15415 v_0 := v.Args[0] 15416 if v_0.Op != OpS390XADD { 15417 break 15418 } 15419 _ = v_0.Args[1] 15420 ptr := v_0.Args[0] 15421 idx := v_0.Args[1] 15422 val := v.Args[1] 15423 mem := v.Args[2] 15424 if !(ptr.Op != OpSB) { 15425 break 15426 } 15427 v.reset(OpS390XMOVHstoreidx) 15428 v.AuxInt = off 15429 v.Aux = sym 15430 v.AddArg(ptr) 15431 v.AddArg(idx) 15432 v.AddArg(val) 15433 v.AddArg(mem) 15434 return true 15435 } 15436 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 15437 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15438 // result: (MOVWstore [i-2] {s} p w mem) 15439 for { 15440 i := v.AuxInt 15441 s := v.Aux 15442 _ = v.Args[2] 15443 p := v.Args[0] 15444 w := v.Args[1] 15445 x := v.Args[2] 15446 if x.Op != OpS390XMOVHstore { 15447 break 15448 } 15449 if x.AuxInt != i-2 { 15450 break 15451 } 15452 if x.Aux != s { 15453 break 15454 } 15455 _ = x.Args[2] 15456 if p != x.Args[0] { 15457 break 15458 } 15459 x_1 := x.Args[1] 15460 if x_1.Op != OpS390XSRDconst { 15461 break 15462 } 15463 if x_1.AuxInt != 16 { 15464 break 15465 } 15466 if w != x_1.Args[0] { 15467 break 15468 } 15469 mem := x.Args[2] 15470 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15471 break 15472 } 15473 v.reset(OpS390XMOVWstore) 15474 v.AuxInt = i - 2 15475 v.Aux = s 15476 v.AddArg(p) 15477 v.AddArg(w) 15478 v.AddArg(mem) 15479 return true 15480 } 15481 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 15482 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15483 // result: (MOVWstore [i-2] {s} p w0 mem) 15484 for { 15485 i := v.AuxInt 15486 s := v.Aux 15487 _ = v.Args[2] 15488 p := v.Args[0] 15489 w0 := v.Args[1] 15490 if w0.Op != OpS390XSRDconst { 15491 break 15492 } 15493 j := w0.AuxInt 15494 w := w0.Args[0] 15495 x := v.Args[2] 15496 if x.Op != OpS390XMOVHstore { 15497 break 15498 } 15499 if x.AuxInt != i-2 { 15500 break 15501 } 15502 if x.Aux != s { 15503 break 15504 } 15505 _ = x.Args[2] 15506 if p != x.Args[0] { 15507 break 15508 } 15509 x_1 := x.Args[1] 15510 if x_1.Op != OpS390XSRDconst { 15511 break 15512 } 15513 if x_1.AuxInt != j+16 { 15514 break 15515 } 15516 if w != x_1.Args[0] { 15517 break 15518 } 15519 mem := x.Args[2] 15520 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15521 break 15522 } 15523 v.reset(OpS390XMOVWstore) 15524 v.AuxInt = i - 2 15525 v.Aux = s 15526 v.AddArg(p) 15527 v.AddArg(w0) 15528 v.AddArg(mem) 15529 return true 15530 } 15531 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 15532 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15533 // result: (MOVWstore [i-2] {s} p w mem) 15534 for { 15535 i := v.AuxInt 15536 s := v.Aux 15537 _ = v.Args[2] 15538 p := v.Args[0] 15539 w := v.Args[1] 15540 x := v.Args[2] 15541 if x.Op != OpS390XMOVHstore { 15542 break 15543 } 15544 if x.AuxInt != i-2 { 15545 break 15546 } 15547 if x.Aux != s { 15548 break 15549 } 15550 _ = x.Args[2] 15551 if p != x.Args[0] { 15552 break 15553 } 15554 x_1 := x.Args[1] 15555 if x_1.Op != OpS390XSRWconst { 15556 break 15557 } 15558 if x_1.AuxInt != 16 { 15559 break 15560 } 15561 if w != x_1.Args[0] { 15562 break 15563 } 15564 mem := x.Args[2] 15565 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15566 break 15567 } 15568 v.reset(OpS390XMOVWstore) 15569 v.AuxInt = i - 2 15570 v.Aux = s 15571 v.AddArg(p) 15572 v.AddArg(w) 15573 v.AddArg(mem) 15574 return true 15575 } 15576 return false 15577 } 15578 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 15579 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 15580 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15581 // result: (MOVWstore [i-2] {s} p w0 mem) 15582 for { 15583 i := v.AuxInt 15584 s := v.Aux 15585 _ = v.Args[2] 15586 p := v.Args[0] 15587 w0 := v.Args[1] 15588 if w0.Op != OpS390XSRWconst { 15589 break 15590 } 15591 j := w0.AuxInt 15592 w := w0.Args[0] 15593 x := v.Args[2] 15594 if x.Op != OpS390XMOVHstore { 15595 break 15596 } 15597 if x.AuxInt != i-2 { 15598 break 15599 } 15600 if x.Aux != s { 15601 break 15602 } 15603 _ = x.Args[2] 15604 if p != x.Args[0] { 15605 break 15606 } 15607 x_1 := x.Args[1] 15608 if x_1.Op != OpS390XSRWconst { 15609 break 15610 } 15611 if x_1.AuxInt != j+16 { 15612 break 15613 } 15614 if w != x_1.Args[0] { 15615 break 15616 } 15617 mem := x.Args[2] 15618 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15619 break 15620 } 15621 v.reset(OpS390XMOVWstore) 15622 v.AuxInt = i - 2 15623 v.Aux = s 15624 v.AddArg(p) 15625 v.AddArg(w0) 15626 v.AddArg(mem) 15627 return true 15628 } 15629 return false 15630 } 15631 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 15632 b := v.Block 15633 _ = b 15634 typ := &b.Func.Config.Types 15635 _ = typ 15636 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 15637 // cond: isU12Bit(ValAndOff(sc).Off()+off) 15638 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 15639 for { 15640 sc := v.AuxInt 15641 s := v.Aux 15642 _ = v.Args[1] 15643 v_0 := v.Args[0] 15644 if v_0.Op != OpS390XADDconst { 15645 break 15646 } 15647 off := v_0.AuxInt 15648 ptr := v_0.Args[0] 15649 mem := v.Args[1] 15650 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 15651 break 15652 } 15653 v.reset(OpS390XMOVHstoreconst) 15654 v.AuxInt = ValAndOff(sc).add(off) 15655 v.Aux = s 15656 v.AddArg(ptr) 15657 v.AddArg(mem) 15658 return true 15659 } 15660 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 15661 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 15662 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 15663 for { 15664 sc := v.AuxInt 15665 sym1 := v.Aux 15666 _ = v.Args[1] 15667 v_0 := v.Args[0] 15668 if v_0.Op != OpS390XMOVDaddr { 15669 break 15670 } 15671 off := v_0.AuxInt 15672 sym2 := v_0.Aux 15673 ptr := v_0.Args[0] 15674 mem := v.Args[1] 15675 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 15676 break 15677 } 15678 v.reset(OpS390XMOVHstoreconst) 15679 v.AuxInt = ValAndOff(sc).add(off) 15680 v.Aux = mergeSym(sym1, sym2) 15681 v.AddArg(ptr) 15682 v.AddArg(mem) 15683 return true 15684 } 15685 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 15686 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 15687 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 15688 for { 15689 c := v.AuxInt 15690 s := v.Aux 15691 _ = v.Args[1] 15692 p := v.Args[0] 15693 x := v.Args[1] 15694 if x.Op != OpS390XMOVHstoreconst { 15695 break 15696 } 15697 a := x.AuxInt 15698 if x.Aux != s { 15699 break 15700 } 15701 _ = x.Args[1] 15702 if p != x.Args[0] { 15703 break 15704 } 15705 mem := x.Args[1] 15706 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 15707 break 15708 } 15709 v.reset(OpS390XMOVWstore) 15710 v.AuxInt = ValAndOff(a).Off() 15711 v.Aux = s 15712 v.AddArg(p) 15713 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 15714 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 15715 v.AddArg(v0) 15716 v.AddArg(mem) 15717 return true 15718 } 15719 return false 15720 } 15721 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 15722 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 15723 // cond: 15724 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15725 for { 15726 c := v.AuxInt 15727 sym := v.Aux 15728 _ = v.Args[3] 15729 v_0 := v.Args[0] 15730 if v_0.Op != OpS390XADDconst { 15731 break 15732 } 15733 d := v_0.AuxInt 15734 ptr := v_0.Args[0] 15735 idx := v.Args[1] 15736 val := v.Args[2] 15737 mem := v.Args[3] 15738 v.reset(OpS390XMOVHstoreidx) 15739 v.AuxInt = c + d 15740 v.Aux = sym 15741 v.AddArg(ptr) 15742 v.AddArg(idx) 15743 v.AddArg(val) 15744 v.AddArg(mem) 15745 return true 15746 } 15747 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 15748 // cond: 15749 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15750 for { 15751 c := v.AuxInt 15752 sym := v.Aux 15753 _ = v.Args[3] 15754 idx := v.Args[0] 15755 v_1 := v.Args[1] 15756 if v_1.Op != OpS390XADDconst { 15757 break 15758 } 15759 d := v_1.AuxInt 15760 ptr := v_1.Args[0] 15761 val := v.Args[2] 15762 mem := v.Args[3] 15763 v.reset(OpS390XMOVHstoreidx) 15764 v.AuxInt = c + d 15765 v.Aux = sym 15766 v.AddArg(ptr) 15767 v.AddArg(idx) 15768 v.AddArg(val) 15769 v.AddArg(mem) 15770 return true 15771 } 15772 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 15773 // cond: 15774 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15775 for { 15776 c := v.AuxInt 15777 sym := v.Aux 15778 _ = v.Args[3] 15779 ptr := v.Args[0] 15780 v_1 := v.Args[1] 15781 if v_1.Op != OpS390XADDconst { 15782 break 15783 } 15784 d := v_1.AuxInt 15785 idx := v_1.Args[0] 15786 val := v.Args[2] 15787 mem := v.Args[3] 15788 v.reset(OpS390XMOVHstoreidx) 15789 v.AuxInt = c + d 15790 v.Aux = sym 15791 v.AddArg(ptr) 15792 v.AddArg(idx) 15793 v.AddArg(val) 15794 v.AddArg(mem) 15795 return true 15796 } 15797 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15798 // cond: 15799 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15800 for { 15801 c := v.AuxInt 15802 sym := v.Aux 15803 _ = v.Args[3] 15804 v_0 := v.Args[0] 15805 if v_0.Op != OpS390XADDconst { 15806 break 15807 } 15808 d := v_0.AuxInt 15809 idx := v_0.Args[0] 15810 ptr := v.Args[1] 15811 val := v.Args[2] 15812 mem := v.Args[3] 15813 v.reset(OpS390XMOVHstoreidx) 15814 v.AuxInt = c + d 15815 v.Aux = sym 15816 v.AddArg(ptr) 15817 v.AddArg(idx) 15818 v.AddArg(val) 15819 v.AddArg(mem) 15820 return true 15821 } 15822 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15823 // cond: x.Uses == 1 && clobber(x) 15824 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15825 for { 15826 i := v.AuxInt 15827 s := v.Aux 15828 _ = v.Args[3] 15829 p := v.Args[0] 15830 idx := v.Args[1] 15831 w := v.Args[2] 15832 x := v.Args[3] 15833 if x.Op != OpS390XMOVHstoreidx { 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 p != x.Args[0] { 15844 break 15845 } 15846 if idx != x.Args[1] { 15847 break 15848 } 15849 x_2 := x.Args[2] 15850 if x_2.Op != OpS390XSRDconst { 15851 break 15852 } 15853 if x_2.AuxInt != 16 { 15854 break 15855 } 15856 if w != x_2.Args[0] { 15857 break 15858 } 15859 mem := x.Args[3] 15860 if !(x.Uses == 1 && clobber(x)) { 15861 break 15862 } 15863 v.reset(OpS390XMOVWstoreidx) 15864 v.AuxInt = i - 2 15865 v.Aux = s 15866 v.AddArg(p) 15867 v.AddArg(idx) 15868 v.AddArg(w) 15869 v.AddArg(mem) 15870 return true 15871 } 15872 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15873 // cond: x.Uses == 1 && clobber(x) 15874 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15875 for { 15876 i := v.AuxInt 15877 s := v.Aux 15878 _ = v.Args[3] 15879 p := v.Args[0] 15880 idx := v.Args[1] 15881 w := v.Args[2] 15882 x := v.Args[3] 15883 if x.Op != OpS390XMOVHstoreidx { 15884 break 15885 } 15886 if x.AuxInt != i-2 { 15887 break 15888 } 15889 if x.Aux != s { 15890 break 15891 } 15892 _ = x.Args[3] 15893 if idx != x.Args[0] { 15894 break 15895 } 15896 if p != x.Args[1] { 15897 break 15898 } 15899 x_2 := x.Args[2] 15900 if x_2.Op != OpS390XSRDconst { 15901 break 15902 } 15903 if x_2.AuxInt != 16 { 15904 break 15905 } 15906 if w != x_2.Args[0] { 15907 break 15908 } 15909 mem := x.Args[3] 15910 if !(x.Uses == 1 && clobber(x)) { 15911 break 15912 } 15913 v.reset(OpS390XMOVWstoreidx) 15914 v.AuxInt = i - 2 15915 v.Aux = s 15916 v.AddArg(p) 15917 v.AddArg(idx) 15918 v.AddArg(w) 15919 v.AddArg(mem) 15920 return true 15921 } 15922 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15923 // cond: x.Uses == 1 && clobber(x) 15924 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15925 for { 15926 i := v.AuxInt 15927 s := v.Aux 15928 _ = v.Args[3] 15929 idx := v.Args[0] 15930 p := v.Args[1] 15931 w := v.Args[2] 15932 x := v.Args[3] 15933 if x.Op != OpS390XMOVHstoreidx { 15934 break 15935 } 15936 if x.AuxInt != i-2 { 15937 break 15938 } 15939 if x.Aux != s { 15940 break 15941 } 15942 _ = x.Args[3] 15943 if p != x.Args[0] { 15944 break 15945 } 15946 if idx != x.Args[1] { 15947 break 15948 } 15949 x_2 := x.Args[2] 15950 if x_2.Op != OpS390XSRDconst { 15951 break 15952 } 15953 if x_2.AuxInt != 16 { 15954 break 15955 } 15956 if w != x_2.Args[0] { 15957 break 15958 } 15959 mem := x.Args[3] 15960 if !(x.Uses == 1 && clobber(x)) { 15961 break 15962 } 15963 v.reset(OpS390XMOVWstoreidx) 15964 v.AuxInt = i - 2 15965 v.Aux = s 15966 v.AddArg(p) 15967 v.AddArg(idx) 15968 v.AddArg(w) 15969 v.AddArg(mem) 15970 return true 15971 } 15972 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15973 // cond: x.Uses == 1 && clobber(x) 15974 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15975 for { 15976 i := v.AuxInt 15977 s := v.Aux 15978 _ = v.Args[3] 15979 idx := v.Args[0] 15980 p := v.Args[1] 15981 w := v.Args[2] 15982 x := v.Args[3] 15983 if x.Op != OpS390XMOVHstoreidx { 15984 break 15985 } 15986 if x.AuxInt != i-2 { 15987 break 15988 } 15989 if x.Aux != s { 15990 break 15991 } 15992 _ = x.Args[3] 15993 if idx != x.Args[0] { 15994 break 15995 } 15996 if p != x.Args[1] { 15997 break 15998 } 15999 x_2 := x.Args[2] 16000 if x_2.Op != OpS390XSRDconst { 16001 break 16002 } 16003 if x_2.AuxInt != 16 { 16004 break 16005 } 16006 if w != x_2.Args[0] { 16007 break 16008 } 16009 mem := x.Args[3] 16010 if !(x.Uses == 1 && clobber(x)) { 16011 break 16012 } 16013 v.reset(OpS390XMOVWstoreidx) 16014 v.AuxInt = i - 2 16015 v.Aux = s 16016 v.AddArg(p) 16017 v.AddArg(idx) 16018 v.AddArg(w) 16019 v.AddArg(mem) 16020 return true 16021 } 16022 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 16023 // cond: x.Uses == 1 && clobber(x) 16024 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16025 for { 16026 i := v.AuxInt 16027 s := v.Aux 16028 _ = v.Args[3] 16029 p := v.Args[0] 16030 idx := v.Args[1] 16031 w0 := v.Args[2] 16032 if w0.Op != OpS390XSRDconst { 16033 break 16034 } 16035 j := w0.AuxInt 16036 w := w0.Args[0] 16037 x := v.Args[3] 16038 if x.Op != OpS390XMOVHstoreidx { 16039 break 16040 } 16041 if x.AuxInt != i-2 { 16042 break 16043 } 16044 if x.Aux != s { 16045 break 16046 } 16047 _ = x.Args[3] 16048 if p != x.Args[0] { 16049 break 16050 } 16051 if idx != x.Args[1] { 16052 break 16053 } 16054 x_2 := x.Args[2] 16055 if x_2.Op != OpS390XSRDconst { 16056 break 16057 } 16058 if x_2.AuxInt != j+16 { 16059 break 16060 } 16061 if w != x_2.Args[0] { 16062 break 16063 } 16064 mem := x.Args[3] 16065 if !(x.Uses == 1 && clobber(x)) { 16066 break 16067 } 16068 v.reset(OpS390XMOVWstoreidx) 16069 v.AuxInt = i - 2 16070 v.Aux = s 16071 v.AddArg(p) 16072 v.AddArg(idx) 16073 v.AddArg(w0) 16074 v.AddArg(mem) 16075 return true 16076 } 16077 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16078 // cond: x.Uses == 1 && clobber(x) 16079 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16080 for { 16081 i := v.AuxInt 16082 s := v.Aux 16083 _ = v.Args[3] 16084 p := v.Args[0] 16085 idx := v.Args[1] 16086 w0 := v.Args[2] 16087 if w0.Op != OpS390XSRDconst { 16088 break 16089 } 16090 j := w0.AuxInt 16091 w := w0.Args[0] 16092 x := v.Args[3] 16093 if x.Op != OpS390XMOVHstoreidx { 16094 break 16095 } 16096 if x.AuxInt != i-2 { 16097 break 16098 } 16099 if x.Aux != s { 16100 break 16101 } 16102 _ = x.Args[3] 16103 if idx != x.Args[0] { 16104 break 16105 } 16106 if p != x.Args[1] { 16107 break 16108 } 16109 x_2 := x.Args[2] 16110 if x_2.Op != OpS390XSRDconst { 16111 break 16112 } 16113 if x_2.AuxInt != j+16 { 16114 break 16115 } 16116 if w != x_2.Args[0] { 16117 break 16118 } 16119 mem := x.Args[3] 16120 if !(x.Uses == 1 && clobber(x)) { 16121 break 16122 } 16123 v.reset(OpS390XMOVWstoreidx) 16124 v.AuxInt = i - 2 16125 v.Aux = s 16126 v.AddArg(p) 16127 v.AddArg(idx) 16128 v.AddArg(w0) 16129 v.AddArg(mem) 16130 return true 16131 } 16132 return false 16133 } 16134 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 16135 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 16136 // cond: x.Uses == 1 && clobber(x) 16137 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16138 for { 16139 i := v.AuxInt 16140 s := v.Aux 16141 _ = v.Args[3] 16142 idx := v.Args[0] 16143 p := v.Args[1] 16144 w0 := v.Args[2] 16145 if w0.Op != OpS390XSRDconst { 16146 break 16147 } 16148 j := w0.AuxInt 16149 w := w0.Args[0] 16150 x := v.Args[3] 16151 if x.Op != OpS390XMOVHstoreidx { 16152 break 16153 } 16154 if x.AuxInt != i-2 { 16155 break 16156 } 16157 if x.Aux != s { 16158 break 16159 } 16160 _ = x.Args[3] 16161 if p != x.Args[0] { 16162 break 16163 } 16164 if idx != x.Args[1] { 16165 break 16166 } 16167 x_2 := x.Args[2] 16168 if x_2.Op != OpS390XSRDconst { 16169 break 16170 } 16171 if x_2.AuxInt != j+16 { 16172 break 16173 } 16174 if w != x_2.Args[0] { 16175 break 16176 } 16177 mem := x.Args[3] 16178 if !(x.Uses == 1 && clobber(x)) { 16179 break 16180 } 16181 v.reset(OpS390XMOVWstoreidx) 16182 v.AuxInt = i - 2 16183 v.Aux = s 16184 v.AddArg(p) 16185 v.AddArg(idx) 16186 v.AddArg(w0) 16187 v.AddArg(mem) 16188 return true 16189 } 16190 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16191 // cond: x.Uses == 1 && clobber(x) 16192 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16193 for { 16194 i := v.AuxInt 16195 s := v.Aux 16196 _ = v.Args[3] 16197 idx := v.Args[0] 16198 p := v.Args[1] 16199 w0 := v.Args[2] 16200 if w0.Op != OpS390XSRDconst { 16201 break 16202 } 16203 j := w0.AuxInt 16204 w := w0.Args[0] 16205 x := v.Args[3] 16206 if x.Op != OpS390XMOVHstoreidx { 16207 break 16208 } 16209 if x.AuxInt != i-2 { 16210 break 16211 } 16212 if x.Aux != s { 16213 break 16214 } 16215 _ = x.Args[3] 16216 if idx != x.Args[0] { 16217 break 16218 } 16219 if p != x.Args[1] { 16220 break 16221 } 16222 x_2 := x.Args[2] 16223 if x_2.Op != OpS390XSRDconst { 16224 break 16225 } 16226 if x_2.AuxInt != j+16 { 16227 break 16228 } 16229 if w != x_2.Args[0] { 16230 break 16231 } 16232 mem := x.Args[3] 16233 if !(x.Uses == 1 && clobber(x)) { 16234 break 16235 } 16236 v.reset(OpS390XMOVWstoreidx) 16237 v.AuxInt = i - 2 16238 v.Aux = s 16239 v.AddArg(p) 16240 v.AddArg(idx) 16241 v.AddArg(w0) 16242 v.AddArg(mem) 16243 return true 16244 } 16245 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16246 // cond: x.Uses == 1 && clobber(x) 16247 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16248 for { 16249 i := v.AuxInt 16250 s := v.Aux 16251 _ = v.Args[3] 16252 p := v.Args[0] 16253 idx := v.Args[1] 16254 w := v.Args[2] 16255 x := v.Args[3] 16256 if x.Op != OpS390XMOVHstoreidx { 16257 break 16258 } 16259 if x.AuxInt != i-2 { 16260 break 16261 } 16262 if x.Aux != s { 16263 break 16264 } 16265 _ = x.Args[3] 16266 if p != x.Args[0] { 16267 break 16268 } 16269 if idx != x.Args[1] { 16270 break 16271 } 16272 x_2 := x.Args[2] 16273 if x_2.Op != OpS390XSRWconst { 16274 break 16275 } 16276 if x_2.AuxInt != 16 { 16277 break 16278 } 16279 if w != x_2.Args[0] { 16280 break 16281 } 16282 mem := x.Args[3] 16283 if !(x.Uses == 1 && clobber(x)) { 16284 break 16285 } 16286 v.reset(OpS390XMOVWstoreidx) 16287 v.AuxInt = i - 2 16288 v.Aux = s 16289 v.AddArg(p) 16290 v.AddArg(idx) 16291 v.AddArg(w) 16292 v.AddArg(mem) 16293 return true 16294 } 16295 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16296 // cond: x.Uses == 1 && clobber(x) 16297 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16298 for { 16299 i := v.AuxInt 16300 s := v.Aux 16301 _ = v.Args[3] 16302 p := v.Args[0] 16303 idx := v.Args[1] 16304 w := v.Args[2] 16305 x := v.Args[3] 16306 if x.Op != OpS390XMOVHstoreidx { 16307 break 16308 } 16309 if x.AuxInt != i-2 { 16310 break 16311 } 16312 if x.Aux != s { 16313 break 16314 } 16315 _ = x.Args[3] 16316 if idx != x.Args[0] { 16317 break 16318 } 16319 if p != x.Args[1] { 16320 break 16321 } 16322 x_2 := x.Args[2] 16323 if x_2.Op != OpS390XSRWconst { 16324 break 16325 } 16326 if x_2.AuxInt != 16 { 16327 break 16328 } 16329 if w != x_2.Args[0] { 16330 break 16331 } 16332 mem := x.Args[3] 16333 if !(x.Uses == 1 && clobber(x)) { 16334 break 16335 } 16336 v.reset(OpS390XMOVWstoreidx) 16337 v.AuxInt = i - 2 16338 v.Aux = s 16339 v.AddArg(p) 16340 v.AddArg(idx) 16341 v.AddArg(w) 16342 v.AddArg(mem) 16343 return true 16344 } 16345 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16346 // cond: x.Uses == 1 && clobber(x) 16347 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16348 for { 16349 i := v.AuxInt 16350 s := v.Aux 16351 _ = v.Args[3] 16352 idx := v.Args[0] 16353 p := v.Args[1] 16354 w := v.Args[2] 16355 x := v.Args[3] 16356 if x.Op != OpS390XMOVHstoreidx { 16357 break 16358 } 16359 if x.AuxInt != i-2 { 16360 break 16361 } 16362 if x.Aux != s { 16363 break 16364 } 16365 _ = x.Args[3] 16366 if p != x.Args[0] { 16367 break 16368 } 16369 if idx != x.Args[1] { 16370 break 16371 } 16372 x_2 := x.Args[2] 16373 if x_2.Op != OpS390XSRWconst { 16374 break 16375 } 16376 if x_2.AuxInt != 16 { 16377 break 16378 } 16379 if w != x_2.Args[0] { 16380 break 16381 } 16382 mem := x.Args[3] 16383 if !(x.Uses == 1 && clobber(x)) { 16384 break 16385 } 16386 v.reset(OpS390XMOVWstoreidx) 16387 v.AuxInt = i - 2 16388 v.Aux = s 16389 v.AddArg(p) 16390 v.AddArg(idx) 16391 v.AddArg(w) 16392 v.AddArg(mem) 16393 return true 16394 } 16395 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16396 // cond: x.Uses == 1 && clobber(x) 16397 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16398 for { 16399 i := v.AuxInt 16400 s := v.Aux 16401 _ = v.Args[3] 16402 idx := v.Args[0] 16403 p := v.Args[1] 16404 w := v.Args[2] 16405 x := v.Args[3] 16406 if x.Op != OpS390XMOVHstoreidx { 16407 break 16408 } 16409 if x.AuxInt != i-2 { 16410 break 16411 } 16412 if x.Aux != s { 16413 break 16414 } 16415 _ = x.Args[3] 16416 if idx != x.Args[0] { 16417 break 16418 } 16419 if p != x.Args[1] { 16420 break 16421 } 16422 x_2 := x.Args[2] 16423 if x_2.Op != OpS390XSRWconst { 16424 break 16425 } 16426 if x_2.AuxInt != 16 { 16427 break 16428 } 16429 if w != x_2.Args[0] { 16430 break 16431 } 16432 mem := x.Args[3] 16433 if !(x.Uses == 1 && clobber(x)) { 16434 break 16435 } 16436 v.reset(OpS390XMOVWstoreidx) 16437 v.AuxInt = i - 2 16438 v.Aux = s 16439 v.AddArg(p) 16440 v.AddArg(idx) 16441 v.AddArg(w) 16442 v.AddArg(mem) 16443 return true 16444 } 16445 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 16446 // cond: x.Uses == 1 && clobber(x) 16447 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16448 for { 16449 i := v.AuxInt 16450 s := v.Aux 16451 _ = v.Args[3] 16452 p := v.Args[0] 16453 idx := v.Args[1] 16454 w0 := v.Args[2] 16455 if w0.Op != OpS390XSRWconst { 16456 break 16457 } 16458 j := w0.AuxInt 16459 w := w0.Args[0] 16460 x := v.Args[3] 16461 if x.Op != OpS390XMOVHstoreidx { 16462 break 16463 } 16464 if x.AuxInt != i-2 { 16465 break 16466 } 16467 if x.Aux != s { 16468 break 16469 } 16470 _ = x.Args[3] 16471 if p != x.Args[0] { 16472 break 16473 } 16474 if idx != x.Args[1] { 16475 break 16476 } 16477 x_2 := x.Args[2] 16478 if x_2.Op != OpS390XSRWconst { 16479 break 16480 } 16481 if x_2.AuxInt != j+16 { 16482 break 16483 } 16484 if w != x_2.Args[0] { 16485 break 16486 } 16487 mem := x.Args[3] 16488 if !(x.Uses == 1 && clobber(x)) { 16489 break 16490 } 16491 v.reset(OpS390XMOVWstoreidx) 16492 v.AuxInt = i - 2 16493 v.Aux = s 16494 v.AddArg(p) 16495 v.AddArg(idx) 16496 v.AddArg(w0) 16497 v.AddArg(mem) 16498 return true 16499 } 16500 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 16501 // cond: x.Uses == 1 && clobber(x) 16502 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16503 for { 16504 i := v.AuxInt 16505 s := v.Aux 16506 _ = v.Args[3] 16507 p := v.Args[0] 16508 idx := v.Args[1] 16509 w0 := v.Args[2] 16510 if w0.Op != OpS390XSRWconst { 16511 break 16512 } 16513 j := w0.AuxInt 16514 w := w0.Args[0] 16515 x := v.Args[3] 16516 if x.Op != OpS390XMOVHstoreidx { 16517 break 16518 } 16519 if x.AuxInt != i-2 { 16520 break 16521 } 16522 if x.Aux != s { 16523 break 16524 } 16525 _ = x.Args[3] 16526 if idx != x.Args[0] { 16527 break 16528 } 16529 if p != x.Args[1] { 16530 break 16531 } 16532 x_2 := x.Args[2] 16533 if x_2.Op != OpS390XSRWconst { 16534 break 16535 } 16536 if x_2.AuxInt != j+16 { 16537 break 16538 } 16539 if w != x_2.Args[0] { 16540 break 16541 } 16542 mem := x.Args[3] 16543 if !(x.Uses == 1 && clobber(x)) { 16544 break 16545 } 16546 v.reset(OpS390XMOVWstoreidx) 16547 v.AuxInt = i - 2 16548 v.Aux = s 16549 v.AddArg(p) 16550 v.AddArg(idx) 16551 v.AddArg(w0) 16552 v.AddArg(mem) 16553 return true 16554 } 16555 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 16556 // cond: x.Uses == 1 && clobber(x) 16557 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16558 for { 16559 i := v.AuxInt 16560 s := v.Aux 16561 _ = v.Args[3] 16562 idx := v.Args[0] 16563 p := v.Args[1] 16564 w0 := v.Args[2] 16565 if w0.Op != OpS390XSRWconst { 16566 break 16567 } 16568 j := w0.AuxInt 16569 w := w0.Args[0] 16570 x := v.Args[3] 16571 if x.Op != OpS390XMOVHstoreidx { 16572 break 16573 } 16574 if x.AuxInt != i-2 { 16575 break 16576 } 16577 if x.Aux != s { 16578 break 16579 } 16580 _ = x.Args[3] 16581 if p != x.Args[0] { 16582 break 16583 } 16584 if idx != x.Args[1] { 16585 break 16586 } 16587 x_2 := x.Args[2] 16588 if x_2.Op != OpS390XSRWconst { 16589 break 16590 } 16591 if x_2.AuxInt != j+16 { 16592 break 16593 } 16594 if w != x_2.Args[0] { 16595 break 16596 } 16597 mem := x.Args[3] 16598 if !(x.Uses == 1 && clobber(x)) { 16599 break 16600 } 16601 v.reset(OpS390XMOVWstoreidx) 16602 v.AuxInt = i - 2 16603 v.Aux = s 16604 v.AddArg(p) 16605 v.AddArg(idx) 16606 v.AddArg(w0) 16607 v.AddArg(mem) 16608 return true 16609 } 16610 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 16611 // cond: x.Uses == 1 && clobber(x) 16612 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16613 for { 16614 i := v.AuxInt 16615 s := v.Aux 16616 _ = v.Args[3] 16617 idx := v.Args[0] 16618 p := v.Args[1] 16619 w0 := v.Args[2] 16620 if w0.Op != OpS390XSRWconst { 16621 break 16622 } 16623 j := w0.AuxInt 16624 w := w0.Args[0] 16625 x := v.Args[3] 16626 if x.Op != OpS390XMOVHstoreidx { 16627 break 16628 } 16629 if x.AuxInt != i-2 { 16630 break 16631 } 16632 if x.Aux != s { 16633 break 16634 } 16635 _ = x.Args[3] 16636 if idx != x.Args[0] { 16637 break 16638 } 16639 if p != x.Args[1] { 16640 break 16641 } 16642 x_2 := x.Args[2] 16643 if x_2.Op != OpS390XSRWconst { 16644 break 16645 } 16646 if x_2.AuxInt != j+16 { 16647 break 16648 } 16649 if w != x_2.Args[0] { 16650 break 16651 } 16652 mem := x.Args[3] 16653 if !(x.Uses == 1 && clobber(x)) { 16654 break 16655 } 16656 v.reset(OpS390XMOVWstoreidx) 16657 v.AuxInt = i - 2 16658 v.Aux = s 16659 v.AddArg(p) 16660 v.AddArg(idx) 16661 v.AddArg(w0) 16662 v.AddArg(mem) 16663 return true 16664 } 16665 return false 16666 } 16667 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 16668 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 16669 // cond: x.Uses == 1 && clobber(x) 16670 // result: (MOVDBRstore [i-4] {s} p w mem) 16671 for { 16672 i := v.AuxInt 16673 s := v.Aux 16674 _ = v.Args[2] 16675 p := v.Args[0] 16676 v_1 := v.Args[1] 16677 if v_1.Op != OpS390XSRDconst { 16678 break 16679 } 16680 if v_1.AuxInt != 32 { 16681 break 16682 } 16683 w := v_1.Args[0] 16684 x := v.Args[2] 16685 if x.Op != OpS390XMOVWBRstore { 16686 break 16687 } 16688 if x.AuxInt != i-4 { 16689 break 16690 } 16691 if x.Aux != s { 16692 break 16693 } 16694 _ = x.Args[2] 16695 if p != x.Args[0] { 16696 break 16697 } 16698 if w != x.Args[1] { 16699 break 16700 } 16701 mem := x.Args[2] 16702 if !(x.Uses == 1 && clobber(x)) { 16703 break 16704 } 16705 v.reset(OpS390XMOVDBRstore) 16706 v.AuxInt = i - 4 16707 v.Aux = s 16708 v.AddArg(p) 16709 v.AddArg(w) 16710 v.AddArg(mem) 16711 return true 16712 } 16713 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 16714 // cond: x.Uses == 1 && clobber(x) 16715 // result: (MOVDBRstore [i-4] {s} p w0 mem) 16716 for { 16717 i := v.AuxInt 16718 s := v.Aux 16719 _ = v.Args[2] 16720 p := v.Args[0] 16721 v_1 := v.Args[1] 16722 if v_1.Op != OpS390XSRDconst { 16723 break 16724 } 16725 j := v_1.AuxInt 16726 w := v_1.Args[0] 16727 x := v.Args[2] 16728 if x.Op != OpS390XMOVWBRstore { 16729 break 16730 } 16731 if x.AuxInt != i-4 { 16732 break 16733 } 16734 if x.Aux != s { 16735 break 16736 } 16737 _ = x.Args[2] 16738 if p != x.Args[0] { 16739 break 16740 } 16741 w0 := x.Args[1] 16742 if w0.Op != OpS390XSRDconst { 16743 break 16744 } 16745 if w0.AuxInt != j-32 { 16746 break 16747 } 16748 if w != w0.Args[0] { 16749 break 16750 } 16751 mem := x.Args[2] 16752 if !(x.Uses == 1 && clobber(x)) { 16753 break 16754 } 16755 v.reset(OpS390XMOVDBRstore) 16756 v.AuxInt = i - 4 16757 v.Aux = s 16758 v.AddArg(p) 16759 v.AddArg(w0) 16760 v.AddArg(mem) 16761 return true 16762 } 16763 return false 16764 } 16765 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 16766 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16767 // cond: x.Uses == 1 && clobber(x) 16768 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16769 for { 16770 i := v.AuxInt 16771 s := v.Aux 16772 _ = v.Args[3] 16773 p := v.Args[0] 16774 idx := v.Args[1] 16775 v_2 := v.Args[2] 16776 if v_2.Op != OpS390XSRDconst { 16777 break 16778 } 16779 if v_2.AuxInt != 32 { 16780 break 16781 } 16782 w := v_2.Args[0] 16783 x := v.Args[3] 16784 if x.Op != OpS390XMOVWBRstoreidx { 16785 break 16786 } 16787 if x.AuxInt != i-4 { 16788 break 16789 } 16790 if x.Aux != s { 16791 break 16792 } 16793 _ = x.Args[3] 16794 if p != x.Args[0] { 16795 break 16796 } 16797 if idx != x.Args[1] { 16798 break 16799 } 16800 if w != x.Args[2] { 16801 break 16802 } 16803 mem := x.Args[3] 16804 if !(x.Uses == 1 && clobber(x)) { 16805 break 16806 } 16807 v.reset(OpS390XMOVDBRstoreidx) 16808 v.AuxInt = i - 4 16809 v.Aux = s 16810 v.AddArg(p) 16811 v.AddArg(idx) 16812 v.AddArg(w) 16813 v.AddArg(mem) 16814 return true 16815 } 16816 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16817 // cond: x.Uses == 1 && clobber(x) 16818 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16819 for { 16820 i := v.AuxInt 16821 s := v.Aux 16822 _ = v.Args[3] 16823 p := v.Args[0] 16824 idx := v.Args[1] 16825 v_2 := v.Args[2] 16826 if v_2.Op != OpS390XSRDconst { 16827 break 16828 } 16829 if v_2.AuxInt != 32 { 16830 break 16831 } 16832 w := v_2.Args[0] 16833 x := v.Args[3] 16834 if x.Op != OpS390XMOVWBRstoreidx { 16835 break 16836 } 16837 if x.AuxInt != i-4 { 16838 break 16839 } 16840 if x.Aux != s { 16841 break 16842 } 16843 _ = x.Args[3] 16844 if idx != x.Args[0] { 16845 break 16846 } 16847 if p != x.Args[1] { 16848 break 16849 } 16850 if w != x.Args[2] { 16851 break 16852 } 16853 mem := x.Args[3] 16854 if !(x.Uses == 1 && clobber(x)) { 16855 break 16856 } 16857 v.reset(OpS390XMOVDBRstoreidx) 16858 v.AuxInt = i - 4 16859 v.Aux = s 16860 v.AddArg(p) 16861 v.AddArg(idx) 16862 v.AddArg(w) 16863 v.AddArg(mem) 16864 return true 16865 } 16866 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16867 // cond: x.Uses == 1 && clobber(x) 16868 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16869 for { 16870 i := v.AuxInt 16871 s := v.Aux 16872 _ = v.Args[3] 16873 idx := v.Args[0] 16874 p := v.Args[1] 16875 v_2 := v.Args[2] 16876 if v_2.Op != OpS390XSRDconst { 16877 break 16878 } 16879 if v_2.AuxInt != 32 { 16880 break 16881 } 16882 w := v_2.Args[0] 16883 x := v.Args[3] 16884 if x.Op != OpS390XMOVWBRstoreidx { 16885 break 16886 } 16887 if x.AuxInt != i-4 { 16888 break 16889 } 16890 if x.Aux != s { 16891 break 16892 } 16893 _ = x.Args[3] 16894 if p != x.Args[0] { 16895 break 16896 } 16897 if idx != x.Args[1] { 16898 break 16899 } 16900 if w != x.Args[2] { 16901 break 16902 } 16903 mem := x.Args[3] 16904 if !(x.Uses == 1 && clobber(x)) { 16905 break 16906 } 16907 v.reset(OpS390XMOVDBRstoreidx) 16908 v.AuxInt = i - 4 16909 v.Aux = s 16910 v.AddArg(p) 16911 v.AddArg(idx) 16912 v.AddArg(w) 16913 v.AddArg(mem) 16914 return true 16915 } 16916 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16917 // cond: x.Uses == 1 && clobber(x) 16918 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16919 for { 16920 i := v.AuxInt 16921 s := v.Aux 16922 _ = v.Args[3] 16923 idx := v.Args[0] 16924 p := v.Args[1] 16925 v_2 := v.Args[2] 16926 if v_2.Op != OpS390XSRDconst { 16927 break 16928 } 16929 if v_2.AuxInt != 32 { 16930 break 16931 } 16932 w := v_2.Args[0] 16933 x := v.Args[3] 16934 if x.Op != OpS390XMOVWBRstoreidx { 16935 break 16936 } 16937 if x.AuxInt != i-4 { 16938 break 16939 } 16940 if x.Aux != s { 16941 break 16942 } 16943 _ = x.Args[3] 16944 if idx != x.Args[0] { 16945 break 16946 } 16947 if p != x.Args[1] { 16948 break 16949 } 16950 if w != x.Args[2] { 16951 break 16952 } 16953 mem := x.Args[3] 16954 if !(x.Uses == 1 && clobber(x)) { 16955 break 16956 } 16957 v.reset(OpS390XMOVDBRstoreidx) 16958 v.AuxInt = i - 4 16959 v.Aux = s 16960 v.AddArg(p) 16961 v.AddArg(idx) 16962 v.AddArg(w) 16963 v.AddArg(mem) 16964 return true 16965 } 16966 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16967 // cond: x.Uses == 1 && clobber(x) 16968 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16969 for { 16970 i := v.AuxInt 16971 s := v.Aux 16972 _ = v.Args[3] 16973 p := v.Args[0] 16974 idx := v.Args[1] 16975 v_2 := v.Args[2] 16976 if v_2.Op != OpS390XSRDconst { 16977 break 16978 } 16979 j := v_2.AuxInt 16980 w := v_2.Args[0] 16981 x := v.Args[3] 16982 if x.Op != OpS390XMOVWBRstoreidx { 16983 break 16984 } 16985 if x.AuxInt != i-4 { 16986 break 16987 } 16988 if x.Aux != s { 16989 break 16990 } 16991 _ = x.Args[3] 16992 if p != x.Args[0] { 16993 break 16994 } 16995 if idx != x.Args[1] { 16996 break 16997 } 16998 w0 := x.Args[2] 16999 if w0.Op != OpS390XSRDconst { 17000 break 17001 } 17002 if w0.AuxInt != j-32 { 17003 break 17004 } 17005 if w != w0.Args[0] { 17006 break 17007 } 17008 mem := x.Args[3] 17009 if !(x.Uses == 1 && clobber(x)) { 17010 break 17011 } 17012 v.reset(OpS390XMOVDBRstoreidx) 17013 v.AuxInt = i - 4 17014 v.Aux = s 17015 v.AddArg(p) 17016 v.AddArg(idx) 17017 v.AddArg(w0) 17018 v.AddArg(mem) 17019 return true 17020 } 17021 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 17022 // cond: x.Uses == 1 && clobber(x) 17023 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17024 for { 17025 i := v.AuxInt 17026 s := v.Aux 17027 _ = v.Args[3] 17028 p := v.Args[0] 17029 idx := v.Args[1] 17030 v_2 := v.Args[2] 17031 if v_2.Op != OpS390XSRDconst { 17032 break 17033 } 17034 j := v_2.AuxInt 17035 w := v_2.Args[0] 17036 x := v.Args[3] 17037 if x.Op != OpS390XMOVWBRstoreidx { 17038 break 17039 } 17040 if x.AuxInt != i-4 { 17041 break 17042 } 17043 if x.Aux != s { 17044 break 17045 } 17046 _ = x.Args[3] 17047 if idx != x.Args[0] { 17048 break 17049 } 17050 if p != x.Args[1] { 17051 break 17052 } 17053 w0 := x.Args[2] 17054 if w0.Op != OpS390XSRDconst { 17055 break 17056 } 17057 if w0.AuxInt != j-32 { 17058 break 17059 } 17060 if w != w0.Args[0] { 17061 break 17062 } 17063 mem := x.Args[3] 17064 if !(x.Uses == 1 && clobber(x)) { 17065 break 17066 } 17067 v.reset(OpS390XMOVDBRstoreidx) 17068 v.AuxInt = i - 4 17069 v.Aux = s 17070 v.AddArg(p) 17071 v.AddArg(idx) 17072 v.AddArg(w0) 17073 v.AddArg(mem) 17074 return true 17075 } 17076 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 17077 // cond: x.Uses == 1 && clobber(x) 17078 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17079 for { 17080 i := v.AuxInt 17081 s := v.Aux 17082 _ = v.Args[3] 17083 idx := v.Args[0] 17084 p := v.Args[1] 17085 v_2 := v.Args[2] 17086 if v_2.Op != OpS390XSRDconst { 17087 break 17088 } 17089 j := v_2.AuxInt 17090 w := v_2.Args[0] 17091 x := v.Args[3] 17092 if x.Op != OpS390XMOVWBRstoreidx { 17093 break 17094 } 17095 if x.AuxInt != i-4 { 17096 break 17097 } 17098 if x.Aux != s { 17099 break 17100 } 17101 _ = x.Args[3] 17102 if p != x.Args[0] { 17103 break 17104 } 17105 if idx != x.Args[1] { 17106 break 17107 } 17108 w0 := x.Args[2] 17109 if w0.Op != OpS390XSRDconst { 17110 break 17111 } 17112 if w0.AuxInt != j-32 { 17113 break 17114 } 17115 if w != w0.Args[0] { 17116 break 17117 } 17118 mem := x.Args[3] 17119 if !(x.Uses == 1 && clobber(x)) { 17120 break 17121 } 17122 v.reset(OpS390XMOVDBRstoreidx) 17123 v.AuxInt = i - 4 17124 v.Aux = s 17125 v.AddArg(p) 17126 v.AddArg(idx) 17127 v.AddArg(w0) 17128 v.AddArg(mem) 17129 return true 17130 } 17131 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 17132 // cond: x.Uses == 1 && clobber(x) 17133 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17134 for { 17135 i := v.AuxInt 17136 s := v.Aux 17137 _ = v.Args[3] 17138 idx := v.Args[0] 17139 p := v.Args[1] 17140 v_2 := v.Args[2] 17141 if v_2.Op != OpS390XSRDconst { 17142 break 17143 } 17144 j := v_2.AuxInt 17145 w := v_2.Args[0] 17146 x := v.Args[3] 17147 if x.Op != OpS390XMOVWBRstoreidx { 17148 break 17149 } 17150 if x.AuxInt != i-4 { 17151 break 17152 } 17153 if x.Aux != s { 17154 break 17155 } 17156 _ = x.Args[3] 17157 if idx != x.Args[0] { 17158 break 17159 } 17160 if p != x.Args[1] { 17161 break 17162 } 17163 w0 := x.Args[2] 17164 if w0.Op != OpS390XSRDconst { 17165 break 17166 } 17167 if w0.AuxInt != j-32 { 17168 break 17169 } 17170 if w != w0.Args[0] { 17171 break 17172 } 17173 mem := x.Args[3] 17174 if !(x.Uses == 1 && clobber(x)) { 17175 break 17176 } 17177 v.reset(OpS390XMOVDBRstoreidx) 17178 v.AuxInt = i - 4 17179 v.Aux = s 17180 v.AddArg(p) 17181 v.AddArg(idx) 17182 v.AddArg(w0) 17183 v.AddArg(mem) 17184 return true 17185 } 17186 return false 17187 } 17188 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 17189 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 17190 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 17191 // result: (MOVWZreg x) 17192 for { 17193 off := v.AuxInt 17194 sym := v.Aux 17195 _ = v.Args[1] 17196 ptr := v.Args[0] 17197 v_1 := v.Args[1] 17198 if v_1.Op != OpS390XMOVWstore { 17199 break 17200 } 17201 off2 := v_1.AuxInt 17202 sym2 := v_1.Aux 17203 _ = v_1.Args[2] 17204 ptr2 := v_1.Args[0] 17205 x := v_1.Args[1] 17206 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 17207 break 17208 } 17209 v.reset(OpS390XMOVWZreg) 17210 v.AddArg(x) 17211 return true 17212 } 17213 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 17214 // cond: is20Bit(off1+off2) 17215 // result: (MOVWZload [off1+off2] {sym} ptr mem) 17216 for { 17217 off1 := v.AuxInt 17218 sym := v.Aux 17219 _ = v.Args[1] 17220 v_0 := v.Args[0] 17221 if v_0.Op != OpS390XADDconst { 17222 break 17223 } 17224 off2 := v_0.AuxInt 17225 ptr := v_0.Args[0] 17226 mem := v.Args[1] 17227 if !(is20Bit(off1 + off2)) { 17228 break 17229 } 17230 v.reset(OpS390XMOVWZload) 17231 v.AuxInt = off1 + off2 17232 v.Aux = sym 17233 v.AddArg(ptr) 17234 v.AddArg(mem) 17235 return true 17236 } 17237 // match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17238 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17239 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17240 for { 17241 off1 := v.AuxInt 17242 sym1 := v.Aux 17243 _ = v.Args[1] 17244 v_0 := v.Args[0] 17245 if v_0.Op != OpS390XMOVDaddr { 17246 break 17247 } 17248 t := v_0.Type 17249 off2 := v_0.AuxInt 17250 sym2 := v_0.Aux 17251 base := v_0.Args[0] 17252 mem := v.Args[1] 17253 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17254 break 17255 } 17256 v.reset(OpS390XMOVWZload) 17257 v.AuxInt = off1 + off2 17258 v.Aux = mergeSym(sym1, sym2) 17259 v.AddArg(base) 17260 v.AddArg(mem) 17261 return true 17262 } 17263 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 17264 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17265 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 17266 for { 17267 off1 := v.AuxInt 17268 sym1 := v.Aux 17269 _ = v.Args[1] 17270 v_0 := v.Args[0] 17271 if v_0.Op != OpS390XMOVDaddridx { 17272 break 17273 } 17274 off2 := v_0.AuxInt 17275 sym2 := v_0.Aux 17276 _ = v_0.Args[1] 17277 ptr := v_0.Args[0] 17278 idx := v_0.Args[1] 17279 mem := v.Args[1] 17280 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17281 break 17282 } 17283 v.reset(OpS390XMOVWZloadidx) 17284 v.AuxInt = off1 + off2 17285 v.Aux = mergeSym(sym1, sym2) 17286 v.AddArg(ptr) 17287 v.AddArg(idx) 17288 v.AddArg(mem) 17289 return true 17290 } 17291 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 17292 // cond: ptr.Op != OpSB 17293 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 17294 for { 17295 off := v.AuxInt 17296 sym := v.Aux 17297 _ = v.Args[1] 17298 v_0 := v.Args[0] 17299 if v_0.Op != OpS390XADD { 17300 break 17301 } 17302 _ = v_0.Args[1] 17303 ptr := v_0.Args[0] 17304 idx := v_0.Args[1] 17305 mem := v.Args[1] 17306 if !(ptr.Op != OpSB) { 17307 break 17308 } 17309 v.reset(OpS390XMOVWZloadidx) 17310 v.AuxInt = off 17311 v.Aux = sym 17312 v.AddArg(ptr) 17313 v.AddArg(idx) 17314 v.AddArg(mem) 17315 return true 17316 } 17317 return false 17318 } 17319 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 17320 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 17321 // cond: 17322 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17323 for { 17324 c := v.AuxInt 17325 sym := v.Aux 17326 _ = v.Args[2] 17327 v_0 := v.Args[0] 17328 if v_0.Op != OpS390XADDconst { 17329 break 17330 } 17331 d := v_0.AuxInt 17332 ptr := v_0.Args[0] 17333 idx := v.Args[1] 17334 mem := v.Args[2] 17335 v.reset(OpS390XMOVWZloadidx) 17336 v.AuxInt = c + d 17337 v.Aux = sym 17338 v.AddArg(ptr) 17339 v.AddArg(idx) 17340 v.AddArg(mem) 17341 return true 17342 } 17343 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 17344 // cond: 17345 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17346 for { 17347 c := v.AuxInt 17348 sym := v.Aux 17349 _ = v.Args[2] 17350 idx := v.Args[0] 17351 v_1 := v.Args[1] 17352 if v_1.Op != OpS390XADDconst { 17353 break 17354 } 17355 d := v_1.AuxInt 17356 ptr := v_1.Args[0] 17357 mem := v.Args[2] 17358 v.reset(OpS390XMOVWZloadidx) 17359 v.AuxInt = c + d 17360 v.Aux = sym 17361 v.AddArg(ptr) 17362 v.AddArg(idx) 17363 v.AddArg(mem) 17364 return true 17365 } 17366 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 17367 // cond: 17368 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17369 for { 17370 c := v.AuxInt 17371 sym := v.Aux 17372 _ = v.Args[2] 17373 ptr := v.Args[0] 17374 v_1 := v.Args[1] 17375 if v_1.Op != OpS390XADDconst { 17376 break 17377 } 17378 d := v_1.AuxInt 17379 idx := v_1.Args[0] 17380 mem := v.Args[2] 17381 v.reset(OpS390XMOVWZloadidx) 17382 v.AuxInt = c + d 17383 v.Aux = sym 17384 v.AddArg(ptr) 17385 v.AddArg(idx) 17386 v.AddArg(mem) 17387 return true 17388 } 17389 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 17390 // cond: 17391 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17392 for { 17393 c := v.AuxInt 17394 sym := v.Aux 17395 _ = v.Args[2] 17396 v_0 := v.Args[0] 17397 if v_0.Op != OpS390XADDconst { 17398 break 17399 } 17400 d := v_0.AuxInt 17401 idx := v_0.Args[0] 17402 ptr := v.Args[1] 17403 mem := v.Args[2] 17404 v.reset(OpS390XMOVWZloadidx) 17405 v.AuxInt = c + d 17406 v.Aux = sym 17407 v.AddArg(ptr) 17408 v.AddArg(idx) 17409 v.AddArg(mem) 17410 return true 17411 } 17412 return false 17413 } 17414 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 17415 b := v.Block 17416 _ = b 17417 // match: (MOVWZreg x:(MOVBZload _ _)) 17418 // cond: 17419 // result: (MOVDreg x) 17420 for { 17421 x := v.Args[0] 17422 if x.Op != OpS390XMOVBZload { 17423 break 17424 } 17425 _ = x.Args[1] 17426 v.reset(OpS390XMOVDreg) 17427 v.AddArg(x) 17428 return true 17429 } 17430 // match: (MOVWZreg x:(MOVHZload _ _)) 17431 // cond: 17432 // result: (MOVDreg x) 17433 for { 17434 x := v.Args[0] 17435 if x.Op != OpS390XMOVHZload { 17436 break 17437 } 17438 _ = x.Args[1] 17439 v.reset(OpS390XMOVDreg) 17440 v.AddArg(x) 17441 return true 17442 } 17443 // match: (MOVWZreg x:(MOVWZload _ _)) 17444 // cond: 17445 // result: (MOVDreg x) 17446 for { 17447 x := v.Args[0] 17448 if x.Op != OpS390XMOVWZload { 17449 break 17450 } 17451 _ = x.Args[1] 17452 v.reset(OpS390XMOVDreg) 17453 v.AddArg(x) 17454 return true 17455 } 17456 // match: (MOVWZreg x:(Arg <t>)) 17457 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 17458 // result: (MOVDreg x) 17459 for { 17460 x := v.Args[0] 17461 if x.Op != OpArg { 17462 break 17463 } 17464 t := x.Type 17465 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 17466 break 17467 } 17468 v.reset(OpS390XMOVDreg) 17469 v.AddArg(x) 17470 return true 17471 } 17472 // match: (MOVWZreg x:(MOVBZreg _)) 17473 // cond: 17474 // result: (MOVDreg x) 17475 for { 17476 x := v.Args[0] 17477 if x.Op != OpS390XMOVBZreg { 17478 break 17479 } 17480 v.reset(OpS390XMOVDreg) 17481 v.AddArg(x) 17482 return true 17483 } 17484 // match: (MOVWZreg x:(MOVHZreg _)) 17485 // cond: 17486 // result: (MOVDreg x) 17487 for { 17488 x := v.Args[0] 17489 if x.Op != OpS390XMOVHZreg { 17490 break 17491 } 17492 v.reset(OpS390XMOVDreg) 17493 v.AddArg(x) 17494 return true 17495 } 17496 // match: (MOVWZreg x:(MOVWZreg _)) 17497 // cond: 17498 // result: (MOVDreg x) 17499 for { 17500 x := v.Args[0] 17501 if x.Op != OpS390XMOVWZreg { 17502 break 17503 } 17504 v.reset(OpS390XMOVDreg) 17505 v.AddArg(x) 17506 return true 17507 } 17508 // match: (MOVWZreg (MOVDconst [c])) 17509 // cond: 17510 // result: (MOVDconst [int64(uint32(c))]) 17511 for { 17512 v_0 := v.Args[0] 17513 if v_0.Op != OpS390XMOVDconst { 17514 break 17515 } 17516 c := v_0.AuxInt 17517 v.reset(OpS390XMOVDconst) 17518 v.AuxInt = int64(uint32(c)) 17519 return true 17520 } 17521 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 17522 // cond: x.Uses == 1 && clobber(x) 17523 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 17524 for { 17525 x := v.Args[0] 17526 if x.Op != OpS390XMOVWZload { 17527 break 17528 } 17529 off := x.AuxInt 17530 sym := x.Aux 17531 _ = x.Args[1] 17532 ptr := x.Args[0] 17533 mem := x.Args[1] 17534 if !(x.Uses == 1 && clobber(x)) { 17535 break 17536 } 17537 b = x.Block 17538 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 17539 v.reset(OpCopy) 17540 v.AddArg(v0) 17541 v0.AuxInt = off 17542 v0.Aux = sym 17543 v0.AddArg(ptr) 17544 v0.AddArg(mem) 17545 return true 17546 } 17547 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 17548 // cond: x.Uses == 1 && clobber(x) 17549 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 17550 for { 17551 x := v.Args[0] 17552 if x.Op != OpS390XMOVWZloadidx { 17553 break 17554 } 17555 off := x.AuxInt 17556 sym := x.Aux 17557 _ = x.Args[2] 17558 ptr := x.Args[0] 17559 idx := x.Args[1] 17560 mem := x.Args[2] 17561 if !(x.Uses == 1 && clobber(x)) { 17562 break 17563 } 17564 b = x.Block 17565 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 17566 v.reset(OpCopy) 17567 v.AddArg(v0) 17568 v0.AuxInt = off 17569 v0.Aux = sym 17570 v0.AddArg(ptr) 17571 v0.AddArg(idx) 17572 v0.AddArg(mem) 17573 return true 17574 } 17575 return false 17576 } 17577 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 17578 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 17579 // cond: is20Bit(off1+off2) 17580 // result: (MOVWload [off1+off2] {sym} ptr mem) 17581 for { 17582 off1 := v.AuxInt 17583 sym := v.Aux 17584 _ = v.Args[1] 17585 v_0 := v.Args[0] 17586 if v_0.Op != OpS390XADDconst { 17587 break 17588 } 17589 off2 := v_0.AuxInt 17590 ptr := v_0.Args[0] 17591 mem := v.Args[1] 17592 if !(is20Bit(off1 + off2)) { 17593 break 17594 } 17595 v.reset(OpS390XMOVWload) 17596 v.AuxInt = off1 + off2 17597 v.Aux = sym 17598 v.AddArg(ptr) 17599 v.AddArg(mem) 17600 return true 17601 } 17602 // match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17603 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17604 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17605 for { 17606 off1 := v.AuxInt 17607 sym1 := v.Aux 17608 _ = v.Args[1] 17609 v_0 := v.Args[0] 17610 if v_0.Op != OpS390XMOVDaddr { 17611 break 17612 } 17613 t := v_0.Type 17614 off2 := v_0.AuxInt 17615 sym2 := v_0.Aux 17616 base := v_0.Args[0] 17617 mem := v.Args[1] 17618 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17619 break 17620 } 17621 v.reset(OpS390XMOVWload) 17622 v.AuxInt = off1 + off2 17623 v.Aux = mergeSym(sym1, sym2) 17624 v.AddArg(base) 17625 v.AddArg(mem) 17626 return true 17627 } 17628 return false 17629 } 17630 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 17631 // match: (MOVWreg x:(MOVBload _ _)) 17632 // cond: 17633 // result: (MOVDreg x) 17634 for { 17635 x := v.Args[0] 17636 if x.Op != OpS390XMOVBload { 17637 break 17638 } 17639 _ = x.Args[1] 17640 v.reset(OpS390XMOVDreg) 17641 v.AddArg(x) 17642 return true 17643 } 17644 // match: (MOVWreg x:(MOVBZload _ _)) 17645 // cond: 17646 // result: (MOVDreg x) 17647 for { 17648 x := v.Args[0] 17649 if x.Op != OpS390XMOVBZload { 17650 break 17651 } 17652 _ = x.Args[1] 17653 v.reset(OpS390XMOVDreg) 17654 v.AddArg(x) 17655 return true 17656 } 17657 // match: (MOVWreg x:(MOVHload _ _)) 17658 // cond: 17659 // result: (MOVDreg x) 17660 for { 17661 x := v.Args[0] 17662 if x.Op != OpS390XMOVHload { 17663 break 17664 } 17665 _ = x.Args[1] 17666 v.reset(OpS390XMOVDreg) 17667 v.AddArg(x) 17668 return true 17669 } 17670 // match: (MOVWreg x:(MOVHZload _ _)) 17671 // cond: 17672 // result: (MOVDreg x) 17673 for { 17674 x := v.Args[0] 17675 if x.Op != OpS390XMOVHZload { 17676 break 17677 } 17678 _ = x.Args[1] 17679 v.reset(OpS390XMOVDreg) 17680 v.AddArg(x) 17681 return true 17682 } 17683 // match: (MOVWreg x:(MOVWload _ _)) 17684 // cond: 17685 // result: (MOVDreg x) 17686 for { 17687 x := v.Args[0] 17688 if x.Op != OpS390XMOVWload { 17689 break 17690 } 17691 _ = x.Args[1] 17692 v.reset(OpS390XMOVDreg) 17693 v.AddArg(x) 17694 return true 17695 } 17696 // match: (MOVWreg x:(Arg <t>)) 17697 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 17698 // result: (MOVDreg x) 17699 for { 17700 x := v.Args[0] 17701 if x.Op != OpArg { 17702 break 17703 } 17704 t := x.Type 17705 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 17706 break 17707 } 17708 v.reset(OpS390XMOVDreg) 17709 v.AddArg(x) 17710 return true 17711 } 17712 // match: (MOVWreg x:(MOVBreg _)) 17713 // cond: 17714 // result: (MOVDreg x) 17715 for { 17716 x := v.Args[0] 17717 if x.Op != OpS390XMOVBreg { 17718 break 17719 } 17720 v.reset(OpS390XMOVDreg) 17721 v.AddArg(x) 17722 return true 17723 } 17724 // match: (MOVWreg x:(MOVBZreg _)) 17725 // cond: 17726 // result: (MOVDreg x) 17727 for { 17728 x := v.Args[0] 17729 if x.Op != OpS390XMOVBZreg { 17730 break 17731 } 17732 v.reset(OpS390XMOVDreg) 17733 v.AddArg(x) 17734 return true 17735 } 17736 // match: (MOVWreg x:(MOVHreg _)) 17737 // cond: 17738 // result: (MOVDreg x) 17739 for { 17740 x := v.Args[0] 17741 if x.Op != OpS390XMOVHreg { 17742 break 17743 } 17744 v.reset(OpS390XMOVDreg) 17745 v.AddArg(x) 17746 return true 17747 } 17748 // match: (MOVWreg x:(MOVHreg _)) 17749 // cond: 17750 // result: (MOVDreg x) 17751 for { 17752 x := v.Args[0] 17753 if x.Op != OpS390XMOVHreg { 17754 break 17755 } 17756 v.reset(OpS390XMOVDreg) 17757 v.AddArg(x) 17758 return true 17759 } 17760 return false 17761 } 17762 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 17763 b := v.Block 17764 _ = b 17765 // match: (MOVWreg x:(MOVWreg _)) 17766 // cond: 17767 // result: (MOVDreg x) 17768 for { 17769 x := v.Args[0] 17770 if x.Op != OpS390XMOVWreg { 17771 break 17772 } 17773 v.reset(OpS390XMOVDreg) 17774 v.AddArg(x) 17775 return true 17776 } 17777 // match: (MOVWreg (MOVDconst [c])) 17778 // cond: 17779 // result: (MOVDconst [int64(int32(c))]) 17780 for { 17781 v_0 := v.Args[0] 17782 if v_0.Op != OpS390XMOVDconst { 17783 break 17784 } 17785 c := v_0.AuxInt 17786 v.reset(OpS390XMOVDconst) 17787 v.AuxInt = int64(int32(c)) 17788 return true 17789 } 17790 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 17791 // cond: x.Uses == 1 && clobber(x) 17792 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 17793 for { 17794 x := v.Args[0] 17795 if x.Op != OpS390XMOVWZload { 17796 break 17797 } 17798 off := x.AuxInt 17799 sym := x.Aux 17800 _ = x.Args[1] 17801 ptr := x.Args[0] 17802 mem := x.Args[1] 17803 if !(x.Uses == 1 && clobber(x)) { 17804 break 17805 } 17806 b = x.Block 17807 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 17808 v.reset(OpCopy) 17809 v.AddArg(v0) 17810 v0.AuxInt = off 17811 v0.Aux = sym 17812 v0.AddArg(ptr) 17813 v0.AddArg(mem) 17814 return true 17815 } 17816 return false 17817 } 17818 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 17819 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 17820 // cond: 17821 // result: (MOVWstore [off] {sym} ptr x mem) 17822 for { 17823 off := v.AuxInt 17824 sym := v.Aux 17825 _ = v.Args[2] 17826 ptr := v.Args[0] 17827 v_1 := v.Args[1] 17828 if v_1.Op != OpS390XMOVWreg { 17829 break 17830 } 17831 x := v_1.Args[0] 17832 mem := v.Args[2] 17833 v.reset(OpS390XMOVWstore) 17834 v.AuxInt = off 17835 v.Aux = sym 17836 v.AddArg(ptr) 17837 v.AddArg(x) 17838 v.AddArg(mem) 17839 return true 17840 } 17841 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 17842 // cond: 17843 // result: (MOVWstore [off] {sym} ptr x mem) 17844 for { 17845 off := v.AuxInt 17846 sym := v.Aux 17847 _ = v.Args[2] 17848 ptr := v.Args[0] 17849 v_1 := v.Args[1] 17850 if v_1.Op != OpS390XMOVWZreg { 17851 break 17852 } 17853 x := v_1.Args[0] 17854 mem := v.Args[2] 17855 v.reset(OpS390XMOVWstore) 17856 v.AuxInt = off 17857 v.Aux = sym 17858 v.AddArg(ptr) 17859 v.AddArg(x) 17860 v.AddArg(mem) 17861 return true 17862 } 17863 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17864 // cond: is20Bit(off1+off2) 17865 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 17866 for { 17867 off1 := v.AuxInt 17868 sym := v.Aux 17869 _ = v.Args[2] 17870 v_0 := v.Args[0] 17871 if v_0.Op != OpS390XADDconst { 17872 break 17873 } 17874 off2 := v_0.AuxInt 17875 ptr := v_0.Args[0] 17876 val := v.Args[1] 17877 mem := v.Args[2] 17878 if !(is20Bit(off1 + off2)) { 17879 break 17880 } 17881 v.reset(OpS390XMOVWstore) 17882 v.AuxInt = off1 + off2 17883 v.Aux = sym 17884 v.AddArg(ptr) 17885 v.AddArg(val) 17886 v.AddArg(mem) 17887 return true 17888 } 17889 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 17890 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 17891 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 17892 for { 17893 off := v.AuxInt 17894 sym := v.Aux 17895 _ = v.Args[2] 17896 ptr := v.Args[0] 17897 v_1 := v.Args[1] 17898 if v_1.Op != OpS390XMOVDconst { 17899 break 17900 } 17901 c := v_1.AuxInt 17902 mem := v.Args[2] 17903 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 17904 break 17905 } 17906 v.reset(OpS390XMOVWstoreconst) 17907 v.AuxInt = makeValAndOff(int64(int32(c)), off) 17908 v.Aux = sym 17909 v.AddArg(ptr) 17910 v.AddArg(mem) 17911 return true 17912 } 17913 // match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 17914 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17915 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17916 for { 17917 off1 := v.AuxInt 17918 sym1 := v.Aux 17919 _ = v.Args[2] 17920 v_0 := v.Args[0] 17921 if v_0.Op != OpS390XMOVDaddr { 17922 break 17923 } 17924 t := v_0.Type 17925 off2 := v_0.AuxInt 17926 sym2 := v_0.Aux 17927 base := v_0.Args[0] 17928 val := v.Args[1] 17929 mem := v.Args[2] 17930 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17931 break 17932 } 17933 v.reset(OpS390XMOVWstore) 17934 v.AuxInt = off1 + off2 17935 v.Aux = mergeSym(sym1, sym2) 17936 v.AddArg(base) 17937 v.AddArg(val) 17938 v.AddArg(mem) 17939 return true 17940 } 17941 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17942 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17943 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17944 for { 17945 off1 := v.AuxInt 17946 sym1 := v.Aux 17947 _ = v.Args[2] 17948 v_0 := v.Args[0] 17949 if v_0.Op != OpS390XMOVDaddridx { 17950 break 17951 } 17952 off2 := v_0.AuxInt 17953 sym2 := v_0.Aux 17954 _ = v_0.Args[1] 17955 ptr := v_0.Args[0] 17956 idx := v_0.Args[1] 17957 val := v.Args[1] 17958 mem := v.Args[2] 17959 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17960 break 17961 } 17962 v.reset(OpS390XMOVWstoreidx) 17963 v.AuxInt = off1 + off2 17964 v.Aux = mergeSym(sym1, sym2) 17965 v.AddArg(ptr) 17966 v.AddArg(idx) 17967 v.AddArg(val) 17968 v.AddArg(mem) 17969 return true 17970 } 17971 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 17972 // cond: ptr.Op != OpSB 17973 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 17974 for { 17975 off := v.AuxInt 17976 sym := v.Aux 17977 _ = v.Args[2] 17978 v_0 := v.Args[0] 17979 if v_0.Op != OpS390XADD { 17980 break 17981 } 17982 _ = v_0.Args[1] 17983 ptr := v_0.Args[0] 17984 idx := v_0.Args[1] 17985 val := v.Args[1] 17986 mem := v.Args[2] 17987 if !(ptr.Op != OpSB) { 17988 break 17989 } 17990 v.reset(OpS390XMOVWstoreidx) 17991 v.AuxInt = off 17992 v.Aux = sym 17993 v.AddArg(ptr) 17994 v.AddArg(idx) 17995 v.AddArg(val) 17996 v.AddArg(mem) 17997 return true 17998 } 17999 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 18000 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18001 // result: (MOVDstore [i-4] {s} p w mem) 18002 for { 18003 i := v.AuxInt 18004 s := v.Aux 18005 _ = v.Args[2] 18006 p := v.Args[0] 18007 v_1 := v.Args[1] 18008 if v_1.Op != OpS390XSRDconst { 18009 break 18010 } 18011 if v_1.AuxInt != 32 { 18012 break 18013 } 18014 w := v_1.Args[0] 18015 x := v.Args[2] 18016 if x.Op != OpS390XMOVWstore { 18017 break 18018 } 18019 if x.AuxInt != i-4 { 18020 break 18021 } 18022 if x.Aux != s { 18023 break 18024 } 18025 _ = x.Args[2] 18026 if p != x.Args[0] { 18027 break 18028 } 18029 if w != x.Args[1] { 18030 break 18031 } 18032 mem := x.Args[2] 18033 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18034 break 18035 } 18036 v.reset(OpS390XMOVDstore) 18037 v.AuxInt = i - 4 18038 v.Aux = s 18039 v.AddArg(p) 18040 v.AddArg(w) 18041 v.AddArg(mem) 18042 return true 18043 } 18044 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 18045 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18046 // result: (MOVDstore [i-4] {s} p w0 mem) 18047 for { 18048 i := v.AuxInt 18049 s := v.Aux 18050 _ = v.Args[2] 18051 p := v.Args[0] 18052 w0 := v.Args[1] 18053 if w0.Op != OpS390XSRDconst { 18054 break 18055 } 18056 j := w0.AuxInt 18057 w := w0.Args[0] 18058 x := v.Args[2] 18059 if x.Op != OpS390XMOVWstore { 18060 break 18061 } 18062 if x.AuxInt != i-4 { 18063 break 18064 } 18065 if x.Aux != s { 18066 break 18067 } 18068 _ = x.Args[2] 18069 if p != x.Args[0] { 18070 break 18071 } 18072 x_1 := x.Args[1] 18073 if x_1.Op != OpS390XSRDconst { 18074 break 18075 } 18076 if x_1.AuxInt != j+32 { 18077 break 18078 } 18079 if w != x_1.Args[0] { 18080 break 18081 } 18082 mem := x.Args[2] 18083 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18084 break 18085 } 18086 v.reset(OpS390XMOVDstore) 18087 v.AuxInt = i - 4 18088 v.Aux = s 18089 v.AddArg(p) 18090 v.AddArg(w0) 18091 v.AddArg(mem) 18092 return true 18093 } 18094 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 18095 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 18096 // result: (STM2 [i-4] {s} p w0 w1 mem) 18097 for { 18098 i := v.AuxInt 18099 s := v.Aux 18100 _ = v.Args[2] 18101 p := v.Args[0] 18102 w1 := v.Args[1] 18103 x := v.Args[2] 18104 if x.Op != OpS390XMOVWstore { 18105 break 18106 } 18107 if x.AuxInt != i-4 { 18108 break 18109 } 18110 if x.Aux != s { 18111 break 18112 } 18113 _ = x.Args[2] 18114 if p != x.Args[0] { 18115 break 18116 } 18117 w0 := x.Args[1] 18118 mem := x.Args[2] 18119 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 18120 break 18121 } 18122 v.reset(OpS390XSTM2) 18123 v.AuxInt = i - 4 18124 v.Aux = s 18125 v.AddArg(p) 18126 v.AddArg(w0) 18127 v.AddArg(w1) 18128 v.AddArg(mem) 18129 return true 18130 } 18131 return false 18132 } 18133 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 18134 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 18135 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 18136 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 18137 for { 18138 i := v.AuxInt 18139 s := v.Aux 18140 _ = v.Args[2] 18141 p := v.Args[0] 18142 w2 := v.Args[1] 18143 x := v.Args[2] 18144 if x.Op != OpS390XSTM2 { 18145 break 18146 } 18147 if x.AuxInt != i-8 { 18148 break 18149 } 18150 if x.Aux != s { 18151 break 18152 } 18153 _ = x.Args[3] 18154 if p != x.Args[0] { 18155 break 18156 } 18157 w0 := x.Args[1] 18158 w1 := x.Args[2] 18159 mem := x.Args[3] 18160 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 18161 break 18162 } 18163 v.reset(OpS390XSTM3) 18164 v.AuxInt = i - 8 18165 v.Aux = s 18166 v.AddArg(p) 18167 v.AddArg(w0) 18168 v.AddArg(w1) 18169 v.AddArg(w2) 18170 v.AddArg(mem) 18171 return true 18172 } 18173 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 18174 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 18175 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 18176 for { 18177 i := v.AuxInt 18178 s := v.Aux 18179 _ = v.Args[2] 18180 p := v.Args[0] 18181 w3 := v.Args[1] 18182 x := v.Args[2] 18183 if x.Op != OpS390XSTM3 { 18184 break 18185 } 18186 if x.AuxInt != i-12 { 18187 break 18188 } 18189 if x.Aux != s { 18190 break 18191 } 18192 _ = x.Args[4] 18193 if p != x.Args[0] { 18194 break 18195 } 18196 w0 := x.Args[1] 18197 w1 := x.Args[2] 18198 w2 := x.Args[3] 18199 mem := x.Args[4] 18200 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 18201 break 18202 } 18203 v.reset(OpS390XSTM4) 18204 v.AuxInt = i - 12 18205 v.Aux = s 18206 v.AddArg(p) 18207 v.AddArg(w0) 18208 v.AddArg(w1) 18209 v.AddArg(w2) 18210 v.AddArg(w3) 18211 v.AddArg(mem) 18212 return true 18213 } 18214 return false 18215 } 18216 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 18217 b := v.Block 18218 _ = b 18219 typ := &b.Func.Config.Types 18220 _ = typ 18221 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 18222 // cond: isU12Bit(ValAndOff(sc).Off()+off) 18223 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 18224 for { 18225 sc := v.AuxInt 18226 s := v.Aux 18227 _ = v.Args[1] 18228 v_0 := v.Args[0] 18229 if v_0.Op != OpS390XADDconst { 18230 break 18231 } 18232 off := v_0.AuxInt 18233 ptr := v_0.Args[0] 18234 mem := v.Args[1] 18235 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 18236 break 18237 } 18238 v.reset(OpS390XMOVWstoreconst) 18239 v.AuxInt = ValAndOff(sc).add(off) 18240 v.Aux = s 18241 v.AddArg(ptr) 18242 v.AddArg(mem) 18243 return true 18244 } 18245 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 18246 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 18247 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 18248 for { 18249 sc := v.AuxInt 18250 sym1 := v.Aux 18251 _ = v.Args[1] 18252 v_0 := v.Args[0] 18253 if v_0.Op != OpS390XMOVDaddr { 18254 break 18255 } 18256 off := v_0.AuxInt 18257 sym2 := v_0.Aux 18258 ptr := v_0.Args[0] 18259 mem := v.Args[1] 18260 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 18261 break 18262 } 18263 v.reset(OpS390XMOVWstoreconst) 18264 v.AuxInt = ValAndOff(sc).add(off) 18265 v.Aux = mergeSym(sym1, sym2) 18266 v.AddArg(ptr) 18267 v.AddArg(mem) 18268 return true 18269 } 18270 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 18271 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 18272 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 18273 for { 18274 c := v.AuxInt 18275 s := v.Aux 18276 _ = v.Args[1] 18277 p := v.Args[0] 18278 x := v.Args[1] 18279 if x.Op != OpS390XMOVWstoreconst { 18280 break 18281 } 18282 a := x.AuxInt 18283 if x.Aux != s { 18284 break 18285 } 18286 _ = x.Args[1] 18287 if p != x.Args[0] { 18288 break 18289 } 18290 mem := x.Args[1] 18291 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 18292 break 18293 } 18294 v.reset(OpS390XMOVDstore) 18295 v.AuxInt = ValAndOff(a).Off() 18296 v.Aux = s 18297 v.AddArg(p) 18298 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 18299 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 18300 v.AddArg(v0) 18301 v.AddArg(mem) 18302 return true 18303 } 18304 return false 18305 } 18306 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 18307 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 18308 // cond: 18309 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18310 for { 18311 c := v.AuxInt 18312 sym := v.Aux 18313 _ = v.Args[3] 18314 v_0 := v.Args[0] 18315 if v_0.Op != OpS390XADDconst { 18316 break 18317 } 18318 d := v_0.AuxInt 18319 ptr := v_0.Args[0] 18320 idx := v.Args[1] 18321 val := v.Args[2] 18322 mem := v.Args[3] 18323 v.reset(OpS390XMOVWstoreidx) 18324 v.AuxInt = c + d 18325 v.Aux = sym 18326 v.AddArg(ptr) 18327 v.AddArg(idx) 18328 v.AddArg(val) 18329 v.AddArg(mem) 18330 return true 18331 } 18332 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 18333 // cond: 18334 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18335 for { 18336 c := v.AuxInt 18337 sym := v.Aux 18338 _ = v.Args[3] 18339 idx := v.Args[0] 18340 v_1 := v.Args[1] 18341 if v_1.Op != OpS390XADDconst { 18342 break 18343 } 18344 d := v_1.AuxInt 18345 ptr := v_1.Args[0] 18346 val := v.Args[2] 18347 mem := v.Args[3] 18348 v.reset(OpS390XMOVWstoreidx) 18349 v.AuxInt = c + d 18350 v.Aux = sym 18351 v.AddArg(ptr) 18352 v.AddArg(idx) 18353 v.AddArg(val) 18354 v.AddArg(mem) 18355 return true 18356 } 18357 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 18358 // cond: 18359 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18360 for { 18361 c := v.AuxInt 18362 sym := v.Aux 18363 _ = v.Args[3] 18364 ptr := v.Args[0] 18365 v_1 := v.Args[1] 18366 if v_1.Op != OpS390XADDconst { 18367 break 18368 } 18369 d := v_1.AuxInt 18370 idx := v_1.Args[0] 18371 val := v.Args[2] 18372 mem := v.Args[3] 18373 v.reset(OpS390XMOVWstoreidx) 18374 v.AuxInt = c + d 18375 v.Aux = sym 18376 v.AddArg(ptr) 18377 v.AddArg(idx) 18378 v.AddArg(val) 18379 v.AddArg(mem) 18380 return true 18381 } 18382 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 18383 // cond: 18384 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18385 for { 18386 c := v.AuxInt 18387 sym := v.Aux 18388 _ = v.Args[3] 18389 v_0 := v.Args[0] 18390 if v_0.Op != OpS390XADDconst { 18391 break 18392 } 18393 d := v_0.AuxInt 18394 idx := v_0.Args[0] 18395 ptr := v.Args[1] 18396 val := v.Args[2] 18397 mem := v.Args[3] 18398 v.reset(OpS390XMOVWstoreidx) 18399 v.AuxInt = c + d 18400 v.Aux = sym 18401 v.AddArg(ptr) 18402 v.AddArg(idx) 18403 v.AddArg(val) 18404 v.AddArg(mem) 18405 return true 18406 } 18407 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18408 // cond: x.Uses == 1 && clobber(x) 18409 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18410 for { 18411 i := v.AuxInt 18412 s := v.Aux 18413 _ = v.Args[3] 18414 p := v.Args[0] 18415 idx := v.Args[1] 18416 w := v.Args[2] 18417 x := v.Args[3] 18418 if x.Op != OpS390XMOVWstoreidx { 18419 break 18420 } 18421 if x.AuxInt != i-4 { 18422 break 18423 } 18424 if x.Aux != s { 18425 break 18426 } 18427 _ = x.Args[3] 18428 if p != x.Args[0] { 18429 break 18430 } 18431 if idx != x.Args[1] { 18432 break 18433 } 18434 x_2 := x.Args[2] 18435 if x_2.Op != OpS390XSRDconst { 18436 break 18437 } 18438 if x_2.AuxInt != 32 { 18439 break 18440 } 18441 if w != x_2.Args[0] { 18442 break 18443 } 18444 mem := x.Args[3] 18445 if !(x.Uses == 1 && clobber(x)) { 18446 break 18447 } 18448 v.reset(OpS390XMOVDstoreidx) 18449 v.AuxInt = i - 4 18450 v.Aux = s 18451 v.AddArg(p) 18452 v.AddArg(idx) 18453 v.AddArg(w) 18454 v.AddArg(mem) 18455 return true 18456 } 18457 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18458 // cond: x.Uses == 1 && clobber(x) 18459 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18460 for { 18461 i := v.AuxInt 18462 s := v.Aux 18463 _ = v.Args[3] 18464 p := v.Args[0] 18465 idx := v.Args[1] 18466 w := v.Args[2] 18467 x := v.Args[3] 18468 if x.Op != OpS390XMOVWstoreidx { 18469 break 18470 } 18471 if x.AuxInt != i-4 { 18472 break 18473 } 18474 if x.Aux != s { 18475 break 18476 } 18477 _ = x.Args[3] 18478 if idx != x.Args[0] { 18479 break 18480 } 18481 if p != x.Args[1] { 18482 break 18483 } 18484 x_2 := x.Args[2] 18485 if x_2.Op != OpS390XSRDconst { 18486 break 18487 } 18488 if x_2.AuxInt != 32 { 18489 break 18490 } 18491 if w != x_2.Args[0] { 18492 break 18493 } 18494 mem := x.Args[3] 18495 if !(x.Uses == 1 && clobber(x)) { 18496 break 18497 } 18498 v.reset(OpS390XMOVDstoreidx) 18499 v.AuxInt = i - 4 18500 v.Aux = s 18501 v.AddArg(p) 18502 v.AddArg(idx) 18503 v.AddArg(w) 18504 v.AddArg(mem) 18505 return true 18506 } 18507 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18508 // cond: x.Uses == 1 && clobber(x) 18509 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18510 for { 18511 i := v.AuxInt 18512 s := v.Aux 18513 _ = v.Args[3] 18514 idx := v.Args[0] 18515 p := v.Args[1] 18516 w := v.Args[2] 18517 x := v.Args[3] 18518 if x.Op != OpS390XMOVWstoreidx { 18519 break 18520 } 18521 if x.AuxInt != i-4 { 18522 break 18523 } 18524 if x.Aux != s { 18525 break 18526 } 18527 _ = x.Args[3] 18528 if p != x.Args[0] { 18529 break 18530 } 18531 if idx != x.Args[1] { 18532 break 18533 } 18534 x_2 := x.Args[2] 18535 if x_2.Op != OpS390XSRDconst { 18536 break 18537 } 18538 if x_2.AuxInt != 32 { 18539 break 18540 } 18541 if w != x_2.Args[0] { 18542 break 18543 } 18544 mem := x.Args[3] 18545 if !(x.Uses == 1 && clobber(x)) { 18546 break 18547 } 18548 v.reset(OpS390XMOVDstoreidx) 18549 v.AuxInt = i - 4 18550 v.Aux = s 18551 v.AddArg(p) 18552 v.AddArg(idx) 18553 v.AddArg(w) 18554 v.AddArg(mem) 18555 return true 18556 } 18557 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18558 // cond: x.Uses == 1 && clobber(x) 18559 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18560 for { 18561 i := v.AuxInt 18562 s := v.Aux 18563 _ = v.Args[3] 18564 idx := v.Args[0] 18565 p := v.Args[1] 18566 w := v.Args[2] 18567 x := v.Args[3] 18568 if x.Op != OpS390XMOVWstoreidx { 18569 break 18570 } 18571 if x.AuxInt != i-4 { 18572 break 18573 } 18574 if x.Aux != s { 18575 break 18576 } 18577 _ = x.Args[3] 18578 if idx != x.Args[0] { 18579 break 18580 } 18581 if p != x.Args[1] { 18582 break 18583 } 18584 x_2 := x.Args[2] 18585 if x_2.Op != OpS390XSRDconst { 18586 break 18587 } 18588 if x_2.AuxInt != 32 { 18589 break 18590 } 18591 if w != x_2.Args[0] { 18592 break 18593 } 18594 mem := x.Args[3] 18595 if !(x.Uses == 1 && clobber(x)) { 18596 break 18597 } 18598 v.reset(OpS390XMOVDstoreidx) 18599 v.AuxInt = i - 4 18600 v.Aux = s 18601 v.AddArg(p) 18602 v.AddArg(idx) 18603 v.AddArg(w) 18604 v.AddArg(mem) 18605 return true 18606 } 18607 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 18608 // cond: x.Uses == 1 && clobber(x) 18609 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18610 for { 18611 i := v.AuxInt 18612 s := v.Aux 18613 _ = v.Args[3] 18614 p := v.Args[0] 18615 idx := v.Args[1] 18616 w0 := v.Args[2] 18617 if w0.Op != OpS390XSRDconst { 18618 break 18619 } 18620 j := w0.AuxInt 18621 w := w0.Args[0] 18622 x := v.Args[3] 18623 if x.Op != OpS390XMOVWstoreidx { 18624 break 18625 } 18626 if x.AuxInt != i-4 { 18627 break 18628 } 18629 if x.Aux != s { 18630 break 18631 } 18632 _ = x.Args[3] 18633 if p != x.Args[0] { 18634 break 18635 } 18636 if idx != x.Args[1] { 18637 break 18638 } 18639 x_2 := x.Args[2] 18640 if x_2.Op != OpS390XSRDconst { 18641 break 18642 } 18643 if x_2.AuxInt != j+32 { 18644 break 18645 } 18646 if w != x_2.Args[0] { 18647 break 18648 } 18649 mem := x.Args[3] 18650 if !(x.Uses == 1 && clobber(x)) { 18651 break 18652 } 18653 v.reset(OpS390XMOVDstoreidx) 18654 v.AuxInt = i - 4 18655 v.Aux = s 18656 v.AddArg(p) 18657 v.AddArg(idx) 18658 v.AddArg(w0) 18659 v.AddArg(mem) 18660 return true 18661 } 18662 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18663 // cond: x.Uses == 1 && clobber(x) 18664 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18665 for { 18666 i := v.AuxInt 18667 s := v.Aux 18668 _ = v.Args[3] 18669 p := v.Args[0] 18670 idx := v.Args[1] 18671 w0 := v.Args[2] 18672 if w0.Op != OpS390XSRDconst { 18673 break 18674 } 18675 j := w0.AuxInt 18676 w := w0.Args[0] 18677 x := v.Args[3] 18678 if x.Op != OpS390XMOVWstoreidx { 18679 break 18680 } 18681 if x.AuxInt != i-4 { 18682 break 18683 } 18684 if x.Aux != s { 18685 break 18686 } 18687 _ = x.Args[3] 18688 if idx != x.Args[0] { 18689 break 18690 } 18691 if p != x.Args[1] { 18692 break 18693 } 18694 x_2 := x.Args[2] 18695 if x_2.Op != OpS390XSRDconst { 18696 break 18697 } 18698 if x_2.AuxInt != j+32 { 18699 break 18700 } 18701 if w != x_2.Args[0] { 18702 break 18703 } 18704 mem := x.Args[3] 18705 if !(x.Uses == 1 && clobber(x)) { 18706 break 18707 } 18708 v.reset(OpS390XMOVDstoreidx) 18709 v.AuxInt = i - 4 18710 v.Aux = s 18711 v.AddArg(p) 18712 v.AddArg(idx) 18713 v.AddArg(w0) 18714 v.AddArg(mem) 18715 return true 18716 } 18717 return false 18718 } 18719 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 18720 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 18721 // cond: x.Uses == 1 && clobber(x) 18722 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18723 for { 18724 i := v.AuxInt 18725 s := v.Aux 18726 _ = v.Args[3] 18727 idx := v.Args[0] 18728 p := v.Args[1] 18729 w0 := v.Args[2] 18730 if w0.Op != OpS390XSRDconst { 18731 break 18732 } 18733 j := w0.AuxInt 18734 w := w0.Args[0] 18735 x := v.Args[3] 18736 if x.Op != OpS390XMOVWstoreidx { 18737 break 18738 } 18739 if x.AuxInt != i-4 { 18740 break 18741 } 18742 if x.Aux != s { 18743 break 18744 } 18745 _ = x.Args[3] 18746 if p != x.Args[0] { 18747 break 18748 } 18749 if idx != x.Args[1] { 18750 break 18751 } 18752 x_2 := x.Args[2] 18753 if x_2.Op != OpS390XSRDconst { 18754 break 18755 } 18756 if x_2.AuxInt != j+32 { 18757 break 18758 } 18759 if w != x_2.Args[0] { 18760 break 18761 } 18762 mem := x.Args[3] 18763 if !(x.Uses == 1 && clobber(x)) { 18764 break 18765 } 18766 v.reset(OpS390XMOVDstoreidx) 18767 v.AuxInt = i - 4 18768 v.Aux = s 18769 v.AddArg(p) 18770 v.AddArg(idx) 18771 v.AddArg(w0) 18772 v.AddArg(mem) 18773 return true 18774 } 18775 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18776 // cond: x.Uses == 1 && clobber(x) 18777 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18778 for { 18779 i := v.AuxInt 18780 s := v.Aux 18781 _ = v.Args[3] 18782 idx := v.Args[0] 18783 p := v.Args[1] 18784 w0 := v.Args[2] 18785 if w0.Op != OpS390XSRDconst { 18786 break 18787 } 18788 j := w0.AuxInt 18789 w := w0.Args[0] 18790 x := v.Args[3] 18791 if x.Op != OpS390XMOVWstoreidx { 18792 break 18793 } 18794 if x.AuxInt != i-4 { 18795 break 18796 } 18797 if x.Aux != s { 18798 break 18799 } 18800 _ = x.Args[3] 18801 if idx != x.Args[0] { 18802 break 18803 } 18804 if p != x.Args[1] { 18805 break 18806 } 18807 x_2 := x.Args[2] 18808 if x_2.Op != OpS390XSRDconst { 18809 break 18810 } 18811 if x_2.AuxInt != j+32 { 18812 break 18813 } 18814 if w != x_2.Args[0] { 18815 break 18816 } 18817 mem := x.Args[3] 18818 if !(x.Uses == 1 && clobber(x)) { 18819 break 18820 } 18821 v.reset(OpS390XMOVDstoreidx) 18822 v.AuxInt = i - 4 18823 v.Aux = s 18824 v.AddArg(p) 18825 v.AddArg(idx) 18826 v.AddArg(w0) 18827 v.AddArg(mem) 18828 return true 18829 } 18830 return false 18831 } 18832 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 18833 // match: (MULLD x (MOVDconst [c])) 18834 // cond: is32Bit(c) 18835 // result: (MULLDconst [c] x) 18836 for { 18837 _ = v.Args[1] 18838 x := v.Args[0] 18839 v_1 := v.Args[1] 18840 if v_1.Op != OpS390XMOVDconst { 18841 break 18842 } 18843 c := v_1.AuxInt 18844 if !(is32Bit(c)) { 18845 break 18846 } 18847 v.reset(OpS390XMULLDconst) 18848 v.AuxInt = c 18849 v.AddArg(x) 18850 return true 18851 } 18852 // match: (MULLD (MOVDconst [c]) x) 18853 // cond: is32Bit(c) 18854 // result: (MULLDconst [c] x) 18855 for { 18856 _ = v.Args[1] 18857 v_0 := v.Args[0] 18858 if v_0.Op != OpS390XMOVDconst { 18859 break 18860 } 18861 c := v_0.AuxInt 18862 x := v.Args[1] 18863 if !(is32Bit(c)) { 18864 break 18865 } 18866 v.reset(OpS390XMULLDconst) 18867 v.AuxInt = c 18868 v.AddArg(x) 18869 return true 18870 } 18871 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18872 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18873 // result: (MULLDload <t> [off] {sym} x ptr mem) 18874 for { 18875 t := v.Type 18876 _ = v.Args[1] 18877 x := v.Args[0] 18878 g := v.Args[1] 18879 if g.Op != OpS390XMOVDload { 18880 break 18881 } 18882 off := g.AuxInt 18883 sym := g.Aux 18884 _ = g.Args[1] 18885 ptr := g.Args[0] 18886 mem := g.Args[1] 18887 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18888 break 18889 } 18890 v.reset(OpS390XMULLDload) 18891 v.Type = t 18892 v.AuxInt = off 18893 v.Aux = sym 18894 v.AddArg(x) 18895 v.AddArg(ptr) 18896 v.AddArg(mem) 18897 return true 18898 } 18899 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18900 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18901 // result: (MULLDload <t> [off] {sym} x ptr mem) 18902 for { 18903 t := v.Type 18904 _ = v.Args[1] 18905 g := v.Args[0] 18906 if g.Op != OpS390XMOVDload { 18907 break 18908 } 18909 off := g.AuxInt 18910 sym := g.Aux 18911 _ = g.Args[1] 18912 ptr := g.Args[0] 18913 mem := g.Args[1] 18914 x := v.Args[1] 18915 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18916 break 18917 } 18918 v.reset(OpS390XMULLDload) 18919 v.Type = t 18920 v.AuxInt = off 18921 v.Aux = sym 18922 v.AddArg(x) 18923 v.AddArg(ptr) 18924 v.AddArg(mem) 18925 return true 18926 } 18927 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18928 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18929 // result: (MULLDload <t> [off] {sym} x ptr mem) 18930 for { 18931 t := v.Type 18932 _ = v.Args[1] 18933 g := v.Args[0] 18934 if g.Op != OpS390XMOVDload { 18935 break 18936 } 18937 off := g.AuxInt 18938 sym := g.Aux 18939 _ = g.Args[1] 18940 ptr := g.Args[0] 18941 mem := g.Args[1] 18942 x := v.Args[1] 18943 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18944 break 18945 } 18946 v.reset(OpS390XMULLDload) 18947 v.Type = t 18948 v.AuxInt = off 18949 v.Aux = sym 18950 v.AddArg(x) 18951 v.AddArg(ptr) 18952 v.AddArg(mem) 18953 return true 18954 } 18955 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18956 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18957 // result: (MULLDload <t> [off] {sym} x ptr mem) 18958 for { 18959 t := v.Type 18960 _ = v.Args[1] 18961 x := v.Args[0] 18962 g := v.Args[1] 18963 if g.Op != OpS390XMOVDload { 18964 break 18965 } 18966 off := g.AuxInt 18967 sym := g.Aux 18968 _ = g.Args[1] 18969 ptr := g.Args[0] 18970 mem := g.Args[1] 18971 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18972 break 18973 } 18974 v.reset(OpS390XMULLDload) 18975 v.Type = t 18976 v.AuxInt = off 18977 v.Aux = sym 18978 v.AddArg(x) 18979 v.AddArg(ptr) 18980 v.AddArg(mem) 18981 return true 18982 } 18983 return false 18984 } 18985 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 18986 b := v.Block 18987 _ = b 18988 // match: (MULLDconst [-1] x) 18989 // cond: 18990 // result: (NEG x) 18991 for { 18992 if v.AuxInt != -1 { 18993 break 18994 } 18995 x := v.Args[0] 18996 v.reset(OpS390XNEG) 18997 v.AddArg(x) 18998 return true 18999 } 19000 // match: (MULLDconst [0] _) 19001 // cond: 19002 // result: (MOVDconst [0]) 19003 for { 19004 if v.AuxInt != 0 { 19005 break 19006 } 19007 v.reset(OpS390XMOVDconst) 19008 v.AuxInt = 0 19009 return true 19010 } 19011 // match: (MULLDconst [1] x) 19012 // cond: 19013 // result: x 19014 for { 19015 if v.AuxInt != 1 { 19016 break 19017 } 19018 x := v.Args[0] 19019 v.reset(OpCopy) 19020 v.Type = x.Type 19021 v.AddArg(x) 19022 return true 19023 } 19024 // match: (MULLDconst [c] x) 19025 // cond: isPowerOfTwo(c) 19026 // result: (SLDconst [log2(c)] x) 19027 for { 19028 c := v.AuxInt 19029 x := v.Args[0] 19030 if !(isPowerOfTwo(c)) { 19031 break 19032 } 19033 v.reset(OpS390XSLDconst) 19034 v.AuxInt = log2(c) 19035 v.AddArg(x) 19036 return true 19037 } 19038 // match: (MULLDconst [c] x) 19039 // cond: isPowerOfTwo(c+1) && c >= 15 19040 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 19041 for { 19042 c := v.AuxInt 19043 x := v.Args[0] 19044 if !(isPowerOfTwo(c+1) && c >= 15) { 19045 break 19046 } 19047 v.reset(OpS390XSUB) 19048 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19049 v0.AuxInt = log2(c + 1) 19050 v0.AddArg(x) 19051 v.AddArg(v0) 19052 v.AddArg(x) 19053 return true 19054 } 19055 // match: (MULLDconst [c] x) 19056 // cond: isPowerOfTwo(c-1) && c >= 17 19057 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 19058 for { 19059 c := v.AuxInt 19060 x := v.Args[0] 19061 if !(isPowerOfTwo(c-1) && c >= 17) { 19062 break 19063 } 19064 v.reset(OpS390XADD) 19065 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19066 v0.AuxInt = log2(c - 1) 19067 v0.AddArg(x) 19068 v.AddArg(v0) 19069 v.AddArg(x) 19070 return true 19071 } 19072 // match: (MULLDconst [c] (MOVDconst [d])) 19073 // cond: 19074 // result: (MOVDconst [c*d]) 19075 for { 19076 c := v.AuxInt 19077 v_0 := v.Args[0] 19078 if v_0.Op != OpS390XMOVDconst { 19079 break 19080 } 19081 d := v_0.AuxInt 19082 v.reset(OpS390XMOVDconst) 19083 v.AuxInt = c * d 19084 return true 19085 } 19086 return false 19087 } 19088 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 19089 // match: (MULLW x (MOVDconst [c])) 19090 // cond: 19091 // result: (MULLWconst [c] x) 19092 for { 19093 _ = v.Args[1] 19094 x := v.Args[0] 19095 v_1 := v.Args[1] 19096 if v_1.Op != OpS390XMOVDconst { 19097 break 19098 } 19099 c := v_1.AuxInt 19100 v.reset(OpS390XMULLWconst) 19101 v.AuxInt = c 19102 v.AddArg(x) 19103 return true 19104 } 19105 // match: (MULLW (MOVDconst [c]) x) 19106 // cond: 19107 // result: (MULLWconst [c] x) 19108 for { 19109 _ = v.Args[1] 19110 v_0 := v.Args[0] 19111 if v_0.Op != OpS390XMOVDconst { 19112 break 19113 } 19114 c := v_0.AuxInt 19115 x := v.Args[1] 19116 v.reset(OpS390XMULLWconst) 19117 v.AuxInt = c 19118 v.AddArg(x) 19119 return true 19120 } 19121 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19122 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19123 // result: (MULLWload <t> [off] {sym} x ptr mem) 19124 for { 19125 t := v.Type 19126 _ = v.Args[1] 19127 x := v.Args[0] 19128 g := v.Args[1] 19129 if g.Op != OpS390XMOVWload { 19130 break 19131 } 19132 off := g.AuxInt 19133 sym := g.Aux 19134 _ = g.Args[1] 19135 ptr := g.Args[0] 19136 mem := g.Args[1] 19137 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19138 break 19139 } 19140 v.reset(OpS390XMULLWload) 19141 v.Type = t 19142 v.AuxInt = off 19143 v.Aux = sym 19144 v.AddArg(x) 19145 v.AddArg(ptr) 19146 v.AddArg(mem) 19147 return true 19148 } 19149 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19150 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19151 // result: (MULLWload <t> [off] {sym} x ptr mem) 19152 for { 19153 t := v.Type 19154 _ = v.Args[1] 19155 g := v.Args[0] 19156 if g.Op != OpS390XMOVWload { 19157 break 19158 } 19159 off := g.AuxInt 19160 sym := g.Aux 19161 _ = g.Args[1] 19162 ptr := g.Args[0] 19163 mem := g.Args[1] 19164 x := v.Args[1] 19165 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19166 break 19167 } 19168 v.reset(OpS390XMULLWload) 19169 v.Type = t 19170 v.AuxInt = off 19171 v.Aux = sym 19172 v.AddArg(x) 19173 v.AddArg(ptr) 19174 v.AddArg(mem) 19175 return true 19176 } 19177 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19178 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19179 // result: (MULLWload <t> [off] {sym} x ptr mem) 19180 for { 19181 t := v.Type 19182 _ = v.Args[1] 19183 g := v.Args[0] 19184 if g.Op != OpS390XMOVWload { 19185 break 19186 } 19187 off := g.AuxInt 19188 sym := g.Aux 19189 _ = g.Args[1] 19190 ptr := g.Args[0] 19191 mem := g.Args[1] 19192 x := v.Args[1] 19193 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19194 break 19195 } 19196 v.reset(OpS390XMULLWload) 19197 v.Type = t 19198 v.AuxInt = off 19199 v.Aux = sym 19200 v.AddArg(x) 19201 v.AddArg(ptr) 19202 v.AddArg(mem) 19203 return true 19204 } 19205 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19206 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19207 // result: (MULLWload <t> [off] {sym} x ptr mem) 19208 for { 19209 t := v.Type 19210 _ = v.Args[1] 19211 x := v.Args[0] 19212 g := v.Args[1] 19213 if g.Op != OpS390XMOVWload { 19214 break 19215 } 19216 off := g.AuxInt 19217 sym := g.Aux 19218 _ = g.Args[1] 19219 ptr := g.Args[0] 19220 mem := g.Args[1] 19221 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19222 break 19223 } 19224 v.reset(OpS390XMULLWload) 19225 v.Type = t 19226 v.AuxInt = off 19227 v.Aux = sym 19228 v.AddArg(x) 19229 v.AddArg(ptr) 19230 v.AddArg(mem) 19231 return true 19232 } 19233 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19234 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19235 // result: (MULLWload <t> [off] {sym} x ptr mem) 19236 for { 19237 t := v.Type 19238 _ = v.Args[1] 19239 x := v.Args[0] 19240 g := v.Args[1] 19241 if g.Op != OpS390XMOVWZload { 19242 break 19243 } 19244 off := g.AuxInt 19245 sym := g.Aux 19246 _ = g.Args[1] 19247 ptr := g.Args[0] 19248 mem := g.Args[1] 19249 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19250 break 19251 } 19252 v.reset(OpS390XMULLWload) 19253 v.Type = t 19254 v.AuxInt = off 19255 v.Aux = sym 19256 v.AddArg(x) 19257 v.AddArg(ptr) 19258 v.AddArg(mem) 19259 return true 19260 } 19261 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19262 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19263 // result: (MULLWload <t> [off] {sym} x ptr mem) 19264 for { 19265 t := v.Type 19266 _ = v.Args[1] 19267 g := v.Args[0] 19268 if g.Op != OpS390XMOVWZload { 19269 break 19270 } 19271 off := g.AuxInt 19272 sym := g.Aux 19273 _ = g.Args[1] 19274 ptr := g.Args[0] 19275 mem := g.Args[1] 19276 x := v.Args[1] 19277 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19278 break 19279 } 19280 v.reset(OpS390XMULLWload) 19281 v.Type = t 19282 v.AuxInt = off 19283 v.Aux = sym 19284 v.AddArg(x) 19285 v.AddArg(ptr) 19286 v.AddArg(mem) 19287 return true 19288 } 19289 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19290 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19291 // result: (MULLWload <t> [off] {sym} x ptr mem) 19292 for { 19293 t := v.Type 19294 _ = v.Args[1] 19295 g := v.Args[0] 19296 if g.Op != OpS390XMOVWZload { 19297 break 19298 } 19299 off := g.AuxInt 19300 sym := g.Aux 19301 _ = g.Args[1] 19302 ptr := g.Args[0] 19303 mem := g.Args[1] 19304 x := v.Args[1] 19305 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19306 break 19307 } 19308 v.reset(OpS390XMULLWload) 19309 v.Type = t 19310 v.AuxInt = off 19311 v.Aux = sym 19312 v.AddArg(x) 19313 v.AddArg(ptr) 19314 v.AddArg(mem) 19315 return true 19316 } 19317 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19318 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19319 // result: (MULLWload <t> [off] {sym} x ptr mem) 19320 for { 19321 t := v.Type 19322 _ = v.Args[1] 19323 x := v.Args[0] 19324 g := v.Args[1] 19325 if g.Op != OpS390XMOVWZload { 19326 break 19327 } 19328 off := g.AuxInt 19329 sym := g.Aux 19330 _ = g.Args[1] 19331 ptr := g.Args[0] 19332 mem := g.Args[1] 19333 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19334 break 19335 } 19336 v.reset(OpS390XMULLWload) 19337 v.Type = t 19338 v.AuxInt = off 19339 v.Aux = sym 19340 v.AddArg(x) 19341 v.AddArg(ptr) 19342 v.AddArg(mem) 19343 return true 19344 } 19345 return false 19346 } 19347 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 19348 b := v.Block 19349 _ = b 19350 // match: (MULLWconst [-1] x) 19351 // cond: 19352 // result: (NEGW x) 19353 for { 19354 if v.AuxInt != -1 { 19355 break 19356 } 19357 x := v.Args[0] 19358 v.reset(OpS390XNEGW) 19359 v.AddArg(x) 19360 return true 19361 } 19362 // match: (MULLWconst [0] _) 19363 // cond: 19364 // result: (MOVDconst [0]) 19365 for { 19366 if v.AuxInt != 0 { 19367 break 19368 } 19369 v.reset(OpS390XMOVDconst) 19370 v.AuxInt = 0 19371 return true 19372 } 19373 // match: (MULLWconst [1] x) 19374 // cond: 19375 // result: x 19376 for { 19377 if v.AuxInt != 1 { 19378 break 19379 } 19380 x := v.Args[0] 19381 v.reset(OpCopy) 19382 v.Type = x.Type 19383 v.AddArg(x) 19384 return true 19385 } 19386 // match: (MULLWconst [c] x) 19387 // cond: isPowerOfTwo(c) 19388 // result: (SLWconst [log2(c)] x) 19389 for { 19390 c := v.AuxInt 19391 x := v.Args[0] 19392 if !(isPowerOfTwo(c)) { 19393 break 19394 } 19395 v.reset(OpS390XSLWconst) 19396 v.AuxInt = log2(c) 19397 v.AddArg(x) 19398 return true 19399 } 19400 // match: (MULLWconst [c] x) 19401 // cond: isPowerOfTwo(c+1) && c >= 15 19402 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 19403 for { 19404 c := v.AuxInt 19405 x := v.Args[0] 19406 if !(isPowerOfTwo(c+1) && c >= 15) { 19407 break 19408 } 19409 v.reset(OpS390XSUBW) 19410 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19411 v0.AuxInt = log2(c + 1) 19412 v0.AddArg(x) 19413 v.AddArg(v0) 19414 v.AddArg(x) 19415 return true 19416 } 19417 // match: (MULLWconst [c] x) 19418 // cond: isPowerOfTwo(c-1) && c >= 17 19419 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 19420 for { 19421 c := v.AuxInt 19422 x := v.Args[0] 19423 if !(isPowerOfTwo(c-1) && c >= 17) { 19424 break 19425 } 19426 v.reset(OpS390XADDW) 19427 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19428 v0.AuxInt = log2(c - 1) 19429 v0.AddArg(x) 19430 v.AddArg(v0) 19431 v.AddArg(x) 19432 return true 19433 } 19434 // match: (MULLWconst [c] (MOVDconst [d])) 19435 // cond: 19436 // result: (MOVDconst [int64(int32(c*d))]) 19437 for { 19438 c := v.AuxInt 19439 v_0 := v.Args[0] 19440 if v_0.Op != OpS390XMOVDconst { 19441 break 19442 } 19443 d := v_0.AuxInt 19444 v.reset(OpS390XMOVDconst) 19445 v.AuxInt = int64(int32(c * d)) 19446 return true 19447 } 19448 return false 19449 } 19450 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 19451 // match: (NEG (MOVDconst [c])) 19452 // cond: 19453 // result: (MOVDconst [-c]) 19454 for { 19455 v_0 := v.Args[0] 19456 if v_0.Op != OpS390XMOVDconst { 19457 break 19458 } 19459 c := v_0.AuxInt 19460 v.reset(OpS390XMOVDconst) 19461 v.AuxInt = -c 19462 return true 19463 } 19464 // match: (NEG (ADDconst [c] (NEG x))) 19465 // cond: c != -(1<<31) 19466 // result: (ADDconst [-c] x) 19467 for { 19468 v_0 := v.Args[0] 19469 if v_0.Op != OpS390XADDconst { 19470 break 19471 } 19472 c := v_0.AuxInt 19473 v_0_0 := v_0.Args[0] 19474 if v_0_0.Op != OpS390XNEG { 19475 break 19476 } 19477 x := v_0_0.Args[0] 19478 if !(c != -(1 << 31)) { 19479 break 19480 } 19481 v.reset(OpS390XADDconst) 19482 v.AuxInt = -c 19483 v.AddArg(x) 19484 return true 19485 } 19486 return false 19487 } 19488 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 19489 // match: (NEGW (MOVDconst [c])) 19490 // cond: 19491 // result: (MOVDconst [int64(int32(-c))]) 19492 for { 19493 v_0 := v.Args[0] 19494 if v_0.Op != OpS390XMOVDconst { 19495 break 19496 } 19497 c := v_0.AuxInt 19498 v.reset(OpS390XMOVDconst) 19499 v.AuxInt = int64(int32(-c)) 19500 return true 19501 } 19502 return false 19503 } 19504 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 19505 b := v.Block 19506 _ = b 19507 typ := &b.Func.Config.Types 19508 _ = typ 19509 // match: (NOT x) 19510 // cond: true 19511 // result: (XOR (MOVDconst [-1]) x) 19512 for { 19513 x := v.Args[0] 19514 if !(true) { 19515 break 19516 } 19517 v.reset(OpS390XXOR) 19518 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 19519 v0.AuxInt = -1 19520 v.AddArg(v0) 19521 v.AddArg(x) 19522 return true 19523 } 19524 return false 19525 } 19526 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 19527 // match: (NOTW x) 19528 // cond: true 19529 // result: (XORWconst [-1] x) 19530 for { 19531 x := v.Args[0] 19532 if !(true) { 19533 break 19534 } 19535 v.reset(OpS390XXORWconst) 19536 v.AuxInt = -1 19537 v.AddArg(x) 19538 return true 19539 } 19540 return false 19541 } 19542 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 19543 // match: (OR x (MOVDconst [c])) 19544 // cond: isU32Bit(c) 19545 // result: (ORconst [c] x) 19546 for { 19547 _ = v.Args[1] 19548 x := v.Args[0] 19549 v_1 := v.Args[1] 19550 if v_1.Op != OpS390XMOVDconst { 19551 break 19552 } 19553 c := v_1.AuxInt 19554 if !(isU32Bit(c)) { 19555 break 19556 } 19557 v.reset(OpS390XORconst) 19558 v.AuxInt = c 19559 v.AddArg(x) 19560 return true 19561 } 19562 // match: (OR (MOVDconst [c]) x) 19563 // cond: isU32Bit(c) 19564 // result: (ORconst [c] x) 19565 for { 19566 _ = v.Args[1] 19567 v_0 := v.Args[0] 19568 if v_0.Op != OpS390XMOVDconst { 19569 break 19570 } 19571 c := v_0.AuxInt 19572 x := v.Args[1] 19573 if !(isU32Bit(c)) { 19574 break 19575 } 19576 v.reset(OpS390XORconst) 19577 v.AuxInt = c 19578 v.AddArg(x) 19579 return true 19580 } 19581 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 19582 // cond: d == 64-c 19583 // result: (RLLGconst [c] x) 19584 for { 19585 _ = v.Args[1] 19586 v_0 := v.Args[0] 19587 if v_0.Op != OpS390XSLDconst { 19588 break 19589 } 19590 c := v_0.AuxInt 19591 x := v_0.Args[0] 19592 v_1 := v.Args[1] 19593 if v_1.Op != OpS390XSRDconst { 19594 break 19595 } 19596 d := v_1.AuxInt 19597 if x != v_1.Args[0] { 19598 break 19599 } 19600 if !(d == 64-c) { 19601 break 19602 } 19603 v.reset(OpS390XRLLGconst) 19604 v.AuxInt = c 19605 v.AddArg(x) 19606 return true 19607 } 19608 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 19609 // cond: d == 64-c 19610 // result: (RLLGconst [c] x) 19611 for { 19612 _ = v.Args[1] 19613 v_0 := v.Args[0] 19614 if v_0.Op != OpS390XSRDconst { 19615 break 19616 } 19617 d := v_0.AuxInt 19618 x := v_0.Args[0] 19619 v_1 := v.Args[1] 19620 if v_1.Op != OpS390XSLDconst { 19621 break 19622 } 19623 c := v_1.AuxInt 19624 if x != v_1.Args[0] { 19625 break 19626 } 19627 if !(d == 64-c) { 19628 break 19629 } 19630 v.reset(OpS390XRLLGconst) 19631 v.AuxInt = c 19632 v.AddArg(x) 19633 return true 19634 } 19635 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 19636 // cond: 19637 // result: (MOVDconst [c|d]) 19638 for { 19639 _ = v.Args[1] 19640 v_0 := v.Args[0] 19641 if v_0.Op != OpS390XMOVDconst { 19642 break 19643 } 19644 c := v_0.AuxInt 19645 v_1 := v.Args[1] 19646 if v_1.Op != OpS390XMOVDconst { 19647 break 19648 } 19649 d := v_1.AuxInt 19650 v.reset(OpS390XMOVDconst) 19651 v.AuxInt = c | d 19652 return true 19653 } 19654 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 19655 // cond: 19656 // result: (MOVDconst [c|d]) 19657 for { 19658 _ = v.Args[1] 19659 v_0 := v.Args[0] 19660 if v_0.Op != OpS390XMOVDconst { 19661 break 19662 } 19663 d := v_0.AuxInt 19664 v_1 := v.Args[1] 19665 if v_1.Op != OpS390XMOVDconst { 19666 break 19667 } 19668 c := v_1.AuxInt 19669 v.reset(OpS390XMOVDconst) 19670 v.AuxInt = c | d 19671 return true 19672 } 19673 // match: (OR x x) 19674 // cond: 19675 // result: x 19676 for { 19677 _ = v.Args[1] 19678 x := v.Args[0] 19679 if x != v.Args[1] { 19680 break 19681 } 19682 v.reset(OpCopy) 19683 v.Type = x.Type 19684 v.AddArg(x) 19685 return true 19686 } 19687 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 19688 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19689 // result: (ORload <t> [off] {sym} x ptr mem) 19690 for { 19691 t := v.Type 19692 _ = v.Args[1] 19693 x := v.Args[0] 19694 g := v.Args[1] 19695 if g.Op != OpS390XMOVDload { 19696 break 19697 } 19698 off := g.AuxInt 19699 sym := g.Aux 19700 _ = g.Args[1] 19701 ptr := g.Args[0] 19702 mem := g.Args[1] 19703 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19704 break 19705 } 19706 v.reset(OpS390XORload) 19707 v.Type = t 19708 v.AuxInt = off 19709 v.Aux = sym 19710 v.AddArg(x) 19711 v.AddArg(ptr) 19712 v.AddArg(mem) 19713 return true 19714 } 19715 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19716 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19717 // result: (ORload <t> [off] {sym} x ptr mem) 19718 for { 19719 t := v.Type 19720 _ = v.Args[1] 19721 g := v.Args[0] 19722 if g.Op != OpS390XMOVDload { 19723 break 19724 } 19725 off := g.AuxInt 19726 sym := g.Aux 19727 _ = g.Args[1] 19728 ptr := g.Args[0] 19729 mem := g.Args[1] 19730 x := v.Args[1] 19731 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19732 break 19733 } 19734 v.reset(OpS390XORload) 19735 v.Type = t 19736 v.AuxInt = off 19737 v.Aux = sym 19738 v.AddArg(x) 19739 v.AddArg(ptr) 19740 v.AddArg(mem) 19741 return true 19742 } 19743 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19744 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19745 // result: (ORload <t> [off] {sym} x ptr mem) 19746 for { 19747 t := v.Type 19748 _ = v.Args[1] 19749 g := v.Args[0] 19750 if g.Op != OpS390XMOVDload { 19751 break 19752 } 19753 off := g.AuxInt 19754 sym := g.Aux 19755 _ = g.Args[1] 19756 ptr := g.Args[0] 19757 mem := g.Args[1] 19758 x := v.Args[1] 19759 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19760 break 19761 } 19762 v.reset(OpS390XORload) 19763 v.Type = t 19764 v.AuxInt = off 19765 v.Aux = sym 19766 v.AddArg(x) 19767 v.AddArg(ptr) 19768 v.AddArg(mem) 19769 return true 19770 } 19771 return false 19772 } 19773 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 19774 b := v.Block 19775 _ = b 19776 typ := &b.Func.Config.Types 19777 _ = typ 19778 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 19779 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19780 // result: (ORload <t> [off] {sym} x ptr mem) 19781 for { 19782 t := v.Type 19783 _ = v.Args[1] 19784 x := v.Args[0] 19785 g := v.Args[1] 19786 if g.Op != OpS390XMOVDload { 19787 break 19788 } 19789 off := g.AuxInt 19790 sym := g.Aux 19791 _ = g.Args[1] 19792 ptr := g.Args[0] 19793 mem := g.Args[1] 19794 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19795 break 19796 } 19797 v.reset(OpS390XORload) 19798 v.Type = t 19799 v.AuxInt = off 19800 v.Aux = sym 19801 v.AddArg(x) 19802 v.AddArg(ptr) 19803 v.AddArg(mem) 19804 return true 19805 } 19806 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 19807 // 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) 19808 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19809 for { 19810 _ = v.Args[1] 19811 x1 := v.Args[0] 19812 if x1.Op != OpS390XMOVBZload { 19813 break 19814 } 19815 i1 := x1.AuxInt 19816 s := x1.Aux 19817 _ = x1.Args[1] 19818 p := x1.Args[0] 19819 mem := x1.Args[1] 19820 sh := v.Args[1] 19821 if sh.Op != OpS390XSLDconst { 19822 break 19823 } 19824 if sh.AuxInt != 8 { 19825 break 19826 } 19827 x0 := sh.Args[0] 19828 if x0.Op != OpS390XMOVBZload { 19829 break 19830 } 19831 i0 := x0.AuxInt 19832 if x0.Aux != s { 19833 break 19834 } 19835 _ = x0.Args[1] 19836 if p != x0.Args[0] { 19837 break 19838 } 19839 if mem != x0.Args[1] { 19840 break 19841 } 19842 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)) { 19843 break 19844 } 19845 b = mergePoint(b, x0, x1) 19846 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19847 v.reset(OpCopy) 19848 v.AddArg(v0) 19849 v0.AuxInt = i0 19850 v0.Aux = s 19851 v0.AddArg(p) 19852 v0.AddArg(mem) 19853 return true 19854 } 19855 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 19856 // 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) 19857 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19858 for { 19859 _ = v.Args[1] 19860 sh := v.Args[0] 19861 if sh.Op != OpS390XSLDconst { 19862 break 19863 } 19864 if sh.AuxInt != 8 { 19865 break 19866 } 19867 x0 := sh.Args[0] 19868 if x0.Op != OpS390XMOVBZload { 19869 break 19870 } 19871 i0 := x0.AuxInt 19872 s := x0.Aux 19873 _ = x0.Args[1] 19874 p := x0.Args[0] 19875 mem := x0.Args[1] 19876 x1 := v.Args[1] 19877 if x1.Op != OpS390XMOVBZload { 19878 break 19879 } 19880 i1 := x1.AuxInt 19881 if x1.Aux != s { 19882 break 19883 } 19884 _ = x1.Args[1] 19885 if p != x1.Args[0] { 19886 break 19887 } 19888 if mem != x1.Args[1] { 19889 break 19890 } 19891 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)) { 19892 break 19893 } 19894 b = mergePoint(b, x0, x1) 19895 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19896 v.reset(OpCopy) 19897 v.AddArg(v0) 19898 v0.AuxInt = i0 19899 v0.Aux = s 19900 v0.AddArg(p) 19901 v0.AddArg(mem) 19902 return true 19903 } 19904 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 19905 // 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) 19906 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19907 for { 19908 _ = v.Args[1] 19909 x1 := v.Args[0] 19910 if x1.Op != OpS390XMOVHZload { 19911 break 19912 } 19913 i1 := x1.AuxInt 19914 s := x1.Aux 19915 _ = x1.Args[1] 19916 p := x1.Args[0] 19917 mem := x1.Args[1] 19918 sh := v.Args[1] 19919 if sh.Op != OpS390XSLDconst { 19920 break 19921 } 19922 if sh.AuxInt != 16 { 19923 break 19924 } 19925 x0 := sh.Args[0] 19926 if x0.Op != OpS390XMOVHZload { 19927 break 19928 } 19929 i0 := x0.AuxInt 19930 if x0.Aux != s { 19931 break 19932 } 19933 _ = x0.Args[1] 19934 if p != x0.Args[0] { 19935 break 19936 } 19937 if mem != x0.Args[1] { 19938 break 19939 } 19940 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)) { 19941 break 19942 } 19943 b = mergePoint(b, x0, x1) 19944 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 19945 v.reset(OpCopy) 19946 v.AddArg(v0) 19947 v0.AuxInt = i0 19948 v0.Aux = s 19949 v0.AddArg(p) 19950 v0.AddArg(mem) 19951 return true 19952 } 19953 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 19954 // 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) 19955 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19956 for { 19957 _ = v.Args[1] 19958 sh := v.Args[0] 19959 if sh.Op != OpS390XSLDconst { 19960 break 19961 } 19962 if sh.AuxInt != 16 { 19963 break 19964 } 19965 x0 := sh.Args[0] 19966 if x0.Op != OpS390XMOVHZload { 19967 break 19968 } 19969 i0 := x0.AuxInt 19970 s := x0.Aux 19971 _ = x0.Args[1] 19972 p := x0.Args[0] 19973 mem := x0.Args[1] 19974 x1 := v.Args[1] 19975 if x1.Op != OpS390XMOVHZload { 19976 break 19977 } 19978 i1 := x1.AuxInt 19979 if x1.Aux != s { 19980 break 19981 } 19982 _ = x1.Args[1] 19983 if p != x1.Args[0] { 19984 break 19985 } 19986 if mem != x1.Args[1] { 19987 break 19988 } 19989 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)) { 19990 break 19991 } 19992 b = mergePoint(b, x0, x1) 19993 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 19994 v.reset(OpCopy) 19995 v.AddArg(v0) 19996 v0.AuxInt = i0 19997 v0.Aux = s 19998 v0.AddArg(p) 19999 v0.AddArg(mem) 20000 return true 20001 } 20002 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 20003 // 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) 20004 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 20005 for { 20006 _ = v.Args[1] 20007 x1 := v.Args[0] 20008 if x1.Op != OpS390XMOVWZload { 20009 break 20010 } 20011 i1 := x1.AuxInt 20012 s := x1.Aux 20013 _ = x1.Args[1] 20014 p := x1.Args[0] 20015 mem := x1.Args[1] 20016 sh := v.Args[1] 20017 if sh.Op != OpS390XSLDconst { 20018 break 20019 } 20020 if sh.AuxInt != 32 { 20021 break 20022 } 20023 x0 := sh.Args[0] 20024 if x0.Op != OpS390XMOVWZload { 20025 break 20026 } 20027 i0 := x0.AuxInt 20028 if x0.Aux != s { 20029 break 20030 } 20031 _ = x0.Args[1] 20032 if p != x0.Args[0] { 20033 break 20034 } 20035 if mem != x0.Args[1] { 20036 break 20037 } 20038 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)) { 20039 break 20040 } 20041 b = mergePoint(b, x0, x1) 20042 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20043 v.reset(OpCopy) 20044 v.AddArg(v0) 20045 v0.AuxInt = i0 20046 v0.Aux = s 20047 v0.AddArg(p) 20048 v0.AddArg(mem) 20049 return true 20050 } 20051 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 20052 // 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) 20053 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 20054 for { 20055 _ = v.Args[1] 20056 sh := v.Args[0] 20057 if sh.Op != OpS390XSLDconst { 20058 break 20059 } 20060 if sh.AuxInt != 32 { 20061 break 20062 } 20063 x0 := sh.Args[0] 20064 if x0.Op != OpS390XMOVWZload { 20065 break 20066 } 20067 i0 := x0.AuxInt 20068 s := x0.Aux 20069 _ = x0.Args[1] 20070 p := x0.Args[0] 20071 mem := x0.Args[1] 20072 x1 := v.Args[1] 20073 if x1.Op != OpS390XMOVWZload { 20074 break 20075 } 20076 i1 := x1.AuxInt 20077 if x1.Aux != s { 20078 break 20079 } 20080 _ = x1.Args[1] 20081 if p != x1.Args[0] { 20082 break 20083 } 20084 if mem != x1.Args[1] { 20085 break 20086 } 20087 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)) { 20088 break 20089 } 20090 b = mergePoint(b, x0, x1) 20091 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20092 v.reset(OpCopy) 20093 v.AddArg(v0) 20094 v0.AuxInt = i0 20095 v0.Aux = s 20096 v0.AddArg(p) 20097 v0.AddArg(mem) 20098 return true 20099 } 20100 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 20101 // 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) 20102 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20103 for { 20104 _ = v.Args[1] 20105 s0 := v.Args[0] 20106 if s0.Op != OpS390XSLDconst { 20107 break 20108 } 20109 j0 := s0.AuxInt 20110 x0 := s0.Args[0] 20111 if x0.Op != OpS390XMOVBZload { 20112 break 20113 } 20114 i0 := x0.AuxInt 20115 s := x0.Aux 20116 _ = x0.Args[1] 20117 p := x0.Args[0] 20118 mem := x0.Args[1] 20119 or := v.Args[1] 20120 if or.Op != OpS390XOR { 20121 break 20122 } 20123 _ = or.Args[1] 20124 s1 := or.Args[0] 20125 if s1.Op != OpS390XSLDconst { 20126 break 20127 } 20128 j1 := s1.AuxInt 20129 x1 := s1.Args[0] 20130 if x1.Op != OpS390XMOVBZload { 20131 break 20132 } 20133 i1 := x1.AuxInt 20134 if x1.Aux != s { 20135 break 20136 } 20137 _ = x1.Args[1] 20138 if p != x1.Args[0] { 20139 break 20140 } 20141 if mem != x1.Args[1] { 20142 break 20143 } 20144 y := or.Args[1] 20145 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)) { 20146 break 20147 } 20148 b = mergePoint(b, x0, x1) 20149 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20150 v.reset(OpCopy) 20151 v.AddArg(v0) 20152 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20153 v1.AuxInt = j1 20154 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20155 v2.AuxInt = i0 20156 v2.Aux = s 20157 v2.AddArg(p) 20158 v2.AddArg(mem) 20159 v1.AddArg(v2) 20160 v0.AddArg(v1) 20161 v0.AddArg(y) 20162 return true 20163 } 20164 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 20165 // 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) 20166 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20167 for { 20168 _ = v.Args[1] 20169 s0 := v.Args[0] 20170 if s0.Op != OpS390XSLDconst { 20171 break 20172 } 20173 j0 := s0.AuxInt 20174 x0 := s0.Args[0] 20175 if x0.Op != OpS390XMOVBZload { 20176 break 20177 } 20178 i0 := x0.AuxInt 20179 s := x0.Aux 20180 _ = x0.Args[1] 20181 p := x0.Args[0] 20182 mem := x0.Args[1] 20183 or := v.Args[1] 20184 if or.Op != OpS390XOR { 20185 break 20186 } 20187 _ = or.Args[1] 20188 y := or.Args[0] 20189 s1 := or.Args[1] 20190 if s1.Op != OpS390XSLDconst { 20191 break 20192 } 20193 j1 := s1.AuxInt 20194 x1 := s1.Args[0] 20195 if x1.Op != OpS390XMOVBZload { 20196 break 20197 } 20198 i1 := x1.AuxInt 20199 if x1.Aux != s { 20200 break 20201 } 20202 _ = x1.Args[1] 20203 if p != x1.Args[0] { 20204 break 20205 } 20206 if mem != x1.Args[1] { 20207 break 20208 } 20209 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)) { 20210 break 20211 } 20212 b = mergePoint(b, x0, x1) 20213 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20214 v.reset(OpCopy) 20215 v.AddArg(v0) 20216 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20217 v1.AuxInt = j1 20218 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20219 v2.AuxInt = i0 20220 v2.Aux = s 20221 v2.AddArg(p) 20222 v2.AddArg(mem) 20223 v1.AddArg(v2) 20224 v0.AddArg(v1) 20225 v0.AddArg(y) 20226 return true 20227 } 20228 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20229 // 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) 20230 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20231 for { 20232 _ = v.Args[1] 20233 or := v.Args[0] 20234 if or.Op != OpS390XOR { 20235 break 20236 } 20237 _ = or.Args[1] 20238 s1 := or.Args[0] 20239 if s1.Op != OpS390XSLDconst { 20240 break 20241 } 20242 j1 := s1.AuxInt 20243 x1 := s1.Args[0] 20244 if x1.Op != OpS390XMOVBZload { 20245 break 20246 } 20247 i1 := x1.AuxInt 20248 s := x1.Aux 20249 _ = x1.Args[1] 20250 p := x1.Args[0] 20251 mem := x1.Args[1] 20252 y := or.Args[1] 20253 s0 := v.Args[1] 20254 if s0.Op != OpS390XSLDconst { 20255 break 20256 } 20257 j0 := s0.AuxInt 20258 x0 := s0.Args[0] 20259 if x0.Op != OpS390XMOVBZload { 20260 break 20261 } 20262 i0 := x0.AuxInt 20263 if x0.Aux != s { 20264 break 20265 } 20266 _ = x0.Args[1] 20267 if p != x0.Args[0] { 20268 break 20269 } 20270 if mem != x0.Args[1] { 20271 break 20272 } 20273 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)) { 20274 break 20275 } 20276 b = mergePoint(b, x0, x1) 20277 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20278 v.reset(OpCopy) 20279 v.AddArg(v0) 20280 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20281 v1.AuxInt = j1 20282 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20283 v2.AuxInt = i0 20284 v2.Aux = s 20285 v2.AddArg(p) 20286 v2.AddArg(mem) 20287 v1.AddArg(v2) 20288 v0.AddArg(v1) 20289 v0.AddArg(y) 20290 return true 20291 } 20292 return false 20293 } 20294 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 20295 b := v.Block 20296 _ = b 20297 typ := &b.Func.Config.Types 20298 _ = typ 20299 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20300 // 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) 20301 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20302 for { 20303 _ = v.Args[1] 20304 or := v.Args[0] 20305 if or.Op != OpS390XOR { 20306 break 20307 } 20308 _ = or.Args[1] 20309 y := or.Args[0] 20310 s1 := or.Args[1] 20311 if s1.Op != OpS390XSLDconst { 20312 break 20313 } 20314 j1 := s1.AuxInt 20315 x1 := s1.Args[0] 20316 if x1.Op != OpS390XMOVBZload { 20317 break 20318 } 20319 i1 := x1.AuxInt 20320 s := x1.Aux 20321 _ = x1.Args[1] 20322 p := x1.Args[0] 20323 mem := x1.Args[1] 20324 s0 := v.Args[1] 20325 if s0.Op != OpS390XSLDconst { 20326 break 20327 } 20328 j0 := s0.AuxInt 20329 x0 := s0.Args[0] 20330 if x0.Op != OpS390XMOVBZload { 20331 break 20332 } 20333 i0 := x0.AuxInt 20334 if x0.Aux != s { 20335 break 20336 } 20337 _ = x0.Args[1] 20338 if p != x0.Args[0] { 20339 break 20340 } 20341 if mem != x0.Args[1] { 20342 break 20343 } 20344 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)) { 20345 break 20346 } 20347 b = mergePoint(b, x0, x1) 20348 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20349 v.reset(OpCopy) 20350 v.AddArg(v0) 20351 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20352 v1.AuxInt = j1 20353 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20354 v2.AuxInt = i0 20355 v2.Aux = s 20356 v2.AddArg(p) 20357 v2.AddArg(mem) 20358 v1.AddArg(v2) 20359 v0.AddArg(v1) 20360 v0.AddArg(y) 20361 return true 20362 } 20363 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 20364 // 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) 20365 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20366 for { 20367 _ = v.Args[1] 20368 s0 := v.Args[0] 20369 if s0.Op != OpS390XSLDconst { 20370 break 20371 } 20372 j0 := s0.AuxInt 20373 x0 := s0.Args[0] 20374 if x0.Op != OpS390XMOVHZload { 20375 break 20376 } 20377 i0 := x0.AuxInt 20378 s := x0.Aux 20379 _ = x0.Args[1] 20380 p := x0.Args[0] 20381 mem := x0.Args[1] 20382 or := v.Args[1] 20383 if or.Op != OpS390XOR { 20384 break 20385 } 20386 _ = or.Args[1] 20387 s1 := or.Args[0] 20388 if s1.Op != OpS390XSLDconst { 20389 break 20390 } 20391 j1 := s1.AuxInt 20392 x1 := s1.Args[0] 20393 if x1.Op != OpS390XMOVHZload { 20394 break 20395 } 20396 i1 := x1.AuxInt 20397 if x1.Aux != s { 20398 break 20399 } 20400 _ = x1.Args[1] 20401 if p != x1.Args[0] { 20402 break 20403 } 20404 if mem != x1.Args[1] { 20405 break 20406 } 20407 y := or.Args[1] 20408 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)) { 20409 break 20410 } 20411 b = mergePoint(b, x0, x1) 20412 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20413 v.reset(OpCopy) 20414 v.AddArg(v0) 20415 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20416 v1.AuxInt = j1 20417 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20418 v2.AuxInt = i0 20419 v2.Aux = s 20420 v2.AddArg(p) 20421 v2.AddArg(mem) 20422 v1.AddArg(v2) 20423 v0.AddArg(v1) 20424 v0.AddArg(y) 20425 return true 20426 } 20427 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 20428 // 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) 20429 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20430 for { 20431 _ = v.Args[1] 20432 s0 := v.Args[0] 20433 if s0.Op != OpS390XSLDconst { 20434 break 20435 } 20436 j0 := s0.AuxInt 20437 x0 := s0.Args[0] 20438 if x0.Op != OpS390XMOVHZload { 20439 break 20440 } 20441 i0 := x0.AuxInt 20442 s := x0.Aux 20443 _ = x0.Args[1] 20444 p := x0.Args[0] 20445 mem := x0.Args[1] 20446 or := v.Args[1] 20447 if or.Op != OpS390XOR { 20448 break 20449 } 20450 _ = or.Args[1] 20451 y := or.Args[0] 20452 s1 := or.Args[1] 20453 if s1.Op != OpS390XSLDconst { 20454 break 20455 } 20456 j1 := s1.AuxInt 20457 x1 := s1.Args[0] 20458 if x1.Op != OpS390XMOVHZload { 20459 break 20460 } 20461 i1 := x1.AuxInt 20462 if x1.Aux != s { 20463 break 20464 } 20465 _ = x1.Args[1] 20466 if p != x1.Args[0] { 20467 break 20468 } 20469 if mem != x1.Args[1] { 20470 break 20471 } 20472 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)) { 20473 break 20474 } 20475 b = mergePoint(b, x0, x1) 20476 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20477 v.reset(OpCopy) 20478 v.AddArg(v0) 20479 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20480 v1.AuxInt = j1 20481 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20482 v2.AuxInt = i0 20483 v2.Aux = s 20484 v2.AddArg(p) 20485 v2.AddArg(mem) 20486 v1.AddArg(v2) 20487 v0.AddArg(v1) 20488 v0.AddArg(y) 20489 return true 20490 } 20491 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20492 // 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) 20493 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20494 for { 20495 _ = v.Args[1] 20496 or := v.Args[0] 20497 if or.Op != OpS390XOR { 20498 break 20499 } 20500 _ = or.Args[1] 20501 s1 := or.Args[0] 20502 if s1.Op != OpS390XSLDconst { 20503 break 20504 } 20505 j1 := s1.AuxInt 20506 x1 := s1.Args[0] 20507 if x1.Op != OpS390XMOVHZload { 20508 break 20509 } 20510 i1 := x1.AuxInt 20511 s := x1.Aux 20512 _ = x1.Args[1] 20513 p := x1.Args[0] 20514 mem := x1.Args[1] 20515 y := or.Args[1] 20516 s0 := v.Args[1] 20517 if s0.Op != OpS390XSLDconst { 20518 break 20519 } 20520 j0 := s0.AuxInt 20521 x0 := s0.Args[0] 20522 if x0.Op != OpS390XMOVHZload { 20523 break 20524 } 20525 i0 := x0.AuxInt 20526 if x0.Aux != s { 20527 break 20528 } 20529 _ = x0.Args[1] 20530 if p != x0.Args[0] { 20531 break 20532 } 20533 if mem != x0.Args[1] { 20534 break 20535 } 20536 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)) { 20537 break 20538 } 20539 b = mergePoint(b, x0, x1) 20540 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20541 v.reset(OpCopy) 20542 v.AddArg(v0) 20543 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20544 v1.AuxInt = j1 20545 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20546 v2.AuxInt = i0 20547 v2.Aux = s 20548 v2.AddArg(p) 20549 v2.AddArg(mem) 20550 v1.AddArg(v2) 20551 v0.AddArg(v1) 20552 v0.AddArg(y) 20553 return true 20554 } 20555 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20556 // 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) 20557 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20558 for { 20559 _ = v.Args[1] 20560 or := v.Args[0] 20561 if or.Op != OpS390XOR { 20562 break 20563 } 20564 _ = or.Args[1] 20565 y := or.Args[0] 20566 s1 := or.Args[1] 20567 if s1.Op != OpS390XSLDconst { 20568 break 20569 } 20570 j1 := s1.AuxInt 20571 x1 := s1.Args[0] 20572 if x1.Op != OpS390XMOVHZload { 20573 break 20574 } 20575 i1 := x1.AuxInt 20576 s := x1.Aux 20577 _ = x1.Args[1] 20578 p := x1.Args[0] 20579 mem := x1.Args[1] 20580 s0 := v.Args[1] 20581 if s0.Op != OpS390XSLDconst { 20582 break 20583 } 20584 j0 := s0.AuxInt 20585 x0 := s0.Args[0] 20586 if x0.Op != OpS390XMOVHZload { 20587 break 20588 } 20589 i0 := x0.AuxInt 20590 if x0.Aux != s { 20591 break 20592 } 20593 _ = x0.Args[1] 20594 if p != x0.Args[0] { 20595 break 20596 } 20597 if mem != x0.Args[1] { 20598 break 20599 } 20600 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)) { 20601 break 20602 } 20603 b = mergePoint(b, x0, x1) 20604 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20605 v.reset(OpCopy) 20606 v.AddArg(v0) 20607 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20608 v1.AuxInt = j1 20609 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20610 v2.AuxInt = i0 20611 v2.Aux = s 20612 v2.AddArg(p) 20613 v2.AddArg(mem) 20614 v1.AddArg(v2) 20615 v0.AddArg(v1) 20616 v0.AddArg(y) 20617 return true 20618 } 20619 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20620 // 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) 20621 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20622 for { 20623 _ = v.Args[1] 20624 x1 := v.Args[0] 20625 if x1.Op != OpS390XMOVBZloadidx { 20626 break 20627 } 20628 i1 := x1.AuxInt 20629 s := x1.Aux 20630 _ = x1.Args[2] 20631 p := x1.Args[0] 20632 idx := x1.Args[1] 20633 mem := x1.Args[2] 20634 sh := v.Args[1] 20635 if sh.Op != OpS390XSLDconst { 20636 break 20637 } 20638 if sh.AuxInt != 8 { 20639 break 20640 } 20641 x0 := sh.Args[0] 20642 if x0.Op != OpS390XMOVBZloadidx { 20643 break 20644 } 20645 i0 := x0.AuxInt 20646 if x0.Aux != s { 20647 break 20648 } 20649 _ = x0.Args[2] 20650 if p != x0.Args[0] { 20651 break 20652 } 20653 if idx != x0.Args[1] { 20654 break 20655 } 20656 if mem != x0.Args[2] { 20657 break 20658 } 20659 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)) { 20660 break 20661 } 20662 b = mergePoint(b, x0, x1) 20663 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20664 v.reset(OpCopy) 20665 v.AddArg(v0) 20666 v0.AuxInt = i0 20667 v0.Aux = s 20668 v0.AddArg(p) 20669 v0.AddArg(idx) 20670 v0.AddArg(mem) 20671 return true 20672 } 20673 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20674 // 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) 20675 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20676 for { 20677 _ = v.Args[1] 20678 x1 := v.Args[0] 20679 if x1.Op != OpS390XMOVBZloadidx { 20680 break 20681 } 20682 i1 := x1.AuxInt 20683 s := x1.Aux 20684 _ = x1.Args[2] 20685 idx := x1.Args[0] 20686 p := x1.Args[1] 20687 mem := x1.Args[2] 20688 sh := v.Args[1] 20689 if sh.Op != OpS390XSLDconst { 20690 break 20691 } 20692 if sh.AuxInt != 8 { 20693 break 20694 } 20695 x0 := sh.Args[0] 20696 if x0.Op != OpS390XMOVBZloadidx { 20697 break 20698 } 20699 i0 := x0.AuxInt 20700 if x0.Aux != s { 20701 break 20702 } 20703 _ = x0.Args[2] 20704 if p != x0.Args[0] { 20705 break 20706 } 20707 if idx != x0.Args[1] { 20708 break 20709 } 20710 if mem != x0.Args[2] { 20711 break 20712 } 20713 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)) { 20714 break 20715 } 20716 b = mergePoint(b, x0, x1) 20717 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20718 v.reset(OpCopy) 20719 v.AddArg(v0) 20720 v0.AuxInt = i0 20721 v0.Aux = s 20722 v0.AddArg(p) 20723 v0.AddArg(idx) 20724 v0.AddArg(mem) 20725 return true 20726 } 20727 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20728 // 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) 20729 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20730 for { 20731 _ = v.Args[1] 20732 x1 := v.Args[0] 20733 if x1.Op != OpS390XMOVBZloadidx { 20734 break 20735 } 20736 i1 := x1.AuxInt 20737 s := x1.Aux 20738 _ = x1.Args[2] 20739 p := x1.Args[0] 20740 idx := x1.Args[1] 20741 mem := x1.Args[2] 20742 sh := v.Args[1] 20743 if sh.Op != OpS390XSLDconst { 20744 break 20745 } 20746 if sh.AuxInt != 8 { 20747 break 20748 } 20749 x0 := sh.Args[0] 20750 if x0.Op != OpS390XMOVBZloadidx { 20751 break 20752 } 20753 i0 := x0.AuxInt 20754 if x0.Aux != s { 20755 break 20756 } 20757 _ = x0.Args[2] 20758 if idx != x0.Args[0] { 20759 break 20760 } 20761 if p != x0.Args[1] { 20762 break 20763 } 20764 if mem != x0.Args[2] { 20765 break 20766 } 20767 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)) { 20768 break 20769 } 20770 b = mergePoint(b, x0, x1) 20771 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20772 v.reset(OpCopy) 20773 v.AddArg(v0) 20774 v0.AuxInt = i0 20775 v0.Aux = s 20776 v0.AddArg(p) 20777 v0.AddArg(idx) 20778 v0.AddArg(mem) 20779 return true 20780 } 20781 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20782 // 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) 20783 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20784 for { 20785 _ = v.Args[1] 20786 x1 := v.Args[0] 20787 if x1.Op != OpS390XMOVBZloadidx { 20788 break 20789 } 20790 i1 := x1.AuxInt 20791 s := x1.Aux 20792 _ = x1.Args[2] 20793 idx := x1.Args[0] 20794 p := x1.Args[1] 20795 mem := x1.Args[2] 20796 sh := v.Args[1] 20797 if sh.Op != OpS390XSLDconst { 20798 break 20799 } 20800 if sh.AuxInt != 8 { 20801 break 20802 } 20803 x0 := sh.Args[0] 20804 if x0.Op != OpS390XMOVBZloadidx { 20805 break 20806 } 20807 i0 := x0.AuxInt 20808 if x0.Aux != s { 20809 break 20810 } 20811 _ = x0.Args[2] 20812 if idx != x0.Args[0] { 20813 break 20814 } 20815 if p != x0.Args[1] { 20816 break 20817 } 20818 if mem != x0.Args[2] { 20819 break 20820 } 20821 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)) { 20822 break 20823 } 20824 b = mergePoint(b, x0, x1) 20825 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20826 v.reset(OpCopy) 20827 v.AddArg(v0) 20828 v0.AuxInt = i0 20829 v0.Aux = s 20830 v0.AddArg(p) 20831 v0.AddArg(idx) 20832 v0.AddArg(mem) 20833 return true 20834 } 20835 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20836 // 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) 20837 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20838 for { 20839 _ = v.Args[1] 20840 sh := v.Args[0] 20841 if sh.Op != OpS390XSLDconst { 20842 break 20843 } 20844 if sh.AuxInt != 8 { 20845 break 20846 } 20847 x0 := sh.Args[0] 20848 if x0.Op != OpS390XMOVBZloadidx { 20849 break 20850 } 20851 i0 := x0.AuxInt 20852 s := x0.Aux 20853 _ = x0.Args[2] 20854 p := x0.Args[0] 20855 idx := x0.Args[1] 20856 mem := x0.Args[2] 20857 x1 := v.Args[1] 20858 if x1.Op != OpS390XMOVBZloadidx { 20859 break 20860 } 20861 i1 := x1.AuxInt 20862 if x1.Aux != s { 20863 break 20864 } 20865 _ = x1.Args[2] 20866 if p != x1.Args[0] { 20867 break 20868 } 20869 if idx != x1.Args[1] { 20870 break 20871 } 20872 if mem != x1.Args[2] { 20873 break 20874 } 20875 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)) { 20876 break 20877 } 20878 b = mergePoint(b, x0, x1) 20879 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20880 v.reset(OpCopy) 20881 v.AddArg(v0) 20882 v0.AuxInt = i0 20883 v0.Aux = s 20884 v0.AddArg(p) 20885 v0.AddArg(idx) 20886 v0.AddArg(mem) 20887 return true 20888 } 20889 return false 20890 } 20891 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 20892 b := v.Block 20893 _ = b 20894 typ := &b.Func.Config.Types 20895 _ = typ 20896 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20897 // 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) 20898 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20899 for { 20900 _ = v.Args[1] 20901 sh := v.Args[0] 20902 if sh.Op != OpS390XSLDconst { 20903 break 20904 } 20905 if sh.AuxInt != 8 { 20906 break 20907 } 20908 x0 := sh.Args[0] 20909 if x0.Op != OpS390XMOVBZloadidx { 20910 break 20911 } 20912 i0 := x0.AuxInt 20913 s := x0.Aux 20914 _ = x0.Args[2] 20915 idx := x0.Args[0] 20916 p := x0.Args[1] 20917 mem := x0.Args[2] 20918 x1 := v.Args[1] 20919 if x1.Op != OpS390XMOVBZloadidx { 20920 break 20921 } 20922 i1 := x1.AuxInt 20923 if x1.Aux != s { 20924 break 20925 } 20926 _ = x1.Args[2] 20927 if p != x1.Args[0] { 20928 break 20929 } 20930 if idx != x1.Args[1] { 20931 break 20932 } 20933 if mem != x1.Args[2] { 20934 break 20935 } 20936 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)) { 20937 break 20938 } 20939 b = mergePoint(b, x0, x1) 20940 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20941 v.reset(OpCopy) 20942 v.AddArg(v0) 20943 v0.AuxInt = i0 20944 v0.Aux = s 20945 v0.AddArg(p) 20946 v0.AddArg(idx) 20947 v0.AddArg(mem) 20948 return true 20949 } 20950 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20951 // 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) 20952 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20953 for { 20954 _ = v.Args[1] 20955 sh := v.Args[0] 20956 if sh.Op != OpS390XSLDconst { 20957 break 20958 } 20959 if sh.AuxInt != 8 { 20960 break 20961 } 20962 x0 := sh.Args[0] 20963 if x0.Op != OpS390XMOVBZloadidx { 20964 break 20965 } 20966 i0 := x0.AuxInt 20967 s := x0.Aux 20968 _ = x0.Args[2] 20969 p := x0.Args[0] 20970 idx := x0.Args[1] 20971 mem := x0.Args[2] 20972 x1 := v.Args[1] 20973 if x1.Op != OpS390XMOVBZloadidx { 20974 break 20975 } 20976 i1 := x1.AuxInt 20977 if x1.Aux != s { 20978 break 20979 } 20980 _ = x1.Args[2] 20981 if idx != x1.Args[0] { 20982 break 20983 } 20984 if p != x1.Args[1] { 20985 break 20986 } 20987 if mem != x1.Args[2] { 20988 break 20989 } 20990 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)) { 20991 break 20992 } 20993 b = mergePoint(b, x0, x1) 20994 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20995 v.reset(OpCopy) 20996 v.AddArg(v0) 20997 v0.AuxInt = i0 20998 v0.Aux = s 20999 v0.AddArg(p) 21000 v0.AddArg(idx) 21001 v0.AddArg(mem) 21002 return true 21003 } 21004 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 21005 // 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) 21006 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 21007 for { 21008 _ = v.Args[1] 21009 sh := v.Args[0] 21010 if sh.Op != OpS390XSLDconst { 21011 break 21012 } 21013 if sh.AuxInt != 8 { 21014 break 21015 } 21016 x0 := sh.Args[0] 21017 if x0.Op != OpS390XMOVBZloadidx { 21018 break 21019 } 21020 i0 := x0.AuxInt 21021 s := x0.Aux 21022 _ = x0.Args[2] 21023 idx := x0.Args[0] 21024 p := x0.Args[1] 21025 mem := x0.Args[2] 21026 x1 := v.Args[1] 21027 if x1.Op != OpS390XMOVBZloadidx { 21028 break 21029 } 21030 i1 := x1.AuxInt 21031 if x1.Aux != s { 21032 break 21033 } 21034 _ = x1.Args[2] 21035 if idx != x1.Args[0] { 21036 break 21037 } 21038 if p != x1.Args[1] { 21039 break 21040 } 21041 if mem != x1.Args[2] { 21042 break 21043 } 21044 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)) { 21045 break 21046 } 21047 b = mergePoint(b, x0, x1) 21048 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21049 v.reset(OpCopy) 21050 v.AddArg(v0) 21051 v0.AuxInt = i0 21052 v0.Aux = s 21053 v0.AddArg(p) 21054 v0.AddArg(idx) 21055 v0.AddArg(mem) 21056 return true 21057 } 21058 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21059 // 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) 21060 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21061 for { 21062 _ = v.Args[1] 21063 x1 := v.Args[0] 21064 if x1.Op != OpS390XMOVHZloadidx { 21065 break 21066 } 21067 i1 := x1.AuxInt 21068 s := x1.Aux 21069 _ = x1.Args[2] 21070 p := x1.Args[0] 21071 idx := x1.Args[1] 21072 mem := x1.Args[2] 21073 sh := v.Args[1] 21074 if sh.Op != OpS390XSLDconst { 21075 break 21076 } 21077 if sh.AuxInt != 16 { 21078 break 21079 } 21080 x0 := sh.Args[0] 21081 if x0.Op != OpS390XMOVHZloadidx { 21082 break 21083 } 21084 i0 := x0.AuxInt 21085 if x0.Aux != s { 21086 break 21087 } 21088 _ = x0.Args[2] 21089 if p != x0.Args[0] { 21090 break 21091 } 21092 if idx != x0.Args[1] { 21093 break 21094 } 21095 if mem != x0.Args[2] { 21096 break 21097 } 21098 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)) { 21099 break 21100 } 21101 b = mergePoint(b, x0, x1) 21102 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21103 v.reset(OpCopy) 21104 v.AddArg(v0) 21105 v0.AuxInt = i0 21106 v0.Aux = s 21107 v0.AddArg(p) 21108 v0.AddArg(idx) 21109 v0.AddArg(mem) 21110 return true 21111 } 21112 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21113 // 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) 21114 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21115 for { 21116 _ = v.Args[1] 21117 x1 := v.Args[0] 21118 if x1.Op != OpS390XMOVHZloadidx { 21119 break 21120 } 21121 i1 := x1.AuxInt 21122 s := x1.Aux 21123 _ = x1.Args[2] 21124 idx := x1.Args[0] 21125 p := x1.Args[1] 21126 mem := x1.Args[2] 21127 sh := v.Args[1] 21128 if sh.Op != OpS390XSLDconst { 21129 break 21130 } 21131 if sh.AuxInt != 16 { 21132 break 21133 } 21134 x0 := sh.Args[0] 21135 if x0.Op != OpS390XMOVHZloadidx { 21136 break 21137 } 21138 i0 := x0.AuxInt 21139 if x0.Aux != s { 21140 break 21141 } 21142 _ = x0.Args[2] 21143 if p != x0.Args[0] { 21144 break 21145 } 21146 if idx != x0.Args[1] { 21147 break 21148 } 21149 if mem != x0.Args[2] { 21150 break 21151 } 21152 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)) { 21153 break 21154 } 21155 b = mergePoint(b, x0, x1) 21156 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21157 v.reset(OpCopy) 21158 v.AddArg(v0) 21159 v0.AuxInt = i0 21160 v0.Aux = s 21161 v0.AddArg(p) 21162 v0.AddArg(idx) 21163 v0.AddArg(mem) 21164 return true 21165 } 21166 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21167 // 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) 21168 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21169 for { 21170 _ = v.Args[1] 21171 x1 := v.Args[0] 21172 if x1.Op != OpS390XMOVHZloadidx { 21173 break 21174 } 21175 i1 := x1.AuxInt 21176 s := x1.Aux 21177 _ = x1.Args[2] 21178 p := x1.Args[0] 21179 idx := x1.Args[1] 21180 mem := x1.Args[2] 21181 sh := v.Args[1] 21182 if sh.Op != OpS390XSLDconst { 21183 break 21184 } 21185 if sh.AuxInt != 16 { 21186 break 21187 } 21188 x0 := sh.Args[0] 21189 if x0.Op != OpS390XMOVHZloadidx { 21190 break 21191 } 21192 i0 := x0.AuxInt 21193 if x0.Aux != s { 21194 break 21195 } 21196 _ = x0.Args[2] 21197 if idx != x0.Args[0] { 21198 break 21199 } 21200 if p != x0.Args[1] { 21201 break 21202 } 21203 if mem != x0.Args[2] { 21204 break 21205 } 21206 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)) { 21207 break 21208 } 21209 b = mergePoint(b, x0, x1) 21210 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21211 v.reset(OpCopy) 21212 v.AddArg(v0) 21213 v0.AuxInt = i0 21214 v0.Aux = s 21215 v0.AddArg(p) 21216 v0.AddArg(idx) 21217 v0.AddArg(mem) 21218 return true 21219 } 21220 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21221 // 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) 21222 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21223 for { 21224 _ = v.Args[1] 21225 x1 := v.Args[0] 21226 if x1.Op != OpS390XMOVHZloadidx { 21227 break 21228 } 21229 i1 := x1.AuxInt 21230 s := x1.Aux 21231 _ = x1.Args[2] 21232 idx := x1.Args[0] 21233 p := x1.Args[1] 21234 mem := x1.Args[2] 21235 sh := v.Args[1] 21236 if sh.Op != OpS390XSLDconst { 21237 break 21238 } 21239 if sh.AuxInt != 16 { 21240 break 21241 } 21242 x0 := sh.Args[0] 21243 if x0.Op != OpS390XMOVHZloadidx { 21244 break 21245 } 21246 i0 := x0.AuxInt 21247 if x0.Aux != s { 21248 break 21249 } 21250 _ = x0.Args[2] 21251 if idx != x0.Args[0] { 21252 break 21253 } 21254 if p != x0.Args[1] { 21255 break 21256 } 21257 if mem != x0.Args[2] { 21258 break 21259 } 21260 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)) { 21261 break 21262 } 21263 b = mergePoint(b, x0, x1) 21264 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21265 v.reset(OpCopy) 21266 v.AddArg(v0) 21267 v0.AuxInt = i0 21268 v0.Aux = s 21269 v0.AddArg(p) 21270 v0.AddArg(idx) 21271 v0.AddArg(mem) 21272 return true 21273 } 21274 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21275 // 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) 21276 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21277 for { 21278 _ = v.Args[1] 21279 sh := v.Args[0] 21280 if sh.Op != OpS390XSLDconst { 21281 break 21282 } 21283 if sh.AuxInt != 16 { 21284 break 21285 } 21286 x0 := sh.Args[0] 21287 if x0.Op != OpS390XMOVHZloadidx { 21288 break 21289 } 21290 i0 := x0.AuxInt 21291 s := x0.Aux 21292 _ = x0.Args[2] 21293 p := x0.Args[0] 21294 idx := x0.Args[1] 21295 mem := x0.Args[2] 21296 x1 := v.Args[1] 21297 if x1.Op != OpS390XMOVHZloadidx { 21298 break 21299 } 21300 i1 := x1.AuxInt 21301 if x1.Aux != s { 21302 break 21303 } 21304 _ = x1.Args[2] 21305 if p != x1.Args[0] { 21306 break 21307 } 21308 if idx != x1.Args[1] { 21309 break 21310 } 21311 if mem != x1.Args[2] { 21312 break 21313 } 21314 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)) { 21315 break 21316 } 21317 b = mergePoint(b, x0, x1) 21318 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21319 v.reset(OpCopy) 21320 v.AddArg(v0) 21321 v0.AuxInt = i0 21322 v0.Aux = s 21323 v0.AddArg(p) 21324 v0.AddArg(idx) 21325 v0.AddArg(mem) 21326 return true 21327 } 21328 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21329 // 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) 21330 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21331 for { 21332 _ = v.Args[1] 21333 sh := v.Args[0] 21334 if sh.Op != OpS390XSLDconst { 21335 break 21336 } 21337 if sh.AuxInt != 16 { 21338 break 21339 } 21340 x0 := sh.Args[0] 21341 if x0.Op != OpS390XMOVHZloadidx { 21342 break 21343 } 21344 i0 := x0.AuxInt 21345 s := x0.Aux 21346 _ = x0.Args[2] 21347 idx := x0.Args[0] 21348 p := x0.Args[1] 21349 mem := x0.Args[2] 21350 x1 := v.Args[1] 21351 if x1.Op != OpS390XMOVHZloadidx { 21352 break 21353 } 21354 i1 := x1.AuxInt 21355 if x1.Aux != s { 21356 break 21357 } 21358 _ = x1.Args[2] 21359 if p != x1.Args[0] { 21360 break 21361 } 21362 if idx != x1.Args[1] { 21363 break 21364 } 21365 if mem != x1.Args[2] { 21366 break 21367 } 21368 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)) { 21369 break 21370 } 21371 b = mergePoint(b, x0, x1) 21372 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21373 v.reset(OpCopy) 21374 v.AddArg(v0) 21375 v0.AuxInt = i0 21376 v0.Aux = s 21377 v0.AddArg(p) 21378 v0.AddArg(idx) 21379 v0.AddArg(mem) 21380 return true 21381 } 21382 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21383 // 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) 21384 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21385 for { 21386 _ = v.Args[1] 21387 sh := v.Args[0] 21388 if sh.Op != OpS390XSLDconst { 21389 break 21390 } 21391 if sh.AuxInt != 16 { 21392 break 21393 } 21394 x0 := sh.Args[0] 21395 if x0.Op != OpS390XMOVHZloadidx { 21396 break 21397 } 21398 i0 := x0.AuxInt 21399 s := x0.Aux 21400 _ = x0.Args[2] 21401 p := x0.Args[0] 21402 idx := x0.Args[1] 21403 mem := x0.Args[2] 21404 x1 := v.Args[1] 21405 if x1.Op != OpS390XMOVHZloadidx { 21406 break 21407 } 21408 i1 := x1.AuxInt 21409 if x1.Aux != s { 21410 break 21411 } 21412 _ = x1.Args[2] 21413 if idx != x1.Args[0] { 21414 break 21415 } 21416 if p != x1.Args[1] { 21417 break 21418 } 21419 if mem != x1.Args[2] { 21420 break 21421 } 21422 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)) { 21423 break 21424 } 21425 b = mergePoint(b, x0, x1) 21426 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21427 v.reset(OpCopy) 21428 v.AddArg(v0) 21429 v0.AuxInt = i0 21430 v0.Aux = s 21431 v0.AddArg(p) 21432 v0.AddArg(idx) 21433 v0.AddArg(mem) 21434 return true 21435 } 21436 return false 21437 } 21438 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 21439 b := v.Block 21440 _ = b 21441 typ := &b.Func.Config.Types 21442 _ = typ 21443 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21444 // 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) 21445 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21446 for { 21447 _ = v.Args[1] 21448 sh := v.Args[0] 21449 if sh.Op != OpS390XSLDconst { 21450 break 21451 } 21452 if sh.AuxInt != 16 { 21453 break 21454 } 21455 x0 := sh.Args[0] 21456 if x0.Op != OpS390XMOVHZloadidx { 21457 break 21458 } 21459 i0 := x0.AuxInt 21460 s := x0.Aux 21461 _ = x0.Args[2] 21462 idx := x0.Args[0] 21463 p := x0.Args[1] 21464 mem := x0.Args[2] 21465 x1 := v.Args[1] 21466 if x1.Op != OpS390XMOVHZloadidx { 21467 break 21468 } 21469 i1 := x1.AuxInt 21470 if x1.Aux != s { 21471 break 21472 } 21473 _ = x1.Args[2] 21474 if idx != x1.Args[0] { 21475 break 21476 } 21477 if p != x1.Args[1] { 21478 break 21479 } 21480 if mem != x1.Args[2] { 21481 break 21482 } 21483 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)) { 21484 break 21485 } 21486 b = mergePoint(b, x0, x1) 21487 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21488 v.reset(OpCopy) 21489 v.AddArg(v0) 21490 v0.AuxInt = i0 21491 v0.Aux = s 21492 v0.AddArg(p) 21493 v0.AddArg(idx) 21494 v0.AddArg(mem) 21495 return true 21496 } 21497 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21498 // 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) 21499 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21500 for { 21501 _ = v.Args[1] 21502 x1 := v.Args[0] 21503 if x1.Op != OpS390XMOVWZloadidx { 21504 break 21505 } 21506 i1 := x1.AuxInt 21507 s := x1.Aux 21508 _ = x1.Args[2] 21509 p := x1.Args[0] 21510 idx := x1.Args[1] 21511 mem := x1.Args[2] 21512 sh := v.Args[1] 21513 if sh.Op != OpS390XSLDconst { 21514 break 21515 } 21516 if sh.AuxInt != 32 { 21517 break 21518 } 21519 x0 := sh.Args[0] 21520 if x0.Op != OpS390XMOVWZloadidx { 21521 break 21522 } 21523 i0 := x0.AuxInt 21524 if x0.Aux != s { 21525 break 21526 } 21527 _ = x0.Args[2] 21528 if p != x0.Args[0] { 21529 break 21530 } 21531 if idx != x0.Args[1] { 21532 break 21533 } 21534 if mem != x0.Args[2] { 21535 break 21536 } 21537 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)) { 21538 break 21539 } 21540 b = mergePoint(b, x0, x1) 21541 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21542 v.reset(OpCopy) 21543 v.AddArg(v0) 21544 v0.AuxInt = i0 21545 v0.Aux = s 21546 v0.AddArg(p) 21547 v0.AddArg(idx) 21548 v0.AddArg(mem) 21549 return true 21550 } 21551 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21552 // 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) 21553 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21554 for { 21555 _ = v.Args[1] 21556 x1 := v.Args[0] 21557 if x1.Op != OpS390XMOVWZloadidx { 21558 break 21559 } 21560 i1 := x1.AuxInt 21561 s := x1.Aux 21562 _ = x1.Args[2] 21563 idx := x1.Args[0] 21564 p := x1.Args[1] 21565 mem := x1.Args[2] 21566 sh := v.Args[1] 21567 if sh.Op != OpS390XSLDconst { 21568 break 21569 } 21570 if sh.AuxInt != 32 { 21571 break 21572 } 21573 x0 := sh.Args[0] 21574 if x0.Op != OpS390XMOVWZloadidx { 21575 break 21576 } 21577 i0 := x0.AuxInt 21578 if x0.Aux != s { 21579 break 21580 } 21581 _ = x0.Args[2] 21582 if p != x0.Args[0] { 21583 break 21584 } 21585 if idx != x0.Args[1] { 21586 break 21587 } 21588 if mem != x0.Args[2] { 21589 break 21590 } 21591 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)) { 21592 break 21593 } 21594 b = mergePoint(b, x0, x1) 21595 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21596 v.reset(OpCopy) 21597 v.AddArg(v0) 21598 v0.AuxInt = i0 21599 v0.Aux = s 21600 v0.AddArg(p) 21601 v0.AddArg(idx) 21602 v0.AddArg(mem) 21603 return true 21604 } 21605 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21606 // 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) 21607 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21608 for { 21609 _ = v.Args[1] 21610 x1 := v.Args[0] 21611 if x1.Op != OpS390XMOVWZloadidx { 21612 break 21613 } 21614 i1 := x1.AuxInt 21615 s := x1.Aux 21616 _ = x1.Args[2] 21617 p := x1.Args[0] 21618 idx := x1.Args[1] 21619 mem := x1.Args[2] 21620 sh := v.Args[1] 21621 if sh.Op != OpS390XSLDconst { 21622 break 21623 } 21624 if sh.AuxInt != 32 { 21625 break 21626 } 21627 x0 := sh.Args[0] 21628 if x0.Op != OpS390XMOVWZloadidx { 21629 break 21630 } 21631 i0 := x0.AuxInt 21632 if x0.Aux != s { 21633 break 21634 } 21635 _ = x0.Args[2] 21636 if idx != x0.Args[0] { 21637 break 21638 } 21639 if p != x0.Args[1] { 21640 break 21641 } 21642 if mem != x0.Args[2] { 21643 break 21644 } 21645 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)) { 21646 break 21647 } 21648 b = mergePoint(b, x0, x1) 21649 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21650 v.reset(OpCopy) 21651 v.AddArg(v0) 21652 v0.AuxInt = i0 21653 v0.Aux = s 21654 v0.AddArg(p) 21655 v0.AddArg(idx) 21656 v0.AddArg(mem) 21657 return true 21658 } 21659 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21660 // 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) 21661 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21662 for { 21663 _ = v.Args[1] 21664 x1 := v.Args[0] 21665 if x1.Op != OpS390XMOVWZloadidx { 21666 break 21667 } 21668 i1 := x1.AuxInt 21669 s := x1.Aux 21670 _ = x1.Args[2] 21671 idx := x1.Args[0] 21672 p := x1.Args[1] 21673 mem := x1.Args[2] 21674 sh := v.Args[1] 21675 if sh.Op != OpS390XSLDconst { 21676 break 21677 } 21678 if sh.AuxInt != 32 { 21679 break 21680 } 21681 x0 := sh.Args[0] 21682 if x0.Op != OpS390XMOVWZloadidx { 21683 break 21684 } 21685 i0 := x0.AuxInt 21686 if x0.Aux != s { 21687 break 21688 } 21689 _ = x0.Args[2] 21690 if idx != x0.Args[0] { 21691 break 21692 } 21693 if p != x0.Args[1] { 21694 break 21695 } 21696 if mem != x0.Args[2] { 21697 break 21698 } 21699 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)) { 21700 break 21701 } 21702 b = mergePoint(b, x0, x1) 21703 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21704 v.reset(OpCopy) 21705 v.AddArg(v0) 21706 v0.AuxInt = i0 21707 v0.Aux = s 21708 v0.AddArg(p) 21709 v0.AddArg(idx) 21710 v0.AddArg(mem) 21711 return true 21712 } 21713 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21714 // 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) 21715 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21716 for { 21717 _ = v.Args[1] 21718 sh := v.Args[0] 21719 if sh.Op != OpS390XSLDconst { 21720 break 21721 } 21722 if sh.AuxInt != 32 { 21723 break 21724 } 21725 x0 := sh.Args[0] 21726 if x0.Op != OpS390XMOVWZloadidx { 21727 break 21728 } 21729 i0 := x0.AuxInt 21730 s := x0.Aux 21731 _ = x0.Args[2] 21732 p := x0.Args[0] 21733 idx := x0.Args[1] 21734 mem := x0.Args[2] 21735 x1 := v.Args[1] 21736 if x1.Op != OpS390XMOVWZloadidx { 21737 break 21738 } 21739 i1 := x1.AuxInt 21740 if x1.Aux != s { 21741 break 21742 } 21743 _ = x1.Args[2] 21744 if p != x1.Args[0] { 21745 break 21746 } 21747 if idx != x1.Args[1] { 21748 break 21749 } 21750 if mem != x1.Args[2] { 21751 break 21752 } 21753 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)) { 21754 break 21755 } 21756 b = mergePoint(b, x0, x1) 21757 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21758 v.reset(OpCopy) 21759 v.AddArg(v0) 21760 v0.AuxInt = i0 21761 v0.Aux = s 21762 v0.AddArg(p) 21763 v0.AddArg(idx) 21764 v0.AddArg(mem) 21765 return true 21766 } 21767 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21768 // 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) 21769 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21770 for { 21771 _ = v.Args[1] 21772 sh := v.Args[0] 21773 if sh.Op != OpS390XSLDconst { 21774 break 21775 } 21776 if sh.AuxInt != 32 { 21777 break 21778 } 21779 x0 := sh.Args[0] 21780 if x0.Op != OpS390XMOVWZloadidx { 21781 break 21782 } 21783 i0 := x0.AuxInt 21784 s := x0.Aux 21785 _ = x0.Args[2] 21786 idx := x0.Args[0] 21787 p := x0.Args[1] 21788 mem := x0.Args[2] 21789 x1 := v.Args[1] 21790 if x1.Op != OpS390XMOVWZloadidx { 21791 break 21792 } 21793 i1 := x1.AuxInt 21794 if x1.Aux != s { 21795 break 21796 } 21797 _ = x1.Args[2] 21798 if p != x1.Args[0] { 21799 break 21800 } 21801 if idx != x1.Args[1] { 21802 break 21803 } 21804 if mem != x1.Args[2] { 21805 break 21806 } 21807 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)) { 21808 break 21809 } 21810 b = mergePoint(b, x0, x1) 21811 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21812 v.reset(OpCopy) 21813 v.AddArg(v0) 21814 v0.AuxInt = i0 21815 v0.Aux = s 21816 v0.AddArg(p) 21817 v0.AddArg(idx) 21818 v0.AddArg(mem) 21819 return true 21820 } 21821 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21822 // 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) 21823 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21824 for { 21825 _ = v.Args[1] 21826 sh := v.Args[0] 21827 if sh.Op != OpS390XSLDconst { 21828 break 21829 } 21830 if sh.AuxInt != 32 { 21831 break 21832 } 21833 x0 := sh.Args[0] 21834 if x0.Op != OpS390XMOVWZloadidx { 21835 break 21836 } 21837 i0 := x0.AuxInt 21838 s := x0.Aux 21839 _ = x0.Args[2] 21840 p := x0.Args[0] 21841 idx := x0.Args[1] 21842 mem := x0.Args[2] 21843 x1 := v.Args[1] 21844 if x1.Op != OpS390XMOVWZloadidx { 21845 break 21846 } 21847 i1 := x1.AuxInt 21848 if x1.Aux != s { 21849 break 21850 } 21851 _ = x1.Args[2] 21852 if idx != x1.Args[0] { 21853 break 21854 } 21855 if p != x1.Args[1] { 21856 break 21857 } 21858 if mem != x1.Args[2] { 21859 break 21860 } 21861 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)) { 21862 break 21863 } 21864 b = mergePoint(b, x0, x1) 21865 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21866 v.reset(OpCopy) 21867 v.AddArg(v0) 21868 v0.AuxInt = i0 21869 v0.Aux = s 21870 v0.AddArg(p) 21871 v0.AddArg(idx) 21872 v0.AddArg(mem) 21873 return true 21874 } 21875 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21876 // 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) 21877 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21878 for { 21879 _ = v.Args[1] 21880 sh := v.Args[0] 21881 if sh.Op != OpS390XSLDconst { 21882 break 21883 } 21884 if sh.AuxInt != 32 { 21885 break 21886 } 21887 x0 := sh.Args[0] 21888 if x0.Op != OpS390XMOVWZloadidx { 21889 break 21890 } 21891 i0 := x0.AuxInt 21892 s := x0.Aux 21893 _ = x0.Args[2] 21894 idx := x0.Args[0] 21895 p := x0.Args[1] 21896 mem := x0.Args[2] 21897 x1 := v.Args[1] 21898 if x1.Op != OpS390XMOVWZloadidx { 21899 break 21900 } 21901 i1 := x1.AuxInt 21902 if x1.Aux != s { 21903 break 21904 } 21905 _ = x1.Args[2] 21906 if idx != x1.Args[0] { 21907 break 21908 } 21909 if p != x1.Args[1] { 21910 break 21911 } 21912 if mem != x1.Args[2] { 21913 break 21914 } 21915 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)) { 21916 break 21917 } 21918 b = mergePoint(b, x0, x1) 21919 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21920 v.reset(OpCopy) 21921 v.AddArg(v0) 21922 v0.AuxInt = i0 21923 v0.Aux = s 21924 v0.AddArg(p) 21925 v0.AddArg(idx) 21926 v0.AddArg(mem) 21927 return true 21928 } 21929 // 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)) 21930 // 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) 21931 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21932 for { 21933 _ = v.Args[1] 21934 s0 := v.Args[0] 21935 if s0.Op != OpS390XSLDconst { 21936 break 21937 } 21938 j0 := s0.AuxInt 21939 x0 := s0.Args[0] 21940 if x0.Op != OpS390XMOVBZloadidx { 21941 break 21942 } 21943 i0 := x0.AuxInt 21944 s := x0.Aux 21945 _ = x0.Args[2] 21946 p := x0.Args[0] 21947 idx := x0.Args[1] 21948 mem := x0.Args[2] 21949 or := v.Args[1] 21950 if or.Op != OpS390XOR { 21951 break 21952 } 21953 _ = or.Args[1] 21954 s1 := or.Args[0] 21955 if s1.Op != OpS390XSLDconst { 21956 break 21957 } 21958 j1 := s1.AuxInt 21959 x1 := s1.Args[0] 21960 if x1.Op != OpS390XMOVBZloadidx { 21961 break 21962 } 21963 i1 := x1.AuxInt 21964 if x1.Aux != s { 21965 break 21966 } 21967 _ = x1.Args[2] 21968 if p != x1.Args[0] { 21969 break 21970 } 21971 if idx != x1.Args[1] { 21972 break 21973 } 21974 if mem != x1.Args[2] { 21975 break 21976 } 21977 y := or.Args[1] 21978 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)) { 21979 break 21980 } 21981 b = mergePoint(b, x0, x1) 21982 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21983 v.reset(OpCopy) 21984 v.AddArg(v0) 21985 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21986 v1.AuxInt = j1 21987 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21988 v2.AuxInt = i0 21989 v2.Aux = s 21990 v2.AddArg(p) 21991 v2.AddArg(idx) 21992 v2.AddArg(mem) 21993 v1.AddArg(v2) 21994 v0.AddArg(v1) 21995 v0.AddArg(y) 21996 return true 21997 } 21998 return false 21999 } 22000 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 22001 b := v.Block 22002 _ = b 22003 typ := &b.Func.Config.Types 22004 _ = typ 22005 // 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)) 22006 // 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) 22007 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22008 for { 22009 _ = v.Args[1] 22010 s0 := v.Args[0] 22011 if s0.Op != OpS390XSLDconst { 22012 break 22013 } 22014 j0 := s0.AuxInt 22015 x0 := s0.Args[0] 22016 if x0.Op != OpS390XMOVBZloadidx { 22017 break 22018 } 22019 i0 := x0.AuxInt 22020 s := x0.Aux 22021 _ = x0.Args[2] 22022 idx := x0.Args[0] 22023 p := x0.Args[1] 22024 mem := x0.Args[2] 22025 or := v.Args[1] 22026 if or.Op != OpS390XOR { 22027 break 22028 } 22029 _ = or.Args[1] 22030 s1 := or.Args[0] 22031 if s1.Op != OpS390XSLDconst { 22032 break 22033 } 22034 j1 := s1.AuxInt 22035 x1 := s1.Args[0] 22036 if x1.Op != OpS390XMOVBZloadidx { 22037 break 22038 } 22039 i1 := x1.AuxInt 22040 if x1.Aux != s { 22041 break 22042 } 22043 _ = x1.Args[2] 22044 if p != x1.Args[0] { 22045 break 22046 } 22047 if idx != x1.Args[1] { 22048 break 22049 } 22050 if mem != x1.Args[2] { 22051 break 22052 } 22053 y := or.Args[1] 22054 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)) { 22055 break 22056 } 22057 b = mergePoint(b, x0, x1) 22058 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22059 v.reset(OpCopy) 22060 v.AddArg(v0) 22061 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22062 v1.AuxInt = j1 22063 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22064 v2.AuxInt = i0 22065 v2.Aux = s 22066 v2.AddArg(p) 22067 v2.AddArg(idx) 22068 v2.AddArg(mem) 22069 v1.AddArg(v2) 22070 v0.AddArg(v1) 22071 v0.AddArg(y) 22072 return true 22073 } 22074 // 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)) 22075 // 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) 22076 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22077 for { 22078 _ = v.Args[1] 22079 s0 := v.Args[0] 22080 if s0.Op != OpS390XSLDconst { 22081 break 22082 } 22083 j0 := s0.AuxInt 22084 x0 := s0.Args[0] 22085 if x0.Op != OpS390XMOVBZloadidx { 22086 break 22087 } 22088 i0 := x0.AuxInt 22089 s := x0.Aux 22090 _ = x0.Args[2] 22091 p := x0.Args[0] 22092 idx := x0.Args[1] 22093 mem := x0.Args[2] 22094 or := v.Args[1] 22095 if or.Op != OpS390XOR { 22096 break 22097 } 22098 _ = or.Args[1] 22099 s1 := or.Args[0] 22100 if s1.Op != OpS390XSLDconst { 22101 break 22102 } 22103 j1 := s1.AuxInt 22104 x1 := s1.Args[0] 22105 if x1.Op != OpS390XMOVBZloadidx { 22106 break 22107 } 22108 i1 := x1.AuxInt 22109 if x1.Aux != s { 22110 break 22111 } 22112 _ = x1.Args[2] 22113 if idx != x1.Args[0] { 22114 break 22115 } 22116 if p != x1.Args[1] { 22117 break 22118 } 22119 if mem != x1.Args[2] { 22120 break 22121 } 22122 y := or.Args[1] 22123 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)) { 22124 break 22125 } 22126 b = mergePoint(b, x0, x1) 22127 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22128 v.reset(OpCopy) 22129 v.AddArg(v0) 22130 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22131 v1.AuxInt = j1 22132 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22133 v2.AuxInt = i0 22134 v2.Aux = s 22135 v2.AddArg(p) 22136 v2.AddArg(idx) 22137 v2.AddArg(mem) 22138 v1.AddArg(v2) 22139 v0.AddArg(v1) 22140 v0.AddArg(y) 22141 return true 22142 } 22143 // 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)) 22144 // 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) 22145 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22146 for { 22147 _ = v.Args[1] 22148 s0 := v.Args[0] 22149 if s0.Op != OpS390XSLDconst { 22150 break 22151 } 22152 j0 := s0.AuxInt 22153 x0 := s0.Args[0] 22154 if x0.Op != OpS390XMOVBZloadidx { 22155 break 22156 } 22157 i0 := x0.AuxInt 22158 s := x0.Aux 22159 _ = x0.Args[2] 22160 idx := x0.Args[0] 22161 p := x0.Args[1] 22162 mem := x0.Args[2] 22163 or := v.Args[1] 22164 if or.Op != OpS390XOR { 22165 break 22166 } 22167 _ = or.Args[1] 22168 s1 := or.Args[0] 22169 if s1.Op != OpS390XSLDconst { 22170 break 22171 } 22172 j1 := s1.AuxInt 22173 x1 := s1.Args[0] 22174 if x1.Op != OpS390XMOVBZloadidx { 22175 break 22176 } 22177 i1 := x1.AuxInt 22178 if x1.Aux != s { 22179 break 22180 } 22181 _ = x1.Args[2] 22182 if idx != x1.Args[0] { 22183 break 22184 } 22185 if p != x1.Args[1] { 22186 break 22187 } 22188 if mem != x1.Args[2] { 22189 break 22190 } 22191 y := or.Args[1] 22192 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)) { 22193 break 22194 } 22195 b = mergePoint(b, x0, x1) 22196 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22197 v.reset(OpCopy) 22198 v.AddArg(v0) 22199 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22200 v1.AuxInt = j1 22201 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22202 v2.AuxInt = i0 22203 v2.Aux = s 22204 v2.AddArg(p) 22205 v2.AddArg(idx) 22206 v2.AddArg(mem) 22207 v1.AddArg(v2) 22208 v0.AddArg(v1) 22209 v0.AddArg(y) 22210 return true 22211 } 22212 // 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)))) 22213 // 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) 22214 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22215 for { 22216 _ = v.Args[1] 22217 s0 := v.Args[0] 22218 if s0.Op != OpS390XSLDconst { 22219 break 22220 } 22221 j0 := s0.AuxInt 22222 x0 := s0.Args[0] 22223 if x0.Op != OpS390XMOVBZloadidx { 22224 break 22225 } 22226 i0 := x0.AuxInt 22227 s := x0.Aux 22228 _ = x0.Args[2] 22229 p := x0.Args[0] 22230 idx := x0.Args[1] 22231 mem := x0.Args[2] 22232 or := v.Args[1] 22233 if or.Op != OpS390XOR { 22234 break 22235 } 22236 _ = or.Args[1] 22237 y := or.Args[0] 22238 s1 := or.Args[1] 22239 if s1.Op != OpS390XSLDconst { 22240 break 22241 } 22242 j1 := s1.AuxInt 22243 x1 := s1.Args[0] 22244 if x1.Op != OpS390XMOVBZloadidx { 22245 break 22246 } 22247 i1 := x1.AuxInt 22248 if x1.Aux != s { 22249 break 22250 } 22251 _ = x1.Args[2] 22252 if p != x1.Args[0] { 22253 break 22254 } 22255 if idx != x1.Args[1] { 22256 break 22257 } 22258 if mem != x1.Args[2] { 22259 break 22260 } 22261 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)) { 22262 break 22263 } 22264 b = mergePoint(b, x0, x1) 22265 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22266 v.reset(OpCopy) 22267 v.AddArg(v0) 22268 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22269 v1.AuxInt = j1 22270 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22271 v2.AuxInt = i0 22272 v2.Aux = s 22273 v2.AddArg(p) 22274 v2.AddArg(idx) 22275 v2.AddArg(mem) 22276 v1.AddArg(v2) 22277 v0.AddArg(v1) 22278 v0.AddArg(y) 22279 return true 22280 } 22281 // 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)))) 22282 // 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) 22283 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22284 for { 22285 _ = v.Args[1] 22286 s0 := v.Args[0] 22287 if s0.Op != OpS390XSLDconst { 22288 break 22289 } 22290 j0 := s0.AuxInt 22291 x0 := s0.Args[0] 22292 if x0.Op != OpS390XMOVBZloadidx { 22293 break 22294 } 22295 i0 := x0.AuxInt 22296 s := x0.Aux 22297 _ = x0.Args[2] 22298 idx := x0.Args[0] 22299 p := x0.Args[1] 22300 mem := x0.Args[2] 22301 or := v.Args[1] 22302 if or.Op != OpS390XOR { 22303 break 22304 } 22305 _ = or.Args[1] 22306 y := or.Args[0] 22307 s1 := or.Args[1] 22308 if s1.Op != OpS390XSLDconst { 22309 break 22310 } 22311 j1 := s1.AuxInt 22312 x1 := s1.Args[0] 22313 if x1.Op != OpS390XMOVBZloadidx { 22314 break 22315 } 22316 i1 := x1.AuxInt 22317 if x1.Aux != s { 22318 break 22319 } 22320 _ = x1.Args[2] 22321 if p != x1.Args[0] { 22322 break 22323 } 22324 if idx != x1.Args[1] { 22325 break 22326 } 22327 if mem != x1.Args[2] { 22328 break 22329 } 22330 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)) { 22331 break 22332 } 22333 b = mergePoint(b, x0, x1) 22334 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22335 v.reset(OpCopy) 22336 v.AddArg(v0) 22337 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22338 v1.AuxInt = j1 22339 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22340 v2.AuxInt = i0 22341 v2.Aux = s 22342 v2.AddArg(p) 22343 v2.AddArg(idx) 22344 v2.AddArg(mem) 22345 v1.AddArg(v2) 22346 v0.AddArg(v1) 22347 v0.AddArg(y) 22348 return true 22349 } 22350 // 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)))) 22351 // 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) 22352 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22353 for { 22354 _ = v.Args[1] 22355 s0 := v.Args[0] 22356 if s0.Op != OpS390XSLDconst { 22357 break 22358 } 22359 j0 := s0.AuxInt 22360 x0 := s0.Args[0] 22361 if x0.Op != OpS390XMOVBZloadidx { 22362 break 22363 } 22364 i0 := x0.AuxInt 22365 s := x0.Aux 22366 _ = x0.Args[2] 22367 p := x0.Args[0] 22368 idx := x0.Args[1] 22369 mem := x0.Args[2] 22370 or := v.Args[1] 22371 if or.Op != OpS390XOR { 22372 break 22373 } 22374 _ = or.Args[1] 22375 y := or.Args[0] 22376 s1 := or.Args[1] 22377 if s1.Op != OpS390XSLDconst { 22378 break 22379 } 22380 j1 := s1.AuxInt 22381 x1 := s1.Args[0] 22382 if x1.Op != OpS390XMOVBZloadidx { 22383 break 22384 } 22385 i1 := x1.AuxInt 22386 if x1.Aux != s { 22387 break 22388 } 22389 _ = x1.Args[2] 22390 if idx != x1.Args[0] { 22391 break 22392 } 22393 if p != x1.Args[1] { 22394 break 22395 } 22396 if mem != x1.Args[2] { 22397 break 22398 } 22399 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)) { 22400 break 22401 } 22402 b = mergePoint(b, x0, x1) 22403 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22404 v.reset(OpCopy) 22405 v.AddArg(v0) 22406 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22407 v1.AuxInt = j1 22408 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22409 v2.AuxInt = i0 22410 v2.Aux = s 22411 v2.AddArg(p) 22412 v2.AddArg(idx) 22413 v2.AddArg(mem) 22414 v1.AddArg(v2) 22415 v0.AddArg(v1) 22416 v0.AddArg(y) 22417 return true 22418 } 22419 // 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)))) 22420 // 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) 22421 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22422 for { 22423 _ = v.Args[1] 22424 s0 := v.Args[0] 22425 if s0.Op != OpS390XSLDconst { 22426 break 22427 } 22428 j0 := s0.AuxInt 22429 x0 := s0.Args[0] 22430 if x0.Op != OpS390XMOVBZloadidx { 22431 break 22432 } 22433 i0 := x0.AuxInt 22434 s := x0.Aux 22435 _ = x0.Args[2] 22436 idx := x0.Args[0] 22437 p := x0.Args[1] 22438 mem := x0.Args[2] 22439 or := v.Args[1] 22440 if or.Op != OpS390XOR { 22441 break 22442 } 22443 _ = or.Args[1] 22444 y := or.Args[0] 22445 s1 := or.Args[1] 22446 if s1.Op != OpS390XSLDconst { 22447 break 22448 } 22449 j1 := s1.AuxInt 22450 x1 := s1.Args[0] 22451 if x1.Op != OpS390XMOVBZloadidx { 22452 break 22453 } 22454 i1 := x1.AuxInt 22455 if x1.Aux != s { 22456 break 22457 } 22458 _ = x1.Args[2] 22459 if idx != x1.Args[0] { 22460 break 22461 } 22462 if p != x1.Args[1] { 22463 break 22464 } 22465 if mem != x1.Args[2] { 22466 break 22467 } 22468 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)) { 22469 break 22470 } 22471 b = mergePoint(b, x0, x1) 22472 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22473 v.reset(OpCopy) 22474 v.AddArg(v0) 22475 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22476 v1.AuxInt = j1 22477 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22478 v2.AuxInt = i0 22479 v2.Aux = s 22480 v2.AddArg(p) 22481 v2.AddArg(idx) 22482 v2.AddArg(mem) 22483 v1.AddArg(v2) 22484 v0.AddArg(v1) 22485 v0.AddArg(y) 22486 return true 22487 } 22488 // 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))) 22489 // 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) 22490 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22491 for { 22492 _ = v.Args[1] 22493 or := v.Args[0] 22494 if or.Op != OpS390XOR { 22495 break 22496 } 22497 _ = or.Args[1] 22498 s1 := or.Args[0] 22499 if s1.Op != OpS390XSLDconst { 22500 break 22501 } 22502 j1 := s1.AuxInt 22503 x1 := s1.Args[0] 22504 if x1.Op != OpS390XMOVBZloadidx { 22505 break 22506 } 22507 i1 := x1.AuxInt 22508 s := x1.Aux 22509 _ = x1.Args[2] 22510 p := x1.Args[0] 22511 idx := x1.Args[1] 22512 mem := x1.Args[2] 22513 y := or.Args[1] 22514 s0 := v.Args[1] 22515 if s0.Op != OpS390XSLDconst { 22516 break 22517 } 22518 j0 := s0.AuxInt 22519 x0 := s0.Args[0] 22520 if x0.Op != OpS390XMOVBZloadidx { 22521 break 22522 } 22523 i0 := x0.AuxInt 22524 if x0.Aux != s { 22525 break 22526 } 22527 _ = x0.Args[2] 22528 if p != x0.Args[0] { 22529 break 22530 } 22531 if idx != x0.Args[1] { 22532 break 22533 } 22534 if mem != x0.Args[2] { 22535 break 22536 } 22537 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)) { 22538 break 22539 } 22540 b = mergePoint(b, x0, x1) 22541 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22542 v.reset(OpCopy) 22543 v.AddArg(v0) 22544 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22545 v1.AuxInt = j1 22546 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22547 v2.AuxInt = i0 22548 v2.Aux = s 22549 v2.AddArg(p) 22550 v2.AddArg(idx) 22551 v2.AddArg(mem) 22552 v1.AddArg(v2) 22553 v0.AddArg(v1) 22554 v0.AddArg(y) 22555 return true 22556 } 22557 // 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))) 22558 // 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) 22559 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22560 for { 22561 _ = v.Args[1] 22562 or := v.Args[0] 22563 if or.Op != OpS390XOR { 22564 break 22565 } 22566 _ = or.Args[1] 22567 s1 := or.Args[0] 22568 if s1.Op != OpS390XSLDconst { 22569 break 22570 } 22571 j1 := s1.AuxInt 22572 x1 := s1.Args[0] 22573 if x1.Op != OpS390XMOVBZloadidx { 22574 break 22575 } 22576 i1 := x1.AuxInt 22577 s := x1.Aux 22578 _ = x1.Args[2] 22579 idx := x1.Args[0] 22580 p := x1.Args[1] 22581 mem := x1.Args[2] 22582 y := or.Args[1] 22583 s0 := v.Args[1] 22584 if s0.Op != OpS390XSLDconst { 22585 break 22586 } 22587 j0 := s0.AuxInt 22588 x0 := s0.Args[0] 22589 if x0.Op != OpS390XMOVBZloadidx { 22590 break 22591 } 22592 i0 := x0.AuxInt 22593 if x0.Aux != s { 22594 break 22595 } 22596 _ = x0.Args[2] 22597 if p != x0.Args[0] { 22598 break 22599 } 22600 if idx != x0.Args[1] { 22601 break 22602 } 22603 if mem != x0.Args[2] { 22604 break 22605 } 22606 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)) { 22607 break 22608 } 22609 b = mergePoint(b, x0, x1) 22610 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22611 v.reset(OpCopy) 22612 v.AddArg(v0) 22613 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22614 v1.AuxInt = j1 22615 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22616 v2.AuxInt = i0 22617 v2.Aux = s 22618 v2.AddArg(p) 22619 v2.AddArg(idx) 22620 v2.AddArg(mem) 22621 v1.AddArg(v2) 22622 v0.AddArg(v1) 22623 v0.AddArg(y) 22624 return true 22625 } 22626 // 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))) 22627 // 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) 22628 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22629 for { 22630 _ = v.Args[1] 22631 or := v.Args[0] 22632 if or.Op != OpS390XOR { 22633 break 22634 } 22635 _ = or.Args[1] 22636 y := or.Args[0] 22637 s1 := or.Args[1] 22638 if s1.Op != OpS390XSLDconst { 22639 break 22640 } 22641 j1 := s1.AuxInt 22642 x1 := s1.Args[0] 22643 if x1.Op != OpS390XMOVBZloadidx { 22644 break 22645 } 22646 i1 := x1.AuxInt 22647 s := x1.Aux 22648 _ = x1.Args[2] 22649 p := x1.Args[0] 22650 idx := x1.Args[1] 22651 mem := x1.Args[2] 22652 s0 := v.Args[1] 22653 if s0.Op != OpS390XSLDconst { 22654 break 22655 } 22656 j0 := s0.AuxInt 22657 x0 := s0.Args[0] 22658 if x0.Op != OpS390XMOVBZloadidx { 22659 break 22660 } 22661 i0 := x0.AuxInt 22662 if x0.Aux != s { 22663 break 22664 } 22665 _ = x0.Args[2] 22666 if p != x0.Args[0] { 22667 break 22668 } 22669 if idx != x0.Args[1] { 22670 break 22671 } 22672 if mem != x0.Args[2] { 22673 break 22674 } 22675 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)) { 22676 break 22677 } 22678 b = mergePoint(b, x0, x1) 22679 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22680 v.reset(OpCopy) 22681 v.AddArg(v0) 22682 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22683 v1.AuxInt = j1 22684 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22685 v2.AuxInt = i0 22686 v2.Aux = s 22687 v2.AddArg(p) 22688 v2.AddArg(idx) 22689 v2.AddArg(mem) 22690 v1.AddArg(v2) 22691 v0.AddArg(v1) 22692 v0.AddArg(y) 22693 return true 22694 } 22695 return false 22696 } 22697 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 22698 b := v.Block 22699 _ = b 22700 typ := &b.Func.Config.Types 22701 _ = typ 22702 // 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))) 22703 // 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) 22704 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22705 for { 22706 _ = v.Args[1] 22707 or := v.Args[0] 22708 if or.Op != OpS390XOR { 22709 break 22710 } 22711 _ = or.Args[1] 22712 y := or.Args[0] 22713 s1 := or.Args[1] 22714 if s1.Op != OpS390XSLDconst { 22715 break 22716 } 22717 j1 := s1.AuxInt 22718 x1 := s1.Args[0] 22719 if x1.Op != OpS390XMOVBZloadidx { 22720 break 22721 } 22722 i1 := x1.AuxInt 22723 s := x1.Aux 22724 _ = x1.Args[2] 22725 idx := x1.Args[0] 22726 p := x1.Args[1] 22727 mem := x1.Args[2] 22728 s0 := v.Args[1] 22729 if s0.Op != OpS390XSLDconst { 22730 break 22731 } 22732 j0 := s0.AuxInt 22733 x0 := s0.Args[0] 22734 if x0.Op != OpS390XMOVBZloadidx { 22735 break 22736 } 22737 i0 := x0.AuxInt 22738 if x0.Aux != s { 22739 break 22740 } 22741 _ = x0.Args[2] 22742 if p != x0.Args[0] { 22743 break 22744 } 22745 if idx != x0.Args[1] { 22746 break 22747 } 22748 if mem != x0.Args[2] { 22749 break 22750 } 22751 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)) { 22752 break 22753 } 22754 b = mergePoint(b, x0, x1) 22755 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22756 v.reset(OpCopy) 22757 v.AddArg(v0) 22758 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22759 v1.AuxInt = j1 22760 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22761 v2.AuxInt = i0 22762 v2.Aux = s 22763 v2.AddArg(p) 22764 v2.AddArg(idx) 22765 v2.AddArg(mem) 22766 v1.AddArg(v2) 22767 v0.AddArg(v1) 22768 v0.AddArg(y) 22769 return true 22770 } 22771 // 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))) 22772 // 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) 22773 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22774 for { 22775 _ = v.Args[1] 22776 or := v.Args[0] 22777 if or.Op != OpS390XOR { 22778 break 22779 } 22780 _ = or.Args[1] 22781 s1 := or.Args[0] 22782 if s1.Op != OpS390XSLDconst { 22783 break 22784 } 22785 j1 := s1.AuxInt 22786 x1 := s1.Args[0] 22787 if x1.Op != OpS390XMOVBZloadidx { 22788 break 22789 } 22790 i1 := x1.AuxInt 22791 s := x1.Aux 22792 _ = x1.Args[2] 22793 p := x1.Args[0] 22794 idx := x1.Args[1] 22795 mem := x1.Args[2] 22796 y := or.Args[1] 22797 s0 := v.Args[1] 22798 if s0.Op != OpS390XSLDconst { 22799 break 22800 } 22801 j0 := s0.AuxInt 22802 x0 := s0.Args[0] 22803 if x0.Op != OpS390XMOVBZloadidx { 22804 break 22805 } 22806 i0 := x0.AuxInt 22807 if x0.Aux != s { 22808 break 22809 } 22810 _ = x0.Args[2] 22811 if idx != x0.Args[0] { 22812 break 22813 } 22814 if p != x0.Args[1] { 22815 break 22816 } 22817 if mem != x0.Args[2] { 22818 break 22819 } 22820 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)) { 22821 break 22822 } 22823 b = mergePoint(b, x0, x1) 22824 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22825 v.reset(OpCopy) 22826 v.AddArg(v0) 22827 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22828 v1.AuxInt = j1 22829 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22830 v2.AuxInt = i0 22831 v2.Aux = s 22832 v2.AddArg(p) 22833 v2.AddArg(idx) 22834 v2.AddArg(mem) 22835 v1.AddArg(v2) 22836 v0.AddArg(v1) 22837 v0.AddArg(y) 22838 return true 22839 } 22840 // 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))) 22841 // 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) 22842 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22843 for { 22844 _ = v.Args[1] 22845 or := v.Args[0] 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 != OpS390XMOVBZloadidx { 22857 break 22858 } 22859 i1 := x1.AuxInt 22860 s := x1.Aux 22861 _ = x1.Args[2] 22862 idx := x1.Args[0] 22863 p := x1.Args[1] 22864 mem := x1.Args[2] 22865 y := or.Args[1] 22866 s0 := v.Args[1] 22867 if s0.Op != OpS390XSLDconst { 22868 break 22869 } 22870 j0 := s0.AuxInt 22871 x0 := s0.Args[0] 22872 if x0.Op != OpS390XMOVBZloadidx { 22873 break 22874 } 22875 i0 := x0.AuxInt 22876 if x0.Aux != s { 22877 break 22878 } 22879 _ = x0.Args[2] 22880 if idx != x0.Args[0] { 22881 break 22882 } 22883 if p != x0.Args[1] { 22884 break 22885 } 22886 if mem != x0.Args[2] { 22887 break 22888 } 22889 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)) { 22890 break 22891 } 22892 b = mergePoint(b, x0, x1) 22893 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22894 v.reset(OpCopy) 22895 v.AddArg(v0) 22896 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22897 v1.AuxInt = j1 22898 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22899 v2.AuxInt = i0 22900 v2.Aux = s 22901 v2.AddArg(p) 22902 v2.AddArg(idx) 22903 v2.AddArg(mem) 22904 v1.AddArg(v2) 22905 v0.AddArg(v1) 22906 v0.AddArg(y) 22907 return true 22908 } 22909 // 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))) 22910 // 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) 22911 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22912 for { 22913 _ = v.Args[1] 22914 or := v.Args[0] 22915 if or.Op != OpS390XOR { 22916 break 22917 } 22918 _ = or.Args[1] 22919 y := or.Args[0] 22920 s1 := or.Args[1] 22921 if s1.Op != OpS390XSLDconst { 22922 break 22923 } 22924 j1 := s1.AuxInt 22925 x1 := s1.Args[0] 22926 if x1.Op != OpS390XMOVBZloadidx { 22927 break 22928 } 22929 i1 := x1.AuxInt 22930 s := x1.Aux 22931 _ = x1.Args[2] 22932 p := x1.Args[0] 22933 idx := x1.Args[1] 22934 mem := x1.Args[2] 22935 s0 := v.Args[1] 22936 if s0.Op != OpS390XSLDconst { 22937 break 22938 } 22939 j0 := s0.AuxInt 22940 x0 := s0.Args[0] 22941 if x0.Op != OpS390XMOVBZloadidx { 22942 break 22943 } 22944 i0 := x0.AuxInt 22945 if x0.Aux != s { 22946 break 22947 } 22948 _ = x0.Args[2] 22949 if idx != x0.Args[0] { 22950 break 22951 } 22952 if p != x0.Args[1] { 22953 break 22954 } 22955 if mem != x0.Args[2] { 22956 break 22957 } 22958 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)) { 22959 break 22960 } 22961 b = mergePoint(b, x0, x1) 22962 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22963 v.reset(OpCopy) 22964 v.AddArg(v0) 22965 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22966 v1.AuxInt = j1 22967 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22968 v2.AuxInt = i0 22969 v2.Aux = s 22970 v2.AddArg(p) 22971 v2.AddArg(idx) 22972 v2.AddArg(mem) 22973 v1.AddArg(v2) 22974 v0.AddArg(v1) 22975 v0.AddArg(y) 22976 return true 22977 } 22978 // 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))) 22979 // 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) 22980 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22981 for { 22982 _ = v.Args[1] 22983 or := v.Args[0] 22984 if or.Op != OpS390XOR { 22985 break 22986 } 22987 _ = or.Args[1] 22988 y := or.Args[0] 22989 s1 := or.Args[1] 22990 if s1.Op != OpS390XSLDconst { 22991 break 22992 } 22993 j1 := s1.AuxInt 22994 x1 := s1.Args[0] 22995 if x1.Op != OpS390XMOVBZloadidx { 22996 break 22997 } 22998 i1 := x1.AuxInt 22999 s := x1.Aux 23000 _ = x1.Args[2] 23001 idx := x1.Args[0] 23002 p := x1.Args[1] 23003 mem := x1.Args[2] 23004 s0 := v.Args[1] 23005 if s0.Op != OpS390XSLDconst { 23006 break 23007 } 23008 j0 := s0.AuxInt 23009 x0 := s0.Args[0] 23010 if x0.Op != OpS390XMOVBZloadidx { 23011 break 23012 } 23013 i0 := x0.AuxInt 23014 if x0.Aux != s { 23015 break 23016 } 23017 _ = x0.Args[2] 23018 if idx != x0.Args[0] { 23019 break 23020 } 23021 if p != x0.Args[1] { 23022 break 23023 } 23024 if mem != x0.Args[2] { 23025 break 23026 } 23027 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)) { 23028 break 23029 } 23030 b = mergePoint(b, x0, x1) 23031 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23032 v.reset(OpCopy) 23033 v.AddArg(v0) 23034 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23035 v1.AuxInt = j1 23036 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23037 v2.AuxInt = i0 23038 v2.Aux = s 23039 v2.AddArg(p) 23040 v2.AddArg(idx) 23041 v2.AddArg(mem) 23042 v1.AddArg(v2) 23043 v0.AddArg(v1) 23044 v0.AddArg(y) 23045 return true 23046 } 23047 // 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)) 23048 // 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) 23049 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23050 for { 23051 _ = v.Args[1] 23052 s0 := v.Args[0] 23053 if s0.Op != OpS390XSLDconst { 23054 break 23055 } 23056 j0 := s0.AuxInt 23057 x0 := s0.Args[0] 23058 if x0.Op != OpS390XMOVHZloadidx { 23059 break 23060 } 23061 i0 := x0.AuxInt 23062 s := x0.Aux 23063 _ = x0.Args[2] 23064 p := x0.Args[0] 23065 idx := x0.Args[1] 23066 mem := x0.Args[2] 23067 or := v.Args[1] 23068 if or.Op != OpS390XOR { 23069 break 23070 } 23071 _ = or.Args[1] 23072 s1 := or.Args[0] 23073 if s1.Op != OpS390XSLDconst { 23074 break 23075 } 23076 j1 := s1.AuxInt 23077 x1 := s1.Args[0] 23078 if x1.Op != OpS390XMOVHZloadidx { 23079 break 23080 } 23081 i1 := x1.AuxInt 23082 if x1.Aux != s { 23083 break 23084 } 23085 _ = x1.Args[2] 23086 if p != x1.Args[0] { 23087 break 23088 } 23089 if idx != x1.Args[1] { 23090 break 23091 } 23092 if mem != x1.Args[2] { 23093 break 23094 } 23095 y := or.Args[1] 23096 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)) { 23097 break 23098 } 23099 b = mergePoint(b, x0, x1) 23100 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23101 v.reset(OpCopy) 23102 v.AddArg(v0) 23103 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23104 v1.AuxInt = j1 23105 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23106 v2.AuxInt = i0 23107 v2.Aux = s 23108 v2.AddArg(p) 23109 v2.AddArg(idx) 23110 v2.AddArg(mem) 23111 v1.AddArg(v2) 23112 v0.AddArg(v1) 23113 v0.AddArg(y) 23114 return true 23115 } 23116 // 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)) 23117 // 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) 23118 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23119 for { 23120 _ = v.Args[1] 23121 s0 := v.Args[0] 23122 if s0.Op != OpS390XSLDconst { 23123 break 23124 } 23125 j0 := s0.AuxInt 23126 x0 := s0.Args[0] 23127 if x0.Op != OpS390XMOVHZloadidx { 23128 break 23129 } 23130 i0 := x0.AuxInt 23131 s := x0.Aux 23132 _ = x0.Args[2] 23133 idx := x0.Args[0] 23134 p := x0.Args[1] 23135 mem := x0.Args[2] 23136 or := v.Args[1] 23137 if or.Op != OpS390XOR { 23138 break 23139 } 23140 _ = or.Args[1] 23141 s1 := or.Args[0] 23142 if s1.Op != OpS390XSLDconst { 23143 break 23144 } 23145 j1 := s1.AuxInt 23146 x1 := s1.Args[0] 23147 if x1.Op != OpS390XMOVHZloadidx { 23148 break 23149 } 23150 i1 := x1.AuxInt 23151 if x1.Aux != s { 23152 break 23153 } 23154 _ = x1.Args[2] 23155 if p != x1.Args[0] { 23156 break 23157 } 23158 if idx != x1.Args[1] { 23159 break 23160 } 23161 if mem != x1.Args[2] { 23162 break 23163 } 23164 y := or.Args[1] 23165 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)) { 23166 break 23167 } 23168 b = mergePoint(b, x0, x1) 23169 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23170 v.reset(OpCopy) 23171 v.AddArg(v0) 23172 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23173 v1.AuxInt = j1 23174 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23175 v2.AuxInt = i0 23176 v2.Aux = s 23177 v2.AddArg(p) 23178 v2.AddArg(idx) 23179 v2.AddArg(mem) 23180 v1.AddArg(v2) 23181 v0.AddArg(v1) 23182 v0.AddArg(y) 23183 return true 23184 } 23185 // 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)) 23186 // 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) 23187 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23188 for { 23189 _ = v.Args[1] 23190 s0 := v.Args[0] 23191 if s0.Op != OpS390XSLDconst { 23192 break 23193 } 23194 j0 := s0.AuxInt 23195 x0 := s0.Args[0] 23196 if x0.Op != OpS390XMOVHZloadidx { 23197 break 23198 } 23199 i0 := x0.AuxInt 23200 s := x0.Aux 23201 _ = x0.Args[2] 23202 p := x0.Args[0] 23203 idx := x0.Args[1] 23204 mem := x0.Args[2] 23205 or := v.Args[1] 23206 if or.Op != OpS390XOR { 23207 break 23208 } 23209 _ = or.Args[1] 23210 s1 := or.Args[0] 23211 if s1.Op != OpS390XSLDconst { 23212 break 23213 } 23214 j1 := s1.AuxInt 23215 x1 := s1.Args[0] 23216 if x1.Op != OpS390XMOVHZloadidx { 23217 break 23218 } 23219 i1 := x1.AuxInt 23220 if x1.Aux != s { 23221 break 23222 } 23223 _ = x1.Args[2] 23224 if idx != x1.Args[0] { 23225 break 23226 } 23227 if p != x1.Args[1] { 23228 break 23229 } 23230 if mem != x1.Args[2] { 23231 break 23232 } 23233 y := or.Args[1] 23234 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)) { 23235 break 23236 } 23237 b = mergePoint(b, x0, x1) 23238 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23239 v.reset(OpCopy) 23240 v.AddArg(v0) 23241 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23242 v1.AuxInt = j1 23243 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23244 v2.AuxInt = i0 23245 v2.Aux = s 23246 v2.AddArg(p) 23247 v2.AddArg(idx) 23248 v2.AddArg(mem) 23249 v1.AddArg(v2) 23250 v0.AddArg(v1) 23251 v0.AddArg(y) 23252 return true 23253 } 23254 // 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)) 23255 // 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) 23256 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23257 for { 23258 _ = v.Args[1] 23259 s0 := v.Args[0] 23260 if s0.Op != OpS390XSLDconst { 23261 break 23262 } 23263 j0 := s0.AuxInt 23264 x0 := s0.Args[0] 23265 if x0.Op != OpS390XMOVHZloadidx { 23266 break 23267 } 23268 i0 := x0.AuxInt 23269 s := x0.Aux 23270 _ = x0.Args[2] 23271 idx := x0.Args[0] 23272 p := x0.Args[1] 23273 mem := x0.Args[2] 23274 or := v.Args[1] 23275 if or.Op != OpS390XOR { 23276 break 23277 } 23278 _ = or.Args[1] 23279 s1 := or.Args[0] 23280 if s1.Op != OpS390XSLDconst { 23281 break 23282 } 23283 j1 := s1.AuxInt 23284 x1 := s1.Args[0] 23285 if x1.Op != OpS390XMOVHZloadidx { 23286 break 23287 } 23288 i1 := x1.AuxInt 23289 if x1.Aux != s { 23290 break 23291 } 23292 _ = x1.Args[2] 23293 if idx != x1.Args[0] { 23294 break 23295 } 23296 if p != x1.Args[1] { 23297 break 23298 } 23299 if mem != x1.Args[2] { 23300 break 23301 } 23302 y := or.Args[1] 23303 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)) { 23304 break 23305 } 23306 b = mergePoint(b, x0, x1) 23307 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23308 v.reset(OpCopy) 23309 v.AddArg(v0) 23310 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23311 v1.AuxInt = j1 23312 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23313 v2.AuxInt = i0 23314 v2.Aux = s 23315 v2.AddArg(p) 23316 v2.AddArg(idx) 23317 v2.AddArg(mem) 23318 v1.AddArg(v2) 23319 v0.AddArg(v1) 23320 v0.AddArg(y) 23321 return true 23322 } 23323 // 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)))) 23324 // 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) 23325 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23326 for { 23327 _ = v.Args[1] 23328 s0 := v.Args[0] 23329 if s0.Op != OpS390XSLDconst { 23330 break 23331 } 23332 j0 := s0.AuxInt 23333 x0 := s0.Args[0] 23334 if x0.Op != OpS390XMOVHZloadidx { 23335 break 23336 } 23337 i0 := x0.AuxInt 23338 s := x0.Aux 23339 _ = x0.Args[2] 23340 p := x0.Args[0] 23341 idx := x0.Args[1] 23342 mem := x0.Args[2] 23343 or := v.Args[1] 23344 if or.Op != OpS390XOR { 23345 break 23346 } 23347 _ = or.Args[1] 23348 y := or.Args[0] 23349 s1 := or.Args[1] 23350 if s1.Op != OpS390XSLDconst { 23351 break 23352 } 23353 j1 := s1.AuxInt 23354 x1 := s1.Args[0] 23355 if x1.Op != OpS390XMOVHZloadidx { 23356 break 23357 } 23358 i1 := x1.AuxInt 23359 if x1.Aux != s { 23360 break 23361 } 23362 _ = x1.Args[2] 23363 if p != x1.Args[0] { 23364 break 23365 } 23366 if idx != x1.Args[1] { 23367 break 23368 } 23369 if mem != x1.Args[2] { 23370 break 23371 } 23372 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)) { 23373 break 23374 } 23375 b = mergePoint(b, x0, x1) 23376 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23377 v.reset(OpCopy) 23378 v.AddArg(v0) 23379 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23380 v1.AuxInt = j1 23381 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23382 v2.AuxInt = i0 23383 v2.Aux = s 23384 v2.AddArg(p) 23385 v2.AddArg(idx) 23386 v2.AddArg(mem) 23387 v1.AddArg(v2) 23388 v0.AddArg(v1) 23389 v0.AddArg(y) 23390 return true 23391 } 23392 return false 23393 } 23394 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 23395 b := v.Block 23396 _ = b 23397 typ := &b.Func.Config.Types 23398 _ = typ 23399 // 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)))) 23400 // 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) 23401 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23402 for { 23403 _ = v.Args[1] 23404 s0 := v.Args[0] 23405 if s0.Op != OpS390XSLDconst { 23406 break 23407 } 23408 j0 := s0.AuxInt 23409 x0 := s0.Args[0] 23410 if x0.Op != OpS390XMOVHZloadidx { 23411 break 23412 } 23413 i0 := x0.AuxInt 23414 s := x0.Aux 23415 _ = x0.Args[2] 23416 idx := x0.Args[0] 23417 p := x0.Args[1] 23418 mem := x0.Args[2] 23419 or := v.Args[1] 23420 if or.Op != OpS390XOR { 23421 break 23422 } 23423 _ = or.Args[1] 23424 y := or.Args[0] 23425 s1 := or.Args[1] 23426 if s1.Op != OpS390XSLDconst { 23427 break 23428 } 23429 j1 := s1.AuxInt 23430 x1 := s1.Args[0] 23431 if x1.Op != OpS390XMOVHZloadidx { 23432 break 23433 } 23434 i1 := x1.AuxInt 23435 if x1.Aux != s { 23436 break 23437 } 23438 _ = x1.Args[2] 23439 if p != x1.Args[0] { 23440 break 23441 } 23442 if idx != x1.Args[1] { 23443 break 23444 } 23445 if mem != x1.Args[2] { 23446 break 23447 } 23448 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)) { 23449 break 23450 } 23451 b = mergePoint(b, x0, x1) 23452 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23453 v.reset(OpCopy) 23454 v.AddArg(v0) 23455 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23456 v1.AuxInt = j1 23457 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23458 v2.AuxInt = i0 23459 v2.Aux = s 23460 v2.AddArg(p) 23461 v2.AddArg(idx) 23462 v2.AddArg(mem) 23463 v1.AddArg(v2) 23464 v0.AddArg(v1) 23465 v0.AddArg(y) 23466 return true 23467 } 23468 // 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)))) 23469 // 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) 23470 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23471 for { 23472 _ = v.Args[1] 23473 s0 := v.Args[0] 23474 if s0.Op != OpS390XSLDconst { 23475 break 23476 } 23477 j0 := s0.AuxInt 23478 x0 := s0.Args[0] 23479 if x0.Op != OpS390XMOVHZloadidx { 23480 break 23481 } 23482 i0 := x0.AuxInt 23483 s := x0.Aux 23484 _ = x0.Args[2] 23485 p := x0.Args[0] 23486 idx := x0.Args[1] 23487 mem := x0.Args[2] 23488 or := v.Args[1] 23489 if or.Op != OpS390XOR { 23490 break 23491 } 23492 _ = or.Args[1] 23493 y := or.Args[0] 23494 s1 := or.Args[1] 23495 if s1.Op != OpS390XSLDconst { 23496 break 23497 } 23498 j1 := s1.AuxInt 23499 x1 := s1.Args[0] 23500 if x1.Op != OpS390XMOVHZloadidx { 23501 break 23502 } 23503 i1 := x1.AuxInt 23504 if x1.Aux != s { 23505 break 23506 } 23507 _ = x1.Args[2] 23508 if idx != x1.Args[0] { 23509 break 23510 } 23511 if p != x1.Args[1] { 23512 break 23513 } 23514 if mem != x1.Args[2] { 23515 break 23516 } 23517 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)) { 23518 break 23519 } 23520 b = mergePoint(b, x0, x1) 23521 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23522 v.reset(OpCopy) 23523 v.AddArg(v0) 23524 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23525 v1.AuxInt = j1 23526 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23527 v2.AuxInt = i0 23528 v2.Aux = s 23529 v2.AddArg(p) 23530 v2.AddArg(idx) 23531 v2.AddArg(mem) 23532 v1.AddArg(v2) 23533 v0.AddArg(v1) 23534 v0.AddArg(y) 23535 return true 23536 } 23537 // 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)))) 23538 // 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) 23539 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23540 for { 23541 _ = v.Args[1] 23542 s0 := v.Args[0] 23543 if s0.Op != OpS390XSLDconst { 23544 break 23545 } 23546 j0 := s0.AuxInt 23547 x0 := s0.Args[0] 23548 if x0.Op != OpS390XMOVHZloadidx { 23549 break 23550 } 23551 i0 := x0.AuxInt 23552 s := x0.Aux 23553 _ = x0.Args[2] 23554 idx := x0.Args[0] 23555 p := x0.Args[1] 23556 mem := x0.Args[2] 23557 or := v.Args[1] 23558 if or.Op != OpS390XOR { 23559 break 23560 } 23561 _ = or.Args[1] 23562 y := or.Args[0] 23563 s1 := or.Args[1] 23564 if s1.Op != OpS390XSLDconst { 23565 break 23566 } 23567 j1 := s1.AuxInt 23568 x1 := s1.Args[0] 23569 if x1.Op != OpS390XMOVHZloadidx { 23570 break 23571 } 23572 i1 := x1.AuxInt 23573 if x1.Aux != s { 23574 break 23575 } 23576 _ = x1.Args[2] 23577 if idx != x1.Args[0] { 23578 break 23579 } 23580 if p != x1.Args[1] { 23581 break 23582 } 23583 if mem != x1.Args[2] { 23584 break 23585 } 23586 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)) { 23587 break 23588 } 23589 b = mergePoint(b, x0, x1) 23590 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23591 v.reset(OpCopy) 23592 v.AddArg(v0) 23593 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23594 v1.AuxInt = j1 23595 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23596 v2.AuxInt = i0 23597 v2.Aux = s 23598 v2.AddArg(p) 23599 v2.AddArg(idx) 23600 v2.AddArg(mem) 23601 v1.AddArg(v2) 23602 v0.AddArg(v1) 23603 v0.AddArg(y) 23604 return true 23605 } 23606 // 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))) 23607 // 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) 23608 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23609 for { 23610 _ = v.Args[1] 23611 or := v.Args[0] 23612 if or.Op != OpS390XOR { 23613 break 23614 } 23615 _ = or.Args[1] 23616 s1 := or.Args[0] 23617 if s1.Op != OpS390XSLDconst { 23618 break 23619 } 23620 j1 := s1.AuxInt 23621 x1 := s1.Args[0] 23622 if x1.Op != OpS390XMOVHZloadidx { 23623 break 23624 } 23625 i1 := x1.AuxInt 23626 s := x1.Aux 23627 _ = x1.Args[2] 23628 p := x1.Args[0] 23629 idx := x1.Args[1] 23630 mem := x1.Args[2] 23631 y := or.Args[1] 23632 s0 := v.Args[1] 23633 if s0.Op != OpS390XSLDconst { 23634 break 23635 } 23636 j0 := s0.AuxInt 23637 x0 := s0.Args[0] 23638 if x0.Op != OpS390XMOVHZloadidx { 23639 break 23640 } 23641 i0 := x0.AuxInt 23642 if x0.Aux != s { 23643 break 23644 } 23645 _ = x0.Args[2] 23646 if p != x0.Args[0] { 23647 break 23648 } 23649 if idx != x0.Args[1] { 23650 break 23651 } 23652 if mem != x0.Args[2] { 23653 break 23654 } 23655 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)) { 23656 break 23657 } 23658 b = mergePoint(b, x0, x1) 23659 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23660 v.reset(OpCopy) 23661 v.AddArg(v0) 23662 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23663 v1.AuxInt = j1 23664 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23665 v2.AuxInt = i0 23666 v2.Aux = s 23667 v2.AddArg(p) 23668 v2.AddArg(idx) 23669 v2.AddArg(mem) 23670 v1.AddArg(v2) 23671 v0.AddArg(v1) 23672 v0.AddArg(y) 23673 return true 23674 } 23675 // 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))) 23676 // 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) 23677 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23678 for { 23679 _ = v.Args[1] 23680 or := v.Args[0] 23681 if or.Op != OpS390XOR { 23682 break 23683 } 23684 _ = or.Args[1] 23685 s1 := or.Args[0] 23686 if s1.Op != OpS390XSLDconst { 23687 break 23688 } 23689 j1 := s1.AuxInt 23690 x1 := s1.Args[0] 23691 if x1.Op != OpS390XMOVHZloadidx { 23692 break 23693 } 23694 i1 := x1.AuxInt 23695 s := x1.Aux 23696 _ = x1.Args[2] 23697 idx := x1.Args[0] 23698 p := x1.Args[1] 23699 mem := x1.Args[2] 23700 y := or.Args[1] 23701 s0 := v.Args[1] 23702 if s0.Op != OpS390XSLDconst { 23703 break 23704 } 23705 j0 := s0.AuxInt 23706 x0 := s0.Args[0] 23707 if x0.Op != OpS390XMOVHZloadidx { 23708 break 23709 } 23710 i0 := x0.AuxInt 23711 if x0.Aux != s { 23712 break 23713 } 23714 _ = x0.Args[2] 23715 if p != x0.Args[0] { 23716 break 23717 } 23718 if idx != x0.Args[1] { 23719 break 23720 } 23721 if mem != x0.Args[2] { 23722 break 23723 } 23724 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)) { 23725 break 23726 } 23727 b = mergePoint(b, x0, x1) 23728 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23729 v.reset(OpCopy) 23730 v.AddArg(v0) 23731 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23732 v1.AuxInt = j1 23733 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23734 v2.AuxInt = i0 23735 v2.Aux = s 23736 v2.AddArg(p) 23737 v2.AddArg(idx) 23738 v2.AddArg(mem) 23739 v1.AddArg(v2) 23740 v0.AddArg(v1) 23741 v0.AddArg(y) 23742 return true 23743 } 23744 // 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))) 23745 // 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) 23746 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23747 for { 23748 _ = v.Args[1] 23749 or := v.Args[0] 23750 if or.Op != OpS390XOR { 23751 break 23752 } 23753 _ = or.Args[1] 23754 y := or.Args[0] 23755 s1 := or.Args[1] 23756 if s1.Op != OpS390XSLDconst { 23757 break 23758 } 23759 j1 := s1.AuxInt 23760 x1 := s1.Args[0] 23761 if x1.Op != OpS390XMOVHZloadidx { 23762 break 23763 } 23764 i1 := x1.AuxInt 23765 s := x1.Aux 23766 _ = x1.Args[2] 23767 p := x1.Args[0] 23768 idx := x1.Args[1] 23769 mem := x1.Args[2] 23770 s0 := v.Args[1] 23771 if s0.Op != OpS390XSLDconst { 23772 break 23773 } 23774 j0 := s0.AuxInt 23775 x0 := s0.Args[0] 23776 if x0.Op != OpS390XMOVHZloadidx { 23777 break 23778 } 23779 i0 := x0.AuxInt 23780 if x0.Aux != s { 23781 break 23782 } 23783 _ = x0.Args[2] 23784 if p != x0.Args[0] { 23785 break 23786 } 23787 if idx != x0.Args[1] { 23788 break 23789 } 23790 if mem != x0.Args[2] { 23791 break 23792 } 23793 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)) { 23794 break 23795 } 23796 b = mergePoint(b, x0, x1) 23797 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23798 v.reset(OpCopy) 23799 v.AddArg(v0) 23800 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23801 v1.AuxInt = j1 23802 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23803 v2.AuxInt = i0 23804 v2.Aux = s 23805 v2.AddArg(p) 23806 v2.AddArg(idx) 23807 v2.AddArg(mem) 23808 v1.AddArg(v2) 23809 v0.AddArg(v1) 23810 v0.AddArg(y) 23811 return true 23812 } 23813 // 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))) 23814 // 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) 23815 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23816 for { 23817 _ = v.Args[1] 23818 or := v.Args[0] 23819 if or.Op != OpS390XOR { 23820 break 23821 } 23822 _ = or.Args[1] 23823 y := or.Args[0] 23824 s1 := or.Args[1] 23825 if s1.Op != OpS390XSLDconst { 23826 break 23827 } 23828 j1 := s1.AuxInt 23829 x1 := s1.Args[0] 23830 if x1.Op != OpS390XMOVHZloadidx { 23831 break 23832 } 23833 i1 := x1.AuxInt 23834 s := x1.Aux 23835 _ = x1.Args[2] 23836 idx := x1.Args[0] 23837 p := x1.Args[1] 23838 mem := x1.Args[2] 23839 s0 := v.Args[1] 23840 if s0.Op != OpS390XSLDconst { 23841 break 23842 } 23843 j0 := s0.AuxInt 23844 x0 := s0.Args[0] 23845 if x0.Op != OpS390XMOVHZloadidx { 23846 break 23847 } 23848 i0 := x0.AuxInt 23849 if x0.Aux != s { 23850 break 23851 } 23852 _ = x0.Args[2] 23853 if p != x0.Args[0] { 23854 break 23855 } 23856 if idx != x0.Args[1] { 23857 break 23858 } 23859 if mem != x0.Args[2] { 23860 break 23861 } 23862 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)) { 23863 break 23864 } 23865 b = mergePoint(b, x0, x1) 23866 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23867 v.reset(OpCopy) 23868 v.AddArg(v0) 23869 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23870 v1.AuxInt = j1 23871 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23872 v2.AuxInt = i0 23873 v2.Aux = s 23874 v2.AddArg(p) 23875 v2.AddArg(idx) 23876 v2.AddArg(mem) 23877 v1.AddArg(v2) 23878 v0.AddArg(v1) 23879 v0.AddArg(y) 23880 return true 23881 } 23882 // 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))) 23883 // 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) 23884 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23885 for { 23886 _ = v.Args[1] 23887 or := v.Args[0] 23888 if or.Op != OpS390XOR { 23889 break 23890 } 23891 _ = or.Args[1] 23892 s1 := or.Args[0] 23893 if s1.Op != OpS390XSLDconst { 23894 break 23895 } 23896 j1 := s1.AuxInt 23897 x1 := s1.Args[0] 23898 if x1.Op != OpS390XMOVHZloadidx { 23899 break 23900 } 23901 i1 := x1.AuxInt 23902 s := x1.Aux 23903 _ = x1.Args[2] 23904 p := x1.Args[0] 23905 idx := x1.Args[1] 23906 mem := x1.Args[2] 23907 y := or.Args[1] 23908 s0 := v.Args[1] 23909 if s0.Op != OpS390XSLDconst { 23910 break 23911 } 23912 j0 := s0.AuxInt 23913 x0 := s0.Args[0] 23914 if x0.Op != OpS390XMOVHZloadidx { 23915 break 23916 } 23917 i0 := x0.AuxInt 23918 if x0.Aux != s { 23919 break 23920 } 23921 _ = x0.Args[2] 23922 if idx != x0.Args[0] { 23923 break 23924 } 23925 if p != x0.Args[1] { 23926 break 23927 } 23928 if mem != x0.Args[2] { 23929 break 23930 } 23931 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)) { 23932 break 23933 } 23934 b = mergePoint(b, x0, x1) 23935 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23936 v.reset(OpCopy) 23937 v.AddArg(v0) 23938 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23939 v1.AuxInt = j1 23940 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23941 v2.AuxInt = i0 23942 v2.Aux = s 23943 v2.AddArg(p) 23944 v2.AddArg(idx) 23945 v2.AddArg(mem) 23946 v1.AddArg(v2) 23947 v0.AddArg(v1) 23948 v0.AddArg(y) 23949 return true 23950 } 23951 // 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))) 23952 // 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) 23953 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23954 for { 23955 _ = v.Args[1] 23956 or := v.Args[0] 23957 if or.Op != OpS390XOR { 23958 break 23959 } 23960 _ = or.Args[1] 23961 s1 := or.Args[0] 23962 if s1.Op != OpS390XSLDconst { 23963 break 23964 } 23965 j1 := s1.AuxInt 23966 x1 := s1.Args[0] 23967 if x1.Op != OpS390XMOVHZloadidx { 23968 break 23969 } 23970 i1 := x1.AuxInt 23971 s := x1.Aux 23972 _ = x1.Args[2] 23973 idx := x1.Args[0] 23974 p := x1.Args[1] 23975 mem := x1.Args[2] 23976 y := or.Args[1] 23977 s0 := v.Args[1] 23978 if s0.Op != OpS390XSLDconst { 23979 break 23980 } 23981 j0 := s0.AuxInt 23982 x0 := s0.Args[0] 23983 if x0.Op != OpS390XMOVHZloadidx { 23984 break 23985 } 23986 i0 := x0.AuxInt 23987 if x0.Aux != s { 23988 break 23989 } 23990 _ = x0.Args[2] 23991 if idx != x0.Args[0] { 23992 break 23993 } 23994 if p != x0.Args[1] { 23995 break 23996 } 23997 if mem != x0.Args[2] { 23998 break 23999 } 24000 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)) { 24001 break 24002 } 24003 b = mergePoint(b, x0, x1) 24004 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24005 v.reset(OpCopy) 24006 v.AddArg(v0) 24007 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24008 v1.AuxInt = j1 24009 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24010 v2.AuxInt = i0 24011 v2.Aux = s 24012 v2.AddArg(p) 24013 v2.AddArg(idx) 24014 v2.AddArg(mem) 24015 v1.AddArg(v2) 24016 v0.AddArg(v1) 24017 v0.AddArg(y) 24018 return true 24019 } 24020 // 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))) 24021 // 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) 24022 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24023 for { 24024 _ = v.Args[1] 24025 or := v.Args[0] 24026 if or.Op != OpS390XOR { 24027 break 24028 } 24029 _ = or.Args[1] 24030 y := or.Args[0] 24031 s1 := or.Args[1] 24032 if s1.Op != OpS390XSLDconst { 24033 break 24034 } 24035 j1 := s1.AuxInt 24036 x1 := s1.Args[0] 24037 if x1.Op != OpS390XMOVHZloadidx { 24038 break 24039 } 24040 i1 := x1.AuxInt 24041 s := x1.Aux 24042 _ = x1.Args[2] 24043 p := x1.Args[0] 24044 idx := x1.Args[1] 24045 mem := x1.Args[2] 24046 s0 := v.Args[1] 24047 if s0.Op != OpS390XSLDconst { 24048 break 24049 } 24050 j0 := s0.AuxInt 24051 x0 := s0.Args[0] 24052 if x0.Op != OpS390XMOVHZloadidx { 24053 break 24054 } 24055 i0 := x0.AuxInt 24056 if x0.Aux != s { 24057 break 24058 } 24059 _ = x0.Args[2] 24060 if idx != x0.Args[0] { 24061 break 24062 } 24063 if p != x0.Args[1] { 24064 break 24065 } 24066 if mem != x0.Args[2] { 24067 break 24068 } 24069 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)) { 24070 break 24071 } 24072 b = mergePoint(b, x0, x1) 24073 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24074 v.reset(OpCopy) 24075 v.AddArg(v0) 24076 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24077 v1.AuxInt = j1 24078 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24079 v2.AuxInt = i0 24080 v2.Aux = s 24081 v2.AddArg(p) 24082 v2.AddArg(idx) 24083 v2.AddArg(mem) 24084 v1.AddArg(v2) 24085 v0.AddArg(v1) 24086 v0.AddArg(y) 24087 return true 24088 } 24089 return false 24090 } 24091 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 24092 b := v.Block 24093 _ = b 24094 typ := &b.Func.Config.Types 24095 _ = typ 24096 // 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))) 24097 // 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) 24098 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24099 for { 24100 _ = v.Args[1] 24101 or := v.Args[0] 24102 if or.Op != OpS390XOR { 24103 break 24104 } 24105 _ = or.Args[1] 24106 y := or.Args[0] 24107 s1 := or.Args[1] 24108 if s1.Op != OpS390XSLDconst { 24109 break 24110 } 24111 j1 := s1.AuxInt 24112 x1 := s1.Args[0] 24113 if x1.Op != OpS390XMOVHZloadidx { 24114 break 24115 } 24116 i1 := x1.AuxInt 24117 s := x1.Aux 24118 _ = x1.Args[2] 24119 idx := x1.Args[0] 24120 p := x1.Args[1] 24121 mem := x1.Args[2] 24122 s0 := v.Args[1] 24123 if s0.Op != OpS390XSLDconst { 24124 break 24125 } 24126 j0 := s0.AuxInt 24127 x0 := s0.Args[0] 24128 if x0.Op != OpS390XMOVHZloadidx { 24129 break 24130 } 24131 i0 := x0.AuxInt 24132 if x0.Aux != s { 24133 break 24134 } 24135 _ = x0.Args[2] 24136 if idx != x0.Args[0] { 24137 break 24138 } 24139 if p != x0.Args[1] { 24140 break 24141 } 24142 if mem != x0.Args[2] { 24143 break 24144 } 24145 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)) { 24146 break 24147 } 24148 b = mergePoint(b, x0, x1) 24149 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24150 v.reset(OpCopy) 24151 v.AddArg(v0) 24152 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24153 v1.AuxInt = j1 24154 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24155 v2.AuxInt = i0 24156 v2.Aux = s 24157 v2.AddArg(p) 24158 v2.AddArg(idx) 24159 v2.AddArg(mem) 24160 v1.AddArg(v2) 24161 v0.AddArg(v1) 24162 v0.AddArg(y) 24163 return true 24164 } 24165 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 24166 // 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) 24167 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24168 for { 24169 _ = v.Args[1] 24170 x0 := v.Args[0] 24171 if x0.Op != OpS390XMOVBZload { 24172 break 24173 } 24174 i0 := x0.AuxInt 24175 s := x0.Aux 24176 _ = x0.Args[1] 24177 p := x0.Args[0] 24178 mem := x0.Args[1] 24179 sh := v.Args[1] 24180 if sh.Op != OpS390XSLDconst { 24181 break 24182 } 24183 if sh.AuxInt != 8 { 24184 break 24185 } 24186 x1 := sh.Args[0] 24187 if x1.Op != OpS390XMOVBZload { 24188 break 24189 } 24190 i1 := x1.AuxInt 24191 if x1.Aux != s { 24192 break 24193 } 24194 _ = x1.Args[1] 24195 if p != x1.Args[0] { 24196 break 24197 } 24198 if mem != x1.Args[1] { 24199 break 24200 } 24201 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)) { 24202 break 24203 } 24204 b = mergePoint(b, x0, x1) 24205 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24206 v.reset(OpCopy) 24207 v.AddArg(v0) 24208 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24209 v1.AuxInt = i0 24210 v1.Aux = s 24211 v1.AddArg(p) 24212 v1.AddArg(mem) 24213 v0.AddArg(v1) 24214 return true 24215 } 24216 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 24217 // 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) 24218 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24219 for { 24220 _ = v.Args[1] 24221 sh := v.Args[0] 24222 if sh.Op != OpS390XSLDconst { 24223 break 24224 } 24225 if sh.AuxInt != 8 { 24226 break 24227 } 24228 x1 := sh.Args[0] 24229 if x1.Op != OpS390XMOVBZload { 24230 break 24231 } 24232 i1 := x1.AuxInt 24233 s := x1.Aux 24234 _ = x1.Args[1] 24235 p := x1.Args[0] 24236 mem := x1.Args[1] 24237 x0 := v.Args[1] 24238 if x0.Op != OpS390XMOVBZload { 24239 break 24240 } 24241 i0 := x0.AuxInt 24242 if x0.Aux != s { 24243 break 24244 } 24245 _ = x0.Args[1] 24246 if p != x0.Args[0] { 24247 break 24248 } 24249 if mem != x0.Args[1] { 24250 break 24251 } 24252 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)) { 24253 break 24254 } 24255 b = mergePoint(b, x0, x1) 24256 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24257 v.reset(OpCopy) 24258 v.AddArg(v0) 24259 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24260 v1.AuxInt = i0 24261 v1.Aux = s 24262 v1.AddArg(p) 24263 v1.AddArg(mem) 24264 v0.AddArg(v1) 24265 return true 24266 } 24267 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 24268 // 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) 24269 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24270 for { 24271 _ = v.Args[1] 24272 r0 := v.Args[0] 24273 if r0.Op != OpS390XMOVHZreg { 24274 break 24275 } 24276 x0 := r0.Args[0] 24277 if x0.Op != OpS390XMOVHBRload { 24278 break 24279 } 24280 i0 := x0.AuxInt 24281 s := x0.Aux 24282 _ = x0.Args[1] 24283 p := x0.Args[0] 24284 mem := x0.Args[1] 24285 sh := v.Args[1] 24286 if sh.Op != OpS390XSLDconst { 24287 break 24288 } 24289 if sh.AuxInt != 16 { 24290 break 24291 } 24292 r1 := sh.Args[0] 24293 if r1.Op != OpS390XMOVHZreg { 24294 break 24295 } 24296 x1 := r1.Args[0] 24297 if x1.Op != OpS390XMOVHBRload { 24298 break 24299 } 24300 i1 := x1.AuxInt 24301 if x1.Aux != s { 24302 break 24303 } 24304 _ = x1.Args[1] 24305 if p != x1.Args[0] { 24306 break 24307 } 24308 if mem != x1.Args[1] { 24309 break 24310 } 24311 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)) { 24312 break 24313 } 24314 b = mergePoint(b, x0, x1) 24315 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24316 v.reset(OpCopy) 24317 v.AddArg(v0) 24318 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24319 v1.AuxInt = i0 24320 v1.Aux = s 24321 v1.AddArg(p) 24322 v1.AddArg(mem) 24323 v0.AddArg(v1) 24324 return true 24325 } 24326 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 24327 // 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) 24328 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24329 for { 24330 _ = v.Args[1] 24331 sh := v.Args[0] 24332 if sh.Op != OpS390XSLDconst { 24333 break 24334 } 24335 if sh.AuxInt != 16 { 24336 break 24337 } 24338 r1 := sh.Args[0] 24339 if r1.Op != OpS390XMOVHZreg { 24340 break 24341 } 24342 x1 := r1.Args[0] 24343 if x1.Op != OpS390XMOVHBRload { 24344 break 24345 } 24346 i1 := x1.AuxInt 24347 s := x1.Aux 24348 _ = x1.Args[1] 24349 p := x1.Args[0] 24350 mem := x1.Args[1] 24351 r0 := v.Args[1] 24352 if r0.Op != OpS390XMOVHZreg { 24353 break 24354 } 24355 x0 := r0.Args[0] 24356 if x0.Op != OpS390XMOVHBRload { 24357 break 24358 } 24359 i0 := x0.AuxInt 24360 if x0.Aux != s { 24361 break 24362 } 24363 _ = x0.Args[1] 24364 if p != x0.Args[0] { 24365 break 24366 } 24367 if mem != x0.Args[1] { 24368 break 24369 } 24370 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)) { 24371 break 24372 } 24373 b = mergePoint(b, x0, x1) 24374 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24375 v.reset(OpCopy) 24376 v.AddArg(v0) 24377 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24378 v1.AuxInt = i0 24379 v1.Aux = s 24380 v1.AddArg(p) 24381 v1.AddArg(mem) 24382 v0.AddArg(v1) 24383 return true 24384 } 24385 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 24386 // 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) 24387 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24388 for { 24389 _ = v.Args[1] 24390 r0 := v.Args[0] 24391 if r0.Op != OpS390XMOVWZreg { 24392 break 24393 } 24394 x0 := r0.Args[0] 24395 if x0.Op != OpS390XMOVWBRload { 24396 break 24397 } 24398 i0 := x0.AuxInt 24399 s := x0.Aux 24400 _ = x0.Args[1] 24401 p := x0.Args[0] 24402 mem := x0.Args[1] 24403 sh := v.Args[1] 24404 if sh.Op != OpS390XSLDconst { 24405 break 24406 } 24407 if sh.AuxInt != 32 { 24408 break 24409 } 24410 r1 := sh.Args[0] 24411 if r1.Op != OpS390XMOVWZreg { 24412 break 24413 } 24414 x1 := r1.Args[0] 24415 if x1.Op != OpS390XMOVWBRload { 24416 break 24417 } 24418 i1 := x1.AuxInt 24419 if x1.Aux != s { 24420 break 24421 } 24422 _ = x1.Args[1] 24423 if p != x1.Args[0] { 24424 break 24425 } 24426 if mem != x1.Args[1] { 24427 break 24428 } 24429 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)) { 24430 break 24431 } 24432 b = mergePoint(b, x0, x1) 24433 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24434 v.reset(OpCopy) 24435 v.AddArg(v0) 24436 v0.AuxInt = i0 24437 v0.Aux = s 24438 v0.AddArg(p) 24439 v0.AddArg(mem) 24440 return true 24441 } 24442 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 24443 // 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) 24444 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24445 for { 24446 _ = v.Args[1] 24447 sh := v.Args[0] 24448 if sh.Op != OpS390XSLDconst { 24449 break 24450 } 24451 if sh.AuxInt != 32 { 24452 break 24453 } 24454 r1 := sh.Args[0] 24455 if r1.Op != OpS390XMOVWZreg { 24456 break 24457 } 24458 x1 := r1.Args[0] 24459 if x1.Op != OpS390XMOVWBRload { 24460 break 24461 } 24462 i1 := x1.AuxInt 24463 s := x1.Aux 24464 _ = x1.Args[1] 24465 p := x1.Args[0] 24466 mem := x1.Args[1] 24467 r0 := v.Args[1] 24468 if r0.Op != OpS390XMOVWZreg { 24469 break 24470 } 24471 x0 := r0.Args[0] 24472 if x0.Op != OpS390XMOVWBRload { 24473 break 24474 } 24475 i0 := x0.AuxInt 24476 if x0.Aux != s { 24477 break 24478 } 24479 _ = x0.Args[1] 24480 if p != x0.Args[0] { 24481 break 24482 } 24483 if mem != x0.Args[1] { 24484 break 24485 } 24486 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)) { 24487 break 24488 } 24489 b = mergePoint(b, x0, x1) 24490 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24491 v.reset(OpCopy) 24492 v.AddArg(v0) 24493 v0.AuxInt = i0 24494 v0.Aux = s 24495 v0.AddArg(p) 24496 v0.AddArg(mem) 24497 return true 24498 } 24499 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 24500 // 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) 24501 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24502 for { 24503 _ = v.Args[1] 24504 s1 := v.Args[0] 24505 if s1.Op != OpS390XSLDconst { 24506 break 24507 } 24508 j1 := s1.AuxInt 24509 x1 := s1.Args[0] 24510 if x1.Op != OpS390XMOVBZload { 24511 break 24512 } 24513 i1 := x1.AuxInt 24514 s := x1.Aux 24515 _ = x1.Args[1] 24516 p := x1.Args[0] 24517 mem := x1.Args[1] 24518 or := v.Args[1] 24519 if or.Op != OpS390XOR { 24520 break 24521 } 24522 _ = or.Args[1] 24523 s0 := or.Args[0] 24524 if s0.Op != OpS390XSLDconst { 24525 break 24526 } 24527 j0 := s0.AuxInt 24528 x0 := s0.Args[0] 24529 if x0.Op != OpS390XMOVBZload { 24530 break 24531 } 24532 i0 := x0.AuxInt 24533 if x0.Aux != s { 24534 break 24535 } 24536 _ = x0.Args[1] 24537 if p != x0.Args[0] { 24538 break 24539 } 24540 if mem != x0.Args[1] { 24541 break 24542 } 24543 y := or.Args[1] 24544 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)) { 24545 break 24546 } 24547 b = mergePoint(b, x0, x1) 24548 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24549 v.reset(OpCopy) 24550 v.AddArg(v0) 24551 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24552 v1.AuxInt = j0 24553 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24554 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24555 v3.AuxInt = i0 24556 v3.Aux = s 24557 v3.AddArg(p) 24558 v3.AddArg(mem) 24559 v2.AddArg(v3) 24560 v1.AddArg(v2) 24561 v0.AddArg(v1) 24562 v0.AddArg(y) 24563 return true 24564 } 24565 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 24566 // 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) 24567 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24568 for { 24569 _ = v.Args[1] 24570 s1 := v.Args[0] 24571 if s1.Op != OpS390XSLDconst { 24572 break 24573 } 24574 j1 := s1.AuxInt 24575 x1 := s1.Args[0] 24576 if x1.Op != OpS390XMOVBZload { 24577 break 24578 } 24579 i1 := x1.AuxInt 24580 s := x1.Aux 24581 _ = x1.Args[1] 24582 p := x1.Args[0] 24583 mem := x1.Args[1] 24584 or := v.Args[1] 24585 if or.Op != OpS390XOR { 24586 break 24587 } 24588 _ = or.Args[1] 24589 y := or.Args[0] 24590 s0 := or.Args[1] 24591 if s0.Op != OpS390XSLDconst { 24592 break 24593 } 24594 j0 := s0.AuxInt 24595 x0 := s0.Args[0] 24596 if x0.Op != OpS390XMOVBZload { 24597 break 24598 } 24599 i0 := x0.AuxInt 24600 if x0.Aux != s { 24601 break 24602 } 24603 _ = x0.Args[1] 24604 if p != x0.Args[0] { 24605 break 24606 } 24607 if mem != x0.Args[1] { 24608 break 24609 } 24610 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)) { 24611 break 24612 } 24613 b = mergePoint(b, x0, x1) 24614 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24615 v.reset(OpCopy) 24616 v.AddArg(v0) 24617 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24618 v1.AuxInt = j0 24619 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24620 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24621 v3.AuxInt = i0 24622 v3.Aux = s 24623 v3.AddArg(p) 24624 v3.AddArg(mem) 24625 v2.AddArg(v3) 24626 v1.AddArg(v2) 24627 v0.AddArg(v1) 24628 v0.AddArg(y) 24629 return true 24630 } 24631 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24632 // 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) 24633 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24634 for { 24635 _ = v.Args[1] 24636 or := v.Args[0] 24637 if or.Op != OpS390XOR { 24638 break 24639 } 24640 _ = or.Args[1] 24641 s0 := or.Args[0] 24642 if s0.Op != OpS390XSLDconst { 24643 break 24644 } 24645 j0 := s0.AuxInt 24646 x0 := s0.Args[0] 24647 if x0.Op != OpS390XMOVBZload { 24648 break 24649 } 24650 i0 := x0.AuxInt 24651 s := x0.Aux 24652 _ = x0.Args[1] 24653 p := x0.Args[0] 24654 mem := x0.Args[1] 24655 y := or.Args[1] 24656 s1 := v.Args[1] 24657 if s1.Op != OpS390XSLDconst { 24658 break 24659 } 24660 j1 := s1.AuxInt 24661 x1 := s1.Args[0] 24662 if x1.Op != OpS390XMOVBZload { 24663 break 24664 } 24665 i1 := x1.AuxInt 24666 if x1.Aux != s { 24667 break 24668 } 24669 _ = x1.Args[1] 24670 if p != x1.Args[0] { 24671 break 24672 } 24673 if mem != x1.Args[1] { 24674 break 24675 } 24676 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)) { 24677 break 24678 } 24679 b = mergePoint(b, x0, x1) 24680 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24681 v.reset(OpCopy) 24682 v.AddArg(v0) 24683 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24684 v1.AuxInt = j0 24685 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24686 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24687 v3.AuxInt = i0 24688 v3.Aux = s 24689 v3.AddArg(p) 24690 v3.AddArg(mem) 24691 v2.AddArg(v3) 24692 v1.AddArg(v2) 24693 v0.AddArg(v1) 24694 v0.AddArg(y) 24695 return true 24696 } 24697 return false 24698 } 24699 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 24700 b := v.Block 24701 _ = b 24702 typ := &b.Func.Config.Types 24703 _ = typ 24704 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24705 // 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) 24706 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24707 for { 24708 _ = v.Args[1] 24709 or := v.Args[0] 24710 if or.Op != OpS390XOR { 24711 break 24712 } 24713 _ = or.Args[1] 24714 y := or.Args[0] 24715 s0 := or.Args[1] 24716 if s0.Op != OpS390XSLDconst { 24717 break 24718 } 24719 j0 := s0.AuxInt 24720 x0 := s0.Args[0] 24721 if x0.Op != OpS390XMOVBZload { 24722 break 24723 } 24724 i0 := x0.AuxInt 24725 s := x0.Aux 24726 _ = x0.Args[1] 24727 p := x0.Args[0] 24728 mem := x0.Args[1] 24729 s1 := v.Args[1] 24730 if s1.Op != OpS390XSLDconst { 24731 break 24732 } 24733 j1 := s1.AuxInt 24734 x1 := s1.Args[0] 24735 if x1.Op != OpS390XMOVBZload { 24736 break 24737 } 24738 i1 := x1.AuxInt 24739 if x1.Aux != s { 24740 break 24741 } 24742 _ = x1.Args[1] 24743 if p != x1.Args[0] { 24744 break 24745 } 24746 if mem != x1.Args[1] { 24747 break 24748 } 24749 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)) { 24750 break 24751 } 24752 b = mergePoint(b, x0, x1) 24753 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24754 v.reset(OpCopy) 24755 v.AddArg(v0) 24756 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24757 v1.AuxInt = j0 24758 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24759 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24760 v3.AuxInt = i0 24761 v3.Aux = s 24762 v3.AddArg(p) 24763 v3.AddArg(mem) 24764 v2.AddArg(v3) 24765 v1.AddArg(v2) 24766 v0.AddArg(v1) 24767 v0.AddArg(y) 24768 return true 24769 } 24770 // 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)) 24771 // 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) 24772 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24773 for { 24774 _ = v.Args[1] 24775 s1 := v.Args[0] 24776 if s1.Op != OpS390XSLDconst { 24777 break 24778 } 24779 j1 := s1.AuxInt 24780 r1 := s1.Args[0] 24781 if r1.Op != OpS390XMOVHZreg { 24782 break 24783 } 24784 x1 := r1.Args[0] 24785 if x1.Op != OpS390XMOVHBRload { 24786 break 24787 } 24788 i1 := x1.AuxInt 24789 s := x1.Aux 24790 _ = x1.Args[1] 24791 p := x1.Args[0] 24792 mem := x1.Args[1] 24793 or := v.Args[1] 24794 if or.Op != OpS390XOR { 24795 break 24796 } 24797 _ = or.Args[1] 24798 s0 := or.Args[0] 24799 if s0.Op != OpS390XSLDconst { 24800 break 24801 } 24802 j0 := s0.AuxInt 24803 r0 := s0.Args[0] 24804 if r0.Op != OpS390XMOVHZreg { 24805 break 24806 } 24807 x0 := r0.Args[0] 24808 if x0.Op != OpS390XMOVHBRload { 24809 break 24810 } 24811 i0 := x0.AuxInt 24812 if x0.Aux != s { 24813 break 24814 } 24815 _ = x0.Args[1] 24816 if p != x0.Args[0] { 24817 break 24818 } 24819 if mem != x0.Args[1] { 24820 break 24821 } 24822 y := or.Args[1] 24823 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)) { 24824 break 24825 } 24826 b = mergePoint(b, x0, x1) 24827 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24828 v.reset(OpCopy) 24829 v.AddArg(v0) 24830 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24831 v1.AuxInt = j0 24832 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24833 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24834 v3.AuxInt = i0 24835 v3.Aux = s 24836 v3.AddArg(p) 24837 v3.AddArg(mem) 24838 v2.AddArg(v3) 24839 v1.AddArg(v2) 24840 v0.AddArg(v1) 24841 v0.AddArg(y) 24842 return true 24843 } 24844 // 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))))) 24845 // 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) 24846 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24847 for { 24848 _ = v.Args[1] 24849 s1 := v.Args[0] 24850 if s1.Op != OpS390XSLDconst { 24851 break 24852 } 24853 j1 := s1.AuxInt 24854 r1 := s1.Args[0] 24855 if r1.Op != OpS390XMOVHZreg { 24856 break 24857 } 24858 x1 := r1.Args[0] 24859 if x1.Op != OpS390XMOVHBRload { 24860 break 24861 } 24862 i1 := x1.AuxInt 24863 s := x1.Aux 24864 _ = x1.Args[1] 24865 p := x1.Args[0] 24866 mem := x1.Args[1] 24867 or := v.Args[1] 24868 if or.Op != OpS390XOR { 24869 break 24870 } 24871 _ = or.Args[1] 24872 y := or.Args[0] 24873 s0 := or.Args[1] 24874 if s0.Op != OpS390XSLDconst { 24875 break 24876 } 24877 j0 := s0.AuxInt 24878 r0 := s0.Args[0] 24879 if r0.Op != OpS390XMOVHZreg { 24880 break 24881 } 24882 x0 := r0.Args[0] 24883 if x0.Op != OpS390XMOVHBRload { 24884 break 24885 } 24886 i0 := x0.AuxInt 24887 if x0.Aux != s { 24888 break 24889 } 24890 _ = x0.Args[1] 24891 if p != x0.Args[0] { 24892 break 24893 } 24894 if mem != x0.Args[1] { 24895 break 24896 } 24897 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)) { 24898 break 24899 } 24900 b = mergePoint(b, x0, x1) 24901 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24902 v.reset(OpCopy) 24903 v.AddArg(v0) 24904 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24905 v1.AuxInt = j0 24906 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24907 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24908 v3.AuxInt = i0 24909 v3.Aux = s 24910 v3.AddArg(p) 24911 v3.AddArg(mem) 24912 v2.AddArg(v3) 24913 v1.AddArg(v2) 24914 v0.AddArg(v1) 24915 v0.AddArg(y) 24916 return true 24917 } 24918 // 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)))) 24919 // 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) 24920 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24921 for { 24922 _ = v.Args[1] 24923 or := v.Args[0] 24924 if or.Op != OpS390XOR { 24925 break 24926 } 24927 _ = or.Args[1] 24928 s0 := or.Args[0] 24929 if s0.Op != OpS390XSLDconst { 24930 break 24931 } 24932 j0 := s0.AuxInt 24933 r0 := s0.Args[0] 24934 if r0.Op != OpS390XMOVHZreg { 24935 break 24936 } 24937 x0 := r0.Args[0] 24938 if x0.Op != OpS390XMOVHBRload { 24939 break 24940 } 24941 i0 := x0.AuxInt 24942 s := x0.Aux 24943 _ = x0.Args[1] 24944 p := x0.Args[0] 24945 mem := x0.Args[1] 24946 y := or.Args[1] 24947 s1 := v.Args[1] 24948 if s1.Op != OpS390XSLDconst { 24949 break 24950 } 24951 j1 := s1.AuxInt 24952 r1 := s1.Args[0] 24953 if r1.Op != OpS390XMOVHZreg { 24954 break 24955 } 24956 x1 := r1.Args[0] 24957 if x1.Op != OpS390XMOVHBRload { 24958 break 24959 } 24960 i1 := x1.AuxInt 24961 if x1.Aux != s { 24962 break 24963 } 24964 _ = x1.Args[1] 24965 if p != x1.Args[0] { 24966 break 24967 } 24968 if mem != x1.Args[1] { 24969 break 24970 } 24971 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)) { 24972 break 24973 } 24974 b = mergePoint(b, x0, x1) 24975 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24976 v.reset(OpCopy) 24977 v.AddArg(v0) 24978 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24979 v1.AuxInt = j0 24980 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24981 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24982 v3.AuxInt = i0 24983 v3.Aux = s 24984 v3.AddArg(p) 24985 v3.AddArg(mem) 24986 v2.AddArg(v3) 24987 v1.AddArg(v2) 24988 v0.AddArg(v1) 24989 v0.AddArg(y) 24990 return true 24991 } 24992 // 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)))) 24993 // 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) 24994 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24995 for { 24996 _ = v.Args[1] 24997 or := v.Args[0] 24998 if or.Op != OpS390XOR { 24999 break 25000 } 25001 _ = or.Args[1] 25002 y := or.Args[0] 25003 s0 := or.Args[1] 25004 if s0.Op != OpS390XSLDconst { 25005 break 25006 } 25007 j0 := s0.AuxInt 25008 r0 := s0.Args[0] 25009 if r0.Op != OpS390XMOVHZreg { 25010 break 25011 } 25012 x0 := r0.Args[0] 25013 if x0.Op != OpS390XMOVHBRload { 25014 break 25015 } 25016 i0 := x0.AuxInt 25017 s := x0.Aux 25018 _ = x0.Args[1] 25019 p := x0.Args[0] 25020 mem := x0.Args[1] 25021 s1 := v.Args[1] 25022 if s1.Op != OpS390XSLDconst { 25023 break 25024 } 25025 j1 := s1.AuxInt 25026 r1 := s1.Args[0] 25027 if r1.Op != OpS390XMOVHZreg { 25028 break 25029 } 25030 x1 := r1.Args[0] 25031 if x1.Op != OpS390XMOVHBRload { 25032 break 25033 } 25034 i1 := x1.AuxInt 25035 if x1.Aux != s { 25036 break 25037 } 25038 _ = x1.Args[1] 25039 if p != x1.Args[0] { 25040 break 25041 } 25042 if mem != x1.Args[1] { 25043 break 25044 } 25045 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)) { 25046 break 25047 } 25048 b = mergePoint(b, x0, x1) 25049 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25050 v.reset(OpCopy) 25051 v.AddArg(v0) 25052 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25053 v1.AuxInt = j0 25054 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25055 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 25056 v3.AuxInt = i0 25057 v3.Aux = s 25058 v3.AddArg(p) 25059 v3.AddArg(mem) 25060 v2.AddArg(v3) 25061 v1.AddArg(v2) 25062 v0.AddArg(v1) 25063 v0.AddArg(y) 25064 return true 25065 } 25066 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25067 // 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) 25068 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25069 for { 25070 _ = v.Args[1] 25071 x0 := v.Args[0] 25072 if x0.Op != OpS390XMOVBZloadidx { 25073 break 25074 } 25075 i0 := x0.AuxInt 25076 s := x0.Aux 25077 _ = x0.Args[2] 25078 p := x0.Args[0] 25079 idx := x0.Args[1] 25080 mem := x0.Args[2] 25081 sh := v.Args[1] 25082 if sh.Op != OpS390XSLDconst { 25083 break 25084 } 25085 if sh.AuxInt != 8 { 25086 break 25087 } 25088 x1 := sh.Args[0] 25089 if x1.Op != OpS390XMOVBZloadidx { 25090 break 25091 } 25092 i1 := x1.AuxInt 25093 if x1.Aux != s { 25094 break 25095 } 25096 _ = x1.Args[2] 25097 if p != x1.Args[0] { 25098 break 25099 } 25100 if idx != x1.Args[1] { 25101 break 25102 } 25103 if mem != x1.Args[2] { 25104 break 25105 } 25106 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)) { 25107 break 25108 } 25109 b = mergePoint(b, x0, x1) 25110 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25111 v.reset(OpCopy) 25112 v.AddArg(v0) 25113 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25114 v1.AuxInt = i0 25115 v1.Aux = s 25116 v1.AddArg(p) 25117 v1.AddArg(idx) 25118 v1.AddArg(mem) 25119 v0.AddArg(v1) 25120 return true 25121 } 25122 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25123 // 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) 25124 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25125 for { 25126 _ = v.Args[1] 25127 x0 := v.Args[0] 25128 if x0.Op != OpS390XMOVBZloadidx { 25129 break 25130 } 25131 i0 := x0.AuxInt 25132 s := x0.Aux 25133 _ = x0.Args[2] 25134 idx := x0.Args[0] 25135 p := x0.Args[1] 25136 mem := x0.Args[2] 25137 sh := v.Args[1] 25138 if sh.Op != OpS390XSLDconst { 25139 break 25140 } 25141 if sh.AuxInt != 8 { 25142 break 25143 } 25144 x1 := sh.Args[0] 25145 if x1.Op != OpS390XMOVBZloadidx { 25146 break 25147 } 25148 i1 := x1.AuxInt 25149 if x1.Aux != s { 25150 break 25151 } 25152 _ = x1.Args[2] 25153 if p != x1.Args[0] { 25154 break 25155 } 25156 if idx != x1.Args[1] { 25157 break 25158 } 25159 if mem != x1.Args[2] { 25160 break 25161 } 25162 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)) { 25163 break 25164 } 25165 b = mergePoint(b, x0, x1) 25166 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25167 v.reset(OpCopy) 25168 v.AddArg(v0) 25169 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25170 v1.AuxInt = i0 25171 v1.Aux = s 25172 v1.AddArg(p) 25173 v1.AddArg(idx) 25174 v1.AddArg(mem) 25175 v0.AddArg(v1) 25176 return true 25177 } 25178 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25179 // 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) 25180 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25181 for { 25182 _ = v.Args[1] 25183 x0 := v.Args[0] 25184 if x0.Op != OpS390XMOVBZloadidx { 25185 break 25186 } 25187 i0 := x0.AuxInt 25188 s := x0.Aux 25189 _ = x0.Args[2] 25190 p := x0.Args[0] 25191 idx := x0.Args[1] 25192 mem := x0.Args[2] 25193 sh := v.Args[1] 25194 if sh.Op != OpS390XSLDconst { 25195 break 25196 } 25197 if sh.AuxInt != 8 { 25198 break 25199 } 25200 x1 := sh.Args[0] 25201 if x1.Op != OpS390XMOVBZloadidx { 25202 break 25203 } 25204 i1 := x1.AuxInt 25205 if x1.Aux != s { 25206 break 25207 } 25208 _ = x1.Args[2] 25209 if idx != x1.Args[0] { 25210 break 25211 } 25212 if p != x1.Args[1] { 25213 break 25214 } 25215 if mem != x1.Args[2] { 25216 break 25217 } 25218 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)) { 25219 break 25220 } 25221 b = mergePoint(b, x0, x1) 25222 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25223 v.reset(OpCopy) 25224 v.AddArg(v0) 25225 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25226 v1.AuxInt = i0 25227 v1.Aux = s 25228 v1.AddArg(p) 25229 v1.AddArg(idx) 25230 v1.AddArg(mem) 25231 v0.AddArg(v1) 25232 return true 25233 } 25234 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25235 // 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) 25236 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25237 for { 25238 _ = v.Args[1] 25239 x0 := v.Args[0] 25240 if x0.Op != OpS390XMOVBZloadidx { 25241 break 25242 } 25243 i0 := x0.AuxInt 25244 s := x0.Aux 25245 _ = x0.Args[2] 25246 idx := x0.Args[0] 25247 p := x0.Args[1] 25248 mem := x0.Args[2] 25249 sh := v.Args[1] 25250 if sh.Op != OpS390XSLDconst { 25251 break 25252 } 25253 if sh.AuxInt != 8 { 25254 break 25255 } 25256 x1 := sh.Args[0] 25257 if x1.Op != OpS390XMOVBZloadidx { 25258 break 25259 } 25260 i1 := x1.AuxInt 25261 if x1.Aux != s { 25262 break 25263 } 25264 _ = x1.Args[2] 25265 if idx != x1.Args[0] { 25266 break 25267 } 25268 if p != x1.Args[1] { 25269 break 25270 } 25271 if mem != x1.Args[2] { 25272 break 25273 } 25274 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)) { 25275 break 25276 } 25277 b = mergePoint(b, x0, x1) 25278 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25279 v.reset(OpCopy) 25280 v.AddArg(v0) 25281 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25282 v1.AuxInt = i0 25283 v1.Aux = s 25284 v1.AddArg(p) 25285 v1.AddArg(idx) 25286 v1.AddArg(mem) 25287 v0.AddArg(v1) 25288 return true 25289 } 25290 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 25291 // 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) 25292 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25293 for { 25294 _ = v.Args[1] 25295 sh := v.Args[0] 25296 if sh.Op != OpS390XSLDconst { 25297 break 25298 } 25299 if sh.AuxInt != 8 { 25300 break 25301 } 25302 x1 := sh.Args[0] 25303 if x1.Op != OpS390XMOVBZloadidx { 25304 break 25305 } 25306 i1 := x1.AuxInt 25307 s := x1.Aux 25308 _ = x1.Args[2] 25309 p := x1.Args[0] 25310 idx := x1.Args[1] 25311 mem := x1.Args[2] 25312 x0 := v.Args[1] 25313 if x0.Op != OpS390XMOVBZloadidx { 25314 break 25315 } 25316 i0 := x0.AuxInt 25317 if x0.Aux != s { 25318 break 25319 } 25320 _ = x0.Args[2] 25321 if p != x0.Args[0] { 25322 break 25323 } 25324 if idx != x0.Args[1] { 25325 break 25326 } 25327 if mem != x0.Args[2] { 25328 break 25329 } 25330 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)) { 25331 break 25332 } 25333 b = mergePoint(b, x0, x1) 25334 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25335 v.reset(OpCopy) 25336 v.AddArg(v0) 25337 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25338 v1.AuxInt = i0 25339 v1.Aux = s 25340 v1.AddArg(p) 25341 v1.AddArg(idx) 25342 v1.AddArg(mem) 25343 v0.AddArg(v1) 25344 return true 25345 } 25346 return false 25347 } 25348 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 25349 b := v.Block 25350 _ = b 25351 typ := &b.Func.Config.Types 25352 _ = typ 25353 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 25354 // 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) 25355 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25356 for { 25357 _ = v.Args[1] 25358 sh := v.Args[0] 25359 if sh.Op != OpS390XSLDconst { 25360 break 25361 } 25362 if sh.AuxInt != 8 { 25363 break 25364 } 25365 x1 := sh.Args[0] 25366 if x1.Op != OpS390XMOVBZloadidx { 25367 break 25368 } 25369 i1 := x1.AuxInt 25370 s := x1.Aux 25371 _ = x1.Args[2] 25372 idx := x1.Args[0] 25373 p := x1.Args[1] 25374 mem := x1.Args[2] 25375 x0 := v.Args[1] 25376 if x0.Op != OpS390XMOVBZloadidx { 25377 break 25378 } 25379 i0 := x0.AuxInt 25380 if x0.Aux != s { 25381 break 25382 } 25383 _ = x0.Args[2] 25384 if p != x0.Args[0] { 25385 break 25386 } 25387 if idx != x0.Args[1] { 25388 break 25389 } 25390 if mem != x0.Args[2] { 25391 break 25392 } 25393 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)) { 25394 break 25395 } 25396 b = mergePoint(b, x0, x1) 25397 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25398 v.reset(OpCopy) 25399 v.AddArg(v0) 25400 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25401 v1.AuxInt = i0 25402 v1.Aux = s 25403 v1.AddArg(p) 25404 v1.AddArg(idx) 25405 v1.AddArg(mem) 25406 v0.AddArg(v1) 25407 return true 25408 } 25409 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25410 // 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) 25411 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25412 for { 25413 _ = v.Args[1] 25414 sh := v.Args[0] 25415 if sh.Op != OpS390XSLDconst { 25416 break 25417 } 25418 if sh.AuxInt != 8 { 25419 break 25420 } 25421 x1 := sh.Args[0] 25422 if x1.Op != OpS390XMOVBZloadidx { 25423 break 25424 } 25425 i1 := x1.AuxInt 25426 s := x1.Aux 25427 _ = x1.Args[2] 25428 p := x1.Args[0] 25429 idx := x1.Args[1] 25430 mem := x1.Args[2] 25431 x0 := v.Args[1] 25432 if x0.Op != OpS390XMOVBZloadidx { 25433 break 25434 } 25435 i0 := x0.AuxInt 25436 if x0.Aux != s { 25437 break 25438 } 25439 _ = x0.Args[2] 25440 if idx != x0.Args[0] { 25441 break 25442 } 25443 if p != x0.Args[1] { 25444 break 25445 } 25446 if mem != x0.Args[2] { 25447 break 25448 } 25449 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)) { 25450 break 25451 } 25452 b = mergePoint(b, x0, x1) 25453 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25454 v.reset(OpCopy) 25455 v.AddArg(v0) 25456 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25457 v1.AuxInt = i0 25458 v1.Aux = s 25459 v1.AddArg(p) 25460 v1.AddArg(idx) 25461 v1.AddArg(mem) 25462 v0.AddArg(v1) 25463 return true 25464 } 25465 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25466 // 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) 25467 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25468 for { 25469 _ = v.Args[1] 25470 sh := v.Args[0] 25471 if sh.Op != OpS390XSLDconst { 25472 break 25473 } 25474 if sh.AuxInt != 8 { 25475 break 25476 } 25477 x1 := sh.Args[0] 25478 if x1.Op != OpS390XMOVBZloadidx { 25479 break 25480 } 25481 i1 := x1.AuxInt 25482 s := x1.Aux 25483 _ = x1.Args[2] 25484 idx := x1.Args[0] 25485 p := x1.Args[1] 25486 mem := x1.Args[2] 25487 x0 := v.Args[1] 25488 if x0.Op != OpS390XMOVBZloadidx { 25489 break 25490 } 25491 i0 := x0.AuxInt 25492 if x0.Aux != s { 25493 break 25494 } 25495 _ = x0.Args[2] 25496 if idx != x0.Args[0] { 25497 break 25498 } 25499 if p != x0.Args[1] { 25500 break 25501 } 25502 if mem != x0.Args[2] { 25503 break 25504 } 25505 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)) { 25506 break 25507 } 25508 b = mergePoint(b, x0, x1) 25509 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25510 v.reset(OpCopy) 25511 v.AddArg(v0) 25512 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25513 v1.AuxInt = i0 25514 v1.Aux = s 25515 v1.AddArg(p) 25516 v1.AddArg(idx) 25517 v1.AddArg(mem) 25518 v0.AddArg(v1) 25519 return true 25520 } 25521 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25522 // 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) 25523 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25524 for { 25525 _ = v.Args[1] 25526 r0 := v.Args[0] 25527 if r0.Op != OpS390XMOVHZreg { 25528 break 25529 } 25530 x0 := r0.Args[0] 25531 if x0.Op != OpS390XMOVHBRloadidx { 25532 break 25533 } 25534 i0 := x0.AuxInt 25535 s := x0.Aux 25536 _ = x0.Args[2] 25537 p := x0.Args[0] 25538 idx := x0.Args[1] 25539 mem := x0.Args[2] 25540 sh := v.Args[1] 25541 if sh.Op != OpS390XSLDconst { 25542 break 25543 } 25544 if sh.AuxInt != 16 { 25545 break 25546 } 25547 r1 := sh.Args[0] 25548 if r1.Op != OpS390XMOVHZreg { 25549 break 25550 } 25551 x1 := r1.Args[0] 25552 if x1.Op != OpS390XMOVHBRloadidx { 25553 break 25554 } 25555 i1 := x1.AuxInt 25556 if x1.Aux != s { 25557 break 25558 } 25559 _ = x1.Args[2] 25560 if p != x1.Args[0] { 25561 break 25562 } 25563 if idx != x1.Args[1] { 25564 break 25565 } 25566 if mem != x1.Args[2] { 25567 break 25568 } 25569 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)) { 25570 break 25571 } 25572 b = mergePoint(b, x0, x1) 25573 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25574 v.reset(OpCopy) 25575 v.AddArg(v0) 25576 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25577 v1.AuxInt = i0 25578 v1.Aux = s 25579 v1.AddArg(p) 25580 v1.AddArg(idx) 25581 v1.AddArg(mem) 25582 v0.AddArg(v1) 25583 return true 25584 } 25585 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25586 // 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) 25587 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25588 for { 25589 _ = v.Args[1] 25590 r0 := v.Args[0] 25591 if r0.Op != OpS390XMOVHZreg { 25592 break 25593 } 25594 x0 := r0.Args[0] 25595 if x0.Op != OpS390XMOVHBRloadidx { 25596 break 25597 } 25598 i0 := x0.AuxInt 25599 s := x0.Aux 25600 _ = x0.Args[2] 25601 idx := x0.Args[0] 25602 p := x0.Args[1] 25603 mem := x0.Args[2] 25604 sh := v.Args[1] 25605 if sh.Op != OpS390XSLDconst { 25606 break 25607 } 25608 if sh.AuxInt != 16 { 25609 break 25610 } 25611 r1 := sh.Args[0] 25612 if r1.Op != OpS390XMOVHZreg { 25613 break 25614 } 25615 x1 := r1.Args[0] 25616 if x1.Op != OpS390XMOVHBRloadidx { 25617 break 25618 } 25619 i1 := x1.AuxInt 25620 if x1.Aux != s { 25621 break 25622 } 25623 _ = x1.Args[2] 25624 if p != x1.Args[0] { 25625 break 25626 } 25627 if idx != x1.Args[1] { 25628 break 25629 } 25630 if mem != x1.Args[2] { 25631 break 25632 } 25633 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)) { 25634 break 25635 } 25636 b = mergePoint(b, x0, x1) 25637 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25638 v.reset(OpCopy) 25639 v.AddArg(v0) 25640 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25641 v1.AuxInt = i0 25642 v1.Aux = s 25643 v1.AddArg(p) 25644 v1.AddArg(idx) 25645 v1.AddArg(mem) 25646 v0.AddArg(v1) 25647 return true 25648 } 25649 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25650 // 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) 25651 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25652 for { 25653 _ = v.Args[1] 25654 r0 := v.Args[0] 25655 if r0.Op != OpS390XMOVHZreg { 25656 break 25657 } 25658 x0 := r0.Args[0] 25659 if x0.Op != OpS390XMOVHBRloadidx { 25660 break 25661 } 25662 i0 := x0.AuxInt 25663 s := x0.Aux 25664 _ = x0.Args[2] 25665 p := x0.Args[0] 25666 idx := x0.Args[1] 25667 mem := x0.Args[2] 25668 sh := v.Args[1] 25669 if sh.Op != OpS390XSLDconst { 25670 break 25671 } 25672 if sh.AuxInt != 16 { 25673 break 25674 } 25675 r1 := sh.Args[0] 25676 if r1.Op != OpS390XMOVHZreg { 25677 break 25678 } 25679 x1 := r1.Args[0] 25680 if x1.Op != OpS390XMOVHBRloadidx { 25681 break 25682 } 25683 i1 := x1.AuxInt 25684 if x1.Aux != s { 25685 break 25686 } 25687 _ = x1.Args[2] 25688 if idx != x1.Args[0] { 25689 break 25690 } 25691 if p != x1.Args[1] { 25692 break 25693 } 25694 if mem != x1.Args[2] { 25695 break 25696 } 25697 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)) { 25698 break 25699 } 25700 b = mergePoint(b, x0, x1) 25701 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25702 v.reset(OpCopy) 25703 v.AddArg(v0) 25704 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25705 v1.AuxInt = i0 25706 v1.Aux = s 25707 v1.AddArg(p) 25708 v1.AddArg(idx) 25709 v1.AddArg(mem) 25710 v0.AddArg(v1) 25711 return true 25712 } 25713 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25714 // 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) 25715 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25716 for { 25717 _ = v.Args[1] 25718 r0 := v.Args[0] 25719 if r0.Op != OpS390XMOVHZreg { 25720 break 25721 } 25722 x0 := r0.Args[0] 25723 if x0.Op != OpS390XMOVHBRloadidx { 25724 break 25725 } 25726 i0 := x0.AuxInt 25727 s := x0.Aux 25728 _ = x0.Args[2] 25729 idx := x0.Args[0] 25730 p := x0.Args[1] 25731 mem := x0.Args[2] 25732 sh := v.Args[1] 25733 if sh.Op != OpS390XSLDconst { 25734 break 25735 } 25736 if sh.AuxInt != 16 { 25737 break 25738 } 25739 r1 := sh.Args[0] 25740 if r1.Op != OpS390XMOVHZreg { 25741 break 25742 } 25743 x1 := r1.Args[0] 25744 if x1.Op != OpS390XMOVHBRloadidx { 25745 break 25746 } 25747 i1 := x1.AuxInt 25748 if x1.Aux != s { 25749 break 25750 } 25751 _ = x1.Args[2] 25752 if idx != x1.Args[0] { 25753 break 25754 } 25755 if p != x1.Args[1] { 25756 break 25757 } 25758 if mem != x1.Args[2] { 25759 break 25760 } 25761 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)) { 25762 break 25763 } 25764 b = mergePoint(b, x0, x1) 25765 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25766 v.reset(OpCopy) 25767 v.AddArg(v0) 25768 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25769 v1.AuxInt = i0 25770 v1.Aux = s 25771 v1.AddArg(p) 25772 v1.AddArg(idx) 25773 v1.AddArg(mem) 25774 v0.AddArg(v1) 25775 return true 25776 } 25777 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25778 // 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) 25779 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25780 for { 25781 _ = v.Args[1] 25782 sh := v.Args[0] 25783 if sh.Op != OpS390XSLDconst { 25784 break 25785 } 25786 if sh.AuxInt != 16 { 25787 break 25788 } 25789 r1 := sh.Args[0] 25790 if r1.Op != OpS390XMOVHZreg { 25791 break 25792 } 25793 x1 := r1.Args[0] 25794 if x1.Op != OpS390XMOVHBRloadidx { 25795 break 25796 } 25797 i1 := x1.AuxInt 25798 s := x1.Aux 25799 _ = x1.Args[2] 25800 p := x1.Args[0] 25801 idx := x1.Args[1] 25802 mem := x1.Args[2] 25803 r0 := v.Args[1] 25804 if r0.Op != OpS390XMOVHZreg { 25805 break 25806 } 25807 x0 := r0.Args[0] 25808 if x0.Op != OpS390XMOVHBRloadidx { 25809 break 25810 } 25811 i0 := x0.AuxInt 25812 if x0.Aux != s { 25813 break 25814 } 25815 _ = x0.Args[2] 25816 if p != x0.Args[0] { 25817 break 25818 } 25819 if idx != x0.Args[1] { 25820 break 25821 } 25822 if mem != x0.Args[2] { 25823 break 25824 } 25825 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)) { 25826 break 25827 } 25828 b = mergePoint(b, x0, x1) 25829 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25830 v.reset(OpCopy) 25831 v.AddArg(v0) 25832 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25833 v1.AuxInt = i0 25834 v1.Aux = s 25835 v1.AddArg(p) 25836 v1.AddArg(idx) 25837 v1.AddArg(mem) 25838 v0.AddArg(v1) 25839 return true 25840 } 25841 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25842 // 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) 25843 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25844 for { 25845 _ = v.Args[1] 25846 sh := v.Args[0] 25847 if sh.Op != OpS390XSLDconst { 25848 break 25849 } 25850 if sh.AuxInt != 16 { 25851 break 25852 } 25853 r1 := sh.Args[0] 25854 if r1.Op != OpS390XMOVHZreg { 25855 break 25856 } 25857 x1 := r1.Args[0] 25858 if x1.Op != OpS390XMOVHBRloadidx { 25859 break 25860 } 25861 i1 := x1.AuxInt 25862 s := x1.Aux 25863 _ = x1.Args[2] 25864 idx := x1.Args[0] 25865 p := x1.Args[1] 25866 mem := x1.Args[2] 25867 r0 := v.Args[1] 25868 if r0.Op != OpS390XMOVHZreg { 25869 break 25870 } 25871 x0 := r0.Args[0] 25872 if x0.Op != OpS390XMOVHBRloadidx { 25873 break 25874 } 25875 i0 := x0.AuxInt 25876 if x0.Aux != s { 25877 break 25878 } 25879 _ = x0.Args[2] 25880 if p != x0.Args[0] { 25881 break 25882 } 25883 if idx != x0.Args[1] { 25884 break 25885 } 25886 if mem != x0.Args[2] { 25887 break 25888 } 25889 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)) { 25890 break 25891 } 25892 b = mergePoint(b, x0, x1) 25893 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25894 v.reset(OpCopy) 25895 v.AddArg(v0) 25896 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25897 v1.AuxInt = i0 25898 v1.Aux = s 25899 v1.AddArg(p) 25900 v1.AddArg(idx) 25901 v1.AddArg(mem) 25902 v0.AddArg(v1) 25903 return true 25904 } 25905 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 25906 // 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) 25907 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25908 for { 25909 _ = v.Args[1] 25910 sh := v.Args[0] 25911 if sh.Op != OpS390XSLDconst { 25912 break 25913 } 25914 if sh.AuxInt != 16 { 25915 break 25916 } 25917 r1 := sh.Args[0] 25918 if r1.Op != OpS390XMOVHZreg { 25919 break 25920 } 25921 x1 := r1.Args[0] 25922 if x1.Op != OpS390XMOVHBRloadidx { 25923 break 25924 } 25925 i1 := x1.AuxInt 25926 s := x1.Aux 25927 _ = x1.Args[2] 25928 p := x1.Args[0] 25929 idx := x1.Args[1] 25930 mem := x1.Args[2] 25931 r0 := v.Args[1] 25932 if r0.Op != OpS390XMOVHZreg { 25933 break 25934 } 25935 x0 := r0.Args[0] 25936 if x0.Op != OpS390XMOVHBRloadidx { 25937 break 25938 } 25939 i0 := x0.AuxInt 25940 if x0.Aux != s { 25941 break 25942 } 25943 _ = x0.Args[2] 25944 if idx != x0.Args[0] { 25945 break 25946 } 25947 if p != x0.Args[1] { 25948 break 25949 } 25950 if mem != x0.Args[2] { 25951 break 25952 } 25953 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)) { 25954 break 25955 } 25956 b = mergePoint(b, x0, x1) 25957 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25958 v.reset(OpCopy) 25959 v.AddArg(v0) 25960 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25961 v1.AuxInt = i0 25962 v1.Aux = s 25963 v1.AddArg(p) 25964 v1.AddArg(idx) 25965 v1.AddArg(mem) 25966 v0.AddArg(v1) 25967 return true 25968 } 25969 return false 25970 } 25971 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 25972 b := v.Block 25973 _ = b 25974 typ := &b.Func.Config.Types 25975 _ = typ 25976 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 25977 // 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) 25978 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25979 for { 25980 _ = v.Args[1] 25981 sh := v.Args[0] 25982 if sh.Op != OpS390XSLDconst { 25983 break 25984 } 25985 if sh.AuxInt != 16 { 25986 break 25987 } 25988 r1 := sh.Args[0] 25989 if r1.Op != OpS390XMOVHZreg { 25990 break 25991 } 25992 x1 := r1.Args[0] 25993 if x1.Op != OpS390XMOVHBRloadidx { 25994 break 25995 } 25996 i1 := x1.AuxInt 25997 s := x1.Aux 25998 _ = x1.Args[2] 25999 idx := x1.Args[0] 26000 p := x1.Args[1] 26001 mem := x1.Args[2] 26002 r0 := v.Args[1] 26003 if r0.Op != OpS390XMOVHZreg { 26004 break 26005 } 26006 x0 := r0.Args[0] 26007 if x0.Op != OpS390XMOVHBRloadidx { 26008 break 26009 } 26010 i0 := x0.AuxInt 26011 if x0.Aux != s { 26012 break 26013 } 26014 _ = x0.Args[2] 26015 if idx != x0.Args[0] { 26016 break 26017 } 26018 if p != x0.Args[1] { 26019 break 26020 } 26021 if mem != x0.Args[2] { 26022 break 26023 } 26024 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)) { 26025 break 26026 } 26027 b = mergePoint(b, x0, x1) 26028 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26029 v.reset(OpCopy) 26030 v.AddArg(v0) 26031 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 26032 v1.AuxInt = i0 26033 v1.Aux = s 26034 v1.AddArg(p) 26035 v1.AddArg(idx) 26036 v1.AddArg(mem) 26037 v0.AddArg(v1) 26038 return true 26039 } 26040 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26041 // 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) 26042 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26043 for { 26044 _ = v.Args[1] 26045 r0 := v.Args[0] 26046 if r0.Op != OpS390XMOVWZreg { 26047 break 26048 } 26049 x0 := r0.Args[0] 26050 if x0.Op != OpS390XMOVWBRloadidx { 26051 break 26052 } 26053 i0 := x0.AuxInt 26054 s := x0.Aux 26055 _ = x0.Args[2] 26056 p := x0.Args[0] 26057 idx := x0.Args[1] 26058 mem := x0.Args[2] 26059 sh := v.Args[1] 26060 if sh.Op != OpS390XSLDconst { 26061 break 26062 } 26063 if sh.AuxInt != 32 { 26064 break 26065 } 26066 r1 := sh.Args[0] 26067 if r1.Op != OpS390XMOVWZreg { 26068 break 26069 } 26070 x1 := r1.Args[0] 26071 if x1.Op != OpS390XMOVWBRloadidx { 26072 break 26073 } 26074 i1 := x1.AuxInt 26075 if x1.Aux != s { 26076 break 26077 } 26078 _ = x1.Args[2] 26079 if p != x1.Args[0] { 26080 break 26081 } 26082 if idx != x1.Args[1] { 26083 break 26084 } 26085 if mem != x1.Args[2] { 26086 break 26087 } 26088 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)) { 26089 break 26090 } 26091 b = mergePoint(b, x0, x1) 26092 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26093 v.reset(OpCopy) 26094 v.AddArg(v0) 26095 v0.AuxInt = i0 26096 v0.Aux = s 26097 v0.AddArg(p) 26098 v0.AddArg(idx) 26099 v0.AddArg(mem) 26100 return true 26101 } 26102 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26103 // 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) 26104 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26105 for { 26106 _ = v.Args[1] 26107 r0 := v.Args[0] 26108 if r0.Op != OpS390XMOVWZreg { 26109 break 26110 } 26111 x0 := r0.Args[0] 26112 if x0.Op != OpS390XMOVWBRloadidx { 26113 break 26114 } 26115 i0 := x0.AuxInt 26116 s := x0.Aux 26117 _ = x0.Args[2] 26118 idx := x0.Args[0] 26119 p := x0.Args[1] 26120 mem := x0.Args[2] 26121 sh := v.Args[1] 26122 if sh.Op != OpS390XSLDconst { 26123 break 26124 } 26125 if sh.AuxInt != 32 { 26126 break 26127 } 26128 r1 := sh.Args[0] 26129 if r1.Op != OpS390XMOVWZreg { 26130 break 26131 } 26132 x1 := r1.Args[0] 26133 if x1.Op != OpS390XMOVWBRloadidx { 26134 break 26135 } 26136 i1 := x1.AuxInt 26137 if x1.Aux != s { 26138 break 26139 } 26140 _ = x1.Args[2] 26141 if p != x1.Args[0] { 26142 break 26143 } 26144 if idx != x1.Args[1] { 26145 break 26146 } 26147 if mem != x1.Args[2] { 26148 break 26149 } 26150 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)) { 26151 break 26152 } 26153 b = mergePoint(b, x0, x1) 26154 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26155 v.reset(OpCopy) 26156 v.AddArg(v0) 26157 v0.AuxInt = i0 26158 v0.Aux = s 26159 v0.AddArg(p) 26160 v0.AddArg(idx) 26161 v0.AddArg(mem) 26162 return true 26163 } 26164 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26165 // 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) 26166 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26167 for { 26168 _ = v.Args[1] 26169 r0 := v.Args[0] 26170 if r0.Op != OpS390XMOVWZreg { 26171 break 26172 } 26173 x0 := r0.Args[0] 26174 if x0.Op != OpS390XMOVWBRloadidx { 26175 break 26176 } 26177 i0 := x0.AuxInt 26178 s := x0.Aux 26179 _ = x0.Args[2] 26180 p := x0.Args[0] 26181 idx := x0.Args[1] 26182 mem := x0.Args[2] 26183 sh := v.Args[1] 26184 if sh.Op != OpS390XSLDconst { 26185 break 26186 } 26187 if sh.AuxInt != 32 { 26188 break 26189 } 26190 r1 := sh.Args[0] 26191 if r1.Op != OpS390XMOVWZreg { 26192 break 26193 } 26194 x1 := r1.Args[0] 26195 if x1.Op != OpS390XMOVWBRloadidx { 26196 break 26197 } 26198 i1 := x1.AuxInt 26199 if x1.Aux != s { 26200 break 26201 } 26202 _ = x1.Args[2] 26203 if idx != x1.Args[0] { 26204 break 26205 } 26206 if p != x1.Args[1] { 26207 break 26208 } 26209 if mem != x1.Args[2] { 26210 break 26211 } 26212 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)) { 26213 break 26214 } 26215 b = mergePoint(b, x0, x1) 26216 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26217 v.reset(OpCopy) 26218 v.AddArg(v0) 26219 v0.AuxInt = i0 26220 v0.Aux = s 26221 v0.AddArg(p) 26222 v0.AddArg(idx) 26223 v0.AddArg(mem) 26224 return true 26225 } 26226 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26227 // 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) 26228 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26229 for { 26230 _ = v.Args[1] 26231 r0 := v.Args[0] 26232 if r0.Op != OpS390XMOVWZreg { 26233 break 26234 } 26235 x0 := r0.Args[0] 26236 if x0.Op != OpS390XMOVWBRloadidx { 26237 break 26238 } 26239 i0 := x0.AuxInt 26240 s := x0.Aux 26241 _ = x0.Args[2] 26242 idx := x0.Args[0] 26243 p := x0.Args[1] 26244 mem := x0.Args[2] 26245 sh := v.Args[1] 26246 if sh.Op != OpS390XSLDconst { 26247 break 26248 } 26249 if sh.AuxInt != 32 { 26250 break 26251 } 26252 r1 := sh.Args[0] 26253 if r1.Op != OpS390XMOVWZreg { 26254 break 26255 } 26256 x1 := r1.Args[0] 26257 if x1.Op != OpS390XMOVWBRloadidx { 26258 break 26259 } 26260 i1 := x1.AuxInt 26261 if x1.Aux != s { 26262 break 26263 } 26264 _ = x1.Args[2] 26265 if idx != x1.Args[0] { 26266 break 26267 } 26268 if p != x1.Args[1] { 26269 break 26270 } 26271 if mem != x1.Args[2] { 26272 break 26273 } 26274 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)) { 26275 break 26276 } 26277 b = mergePoint(b, x0, x1) 26278 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26279 v.reset(OpCopy) 26280 v.AddArg(v0) 26281 v0.AuxInt = i0 26282 v0.Aux = s 26283 v0.AddArg(p) 26284 v0.AddArg(idx) 26285 v0.AddArg(mem) 26286 return true 26287 } 26288 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26289 // 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) 26290 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26291 for { 26292 _ = v.Args[1] 26293 sh := v.Args[0] 26294 if sh.Op != OpS390XSLDconst { 26295 break 26296 } 26297 if sh.AuxInt != 32 { 26298 break 26299 } 26300 r1 := sh.Args[0] 26301 if r1.Op != OpS390XMOVWZreg { 26302 break 26303 } 26304 x1 := r1.Args[0] 26305 if x1.Op != OpS390XMOVWBRloadidx { 26306 break 26307 } 26308 i1 := x1.AuxInt 26309 s := x1.Aux 26310 _ = x1.Args[2] 26311 p := x1.Args[0] 26312 idx := x1.Args[1] 26313 mem := x1.Args[2] 26314 r0 := v.Args[1] 26315 if r0.Op != OpS390XMOVWZreg { 26316 break 26317 } 26318 x0 := r0.Args[0] 26319 if x0.Op != OpS390XMOVWBRloadidx { 26320 break 26321 } 26322 i0 := x0.AuxInt 26323 if x0.Aux != s { 26324 break 26325 } 26326 _ = x0.Args[2] 26327 if p != x0.Args[0] { 26328 break 26329 } 26330 if idx != x0.Args[1] { 26331 break 26332 } 26333 if mem != x0.Args[2] { 26334 break 26335 } 26336 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)) { 26337 break 26338 } 26339 b = mergePoint(b, x0, x1) 26340 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26341 v.reset(OpCopy) 26342 v.AddArg(v0) 26343 v0.AuxInt = i0 26344 v0.Aux = s 26345 v0.AddArg(p) 26346 v0.AddArg(idx) 26347 v0.AddArg(mem) 26348 return true 26349 } 26350 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26351 // 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) 26352 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26353 for { 26354 _ = v.Args[1] 26355 sh := v.Args[0] 26356 if sh.Op != OpS390XSLDconst { 26357 break 26358 } 26359 if sh.AuxInt != 32 { 26360 break 26361 } 26362 r1 := sh.Args[0] 26363 if r1.Op != OpS390XMOVWZreg { 26364 break 26365 } 26366 x1 := r1.Args[0] 26367 if x1.Op != OpS390XMOVWBRloadidx { 26368 break 26369 } 26370 i1 := x1.AuxInt 26371 s := x1.Aux 26372 _ = x1.Args[2] 26373 idx := x1.Args[0] 26374 p := x1.Args[1] 26375 mem := x1.Args[2] 26376 r0 := v.Args[1] 26377 if r0.Op != OpS390XMOVWZreg { 26378 break 26379 } 26380 x0 := r0.Args[0] 26381 if x0.Op != OpS390XMOVWBRloadidx { 26382 break 26383 } 26384 i0 := x0.AuxInt 26385 if x0.Aux != s { 26386 break 26387 } 26388 _ = x0.Args[2] 26389 if p != x0.Args[0] { 26390 break 26391 } 26392 if idx != x0.Args[1] { 26393 break 26394 } 26395 if mem != x0.Args[2] { 26396 break 26397 } 26398 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)) { 26399 break 26400 } 26401 b = mergePoint(b, x0, x1) 26402 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26403 v.reset(OpCopy) 26404 v.AddArg(v0) 26405 v0.AuxInt = i0 26406 v0.Aux = s 26407 v0.AddArg(p) 26408 v0.AddArg(idx) 26409 v0.AddArg(mem) 26410 return true 26411 } 26412 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26413 // 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) 26414 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26415 for { 26416 _ = v.Args[1] 26417 sh := v.Args[0] 26418 if sh.Op != OpS390XSLDconst { 26419 break 26420 } 26421 if sh.AuxInt != 32 { 26422 break 26423 } 26424 r1 := sh.Args[0] 26425 if r1.Op != OpS390XMOVWZreg { 26426 break 26427 } 26428 x1 := r1.Args[0] 26429 if x1.Op != OpS390XMOVWBRloadidx { 26430 break 26431 } 26432 i1 := x1.AuxInt 26433 s := x1.Aux 26434 _ = x1.Args[2] 26435 p := x1.Args[0] 26436 idx := x1.Args[1] 26437 mem := x1.Args[2] 26438 r0 := v.Args[1] 26439 if r0.Op != OpS390XMOVWZreg { 26440 break 26441 } 26442 x0 := r0.Args[0] 26443 if x0.Op != OpS390XMOVWBRloadidx { 26444 break 26445 } 26446 i0 := x0.AuxInt 26447 if x0.Aux != s { 26448 break 26449 } 26450 _ = x0.Args[2] 26451 if idx != x0.Args[0] { 26452 break 26453 } 26454 if p != x0.Args[1] { 26455 break 26456 } 26457 if mem != x0.Args[2] { 26458 break 26459 } 26460 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)) { 26461 break 26462 } 26463 b = mergePoint(b, x0, x1) 26464 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26465 v.reset(OpCopy) 26466 v.AddArg(v0) 26467 v0.AuxInt = i0 26468 v0.Aux = s 26469 v0.AddArg(p) 26470 v0.AddArg(idx) 26471 v0.AddArg(mem) 26472 return true 26473 } 26474 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26475 // 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) 26476 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26477 for { 26478 _ = v.Args[1] 26479 sh := v.Args[0] 26480 if sh.Op != OpS390XSLDconst { 26481 break 26482 } 26483 if sh.AuxInt != 32 { 26484 break 26485 } 26486 r1 := sh.Args[0] 26487 if r1.Op != OpS390XMOVWZreg { 26488 break 26489 } 26490 x1 := r1.Args[0] 26491 if x1.Op != OpS390XMOVWBRloadidx { 26492 break 26493 } 26494 i1 := x1.AuxInt 26495 s := x1.Aux 26496 _ = x1.Args[2] 26497 idx := x1.Args[0] 26498 p := x1.Args[1] 26499 mem := x1.Args[2] 26500 r0 := v.Args[1] 26501 if r0.Op != OpS390XMOVWZreg { 26502 break 26503 } 26504 x0 := r0.Args[0] 26505 if x0.Op != OpS390XMOVWBRloadidx { 26506 break 26507 } 26508 i0 := x0.AuxInt 26509 if x0.Aux != s { 26510 break 26511 } 26512 _ = x0.Args[2] 26513 if idx != x0.Args[0] { 26514 break 26515 } 26516 if p != x0.Args[1] { 26517 break 26518 } 26519 if mem != x0.Args[2] { 26520 break 26521 } 26522 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)) { 26523 break 26524 } 26525 b = mergePoint(b, x0, x1) 26526 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26527 v.reset(OpCopy) 26528 v.AddArg(v0) 26529 v0.AuxInt = i0 26530 v0.Aux = s 26531 v0.AddArg(p) 26532 v0.AddArg(idx) 26533 v0.AddArg(mem) 26534 return true 26535 } 26536 // 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)) 26537 // 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) 26538 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26539 for { 26540 _ = v.Args[1] 26541 s1 := v.Args[0] 26542 if s1.Op != OpS390XSLDconst { 26543 break 26544 } 26545 j1 := s1.AuxInt 26546 x1 := s1.Args[0] 26547 if x1.Op != OpS390XMOVBZloadidx { 26548 break 26549 } 26550 i1 := x1.AuxInt 26551 s := x1.Aux 26552 _ = x1.Args[2] 26553 p := x1.Args[0] 26554 idx := x1.Args[1] 26555 mem := x1.Args[2] 26556 or := v.Args[1] 26557 if or.Op != OpS390XOR { 26558 break 26559 } 26560 _ = or.Args[1] 26561 s0 := or.Args[0] 26562 if s0.Op != OpS390XSLDconst { 26563 break 26564 } 26565 j0 := s0.AuxInt 26566 x0 := s0.Args[0] 26567 if x0.Op != OpS390XMOVBZloadidx { 26568 break 26569 } 26570 i0 := x0.AuxInt 26571 if x0.Aux != s { 26572 break 26573 } 26574 _ = x0.Args[2] 26575 if p != x0.Args[0] { 26576 break 26577 } 26578 if idx != x0.Args[1] { 26579 break 26580 } 26581 if mem != x0.Args[2] { 26582 break 26583 } 26584 y := or.Args[1] 26585 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)) { 26586 break 26587 } 26588 b = mergePoint(b, x0, x1) 26589 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26590 v.reset(OpCopy) 26591 v.AddArg(v0) 26592 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26593 v1.AuxInt = j0 26594 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26595 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26596 v3.AuxInt = i0 26597 v3.Aux = s 26598 v3.AddArg(p) 26599 v3.AddArg(idx) 26600 v3.AddArg(mem) 26601 v2.AddArg(v3) 26602 v1.AddArg(v2) 26603 v0.AddArg(v1) 26604 v0.AddArg(y) 26605 return true 26606 } 26607 return false 26608 } 26609 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 26610 b := v.Block 26611 _ = b 26612 typ := &b.Func.Config.Types 26613 _ = typ 26614 // 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)) 26615 // 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) 26616 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26617 for { 26618 _ = v.Args[1] 26619 s1 := v.Args[0] 26620 if s1.Op != OpS390XSLDconst { 26621 break 26622 } 26623 j1 := s1.AuxInt 26624 x1 := s1.Args[0] 26625 if x1.Op != OpS390XMOVBZloadidx { 26626 break 26627 } 26628 i1 := x1.AuxInt 26629 s := x1.Aux 26630 _ = x1.Args[2] 26631 idx := x1.Args[0] 26632 p := x1.Args[1] 26633 mem := x1.Args[2] 26634 or := v.Args[1] 26635 if or.Op != OpS390XOR { 26636 break 26637 } 26638 _ = or.Args[1] 26639 s0 := or.Args[0] 26640 if s0.Op != OpS390XSLDconst { 26641 break 26642 } 26643 j0 := s0.AuxInt 26644 x0 := s0.Args[0] 26645 if x0.Op != OpS390XMOVBZloadidx { 26646 break 26647 } 26648 i0 := x0.AuxInt 26649 if x0.Aux != s { 26650 break 26651 } 26652 _ = x0.Args[2] 26653 if p != x0.Args[0] { 26654 break 26655 } 26656 if idx != x0.Args[1] { 26657 break 26658 } 26659 if mem != x0.Args[2] { 26660 break 26661 } 26662 y := or.Args[1] 26663 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)) { 26664 break 26665 } 26666 b = mergePoint(b, x0, x1) 26667 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26668 v.reset(OpCopy) 26669 v.AddArg(v0) 26670 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26671 v1.AuxInt = j0 26672 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26673 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26674 v3.AuxInt = i0 26675 v3.Aux = s 26676 v3.AddArg(p) 26677 v3.AddArg(idx) 26678 v3.AddArg(mem) 26679 v2.AddArg(v3) 26680 v1.AddArg(v2) 26681 v0.AddArg(v1) 26682 v0.AddArg(y) 26683 return true 26684 } 26685 // 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)) 26686 // 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) 26687 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26688 for { 26689 _ = v.Args[1] 26690 s1 := v.Args[0] 26691 if s1.Op != OpS390XSLDconst { 26692 break 26693 } 26694 j1 := s1.AuxInt 26695 x1 := s1.Args[0] 26696 if x1.Op != OpS390XMOVBZloadidx { 26697 break 26698 } 26699 i1 := x1.AuxInt 26700 s := x1.Aux 26701 _ = x1.Args[2] 26702 p := x1.Args[0] 26703 idx := x1.Args[1] 26704 mem := x1.Args[2] 26705 or := v.Args[1] 26706 if or.Op != OpS390XOR { 26707 break 26708 } 26709 _ = or.Args[1] 26710 s0 := or.Args[0] 26711 if s0.Op != OpS390XSLDconst { 26712 break 26713 } 26714 j0 := s0.AuxInt 26715 x0 := s0.Args[0] 26716 if x0.Op != OpS390XMOVBZloadidx { 26717 break 26718 } 26719 i0 := x0.AuxInt 26720 if x0.Aux != s { 26721 break 26722 } 26723 _ = x0.Args[2] 26724 if idx != x0.Args[0] { 26725 break 26726 } 26727 if p != x0.Args[1] { 26728 break 26729 } 26730 if mem != x0.Args[2] { 26731 break 26732 } 26733 y := or.Args[1] 26734 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)) { 26735 break 26736 } 26737 b = mergePoint(b, x0, x1) 26738 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26739 v.reset(OpCopy) 26740 v.AddArg(v0) 26741 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26742 v1.AuxInt = j0 26743 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26744 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26745 v3.AuxInt = i0 26746 v3.Aux = s 26747 v3.AddArg(p) 26748 v3.AddArg(idx) 26749 v3.AddArg(mem) 26750 v2.AddArg(v3) 26751 v1.AddArg(v2) 26752 v0.AddArg(v1) 26753 v0.AddArg(y) 26754 return true 26755 } 26756 // 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)) 26757 // 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) 26758 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26759 for { 26760 _ = v.Args[1] 26761 s1 := v.Args[0] 26762 if s1.Op != OpS390XSLDconst { 26763 break 26764 } 26765 j1 := s1.AuxInt 26766 x1 := s1.Args[0] 26767 if x1.Op != OpS390XMOVBZloadidx { 26768 break 26769 } 26770 i1 := x1.AuxInt 26771 s := x1.Aux 26772 _ = x1.Args[2] 26773 idx := x1.Args[0] 26774 p := x1.Args[1] 26775 mem := x1.Args[2] 26776 or := v.Args[1] 26777 if or.Op != OpS390XOR { 26778 break 26779 } 26780 _ = or.Args[1] 26781 s0 := or.Args[0] 26782 if s0.Op != OpS390XSLDconst { 26783 break 26784 } 26785 j0 := s0.AuxInt 26786 x0 := s0.Args[0] 26787 if x0.Op != OpS390XMOVBZloadidx { 26788 break 26789 } 26790 i0 := x0.AuxInt 26791 if x0.Aux != s { 26792 break 26793 } 26794 _ = x0.Args[2] 26795 if idx != x0.Args[0] { 26796 break 26797 } 26798 if p != x0.Args[1] { 26799 break 26800 } 26801 if mem != x0.Args[2] { 26802 break 26803 } 26804 y := or.Args[1] 26805 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)) { 26806 break 26807 } 26808 b = mergePoint(b, x0, x1) 26809 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26810 v.reset(OpCopy) 26811 v.AddArg(v0) 26812 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26813 v1.AuxInt = j0 26814 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26815 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26816 v3.AuxInt = i0 26817 v3.Aux = s 26818 v3.AddArg(p) 26819 v3.AddArg(idx) 26820 v3.AddArg(mem) 26821 v2.AddArg(v3) 26822 v1.AddArg(v2) 26823 v0.AddArg(v1) 26824 v0.AddArg(y) 26825 return true 26826 } 26827 // 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)))) 26828 // 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) 26829 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26830 for { 26831 _ = v.Args[1] 26832 s1 := v.Args[0] 26833 if s1.Op != OpS390XSLDconst { 26834 break 26835 } 26836 j1 := s1.AuxInt 26837 x1 := s1.Args[0] 26838 if x1.Op != OpS390XMOVBZloadidx { 26839 break 26840 } 26841 i1 := x1.AuxInt 26842 s := x1.Aux 26843 _ = x1.Args[2] 26844 p := x1.Args[0] 26845 idx := x1.Args[1] 26846 mem := x1.Args[2] 26847 or := v.Args[1] 26848 if or.Op != OpS390XOR { 26849 break 26850 } 26851 _ = or.Args[1] 26852 y := or.Args[0] 26853 s0 := or.Args[1] 26854 if s0.Op != OpS390XSLDconst { 26855 break 26856 } 26857 j0 := s0.AuxInt 26858 x0 := s0.Args[0] 26859 if x0.Op != OpS390XMOVBZloadidx { 26860 break 26861 } 26862 i0 := x0.AuxInt 26863 if x0.Aux != s { 26864 break 26865 } 26866 _ = x0.Args[2] 26867 if p != x0.Args[0] { 26868 break 26869 } 26870 if idx != x0.Args[1] { 26871 break 26872 } 26873 if mem != x0.Args[2] { 26874 break 26875 } 26876 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)) { 26877 break 26878 } 26879 b = mergePoint(b, x0, x1) 26880 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26881 v.reset(OpCopy) 26882 v.AddArg(v0) 26883 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26884 v1.AuxInt = j0 26885 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26886 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26887 v3.AuxInt = i0 26888 v3.Aux = s 26889 v3.AddArg(p) 26890 v3.AddArg(idx) 26891 v3.AddArg(mem) 26892 v2.AddArg(v3) 26893 v1.AddArg(v2) 26894 v0.AddArg(v1) 26895 v0.AddArg(y) 26896 return true 26897 } 26898 // 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)))) 26899 // 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) 26900 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26901 for { 26902 _ = v.Args[1] 26903 s1 := v.Args[0] 26904 if s1.Op != OpS390XSLDconst { 26905 break 26906 } 26907 j1 := s1.AuxInt 26908 x1 := s1.Args[0] 26909 if x1.Op != OpS390XMOVBZloadidx { 26910 break 26911 } 26912 i1 := x1.AuxInt 26913 s := x1.Aux 26914 _ = x1.Args[2] 26915 idx := x1.Args[0] 26916 p := x1.Args[1] 26917 mem := x1.Args[2] 26918 or := v.Args[1] 26919 if or.Op != OpS390XOR { 26920 break 26921 } 26922 _ = or.Args[1] 26923 y := or.Args[0] 26924 s0 := or.Args[1] 26925 if s0.Op != OpS390XSLDconst { 26926 break 26927 } 26928 j0 := s0.AuxInt 26929 x0 := s0.Args[0] 26930 if x0.Op != OpS390XMOVBZloadidx { 26931 break 26932 } 26933 i0 := x0.AuxInt 26934 if x0.Aux != s { 26935 break 26936 } 26937 _ = x0.Args[2] 26938 if p != x0.Args[0] { 26939 break 26940 } 26941 if idx != x0.Args[1] { 26942 break 26943 } 26944 if mem != x0.Args[2] { 26945 break 26946 } 26947 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)) { 26948 break 26949 } 26950 b = mergePoint(b, x0, x1) 26951 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26952 v.reset(OpCopy) 26953 v.AddArg(v0) 26954 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26955 v1.AuxInt = j0 26956 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26957 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26958 v3.AuxInt = i0 26959 v3.Aux = s 26960 v3.AddArg(p) 26961 v3.AddArg(idx) 26962 v3.AddArg(mem) 26963 v2.AddArg(v3) 26964 v1.AddArg(v2) 26965 v0.AddArg(v1) 26966 v0.AddArg(y) 26967 return true 26968 } 26969 // 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)))) 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 (MOVHBRloadidx [i0] {s} p idx 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 != OpS390XMOVBZloadidx { 26981 break 26982 } 26983 i1 := x1.AuxInt 26984 s := x1.Aux 26985 _ = x1.Args[2] 26986 p := x1.Args[0] 26987 idx := x1.Args[1] 26988 mem := x1.Args[2] 26989 or := v.Args[1] 26990 if or.Op != OpS390XOR { 26991 break 26992 } 26993 _ = or.Args[1] 26994 y := or.Args[0] 26995 s0 := or.Args[1] 26996 if s0.Op != OpS390XSLDconst { 26997 break 26998 } 26999 j0 := s0.AuxInt 27000 x0 := s0.Args[0] 27001 if x0.Op != OpS390XMOVBZloadidx { 27002 break 27003 } 27004 i0 := x0.AuxInt 27005 if x0.Aux != s { 27006 break 27007 } 27008 _ = x0.Args[2] 27009 if idx != x0.Args[0] { 27010 break 27011 } 27012 if p != x0.Args[1] { 27013 break 27014 } 27015 if mem != x0.Args[2] { 27016 break 27017 } 27018 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)) { 27019 break 27020 } 27021 b = mergePoint(b, x0, x1) 27022 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27023 v.reset(OpCopy) 27024 v.AddArg(v0) 27025 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27026 v1.AuxInt = j0 27027 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27028 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27029 v3.AuxInt = i0 27030 v3.Aux = s 27031 v3.AddArg(p) 27032 v3.AddArg(idx) 27033 v3.AddArg(mem) 27034 v2.AddArg(v3) 27035 v1.AddArg(v2) 27036 v0.AddArg(v1) 27037 v0.AddArg(y) 27038 return true 27039 } 27040 // 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)))) 27041 // 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) 27042 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27043 for { 27044 _ = v.Args[1] 27045 s1 := v.Args[0] 27046 if s1.Op != OpS390XSLDconst { 27047 break 27048 } 27049 j1 := s1.AuxInt 27050 x1 := s1.Args[0] 27051 if x1.Op != OpS390XMOVBZloadidx { 27052 break 27053 } 27054 i1 := x1.AuxInt 27055 s := x1.Aux 27056 _ = x1.Args[2] 27057 idx := x1.Args[0] 27058 p := x1.Args[1] 27059 mem := x1.Args[2] 27060 or := v.Args[1] 27061 if or.Op != OpS390XOR { 27062 break 27063 } 27064 _ = or.Args[1] 27065 y := or.Args[0] 27066 s0 := or.Args[1] 27067 if s0.Op != OpS390XSLDconst { 27068 break 27069 } 27070 j0 := s0.AuxInt 27071 x0 := s0.Args[0] 27072 if x0.Op != OpS390XMOVBZloadidx { 27073 break 27074 } 27075 i0 := x0.AuxInt 27076 if x0.Aux != s { 27077 break 27078 } 27079 _ = x0.Args[2] 27080 if idx != x0.Args[0] { 27081 break 27082 } 27083 if p != x0.Args[1] { 27084 break 27085 } 27086 if mem != x0.Args[2] { 27087 break 27088 } 27089 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)) { 27090 break 27091 } 27092 b = mergePoint(b, x0, x1) 27093 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27094 v.reset(OpCopy) 27095 v.AddArg(v0) 27096 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27097 v1.AuxInt = j0 27098 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27099 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27100 v3.AuxInt = i0 27101 v3.Aux = s 27102 v3.AddArg(p) 27103 v3.AddArg(idx) 27104 v3.AddArg(mem) 27105 v2.AddArg(v3) 27106 v1.AddArg(v2) 27107 v0.AddArg(v1) 27108 v0.AddArg(y) 27109 return true 27110 } 27111 // 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))) 27112 // 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) 27113 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27114 for { 27115 _ = v.Args[1] 27116 or := v.Args[0] 27117 if or.Op != OpS390XOR { 27118 break 27119 } 27120 _ = or.Args[1] 27121 s0 := or.Args[0] 27122 if s0.Op != OpS390XSLDconst { 27123 break 27124 } 27125 j0 := s0.AuxInt 27126 x0 := s0.Args[0] 27127 if x0.Op != OpS390XMOVBZloadidx { 27128 break 27129 } 27130 i0 := x0.AuxInt 27131 s := x0.Aux 27132 _ = x0.Args[2] 27133 p := x0.Args[0] 27134 idx := x0.Args[1] 27135 mem := x0.Args[2] 27136 y := or.Args[1] 27137 s1 := v.Args[1] 27138 if s1.Op != OpS390XSLDconst { 27139 break 27140 } 27141 j1 := s1.AuxInt 27142 x1 := s1.Args[0] 27143 if x1.Op != OpS390XMOVBZloadidx { 27144 break 27145 } 27146 i1 := x1.AuxInt 27147 if x1.Aux != s { 27148 break 27149 } 27150 _ = x1.Args[2] 27151 if p != x1.Args[0] { 27152 break 27153 } 27154 if idx != x1.Args[1] { 27155 break 27156 } 27157 if mem != x1.Args[2] { 27158 break 27159 } 27160 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)) { 27161 break 27162 } 27163 b = mergePoint(b, x0, x1) 27164 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27165 v.reset(OpCopy) 27166 v.AddArg(v0) 27167 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27168 v1.AuxInt = j0 27169 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27170 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27171 v3.AuxInt = i0 27172 v3.Aux = s 27173 v3.AddArg(p) 27174 v3.AddArg(idx) 27175 v3.AddArg(mem) 27176 v2.AddArg(v3) 27177 v1.AddArg(v2) 27178 v0.AddArg(v1) 27179 v0.AddArg(y) 27180 return true 27181 } 27182 // 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))) 27183 // 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) 27184 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27185 for { 27186 _ = v.Args[1] 27187 or := v.Args[0] 27188 if or.Op != OpS390XOR { 27189 break 27190 } 27191 _ = or.Args[1] 27192 s0 := or.Args[0] 27193 if s0.Op != OpS390XSLDconst { 27194 break 27195 } 27196 j0 := s0.AuxInt 27197 x0 := s0.Args[0] 27198 if x0.Op != OpS390XMOVBZloadidx { 27199 break 27200 } 27201 i0 := x0.AuxInt 27202 s := x0.Aux 27203 _ = x0.Args[2] 27204 idx := x0.Args[0] 27205 p := x0.Args[1] 27206 mem := x0.Args[2] 27207 y := or.Args[1] 27208 s1 := v.Args[1] 27209 if s1.Op != OpS390XSLDconst { 27210 break 27211 } 27212 j1 := s1.AuxInt 27213 x1 := s1.Args[0] 27214 if x1.Op != OpS390XMOVBZloadidx { 27215 break 27216 } 27217 i1 := x1.AuxInt 27218 if x1.Aux != s { 27219 break 27220 } 27221 _ = x1.Args[2] 27222 if p != x1.Args[0] { 27223 break 27224 } 27225 if idx != x1.Args[1] { 27226 break 27227 } 27228 if mem != x1.Args[2] { 27229 break 27230 } 27231 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)) { 27232 break 27233 } 27234 b = mergePoint(b, x0, x1) 27235 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27236 v.reset(OpCopy) 27237 v.AddArg(v0) 27238 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27239 v1.AuxInt = j0 27240 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27241 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27242 v3.AuxInt = i0 27243 v3.Aux = s 27244 v3.AddArg(p) 27245 v3.AddArg(idx) 27246 v3.AddArg(mem) 27247 v2.AddArg(v3) 27248 v1.AddArg(v2) 27249 v0.AddArg(v1) 27250 v0.AddArg(y) 27251 return true 27252 } 27253 // 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))) 27254 // 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) 27255 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27256 for { 27257 _ = v.Args[1] 27258 or := v.Args[0] 27259 if or.Op != OpS390XOR { 27260 break 27261 } 27262 _ = or.Args[1] 27263 y := or.Args[0] 27264 s0 := or.Args[1] 27265 if s0.Op != OpS390XSLDconst { 27266 break 27267 } 27268 j0 := s0.AuxInt 27269 x0 := s0.Args[0] 27270 if x0.Op != OpS390XMOVBZloadidx { 27271 break 27272 } 27273 i0 := x0.AuxInt 27274 s := x0.Aux 27275 _ = x0.Args[2] 27276 p := x0.Args[0] 27277 idx := x0.Args[1] 27278 mem := x0.Args[2] 27279 s1 := v.Args[1] 27280 if s1.Op != OpS390XSLDconst { 27281 break 27282 } 27283 j1 := s1.AuxInt 27284 x1 := s1.Args[0] 27285 if x1.Op != OpS390XMOVBZloadidx { 27286 break 27287 } 27288 i1 := x1.AuxInt 27289 if x1.Aux != s { 27290 break 27291 } 27292 _ = x1.Args[2] 27293 if p != x1.Args[0] { 27294 break 27295 } 27296 if idx != x1.Args[1] { 27297 break 27298 } 27299 if mem != x1.Args[2] { 27300 break 27301 } 27302 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)) { 27303 break 27304 } 27305 b = mergePoint(b, x0, x1) 27306 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27307 v.reset(OpCopy) 27308 v.AddArg(v0) 27309 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27310 v1.AuxInt = j0 27311 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27312 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27313 v3.AuxInt = i0 27314 v3.Aux = s 27315 v3.AddArg(p) 27316 v3.AddArg(idx) 27317 v3.AddArg(mem) 27318 v2.AddArg(v3) 27319 v1.AddArg(v2) 27320 v0.AddArg(v1) 27321 v0.AddArg(y) 27322 return true 27323 } 27324 return false 27325 } 27326 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 27327 b := v.Block 27328 _ = b 27329 typ := &b.Func.Config.Types 27330 _ = typ 27331 // 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))) 27332 // 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) 27333 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27334 for { 27335 _ = v.Args[1] 27336 or := v.Args[0] 27337 if or.Op != OpS390XOR { 27338 break 27339 } 27340 _ = or.Args[1] 27341 y := or.Args[0] 27342 s0 := or.Args[1] 27343 if s0.Op != OpS390XSLDconst { 27344 break 27345 } 27346 j0 := s0.AuxInt 27347 x0 := s0.Args[0] 27348 if x0.Op != OpS390XMOVBZloadidx { 27349 break 27350 } 27351 i0 := x0.AuxInt 27352 s := x0.Aux 27353 _ = x0.Args[2] 27354 idx := x0.Args[0] 27355 p := x0.Args[1] 27356 mem := x0.Args[2] 27357 s1 := v.Args[1] 27358 if s1.Op != OpS390XSLDconst { 27359 break 27360 } 27361 j1 := s1.AuxInt 27362 x1 := s1.Args[0] 27363 if x1.Op != OpS390XMOVBZloadidx { 27364 break 27365 } 27366 i1 := x1.AuxInt 27367 if x1.Aux != s { 27368 break 27369 } 27370 _ = x1.Args[2] 27371 if p != x1.Args[0] { 27372 break 27373 } 27374 if idx != x1.Args[1] { 27375 break 27376 } 27377 if mem != x1.Args[2] { 27378 break 27379 } 27380 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)) { 27381 break 27382 } 27383 b = mergePoint(b, x0, x1) 27384 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27385 v.reset(OpCopy) 27386 v.AddArg(v0) 27387 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27388 v1.AuxInt = j0 27389 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27390 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27391 v3.AuxInt = i0 27392 v3.Aux = s 27393 v3.AddArg(p) 27394 v3.AddArg(idx) 27395 v3.AddArg(mem) 27396 v2.AddArg(v3) 27397 v1.AddArg(v2) 27398 v0.AddArg(v1) 27399 v0.AddArg(y) 27400 return true 27401 } 27402 // 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))) 27403 // 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) 27404 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27405 for { 27406 _ = v.Args[1] 27407 or := v.Args[0] 27408 if or.Op != OpS390XOR { 27409 break 27410 } 27411 _ = or.Args[1] 27412 s0 := or.Args[0] 27413 if s0.Op != OpS390XSLDconst { 27414 break 27415 } 27416 j0 := s0.AuxInt 27417 x0 := s0.Args[0] 27418 if x0.Op != OpS390XMOVBZloadidx { 27419 break 27420 } 27421 i0 := x0.AuxInt 27422 s := x0.Aux 27423 _ = x0.Args[2] 27424 p := x0.Args[0] 27425 idx := x0.Args[1] 27426 mem := x0.Args[2] 27427 y := or.Args[1] 27428 s1 := v.Args[1] 27429 if s1.Op != OpS390XSLDconst { 27430 break 27431 } 27432 j1 := s1.AuxInt 27433 x1 := s1.Args[0] 27434 if x1.Op != OpS390XMOVBZloadidx { 27435 break 27436 } 27437 i1 := x1.AuxInt 27438 if x1.Aux != s { 27439 break 27440 } 27441 _ = x1.Args[2] 27442 if idx != x1.Args[0] { 27443 break 27444 } 27445 if p != x1.Args[1] { 27446 break 27447 } 27448 if mem != x1.Args[2] { 27449 break 27450 } 27451 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)) { 27452 break 27453 } 27454 b = mergePoint(b, x0, x1) 27455 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27456 v.reset(OpCopy) 27457 v.AddArg(v0) 27458 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27459 v1.AuxInt = j0 27460 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27461 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27462 v3.AuxInt = i0 27463 v3.Aux = s 27464 v3.AddArg(p) 27465 v3.AddArg(idx) 27466 v3.AddArg(mem) 27467 v2.AddArg(v3) 27468 v1.AddArg(v2) 27469 v0.AddArg(v1) 27470 v0.AddArg(y) 27471 return true 27472 } 27473 // 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))) 27474 // 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) 27475 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27476 for { 27477 _ = v.Args[1] 27478 or := v.Args[0] 27479 if or.Op != OpS390XOR { 27480 break 27481 } 27482 _ = or.Args[1] 27483 s0 := or.Args[0] 27484 if s0.Op != OpS390XSLDconst { 27485 break 27486 } 27487 j0 := s0.AuxInt 27488 x0 := s0.Args[0] 27489 if x0.Op != OpS390XMOVBZloadidx { 27490 break 27491 } 27492 i0 := x0.AuxInt 27493 s := x0.Aux 27494 _ = x0.Args[2] 27495 idx := x0.Args[0] 27496 p := x0.Args[1] 27497 mem := x0.Args[2] 27498 y := or.Args[1] 27499 s1 := v.Args[1] 27500 if s1.Op != OpS390XSLDconst { 27501 break 27502 } 27503 j1 := s1.AuxInt 27504 x1 := s1.Args[0] 27505 if x1.Op != OpS390XMOVBZloadidx { 27506 break 27507 } 27508 i1 := x1.AuxInt 27509 if x1.Aux != s { 27510 break 27511 } 27512 _ = x1.Args[2] 27513 if idx != x1.Args[0] { 27514 break 27515 } 27516 if p != x1.Args[1] { 27517 break 27518 } 27519 if mem != x1.Args[2] { 27520 break 27521 } 27522 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)) { 27523 break 27524 } 27525 b = mergePoint(b, x0, x1) 27526 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27527 v.reset(OpCopy) 27528 v.AddArg(v0) 27529 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27530 v1.AuxInt = j0 27531 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27532 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27533 v3.AuxInt = i0 27534 v3.Aux = s 27535 v3.AddArg(p) 27536 v3.AddArg(idx) 27537 v3.AddArg(mem) 27538 v2.AddArg(v3) 27539 v1.AddArg(v2) 27540 v0.AddArg(v1) 27541 v0.AddArg(y) 27542 return true 27543 } 27544 // 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))) 27545 // 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) 27546 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27547 for { 27548 _ = v.Args[1] 27549 or := v.Args[0] 27550 if or.Op != OpS390XOR { 27551 break 27552 } 27553 _ = or.Args[1] 27554 y := or.Args[0] 27555 s0 := or.Args[1] 27556 if s0.Op != OpS390XSLDconst { 27557 break 27558 } 27559 j0 := s0.AuxInt 27560 x0 := s0.Args[0] 27561 if x0.Op != OpS390XMOVBZloadidx { 27562 break 27563 } 27564 i0 := x0.AuxInt 27565 s := x0.Aux 27566 _ = x0.Args[2] 27567 p := x0.Args[0] 27568 idx := x0.Args[1] 27569 mem := x0.Args[2] 27570 s1 := v.Args[1] 27571 if s1.Op != OpS390XSLDconst { 27572 break 27573 } 27574 j1 := s1.AuxInt 27575 x1 := s1.Args[0] 27576 if x1.Op != OpS390XMOVBZloadidx { 27577 break 27578 } 27579 i1 := x1.AuxInt 27580 if x1.Aux != s { 27581 break 27582 } 27583 _ = x1.Args[2] 27584 if idx != x1.Args[0] { 27585 break 27586 } 27587 if p != x1.Args[1] { 27588 break 27589 } 27590 if mem != x1.Args[2] { 27591 break 27592 } 27593 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)) { 27594 break 27595 } 27596 b = mergePoint(b, x0, x1) 27597 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27598 v.reset(OpCopy) 27599 v.AddArg(v0) 27600 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27601 v1.AuxInt = j0 27602 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27603 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27604 v3.AuxInt = i0 27605 v3.Aux = s 27606 v3.AddArg(p) 27607 v3.AddArg(idx) 27608 v3.AddArg(mem) 27609 v2.AddArg(v3) 27610 v1.AddArg(v2) 27611 v0.AddArg(v1) 27612 v0.AddArg(y) 27613 return true 27614 } 27615 // 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))) 27616 // 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) 27617 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27618 for { 27619 _ = v.Args[1] 27620 or := v.Args[0] 27621 if or.Op != OpS390XOR { 27622 break 27623 } 27624 _ = or.Args[1] 27625 y := or.Args[0] 27626 s0 := or.Args[1] 27627 if s0.Op != OpS390XSLDconst { 27628 break 27629 } 27630 j0 := s0.AuxInt 27631 x0 := s0.Args[0] 27632 if x0.Op != OpS390XMOVBZloadidx { 27633 break 27634 } 27635 i0 := x0.AuxInt 27636 s := x0.Aux 27637 _ = x0.Args[2] 27638 idx := x0.Args[0] 27639 p := x0.Args[1] 27640 mem := x0.Args[2] 27641 s1 := v.Args[1] 27642 if s1.Op != OpS390XSLDconst { 27643 break 27644 } 27645 j1 := s1.AuxInt 27646 x1 := s1.Args[0] 27647 if x1.Op != OpS390XMOVBZloadidx { 27648 break 27649 } 27650 i1 := x1.AuxInt 27651 if x1.Aux != s { 27652 break 27653 } 27654 _ = x1.Args[2] 27655 if idx != x1.Args[0] { 27656 break 27657 } 27658 if p != x1.Args[1] { 27659 break 27660 } 27661 if mem != x1.Args[2] { 27662 break 27663 } 27664 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)) { 27665 break 27666 } 27667 b = mergePoint(b, x0, x1) 27668 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27669 v.reset(OpCopy) 27670 v.AddArg(v0) 27671 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27672 v1.AuxInt = j0 27673 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27674 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27675 v3.AuxInt = i0 27676 v3.Aux = s 27677 v3.AddArg(p) 27678 v3.AddArg(idx) 27679 v3.AddArg(mem) 27680 v2.AddArg(v3) 27681 v1.AddArg(v2) 27682 v0.AddArg(v1) 27683 v0.AddArg(y) 27684 return true 27685 } 27686 // 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)) 27687 // 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) 27688 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27689 for { 27690 _ = v.Args[1] 27691 s1 := v.Args[0] 27692 if s1.Op != OpS390XSLDconst { 27693 break 27694 } 27695 j1 := s1.AuxInt 27696 r1 := s1.Args[0] 27697 if r1.Op != OpS390XMOVHZreg { 27698 break 27699 } 27700 x1 := r1.Args[0] 27701 if x1.Op != OpS390XMOVHBRloadidx { 27702 break 27703 } 27704 i1 := x1.AuxInt 27705 s := x1.Aux 27706 _ = x1.Args[2] 27707 p := x1.Args[0] 27708 idx := x1.Args[1] 27709 mem := x1.Args[2] 27710 or := v.Args[1] 27711 if or.Op != OpS390XOR { 27712 break 27713 } 27714 _ = or.Args[1] 27715 s0 := or.Args[0] 27716 if s0.Op != OpS390XSLDconst { 27717 break 27718 } 27719 j0 := s0.AuxInt 27720 r0 := s0.Args[0] 27721 if r0.Op != OpS390XMOVHZreg { 27722 break 27723 } 27724 x0 := r0.Args[0] 27725 if x0.Op != OpS390XMOVHBRloadidx { 27726 break 27727 } 27728 i0 := x0.AuxInt 27729 if x0.Aux != s { 27730 break 27731 } 27732 _ = x0.Args[2] 27733 if p != x0.Args[0] { 27734 break 27735 } 27736 if idx != x0.Args[1] { 27737 break 27738 } 27739 if mem != x0.Args[2] { 27740 break 27741 } 27742 y := or.Args[1] 27743 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)) { 27744 break 27745 } 27746 b = mergePoint(b, x0, x1) 27747 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27748 v.reset(OpCopy) 27749 v.AddArg(v0) 27750 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27751 v1.AuxInt = j0 27752 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27753 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27754 v3.AuxInt = i0 27755 v3.Aux = s 27756 v3.AddArg(p) 27757 v3.AddArg(idx) 27758 v3.AddArg(mem) 27759 v2.AddArg(v3) 27760 v1.AddArg(v2) 27761 v0.AddArg(v1) 27762 v0.AddArg(y) 27763 return true 27764 } 27765 // 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)) 27766 // 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) 27767 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27768 for { 27769 _ = v.Args[1] 27770 s1 := v.Args[0] 27771 if s1.Op != OpS390XSLDconst { 27772 break 27773 } 27774 j1 := s1.AuxInt 27775 r1 := s1.Args[0] 27776 if r1.Op != OpS390XMOVHZreg { 27777 break 27778 } 27779 x1 := r1.Args[0] 27780 if x1.Op != OpS390XMOVHBRloadidx { 27781 break 27782 } 27783 i1 := x1.AuxInt 27784 s := x1.Aux 27785 _ = x1.Args[2] 27786 idx := x1.Args[0] 27787 p := x1.Args[1] 27788 mem := x1.Args[2] 27789 or := v.Args[1] 27790 if or.Op != OpS390XOR { 27791 break 27792 } 27793 _ = or.Args[1] 27794 s0 := or.Args[0] 27795 if s0.Op != OpS390XSLDconst { 27796 break 27797 } 27798 j0 := s0.AuxInt 27799 r0 := s0.Args[0] 27800 if r0.Op != OpS390XMOVHZreg { 27801 break 27802 } 27803 x0 := r0.Args[0] 27804 if x0.Op != OpS390XMOVHBRloadidx { 27805 break 27806 } 27807 i0 := x0.AuxInt 27808 if x0.Aux != s { 27809 break 27810 } 27811 _ = x0.Args[2] 27812 if p != x0.Args[0] { 27813 break 27814 } 27815 if idx != x0.Args[1] { 27816 break 27817 } 27818 if mem != x0.Args[2] { 27819 break 27820 } 27821 y := or.Args[1] 27822 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)) { 27823 break 27824 } 27825 b = mergePoint(b, x0, x1) 27826 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27827 v.reset(OpCopy) 27828 v.AddArg(v0) 27829 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27830 v1.AuxInt = j0 27831 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27832 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27833 v3.AuxInt = i0 27834 v3.Aux = s 27835 v3.AddArg(p) 27836 v3.AddArg(idx) 27837 v3.AddArg(mem) 27838 v2.AddArg(v3) 27839 v1.AddArg(v2) 27840 v0.AddArg(v1) 27841 v0.AddArg(y) 27842 return true 27843 } 27844 // 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)) 27845 // 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) 27846 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27847 for { 27848 _ = v.Args[1] 27849 s1 := v.Args[0] 27850 if s1.Op != OpS390XSLDconst { 27851 break 27852 } 27853 j1 := s1.AuxInt 27854 r1 := s1.Args[0] 27855 if r1.Op != OpS390XMOVHZreg { 27856 break 27857 } 27858 x1 := r1.Args[0] 27859 if x1.Op != OpS390XMOVHBRloadidx { 27860 break 27861 } 27862 i1 := x1.AuxInt 27863 s := x1.Aux 27864 _ = x1.Args[2] 27865 p := x1.Args[0] 27866 idx := x1.Args[1] 27867 mem := x1.Args[2] 27868 or := v.Args[1] 27869 if or.Op != OpS390XOR { 27870 break 27871 } 27872 _ = or.Args[1] 27873 s0 := or.Args[0] 27874 if s0.Op != OpS390XSLDconst { 27875 break 27876 } 27877 j0 := s0.AuxInt 27878 r0 := s0.Args[0] 27879 if r0.Op != OpS390XMOVHZreg { 27880 break 27881 } 27882 x0 := r0.Args[0] 27883 if x0.Op != OpS390XMOVHBRloadidx { 27884 break 27885 } 27886 i0 := x0.AuxInt 27887 if x0.Aux != s { 27888 break 27889 } 27890 _ = x0.Args[2] 27891 if idx != x0.Args[0] { 27892 break 27893 } 27894 if p != x0.Args[1] { 27895 break 27896 } 27897 if mem != x0.Args[2] { 27898 break 27899 } 27900 y := or.Args[1] 27901 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)) { 27902 break 27903 } 27904 b = mergePoint(b, x0, x1) 27905 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27906 v.reset(OpCopy) 27907 v.AddArg(v0) 27908 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27909 v1.AuxInt = j0 27910 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27911 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27912 v3.AuxInt = i0 27913 v3.Aux = s 27914 v3.AddArg(p) 27915 v3.AddArg(idx) 27916 v3.AddArg(mem) 27917 v2.AddArg(v3) 27918 v1.AddArg(v2) 27919 v0.AddArg(v1) 27920 v0.AddArg(y) 27921 return true 27922 } 27923 // 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)) 27924 // 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) 27925 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27926 for { 27927 _ = v.Args[1] 27928 s1 := v.Args[0] 27929 if s1.Op != OpS390XSLDconst { 27930 break 27931 } 27932 j1 := s1.AuxInt 27933 r1 := s1.Args[0] 27934 if r1.Op != OpS390XMOVHZreg { 27935 break 27936 } 27937 x1 := r1.Args[0] 27938 if x1.Op != OpS390XMOVHBRloadidx { 27939 break 27940 } 27941 i1 := x1.AuxInt 27942 s := x1.Aux 27943 _ = x1.Args[2] 27944 idx := x1.Args[0] 27945 p := x1.Args[1] 27946 mem := x1.Args[2] 27947 or := v.Args[1] 27948 if or.Op != OpS390XOR { 27949 break 27950 } 27951 _ = or.Args[1] 27952 s0 := or.Args[0] 27953 if s0.Op != OpS390XSLDconst { 27954 break 27955 } 27956 j0 := s0.AuxInt 27957 r0 := s0.Args[0] 27958 if r0.Op != OpS390XMOVHZreg { 27959 break 27960 } 27961 x0 := r0.Args[0] 27962 if x0.Op != OpS390XMOVHBRloadidx { 27963 break 27964 } 27965 i0 := x0.AuxInt 27966 if x0.Aux != s { 27967 break 27968 } 27969 _ = x0.Args[2] 27970 if idx != x0.Args[0] { 27971 break 27972 } 27973 if p != x0.Args[1] { 27974 break 27975 } 27976 if mem != x0.Args[2] { 27977 break 27978 } 27979 y := or.Args[1] 27980 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)) { 27981 break 27982 } 27983 b = mergePoint(b, x0, x1) 27984 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27985 v.reset(OpCopy) 27986 v.AddArg(v0) 27987 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27988 v1.AuxInt = j0 27989 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27990 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27991 v3.AuxInt = i0 27992 v3.Aux = s 27993 v3.AddArg(p) 27994 v3.AddArg(idx) 27995 v3.AddArg(mem) 27996 v2.AddArg(v3) 27997 v1.AddArg(v2) 27998 v0.AddArg(v1) 27999 v0.AddArg(y) 28000 return true 28001 } 28002 // 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))))) 28003 // 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) 28004 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28005 for { 28006 _ = v.Args[1] 28007 s1 := v.Args[0] 28008 if s1.Op != OpS390XSLDconst { 28009 break 28010 } 28011 j1 := s1.AuxInt 28012 r1 := s1.Args[0] 28013 if r1.Op != OpS390XMOVHZreg { 28014 break 28015 } 28016 x1 := r1.Args[0] 28017 if x1.Op != OpS390XMOVHBRloadidx { 28018 break 28019 } 28020 i1 := x1.AuxInt 28021 s := x1.Aux 28022 _ = x1.Args[2] 28023 p := x1.Args[0] 28024 idx := x1.Args[1] 28025 mem := x1.Args[2] 28026 or := v.Args[1] 28027 if or.Op != OpS390XOR { 28028 break 28029 } 28030 _ = or.Args[1] 28031 y := or.Args[0] 28032 s0 := or.Args[1] 28033 if s0.Op != OpS390XSLDconst { 28034 break 28035 } 28036 j0 := s0.AuxInt 28037 r0 := s0.Args[0] 28038 if r0.Op != OpS390XMOVHZreg { 28039 break 28040 } 28041 x0 := r0.Args[0] 28042 if x0.Op != OpS390XMOVHBRloadidx { 28043 break 28044 } 28045 i0 := x0.AuxInt 28046 if x0.Aux != s { 28047 break 28048 } 28049 _ = x0.Args[2] 28050 if p != x0.Args[0] { 28051 break 28052 } 28053 if idx != x0.Args[1] { 28054 break 28055 } 28056 if mem != x0.Args[2] { 28057 break 28058 } 28059 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)) { 28060 break 28061 } 28062 b = mergePoint(b, x0, x1) 28063 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28064 v.reset(OpCopy) 28065 v.AddArg(v0) 28066 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28067 v1.AuxInt = j0 28068 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28069 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28070 v3.AuxInt = i0 28071 v3.Aux = s 28072 v3.AddArg(p) 28073 v3.AddArg(idx) 28074 v3.AddArg(mem) 28075 v2.AddArg(v3) 28076 v1.AddArg(v2) 28077 v0.AddArg(v1) 28078 v0.AddArg(y) 28079 return true 28080 } 28081 return false 28082 } 28083 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 28084 b := v.Block 28085 _ = b 28086 typ := &b.Func.Config.Types 28087 _ = typ 28088 // 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))))) 28089 // 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) 28090 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28091 for { 28092 _ = v.Args[1] 28093 s1 := v.Args[0] 28094 if s1.Op != OpS390XSLDconst { 28095 break 28096 } 28097 j1 := s1.AuxInt 28098 r1 := s1.Args[0] 28099 if r1.Op != OpS390XMOVHZreg { 28100 break 28101 } 28102 x1 := r1.Args[0] 28103 if x1.Op != OpS390XMOVHBRloadidx { 28104 break 28105 } 28106 i1 := x1.AuxInt 28107 s := x1.Aux 28108 _ = x1.Args[2] 28109 idx := x1.Args[0] 28110 p := x1.Args[1] 28111 mem := x1.Args[2] 28112 or := v.Args[1] 28113 if or.Op != OpS390XOR { 28114 break 28115 } 28116 _ = or.Args[1] 28117 y := or.Args[0] 28118 s0 := or.Args[1] 28119 if s0.Op != OpS390XSLDconst { 28120 break 28121 } 28122 j0 := s0.AuxInt 28123 r0 := s0.Args[0] 28124 if r0.Op != OpS390XMOVHZreg { 28125 break 28126 } 28127 x0 := r0.Args[0] 28128 if x0.Op != OpS390XMOVHBRloadidx { 28129 break 28130 } 28131 i0 := x0.AuxInt 28132 if x0.Aux != s { 28133 break 28134 } 28135 _ = x0.Args[2] 28136 if p != x0.Args[0] { 28137 break 28138 } 28139 if idx != x0.Args[1] { 28140 break 28141 } 28142 if mem != x0.Args[2] { 28143 break 28144 } 28145 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)) { 28146 break 28147 } 28148 b = mergePoint(b, x0, x1) 28149 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28150 v.reset(OpCopy) 28151 v.AddArg(v0) 28152 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28153 v1.AuxInt = j0 28154 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28155 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28156 v3.AuxInt = i0 28157 v3.Aux = s 28158 v3.AddArg(p) 28159 v3.AddArg(idx) 28160 v3.AddArg(mem) 28161 v2.AddArg(v3) 28162 v1.AddArg(v2) 28163 v0.AddArg(v1) 28164 v0.AddArg(y) 28165 return true 28166 } 28167 // 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))))) 28168 // 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) 28169 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28170 for { 28171 _ = v.Args[1] 28172 s1 := v.Args[0] 28173 if s1.Op != OpS390XSLDconst { 28174 break 28175 } 28176 j1 := s1.AuxInt 28177 r1 := s1.Args[0] 28178 if r1.Op != OpS390XMOVHZreg { 28179 break 28180 } 28181 x1 := r1.Args[0] 28182 if x1.Op != OpS390XMOVHBRloadidx { 28183 break 28184 } 28185 i1 := x1.AuxInt 28186 s := x1.Aux 28187 _ = x1.Args[2] 28188 p := x1.Args[0] 28189 idx := x1.Args[1] 28190 mem := x1.Args[2] 28191 or := v.Args[1] 28192 if or.Op != OpS390XOR { 28193 break 28194 } 28195 _ = or.Args[1] 28196 y := or.Args[0] 28197 s0 := or.Args[1] 28198 if s0.Op != OpS390XSLDconst { 28199 break 28200 } 28201 j0 := s0.AuxInt 28202 r0 := s0.Args[0] 28203 if r0.Op != OpS390XMOVHZreg { 28204 break 28205 } 28206 x0 := r0.Args[0] 28207 if x0.Op != OpS390XMOVHBRloadidx { 28208 break 28209 } 28210 i0 := x0.AuxInt 28211 if x0.Aux != s { 28212 break 28213 } 28214 _ = x0.Args[2] 28215 if idx != x0.Args[0] { 28216 break 28217 } 28218 if p != x0.Args[1] { 28219 break 28220 } 28221 if mem != x0.Args[2] { 28222 break 28223 } 28224 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)) { 28225 break 28226 } 28227 b = mergePoint(b, x0, x1) 28228 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28229 v.reset(OpCopy) 28230 v.AddArg(v0) 28231 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28232 v1.AuxInt = j0 28233 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28234 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28235 v3.AuxInt = i0 28236 v3.Aux = s 28237 v3.AddArg(p) 28238 v3.AddArg(idx) 28239 v3.AddArg(mem) 28240 v2.AddArg(v3) 28241 v1.AddArg(v2) 28242 v0.AddArg(v1) 28243 v0.AddArg(y) 28244 return true 28245 } 28246 // 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))))) 28247 // 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) 28248 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28249 for { 28250 _ = v.Args[1] 28251 s1 := v.Args[0] 28252 if s1.Op != OpS390XSLDconst { 28253 break 28254 } 28255 j1 := s1.AuxInt 28256 r1 := s1.Args[0] 28257 if r1.Op != OpS390XMOVHZreg { 28258 break 28259 } 28260 x1 := r1.Args[0] 28261 if x1.Op != OpS390XMOVHBRloadidx { 28262 break 28263 } 28264 i1 := x1.AuxInt 28265 s := x1.Aux 28266 _ = x1.Args[2] 28267 idx := x1.Args[0] 28268 p := x1.Args[1] 28269 mem := x1.Args[2] 28270 or := v.Args[1] 28271 if or.Op != OpS390XOR { 28272 break 28273 } 28274 _ = or.Args[1] 28275 y := or.Args[0] 28276 s0 := or.Args[1] 28277 if s0.Op != OpS390XSLDconst { 28278 break 28279 } 28280 j0 := s0.AuxInt 28281 r0 := s0.Args[0] 28282 if r0.Op != OpS390XMOVHZreg { 28283 break 28284 } 28285 x0 := r0.Args[0] 28286 if x0.Op != OpS390XMOVHBRloadidx { 28287 break 28288 } 28289 i0 := x0.AuxInt 28290 if x0.Aux != s { 28291 break 28292 } 28293 _ = x0.Args[2] 28294 if idx != x0.Args[0] { 28295 break 28296 } 28297 if p != x0.Args[1] { 28298 break 28299 } 28300 if mem != x0.Args[2] { 28301 break 28302 } 28303 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)) { 28304 break 28305 } 28306 b = mergePoint(b, x0, x1) 28307 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28308 v.reset(OpCopy) 28309 v.AddArg(v0) 28310 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28311 v1.AuxInt = j0 28312 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28313 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28314 v3.AuxInt = i0 28315 v3.Aux = s 28316 v3.AddArg(p) 28317 v3.AddArg(idx) 28318 v3.AddArg(mem) 28319 v2.AddArg(v3) 28320 v1.AddArg(v2) 28321 v0.AddArg(v1) 28322 v0.AddArg(y) 28323 return true 28324 } 28325 // 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)))) 28326 // 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) 28327 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28328 for { 28329 _ = v.Args[1] 28330 or := v.Args[0] 28331 if or.Op != OpS390XOR { 28332 break 28333 } 28334 _ = or.Args[1] 28335 s0 := or.Args[0] 28336 if s0.Op != OpS390XSLDconst { 28337 break 28338 } 28339 j0 := s0.AuxInt 28340 r0 := s0.Args[0] 28341 if r0.Op != OpS390XMOVHZreg { 28342 break 28343 } 28344 x0 := r0.Args[0] 28345 if x0.Op != OpS390XMOVHBRloadidx { 28346 break 28347 } 28348 i0 := x0.AuxInt 28349 s := x0.Aux 28350 _ = x0.Args[2] 28351 p := x0.Args[0] 28352 idx := x0.Args[1] 28353 mem := x0.Args[2] 28354 y := or.Args[1] 28355 s1 := v.Args[1] 28356 if s1.Op != OpS390XSLDconst { 28357 break 28358 } 28359 j1 := s1.AuxInt 28360 r1 := s1.Args[0] 28361 if r1.Op != OpS390XMOVHZreg { 28362 break 28363 } 28364 x1 := r1.Args[0] 28365 if x1.Op != OpS390XMOVHBRloadidx { 28366 break 28367 } 28368 i1 := x1.AuxInt 28369 if x1.Aux != s { 28370 break 28371 } 28372 _ = x1.Args[2] 28373 if p != x1.Args[0] { 28374 break 28375 } 28376 if idx != x1.Args[1] { 28377 break 28378 } 28379 if mem != x1.Args[2] { 28380 break 28381 } 28382 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)) { 28383 break 28384 } 28385 b = mergePoint(b, x0, x1) 28386 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28387 v.reset(OpCopy) 28388 v.AddArg(v0) 28389 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28390 v1.AuxInt = j0 28391 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28392 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28393 v3.AuxInt = i0 28394 v3.Aux = s 28395 v3.AddArg(p) 28396 v3.AddArg(idx) 28397 v3.AddArg(mem) 28398 v2.AddArg(v3) 28399 v1.AddArg(v2) 28400 v0.AddArg(v1) 28401 v0.AddArg(y) 28402 return true 28403 } 28404 // 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)))) 28405 // 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) 28406 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28407 for { 28408 _ = v.Args[1] 28409 or := v.Args[0] 28410 if or.Op != OpS390XOR { 28411 break 28412 } 28413 _ = or.Args[1] 28414 s0 := or.Args[0] 28415 if s0.Op != OpS390XSLDconst { 28416 break 28417 } 28418 j0 := s0.AuxInt 28419 r0 := s0.Args[0] 28420 if r0.Op != OpS390XMOVHZreg { 28421 break 28422 } 28423 x0 := r0.Args[0] 28424 if x0.Op != OpS390XMOVHBRloadidx { 28425 break 28426 } 28427 i0 := x0.AuxInt 28428 s := x0.Aux 28429 _ = x0.Args[2] 28430 idx := x0.Args[0] 28431 p := x0.Args[1] 28432 mem := x0.Args[2] 28433 y := or.Args[1] 28434 s1 := v.Args[1] 28435 if s1.Op != OpS390XSLDconst { 28436 break 28437 } 28438 j1 := s1.AuxInt 28439 r1 := s1.Args[0] 28440 if r1.Op != OpS390XMOVHZreg { 28441 break 28442 } 28443 x1 := r1.Args[0] 28444 if x1.Op != OpS390XMOVHBRloadidx { 28445 break 28446 } 28447 i1 := x1.AuxInt 28448 if x1.Aux != s { 28449 break 28450 } 28451 _ = x1.Args[2] 28452 if p != x1.Args[0] { 28453 break 28454 } 28455 if idx != x1.Args[1] { 28456 break 28457 } 28458 if mem != x1.Args[2] { 28459 break 28460 } 28461 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)) { 28462 break 28463 } 28464 b = mergePoint(b, x0, x1) 28465 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28466 v.reset(OpCopy) 28467 v.AddArg(v0) 28468 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28469 v1.AuxInt = j0 28470 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28471 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28472 v3.AuxInt = i0 28473 v3.Aux = s 28474 v3.AddArg(p) 28475 v3.AddArg(idx) 28476 v3.AddArg(mem) 28477 v2.AddArg(v3) 28478 v1.AddArg(v2) 28479 v0.AddArg(v1) 28480 v0.AddArg(y) 28481 return true 28482 } 28483 // 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)))) 28484 // 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) 28485 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28486 for { 28487 _ = v.Args[1] 28488 or := v.Args[0] 28489 if or.Op != OpS390XOR { 28490 break 28491 } 28492 _ = or.Args[1] 28493 y := or.Args[0] 28494 s0 := or.Args[1] 28495 if s0.Op != OpS390XSLDconst { 28496 break 28497 } 28498 j0 := s0.AuxInt 28499 r0 := s0.Args[0] 28500 if r0.Op != OpS390XMOVHZreg { 28501 break 28502 } 28503 x0 := r0.Args[0] 28504 if x0.Op != OpS390XMOVHBRloadidx { 28505 break 28506 } 28507 i0 := x0.AuxInt 28508 s := x0.Aux 28509 _ = x0.Args[2] 28510 p := x0.Args[0] 28511 idx := x0.Args[1] 28512 mem := x0.Args[2] 28513 s1 := v.Args[1] 28514 if s1.Op != OpS390XSLDconst { 28515 break 28516 } 28517 j1 := s1.AuxInt 28518 r1 := s1.Args[0] 28519 if r1.Op != OpS390XMOVHZreg { 28520 break 28521 } 28522 x1 := r1.Args[0] 28523 if x1.Op != OpS390XMOVHBRloadidx { 28524 break 28525 } 28526 i1 := x1.AuxInt 28527 if x1.Aux != s { 28528 break 28529 } 28530 _ = x1.Args[2] 28531 if p != x1.Args[0] { 28532 break 28533 } 28534 if idx != x1.Args[1] { 28535 break 28536 } 28537 if mem != x1.Args[2] { 28538 break 28539 } 28540 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)) { 28541 break 28542 } 28543 b = mergePoint(b, x0, x1) 28544 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28545 v.reset(OpCopy) 28546 v.AddArg(v0) 28547 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28548 v1.AuxInt = j0 28549 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28550 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28551 v3.AuxInt = i0 28552 v3.Aux = s 28553 v3.AddArg(p) 28554 v3.AddArg(idx) 28555 v3.AddArg(mem) 28556 v2.AddArg(v3) 28557 v1.AddArg(v2) 28558 v0.AddArg(v1) 28559 v0.AddArg(y) 28560 return true 28561 } 28562 // 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)))) 28563 // 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) 28564 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28565 for { 28566 _ = v.Args[1] 28567 or := v.Args[0] 28568 if or.Op != OpS390XOR { 28569 break 28570 } 28571 _ = or.Args[1] 28572 y := or.Args[0] 28573 s0 := or.Args[1] 28574 if s0.Op != OpS390XSLDconst { 28575 break 28576 } 28577 j0 := s0.AuxInt 28578 r0 := s0.Args[0] 28579 if r0.Op != OpS390XMOVHZreg { 28580 break 28581 } 28582 x0 := r0.Args[0] 28583 if x0.Op != OpS390XMOVHBRloadidx { 28584 break 28585 } 28586 i0 := x0.AuxInt 28587 s := x0.Aux 28588 _ = x0.Args[2] 28589 idx := x0.Args[0] 28590 p := x0.Args[1] 28591 mem := x0.Args[2] 28592 s1 := v.Args[1] 28593 if s1.Op != OpS390XSLDconst { 28594 break 28595 } 28596 j1 := s1.AuxInt 28597 r1 := s1.Args[0] 28598 if r1.Op != OpS390XMOVHZreg { 28599 break 28600 } 28601 x1 := r1.Args[0] 28602 if x1.Op != OpS390XMOVHBRloadidx { 28603 break 28604 } 28605 i1 := x1.AuxInt 28606 if x1.Aux != s { 28607 break 28608 } 28609 _ = x1.Args[2] 28610 if p != x1.Args[0] { 28611 break 28612 } 28613 if idx != x1.Args[1] { 28614 break 28615 } 28616 if mem != x1.Args[2] { 28617 break 28618 } 28619 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)) { 28620 break 28621 } 28622 b = mergePoint(b, x0, x1) 28623 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28624 v.reset(OpCopy) 28625 v.AddArg(v0) 28626 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28627 v1.AuxInt = j0 28628 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28629 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28630 v3.AuxInt = i0 28631 v3.Aux = s 28632 v3.AddArg(p) 28633 v3.AddArg(idx) 28634 v3.AddArg(mem) 28635 v2.AddArg(v3) 28636 v1.AddArg(v2) 28637 v0.AddArg(v1) 28638 v0.AddArg(y) 28639 return true 28640 } 28641 // 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)))) 28642 // 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) 28643 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28644 for { 28645 _ = v.Args[1] 28646 or := v.Args[0] 28647 if or.Op != OpS390XOR { 28648 break 28649 } 28650 _ = or.Args[1] 28651 s0 := or.Args[0] 28652 if s0.Op != OpS390XSLDconst { 28653 break 28654 } 28655 j0 := s0.AuxInt 28656 r0 := s0.Args[0] 28657 if r0.Op != OpS390XMOVHZreg { 28658 break 28659 } 28660 x0 := r0.Args[0] 28661 if x0.Op != OpS390XMOVHBRloadidx { 28662 break 28663 } 28664 i0 := x0.AuxInt 28665 s := x0.Aux 28666 _ = x0.Args[2] 28667 p := x0.Args[0] 28668 idx := x0.Args[1] 28669 mem := x0.Args[2] 28670 y := or.Args[1] 28671 s1 := v.Args[1] 28672 if s1.Op != OpS390XSLDconst { 28673 break 28674 } 28675 j1 := s1.AuxInt 28676 r1 := s1.Args[0] 28677 if r1.Op != OpS390XMOVHZreg { 28678 break 28679 } 28680 x1 := r1.Args[0] 28681 if x1.Op != OpS390XMOVHBRloadidx { 28682 break 28683 } 28684 i1 := x1.AuxInt 28685 if x1.Aux != s { 28686 break 28687 } 28688 _ = x1.Args[2] 28689 if idx != x1.Args[0] { 28690 break 28691 } 28692 if p != x1.Args[1] { 28693 break 28694 } 28695 if mem != x1.Args[2] { 28696 break 28697 } 28698 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)) { 28699 break 28700 } 28701 b = mergePoint(b, x0, x1) 28702 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28703 v.reset(OpCopy) 28704 v.AddArg(v0) 28705 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28706 v1.AuxInt = j0 28707 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28708 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28709 v3.AuxInt = i0 28710 v3.Aux = s 28711 v3.AddArg(p) 28712 v3.AddArg(idx) 28713 v3.AddArg(mem) 28714 v2.AddArg(v3) 28715 v1.AddArg(v2) 28716 v0.AddArg(v1) 28717 v0.AddArg(y) 28718 return true 28719 } 28720 // 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)))) 28721 // 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) 28722 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28723 for { 28724 _ = v.Args[1] 28725 or := v.Args[0] 28726 if or.Op != OpS390XOR { 28727 break 28728 } 28729 _ = or.Args[1] 28730 s0 := or.Args[0] 28731 if s0.Op != OpS390XSLDconst { 28732 break 28733 } 28734 j0 := s0.AuxInt 28735 r0 := s0.Args[0] 28736 if r0.Op != OpS390XMOVHZreg { 28737 break 28738 } 28739 x0 := r0.Args[0] 28740 if x0.Op != OpS390XMOVHBRloadidx { 28741 break 28742 } 28743 i0 := x0.AuxInt 28744 s := x0.Aux 28745 _ = x0.Args[2] 28746 idx := x0.Args[0] 28747 p := x0.Args[1] 28748 mem := x0.Args[2] 28749 y := or.Args[1] 28750 s1 := v.Args[1] 28751 if s1.Op != OpS390XSLDconst { 28752 break 28753 } 28754 j1 := s1.AuxInt 28755 r1 := s1.Args[0] 28756 if r1.Op != OpS390XMOVHZreg { 28757 break 28758 } 28759 x1 := r1.Args[0] 28760 if x1.Op != OpS390XMOVHBRloadidx { 28761 break 28762 } 28763 i1 := x1.AuxInt 28764 if x1.Aux != s { 28765 break 28766 } 28767 _ = x1.Args[2] 28768 if idx != x1.Args[0] { 28769 break 28770 } 28771 if p != x1.Args[1] { 28772 break 28773 } 28774 if mem != x1.Args[2] { 28775 break 28776 } 28777 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)) { 28778 break 28779 } 28780 b = mergePoint(b, x0, x1) 28781 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28782 v.reset(OpCopy) 28783 v.AddArg(v0) 28784 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28785 v1.AuxInt = j0 28786 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28787 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28788 v3.AuxInt = i0 28789 v3.Aux = s 28790 v3.AddArg(p) 28791 v3.AddArg(idx) 28792 v3.AddArg(mem) 28793 v2.AddArg(v3) 28794 v1.AddArg(v2) 28795 v0.AddArg(v1) 28796 v0.AddArg(y) 28797 return true 28798 } 28799 // 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)))) 28800 // 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) 28801 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28802 for { 28803 _ = v.Args[1] 28804 or := v.Args[0] 28805 if or.Op != OpS390XOR { 28806 break 28807 } 28808 _ = or.Args[1] 28809 y := or.Args[0] 28810 s0 := or.Args[1] 28811 if s0.Op != OpS390XSLDconst { 28812 break 28813 } 28814 j0 := s0.AuxInt 28815 r0 := s0.Args[0] 28816 if r0.Op != OpS390XMOVHZreg { 28817 break 28818 } 28819 x0 := r0.Args[0] 28820 if x0.Op != OpS390XMOVHBRloadidx { 28821 break 28822 } 28823 i0 := x0.AuxInt 28824 s := x0.Aux 28825 _ = x0.Args[2] 28826 p := x0.Args[0] 28827 idx := x0.Args[1] 28828 mem := x0.Args[2] 28829 s1 := v.Args[1] 28830 if s1.Op != OpS390XSLDconst { 28831 break 28832 } 28833 j1 := s1.AuxInt 28834 r1 := s1.Args[0] 28835 if r1.Op != OpS390XMOVHZreg { 28836 break 28837 } 28838 x1 := r1.Args[0] 28839 if x1.Op != OpS390XMOVHBRloadidx { 28840 break 28841 } 28842 i1 := x1.AuxInt 28843 if x1.Aux != s { 28844 break 28845 } 28846 _ = x1.Args[2] 28847 if idx != x1.Args[0] { 28848 break 28849 } 28850 if p != x1.Args[1] { 28851 break 28852 } 28853 if mem != x1.Args[2] { 28854 break 28855 } 28856 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)) { 28857 break 28858 } 28859 b = mergePoint(b, x0, x1) 28860 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28861 v.reset(OpCopy) 28862 v.AddArg(v0) 28863 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28864 v1.AuxInt = j0 28865 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28866 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28867 v3.AuxInt = i0 28868 v3.Aux = s 28869 v3.AddArg(p) 28870 v3.AddArg(idx) 28871 v3.AddArg(mem) 28872 v2.AddArg(v3) 28873 v1.AddArg(v2) 28874 v0.AddArg(v1) 28875 v0.AddArg(y) 28876 return true 28877 } 28878 return false 28879 } 28880 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 28881 b := v.Block 28882 _ = b 28883 typ := &b.Func.Config.Types 28884 _ = typ 28885 // 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)))) 28886 // 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) 28887 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28888 for { 28889 _ = v.Args[1] 28890 or := v.Args[0] 28891 if or.Op != OpS390XOR { 28892 break 28893 } 28894 _ = or.Args[1] 28895 y := or.Args[0] 28896 s0 := or.Args[1] 28897 if s0.Op != OpS390XSLDconst { 28898 break 28899 } 28900 j0 := s0.AuxInt 28901 r0 := s0.Args[0] 28902 if r0.Op != OpS390XMOVHZreg { 28903 break 28904 } 28905 x0 := r0.Args[0] 28906 if x0.Op != OpS390XMOVHBRloadidx { 28907 break 28908 } 28909 i0 := x0.AuxInt 28910 s := x0.Aux 28911 _ = x0.Args[2] 28912 idx := x0.Args[0] 28913 p := x0.Args[1] 28914 mem := x0.Args[2] 28915 s1 := v.Args[1] 28916 if s1.Op != OpS390XSLDconst { 28917 break 28918 } 28919 j1 := s1.AuxInt 28920 r1 := s1.Args[0] 28921 if r1.Op != OpS390XMOVHZreg { 28922 break 28923 } 28924 x1 := r1.Args[0] 28925 if x1.Op != OpS390XMOVHBRloadidx { 28926 break 28927 } 28928 i1 := x1.AuxInt 28929 if x1.Aux != s { 28930 break 28931 } 28932 _ = x1.Args[2] 28933 if idx != x1.Args[0] { 28934 break 28935 } 28936 if p != x1.Args[1] { 28937 break 28938 } 28939 if mem != x1.Args[2] { 28940 break 28941 } 28942 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)) { 28943 break 28944 } 28945 b = mergePoint(b, x0, x1) 28946 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28947 v.reset(OpCopy) 28948 v.AddArg(v0) 28949 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28950 v1.AuxInt = j0 28951 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28952 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28953 v3.AuxInt = i0 28954 v3.Aux = s 28955 v3.AddArg(p) 28956 v3.AddArg(idx) 28957 v3.AddArg(mem) 28958 v2.AddArg(v3) 28959 v1.AddArg(v2) 28960 v0.AddArg(v1) 28961 v0.AddArg(y) 28962 return true 28963 } 28964 return false 28965 } 28966 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 28967 // match: (ORW x (MOVDconst [c])) 28968 // cond: 28969 // result: (ORWconst [c] x) 28970 for { 28971 _ = v.Args[1] 28972 x := v.Args[0] 28973 v_1 := v.Args[1] 28974 if v_1.Op != OpS390XMOVDconst { 28975 break 28976 } 28977 c := v_1.AuxInt 28978 v.reset(OpS390XORWconst) 28979 v.AuxInt = c 28980 v.AddArg(x) 28981 return true 28982 } 28983 // match: (ORW (MOVDconst [c]) x) 28984 // cond: 28985 // result: (ORWconst [c] x) 28986 for { 28987 _ = v.Args[1] 28988 v_0 := v.Args[0] 28989 if v_0.Op != OpS390XMOVDconst { 28990 break 28991 } 28992 c := v_0.AuxInt 28993 x := v.Args[1] 28994 v.reset(OpS390XORWconst) 28995 v.AuxInt = c 28996 v.AddArg(x) 28997 return true 28998 } 28999 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 29000 // cond: d == 32-c 29001 // result: (RLLconst [c] x) 29002 for { 29003 _ = v.Args[1] 29004 v_0 := v.Args[0] 29005 if v_0.Op != OpS390XSLWconst { 29006 break 29007 } 29008 c := v_0.AuxInt 29009 x := v_0.Args[0] 29010 v_1 := v.Args[1] 29011 if v_1.Op != OpS390XSRWconst { 29012 break 29013 } 29014 d := v_1.AuxInt 29015 if x != v_1.Args[0] { 29016 break 29017 } 29018 if !(d == 32-c) { 29019 break 29020 } 29021 v.reset(OpS390XRLLconst) 29022 v.AuxInt = c 29023 v.AddArg(x) 29024 return true 29025 } 29026 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 29027 // cond: d == 32-c 29028 // result: (RLLconst [c] x) 29029 for { 29030 _ = v.Args[1] 29031 v_0 := v.Args[0] 29032 if v_0.Op != OpS390XSRWconst { 29033 break 29034 } 29035 d := v_0.AuxInt 29036 x := v_0.Args[0] 29037 v_1 := v.Args[1] 29038 if v_1.Op != OpS390XSLWconst { 29039 break 29040 } 29041 c := v_1.AuxInt 29042 if x != v_1.Args[0] { 29043 break 29044 } 29045 if !(d == 32-c) { 29046 break 29047 } 29048 v.reset(OpS390XRLLconst) 29049 v.AuxInt = c 29050 v.AddArg(x) 29051 return true 29052 } 29053 // match: (ORW x x) 29054 // cond: 29055 // result: x 29056 for { 29057 _ = v.Args[1] 29058 x := v.Args[0] 29059 if x != v.Args[1] { 29060 break 29061 } 29062 v.reset(OpCopy) 29063 v.Type = x.Type 29064 v.AddArg(x) 29065 return true 29066 } 29067 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29068 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29069 // result: (ORWload <t> [off] {sym} x ptr mem) 29070 for { 29071 t := v.Type 29072 _ = v.Args[1] 29073 x := v.Args[0] 29074 g := v.Args[1] 29075 if g.Op != OpS390XMOVWload { 29076 break 29077 } 29078 off := g.AuxInt 29079 sym := g.Aux 29080 _ = g.Args[1] 29081 ptr := g.Args[0] 29082 mem := g.Args[1] 29083 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29084 break 29085 } 29086 v.reset(OpS390XORWload) 29087 v.Type = t 29088 v.AuxInt = off 29089 v.Aux = sym 29090 v.AddArg(x) 29091 v.AddArg(ptr) 29092 v.AddArg(mem) 29093 return true 29094 } 29095 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29096 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29097 // result: (ORWload <t> [off] {sym} x ptr mem) 29098 for { 29099 t := v.Type 29100 _ = v.Args[1] 29101 g := v.Args[0] 29102 if g.Op != OpS390XMOVWload { 29103 break 29104 } 29105 off := g.AuxInt 29106 sym := g.Aux 29107 _ = g.Args[1] 29108 ptr := g.Args[0] 29109 mem := g.Args[1] 29110 x := v.Args[1] 29111 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29112 break 29113 } 29114 v.reset(OpS390XORWload) 29115 v.Type = t 29116 v.AuxInt = off 29117 v.Aux = sym 29118 v.AddArg(x) 29119 v.AddArg(ptr) 29120 v.AddArg(mem) 29121 return true 29122 } 29123 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29124 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29125 // result: (ORWload <t> [off] {sym} x ptr mem) 29126 for { 29127 t := v.Type 29128 _ = v.Args[1] 29129 g := v.Args[0] 29130 if g.Op != OpS390XMOVWload { 29131 break 29132 } 29133 off := g.AuxInt 29134 sym := g.Aux 29135 _ = g.Args[1] 29136 ptr := g.Args[0] 29137 mem := g.Args[1] 29138 x := v.Args[1] 29139 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29140 break 29141 } 29142 v.reset(OpS390XORWload) 29143 v.Type = t 29144 v.AuxInt = off 29145 v.Aux = sym 29146 v.AddArg(x) 29147 v.AddArg(ptr) 29148 v.AddArg(mem) 29149 return true 29150 } 29151 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29152 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29153 // result: (ORWload <t> [off] {sym} x ptr mem) 29154 for { 29155 t := v.Type 29156 _ = v.Args[1] 29157 x := v.Args[0] 29158 g := v.Args[1] 29159 if g.Op != OpS390XMOVWload { 29160 break 29161 } 29162 off := g.AuxInt 29163 sym := g.Aux 29164 _ = g.Args[1] 29165 ptr := g.Args[0] 29166 mem := g.Args[1] 29167 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29168 break 29169 } 29170 v.reset(OpS390XORWload) 29171 v.Type = t 29172 v.AuxInt = off 29173 v.Aux = sym 29174 v.AddArg(x) 29175 v.AddArg(ptr) 29176 v.AddArg(mem) 29177 return true 29178 } 29179 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29180 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29181 // result: (ORWload <t> [off] {sym} x ptr mem) 29182 for { 29183 t := v.Type 29184 _ = v.Args[1] 29185 x := v.Args[0] 29186 g := v.Args[1] 29187 if g.Op != OpS390XMOVWZload { 29188 break 29189 } 29190 off := g.AuxInt 29191 sym := g.Aux 29192 _ = g.Args[1] 29193 ptr := g.Args[0] 29194 mem := g.Args[1] 29195 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29196 break 29197 } 29198 v.reset(OpS390XORWload) 29199 v.Type = t 29200 v.AuxInt = off 29201 v.Aux = sym 29202 v.AddArg(x) 29203 v.AddArg(ptr) 29204 v.AddArg(mem) 29205 return true 29206 } 29207 return false 29208 } 29209 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 29210 b := v.Block 29211 _ = b 29212 typ := &b.Func.Config.Types 29213 _ = typ 29214 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 29215 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29216 // result: (ORWload <t> [off] {sym} x ptr mem) 29217 for { 29218 t := v.Type 29219 _ = v.Args[1] 29220 g := v.Args[0] 29221 if g.Op != OpS390XMOVWZload { 29222 break 29223 } 29224 off := g.AuxInt 29225 sym := g.Aux 29226 _ = g.Args[1] 29227 ptr := g.Args[0] 29228 mem := g.Args[1] 29229 x := v.Args[1] 29230 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29231 break 29232 } 29233 v.reset(OpS390XORWload) 29234 v.Type = t 29235 v.AuxInt = off 29236 v.Aux = sym 29237 v.AddArg(x) 29238 v.AddArg(ptr) 29239 v.AddArg(mem) 29240 return true 29241 } 29242 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 29243 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29244 // result: (ORWload <t> [off] {sym} x ptr mem) 29245 for { 29246 t := v.Type 29247 _ = v.Args[1] 29248 g := v.Args[0] 29249 if g.Op != OpS390XMOVWZload { 29250 break 29251 } 29252 off := g.AuxInt 29253 sym := g.Aux 29254 _ = g.Args[1] 29255 ptr := g.Args[0] 29256 mem := g.Args[1] 29257 x := v.Args[1] 29258 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29259 break 29260 } 29261 v.reset(OpS390XORWload) 29262 v.Type = t 29263 v.AuxInt = off 29264 v.Aux = sym 29265 v.AddArg(x) 29266 v.AddArg(ptr) 29267 v.AddArg(mem) 29268 return true 29269 } 29270 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29271 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29272 // result: (ORWload <t> [off] {sym} x ptr mem) 29273 for { 29274 t := v.Type 29275 _ = v.Args[1] 29276 x := v.Args[0] 29277 g := v.Args[1] 29278 if g.Op != OpS390XMOVWZload { 29279 break 29280 } 29281 off := g.AuxInt 29282 sym := g.Aux 29283 _ = g.Args[1] 29284 ptr := g.Args[0] 29285 mem := g.Args[1] 29286 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29287 break 29288 } 29289 v.reset(OpS390XORWload) 29290 v.Type = t 29291 v.AuxInt = off 29292 v.Aux = sym 29293 v.AddArg(x) 29294 v.AddArg(ptr) 29295 v.AddArg(mem) 29296 return true 29297 } 29298 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 29299 // 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) 29300 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29301 for { 29302 _ = v.Args[1] 29303 x1 := v.Args[0] 29304 if x1.Op != OpS390XMOVBZload { 29305 break 29306 } 29307 i1 := x1.AuxInt 29308 s := x1.Aux 29309 _ = x1.Args[1] 29310 p := x1.Args[0] 29311 mem := x1.Args[1] 29312 sh := v.Args[1] 29313 if sh.Op != OpS390XSLWconst { 29314 break 29315 } 29316 if sh.AuxInt != 8 { 29317 break 29318 } 29319 x0 := sh.Args[0] 29320 if x0.Op != OpS390XMOVBZload { 29321 break 29322 } 29323 i0 := x0.AuxInt 29324 if x0.Aux != s { 29325 break 29326 } 29327 _ = x0.Args[1] 29328 if p != x0.Args[0] { 29329 break 29330 } 29331 if mem != x0.Args[1] { 29332 break 29333 } 29334 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)) { 29335 break 29336 } 29337 b = mergePoint(b, x0, x1) 29338 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29339 v.reset(OpCopy) 29340 v.AddArg(v0) 29341 v0.AuxInt = i0 29342 v0.Aux = s 29343 v0.AddArg(p) 29344 v0.AddArg(mem) 29345 return true 29346 } 29347 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 29348 // 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) 29349 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29350 for { 29351 _ = v.Args[1] 29352 sh := v.Args[0] 29353 if sh.Op != OpS390XSLWconst { 29354 break 29355 } 29356 if sh.AuxInt != 8 { 29357 break 29358 } 29359 x0 := sh.Args[0] 29360 if x0.Op != OpS390XMOVBZload { 29361 break 29362 } 29363 i0 := x0.AuxInt 29364 s := x0.Aux 29365 _ = x0.Args[1] 29366 p := x0.Args[0] 29367 mem := x0.Args[1] 29368 x1 := v.Args[1] 29369 if x1.Op != OpS390XMOVBZload { 29370 break 29371 } 29372 i1 := x1.AuxInt 29373 if x1.Aux != s { 29374 break 29375 } 29376 _ = x1.Args[1] 29377 if p != x1.Args[0] { 29378 break 29379 } 29380 if mem != x1.Args[1] { 29381 break 29382 } 29383 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)) { 29384 break 29385 } 29386 b = mergePoint(b, x0, x1) 29387 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29388 v.reset(OpCopy) 29389 v.AddArg(v0) 29390 v0.AuxInt = i0 29391 v0.Aux = s 29392 v0.AddArg(p) 29393 v0.AddArg(mem) 29394 return true 29395 } 29396 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 29397 // 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) 29398 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29399 for { 29400 _ = v.Args[1] 29401 x1 := v.Args[0] 29402 if x1.Op != OpS390XMOVHZload { 29403 break 29404 } 29405 i1 := x1.AuxInt 29406 s := x1.Aux 29407 _ = x1.Args[1] 29408 p := x1.Args[0] 29409 mem := x1.Args[1] 29410 sh := v.Args[1] 29411 if sh.Op != OpS390XSLWconst { 29412 break 29413 } 29414 if sh.AuxInt != 16 { 29415 break 29416 } 29417 x0 := sh.Args[0] 29418 if x0.Op != OpS390XMOVHZload { 29419 break 29420 } 29421 i0 := x0.AuxInt 29422 if x0.Aux != s { 29423 break 29424 } 29425 _ = x0.Args[1] 29426 if p != x0.Args[0] { 29427 break 29428 } 29429 if mem != x0.Args[1] { 29430 break 29431 } 29432 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)) { 29433 break 29434 } 29435 b = mergePoint(b, x0, x1) 29436 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29437 v.reset(OpCopy) 29438 v.AddArg(v0) 29439 v0.AuxInt = i0 29440 v0.Aux = s 29441 v0.AddArg(p) 29442 v0.AddArg(mem) 29443 return true 29444 } 29445 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 29446 // 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) 29447 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29448 for { 29449 _ = v.Args[1] 29450 sh := v.Args[0] 29451 if sh.Op != OpS390XSLWconst { 29452 break 29453 } 29454 if sh.AuxInt != 16 { 29455 break 29456 } 29457 x0 := sh.Args[0] 29458 if x0.Op != OpS390XMOVHZload { 29459 break 29460 } 29461 i0 := x0.AuxInt 29462 s := x0.Aux 29463 _ = x0.Args[1] 29464 p := x0.Args[0] 29465 mem := x0.Args[1] 29466 x1 := v.Args[1] 29467 if x1.Op != OpS390XMOVHZload { 29468 break 29469 } 29470 i1 := x1.AuxInt 29471 if x1.Aux != s { 29472 break 29473 } 29474 _ = x1.Args[1] 29475 if p != x1.Args[0] { 29476 break 29477 } 29478 if mem != x1.Args[1] { 29479 break 29480 } 29481 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)) { 29482 break 29483 } 29484 b = mergePoint(b, x0, x1) 29485 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29486 v.reset(OpCopy) 29487 v.AddArg(v0) 29488 v0.AuxInt = i0 29489 v0.Aux = s 29490 v0.AddArg(p) 29491 v0.AddArg(mem) 29492 return true 29493 } 29494 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 29495 // 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) 29496 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29497 for { 29498 _ = v.Args[1] 29499 s0 := v.Args[0] 29500 if s0.Op != OpS390XSLWconst { 29501 break 29502 } 29503 j0 := s0.AuxInt 29504 x0 := s0.Args[0] 29505 if x0.Op != OpS390XMOVBZload { 29506 break 29507 } 29508 i0 := x0.AuxInt 29509 s := x0.Aux 29510 _ = x0.Args[1] 29511 p := x0.Args[0] 29512 mem := x0.Args[1] 29513 or := v.Args[1] 29514 if or.Op != OpS390XORW { 29515 break 29516 } 29517 _ = or.Args[1] 29518 s1 := or.Args[0] 29519 if s1.Op != OpS390XSLWconst { 29520 break 29521 } 29522 j1 := s1.AuxInt 29523 x1 := s1.Args[0] 29524 if x1.Op != OpS390XMOVBZload { 29525 break 29526 } 29527 i1 := x1.AuxInt 29528 if x1.Aux != s { 29529 break 29530 } 29531 _ = x1.Args[1] 29532 if p != x1.Args[0] { 29533 break 29534 } 29535 if mem != x1.Args[1] { 29536 break 29537 } 29538 y := or.Args[1] 29539 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)) { 29540 break 29541 } 29542 b = mergePoint(b, x0, x1) 29543 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29544 v.reset(OpCopy) 29545 v.AddArg(v0) 29546 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29547 v1.AuxInt = j1 29548 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29549 v2.AuxInt = i0 29550 v2.Aux = s 29551 v2.AddArg(p) 29552 v2.AddArg(mem) 29553 v1.AddArg(v2) 29554 v0.AddArg(v1) 29555 v0.AddArg(y) 29556 return true 29557 } 29558 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 29559 // 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) 29560 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29561 for { 29562 _ = v.Args[1] 29563 s0 := v.Args[0] 29564 if s0.Op != OpS390XSLWconst { 29565 break 29566 } 29567 j0 := s0.AuxInt 29568 x0 := s0.Args[0] 29569 if x0.Op != OpS390XMOVBZload { 29570 break 29571 } 29572 i0 := x0.AuxInt 29573 s := x0.Aux 29574 _ = x0.Args[1] 29575 p := x0.Args[0] 29576 mem := x0.Args[1] 29577 or := v.Args[1] 29578 if or.Op != OpS390XORW { 29579 break 29580 } 29581 _ = or.Args[1] 29582 y := or.Args[0] 29583 s1 := or.Args[1] 29584 if s1.Op != OpS390XSLWconst { 29585 break 29586 } 29587 j1 := s1.AuxInt 29588 x1 := s1.Args[0] 29589 if x1.Op != OpS390XMOVBZload { 29590 break 29591 } 29592 i1 := x1.AuxInt 29593 if x1.Aux != s { 29594 break 29595 } 29596 _ = x1.Args[1] 29597 if p != x1.Args[0] { 29598 break 29599 } 29600 if mem != x1.Args[1] { 29601 break 29602 } 29603 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)) { 29604 break 29605 } 29606 b = mergePoint(b, x0, x1) 29607 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29608 v.reset(OpCopy) 29609 v.AddArg(v0) 29610 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29611 v1.AuxInt = j1 29612 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29613 v2.AuxInt = i0 29614 v2.Aux = s 29615 v2.AddArg(p) 29616 v2.AddArg(mem) 29617 v1.AddArg(v2) 29618 v0.AddArg(v1) 29619 v0.AddArg(y) 29620 return true 29621 } 29622 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29623 // 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) 29624 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29625 for { 29626 _ = v.Args[1] 29627 or := v.Args[0] 29628 if or.Op != OpS390XORW { 29629 break 29630 } 29631 _ = or.Args[1] 29632 s1 := or.Args[0] 29633 if s1.Op != OpS390XSLWconst { 29634 break 29635 } 29636 j1 := s1.AuxInt 29637 x1 := s1.Args[0] 29638 if x1.Op != OpS390XMOVBZload { 29639 break 29640 } 29641 i1 := x1.AuxInt 29642 s := x1.Aux 29643 _ = x1.Args[1] 29644 p := x1.Args[0] 29645 mem := x1.Args[1] 29646 y := or.Args[1] 29647 s0 := v.Args[1] 29648 if s0.Op != OpS390XSLWconst { 29649 break 29650 } 29651 j0 := s0.AuxInt 29652 x0 := s0.Args[0] 29653 if x0.Op != OpS390XMOVBZload { 29654 break 29655 } 29656 i0 := x0.AuxInt 29657 if x0.Aux != s { 29658 break 29659 } 29660 _ = x0.Args[1] 29661 if p != x0.Args[0] { 29662 break 29663 } 29664 if mem != x0.Args[1] { 29665 break 29666 } 29667 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)) { 29668 break 29669 } 29670 b = mergePoint(b, x0, x1) 29671 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29672 v.reset(OpCopy) 29673 v.AddArg(v0) 29674 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29675 v1.AuxInt = j1 29676 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29677 v2.AuxInt = i0 29678 v2.Aux = s 29679 v2.AddArg(p) 29680 v2.AddArg(mem) 29681 v1.AddArg(v2) 29682 v0.AddArg(v1) 29683 v0.AddArg(y) 29684 return true 29685 } 29686 return false 29687 } 29688 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 29689 b := v.Block 29690 _ = b 29691 typ := &b.Func.Config.Types 29692 _ = typ 29693 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29694 // 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) 29695 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29696 for { 29697 _ = v.Args[1] 29698 or := v.Args[0] 29699 if or.Op != OpS390XORW { 29700 break 29701 } 29702 _ = or.Args[1] 29703 y := or.Args[0] 29704 s1 := or.Args[1] 29705 if s1.Op != OpS390XSLWconst { 29706 break 29707 } 29708 j1 := s1.AuxInt 29709 x1 := s1.Args[0] 29710 if x1.Op != OpS390XMOVBZload { 29711 break 29712 } 29713 i1 := x1.AuxInt 29714 s := x1.Aux 29715 _ = x1.Args[1] 29716 p := x1.Args[0] 29717 mem := x1.Args[1] 29718 s0 := v.Args[1] 29719 if s0.Op != OpS390XSLWconst { 29720 break 29721 } 29722 j0 := s0.AuxInt 29723 x0 := s0.Args[0] 29724 if x0.Op != OpS390XMOVBZload { 29725 break 29726 } 29727 i0 := x0.AuxInt 29728 if x0.Aux != s { 29729 break 29730 } 29731 _ = x0.Args[1] 29732 if p != x0.Args[0] { 29733 break 29734 } 29735 if mem != x0.Args[1] { 29736 break 29737 } 29738 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)) { 29739 break 29740 } 29741 b = mergePoint(b, x0, x1) 29742 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29743 v.reset(OpCopy) 29744 v.AddArg(v0) 29745 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29746 v1.AuxInt = j1 29747 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29748 v2.AuxInt = i0 29749 v2.Aux = s 29750 v2.AddArg(p) 29751 v2.AddArg(mem) 29752 v1.AddArg(v2) 29753 v0.AddArg(v1) 29754 v0.AddArg(y) 29755 return true 29756 } 29757 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29758 // 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) 29759 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29760 for { 29761 _ = v.Args[1] 29762 x1 := v.Args[0] 29763 if x1.Op != OpS390XMOVBZloadidx { 29764 break 29765 } 29766 i1 := x1.AuxInt 29767 s := x1.Aux 29768 _ = x1.Args[2] 29769 p := x1.Args[0] 29770 idx := x1.Args[1] 29771 mem := x1.Args[2] 29772 sh := v.Args[1] 29773 if sh.Op != OpS390XSLWconst { 29774 break 29775 } 29776 if sh.AuxInt != 8 { 29777 break 29778 } 29779 x0 := sh.Args[0] 29780 if x0.Op != OpS390XMOVBZloadidx { 29781 break 29782 } 29783 i0 := x0.AuxInt 29784 if x0.Aux != s { 29785 break 29786 } 29787 _ = x0.Args[2] 29788 if p != x0.Args[0] { 29789 break 29790 } 29791 if idx != x0.Args[1] { 29792 break 29793 } 29794 if mem != x0.Args[2] { 29795 break 29796 } 29797 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)) { 29798 break 29799 } 29800 b = mergePoint(b, x0, x1) 29801 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29802 v.reset(OpCopy) 29803 v.AddArg(v0) 29804 v0.AuxInt = i0 29805 v0.Aux = s 29806 v0.AddArg(p) 29807 v0.AddArg(idx) 29808 v0.AddArg(mem) 29809 return true 29810 } 29811 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29812 // 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) 29813 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29814 for { 29815 _ = v.Args[1] 29816 x1 := v.Args[0] 29817 if x1.Op != OpS390XMOVBZloadidx { 29818 break 29819 } 29820 i1 := x1.AuxInt 29821 s := x1.Aux 29822 _ = x1.Args[2] 29823 idx := x1.Args[0] 29824 p := x1.Args[1] 29825 mem := x1.Args[2] 29826 sh := v.Args[1] 29827 if sh.Op != OpS390XSLWconst { 29828 break 29829 } 29830 if sh.AuxInt != 8 { 29831 break 29832 } 29833 x0 := sh.Args[0] 29834 if x0.Op != OpS390XMOVBZloadidx { 29835 break 29836 } 29837 i0 := x0.AuxInt 29838 if x0.Aux != s { 29839 break 29840 } 29841 _ = x0.Args[2] 29842 if p != x0.Args[0] { 29843 break 29844 } 29845 if idx != x0.Args[1] { 29846 break 29847 } 29848 if mem != x0.Args[2] { 29849 break 29850 } 29851 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)) { 29852 break 29853 } 29854 b = mergePoint(b, x0, x1) 29855 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29856 v.reset(OpCopy) 29857 v.AddArg(v0) 29858 v0.AuxInt = i0 29859 v0.Aux = s 29860 v0.AddArg(p) 29861 v0.AddArg(idx) 29862 v0.AddArg(mem) 29863 return true 29864 } 29865 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29866 // 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) 29867 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29868 for { 29869 _ = v.Args[1] 29870 x1 := v.Args[0] 29871 if x1.Op != OpS390XMOVBZloadidx { 29872 break 29873 } 29874 i1 := x1.AuxInt 29875 s := x1.Aux 29876 _ = x1.Args[2] 29877 p := x1.Args[0] 29878 idx := x1.Args[1] 29879 mem := x1.Args[2] 29880 sh := v.Args[1] 29881 if sh.Op != OpS390XSLWconst { 29882 break 29883 } 29884 if sh.AuxInt != 8 { 29885 break 29886 } 29887 x0 := sh.Args[0] 29888 if x0.Op != OpS390XMOVBZloadidx { 29889 break 29890 } 29891 i0 := x0.AuxInt 29892 if x0.Aux != s { 29893 break 29894 } 29895 _ = x0.Args[2] 29896 if idx != x0.Args[0] { 29897 break 29898 } 29899 if p != x0.Args[1] { 29900 break 29901 } 29902 if mem != x0.Args[2] { 29903 break 29904 } 29905 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)) { 29906 break 29907 } 29908 b = mergePoint(b, x0, x1) 29909 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29910 v.reset(OpCopy) 29911 v.AddArg(v0) 29912 v0.AuxInt = i0 29913 v0.Aux = s 29914 v0.AddArg(p) 29915 v0.AddArg(idx) 29916 v0.AddArg(mem) 29917 return true 29918 } 29919 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29920 // 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) 29921 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29922 for { 29923 _ = v.Args[1] 29924 x1 := v.Args[0] 29925 if x1.Op != OpS390XMOVBZloadidx { 29926 break 29927 } 29928 i1 := x1.AuxInt 29929 s := x1.Aux 29930 _ = x1.Args[2] 29931 idx := x1.Args[0] 29932 p := x1.Args[1] 29933 mem := x1.Args[2] 29934 sh := v.Args[1] 29935 if sh.Op != OpS390XSLWconst { 29936 break 29937 } 29938 if sh.AuxInt != 8 { 29939 break 29940 } 29941 x0 := sh.Args[0] 29942 if x0.Op != OpS390XMOVBZloadidx { 29943 break 29944 } 29945 i0 := x0.AuxInt 29946 if x0.Aux != s { 29947 break 29948 } 29949 _ = x0.Args[2] 29950 if idx != x0.Args[0] { 29951 break 29952 } 29953 if p != x0.Args[1] { 29954 break 29955 } 29956 if mem != x0.Args[2] { 29957 break 29958 } 29959 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)) { 29960 break 29961 } 29962 b = mergePoint(b, x0, x1) 29963 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29964 v.reset(OpCopy) 29965 v.AddArg(v0) 29966 v0.AuxInt = i0 29967 v0.Aux = s 29968 v0.AddArg(p) 29969 v0.AddArg(idx) 29970 v0.AddArg(mem) 29971 return true 29972 } 29973 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 29974 // 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) 29975 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29976 for { 29977 _ = v.Args[1] 29978 sh := v.Args[0] 29979 if sh.Op != OpS390XSLWconst { 29980 break 29981 } 29982 if sh.AuxInt != 8 { 29983 break 29984 } 29985 x0 := sh.Args[0] 29986 if x0.Op != OpS390XMOVBZloadidx { 29987 break 29988 } 29989 i0 := x0.AuxInt 29990 s := x0.Aux 29991 _ = x0.Args[2] 29992 p := x0.Args[0] 29993 idx := x0.Args[1] 29994 mem := x0.Args[2] 29995 x1 := v.Args[1] 29996 if x1.Op != OpS390XMOVBZloadidx { 29997 break 29998 } 29999 i1 := x1.AuxInt 30000 if x1.Aux != s { 30001 break 30002 } 30003 _ = x1.Args[2] 30004 if p != x1.Args[0] { 30005 break 30006 } 30007 if idx != x1.Args[1] { 30008 break 30009 } 30010 if mem != x1.Args[2] { 30011 break 30012 } 30013 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)) { 30014 break 30015 } 30016 b = mergePoint(b, x0, x1) 30017 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30018 v.reset(OpCopy) 30019 v.AddArg(v0) 30020 v0.AuxInt = i0 30021 v0.Aux = s 30022 v0.AddArg(p) 30023 v0.AddArg(idx) 30024 v0.AddArg(mem) 30025 return true 30026 } 30027 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 30028 // 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) 30029 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30030 for { 30031 _ = v.Args[1] 30032 sh := v.Args[0] 30033 if sh.Op != OpS390XSLWconst { 30034 break 30035 } 30036 if sh.AuxInt != 8 { 30037 break 30038 } 30039 x0 := sh.Args[0] 30040 if x0.Op != OpS390XMOVBZloadidx { 30041 break 30042 } 30043 i0 := x0.AuxInt 30044 s := x0.Aux 30045 _ = x0.Args[2] 30046 idx := x0.Args[0] 30047 p := x0.Args[1] 30048 mem := x0.Args[2] 30049 x1 := v.Args[1] 30050 if x1.Op != OpS390XMOVBZloadidx { 30051 break 30052 } 30053 i1 := x1.AuxInt 30054 if x1.Aux != s { 30055 break 30056 } 30057 _ = x1.Args[2] 30058 if p != x1.Args[0] { 30059 break 30060 } 30061 if idx != x1.Args[1] { 30062 break 30063 } 30064 if mem != x1.Args[2] { 30065 break 30066 } 30067 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)) { 30068 break 30069 } 30070 b = mergePoint(b, x0, x1) 30071 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30072 v.reset(OpCopy) 30073 v.AddArg(v0) 30074 v0.AuxInt = i0 30075 v0.Aux = s 30076 v0.AddArg(p) 30077 v0.AddArg(idx) 30078 v0.AddArg(mem) 30079 return true 30080 } 30081 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30082 // 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) 30083 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30084 for { 30085 _ = v.Args[1] 30086 sh := v.Args[0] 30087 if sh.Op != OpS390XSLWconst { 30088 break 30089 } 30090 if sh.AuxInt != 8 { 30091 break 30092 } 30093 x0 := sh.Args[0] 30094 if x0.Op != OpS390XMOVBZloadidx { 30095 break 30096 } 30097 i0 := x0.AuxInt 30098 s := x0.Aux 30099 _ = x0.Args[2] 30100 p := x0.Args[0] 30101 idx := x0.Args[1] 30102 mem := x0.Args[2] 30103 x1 := v.Args[1] 30104 if x1.Op != OpS390XMOVBZloadidx { 30105 break 30106 } 30107 i1 := x1.AuxInt 30108 if x1.Aux != s { 30109 break 30110 } 30111 _ = x1.Args[2] 30112 if idx != x1.Args[0] { 30113 break 30114 } 30115 if p != x1.Args[1] { 30116 break 30117 } 30118 if mem != x1.Args[2] { 30119 break 30120 } 30121 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)) { 30122 break 30123 } 30124 b = mergePoint(b, x0, x1) 30125 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30126 v.reset(OpCopy) 30127 v.AddArg(v0) 30128 v0.AuxInt = i0 30129 v0.Aux = s 30130 v0.AddArg(p) 30131 v0.AddArg(idx) 30132 v0.AddArg(mem) 30133 return true 30134 } 30135 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30136 // 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) 30137 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30138 for { 30139 _ = v.Args[1] 30140 sh := v.Args[0] 30141 if sh.Op != OpS390XSLWconst { 30142 break 30143 } 30144 if sh.AuxInt != 8 { 30145 break 30146 } 30147 x0 := sh.Args[0] 30148 if x0.Op != OpS390XMOVBZloadidx { 30149 break 30150 } 30151 i0 := x0.AuxInt 30152 s := x0.Aux 30153 _ = x0.Args[2] 30154 idx := x0.Args[0] 30155 p := x0.Args[1] 30156 mem := x0.Args[2] 30157 x1 := v.Args[1] 30158 if x1.Op != OpS390XMOVBZloadidx { 30159 break 30160 } 30161 i1 := x1.AuxInt 30162 if x1.Aux != s { 30163 break 30164 } 30165 _ = x1.Args[2] 30166 if idx != x1.Args[0] { 30167 break 30168 } 30169 if p != x1.Args[1] { 30170 break 30171 } 30172 if mem != x1.Args[2] { 30173 break 30174 } 30175 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)) { 30176 break 30177 } 30178 b = mergePoint(b, x0, x1) 30179 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30180 v.reset(OpCopy) 30181 v.AddArg(v0) 30182 v0.AuxInt = i0 30183 v0.Aux = s 30184 v0.AddArg(p) 30185 v0.AddArg(idx) 30186 v0.AddArg(mem) 30187 return true 30188 } 30189 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30190 // 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) 30191 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30192 for { 30193 _ = v.Args[1] 30194 x1 := v.Args[0] 30195 if x1.Op != OpS390XMOVHZloadidx { 30196 break 30197 } 30198 i1 := x1.AuxInt 30199 s := x1.Aux 30200 _ = x1.Args[2] 30201 p := x1.Args[0] 30202 idx := x1.Args[1] 30203 mem := x1.Args[2] 30204 sh := v.Args[1] 30205 if sh.Op != OpS390XSLWconst { 30206 break 30207 } 30208 if sh.AuxInt != 16 { 30209 break 30210 } 30211 x0 := sh.Args[0] 30212 if x0.Op != OpS390XMOVHZloadidx { 30213 break 30214 } 30215 i0 := x0.AuxInt 30216 if x0.Aux != s { 30217 break 30218 } 30219 _ = x0.Args[2] 30220 if p != x0.Args[0] { 30221 break 30222 } 30223 if idx != x0.Args[1] { 30224 break 30225 } 30226 if mem != x0.Args[2] { 30227 break 30228 } 30229 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)) { 30230 break 30231 } 30232 b = mergePoint(b, x0, x1) 30233 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30234 v.reset(OpCopy) 30235 v.AddArg(v0) 30236 v0.AuxInt = i0 30237 v0.Aux = s 30238 v0.AddArg(p) 30239 v0.AddArg(idx) 30240 v0.AddArg(mem) 30241 return true 30242 } 30243 return false 30244 } 30245 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 30246 b := v.Block 30247 _ = b 30248 typ := &b.Func.Config.Types 30249 _ = typ 30250 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30251 // 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) 30252 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30253 for { 30254 _ = v.Args[1] 30255 x1 := v.Args[0] 30256 if x1.Op != OpS390XMOVHZloadidx { 30257 break 30258 } 30259 i1 := x1.AuxInt 30260 s := x1.Aux 30261 _ = x1.Args[2] 30262 idx := x1.Args[0] 30263 p := x1.Args[1] 30264 mem := x1.Args[2] 30265 sh := v.Args[1] 30266 if sh.Op != OpS390XSLWconst { 30267 break 30268 } 30269 if sh.AuxInt != 16 { 30270 break 30271 } 30272 x0 := sh.Args[0] 30273 if x0.Op != OpS390XMOVHZloadidx { 30274 break 30275 } 30276 i0 := x0.AuxInt 30277 if x0.Aux != s { 30278 break 30279 } 30280 _ = x0.Args[2] 30281 if p != x0.Args[0] { 30282 break 30283 } 30284 if idx != x0.Args[1] { 30285 break 30286 } 30287 if mem != x0.Args[2] { 30288 break 30289 } 30290 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)) { 30291 break 30292 } 30293 b = mergePoint(b, x0, x1) 30294 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30295 v.reset(OpCopy) 30296 v.AddArg(v0) 30297 v0.AuxInt = i0 30298 v0.Aux = s 30299 v0.AddArg(p) 30300 v0.AddArg(idx) 30301 v0.AddArg(mem) 30302 return true 30303 } 30304 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30305 // 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) 30306 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30307 for { 30308 _ = v.Args[1] 30309 x1 := v.Args[0] 30310 if x1.Op != OpS390XMOVHZloadidx { 30311 break 30312 } 30313 i1 := x1.AuxInt 30314 s := x1.Aux 30315 _ = x1.Args[2] 30316 p := x1.Args[0] 30317 idx := x1.Args[1] 30318 mem := x1.Args[2] 30319 sh := v.Args[1] 30320 if sh.Op != OpS390XSLWconst { 30321 break 30322 } 30323 if sh.AuxInt != 16 { 30324 break 30325 } 30326 x0 := sh.Args[0] 30327 if x0.Op != OpS390XMOVHZloadidx { 30328 break 30329 } 30330 i0 := x0.AuxInt 30331 if x0.Aux != s { 30332 break 30333 } 30334 _ = x0.Args[2] 30335 if idx != x0.Args[0] { 30336 break 30337 } 30338 if p != x0.Args[1] { 30339 break 30340 } 30341 if mem != x0.Args[2] { 30342 break 30343 } 30344 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)) { 30345 break 30346 } 30347 b = mergePoint(b, x0, x1) 30348 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30349 v.reset(OpCopy) 30350 v.AddArg(v0) 30351 v0.AuxInt = i0 30352 v0.Aux = s 30353 v0.AddArg(p) 30354 v0.AddArg(idx) 30355 v0.AddArg(mem) 30356 return true 30357 } 30358 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30359 // 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) 30360 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30361 for { 30362 _ = v.Args[1] 30363 x1 := v.Args[0] 30364 if x1.Op != OpS390XMOVHZloadidx { 30365 break 30366 } 30367 i1 := x1.AuxInt 30368 s := x1.Aux 30369 _ = x1.Args[2] 30370 idx := x1.Args[0] 30371 p := x1.Args[1] 30372 mem := x1.Args[2] 30373 sh := v.Args[1] 30374 if sh.Op != OpS390XSLWconst { 30375 break 30376 } 30377 if sh.AuxInt != 16 { 30378 break 30379 } 30380 x0 := sh.Args[0] 30381 if x0.Op != OpS390XMOVHZloadidx { 30382 break 30383 } 30384 i0 := x0.AuxInt 30385 if x0.Aux != s { 30386 break 30387 } 30388 _ = x0.Args[2] 30389 if idx != x0.Args[0] { 30390 break 30391 } 30392 if p != x0.Args[1] { 30393 break 30394 } 30395 if mem != x0.Args[2] { 30396 break 30397 } 30398 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)) { 30399 break 30400 } 30401 b = mergePoint(b, x0, x1) 30402 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30403 v.reset(OpCopy) 30404 v.AddArg(v0) 30405 v0.AuxInt = i0 30406 v0.Aux = s 30407 v0.AddArg(p) 30408 v0.AddArg(idx) 30409 v0.AddArg(mem) 30410 return true 30411 } 30412 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30413 // 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) 30414 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30415 for { 30416 _ = v.Args[1] 30417 sh := v.Args[0] 30418 if sh.Op != OpS390XSLWconst { 30419 break 30420 } 30421 if sh.AuxInt != 16 { 30422 break 30423 } 30424 x0 := sh.Args[0] 30425 if x0.Op != OpS390XMOVHZloadidx { 30426 break 30427 } 30428 i0 := x0.AuxInt 30429 s := x0.Aux 30430 _ = x0.Args[2] 30431 p := x0.Args[0] 30432 idx := x0.Args[1] 30433 mem := x0.Args[2] 30434 x1 := v.Args[1] 30435 if x1.Op != OpS390XMOVHZloadidx { 30436 break 30437 } 30438 i1 := x1.AuxInt 30439 if x1.Aux != s { 30440 break 30441 } 30442 _ = x1.Args[2] 30443 if p != x1.Args[0] { 30444 break 30445 } 30446 if idx != x1.Args[1] { 30447 break 30448 } 30449 if mem != x1.Args[2] { 30450 break 30451 } 30452 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)) { 30453 break 30454 } 30455 b = mergePoint(b, x0, x1) 30456 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30457 v.reset(OpCopy) 30458 v.AddArg(v0) 30459 v0.AuxInt = i0 30460 v0.Aux = s 30461 v0.AddArg(p) 30462 v0.AddArg(idx) 30463 v0.AddArg(mem) 30464 return true 30465 } 30466 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30467 // 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) 30468 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30469 for { 30470 _ = v.Args[1] 30471 sh := v.Args[0] 30472 if sh.Op != OpS390XSLWconst { 30473 break 30474 } 30475 if sh.AuxInt != 16 { 30476 break 30477 } 30478 x0 := sh.Args[0] 30479 if x0.Op != OpS390XMOVHZloadidx { 30480 break 30481 } 30482 i0 := x0.AuxInt 30483 s := x0.Aux 30484 _ = x0.Args[2] 30485 idx := x0.Args[0] 30486 p := x0.Args[1] 30487 mem := x0.Args[2] 30488 x1 := v.Args[1] 30489 if x1.Op != OpS390XMOVHZloadidx { 30490 break 30491 } 30492 i1 := x1.AuxInt 30493 if x1.Aux != s { 30494 break 30495 } 30496 _ = x1.Args[2] 30497 if p != x1.Args[0] { 30498 break 30499 } 30500 if idx != x1.Args[1] { 30501 break 30502 } 30503 if mem != x1.Args[2] { 30504 break 30505 } 30506 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)) { 30507 break 30508 } 30509 b = mergePoint(b, x0, x1) 30510 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30511 v.reset(OpCopy) 30512 v.AddArg(v0) 30513 v0.AuxInt = i0 30514 v0.Aux = s 30515 v0.AddArg(p) 30516 v0.AddArg(idx) 30517 v0.AddArg(mem) 30518 return true 30519 } 30520 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30521 // 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) 30522 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30523 for { 30524 _ = v.Args[1] 30525 sh := v.Args[0] 30526 if sh.Op != OpS390XSLWconst { 30527 break 30528 } 30529 if sh.AuxInt != 16 { 30530 break 30531 } 30532 x0 := sh.Args[0] 30533 if x0.Op != OpS390XMOVHZloadidx { 30534 break 30535 } 30536 i0 := x0.AuxInt 30537 s := x0.Aux 30538 _ = x0.Args[2] 30539 p := x0.Args[0] 30540 idx := x0.Args[1] 30541 mem := x0.Args[2] 30542 x1 := v.Args[1] 30543 if x1.Op != OpS390XMOVHZloadidx { 30544 break 30545 } 30546 i1 := x1.AuxInt 30547 if x1.Aux != s { 30548 break 30549 } 30550 _ = x1.Args[2] 30551 if idx != x1.Args[0] { 30552 break 30553 } 30554 if p != x1.Args[1] { 30555 break 30556 } 30557 if mem != x1.Args[2] { 30558 break 30559 } 30560 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)) { 30561 break 30562 } 30563 b = mergePoint(b, x0, x1) 30564 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30565 v.reset(OpCopy) 30566 v.AddArg(v0) 30567 v0.AuxInt = i0 30568 v0.Aux = s 30569 v0.AddArg(p) 30570 v0.AddArg(idx) 30571 v0.AddArg(mem) 30572 return true 30573 } 30574 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30575 // 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) 30576 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30577 for { 30578 _ = v.Args[1] 30579 sh := v.Args[0] 30580 if sh.Op != OpS390XSLWconst { 30581 break 30582 } 30583 if sh.AuxInt != 16 { 30584 break 30585 } 30586 x0 := sh.Args[0] 30587 if x0.Op != OpS390XMOVHZloadidx { 30588 break 30589 } 30590 i0 := x0.AuxInt 30591 s := x0.Aux 30592 _ = x0.Args[2] 30593 idx := x0.Args[0] 30594 p := x0.Args[1] 30595 mem := x0.Args[2] 30596 x1 := v.Args[1] 30597 if x1.Op != OpS390XMOVHZloadidx { 30598 break 30599 } 30600 i1 := x1.AuxInt 30601 if x1.Aux != s { 30602 break 30603 } 30604 _ = x1.Args[2] 30605 if idx != x1.Args[0] { 30606 break 30607 } 30608 if p != x1.Args[1] { 30609 break 30610 } 30611 if mem != x1.Args[2] { 30612 break 30613 } 30614 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)) { 30615 break 30616 } 30617 b = mergePoint(b, x0, x1) 30618 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30619 v.reset(OpCopy) 30620 v.AddArg(v0) 30621 v0.AuxInt = i0 30622 v0.Aux = s 30623 v0.AddArg(p) 30624 v0.AddArg(idx) 30625 v0.AddArg(mem) 30626 return true 30627 } 30628 // 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)) 30629 // 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) 30630 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30631 for { 30632 _ = v.Args[1] 30633 s0 := v.Args[0] 30634 if s0.Op != OpS390XSLWconst { 30635 break 30636 } 30637 j0 := s0.AuxInt 30638 x0 := s0.Args[0] 30639 if x0.Op != OpS390XMOVBZloadidx { 30640 break 30641 } 30642 i0 := x0.AuxInt 30643 s := x0.Aux 30644 _ = x0.Args[2] 30645 p := x0.Args[0] 30646 idx := x0.Args[1] 30647 mem := x0.Args[2] 30648 or := v.Args[1] 30649 if or.Op != OpS390XORW { 30650 break 30651 } 30652 _ = or.Args[1] 30653 s1 := or.Args[0] 30654 if s1.Op != OpS390XSLWconst { 30655 break 30656 } 30657 j1 := s1.AuxInt 30658 x1 := s1.Args[0] 30659 if x1.Op != OpS390XMOVBZloadidx { 30660 break 30661 } 30662 i1 := x1.AuxInt 30663 if x1.Aux != s { 30664 break 30665 } 30666 _ = x1.Args[2] 30667 if p != x1.Args[0] { 30668 break 30669 } 30670 if idx != x1.Args[1] { 30671 break 30672 } 30673 if mem != x1.Args[2] { 30674 break 30675 } 30676 y := or.Args[1] 30677 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)) { 30678 break 30679 } 30680 b = mergePoint(b, x0, x1) 30681 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30682 v.reset(OpCopy) 30683 v.AddArg(v0) 30684 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30685 v1.AuxInt = j1 30686 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30687 v2.AuxInt = i0 30688 v2.Aux = s 30689 v2.AddArg(p) 30690 v2.AddArg(idx) 30691 v2.AddArg(mem) 30692 v1.AddArg(v2) 30693 v0.AddArg(v1) 30694 v0.AddArg(y) 30695 return true 30696 } 30697 // 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)) 30698 // 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) 30699 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30700 for { 30701 _ = v.Args[1] 30702 s0 := v.Args[0] 30703 if s0.Op != OpS390XSLWconst { 30704 break 30705 } 30706 j0 := s0.AuxInt 30707 x0 := s0.Args[0] 30708 if x0.Op != OpS390XMOVBZloadidx { 30709 break 30710 } 30711 i0 := x0.AuxInt 30712 s := x0.Aux 30713 _ = x0.Args[2] 30714 idx := x0.Args[0] 30715 p := x0.Args[1] 30716 mem := x0.Args[2] 30717 or := v.Args[1] 30718 if or.Op != OpS390XORW { 30719 break 30720 } 30721 _ = or.Args[1] 30722 s1 := or.Args[0] 30723 if s1.Op != OpS390XSLWconst { 30724 break 30725 } 30726 j1 := s1.AuxInt 30727 x1 := s1.Args[0] 30728 if x1.Op != OpS390XMOVBZloadidx { 30729 break 30730 } 30731 i1 := x1.AuxInt 30732 if x1.Aux != s { 30733 break 30734 } 30735 _ = x1.Args[2] 30736 if p != x1.Args[0] { 30737 break 30738 } 30739 if idx != x1.Args[1] { 30740 break 30741 } 30742 if mem != x1.Args[2] { 30743 break 30744 } 30745 y := or.Args[1] 30746 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)) { 30747 break 30748 } 30749 b = mergePoint(b, x0, x1) 30750 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30751 v.reset(OpCopy) 30752 v.AddArg(v0) 30753 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30754 v1.AuxInt = j1 30755 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30756 v2.AuxInt = i0 30757 v2.Aux = s 30758 v2.AddArg(p) 30759 v2.AddArg(idx) 30760 v2.AddArg(mem) 30761 v1.AddArg(v2) 30762 v0.AddArg(v1) 30763 v0.AddArg(y) 30764 return true 30765 } 30766 // 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)) 30767 // 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) 30768 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30769 for { 30770 _ = v.Args[1] 30771 s0 := v.Args[0] 30772 if s0.Op != OpS390XSLWconst { 30773 break 30774 } 30775 j0 := s0.AuxInt 30776 x0 := s0.Args[0] 30777 if x0.Op != OpS390XMOVBZloadidx { 30778 break 30779 } 30780 i0 := x0.AuxInt 30781 s := x0.Aux 30782 _ = x0.Args[2] 30783 p := x0.Args[0] 30784 idx := x0.Args[1] 30785 mem := x0.Args[2] 30786 or := v.Args[1] 30787 if or.Op != OpS390XORW { 30788 break 30789 } 30790 _ = or.Args[1] 30791 s1 := or.Args[0] 30792 if s1.Op != OpS390XSLWconst { 30793 break 30794 } 30795 j1 := s1.AuxInt 30796 x1 := s1.Args[0] 30797 if x1.Op != OpS390XMOVBZloadidx { 30798 break 30799 } 30800 i1 := x1.AuxInt 30801 if x1.Aux != s { 30802 break 30803 } 30804 _ = x1.Args[2] 30805 if idx != x1.Args[0] { 30806 break 30807 } 30808 if p != x1.Args[1] { 30809 break 30810 } 30811 if mem != x1.Args[2] { 30812 break 30813 } 30814 y := or.Args[1] 30815 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)) { 30816 break 30817 } 30818 b = mergePoint(b, x0, x1) 30819 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30820 v.reset(OpCopy) 30821 v.AddArg(v0) 30822 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30823 v1.AuxInt = j1 30824 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30825 v2.AuxInt = i0 30826 v2.Aux = s 30827 v2.AddArg(p) 30828 v2.AddArg(idx) 30829 v2.AddArg(mem) 30830 v1.AddArg(v2) 30831 v0.AddArg(v1) 30832 v0.AddArg(y) 30833 return true 30834 } 30835 return false 30836 } 30837 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 30838 b := v.Block 30839 _ = b 30840 typ := &b.Func.Config.Types 30841 _ = typ 30842 // 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)) 30843 // 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) 30844 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30845 for { 30846 _ = v.Args[1] 30847 s0 := v.Args[0] 30848 if s0.Op != OpS390XSLWconst { 30849 break 30850 } 30851 j0 := s0.AuxInt 30852 x0 := s0.Args[0] 30853 if x0.Op != OpS390XMOVBZloadidx { 30854 break 30855 } 30856 i0 := x0.AuxInt 30857 s := x0.Aux 30858 _ = x0.Args[2] 30859 idx := x0.Args[0] 30860 p := x0.Args[1] 30861 mem := x0.Args[2] 30862 or := v.Args[1] 30863 if or.Op != OpS390XORW { 30864 break 30865 } 30866 _ = or.Args[1] 30867 s1 := or.Args[0] 30868 if s1.Op != OpS390XSLWconst { 30869 break 30870 } 30871 j1 := s1.AuxInt 30872 x1 := s1.Args[0] 30873 if x1.Op != OpS390XMOVBZloadidx { 30874 break 30875 } 30876 i1 := x1.AuxInt 30877 if x1.Aux != s { 30878 break 30879 } 30880 _ = x1.Args[2] 30881 if idx != x1.Args[0] { 30882 break 30883 } 30884 if p != x1.Args[1] { 30885 break 30886 } 30887 if mem != x1.Args[2] { 30888 break 30889 } 30890 y := or.Args[1] 30891 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)) { 30892 break 30893 } 30894 b = mergePoint(b, x0, x1) 30895 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30896 v.reset(OpCopy) 30897 v.AddArg(v0) 30898 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30899 v1.AuxInt = j1 30900 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30901 v2.AuxInt = i0 30902 v2.Aux = s 30903 v2.AddArg(p) 30904 v2.AddArg(idx) 30905 v2.AddArg(mem) 30906 v1.AddArg(v2) 30907 v0.AddArg(v1) 30908 v0.AddArg(y) 30909 return true 30910 } 30911 // 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)))) 30912 // 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) 30913 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30914 for { 30915 _ = v.Args[1] 30916 s0 := v.Args[0] 30917 if s0.Op != OpS390XSLWconst { 30918 break 30919 } 30920 j0 := s0.AuxInt 30921 x0 := s0.Args[0] 30922 if x0.Op != OpS390XMOVBZloadidx { 30923 break 30924 } 30925 i0 := x0.AuxInt 30926 s := x0.Aux 30927 _ = x0.Args[2] 30928 p := x0.Args[0] 30929 idx := x0.Args[1] 30930 mem := x0.Args[2] 30931 or := v.Args[1] 30932 if or.Op != OpS390XORW { 30933 break 30934 } 30935 _ = or.Args[1] 30936 y := or.Args[0] 30937 s1 := or.Args[1] 30938 if s1.Op != OpS390XSLWconst { 30939 break 30940 } 30941 j1 := s1.AuxInt 30942 x1 := s1.Args[0] 30943 if x1.Op != OpS390XMOVBZloadidx { 30944 break 30945 } 30946 i1 := x1.AuxInt 30947 if x1.Aux != s { 30948 break 30949 } 30950 _ = x1.Args[2] 30951 if p != x1.Args[0] { 30952 break 30953 } 30954 if idx != x1.Args[1] { 30955 break 30956 } 30957 if mem != x1.Args[2] { 30958 break 30959 } 30960 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)) { 30961 break 30962 } 30963 b = mergePoint(b, x0, x1) 30964 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30965 v.reset(OpCopy) 30966 v.AddArg(v0) 30967 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30968 v1.AuxInt = j1 30969 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30970 v2.AuxInt = i0 30971 v2.Aux = s 30972 v2.AddArg(p) 30973 v2.AddArg(idx) 30974 v2.AddArg(mem) 30975 v1.AddArg(v2) 30976 v0.AddArg(v1) 30977 v0.AddArg(y) 30978 return true 30979 } 30980 // 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)))) 30981 // 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) 30982 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30983 for { 30984 _ = v.Args[1] 30985 s0 := v.Args[0] 30986 if s0.Op != OpS390XSLWconst { 30987 break 30988 } 30989 j0 := s0.AuxInt 30990 x0 := s0.Args[0] 30991 if x0.Op != OpS390XMOVBZloadidx { 30992 break 30993 } 30994 i0 := x0.AuxInt 30995 s := x0.Aux 30996 _ = x0.Args[2] 30997 idx := x0.Args[0] 30998 p := x0.Args[1] 30999 mem := x0.Args[2] 31000 or := v.Args[1] 31001 if or.Op != OpS390XORW { 31002 break 31003 } 31004 _ = or.Args[1] 31005 y := or.Args[0] 31006 s1 := or.Args[1] 31007 if s1.Op != OpS390XSLWconst { 31008 break 31009 } 31010 j1 := s1.AuxInt 31011 x1 := s1.Args[0] 31012 if x1.Op != OpS390XMOVBZloadidx { 31013 break 31014 } 31015 i1 := x1.AuxInt 31016 if x1.Aux != s { 31017 break 31018 } 31019 _ = x1.Args[2] 31020 if p != x1.Args[0] { 31021 break 31022 } 31023 if idx != x1.Args[1] { 31024 break 31025 } 31026 if mem != x1.Args[2] { 31027 break 31028 } 31029 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)) { 31030 break 31031 } 31032 b = mergePoint(b, x0, x1) 31033 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31034 v.reset(OpCopy) 31035 v.AddArg(v0) 31036 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31037 v1.AuxInt = j1 31038 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31039 v2.AuxInt = i0 31040 v2.Aux = s 31041 v2.AddArg(p) 31042 v2.AddArg(idx) 31043 v2.AddArg(mem) 31044 v1.AddArg(v2) 31045 v0.AddArg(v1) 31046 v0.AddArg(y) 31047 return true 31048 } 31049 // 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)))) 31050 // 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) 31051 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31052 for { 31053 _ = v.Args[1] 31054 s0 := v.Args[0] 31055 if s0.Op != OpS390XSLWconst { 31056 break 31057 } 31058 j0 := s0.AuxInt 31059 x0 := s0.Args[0] 31060 if x0.Op != OpS390XMOVBZloadidx { 31061 break 31062 } 31063 i0 := x0.AuxInt 31064 s := x0.Aux 31065 _ = x0.Args[2] 31066 p := x0.Args[0] 31067 idx := x0.Args[1] 31068 mem := x0.Args[2] 31069 or := v.Args[1] 31070 if or.Op != OpS390XORW { 31071 break 31072 } 31073 _ = or.Args[1] 31074 y := or.Args[0] 31075 s1 := or.Args[1] 31076 if s1.Op != OpS390XSLWconst { 31077 break 31078 } 31079 j1 := s1.AuxInt 31080 x1 := s1.Args[0] 31081 if x1.Op != OpS390XMOVBZloadidx { 31082 break 31083 } 31084 i1 := x1.AuxInt 31085 if x1.Aux != s { 31086 break 31087 } 31088 _ = x1.Args[2] 31089 if idx != x1.Args[0] { 31090 break 31091 } 31092 if p != x1.Args[1] { 31093 break 31094 } 31095 if mem != x1.Args[2] { 31096 break 31097 } 31098 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)) { 31099 break 31100 } 31101 b = mergePoint(b, x0, x1) 31102 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31103 v.reset(OpCopy) 31104 v.AddArg(v0) 31105 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31106 v1.AuxInt = j1 31107 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31108 v2.AuxInt = i0 31109 v2.Aux = s 31110 v2.AddArg(p) 31111 v2.AddArg(idx) 31112 v2.AddArg(mem) 31113 v1.AddArg(v2) 31114 v0.AddArg(v1) 31115 v0.AddArg(y) 31116 return true 31117 } 31118 // 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)))) 31119 // 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) 31120 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31121 for { 31122 _ = v.Args[1] 31123 s0 := v.Args[0] 31124 if s0.Op != OpS390XSLWconst { 31125 break 31126 } 31127 j0 := s0.AuxInt 31128 x0 := s0.Args[0] 31129 if x0.Op != OpS390XMOVBZloadidx { 31130 break 31131 } 31132 i0 := x0.AuxInt 31133 s := x0.Aux 31134 _ = x0.Args[2] 31135 idx := x0.Args[0] 31136 p := x0.Args[1] 31137 mem := x0.Args[2] 31138 or := v.Args[1] 31139 if or.Op != OpS390XORW { 31140 break 31141 } 31142 _ = or.Args[1] 31143 y := or.Args[0] 31144 s1 := or.Args[1] 31145 if s1.Op != OpS390XSLWconst { 31146 break 31147 } 31148 j1 := s1.AuxInt 31149 x1 := s1.Args[0] 31150 if x1.Op != OpS390XMOVBZloadidx { 31151 break 31152 } 31153 i1 := x1.AuxInt 31154 if x1.Aux != s { 31155 break 31156 } 31157 _ = x1.Args[2] 31158 if idx != x1.Args[0] { 31159 break 31160 } 31161 if p != x1.Args[1] { 31162 break 31163 } 31164 if mem != x1.Args[2] { 31165 break 31166 } 31167 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)) { 31168 break 31169 } 31170 b = mergePoint(b, x0, x1) 31171 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31172 v.reset(OpCopy) 31173 v.AddArg(v0) 31174 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31175 v1.AuxInt = j1 31176 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31177 v2.AuxInt = i0 31178 v2.Aux = s 31179 v2.AddArg(p) 31180 v2.AddArg(idx) 31181 v2.AddArg(mem) 31182 v1.AddArg(v2) 31183 v0.AddArg(v1) 31184 v0.AddArg(y) 31185 return true 31186 } 31187 // 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))) 31188 // 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) 31189 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31190 for { 31191 _ = v.Args[1] 31192 or := v.Args[0] 31193 if or.Op != OpS390XORW { 31194 break 31195 } 31196 _ = or.Args[1] 31197 s1 := or.Args[0] 31198 if s1.Op != OpS390XSLWconst { 31199 break 31200 } 31201 j1 := s1.AuxInt 31202 x1 := s1.Args[0] 31203 if x1.Op != OpS390XMOVBZloadidx { 31204 break 31205 } 31206 i1 := x1.AuxInt 31207 s := x1.Aux 31208 _ = x1.Args[2] 31209 p := x1.Args[0] 31210 idx := x1.Args[1] 31211 mem := x1.Args[2] 31212 y := or.Args[1] 31213 s0 := v.Args[1] 31214 if s0.Op != OpS390XSLWconst { 31215 break 31216 } 31217 j0 := s0.AuxInt 31218 x0 := s0.Args[0] 31219 if x0.Op != OpS390XMOVBZloadidx { 31220 break 31221 } 31222 i0 := x0.AuxInt 31223 if x0.Aux != s { 31224 break 31225 } 31226 _ = x0.Args[2] 31227 if p != x0.Args[0] { 31228 break 31229 } 31230 if idx != x0.Args[1] { 31231 break 31232 } 31233 if mem != x0.Args[2] { 31234 break 31235 } 31236 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)) { 31237 break 31238 } 31239 b = mergePoint(b, x0, x1) 31240 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31241 v.reset(OpCopy) 31242 v.AddArg(v0) 31243 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31244 v1.AuxInt = j1 31245 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31246 v2.AuxInt = i0 31247 v2.Aux = s 31248 v2.AddArg(p) 31249 v2.AddArg(idx) 31250 v2.AddArg(mem) 31251 v1.AddArg(v2) 31252 v0.AddArg(v1) 31253 v0.AddArg(y) 31254 return true 31255 } 31256 // 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))) 31257 // 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) 31258 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31259 for { 31260 _ = v.Args[1] 31261 or := v.Args[0] 31262 if or.Op != OpS390XORW { 31263 break 31264 } 31265 _ = or.Args[1] 31266 s1 := or.Args[0] 31267 if s1.Op != OpS390XSLWconst { 31268 break 31269 } 31270 j1 := s1.AuxInt 31271 x1 := s1.Args[0] 31272 if x1.Op != OpS390XMOVBZloadidx { 31273 break 31274 } 31275 i1 := x1.AuxInt 31276 s := x1.Aux 31277 _ = x1.Args[2] 31278 idx := x1.Args[0] 31279 p := x1.Args[1] 31280 mem := x1.Args[2] 31281 y := or.Args[1] 31282 s0 := v.Args[1] 31283 if s0.Op != OpS390XSLWconst { 31284 break 31285 } 31286 j0 := s0.AuxInt 31287 x0 := s0.Args[0] 31288 if x0.Op != OpS390XMOVBZloadidx { 31289 break 31290 } 31291 i0 := x0.AuxInt 31292 if x0.Aux != s { 31293 break 31294 } 31295 _ = x0.Args[2] 31296 if p != x0.Args[0] { 31297 break 31298 } 31299 if idx != x0.Args[1] { 31300 break 31301 } 31302 if mem != x0.Args[2] { 31303 break 31304 } 31305 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)) { 31306 break 31307 } 31308 b = mergePoint(b, x0, x1) 31309 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31310 v.reset(OpCopy) 31311 v.AddArg(v0) 31312 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31313 v1.AuxInt = j1 31314 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31315 v2.AuxInt = i0 31316 v2.Aux = s 31317 v2.AddArg(p) 31318 v2.AddArg(idx) 31319 v2.AddArg(mem) 31320 v1.AddArg(v2) 31321 v0.AddArg(v1) 31322 v0.AddArg(y) 31323 return true 31324 } 31325 // 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))) 31326 // 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) 31327 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31328 for { 31329 _ = v.Args[1] 31330 or := v.Args[0] 31331 if or.Op != OpS390XORW { 31332 break 31333 } 31334 _ = or.Args[1] 31335 y := or.Args[0] 31336 s1 := or.Args[1] 31337 if s1.Op != OpS390XSLWconst { 31338 break 31339 } 31340 j1 := s1.AuxInt 31341 x1 := s1.Args[0] 31342 if x1.Op != OpS390XMOVBZloadidx { 31343 break 31344 } 31345 i1 := x1.AuxInt 31346 s := x1.Aux 31347 _ = x1.Args[2] 31348 p := x1.Args[0] 31349 idx := x1.Args[1] 31350 mem := x1.Args[2] 31351 s0 := v.Args[1] 31352 if s0.Op != OpS390XSLWconst { 31353 break 31354 } 31355 j0 := s0.AuxInt 31356 x0 := s0.Args[0] 31357 if x0.Op != OpS390XMOVBZloadidx { 31358 break 31359 } 31360 i0 := x0.AuxInt 31361 if x0.Aux != s { 31362 break 31363 } 31364 _ = x0.Args[2] 31365 if p != x0.Args[0] { 31366 break 31367 } 31368 if idx != x0.Args[1] { 31369 break 31370 } 31371 if mem != x0.Args[2] { 31372 break 31373 } 31374 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)) { 31375 break 31376 } 31377 b = mergePoint(b, x0, x1) 31378 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31379 v.reset(OpCopy) 31380 v.AddArg(v0) 31381 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31382 v1.AuxInt = j1 31383 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31384 v2.AuxInt = i0 31385 v2.Aux = s 31386 v2.AddArg(p) 31387 v2.AddArg(idx) 31388 v2.AddArg(mem) 31389 v1.AddArg(v2) 31390 v0.AddArg(v1) 31391 v0.AddArg(y) 31392 return true 31393 } 31394 // 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))) 31395 // 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) 31396 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31397 for { 31398 _ = v.Args[1] 31399 or := v.Args[0] 31400 if or.Op != OpS390XORW { 31401 break 31402 } 31403 _ = or.Args[1] 31404 y := or.Args[0] 31405 s1 := or.Args[1] 31406 if s1.Op != OpS390XSLWconst { 31407 break 31408 } 31409 j1 := s1.AuxInt 31410 x1 := s1.Args[0] 31411 if x1.Op != OpS390XMOVBZloadidx { 31412 break 31413 } 31414 i1 := x1.AuxInt 31415 s := x1.Aux 31416 _ = x1.Args[2] 31417 idx := x1.Args[0] 31418 p := x1.Args[1] 31419 mem := x1.Args[2] 31420 s0 := v.Args[1] 31421 if s0.Op != OpS390XSLWconst { 31422 break 31423 } 31424 j0 := s0.AuxInt 31425 x0 := s0.Args[0] 31426 if x0.Op != OpS390XMOVBZloadidx { 31427 break 31428 } 31429 i0 := x0.AuxInt 31430 if x0.Aux != s { 31431 break 31432 } 31433 _ = x0.Args[2] 31434 if p != x0.Args[0] { 31435 break 31436 } 31437 if idx != x0.Args[1] { 31438 break 31439 } 31440 if mem != x0.Args[2] { 31441 break 31442 } 31443 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)) { 31444 break 31445 } 31446 b = mergePoint(b, x0, x1) 31447 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31448 v.reset(OpCopy) 31449 v.AddArg(v0) 31450 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31451 v1.AuxInt = j1 31452 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31453 v2.AuxInt = i0 31454 v2.Aux = s 31455 v2.AddArg(p) 31456 v2.AddArg(idx) 31457 v2.AddArg(mem) 31458 v1.AddArg(v2) 31459 v0.AddArg(v1) 31460 v0.AddArg(y) 31461 return true 31462 } 31463 // 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))) 31464 // 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) 31465 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31466 for { 31467 _ = v.Args[1] 31468 or := v.Args[0] 31469 if or.Op != OpS390XORW { 31470 break 31471 } 31472 _ = or.Args[1] 31473 s1 := or.Args[0] 31474 if s1.Op != OpS390XSLWconst { 31475 break 31476 } 31477 j1 := s1.AuxInt 31478 x1 := s1.Args[0] 31479 if x1.Op != OpS390XMOVBZloadidx { 31480 break 31481 } 31482 i1 := x1.AuxInt 31483 s := x1.Aux 31484 _ = x1.Args[2] 31485 p := x1.Args[0] 31486 idx := x1.Args[1] 31487 mem := x1.Args[2] 31488 y := or.Args[1] 31489 s0 := v.Args[1] 31490 if s0.Op != OpS390XSLWconst { 31491 break 31492 } 31493 j0 := s0.AuxInt 31494 x0 := s0.Args[0] 31495 if x0.Op != OpS390XMOVBZloadidx { 31496 break 31497 } 31498 i0 := x0.AuxInt 31499 if x0.Aux != s { 31500 break 31501 } 31502 _ = x0.Args[2] 31503 if idx != x0.Args[0] { 31504 break 31505 } 31506 if p != x0.Args[1] { 31507 break 31508 } 31509 if mem != x0.Args[2] { 31510 break 31511 } 31512 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)) { 31513 break 31514 } 31515 b = mergePoint(b, x0, x1) 31516 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31517 v.reset(OpCopy) 31518 v.AddArg(v0) 31519 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31520 v1.AuxInt = j1 31521 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31522 v2.AuxInt = i0 31523 v2.Aux = s 31524 v2.AddArg(p) 31525 v2.AddArg(idx) 31526 v2.AddArg(mem) 31527 v1.AddArg(v2) 31528 v0.AddArg(v1) 31529 v0.AddArg(y) 31530 return true 31531 } 31532 return false 31533 } 31534 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 31535 b := v.Block 31536 _ = b 31537 typ := &b.Func.Config.Types 31538 _ = typ 31539 // 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))) 31540 // 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) 31541 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31542 for { 31543 _ = v.Args[1] 31544 or := v.Args[0] 31545 if or.Op != OpS390XORW { 31546 break 31547 } 31548 _ = or.Args[1] 31549 s1 := or.Args[0] 31550 if s1.Op != OpS390XSLWconst { 31551 break 31552 } 31553 j1 := s1.AuxInt 31554 x1 := s1.Args[0] 31555 if x1.Op != OpS390XMOVBZloadidx { 31556 break 31557 } 31558 i1 := x1.AuxInt 31559 s := x1.Aux 31560 _ = x1.Args[2] 31561 idx := x1.Args[0] 31562 p := x1.Args[1] 31563 mem := x1.Args[2] 31564 y := or.Args[1] 31565 s0 := v.Args[1] 31566 if s0.Op != OpS390XSLWconst { 31567 break 31568 } 31569 j0 := s0.AuxInt 31570 x0 := s0.Args[0] 31571 if x0.Op != OpS390XMOVBZloadidx { 31572 break 31573 } 31574 i0 := x0.AuxInt 31575 if x0.Aux != s { 31576 break 31577 } 31578 _ = x0.Args[2] 31579 if idx != x0.Args[0] { 31580 break 31581 } 31582 if p != x0.Args[1] { 31583 break 31584 } 31585 if mem != x0.Args[2] { 31586 break 31587 } 31588 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)) { 31589 break 31590 } 31591 b = mergePoint(b, x0, x1) 31592 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31593 v.reset(OpCopy) 31594 v.AddArg(v0) 31595 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31596 v1.AuxInt = j1 31597 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31598 v2.AuxInt = i0 31599 v2.Aux = s 31600 v2.AddArg(p) 31601 v2.AddArg(idx) 31602 v2.AddArg(mem) 31603 v1.AddArg(v2) 31604 v0.AddArg(v1) 31605 v0.AddArg(y) 31606 return true 31607 } 31608 // 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))) 31609 // 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) 31610 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31611 for { 31612 _ = v.Args[1] 31613 or := v.Args[0] 31614 if or.Op != OpS390XORW { 31615 break 31616 } 31617 _ = or.Args[1] 31618 y := or.Args[0] 31619 s1 := or.Args[1] 31620 if s1.Op != OpS390XSLWconst { 31621 break 31622 } 31623 j1 := s1.AuxInt 31624 x1 := s1.Args[0] 31625 if x1.Op != OpS390XMOVBZloadidx { 31626 break 31627 } 31628 i1 := x1.AuxInt 31629 s := x1.Aux 31630 _ = x1.Args[2] 31631 p := x1.Args[0] 31632 idx := x1.Args[1] 31633 mem := x1.Args[2] 31634 s0 := v.Args[1] 31635 if s0.Op != OpS390XSLWconst { 31636 break 31637 } 31638 j0 := s0.AuxInt 31639 x0 := s0.Args[0] 31640 if x0.Op != OpS390XMOVBZloadidx { 31641 break 31642 } 31643 i0 := x0.AuxInt 31644 if x0.Aux != s { 31645 break 31646 } 31647 _ = x0.Args[2] 31648 if idx != x0.Args[0] { 31649 break 31650 } 31651 if p != x0.Args[1] { 31652 break 31653 } 31654 if mem != x0.Args[2] { 31655 break 31656 } 31657 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)) { 31658 break 31659 } 31660 b = mergePoint(b, x0, x1) 31661 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31662 v.reset(OpCopy) 31663 v.AddArg(v0) 31664 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31665 v1.AuxInt = j1 31666 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31667 v2.AuxInt = i0 31668 v2.Aux = s 31669 v2.AddArg(p) 31670 v2.AddArg(idx) 31671 v2.AddArg(mem) 31672 v1.AddArg(v2) 31673 v0.AddArg(v1) 31674 v0.AddArg(y) 31675 return true 31676 } 31677 // 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))) 31678 // 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) 31679 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31680 for { 31681 _ = v.Args[1] 31682 or := v.Args[0] 31683 if or.Op != OpS390XORW { 31684 break 31685 } 31686 _ = or.Args[1] 31687 y := or.Args[0] 31688 s1 := or.Args[1] 31689 if s1.Op != OpS390XSLWconst { 31690 break 31691 } 31692 j1 := s1.AuxInt 31693 x1 := s1.Args[0] 31694 if x1.Op != OpS390XMOVBZloadidx { 31695 break 31696 } 31697 i1 := x1.AuxInt 31698 s := x1.Aux 31699 _ = x1.Args[2] 31700 idx := x1.Args[0] 31701 p := x1.Args[1] 31702 mem := x1.Args[2] 31703 s0 := v.Args[1] 31704 if s0.Op != OpS390XSLWconst { 31705 break 31706 } 31707 j0 := s0.AuxInt 31708 x0 := s0.Args[0] 31709 if x0.Op != OpS390XMOVBZloadidx { 31710 break 31711 } 31712 i0 := x0.AuxInt 31713 if x0.Aux != s { 31714 break 31715 } 31716 _ = x0.Args[2] 31717 if idx != x0.Args[0] { 31718 break 31719 } 31720 if p != x0.Args[1] { 31721 break 31722 } 31723 if mem != x0.Args[2] { 31724 break 31725 } 31726 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)) { 31727 break 31728 } 31729 b = mergePoint(b, x0, x1) 31730 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31731 v.reset(OpCopy) 31732 v.AddArg(v0) 31733 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31734 v1.AuxInt = j1 31735 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31736 v2.AuxInt = i0 31737 v2.Aux = s 31738 v2.AddArg(p) 31739 v2.AddArg(idx) 31740 v2.AddArg(mem) 31741 v1.AddArg(v2) 31742 v0.AddArg(v1) 31743 v0.AddArg(y) 31744 return true 31745 } 31746 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 31747 // 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) 31748 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31749 for { 31750 _ = v.Args[1] 31751 x0 := v.Args[0] 31752 if x0.Op != OpS390XMOVBZload { 31753 break 31754 } 31755 i0 := x0.AuxInt 31756 s := x0.Aux 31757 _ = x0.Args[1] 31758 p := x0.Args[0] 31759 mem := x0.Args[1] 31760 sh := v.Args[1] 31761 if sh.Op != OpS390XSLWconst { 31762 break 31763 } 31764 if sh.AuxInt != 8 { 31765 break 31766 } 31767 x1 := sh.Args[0] 31768 if x1.Op != OpS390XMOVBZload { 31769 break 31770 } 31771 i1 := x1.AuxInt 31772 if x1.Aux != s { 31773 break 31774 } 31775 _ = x1.Args[1] 31776 if p != x1.Args[0] { 31777 break 31778 } 31779 if mem != x1.Args[1] { 31780 break 31781 } 31782 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)) { 31783 break 31784 } 31785 b = mergePoint(b, x0, x1) 31786 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31787 v.reset(OpCopy) 31788 v.AddArg(v0) 31789 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31790 v1.AuxInt = i0 31791 v1.Aux = s 31792 v1.AddArg(p) 31793 v1.AddArg(mem) 31794 v0.AddArg(v1) 31795 return true 31796 } 31797 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 31798 // 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) 31799 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31800 for { 31801 _ = v.Args[1] 31802 sh := v.Args[0] 31803 if sh.Op != OpS390XSLWconst { 31804 break 31805 } 31806 if sh.AuxInt != 8 { 31807 break 31808 } 31809 x1 := sh.Args[0] 31810 if x1.Op != OpS390XMOVBZload { 31811 break 31812 } 31813 i1 := x1.AuxInt 31814 s := x1.Aux 31815 _ = x1.Args[1] 31816 p := x1.Args[0] 31817 mem := x1.Args[1] 31818 x0 := v.Args[1] 31819 if x0.Op != OpS390XMOVBZload { 31820 break 31821 } 31822 i0 := x0.AuxInt 31823 if x0.Aux != s { 31824 break 31825 } 31826 _ = x0.Args[1] 31827 if p != x0.Args[0] { 31828 break 31829 } 31830 if mem != x0.Args[1] { 31831 break 31832 } 31833 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)) { 31834 break 31835 } 31836 b = mergePoint(b, x0, x1) 31837 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31838 v.reset(OpCopy) 31839 v.AddArg(v0) 31840 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31841 v1.AuxInt = i0 31842 v1.Aux = s 31843 v1.AddArg(p) 31844 v1.AddArg(mem) 31845 v0.AddArg(v1) 31846 return true 31847 } 31848 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 31849 // 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) 31850 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31851 for { 31852 _ = v.Args[1] 31853 r0 := v.Args[0] 31854 if r0.Op != OpS390XMOVHZreg { 31855 break 31856 } 31857 x0 := r0.Args[0] 31858 if x0.Op != OpS390XMOVHBRload { 31859 break 31860 } 31861 i0 := x0.AuxInt 31862 s := x0.Aux 31863 _ = x0.Args[1] 31864 p := x0.Args[0] 31865 mem := x0.Args[1] 31866 sh := v.Args[1] 31867 if sh.Op != OpS390XSLWconst { 31868 break 31869 } 31870 if sh.AuxInt != 16 { 31871 break 31872 } 31873 r1 := sh.Args[0] 31874 if r1.Op != OpS390XMOVHZreg { 31875 break 31876 } 31877 x1 := r1.Args[0] 31878 if x1.Op != OpS390XMOVHBRload { 31879 break 31880 } 31881 i1 := x1.AuxInt 31882 if x1.Aux != s { 31883 break 31884 } 31885 _ = x1.Args[1] 31886 if p != x1.Args[0] { 31887 break 31888 } 31889 if mem != x1.Args[1] { 31890 break 31891 } 31892 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)) { 31893 break 31894 } 31895 b = mergePoint(b, x0, x1) 31896 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 31897 v.reset(OpCopy) 31898 v.AddArg(v0) 31899 v0.AuxInt = i0 31900 v0.Aux = s 31901 v0.AddArg(p) 31902 v0.AddArg(mem) 31903 return true 31904 } 31905 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 31906 // 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) 31907 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31908 for { 31909 _ = v.Args[1] 31910 sh := v.Args[0] 31911 if sh.Op != OpS390XSLWconst { 31912 break 31913 } 31914 if sh.AuxInt != 16 { 31915 break 31916 } 31917 r1 := sh.Args[0] 31918 if r1.Op != OpS390XMOVHZreg { 31919 break 31920 } 31921 x1 := r1.Args[0] 31922 if x1.Op != OpS390XMOVHBRload { 31923 break 31924 } 31925 i1 := x1.AuxInt 31926 s := x1.Aux 31927 _ = x1.Args[1] 31928 p := x1.Args[0] 31929 mem := x1.Args[1] 31930 r0 := v.Args[1] 31931 if r0.Op != OpS390XMOVHZreg { 31932 break 31933 } 31934 x0 := r0.Args[0] 31935 if x0.Op != OpS390XMOVHBRload { 31936 break 31937 } 31938 i0 := x0.AuxInt 31939 if x0.Aux != s { 31940 break 31941 } 31942 _ = x0.Args[1] 31943 if p != x0.Args[0] { 31944 break 31945 } 31946 if mem != x0.Args[1] { 31947 break 31948 } 31949 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)) { 31950 break 31951 } 31952 b = mergePoint(b, x0, x1) 31953 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 31954 v.reset(OpCopy) 31955 v.AddArg(v0) 31956 v0.AuxInt = i0 31957 v0.Aux = s 31958 v0.AddArg(p) 31959 v0.AddArg(mem) 31960 return true 31961 } 31962 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 31963 // 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) 31964 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 31965 for { 31966 _ = v.Args[1] 31967 s1 := v.Args[0] 31968 if s1.Op != OpS390XSLWconst { 31969 break 31970 } 31971 j1 := s1.AuxInt 31972 x1 := s1.Args[0] 31973 if x1.Op != OpS390XMOVBZload { 31974 break 31975 } 31976 i1 := x1.AuxInt 31977 s := x1.Aux 31978 _ = x1.Args[1] 31979 p := x1.Args[0] 31980 mem := x1.Args[1] 31981 or := v.Args[1] 31982 if or.Op != OpS390XORW { 31983 break 31984 } 31985 _ = or.Args[1] 31986 s0 := or.Args[0] 31987 if s0.Op != OpS390XSLWconst { 31988 break 31989 } 31990 j0 := s0.AuxInt 31991 x0 := s0.Args[0] 31992 if x0.Op != OpS390XMOVBZload { 31993 break 31994 } 31995 i0 := x0.AuxInt 31996 if x0.Aux != s { 31997 break 31998 } 31999 _ = x0.Args[1] 32000 if p != x0.Args[0] { 32001 break 32002 } 32003 if mem != x0.Args[1] { 32004 break 32005 } 32006 y := or.Args[1] 32007 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)) { 32008 break 32009 } 32010 b = mergePoint(b, x0, x1) 32011 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32012 v.reset(OpCopy) 32013 v.AddArg(v0) 32014 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32015 v1.AuxInt = j0 32016 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32017 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32018 v3.AuxInt = i0 32019 v3.Aux = s 32020 v3.AddArg(p) 32021 v3.AddArg(mem) 32022 v2.AddArg(v3) 32023 v1.AddArg(v2) 32024 v0.AddArg(v1) 32025 v0.AddArg(y) 32026 return true 32027 } 32028 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 32029 // 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) 32030 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32031 for { 32032 _ = v.Args[1] 32033 s1 := v.Args[0] 32034 if s1.Op != OpS390XSLWconst { 32035 break 32036 } 32037 j1 := s1.AuxInt 32038 x1 := s1.Args[0] 32039 if x1.Op != OpS390XMOVBZload { 32040 break 32041 } 32042 i1 := x1.AuxInt 32043 s := x1.Aux 32044 _ = x1.Args[1] 32045 p := x1.Args[0] 32046 mem := x1.Args[1] 32047 or := v.Args[1] 32048 if or.Op != OpS390XORW { 32049 break 32050 } 32051 _ = or.Args[1] 32052 y := or.Args[0] 32053 s0 := or.Args[1] 32054 if s0.Op != OpS390XSLWconst { 32055 break 32056 } 32057 j0 := s0.AuxInt 32058 x0 := s0.Args[0] 32059 if x0.Op != OpS390XMOVBZload { 32060 break 32061 } 32062 i0 := x0.AuxInt 32063 if x0.Aux != s { 32064 break 32065 } 32066 _ = x0.Args[1] 32067 if p != x0.Args[0] { 32068 break 32069 } 32070 if mem != x0.Args[1] { 32071 break 32072 } 32073 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)) { 32074 break 32075 } 32076 b = mergePoint(b, x0, x1) 32077 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32078 v.reset(OpCopy) 32079 v.AddArg(v0) 32080 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32081 v1.AuxInt = j0 32082 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32083 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32084 v3.AuxInt = i0 32085 v3.Aux = s 32086 v3.AddArg(p) 32087 v3.AddArg(mem) 32088 v2.AddArg(v3) 32089 v1.AddArg(v2) 32090 v0.AddArg(v1) 32091 v0.AddArg(y) 32092 return true 32093 } 32094 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32095 // 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) 32096 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32097 for { 32098 _ = v.Args[1] 32099 or := v.Args[0] 32100 if or.Op != OpS390XORW { 32101 break 32102 } 32103 _ = or.Args[1] 32104 s0 := or.Args[0] 32105 if s0.Op != OpS390XSLWconst { 32106 break 32107 } 32108 j0 := s0.AuxInt 32109 x0 := s0.Args[0] 32110 if x0.Op != OpS390XMOVBZload { 32111 break 32112 } 32113 i0 := x0.AuxInt 32114 s := x0.Aux 32115 _ = x0.Args[1] 32116 p := x0.Args[0] 32117 mem := x0.Args[1] 32118 y := or.Args[1] 32119 s1 := v.Args[1] 32120 if s1.Op != OpS390XSLWconst { 32121 break 32122 } 32123 j1 := s1.AuxInt 32124 x1 := s1.Args[0] 32125 if x1.Op != OpS390XMOVBZload { 32126 break 32127 } 32128 i1 := x1.AuxInt 32129 if x1.Aux != s { 32130 break 32131 } 32132 _ = x1.Args[1] 32133 if p != x1.Args[0] { 32134 break 32135 } 32136 if mem != x1.Args[1] { 32137 break 32138 } 32139 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)) { 32140 break 32141 } 32142 b = mergePoint(b, x0, x1) 32143 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32144 v.reset(OpCopy) 32145 v.AddArg(v0) 32146 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32147 v1.AuxInt = j0 32148 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32149 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32150 v3.AuxInt = i0 32151 v3.Aux = s 32152 v3.AddArg(p) 32153 v3.AddArg(mem) 32154 v2.AddArg(v3) 32155 v1.AddArg(v2) 32156 v0.AddArg(v1) 32157 v0.AddArg(y) 32158 return true 32159 } 32160 return false 32161 } 32162 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 32163 b := v.Block 32164 _ = b 32165 typ := &b.Func.Config.Types 32166 _ = typ 32167 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32168 // 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) 32169 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32170 for { 32171 _ = v.Args[1] 32172 or := v.Args[0] 32173 if or.Op != OpS390XORW { 32174 break 32175 } 32176 _ = or.Args[1] 32177 y := or.Args[0] 32178 s0 := or.Args[1] 32179 if s0.Op != OpS390XSLWconst { 32180 break 32181 } 32182 j0 := s0.AuxInt 32183 x0 := s0.Args[0] 32184 if x0.Op != OpS390XMOVBZload { 32185 break 32186 } 32187 i0 := x0.AuxInt 32188 s := x0.Aux 32189 _ = x0.Args[1] 32190 p := x0.Args[0] 32191 mem := x0.Args[1] 32192 s1 := v.Args[1] 32193 if s1.Op != OpS390XSLWconst { 32194 break 32195 } 32196 j1 := s1.AuxInt 32197 x1 := s1.Args[0] 32198 if x1.Op != OpS390XMOVBZload { 32199 break 32200 } 32201 i1 := x1.AuxInt 32202 if x1.Aux != s { 32203 break 32204 } 32205 _ = x1.Args[1] 32206 if p != x1.Args[0] { 32207 break 32208 } 32209 if mem != x1.Args[1] { 32210 break 32211 } 32212 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)) { 32213 break 32214 } 32215 b = mergePoint(b, x0, x1) 32216 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32217 v.reset(OpCopy) 32218 v.AddArg(v0) 32219 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32220 v1.AuxInt = j0 32221 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32222 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32223 v3.AuxInt = i0 32224 v3.Aux = s 32225 v3.AddArg(p) 32226 v3.AddArg(mem) 32227 v2.AddArg(v3) 32228 v1.AddArg(v2) 32229 v0.AddArg(v1) 32230 v0.AddArg(y) 32231 return true 32232 } 32233 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32234 // 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) 32235 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32236 for { 32237 _ = v.Args[1] 32238 x0 := v.Args[0] 32239 if x0.Op != OpS390XMOVBZloadidx { 32240 break 32241 } 32242 i0 := x0.AuxInt 32243 s := x0.Aux 32244 _ = x0.Args[2] 32245 p := x0.Args[0] 32246 idx := x0.Args[1] 32247 mem := x0.Args[2] 32248 sh := v.Args[1] 32249 if sh.Op != OpS390XSLWconst { 32250 break 32251 } 32252 if sh.AuxInt != 8 { 32253 break 32254 } 32255 x1 := sh.Args[0] 32256 if x1.Op != OpS390XMOVBZloadidx { 32257 break 32258 } 32259 i1 := x1.AuxInt 32260 if x1.Aux != s { 32261 break 32262 } 32263 _ = x1.Args[2] 32264 if p != x1.Args[0] { 32265 break 32266 } 32267 if idx != x1.Args[1] { 32268 break 32269 } 32270 if mem != x1.Args[2] { 32271 break 32272 } 32273 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)) { 32274 break 32275 } 32276 b = mergePoint(b, x0, x1) 32277 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32278 v.reset(OpCopy) 32279 v.AddArg(v0) 32280 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32281 v1.AuxInt = i0 32282 v1.Aux = s 32283 v1.AddArg(p) 32284 v1.AddArg(idx) 32285 v1.AddArg(mem) 32286 v0.AddArg(v1) 32287 return true 32288 } 32289 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32290 // 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) 32291 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32292 for { 32293 _ = v.Args[1] 32294 x0 := v.Args[0] 32295 if x0.Op != OpS390XMOVBZloadidx { 32296 break 32297 } 32298 i0 := x0.AuxInt 32299 s := x0.Aux 32300 _ = x0.Args[2] 32301 idx := x0.Args[0] 32302 p := x0.Args[1] 32303 mem := x0.Args[2] 32304 sh := v.Args[1] 32305 if sh.Op != OpS390XSLWconst { 32306 break 32307 } 32308 if sh.AuxInt != 8 { 32309 break 32310 } 32311 x1 := sh.Args[0] 32312 if x1.Op != OpS390XMOVBZloadidx { 32313 break 32314 } 32315 i1 := x1.AuxInt 32316 if x1.Aux != s { 32317 break 32318 } 32319 _ = x1.Args[2] 32320 if p != x1.Args[0] { 32321 break 32322 } 32323 if idx != x1.Args[1] { 32324 break 32325 } 32326 if mem != x1.Args[2] { 32327 break 32328 } 32329 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)) { 32330 break 32331 } 32332 b = mergePoint(b, x0, x1) 32333 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32334 v.reset(OpCopy) 32335 v.AddArg(v0) 32336 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32337 v1.AuxInt = i0 32338 v1.Aux = s 32339 v1.AddArg(p) 32340 v1.AddArg(idx) 32341 v1.AddArg(mem) 32342 v0.AddArg(v1) 32343 return true 32344 } 32345 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32346 // 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) 32347 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32348 for { 32349 _ = v.Args[1] 32350 x0 := v.Args[0] 32351 if x0.Op != OpS390XMOVBZloadidx { 32352 break 32353 } 32354 i0 := x0.AuxInt 32355 s := x0.Aux 32356 _ = x0.Args[2] 32357 p := x0.Args[0] 32358 idx := x0.Args[1] 32359 mem := x0.Args[2] 32360 sh := v.Args[1] 32361 if sh.Op != OpS390XSLWconst { 32362 break 32363 } 32364 if sh.AuxInt != 8 { 32365 break 32366 } 32367 x1 := sh.Args[0] 32368 if x1.Op != OpS390XMOVBZloadidx { 32369 break 32370 } 32371 i1 := x1.AuxInt 32372 if x1.Aux != s { 32373 break 32374 } 32375 _ = x1.Args[2] 32376 if idx != x1.Args[0] { 32377 break 32378 } 32379 if p != x1.Args[1] { 32380 break 32381 } 32382 if mem != x1.Args[2] { 32383 break 32384 } 32385 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)) { 32386 break 32387 } 32388 b = mergePoint(b, x0, x1) 32389 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32390 v.reset(OpCopy) 32391 v.AddArg(v0) 32392 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32393 v1.AuxInt = i0 32394 v1.Aux = s 32395 v1.AddArg(p) 32396 v1.AddArg(idx) 32397 v1.AddArg(mem) 32398 v0.AddArg(v1) 32399 return true 32400 } 32401 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32402 // 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) 32403 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32404 for { 32405 _ = v.Args[1] 32406 x0 := v.Args[0] 32407 if x0.Op != OpS390XMOVBZloadidx { 32408 break 32409 } 32410 i0 := x0.AuxInt 32411 s := x0.Aux 32412 _ = x0.Args[2] 32413 idx := x0.Args[0] 32414 p := x0.Args[1] 32415 mem := x0.Args[2] 32416 sh := v.Args[1] 32417 if sh.Op != OpS390XSLWconst { 32418 break 32419 } 32420 if sh.AuxInt != 8 { 32421 break 32422 } 32423 x1 := sh.Args[0] 32424 if x1.Op != OpS390XMOVBZloadidx { 32425 break 32426 } 32427 i1 := x1.AuxInt 32428 if x1.Aux != s { 32429 break 32430 } 32431 _ = x1.Args[2] 32432 if idx != x1.Args[0] { 32433 break 32434 } 32435 if p != x1.Args[1] { 32436 break 32437 } 32438 if mem != x1.Args[2] { 32439 break 32440 } 32441 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)) { 32442 break 32443 } 32444 b = mergePoint(b, x0, x1) 32445 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32446 v.reset(OpCopy) 32447 v.AddArg(v0) 32448 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32449 v1.AuxInt = i0 32450 v1.Aux = s 32451 v1.AddArg(p) 32452 v1.AddArg(idx) 32453 v1.AddArg(mem) 32454 v0.AddArg(v1) 32455 return true 32456 } 32457 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32458 // 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) 32459 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32460 for { 32461 _ = v.Args[1] 32462 sh := v.Args[0] 32463 if sh.Op != OpS390XSLWconst { 32464 break 32465 } 32466 if sh.AuxInt != 8 { 32467 break 32468 } 32469 x1 := sh.Args[0] 32470 if x1.Op != OpS390XMOVBZloadidx { 32471 break 32472 } 32473 i1 := x1.AuxInt 32474 s := x1.Aux 32475 _ = x1.Args[2] 32476 p := x1.Args[0] 32477 idx := x1.Args[1] 32478 mem := x1.Args[2] 32479 x0 := v.Args[1] 32480 if x0.Op != OpS390XMOVBZloadidx { 32481 break 32482 } 32483 i0 := x0.AuxInt 32484 if x0.Aux != s { 32485 break 32486 } 32487 _ = x0.Args[2] 32488 if p != x0.Args[0] { 32489 break 32490 } 32491 if idx != x0.Args[1] { 32492 break 32493 } 32494 if mem != x0.Args[2] { 32495 break 32496 } 32497 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)) { 32498 break 32499 } 32500 b = mergePoint(b, x0, x1) 32501 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32502 v.reset(OpCopy) 32503 v.AddArg(v0) 32504 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32505 v1.AuxInt = i0 32506 v1.Aux = s 32507 v1.AddArg(p) 32508 v1.AddArg(idx) 32509 v1.AddArg(mem) 32510 v0.AddArg(v1) 32511 return true 32512 } 32513 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32514 // 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) 32515 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32516 for { 32517 _ = v.Args[1] 32518 sh := v.Args[0] 32519 if sh.Op != OpS390XSLWconst { 32520 break 32521 } 32522 if sh.AuxInt != 8 { 32523 break 32524 } 32525 x1 := sh.Args[0] 32526 if x1.Op != OpS390XMOVBZloadidx { 32527 break 32528 } 32529 i1 := x1.AuxInt 32530 s := x1.Aux 32531 _ = x1.Args[2] 32532 idx := x1.Args[0] 32533 p := x1.Args[1] 32534 mem := x1.Args[2] 32535 x0 := v.Args[1] 32536 if x0.Op != OpS390XMOVBZloadidx { 32537 break 32538 } 32539 i0 := x0.AuxInt 32540 if x0.Aux != s { 32541 break 32542 } 32543 _ = x0.Args[2] 32544 if p != x0.Args[0] { 32545 break 32546 } 32547 if idx != x0.Args[1] { 32548 break 32549 } 32550 if mem != x0.Args[2] { 32551 break 32552 } 32553 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)) { 32554 break 32555 } 32556 b = mergePoint(b, x0, x1) 32557 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32558 v.reset(OpCopy) 32559 v.AddArg(v0) 32560 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32561 v1.AuxInt = i0 32562 v1.Aux = s 32563 v1.AddArg(p) 32564 v1.AddArg(idx) 32565 v1.AddArg(mem) 32566 v0.AddArg(v1) 32567 return true 32568 } 32569 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32570 // 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) 32571 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32572 for { 32573 _ = v.Args[1] 32574 sh := v.Args[0] 32575 if sh.Op != OpS390XSLWconst { 32576 break 32577 } 32578 if sh.AuxInt != 8 { 32579 break 32580 } 32581 x1 := sh.Args[0] 32582 if x1.Op != OpS390XMOVBZloadidx { 32583 break 32584 } 32585 i1 := x1.AuxInt 32586 s := x1.Aux 32587 _ = x1.Args[2] 32588 p := x1.Args[0] 32589 idx := x1.Args[1] 32590 mem := x1.Args[2] 32591 x0 := v.Args[1] 32592 if x0.Op != OpS390XMOVBZloadidx { 32593 break 32594 } 32595 i0 := x0.AuxInt 32596 if x0.Aux != s { 32597 break 32598 } 32599 _ = x0.Args[2] 32600 if idx != x0.Args[0] { 32601 break 32602 } 32603 if p != x0.Args[1] { 32604 break 32605 } 32606 if mem != x0.Args[2] { 32607 break 32608 } 32609 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)) { 32610 break 32611 } 32612 b = mergePoint(b, x0, x1) 32613 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32614 v.reset(OpCopy) 32615 v.AddArg(v0) 32616 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32617 v1.AuxInt = i0 32618 v1.Aux = s 32619 v1.AddArg(p) 32620 v1.AddArg(idx) 32621 v1.AddArg(mem) 32622 v0.AddArg(v1) 32623 return true 32624 } 32625 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32626 // 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) 32627 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32628 for { 32629 _ = v.Args[1] 32630 sh := v.Args[0] 32631 if sh.Op != OpS390XSLWconst { 32632 break 32633 } 32634 if sh.AuxInt != 8 { 32635 break 32636 } 32637 x1 := sh.Args[0] 32638 if x1.Op != OpS390XMOVBZloadidx { 32639 break 32640 } 32641 i1 := x1.AuxInt 32642 s := x1.Aux 32643 _ = x1.Args[2] 32644 idx := x1.Args[0] 32645 p := x1.Args[1] 32646 mem := x1.Args[2] 32647 x0 := v.Args[1] 32648 if x0.Op != OpS390XMOVBZloadidx { 32649 break 32650 } 32651 i0 := x0.AuxInt 32652 if x0.Aux != s { 32653 break 32654 } 32655 _ = x0.Args[2] 32656 if idx != x0.Args[0] { 32657 break 32658 } 32659 if p != x0.Args[1] { 32660 break 32661 } 32662 if mem != x0.Args[2] { 32663 break 32664 } 32665 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)) { 32666 break 32667 } 32668 b = mergePoint(b, x0, x1) 32669 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32670 v.reset(OpCopy) 32671 v.AddArg(v0) 32672 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32673 v1.AuxInt = i0 32674 v1.Aux = s 32675 v1.AddArg(p) 32676 v1.AddArg(idx) 32677 v1.AddArg(mem) 32678 v0.AddArg(v1) 32679 return true 32680 } 32681 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32682 // 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) 32683 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32684 for { 32685 _ = v.Args[1] 32686 r0 := v.Args[0] 32687 if r0.Op != OpS390XMOVHZreg { 32688 break 32689 } 32690 x0 := r0.Args[0] 32691 if x0.Op != OpS390XMOVHBRloadidx { 32692 break 32693 } 32694 i0 := x0.AuxInt 32695 s := x0.Aux 32696 _ = x0.Args[2] 32697 p := x0.Args[0] 32698 idx := x0.Args[1] 32699 mem := x0.Args[2] 32700 sh := v.Args[1] 32701 if sh.Op != OpS390XSLWconst { 32702 break 32703 } 32704 if sh.AuxInt != 16 { 32705 break 32706 } 32707 r1 := sh.Args[0] 32708 if r1.Op != OpS390XMOVHZreg { 32709 break 32710 } 32711 x1 := r1.Args[0] 32712 if x1.Op != OpS390XMOVHBRloadidx { 32713 break 32714 } 32715 i1 := x1.AuxInt 32716 if x1.Aux != s { 32717 break 32718 } 32719 _ = x1.Args[2] 32720 if p != x1.Args[0] { 32721 break 32722 } 32723 if idx != x1.Args[1] { 32724 break 32725 } 32726 if mem != x1.Args[2] { 32727 break 32728 } 32729 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)) { 32730 break 32731 } 32732 b = mergePoint(b, x0, x1) 32733 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32734 v.reset(OpCopy) 32735 v.AddArg(v0) 32736 v0.AuxInt = i0 32737 v0.Aux = s 32738 v0.AddArg(p) 32739 v0.AddArg(idx) 32740 v0.AddArg(mem) 32741 return true 32742 } 32743 return false 32744 } 32745 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 32746 b := v.Block 32747 _ = b 32748 typ := &b.Func.Config.Types 32749 _ = typ 32750 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32751 // 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) 32752 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32753 for { 32754 _ = v.Args[1] 32755 r0 := v.Args[0] 32756 if r0.Op != OpS390XMOVHZreg { 32757 break 32758 } 32759 x0 := r0.Args[0] 32760 if x0.Op != OpS390XMOVHBRloadidx { 32761 break 32762 } 32763 i0 := x0.AuxInt 32764 s := x0.Aux 32765 _ = x0.Args[2] 32766 idx := x0.Args[0] 32767 p := x0.Args[1] 32768 mem := x0.Args[2] 32769 sh := v.Args[1] 32770 if sh.Op != OpS390XSLWconst { 32771 break 32772 } 32773 if sh.AuxInt != 16 { 32774 break 32775 } 32776 r1 := sh.Args[0] 32777 if r1.Op != OpS390XMOVHZreg { 32778 break 32779 } 32780 x1 := r1.Args[0] 32781 if x1.Op != OpS390XMOVHBRloadidx { 32782 break 32783 } 32784 i1 := x1.AuxInt 32785 if x1.Aux != s { 32786 break 32787 } 32788 _ = x1.Args[2] 32789 if p != x1.Args[0] { 32790 break 32791 } 32792 if idx != x1.Args[1] { 32793 break 32794 } 32795 if mem != x1.Args[2] { 32796 break 32797 } 32798 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)) { 32799 break 32800 } 32801 b = mergePoint(b, x0, x1) 32802 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32803 v.reset(OpCopy) 32804 v.AddArg(v0) 32805 v0.AuxInt = i0 32806 v0.Aux = s 32807 v0.AddArg(p) 32808 v0.AddArg(idx) 32809 v0.AddArg(mem) 32810 return true 32811 } 32812 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32813 // 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) 32814 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32815 for { 32816 _ = v.Args[1] 32817 r0 := v.Args[0] 32818 if r0.Op != OpS390XMOVHZreg { 32819 break 32820 } 32821 x0 := r0.Args[0] 32822 if x0.Op != OpS390XMOVHBRloadidx { 32823 break 32824 } 32825 i0 := x0.AuxInt 32826 s := x0.Aux 32827 _ = x0.Args[2] 32828 p := x0.Args[0] 32829 idx := x0.Args[1] 32830 mem := x0.Args[2] 32831 sh := v.Args[1] 32832 if sh.Op != OpS390XSLWconst { 32833 break 32834 } 32835 if sh.AuxInt != 16 { 32836 break 32837 } 32838 r1 := sh.Args[0] 32839 if r1.Op != OpS390XMOVHZreg { 32840 break 32841 } 32842 x1 := r1.Args[0] 32843 if x1.Op != OpS390XMOVHBRloadidx { 32844 break 32845 } 32846 i1 := x1.AuxInt 32847 if x1.Aux != s { 32848 break 32849 } 32850 _ = x1.Args[2] 32851 if idx != x1.Args[0] { 32852 break 32853 } 32854 if p != x1.Args[1] { 32855 break 32856 } 32857 if mem != x1.Args[2] { 32858 break 32859 } 32860 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)) { 32861 break 32862 } 32863 b = mergePoint(b, x0, x1) 32864 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32865 v.reset(OpCopy) 32866 v.AddArg(v0) 32867 v0.AuxInt = i0 32868 v0.Aux = s 32869 v0.AddArg(p) 32870 v0.AddArg(idx) 32871 v0.AddArg(mem) 32872 return true 32873 } 32874 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32875 // 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) 32876 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32877 for { 32878 _ = v.Args[1] 32879 r0 := v.Args[0] 32880 if r0.Op != OpS390XMOVHZreg { 32881 break 32882 } 32883 x0 := r0.Args[0] 32884 if x0.Op != OpS390XMOVHBRloadidx { 32885 break 32886 } 32887 i0 := x0.AuxInt 32888 s := x0.Aux 32889 _ = x0.Args[2] 32890 idx := x0.Args[0] 32891 p := x0.Args[1] 32892 mem := x0.Args[2] 32893 sh := v.Args[1] 32894 if sh.Op != OpS390XSLWconst { 32895 break 32896 } 32897 if sh.AuxInt != 16 { 32898 break 32899 } 32900 r1 := sh.Args[0] 32901 if r1.Op != OpS390XMOVHZreg { 32902 break 32903 } 32904 x1 := r1.Args[0] 32905 if x1.Op != OpS390XMOVHBRloadidx { 32906 break 32907 } 32908 i1 := x1.AuxInt 32909 if x1.Aux != s { 32910 break 32911 } 32912 _ = x1.Args[2] 32913 if idx != x1.Args[0] { 32914 break 32915 } 32916 if p != x1.Args[1] { 32917 break 32918 } 32919 if mem != x1.Args[2] { 32920 break 32921 } 32922 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)) { 32923 break 32924 } 32925 b = mergePoint(b, x0, x1) 32926 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32927 v.reset(OpCopy) 32928 v.AddArg(v0) 32929 v0.AuxInt = i0 32930 v0.Aux = s 32931 v0.AddArg(p) 32932 v0.AddArg(idx) 32933 v0.AddArg(mem) 32934 return true 32935 } 32936 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 32937 // 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) 32938 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32939 for { 32940 _ = v.Args[1] 32941 sh := v.Args[0] 32942 if sh.Op != OpS390XSLWconst { 32943 break 32944 } 32945 if sh.AuxInt != 16 { 32946 break 32947 } 32948 r1 := sh.Args[0] 32949 if r1.Op != OpS390XMOVHZreg { 32950 break 32951 } 32952 x1 := r1.Args[0] 32953 if x1.Op != OpS390XMOVHBRloadidx { 32954 break 32955 } 32956 i1 := x1.AuxInt 32957 s := x1.Aux 32958 _ = x1.Args[2] 32959 p := x1.Args[0] 32960 idx := x1.Args[1] 32961 mem := x1.Args[2] 32962 r0 := v.Args[1] 32963 if r0.Op != OpS390XMOVHZreg { 32964 break 32965 } 32966 x0 := r0.Args[0] 32967 if x0.Op != OpS390XMOVHBRloadidx { 32968 break 32969 } 32970 i0 := x0.AuxInt 32971 if x0.Aux != s { 32972 break 32973 } 32974 _ = x0.Args[2] 32975 if p != x0.Args[0] { 32976 break 32977 } 32978 if idx != x0.Args[1] { 32979 break 32980 } 32981 if mem != x0.Args[2] { 32982 break 32983 } 32984 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)) { 32985 break 32986 } 32987 b = mergePoint(b, x0, x1) 32988 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32989 v.reset(OpCopy) 32990 v.AddArg(v0) 32991 v0.AuxInt = i0 32992 v0.Aux = s 32993 v0.AddArg(p) 32994 v0.AddArg(idx) 32995 v0.AddArg(mem) 32996 return true 32997 } 32998 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 32999 // 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) 33000 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33001 for { 33002 _ = v.Args[1] 33003 sh := v.Args[0] 33004 if sh.Op != OpS390XSLWconst { 33005 break 33006 } 33007 if sh.AuxInt != 16 { 33008 break 33009 } 33010 r1 := sh.Args[0] 33011 if r1.Op != OpS390XMOVHZreg { 33012 break 33013 } 33014 x1 := r1.Args[0] 33015 if x1.Op != OpS390XMOVHBRloadidx { 33016 break 33017 } 33018 i1 := x1.AuxInt 33019 s := x1.Aux 33020 _ = x1.Args[2] 33021 idx := x1.Args[0] 33022 p := x1.Args[1] 33023 mem := x1.Args[2] 33024 r0 := v.Args[1] 33025 if r0.Op != OpS390XMOVHZreg { 33026 break 33027 } 33028 x0 := r0.Args[0] 33029 if x0.Op != OpS390XMOVHBRloadidx { 33030 break 33031 } 33032 i0 := x0.AuxInt 33033 if x0.Aux != s { 33034 break 33035 } 33036 _ = x0.Args[2] 33037 if p != x0.Args[0] { 33038 break 33039 } 33040 if idx != x0.Args[1] { 33041 break 33042 } 33043 if mem != x0.Args[2] { 33044 break 33045 } 33046 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)) { 33047 break 33048 } 33049 b = mergePoint(b, x0, x1) 33050 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33051 v.reset(OpCopy) 33052 v.AddArg(v0) 33053 v0.AuxInt = i0 33054 v0.Aux = s 33055 v0.AddArg(p) 33056 v0.AddArg(idx) 33057 v0.AddArg(mem) 33058 return true 33059 } 33060 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33061 // 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) 33062 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33063 for { 33064 _ = v.Args[1] 33065 sh := v.Args[0] 33066 if sh.Op != OpS390XSLWconst { 33067 break 33068 } 33069 if sh.AuxInt != 16 { 33070 break 33071 } 33072 r1 := sh.Args[0] 33073 if r1.Op != OpS390XMOVHZreg { 33074 break 33075 } 33076 x1 := r1.Args[0] 33077 if x1.Op != OpS390XMOVHBRloadidx { 33078 break 33079 } 33080 i1 := x1.AuxInt 33081 s := x1.Aux 33082 _ = x1.Args[2] 33083 p := x1.Args[0] 33084 idx := x1.Args[1] 33085 mem := x1.Args[2] 33086 r0 := v.Args[1] 33087 if r0.Op != OpS390XMOVHZreg { 33088 break 33089 } 33090 x0 := r0.Args[0] 33091 if x0.Op != OpS390XMOVHBRloadidx { 33092 break 33093 } 33094 i0 := x0.AuxInt 33095 if x0.Aux != s { 33096 break 33097 } 33098 _ = x0.Args[2] 33099 if idx != x0.Args[0] { 33100 break 33101 } 33102 if p != x0.Args[1] { 33103 break 33104 } 33105 if mem != x0.Args[2] { 33106 break 33107 } 33108 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)) { 33109 break 33110 } 33111 b = mergePoint(b, x0, x1) 33112 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33113 v.reset(OpCopy) 33114 v.AddArg(v0) 33115 v0.AuxInt = i0 33116 v0.Aux = s 33117 v0.AddArg(p) 33118 v0.AddArg(idx) 33119 v0.AddArg(mem) 33120 return true 33121 } 33122 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33123 // 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) 33124 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33125 for { 33126 _ = v.Args[1] 33127 sh := v.Args[0] 33128 if sh.Op != OpS390XSLWconst { 33129 break 33130 } 33131 if sh.AuxInt != 16 { 33132 break 33133 } 33134 r1 := sh.Args[0] 33135 if r1.Op != OpS390XMOVHZreg { 33136 break 33137 } 33138 x1 := r1.Args[0] 33139 if x1.Op != OpS390XMOVHBRloadidx { 33140 break 33141 } 33142 i1 := x1.AuxInt 33143 s := x1.Aux 33144 _ = x1.Args[2] 33145 idx := x1.Args[0] 33146 p := x1.Args[1] 33147 mem := x1.Args[2] 33148 r0 := v.Args[1] 33149 if r0.Op != OpS390XMOVHZreg { 33150 break 33151 } 33152 x0 := r0.Args[0] 33153 if x0.Op != OpS390XMOVHBRloadidx { 33154 break 33155 } 33156 i0 := x0.AuxInt 33157 if x0.Aux != s { 33158 break 33159 } 33160 _ = x0.Args[2] 33161 if idx != x0.Args[0] { 33162 break 33163 } 33164 if p != x0.Args[1] { 33165 break 33166 } 33167 if mem != x0.Args[2] { 33168 break 33169 } 33170 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)) { 33171 break 33172 } 33173 b = mergePoint(b, x0, x1) 33174 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33175 v.reset(OpCopy) 33176 v.AddArg(v0) 33177 v0.AuxInt = i0 33178 v0.Aux = s 33179 v0.AddArg(p) 33180 v0.AddArg(idx) 33181 v0.AddArg(mem) 33182 return true 33183 } 33184 // 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)) 33185 // 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) 33186 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33187 for { 33188 _ = v.Args[1] 33189 s1 := v.Args[0] 33190 if s1.Op != OpS390XSLWconst { 33191 break 33192 } 33193 j1 := s1.AuxInt 33194 x1 := s1.Args[0] 33195 if x1.Op != OpS390XMOVBZloadidx { 33196 break 33197 } 33198 i1 := x1.AuxInt 33199 s := x1.Aux 33200 _ = x1.Args[2] 33201 p := x1.Args[0] 33202 idx := x1.Args[1] 33203 mem := x1.Args[2] 33204 or := v.Args[1] 33205 if or.Op != OpS390XORW { 33206 break 33207 } 33208 _ = or.Args[1] 33209 s0 := or.Args[0] 33210 if s0.Op != OpS390XSLWconst { 33211 break 33212 } 33213 j0 := s0.AuxInt 33214 x0 := s0.Args[0] 33215 if x0.Op != OpS390XMOVBZloadidx { 33216 break 33217 } 33218 i0 := x0.AuxInt 33219 if x0.Aux != s { 33220 break 33221 } 33222 _ = x0.Args[2] 33223 if p != x0.Args[0] { 33224 break 33225 } 33226 if idx != x0.Args[1] { 33227 break 33228 } 33229 if mem != x0.Args[2] { 33230 break 33231 } 33232 y := or.Args[1] 33233 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)) { 33234 break 33235 } 33236 b = mergePoint(b, x0, x1) 33237 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33238 v.reset(OpCopy) 33239 v.AddArg(v0) 33240 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33241 v1.AuxInt = j0 33242 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33243 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33244 v3.AuxInt = i0 33245 v3.Aux = s 33246 v3.AddArg(p) 33247 v3.AddArg(idx) 33248 v3.AddArg(mem) 33249 v2.AddArg(v3) 33250 v1.AddArg(v2) 33251 v0.AddArg(v1) 33252 v0.AddArg(y) 33253 return true 33254 } 33255 // 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)) 33256 // 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) 33257 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33258 for { 33259 _ = v.Args[1] 33260 s1 := v.Args[0] 33261 if s1.Op != OpS390XSLWconst { 33262 break 33263 } 33264 j1 := s1.AuxInt 33265 x1 := s1.Args[0] 33266 if x1.Op != OpS390XMOVBZloadidx { 33267 break 33268 } 33269 i1 := x1.AuxInt 33270 s := x1.Aux 33271 _ = x1.Args[2] 33272 idx := x1.Args[0] 33273 p := x1.Args[1] 33274 mem := x1.Args[2] 33275 or := v.Args[1] 33276 if or.Op != OpS390XORW { 33277 break 33278 } 33279 _ = or.Args[1] 33280 s0 := or.Args[0] 33281 if s0.Op != OpS390XSLWconst { 33282 break 33283 } 33284 j0 := s0.AuxInt 33285 x0 := s0.Args[0] 33286 if x0.Op != OpS390XMOVBZloadidx { 33287 break 33288 } 33289 i0 := x0.AuxInt 33290 if x0.Aux != s { 33291 break 33292 } 33293 _ = x0.Args[2] 33294 if p != x0.Args[0] { 33295 break 33296 } 33297 if idx != x0.Args[1] { 33298 break 33299 } 33300 if mem != x0.Args[2] { 33301 break 33302 } 33303 y := or.Args[1] 33304 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)) { 33305 break 33306 } 33307 b = mergePoint(b, x0, x1) 33308 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33309 v.reset(OpCopy) 33310 v.AddArg(v0) 33311 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33312 v1.AuxInt = j0 33313 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33314 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33315 v3.AuxInt = i0 33316 v3.Aux = s 33317 v3.AddArg(p) 33318 v3.AddArg(idx) 33319 v3.AddArg(mem) 33320 v2.AddArg(v3) 33321 v1.AddArg(v2) 33322 v0.AddArg(v1) 33323 v0.AddArg(y) 33324 return true 33325 } 33326 // 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)) 33327 // 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) 33328 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33329 for { 33330 _ = v.Args[1] 33331 s1 := v.Args[0] 33332 if s1.Op != OpS390XSLWconst { 33333 break 33334 } 33335 j1 := s1.AuxInt 33336 x1 := s1.Args[0] 33337 if x1.Op != OpS390XMOVBZloadidx { 33338 break 33339 } 33340 i1 := x1.AuxInt 33341 s := x1.Aux 33342 _ = x1.Args[2] 33343 p := x1.Args[0] 33344 idx := x1.Args[1] 33345 mem := x1.Args[2] 33346 or := v.Args[1] 33347 if or.Op != OpS390XORW { 33348 break 33349 } 33350 _ = or.Args[1] 33351 s0 := or.Args[0] 33352 if s0.Op != OpS390XSLWconst { 33353 break 33354 } 33355 j0 := s0.AuxInt 33356 x0 := s0.Args[0] 33357 if x0.Op != OpS390XMOVBZloadidx { 33358 break 33359 } 33360 i0 := x0.AuxInt 33361 if x0.Aux != s { 33362 break 33363 } 33364 _ = x0.Args[2] 33365 if idx != x0.Args[0] { 33366 break 33367 } 33368 if p != x0.Args[1] { 33369 break 33370 } 33371 if mem != x0.Args[2] { 33372 break 33373 } 33374 y := or.Args[1] 33375 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)) { 33376 break 33377 } 33378 b = mergePoint(b, x0, x1) 33379 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33380 v.reset(OpCopy) 33381 v.AddArg(v0) 33382 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33383 v1.AuxInt = j0 33384 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33385 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33386 v3.AuxInt = i0 33387 v3.Aux = s 33388 v3.AddArg(p) 33389 v3.AddArg(idx) 33390 v3.AddArg(mem) 33391 v2.AddArg(v3) 33392 v1.AddArg(v2) 33393 v0.AddArg(v1) 33394 v0.AddArg(y) 33395 return true 33396 } 33397 return false 33398 } 33399 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 33400 b := v.Block 33401 _ = b 33402 typ := &b.Func.Config.Types 33403 _ = typ 33404 // 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)) 33405 // 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) 33406 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33407 for { 33408 _ = v.Args[1] 33409 s1 := v.Args[0] 33410 if s1.Op != OpS390XSLWconst { 33411 break 33412 } 33413 j1 := s1.AuxInt 33414 x1 := s1.Args[0] 33415 if x1.Op != OpS390XMOVBZloadidx { 33416 break 33417 } 33418 i1 := x1.AuxInt 33419 s := x1.Aux 33420 _ = x1.Args[2] 33421 idx := x1.Args[0] 33422 p := x1.Args[1] 33423 mem := x1.Args[2] 33424 or := v.Args[1] 33425 if or.Op != OpS390XORW { 33426 break 33427 } 33428 _ = or.Args[1] 33429 s0 := or.Args[0] 33430 if s0.Op != OpS390XSLWconst { 33431 break 33432 } 33433 j0 := s0.AuxInt 33434 x0 := s0.Args[0] 33435 if x0.Op != OpS390XMOVBZloadidx { 33436 break 33437 } 33438 i0 := x0.AuxInt 33439 if x0.Aux != s { 33440 break 33441 } 33442 _ = x0.Args[2] 33443 if idx != x0.Args[0] { 33444 break 33445 } 33446 if p != x0.Args[1] { 33447 break 33448 } 33449 if mem != x0.Args[2] { 33450 break 33451 } 33452 y := or.Args[1] 33453 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)) { 33454 break 33455 } 33456 b = mergePoint(b, x0, x1) 33457 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33458 v.reset(OpCopy) 33459 v.AddArg(v0) 33460 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33461 v1.AuxInt = j0 33462 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33463 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33464 v3.AuxInt = i0 33465 v3.Aux = s 33466 v3.AddArg(p) 33467 v3.AddArg(idx) 33468 v3.AddArg(mem) 33469 v2.AddArg(v3) 33470 v1.AddArg(v2) 33471 v0.AddArg(v1) 33472 v0.AddArg(y) 33473 return true 33474 } 33475 // 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)))) 33476 // 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) 33477 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33478 for { 33479 _ = v.Args[1] 33480 s1 := v.Args[0] 33481 if s1.Op != OpS390XSLWconst { 33482 break 33483 } 33484 j1 := s1.AuxInt 33485 x1 := s1.Args[0] 33486 if x1.Op != OpS390XMOVBZloadidx { 33487 break 33488 } 33489 i1 := x1.AuxInt 33490 s := x1.Aux 33491 _ = x1.Args[2] 33492 p := x1.Args[0] 33493 idx := x1.Args[1] 33494 mem := x1.Args[2] 33495 or := v.Args[1] 33496 if or.Op != OpS390XORW { 33497 break 33498 } 33499 _ = or.Args[1] 33500 y := or.Args[0] 33501 s0 := or.Args[1] 33502 if s0.Op != OpS390XSLWconst { 33503 break 33504 } 33505 j0 := s0.AuxInt 33506 x0 := s0.Args[0] 33507 if x0.Op != OpS390XMOVBZloadidx { 33508 break 33509 } 33510 i0 := x0.AuxInt 33511 if x0.Aux != s { 33512 break 33513 } 33514 _ = x0.Args[2] 33515 if p != x0.Args[0] { 33516 break 33517 } 33518 if idx != x0.Args[1] { 33519 break 33520 } 33521 if mem != x0.Args[2] { 33522 break 33523 } 33524 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)) { 33525 break 33526 } 33527 b = mergePoint(b, x0, x1) 33528 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33529 v.reset(OpCopy) 33530 v.AddArg(v0) 33531 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33532 v1.AuxInt = j0 33533 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33534 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33535 v3.AuxInt = i0 33536 v3.Aux = s 33537 v3.AddArg(p) 33538 v3.AddArg(idx) 33539 v3.AddArg(mem) 33540 v2.AddArg(v3) 33541 v1.AddArg(v2) 33542 v0.AddArg(v1) 33543 v0.AddArg(y) 33544 return true 33545 } 33546 // 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)))) 33547 // 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) 33548 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33549 for { 33550 _ = v.Args[1] 33551 s1 := v.Args[0] 33552 if s1.Op != OpS390XSLWconst { 33553 break 33554 } 33555 j1 := s1.AuxInt 33556 x1 := s1.Args[0] 33557 if x1.Op != OpS390XMOVBZloadidx { 33558 break 33559 } 33560 i1 := x1.AuxInt 33561 s := x1.Aux 33562 _ = x1.Args[2] 33563 idx := x1.Args[0] 33564 p := x1.Args[1] 33565 mem := x1.Args[2] 33566 or := v.Args[1] 33567 if or.Op != OpS390XORW { 33568 break 33569 } 33570 _ = or.Args[1] 33571 y := or.Args[0] 33572 s0 := or.Args[1] 33573 if s0.Op != OpS390XSLWconst { 33574 break 33575 } 33576 j0 := s0.AuxInt 33577 x0 := s0.Args[0] 33578 if x0.Op != OpS390XMOVBZloadidx { 33579 break 33580 } 33581 i0 := x0.AuxInt 33582 if x0.Aux != s { 33583 break 33584 } 33585 _ = x0.Args[2] 33586 if p != x0.Args[0] { 33587 break 33588 } 33589 if idx != x0.Args[1] { 33590 break 33591 } 33592 if mem != x0.Args[2] { 33593 break 33594 } 33595 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)) { 33596 break 33597 } 33598 b = mergePoint(b, x0, x1) 33599 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33600 v.reset(OpCopy) 33601 v.AddArg(v0) 33602 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33603 v1.AuxInt = j0 33604 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33605 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33606 v3.AuxInt = i0 33607 v3.Aux = s 33608 v3.AddArg(p) 33609 v3.AddArg(idx) 33610 v3.AddArg(mem) 33611 v2.AddArg(v3) 33612 v1.AddArg(v2) 33613 v0.AddArg(v1) 33614 v0.AddArg(y) 33615 return true 33616 } 33617 // 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)))) 33618 // 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) 33619 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33620 for { 33621 _ = v.Args[1] 33622 s1 := v.Args[0] 33623 if s1.Op != OpS390XSLWconst { 33624 break 33625 } 33626 j1 := s1.AuxInt 33627 x1 := s1.Args[0] 33628 if x1.Op != OpS390XMOVBZloadidx { 33629 break 33630 } 33631 i1 := x1.AuxInt 33632 s := x1.Aux 33633 _ = x1.Args[2] 33634 p := x1.Args[0] 33635 idx := x1.Args[1] 33636 mem := x1.Args[2] 33637 or := v.Args[1] 33638 if or.Op != OpS390XORW { 33639 break 33640 } 33641 _ = or.Args[1] 33642 y := or.Args[0] 33643 s0 := or.Args[1] 33644 if s0.Op != OpS390XSLWconst { 33645 break 33646 } 33647 j0 := s0.AuxInt 33648 x0 := s0.Args[0] 33649 if x0.Op != OpS390XMOVBZloadidx { 33650 break 33651 } 33652 i0 := x0.AuxInt 33653 if x0.Aux != s { 33654 break 33655 } 33656 _ = x0.Args[2] 33657 if idx != x0.Args[0] { 33658 break 33659 } 33660 if p != x0.Args[1] { 33661 break 33662 } 33663 if mem != x0.Args[2] { 33664 break 33665 } 33666 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)) { 33667 break 33668 } 33669 b = mergePoint(b, x0, x1) 33670 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33671 v.reset(OpCopy) 33672 v.AddArg(v0) 33673 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33674 v1.AuxInt = j0 33675 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33676 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33677 v3.AuxInt = i0 33678 v3.Aux = s 33679 v3.AddArg(p) 33680 v3.AddArg(idx) 33681 v3.AddArg(mem) 33682 v2.AddArg(v3) 33683 v1.AddArg(v2) 33684 v0.AddArg(v1) 33685 v0.AddArg(y) 33686 return true 33687 } 33688 // 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)))) 33689 // 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) 33690 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33691 for { 33692 _ = v.Args[1] 33693 s1 := v.Args[0] 33694 if s1.Op != OpS390XSLWconst { 33695 break 33696 } 33697 j1 := s1.AuxInt 33698 x1 := s1.Args[0] 33699 if x1.Op != OpS390XMOVBZloadidx { 33700 break 33701 } 33702 i1 := x1.AuxInt 33703 s := x1.Aux 33704 _ = x1.Args[2] 33705 idx := x1.Args[0] 33706 p := x1.Args[1] 33707 mem := x1.Args[2] 33708 or := v.Args[1] 33709 if or.Op != OpS390XORW { 33710 break 33711 } 33712 _ = or.Args[1] 33713 y := or.Args[0] 33714 s0 := or.Args[1] 33715 if s0.Op != OpS390XSLWconst { 33716 break 33717 } 33718 j0 := s0.AuxInt 33719 x0 := s0.Args[0] 33720 if x0.Op != OpS390XMOVBZloadidx { 33721 break 33722 } 33723 i0 := x0.AuxInt 33724 if x0.Aux != s { 33725 break 33726 } 33727 _ = x0.Args[2] 33728 if idx != x0.Args[0] { 33729 break 33730 } 33731 if p != x0.Args[1] { 33732 break 33733 } 33734 if mem != x0.Args[2] { 33735 break 33736 } 33737 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)) { 33738 break 33739 } 33740 b = mergePoint(b, x0, x1) 33741 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33742 v.reset(OpCopy) 33743 v.AddArg(v0) 33744 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33745 v1.AuxInt = j0 33746 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33747 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33748 v3.AuxInt = i0 33749 v3.Aux = s 33750 v3.AddArg(p) 33751 v3.AddArg(idx) 33752 v3.AddArg(mem) 33753 v2.AddArg(v3) 33754 v1.AddArg(v2) 33755 v0.AddArg(v1) 33756 v0.AddArg(y) 33757 return true 33758 } 33759 // 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))) 33760 // 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) 33761 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33762 for { 33763 _ = v.Args[1] 33764 or := v.Args[0] 33765 if or.Op != OpS390XORW { 33766 break 33767 } 33768 _ = or.Args[1] 33769 s0 := or.Args[0] 33770 if s0.Op != OpS390XSLWconst { 33771 break 33772 } 33773 j0 := s0.AuxInt 33774 x0 := s0.Args[0] 33775 if x0.Op != OpS390XMOVBZloadidx { 33776 break 33777 } 33778 i0 := x0.AuxInt 33779 s := x0.Aux 33780 _ = x0.Args[2] 33781 p := x0.Args[0] 33782 idx := x0.Args[1] 33783 mem := x0.Args[2] 33784 y := or.Args[1] 33785 s1 := v.Args[1] 33786 if s1.Op != OpS390XSLWconst { 33787 break 33788 } 33789 j1 := s1.AuxInt 33790 x1 := s1.Args[0] 33791 if x1.Op != OpS390XMOVBZloadidx { 33792 break 33793 } 33794 i1 := x1.AuxInt 33795 if x1.Aux != s { 33796 break 33797 } 33798 _ = x1.Args[2] 33799 if p != x1.Args[0] { 33800 break 33801 } 33802 if idx != x1.Args[1] { 33803 break 33804 } 33805 if mem != x1.Args[2] { 33806 break 33807 } 33808 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)) { 33809 break 33810 } 33811 b = mergePoint(b, x0, x1) 33812 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33813 v.reset(OpCopy) 33814 v.AddArg(v0) 33815 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33816 v1.AuxInt = j0 33817 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33818 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33819 v3.AuxInt = i0 33820 v3.Aux = s 33821 v3.AddArg(p) 33822 v3.AddArg(idx) 33823 v3.AddArg(mem) 33824 v2.AddArg(v3) 33825 v1.AddArg(v2) 33826 v0.AddArg(v1) 33827 v0.AddArg(y) 33828 return true 33829 } 33830 // 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))) 33831 // 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) 33832 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33833 for { 33834 _ = v.Args[1] 33835 or := v.Args[0] 33836 if or.Op != OpS390XORW { 33837 break 33838 } 33839 _ = or.Args[1] 33840 s0 := or.Args[0] 33841 if s0.Op != OpS390XSLWconst { 33842 break 33843 } 33844 j0 := s0.AuxInt 33845 x0 := s0.Args[0] 33846 if x0.Op != OpS390XMOVBZloadidx { 33847 break 33848 } 33849 i0 := x0.AuxInt 33850 s := x0.Aux 33851 _ = x0.Args[2] 33852 idx := x0.Args[0] 33853 p := x0.Args[1] 33854 mem := x0.Args[2] 33855 y := or.Args[1] 33856 s1 := v.Args[1] 33857 if s1.Op != OpS390XSLWconst { 33858 break 33859 } 33860 j1 := s1.AuxInt 33861 x1 := s1.Args[0] 33862 if x1.Op != OpS390XMOVBZloadidx { 33863 break 33864 } 33865 i1 := x1.AuxInt 33866 if x1.Aux != s { 33867 break 33868 } 33869 _ = x1.Args[2] 33870 if p != x1.Args[0] { 33871 break 33872 } 33873 if idx != x1.Args[1] { 33874 break 33875 } 33876 if mem != x1.Args[2] { 33877 break 33878 } 33879 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)) { 33880 break 33881 } 33882 b = mergePoint(b, x0, x1) 33883 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33884 v.reset(OpCopy) 33885 v.AddArg(v0) 33886 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33887 v1.AuxInt = j0 33888 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33889 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33890 v3.AuxInt = i0 33891 v3.Aux = s 33892 v3.AddArg(p) 33893 v3.AddArg(idx) 33894 v3.AddArg(mem) 33895 v2.AddArg(v3) 33896 v1.AddArg(v2) 33897 v0.AddArg(v1) 33898 v0.AddArg(y) 33899 return true 33900 } 33901 // 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))) 33902 // 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) 33903 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33904 for { 33905 _ = v.Args[1] 33906 or := v.Args[0] 33907 if or.Op != OpS390XORW { 33908 break 33909 } 33910 _ = or.Args[1] 33911 y := or.Args[0] 33912 s0 := or.Args[1] 33913 if s0.Op != OpS390XSLWconst { 33914 break 33915 } 33916 j0 := s0.AuxInt 33917 x0 := s0.Args[0] 33918 if x0.Op != OpS390XMOVBZloadidx { 33919 break 33920 } 33921 i0 := x0.AuxInt 33922 s := x0.Aux 33923 _ = x0.Args[2] 33924 p := x0.Args[0] 33925 idx := x0.Args[1] 33926 mem := x0.Args[2] 33927 s1 := v.Args[1] 33928 if s1.Op != OpS390XSLWconst { 33929 break 33930 } 33931 j1 := s1.AuxInt 33932 x1 := s1.Args[0] 33933 if x1.Op != OpS390XMOVBZloadidx { 33934 break 33935 } 33936 i1 := x1.AuxInt 33937 if x1.Aux != s { 33938 break 33939 } 33940 _ = x1.Args[2] 33941 if p != x1.Args[0] { 33942 break 33943 } 33944 if idx != x1.Args[1] { 33945 break 33946 } 33947 if mem != x1.Args[2] { 33948 break 33949 } 33950 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)) { 33951 break 33952 } 33953 b = mergePoint(b, x0, x1) 33954 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33955 v.reset(OpCopy) 33956 v.AddArg(v0) 33957 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33958 v1.AuxInt = j0 33959 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33960 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33961 v3.AuxInt = i0 33962 v3.Aux = s 33963 v3.AddArg(p) 33964 v3.AddArg(idx) 33965 v3.AddArg(mem) 33966 v2.AddArg(v3) 33967 v1.AddArg(v2) 33968 v0.AddArg(v1) 33969 v0.AddArg(y) 33970 return true 33971 } 33972 // 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))) 33973 // 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) 33974 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33975 for { 33976 _ = v.Args[1] 33977 or := v.Args[0] 33978 if or.Op != OpS390XORW { 33979 break 33980 } 33981 _ = or.Args[1] 33982 y := or.Args[0] 33983 s0 := or.Args[1] 33984 if s0.Op != OpS390XSLWconst { 33985 break 33986 } 33987 j0 := s0.AuxInt 33988 x0 := s0.Args[0] 33989 if x0.Op != OpS390XMOVBZloadidx { 33990 break 33991 } 33992 i0 := x0.AuxInt 33993 s := x0.Aux 33994 _ = x0.Args[2] 33995 idx := x0.Args[0] 33996 p := x0.Args[1] 33997 mem := x0.Args[2] 33998 s1 := v.Args[1] 33999 if s1.Op != OpS390XSLWconst { 34000 break 34001 } 34002 j1 := s1.AuxInt 34003 x1 := s1.Args[0] 34004 if x1.Op != OpS390XMOVBZloadidx { 34005 break 34006 } 34007 i1 := x1.AuxInt 34008 if x1.Aux != s { 34009 break 34010 } 34011 _ = x1.Args[2] 34012 if p != x1.Args[0] { 34013 break 34014 } 34015 if idx != x1.Args[1] { 34016 break 34017 } 34018 if mem != x1.Args[2] { 34019 break 34020 } 34021 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)) { 34022 break 34023 } 34024 b = mergePoint(b, x0, x1) 34025 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34026 v.reset(OpCopy) 34027 v.AddArg(v0) 34028 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34029 v1.AuxInt = j0 34030 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34031 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34032 v3.AuxInt = i0 34033 v3.Aux = s 34034 v3.AddArg(p) 34035 v3.AddArg(idx) 34036 v3.AddArg(mem) 34037 v2.AddArg(v3) 34038 v1.AddArg(v2) 34039 v0.AddArg(v1) 34040 v0.AddArg(y) 34041 return true 34042 } 34043 // 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))) 34044 // 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) 34045 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34046 for { 34047 _ = v.Args[1] 34048 or := v.Args[0] 34049 if or.Op != OpS390XORW { 34050 break 34051 } 34052 _ = or.Args[1] 34053 s0 := or.Args[0] 34054 if s0.Op != OpS390XSLWconst { 34055 break 34056 } 34057 j0 := s0.AuxInt 34058 x0 := s0.Args[0] 34059 if x0.Op != OpS390XMOVBZloadidx { 34060 break 34061 } 34062 i0 := x0.AuxInt 34063 s := x0.Aux 34064 _ = x0.Args[2] 34065 p := x0.Args[0] 34066 idx := x0.Args[1] 34067 mem := x0.Args[2] 34068 y := or.Args[1] 34069 s1 := v.Args[1] 34070 if s1.Op != OpS390XSLWconst { 34071 break 34072 } 34073 j1 := s1.AuxInt 34074 x1 := s1.Args[0] 34075 if x1.Op != OpS390XMOVBZloadidx { 34076 break 34077 } 34078 i1 := x1.AuxInt 34079 if x1.Aux != s { 34080 break 34081 } 34082 _ = x1.Args[2] 34083 if idx != x1.Args[0] { 34084 break 34085 } 34086 if p != x1.Args[1] { 34087 break 34088 } 34089 if mem != x1.Args[2] { 34090 break 34091 } 34092 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)) { 34093 break 34094 } 34095 b = mergePoint(b, x0, x1) 34096 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34097 v.reset(OpCopy) 34098 v.AddArg(v0) 34099 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34100 v1.AuxInt = j0 34101 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34102 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34103 v3.AuxInt = i0 34104 v3.Aux = s 34105 v3.AddArg(p) 34106 v3.AddArg(idx) 34107 v3.AddArg(mem) 34108 v2.AddArg(v3) 34109 v1.AddArg(v2) 34110 v0.AddArg(v1) 34111 v0.AddArg(y) 34112 return true 34113 } 34114 return false 34115 } 34116 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 34117 b := v.Block 34118 _ = b 34119 typ := &b.Func.Config.Types 34120 _ = typ 34121 // 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))) 34122 // 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) 34123 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34124 for { 34125 _ = v.Args[1] 34126 or := v.Args[0] 34127 if or.Op != OpS390XORW { 34128 break 34129 } 34130 _ = or.Args[1] 34131 s0 := or.Args[0] 34132 if s0.Op != OpS390XSLWconst { 34133 break 34134 } 34135 j0 := s0.AuxInt 34136 x0 := s0.Args[0] 34137 if x0.Op != OpS390XMOVBZloadidx { 34138 break 34139 } 34140 i0 := x0.AuxInt 34141 s := x0.Aux 34142 _ = x0.Args[2] 34143 idx := x0.Args[0] 34144 p := x0.Args[1] 34145 mem := x0.Args[2] 34146 y := or.Args[1] 34147 s1 := v.Args[1] 34148 if s1.Op != OpS390XSLWconst { 34149 break 34150 } 34151 j1 := s1.AuxInt 34152 x1 := s1.Args[0] 34153 if x1.Op != OpS390XMOVBZloadidx { 34154 break 34155 } 34156 i1 := x1.AuxInt 34157 if x1.Aux != s { 34158 break 34159 } 34160 _ = x1.Args[2] 34161 if idx != x1.Args[0] { 34162 break 34163 } 34164 if p != x1.Args[1] { 34165 break 34166 } 34167 if mem != x1.Args[2] { 34168 break 34169 } 34170 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)) { 34171 break 34172 } 34173 b = mergePoint(b, x0, x1) 34174 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34175 v.reset(OpCopy) 34176 v.AddArg(v0) 34177 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34178 v1.AuxInt = j0 34179 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34180 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34181 v3.AuxInt = i0 34182 v3.Aux = s 34183 v3.AddArg(p) 34184 v3.AddArg(idx) 34185 v3.AddArg(mem) 34186 v2.AddArg(v3) 34187 v1.AddArg(v2) 34188 v0.AddArg(v1) 34189 v0.AddArg(y) 34190 return true 34191 } 34192 // 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))) 34193 // 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) 34194 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34195 for { 34196 _ = v.Args[1] 34197 or := v.Args[0] 34198 if or.Op != OpS390XORW { 34199 break 34200 } 34201 _ = or.Args[1] 34202 y := or.Args[0] 34203 s0 := or.Args[1] 34204 if s0.Op != OpS390XSLWconst { 34205 break 34206 } 34207 j0 := s0.AuxInt 34208 x0 := s0.Args[0] 34209 if x0.Op != OpS390XMOVBZloadidx { 34210 break 34211 } 34212 i0 := x0.AuxInt 34213 s := x0.Aux 34214 _ = x0.Args[2] 34215 p := x0.Args[0] 34216 idx := x0.Args[1] 34217 mem := x0.Args[2] 34218 s1 := v.Args[1] 34219 if s1.Op != OpS390XSLWconst { 34220 break 34221 } 34222 j1 := s1.AuxInt 34223 x1 := s1.Args[0] 34224 if x1.Op != OpS390XMOVBZloadidx { 34225 break 34226 } 34227 i1 := x1.AuxInt 34228 if x1.Aux != s { 34229 break 34230 } 34231 _ = x1.Args[2] 34232 if idx != x1.Args[0] { 34233 break 34234 } 34235 if p != x1.Args[1] { 34236 break 34237 } 34238 if mem != x1.Args[2] { 34239 break 34240 } 34241 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 34242 break 34243 } 34244 b = mergePoint(b, x0, x1) 34245 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34246 v.reset(OpCopy) 34247 v.AddArg(v0) 34248 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34249 v1.AuxInt = j0 34250 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34251 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34252 v3.AuxInt = i0 34253 v3.Aux = s 34254 v3.AddArg(p) 34255 v3.AddArg(idx) 34256 v3.AddArg(mem) 34257 v2.AddArg(v3) 34258 v1.AddArg(v2) 34259 v0.AddArg(v1) 34260 v0.AddArg(y) 34261 return true 34262 } 34263 // 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))) 34264 // 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) 34265 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34266 for { 34267 _ = v.Args[1] 34268 or := v.Args[0] 34269 if or.Op != OpS390XORW { 34270 break 34271 } 34272 _ = or.Args[1] 34273 y := or.Args[0] 34274 s0 := or.Args[1] 34275 if s0.Op != OpS390XSLWconst { 34276 break 34277 } 34278 j0 := s0.AuxInt 34279 x0 := s0.Args[0] 34280 if x0.Op != OpS390XMOVBZloadidx { 34281 break 34282 } 34283 i0 := x0.AuxInt 34284 s := x0.Aux 34285 _ = x0.Args[2] 34286 idx := x0.Args[0] 34287 p := x0.Args[1] 34288 mem := x0.Args[2] 34289 s1 := v.Args[1] 34290 if s1.Op != OpS390XSLWconst { 34291 break 34292 } 34293 j1 := s1.AuxInt 34294 x1 := s1.Args[0] 34295 if x1.Op != OpS390XMOVBZloadidx { 34296 break 34297 } 34298 i1 := x1.AuxInt 34299 if x1.Aux != s { 34300 break 34301 } 34302 _ = x1.Args[2] 34303 if idx != x1.Args[0] { 34304 break 34305 } 34306 if p != x1.Args[1] { 34307 break 34308 } 34309 if mem != x1.Args[2] { 34310 break 34311 } 34312 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)) { 34313 break 34314 } 34315 b = mergePoint(b, x0, x1) 34316 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34317 v.reset(OpCopy) 34318 v.AddArg(v0) 34319 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34320 v1.AuxInt = j0 34321 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34322 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34323 v3.AuxInt = i0 34324 v3.Aux = s 34325 v3.AddArg(p) 34326 v3.AddArg(idx) 34327 v3.AddArg(mem) 34328 v2.AddArg(v3) 34329 v1.AddArg(v2) 34330 v0.AddArg(v1) 34331 v0.AddArg(y) 34332 return true 34333 } 34334 return false 34335 } 34336 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 34337 // match: (ORWconst [c] x) 34338 // cond: int32(c)==0 34339 // result: x 34340 for { 34341 c := v.AuxInt 34342 x := v.Args[0] 34343 if !(int32(c) == 0) { 34344 break 34345 } 34346 v.reset(OpCopy) 34347 v.Type = x.Type 34348 v.AddArg(x) 34349 return true 34350 } 34351 // match: (ORWconst [c] _) 34352 // cond: int32(c)==-1 34353 // result: (MOVDconst [-1]) 34354 for { 34355 c := v.AuxInt 34356 if !(int32(c) == -1) { 34357 break 34358 } 34359 v.reset(OpS390XMOVDconst) 34360 v.AuxInt = -1 34361 return true 34362 } 34363 // match: (ORWconst [c] (MOVDconst [d])) 34364 // cond: 34365 // result: (MOVDconst [c|d]) 34366 for { 34367 c := v.AuxInt 34368 v_0 := v.Args[0] 34369 if v_0.Op != OpS390XMOVDconst { 34370 break 34371 } 34372 d := v_0.AuxInt 34373 v.reset(OpS390XMOVDconst) 34374 v.AuxInt = c | d 34375 return true 34376 } 34377 return false 34378 } 34379 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 34380 // match: (ORconst [0] x) 34381 // cond: 34382 // result: x 34383 for { 34384 if v.AuxInt != 0 { 34385 break 34386 } 34387 x := v.Args[0] 34388 v.reset(OpCopy) 34389 v.Type = x.Type 34390 v.AddArg(x) 34391 return true 34392 } 34393 // match: (ORconst [-1] _) 34394 // cond: 34395 // result: (MOVDconst [-1]) 34396 for { 34397 if v.AuxInt != -1 { 34398 break 34399 } 34400 v.reset(OpS390XMOVDconst) 34401 v.AuxInt = -1 34402 return true 34403 } 34404 // match: (ORconst [c] (MOVDconst [d])) 34405 // cond: 34406 // result: (MOVDconst [c|d]) 34407 for { 34408 c := v.AuxInt 34409 v_0 := v.Args[0] 34410 if v_0.Op != OpS390XMOVDconst { 34411 break 34412 } 34413 d := v_0.AuxInt 34414 v.reset(OpS390XMOVDconst) 34415 v.AuxInt = c | d 34416 return true 34417 } 34418 return false 34419 } 34420 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 34421 // match: (SLD x (MOVDconst [c])) 34422 // cond: 34423 // result: (SLDconst [c&63] x) 34424 for { 34425 _ = v.Args[1] 34426 x := v.Args[0] 34427 v_1 := v.Args[1] 34428 if v_1.Op != OpS390XMOVDconst { 34429 break 34430 } 34431 c := v_1.AuxInt 34432 v.reset(OpS390XSLDconst) 34433 v.AuxInt = c & 63 34434 v.AddArg(x) 34435 return true 34436 } 34437 // match: (SLD x (ANDconst [63] y)) 34438 // cond: 34439 // result: (SLD x y) 34440 for { 34441 _ = v.Args[1] 34442 x := v.Args[0] 34443 v_1 := v.Args[1] 34444 if v_1.Op != OpS390XANDconst { 34445 break 34446 } 34447 if v_1.AuxInt != 63 { 34448 break 34449 } 34450 y := v_1.Args[0] 34451 v.reset(OpS390XSLD) 34452 v.AddArg(x) 34453 v.AddArg(y) 34454 return true 34455 } 34456 return false 34457 } 34458 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 34459 // match: (SLW x (MOVDconst [c])) 34460 // cond: 34461 // result: (SLWconst [c&63] x) 34462 for { 34463 _ = v.Args[1] 34464 x := v.Args[0] 34465 v_1 := v.Args[1] 34466 if v_1.Op != OpS390XMOVDconst { 34467 break 34468 } 34469 c := v_1.AuxInt 34470 v.reset(OpS390XSLWconst) 34471 v.AuxInt = c & 63 34472 v.AddArg(x) 34473 return true 34474 } 34475 // match: (SLW x (ANDWconst [63] y)) 34476 // cond: 34477 // result: (SLW x y) 34478 for { 34479 _ = v.Args[1] 34480 x := v.Args[0] 34481 v_1 := v.Args[1] 34482 if v_1.Op != OpS390XANDWconst { 34483 break 34484 } 34485 if v_1.AuxInt != 63 { 34486 break 34487 } 34488 y := v_1.Args[0] 34489 v.reset(OpS390XSLW) 34490 v.AddArg(x) 34491 v.AddArg(y) 34492 return true 34493 } 34494 return false 34495 } 34496 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 34497 // match: (SRAD x (MOVDconst [c])) 34498 // cond: 34499 // result: (SRADconst [c&63] x) 34500 for { 34501 _ = v.Args[1] 34502 x := v.Args[0] 34503 v_1 := v.Args[1] 34504 if v_1.Op != OpS390XMOVDconst { 34505 break 34506 } 34507 c := v_1.AuxInt 34508 v.reset(OpS390XSRADconst) 34509 v.AuxInt = c & 63 34510 v.AddArg(x) 34511 return true 34512 } 34513 // match: (SRAD x (ANDconst [63] y)) 34514 // cond: 34515 // result: (SRAD x y) 34516 for { 34517 _ = v.Args[1] 34518 x := v.Args[0] 34519 v_1 := v.Args[1] 34520 if v_1.Op != OpS390XANDconst { 34521 break 34522 } 34523 if v_1.AuxInt != 63 { 34524 break 34525 } 34526 y := v_1.Args[0] 34527 v.reset(OpS390XSRAD) 34528 v.AddArg(x) 34529 v.AddArg(y) 34530 return true 34531 } 34532 return false 34533 } 34534 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 34535 // match: (SRADconst [c] (MOVDconst [d])) 34536 // cond: 34537 // result: (MOVDconst [d>>uint64(c)]) 34538 for { 34539 c := v.AuxInt 34540 v_0 := v.Args[0] 34541 if v_0.Op != OpS390XMOVDconst { 34542 break 34543 } 34544 d := v_0.AuxInt 34545 v.reset(OpS390XMOVDconst) 34546 v.AuxInt = d >> uint64(c) 34547 return true 34548 } 34549 return false 34550 } 34551 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 34552 // match: (SRAW x (MOVDconst [c])) 34553 // cond: 34554 // result: (SRAWconst [c&63] x) 34555 for { 34556 _ = v.Args[1] 34557 x := v.Args[0] 34558 v_1 := v.Args[1] 34559 if v_1.Op != OpS390XMOVDconst { 34560 break 34561 } 34562 c := v_1.AuxInt 34563 v.reset(OpS390XSRAWconst) 34564 v.AuxInt = c & 63 34565 v.AddArg(x) 34566 return true 34567 } 34568 // match: (SRAW x (ANDWconst [63] y)) 34569 // cond: 34570 // result: (SRAW x y) 34571 for { 34572 _ = v.Args[1] 34573 x := v.Args[0] 34574 v_1 := v.Args[1] 34575 if v_1.Op != OpS390XANDWconst { 34576 break 34577 } 34578 if v_1.AuxInt != 63 { 34579 break 34580 } 34581 y := v_1.Args[0] 34582 v.reset(OpS390XSRAW) 34583 v.AddArg(x) 34584 v.AddArg(y) 34585 return true 34586 } 34587 return false 34588 } 34589 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 34590 // match: (SRAWconst [c] (MOVDconst [d])) 34591 // cond: 34592 // result: (MOVDconst [d>>uint64(c)]) 34593 for { 34594 c := v.AuxInt 34595 v_0 := v.Args[0] 34596 if v_0.Op != OpS390XMOVDconst { 34597 break 34598 } 34599 d := v_0.AuxInt 34600 v.reset(OpS390XMOVDconst) 34601 v.AuxInt = d >> uint64(c) 34602 return true 34603 } 34604 return false 34605 } 34606 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 34607 // match: (SRD x (MOVDconst [c])) 34608 // cond: 34609 // result: (SRDconst [c&63] x) 34610 for { 34611 _ = v.Args[1] 34612 x := v.Args[0] 34613 v_1 := v.Args[1] 34614 if v_1.Op != OpS390XMOVDconst { 34615 break 34616 } 34617 c := v_1.AuxInt 34618 v.reset(OpS390XSRDconst) 34619 v.AuxInt = c & 63 34620 v.AddArg(x) 34621 return true 34622 } 34623 // match: (SRD x (ANDconst [63] y)) 34624 // cond: 34625 // result: (SRD x y) 34626 for { 34627 _ = v.Args[1] 34628 x := v.Args[0] 34629 v_1 := v.Args[1] 34630 if v_1.Op != OpS390XANDconst { 34631 break 34632 } 34633 if v_1.AuxInt != 63 { 34634 break 34635 } 34636 y := v_1.Args[0] 34637 v.reset(OpS390XSRD) 34638 v.AddArg(x) 34639 v.AddArg(y) 34640 return true 34641 } 34642 return false 34643 } 34644 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 34645 // match: (SRW x (MOVDconst [c])) 34646 // cond: 34647 // result: (SRWconst [c&63] x) 34648 for { 34649 _ = v.Args[1] 34650 x := v.Args[0] 34651 v_1 := v.Args[1] 34652 if v_1.Op != OpS390XMOVDconst { 34653 break 34654 } 34655 c := v_1.AuxInt 34656 v.reset(OpS390XSRWconst) 34657 v.AuxInt = c & 63 34658 v.AddArg(x) 34659 return true 34660 } 34661 // match: (SRW x (ANDWconst [63] y)) 34662 // cond: 34663 // result: (SRW x y) 34664 for { 34665 _ = v.Args[1] 34666 x := v.Args[0] 34667 v_1 := v.Args[1] 34668 if v_1.Op != OpS390XANDWconst { 34669 break 34670 } 34671 if v_1.AuxInt != 63 { 34672 break 34673 } 34674 y := v_1.Args[0] 34675 v.reset(OpS390XSRW) 34676 v.AddArg(x) 34677 v.AddArg(y) 34678 return true 34679 } 34680 return false 34681 } 34682 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 34683 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 34684 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 34685 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 34686 for { 34687 i := v.AuxInt 34688 s := v.Aux 34689 _ = v.Args[3] 34690 p := v.Args[0] 34691 w2 := v.Args[1] 34692 w3 := v.Args[2] 34693 x := v.Args[3] 34694 if x.Op != OpS390XSTM2 { 34695 break 34696 } 34697 if x.AuxInt != i-8 { 34698 break 34699 } 34700 if x.Aux != s { 34701 break 34702 } 34703 _ = x.Args[3] 34704 if p != x.Args[0] { 34705 break 34706 } 34707 w0 := x.Args[1] 34708 w1 := x.Args[2] 34709 mem := x.Args[3] 34710 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 34711 break 34712 } 34713 v.reset(OpS390XSTM4) 34714 v.AuxInt = i - 8 34715 v.Aux = s 34716 v.AddArg(p) 34717 v.AddArg(w0) 34718 v.AddArg(w1) 34719 v.AddArg(w2) 34720 v.AddArg(w3) 34721 v.AddArg(mem) 34722 return true 34723 } 34724 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 34725 // cond: 34726 // result: (MOVDstore [i] {s} p x mem) 34727 for { 34728 i := v.AuxInt 34729 s := v.Aux 34730 _ = v.Args[3] 34731 p := v.Args[0] 34732 v_1 := v.Args[1] 34733 if v_1.Op != OpS390XSRDconst { 34734 break 34735 } 34736 if v_1.AuxInt != 32 { 34737 break 34738 } 34739 x := v_1.Args[0] 34740 if x != v.Args[2] { 34741 break 34742 } 34743 mem := v.Args[3] 34744 v.reset(OpS390XMOVDstore) 34745 v.AuxInt = i 34746 v.Aux = s 34747 v.AddArg(p) 34748 v.AddArg(x) 34749 v.AddArg(mem) 34750 return true 34751 } 34752 return false 34753 } 34754 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 34755 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 34756 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 34757 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 34758 for { 34759 i := v.AuxInt 34760 s := v.Aux 34761 _ = v.Args[3] 34762 p := v.Args[0] 34763 w2 := v.Args[1] 34764 w3 := v.Args[2] 34765 x := v.Args[3] 34766 if x.Op != OpS390XSTMG2 { 34767 break 34768 } 34769 if x.AuxInt != i-16 { 34770 break 34771 } 34772 if x.Aux != s { 34773 break 34774 } 34775 _ = x.Args[3] 34776 if p != x.Args[0] { 34777 break 34778 } 34779 w0 := x.Args[1] 34780 w1 := x.Args[2] 34781 mem := x.Args[3] 34782 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 34783 break 34784 } 34785 v.reset(OpS390XSTMG4) 34786 v.AuxInt = i - 16 34787 v.Aux = s 34788 v.AddArg(p) 34789 v.AddArg(w0) 34790 v.AddArg(w1) 34791 v.AddArg(w2) 34792 v.AddArg(w3) 34793 v.AddArg(mem) 34794 return true 34795 } 34796 return false 34797 } 34798 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 34799 b := v.Block 34800 _ = b 34801 // match: (SUB x (MOVDconst [c])) 34802 // cond: is32Bit(c) 34803 // result: (SUBconst x [c]) 34804 for { 34805 _ = v.Args[1] 34806 x := v.Args[0] 34807 v_1 := v.Args[1] 34808 if v_1.Op != OpS390XMOVDconst { 34809 break 34810 } 34811 c := v_1.AuxInt 34812 if !(is32Bit(c)) { 34813 break 34814 } 34815 v.reset(OpS390XSUBconst) 34816 v.AuxInt = c 34817 v.AddArg(x) 34818 return true 34819 } 34820 // match: (SUB (MOVDconst [c]) x) 34821 // cond: is32Bit(c) 34822 // result: (NEG (SUBconst <v.Type> x [c])) 34823 for { 34824 _ = v.Args[1] 34825 v_0 := v.Args[0] 34826 if v_0.Op != OpS390XMOVDconst { 34827 break 34828 } 34829 c := v_0.AuxInt 34830 x := v.Args[1] 34831 if !(is32Bit(c)) { 34832 break 34833 } 34834 v.reset(OpS390XNEG) 34835 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 34836 v0.AuxInt = c 34837 v0.AddArg(x) 34838 v.AddArg(v0) 34839 return true 34840 } 34841 // match: (SUB x x) 34842 // cond: 34843 // result: (MOVDconst [0]) 34844 for { 34845 _ = v.Args[1] 34846 x := v.Args[0] 34847 if x != v.Args[1] { 34848 break 34849 } 34850 v.reset(OpS390XMOVDconst) 34851 v.AuxInt = 0 34852 return true 34853 } 34854 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 34855 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34856 // result: (SUBload <t> [off] {sym} x ptr mem) 34857 for { 34858 t := v.Type 34859 _ = v.Args[1] 34860 x := v.Args[0] 34861 g := v.Args[1] 34862 if g.Op != OpS390XMOVDload { 34863 break 34864 } 34865 off := g.AuxInt 34866 sym := g.Aux 34867 _ = g.Args[1] 34868 ptr := g.Args[0] 34869 mem := g.Args[1] 34870 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34871 break 34872 } 34873 v.reset(OpS390XSUBload) 34874 v.Type = t 34875 v.AuxInt = off 34876 v.Aux = sym 34877 v.AddArg(x) 34878 v.AddArg(ptr) 34879 v.AddArg(mem) 34880 return true 34881 } 34882 return false 34883 } 34884 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool { 34885 // match: (SUBEWcarrymask (FlagEQ)) 34886 // cond: 34887 // result: (MOVDconst [-1]) 34888 for { 34889 v_0 := v.Args[0] 34890 if v_0.Op != OpS390XFlagEQ { 34891 break 34892 } 34893 v.reset(OpS390XMOVDconst) 34894 v.AuxInt = -1 34895 return true 34896 } 34897 // match: (SUBEWcarrymask (FlagLT)) 34898 // cond: 34899 // result: (MOVDconst [-1]) 34900 for { 34901 v_0 := v.Args[0] 34902 if v_0.Op != OpS390XFlagLT { 34903 break 34904 } 34905 v.reset(OpS390XMOVDconst) 34906 v.AuxInt = -1 34907 return true 34908 } 34909 // match: (SUBEWcarrymask (FlagGT)) 34910 // cond: 34911 // result: (MOVDconst [0]) 34912 for { 34913 v_0 := v.Args[0] 34914 if v_0.Op != OpS390XFlagGT { 34915 break 34916 } 34917 v.reset(OpS390XMOVDconst) 34918 v.AuxInt = 0 34919 return true 34920 } 34921 return false 34922 } 34923 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool { 34924 // match: (SUBEcarrymask (FlagEQ)) 34925 // cond: 34926 // result: (MOVDconst [-1]) 34927 for { 34928 v_0 := v.Args[0] 34929 if v_0.Op != OpS390XFlagEQ { 34930 break 34931 } 34932 v.reset(OpS390XMOVDconst) 34933 v.AuxInt = -1 34934 return true 34935 } 34936 // match: (SUBEcarrymask (FlagLT)) 34937 // cond: 34938 // result: (MOVDconst [-1]) 34939 for { 34940 v_0 := v.Args[0] 34941 if v_0.Op != OpS390XFlagLT { 34942 break 34943 } 34944 v.reset(OpS390XMOVDconst) 34945 v.AuxInt = -1 34946 return true 34947 } 34948 // match: (SUBEcarrymask (FlagGT)) 34949 // cond: 34950 // result: (MOVDconst [0]) 34951 for { 34952 v_0 := v.Args[0] 34953 if v_0.Op != OpS390XFlagGT { 34954 break 34955 } 34956 v.reset(OpS390XMOVDconst) 34957 v.AuxInt = 0 34958 return true 34959 } 34960 return false 34961 } 34962 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 34963 b := v.Block 34964 _ = b 34965 // match: (SUBW x (MOVDconst [c])) 34966 // cond: 34967 // result: (SUBWconst x [c]) 34968 for { 34969 _ = v.Args[1] 34970 x := v.Args[0] 34971 v_1 := v.Args[1] 34972 if v_1.Op != OpS390XMOVDconst { 34973 break 34974 } 34975 c := v_1.AuxInt 34976 v.reset(OpS390XSUBWconst) 34977 v.AuxInt = c 34978 v.AddArg(x) 34979 return true 34980 } 34981 // match: (SUBW (MOVDconst [c]) x) 34982 // cond: 34983 // result: (NEGW (SUBWconst <v.Type> x [c])) 34984 for { 34985 _ = v.Args[1] 34986 v_0 := v.Args[0] 34987 if v_0.Op != OpS390XMOVDconst { 34988 break 34989 } 34990 c := v_0.AuxInt 34991 x := v.Args[1] 34992 v.reset(OpS390XNEGW) 34993 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 34994 v0.AuxInt = c 34995 v0.AddArg(x) 34996 v.AddArg(v0) 34997 return true 34998 } 34999 // match: (SUBW x x) 35000 // cond: 35001 // result: (MOVDconst [0]) 35002 for { 35003 _ = v.Args[1] 35004 x := v.Args[0] 35005 if x != v.Args[1] { 35006 break 35007 } 35008 v.reset(OpS390XMOVDconst) 35009 v.AuxInt = 0 35010 return true 35011 } 35012 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 35013 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35014 // result: (SUBWload <t> [off] {sym} x ptr mem) 35015 for { 35016 t := v.Type 35017 _ = v.Args[1] 35018 x := v.Args[0] 35019 g := v.Args[1] 35020 if g.Op != OpS390XMOVWload { 35021 break 35022 } 35023 off := g.AuxInt 35024 sym := g.Aux 35025 _ = g.Args[1] 35026 ptr := g.Args[0] 35027 mem := g.Args[1] 35028 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35029 break 35030 } 35031 v.reset(OpS390XSUBWload) 35032 v.Type = t 35033 v.AuxInt = off 35034 v.Aux = sym 35035 v.AddArg(x) 35036 v.AddArg(ptr) 35037 v.AddArg(mem) 35038 return true 35039 } 35040 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35041 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35042 // result: (SUBWload <t> [off] {sym} x ptr mem) 35043 for { 35044 t := v.Type 35045 _ = v.Args[1] 35046 x := v.Args[0] 35047 g := v.Args[1] 35048 if g.Op != OpS390XMOVWZload { 35049 break 35050 } 35051 off := g.AuxInt 35052 sym := g.Aux 35053 _ = g.Args[1] 35054 ptr := g.Args[0] 35055 mem := g.Args[1] 35056 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35057 break 35058 } 35059 v.reset(OpS390XSUBWload) 35060 v.Type = t 35061 v.AuxInt = off 35062 v.Aux = sym 35063 v.AddArg(x) 35064 v.AddArg(ptr) 35065 v.AddArg(mem) 35066 return true 35067 } 35068 return false 35069 } 35070 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 35071 // match: (SUBWconst [c] x) 35072 // cond: int32(c) == 0 35073 // result: x 35074 for { 35075 c := v.AuxInt 35076 x := v.Args[0] 35077 if !(int32(c) == 0) { 35078 break 35079 } 35080 v.reset(OpCopy) 35081 v.Type = x.Type 35082 v.AddArg(x) 35083 return true 35084 } 35085 // match: (SUBWconst [c] x) 35086 // cond: 35087 // result: (ADDWconst [int64(int32(-c))] x) 35088 for { 35089 c := v.AuxInt 35090 x := v.Args[0] 35091 v.reset(OpS390XADDWconst) 35092 v.AuxInt = int64(int32(-c)) 35093 v.AddArg(x) 35094 return true 35095 } 35096 } 35097 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 35098 // match: (SUBconst [0] x) 35099 // cond: 35100 // result: x 35101 for { 35102 if v.AuxInt != 0 { 35103 break 35104 } 35105 x := v.Args[0] 35106 v.reset(OpCopy) 35107 v.Type = x.Type 35108 v.AddArg(x) 35109 return true 35110 } 35111 // match: (SUBconst [c] x) 35112 // cond: c != -(1<<31) 35113 // result: (ADDconst [-c] x) 35114 for { 35115 c := v.AuxInt 35116 x := v.Args[0] 35117 if !(c != -(1 << 31)) { 35118 break 35119 } 35120 v.reset(OpS390XADDconst) 35121 v.AuxInt = -c 35122 v.AddArg(x) 35123 return true 35124 } 35125 // match: (SUBconst (MOVDconst [d]) [c]) 35126 // cond: 35127 // result: (MOVDconst [d-c]) 35128 for { 35129 c := v.AuxInt 35130 v_0 := v.Args[0] 35131 if v_0.Op != OpS390XMOVDconst { 35132 break 35133 } 35134 d := v_0.AuxInt 35135 v.reset(OpS390XMOVDconst) 35136 v.AuxInt = d - c 35137 return true 35138 } 35139 // match: (SUBconst (SUBconst x [d]) [c]) 35140 // cond: is32Bit(-c-d) 35141 // result: (ADDconst [-c-d] x) 35142 for { 35143 c := v.AuxInt 35144 v_0 := v.Args[0] 35145 if v_0.Op != OpS390XSUBconst { 35146 break 35147 } 35148 d := v_0.AuxInt 35149 x := v_0.Args[0] 35150 if !(is32Bit(-c - d)) { 35151 break 35152 } 35153 v.reset(OpS390XADDconst) 35154 v.AuxInt = -c - d 35155 v.AddArg(x) 35156 return true 35157 } 35158 return false 35159 } 35160 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 35161 // match: (XOR x (MOVDconst [c])) 35162 // cond: isU32Bit(c) 35163 // result: (XORconst [c] x) 35164 for { 35165 _ = v.Args[1] 35166 x := v.Args[0] 35167 v_1 := v.Args[1] 35168 if v_1.Op != OpS390XMOVDconst { 35169 break 35170 } 35171 c := v_1.AuxInt 35172 if !(isU32Bit(c)) { 35173 break 35174 } 35175 v.reset(OpS390XXORconst) 35176 v.AuxInt = c 35177 v.AddArg(x) 35178 return true 35179 } 35180 // match: (XOR (MOVDconst [c]) x) 35181 // cond: isU32Bit(c) 35182 // result: (XORconst [c] x) 35183 for { 35184 _ = v.Args[1] 35185 v_0 := v.Args[0] 35186 if v_0.Op != OpS390XMOVDconst { 35187 break 35188 } 35189 c := v_0.AuxInt 35190 x := v.Args[1] 35191 if !(isU32Bit(c)) { 35192 break 35193 } 35194 v.reset(OpS390XXORconst) 35195 v.AuxInt = c 35196 v.AddArg(x) 35197 return true 35198 } 35199 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 35200 // cond: d == 64-c 35201 // result: (RLLGconst [c] x) 35202 for { 35203 _ = v.Args[1] 35204 v_0 := v.Args[0] 35205 if v_0.Op != OpS390XSLDconst { 35206 break 35207 } 35208 c := v_0.AuxInt 35209 x := v_0.Args[0] 35210 v_1 := v.Args[1] 35211 if v_1.Op != OpS390XSRDconst { 35212 break 35213 } 35214 d := v_1.AuxInt 35215 if x != v_1.Args[0] { 35216 break 35217 } 35218 if !(d == 64-c) { 35219 break 35220 } 35221 v.reset(OpS390XRLLGconst) 35222 v.AuxInt = c 35223 v.AddArg(x) 35224 return true 35225 } 35226 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 35227 // cond: d == 64-c 35228 // result: (RLLGconst [c] x) 35229 for { 35230 _ = v.Args[1] 35231 v_0 := v.Args[0] 35232 if v_0.Op != OpS390XSRDconst { 35233 break 35234 } 35235 d := v_0.AuxInt 35236 x := v_0.Args[0] 35237 v_1 := v.Args[1] 35238 if v_1.Op != OpS390XSLDconst { 35239 break 35240 } 35241 c := v_1.AuxInt 35242 if x != v_1.Args[0] { 35243 break 35244 } 35245 if !(d == 64-c) { 35246 break 35247 } 35248 v.reset(OpS390XRLLGconst) 35249 v.AuxInt = c 35250 v.AddArg(x) 35251 return true 35252 } 35253 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 35254 // cond: 35255 // result: (MOVDconst [c^d]) 35256 for { 35257 _ = v.Args[1] 35258 v_0 := v.Args[0] 35259 if v_0.Op != OpS390XMOVDconst { 35260 break 35261 } 35262 c := v_0.AuxInt 35263 v_1 := v.Args[1] 35264 if v_1.Op != OpS390XMOVDconst { 35265 break 35266 } 35267 d := v_1.AuxInt 35268 v.reset(OpS390XMOVDconst) 35269 v.AuxInt = c ^ d 35270 return true 35271 } 35272 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 35273 // cond: 35274 // result: (MOVDconst [c^d]) 35275 for { 35276 _ = v.Args[1] 35277 v_0 := v.Args[0] 35278 if v_0.Op != OpS390XMOVDconst { 35279 break 35280 } 35281 d := v_0.AuxInt 35282 v_1 := v.Args[1] 35283 if v_1.Op != OpS390XMOVDconst { 35284 break 35285 } 35286 c := v_1.AuxInt 35287 v.reset(OpS390XMOVDconst) 35288 v.AuxInt = c ^ d 35289 return true 35290 } 35291 // match: (XOR x x) 35292 // cond: 35293 // result: (MOVDconst [0]) 35294 for { 35295 _ = v.Args[1] 35296 x := v.Args[0] 35297 if x != v.Args[1] { 35298 break 35299 } 35300 v.reset(OpS390XMOVDconst) 35301 v.AuxInt = 0 35302 return true 35303 } 35304 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35305 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35306 // result: (XORload <t> [off] {sym} x ptr mem) 35307 for { 35308 t := v.Type 35309 _ = v.Args[1] 35310 x := v.Args[0] 35311 g := v.Args[1] 35312 if g.Op != OpS390XMOVDload { 35313 break 35314 } 35315 off := g.AuxInt 35316 sym := g.Aux 35317 _ = g.Args[1] 35318 ptr := g.Args[0] 35319 mem := g.Args[1] 35320 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35321 break 35322 } 35323 v.reset(OpS390XXORload) 35324 v.Type = t 35325 v.AuxInt = off 35326 v.Aux = sym 35327 v.AddArg(x) 35328 v.AddArg(ptr) 35329 v.AddArg(mem) 35330 return true 35331 } 35332 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35333 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35334 // result: (XORload <t> [off] {sym} x ptr mem) 35335 for { 35336 t := v.Type 35337 _ = v.Args[1] 35338 g := v.Args[0] 35339 if g.Op != OpS390XMOVDload { 35340 break 35341 } 35342 off := g.AuxInt 35343 sym := g.Aux 35344 _ = g.Args[1] 35345 ptr := g.Args[0] 35346 mem := g.Args[1] 35347 x := v.Args[1] 35348 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35349 break 35350 } 35351 v.reset(OpS390XXORload) 35352 v.Type = t 35353 v.AuxInt = off 35354 v.Aux = sym 35355 v.AddArg(x) 35356 v.AddArg(ptr) 35357 v.AddArg(mem) 35358 return true 35359 } 35360 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35361 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35362 // result: (XORload <t> [off] {sym} x ptr mem) 35363 for { 35364 t := v.Type 35365 _ = v.Args[1] 35366 g := v.Args[0] 35367 if g.Op != OpS390XMOVDload { 35368 break 35369 } 35370 off := g.AuxInt 35371 sym := g.Aux 35372 _ = g.Args[1] 35373 ptr := g.Args[0] 35374 mem := g.Args[1] 35375 x := v.Args[1] 35376 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35377 break 35378 } 35379 v.reset(OpS390XXORload) 35380 v.Type = t 35381 v.AuxInt = off 35382 v.Aux = sym 35383 v.AddArg(x) 35384 v.AddArg(ptr) 35385 v.AddArg(mem) 35386 return true 35387 } 35388 return false 35389 } 35390 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 35391 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35392 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35393 // result: (XORload <t> [off] {sym} x ptr mem) 35394 for { 35395 t := v.Type 35396 _ = v.Args[1] 35397 x := v.Args[0] 35398 g := v.Args[1] 35399 if g.Op != OpS390XMOVDload { 35400 break 35401 } 35402 off := g.AuxInt 35403 sym := g.Aux 35404 _ = g.Args[1] 35405 ptr := g.Args[0] 35406 mem := g.Args[1] 35407 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35408 break 35409 } 35410 v.reset(OpS390XXORload) 35411 v.Type = t 35412 v.AuxInt = off 35413 v.Aux = sym 35414 v.AddArg(x) 35415 v.AddArg(ptr) 35416 v.AddArg(mem) 35417 return true 35418 } 35419 return false 35420 } 35421 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 35422 // match: (XORW x (MOVDconst [c])) 35423 // cond: 35424 // result: (XORWconst [c] x) 35425 for { 35426 _ = v.Args[1] 35427 x := v.Args[0] 35428 v_1 := v.Args[1] 35429 if v_1.Op != OpS390XMOVDconst { 35430 break 35431 } 35432 c := v_1.AuxInt 35433 v.reset(OpS390XXORWconst) 35434 v.AuxInt = c 35435 v.AddArg(x) 35436 return true 35437 } 35438 // match: (XORW (MOVDconst [c]) x) 35439 // cond: 35440 // result: (XORWconst [c] x) 35441 for { 35442 _ = v.Args[1] 35443 v_0 := v.Args[0] 35444 if v_0.Op != OpS390XMOVDconst { 35445 break 35446 } 35447 c := v_0.AuxInt 35448 x := v.Args[1] 35449 v.reset(OpS390XXORWconst) 35450 v.AuxInt = c 35451 v.AddArg(x) 35452 return true 35453 } 35454 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 35455 // cond: d == 32-c 35456 // result: (RLLconst [c] x) 35457 for { 35458 _ = v.Args[1] 35459 v_0 := v.Args[0] 35460 if v_0.Op != OpS390XSLWconst { 35461 break 35462 } 35463 c := v_0.AuxInt 35464 x := v_0.Args[0] 35465 v_1 := v.Args[1] 35466 if v_1.Op != OpS390XSRWconst { 35467 break 35468 } 35469 d := v_1.AuxInt 35470 if x != v_1.Args[0] { 35471 break 35472 } 35473 if !(d == 32-c) { 35474 break 35475 } 35476 v.reset(OpS390XRLLconst) 35477 v.AuxInt = c 35478 v.AddArg(x) 35479 return true 35480 } 35481 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 35482 // cond: d == 32-c 35483 // result: (RLLconst [c] x) 35484 for { 35485 _ = v.Args[1] 35486 v_0 := v.Args[0] 35487 if v_0.Op != OpS390XSRWconst { 35488 break 35489 } 35490 d := v_0.AuxInt 35491 x := v_0.Args[0] 35492 v_1 := v.Args[1] 35493 if v_1.Op != OpS390XSLWconst { 35494 break 35495 } 35496 c := v_1.AuxInt 35497 if x != v_1.Args[0] { 35498 break 35499 } 35500 if !(d == 32-c) { 35501 break 35502 } 35503 v.reset(OpS390XRLLconst) 35504 v.AuxInt = c 35505 v.AddArg(x) 35506 return true 35507 } 35508 // match: (XORW x x) 35509 // cond: 35510 // result: (MOVDconst [0]) 35511 for { 35512 _ = v.Args[1] 35513 x := v.Args[0] 35514 if x != v.Args[1] { 35515 break 35516 } 35517 v.reset(OpS390XMOVDconst) 35518 v.AuxInt = 0 35519 return true 35520 } 35521 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35522 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35523 // result: (XORWload <t> [off] {sym} x ptr mem) 35524 for { 35525 t := v.Type 35526 _ = v.Args[1] 35527 x := v.Args[0] 35528 g := v.Args[1] 35529 if g.Op != OpS390XMOVWload { 35530 break 35531 } 35532 off := g.AuxInt 35533 sym := g.Aux 35534 _ = g.Args[1] 35535 ptr := g.Args[0] 35536 mem := g.Args[1] 35537 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35538 break 35539 } 35540 v.reset(OpS390XXORWload) 35541 v.Type = t 35542 v.AuxInt = off 35543 v.Aux = sym 35544 v.AddArg(x) 35545 v.AddArg(ptr) 35546 v.AddArg(mem) 35547 return true 35548 } 35549 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35550 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35551 // result: (XORWload <t> [off] {sym} x ptr mem) 35552 for { 35553 t := v.Type 35554 _ = v.Args[1] 35555 g := v.Args[0] 35556 if g.Op != OpS390XMOVWload { 35557 break 35558 } 35559 off := g.AuxInt 35560 sym := g.Aux 35561 _ = g.Args[1] 35562 ptr := g.Args[0] 35563 mem := g.Args[1] 35564 x := v.Args[1] 35565 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35566 break 35567 } 35568 v.reset(OpS390XXORWload) 35569 v.Type = t 35570 v.AuxInt = off 35571 v.Aux = sym 35572 v.AddArg(x) 35573 v.AddArg(ptr) 35574 v.AddArg(mem) 35575 return true 35576 } 35577 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35578 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35579 // result: (XORWload <t> [off] {sym} x ptr mem) 35580 for { 35581 t := v.Type 35582 _ = v.Args[1] 35583 g := v.Args[0] 35584 if g.Op != OpS390XMOVWload { 35585 break 35586 } 35587 off := g.AuxInt 35588 sym := g.Aux 35589 _ = g.Args[1] 35590 ptr := g.Args[0] 35591 mem := g.Args[1] 35592 x := v.Args[1] 35593 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35594 break 35595 } 35596 v.reset(OpS390XXORWload) 35597 v.Type = t 35598 v.AuxInt = off 35599 v.Aux = sym 35600 v.AddArg(x) 35601 v.AddArg(ptr) 35602 v.AddArg(mem) 35603 return true 35604 } 35605 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35606 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35607 // result: (XORWload <t> [off] {sym} x ptr mem) 35608 for { 35609 t := v.Type 35610 _ = v.Args[1] 35611 x := v.Args[0] 35612 g := v.Args[1] 35613 if g.Op != OpS390XMOVWload { 35614 break 35615 } 35616 off := g.AuxInt 35617 sym := g.Aux 35618 _ = g.Args[1] 35619 ptr := g.Args[0] 35620 mem := g.Args[1] 35621 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35622 break 35623 } 35624 v.reset(OpS390XXORWload) 35625 v.Type = t 35626 v.AuxInt = off 35627 v.Aux = sym 35628 v.AddArg(x) 35629 v.AddArg(ptr) 35630 v.AddArg(mem) 35631 return true 35632 } 35633 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35634 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35635 // result: (XORWload <t> [off] {sym} x ptr mem) 35636 for { 35637 t := v.Type 35638 _ = v.Args[1] 35639 x := v.Args[0] 35640 g := v.Args[1] 35641 if g.Op != OpS390XMOVWZload { 35642 break 35643 } 35644 off := g.AuxInt 35645 sym := g.Aux 35646 _ = g.Args[1] 35647 ptr := g.Args[0] 35648 mem := g.Args[1] 35649 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35650 break 35651 } 35652 v.reset(OpS390XXORWload) 35653 v.Type = t 35654 v.AuxInt = off 35655 v.Aux = sym 35656 v.AddArg(x) 35657 v.AddArg(ptr) 35658 v.AddArg(mem) 35659 return true 35660 } 35661 return false 35662 } 35663 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 35664 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35665 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35666 // result: (XORWload <t> [off] {sym} x ptr mem) 35667 for { 35668 t := v.Type 35669 _ = v.Args[1] 35670 g := v.Args[0] 35671 if g.Op != OpS390XMOVWZload { 35672 break 35673 } 35674 off := g.AuxInt 35675 sym := g.Aux 35676 _ = g.Args[1] 35677 ptr := g.Args[0] 35678 mem := g.Args[1] 35679 x := v.Args[1] 35680 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35681 break 35682 } 35683 v.reset(OpS390XXORWload) 35684 v.Type = t 35685 v.AuxInt = off 35686 v.Aux = sym 35687 v.AddArg(x) 35688 v.AddArg(ptr) 35689 v.AddArg(mem) 35690 return true 35691 } 35692 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35693 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35694 // result: (XORWload <t> [off] {sym} x ptr mem) 35695 for { 35696 t := v.Type 35697 _ = v.Args[1] 35698 g := v.Args[0] 35699 if g.Op != OpS390XMOVWZload { 35700 break 35701 } 35702 off := g.AuxInt 35703 sym := g.Aux 35704 _ = g.Args[1] 35705 ptr := g.Args[0] 35706 mem := g.Args[1] 35707 x := v.Args[1] 35708 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35709 break 35710 } 35711 v.reset(OpS390XXORWload) 35712 v.Type = t 35713 v.AuxInt = off 35714 v.Aux = sym 35715 v.AddArg(x) 35716 v.AddArg(ptr) 35717 v.AddArg(mem) 35718 return true 35719 } 35720 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35721 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35722 // result: (XORWload <t> [off] {sym} x ptr mem) 35723 for { 35724 t := v.Type 35725 _ = v.Args[1] 35726 x := v.Args[0] 35727 g := v.Args[1] 35728 if g.Op != OpS390XMOVWZload { 35729 break 35730 } 35731 off := g.AuxInt 35732 sym := g.Aux 35733 _ = g.Args[1] 35734 ptr := g.Args[0] 35735 mem := g.Args[1] 35736 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35737 break 35738 } 35739 v.reset(OpS390XXORWload) 35740 v.Type = t 35741 v.AuxInt = off 35742 v.Aux = sym 35743 v.AddArg(x) 35744 v.AddArg(ptr) 35745 v.AddArg(mem) 35746 return true 35747 } 35748 return false 35749 } 35750 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 35751 // match: (XORWconst [c] x) 35752 // cond: int32(c)==0 35753 // result: x 35754 for { 35755 c := v.AuxInt 35756 x := v.Args[0] 35757 if !(int32(c) == 0) { 35758 break 35759 } 35760 v.reset(OpCopy) 35761 v.Type = x.Type 35762 v.AddArg(x) 35763 return true 35764 } 35765 // match: (XORWconst [c] (MOVDconst [d])) 35766 // cond: 35767 // result: (MOVDconst [c^d]) 35768 for { 35769 c := v.AuxInt 35770 v_0 := v.Args[0] 35771 if v_0.Op != OpS390XMOVDconst { 35772 break 35773 } 35774 d := v_0.AuxInt 35775 v.reset(OpS390XMOVDconst) 35776 v.AuxInt = c ^ d 35777 return true 35778 } 35779 return false 35780 } 35781 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 35782 // match: (XORconst [0] x) 35783 // cond: 35784 // result: x 35785 for { 35786 if v.AuxInt != 0 { 35787 break 35788 } 35789 x := v.Args[0] 35790 v.reset(OpCopy) 35791 v.Type = x.Type 35792 v.AddArg(x) 35793 return true 35794 } 35795 // match: (XORconst [c] (MOVDconst [d])) 35796 // cond: 35797 // result: (MOVDconst [c^d]) 35798 for { 35799 c := v.AuxInt 35800 v_0 := v.Args[0] 35801 if v_0.Op != OpS390XMOVDconst { 35802 break 35803 } 35804 d := v_0.AuxInt 35805 v.reset(OpS390XMOVDconst) 35806 v.AuxInt = c ^ d 35807 return true 35808 } 35809 return false 35810 } 35811 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 35812 b := v.Block 35813 _ = b 35814 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 35815 // cond: 35816 // result: (ADDW val (Select0 <t> tuple)) 35817 for { 35818 t := v.Type 35819 v_0 := v.Args[0] 35820 if v_0.Op != OpS390XAddTupleFirst32 { 35821 break 35822 } 35823 _ = v_0.Args[1] 35824 val := v_0.Args[0] 35825 tuple := v_0.Args[1] 35826 v.reset(OpS390XADDW) 35827 v.AddArg(val) 35828 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35829 v0.AddArg(tuple) 35830 v.AddArg(v0) 35831 return true 35832 } 35833 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 35834 // cond: 35835 // result: (ADD val (Select0 <t> tuple)) 35836 for { 35837 t := v.Type 35838 v_0 := v.Args[0] 35839 if v_0.Op != OpS390XAddTupleFirst64 { 35840 break 35841 } 35842 _ = v_0.Args[1] 35843 val := v_0.Args[0] 35844 tuple := v_0.Args[1] 35845 v.reset(OpS390XADD) 35846 v.AddArg(val) 35847 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35848 v0.AddArg(tuple) 35849 v.AddArg(v0) 35850 return true 35851 } 35852 return false 35853 } 35854 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 35855 // match: (Select1 (AddTupleFirst32 _ tuple)) 35856 // cond: 35857 // result: (Select1 tuple) 35858 for { 35859 v_0 := v.Args[0] 35860 if v_0.Op != OpS390XAddTupleFirst32 { 35861 break 35862 } 35863 _ = v_0.Args[1] 35864 tuple := v_0.Args[1] 35865 v.reset(OpSelect1) 35866 v.AddArg(tuple) 35867 return true 35868 } 35869 // match: (Select1 (AddTupleFirst64 _ tuple)) 35870 // cond: 35871 // result: (Select1 tuple) 35872 for { 35873 v_0 := v.Args[0] 35874 if v_0.Op != OpS390XAddTupleFirst64 { 35875 break 35876 } 35877 _ = v_0.Args[1] 35878 tuple := v_0.Args[1] 35879 v.reset(OpSelect1) 35880 v.AddArg(tuple) 35881 return true 35882 } 35883 return false 35884 } 35885 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 35886 // match: (SignExt16to32 x) 35887 // cond: 35888 // result: (MOVHreg x) 35889 for { 35890 x := v.Args[0] 35891 v.reset(OpS390XMOVHreg) 35892 v.AddArg(x) 35893 return true 35894 } 35895 } 35896 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 35897 // match: (SignExt16to64 x) 35898 // cond: 35899 // result: (MOVHreg x) 35900 for { 35901 x := v.Args[0] 35902 v.reset(OpS390XMOVHreg) 35903 v.AddArg(x) 35904 return true 35905 } 35906 } 35907 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 35908 // match: (SignExt32to64 x) 35909 // cond: 35910 // result: (MOVWreg x) 35911 for { 35912 x := v.Args[0] 35913 v.reset(OpS390XMOVWreg) 35914 v.AddArg(x) 35915 return true 35916 } 35917 } 35918 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 35919 // match: (SignExt8to16 x) 35920 // cond: 35921 // result: (MOVBreg x) 35922 for { 35923 x := v.Args[0] 35924 v.reset(OpS390XMOVBreg) 35925 v.AddArg(x) 35926 return true 35927 } 35928 } 35929 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 35930 // match: (SignExt8to32 x) 35931 // cond: 35932 // result: (MOVBreg x) 35933 for { 35934 x := v.Args[0] 35935 v.reset(OpS390XMOVBreg) 35936 v.AddArg(x) 35937 return true 35938 } 35939 } 35940 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 35941 // match: (SignExt8to64 x) 35942 // cond: 35943 // result: (MOVBreg x) 35944 for { 35945 x := v.Args[0] 35946 v.reset(OpS390XMOVBreg) 35947 v.AddArg(x) 35948 return true 35949 } 35950 } 35951 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 35952 b := v.Block 35953 _ = b 35954 // match: (Slicemask <t> x) 35955 // cond: 35956 // result: (SRADconst (NEG <t> x) [63]) 35957 for { 35958 t := v.Type 35959 x := v.Args[0] 35960 v.reset(OpS390XSRADconst) 35961 v.AuxInt = 63 35962 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 35963 v0.AddArg(x) 35964 v.AddArg(v0) 35965 return true 35966 } 35967 } 35968 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 35969 // match: (Sqrt x) 35970 // cond: 35971 // result: (FSQRT x) 35972 for { 35973 x := v.Args[0] 35974 v.reset(OpS390XFSQRT) 35975 v.AddArg(x) 35976 return true 35977 } 35978 } 35979 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 35980 // match: (StaticCall [argwid] {target} mem) 35981 // cond: 35982 // result: (CALLstatic [argwid] {target} mem) 35983 for { 35984 argwid := v.AuxInt 35985 target := v.Aux 35986 mem := v.Args[0] 35987 v.reset(OpS390XCALLstatic) 35988 v.AuxInt = argwid 35989 v.Aux = target 35990 v.AddArg(mem) 35991 return true 35992 } 35993 } 35994 func rewriteValueS390X_OpStore_0(v *Value) bool { 35995 // match: (Store {t} ptr val mem) 35996 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 35997 // result: (FMOVDstore ptr val mem) 35998 for { 35999 t := v.Aux 36000 _ = v.Args[2] 36001 ptr := v.Args[0] 36002 val := v.Args[1] 36003 mem := v.Args[2] 36004 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 36005 break 36006 } 36007 v.reset(OpS390XFMOVDstore) 36008 v.AddArg(ptr) 36009 v.AddArg(val) 36010 v.AddArg(mem) 36011 return true 36012 } 36013 // match: (Store {t} ptr val mem) 36014 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 36015 // result: (FMOVSstore ptr val mem) 36016 for { 36017 t := v.Aux 36018 _ = v.Args[2] 36019 ptr := v.Args[0] 36020 val := v.Args[1] 36021 mem := v.Args[2] 36022 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 36023 break 36024 } 36025 v.reset(OpS390XFMOVSstore) 36026 v.AddArg(ptr) 36027 v.AddArg(val) 36028 v.AddArg(mem) 36029 return true 36030 } 36031 // match: (Store {t} ptr val mem) 36032 // cond: t.(*types.Type).Size() == 8 36033 // result: (MOVDstore ptr val mem) 36034 for { 36035 t := v.Aux 36036 _ = v.Args[2] 36037 ptr := v.Args[0] 36038 val := v.Args[1] 36039 mem := v.Args[2] 36040 if !(t.(*types.Type).Size() == 8) { 36041 break 36042 } 36043 v.reset(OpS390XMOVDstore) 36044 v.AddArg(ptr) 36045 v.AddArg(val) 36046 v.AddArg(mem) 36047 return true 36048 } 36049 // match: (Store {t} ptr val mem) 36050 // cond: t.(*types.Type).Size() == 4 36051 // result: (MOVWstore ptr val mem) 36052 for { 36053 t := v.Aux 36054 _ = v.Args[2] 36055 ptr := v.Args[0] 36056 val := v.Args[1] 36057 mem := v.Args[2] 36058 if !(t.(*types.Type).Size() == 4) { 36059 break 36060 } 36061 v.reset(OpS390XMOVWstore) 36062 v.AddArg(ptr) 36063 v.AddArg(val) 36064 v.AddArg(mem) 36065 return true 36066 } 36067 // match: (Store {t} ptr val mem) 36068 // cond: t.(*types.Type).Size() == 2 36069 // result: (MOVHstore ptr val mem) 36070 for { 36071 t := v.Aux 36072 _ = v.Args[2] 36073 ptr := v.Args[0] 36074 val := v.Args[1] 36075 mem := v.Args[2] 36076 if !(t.(*types.Type).Size() == 2) { 36077 break 36078 } 36079 v.reset(OpS390XMOVHstore) 36080 v.AddArg(ptr) 36081 v.AddArg(val) 36082 v.AddArg(mem) 36083 return true 36084 } 36085 // match: (Store {t} ptr val mem) 36086 // cond: t.(*types.Type).Size() == 1 36087 // result: (MOVBstore ptr val mem) 36088 for { 36089 t := v.Aux 36090 _ = v.Args[2] 36091 ptr := v.Args[0] 36092 val := v.Args[1] 36093 mem := v.Args[2] 36094 if !(t.(*types.Type).Size() == 1) { 36095 break 36096 } 36097 v.reset(OpS390XMOVBstore) 36098 v.AddArg(ptr) 36099 v.AddArg(val) 36100 v.AddArg(mem) 36101 return true 36102 } 36103 return false 36104 } 36105 func rewriteValueS390X_OpSub16_0(v *Value) bool { 36106 // match: (Sub16 x y) 36107 // cond: 36108 // result: (SUBW x y) 36109 for { 36110 _ = v.Args[1] 36111 x := v.Args[0] 36112 y := v.Args[1] 36113 v.reset(OpS390XSUBW) 36114 v.AddArg(x) 36115 v.AddArg(y) 36116 return true 36117 } 36118 } 36119 func rewriteValueS390X_OpSub32_0(v *Value) bool { 36120 // match: (Sub32 x y) 36121 // cond: 36122 // result: (SUBW x y) 36123 for { 36124 _ = v.Args[1] 36125 x := v.Args[0] 36126 y := v.Args[1] 36127 v.reset(OpS390XSUBW) 36128 v.AddArg(x) 36129 v.AddArg(y) 36130 return true 36131 } 36132 } 36133 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 36134 // match: (Sub32F x y) 36135 // cond: 36136 // result: (FSUBS x y) 36137 for { 36138 _ = v.Args[1] 36139 x := v.Args[0] 36140 y := v.Args[1] 36141 v.reset(OpS390XFSUBS) 36142 v.AddArg(x) 36143 v.AddArg(y) 36144 return true 36145 } 36146 } 36147 func rewriteValueS390X_OpSub64_0(v *Value) bool { 36148 // match: (Sub64 x y) 36149 // cond: 36150 // result: (SUB x y) 36151 for { 36152 _ = v.Args[1] 36153 x := v.Args[0] 36154 y := v.Args[1] 36155 v.reset(OpS390XSUB) 36156 v.AddArg(x) 36157 v.AddArg(y) 36158 return true 36159 } 36160 } 36161 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 36162 // match: (Sub64F x y) 36163 // cond: 36164 // result: (FSUB x y) 36165 for { 36166 _ = v.Args[1] 36167 x := v.Args[0] 36168 y := v.Args[1] 36169 v.reset(OpS390XFSUB) 36170 v.AddArg(x) 36171 v.AddArg(y) 36172 return true 36173 } 36174 } 36175 func rewriteValueS390X_OpSub8_0(v *Value) bool { 36176 // match: (Sub8 x y) 36177 // cond: 36178 // result: (SUBW x y) 36179 for { 36180 _ = v.Args[1] 36181 x := v.Args[0] 36182 y := v.Args[1] 36183 v.reset(OpS390XSUBW) 36184 v.AddArg(x) 36185 v.AddArg(y) 36186 return true 36187 } 36188 } 36189 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 36190 // match: (SubPtr x y) 36191 // cond: 36192 // result: (SUB x y) 36193 for { 36194 _ = v.Args[1] 36195 x := v.Args[0] 36196 y := v.Args[1] 36197 v.reset(OpS390XSUB) 36198 v.AddArg(x) 36199 v.AddArg(y) 36200 return true 36201 } 36202 } 36203 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 36204 // match: (Trunc16to8 x) 36205 // cond: 36206 // result: x 36207 for { 36208 x := v.Args[0] 36209 v.reset(OpCopy) 36210 v.Type = x.Type 36211 v.AddArg(x) 36212 return true 36213 } 36214 } 36215 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 36216 // match: (Trunc32to16 x) 36217 // cond: 36218 // result: x 36219 for { 36220 x := v.Args[0] 36221 v.reset(OpCopy) 36222 v.Type = x.Type 36223 v.AddArg(x) 36224 return true 36225 } 36226 } 36227 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 36228 // match: (Trunc32to8 x) 36229 // cond: 36230 // result: x 36231 for { 36232 x := v.Args[0] 36233 v.reset(OpCopy) 36234 v.Type = x.Type 36235 v.AddArg(x) 36236 return true 36237 } 36238 } 36239 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 36240 // match: (Trunc64to16 x) 36241 // cond: 36242 // result: x 36243 for { 36244 x := v.Args[0] 36245 v.reset(OpCopy) 36246 v.Type = x.Type 36247 v.AddArg(x) 36248 return true 36249 } 36250 } 36251 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 36252 // match: (Trunc64to32 x) 36253 // cond: 36254 // result: x 36255 for { 36256 x := v.Args[0] 36257 v.reset(OpCopy) 36258 v.Type = x.Type 36259 v.AddArg(x) 36260 return true 36261 } 36262 } 36263 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 36264 // match: (Trunc64to8 x) 36265 // cond: 36266 // result: x 36267 for { 36268 x := v.Args[0] 36269 v.reset(OpCopy) 36270 v.Type = x.Type 36271 v.AddArg(x) 36272 return true 36273 } 36274 } 36275 func rewriteValueS390X_OpXor16_0(v *Value) bool { 36276 // match: (Xor16 x y) 36277 // cond: 36278 // result: (XORW x y) 36279 for { 36280 _ = v.Args[1] 36281 x := v.Args[0] 36282 y := v.Args[1] 36283 v.reset(OpS390XXORW) 36284 v.AddArg(x) 36285 v.AddArg(y) 36286 return true 36287 } 36288 } 36289 func rewriteValueS390X_OpXor32_0(v *Value) bool { 36290 // match: (Xor32 x y) 36291 // cond: 36292 // result: (XORW x y) 36293 for { 36294 _ = v.Args[1] 36295 x := v.Args[0] 36296 y := v.Args[1] 36297 v.reset(OpS390XXORW) 36298 v.AddArg(x) 36299 v.AddArg(y) 36300 return true 36301 } 36302 } 36303 func rewriteValueS390X_OpXor64_0(v *Value) bool { 36304 // match: (Xor64 x y) 36305 // cond: 36306 // result: (XOR x y) 36307 for { 36308 _ = v.Args[1] 36309 x := v.Args[0] 36310 y := v.Args[1] 36311 v.reset(OpS390XXOR) 36312 v.AddArg(x) 36313 v.AddArg(y) 36314 return true 36315 } 36316 } 36317 func rewriteValueS390X_OpXor8_0(v *Value) bool { 36318 // match: (Xor8 x y) 36319 // cond: 36320 // result: (XORW x y) 36321 for { 36322 _ = v.Args[1] 36323 x := v.Args[0] 36324 y := v.Args[1] 36325 v.reset(OpS390XXORW) 36326 v.AddArg(x) 36327 v.AddArg(y) 36328 return true 36329 } 36330 } 36331 func rewriteValueS390X_OpZero_0(v *Value) bool { 36332 b := v.Block 36333 _ = b 36334 // match: (Zero [0] _ mem) 36335 // cond: 36336 // result: mem 36337 for { 36338 if v.AuxInt != 0 { 36339 break 36340 } 36341 _ = v.Args[1] 36342 mem := v.Args[1] 36343 v.reset(OpCopy) 36344 v.Type = mem.Type 36345 v.AddArg(mem) 36346 return true 36347 } 36348 // match: (Zero [1] destptr mem) 36349 // cond: 36350 // result: (MOVBstoreconst [0] destptr mem) 36351 for { 36352 if v.AuxInt != 1 { 36353 break 36354 } 36355 _ = v.Args[1] 36356 destptr := v.Args[0] 36357 mem := v.Args[1] 36358 v.reset(OpS390XMOVBstoreconst) 36359 v.AuxInt = 0 36360 v.AddArg(destptr) 36361 v.AddArg(mem) 36362 return true 36363 } 36364 // match: (Zero [2] destptr mem) 36365 // cond: 36366 // result: (MOVHstoreconst [0] destptr mem) 36367 for { 36368 if v.AuxInt != 2 { 36369 break 36370 } 36371 _ = v.Args[1] 36372 destptr := v.Args[0] 36373 mem := v.Args[1] 36374 v.reset(OpS390XMOVHstoreconst) 36375 v.AuxInt = 0 36376 v.AddArg(destptr) 36377 v.AddArg(mem) 36378 return true 36379 } 36380 // match: (Zero [4] destptr mem) 36381 // cond: 36382 // result: (MOVWstoreconst [0] destptr mem) 36383 for { 36384 if v.AuxInt != 4 { 36385 break 36386 } 36387 _ = v.Args[1] 36388 destptr := v.Args[0] 36389 mem := v.Args[1] 36390 v.reset(OpS390XMOVWstoreconst) 36391 v.AuxInt = 0 36392 v.AddArg(destptr) 36393 v.AddArg(mem) 36394 return true 36395 } 36396 // match: (Zero [8] destptr mem) 36397 // cond: 36398 // result: (MOVDstoreconst [0] destptr mem) 36399 for { 36400 if v.AuxInt != 8 { 36401 break 36402 } 36403 _ = v.Args[1] 36404 destptr := v.Args[0] 36405 mem := v.Args[1] 36406 v.reset(OpS390XMOVDstoreconst) 36407 v.AuxInt = 0 36408 v.AddArg(destptr) 36409 v.AddArg(mem) 36410 return true 36411 } 36412 // match: (Zero [3] destptr mem) 36413 // cond: 36414 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 36415 for { 36416 if v.AuxInt != 3 { 36417 break 36418 } 36419 _ = v.Args[1] 36420 destptr := v.Args[0] 36421 mem := v.Args[1] 36422 v.reset(OpS390XMOVBstoreconst) 36423 v.AuxInt = makeValAndOff(0, 2) 36424 v.AddArg(destptr) 36425 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 36426 v0.AuxInt = 0 36427 v0.AddArg(destptr) 36428 v0.AddArg(mem) 36429 v.AddArg(v0) 36430 return true 36431 } 36432 // match: (Zero [5] destptr mem) 36433 // cond: 36434 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36435 for { 36436 if v.AuxInt != 5 { 36437 break 36438 } 36439 _ = v.Args[1] 36440 destptr := v.Args[0] 36441 mem := v.Args[1] 36442 v.reset(OpS390XMOVBstoreconst) 36443 v.AuxInt = makeValAndOff(0, 4) 36444 v.AddArg(destptr) 36445 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36446 v0.AuxInt = 0 36447 v0.AddArg(destptr) 36448 v0.AddArg(mem) 36449 v.AddArg(v0) 36450 return true 36451 } 36452 // match: (Zero [6] destptr mem) 36453 // cond: 36454 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36455 for { 36456 if v.AuxInt != 6 { 36457 break 36458 } 36459 _ = v.Args[1] 36460 destptr := v.Args[0] 36461 mem := v.Args[1] 36462 v.reset(OpS390XMOVHstoreconst) 36463 v.AuxInt = makeValAndOff(0, 4) 36464 v.AddArg(destptr) 36465 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36466 v0.AuxInt = 0 36467 v0.AddArg(destptr) 36468 v0.AddArg(mem) 36469 v.AddArg(v0) 36470 return true 36471 } 36472 // match: (Zero [7] destptr mem) 36473 // cond: 36474 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 36475 for { 36476 if v.AuxInt != 7 { 36477 break 36478 } 36479 _ = v.Args[1] 36480 destptr := v.Args[0] 36481 mem := v.Args[1] 36482 v.reset(OpS390XMOVWstoreconst) 36483 v.AuxInt = makeValAndOff(0, 3) 36484 v.AddArg(destptr) 36485 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36486 v0.AuxInt = 0 36487 v0.AddArg(destptr) 36488 v0.AddArg(mem) 36489 v.AddArg(v0) 36490 return true 36491 } 36492 // match: (Zero [s] destptr mem) 36493 // cond: s > 0 && s <= 1024 36494 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 36495 for { 36496 s := v.AuxInt 36497 _ = v.Args[1] 36498 destptr := v.Args[0] 36499 mem := v.Args[1] 36500 if !(s > 0 && s <= 1024) { 36501 break 36502 } 36503 v.reset(OpS390XCLEAR) 36504 v.AuxInt = makeValAndOff(s, 0) 36505 v.AddArg(destptr) 36506 v.AddArg(mem) 36507 return true 36508 } 36509 return false 36510 } 36511 func rewriteValueS390X_OpZero_10(v *Value) bool { 36512 b := v.Block 36513 _ = b 36514 // match: (Zero [s] destptr mem) 36515 // cond: s > 1024 36516 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 36517 for { 36518 s := v.AuxInt 36519 _ = v.Args[1] 36520 destptr := v.Args[0] 36521 mem := v.Args[1] 36522 if !(s > 1024) { 36523 break 36524 } 36525 v.reset(OpS390XLoweredZero) 36526 v.AuxInt = s % 256 36527 v.AddArg(destptr) 36528 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 36529 v0.AuxInt = (s / 256) * 256 36530 v0.AddArg(destptr) 36531 v.AddArg(v0) 36532 v.AddArg(mem) 36533 return true 36534 } 36535 return false 36536 } 36537 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 36538 // match: (ZeroExt16to32 x) 36539 // cond: 36540 // result: (MOVHZreg x) 36541 for { 36542 x := v.Args[0] 36543 v.reset(OpS390XMOVHZreg) 36544 v.AddArg(x) 36545 return true 36546 } 36547 } 36548 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 36549 // match: (ZeroExt16to64 x) 36550 // cond: 36551 // result: (MOVHZreg x) 36552 for { 36553 x := v.Args[0] 36554 v.reset(OpS390XMOVHZreg) 36555 v.AddArg(x) 36556 return true 36557 } 36558 } 36559 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 36560 // match: (ZeroExt32to64 x) 36561 // cond: 36562 // result: (MOVWZreg x) 36563 for { 36564 x := v.Args[0] 36565 v.reset(OpS390XMOVWZreg) 36566 v.AddArg(x) 36567 return true 36568 } 36569 } 36570 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 36571 // match: (ZeroExt8to16 x) 36572 // cond: 36573 // result: (MOVBZreg x) 36574 for { 36575 x := v.Args[0] 36576 v.reset(OpS390XMOVBZreg) 36577 v.AddArg(x) 36578 return true 36579 } 36580 } 36581 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 36582 // match: (ZeroExt8to32 x) 36583 // cond: 36584 // result: (MOVBZreg x) 36585 for { 36586 x := v.Args[0] 36587 v.reset(OpS390XMOVBZreg) 36588 v.AddArg(x) 36589 return true 36590 } 36591 } 36592 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 36593 // match: (ZeroExt8to64 x) 36594 // cond: 36595 // result: (MOVBZreg x) 36596 for { 36597 x := v.Args[0] 36598 v.reset(OpS390XMOVBZreg) 36599 v.AddArg(x) 36600 return true 36601 } 36602 } 36603 func rewriteBlockS390X(b *Block) bool { 36604 config := b.Func.Config 36605 _ = config 36606 fe := b.Func.fe 36607 _ = fe 36608 typ := &config.Types 36609 _ = typ 36610 switch b.Kind { 36611 case BlockS390XEQ: 36612 // match: (EQ (InvertFlags cmp) yes no) 36613 // cond: 36614 // result: (EQ cmp yes no) 36615 for { 36616 v := b.Control 36617 if v.Op != OpS390XInvertFlags { 36618 break 36619 } 36620 cmp := v.Args[0] 36621 b.Kind = BlockS390XEQ 36622 b.SetControl(cmp) 36623 return true 36624 } 36625 // match: (EQ (FlagEQ) yes no) 36626 // cond: 36627 // result: (First nil yes no) 36628 for { 36629 v := b.Control 36630 if v.Op != OpS390XFlagEQ { 36631 break 36632 } 36633 b.Kind = BlockFirst 36634 b.SetControl(nil) 36635 return true 36636 } 36637 // match: (EQ (FlagLT) yes no) 36638 // cond: 36639 // result: (First nil no yes) 36640 for { 36641 v := b.Control 36642 if v.Op != OpS390XFlagLT { 36643 break 36644 } 36645 b.Kind = BlockFirst 36646 b.SetControl(nil) 36647 b.swapSuccessors() 36648 return true 36649 } 36650 // match: (EQ (FlagGT) yes no) 36651 // cond: 36652 // result: (First nil no yes) 36653 for { 36654 v := b.Control 36655 if v.Op != OpS390XFlagGT { 36656 break 36657 } 36658 b.Kind = BlockFirst 36659 b.SetControl(nil) 36660 b.swapSuccessors() 36661 return true 36662 } 36663 case BlockS390XGE: 36664 // match: (GE (InvertFlags cmp) yes no) 36665 // cond: 36666 // result: (LE cmp yes no) 36667 for { 36668 v := b.Control 36669 if v.Op != OpS390XInvertFlags { 36670 break 36671 } 36672 cmp := v.Args[0] 36673 b.Kind = BlockS390XLE 36674 b.SetControl(cmp) 36675 return true 36676 } 36677 // match: (GE (FlagEQ) yes no) 36678 // cond: 36679 // result: (First nil yes no) 36680 for { 36681 v := b.Control 36682 if v.Op != OpS390XFlagEQ { 36683 break 36684 } 36685 b.Kind = BlockFirst 36686 b.SetControl(nil) 36687 return true 36688 } 36689 // match: (GE (FlagLT) yes no) 36690 // cond: 36691 // result: (First nil no yes) 36692 for { 36693 v := b.Control 36694 if v.Op != OpS390XFlagLT { 36695 break 36696 } 36697 b.Kind = BlockFirst 36698 b.SetControl(nil) 36699 b.swapSuccessors() 36700 return true 36701 } 36702 // match: (GE (FlagGT) yes no) 36703 // cond: 36704 // result: (First nil yes no) 36705 for { 36706 v := b.Control 36707 if v.Op != OpS390XFlagGT { 36708 break 36709 } 36710 b.Kind = BlockFirst 36711 b.SetControl(nil) 36712 return true 36713 } 36714 case BlockS390XGT: 36715 // match: (GT (InvertFlags cmp) yes no) 36716 // cond: 36717 // result: (LT cmp yes no) 36718 for { 36719 v := b.Control 36720 if v.Op != OpS390XInvertFlags { 36721 break 36722 } 36723 cmp := v.Args[0] 36724 b.Kind = BlockS390XLT 36725 b.SetControl(cmp) 36726 return true 36727 } 36728 // match: (GT (FlagEQ) yes no) 36729 // cond: 36730 // result: (First nil no yes) 36731 for { 36732 v := b.Control 36733 if v.Op != OpS390XFlagEQ { 36734 break 36735 } 36736 b.Kind = BlockFirst 36737 b.SetControl(nil) 36738 b.swapSuccessors() 36739 return true 36740 } 36741 // match: (GT (FlagLT) yes no) 36742 // cond: 36743 // result: (First nil no yes) 36744 for { 36745 v := b.Control 36746 if v.Op != OpS390XFlagLT { 36747 break 36748 } 36749 b.Kind = BlockFirst 36750 b.SetControl(nil) 36751 b.swapSuccessors() 36752 return true 36753 } 36754 // match: (GT (FlagGT) yes no) 36755 // cond: 36756 // result: (First nil yes no) 36757 for { 36758 v := b.Control 36759 if v.Op != OpS390XFlagGT { 36760 break 36761 } 36762 b.Kind = BlockFirst 36763 b.SetControl(nil) 36764 return true 36765 } 36766 case BlockIf: 36767 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36768 // cond: 36769 // result: (LT cmp yes no) 36770 for { 36771 v := b.Control 36772 if v.Op != OpS390XMOVDLT { 36773 break 36774 } 36775 _ = v.Args[2] 36776 v_0 := v.Args[0] 36777 if v_0.Op != OpS390XMOVDconst { 36778 break 36779 } 36780 if v_0.AuxInt != 0 { 36781 break 36782 } 36783 v_1 := v.Args[1] 36784 if v_1.Op != OpS390XMOVDconst { 36785 break 36786 } 36787 if v_1.AuxInt != 1 { 36788 break 36789 } 36790 cmp := v.Args[2] 36791 b.Kind = BlockS390XLT 36792 b.SetControl(cmp) 36793 return true 36794 } 36795 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36796 // cond: 36797 // result: (LE cmp yes no) 36798 for { 36799 v := b.Control 36800 if v.Op != OpS390XMOVDLE { 36801 break 36802 } 36803 _ = v.Args[2] 36804 v_0 := v.Args[0] 36805 if v_0.Op != OpS390XMOVDconst { 36806 break 36807 } 36808 if v_0.AuxInt != 0 { 36809 break 36810 } 36811 v_1 := v.Args[1] 36812 if v_1.Op != OpS390XMOVDconst { 36813 break 36814 } 36815 if v_1.AuxInt != 1 { 36816 break 36817 } 36818 cmp := v.Args[2] 36819 b.Kind = BlockS390XLE 36820 b.SetControl(cmp) 36821 return true 36822 } 36823 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36824 // cond: 36825 // result: (GT cmp yes no) 36826 for { 36827 v := b.Control 36828 if v.Op != OpS390XMOVDGT { 36829 break 36830 } 36831 _ = v.Args[2] 36832 v_0 := v.Args[0] 36833 if v_0.Op != OpS390XMOVDconst { 36834 break 36835 } 36836 if v_0.AuxInt != 0 { 36837 break 36838 } 36839 v_1 := v.Args[1] 36840 if v_1.Op != OpS390XMOVDconst { 36841 break 36842 } 36843 if v_1.AuxInt != 1 { 36844 break 36845 } 36846 cmp := v.Args[2] 36847 b.Kind = BlockS390XGT 36848 b.SetControl(cmp) 36849 return true 36850 } 36851 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36852 // cond: 36853 // result: (GE cmp yes no) 36854 for { 36855 v := b.Control 36856 if v.Op != OpS390XMOVDGE { 36857 break 36858 } 36859 _ = v.Args[2] 36860 v_0 := v.Args[0] 36861 if v_0.Op != OpS390XMOVDconst { 36862 break 36863 } 36864 if v_0.AuxInt != 0 { 36865 break 36866 } 36867 v_1 := v.Args[1] 36868 if v_1.Op != OpS390XMOVDconst { 36869 break 36870 } 36871 if v_1.AuxInt != 1 { 36872 break 36873 } 36874 cmp := v.Args[2] 36875 b.Kind = BlockS390XGE 36876 b.SetControl(cmp) 36877 return true 36878 } 36879 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36880 // cond: 36881 // result: (EQ cmp yes no) 36882 for { 36883 v := b.Control 36884 if v.Op != OpS390XMOVDEQ { 36885 break 36886 } 36887 _ = v.Args[2] 36888 v_0 := v.Args[0] 36889 if v_0.Op != OpS390XMOVDconst { 36890 break 36891 } 36892 if v_0.AuxInt != 0 { 36893 break 36894 } 36895 v_1 := v.Args[1] 36896 if v_1.Op != OpS390XMOVDconst { 36897 break 36898 } 36899 if v_1.AuxInt != 1 { 36900 break 36901 } 36902 cmp := v.Args[2] 36903 b.Kind = BlockS390XEQ 36904 b.SetControl(cmp) 36905 return true 36906 } 36907 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36908 // cond: 36909 // result: (NE cmp yes no) 36910 for { 36911 v := b.Control 36912 if v.Op != OpS390XMOVDNE { 36913 break 36914 } 36915 _ = v.Args[2] 36916 v_0 := v.Args[0] 36917 if v_0.Op != OpS390XMOVDconst { 36918 break 36919 } 36920 if v_0.AuxInt != 0 { 36921 break 36922 } 36923 v_1 := v.Args[1] 36924 if v_1.Op != OpS390XMOVDconst { 36925 break 36926 } 36927 if v_1.AuxInt != 1 { 36928 break 36929 } 36930 cmp := v.Args[2] 36931 b.Kind = BlockS390XNE 36932 b.SetControl(cmp) 36933 return true 36934 } 36935 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36936 // cond: 36937 // result: (GTF cmp yes no) 36938 for { 36939 v := b.Control 36940 if v.Op != OpS390XMOVDGTnoinv { 36941 break 36942 } 36943 _ = v.Args[2] 36944 v_0 := v.Args[0] 36945 if v_0.Op != OpS390XMOVDconst { 36946 break 36947 } 36948 if v_0.AuxInt != 0 { 36949 break 36950 } 36951 v_1 := v.Args[1] 36952 if v_1.Op != OpS390XMOVDconst { 36953 break 36954 } 36955 if v_1.AuxInt != 1 { 36956 break 36957 } 36958 cmp := v.Args[2] 36959 b.Kind = BlockS390XGTF 36960 b.SetControl(cmp) 36961 return true 36962 } 36963 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36964 // cond: 36965 // result: (GEF cmp yes no) 36966 for { 36967 v := b.Control 36968 if v.Op != OpS390XMOVDGEnoinv { 36969 break 36970 } 36971 _ = v.Args[2] 36972 v_0 := v.Args[0] 36973 if v_0.Op != OpS390XMOVDconst { 36974 break 36975 } 36976 if v_0.AuxInt != 0 { 36977 break 36978 } 36979 v_1 := v.Args[1] 36980 if v_1.Op != OpS390XMOVDconst { 36981 break 36982 } 36983 if v_1.AuxInt != 1 { 36984 break 36985 } 36986 cmp := v.Args[2] 36987 b.Kind = BlockS390XGEF 36988 b.SetControl(cmp) 36989 return true 36990 } 36991 // match: (If cond yes no) 36992 // cond: 36993 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 36994 for { 36995 v := b.Control 36996 _ = v 36997 cond := b.Control 36998 b.Kind = BlockS390XNE 36999 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 37000 v0.AuxInt = 0 37001 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 37002 v1.AddArg(cond) 37003 v0.AddArg(v1) 37004 b.SetControl(v0) 37005 return true 37006 } 37007 case BlockS390XLE: 37008 // match: (LE (InvertFlags cmp) yes no) 37009 // cond: 37010 // result: (GE cmp yes no) 37011 for { 37012 v := b.Control 37013 if v.Op != OpS390XInvertFlags { 37014 break 37015 } 37016 cmp := v.Args[0] 37017 b.Kind = BlockS390XGE 37018 b.SetControl(cmp) 37019 return true 37020 } 37021 // match: (LE (FlagEQ) yes no) 37022 // cond: 37023 // result: (First nil yes no) 37024 for { 37025 v := b.Control 37026 if v.Op != OpS390XFlagEQ { 37027 break 37028 } 37029 b.Kind = BlockFirst 37030 b.SetControl(nil) 37031 return true 37032 } 37033 // match: (LE (FlagLT) yes no) 37034 // cond: 37035 // result: (First nil yes no) 37036 for { 37037 v := b.Control 37038 if v.Op != OpS390XFlagLT { 37039 break 37040 } 37041 b.Kind = BlockFirst 37042 b.SetControl(nil) 37043 return true 37044 } 37045 // match: (LE (FlagGT) yes no) 37046 // cond: 37047 // result: (First nil no yes) 37048 for { 37049 v := b.Control 37050 if v.Op != OpS390XFlagGT { 37051 break 37052 } 37053 b.Kind = BlockFirst 37054 b.SetControl(nil) 37055 b.swapSuccessors() 37056 return true 37057 } 37058 case BlockS390XLT: 37059 // match: (LT (InvertFlags cmp) yes no) 37060 // cond: 37061 // result: (GT cmp yes no) 37062 for { 37063 v := b.Control 37064 if v.Op != OpS390XInvertFlags { 37065 break 37066 } 37067 cmp := v.Args[0] 37068 b.Kind = BlockS390XGT 37069 b.SetControl(cmp) 37070 return true 37071 } 37072 // match: (LT (FlagEQ) yes no) 37073 // cond: 37074 // result: (First nil no yes) 37075 for { 37076 v := b.Control 37077 if v.Op != OpS390XFlagEQ { 37078 break 37079 } 37080 b.Kind = BlockFirst 37081 b.SetControl(nil) 37082 b.swapSuccessors() 37083 return true 37084 } 37085 // match: (LT (FlagLT) yes no) 37086 // cond: 37087 // result: (First nil yes no) 37088 for { 37089 v := b.Control 37090 if v.Op != OpS390XFlagLT { 37091 break 37092 } 37093 b.Kind = BlockFirst 37094 b.SetControl(nil) 37095 return true 37096 } 37097 // match: (LT (FlagGT) yes no) 37098 // cond: 37099 // result: (First nil no yes) 37100 for { 37101 v := b.Control 37102 if v.Op != OpS390XFlagGT { 37103 break 37104 } 37105 b.Kind = BlockFirst 37106 b.SetControl(nil) 37107 b.swapSuccessors() 37108 return true 37109 } 37110 case BlockS390XNE: 37111 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37112 // cond: 37113 // result: (LT cmp yes no) 37114 for { 37115 v := b.Control 37116 if v.Op != OpS390XCMPWconst { 37117 break 37118 } 37119 if v.AuxInt != 0 { 37120 break 37121 } 37122 v_0 := v.Args[0] 37123 if v_0.Op != OpS390XMOVDLT { 37124 break 37125 } 37126 _ = v_0.Args[2] 37127 v_0_0 := v_0.Args[0] 37128 if v_0_0.Op != OpS390XMOVDconst { 37129 break 37130 } 37131 if v_0_0.AuxInt != 0 { 37132 break 37133 } 37134 v_0_1 := v_0.Args[1] 37135 if v_0_1.Op != OpS390XMOVDconst { 37136 break 37137 } 37138 if v_0_1.AuxInt != 1 { 37139 break 37140 } 37141 cmp := v_0.Args[2] 37142 b.Kind = BlockS390XLT 37143 b.SetControl(cmp) 37144 return true 37145 } 37146 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37147 // cond: 37148 // result: (LE cmp yes no) 37149 for { 37150 v := b.Control 37151 if v.Op != OpS390XCMPWconst { 37152 break 37153 } 37154 if v.AuxInt != 0 { 37155 break 37156 } 37157 v_0 := v.Args[0] 37158 if v_0.Op != OpS390XMOVDLE { 37159 break 37160 } 37161 _ = v_0.Args[2] 37162 v_0_0 := v_0.Args[0] 37163 if v_0_0.Op != OpS390XMOVDconst { 37164 break 37165 } 37166 if v_0_0.AuxInt != 0 { 37167 break 37168 } 37169 v_0_1 := v_0.Args[1] 37170 if v_0_1.Op != OpS390XMOVDconst { 37171 break 37172 } 37173 if v_0_1.AuxInt != 1 { 37174 break 37175 } 37176 cmp := v_0.Args[2] 37177 b.Kind = BlockS390XLE 37178 b.SetControl(cmp) 37179 return true 37180 } 37181 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37182 // cond: 37183 // result: (GT cmp yes no) 37184 for { 37185 v := b.Control 37186 if v.Op != OpS390XCMPWconst { 37187 break 37188 } 37189 if v.AuxInt != 0 { 37190 break 37191 } 37192 v_0 := v.Args[0] 37193 if v_0.Op != OpS390XMOVDGT { 37194 break 37195 } 37196 _ = v_0.Args[2] 37197 v_0_0 := v_0.Args[0] 37198 if v_0_0.Op != OpS390XMOVDconst { 37199 break 37200 } 37201 if v_0_0.AuxInt != 0 { 37202 break 37203 } 37204 v_0_1 := v_0.Args[1] 37205 if v_0_1.Op != OpS390XMOVDconst { 37206 break 37207 } 37208 if v_0_1.AuxInt != 1 { 37209 break 37210 } 37211 cmp := v_0.Args[2] 37212 b.Kind = BlockS390XGT 37213 b.SetControl(cmp) 37214 return true 37215 } 37216 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37217 // cond: 37218 // result: (GE cmp yes no) 37219 for { 37220 v := b.Control 37221 if v.Op != OpS390XCMPWconst { 37222 break 37223 } 37224 if v.AuxInt != 0 { 37225 break 37226 } 37227 v_0 := v.Args[0] 37228 if v_0.Op != OpS390XMOVDGE { 37229 break 37230 } 37231 _ = v_0.Args[2] 37232 v_0_0 := v_0.Args[0] 37233 if v_0_0.Op != OpS390XMOVDconst { 37234 break 37235 } 37236 if v_0_0.AuxInt != 0 { 37237 break 37238 } 37239 v_0_1 := v_0.Args[1] 37240 if v_0_1.Op != OpS390XMOVDconst { 37241 break 37242 } 37243 if v_0_1.AuxInt != 1 { 37244 break 37245 } 37246 cmp := v_0.Args[2] 37247 b.Kind = BlockS390XGE 37248 b.SetControl(cmp) 37249 return true 37250 } 37251 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37252 // cond: 37253 // result: (EQ cmp yes no) 37254 for { 37255 v := b.Control 37256 if v.Op != OpS390XCMPWconst { 37257 break 37258 } 37259 if v.AuxInt != 0 { 37260 break 37261 } 37262 v_0 := v.Args[0] 37263 if v_0.Op != OpS390XMOVDEQ { 37264 break 37265 } 37266 _ = v_0.Args[2] 37267 v_0_0 := v_0.Args[0] 37268 if v_0_0.Op != OpS390XMOVDconst { 37269 break 37270 } 37271 if v_0_0.AuxInt != 0 { 37272 break 37273 } 37274 v_0_1 := v_0.Args[1] 37275 if v_0_1.Op != OpS390XMOVDconst { 37276 break 37277 } 37278 if v_0_1.AuxInt != 1 { 37279 break 37280 } 37281 cmp := v_0.Args[2] 37282 b.Kind = BlockS390XEQ 37283 b.SetControl(cmp) 37284 return true 37285 } 37286 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37287 // cond: 37288 // result: (NE cmp yes no) 37289 for { 37290 v := b.Control 37291 if v.Op != OpS390XCMPWconst { 37292 break 37293 } 37294 if v.AuxInt != 0 { 37295 break 37296 } 37297 v_0 := v.Args[0] 37298 if v_0.Op != OpS390XMOVDNE { 37299 break 37300 } 37301 _ = v_0.Args[2] 37302 v_0_0 := v_0.Args[0] 37303 if v_0_0.Op != OpS390XMOVDconst { 37304 break 37305 } 37306 if v_0_0.AuxInt != 0 { 37307 break 37308 } 37309 v_0_1 := v_0.Args[1] 37310 if v_0_1.Op != OpS390XMOVDconst { 37311 break 37312 } 37313 if v_0_1.AuxInt != 1 { 37314 break 37315 } 37316 cmp := v_0.Args[2] 37317 b.Kind = BlockS390XNE 37318 b.SetControl(cmp) 37319 return true 37320 } 37321 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37322 // cond: 37323 // result: (GTF cmp yes no) 37324 for { 37325 v := b.Control 37326 if v.Op != OpS390XCMPWconst { 37327 break 37328 } 37329 if v.AuxInt != 0 { 37330 break 37331 } 37332 v_0 := v.Args[0] 37333 if v_0.Op != OpS390XMOVDGTnoinv { 37334 break 37335 } 37336 _ = v_0.Args[2] 37337 v_0_0 := v_0.Args[0] 37338 if v_0_0.Op != OpS390XMOVDconst { 37339 break 37340 } 37341 if v_0_0.AuxInt != 0 { 37342 break 37343 } 37344 v_0_1 := v_0.Args[1] 37345 if v_0_1.Op != OpS390XMOVDconst { 37346 break 37347 } 37348 if v_0_1.AuxInt != 1 { 37349 break 37350 } 37351 cmp := v_0.Args[2] 37352 b.Kind = BlockS390XGTF 37353 b.SetControl(cmp) 37354 return true 37355 } 37356 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37357 // cond: 37358 // result: (GEF cmp yes no) 37359 for { 37360 v := b.Control 37361 if v.Op != OpS390XCMPWconst { 37362 break 37363 } 37364 if v.AuxInt != 0 { 37365 break 37366 } 37367 v_0 := v.Args[0] 37368 if v_0.Op != OpS390XMOVDGEnoinv { 37369 break 37370 } 37371 _ = v_0.Args[2] 37372 v_0_0 := v_0.Args[0] 37373 if v_0_0.Op != OpS390XMOVDconst { 37374 break 37375 } 37376 if v_0_0.AuxInt != 0 { 37377 break 37378 } 37379 v_0_1 := v_0.Args[1] 37380 if v_0_1.Op != OpS390XMOVDconst { 37381 break 37382 } 37383 if v_0_1.AuxInt != 1 { 37384 break 37385 } 37386 cmp := v_0.Args[2] 37387 b.Kind = BlockS390XGEF 37388 b.SetControl(cmp) 37389 return true 37390 } 37391 // match: (NE (InvertFlags cmp) yes no) 37392 // cond: 37393 // result: (NE cmp yes no) 37394 for { 37395 v := b.Control 37396 if v.Op != OpS390XInvertFlags { 37397 break 37398 } 37399 cmp := v.Args[0] 37400 b.Kind = BlockS390XNE 37401 b.SetControl(cmp) 37402 return true 37403 } 37404 // match: (NE (FlagEQ) yes no) 37405 // cond: 37406 // result: (First nil no yes) 37407 for { 37408 v := b.Control 37409 if v.Op != OpS390XFlagEQ { 37410 break 37411 } 37412 b.Kind = BlockFirst 37413 b.SetControl(nil) 37414 b.swapSuccessors() 37415 return true 37416 } 37417 // match: (NE (FlagLT) yes no) 37418 // cond: 37419 // result: (First nil yes no) 37420 for { 37421 v := b.Control 37422 if v.Op != OpS390XFlagLT { 37423 break 37424 } 37425 b.Kind = BlockFirst 37426 b.SetControl(nil) 37427 return true 37428 } 37429 // match: (NE (FlagGT) yes no) 37430 // cond: 37431 // result: (First nil yes no) 37432 for { 37433 v := b.Control 37434 if v.Op != OpS390XFlagGT { 37435 break 37436 } 37437 b.Kind = BlockFirst 37438 b.SetControl(nil) 37439 return true 37440 } 37441 } 37442 return false 37443 }