github.com/mattn/go@v0.0.0-20171011075504-07f7db3ea99f/src/cmd/compile/internal/ssa/rewriteS390X.go (about) 1 // Code generated from gen/S390X.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueS390X(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValueS390X_OpAdd16_0(v) 20 case OpAdd32: 21 return rewriteValueS390X_OpAdd32_0(v) 22 case OpAdd32F: 23 return rewriteValueS390X_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValueS390X_OpAdd64_0(v) 26 case OpAdd64F: 27 return rewriteValueS390X_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValueS390X_OpAdd8_0(v) 30 case OpAddPtr: 31 return rewriteValueS390X_OpAddPtr_0(v) 32 case OpAddr: 33 return rewriteValueS390X_OpAddr_0(v) 34 case OpAnd16: 35 return rewriteValueS390X_OpAnd16_0(v) 36 case OpAnd32: 37 return rewriteValueS390X_OpAnd32_0(v) 38 case OpAnd64: 39 return rewriteValueS390X_OpAnd64_0(v) 40 case OpAnd8: 41 return rewriteValueS390X_OpAnd8_0(v) 42 case OpAndB: 43 return rewriteValueS390X_OpAndB_0(v) 44 case OpAtomicAdd32: 45 return rewriteValueS390X_OpAtomicAdd32_0(v) 46 case OpAtomicAdd64: 47 return rewriteValueS390X_OpAtomicAdd64_0(v) 48 case OpAtomicCompareAndSwap32: 49 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 50 case OpAtomicCompareAndSwap64: 51 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 52 case OpAtomicExchange32: 53 return rewriteValueS390X_OpAtomicExchange32_0(v) 54 case OpAtomicExchange64: 55 return rewriteValueS390X_OpAtomicExchange64_0(v) 56 case OpAtomicLoad32: 57 return rewriteValueS390X_OpAtomicLoad32_0(v) 58 case OpAtomicLoad64: 59 return rewriteValueS390X_OpAtomicLoad64_0(v) 60 case OpAtomicLoadPtr: 61 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 62 case OpAtomicStore32: 63 return rewriteValueS390X_OpAtomicStore32_0(v) 64 case OpAtomicStore64: 65 return rewriteValueS390X_OpAtomicStore64_0(v) 66 case OpAtomicStorePtrNoWB: 67 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 68 case OpAvg64u: 69 return rewriteValueS390X_OpAvg64u_0(v) 70 case OpBitLen64: 71 return rewriteValueS390X_OpBitLen64_0(v) 72 case OpBswap32: 73 return rewriteValueS390X_OpBswap32_0(v) 74 case OpBswap64: 75 return rewriteValueS390X_OpBswap64_0(v) 76 case OpCeil: 77 return rewriteValueS390X_OpCeil_0(v) 78 case OpClosureCall: 79 return rewriteValueS390X_OpClosureCall_0(v) 80 case OpCom16: 81 return rewriteValueS390X_OpCom16_0(v) 82 case OpCom32: 83 return rewriteValueS390X_OpCom32_0(v) 84 case OpCom64: 85 return rewriteValueS390X_OpCom64_0(v) 86 case OpCom8: 87 return rewriteValueS390X_OpCom8_0(v) 88 case OpConst16: 89 return rewriteValueS390X_OpConst16_0(v) 90 case OpConst32: 91 return rewriteValueS390X_OpConst32_0(v) 92 case OpConst32F: 93 return rewriteValueS390X_OpConst32F_0(v) 94 case OpConst64: 95 return rewriteValueS390X_OpConst64_0(v) 96 case OpConst64F: 97 return rewriteValueS390X_OpConst64F_0(v) 98 case OpConst8: 99 return rewriteValueS390X_OpConst8_0(v) 100 case OpConstBool: 101 return rewriteValueS390X_OpConstBool_0(v) 102 case OpConstNil: 103 return rewriteValueS390X_OpConstNil_0(v) 104 case OpConvert: 105 return rewriteValueS390X_OpConvert_0(v) 106 case OpCtz32: 107 return rewriteValueS390X_OpCtz32_0(v) 108 case OpCtz64: 109 return rewriteValueS390X_OpCtz64_0(v) 110 case OpCvt32Fto32: 111 return rewriteValueS390X_OpCvt32Fto32_0(v) 112 case OpCvt32Fto64: 113 return rewriteValueS390X_OpCvt32Fto64_0(v) 114 case OpCvt32Fto64F: 115 return rewriteValueS390X_OpCvt32Fto64F_0(v) 116 case OpCvt32to32F: 117 return rewriteValueS390X_OpCvt32to32F_0(v) 118 case OpCvt32to64F: 119 return rewriteValueS390X_OpCvt32to64F_0(v) 120 case OpCvt64Fto32: 121 return rewriteValueS390X_OpCvt64Fto32_0(v) 122 case OpCvt64Fto32F: 123 return rewriteValueS390X_OpCvt64Fto32F_0(v) 124 case OpCvt64Fto64: 125 return rewriteValueS390X_OpCvt64Fto64_0(v) 126 case OpCvt64to32F: 127 return rewriteValueS390X_OpCvt64to32F_0(v) 128 case OpCvt64to64F: 129 return rewriteValueS390X_OpCvt64to64F_0(v) 130 case OpDiv16: 131 return rewriteValueS390X_OpDiv16_0(v) 132 case OpDiv16u: 133 return rewriteValueS390X_OpDiv16u_0(v) 134 case OpDiv32: 135 return rewriteValueS390X_OpDiv32_0(v) 136 case OpDiv32F: 137 return rewriteValueS390X_OpDiv32F_0(v) 138 case OpDiv32u: 139 return rewriteValueS390X_OpDiv32u_0(v) 140 case OpDiv64: 141 return rewriteValueS390X_OpDiv64_0(v) 142 case OpDiv64F: 143 return rewriteValueS390X_OpDiv64F_0(v) 144 case OpDiv64u: 145 return rewriteValueS390X_OpDiv64u_0(v) 146 case OpDiv8: 147 return rewriteValueS390X_OpDiv8_0(v) 148 case OpDiv8u: 149 return rewriteValueS390X_OpDiv8u_0(v) 150 case OpEq16: 151 return rewriteValueS390X_OpEq16_0(v) 152 case OpEq32: 153 return rewriteValueS390X_OpEq32_0(v) 154 case OpEq32F: 155 return rewriteValueS390X_OpEq32F_0(v) 156 case OpEq64: 157 return rewriteValueS390X_OpEq64_0(v) 158 case OpEq64F: 159 return rewriteValueS390X_OpEq64F_0(v) 160 case OpEq8: 161 return rewriteValueS390X_OpEq8_0(v) 162 case OpEqB: 163 return rewriteValueS390X_OpEqB_0(v) 164 case OpEqPtr: 165 return rewriteValueS390X_OpEqPtr_0(v) 166 case OpFloor: 167 return rewriteValueS390X_OpFloor_0(v) 168 case OpGeq16: 169 return rewriteValueS390X_OpGeq16_0(v) 170 case OpGeq16U: 171 return rewriteValueS390X_OpGeq16U_0(v) 172 case OpGeq32: 173 return rewriteValueS390X_OpGeq32_0(v) 174 case OpGeq32F: 175 return rewriteValueS390X_OpGeq32F_0(v) 176 case OpGeq32U: 177 return rewriteValueS390X_OpGeq32U_0(v) 178 case OpGeq64: 179 return rewriteValueS390X_OpGeq64_0(v) 180 case OpGeq64F: 181 return rewriteValueS390X_OpGeq64F_0(v) 182 case OpGeq64U: 183 return rewriteValueS390X_OpGeq64U_0(v) 184 case OpGeq8: 185 return rewriteValueS390X_OpGeq8_0(v) 186 case OpGeq8U: 187 return rewriteValueS390X_OpGeq8U_0(v) 188 case OpGetCallerSP: 189 return rewriteValueS390X_OpGetCallerSP_0(v) 190 case OpGetClosurePtr: 191 return rewriteValueS390X_OpGetClosurePtr_0(v) 192 case OpGetG: 193 return rewriteValueS390X_OpGetG_0(v) 194 case OpGreater16: 195 return rewriteValueS390X_OpGreater16_0(v) 196 case OpGreater16U: 197 return rewriteValueS390X_OpGreater16U_0(v) 198 case OpGreater32: 199 return rewriteValueS390X_OpGreater32_0(v) 200 case OpGreater32F: 201 return rewriteValueS390X_OpGreater32F_0(v) 202 case OpGreater32U: 203 return rewriteValueS390X_OpGreater32U_0(v) 204 case OpGreater64: 205 return rewriteValueS390X_OpGreater64_0(v) 206 case OpGreater64F: 207 return rewriteValueS390X_OpGreater64F_0(v) 208 case OpGreater64U: 209 return rewriteValueS390X_OpGreater64U_0(v) 210 case OpGreater8: 211 return rewriteValueS390X_OpGreater8_0(v) 212 case OpGreater8U: 213 return rewriteValueS390X_OpGreater8U_0(v) 214 case OpHmul32: 215 return rewriteValueS390X_OpHmul32_0(v) 216 case OpHmul32u: 217 return rewriteValueS390X_OpHmul32u_0(v) 218 case OpHmul64: 219 return rewriteValueS390X_OpHmul64_0(v) 220 case OpHmul64u: 221 return rewriteValueS390X_OpHmul64u_0(v) 222 case OpITab: 223 return rewriteValueS390X_OpITab_0(v) 224 case OpInterCall: 225 return rewriteValueS390X_OpInterCall_0(v) 226 case OpIsInBounds: 227 return rewriteValueS390X_OpIsInBounds_0(v) 228 case OpIsNonNil: 229 return rewriteValueS390X_OpIsNonNil_0(v) 230 case OpIsSliceInBounds: 231 return rewriteValueS390X_OpIsSliceInBounds_0(v) 232 case OpLeq16: 233 return rewriteValueS390X_OpLeq16_0(v) 234 case OpLeq16U: 235 return rewriteValueS390X_OpLeq16U_0(v) 236 case OpLeq32: 237 return rewriteValueS390X_OpLeq32_0(v) 238 case OpLeq32F: 239 return rewriteValueS390X_OpLeq32F_0(v) 240 case OpLeq32U: 241 return rewriteValueS390X_OpLeq32U_0(v) 242 case OpLeq64: 243 return rewriteValueS390X_OpLeq64_0(v) 244 case OpLeq64F: 245 return rewriteValueS390X_OpLeq64F_0(v) 246 case OpLeq64U: 247 return rewriteValueS390X_OpLeq64U_0(v) 248 case OpLeq8: 249 return rewriteValueS390X_OpLeq8_0(v) 250 case OpLeq8U: 251 return rewriteValueS390X_OpLeq8U_0(v) 252 case OpLess16: 253 return rewriteValueS390X_OpLess16_0(v) 254 case OpLess16U: 255 return rewriteValueS390X_OpLess16U_0(v) 256 case OpLess32: 257 return rewriteValueS390X_OpLess32_0(v) 258 case OpLess32F: 259 return rewriteValueS390X_OpLess32F_0(v) 260 case OpLess32U: 261 return rewriteValueS390X_OpLess32U_0(v) 262 case OpLess64: 263 return rewriteValueS390X_OpLess64_0(v) 264 case OpLess64F: 265 return rewriteValueS390X_OpLess64F_0(v) 266 case OpLess64U: 267 return rewriteValueS390X_OpLess64U_0(v) 268 case OpLess8: 269 return rewriteValueS390X_OpLess8_0(v) 270 case OpLess8U: 271 return rewriteValueS390X_OpLess8U_0(v) 272 case OpLoad: 273 return rewriteValueS390X_OpLoad_0(v) 274 case OpLsh16x16: 275 return rewriteValueS390X_OpLsh16x16_0(v) 276 case OpLsh16x32: 277 return rewriteValueS390X_OpLsh16x32_0(v) 278 case OpLsh16x64: 279 return rewriteValueS390X_OpLsh16x64_0(v) 280 case OpLsh16x8: 281 return rewriteValueS390X_OpLsh16x8_0(v) 282 case OpLsh32x16: 283 return rewriteValueS390X_OpLsh32x16_0(v) 284 case OpLsh32x32: 285 return rewriteValueS390X_OpLsh32x32_0(v) 286 case OpLsh32x64: 287 return rewriteValueS390X_OpLsh32x64_0(v) 288 case OpLsh32x8: 289 return rewriteValueS390X_OpLsh32x8_0(v) 290 case OpLsh64x16: 291 return rewriteValueS390X_OpLsh64x16_0(v) 292 case OpLsh64x32: 293 return rewriteValueS390X_OpLsh64x32_0(v) 294 case OpLsh64x64: 295 return rewriteValueS390X_OpLsh64x64_0(v) 296 case OpLsh64x8: 297 return rewriteValueS390X_OpLsh64x8_0(v) 298 case OpLsh8x16: 299 return rewriteValueS390X_OpLsh8x16_0(v) 300 case OpLsh8x32: 301 return rewriteValueS390X_OpLsh8x32_0(v) 302 case OpLsh8x64: 303 return rewriteValueS390X_OpLsh8x64_0(v) 304 case OpLsh8x8: 305 return rewriteValueS390X_OpLsh8x8_0(v) 306 case OpMod16: 307 return rewriteValueS390X_OpMod16_0(v) 308 case OpMod16u: 309 return rewriteValueS390X_OpMod16u_0(v) 310 case OpMod32: 311 return rewriteValueS390X_OpMod32_0(v) 312 case OpMod32u: 313 return rewriteValueS390X_OpMod32u_0(v) 314 case OpMod64: 315 return rewriteValueS390X_OpMod64_0(v) 316 case OpMod64u: 317 return rewriteValueS390X_OpMod64u_0(v) 318 case OpMod8: 319 return rewriteValueS390X_OpMod8_0(v) 320 case OpMod8u: 321 return rewriteValueS390X_OpMod8u_0(v) 322 case OpMove: 323 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 324 case OpMul16: 325 return rewriteValueS390X_OpMul16_0(v) 326 case OpMul32: 327 return rewriteValueS390X_OpMul32_0(v) 328 case OpMul32F: 329 return rewriteValueS390X_OpMul32F_0(v) 330 case OpMul64: 331 return rewriteValueS390X_OpMul64_0(v) 332 case OpMul64F: 333 return rewriteValueS390X_OpMul64F_0(v) 334 case OpMul8: 335 return rewriteValueS390X_OpMul8_0(v) 336 case OpNeg16: 337 return rewriteValueS390X_OpNeg16_0(v) 338 case OpNeg32: 339 return rewriteValueS390X_OpNeg32_0(v) 340 case OpNeg32F: 341 return rewriteValueS390X_OpNeg32F_0(v) 342 case OpNeg64: 343 return rewriteValueS390X_OpNeg64_0(v) 344 case OpNeg64F: 345 return rewriteValueS390X_OpNeg64F_0(v) 346 case OpNeg8: 347 return rewriteValueS390X_OpNeg8_0(v) 348 case OpNeq16: 349 return rewriteValueS390X_OpNeq16_0(v) 350 case OpNeq32: 351 return rewriteValueS390X_OpNeq32_0(v) 352 case OpNeq32F: 353 return rewriteValueS390X_OpNeq32F_0(v) 354 case OpNeq64: 355 return rewriteValueS390X_OpNeq64_0(v) 356 case OpNeq64F: 357 return rewriteValueS390X_OpNeq64F_0(v) 358 case OpNeq8: 359 return rewriteValueS390X_OpNeq8_0(v) 360 case OpNeqB: 361 return rewriteValueS390X_OpNeqB_0(v) 362 case OpNeqPtr: 363 return rewriteValueS390X_OpNeqPtr_0(v) 364 case OpNilCheck: 365 return rewriteValueS390X_OpNilCheck_0(v) 366 case OpNot: 367 return rewriteValueS390X_OpNot_0(v) 368 case OpOffPtr: 369 return rewriteValueS390X_OpOffPtr_0(v) 370 case OpOr16: 371 return rewriteValueS390X_OpOr16_0(v) 372 case OpOr32: 373 return rewriteValueS390X_OpOr32_0(v) 374 case OpOr64: 375 return rewriteValueS390X_OpOr64_0(v) 376 case OpOr8: 377 return rewriteValueS390X_OpOr8_0(v) 378 case OpOrB: 379 return rewriteValueS390X_OpOrB_0(v) 380 case OpRound: 381 return rewriteValueS390X_OpRound_0(v) 382 case OpRound32F: 383 return rewriteValueS390X_OpRound32F_0(v) 384 case OpRound64F: 385 return rewriteValueS390X_OpRound64F_0(v) 386 case OpRsh16Ux16: 387 return rewriteValueS390X_OpRsh16Ux16_0(v) 388 case OpRsh16Ux32: 389 return rewriteValueS390X_OpRsh16Ux32_0(v) 390 case OpRsh16Ux64: 391 return rewriteValueS390X_OpRsh16Ux64_0(v) 392 case OpRsh16Ux8: 393 return rewriteValueS390X_OpRsh16Ux8_0(v) 394 case OpRsh16x16: 395 return rewriteValueS390X_OpRsh16x16_0(v) 396 case OpRsh16x32: 397 return rewriteValueS390X_OpRsh16x32_0(v) 398 case OpRsh16x64: 399 return rewriteValueS390X_OpRsh16x64_0(v) 400 case OpRsh16x8: 401 return rewriteValueS390X_OpRsh16x8_0(v) 402 case OpRsh32Ux16: 403 return rewriteValueS390X_OpRsh32Ux16_0(v) 404 case OpRsh32Ux32: 405 return rewriteValueS390X_OpRsh32Ux32_0(v) 406 case OpRsh32Ux64: 407 return rewriteValueS390X_OpRsh32Ux64_0(v) 408 case OpRsh32Ux8: 409 return rewriteValueS390X_OpRsh32Ux8_0(v) 410 case OpRsh32x16: 411 return rewriteValueS390X_OpRsh32x16_0(v) 412 case OpRsh32x32: 413 return rewriteValueS390X_OpRsh32x32_0(v) 414 case OpRsh32x64: 415 return rewriteValueS390X_OpRsh32x64_0(v) 416 case OpRsh32x8: 417 return rewriteValueS390X_OpRsh32x8_0(v) 418 case OpRsh64Ux16: 419 return rewriteValueS390X_OpRsh64Ux16_0(v) 420 case OpRsh64Ux32: 421 return rewriteValueS390X_OpRsh64Ux32_0(v) 422 case OpRsh64Ux64: 423 return rewriteValueS390X_OpRsh64Ux64_0(v) 424 case OpRsh64Ux8: 425 return rewriteValueS390X_OpRsh64Ux8_0(v) 426 case OpRsh64x16: 427 return rewriteValueS390X_OpRsh64x16_0(v) 428 case OpRsh64x32: 429 return rewriteValueS390X_OpRsh64x32_0(v) 430 case OpRsh64x64: 431 return rewriteValueS390X_OpRsh64x64_0(v) 432 case OpRsh64x8: 433 return rewriteValueS390X_OpRsh64x8_0(v) 434 case OpRsh8Ux16: 435 return rewriteValueS390X_OpRsh8Ux16_0(v) 436 case OpRsh8Ux32: 437 return rewriteValueS390X_OpRsh8Ux32_0(v) 438 case OpRsh8Ux64: 439 return rewriteValueS390X_OpRsh8Ux64_0(v) 440 case OpRsh8Ux8: 441 return rewriteValueS390X_OpRsh8Ux8_0(v) 442 case OpRsh8x16: 443 return rewriteValueS390X_OpRsh8x16_0(v) 444 case OpRsh8x32: 445 return rewriteValueS390X_OpRsh8x32_0(v) 446 case OpRsh8x64: 447 return rewriteValueS390X_OpRsh8x64_0(v) 448 case OpRsh8x8: 449 return rewriteValueS390X_OpRsh8x8_0(v) 450 case OpS390XADD: 451 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 452 case OpS390XADDW: 453 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 454 case OpS390XADDWconst: 455 return rewriteValueS390X_OpS390XADDWconst_0(v) 456 case OpS390XADDconst: 457 return rewriteValueS390X_OpS390XADDconst_0(v) 458 case OpS390XAND: 459 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 460 case OpS390XANDW: 461 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 462 case OpS390XANDWconst: 463 return rewriteValueS390X_OpS390XANDWconst_0(v) 464 case OpS390XANDconst: 465 return rewriteValueS390X_OpS390XANDconst_0(v) 466 case OpS390XCMP: 467 return rewriteValueS390X_OpS390XCMP_0(v) 468 case OpS390XCMPU: 469 return rewriteValueS390X_OpS390XCMPU_0(v) 470 case OpS390XCMPUconst: 471 return rewriteValueS390X_OpS390XCMPUconst_0(v) 472 case OpS390XCMPW: 473 return rewriteValueS390X_OpS390XCMPW_0(v) 474 case OpS390XCMPWU: 475 return rewriteValueS390X_OpS390XCMPWU_0(v) 476 case OpS390XCMPWUconst: 477 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 478 case OpS390XCMPWconst: 479 return rewriteValueS390X_OpS390XCMPWconst_0(v) 480 case OpS390XCMPconst: 481 return rewriteValueS390X_OpS390XCMPconst_0(v) 482 case OpS390XFADD: 483 return rewriteValueS390X_OpS390XFADD_0(v) 484 case OpS390XFADDS: 485 return rewriteValueS390X_OpS390XFADDS_0(v) 486 case OpS390XFMOVDload: 487 return rewriteValueS390X_OpS390XFMOVDload_0(v) 488 case OpS390XFMOVDloadidx: 489 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 490 case OpS390XFMOVDstore: 491 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 492 case OpS390XFMOVDstoreidx: 493 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 494 case OpS390XFMOVSload: 495 return rewriteValueS390X_OpS390XFMOVSload_0(v) 496 case OpS390XFMOVSloadidx: 497 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 498 case OpS390XFMOVSstore: 499 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 500 case OpS390XFMOVSstoreidx: 501 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 502 case OpS390XFSUB: 503 return rewriteValueS390X_OpS390XFSUB_0(v) 504 case OpS390XFSUBS: 505 return rewriteValueS390X_OpS390XFSUBS_0(v) 506 case OpS390XLoweredRound32F: 507 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 508 case OpS390XLoweredRound64F: 509 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 510 case OpS390XMOVBZload: 511 return rewriteValueS390X_OpS390XMOVBZload_0(v) 512 case OpS390XMOVBZloadidx: 513 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 514 case OpS390XMOVBZreg: 515 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 516 case OpS390XMOVBload: 517 return rewriteValueS390X_OpS390XMOVBload_0(v) 518 case OpS390XMOVBreg: 519 return rewriteValueS390X_OpS390XMOVBreg_0(v) 520 case OpS390XMOVBstore: 521 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 522 case OpS390XMOVBstoreconst: 523 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 524 case OpS390XMOVBstoreidx: 525 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 526 case OpS390XMOVDEQ: 527 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 528 case OpS390XMOVDGE: 529 return rewriteValueS390X_OpS390XMOVDGE_0(v) 530 case OpS390XMOVDGT: 531 return rewriteValueS390X_OpS390XMOVDGT_0(v) 532 case OpS390XMOVDLE: 533 return rewriteValueS390X_OpS390XMOVDLE_0(v) 534 case OpS390XMOVDLT: 535 return rewriteValueS390X_OpS390XMOVDLT_0(v) 536 case OpS390XMOVDNE: 537 return rewriteValueS390X_OpS390XMOVDNE_0(v) 538 case OpS390XMOVDaddridx: 539 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 540 case OpS390XMOVDload: 541 return rewriteValueS390X_OpS390XMOVDload_0(v) 542 case OpS390XMOVDloadidx: 543 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 544 case OpS390XMOVDnop: 545 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 546 case OpS390XMOVDreg: 547 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 548 case OpS390XMOVDstore: 549 return rewriteValueS390X_OpS390XMOVDstore_0(v) 550 case OpS390XMOVDstoreconst: 551 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 552 case OpS390XMOVDstoreidx: 553 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 554 case OpS390XMOVHBRstore: 555 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 556 case OpS390XMOVHBRstoreidx: 557 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 558 case OpS390XMOVHZload: 559 return rewriteValueS390X_OpS390XMOVHZload_0(v) 560 case OpS390XMOVHZloadidx: 561 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 562 case OpS390XMOVHZreg: 563 return rewriteValueS390X_OpS390XMOVHZreg_0(v) 564 case OpS390XMOVHload: 565 return rewriteValueS390X_OpS390XMOVHload_0(v) 566 case OpS390XMOVHreg: 567 return rewriteValueS390X_OpS390XMOVHreg_0(v) 568 case OpS390XMOVHstore: 569 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 570 case OpS390XMOVHstoreconst: 571 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 572 case OpS390XMOVHstoreidx: 573 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 574 case OpS390XMOVWBRstore: 575 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 576 case OpS390XMOVWBRstoreidx: 577 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 578 case OpS390XMOVWZload: 579 return rewriteValueS390X_OpS390XMOVWZload_0(v) 580 case OpS390XMOVWZloadidx: 581 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 582 case OpS390XMOVWZreg: 583 return rewriteValueS390X_OpS390XMOVWZreg_0(v) 584 case OpS390XMOVWload: 585 return rewriteValueS390X_OpS390XMOVWload_0(v) 586 case OpS390XMOVWreg: 587 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 588 case OpS390XMOVWstore: 589 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 590 case OpS390XMOVWstoreconst: 591 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 592 case OpS390XMOVWstoreidx: 593 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 594 case OpS390XMULLD: 595 return rewriteValueS390X_OpS390XMULLD_0(v) 596 case OpS390XMULLDconst: 597 return rewriteValueS390X_OpS390XMULLDconst_0(v) 598 case OpS390XMULLW: 599 return rewriteValueS390X_OpS390XMULLW_0(v) 600 case OpS390XMULLWconst: 601 return rewriteValueS390X_OpS390XMULLWconst_0(v) 602 case OpS390XNEG: 603 return rewriteValueS390X_OpS390XNEG_0(v) 604 case OpS390XNEGW: 605 return rewriteValueS390X_OpS390XNEGW_0(v) 606 case OpS390XNOT: 607 return rewriteValueS390X_OpS390XNOT_0(v) 608 case OpS390XNOTW: 609 return rewriteValueS390X_OpS390XNOTW_0(v) 610 case OpS390XOR: 611 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) 612 case OpS390XORW: 613 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) 614 case OpS390XORWconst: 615 return rewriteValueS390X_OpS390XORWconst_0(v) 616 case OpS390XORconst: 617 return rewriteValueS390X_OpS390XORconst_0(v) 618 case OpS390XSLD: 619 return rewriteValueS390X_OpS390XSLD_0(v) 620 case OpS390XSLW: 621 return rewriteValueS390X_OpS390XSLW_0(v) 622 case OpS390XSRAD: 623 return rewriteValueS390X_OpS390XSRAD_0(v) 624 case OpS390XSRADconst: 625 return rewriteValueS390X_OpS390XSRADconst_0(v) 626 case OpS390XSRAW: 627 return rewriteValueS390X_OpS390XSRAW_0(v) 628 case OpS390XSRAWconst: 629 return rewriteValueS390X_OpS390XSRAWconst_0(v) 630 case OpS390XSRD: 631 return rewriteValueS390X_OpS390XSRD_0(v) 632 case OpS390XSRW: 633 return rewriteValueS390X_OpS390XSRW_0(v) 634 case OpS390XSTM2: 635 return rewriteValueS390X_OpS390XSTM2_0(v) 636 case OpS390XSTMG2: 637 return rewriteValueS390X_OpS390XSTMG2_0(v) 638 case OpS390XSUB: 639 return rewriteValueS390X_OpS390XSUB_0(v) 640 case OpS390XSUBEWcarrymask: 641 return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v) 642 case OpS390XSUBEcarrymask: 643 return rewriteValueS390X_OpS390XSUBEcarrymask_0(v) 644 case OpS390XSUBW: 645 return rewriteValueS390X_OpS390XSUBW_0(v) 646 case OpS390XSUBWconst: 647 return rewriteValueS390X_OpS390XSUBWconst_0(v) 648 case OpS390XSUBconst: 649 return rewriteValueS390X_OpS390XSUBconst_0(v) 650 case OpS390XXOR: 651 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 652 case OpS390XXORW: 653 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 654 case OpS390XXORWconst: 655 return rewriteValueS390X_OpS390XXORWconst_0(v) 656 case OpS390XXORconst: 657 return rewriteValueS390X_OpS390XXORconst_0(v) 658 case OpSelect0: 659 return rewriteValueS390X_OpSelect0_0(v) 660 case OpSelect1: 661 return rewriteValueS390X_OpSelect1_0(v) 662 case OpSignExt16to32: 663 return rewriteValueS390X_OpSignExt16to32_0(v) 664 case OpSignExt16to64: 665 return rewriteValueS390X_OpSignExt16to64_0(v) 666 case OpSignExt32to64: 667 return rewriteValueS390X_OpSignExt32to64_0(v) 668 case OpSignExt8to16: 669 return rewriteValueS390X_OpSignExt8to16_0(v) 670 case OpSignExt8to32: 671 return rewriteValueS390X_OpSignExt8to32_0(v) 672 case OpSignExt8to64: 673 return rewriteValueS390X_OpSignExt8to64_0(v) 674 case OpSlicemask: 675 return rewriteValueS390X_OpSlicemask_0(v) 676 case OpSqrt: 677 return rewriteValueS390X_OpSqrt_0(v) 678 case OpStaticCall: 679 return rewriteValueS390X_OpStaticCall_0(v) 680 case OpStore: 681 return rewriteValueS390X_OpStore_0(v) 682 case OpSub16: 683 return rewriteValueS390X_OpSub16_0(v) 684 case OpSub32: 685 return rewriteValueS390X_OpSub32_0(v) 686 case OpSub32F: 687 return rewriteValueS390X_OpSub32F_0(v) 688 case OpSub64: 689 return rewriteValueS390X_OpSub64_0(v) 690 case OpSub64F: 691 return rewriteValueS390X_OpSub64F_0(v) 692 case OpSub8: 693 return rewriteValueS390X_OpSub8_0(v) 694 case OpSubPtr: 695 return rewriteValueS390X_OpSubPtr_0(v) 696 case OpTrunc: 697 return rewriteValueS390X_OpTrunc_0(v) 698 case OpTrunc16to8: 699 return rewriteValueS390X_OpTrunc16to8_0(v) 700 case OpTrunc32to16: 701 return rewriteValueS390X_OpTrunc32to16_0(v) 702 case OpTrunc32to8: 703 return rewriteValueS390X_OpTrunc32to8_0(v) 704 case OpTrunc64to16: 705 return rewriteValueS390X_OpTrunc64to16_0(v) 706 case OpTrunc64to32: 707 return rewriteValueS390X_OpTrunc64to32_0(v) 708 case OpTrunc64to8: 709 return rewriteValueS390X_OpTrunc64to8_0(v) 710 case OpXor16: 711 return rewriteValueS390X_OpXor16_0(v) 712 case OpXor32: 713 return rewriteValueS390X_OpXor32_0(v) 714 case OpXor64: 715 return rewriteValueS390X_OpXor64_0(v) 716 case OpXor8: 717 return rewriteValueS390X_OpXor8_0(v) 718 case OpZero: 719 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 720 case OpZeroExt16to32: 721 return rewriteValueS390X_OpZeroExt16to32_0(v) 722 case OpZeroExt16to64: 723 return rewriteValueS390X_OpZeroExt16to64_0(v) 724 case OpZeroExt32to64: 725 return rewriteValueS390X_OpZeroExt32to64_0(v) 726 case OpZeroExt8to16: 727 return rewriteValueS390X_OpZeroExt8to16_0(v) 728 case OpZeroExt8to32: 729 return rewriteValueS390X_OpZeroExt8to32_0(v) 730 case OpZeroExt8to64: 731 return rewriteValueS390X_OpZeroExt8to64_0(v) 732 } 733 return false 734 } 735 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 736 // match: (Add16 x y) 737 // cond: 738 // result: (ADDW x y) 739 for { 740 _ = v.Args[1] 741 x := v.Args[0] 742 y := v.Args[1] 743 v.reset(OpS390XADDW) 744 v.AddArg(x) 745 v.AddArg(y) 746 return true 747 } 748 } 749 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 750 // match: (Add32 x y) 751 // cond: 752 // result: (ADDW x y) 753 for { 754 _ = v.Args[1] 755 x := v.Args[0] 756 y := v.Args[1] 757 v.reset(OpS390XADDW) 758 v.AddArg(x) 759 v.AddArg(y) 760 return true 761 } 762 } 763 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 764 // match: (Add32F x y) 765 // cond: 766 // result: (FADDS x y) 767 for { 768 _ = v.Args[1] 769 x := v.Args[0] 770 y := v.Args[1] 771 v.reset(OpS390XFADDS) 772 v.AddArg(x) 773 v.AddArg(y) 774 return true 775 } 776 } 777 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 778 // match: (Add64 x y) 779 // cond: 780 // result: (ADD x y) 781 for { 782 _ = v.Args[1] 783 x := v.Args[0] 784 y := v.Args[1] 785 v.reset(OpS390XADD) 786 v.AddArg(x) 787 v.AddArg(y) 788 return true 789 } 790 } 791 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 792 // match: (Add64F x y) 793 // cond: 794 // result: (FADD x y) 795 for { 796 _ = v.Args[1] 797 x := v.Args[0] 798 y := v.Args[1] 799 v.reset(OpS390XFADD) 800 v.AddArg(x) 801 v.AddArg(y) 802 return true 803 } 804 } 805 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 806 // match: (Add8 x y) 807 // cond: 808 // result: (ADDW x y) 809 for { 810 _ = v.Args[1] 811 x := v.Args[0] 812 y := v.Args[1] 813 v.reset(OpS390XADDW) 814 v.AddArg(x) 815 v.AddArg(y) 816 return true 817 } 818 } 819 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 820 // match: (AddPtr x y) 821 // cond: 822 // result: (ADD x y) 823 for { 824 _ = v.Args[1] 825 x := v.Args[0] 826 y := v.Args[1] 827 v.reset(OpS390XADD) 828 v.AddArg(x) 829 v.AddArg(y) 830 return true 831 } 832 } 833 func rewriteValueS390X_OpAddr_0(v *Value) bool { 834 // match: (Addr {sym} base) 835 // cond: 836 // result: (MOVDaddr {sym} base) 837 for { 838 sym := v.Aux 839 base := v.Args[0] 840 v.reset(OpS390XMOVDaddr) 841 v.Aux = sym 842 v.AddArg(base) 843 return true 844 } 845 } 846 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 847 // match: (And16 x y) 848 // cond: 849 // result: (ANDW x y) 850 for { 851 _ = v.Args[1] 852 x := v.Args[0] 853 y := v.Args[1] 854 v.reset(OpS390XANDW) 855 v.AddArg(x) 856 v.AddArg(y) 857 return true 858 } 859 } 860 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 861 // match: (And32 x y) 862 // cond: 863 // result: (ANDW x y) 864 for { 865 _ = v.Args[1] 866 x := v.Args[0] 867 y := v.Args[1] 868 v.reset(OpS390XANDW) 869 v.AddArg(x) 870 v.AddArg(y) 871 return true 872 } 873 } 874 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 875 // match: (And64 x y) 876 // cond: 877 // result: (AND x y) 878 for { 879 _ = v.Args[1] 880 x := v.Args[0] 881 y := v.Args[1] 882 v.reset(OpS390XAND) 883 v.AddArg(x) 884 v.AddArg(y) 885 return true 886 } 887 } 888 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 889 // match: (And8 x y) 890 // cond: 891 // result: (ANDW x y) 892 for { 893 _ = v.Args[1] 894 x := v.Args[0] 895 y := v.Args[1] 896 v.reset(OpS390XANDW) 897 v.AddArg(x) 898 v.AddArg(y) 899 return true 900 } 901 } 902 func rewriteValueS390X_OpAndB_0(v *Value) bool { 903 // match: (AndB x y) 904 // cond: 905 // result: (ANDW x y) 906 for { 907 _ = v.Args[1] 908 x := v.Args[0] 909 y := v.Args[1] 910 v.reset(OpS390XANDW) 911 v.AddArg(x) 912 v.AddArg(y) 913 return true 914 } 915 } 916 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 917 b := v.Block 918 _ = b 919 typ := &b.Func.Config.Types 920 _ = typ 921 // match: (AtomicAdd32 ptr val mem) 922 // cond: 923 // result: (AddTupleFirst32 val (LAA ptr val mem)) 924 for { 925 _ = v.Args[2] 926 ptr := v.Args[0] 927 val := v.Args[1] 928 mem := v.Args[2] 929 v.reset(OpS390XAddTupleFirst32) 930 v.AddArg(val) 931 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 932 v0.AddArg(ptr) 933 v0.AddArg(val) 934 v0.AddArg(mem) 935 v.AddArg(v0) 936 return true 937 } 938 } 939 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 940 b := v.Block 941 _ = b 942 typ := &b.Func.Config.Types 943 _ = typ 944 // match: (AtomicAdd64 ptr val mem) 945 // cond: 946 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 947 for { 948 _ = v.Args[2] 949 ptr := v.Args[0] 950 val := v.Args[1] 951 mem := v.Args[2] 952 v.reset(OpS390XAddTupleFirst64) 953 v.AddArg(val) 954 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 955 v0.AddArg(ptr) 956 v0.AddArg(val) 957 v0.AddArg(mem) 958 v.AddArg(v0) 959 return true 960 } 961 } 962 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 963 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 964 // cond: 965 // result: (LoweredAtomicCas32 ptr old new_ mem) 966 for { 967 _ = v.Args[3] 968 ptr := v.Args[0] 969 old := v.Args[1] 970 new_ := v.Args[2] 971 mem := v.Args[3] 972 v.reset(OpS390XLoweredAtomicCas32) 973 v.AddArg(ptr) 974 v.AddArg(old) 975 v.AddArg(new_) 976 v.AddArg(mem) 977 return true 978 } 979 } 980 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 981 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 982 // cond: 983 // result: (LoweredAtomicCas64 ptr old new_ mem) 984 for { 985 _ = v.Args[3] 986 ptr := v.Args[0] 987 old := v.Args[1] 988 new_ := v.Args[2] 989 mem := v.Args[3] 990 v.reset(OpS390XLoweredAtomicCas64) 991 v.AddArg(ptr) 992 v.AddArg(old) 993 v.AddArg(new_) 994 v.AddArg(mem) 995 return true 996 } 997 } 998 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 999 // match: (AtomicExchange32 ptr val mem) 1000 // cond: 1001 // result: (LoweredAtomicExchange32 ptr val mem) 1002 for { 1003 _ = v.Args[2] 1004 ptr := v.Args[0] 1005 val := v.Args[1] 1006 mem := v.Args[2] 1007 v.reset(OpS390XLoweredAtomicExchange32) 1008 v.AddArg(ptr) 1009 v.AddArg(val) 1010 v.AddArg(mem) 1011 return true 1012 } 1013 } 1014 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1015 // match: (AtomicExchange64 ptr val mem) 1016 // cond: 1017 // result: (LoweredAtomicExchange64 ptr val mem) 1018 for { 1019 _ = v.Args[2] 1020 ptr := v.Args[0] 1021 val := v.Args[1] 1022 mem := v.Args[2] 1023 v.reset(OpS390XLoweredAtomicExchange64) 1024 v.AddArg(ptr) 1025 v.AddArg(val) 1026 v.AddArg(mem) 1027 return true 1028 } 1029 } 1030 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1031 // match: (AtomicLoad32 ptr mem) 1032 // cond: 1033 // result: (MOVWZatomicload ptr mem) 1034 for { 1035 _ = v.Args[1] 1036 ptr := v.Args[0] 1037 mem := v.Args[1] 1038 v.reset(OpS390XMOVWZatomicload) 1039 v.AddArg(ptr) 1040 v.AddArg(mem) 1041 return true 1042 } 1043 } 1044 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1045 // match: (AtomicLoad64 ptr mem) 1046 // cond: 1047 // result: (MOVDatomicload ptr mem) 1048 for { 1049 _ = v.Args[1] 1050 ptr := v.Args[0] 1051 mem := v.Args[1] 1052 v.reset(OpS390XMOVDatomicload) 1053 v.AddArg(ptr) 1054 v.AddArg(mem) 1055 return true 1056 } 1057 } 1058 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1059 // match: (AtomicLoadPtr ptr mem) 1060 // cond: 1061 // result: (MOVDatomicload ptr mem) 1062 for { 1063 _ = v.Args[1] 1064 ptr := v.Args[0] 1065 mem := v.Args[1] 1066 v.reset(OpS390XMOVDatomicload) 1067 v.AddArg(ptr) 1068 v.AddArg(mem) 1069 return true 1070 } 1071 } 1072 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1073 // match: (AtomicStore32 ptr val mem) 1074 // cond: 1075 // result: (MOVWatomicstore ptr val mem) 1076 for { 1077 _ = v.Args[2] 1078 ptr := v.Args[0] 1079 val := v.Args[1] 1080 mem := v.Args[2] 1081 v.reset(OpS390XMOVWatomicstore) 1082 v.AddArg(ptr) 1083 v.AddArg(val) 1084 v.AddArg(mem) 1085 return true 1086 } 1087 } 1088 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1089 // match: (AtomicStore64 ptr val mem) 1090 // cond: 1091 // result: (MOVDatomicstore ptr val mem) 1092 for { 1093 _ = v.Args[2] 1094 ptr := v.Args[0] 1095 val := v.Args[1] 1096 mem := v.Args[2] 1097 v.reset(OpS390XMOVDatomicstore) 1098 v.AddArg(ptr) 1099 v.AddArg(val) 1100 v.AddArg(mem) 1101 return true 1102 } 1103 } 1104 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1105 // match: (AtomicStorePtrNoWB ptr val mem) 1106 // cond: 1107 // result: (MOVDatomicstore ptr val mem) 1108 for { 1109 _ = v.Args[2] 1110 ptr := v.Args[0] 1111 val := v.Args[1] 1112 mem := v.Args[2] 1113 v.reset(OpS390XMOVDatomicstore) 1114 v.AddArg(ptr) 1115 v.AddArg(val) 1116 v.AddArg(mem) 1117 return true 1118 } 1119 } 1120 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1121 b := v.Block 1122 _ = b 1123 // match: (Avg64u <t> x y) 1124 // cond: 1125 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1126 for { 1127 t := v.Type 1128 _ = v.Args[1] 1129 x := v.Args[0] 1130 y := v.Args[1] 1131 v.reset(OpS390XADD) 1132 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1133 v0.AuxInt = 1 1134 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1135 v1.AddArg(x) 1136 v1.AddArg(y) 1137 v0.AddArg(v1) 1138 v.AddArg(v0) 1139 v.AddArg(y) 1140 return true 1141 } 1142 } 1143 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1144 b := v.Block 1145 _ = b 1146 typ := &b.Func.Config.Types 1147 _ = typ 1148 // match: (BitLen64 x) 1149 // cond: 1150 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1151 for { 1152 x := v.Args[0] 1153 v.reset(OpS390XSUB) 1154 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1155 v0.AuxInt = 64 1156 v.AddArg(v0) 1157 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1158 v1.AddArg(x) 1159 v.AddArg(v1) 1160 return true 1161 } 1162 } 1163 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1164 // match: (Bswap32 x) 1165 // cond: 1166 // result: (MOVWBR x) 1167 for { 1168 x := v.Args[0] 1169 v.reset(OpS390XMOVWBR) 1170 v.AddArg(x) 1171 return true 1172 } 1173 } 1174 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1175 // match: (Bswap64 x) 1176 // cond: 1177 // result: (MOVDBR x) 1178 for { 1179 x := v.Args[0] 1180 v.reset(OpS390XMOVDBR) 1181 v.AddArg(x) 1182 return true 1183 } 1184 } 1185 func rewriteValueS390X_OpCeil_0(v *Value) bool { 1186 // match: (Ceil x) 1187 // cond: 1188 // result: (FIDBR [6] x) 1189 for { 1190 x := v.Args[0] 1191 v.reset(OpS390XFIDBR) 1192 v.AuxInt = 6 1193 v.AddArg(x) 1194 return true 1195 } 1196 } 1197 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1198 // match: (ClosureCall [argwid] entry closure mem) 1199 // cond: 1200 // result: (CALLclosure [argwid] entry closure mem) 1201 for { 1202 argwid := v.AuxInt 1203 _ = v.Args[2] 1204 entry := v.Args[0] 1205 closure := v.Args[1] 1206 mem := v.Args[2] 1207 v.reset(OpS390XCALLclosure) 1208 v.AuxInt = argwid 1209 v.AddArg(entry) 1210 v.AddArg(closure) 1211 v.AddArg(mem) 1212 return true 1213 } 1214 } 1215 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1216 // match: (Com16 x) 1217 // cond: 1218 // result: (NOTW x) 1219 for { 1220 x := v.Args[0] 1221 v.reset(OpS390XNOTW) 1222 v.AddArg(x) 1223 return true 1224 } 1225 } 1226 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1227 // match: (Com32 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_OpCom64_0(v *Value) bool { 1238 // match: (Com64 x) 1239 // cond: 1240 // result: (NOT x) 1241 for { 1242 x := v.Args[0] 1243 v.reset(OpS390XNOT) 1244 v.AddArg(x) 1245 return true 1246 } 1247 } 1248 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1249 // match: (Com8 x) 1250 // cond: 1251 // result: (NOTW x) 1252 for { 1253 x := v.Args[0] 1254 v.reset(OpS390XNOTW) 1255 v.AddArg(x) 1256 return true 1257 } 1258 } 1259 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1260 // match: (Const16 [val]) 1261 // cond: 1262 // result: (MOVDconst [val]) 1263 for { 1264 val := v.AuxInt 1265 v.reset(OpS390XMOVDconst) 1266 v.AuxInt = val 1267 return true 1268 } 1269 } 1270 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1271 // match: (Const32 [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_OpConst32F_0(v *Value) bool { 1282 // match: (Const32F [val]) 1283 // cond: 1284 // result: (FMOVSconst [val]) 1285 for { 1286 val := v.AuxInt 1287 v.reset(OpS390XFMOVSconst) 1288 v.AuxInt = val 1289 return true 1290 } 1291 } 1292 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1293 // match: (Const64 [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_OpConst64F_0(v *Value) bool { 1304 // match: (Const64F [val]) 1305 // cond: 1306 // result: (FMOVDconst [val]) 1307 for { 1308 val := v.AuxInt 1309 v.reset(OpS390XFMOVDconst) 1310 v.AuxInt = val 1311 return true 1312 } 1313 } 1314 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1315 // match: (Const8 [val]) 1316 // cond: 1317 // result: (MOVDconst [val]) 1318 for { 1319 val := v.AuxInt 1320 v.reset(OpS390XMOVDconst) 1321 v.AuxInt = val 1322 return true 1323 } 1324 } 1325 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1326 // match: (ConstBool [b]) 1327 // cond: 1328 // result: (MOVDconst [b]) 1329 for { 1330 b := v.AuxInt 1331 v.reset(OpS390XMOVDconst) 1332 v.AuxInt = b 1333 return true 1334 } 1335 } 1336 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1337 // match: (ConstNil) 1338 // cond: 1339 // result: (MOVDconst [0]) 1340 for { 1341 v.reset(OpS390XMOVDconst) 1342 v.AuxInt = 0 1343 return true 1344 } 1345 } 1346 func rewriteValueS390X_OpConvert_0(v *Value) bool { 1347 // match: (Convert <t> x mem) 1348 // cond: 1349 // result: (MOVDconvert <t> x mem) 1350 for { 1351 t := v.Type 1352 _ = v.Args[1] 1353 x := v.Args[0] 1354 mem := v.Args[1] 1355 v.reset(OpS390XMOVDconvert) 1356 v.Type = t 1357 v.AddArg(x) 1358 v.AddArg(mem) 1359 return true 1360 } 1361 } 1362 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1363 b := v.Block 1364 _ = b 1365 typ := &b.Func.Config.Types 1366 _ = typ 1367 // match: (Ctz32 <t> x) 1368 // cond: 1369 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1370 for { 1371 t := v.Type 1372 x := v.Args[0] 1373 v.reset(OpS390XSUB) 1374 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1375 v0.AuxInt = 64 1376 v.AddArg(v0) 1377 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1378 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1379 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1380 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1381 v4.AuxInt = 1 1382 v4.AddArg(x) 1383 v3.AddArg(v4) 1384 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1385 v5.AddArg(x) 1386 v3.AddArg(v5) 1387 v2.AddArg(v3) 1388 v1.AddArg(v2) 1389 v.AddArg(v1) 1390 return true 1391 } 1392 } 1393 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1394 b := v.Block 1395 _ = b 1396 typ := &b.Func.Config.Types 1397 _ = typ 1398 // match: (Ctz64 <t> x) 1399 // cond: 1400 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1401 for { 1402 t := v.Type 1403 x := v.Args[0] 1404 v.reset(OpS390XSUB) 1405 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1406 v0.AuxInt = 64 1407 v.AddArg(v0) 1408 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1409 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1410 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1411 v3.AuxInt = 1 1412 v3.AddArg(x) 1413 v2.AddArg(v3) 1414 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1415 v4.AddArg(x) 1416 v2.AddArg(v4) 1417 v1.AddArg(v2) 1418 v.AddArg(v1) 1419 return true 1420 } 1421 } 1422 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1423 // match: (Cvt32Fto32 x) 1424 // cond: 1425 // result: (CFEBRA x) 1426 for { 1427 x := v.Args[0] 1428 v.reset(OpS390XCFEBRA) 1429 v.AddArg(x) 1430 return true 1431 } 1432 } 1433 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1434 // match: (Cvt32Fto64 x) 1435 // cond: 1436 // result: (CGEBRA x) 1437 for { 1438 x := v.Args[0] 1439 v.reset(OpS390XCGEBRA) 1440 v.AddArg(x) 1441 return true 1442 } 1443 } 1444 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1445 // match: (Cvt32Fto64F x) 1446 // cond: 1447 // result: (LDEBR x) 1448 for { 1449 x := v.Args[0] 1450 v.reset(OpS390XLDEBR) 1451 v.AddArg(x) 1452 return true 1453 } 1454 } 1455 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1456 // match: (Cvt32to32F x) 1457 // cond: 1458 // result: (CEFBRA x) 1459 for { 1460 x := v.Args[0] 1461 v.reset(OpS390XCEFBRA) 1462 v.AddArg(x) 1463 return true 1464 } 1465 } 1466 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1467 // match: (Cvt32to64F x) 1468 // cond: 1469 // result: (CDFBRA x) 1470 for { 1471 x := v.Args[0] 1472 v.reset(OpS390XCDFBRA) 1473 v.AddArg(x) 1474 return true 1475 } 1476 } 1477 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1478 // match: (Cvt64Fto32 x) 1479 // cond: 1480 // result: (CFDBRA x) 1481 for { 1482 x := v.Args[0] 1483 v.reset(OpS390XCFDBRA) 1484 v.AddArg(x) 1485 return true 1486 } 1487 } 1488 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1489 // match: (Cvt64Fto32F x) 1490 // cond: 1491 // result: (LEDBR x) 1492 for { 1493 x := v.Args[0] 1494 v.reset(OpS390XLEDBR) 1495 v.AddArg(x) 1496 return true 1497 } 1498 } 1499 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1500 // match: (Cvt64Fto64 x) 1501 // cond: 1502 // result: (CGDBRA x) 1503 for { 1504 x := v.Args[0] 1505 v.reset(OpS390XCGDBRA) 1506 v.AddArg(x) 1507 return true 1508 } 1509 } 1510 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1511 // match: (Cvt64to32F x) 1512 // cond: 1513 // result: (CEGBRA x) 1514 for { 1515 x := v.Args[0] 1516 v.reset(OpS390XCEGBRA) 1517 v.AddArg(x) 1518 return true 1519 } 1520 } 1521 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1522 // match: (Cvt64to64F x) 1523 // cond: 1524 // result: (CDGBRA x) 1525 for { 1526 x := v.Args[0] 1527 v.reset(OpS390XCDGBRA) 1528 v.AddArg(x) 1529 return true 1530 } 1531 } 1532 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1533 b := v.Block 1534 _ = b 1535 typ := &b.Func.Config.Types 1536 _ = typ 1537 // match: (Div16 x y) 1538 // cond: 1539 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1540 for { 1541 _ = v.Args[1] 1542 x := v.Args[0] 1543 y := v.Args[1] 1544 v.reset(OpS390XDIVW) 1545 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1546 v0.AddArg(x) 1547 v.AddArg(v0) 1548 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1549 v1.AddArg(y) 1550 v.AddArg(v1) 1551 return true 1552 } 1553 } 1554 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1555 b := v.Block 1556 _ = b 1557 typ := &b.Func.Config.Types 1558 _ = typ 1559 // match: (Div16u x y) 1560 // cond: 1561 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1562 for { 1563 _ = v.Args[1] 1564 x := v.Args[0] 1565 y := v.Args[1] 1566 v.reset(OpS390XDIVWU) 1567 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1568 v0.AddArg(x) 1569 v.AddArg(v0) 1570 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1571 v1.AddArg(y) 1572 v.AddArg(v1) 1573 return true 1574 } 1575 } 1576 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1577 b := v.Block 1578 _ = b 1579 typ := &b.Func.Config.Types 1580 _ = typ 1581 // match: (Div32 x y) 1582 // cond: 1583 // result: (DIVW (MOVWreg x) y) 1584 for { 1585 _ = v.Args[1] 1586 x := v.Args[0] 1587 y := v.Args[1] 1588 v.reset(OpS390XDIVW) 1589 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1590 v0.AddArg(x) 1591 v.AddArg(v0) 1592 v.AddArg(y) 1593 return true 1594 } 1595 } 1596 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1597 // match: (Div32F x y) 1598 // cond: 1599 // result: (FDIVS x y) 1600 for { 1601 _ = v.Args[1] 1602 x := v.Args[0] 1603 y := v.Args[1] 1604 v.reset(OpS390XFDIVS) 1605 v.AddArg(x) 1606 v.AddArg(y) 1607 return true 1608 } 1609 } 1610 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1611 b := v.Block 1612 _ = b 1613 typ := &b.Func.Config.Types 1614 _ = typ 1615 // match: (Div32u x y) 1616 // cond: 1617 // result: (DIVWU (MOVWZreg x) y) 1618 for { 1619 _ = v.Args[1] 1620 x := v.Args[0] 1621 y := v.Args[1] 1622 v.reset(OpS390XDIVWU) 1623 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1624 v0.AddArg(x) 1625 v.AddArg(v0) 1626 v.AddArg(y) 1627 return true 1628 } 1629 } 1630 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1631 // match: (Div64 x y) 1632 // cond: 1633 // result: (DIVD x y) 1634 for { 1635 _ = v.Args[1] 1636 x := v.Args[0] 1637 y := v.Args[1] 1638 v.reset(OpS390XDIVD) 1639 v.AddArg(x) 1640 v.AddArg(y) 1641 return true 1642 } 1643 } 1644 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1645 // match: (Div64F x y) 1646 // cond: 1647 // result: (FDIV x y) 1648 for { 1649 _ = v.Args[1] 1650 x := v.Args[0] 1651 y := v.Args[1] 1652 v.reset(OpS390XFDIV) 1653 v.AddArg(x) 1654 v.AddArg(y) 1655 return true 1656 } 1657 } 1658 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1659 // match: (Div64u x y) 1660 // cond: 1661 // result: (DIVDU x y) 1662 for { 1663 _ = v.Args[1] 1664 x := v.Args[0] 1665 y := v.Args[1] 1666 v.reset(OpS390XDIVDU) 1667 v.AddArg(x) 1668 v.AddArg(y) 1669 return true 1670 } 1671 } 1672 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1673 b := v.Block 1674 _ = b 1675 typ := &b.Func.Config.Types 1676 _ = typ 1677 // match: (Div8 x y) 1678 // cond: 1679 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1680 for { 1681 _ = v.Args[1] 1682 x := v.Args[0] 1683 y := v.Args[1] 1684 v.reset(OpS390XDIVW) 1685 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1686 v0.AddArg(x) 1687 v.AddArg(v0) 1688 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1689 v1.AddArg(y) 1690 v.AddArg(v1) 1691 return true 1692 } 1693 } 1694 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1695 b := v.Block 1696 _ = b 1697 typ := &b.Func.Config.Types 1698 _ = typ 1699 // match: (Div8u x y) 1700 // cond: 1701 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1702 for { 1703 _ = v.Args[1] 1704 x := v.Args[0] 1705 y := v.Args[1] 1706 v.reset(OpS390XDIVWU) 1707 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1708 v0.AddArg(x) 1709 v.AddArg(v0) 1710 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1711 v1.AddArg(y) 1712 v.AddArg(v1) 1713 return true 1714 } 1715 } 1716 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1717 b := v.Block 1718 _ = b 1719 typ := &b.Func.Config.Types 1720 _ = typ 1721 // match: (Eq16 x y) 1722 // cond: 1723 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1724 for { 1725 _ = v.Args[1] 1726 x := v.Args[0] 1727 y := v.Args[1] 1728 v.reset(OpS390XMOVDEQ) 1729 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1730 v0.AuxInt = 0 1731 v.AddArg(v0) 1732 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1733 v1.AuxInt = 1 1734 v.AddArg(v1) 1735 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1736 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1737 v3.AddArg(x) 1738 v2.AddArg(v3) 1739 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1740 v4.AddArg(y) 1741 v2.AddArg(v4) 1742 v.AddArg(v2) 1743 return true 1744 } 1745 } 1746 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1747 b := v.Block 1748 _ = b 1749 typ := &b.Func.Config.Types 1750 _ = typ 1751 // match: (Eq32 x y) 1752 // cond: 1753 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1754 for { 1755 _ = v.Args[1] 1756 x := v.Args[0] 1757 y := v.Args[1] 1758 v.reset(OpS390XMOVDEQ) 1759 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1760 v0.AuxInt = 0 1761 v.AddArg(v0) 1762 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1763 v1.AuxInt = 1 1764 v.AddArg(v1) 1765 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1766 v2.AddArg(x) 1767 v2.AddArg(y) 1768 v.AddArg(v2) 1769 return true 1770 } 1771 } 1772 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1773 b := v.Block 1774 _ = b 1775 typ := &b.Func.Config.Types 1776 _ = typ 1777 // match: (Eq32F x y) 1778 // cond: 1779 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1780 for { 1781 _ = v.Args[1] 1782 x := v.Args[0] 1783 y := v.Args[1] 1784 v.reset(OpS390XMOVDEQ) 1785 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1786 v0.AuxInt = 0 1787 v.AddArg(v0) 1788 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1789 v1.AuxInt = 1 1790 v.AddArg(v1) 1791 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1792 v2.AddArg(x) 1793 v2.AddArg(y) 1794 v.AddArg(v2) 1795 return true 1796 } 1797 } 1798 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1799 b := v.Block 1800 _ = b 1801 typ := &b.Func.Config.Types 1802 _ = typ 1803 // match: (Eq64 x y) 1804 // cond: 1805 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1806 for { 1807 _ = v.Args[1] 1808 x := v.Args[0] 1809 y := v.Args[1] 1810 v.reset(OpS390XMOVDEQ) 1811 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1812 v0.AuxInt = 0 1813 v.AddArg(v0) 1814 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1815 v1.AuxInt = 1 1816 v.AddArg(v1) 1817 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1818 v2.AddArg(x) 1819 v2.AddArg(y) 1820 v.AddArg(v2) 1821 return true 1822 } 1823 } 1824 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1825 b := v.Block 1826 _ = b 1827 typ := &b.Func.Config.Types 1828 _ = typ 1829 // match: (Eq64F x y) 1830 // cond: 1831 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1832 for { 1833 _ = v.Args[1] 1834 x := v.Args[0] 1835 y := v.Args[1] 1836 v.reset(OpS390XMOVDEQ) 1837 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1838 v0.AuxInt = 0 1839 v.AddArg(v0) 1840 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1841 v1.AuxInt = 1 1842 v.AddArg(v1) 1843 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1844 v2.AddArg(x) 1845 v2.AddArg(y) 1846 v.AddArg(v2) 1847 return true 1848 } 1849 } 1850 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1851 b := v.Block 1852 _ = b 1853 typ := &b.Func.Config.Types 1854 _ = typ 1855 // match: (Eq8 x y) 1856 // cond: 1857 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1858 for { 1859 _ = v.Args[1] 1860 x := v.Args[0] 1861 y := v.Args[1] 1862 v.reset(OpS390XMOVDEQ) 1863 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1864 v0.AuxInt = 0 1865 v.AddArg(v0) 1866 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1867 v1.AuxInt = 1 1868 v.AddArg(v1) 1869 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1870 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1871 v3.AddArg(x) 1872 v2.AddArg(v3) 1873 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1874 v4.AddArg(y) 1875 v2.AddArg(v4) 1876 v.AddArg(v2) 1877 return true 1878 } 1879 } 1880 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1881 b := v.Block 1882 _ = b 1883 typ := &b.Func.Config.Types 1884 _ = typ 1885 // match: (EqB x y) 1886 // cond: 1887 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1888 for { 1889 _ = v.Args[1] 1890 x := v.Args[0] 1891 y := v.Args[1] 1892 v.reset(OpS390XMOVDEQ) 1893 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1894 v0.AuxInt = 0 1895 v.AddArg(v0) 1896 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1897 v1.AuxInt = 1 1898 v.AddArg(v1) 1899 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1900 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1901 v3.AddArg(x) 1902 v2.AddArg(v3) 1903 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1904 v4.AddArg(y) 1905 v2.AddArg(v4) 1906 v.AddArg(v2) 1907 return true 1908 } 1909 } 1910 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1911 b := v.Block 1912 _ = b 1913 typ := &b.Func.Config.Types 1914 _ = typ 1915 // match: (EqPtr x y) 1916 // cond: 1917 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1918 for { 1919 _ = v.Args[1] 1920 x := v.Args[0] 1921 y := v.Args[1] 1922 v.reset(OpS390XMOVDEQ) 1923 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1924 v0.AuxInt = 0 1925 v.AddArg(v0) 1926 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1927 v1.AuxInt = 1 1928 v.AddArg(v1) 1929 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1930 v2.AddArg(x) 1931 v2.AddArg(y) 1932 v.AddArg(v2) 1933 return true 1934 } 1935 } 1936 func rewriteValueS390X_OpFloor_0(v *Value) bool { 1937 // match: (Floor x) 1938 // cond: 1939 // result: (FIDBR [7] x) 1940 for { 1941 x := v.Args[0] 1942 v.reset(OpS390XFIDBR) 1943 v.AuxInt = 7 1944 v.AddArg(x) 1945 return true 1946 } 1947 } 1948 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 1949 b := v.Block 1950 _ = b 1951 typ := &b.Func.Config.Types 1952 _ = typ 1953 // match: (Geq16 x y) 1954 // cond: 1955 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1956 for { 1957 _ = v.Args[1] 1958 x := v.Args[0] 1959 y := v.Args[1] 1960 v.reset(OpS390XMOVDGE) 1961 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1962 v0.AuxInt = 0 1963 v.AddArg(v0) 1964 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1965 v1.AuxInt = 1 1966 v.AddArg(v1) 1967 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1968 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1969 v3.AddArg(x) 1970 v2.AddArg(v3) 1971 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1972 v4.AddArg(y) 1973 v2.AddArg(v4) 1974 v.AddArg(v2) 1975 return true 1976 } 1977 } 1978 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 1979 b := v.Block 1980 _ = b 1981 typ := &b.Func.Config.Types 1982 _ = typ 1983 // match: (Geq16U x y) 1984 // cond: 1985 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1986 for { 1987 _ = v.Args[1] 1988 x := v.Args[0] 1989 y := v.Args[1] 1990 v.reset(OpS390XMOVDGE) 1991 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1992 v0.AuxInt = 0 1993 v.AddArg(v0) 1994 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1995 v1.AuxInt = 1 1996 v.AddArg(v1) 1997 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 1998 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1999 v3.AddArg(x) 2000 v2.AddArg(v3) 2001 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2002 v4.AddArg(y) 2003 v2.AddArg(v4) 2004 v.AddArg(v2) 2005 return true 2006 } 2007 } 2008 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 2009 b := v.Block 2010 _ = b 2011 typ := &b.Func.Config.Types 2012 _ = typ 2013 // match: (Geq32 x y) 2014 // cond: 2015 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2016 for { 2017 _ = v.Args[1] 2018 x := v.Args[0] 2019 y := v.Args[1] 2020 v.reset(OpS390XMOVDGE) 2021 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2022 v0.AuxInt = 0 2023 v.AddArg(v0) 2024 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2025 v1.AuxInt = 1 2026 v.AddArg(v1) 2027 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2028 v2.AddArg(x) 2029 v2.AddArg(y) 2030 v.AddArg(v2) 2031 return true 2032 } 2033 } 2034 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2035 b := v.Block 2036 _ = b 2037 typ := &b.Func.Config.Types 2038 _ = typ 2039 // match: (Geq32F x y) 2040 // cond: 2041 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2042 for { 2043 _ = v.Args[1] 2044 x := v.Args[0] 2045 y := v.Args[1] 2046 v.reset(OpS390XMOVDGEnoinv) 2047 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2048 v0.AuxInt = 0 2049 v.AddArg(v0) 2050 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2051 v1.AuxInt = 1 2052 v.AddArg(v1) 2053 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2054 v2.AddArg(x) 2055 v2.AddArg(y) 2056 v.AddArg(v2) 2057 return true 2058 } 2059 } 2060 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2061 b := v.Block 2062 _ = b 2063 typ := &b.Func.Config.Types 2064 _ = typ 2065 // match: (Geq32U x y) 2066 // cond: 2067 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2068 for { 2069 _ = v.Args[1] 2070 x := v.Args[0] 2071 y := v.Args[1] 2072 v.reset(OpS390XMOVDGE) 2073 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2074 v0.AuxInt = 0 2075 v.AddArg(v0) 2076 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2077 v1.AuxInt = 1 2078 v.AddArg(v1) 2079 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2080 v2.AddArg(x) 2081 v2.AddArg(y) 2082 v.AddArg(v2) 2083 return true 2084 } 2085 } 2086 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2087 b := v.Block 2088 _ = b 2089 typ := &b.Func.Config.Types 2090 _ = typ 2091 // match: (Geq64 x y) 2092 // cond: 2093 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2094 for { 2095 _ = v.Args[1] 2096 x := v.Args[0] 2097 y := v.Args[1] 2098 v.reset(OpS390XMOVDGE) 2099 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2100 v0.AuxInt = 0 2101 v.AddArg(v0) 2102 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2103 v1.AuxInt = 1 2104 v.AddArg(v1) 2105 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2106 v2.AddArg(x) 2107 v2.AddArg(y) 2108 v.AddArg(v2) 2109 return true 2110 } 2111 } 2112 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2113 b := v.Block 2114 _ = b 2115 typ := &b.Func.Config.Types 2116 _ = typ 2117 // match: (Geq64F x y) 2118 // cond: 2119 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2120 for { 2121 _ = v.Args[1] 2122 x := v.Args[0] 2123 y := v.Args[1] 2124 v.reset(OpS390XMOVDGEnoinv) 2125 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2126 v0.AuxInt = 0 2127 v.AddArg(v0) 2128 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2129 v1.AuxInt = 1 2130 v.AddArg(v1) 2131 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2132 v2.AddArg(x) 2133 v2.AddArg(y) 2134 v.AddArg(v2) 2135 return true 2136 } 2137 } 2138 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2139 b := v.Block 2140 _ = b 2141 typ := &b.Func.Config.Types 2142 _ = typ 2143 // match: (Geq64U x y) 2144 // cond: 2145 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2146 for { 2147 _ = v.Args[1] 2148 x := v.Args[0] 2149 y := v.Args[1] 2150 v.reset(OpS390XMOVDGE) 2151 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2152 v0.AuxInt = 0 2153 v.AddArg(v0) 2154 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2155 v1.AuxInt = 1 2156 v.AddArg(v1) 2157 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2158 v2.AddArg(x) 2159 v2.AddArg(y) 2160 v.AddArg(v2) 2161 return true 2162 } 2163 } 2164 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2165 b := v.Block 2166 _ = b 2167 typ := &b.Func.Config.Types 2168 _ = typ 2169 // match: (Geq8 x y) 2170 // cond: 2171 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2172 for { 2173 _ = v.Args[1] 2174 x := v.Args[0] 2175 y := v.Args[1] 2176 v.reset(OpS390XMOVDGE) 2177 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2178 v0.AuxInt = 0 2179 v.AddArg(v0) 2180 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2181 v1.AuxInt = 1 2182 v.AddArg(v1) 2183 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2184 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2185 v3.AddArg(x) 2186 v2.AddArg(v3) 2187 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2188 v4.AddArg(y) 2189 v2.AddArg(v4) 2190 v.AddArg(v2) 2191 return true 2192 } 2193 } 2194 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2195 b := v.Block 2196 _ = b 2197 typ := &b.Func.Config.Types 2198 _ = typ 2199 // match: (Geq8U x y) 2200 // cond: 2201 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2202 for { 2203 _ = v.Args[1] 2204 x := v.Args[0] 2205 y := v.Args[1] 2206 v.reset(OpS390XMOVDGE) 2207 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2208 v0.AuxInt = 0 2209 v.AddArg(v0) 2210 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2211 v1.AuxInt = 1 2212 v.AddArg(v1) 2213 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2214 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2215 v3.AddArg(x) 2216 v2.AddArg(v3) 2217 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2218 v4.AddArg(y) 2219 v2.AddArg(v4) 2220 v.AddArg(v2) 2221 return true 2222 } 2223 } 2224 func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool { 2225 // match: (GetCallerSP) 2226 // cond: 2227 // result: (LoweredGetCallerSP) 2228 for { 2229 v.reset(OpS390XLoweredGetCallerSP) 2230 return true 2231 } 2232 } 2233 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2234 // match: (GetClosurePtr) 2235 // cond: 2236 // result: (LoweredGetClosurePtr) 2237 for { 2238 v.reset(OpS390XLoweredGetClosurePtr) 2239 return true 2240 } 2241 } 2242 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2243 // match: (GetG mem) 2244 // cond: 2245 // result: (LoweredGetG mem) 2246 for { 2247 mem := v.Args[0] 2248 v.reset(OpS390XLoweredGetG) 2249 v.AddArg(mem) 2250 return true 2251 } 2252 } 2253 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2254 b := v.Block 2255 _ = b 2256 typ := &b.Func.Config.Types 2257 _ = typ 2258 // match: (Greater16 x y) 2259 // cond: 2260 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2261 for { 2262 _ = v.Args[1] 2263 x := v.Args[0] 2264 y := v.Args[1] 2265 v.reset(OpS390XMOVDGT) 2266 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2267 v0.AuxInt = 0 2268 v.AddArg(v0) 2269 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2270 v1.AuxInt = 1 2271 v.AddArg(v1) 2272 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2273 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2274 v3.AddArg(x) 2275 v2.AddArg(v3) 2276 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2277 v4.AddArg(y) 2278 v2.AddArg(v4) 2279 v.AddArg(v2) 2280 return true 2281 } 2282 } 2283 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2284 b := v.Block 2285 _ = b 2286 typ := &b.Func.Config.Types 2287 _ = typ 2288 // match: (Greater16U x y) 2289 // cond: 2290 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2291 for { 2292 _ = v.Args[1] 2293 x := v.Args[0] 2294 y := v.Args[1] 2295 v.reset(OpS390XMOVDGT) 2296 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2297 v0.AuxInt = 0 2298 v.AddArg(v0) 2299 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2300 v1.AuxInt = 1 2301 v.AddArg(v1) 2302 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2303 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2304 v3.AddArg(x) 2305 v2.AddArg(v3) 2306 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2307 v4.AddArg(y) 2308 v2.AddArg(v4) 2309 v.AddArg(v2) 2310 return true 2311 } 2312 } 2313 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2314 b := v.Block 2315 _ = b 2316 typ := &b.Func.Config.Types 2317 _ = typ 2318 // match: (Greater32 x y) 2319 // cond: 2320 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2321 for { 2322 _ = v.Args[1] 2323 x := v.Args[0] 2324 y := v.Args[1] 2325 v.reset(OpS390XMOVDGT) 2326 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2327 v0.AuxInt = 0 2328 v.AddArg(v0) 2329 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2330 v1.AuxInt = 1 2331 v.AddArg(v1) 2332 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2333 v2.AddArg(x) 2334 v2.AddArg(y) 2335 v.AddArg(v2) 2336 return true 2337 } 2338 } 2339 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2340 b := v.Block 2341 _ = b 2342 typ := &b.Func.Config.Types 2343 _ = typ 2344 // match: (Greater32F x y) 2345 // cond: 2346 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2347 for { 2348 _ = v.Args[1] 2349 x := v.Args[0] 2350 y := v.Args[1] 2351 v.reset(OpS390XMOVDGTnoinv) 2352 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2353 v0.AuxInt = 0 2354 v.AddArg(v0) 2355 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2356 v1.AuxInt = 1 2357 v.AddArg(v1) 2358 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2359 v2.AddArg(x) 2360 v2.AddArg(y) 2361 v.AddArg(v2) 2362 return true 2363 } 2364 } 2365 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2366 b := v.Block 2367 _ = b 2368 typ := &b.Func.Config.Types 2369 _ = typ 2370 // match: (Greater32U x y) 2371 // cond: 2372 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2373 for { 2374 _ = v.Args[1] 2375 x := v.Args[0] 2376 y := v.Args[1] 2377 v.reset(OpS390XMOVDGT) 2378 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2379 v0.AuxInt = 0 2380 v.AddArg(v0) 2381 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2382 v1.AuxInt = 1 2383 v.AddArg(v1) 2384 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2385 v2.AddArg(x) 2386 v2.AddArg(y) 2387 v.AddArg(v2) 2388 return true 2389 } 2390 } 2391 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2392 b := v.Block 2393 _ = b 2394 typ := &b.Func.Config.Types 2395 _ = typ 2396 // match: (Greater64 x y) 2397 // cond: 2398 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2399 for { 2400 _ = v.Args[1] 2401 x := v.Args[0] 2402 y := v.Args[1] 2403 v.reset(OpS390XMOVDGT) 2404 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2405 v0.AuxInt = 0 2406 v.AddArg(v0) 2407 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2408 v1.AuxInt = 1 2409 v.AddArg(v1) 2410 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2411 v2.AddArg(x) 2412 v2.AddArg(y) 2413 v.AddArg(v2) 2414 return true 2415 } 2416 } 2417 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2418 b := v.Block 2419 _ = b 2420 typ := &b.Func.Config.Types 2421 _ = typ 2422 // match: (Greater64F x y) 2423 // cond: 2424 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2425 for { 2426 _ = v.Args[1] 2427 x := v.Args[0] 2428 y := v.Args[1] 2429 v.reset(OpS390XMOVDGTnoinv) 2430 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2431 v0.AuxInt = 0 2432 v.AddArg(v0) 2433 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2434 v1.AuxInt = 1 2435 v.AddArg(v1) 2436 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2437 v2.AddArg(x) 2438 v2.AddArg(y) 2439 v.AddArg(v2) 2440 return true 2441 } 2442 } 2443 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2444 b := v.Block 2445 _ = b 2446 typ := &b.Func.Config.Types 2447 _ = typ 2448 // match: (Greater64U x y) 2449 // cond: 2450 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2451 for { 2452 _ = v.Args[1] 2453 x := v.Args[0] 2454 y := v.Args[1] 2455 v.reset(OpS390XMOVDGT) 2456 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2457 v0.AuxInt = 0 2458 v.AddArg(v0) 2459 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2460 v1.AuxInt = 1 2461 v.AddArg(v1) 2462 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2463 v2.AddArg(x) 2464 v2.AddArg(y) 2465 v.AddArg(v2) 2466 return true 2467 } 2468 } 2469 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2470 b := v.Block 2471 _ = b 2472 typ := &b.Func.Config.Types 2473 _ = typ 2474 // match: (Greater8 x y) 2475 // cond: 2476 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2477 for { 2478 _ = v.Args[1] 2479 x := v.Args[0] 2480 y := v.Args[1] 2481 v.reset(OpS390XMOVDGT) 2482 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2483 v0.AuxInt = 0 2484 v.AddArg(v0) 2485 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2486 v1.AuxInt = 1 2487 v.AddArg(v1) 2488 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2489 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2490 v3.AddArg(x) 2491 v2.AddArg(v3) 2492 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2493 v4.AddArg(y) 2494 v2.AddArg(v4) 2495 v.AddArg(v2) 2496 return true 2497 } 2498 } 2499 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2500 b := v.Block 2501 _ = b 2502 typ := &b.Func.Config.Types 2503 _ = typ 2504 // match: (Greater8U x y) 2505 // cond: 2506 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2507 for { 2508 _ = v.Args[1] 2509 x := v.Args[0] 2510 y := v.Args[1] 2511 v.reset(OpS390XMOVDGT) 2512 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2513 v0.AuxInt = 0 2514 v.AddArg(v0) 2515 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2516 v1.AuxInt = 1 2517 v.AddArg(v1) 2518 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2519 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2520 v3.AddArg(x) 2521 v2.AddArg(v3) 2522 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2523 v4.AddArg(y) 2524 v2.AddArg(v4) 2525 v.AddArg(v2) 2526 return true 2527 } 2528 } 2529 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2530 b := v.Block 2531 _ = b 2532 typ := &b.Func.Config.Types 2533 _ = typ 2534 // match: (Hmul32 x y) 2535 // cond: 2536 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2537 for { 2538 _ = v.Args[1] 2539 x := v.Args[0] 2540 y := v.Args[1] 2541 v.reset(OpS390XSRDconst) 2542 v.AuxInt = 32 2543 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2544 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2545 v1.AddArg(x) 2546 v0.AddArg(v1) 2547 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2548 v2.AddArg(y) 2549 v0.AddArg(v2) 2550 v.AddArg(v0) 2551 return true 2552 } 2553 } 2554 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2555 b := v.Block 2556 _ = b 2557 typ := &b.Func.Config.Types 2558 _ = typ 2559 // match: (Hmul32u x y) 2560 // cond: 2561 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2562 for { 2563 _ = v.Args[1] 2564 x := v.Args[0] 2565 y := v.Args[1] 2566 v.reset(OpS390XSRDconst) 2567 v.AuxInt = 32 2568 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2569 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2570 v1.AddArg(x) 2571 v0.AddArg(v1) 2572 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2573 v2.AddArg(y) 2574 v0.AddArg(v2) 2575 v.AddArg(v0) 2576 return true 2577 } 2578 } 2579 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2580 // match: (Hmul64 x y) 2581 // cond: 2582 // result: (MULHD x y) 2583 for { 2584 _ = v.Args[1] 2585 x := v.Args[0] 2586 y := v.Args[1] 2587 v.reset(OpS390XMULHD) 2588 v.AddArg(x) 2589 v.AddArg(y) 2590 return true 2591 } 2592 } 2593 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2594 // match: (Hmul64u x y) 2595 // cond: 2596 // result: (MULHDU x y) 2597 for { 2598 _ = v.Args[1] 2599 x := v.Args[0] 2600 y := v.Args[1] 2601 v.reset(OpS390XMULHDU) 2602 v.AddArg(x) 2603 v.AddArg(y) 2604 return true 2605 } 2606 } 2607 func rewriteValueS390X_OpITab_0(v *Value) bool { 2608 // match: (ITab (Load ptr mem)) 2609 // cond: 2610 // result: (MOVDload ptr mem) 2611 for { 2612 v_0 := v.Args[0] 2613 if v_0.Op != OpLoad { 2614 break 2615 } 2616 _ = v_0.Args[1] 2617 ptr := v_0.Args[0] 2618 mem := v_0.Args[1] 2619 v.reset(OpS390XMOVDload) 2620 v.AddArg(ptr) 2621 v.AddArg(mem) 2622 return true 2623 } 2624 return false 2625 } 2626 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2627 // match: (InterCall [argwid] entry mem) 2628 // cond: 2629 // result: (CALLinter [argwid] entry mem) 2630 for { 2631 argwid := v.AuxInt 2632 _ = v.Args[1] 2633 entry := v.Args[0] 2634 mem := v.Args[1] 2635 v.reset(OpS390XCALLinter) 2636 v.AuxInt = argwid 2637 v.AddArg(entry) 2638 v.AddArg(mem) 2639 return true 2640 } 2641 } 2642 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2643 b := v.Block 2644 _ = b 2645 typ := &b.Func.Config.Types 2646 _ = typ 2647 // match: (IsInBounds idx len) 2648 // cond: 2649 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2650 for { 2651 _ = v.Args[1] 2652 idx := v.Args[0] 2653 len := v.Args[1] 2654 v.reset(OpS390XMOVDLT) 2655 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2656 v0.AuxInt = 0 2657 v.AddArg(v0) 2658 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2659 v1.AuxInt = 1 2660 v.AddArg(v1) 2661 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2662 v2.AddArg(idx) 2663 v2.AddArg(len) 2664 v.AddArg(v2) 2665 return true 2666 } 2667 } 2668 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2669 b := v.Block 2670 _ = b 2671 typ := &b.Func.Config.Types 2672 _ = typ 2673 // match: (IsNonNil p) 2674 // cond: 2675 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2676 for { 2677 p := v.Args[0] 2678 v.reset(OpS390XMOVDNE) 2679 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2680 v0.AuxInt = 0 2681 v.AddArg(v0) 2682 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2683 v1.AuxInt = 1 2684 v.AddArg(v1) 2685 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2686 v2.AuxInt = 0 2687 v2.AddArg(p) 2688 v.AddArg(v2) 2689 return true 2690 } 2691 } 2692 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2693 b := v.Block 2694 _ = b 2695 typ := &b.Func.Config.Types 2696 _ = typ 2697 // match: (IsSliceInBounds idx len) 2698 // cond: 2699 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2700 for { 2701 _ = v.Args[1] 2702 idx := v.Args[0] 2703 len := v.Args[1] 2704 v.reset(OpS390XMOVDLE) 2705 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2706 v0.AuxInt = 0 2707 v.AddArg(v0) 2708 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2709 v1.AuxInt = 1 2710 v.AddArg(v1) 2711 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2712 v2.AddArg(idx) 2713 v2.AddArg(len) 2714 v.AddArg(v2) 2715 return true 2716 } 2717 } 2718 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2719 b := v.Block 2720 _ = b 2721 typ := &b.Func.Config.Types 2722 _ = typ 2723 // match: (Leq16 x y) 2724 // cond: 2725 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2726 for { 2727 _ = v.Args[1] 2728 x := v.Args[0] 2729 y := v.Args[1] 2730 v.reset(OpS390XMOVDLE) 2731 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2732 v0.AuxInt = 0 2733 v.AddArg(v0) 2734 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2735 v1.AuxInt = 1 2736 v.AddArg(v1) 2737 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2738 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2739 v3.AddArg(x) 2740 v2.AddArg(v3) 2741 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2742 v4.AddArg(y) 2743 v2.AddArg(v4) 2744 v.AddArg(v2) 2745 return true 2746 } 2747 } 2748 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2749 b := v.Block 2750 _ = b 2751 typ := &b.Func.Config.Types 2752 _ = typ 2753 // match: (Leq16U x y) 2754 // cond: 2755 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2756 for { 2757 _ = v.Args[1] 2758 x := v.Args[0] 2759 y := v.Args[1] 2760 v.reset(OpS390XMOVDLE) 2761 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2762 v0.AuxInt = 0 2763 v.AddArg(v0) 2764 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2765 v1.AuxInt = 1 2766 v.AddArg(v1) 2767 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2768 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2769 v3.AddArg(x) 2770 v2.AddArg(v3) 2771 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2772 v4.AddArg(y) 2773 v2.AddArg(v4) 2774 v.AddArg(v2) 2775 return true 2776 } 2777 } 2778 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2779 b := v.Block 2780 _ = b 2781 typ := &b.Func.Config.Types 2782 _ = typ 2783 // match: (Leq32 x y) 2784 // cond: 2785 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2786 for { 2787 _ = v.Args[1] 2788 x := v.Args[0] 2789 y := v.Args[1] 2790 v.reset(OpS390XMOVDLE) 2791 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2792 v0.AuxInt = 0 2793 v.AddArg(v0) 2794 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2795 v1.AuxInt = 1 2796 v.AddArg(v1) 2797 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2798 v2.AddArg(x) 2799 v2.AddArg(y) 2800 v.AddArg(v2) 2801 return true 2802 } 2803 } 2804 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2805 b := v.Block 2806 _ = b 2807 typ := &b.Func.Config.Types 2808 _ = typ 2809 // match: (Leq32F x y) 2810 // cond: 2811 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2812 for { 2813 _ = v.Args[1] 2814 x := v.Args[0] 2815 y := v.Args[1] 2816 v.reset(OpS390XMOVDGEnoinv) 2817 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2818 v0.AuxInt = 0 2819 v.AddArg(v0) 2820 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2821 v1.AuxInt = 1 2822 v.AddArg(v1) 2823 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2824 v2.AddArg(y) 2825 v2.AddArg(x) 2826 v.AddArg(v2) 2827 return true 2828 } 2829 } 2830 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2831 b := v.Block 2832 _ = b 2833 typ := &b.Func.Config.Types 2834 _ = typ 2835 // match: (Leq32U x y) 2836 // cond: 2837 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2838 for { 2839 _ = v.Args[1] 2840 x := v.Args[0] 2841 y := v.Args[1] 2842 v.reset(OpS390XMOVDLE) 2843 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2844 v0.AuxInt = 0 2845 v.AddArg(v0) 2846 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2847 v1.AuxInt = 1 2848 v.AddArg(v1) 2849 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2850 v2.AddArg(x) 2851 v2.AddArg(y) 2852 v.AddArg(v2) 2853 return true 2854 } 2855 } 2856 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2857 b := v.Block 2858 _ = b 2859 typ := &b.Func.Config.Types 2860 _ = typ 2861 // match: (Leq64 x y) 2862 // cond: 2863 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2864 for { 2865 _ = v.Args[1] 2866 x := v.Args[0] 2867 y := v.Args[1] 2868 v.reset(OpS390XMOVDLE) 2869 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2870 v0.AuxInt = 0 2871 v.AddArg(v0) 2872 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2873 v1.AuxInt = 1 2874 v.AddArg(v1) 2875 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2876 v2.AddArg(x) 2877 v2.AddArg(y) 2878 v.AddArg(v2) 2879 return true 2880 } 2881 } 2882 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2883 b := v.Block 2884 _ = b 2885 typ := &b.Func.Config.Types 2886 _ = typ 2887 // match: (Leq64F x y) 2888 // cond: 2889 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2890 for { 2891 _ = v.Args[1] 2892 x := v.Args[0] 2893 y := v.Args[1] 2894 v.reset(OpS390XMOVDGEnoinv) 2895 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2896 v0.AuxInt = 0 2897 v.AddArg(v0) 2898 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2899 v1.AuxInt = 1 2900 v.AddArg(v1) 2901 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2902 v2.AddArg(y) 2903 v2.AddArg(x) 2904 v.AddArg(v2) 2905 return true 2906 } 2907 } 2908 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2909 b := v.Block 2910 _ = b 2911 typ := &b.Func.Config.Types 2912 _ = typ 2913 // match: (Leq64U x y) 2914 // cond: 2915 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2916 for { 2917 _ = v.Args[1] 2918 x := v.Args[0] 2919 y := v.Args[1] 2920 v.reset(OpS390XMOVDLE) 2921 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2922 v0.AuxInt = 0 2923 v.AddArg(v0) 2924 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2925 v1.AuxInt = 1 2926 v.AddArg(v1) 2927 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2928 v2.AddArg(x) 2929 v2.AddArg(y) 2930 v.AddArg(v2) 2931 return true 2932 } 2933 } 2934 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 2935 b := v.Block 2936 _ = b 2937 typ := &b.Func.Config.Types 2938 _ = typ 2939 // match: (Leq8 x y) 2940 // cond: 2941 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2942 for { 2943 _ = v.Args[1] 2944 x := v.Args[0] 2945 y := v.Args[1] 2946 v.reset(OpS390XMOVDLE) 2947 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2948 v0.AuxInt = 0 2949 v.AddArg(v0) 2950 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2951 v1.AuxInt = 1 2952 v.AddArg(v1) 2953 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2954 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2955 v3.AddArg(x) 2956 v2.AddArg(v3) 2957 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2958 v4.AddArg(y) 2959 v2.AddArg(v4) 2960 v.AddArg(v2) 2961 return true 2962 } 2963 } 2964 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 2965 b := v.Block 2966 _ = b 2967 typ := &b.Func.Config.Types 2968 _ = typ 2969 // match: (Leq8U x y) 2970 // cond: 2971 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2972 for { 2973 _ = v.Args[1] 2974 x := v.Args[0] 2975 y := v.Args[1] 2976 v.reset(OpS390XMOVDLE) 2977 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2978 v0.AuxInt = 0 2979 v.AddArg(v0) 2980 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2981 v1.AuxInt = 1 2982 v.AddArg(v1) 2983 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2984 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2985 v3.AddArg(x) 2986 v2.AddArg(v3) 2987 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2988 v4.AddArg(y) 2989 v2.AddArg(v4) 2990 v.AddArg(v2) 2991 return true 2992 } 2993 } 2994 func rewriteValueS390X_OpLess16_0(v *Value) bool { 2995 b := v.Block 2996 _ = b 2997 typ := &b.Func.Config.Types 2998 _ = typ 2999 // match: (Less16 x y) 3000 // cond: 3001 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 3002 for { 3003 _ = v.Args[1] 3004 x := v.Args[0] 3005 y := v.Args[1] 3006 v.reset(OpS390XMOVDLT) 3007 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3008 v0.AuxInt = 0 3009 v.AddArg(v0) 3010 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3011 v1.AuxInt = 1 3012 v.AddArg(v1) 3013 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3014 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3015 v3.AddArg(x) 3016 v2.AddArg(v3) 3017 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3018 v4.AddArg(y) 3019 v2.AddArg(v4) 3020 v.AddArg(v2) 3021 return true 3022 } 3023 } 3024 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 3025 b := v.Block 3026 _ = b 3027 typ := &b.Func.Config.Types 3028 _ = typ 3029 // match: (Less16U x y) 3030 // cond: 3031 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 3032 for { 3033 _ = v.Args[1] 3034 x := v.Args[0] 3035 y := v.Args[1] 3036 v.reset(OpS390XMOVDLT) 3037 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3038 v0.AuxInt = 0 3039 v.AddArg(v0) 3040 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3041 v1.AuxInt = 1 3042 v.AddArg(v1) 3043 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3044 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3045 v3.AddArg(x) 3046 v2.AddArg(v3) 3047 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3048 v4.AddArg(y) 3049 v2.AddArg(v4) 3050 v.AddArg(v2) 3051 return true 3052 } 3053 } 3054 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3055 b := v.Block 3056 _ = b 3057 typ := &b.Func.Config.Types 3058 _ = typ 3059 // match: (Less32 x y) 3060 // cond: 3061 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3062 for { 3063 _ = v.Args[1] 3064 x := v.Args[0] 3065 y := v.Args[1] 3066 v.reset(OpS390XMOVDLT) 3067 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3068 v0.AuxInt = 0 3069 v.AddArg(v0) 3070 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3071 v1.AuxInt = 1 3072 v.AddArg(v1) 3073 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3074 v2.AddArg(x) 3075 v2.AddArg(y) 3076 v.AddArg(v2) 3077 return true 3078 } 3079 } 3080 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3081 b := v.Block 3082 _ = b 3083 typ := &b.Func.Config.Types 3084 _ = typ 3085 // match: (Less32F x y) 3086 // cond: 3087 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3088 for { 3089 _ = v.Args[1] 3090 x := v.Args[0] 3091 y := v.Args[1] 3092 v.reset(OpS390XMOVDGTnoinv) 3093 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3094 v0.AuxInt = 0 3095 v.AddArg(v0) 3096 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3097 v1.AuxInt = 1 3098 v.AddArg(v1) 3099 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3100 v2.AddArg(y) 3101 v2.AddArg(x) 3102 v.AddArg(v2) 3103 return true 3104 } 3105 } 3106 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3107 b := v.Block 3108 _ = b 3109 typ := &b.Func.Config.Types 3110 _ = typ 3111 // match: (Less32U x y) 3112 // cond: 3113 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3114 for { 3115 _ = v.Args[1] 3116 x := v.Args[0] 3117 y := v.Args[1] 3118 v.reset(OpS390XMOVDLT) 3119 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3120 v0.AuxInt = 0 3121 v.AddArg(v0) 3122 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3123 v1.AuxInt = 1 3124 v.AddArg(v1) 3125 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3126 v2.AddArg(x) 3127 v2.AddArg(y) 3128 v.AddArg(v2) 3129 return true 3130 } 3131 } 3132 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3133 b := v.Block 3134 _ = b 3135 typ := &b.Func.Config.Types 3136 _ = typ 3137 // match: (Less64 x y) 3138 // cond: 3139 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3140 for { 3141 _ = v.Args[1] 3142 x := v.Args[0] 3143 y := v.Args[1] 3144 v.reset(OpS390XMOVDLT) 3145 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3146 v0.AuxInt = 0 3147 v.AddArg(v0) 3148 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3149 v1.AuxInt = 1 3150 v.AddArg(v1) 3151 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3152 v2.AddArg(x) 3153 v2.AddArg(y) 3154 v.AddArg(v2) 3155 return true 3156 } 3157 } 3158 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3159 b := v.Block 3160 _ = b 3161 typ := &b.Func.Config.Types 3162 _ = typ 3163 // match: (Less64F x y) 3164 // cond: 3165 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3166 for { 3167 _ = v.Args[1] 3168 x := v.Args[0] 3169 y := v.Args[1] 3170 v.reset(OpS390XMOVDGTnoinv) 3171 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3172 v0.AuxInt = 0 3173 v.AddArg(v0) 3174 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3175 v1.AuxInt = 1 3176 v.AddArg(v1) 3177 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3178 v2.AddArg(y) 3179 v2.AddArg(x) 3180 v.AddArg(v2) 3181 return true 3182 } 3183 } 3184 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3185 b := v.Block 3186 _ = b 3187 typ := &b.Func.Config.Types 3188 _ = typ 3189 // match: (Less64U x y) 3190 // cond: 3191 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3192 for { 3193 _ = v.Args[1] 3194 x := v.Args[0] 3195 y := v.Args[1] 3196 v.reset(OpS390XMOVDLT) 3197 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3198 v0.AuxInt = 0 3199 v.AddArg(v0) 3200 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3201 v1.AuxInt = 1 3202 v.AddArg(v1) 3203 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3204 v2.AddArg(x) 3205 v2.AddArg(y) 3206 v.AddArg(v2) 3207 return true 3208 } 3209 } 3210 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3211 b := v.Block 3212 _ = b 3213 typ := &b.Func.Config.Types 3214 _ = typ 3215 // match: (Less8 x y) 3216 // cond: 3217 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3218 for { 3219 _ = v.Args[1] 3220 x := v.Args[0] 3221 y := v.Args[1] 3222 v.reset(OpS390XMOVDLT) 3223 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3224 v0.AuxInt = 0 3225 v.AddArg(v0) 3226 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3227 v1.AuxInt = 1 3228 v.AddArg(v1) 3229 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3230 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3231 v3.AddArg(x) 3232 v2.AddArg(v3) 3233 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3234 v4.AddArg(y) 3235 v2.AddArg(v4) 3236 v.AddArg(v2) 3237 return true 3238 } 3239 } 3240 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3241 b := v.Block 3242 _ = b 3243 typ := &b.Func.Config.Types 3244 _ = typ 3245 // match: (Less8U x y) 3246 // cond: 3247 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3248 for { 3249 _ = v.Args[1] 3250 x := v.Args[0] 3251 y := v.Args[1] 3252 v.reset(OpS390XMOVDLT) 3253 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3254 v0.AuxInt = 0 3255 v.AddArg(v0) 3256 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3257 v1.AuxInt = 1 3258 v.AddArg(v1) 3259 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3260 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3261 v3.AddArg(x) 3262 v2.AddArg(v3) 3263 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3264 v4.AddArg(y) 3265 v2.AddArg(v4) 3266 v.AddArg(v2) 3267 return true 3268 } 3269 } 3270 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3271 // match: (Load <t> ptr mem) 3272 // cond: (is64BitInt(t) || isPtr(t)) 3273 // result: (MOVDload ptr mem) 3274 for { 3275 t := v.Type 3276 _ = v.Args[1] 3277 ptr := v.Args[0] 3278 mem := v.Args[1] 3279 if !(is64BitInt(t) || isPtr(t)) { 3280 break 3281 } 3282 v.reset(OpS390XMOVDload) 3283 v.AddArg(ptr) 3284 v.AddArg(mem) 3285 return true 3286 } 3287 // match: (Load <t> ptr mem) 3288 // cond: is32BitInt(t) && isSigned(t) 3289 // result: (MOVWload ptr mem) 3290 for { 3291 t := v.Type 3292 _ = v.Args[1] 3293 ptr := v.Args[0] 3294 mem := v.Args[1] 3295 if !(is32BitInt(t) && isSigned(t)) { 3296 break 3297 } 3298 v.reset(OpS390XMOVWload) 3299 v.AddArg(ptr) 3300 v.AddArg(mem) 3301 return true 3302 } 3303 // match: (Load <t> ptr mem) 3304 // cond: is32BitInt(t) && !isSigned(t) 3305 // result: (MOVWZload ptr mem) 3306 for { 3307 t := v.Type 3308 _ = v.Args[1] 3309 ptr := v.Args[0] 3310 mem := v.Args[1] 3311 if !(is32BitInt(t) && !isSigned(t)) { 3312 break 3313 } 3314 v.reset(OpS390XMOVWZload) 3315 v.AddArg(ptr) 3316 v.AddArg(mem) 3317 return true 3318 } 3319 // match: (Load <t> ptr mem) 3320 // cond: is16BitInt(t) && isSigned(t) 3321 // result: (MOVHload ptr mem) 3322 for { 3323 t := v.Type 3324 _ = v.Args[1] 3325 ptr := v.Args[0] 3326 mem := v.Args[1] 3327 if !(is16BitInt(t) && isSigned(t)) { 3328 break 3329 } 3330 v.reset(OpS390XMOVHload) 3331 v.AddArg(ptr) 3332 v.AddArg(mem) 3333 return true 3334 } 3335 // match: (Load <t> ptr mem) 3336 // cond: is16BitInt(t) && !isSigned(t) 3337 // result: (MOVHZload ptr mem) 3338 for { 3339 t := v.Type 3340 _ = v.Args[1] 3341 ptr := v.Args[0] 3342 mem := v.Args[1] 3343 if !(is16BitInt(t) && !isSigned(t)) { 3344 break 3345 } 3346 v.reset(OpS390XMOVHZload) 3347 v.AddArg(ptr) 3348 v.AddArg(mem) 3349 return true 3350 } 3351 // match: (Load <t> ptr mem) 3352 // cond: is8BitInt(t) && isSigned(t) 3353 // result: (MOVBload ptr mem) 3354 for { 3355 t := v.Type 3356 _ = v.Args[1] 3357 ptr := v.Args[0] 3358 mem := v.Args[1] 3359 if !(is8BitInt(t) && isSigned(t)) { 3360 break 3361 } 3362 v.reset(OpS390XMOVBload) 3363 v.AddArg(ptr) 3364 v.AddArg(mem) 3365 return true 3366 } 3367 // match: (Load <t> ptr mem) 3368 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3369 // result: (MOVBZload ptr mem) 3370 for { 3371 t := v.Type 3372 _ = v.Args[1] 3373 ptr := v.Args[0] 3374 mem := v.Args[1] 3375 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3376 break 3377 } 3378 v.reset(OpS390XMOVBZload) 3379 v.AddArg(ptr) 3380 v.AddArg(mem) 3381 return true 3382 } 3383 // match: (Load <t> ptr mem) 3384 // cond: is32BitFloat(t) 3385 // result: (FMOVSload ptr mem) 3386 for { 3387 t := v.Type 3388 _ = v.Args[1] 3389 ptr := v.Args[0] 3390 mem := v.Args[1] 3391 if !(is32BitFloat(t)) { 3392 break 3393 } 3394 v.reset(OpS390XFMOVSload) 3395 v.AddArg(ptr) 3396 v.AddArg(mem) 3397 return true 3398 } 3399 // match: (Load <t> ptr mem) 3400 // cond: is64BitFloat(t) 3401 // result: (FMOVDload ptr mem) 3402 for { 3403 t := v.Type 3404 _ = v.Args[1] 3405 ptr := v.Args[0] 3406 mem := v.Args[1] 3407 if !(is64BitFloat(t)) { 3408 break 3409 } 3410 v.reset(OpS390XFMOVDload) 3411 v.AddArg(ptr) 3412 v.AddArg(mem) 3413 return true 3414 } 3415 return false 3416 } 3417 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3418 b := v.Block 3419 _ = b 3420 typ := &b.Func.Config.Types 3421 _ = typ 3422 // match: (Lsh16x16 <t> x y) 3423 // cond: 3424 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3425 for { 3426 t := v.Type 3427 _ = v.Args[1] 3428 x := v.Args[0] 3429 y := v.Args[1] 3430 v.reset(OpS390XANDW) 3431 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3432 v0.AddArg(x) 3433 v0.AddArg(y) 3434 v.AddArg(v0) 3435 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3436 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3437 v2.AuxInt = 31 3438 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3439 v3.AddArg(y) 3440 v2.AddArg(v3) 3441 v1.AddArg(v2) 3442 v.AddArg(v1) 3443 return true 3444 } 3445 } 3446 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3447 b := v.Block 3448 _ = b 3449 // match: (Lsh16x32 <t> x y) 3450 // cond: 3451 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3452 for { 3453 t := v.Type 3454 _ = v.Args[1] 3455 x := v.Args[0] 3456 y := v.Args[1] 3457 v.reset(OpS390XANDW) 3458 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3459 v0.AddArg(x) 3460 v0.AddArg(y) 3461 v.AddArg(v0) 3462 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3463 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3464 v2.AuxInt = 31 3465 v2.AddArg(y) 3466 v1.AddArg(v2) 3467 v.AddArg(v1) 3468 return true 3469 } 3470 } 3471 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3472 b := v.Block 3473 _ = b 3474 // match: (Lsh16x64 <t> x y) 3475 // cond: 3476 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3477 for { 3478 t := v.Type 3479 _ = v.Args[1] 3480 x := v.Args[0] 3481 y := v.Args[1] 3482 v.reset(OpS390XANDW) 3483 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3484 v0.AddArg(x) 3485 v0.AddArg(y) 3486 v.AddArg(v0) 3487 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3488 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3489 v2.AuxInt = 31 3490 v2.AddArg(y) 3491 v1.AddArg(v2) 3492 v.AddArg(v1) 3493 return true 3494 } 3495 } 3496 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3497 b := v.Block 3498 _ = b 3499 typ := &b.Func.Config.Types 3500 _ = typ 3501 // match: (Lsh16x8 <t> x y) 3502 // cond: 3503 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3504 for { 3505 t := v.Type 3506 _ = v.Args[1] 3507 x := v.Args[0] 3508 y := v.Args[1] 3509 v.reset(OpS390XANDW) 3510 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3511 v0.AddArg(x) 3512 v0.AddArg(y) 3513 v.AddArg(v0) 3514 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3515 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3516 v2.AuxInt = 31 3517 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3518 v3.AddArg(y) 3519 v2.AddArg(v3) 3520 v1.AddArg(v2) 3521 v.AddArg(v1) 3522 return true 3523 } 3524 } 3525 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3526 b := v.Block 3527 _ = b 3528 typ := &b.Func.Config.Types 3529 _ = typ 3530 // match: (Lsh32x16 <t> x y) 3531 // cond: 3532 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3533 for { 3534 t := v.Type 3535 _ = v.Args[1] 3536 x := v.Args[0] 3537 y := v.Args[1] 3538 v.reset(OpS390XANDW) 3539 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3540 v0.AddArg(x) 3541 v0.AddArg(y) 3542 v.AddArg(v0) 3543 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3544 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3545 v2.AuxInt = 31 3546 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3547 v3.AddArg(y) 3548 v2.AddArg(v3) 3549 v1.AddArg(v2) 3550 v.AddArg(v1) 3551 return true 3552 } 3553 } 3554 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3555 b := v.Block 3556 _ = b 3557 // match: (Lsh32x32 <t> x y) 3558 // cond: 3559 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3560 for { 3561 t := v.Type 3562 _ = v.Args[1] 3563 x := v.Args[0] 3564 y := v.Args[1] 3565 v.reset(OpS390XANDW) 3566 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3567 v0.AddArg(x) 3568 v0.AddArg(y) 3569 v.AddArg(v0) 3570 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3571 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3572 v2.AuxInt = 31 3573 v2.AddArg(y) 3574 v1.AddArg(v2) 3575 v.AddArg(v1) 3576 return true 3577 } 3578 } 3579 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3580 b := v.Block 3581 _ = b 3582 // match: (Lsh32x64 <t> x y) 3583 // cond: 3584 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3585 for { 3586 t := v.Type 3587 _ = v.Args[1] 3588 x := v.Args[0] 3589 y := v.Args[1] 3590 v.reset(OpS390XANDW) 3591 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3592 v0.AddArg(x) 3593 v0.AddArg(y) 3594 v.AddArg(v0) 3595 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3596 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3597 v2.AuxInt = 31 3598 v2.AddArg(y) 3599 v1.AddArg(v2) 3600 v.AddArg(v1) 3601 return true 3602 } 3603 } 3604 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3605 b := v.Block 3606 _ = b 3607 typ := &b.Func.Config.Types 3608 _ = typ 3609 // match: (Lsh32x8 <t> x y) 3610 // cond: 3611 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3612 for { 3613 t := v.Type 3614 _ = v.Args[1] 3615 x := v.Args[0] 3616 y := v.Args[1] 3617 v.reset(OpS390XANDW) 3618 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3619 v0.AddArg(x) 3620 v0.AddArg(y) 3621 v.AddArg(v0) 3622 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3623 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3624 v2.AuxInt = 31 3625 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3626 v3.AddArg(y) 3627 v2.AddArg(v3) 3628 v1.AddArg(v2) 3629 v.AddArg(v1) 3630 return true 3631 } 3632 } 3633 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3634 b := v.Block 3635 _ = b 3636 typ := &b.Func.Config.Types 3637 _ = typ 3638 // match: (Lsh64x16 <t> x y) 3639 // cond: 3640 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3641 for { 3642 t := v.Type 3643 _ = v.Args[1] 3644 x := v.Args[0] 3645 y := v.Args[1] 3646 v.reset(OpS390XAND) 3647 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3648 v0.AddArg(x) 3649 v0.AddArg(y) 3650 v.AddArg(v0) 3651 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3652 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3653 v2.AuxInt = 63 3654 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3655 v3.AddArg(y) 3656 v2.AddArg(v3) 3657 v1.AddArg(v2) 3658 v.AddArg(v1) 3659 return true 3660 } 3661 } 3662 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3663 b := v.Block 3664 _ = b 3665 // match: (Lsh64x32 <t> x y) 3666 // cond: 3667 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3668 for { 3669 t := v.Type 3670 _ = v.Args[1] 3671 x := v.Args[0] 3672 y := v.Args[1] 3673 v.reset(OpS390XAND) 3674 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3675 v0.AddArg(x) 3676 v0.AddArg(y) 3677 v.AddArg(v0) 3678 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3679 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3680 v2.AuxInt = 63 3681 v2.AddArg(y) 3682 v1.AddArg(v2) 3683 v.AddArg(v1) 3684 return true 3685 } 3686 } 3687 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3688 b := v.Block 3689 _ = b 3690 // match: (Lsh64x64 <t> x y) 3691 // cond: 3692 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3693 for { 3694 t := v.Type 3695 _ = v.Args[1] 3696 x := v.Args[0] 3697 y := v.Args[1] 3698 v.reset(OpS390XAND) 3699 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3700 v0.AddArg(x) 3701 v0.AddArg(y) 3702 v.AddArg(v0) 3703 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3704 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3705 v2.AuxInt = 63 3706 v2.AddArg(y) 3707 v1.AddArg(v2) 3708 v.AddArg(v1) 3709 return true 3710 } 3711 } 3712 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 3713 b := v.Block 3714 _ = b 3715 typ := &b.Func.Config.Types 3716 _ = typ 3717 // match: (Lsh64x8 <t> x y) 3718 // cond: 3719 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3720 for { 3721 t := v.Type 3722 _ = v.Args[1] 3723 x := v.Args[0] 3724 y := v.Args[1] 3725 v.reset(OpS390XAND) 3726 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3727 v0.AddArg(x) 3728 v0.AddArg(y) 3729 v.AddArg(v0) 3730 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3731 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3732 v2.AuxInt = 63 3733 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3734 v3.AddArg(y) 3735 v2.AddArg(v3) 3736 v1.AddArg(v2) 3737 v.AddArg(v1) 3738 return true 3739 } 3740 } 3741 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 3742 b := v.Block 3743 _ = b 3744 typ := &b.Func.Config.Types 3745 _ = typ 3746 // match: (Lsh8x16 <t> x y) 3747 // cond: 3748 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3749 for { 3750 t := v.Type 3751 _ = v.Args[1] 3752 x := v.Args[0] 3753 y := v.Args[1] 3754 v.reset(OpS390XANDW) 3755 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3756 v0.AddArg(x) 3757 v0.AddArg(y) 3758 v.AddArg(v0) 3759 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3760 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3761 v2.AuxInt = 31 3762 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3763 v3.AddArg(y) 3764 v2.AddArg(v3) 3765 v1.AddArg(v2) 3766 v.AddArg(v1) 3767 return true 3768 } 3769 } 3770 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 3771 b := v.Block 3772 _ = b 3773 // match: (Lsh8x32 <t> x y) 3774 // cond: 3775 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3776 for { 3777 t := v.Type 3778 _ = v.Args[1] 3779 x := v.Args[0] 3780 y := v.Args[1] 3781 v.reset(OpS390XANDW) 3782 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3783 v0.AddArg(x) 3784 v0.AddArg(y) 3785 v.AddArg(v0) 3786 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3787 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3788 v2.AuxInt = 31 3789 v2.AddArg(y) 3790 v1.AddArg(v2) 3791 v.AddArg(v1) 3792 return true 3793 } 3794 } 3795 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 3796 b := v.Block 3797 _ = b 3798 // match: (Lsh8x64 <t> x y) 3799 // cond: 3800 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3801 for { 3802 t := v.Type 3803 _ = v.Args[1] 3804 x := v.Args[0] 3805 y := v.Args[1] 3806 v.reset(OpS390XANDW) 3807 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3808 v0.AddArg(x) 3809 v0.AddArg(y) 3810 v.AddArg(v0) 3811 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3812 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3813 v2.AuxInt = 31 3814 v2.AddArg(y) 3815 v1.AddArg(v2) 3816 v.AddArg(v1) 3817 return true 3818 } 3819 } 3820 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 3821 b := v.Block 3822 _ = b 3823 typ := &b.Func.Config.Types 3824 _ = typ 3825 // match: (Lsh8x8 <t> x y) 3826 // cond: 3827 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3828 for { 3829 t := v.Type 3830 _ = v.Args[1] 3831 x := v.Args[0] 3832 y := v.Args[1] 3833 v.reset(OpS390XANDW) 3834 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3835 v0.AddArg(x) 3836 v0.AddArg(y) 3837 v.AddArg(v0) 3838 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3839 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3840 v2.AuxInt = 31 3841 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3842 v3.AddArg(y) 3843 v2.AddArg(v3) 3844 v1.AddArg(v2) 3845 v.AddArg(v1) 3846 return true 3847 } 3848 } 3849 func rewriteValueS390X_OpMod16_0(v *Value) bool { 3850 b := v.Block 3851 _ = b 3852 typ := &b.Func.Config.Types 3853 _ = typ 3854 // match: (Mod16 x y) 3855 // cond: 3856 // result: (MODW (MOVHreg x) (MOVHreg y)) 3857 for { 3858 _ = v.Args[1] 3859 x := v.Args[0] 3860 y := v.Args[1] 3861 v.reset(OpS390XMODW) 3862 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3863 v0.AddArg(x) 3864 v.AddArg(v0) 3865 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3866 v1.AddArg(y) 3867 v.AddArg(v1) 3868 return true 3869 } 3870 } 3871 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 3872 b := v.Block 3873 _ = b 3874 typ := &b.Func.Config.Types 3875 _ = typ 3876 // match: (Mod16u x y) 3877 // cond: 3878 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3879 for { 3880 _ = v.Args[1] 3881 x := v.Args[0] 3882 y := v.Args[1] 3883 v.reset(OpS390XMODWU) 3884 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3885 v0.AddArg(x) 3886 v.AddArg(v0) 3887 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3888 v1.AddArg(y) 3889 v.AddArg(v1) 3890 return true 3891 } 3892 } 3893 func rewriteValueS390X_OpMod32_0(v *Value) bool { 3894 b := v.Block 3895 _ = b 3896 typ := &b.Func.Config.Types 3897 _ = typ 3898 // match: (Mod32 x y) 3899 // cond: 3900 // result: (MODW (MOVWreg x) y) 3901 for { 3902 _ = v.Args[1] 3903 x := v.Args[0] 3904 y := v.Args[1] 3905 v.reset(OpS390XMODW) 3906 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 3907 v0.AddArg(x) 3908 v.AddArg(v0) 3909 v.AddArg(y) 3910 return true 3911 } 3912 } 3913 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 3914 b := v.Block 3915 _ = b 3916 typ := &b.Func.Config.Types 3917 _ = typ 3918 // match: (Mod32u x y) 3919 // cond: 3920 // result: (MODWU (MOVWZreg x) y) 3921 for { 3922 _ = v.Args[1] 3923 x := v.Args[0] 3924 y := v.Args[1] 3925 v.reset(OpS390XMODWU) 3926 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 3927 v0.AddArg(x) 3928 v.AddArg(v0) 3929 v.AddArg(y) 3930 return true 3931 } 3932 } 3933 func rewriteValueS390X_OpMod64_0(v *Value) bool { 3934 // match: (Mod64 x y) 3935 // cond: 3936 // result: (MODD x y) 3937 for { 3938 _ = v.Args[1] 3939 x := v.Args[0] 3940 y := v.Args[1] 3941 v.reset(OpS390XMODD) 3942 v.AddArg(x) 3943 v.AddArg(y) 3944 return true 3945 } 3946 } 3947 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 3948 // match: (Mod64u x y) 3949 // cond: 3950 // result: (MODDU x y) 3951 for { 3952 _ = v.Args[1] 3953 x := v.Args[0] 3954 y := v.Args[1] 3955 v.reset(OpS390XMODDU) 3956 v.AddArg(x) 3957 v.AddArg(y) 3958 return true 3959 } 3960 } 3961 func rewriteValueS390X_OpMod8_0(v *Value) bool { 3962 b := v.Block 3963 _ = b 3964 typ := &b.Func.Config.Types 3965 _ = typ 3966 // match: (Mod8 x y) 3967 // cond: 3968 // result: (MODW (MOVBreg x) (MOVBreg y)) 3969 for { 3970 _ = v.Args[1] 3971 x := v.Args[0] 3972 y := v.Args[1] 3973 v.reset(OpS390XMODW) 3974 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3975 v0.AddArg(x) 3976 v.AddArg(v0) 3977 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3978 v1.AddArg(y) 3979 v.AddArg(v1) 3980 return true 3981 } 3982 } 3983 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 3984 b := v.Block 3985 _ = b 3986 typ := &b.Func.Config.Types 3987 _ = typ 3988 // match: (Mod8u x y) 3989 // cond: 3990 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3991 for { 3992 _ = v.Args[1] 3993 x := v.Args[0] 3994 y := v.Args[1] 3995 v.reset(OpS390XMODWU) 3996 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3997 v0.AddArg(x) 3998 v.AddArg(v0) 3999 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 4000 v1.AddArg(y) 4001 v.AddArg(v1) 4002 return true 4003 } 4004 } 4005 func rewriteValueS390X_OpMove_0(v *Value) bool { 4006 b := v.Block 4007 _ = b 4008 typ := &b.Func.Config.Types 4009 _ = typ 4010 // match: (Move [0] _ _ mem) 4011 // cond: 4012 // result: mem 4013 for { 4014 if v.AuxInt != 0 { 4015 break 4016 } 4017 _ = v.Args[2] 4018 mem := v.Args[2] 4019 v.reset(OpCopy) 4020 v.Type = mem.Type 4021 v.AddArg(mem) 4022 return true 4023 } 4024 // match: (Move [1] dst src mem) 4025 // cond: 4026 // result: (MOVBstore dst (MOVBZload src mem) mem) 4027 for { 4028 if v.AuxInt != 1 { 4029 break 4030 } 4031 _ = v.Args[2] 4032 dst := v.Args[0] 4033 src := v.Args[1] 4034 mem := v.Args[2] 4035 v.reset(OpS390XMOVBstore) 4036 v.AddArg(dst) 4037 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4038 v0.AddArg(src) 4039 v0.AddArg(mem) 4040 v.AddArg(v0) 4041 v.AddArg(mem) 4042 return true 4043 } 4044 // match: (Move [2] dst src mem) 4045 // cond: 4046 // result: (MOVHstore dst (MOVHZload src mem) mem) 4047 for { 4048 if v.AuxInt != 2 { 4049 break 4050 } 4051 _ = v.Args[2] 4052 dst := v.Args[0] 4053 src := v.Args[1] 4054 mem := v.Args[2] 4055 v.reset(OpS390XMOVHstore) 4056 v.AddArg(dst) 4057 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4058 v0.AddArg(src) 4059 v0.AddArg(mem) 4060 v.AddArg(v0) 4061 v.AddArg(mem) 4062 return true 4063 } 4064 // match: (Move [4] dst src mem) 4065 // cond: 4066 // result: (MOVWstore dst (MOVWZload src mem) mem) 4067 for { 4068 if v.AuxInt != 4 { 4069 break 4070 } 4071 _ = v.Args[2] 4072 dst := v.Args[0] 4073 src := v.Args[1] 4074 mem := v.Args[2] 4075 v.reset(OpS390XMOVWstore) 4076 v.AddArg(dst) 4077 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4078 v0.AddArg(src) 4079 v0.AddArg(mem) 4080 v.AddArg(v0) 4081 v.AddArg(mem) 4082 return true 4083 } 4084 // match: (Move [8] dst src mem) 4085 // cond: 4086 // result: (MOVDstore dst (MOVDload src mem) mem) 4087 for { 4088 if v.AuxInt != 8 { 4089 break 4090 } 4091 _ = v.Args[2] 4092 dst := v.Args[0] 4093 src := v.Args[1] 4094 mem := v.Args[2] 4095 v.reset(OpS390XMOVDstore) 4096 v.AddArg(dst) 4097 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4098 v0.AddArg(src) 4099 v0.AddArg(mem) 4100 v.AddArg(v0) 4101 v.AddArg(mem) 4102 return true 4103 } 4104 // match: (Move [16] dst src mem) 4105 // cond: 4106 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4107 for { 4108 if v.AuxInt != 16 { 4109 break 4110 } 4111 _ = v.Args[2] 4112 dst := v.Args[0] 4113 src := v.Args[1] 4114 mem := v.Args[2] 4115 v.reset(OpS390XMOVDstore) 4116 v.AuxInt = 8 4117 v.AddArg(dst) 4118 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4119 v0.AuxInt = 8 4120 v0.AddArg(src) 4121 v0.AddArg(mem) 4122 v.AddArg(v0) 4123 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4124 v1.AddArg(dst) 4125 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4126 v2.AddArg(src) 4127 v2.AddArg(mem) 4128 v1.AddArg(v2) 4129 v1.AddArg(mem) 4130 v.AddArg(v1) 4131 return true 4132 } 4133 // match: (Move [24] dst src mem) 4134 // cond: 4135 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4136 for { 4137 if v.AuxInt != 24 { 4138 break 4139 } 4140 _ = v.Args[2] 4141 dst := v.Args[0] 4142 src := v.Args[1] 4143 mem := v.Args[2] 4144 v.reset(OpS390XMOVDstore) 4145 v.AuxInt = 16 4146 v.AddArg(dst) 4147 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4148 v0.AuxInt = 16 4149 v0.AddArg(src) 4150 v0.AddArg(mem) 4151 v.AddArg(v0) 4152 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4153 v1.AuxInt = 8 4154 v1.AddArg(dst) 4155 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4156 v2.AuxInt = 8 4157 v2.AddArg(src) 4158 v2.AddArg(mem) 4159 v1.AddArg(v2) 4160 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4161 v3.AddArg(dst) 4162 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4163 v4.AddArg(src) 4164 v4.AddArg(mem) 4165 v3.AddArg(v4) 4166 v3.AddArg(mem) 4167 v1.AddArg(v3) 4168 v.AddArg(v1) 4169 return true 4170 } 4171 // match: (Move [3] dst src mem) 4172 // cond: 4173 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4174 for { 4175 if v.AuxInt != 3 { 4176 break 4177 } 4178 _ = v.Args[2] 4179 dst := v.Args[0] 4180 src := v.Args[1] 4181 mem := v.Args[2] 4182 v.reset(OpS390XMOVBstore) 4183 v.AuxInt = 2 4184 v.AddArg(dst) 4185 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4186 v0.AuxInt = 2 4187 v0.AddArg(src) 4188 v0.AddArg(mem) 4189 v.AddArg(v0) 4190 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4191 v1.AddArg(dst) 4192 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4193 v2.AddArg(src) 4194 v2.AddArg(mem) 4195 v1.AddArg(v2) 4196 v1.AddArg(mem) 4197 v.AddArg(v1) 4198 return true 4199 } 4200 // match: (Move [5] dst src mem) 4201 // cond: 4202 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4203 for { 4204 if v.AuxInt != 5 { 4205 break 4206 } 4207 _ = v.Args[2] 4208 dst := v.Args[0] 4209 src := v.Args[1] 4210 mem := v.Args[2] 4211 v.reset(OpS390XMOVBstore) 4212 v.AuxInt = 4 4213 v.AddArg(dst) 4214 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4215 v0.AuxInt = 4 4216 v0.AddArg(src) 4217 v0.AddArg(mem) 4218 v.AddArg(v0) 4219 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4220 v1.AddArg(dst) 4221 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4222 v2.AddArg(src) 4223 v2.AddArg(mem) 4224 v1.AddArg(v2) 4225 v1.AddArg(mem) 4226 v.AddArg(v1) 4227 return true 4228 } 4229 // match: (Move [6] dst src mem) 4230 // cond: 4231 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4232 for { 4233 if v.AuxInt != 6 { 4234 break 4235 } 4236 _ = v.Args[2] 4237 dst := v.Args[0] 4238 src := v.Args[1] 4239 mem := v.Args[2] 4240 v.reset(OpS390XMOVHstore) 4241 v.AuxInt = 4 4242 v.AddArg(dst) 4243 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4244 v0.AuxInt = 4 4245 v0.AddArg(src) 4246 v0.AddArg(mem) 4247 v.AddArg(v0) 4248 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4249 v1.AddArg(dst) 4250 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4251 v2.AddArg(src) 4252 v2.AddArg(mem) 4253 v1.AddArg(v2) 4254 v1.AddArg(mem) 4255 v.AddArg(v1) 4256 return true 4257 } 4258 return false 4259 } 4260 func rewriteValueS390X_OpMove_10(v *Value) bool { 4261 b := v.Block 4262 _ = b 4263 typ := &b.Func.Config.Types 4264 _ = typ 4265 // match: (Move [7] dst src mem) 4266 // cond: 4267 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4268 for { 4269 if v.AuxInt != 7 { 4270 break 4271 } 4272 _ = v.Args[2] 4273 dst := v.Args[0] 4274 src := v.Args[1] 4275 mem := v.Args[2] 4276 v.reset(OpS390XMOVBstore) 4277 v.AuxInt = 6 4278 v.AddArg(dst) 4279 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4280 v0.AuxInt = 6 4281 v0.AddArg(src) 4282 v0.AddArg(mem) 4283 v.AddArg(v0) 4284 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4285 v1.AuxInt = 4 4286 v1.AddArg(dst) 4287 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4288 v2.AuxInt = 4 4289 v2.AddArg(src) 4290 v2.AddArg(mem) 4291 v1.AddArg(v2) 4292 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4293 v3.AddArg(dst) 4294 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4295 v4.AddArg(src) 4296 v4.AddArg(mem) 4297 v3.AddArg(v4) 4298 v3.AddArg(mem) 4299 v1.AddArg(v3) 4300 v.AddArg(v1) 4301 return true 4302 } 4303 // match: (Move [s] dst src mem) 4304 // cond: s > 0 && s <= 256 4305 // result: (MVC [makeValAndOff(s, 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 > 0 && s <= 256) { 4313 break 4314 } 4315 v.reset(OpS390XMVC) 4316 v.AuxInt = makeValAndOff(s, 0) 4317 v.AddArg(dst) 4318 v.AddArg(src) 4319 v.AddArg(mem) 4320 return true 4321 } 4322 // match: (Move [s] dst src mem) 4323 // cond: s > 256 && s <= 512 4324 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4325 for { 4326 s := v.AuxInt 4327 _ = v.Args[2] 4328 dst := v.Args[0] 4329 src := v.Args[1] 4330 mem := v.Args[2] 4331 if !(s > 256 && s <= 512) { 4332 break 4333 } 4334 v.reset(OpS390XMVC) 4335 v.AuxInt = makeValAndOff(s-256, 256) 4336 v.AddArg(dst) 4337 v.AddArg(src) 4338 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4339 v0.AuxInt = makeValAndOff(256, 0) 4340 v0.AddArg(dst) 4341 v0.AddArg(src) 4342 v0.AddArg(mem) 4343 v.AddArg(v0) 4344 return true 4345 } 4346 // match: (Move [s] dst src mem) 4347 // cond: s > 512 && s <= 768 4348 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4349 for { 4350 s := v.AuxInt 4351 _ = v.Args[2] 4352 dst := v.Args[0] 4353 src := v.Args[1] 4354 mem := v.Args[2] 4355 if !(s > 512 && s <= 768) { 4356 break 4357 } 4358 v.reset(OpS390XMVC) 4359 v.AuxInt = makeValAndOff(s-512, 512) 4360 v.AddArg(dst) 4361 v.AddArg(src) 4362 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4363 v0.AuxInt = makeValAndOff(256, 256) 4364 v0.AddArg(dst) 4365 v0.AddArg(src) 4366 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4367 v1.AuxInt = makeValAndOff(256, 0) 4368 v1.AddArg(dst) 4369 v1.AddArg(src) 4370 v1.AddArg(mem) 4371 v0.AddArg(v1) 4372 v.AddArg(v0) 4373 return true 4374 } 4375 // match: (Move [s] dst src mem) 4376 // cond: s > 768 && s <= 1024 4377 // 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)))) 4378 for { 4379 s := v.AuxInt 4380 _ = v.Args[2] 4381 dst := v.Args[0] 4382 src := v.Args[1] 4383 mem := v.Args[2] 4384 if !(s > 768 && s <= 1024) { 4385 break 4386 } 4387 v.reset(OpS390XMVC) 4388 v.AuxInt = makeValAndOff(s-768, 768) 4389 v.AddArg(dst) 4390 v.AddArg(src) 4391 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4392 v0.AuxInt = makeValAndOff(256, 512) 4393 v0.AddArg(dst) 4394 v0.AddArg(src) 4395 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4396 v1.AuxInt = makeValAndOff(256, 256) 4397 v1.AddArg(dst) 4398 v1.AddArg(src) 4399 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4400 v2.AuxInt = makeValAndOff(256, 0) 4401 v2.AddArg(dst) 4402 v2.AddArg(src) 4403 v2.AddArg(mem) 4404 v1.AddArg(v2) 4405 v0.AddArg(v1) 4406 v.AddArg(v0) 4407 return true 4408 } 4409 // match: (Move [s] dst src mem) 4410 // cond: s > 1024 4411 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4412 for { 4413 s := v.AuxInt 4414 _ = v.Args[2] 4415 dst := v.Args[0] 4416 src := v.Args[1] 4417 mem := v.Args[2] 4418 if !(s > 1024) { 4419 break 4420 } 4421 v.reset(OpS390XLoweredMove) 4422 v.AuxInt = s % 256 4423 v.AddArg(dst) 4424 v.AddArg(src) 4425 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4426 v0.AuxInt = (s / 256) * 256 4427 v0.AddArg(src) 4428 v.AddArg(v0) 4429 v.AddArg(mem) 4430 return true 4431 } 4432 return false 4433 } 4434 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4435 // match: (Mul16 x y) 4436 // cond: 4437 // result: (MULLW x y) 4438 for { 4439 _ = v.Args[1] 4440 x := v.Args[0] 4441 y := v.Args[1] 4442 v.reset(OpS390XMULLW) 4443 v.AddArg(x) 4444 v.AddArg(y) 4445 return true 4446 } 4447 } 4448 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4449 // match: (Mul32 x y) 4450 // cond: 4451 // result: (MULLW x y) 4452 for { 4453 _ = v.Args[1] 4454 x := v.Args[0] 4455 y := v.Args[1] 4456 v.reset(OpS390XMULLW) 4457 v.AddArg(x) 4458 v.AddArg(y) 4459 return true 4460 } 4461 } 4462 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4463 // match: (Mul32F x y) 4464 // cond: 4465 // result: (FMULS x y) 4466 for { 4467 _ = v.Args[1] 4468 x := v.Args[0] 4469 y := v.Args[1] 4470 v.reset(OpS390XFMULS) 4471 v.AddArg(x) 4472 v.AddArg(y) 4473 return true 4474 } 4475 } 4476 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4477 // match: (Mul64 x y) 4478 // cond: 4479 // result: (MULLD x y) 4480 for { 4481 _ = v.Args[1] 4482 x := v.Args[0] 4483 y := v.Args[1] 4484 v.reset(OpS390XMULLD) 4485 v.AddArg(x) 4486 v.AddArg(y) 4487 return true 4488 } 4489 } 4490 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4491 // match: (Mul64F x y) 4492 // cond: 4493 // result: (FMUL x y) 4494 for { 4495 _ = v.Args[1] 4496 x := v.Args[0] 4497 y := v.Args[1] 4498 v.reset(OpS390XFMUL) 4499 v.AddArg(x) 4500 v.AddArg(y) 4501 return true 4502 } 4503 } 4504 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4505 // match: (Mul8 x y) 4506 // cond: 4507 // result: (MULLW x y) 4508 for { 4509 _ = v.Args[1] 4510 x := v.Args[0] 4511 y := v.Args[1] 4512 v.reset(OpS390XMULLW) 4513 v.AddArg(x) 4514 v.AddArg(y) 4515 return true 4516 } 4517 } 4518 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4519 b := v.Block 4520 _ = b 4521 typ := &b.Func.Config.Types 4522 _ = typ 4523 // match: (Neg16 x) 4524 // cond: 4525 // result: (NEGW (MOVHreg x)) 4526 for { 4527 x := v.Args[0] 4528 v.reset(OpS390XNEGW) 4529 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4530 v0.AddArg(x) 4531 v.AddArg(v0) 4532 return true 4533 } 4534 } 4535 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4536 // match: (Neg32 x) 4537 // cond: 4538 // result: (NEGW x) 4539 for { 4540 x := v.Args[0] 4541 v.reset(OpS390XNEGW) 4542 v.AddArg(x) 4543 return true 4544 } 4545 } 4546 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4547 // match: (Neg32F x) 4548 // cond: 4549 // result: (FNEGS x) 4550 for { 4551 x := v.Args[0] 4552 v.reset(OpS390XFNEGS) 4553 v.AddArg(x) 4554 return true 4555 } 4556 } 4557 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4558 // match: (Neg64 x) 4559 // cond: 4560 // result: (NEG x) 4561 for { 4562 x := v.Args[0] 4563 v.reset(OpS390XNEG) 4564 v.AddArg(x) 4565 return true 4566 } 4567 } 4568 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4569 // match: (Neg64F x) 4570 // cond: 4571 // result: (FNEG x) 4572 for { 4573 x := v.Args[0] 4574 v.reset(OpS390XFNEG) 4575 v.AddArg(x) 4576 return true 4577 } 4578 } 4579 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4580 b := v.Block 4581 _ = b 4582 typ := &b.Func.Config.Types 4583 _ = typ 4584 // match: (Neg8 x) 4585 // cond: 4586 // result: (NEGW (MOVBreg x)) 4587 for { 4588 x := v.Args[0] 4589 v.reset(OpS390XNEGW) 4590 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4591 v0.AddArg(x) 4592 v.AddArg(v0) 4593 return true 4594 } 4595 } 4596 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4597 b := v.Block 4598 _ = b 4599 typ := &b.Func.Config.Types 4600 _ = typ 4601 // match: (Neq16 x y) 4602 // cond: 4603 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4604 for { 4605 _ = v.Args[1] 4606 x := v.Args[0] 4607 y := v.Args[1] 4608 v.reset(OpS390XMOVDNE) 4609 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4610 v0.AuxInt = 0 4611 v.AddArg(v0) 4612 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4613 v1.AuxInt = 1 4614 v.AddArg(v1) 4615 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4616 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4617 v3.AddArg(x) 4618 v2.AddArg(v3) 4619 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4620 v4.AddArg(y) 4621 v2.AddArg(v4) 4622 v.AddArg(v2) 4623 return true 4624 } 4625 } 4626 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 4627 b := v.Block 4628 _ = b 4629 typ := &b.Func.Config.Types 4630 _ = typ 4631 // match: (Neq32 x y) 4632 // cond: 4633 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4634 for { 4635 _ = v.Args[1] 4636 x := v.Args[0] 4637 y := v.Args[1] 4638 v.reset(OpS390XMOVDNE) 4639 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4640 v0.AuxInt = 0 4641 v.AddArg(v0) 4642 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4643 v1.AuxInt = 1 4644 v.AddArg(v1) 4645 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4646 v2.AddArg(x) 4647 v2.AddArg(y) 4648 v.AddArg(v2) 4649 return true 4650 } 4651 } 4652 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 4653 b := v.Block 4654 _ = b 4655 typ := &b.Func.Config.Types 4656 _ = typ 4657 // match: (Neq32F x y) 4658 // cond: 4659 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4660 for { 4661 _ = v.Args[1] 4662 x := v.Args[0] 4663 y := v.Args[1] 4664 v.reset(OpS390XMOVDNE) 4665 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4666 v0.AuxInt = 0 4667 v.AddArg(v0) 4668 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4669 v1.AuxInt = 1 4670 v.AddArg(v1) 4671 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 4672 v2.AddArg(x) 4673 v2.AddArg(y) 4674 v.AddArg(v2) 4675 return true 4676 } 4677 } 4678 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 4679 b := v.Block 4680 _ = b 4681 typ := &b.Func.Config.Types 4682 _ = typ 4683 // match: (Neq64 x y) 4684 // cond: 4685 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4686 for { 4687 _ = v.Args[1] 4688 x := v.Args[0] 4689 y := v.Args[1] 4690 v.reset(OpS390XMOVDNE) 4691 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4692 v0.AuxInt = 0 4693 v.AddArg(v0) 4694 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4695 v1.AuxInt = 1 4696 v.AddArg(v1) 4697 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4698 v2.AddArg(x) 4699 v2.AddArg(y) 4700 v.AddArg(v2) 4701 return true 4702 } 4703 } 4704 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 4705 b := v.Block 4706 _ = b 4707 typ := &b.Func.Config.Types 4708 _ = typ 4709 // match: (Neq64F x y) 4710 // cond: 4711 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4712 for { 4713 _ = v.Args[1] 4714 x := v.Args[0] 4715 y := v.Args[1] 4716 v.reset(OpS390XMOVDNE) 4717 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4718 v0.AuxInt = 0 4719 v.AddArg(v0) 4720 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4721 v1.AuxInt = 1 4722 v.AddArg(v1) 4723 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 4724 v2.AddArg(x) 4725 v2.AddArg(y) 4726 v.AddArg(v2) 4727 return true 4728 } 4729 } 4730 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 4731 b := v.Block 4732 _ = b 4733 typ := &b.Func.Config.Types 4734 _ = typ 4735 // match: (Neq8 x y) 4736 // cond: 4737 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4738 for { 4739 _ = v.Args[1] 4740 x := v.Args[0] 4741 y := v.Args[1] 4742 v.reset(OpS390XMOVDNE) 4743 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4744 v0.AuxInt = 0 4745 v.AddArg(v0) 4746 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4747 v1.AuxInt = 1 4748 v.AddArg(v1) 4749 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4750 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4751 v3.AddArg(x) 4752 v2.AddArg(v3) 4753 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4754 v4.AddArg(y) 4755 v2.AddArg(v4) 4756 v.AddArg(v2) 4757 return true 4758 } 4759 } 4760 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 4761 b := v.Block 4762 _ = b 4763 typ := &b.Func.Config.Types 4764 _ = typ 4765 // match: (NeqB x y) 4766 // cond: 4767 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4768 for { 4769 _ = v.Args[1] 4770 x := v.Args[0] 4771 y := v.Args[1] 4772 v.reset(OpS390XMOVDNE) 4773 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4774 v0.AuxInt = 0 4775 v.AddArg(v0) 4776 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4777 v1.AuxInt = 1 4778 v.AddArg(v1) 4779 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4780 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4781 v3.AddArg(x) 4782 v2.AddArg(v3) 4783 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4784 v4.AddArg(y) 4785 v2.AddArg(v4) 4786 v.AddArg(v2) 4787 return true 4788 } 4789 } 4790 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 4791 b := v.Block 4792 _ = b 4793 typ := &b.Func.Config.Types 4794 _ = typ 4795 // match: (NeqPtr x y) 4796 // cond: 4797 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4798 for { 4799 _ = v.Args[1] 4800 x := v.Args[0] 4801 y := v.Args[1] 4802 v.reset(OpS390XMOVDNE) 4803 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4804 v0.AuxInt = 0 4805 v.AddArg(v0) 4806 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4807 v1.AuxInt = 1 4808 v.AddArg(v1) 4809 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4810 v2.AddArg(x) 4811 v2.AddArg(y) 4812 v.AddArg(v2) 4813 return true 4814 } 4815 } 4816 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 4817 // match: (NilCheck ptr mem) 4818 // cond: 4819 // result: (LoweredNilCheck ptr mem) 4820 for { 4821 _ = v.Args[1] 4822 ptr := v.Args[0] 4823 mem := v.Args[1] 4824 v.reset(OpS390XLoweredNilCheck) 4825 v.AddArg(ptr) 4826 v.AddArg(mem) 4827 return true 4828 } 4829 } 4830 func rewriteValueS390X_OpNot_0(v *Value) bool { 4831 // match: (Not x) 4832 // cond: 4833 // result: (XORWconst [1] x) 4834 for { 4835 x := v.Args[0] 4836 v.reset(OpS390XXORWconst) 4837 v.AuxInt = 1 4838 v.AddArg(x) 4839 return true 4840 } 4841 } 4842 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 4843 b := v.Block 4844 _ = b 4845 typ := &b.Func.Config.Types 4846 _ = typ 4847 // match: (OffPtr [off] ptr:(SP)) 4848 // cond: 4849 // result: (MOVDaddr [off] ptr) 4850 for { 4851 off := v.AuxInt 4852 ptr := v.Args[0] 4853 if ptr.Op != OpSP { 4854 break 4855 } 4856 v.reset(OpS390XMOVDaddr) 4857 v.AuxInt = off 4858 v.AddArg(ptr) 4859 return true 4860 } 4861 // match: (OffPtr [off] ptr) 4862 // cond: is32Bit(off) 4863 // result: (ADDconst [off] ptr) 4864 for { 4865 off := v.AuxInt 4866 ptr := v.Args[0] 4867 if !(is32Bit(off)) { 4868 break 4869 } 4870 v.reset(OpS390XADDconst) 4871 v.AuxInt = off 4872 v.AddArg(ptr) 4873 return true 4874 } 4875 // match: (OffPtr [off] ptr) 4876 // cond: 4877 // result: (ADD (MOVDconst [off]) ptr) 4878 for { 4879 off := v.AuxInt 4880 ptr := v.Args[0] 4881 v.reset(OpS390XADD) 4882 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4883 v0.AuxInt = off 4884 v.AddArg(v0) 4885 v.AddArg(ptr) 4886 return true 4887 } 4888 } 4889 func rewriteValueS390X_OpOr16_0(v *Value) bool { 4890 // match: (Or16 x y) 4891 // cond: 4892 // result: (ORW x y) 4893 for { 4894 _ = v.Args[1] 4895 x := v.Args[0] 4896 y := v.Args[1] 4897 v.reset(OpS390XORW) 4898 v.AddArg(x) 4899 v.AddArg(y) 4900 return true 4901 } 4902 } 4903 func rewriteValueS390X_OpOr32_0(v *Value) bool { 4904 // match: (Or32 x y) 4905 // cond: 4906 // result: (ORW x y) 4907 for { 4908 _ = v.Args[1] 4909 x := v.Args[0] 4910 y := v.Args[1] 4911 v.reset(OpS390XORW) 4912 v.AddArg(x) 4913 v.AddArg(y) 4914 return true 4915 } 4916 } 4917 func rewriteValueS390X_OpOr64_0(v *Value) bool { 4918 // match: (Or64 x y) 4919 // cond: 4920 // result: (OR x y) 4921 for { 4922 _ = v.Args[1] 4923 x := v.Args[0] 4924 y := v.Args[1] 4925 v.reset(OpS390XOR) 4926 v.AddArg(x) 4927 v.AddArg(y) 4928 return true 4929 } 4930 } 4931 func rewriteValueS390X_OpOr8_0(v *Value) bool { 4932 // match: (Or8 x y) 4933 // cond: 4934 // result: (ORW x y) 4935 for { 4936 _ = v.Args[1] 4937 x := v.Args[0] 4938 y := v.Args[1] 4939 v.reset(OpS390XORW) 4940 v.AddArg(x) 4941 v.AddArg(y) 4942 return true 4943 } 4944 } 4945 func rewriteValueS390X_OpOrB_0(v *Value) bool { 4946 // match: (OrB x y) 4947 // cond: 4948 // result: (ORW x y) 4949 for { 4950 _ = v.Args[1] 4951 x := v.Args[0] 4952 y := v.Args[1] 4953 v.reset(OpS390XORW) 4954 v.AddArg(x) 4955 v.AddArg(y) 4956 return true 4957 } 4958 } 4959 func rewriteValueS390X_OpRound_0(v *Value) bool { 4960 // match: (Round x) 4961 // cond: 4962 // result: (FIDBR [1] x) 4963 for { 4964 x := v.Args[0] 4965 v.reset(OpS390XFIDBR) 4966 v.AuxInt = 1 4967 v.AddArg(x) 4968 return true 4969 } 4970 } 4971 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 4972 // match: (Round32F x) 4973 // cond: 4974 // result: (LoweredRound32F x) 4975 for { 4976 x := v.Args[0] 4977 v.reset(OpS390XLoweredRound32F) 4978 v.AddArg(x) 4979 return true 4980 } 4981 } 4982 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 4983 // match: (Round64F x) 4984 // cond: 4985 // result: (LoweredRound64F x) 4986 for { 4987 x := v.Args[0] 4988 v.reset(OpS390XLoweredRound64F) 4989 v.AddArg(x) 4990 return true 4991 } 4992 } 4993 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 4994 b := v.Block 4995 _ = b 4996 typ := &b.Func.Config.Types 4997 _ = typ 4998 // match: (Rsh16Ux16 <t> x y) 4999 // cond: 5000 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 5001 for { 5002 t := v.Type 5003 _ = v.Args[1] 5004 x := v.Args[0] 5005 y := v.Args[1] 5006 v.reset(OpS390XANDW) 5007 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5008 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5009 v1.AddArg(x) 5010 v0.AddArg(v1) 5011 v0.AddArg(y) 5012 v.AddArg(v0) 5013 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5014 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5015 v3.AuxInt = 15 5016 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5017 v4.AddArg(y) 5018 v3.AddArg(v4) 5019 v2.AddArg(v3) 5020 v.AddArg(v2) 5021 return true 5022 } 5023 } 5024 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 5025 b := v.Block 5026 _ = b 5027 typ := &b.Func.Config.Types 5028 _ = typ 5029 // match: (Rsh16Ux32 <t> x y) 5030 // cond: 5031 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 5032 for { 5033 t := v.Type 5034 _ = v.Args[1] 5035 x := v.Args[0] 5036 y := v.Args[1] 5037 v.reset(OpS390XANDW) 5038 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5039 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5040 v1.AddArg(x) 5041 v0.AddArg(v1) 5042 v0.AddArg(y) 5043 v.AddArg(v0) 5044 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5045 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5046 v3.AuxInt = 15 5047 v3.AddArg(y) 5048 v2.AddArg(v3) 5049 v.AddArg(v2) 5050 return true 5051 } 5052 } 5053 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 5054 b := v.Block 5055 _ = b 5056 typ := &b.Func.Config.Types 5057 _ = typ 5058 // match: (Rsh16Ux64 <t> x y) 5059 // cond: 5060 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 5061 for { 5062 t := v.Type 5063 _ = v.Args[1] 5064 x := v.Args[0] 5065 y := v.Args[1] 5066 v.reset(OpS390XANDW) 5067 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5068 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5069 v1.AddArg(x) 5070 v0.AddArg(v1) 5071 v0.AddArg(y) 5072 v.AddArg(v0) 5073 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5074 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5075 v3.AuxInt = 15 5076 v3.AddArg(y) 5077 v2.AddArg(v3) 5078 v.AddArg(v2) 5079 return true 5080 } 5081 } 5082 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5083 b := v.Block 5084 _ = b 5085 typ := &b.Func.Config.Types 5086 _ = typ 5087 // match: (Rsh16Ux8 <t> x y) 5088 // cond: 5089 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 5090 for { 5091 t := v.Type 5092 _ = v.Args[1] 5093 x := v.Args[0] 5094 y := v.Args[1] 5095 v.reset(OpS390XANDW) 5096 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5097 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5098 v1.AddArg(x) 5099 v0.AddArg(v1) 5100 v0.AddArg(y) 5101 v.AddArg(v0) 5102 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5103 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5104 v3.AuxInt = 15 5105 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5106 v4.AddArg(y) 5107 v3.AddArg(v4) 5108 v2.AddArg(v3) 5109 v.AddArg(v2) 5110 return true 5111 } 5112 } 5113 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5114 b := v.Block 5115 _ = b 5116 typ := &b.Func.Config.Types 5117 _ = typ 5118 // match: (Rsh16x16 <t> x y) 5119 // cond: 5120 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 5121 for { 5122 t := v.Type 5123 _ = v.Args[1] 5124 x := v.Args[0] 5125 y := v.Args[1] 5126 v.reset(OpS390XSRAW) 5127 v.Type = t 5128 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5129 v0.AddArg(x) 5130 v.AddArg(v0) 5131 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5132 v1.AddArg(y) 5133 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5134 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5135 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5136 v4.AuxInt = 15 5137 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5138 v5.AddArg(y) 5139 v4.AddArg(v5) 5140 v3.AddArg(v4) 5141 v2.AddArg(v3) 5142 v1.AddArg(v2) 5143 v.AddArg(v1) 5144 return true 5145 } 5146 } 5147 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5148 b := v.Block 5149 _ = b 5150 typ := &b.Func.Config.Types 5151 _ = typ 5152 // match: (Rsh16x32 <t> x y) 5153 // cond: 5154 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 5155 for { 5156 t := v.Type 5157 _ = v.Args[1] 5158 x := v.Args[0] 5159 y := v.Args[1] 5160 v.reset(OpS390XSRAW) 5161 v.Type = t 5162 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5163 v0.AddArg(x) 5164 v.AddArg(v0) 5165 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5166 v1.AddArg(y) 5167 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5168 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5169 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5170 v4.AuxInt = 15 5171 v4.AddArg(y) 5172 v3.AddArg(v4) 5173 v2.AddArg(v3) 5174 v1.AddArg(v2) 5175 v.AddArg(v1) 5176 return true 5177 } 5178 } 5179 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5180 b := v.Block 5181 _ = b 5182 typ := &b.Func.Config.Types 5183 _ = typ 5184 // match: (Rsh16x64 <t> x y) 5185 // cond: 5186 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 5187 for { 5188 t := v.Type 5189 _ = v.Args[1] 5190 x := v.Args[0] 5191 y := v.Args[1] 5192 v.reset(OpS390XSRAW) 5193 v.Type = t 5194 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5195 v0.AddArg(x) 5196 v.AddArg(v0) 5197 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5198 v1.AddArg(y) 5199 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5200 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5201 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5202 v4.AuxInt = 15 5203 v4.AddArg(y) 5204 v3.AddArg(v4) 5205 v2.AddArg(v3) 5206 v1.AddArg(v2) 5207 v.AddArg(v1) 5208 return true 5209 } 5210 } 5211 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5212 b := v.Block 5213 _ = b 5214 typ := &b.Func.Config.Types 5215 _ = typ 5216 // match: (Rsh16x8 <t> x y) 5217 // cond: 5218 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 5219 for { 5220 t := v.Type 5221 _ = v.Args[1] 5222 x := v.Args[0] 5223 y := v.Args[1] 5224 v.reset(OpS390XSRAW) 5225 v.Type = t 5226 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5227 v0.AddArg(x) 5228 v.AddArg(v0) 5229 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5230 v1.AddArg(y) 5231 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5232 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5233 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5234 v4.AuxInt = 15 5235 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5236 v5.AddArg(y) 5237 v4.AddArg(v5) 5238 v3.AddArg(v4) 5239 v2.AddArg(v3) 5240 v1.AddArg(v2) 5241 v.AddArg(v1) 5242 return true 5243 } 5244 } 5245 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5246 b := v.Block 5247 _ = b 5248 typ := &b.Func.Config.Types 5249 _ = typ 5250 // match: (Rsh32Ux16 <t> x y) 5251 // cond: 5252 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5253 for { 5254 t := v.Type 5255 _ = v.Args[1] 5256 x := v.Args[0] 5257 y := v.Args[1] 5258 v.reset(OpS390XANDW) 5259 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5260 v0.AddArg(x) 5261 v0.AddArg(y) 5262 v.AddArg(v0) 5263 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5264 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5265 v2.AuxInt = 31 5266 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5267 v3.AddArg(y) 5268 v2.AddArg(v3) 5269 v1.AddArg(v2) 5270 v.AddArg(v1) 5271 return true 5272 } 5273 } 5274 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5275 b := v.Block 5276 _ = b 5277 // match: (Rsh32Ux32 <t> x y) 5278 // cond: 5279 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5280 for { 5281 t := v.Type 5282 _ = v.Args[1] 5283 x := v.Args[0] 5284 y := v.Args[1] 5285 v.reset(OpS390XANDW) 5286 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5287 v0.AddArg(x) 5288 v0.AddArg(y) 5289 v.AddArg(v0) 5290 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5291 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5292 v2.AuxInt = 31 5293 v2.AddArg(y) 5294 v1.AddArg(v2) 5295 v.AddArg(v1) 5296 return true 5297 } 5298 } 5299 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5300 b := v.Block 5301 _ = b 5302 // match: (Rsh32Ux64 <t> x y) 5303 // cond: 5304 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5305 for { 5306 t := v.Type 5307 _ = v.Args[1] 5308 x := v.Args[0] 5309 y := v.Args[1] 5310 v.reset(OpS390XANDW) 5311 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5312 v0.AddArg(x) 5313 v0.AddArg(y) 5314 v.AddArg(v0) 5315 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5316 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5317 v2.AuxInt = 31 5318 v2.AddArg(y) 5319 v1.AddArg(v2) 5320 v.AddArg(v1) 5321 return true 5322 } 5323 } 5324 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 5325 b := v.Block 5326 _ = b 5327 typ := &b.Func.Config.Types 5328 _ = typ 5329 // match: (Rsh32Ux8 <t> x y) 5330 // cond: 5331 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5332 for { 5333 t := v.Type 5334 _ = v.Args[1] 5335 x := v.Args[0] 5336 y := v.Args[1] 5337 v.reset(OpS390XANDW) 5338 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5339 v0.AddArg(x) 5340 v0.AddArg(y) 5341 v.AddArg(v0) 5342 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5343 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5344 v2.AuxInt = 31 5345 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5346 v3.AddArg(y) 5347 v2.AddArg(v3) 5348 v1.AddArg(v2) 5349 v.AddArg(v1) 5350 return true 5351 } 5352 } 5353 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 5354 b := v.Block 5355 _ = b 5356 typ := &b.Func.Config.Types 5357 _ = typ 5358 // match: (Rsh32x16 <t> x y) 5359 // cond: 5360 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5361 for { 5362 t := v.Type 5363 _ = v.Args[1] 5364 x := v.Args[0] 5365 y := v.Args[1] 5366 v.reset(OpS390XSRAW) 5367 v.Type = t 5368 v.AddArg(x) 5369 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5370 v0.AddArg(y) 5371 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5372 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5373 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5374 v3.AuxInt = 31 5375 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5376 v4.AddArg(y) 5377 v3.AddArg(v4) 5378 v2.AddArg(v3) 5379 v1.AddArg(v2) 5380 v0.AddArg(v1) 5381 v.AddArg(v0) 5382 return true 5383 } 5384 } 5385 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 5386 b := v.Block 5387 _ = b 5388 // match: (Rsh32x32 <t> x y) 5389 // cond: 5390 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5391 for { 5392 t := v.Type 5393 _ = v.Args[1] 5394 x := v.Args[0] 5395 y := v.Args[1] 5396 v.reset(OpS390XSRAW) 5397 v.Type = t 5398 v.AddArg(x) 5399 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5400 v0.AddArg(y) 5401 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5402 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5403 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5404 v3.AuxInt = 31 5405 v3.AddArg(y) 5406 v2.AddArg(v3) 5407 v1.AddArg(v2) 5408 v0.AddArg(v1) 5409 v.AddArg(v0) 5410 return true 5411 } 5412 } 5413 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 5414 b := v.Block 5415 _ = b 5416 // match: (Rsh32x64 <t> x y) 5417 // cond: 5418 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5419 for { 5420 t := v.Type 5421 _ = v.Args[1] 5422 x := v.Args[0] 5423 y := v.Args[1] 5424 v.reset(OpS390XSRAW) 5425 v.Type = t 5426 v.AddArg(x) 5427 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5428 v0.AddArg(y) 5429 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5430 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5431 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5432 v3.AuxInt = 31 5433 v3.AddArg(y) 5434 v2.AddArg(v3) 5435 v1.AddArg(v2) 5436 v0.AddArg(v1) 5437 v.AddArg(v0) 5438 return true 5439 } 5440 } 5441 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 5442 b := v.Block 5443 _ = b 5444 typ := &b.Func.Config.Types 5445 _ = typ 5446 // match: (Rsh32x8 <t> x y) 5447 // cond: 5448 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5449 for { 5450 t := v.Type 5451 _ = v.Args[1] 5452 x := v.Args[0] 5453 y := v.Args[1] 5454 v.reset(OpS390XSRAW) 5455 v.Type = t 5456 v.AddArg(x) 5457 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5458 v0.AddArg(y) 5459 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5460 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5461 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5462 v3.AuxInt = 31 5463 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5464 v4.AddArg(y) 5465 v3.AddArg(v4) 5466 v2.AddArg(v3) 5467 v1.AddArg(v2) 5468 v0.AddArg(v1) 5469 v.AddArg(v0) 5470 return true 5471 } 5472 } 5473 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 5474 b := v.Block 5475 _ = b 5476 typ := &b.Func.Config.Types 5477 _ = typ 5478 // match: (Rsh64Ux16 <t> x y) 5479 // cond: 5480 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5481 for { 5482 t := v.Type 5483 _ = v.Args[1] 5484 x := v.Args[0] 5485 y := v.Args[1] 5486 v.reset(OpS390XAND) 5487 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5488 v0.AddArg(x) 5489 v0.AddArg(y) 5490 v.AddArg(v0) 5491 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5492 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5493 v2.AuxInt = 63 5494 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5495 v3.AddArg(y) 5496 v2.AddArg(v3) 5497 v1.AddArg(v2) 5498 v.AddArg(v1) 5499 return true 5500 } 5501 } 5502 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 5503 b := v.Block 5504 _ = b 5505 // match: (Rsh64Ux32 <t> x y) 5506 // cond: 5507 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5508 for { 5509 t := v.Type 5510 _ = v.Args[1] 5511 x := v.Args[0] 5512 y := v.Args[1] 5513 v.reset(OpS390XAND) 5514 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5515 v0.AddArg(x) 5516 v0.AddArg(y) 5517 v.AddArg(v0) 5518 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5519 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5520 v2.AuxInt = 63 5521 v2.AddArg(y) 5522 v1.AddArg(v2) 5523 v.AddArg(v1) 5524 return true 5525 } 5526 } 5527 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 5528 b := v.Block 5529 _ = b 5530 // match: (Rsh64Ux64 <t> x y) 5531 // cond: 5532 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5533 for { 5534 t := v.Type 5535 _ = v.Args[1] 5536 x := v.Args[0] 5537 y := v.Args[1] 5538 v.reset(OpS390XAND) 5539 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5540 v0.AddArg(x) 5541 v0.AddArg(y) 5542 v.AddArg(v0) 5543 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5544 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5545 v2.AuxInt = 63 5546 v2.AddArg(y) 5547 v1.AddArg(v2) 5548 v.AddArg(v1) 5549 return true 5550 } 5551 } 5552 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 5553 b := v.Block 5554 _ = b 5555 typ := &b.Func.Config.Types 5556 _ = typ 5557 // match: (Rsh64Ux8 <t> x y) 5558 // cond: 5559 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5560 for { 5561 t := v.Type 5562 _ = v.Args[1] 5563 x := v.Args[0] 5564 y := v.Args[1] 5565 v.reset(OpS390XAND) 5566 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5567 v0.AddArg(x) 5568 v0.AddArg(y) 5569 v.AddArg(v0) 5570 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5571 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5572 v2.AuxInt = 63 5573 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5574 v3.AddArg(y) 5575 v2.AddArg(v3) 5576 v1.AddArg(v2) 5577 v.AddArg(v1) 5578 return true 5579 } 5580 } 5581 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 5582 b := v.Block 5583 _ = b 5584 typ := &b.Func.Config.Types 5585 _ = typ 5586 // match: (Rsh64x16 <t> x y) 5587 // cond: 5588 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5589 for { 5590 t := v.Type 5591 _ = v.Args[1] 5592 x := v.Args[0] 5593 y := v.Args[1] 5594 v.reset(OpS390XSRAD) 5595 v.Type = t 5596 v.AddArg(x) 5597 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5598 v0.AddArg(y) 5599 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5600 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5601 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5602 v3.AuxInt = 63 5603 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5604 v4.AddArg(y) 5605 v3.AddArg(v4) 5606 v2.AddArg(v3) 5607 v1.AddArg(v2) 5608 v0.AddArg(v1) 5609 v.AddArg(v0) 5610 return true 5611 } 5612 } 5613 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 5614 b := v.Block 5615 _ = b 5616 // match: (Rsh64x32 <t> x y) 5617 // cond: 5618 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5619 for { 5620 t := v.Type 5621 _ = v.Args[1] 5622 x := v.Args[0] 5623 y := v.Args[1] 5624 v.reset(OpS390XSRAD) 5625 v.Type = t 5626 v.AddArg(x) 5627 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5628 v0.AddArg(y) 5629 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5630 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5631 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5632 v3.AuxInt = 63 5633 v3.AddArg(y) 5634 v2.AddArg(v3) 5635 v1.AddArg(v2) 5636 v0.AddArg(v1) 5637 v.AddArg(v0) 5638 return true 5639 } 5640 } 5641 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 5642 b := v.Block 5643 _ = b 5644 // match: (Rsh64x64 <t> x y) 5645 // cond: 5646 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5647 for { 5648 t := v.Type 5649 _ = v.Args[1] 5650 x := v.Args[0] 5651 y := v.Args[1] 5652 v.reset(OpS390XSRAD) 5653 v.Type = t 5654 v.AddArg(x) 5655 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5656 v0.AddArg(y) 5657 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5658 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5659 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5660 v3.AuxInt = 63 5661 v3.AddArg(y) 5662 v2.AddArg(v3) 5663 v1.AddArg(v2) 5664 v0.AddArg(v1) 5665 v.AddArg(v0) 5666 return true 5667 } 5668 } 5669 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 5670 b := v.Block 5671 _ = b 5672 typ := &b.Func.Config.Types 5673 _ = typ 5674 // match: (Rsh64x8 <t> x y) 5675 // cond: 5676 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5677 for { 5678 t := v.Type 5679 _ = v.Args[1] 5680 x := v.Args[0] 5681 y := v.Args[1] 5682 v.reset(OpS390XSRAD) 5683 v.Type = t 5684 v.AddArg(x) 5685 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5686 v0.AddArg(y) 5687 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5688 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5689 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5690 v3.AuxInt = 63 5691 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5692 v4.AddArg(y) 5693 v3.AddArg(v4) 5694 v2.AddArg(v3) 5695 v1.AddArg(v2) 5696 v0.AddArg(v1) 5697 v.AddArg(v0) 5698 return true 5699 } 5700 } 5701 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 5702 b := v.Block 5703 _ = b 5704 typ := &b.Func.Config.Types 5705 _ = typ 5706 // match: (Rsh8Ux16 <t> x y) 5707 // cond: 5708 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5709 for { 5710 t := v.Type 5711 _ = v.Args[1] 5712 x := v.Args[0] 5713 y := v.Args[1] 5714 v.reset(OpS390XANDW) 5715 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5716 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5717 v1.AddArg(x) 5718 v0.AddArg(v1) 5719 v0.AddArg(y) 5720 v.AddArg(v0) 5721 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5722 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5723 v3.AuxInt = 7 5724 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5725 v4.AddArg(y) 5726 v3.AddArg(v4) 5727 v2.AddArg(v3) 5728 v.AddArg(v2) 5729 return true 5730 } 5731 } 5732 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 5733 b := v.Block 5734 _ = b 5735 typ := &b.Func.Config.Types 5736 _ = typ 5737 // match: (Rsh8Ux32 <t> x y) 5738 // cond: 5739 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5740 for { 5741 t := v.Type 5742 _ = v.Args[1] 5743 x := v.Args[0] 5744 y := v.Args[1] 5745 v.reset(OpS390XANDW) 5746 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5747 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5748 v1.AddArg(x) 5749 v0.AddArg(v1) 5750 v0.AddArg(y) 5751 v.AddArg(v0) 5752 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5753 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5754 v3.AuxInt = 7 5755 v3.AddArg(y) 5756 v2.AddArg(v3) 5757 v.AddArg(v2) 5758 return true 5759 } 5760 } 5761 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 5762 b := v.Block 5763 _ = b 5764 typ := &b.Func.Config.Types 5765 _ = typ 5766 // match: (Rsh8Ux64 <t> x y) 5767 // cond: 5768 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5769 for { 5770 t := v.Type 5771 _ = v.Args[1] 5772 x := v.Args[0] 5773 y := v.Args[1] 5774 v.reset(OpS390XANDW) 5775 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5776 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5777 v1.AddArg(x) 5778 v0.AddArg(v1) 5779 v0.AddArg(y) 5780 v.AddArg(v0) 5781 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5782 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5783 v3.AuxInt = 7 5784 v3.AddArg(y) 5785 v2.AddArg(v3) 5786 v.AddArg(v2) 5787 return true 5788 } 5789 } 5790 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 5791 b := v.Block 5792 _ = b 5793 typ := &b.Func.Config.Types 5794 _ = typ 5795 // match: (Rsh8Ux8 <t> x y) 5796 // cond: 5797 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5798 for { 5799 t := v.Type 5800 _ = v.Args[1] 5801 x := v.Args[0] 5802 y := v.Args[1] 5803 v.reset(OpS390XANDW) 5804 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5805 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5806 v1.AddArg(x) 5807 v0.AddArg(v1) 5808 v0.AddArg(y) 5809 v.AddArg(v0) 5810 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5811 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5812 v3.AuxInt = 7 5813 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5814 v4.AddArg(y) 5815 v3.AddArg(v4) 5816 v2.AddArg(v3) 5817 v.AddArg(v2) 5818 return true 5819 } 5820 } 5821 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 5822 b := v.Block 5823 _ = b 5824 typ := &b.Func.Config.Types 5825 _ = typ 5826 // match: (Rsh8x16 <t> x y) 5827 // cond: 5828 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5829 for { 5830 t := v.Type 5831 _ = v.Args[1] 5832 x := v.Args[0] 5833 y := v.Args[1] 5834 v.reset(OpS390XSRAW) 5835 v.Type = t 5836 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5837 v0.AddArg(x) 5838 v.AddArg(v0) 5839 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5840 v1.AddArg(y) 5841 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5842 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5843 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5844 v4.AuxInt = 7 5845 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5846 v5.AddArg(y) 5847 v4.AddArg(v5) 5848 v3.AddArg(v4) 5849 v2.AddArg(v3) 5850 v1.AddArg(v2) 5851 v.AddArg(v1) 5852 return true 5853 } 5854 } 5855 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 5856 b := v.Block 5857 _ = b 5858 typ := &b.Func.Config.Types 5859 _ = typ 5860 // match: (Rsh8x32 <t> x y) 5861 // cond: 5862 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5863 for { 5864 t := v.Type 5865 _ = v.Args[1] 5866 x := v.Args[0] 5867 y := v.Args[1] 5868 v.reset(OpS390XSRAW) 5869 v.Type = t 5870 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5871 v0.AddArg(x) 5872 v.AddArg(v0) 5873 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5874 v1.AddArg(y) 5875 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5876 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5877 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5878 v4.AuxInt = 7 5879 v4.AddArg(y) 5880 v3.AddArg(v4) 5881 v2.AddArg(v3) 5882 v1.AddArg(v2) 5883 v.AddArg(v1) 5884 return true 5885 } 5886 } 5887 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 5888 b := v.Block 5889 _ = b 5890 typ := &b.Func.Config.Types 5891 _ = typ 5892 // match: (Rsh8x64 <t> x y) 5893 // cond: 5894 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5895 for { 5896 t := v.Type 5897 _ = v.Args[1] 5898 x := v.Args[0] 5899 y := v.Args[1] 5900 v.reset(OpS390XSRAW) 5901 v.Type = t 5902 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5903 v0.AddArg(x) 5904 v.AddArg(v0) 5905 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5906 v1.AddArg(y) 5907 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5908 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5909 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5910 v4.AuxInt = 7 5911 v4.AddArg(y) 5912 v3.AddArg(v4) 5913 v2.AddArg(v3) 5914 v1.AddArg(v2) 5915 v.AddArg(v1) 5916 return true 5917 } 5918 } 5919 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 5920 b := v.Block 5921 _ = b 5922 typ := &b.Func.Config.Types 5923 _ = typ 5924 // match: (Rsh8x8 <t> x y) 5925 // cond: 5926 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5927 for { 5928 t := v.Type 5929 _ = v.Args[1] 5930 x := v.Args[0] 5931 y := v.Args[1] 5932 v.reset(OpS390XSRAW) 5933 v.Type = t 5934 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5935 v0.AddArg(x) 5936 v.AddArg(v0) 5937 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5938 v1.AddArg(y) 5939 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5940 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5941 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5942 v4.AuxInt = 7 5943 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5944 v5.AddArg(y) 5945 v4.AddArg(v5) 5946 v3.AddArg(v4) 5947 v2.AddArg(v3) 5948 v1.AddArg(v2) 5949 v.AddArg(v1) 5950 return true 5951 } 5952 } 5953 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 5954 // match: (ADD x (MOVDconst [c])) 5955 // cond: is32Bit(c) 5956 // result: (ADDconst [c] x) 5957 for { 5958 _ = v.Args[1] 5959 x := v.Args[0] 5960 v_1 := v.Args[1] 5961 if v_1.Op != OpS390XMOVDconst { 5962 break 5963 } 5964 c := v_1.AuxInt 5965 if !(is32Bit(c)) { 5966 break 5967 } 5968 v.reset(OpS390XADDconst) 5969 v.AuxInt = c 5970 v.AddArg(x) 5971 return true 5972 } 5973 // match: (ADD (MOVDconst [c]) x) 5974 // cond: is32Bit(c) 5975 // result: (ADDconst [c] x) 5976 for { 5977 _ = v.Args[1] 5978 v_0 := v.Args[0] 5979 if v_0.Op != OpS390XMOVDconst { 5980 break 5981 } 5982 c := v_0.AuxInt 5983 x := v.Args[1] 5984 if !(is32Bit(c)) { 5985 break 5986 } 5987 v.reset(OpS390XADDconst) 5988 v.AuxInt = c 5989 v.AddArg(x) 5990 return true 5991 } 5992 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 5993 // cond: d == 64-c 5994 // result: (RLLGconst [c] x) 5995 for { 5996 _ = v.Args[1] 5997 v_0 := v.Args[0] 5998 if v_0.Op != OpS390XSLDconst { 5999 break 6000 } 6001 c := v_0.AuxInt 6002 x := v_0.Args[0] 6003 v_1 := v.Args[1] 6004 if v_1.Op != OpS390XSRDconst { 6005 break 6006 } 6007 d := v_1.AuxInt 6008 if x != v_1.Args[0] { 6009 break 6010 } 6011 if !(d == 64-c) { 6012 break 6013 } 6014 v.reset(OpS390XRLLGconst) 6015 v.AuxInt = c 6016 v.AddArg(x) 6017 return true 6018 } 6019 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 6020 // cond: d == 64-c 6021 // result: (RLLGconst [c] x) 6022 for { 6023 _ = v.Args[1] 6024 v_0 := v.Args[0] 6025 if v_0.Op != OpS390XSRDconst { 6026 break 6027 } 6028 d := v_0.AuxInt 6029 x := v_0.Args[0] 6030 v_1 := v.Args[1] 6031 if v_1.Op != OpS390XSLDconst { 6032 break 6033 } 6034 c := v_1.AuxInt 6035 if x != v_1.Args[0] { 6036 break 6037 } 6038 if !(d == 64-c) { 6039 break 6040 } 6041 v.reset(OpS390XRLLGconst) 6042 v.AuxInt = c 6043 v.AddArg(x) 6044 return true 6045 } 6046 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 6047 // cond: ptr.Op != OpSB && idx.Op != OpSB 6048 // result: (MOVDaddridx [c] {s} ptr idx) 6049 for { 6050 _ = v.Args[1] 6051 idx := v.Args[0] 6052 v_1 := v.Args[1] 6053 if v_1.Op != OpS390XMOVDaddr { 6054 break 6055 } 6056 c := v_1.AuxInt 6057 s := v_1.Aux 6058 ptr := v_1.Args[0] 6059 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6060 break 6061 } 6062 v.reset(OpS390XMOVDaddridx) 6063 v.AuxInt = c 6064 v.Aux = s 6065 v.AddArg(ptr) 6066 v.AddArg(idx) 6067 return true 6068 } 6069 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 6070 // cond: ptr.Op != OpSB && idx.Op != OpSB 6071 // result: (MOVDaddridx [c] {s} ptr idx) 6072 for { 6073 _ = v.Args[1] 6074 v_0 := v.Args[0] 6075 if v_0.Op != OpS390XMOVDaddr { 6076 break 6077 } 6078 c := v_0.AuxInt 6079 s := v_0.Aux 6080 ptr := v_0.Args[0] 6081 idx := v.Args[1] 6082 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6083 break 6084 } 6085 v.reset(OpS390XMOVDaddridx) 6086 v.AuxInt = c 6087 v.Aux = s 6088 v.AddArg(ptr) 6089 v.AddArg(idx) 6090 return true 6091 } 6092 // match: (ADD x (NEG y)) 6093 // cond: 6094 // result: (SUB x y) 6095 for { 6096 _ = v.Args[1] 6097 x := v.Args[0] 6098 v_1 := v.Args[1] 6099 if v_1.Op != OpS390XNEG { 6100 break 6101 } 6102 y := v_1.Args[0] 6103 v.reset(OpS390XSUB) 6104 v.AddArg(x) 6105 v.AddArg(y) 6106 return true 6107 } 6108 // match: (ADD (NEG y) x) 6109 // cond: 6110 // result: (SUB x y) 6111 for { 6112 _ = v.Args[1] 6113 v_0 := v.Args[0] 6114 if v_0.Op != OpS390XNEG { 6115 break 6116 } 6117 y := v_0.Args[0] 6118 x := v.Args[1] 6119 v.reset(OpS390XSUB) 6120 v.AddArg(x) 6121 v.AddArg(y) 6122 return true 6123 } 6124 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6125 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6126 // result: (ADDload <t> [off] {sym} x ptr mem) 6127 for { 6128 t := v.Type 6129 _ = v.Args[1] 6130 x := v.Args[0] 6131 g := v.Args[1] 6132 if g.Op != OpS390XMOVDload { 6133 break 6134 } 6135 off := g.AuxInt 6136 sym := g.Aux 6137 _ = g.Args[1] 6138 ptr := g.Args[0] 6139 mem := g.Args[1] 6140 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6141 break 6142 } 6143 v.reset(OpS390XADDload) 6144 v.Type = t 6145 v.AuxInt = off 6146 v.Aux = sym 6147 v.AddArg(x) 6148 v.AddArg(ptr) 6149 v.AddArg(mem) 6150 return true 6151 } 6152 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6153 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6154 // result: (ADDload <t> [off] {sym} x ptr mem) 6155 for { 6156 t := v.Type 6157 _ = v.Args[1] 6158 g := v.Args[0] 6159 if g.Op != OpS390XMOVDload { 6160 break 6161 } 6162 off := g.AuxInt 6163 sym := g.Aux 6164 _ = g.Args[1] 6165 ptr := g.Args[0] 6166 mem := g.Args[1] 6167 x := v.Args[1] 6168 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6169 break 6170 } 6171 v.reset(OpS390XADDload) 6172 v.Type = t 6173 v.AuxInt = off 6174 v.Aux = sym 6175 v.AddArg(x) 6176 v.AddArg(ptr) 6177 v.AddArg(mem) 6178 return true 6179 } 6180 return false 6181 } 6182 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 6183 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6184 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6185 // result: (ADDload <t> [off] {sym} x ptr mem) 6186 for { 6187 t := v.Type 6188 _ = v.Args[1] 6189 g := v.Args[0] 6190 if g.Op != OpS390XMOVDload { 6191 break 6192 } 6193 off := g.AuxInt 6194 sym := g.Aux 6195 _ = g.Args[1] 6196 ptr := g.Args[0] 6197 mem := g.Args[1] 6198 x := v.Args[1] 6199 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6200 break 6201 } 6202 v.reset(OpS390XADDload) 6203 v.Type = t 6204 v.AuxInt = off 6205 v.Aux = sym 6206 v.AddArg(x) 6207 v.AddArg(ptr) 6208 v.AddArg(mem) 6209 return true 6210 } 6211 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6212 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6213 // result: (ADDload <t> [off] {sym} x ptr mem) 6214 for { 6215 t := v.Type 6216 _ = v.Args[1] 6217 x := v.Args[0] 6218 g := v.Args[1] 6219 if g.Op != OpS390XMOVDload { 6220 break 6221 } 6222 off := g.AuxInt 6223 sym := g.Aux 6224 _ = g.Args[1] 6225 ptr := g.Args[0] 6226 mem := g.Args[1] 6227 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6228 break 6229 } 6230 v.reset(OpS390XADDload) 6231 v.Type = t 6232 v.AuxInt = off 6233 v.Aux = sym 6234 v.AddArg(x) 6235 v.AddArg(ptr) 6236 v.AddArg(mem) 6237 return true 6238 } 6239 return false 6240 } 6241 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 6242 // match: (ADDW x (MOVDconst [c])) 6243 // cond: 6244 // result: (ADDWconst [c] x) 6245 for { 6246 _ = v.Args[1] 6247 x := v.Args[0] 6248 v_1 := v.Args[1] 6249 if v_1.Op != OpS390XMOVDconst { 6250 break 6251 } 6252 c := v_1.AuxInt 6253 v.reset(OpS390XADDWconst) 6254 v.AuxInt = c 6255 v.AddArg(x) 6256 return true 6257 } 6258 // match: (ADDW (MOVDconst [c]) x) 6259 // cond: 6260 // result: (ADDWconst [c] x) 6261 for { 6262 _ = v.Args[1] 6263 v_0 := v.Args[0] 6264 if v_0.Op != OpS390XMOVDconst { 6265 break 6266 } 6267 c := v_0.AuxInt 6268 x := v.Args[1] 6269 v.reset(OpS390XADDWconst) 6270 v.AuxInt = c 6271 v.AddArg(x) 6272 return true 6273 } 6274 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 6275 // cond: d == 32-c 6276 // result: (RLLconst [c] x) 6277 for { 6278 _ = v.Args[1] 6279 v_0 := v.Args[0] 6280 if v_0.Op != OpS390XSLWconst { 6281 break 6282 } 6283 c := v_0.AuxInt 6284 x := v_0.Args[0] 6285 v_1 := v.Args[1] 6286 if v_1.Op != OpS390XSRWconst { 6287 break 6288 } 6289 d := v_1.AuxInt 6290 if x != v_1.Args[0] { 6291 break 6292 } 6293 if !(d == 32-c) { 6294 break 6295 } 6296 v.reset(OpS390XRLLconst) 6297 v.AuxInt = c 6298 v.AddArg(x) 6299 return true 6300 } 6301 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6302 // cond: d == 32-c 6303 // result: (RLLconst [c] x) 6304 for { 6305 _ = v.Args[1] 6306 v_0 := v.Args[0] 6307 if v_0.Op != OpS390XSRWconst { 6308 break 6309 } 6310 d := v_0.AuxInt 6311 x := v_0.Args[0] 6312 v_1 := v.Args[1] 6313 if v_1.Op != OpS390XSLWconst { 6314 break 6315 } 6316 c := v_1.AuxInt 6317 if x != v_1.Args[0] { 6318 break 6319 } 6320 if !(d == 32-c) { 6321 break 6322 } 6323 v.reset(OpS390XRLLconst) 6324 v.AuxInt = c 6325 v.AddArg(x) 6326 return true 6327 } 6328 // match: (ADDW x (NEGW y)) 6329 // cond: 6330 // result: (SUBW x y) 6331 for { 6332 _ = v.Args[1] 6333 x := v.Args[0] 6334 v_1 := v.Args[1] 6335 if v_1.Op != OpS390XNEGW { 6336 break 6337 } 6338 y := v_1.Args[0] 6339 v.reset(OpS390XSUBW) 6340 v.AddArg(x) 6341 v.AddArg(y) 6342 return true 6343 } 6344 // match: (ADDW (NEGW y) x) 6345 // cond: 6346 // result: (SUBW x y) 6347 for { 6348 _ = v.Args[1] 6349 v_0 := v.Args[0] 6350 if v_0.Op != OpS390XNEGW { 6351 break 6352 } 6353 y := v_0.Args[0] 6354 x := v.Args[1] 6355 v.reset(OpS390XSUBW) 6356 v.AddArg(x) 6357 v.AddArg(y) 6358 return true 6359 } 6360 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6361 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6362 // result: (ADDWload <t> [off] {sym} x ptr mem) 6363 for { 6364 t := v.Type 6365 _ = v.Args[1] 6366 x := v.Args[0] 6367 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6377 break 6378 } 6379 v.reset(OpS390XADDWload) 6380 v.Type = t 6381 v.AuxInt = off 6382 v.Aux = sym 6383 v.AddArg(x) 6384 v.AddArg(ptr) 6385 v.AddArg(mem) 6386 return true 6387 } 6388 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6389 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6390 // result: (ADDWload <t> [off] {sym} x ptr mem) 6391 for { 6392 t := v.Type 6393 _ = v.Args[1] 6394 g := v.Args[0] 6395 if g.Op != OpS390XMOVWload { 6396 break 6397 } 6398 off := g.AuxInt 6399 sym := g.Aux 6400 _ = g.Args[1] 6401 ptr := g.Args[0] 6402 mem := g.Args[1] 6403 x := v.Args[1] 6404 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6405 break 6406 } 6407 v.reset(OpS390XADDWload) 6408 v.Type = t 6409 v.AuxInt = off 6410 v.Aux = sym 6411 v.AddArg(x) 6412 v.AddArg(ptr) 6413 v.AddArg(mem) 6414 return true 6415 } 6416 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6417 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6418 // result: (ADDWload <t> [off] {sym} x ptr mem) 6419 for { 6420 t := v.Type 6421 _ = v.Args[1] 6422 g := v.Args[0] 6423 if g.Op != OpS390XMOVWload { 6424 break 6425 } 6426 off := g.AuxInt 6427 sym := g.Aux 6428 _ = g.Args[1] 6429 ptr := g.Args[0] 6430 mem := g.Args[1] 6431 x := v.Args[1] 6432 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6433 break 6434 } 6435 v.reset(OpS390XADDWload) 6436 v.Type = t 6437 v.AuxInt = off 6438 v.Aux = sym 6439 v.AddArg(x) 6440 v.AddArg(ptr) 6441 v.AddArg(mem) 6442 return true 6443 } 6444 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6445 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6446 // result: (ADDWload <t> [off] {sym} x ptr mem) 6447 for { 6448 t := v.Type 6449 _ = v.Args[1] 6450 x := v.Args[0] 6451 g := v.Args[1] 6452 if g.Op != OpS390XMOVWload { 6453 break 6454 } 6455 off := g.AuxInt 6456 sym := g.Aux 6457 _ = g.Args[1] 6458 ptr := g.Args[0] 6459 mem := g.Args[1] 6460 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6461 break 6462 } 6463 v.reset(OpS390XADDWload) 6464 v.Type = t 6465 v.AuxInt = off 6466 v.Aux = sym 6467 v.AddArg(x) 6468 v.AddArg(ptr) 6469 v.AddArg(mem) 6470 return true 6471 } 6472 return false 6473 } 6474 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 6475 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6476 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6477 // result: (ADDWload <t> [off] {sym} x ptr mem) 6478 for { 6479 t := v.Type 6480 _ = v.Args[1] 6481 x := v.Args[0] 6482 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6492 break 6493 } 6494 v.reset(OpS390XADDWload) 6495 v.Type = t 6496 v.AuxInt = off 6497 v.Aux = sym 6498 v.AddArg(x) 6499 v.AddArg(ptr) 6500 v.AddArg(mem) 6501 return true 6502 } 6503 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6504 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6505 // result: (ADDWload <t> [off] {sym} x ptr mem) 6506 for { 6507 t := v.Type 6508 _ = v.Args[1] 6509 g := v.Args[0] 6510 if g.Op != OpS390XMOVWZload { 6511 break 6512 } 6513 off := g.AuxInt 6514 sym := g.Aux 6515 _ = g.Args[1] 6516 ptr := g.Args[0] 6517 mem := g.Args[1] 6518 x := v.Args[1] 6519 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6520 break 6521 } 6522 v.reset(OpS390XADDWload) 6523 v.Type = t 6524 v.AuxInt = off 6525 v.Aux = sym 6526 v.AddArg(x) 6527 v.AddArg(ptr) 6528 v.AddArg(mem) 6529 return true 6530 } 6531 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6532 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6533 // result: (ADDWload <t> [off] {sym} x ptr mem) 6534 for { 6535 t := v.Type 6536 _ = v.Args[1] 6537 g := v.Args[0] 6538 if g.Op != OpS390XMOVWZload { 6539 break 6540 } 6541 off := g.AuxInt 6542 sym := g.Aux 6543 _ = g.Args[1] 6544 ptr := g.Args[0] 6545 mem := g.Args[1] 6546 x := v.Args[1] 6547 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6548 break 6549 } 6550 v.reset(OpS390XADDWload) 6551 v.Type = t 6552 v.AuxInt = off 6553 v.Aux = sym 6554 v.AddArg(x) 6555 v.AddArg(ptr) 6556 v.AddArg(mem) 6557 return true 6558 } 6559 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6560 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6561 // result: (ADDWload <t> [off] {sym} x ptr mem) 6562 for { 6563 t := v.Type 6564 _ = v.Args[1] 6565 x := v.Args[0] 6566 g := v.Args[1] 6567 if g.Op != OpS390XMOVWZload { 6568 break 6569 } 6570 off := g.AuxInt 6571 sym := g.Aux 6572 _ = g.Args[1] 6573 ptr := g.Args[0] 6574 mem := g.Args[1] 6575 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6576 break 6577 } 6578 v.reset(OpS390XADDWload) 6579 v.Type = t 6580 v.AuxInt = off 6581 v.Aux = sym 6582 v.AddArg(x) 6583 v.AddArg(ptr) 6584 v.AddArg(mem) 6585 return true 6586 } 6587 return false 6588 } 6589 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 6590 // match: (ADDWconst [c] x) 6591 // cond: int32(c)==0 6592 // result: x 6593 for { 6594 c := v.AuxInt 6595 x := v.Args[0] 6596 if !(int32(c) == 0) { 6597 break 6598 } 6599 v.reset(OpCopy) 6600 v.Type = x.Type 6601 v.AddArg(x) 6602 return true 6603 } 6604 // match: (ADDWconst [c] (MOVDconst [d])) 6605 // cond: 6606 // result: (MOVDconst [int64(int32(c+d))]) 6607 for { 6608 c := v.AuxInt 6609 v_0 := v.Args[0] 6610 if v_0.Op != OpS390XMOVDconst { 6611 break 6612 } 6613 d := v_0.AuxInt 6614 v.reset(OpS390XMOVDconst) 6615 v.AuxInt = int64(int32(c + d)) 6616 return true 6617 } 6618 // match: (ADDWconst [c] (ADDWconst [d] x)) 6619 // cond: 6620 // result: (ADDWconst [int64(int32(c+d))] x) 6621 for { 6622 c := v.AuxInt 6623 v_0 := v.Args[0] 6624 if v_0.Op != OpS390XADDWconst { 6625 break 6626 } 6627 d := v_0.AuxInt 6628 x := v_0.Args[0] 6629 v.reset(OpS390XADDWconst) 6630 v.AuxInt = int64(int32(c + d)) 6631 v.AddArg(x) 6632 return true 6633 } 6634 return false 6635 } 6636 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 6637 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6638 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6639 // result: (MOVDaddr [c+d] {s} x) 6640 for { 6641 c := v.AuxInt 6642 v_0 := v.Args[0] 6643 if v_0.Op != OpS390XMOVDaddr { 6644 break 6645 } 6646 d := v_0.AuxInt 6647 s := v_0.Aux 6648 x := v_0.Args[0] 6649 if x.Op != OpSB { 6650 break 6651 } 6652 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6653 break 6654 } 6655 v.reset(OpS390XMOVDaddr) 6656 v.AuxInt = c + d 6657 v.Aux = s 6658 v.AddArg(x) 6659 return true 6660 } 6661 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6662 // cond: x.Op != OpSB && is20Bit(c+d) 6663 // result: (MOVDaddr [c+d] {s} x) 6664 for { 6665 c := v.AuxInt 6666 v_0 := v.Args[0] 6667 if v_0.Op != OpS390XMOVDaddr { 6668 break 6669 } 6670 d := v_0.AuxInt 6671 s := v_0.Aux 6672 x := v_0.Args[0] 6673 if !(x.Op != OpSB && is20Bit(c+d)) { 6674 break 6675 } 6676 v.reset(OpS390XMOVDaddr) 6677 v.AuxInt = c + d 6678 v.Aux = s 6679 v.AddArg(x) 6680 return true 6681 } 6682 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6683 // cond: is20Bit(c+d) 6684 // result: (MOVDaddridx [c+d] {s} x y) 6685 for { 6686 c := v.AuxInt 6687 v_0 := v.Args[0] 6688 if v_0.Op != OpS390XMOVDaddridx { 6689 break 6690 } 6691 d := v_0.AuxInt 6692 s := v_0.Aux 6693 _ = v_0.Args[1] 6694 x := v_0.Args[0] 6695 y := v_0.Args[1] 6696 if !(is20Bit(c + d)) { 6697 break 6698 } 6699 v.reset(OpS390XMOVDaddridx) 6700 v.AuxInt = c + d 6701 v.Aux = s 6702 v.AddArg(x) 6703 v.AddArg(y) 6704 return true 6705 } 6706 // match: (ADDconst [0] x) 6707 // cond: 6708 // result: x 6709 for { 6710 if v.AuxInt != 0 { 6711 break 6712 } 6713 x := v.Args[0] 6714 v.reset(OpCopy) 6715 v.Type = x.Type 6716 v.AddArg(x) 6717 return true 6718 } 6719 // match: (ADDconst [c] (MOVDconst [d])) 6720 // cond: 6721 // result: (MOVDconst [c+d]) 6722 for { 6723 c := v.AuxInt 6724 v_0 := v.Args[0] 6725 if v_0.Op != OpS390XMOVDconst { 6726 break 6727 } 6728 d := v_0.AuxInt 6729 v.reset(OpS390XMOVDconst) 6730 v.AuxInt = c + d 6731 return true 6732 } 6733 // match: (ADDconst [c] (ADDconst [d] x)) 6734 // cond: is32Bit(c+d) 6735 // result: (ADDconst [c+d] x) 6736 for { 6737 c := v.AuxInt 6738 v_0 := v.Args[0] 6739 if v_0.Op != OpS390XADDconst { 6740 break 6741 } 6742 d := v_0.AuxInt 6743 x := v_0.Args[0] 6744 if !(is32Bit(c + d)) { 6745 break 6746 } 6747 v.reset(OpS390XADDconst) 6748 v.AuxInt = c + d 6749 v.AddArg(x) 6750 return true 6751 } 6752 return false 6753 } 6754 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 6755 // match: (AND x (MOVDconst [c])) 6756 // cond: is32Bit(c) && c < 0 6757 // result: (ANDconst [c] x) 6758 for { 6759 _ = v.Args[1] 6760 x := v.Args[0] 6761 v_1 := v.Args[1] 6762 if v_1.Op != OpS390XMOVDconst { 6763 break 6764 } 6765 c := v_1.AuxInt 6766 if !(is32Bit(c) && c < 0) { 6767 break 6768 } 6769 v.reset(OpS390XANDconst) 6770 v.AuxInt = c 6771 v.AddArg(x) 6772 return true 6773 } 6774 // match: (AND (MOVDconst [c]) x) 6775 // cond: is32Bit(c) && c < 0 6776 // result: (ANDconst [c] x) 6777 for { 6778 _ = v.Args[1] 6779 v_0 := v.Args[0] 6780 if v_0.Op != OpS390XMOVDconst { 6781 break 6782 } 6783 c := v_0.AuxInt 6784 x := v.Args[1] 6785 if !(is32Bit(c) && c < 0) { 6786 break 6787 } 6788 v.reset(OpS390XANDconst) 6789 v.AuxInt = c 6790 v.AddArg(x) 6791 return true 6792 } 6793 // match: (AND x (MOVDconst [0xFF])) 6794 // cond: 6795 // result: (MOVBZreg x) 6796 for { 6797 _ = v.Args[1] 6798 x := v.Args[0] 6799 v_1 := v.Args[1] 6800 if v_1.Op != OpS390XMOVDconst { 6801 break 6802 } 6803 if v_1.AuxInt != 0xFF { 6804 break 6805 } 6806 v.reset(OpS390XMOVBZreg) 6807 v.AddArg(x) 6808 return true 6809 } 6810 // match: (AND (MOVDconst [0xFF]) x) 6811 // cond: 6812 // result: (MOVBZreg x) 6813 for { 6814 _ = v.Args[1] 6815 v_0 := v.Args[0] 6816 if v_0.Op != OpS390XMOVDconst { 6817 break 6818 } 6819 if v_0.AuxInt != 0xFF { 6820 break 6821 } 6822 x := v.Args[1] 6823 v.reset(OpS390XMOVBZreg) 6824 v.AddArg(x) 6825 return true 6826 } 6827 // match: (AND x (MOVDconst [0xFFFF])) 6828 // cond: 6829 // result: (MOVHZreg x) 6830 for { 6831 _ = v.Args[1] 6832 x := v.Args[0] 6833 v_1 := v.Args[1] 6834 if v_1.Op != OpS390XMOVDconst { 6835 break 6836 } 6837 if v_1.AuxInt != 0xFFFF { 6838 break 6839 } 6840 v.reset(OpS390XMOVHZreg) 6841 v.AddArg(x) 6842 return true 6843 } 6844 // match: (AND (MOVDconst [0xFFFF]) x) 6845 // cond: 6846 // result: (MOVHZreg x) 6847 for { 6848 _ = v.Args[1] 6849 v_0 := v.Args[0] 6850 if v_0.Op != OpS390XMOVDconst { 6851 break 6852 } 6853 if v_0.AuxInt != 0xFFFF { 6854 break 6855 } 6856 x := v.Args[1] 6857 v.reset(OpS390XMOVHZreg) 6858 v.AddArg(x) 6859 return true 6860 } 6861 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6862 // cond: 6863 // result: (MOVWZreg x) 6864 for { 6865 _ = v.Args[1] 6866 x := v.Args[0] 6867 v_1 := v.Args[1] 6868 if v_1.Op != OpS390XMOVDconst { 6869 break 6870 } 6871 if v_1.AuxInt != 0xFFFFFFFF { 6872 break 6873 } 6874 v.reset(OpS390XMOVWZreg) 6875 v.AddArg(x) 6876 return true 6877 } 6878 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6879 // cond: 6880 // result: (MOVWZreg x) 6881 for { 6882 _ = v.Args[1] 6883 v_0 := v.Args[0] 6884 if v_0.Op != OpS390XMOVDconst { 6885 break 6886 } 6887 if v_0.AuxInt != 0xFFFFFFFF { 6888 break 6889 } 6890 x := v.Args[1] 6891 v.reset(OpS390XMOVWZreg) 6892 v.AddArg(x) 6893 return true 6894 } 6895 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6896 // cond: 6897 // result: (MOVDconst [c&d]) 6898 for { 6899 _ = v.Args[1] 6900 v_0 := v.Args[0] 6901 if v_0.Op != OpS390XMOVDconst { 6902 break 6903 } 6904 c := v_0.AuxInt 6905 v_1 := v.Args[1] 6906 if v_1.Op != OpS390XMOVDconst { 6907 break 6908 } 6909 d := v_1.AuxInt 6910 v.reset(OpS390XMOVDconst) 6911 v.AuxInt = c & d 6912 return true 6913 } 6914 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 6915 // cond: 6916 // result: (MOVDconst [c&d]) 6917 for { 6918 _ = v.Args[1] 6919 v_0 := v.Args[0] 6920 if v_0.Op != OpS390XMOVDconst { 6921 break 6922 } 6923 d := v_0.AuxInt 6924 v_1 := v.Args[1] 6925 if v_1.Op != OpS390XMOVDconst { 6926 break 6927 } 6928 c := v_1.AuxInt 6929 v.reset(OpS390XMOVDconst) 6930 v.AuxInt = c & d 6931 return true 6932 } 6933 return false 6934 } 6935 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 6936 // match: (AND x x) 6937 // cond: 6938 // result: x 6939 for { 6940 _ = v.Args[1] 6941 x := v.Args[0] 6942 if x != v.Args[1] { 6943 break 6944 } 6945 v.reset(OpCopy) 6946 v.Type = x.Type 6947 v.AddArg(x) 6948 return true 6949 } 6950 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6951 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6952 // result: (ANDload <t> [off] {sym} x ptr mem) 6953 for { 6954 t := v.Type 6955 _ = v.Args[1] 6956 x := v.Args[0] 6957 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6967 break 6968 } 6969 v.reset(OpS390XANDload) 6970 v.Type = t 6971 v.AuxInt = off 6972 v.Aux = sym 6973 v.AddArg(x) 6974 v.AddArg(ptr) 6975 v.AddArg(mem) 6976 return true 6977 } 6978 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6979 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6980 // result: (ANDload <t> [off] {sym} x ptr mem) 6981 for { 6982 t := v.Type 6983 _ = v.Args[1] 6984 g := v.Args[0] 6985 if g.Op != OpS390XMOVDload { 6986 break 6987 } 6988 off := g.AuxInt 6989 sym := g.Aux 6990 _ = g.Args[1] 6991 ptr := g.Args[0] 6992 mem := g.Args[1] 6993 x := v.Args[1] 6994 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6995 break 6996 } 6997 v.reset(OpS390XANDload) 6998 v.Type = t 6999 v.AuxInt = off 7000 v.Aux = sym 7001 v.AddArg(x) 7002 v.AddArg(ptr) 7003 v.AddArg(mem) 7004 return true 7005 } 7006 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 7007 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7008 // result: (ANDload <t> [off] {sym} x ptr mem) 7009 for { 7010 t := v.Type 7011 _ = v.Args[1] 7012 g := v.Args[0] 7013 if g.Op != OpS390XMOVDload { 7014 break 7015 } 7016 off := g.AuxInt 7017 sym := g.Aux 7018 _ = g.Args[1] 7019 ptr := g.Args[0] 7020 mem := g.Args[1] 7021 x := v.Args[1] 7022 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7023 break 7024 } 7025 v.reset(OpS390XANDload) 7026 v.Type = t 7027 v.AuxInt = off 7028 v.Aux = sym 7029 v.AddArg(x) 7030 v.AddArg(ptr) 7031 v.AddArg(mem) 7032 return true 7033 } 7034 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 7035 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7036 // result: (ANDload <t> [off] {sym} x ptr mem) 7037 for { 7038 t := v.Type 7039 _ = v.Args[1] 7040 x := v.Args[0] 7041 g := v.Args[1] 7042 if g.Op != OpS390XMOVDload { 7043 break 7044 } 7045 off := g.AuxInt 7046 sym := g.Aux 7047 _ = g.Args[1] 7048 ptr := g.Args[0] 7049 mem := g.Args[1] 7050 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7051 break 7052 } 7053 v.reset(OpS390XANDload) 7054 v.Type = t 7055 v.AuxInt = off 7056 v.Aux = sym 7057 v.AddArg(x) 7058 v.AddArg(ptr) 7059 v.AddArg(mem) 7060 return true 7061 } 7062 return false 7063 } 7064 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 7065 // match: (ANDW x (MOVDconst [c])) 7066 // cond: 7067 // result: (ANDWconst [c] x) 7068 for { 7069 _ = v.Args[1] 7070 x := v.Args[0] 7071 v_1 := v.Args[1] 7072 if v_1.Op != OpS390XMOVDconst { 7073 break 7074 } 7075 c := v_1.AuxInt 7076 v.reset(OpS390XANDWconst) 7077 v.AuxInt = c 7078 v.AddArg(x) 7079 return true 7080 } 7081 // match: (ANDW (MOVDconst [c]) x) 7082 // cond: 7083 // result: (ANDWconst [c] x) 7084 for { 7085 _ = v.Args[1] 7086 v_0 := v.Args[0] 7087 if v_0.Op != OpS390XMOVDconst { 7088 break 7089 } 7090 c := v_0.AuxInt 7091 x := v.Args[1] 7092 v.reset(OpS390XANDWconst) 7093 v.AuxInt = c 7094 v.AddArg(x) 7095 return true 7096 } 7097 // match: (ANDW x x) 7098 // cond: 7099 // result: x 7100 for { 7101 _ = v.Args[1] 7102 x := v.Args[0] 7103 if x != v.Args[1] { 7104 break 7105 } 7106 v.reset(OpCopy) 7107 v.Type = x.Type 7108 v.AddArg(x) 7109 return true 7110 } 7111 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7112 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7113 // result: (ANDWload <t> [off] {sym} x ptr mem) 7114 for { 7115 t := v.Type 7116 _ = v.Args[1] 7117 x := v.Args[0] 7118 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7128 break 7129 } 7130 v.reset(OpS390XANDWload) 7131 v.Type = t 7132 v.AuxInt = off 7133 v.Aux = sym 7134 v.AddArg(x) 7135 v.AddArg(ptr) 7136 v.AddArg(mem) 7137 return true 7138 } 7139 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7140 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7141 // result: (ANDWload <t> [off] {sym} x ptr mem) 7142 for { 7143 t := v.Type 7144 _ = v.Args[1] 7145 g := v.Args[0] 7146 if g.Op != OpS390XMOVWload { 7147 break 7148 } 7149 off := g.AuxInt 7150 sym := g.Aux 7151 _ = g.Args[1] 7152 ptr := g.Args[0] 7153 mem := g.Args[1] 7154 x := v.Args[1] 7155 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7156 break 7157 } 7158 v.reset(OpS390XANDWload) 7159 v.Type = t 7160 v.AuxInt = off 7161 v.Aux = sym 7162 v.AddArg(x) 7163 v.AddArg(ptr) 7164 v.AddArg(mem) 7165 return true 7166 } 7167 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7168 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7169 // result: (ANDWload <t> [off] {sym} x ptr mem) 7170 for { 7171 t := v.Type 7172 _ = v.Args[1] 7173 g := v.Args[0] 7174 if g.Op != OpS390XMOVWload { 7175 break 7176 } 7177 off := g.AuxInt 7178 sym := g.Aux 7179 _ = g.Args[1] 7180 ptr := g.Args[0] 7181 mem := g.Args[1] 7182 x := v.Args[1] 7183 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7184 break 7185 } 7186 v.reset(OpS390XANDWload) 7187 v.Type = t 7188 v.AuxInt = off 7189 v.Aux = sym 7190 v.AddArg(x) 7191 v.AddArg(ptr) 7192 v.AddArg(mem) 7193 return true 7194 } 7195 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7196 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7197 // result: (ANDWload <t> [off] {sym} x ptr mem) 7198 for { 7199 t := v.Type 7200 _ = v.Args[1] 7201 x := v.Args[0] 7202 g := v.Args[1] 7203 if g.Op != OpS390XMOVWload { 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7212 break 7213 } 7214 v.reset(OpS390XANDWload) 7215 v.Type = t 7216 v.AuxInt = off 7217 v.Aux = sym 7218 v.AddArg(x) 7219 v.AddArg(ptr) 7220 v.AddArg(mem) 7221 return true 7222 } 7223 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7224 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7225 // result: (ANDWload <t> [off] {sym} x ptr mem) 7226 for { 7227 t := v.Type 7228 _ = v.Args[1] 7229 x := v.Args[0] 7230 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7240 break 7241 } 7242 v.reset(OpS390XANDWload) 7243 v.Type = t 7244 v.AuxInt = off 7245 v.Aux = sym 7246 v.AddArg(x) 7247 v.AddArg(ptr) 7248 v.AddArg(mem) 7249 return true 7250 } 7251 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7252 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7253 // result: (ANDWload <t> [off] {sym} x ptr mem) 7254 for { 7255 t := v.Type 7256 _ = v.Args[1] 7257 g := v.Args[0] 7258 if g.Op != OpS390XMOVWZload { 7259 break 7260 } 7261 off := g.AuxInt 7262 sym := g.Aux 7263 _ = g.Args[1] 7264 ptr := g.Args[0] 7265 mem := g.Args[1] 7266 x := v.Args[1] 7267 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7268 break 7269 } 7270 v.reset(OpS390XANDWload) 7271 v.Type = t 7272 v.AuxInt = off 7273 v.Aux = sym 7274 v.AddArg(x) 7275 v.AddArg(ptr) 7276 v.AddArg(mem) 7277 return true 7278 } 7279 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7280 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7281 // result: (ANDWload <t> [off] {sym} x ptr mem) 7282 for { 7283 t := v.Type 7284 _ = v.Args[1] 7285 g := v.Args[0] 7286 if g.Op != OpS390XMOVWZload { 7287 break 7288 } 7289 off := g.AuxInt 7290 sym := g.Aux 7291 _ = g.Args[1] 7292 ptr := g.Args[0] 7293 mem := g.Args[1] 7294 x := v.Args[1] 7295 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7296 break 7297 } 7298 v.reset(OpS390XANDWload) 7299 v.Type = t 7300 v.AuxInt = off 7301 v.Aux = sym 7302 v.AddArg(x) 7303 v.AddArg(ptr) 7304 v.AddArg(mem) 7305 return true 7306 } 7307 return false 7308 } 7309 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 7310 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7311 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7312 // result: (ANDWload <t> [off] {sym} x ptr mem) 7313 for { 7314 t := v.Type 7315 _ = v.Args[1] 7316 x := v.Args[0] 7317 g := v.Args[1] 7318 if g.Op != OpS390XMOVWZload { 7319 break 7320 } 7321 off := g.AuxInt 7322 sym := g.Aux 7323 _ = g.Args[1] 7324 ptr := g.Args[0] 7325 mem := g.Args[1] 7326 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7327 break 7328 } 7329 v.reset(OpS390XANDWload) 7330 v.Type = t 7331 v.AuxInt = off 7332 v.Aux = sym 7333 v.AddArg(x) 7334 v.AddArg(ptr) 7335 v.AddArg(mem) 7336 return true 7337 } 7338 return false 7339 } 7340 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 7341 // match: (ANDWconst [c] (ANDWconst [d] x)) 7342 // cond: 7343 // result: (ANDWconst [c & d] x) 7344 for { 7345 c := v.AuxInt 7346 v_0 := v.Args[0] 7347 if v_0.Op != OpS390XANDWconst { 7348 break 7349 } 7350 d := v_0.AuxInt 7351 x := v_0.Args[0] 7352 v.reset(OpS390XANDWconst) 7353 v.AuxInt = c & d 7354 v.AddArg(x) 7355 return true 7356 } 7357 // match: (ANDWconst [0xFF] x) 7358 // cond: 7359 // result: (MOVBZreg x) 7360 for { 7361 if v.AuxInt != 0xFF { 7362 break 7363 } 7364 x := v.Args[0] 7365 v.reset(OpS390XMOVBZreg) 7366 v.AddArg(x) 7367 return true 7368 } 7369 // match: (ANDWconst [0xFFFF] x) 7370 // cond: 7371 // result: (MOVHZreg x) 7372 for { 7373 if v.AuxInt != 0xFFFF { 7374 break 7375 } 7376 x := v.Args[0] 7377 v.reset(OpS390XMOVHZreg) 7378 v.AddArg(x) 7379 return true 7380 } 7381 // match: (ANDWconst [c] _) 7382 // cond: int32(c)==0 7383 // result: (MOVDconst [0]) 7384 for { 7385 c := v.AuxInt 7386 if !(int32(c) == 0) { 7387 break 7388 } 7389 v.reset(OpS390XMOVDconst) 7390 v.AuxInt = 0 7391 return true 7392 } 7393 // match: (ANDWconst [c] x) 7394 // cond: int32(c)==-1 7395 // result: x 7396 for { 7397 c := v.AuxInt 7398 x := v.Args[0] 7399 if !(int32(c) == -1) { 7400 break 7401 } 7402 v.reset(OpCopy) 7403 v.Type = x.Type 7404 v.AddArg(x) 7405 return true 7406 } 7407 // match: (ANDWconst [c] (MOVDconst [d])) 7408 // cond: 7409 // result: (MOVDconst [c&d]) 7410 for { 7411 c := v.AuxInt 7412 v_0 := v.Args[0] 7413 if v_0.Op != OpS390XMOVDconst { 7414 break 7415 } 7416 d := v_0.AuxInt 7417 v.reset(OpS390XMOVDconst) 7418 v.AuxInt = c & d 7419 return true 7420 } 7421 return false 7422 } 7423 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 7424 // match: (ANDconst [c] (ANDconst [d] x)) 7425 // cond: 7426 // result: (ANDconst [c & d] x) 7427 for { 7428 c := v.AuxInt 7429 v_0 := v.Args[0] 7430 if v_0.Op != OpS390XANDconst { 7431 break 7432 } 7433 d := v_0.AuxInt 7434 x := v_0.Args[0] 7435 v.reset(OpS390XANDconst) 7436 v.AuxInt = c & d 7437 v.AddArg(x) 7438 return true 7439 } 7440 // match: (ANDconst [0] _) 7441 // cond: 7442 // result: (MOVDconst [0]) 7443 for { 7444 if v.AuxInt != 0 { 7445 break 7446 } 7447 v.reset(OpS390XMOVDconst) 7448 v.AuxInt = 0 7449 return true 7450 } 7451 // match: (ANDconst [-1] x) 7452 // cond: 7453 // result: x 7454 for { 7455 if v.AuxInt != -1 { 7456 break 7457 } 7458 x := v.Args[0] 7459 v.reset(OpCopy) 7460 v.Type = x.Type 7461 v.AddArg(x) 7462 return true 7463 } 7464 // match: (ANDconst [c] (MOVDconst [d])) 7465 // cond: 7466 // result: (MOVDconst [c&d]) 7467 for { 7468 c := v.AuxInt 7469 v_0 := v.Args[0] 7470 if v_0.Op != OpS390XMOVDconst { 7471 break 7472 } 7473 d := v_0.AuxInt 7474 v.reset(OpS390XMOVDconst) 7475 v.AuxInt = c & d 7476 return true 7477 } 7478 return false 7479 } 7480 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 7481 b := v.Block 7482 _ = b 7483 // match: (CMP x (MOVDconst [c])) 7484 // cond: is32Bit(c) 7485 // result: (CMPconst x [c]) 7486 for { 7487 _ = v.Args[1] 7488 x := v.Args[0] 7489 v_1 := v.Args[1] 7490 if v_1.Op != OpS390XMOVDconst { 7491 break 7492 } 7493 c := v_1.AuxInt 7494 if !(is32Bit(c)) { 7495 break 7496 } 7497 v.reset(OpS390XCMPconst) 7498 v.AuxInt = c 7499 v.AddArg(x) 7500 return true 7501 } 7502 // match: (CMP (MOVDconst [c]) x) 7503 // cond: is32Bit(c) 7504 // result: (InvertFlags (CMPconst x [c])) 7505 for { 7506 _ = v.Args[1] 7507 v_0 := v.Args[0] 7508 if v_0.Op != OpS390XMOVDconst { 7509 break 7510 } 7511 c := v_0.AuxInt 7512 x := v.Args[1] 7513 if !(is32Bit(c)) { 7514 break 7515 } 7516 v.reset(OpS390XInvertFlags) 7517 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 7518 v0.AuxInt = c 7519 v0.AddArg(x) 7520 v.AddArg(v0) 7521 return true 7522 } 7523 return false 7524 } 7525 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 7526 b := v.Block 7527 _ = b 7528 // match: (CMPU x (MOVDconst [c])) 7529 // cond: isU32Bit(c) 7530 // result: (CMPUconst x [int64(uint32(c))]) 7531 for { 7532 _ = v.Args[1] 7533 x := v.Args[0] 7534 v_1 := v.Args[1] 7535 if v_1.Op != OpS390XMOVDconst { 7536 break 7537 } 7538 c := v_1.AuxInt 7539 if !(isU32Bit(c)) { 7540 break 7541 } 7542 v.reset(OpS390XCMPUconst) 7543 v.AuxInt = int64(uint32(c)) 7544 v.AddArg(x) 7545 return true 7546 } 7547 // match: (CMPU (MOVDconst [c]) x) 7548 // cond: isU32Bit(c) 7549 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 7550 for { 7551 _ = v.Args[1] 7552 v_0 := v.Args[0] 7553 if v_0.Op != OpS390XMOVDconst { 7554 break 7555 } 7556 c := v_0.AuxInt 7557 x := v.Args[1] 7558 if !(isU32Bit(c)) { 7559 break 7560 } 7561 v.reset(OpS390XInvertFlags) 7562 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 7563 v0.AuxInt = int64(uint32(c)) 7564 v0.AddArg(x) 7565 v.AddArg(v0) 7566 return true 7567 } 7568 return false 7569 } 7570 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 7571 // match: (CMPUconst (MOVDconst [x]) [y]) 7572 // cond: uint64(x)==uint64(y) 7573 // result: (FlagEQ) 7574 for { 7575 y := v.AuxInt 7576 v_0 := v.Args[0] 7577 if v_0.Op != OpS390XMOVDconst { 7578 break 7579 } 7580 x := v_0.AuxInt 7581 if !(uint64(x) == uint64(y)) { 7582 break 7583 } 7584 v.reset(OpS390XFlagEQ) 7585 return true 7586 } 7587 // match: (CMPUconst (MOVDconst [x]) [y]) 7588 // cond: uint64(x)<uint64(y) 7589 // result: (FlagLT) 7590 for { 7591 y := v.AuxInt 7592 v_0 := v.Args[0] 7593 if v_0.Op != OpS390XMOVDconst { 7594 break 7595 } 7596 x := v_0.AuxInt 7597 if !(uint64(x) < uint64(y)) { 7598 break 7599 } 7600 v.reset(OpS390XFlagLT) 7601 return true 7602 } 7603 // match: (CMPUconst (MOVDconst [x]) [y]) 7604 // cond: uint64(x)>uint64(y) 7605 // result: (FlagGT) 7606 for { 7607 y := v.AuxInt 7608 v_0 := v.Args[0] 7609 if v_0.Op != OpS390XMOVDconst { 7610 break 7611 } 7612 x := v_0.AuxInt 7613 if !(uint64(x) > uint64(y)) { 7614 break 7615 } 7616 v.reset(OpS390XFlagGT) 7617 return true 7618 } 7619 return false 7620 } 7621 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 7622 b := v.Block 7623 _ = b 7624 // match: (CMPW x (MOVDconst [c])) 7625 // cond: 7626 // result: (CMPWconst x [c]) 7627 for { 7628 _ = v.Args[1] 7629 x := v.Args[0] 7630 v_1 := v.Args[1] 7631 if v_1.Op != OpS390XMOVDconst { 7632 break 7633 } 7634 c := v_1.AuxInt 7635 v.reset(OpS390XCMPWconst) 7636 v.AuxInt = c 7637 v.AddArg(x) 7638 return true 7639 } 7640 // match: (CMPW (MOVDconst [c]) x) 7641 // cond: 7642 // result: (InvertFlags (CMPWconst x [c])) 7643 for { 7644 _ = v.Args[1] 7645 v_0 := v.Args[0] 7646 if v_0.Op != OpS390XMOVDconst { 7647 break 7648 } 7649 c := v_0.AuxInt 7650 x := v.Args[1] 7651 v.reset(OpS390XInvertFlags) 7652 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 7653 v0.AuxInt = c 7654 v0.AddArg(x) 7655 v.AddArg(v0) 7656 return true 7657 } 7658 return false 7659 } 7660 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 7661 b := v.Block 7662 _ = b 7663 // match: (CMPWU x (MOVDconst [c])) 7664 // cond: 7665 // result: (CMPWUconst x [int64(uint32(c))]) 7666 for { 7667 _ = v.Args[1] 7668 x := v.Args[0] 7669 v_1 := v.Args[1] 7670 if v_1.Op != OpS390XMOVDconst { 7671 break 7672 } 7673 c := v_1.AuxInt 7674 v.reset(OpS390XCMPWUconst) 7675 v.AuxInt = int64(uint32(c)) 7676 v.AddArg(x) 7677 return true 7678 } 7679 // match: (CMPWU (MOVDconst [c]) x) 7680 // cond: 7681 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 7682 for { 7683 _ = v.Args[1] 7684 v_0 := v.Args[0] 7685 if v_0.Op != OpS390XMOVDconst { 7686 break 7687 } 7688 c := v_0.AuxInt 7689 x := v.Args[1] 7690 v.reset(OpS390XInvertFlags) 7691 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 7692 v0.AuxInt = int64(uint32(c)) 7693 v0.AddArg(x) 7694 v.AddArg(v0) 7695 return true 7696 } 7697 return false 7698 } 7699 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 7700 // match: (CMPWUconst (MOVDconst [x]) [y]) 7701 // cond: uint32(x)==uint32(y) 7702 // result: (FlagEQ) 7703 for { 7704 y := v.AuxInt 7705 v_0 := v.Args[0] 7706 if v_0.Op != OpS390XMOVDconst { 7707 break 7708 } 7709 x := v_0.AuxInt 7710 if !(uint32(x) == uint32(y)) { 7711 break 7712 } 7713 v.reset(OpS390XFlagEQ) 7714 return true 7715 } 7716 // match: (CMPWUconst (MOVDconst [x]) [y]) 7717 // cond: uint32(x)<uint32(y) 7718 // result: (FlagLT) 7719 for { 7720 y := v.AuxInt 7721 v_0 := v.Args[0] 7722 if v_0.Op != OpS390XMOVDconst { 7723 break 7724 } 7725 x := v_0.AuxInt 7726 if !(uint32(x) < uint32(y)) { 7727 break 7728 } 7729 v.reset(OpS390XFlagLT) 7730 return true 7731 } 7732 // match: (CMPWUconst (MOVDconst [x]) [y]) 7733 // cond: uint32(x)>uint32(y) 7734 // result: (FlagGT) 7735 for { 7736 y := v.AuxInt 7737 v_0 := v.Args[0] 7738 if v_0.Op != OpS390XMOVDconst { 7739 break 7740 } 7741 x := v_0.AuxInt 7742 if !(uint32(x) > uint32(y)) { 7743 break 7744 } 7745 v.reset(OpS390XFlagGT) 7746 return true 7747 } 7748 return false 7749 } 7750 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 7751 // match: (CMPWconst (MOVDconst [x]) [y]) 7752 // cond: int32(x)==int32(y) 7753 // result: (FlagEQ) 7754 for { 7755 y := v.AuxInt 7756 v_0 := v.Args[0] 7757 if v_0.Op != OpS390XMOVDconst { 7758 break 7759 } 7760 x := v_0.AuxInt 7761 if !(int32(x) == int32(y)) { 7762 break 7763 } 7764 v.reset(OpS390XFlagEQ) 7765 return true 7766 } 7767 // match: (CMPWconst (MOVDconst [x]) [y]) 7768 // cond: int32(x)<int32(y) 7769 // result: (FlagLT) 7770 for { 7771 y := v.AuxInt 7772 v_0 := v.Args[0] 7773 if v_0.Op != OpS390XMOVDconst { 7774 break 7775 } 7776 x := v_0.AuxInt 7777 if !(int32(x) < int32(y)) { 7778 break 7779 } 7780 v.reset(OpS390XFlagLT) 7781 return true 7782 } 7783 // match: (CMPWconst (MOVDconst [x]) [y]) 7784 // cond: int32(x)>int32(y) 7785 // result: (FlagGT) 7786 for { 7787 y := v.AuxInt 7788 v_0 := v.Args[0] 7789 if v_0.Op != OpS390XMOVDconst { 7790 break 7791 } 7792 x := v_0.AuxInt 7793 if !(int32(x) > int32(y)) { 7794 break 7795 } 7796 v.reset(OpS390XFlagGT) 7797 return true 7798 } 7799 // match: (CMPWconst (SRWconst _ [c]) [n]) 7800 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7801 // result: (FlagLT) 7802 for { 7803 n := v.AuxInt 7804 v_0 := v.Args[0] 7805 if v_0.Op != OpS390XSRWconst { 7806 break 7807 } 7808 c := v_0.AuxInt 7809 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7810 break 7811 } 7812 v.reset(OpS390XFlagLT) 7813 return true 7814 } 7815 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7816 // cond: 0 <= int32(m) && int32(m) < int32(n) 7817 // result: (FlagLT) 7818 for { 7819 n := v.AuxInt 7820 v_0 := v.Args[0] 7821 if v_0.Op != OpS390XANDWconst { 7822 break 7823 } 7824 m := v_0.AuxInt 7825 if !(0 <= int32(m) && int32(m) < int32(n)) { 7826 break 7827 } 7828 v.reset(OpS390XFlagLT) 7829 return true 7830 } 7831 return false 7832 } 7833 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 7834 // match: (CMPconst (MOVDconst [x]) [y]) 7835 // cond: x==y 7836 // result: (FlagEQ) 7837 for { 7838 y := v.AuxInt 7839 v_0 := v.Args[0] 7840 if v_0.Op != OpS390XMOVDconst { 7841 break 7842 } 7843 x := v_0.AuxInt 7844 if !(x == y) { 7845 break 7846 } 7847 v.reset(OpS390XFlagEQ) 7848 return true 7849 } 7850 // match: (CMPconst (MOVDconst [x]) [y]) 7851 // cond: x<y 7852 // result: (FlagLT) 7853 for { 7854 y := v.AuxInt 7855 v_0 := v.Args[0] 7856 if v_0.Op != OpS390XMOVDconst { 7857 break 7858 } 7859 x := v_0.AuxInt 7860 if !(x < y) { 7861 break 7862 } 7863 v.reset(OpS390XFlagLT) 7864 return true 7865 } 7866 // match: (CMPconst (MOVDconst [x]) [y]) 7867 // cond: x>y 7868 // result: (FlagGT) 7869 for { 7870 y := v.AuxInt 7871 v_0 := v.Args[0] 7872 if v_0.Op != OpS390XMOVDconst { 7873 break 7874 } 7875 x := v_0.AuxInt 7876 if !(x > y) { 7877 break 7878 } 7879 v.reset(OpS390XFlagGT) 7880 return true 7881 } 7882 // match: (CMPconst (MOVBZreg _) [c]) 7883 // cond: 0xFF < c 7884 // result: (FlagLT) 7885 for { 7886 c := v.AuxInt 7887 v_0 := v.Args[0] 7888 if v_0.Op != OpS390XMOVBZreg { 7889 break 7890 } 7891 if !(0xFF < c) { 7892 break 7893 } 7894 v.reset(OpS390XFlagLT) 7895 return true 7896 } 7897 // match: (CMPconst (MOVHZreg _) [c]) 7898 // cond: 0xFFFF < c 7899 // result: (FlagLT) 7900 for { 7901 c := v.AuxInt 7902 v_0 := v.Args[0] 7903 if v_0.Op != OpS390XMOVHZreg { 7904 break 7905 } 7906 if !(0xFFFF < c) { 7907 break 7908 } 7909 v.reset(OpS390XFlagLT) 7910 return true 7911 } 7912 // match: (CMPconst (MOVWZreg _) [c]) 7913 // cond: 0xFFFFFFFF < c 7914 // result: (FlagLT) 7915 for { 7916 c := v.AuxInt 7917 v_0 := v.Args[0] 7918 if v_0.Op != OpS390XMOVWZreg { 7919 break 7920 } 7921 if !(0xFFFFFFFF < c) { 7922 break 7923 } 7924 v.reset(OpS390XFlagLT) 7925 return true 7926 } 7927 // match: (CMPconst (SRDconst _ [c]) [n]) 7928 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7929 // result: (FlagLT) 7930 for { 7931 n := v.AuxInt 7932 v_0 := v.Args[0] 7933 if v_0.Op != OpS390XSRDconst { 7934 break 7935 } 7936 c := v_0.AuxInt 7937 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7938 break 7939 } 7940 v.reset(OpS390XFlagLT) 7941 return true 7942 } 7943 // match: (CMPconst (ANDconst _ [m]) [n]) 7944 // cond: 0 <= m && m < n 7945 // result: (FlagLT) 7946 for { 7947 n := v.AuxInt 7948 v_0 := v.Args[0] 7949 if v_0.Op != OpS390XANDconst { 7950 break 7951 } 7952 m := v_0.AuxInt 7953 if !(0 <= m && m < n) { 7954 break 7955 } 7956 v.reset(OpS390XFlagLT) 7957 return true 7958 } 7959 return false 7960 } 7961 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 7962 // match: (FADD (FMUL y z) x) 7963 // cond: 7964 // result: (FMADD x y z) 7965 for { 7966 _ = v.Args[1] 7967 v_0 := v.Args[0] 7968 if v_0.Op != OpS390XFMUL { 7969 break 7970 } 7971 _ = v_0.Args[1] 7972 y := v_0.Args[0] 7973 z := v_0.Args[1] 7974 x := v.Args[1] 7975 v.reset(OpS390XFMADD) 7976 v.AddArg(x) 7977 v.AddArg(y) 7978 v.AddArg(z) 7979 return true 7980 } 7981 // match: (FADD x (FMUL y z)) 7982 // cond: 7983 // result: (FMADD x y z) 7984 for { 7985 _ = v.Args[1] 7986 x := v.Args[0] 7987 v_1 := v.Args[1] 7988 if v_1.Op != OpS390XFMUL { 7989 break 7990 } 7991 _ = v_1.Args[1] 7992 y := v_1.Args[0] 7993 z := v_1.Args[1] 7994 v.reset(OpS390XFMADD) 7995 v.AddArg(x) 7996 v.AddArg(y) 7997 v.AddArg(z) 7998 return true 7999 } 8000 return false 8001 } 8002 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 8003 // match: (FADDS (FMULS y z) x) 8004 // cond: 8005 // result: (FMADDS x y z) 8006 for { 8007 _ = v.Args[1] 8008 v_0 := v.Args[0] 8009 if v_0.Op != OpS390XFMULS { 8010 break 8011 } 8012 _ = v_0.Args[1] 8013 y := v_0.Args[0] 8014 z := v_0.Args[1] 8015 x := v.Args[1] 8016 v.reset(OpS390XFMADDS) 8017 v.AddArg(x) 8018 v.AddArg(y) 8019 v.AddArg(z) 8020 return true 8021 } 8022 // match: (FADDS x (FMULS y z)) 8023 // cond: 8024 // result: (FMADDS x y z) 8025 for { 8026 _ = v.Args[1] 8027 x := v.Args[0] 8028 v_1 := v.Args[1] 8029 if v_1.Op != OpS390XFMULS { 8030 break 8031 } 8032 _ = v_1.Args[1] 8033 y := v_1.Args[0] 8034 z := v_1.Args[1] 8035 v.reset(OpS390XFMADDS) 8036 v.AddArg(x) 8037 v.AddArg(y) 8038 v.AddArg(z) 8039 return true 8040 } 8041 return false 8042 } 8043 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 8044 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 8045 // cond: is20Bit(off1+off2) 8046 // result: (FMOVDload [off1+off2] {sym} ptr mem) 8047 for { 8048 off1 := v.AuxInt 8049 sym := v.Aux 8050 _ = v.Args[1] 8051 v_0 := v.Args[0] 8052 if v_0.Op != OpS390XADDconst { 8053 break 8054 } 8055 off2 := v_0.AuxInt 8056 ptr := v_0.Args[0] 8057 mem := v.Args[1] 8058 if !(is20Bit(off1 + off2)) { 8059 break 8060 } 8061 v.reset(OpS390XFMOVDload) 8062 v.AuxInt = off1 + off2 8063 v.Aux = sym 8064 v.AddArg(ptr) 8065 v.AddArg(mem) 8066 return true 8067 } 8068 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8069 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8070 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8071 for { 8072 off1 := v.AuxInt 8073 sym1 := v.Aux 8074 _ = v.Args[1] 8075 v_0 := v.Args[0] 8076 if v_0.Op != OpS390XMOVDaddr { 8077 break 8078 } 8079 off2 := v_0.AuxInt 8080 sym2 := v_0.Aux 8081 base := v_0.Args[0] 8082 mem := v.Args[1] 8083 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8084 break 8085 } 8086 v.reset(OpS390XFMOVDload) 8087 v.AuxInt = off1 + off2 8088 v.Aux = mergeSym(sym1, sym2) 8089 v.AddArg(base) 8090 v.AddArg(mem) 8091 return true 8092 } 8093 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8094 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8095 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8096 for { 8097 off1 := v.AuxInt 8098 sym1 := v.Aux 8099 _ = v.Args[1] 8100 v_0 := v.Args[0] 8101 if v_0.Op != OpS390XMOVDaddridx { 8102 break 8103 } 8104 off2 := v_0.AuxInt 8105 sym2 := v_0.Aux 8106 _ = v_0.Args[1] 8107 ptr := v_0.Args[0] 8108 idx := v_0.Args[1] 8109 mem := v.Args[1] 8110 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8111 break 8112 } 8113 v.reset(OpS390XFMOVDloadidx) 8114 v.AuxInt = off1 + off2 8115 v.Aux = mergeSym(sym1, sym2) 8116 v.AddArg(ptr) 8117 v.AddArg(idx) 8118 v.AddArg(mem) 8119 return true 8120 } 8121 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 8122 // cond: ptr.Op != OpSB 8123 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 8124 for { 8125 off := v.AuxInt 8126 sym := v.Aux 8127 _ = v.Args[1] 8128 v_0 := v.Args[0] 8129 if v_0.Op != OpS390XADD { 8130 break 8131 } 8132 _ = v_0.Args[1] 8133 ptr := v_0.Args[0] 8134 idx := v_0.Args[1] 8135 mem := v.Args[1] 8136 if !(ptr.Op != OpSB) { 8137 break 8138 } 8139 v.reset(OpS390XFMOVDloadidx) 8140 v.AuxInt = off 8141 v.Aux = sym 8142 v.AddArg(ptr) 8143 v.AddArg(idx) 8144 v.AddArg(mem) 8145 return true 8146 } 8147 return false 8148 } 8149 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 8150 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8151 // cond: 8152 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8153 for { 8154 c := v.AuxInt 8155 sym := v.Aux 8156 _ = v.Args[2] 8157 v_0 := v.Args[0] 8158 if v_0.Op != OpS390XADDconst { 8159 break 8160 } 8161 d := v_0.AuxInt 8162 ptr := v_0.Args[0] 8163 idx := v.Args[1] 8164 mem := v.Args[2] 8165 v.reset(OpS390XFMOVDloadidx) 8166 v.AuxInt = c + d 8167 v.Aux = sym 8168 v.AddArg(ptr) 8169 v.AddArg(idx) 8170 v.AddArg(mem) 8171 return true 8172 } 8173 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8174 // cond: 8175 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8176 for { 8177 c := v.AuxInt 8178 sym := v.Aux 8179 _ = v.Args[2] 8180 ptr := v.Args[0] 8181 v_1 := v.Args[1] 8182 if v_1.Op != OpS390XADDconst { 8183 break 8184 } 8185 d := v_1.AuxInt 8186 idx := v_1.Args[0] 8187 mem := v.Args[2] 8188 v.reset(OpS390XFMOVDloadidx) 8189 v.AuxInt = c + d 8190 v.Aux = sym 8191 v.AddArg(ptr) 8192 v.AddArg(idx) 8193 v.AddArg(mem) 8194 return true 8195 } 8196 return false 8197 } 8198 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 8199 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8200 // cond: is20Bit(off1+off2) 8201 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 8202 for { 8203 off1 := v.AuxInt 8204 sym := v.Aux 8205 _ = v.Args[2] 8206 v_0 := v.Args[0] 8207 if v_0.Op != OpS390XADDconst { 8208 break 8209 } 8210 off2 := v_0.AuxInt 8211 ptr := v_0.Args[0] 8212 val := v.Args[1] 8213 mem := v.Args[2] 8214 if !(is20Bit(off1 + off2)) { 8215 break 8216 } 8217 v.reset(OpS390XFMOVDstore) 8218 v.AuxInt = off1 + off2 8219 v.Aux = sym 8220 v.AddArg(ptr) 8221 v.AddArg(val) 8222 v.AddArg(mem) 8223 return true 8224 } 8225 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8226 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8227 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8228 for { 8229 off1 := v.AuxInt 8230 sym1 := v.Aux 8231 _ = v.Args[2] 8232 v_0 := v.Args[0] 8233 if v_0.Op != OpS390XMOVDaddr { 8234 break 8235 } 8236 off2 := v_0.AuxInt 8237 sym2 := v_0.Aux 8238 base := v_0.Args[0] 8239 val := v.Args[1] 8240 mem := v.Args[2] 8241 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8242 break 8243 } 8244 v.reset(OpS390XFMOVDstore) 8245 v.AuxInt = off1 + off2 8246 v.Aux = mergeSym(sym1, sym2) 8247 v.AddArg(base) 8248 v.AddArg(val) 8249 v.AddArg(mem) 8250 return true 8251 } 8252 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8253 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8254 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8255 for { 8256 off1 := v.AuxInt 8257 sym1 := v.Aux 8258 _ = v.Args[2] 8259 v_0 := v.Args[0] 8260 if v_0.Op != OpS390XMOVDaddridx { 8261 break 8262 } 8263 off2 := v_0.AuxInt 8264 sym2 := v_0.Aux 8265 _ = v_0.Args[1] 8266 ptr := v_0.Args[0] 8267 idx := v_0.Args[1] 8268 val := v.Args[1] 8269 mem := v.Args[2] 8270 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8271 break 8272 } 8273 v.reset(OpS390XFMOVDstoreidx) 8274 v.AuxInt = off1 + off2 8275 v.Aux = mergeSym(sym1, sym2) 8276 v.AddArg(ptr) 8277 v.AddArg(idx) 8278 v.AddArg(val) 8279 v.AddArg(mem) 8280 return true 8281 } 8282 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 8283 // cond: ptr.Op != OpSB 8284 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 8285 for { 8286 off := v.AuxInt 8287 sym := v.Aux 8288 _ = v.Args[2] 8289 v_0 := v.Args[0] 8290 if v_0.Op != OpS390XADD { 8291 break 8292 } 8293 _ = v_0.Args[1] 8294 ptr := v_0.Args[0] 8295 idx := v_0.Args[1] 8296 val := v.Args[1] 8297 mem := v.Args[2] 8298 if !(ptr.Op != OpSB) { 8299 break 8300 } 8301 v.reset(OpS390XFMOVDstoreidx) 8302 v.AuxInt = off 8303 v.Aux = sym 8304 v.AddArg(ptr) 8305 v.AddArg(idx) 8306 v.AddArg(val) 8307 v.AddArg(mem) 8308 return true 8309 } 8310 return false 8311 } 8312 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 8313 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8314 // cond: 8315 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8316 for { 8317 c := v.AuxInt 8318 sym := v.Aux 8319 _ = v.Args[3] 8320 v_0 := v.Args[0] 8321 if v_0.Op != OpS390XADDconst { 8322 break 8323 } 8324 d := v_0.AuxInt 8325 ptr := v_0.Args[0] 8326 idx := v.Args[1] 8327 val := v.Args[2] 8328 mem := v.Args[3] 8329 v.reset(OpS390XFMOVDstoreidx) 8330 v.AuxInt = c + d 8331 v.Aux = sym 8332 v.AddArg(ptr) 8333 v.AddArg(idx) 8334 v.AddArg(val) 8335 v.AddArg(mem) 8336 return true 8337 } 8338 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8339 // cond: 8340 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8341 for { 8342 c := v.AuxInt 8343 sym := v.Aux 8344 _ = v.Args[3] 8345 ptr := v.Args[0] 8346 v_1 := v.Args[1] 8347 if v_1.Op != OpS390XADDconst { 8348 break 8349 } 8350 d := v_1.AuxInt 8351 idx := v_1.Args[0] 8352 val := v.Args[2] 8353 mem := v.Args[3] 8354 v.reset(OpS390XFMOVDstoreidx) 8355 v.AuxInt = c + d 8356 v.Aux = sym 8357 v.AddArg(ptr) 8358 v.AddArg(idx) 8359 v.AddArg(val) 8360 v.AddArg(mem) 8361 return true 8362 } 8363 return false 8364 } 8365 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 8366 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 8367 // cond: is20Bit(off1+off2) 8368 // result: (FMOVSload [off1+off2] {sym} ptr mem) 8369 for { 8370 off1 := v.AuxInt 8371 sym := v.Aux 8372 _ = v.Args[1] 8373 v_0 := v.Args[0] 8374 if v_0.Op != OpS390XADDconst { 8375 break 8376 } 8377 off2 := v_0.AuxInt 8378 ptr := v_0.Args[0] 8379 mem := v.Args[1] 8380 if !(is20Bit(off1 + off2)) { 8381 break 8382 } 8383 v.reset(OpS390XFMOVSload) 8384 v.AuxInt = off1 + off2 8385 v.Aux = sym 8386 v.AddArg(ptr) 8387 v.AddArg(mem) 8388 return true 8389 } 8390 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8391 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8392 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8393 for { 8394 off1 := v.AuxInt 8395 sym1 := v.Aux 8396 _ = v.Args[1] 8397 v_0 := v.Args[0] 8398 if v_0.Op != OpS390XMOVDaddr { 8399 break 8400 } 8401 off2 := v_0.AuxInt 8402 sym2 := v_0.Aux 8403 base := v_0.Args[0] 8404 mem := v.Args[1] 8405 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8406 break 8407 } 8408 v.reset(OpS390XFMOVSload) 8409 v.AuxInt = off1 + off2 8410 v.Aux = mergeSym(sym1, sym2) 8411 v.AddArg(base) 8412 v.AddArg(mem) 8413 return true 8414 } 8415 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8416 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8417 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8418 for { 8419 off1 := v.AuxInt 8420 sym1 := v.Aux 8421 _ = v.Args[1] 8422 v_0 := v.Args[0] 8423 if v_0.Op != OpS390XMOVDaddridx { 8424 break 8425 } 8426 off2 := v_0.AuxInt 8427 sym2 := v_0.Aux 8428 _ = v_0.Args[1] 8429 ptr := v_0.Args[0] 8430 idx := v_0.Args[1] 8431 mem := v.Args[1] 8432 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8433 break 8434 } 8435 v.reset(OpS390XFMOVSloadidx) 8436 v.AuxInt = off1 + off2 8437 v.Aux = mergeSym(sym1, sym2) 8438 v.AddArg(ptr) 8439 v.AddArg(idx) 8440 v.AddArg(mem) 8441 return true 8442 } 8443 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8444 // cond: ptr.Op != OpSB 8445 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8446 for { 8447 off := v.AuxInt 8448 sym := v.Aux 8449 _ = v.Args[1] 8450 v_0 := v.Args[0] 8451 if v_0.Op != OpS390XADD { 8452 break 8453 } 8454 _ = v_0.Args[1] 8455 ptr := v_0.Args[0] 8456 idx := v_0.Args[1] 8457 mem := v.Args[1] 8458 if !(ptr.Op != OpSB) { 8459 break 8460 } 8461 v.reset(OpS390XFMOVSloadidx) 8462 v.AuxInt = off 8463 v.Aux = sym 8464 v.AddArg(ptr) 8465 v.AddArg(idx) 8466 v.AddArg(mem) 8467 return true 8468 } 8469 return false 8470 } 8471 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 8472 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8473 // cond: 8474 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8475 for { 8476 c := v.AuxInt 8477 sym := v.Aux 8478 _ = v.Args[2] 8479 v_0 := v.Args[0] 8480 if v_0.Op != OpS390XADDconst { 8481 break 8482 } 8483 d := v_0.AuxInt 8484 ptr := v_0.Args[0] 8485 idx := v.Args[1] 8486 mem := v.Args[2] 8487 v.reset(OpS390XFMOVSloadidx) 8488 v.AuxInt = c + d 8489 v.Aux = sym 8490 v.AddArg(ptr) 8491 v.AddArg(idx) 8492 v.AddArg(mem) 8493 return true 8494 } 8495 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8496 // cond: 8497 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8498 for { 8499 c := v.AuxInt 8500 sym := v.Aux 8501 _ = v.Args[2] 8502 ptr := v.Args[0] 8503 v_1 := v.Args[1] 8504 if v_1.Op != OpS390XADDconst { 8505 break 8506 } 8507 d := v_1.AuxInt 8508 idx := v_1.Args[0] 8509 mem := v.Args[2] 8510 v.reset(OpS390XFMOVSloadidx) 8511 v.AuxInt = c + d 8512 v.Aux = sym 8513 v.AddArg(ptr) 8514 v.AddArg(idx) 8515 v.AddArg(mem) 8516 return true 8517 } 8518 return false 8519 } 8520 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 8521 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8522 // cond: is20Bit(off1+off2) 8523 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 8524 for { 8525 off1 := v.AuxInt 8526 sym := v.Aux 8527 _ = v.Args[2] 8528 v_0 := v.Args[0] 8529 if v_0.Op != OpS390XADDconst { 8530 break 8531 } 8532 off2 := v_0.AuxInt 8533 ptr := v_0.Args[0] 8534 val := v.Args[1] 8535 mem := v.Args[2] 8536 if !(is20Bit(off1 + off2)) { 8537 break 8538 } 8539 v.reset(OpS390XFMOVSstore) 8540 v.AuxInt = off1 + off2 8541 v.Aux = sym 8542 v.AddArg(ptr) 8543 v.AddArg(val) 8544 v.AddArg(mem) 8545 return true 8546 } 8547 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8548 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8549 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8550 for { 8551 off1 := v.AuxInt 8552 sym1 := v.Aux 8553 _ = v.Args[2] 8554 v_0 := v.Args[0] 8555 if v_0.Op != OpS390XMOVDaddr { 8556 break 8557 } 8558 off2 := v_0.AuxInt 8559 sym2 := v_0.Aux 8560 base := v_0.Args[0] 8561 val := v.Args[1] 8562 mem := v.Args[2] 8563 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8564 break 8565 } 8566 v.reset(OpS390XFMOVSstore) 8567 v.AuxInt = off1 + off2 8568 v.Aux = mergeSym(sym1, sym2) 8569 v.AddArg(base) 8570 v.AddArg(val) 8571 v.AddArg(mem) 8572 return true 8573 } 8574 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8575 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8576 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8577 for { 8578 off1 := v.AuxInt 8579 sym1 := v.Aux 8580 _ = v.Args[2] 8581 v_0 := v.Args[0] 8582 if v_0.Op != OpS390XMOVDaddridx { 8583 break 8584 } 8585 off2 := v_0.AuxInt 8586 sym2 := v_0.Aux 8587 _ = v_0.Args[1] 8588 ptr := v_0.Args[0] 8589 idx := v_0.Args[1] 8590 val := v.Args[1] 8591 mem := v.Args[2] 8592 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8593 break 8594 } 8595 v.reset(OpS390XFMOVSstoreidx) 8596 v.AuxInt = off1 + off2 8597 v.Aux = mergeSym(sym1, sym2) 8598 v.AddArg(ptr) 8599 v.AddArg(idx) 8600 v.AddArg(val) 8601 v.AddArg(mem) 8602 return true 8603 } 8604 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 8605 // cond: ptr.Op != OpSB 8606 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 8607 for { 8608 off := v.AuxInt 8609 sym := v.Aux 8610 _ = v.Args[2] 8611 v_0 := v.Args[0] 8612 if v_0.Op != OpS390XADD { 8613 break 8614 } 8615 _ = v_0.Args[1] 8616 ptr := v_0.Args[0] 8617 idx := v_0.Args[1] 8618 val := v.Args[1] 8619 mem := v.Args[2] 8620 if !(ptr.Op != OpSB) { 8621 break 8622 } 8623 v.reset(OpS390XFMOVSstoreidx) 8624 v.AuxInt = off 8625 v.Aux = sym 8626 v.AddArg(ptr) 8627 v.AddArg(idx) 8628 v.AddArg(val) 8629 v.AddArg(mem) 8630 return true 8631 } 8632 return false 8633 } 8634 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 8635 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8636 // cond: 8637 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8638 for { 8639 c := v.AuxInt 8640 sym := v.Aux 8641 _ = v.Args[3] 8642 v_0 := v.Args[0] 8643 if v_0.Op != OpS390XADDconst { 8644 break 8645 } 8646 d := v_0.AuxInt 8647 ptr := v_0.Args[0] 8648 idx := v.Args[1] 8649 val := v.Args[2] 8650 mem := v.Args[3] 8651 v.reset(OpS390XFMOVSstoreidx) 8652 v.AuxInt = c + d 8653 v.Aux = sym 8654 v.AddArg(ptr) 8655 v.AddArg(idx) 8656 v.AddArg(val) 8657 v.AddArg(mem) 8658 return true 8659 } 8660 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8661 // cond: 8662 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8663 for { 8664 c := v.AuxInt 8665 sym := v.Aux 8666 _ = v.Args[3] 8667 ptr := v.Args[0] 8668 v_1 := v.Args[1] 8669 if v_1.Op != OpS390XADDconst { 8670 break 8671 } 8672 d := v_1.AuxInt 8673 idx := v_1.Args[0] 8674 val := v.Args[2] 8675 mem := v.Args[3] 8676 v.reset(OpS390XFMOVSstoreidx) 8677 v.AuxInt = c + d 8678 v.Aux = sym 8679 v.AddArg(ptr) 8680 v.AddArg(idx) 8681 v.AddArg(val) 8682 v.AddArg(mem) 8683 return true 8684 } 8685 return false 8686 } 8687 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 8688 // match: (FSUB (FMUL y z) x) 8689 // cond: 8690 // result: (FMSUB x y z) 8691 for { 8692 _ = v.Args[1] 8693 v_0 := v.Args[0] 8694 if v_0.Op != OpS390XFMUL { 8695 break 8696 } 8697 _ = v_0.Args[1] 8698 y := v_0.Args[0] 8699 z := v_0.Args[1] 8700 x := v.Args[1] 8701 v.reset(OpS390XFMSUB) 8702 v.AddArg(x) 8703 v.AddArg(y) 8704 v.AddArg(z) 8705 return true 8706 } 8707 return false 8708 } 8709 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 8710 // match: (FSUBS (FMULS y z) x) 8711 // cond: 8712 // result: (FMSUBS x y z) 8713 for { 8714 _ = v.Args[1] 8715 v_0 := v.Args[0] 8716 if v_0.Op != OpS390XFMULS { 8717 break 8718 } 8719 _ = v_0.Args[1] 8720 y := v_0.Args[0] 8721 z := v_0.Args[1] 8722 x := v.Args[1] 8723 v.reset(OpS390XFMSUBS) 8724 v.AddArg(x) 8725 v.AddArg(y) 8726 v.AddArg(z) 8727 return true 8728 } 8729 return false 8730 } 8731 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 8732 // match: (LoweredRound32F x:(FMOVSconst)) 8733 // cond: 8734 // result: x 8735 for { 8736 x := v.Args[0] 8737 if x.Op != OpS390XFMOVSconst { 8738 break 8739 } 8740 v.reset(OpCopy) 8741 v.Type = x.Type 8742 v.AddArg(x) 8743 return true 8744 } 8745 return false 8746 } 8747 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 8748 // match: (LoweredRound64F x:(FMOVDconst)) 8749 // cond: 8750 // result: x 8751 for { 8752 x := v.Args[0] 8753 if x.Op != OpS390XFMOVDconst { 8754 break 8755 } 8756 v.reset(OpCopy) 8757 v.Type = x.Type 8758 v.AddArg(x) 8759 return true 8760 } 8761 return false 8762 } 8763 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 8764 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 8765 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8766 // result: (MOVBZreg x) 8767 for { 8768 off := v.AuxInt 8769 sym := v.Aux 8770 _ = v.Args[1] 8771 ptr := v.Args[0] 8772 v_1 := v.Args[1] 8773 if v_1.Op != OpS390XMOVBstore { 8774 break 8775 } 8776 off2 := v_1.AuxInt 8777 sym2 := v_1.Aux 8778 _ = v_1.Args[2] 8779 ptr2 := v_1.Args[0] 8780 x := v_1.Args[1] 8781 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8782 break 8783 } 8784 v.reset(OpS390XMOVBZreg) 8785 v.AddArg(x) 8786 return true 8787 } 8788 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 8789 // cond: is20Bit(off1+off2) 8790 // result: (MOVBZload [off1+off2] {sym} ptr mem) 8791 for { 8792 off1 := v.AuxInt 8793 sym := v.Aux 8794 _ = v.Args[1] 8795 v_0 := v.Args[0] 8796 if v_0.Op != OpS390XADDconst { 8797 break 8798 } 8799 off2 := v_0.AuxInt 8800 ptr := v_0.Args[0] 8801 mem := v.Args[1] 8802 if !(is20Bit(off1 + off2)) { 8803 break 8804 } 8805 v.reset(OpS390XMOVBZload) 8806 v.AuxInt = off1 + off2 8807 v.Aux = sym 8808 v.AddArg(ptr) 8809 v.AddArg(mem) 8810 return true 8811 } 8812 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8813 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8814 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8815 for { 8816 off1 := v.AuxInt 8817 sym1 := v.Aux 8818 _ = v.Args[1] 8819 v_0 := v.Args[0] 8820 if v_0.Op != OpS390XMOVDaddr { 8821 break 8822 } 8823 off2 := v_0.AuxInt 8824 sym2 := v_0.Aux 8825 base := v_0.Args[0] 8826 mem := v.Args[1] 8827 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8828 break 8829 } 8830 v.reset(OpS390XMOVBZload) 8831 v.AuxInt = off1 + off2 8832 v.Aux = mergeSym(sym1, sym2) 8833 v.AddArg(base) 8834 v.AddArg(mem) 8835 return true 8836 } 8837 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8838 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8839 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8840 for { 8841 off1 := v.AuxInt 8842 sym1 := v.Aux 8843 _ = v.Args[1] 8844 v_0 := v.Args[0] 8845 if v_0.Op != OpS390XMOVDaddridx { 8846 break 8847 } 8848 off2 := v_0.AuxInt 8849 sym2 := v_0.Aux 8850 _ = v_0.Args[1] 8851 ptr := v_0.Args[0] 8852 idx := v_0.Args[1] 8853 mem := v.Args[1] 8854 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8855 break 8856 } 8857 v.reset(OpS390XMOVBZloadidx) 8858 v.AuxInt = off1 + off2 8859 v.Aux = mergeSym(sym1, sym2) 8860 v.AddArg(ptr) 8861 v.AddArg(idx) 8862 v.AddArg(mem) 8863 return true 8864 } 8865 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 8866 // cond: ptr.Op != OpSB 8867 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 8868 for { 8869 off := v.AuxInt 8870 sym := v.Aux 8871 _ = v.Args[1] 8872 v_0 := v.Args[0] 8873 if v_0.Op != OpS390XADD { 8874 break 8875 } 8876 _ = v_0.Args[1] 8877 ptr := v_0.Args[0] 8878 idx := v_0.Args[1] 8879 mem := v.Args[1] 8880 if !(ptr.Op != OpSB) { 8881 break 8882 } 8883 v.reset(OpS390XMOVBZloadidx) 8884 v.AuxInt = off 8885 v.Aux = sym 8886 v.AddArg(ptr) 8887 v.AddArg(idx) 8888 v.AddArg(mem) 8889 return true 8890 } 8891 return false 8892 } 8893 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 8894 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8895 // cond: 8896 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8897 for { 8898 c := v.AuxInt 8899 sym := v.Aux 8900 _ = v.Args[2] 8901 v_0 := v.Args[0] 8902 if v_0.Op != OpS390XADDconst { 8903 break 8904 } 8905 d := v_0.AuxInt 8906 ptr := v_0.Args[0] 8907 idx := v.Args[1] 8908 mem := v.Args[2] 8909 v.reset(OpS390XMOVBZloadidx) 8910 v.AuxInt = c + d 8911 v.Aux = sym 8912 v.AddArg(ptr) 8913 v.AddArg(idx) 8914 v.AddArg(mem) 8915 return true 8916 } 8917 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 8918 // cond: 8919 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8920 for { 8921 c := v.AuxInt 8922 sym := v.Aux 8923 _ = v.Args[2] 8924 idx := v.Args[0] 8925 v_1 := v.Args[1] 8926 if v_1.Op != OpS390XADDconst { 8927 break 8928 } 8929 d := v_1.AuxInt 8930 ptr := v_1.Args[0] 8931 mem := v.Args[2] 8932 v.reset(OpS390XMOVBZloadidx) 8933 v.AuxInt = c + d 8934 v.Aux = sym 8935 v.AddArg(ptr) 8936 v.AddArg(idx) 8937 v.AddArg(mem) 8938 return true 8939 } 8940 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8941 // cond: 8942 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8943 for { 8944 c := v.AuxInt 8945 sym := v.Aux 8946 _ = v.Args[2] 8947 ptr := v.Args[0] 8948 v_1 := v.Args[1] 8949 if v_1.Op != OpS390XADDconst { 8950 break 8951 } 8952 d := v_1.AuxInt 8953 idx := v_1.Args[0] 8954 mem := v.Args[2] 8955 v.reset(OpS390XMOVBZloadidx) 8956 v.AuxInt = c + d 8957 v.Aux = sym 8958 v.AddArg(ptr) 8959 v.AddArg(idx) 8960 v.AddArg(mem) 8961 return true 8962 } 8963 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 8964 // cond: 8965 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8966 for { 8967 c := v.AuxInt 8968 sym := v.Aux 8969 _ = v.Args[2] 8970 v_0 := v.Args[0] 8971 if v_0.Op != OpS390XADDconst { 8972 break 8973 } 8974 d := v_0.AuxInt 8975 idx := v_0.Args[0] 8976 ptr := v.Args[1] 8977 mem := v.Args[2] 8978 v.reset(OpS390XMOVBZloadidx) 8979 v.AuxInt = c + d 8980 v.Aux = sym 8981 v.AddArg(ptr) 8982 v.AddArg(idx) 8983 v.AddArg(mem) 8984 return true 8985 } 8986 return false 8987 } 8988 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 8989 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8990 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8991 // result: (MOVDreg x) 8992 for { 8993 x := v.Args[0] 8994 if x.Op != OpS390XMOVDLT { 8995 break 8996 } 8997 _ = x.Args[2] 8998 x_0 := x.Args[0] 8999 if x_0.Op != OpS390XMOVDconst { 9000 break 9001 } 9002 c := x_0.AuxInt 9003 x_1 := x.Args[1] 9004 if x_1.Op != OpS390XMOVDconst { 9005 break 9006 } 9007 d := x_1.AuxInt 9008 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9009 break 9010 } 9011 v.reset(OpS390XMOVDreg) 9012 v.AddArg(x) 9013 return true 9014 } 9015 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 9016 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9017 // result: (MOVDreg x) 9018 for { 9019 x := v.Args[0] 9020 if x.Op != OpS390XMOVDLE { 9021 break 9022 } 9023 _ = x.Args[2] 9024 x_0 := x.Args[0] 9025 if x_0.Op != OpS390XMOVDconst { 9026 break 9027 } 9028 c := x_0.AuxInt 9029 x_1 := x.Args[1] 9030 if x_1.Op != OpS390XMOVDconst { 9031 break 9032 } 9033 d := x_1.AuxInt 9034 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9035 break 9036 } 9037 v.reset(OpS390XMOVDreg) 9038 v.AddArg(x) 9039 return true 9040 } 9041 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 9042 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9043 // result: (MOVDreg x) 9044 for { 9045 x := v.Args[0] 9046 if x.Op != OpS390XMOVDGT { 9047 break 9048 } 9049 _ = x.Args[2] 9050 x_0 := x.Args[0] 9051 if x_0.Op != OpS390XMOVDconst { 9052 break 9053 } 9054 c := x_0.AuxInt 9055 x_1 := x.Args[1] 9056 if x_1.Op != OpS390XMOVDconst { 9057 break 9058 } 9059 d := x_1.AuxInt 9060 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9061 break 9062 } 9063 v.reset(OpS390XMOVDreg) 9064 v.AddArg(x) 9065 return true 9066 } 9067 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 9068 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9069 // result: (MOVDreg x) 9070 for { 9071 x := v.Args[0] 9072 if x.Op != OpS390XMOVDGE { 9073 break 9074 } 9075 _ = x.Args[2] 9076 x_0 := x.Args[0] 9077 if x_0.Op != OpS390XMOVDconst { 9078 break 9079 } 9080 c := x_0.AuxInt 9081 x_1 := x.Args[1] 9082 if x_1.Op != OpS390XMOVDconst { 9083 break 9084 } 9085 d := x_1.AuxInt 9086 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9087 break 9088 } 9089 v.reset(OpS390XMOVDreg) 9090 v.AddArg(x) 9091 return true 9092 } 9093 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 9094 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9095 // result: (MOVDreg x) 9096 for { 9097 x := v.Args[0] 9098 if x.Op != OpS390XMOVDEQ { 9099 break 9100 } 9101 _ = x.Args[2] 9102 x_0 := x.Args[0] 9103 if x_0.Op != OpS390XMOVDconst { 9104 break 9105 } 9106 c := x_0.AuxInt 9107 x_1 := x.Args[1] 9108 if x_1.Op != OpS390XMOVDconst { 9109 break 9110 } 9111 d := x_1.AuxInt 9112 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9113 break 9114 } 9115 v.reset(OpS390XMOVDreg) 9116 v.AddArg(x) 9117 return true 9118 } 9119 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 9120 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9121 // result: (MOVDreg x) 9122 for { 9123 x := v.Args[0] 9124 if x.Op != OpS390XMOVDNE { 9125 break 9126 } 9127 _ = x.Args[2] 9128 x_0 := x.Args[0] 9129 if x_0.Op != OpS390XMOVDconst { 9130 break 9131 } 9132 c := x_0.AuxInt 9133 x_1 := x.Args[1] 9134 if x_1.Op != OpS390XMOVDconst { 9135 break 9136 } 9137 d := x_1.AuxInt 9138 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9139 break 9140 } 9141 v.reset(OpS390XMOVDreg) 9142 v.AddArg(x) 9143 return true 9144 } 9145 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9146 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9147 // result: (MOVDreg x) 9148 for { 9149 x := v.Args[0] 9150 if x.Op != OpS390XMOVDGTnoinv { 9151 break 9152 } 9153 _ = x.Args[2] 9154 x_0 := x.Args[0] 9155 if x_0.Op != OpS390XMOVDconst { 9156 break 9157 } 9158 c := x_0.AuxInt 9159 x_1 := x.Args[1] 9160 if x_1.Op != OpS390XMOVDconst { 9161 break 9162 } 9163 d := x_1.AuxInt 9164 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9165 break 9166 } 9167 v.reset(OpS390XMOVDreg) 9168 v.AddArg(x) 9169 return true 9170 } 9171 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9172 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9173 // result: (MOVDreg x) 9174 for { 9175 x := v.Args[0] 9176 if x.Op != OpS390XMOVDGEnoinv { 9177 break 9178 } 9179 _ = x.Args[2] 9180 x_0 := x.Args[0] 9181 if x_0.Op != OpS390XMOVDconst { 9182 break 9183 } 9184 c := x_0.AuxInt 9185 x_1 := x.Args[1] 9186 if x_1.Op != OpS390XMOVDconst { 9187 break 9188 } 9189 d := x_1.AuxInt 9190 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9191 break 9192 } 9193 v.reset(OpS390XMOVDreg) 9194 v.AddArg(x) 9195 return true 9196 } 9197 // match: (MOVBZreg x:(MOVBZload _ _)) 9198 // cond: 9199 // result: (MOVDreg x) 9200 for { 9201 x := v.Args[0] 9202 if x.Op != OpS390XMOVBZload { 9203 break 9204 } 9205 _ = x.Args[1] 9206 v.reset(OpS390XMOVDreg) 9207 v.AddArg(x) 9208 return true 9209 } 9210 // match: (MOVBZreg x:(Arg <t>)) 9211 // cond: is8BitInt(t) && !isSigned(t) 9212 // result: (MOVDreg x) 9213 for { 9214 x := v.Args[0] 9215 if x.Op != OpArg { 9216 break 9217 } 9218 t := x.Type 9219 if !(is8BitInt(t) && !isSigned(t)) { 9220 break 9221 } 9222 v.reset(OpS390XMOVDreg) 9223 v.AddArg(x) 9224 return true 9225 } 9226 return false 9227 } 9228 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 9229 b := v.Block 9230 _ = b 9231 // match: (MOVBZreg x:(MOVBZreg _)) 9232 // cond: 9233 // result: (MOVDreg x) 9234 for { 9235 x := v.Args[0] 9236 if x.Op != OpS390XMOVBZreg { 9237 break 9238 } 9239 v.reset(OpS390XMOVDreg) 9240 v.AddArg(x) 9241 return true 9242 } 9243 // match: (MOVBZreg (MOVDconst [c])) 9244 // cond: 9245 // result: (MOVDconst [int64(uint8(c))]) 9246 for { 9247 v_0 := v.Args[0] 9248 if v_0.Op != OpS390XMOVDconst { 9249 break 9250 } 9251 c := v_0.AuxInt 9252 v.reset(OpS390XMOVDconst) 9253 v.AuxInt = int64(uint8(c)) 9254 return true 9255 } 9256 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 9257 // cond: x.Uses == 1 && clobber(x) 9258 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 9259 for { 9260 x := v.Args[0] 9261 if x.Op != OpS390XMOVBZload { 9262 break 9263 } 9264 off := x.AuxInt 9265 sym := x.Aux 9266 _ = x.Args[1] 9267 ptr := x.Args[0] 9268 mem := x.Args[1] 9269 if !(x.Uses == 1 && clobber(x)) { 9270 break 9271 } 9272 b = x.Block 9273 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 9274 v.reset(OpCopy) 9275 v.AddArg(v0) 9276 v0.AuxInt = off 9277 v0.Aux = sym 9278 v0.AddArg(ptr) 9279 v0.AddArg(mem) 9280 return true 9281 } 9282 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 9283 // cond: x.Uses == 1 && clobber(x) 9284 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 9285 for { 9286 x := v.Args[0] 9287 if x.Op != OpS390XMOVBZloadidx { 9288 break 9289 } 9290 off := x.AuxInt 9291 sym := x.Aux 9292 _ = x.Args[2] 9293 ptr := x.Args[0] 9294 idx := x.Args[1] 9295 mem := x.Args[2] 9296 if !(x.Uses == 1 && clobber(x)) { 9297 break 9298 } 9299 b = x.Block 9300 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 9301 v.reset(OpCopy) 9302 v.AddArg(v0) 9303 v0.AuxInt = off 9304 v0.Aux = sym 9305 v0.AddArg(ptr) 9306 v0.AddArg(idx) 9307 v0.AddArg(mem) 9308 return true 9309 } 9310 return false 9311 } 9312 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 9313 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 9314 // cond: is20Bit(off1+off2) 9315 // result: (MOVBload [off1+off2] {sym} ptr mem) 9316 for { 9317 off1 := v.AuxInt 9318 sym := v.Aux 9319 _ = v.Args[1] 9320 v_0 := v.Args[0] 9321 if v_0.Op != OpS390XADDconst { 9322 break 9323 } 9324 off2 := v_0.AuxInt 9325 ptr := v_0.Args[0] 9326 mem := v.Args[1] 9327 if !(is20Bit(off1 + off2)) { 9328 break 9329 } 9330 v.reset(OpS390XMOVBload) 9331 v.AuxInt = off1 + off2 9332 v.Aux = sym 9333 v.AddArg(ptr) 9334 v.AddArg(mem) 9335 return true 9336 } 9337 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 9338 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9339 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 9340 for { 9341 off1 := v.AuxInt 9342 sym1 := v.Aux 9343 _ = v.Args[1] 9344 v_0 := v.Args[0] 9345 if v_0.Op != OpS390XMOVDaddr { 9346 break 9347 } 9348 off2 := v_0.AuxInt 9349 sym2 := v_0.Aux 9350 base := v_0.Args[0] 9351 mem := v.Args[1] 9352 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9353 break 9354 } 9355 v.reset(OpS390XMOVBload) 9356 v.AuxInt = off1 + off2 9357 v.Aux = mergeSym(sym1, sym2) 9358 v.AddArg(base) 9359 v.AddArg(mem) 9360 return true 9361 } 9362 return false 9363 } 9364 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 9365 b := v.Block 9366 _ = b 9367 // match: (MOVBreg x:(MOVBload _ _)) 9368 // cond: 9369 // result: (MOVDreg x) 9370 for { 9371 x := v.Args[0] 9372 if x.Op != OpS390XMOVBload { 9373 break 9374 } 9375 _ = x.Args[1] 9376 v.reset(OpS390XMOVDreg) 9377 v.AddArg(x) 9378 return true 9379 } 9380 // match: (MOVBreg x:(Arg <t>)) 9381 // cond: is8BitInt(t) && isSigned(t) 9382 // result: (MOVDreg x) 9383 for { 9384 x := v.Args[0] 9385 if x.Op != OpArg { 9386 break 9387 } 9388 t := x.Type 9389 if !(is8BitInt(t) && isSigned(t)) { 9390 break 9391 } 9392 v.reset(OpS390XMOVDreg) 9393 v.AddArg(x) 9394 return true 9395 } 9396 // match: (MOVBreg x:(MOVBreg _)) 9397 // cond: 9398 // result: (MOVDreg x) 9399 for { 9400 x := v.Args[0] 9401 if x.Op != OpS390XMOVBreg { 9402 break 9403 } 9404 v.reset(OpS390XMOVDreg) 9405 v.AddArg(x) 9406 return true 9407 } 9408 // match: (MOVBreg (MOVDconst [c])) 9409 // cond: 9410 // result: (MOVDconst [int64(int8(c))]) 9411 for { 9412 v_0 := v.Args[0] 9413 if v_0.Op != OpS390XMOVDconst { 9414 break 9415 } 9416 c := v_0.AuxInt 9417 v.reset(OpS390XMOVDconst) 9418 v.AuxInt = int64(int8(c)) 9419 return true 9420 } 9421 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 9422 // cond: x.Uses == 1 && clobber(x) 9423 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 9424 for { 9425 x := v.Args[0] 9426 if x.Op != OpS390XMOVBZload { 9427 break 9428 } 9429 off := x.AuxInt 9430 sym := x.Aux 9431 _ = x.Args[1] 9432 ptr := x.Args[0] 9433 mem := x.Args[1] 9434 if !(x.Uses == 1 && clobber(x)) { 9435 break 9436 } 9437 b = x.Block 9438 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 9439 v.reset(OpCopy) 9440 v.AddArg(v0) 9441 v0.AuxInt = off 9442 v0.Aux = sym 9443 v0.AddArg(ptr) 9444 v0.AddArg(mem) 9445 return true 9446 } 9447 return false 9448 } 9449 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 9450 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 9451 // cond: 9452 // result: (MOVBstore [off] {sym} ptr x mem) 9453 for { 9454 off := v.AuxInt 9455 sym := v.Aux 9456 _ = v.Args[2] 9457 ptr := v.Args[0] 9458 v_1 := v.Args[1] 9459 if v_1.Op != OpS390XMOVBreg { 9460 break 9461 } 9462 x := v_1.Args[0] 9463 mem := v.Args[2] 9464 v.reset(OpS390XMOVBstore) 9465 v.AuxInt = off 9466 v.Aux = sym 9467 v.AddArg(ptr) 9468 v.AddArg(x) 9469 v.AddArg(mem) 9470 return true 9471 } 9472 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 9473 // cond: 9474 // result: (MOVBstore [off] {sym} ptr x mem) 9475 for { 9476 off := v.AuxInt 9477 sym := v.Aux 9478 _ = v.Args[2] 9479 ptr := v.Args[0] 9480 v_1 := v.Args[1] 9481 if v_1.Op != OpS390XMOVBZreg { 9482 break 9483 } 9484 x := v_1.Args[0] 9485 mem := v.Args[2] 9486 v.reset(OpS390XMOVBstore) 9487 v.AuxInt = off 9488 v.Aux = sym 9489 v.AddArg(ptr) 9490 v.AddArg(x) 9491 v.AddArg(mem) 9492 return true 9493 } 9494 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9495 // cond: is20Bit(off1+off2) 9496 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 9497 for { 9498 off1 := v.AuxInt 9499 sym := v.Aux 9500 _ = v.Args[2] 9501 v_0 := v.Args[0] 9502 if v_0.Op != OpS390XADDconst { 9503 break 9504 } 9505 off2 := v_0.AuxInt 9506 ptr := v_0.Args[0] 9507 val := v.Args[1] 9508 mem := v.Args[2] 9509 if !(is20Bit(off1 + off2)) { 9510 break 9511 } 9512 v.reset(OpS390XMOVBstore) 9513 v.AuxInt = off1 + off2 9514 v.Aux = sym 9515 v.AddArg(ptr) 9516 v.AddArg(val) 9517 v.AddArg(mem) 9518 return true 9519 } 9520 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 9521 // cond: is20Bit(off) && ptr.Op != OpSB 9522 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 9523 for { 9524 off := v.AuxInt 9525 sym := v.Aux 9526 _ = v.Args[2] 9527 ptr := v.Args[0] 9528 v_1 := v.Args[1] 9529 if v_1.Op != OpS390XMOVDconst { 9530 break 9531 } 9532 c := v_1.AuxInt 9533 mem := v.Args[2] 9534 if !(is20Bit(off) && ptr.Op != OpSB) { 9535 break 9536 } 9537 v.reset(OpS390XMOVBstoreconst) 9538 v.AuxInt = makeValAndOff(int64(int8(c)), off) 9539 v.Aux = sym 9540 v.AddArg(ptr) 9541 v.AddArg(mem) 9542 return true 9543 } 9544 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9545 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9546 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9547 for { 9548 off1 := v.AuxInt 9549 sym1 := v.Aux 9550 _ = v.Args[2] 9551 v_0 := v.Args[0] 9552 if v_0.Op != OpS390XMOVDaddr { 9553 break 9554 } 9555 off2 := v_0.AuxInt 9556 sym2 := v_0.Aux 9557 base := v_0.Args[0] 9558 val := v.Args[1] 9559 mem := v.Args[2] 9560 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9561 break 9562 } 9563 v.reset(OpS390XMOVBstore) 9564 v.AuxInt = off1 + off2 9565 v.Aux = mergeSym(sym1, sym2) 9566 v.AddArg(base) 9567 v.AddArg(val) 9568 v.AddArg(mem) 9569 return true 9570 } 9571 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9572 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9573 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9574 for { 9575 off1 := v.AuxInt 9576 sym1 := v.Aux 9577 _ = v.Args[2] 9578 v_0 := v.Args[0] 9579 if v_0.Op != OpS390XMOVDaddridx { 9580 break 9581 } 9582 off2 := v_0.AuxInt 9583 sym2 := v_0.Aux 9584 _ = v_0.Args[1] 9585 ptr := v_0.Args[0] 9586 idx := v_0.Args[1] 9587 val := v.Args[1] 9588 mem := v.Args[2] 9589 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9590 break 9591 } 9592 v.reset(OpS390XMOVBstoreidx) 9593 v.AuxInt = off1 + off2 9594 v.Aux = mergeSym(sym1, sym2) 9595 v.AddArg(ptr) 9596 v.AddArg(idx) 9597 v.AddArg(val) 9598 v.AddArg(mem) 9599 return true 9600 } 9601 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 9602 // cond: ptr.Op != OpSB 9603 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 9604 for { 9605 off := v.AuxInt 9606 sym := v.Aux 9607 _ = v.Args[2] 9608 v_0 := v.Args[0] 9609 if v_0.Op != OpS390XADD { 9610 break 9611 } 9612 _ = v_0.Args[1] 9613 ptr := v_0.Args[0] 9614 idx := v_0.Args[1] 9615 val := v.Args[1] 9616 mem := v.Args[2] 9617 if !(ptr.Op != OpSB) { 9618 break 9619 } 9620 v.reset(OpS390XMOVBstoreidx) 9621 v.AuxInt = off 9622 v.Aux = sym 9623 v.AddArg(ptr) 9624 v.AddArg(idx) 9625 v.AddArg(val) 9626 v.AddArg(mem) 9627 return true 9628 } 9629 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 9630 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9631 // result: (MOVHstore [i-1] {s} p w mem) 9632 for { 9633 i := v.AuxInt 9634 s := v.Aux 9635 _ = v.Args[2] 9636 p := v.Args[0] 9637 w := v.Args[1] 9638 x := v.Args[2] 9639 if x.Op != OpS390XMOVBstore { 9640 break 9641 } 9642 if x.AuxInt != i-1 { 9643 break 9644 } 9645 if x.Aux != s { 9646 break 9647 } 9648 _ = x.Args[2] 9649 if p != x.Args[0] { 9650 break 9651 } 9652 x_1 := x.Args[1] 9653 if x_1.Op != OpS390XSRDconst { 9654 break 9655 } 9656 if x_1.AuxInt != 8 { 9657 break 9658 } 9659 if w != x_1.Args[0] { 9660 break 9661 } 9662 mem := x.Args[2] 9663 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9664 break 9665 } 9666 v.reset(OpS390XMOVHstore) 9667 v.AuxInt = i - 1 9668 v.Aux = s 9669 v.AddArg(p) 9670 v.AddArg(w) 9671 v.AddArg(mem) 9672 return true 9673 } 9674 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 9675 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9676 // result: (MOVHstore [i-1] {s} p w0 mem) 9677 for { 9678 i := v.AuxInt 9679 s := v.Aux 9680 _ = v.Args[2] 9681 p := v.Args[0] 9682 w0 := v.Args[1] 9683 if w0.Op != OpS390XSRDconst { 9684 break 9685 } 9686 j := w0.AuxInt 9687 w := w0.Args[0] 9688 x := v.Args[2] 9689 if x.Op != OpS390XMOVBstore { 9690 break 9691 } 9692 if x.AuxInt != i-1 { 9693 break 9694 } 9695 if x.Aux != s { 9696 break 9697 } 9698 _ = x.Args[2] 9699 if p != x.Args[0] { 9700 break 9701 } 9702 x_1 := x.Args[1] 9703 if x_1.Op != OpS390XSRDconst { 9704 break 9705 } 9706 if x_1.AuxInt != j+8 { 9707 break 9708 } 9709 if w != x_1.Args[0] { 9710 break 9711 } 9712 mem := x.Args[2] 9713 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9714 break 9715 } 9716 v.reset(OpS390XMOVHstore) 9717 v.AuxInt = i - 1 9718 v.Aux = s 9719 v.AddArg(p) 9720 v.AddArg(w0) 9721 v.AddArg(mem) 9722 return true 9723 } 9724 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 9725 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9726 // result: (MOVHstore [i-1] {s} p w mem) 9727 for { 9728 i := v.AuxInt 9729 s := v.Aux 9730 _ = v.Args[2] 9731 p := v.Args[0] 9732 w := v.Args[1] 9733 x := v.Args[2] 9734 if x.Op != OpS390XMOVBstore { 9735 break 9736 } 9737 if x.AuxInt != i-1 { 9738 break 9739 } 9740 if x.Aux != s { 9741 break 9742 } 9743 _ = x.Args[2] 9744 if p != x.Args[0] { 9745 break 9746 } 9747 x_1 := x.Args[1] 9748 if x_1.Op != OpS390XSRWconst { 9749 break 9750 } 9751 if x_1.AuxInt != 8 { 9752 break 9753 } 9754 if w != x_1.Args[0] { 9755 break 9756 } 9757 mem := x.Args[2] 9758 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9759 break 9760 } 9761 v.reset(OpS390XMOVHstore) 9762 v.AuxInt = i - 1 9763 v.Aux = s 9764 v.AddArg(p) 9765 v.AddArg(w) 9766 v.AddArg(mem) 9767 return true 9768 } 9769 return false 9770 } 9771 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 9772 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 9773 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9774 // result: (MOVHstore [i-1] {s} p w0 mem) 9775 for { 9776 i := v.AuxInt 9777 s := v.Aux 9778 _ = v.Args[2] 9779 p := v.Args[0] 9780 w0 := v.Args[1] 9781 if w0.Op != OpS390XSRWconst { 9782 break 9783 } 9784 j := w0.AuxInt 9785 w := w0.Args[0] 9786 x := v.Args[2] 9787 if x.Op != OpS390XMOVBstore { 9788 break 9789 } 9790 if x.AuxInt != i-1 { 9791 break 9792 } 9793 if x.Aux != s { 9794 break 9795 } 9796 _ = x.Args[2] 9797 if p != x.Args[0] { 9798 break 9799 } 9800 x_1 := x.Args[1] 9801 if x_1.Op != OpS390XSRWconst { 9802 break 9803 } 9804 if x_1.AuxInt != j+8 { 9805 break 9806 } 9807 if w != x_1.Args[0] { 9808 break 9809 } 9810 mem := x.Args[2] 9811 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9812 break 9813 } 9814 v.reset(OpS390XMOVHstore) 9815 v.AuxInt = i - 1 9816 v.Aux = s 9817 v.AddArg(p) 9818 v.AddArg(w0) 9819 v.AddArg(mem) 9820 return true 9821 } 9822 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9823 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9824 // result: (MOVHBRstore [i-1] {s} p w mem) 9825 for { 9826 i := v.AuxInt 9827 s := v.Aux 9828 _ = v.Args[2] 9829 p := v.Args[0] 9830 v_1 := v.Args[1] 9831 if v_1.Op != OpS390XSRDconst { 9832 break 9833 } 9834 if v_1.AuxInt != 8 { 9835 break 9836 } 9837 w := v_1.Args[0] 9838 x := v.Args[2] 9839 if x.Op != OpS390XMOVBstore { 9840 break 9841 } 9842 if x.AuxInt != i-1 { 9843 break 9844 } 9845 if x.Aux != s { 9846 break 9847 } 9848 _ = x.Args[2] 9849 if p != x.Args[0] { 9850 break 9851 } 9852 if w != x.Args[1] { 9853 break 9854 } 9855 mem := x.Args[2] 9856 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9857 break 9858 } 9859 v.reset(OpS390XMOVHBRstore) 9860 v.AuxInt = i - 1 9861 v.Aux = s 9862 v.AddArg(p) 9863 v.AddArg(w) 9864 v.AddArg(mem) 9865 return true 9866 } 9867 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 9868 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9869 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9870 for { 9871 i := v.AuxInt 9872 s := v.Aux 9873 _ = v.Args[2] 9874 p := v.Args[0] 9875 v_1 := v.Args[1] 9876 if v_1.Op != OpS390XSRDconst { 9877 break 9878 } 9879 j := v_1.AuxInt 9880 w := v_1.Args[0] 9881 x := v.Args[2] 9882 if x.Op != OpS390XMOVBstore { 9883 break 9884 } 9885 if x.AuxInt != i-1 { 9886 break 9887 } 9888 if x.Aux != s { 9889 break 9890 } 9891 _ = x.Args[2] 9892 if p != x.Args[0] { 9893 break 9894 } 9895 w0 := x.Args[1] 9896 if w0.Op != OpS390XSRDconst { 9897 break 9898 } 9899 if w0.AuxInt != j-8 { 9900 break 9901 } 9902 if w != w0.Args[0] { 9903 break 9904 } 9905 mem := x.Args[2] 9906 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9907 break 9908 } 9909 v.reset(OpS390XMOVHBRstore) 9910 v.AuxInt = i - 1 9911 v.Aux = s 9912 v.AddArg(p) 9913 v.AddArg(w0) 9914 v.AddArg(mem) 9915 return true 9916 } 9917 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9918 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9919 // result: (MOVHBRstore [i-1] {s} p w mem) 9920 for { 9921 i := v.AuxInt 9922 s := v.Aux 9923 _ = v.Args[2] 9924 p := v.Args[0] 9925 v_1 := v.Args[1] 9926 if v_1.Op != OpS390XSRWconst { 9927 break 9928 } 9929 if v_1.AuxInt != 8 { 9930 break 9931 } 9932 w := v_1.Args[0] 9933 x := v.Args[2] 9934 if x.Op != OpS390XMOVBstore { 9935 break 9936 } 9937 if x.AuxInt != i-1 { 9938 break 9939 } 9940 if x.Aux != s { 9941 break 9942 } 9943 _ = x.Args[2] 9944 if p != x.Args[0] { 9945 break 9946 } 9947 if w != x.Args[1] { 9948 break 9949 } 9950 mem := x.Args[2] 9951 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9952 break 9953 } 9954 v.reset(OpS390XMOVHBRstore) 9955 v.AuxInt = i - 1 9956 v.Aux = s 9957 v.AddArg(p) 9958 v.AddArg(w) 9959 v.AddArg(mem) 9960 return true 9961 } 9962 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 9963 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9964 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9965 for { 9966 i := v.AuxInt 9967 s := v.Aux 9968 _ = v.Args[2] 9969 p := v.Args[0] 9970 v_1 := v.Args[1] 9971 if v_1.Op != OpS390XSRWconst { 9972 break 9973 } 9974 j := v_1.AuxInt 9975 w := v_1.Args[0] 9976 x := v.Args[2] 9977 if x.Op != OpS390XMOVBstore { 9978 break 9979 } 9980 if x.AuxInt != i-1 { 9981 break 9982 } 9983 if x.Aux != s { 9984 break 9985 } 9986 _ = x.Args[2] 9987 if p != x.Args[0] { 9988 break 9989 } 9990 w0 := x.Args[1] 9991 if w0.Op != OpS390XSRWconst { 9992 break 9993 } 9994 if w0.AuxInt != j-8 { 9995 break 9996 } 9997 if w != w0.Args[0] { 9998 break 9999 } 10000 mem := x.Args[2] 10001 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 10002 break 10003 } 10004 v.reset(OpS390XMOVHBRstore) 10005 v.AuxInt = i - 1 10006 v.Aux = s 10007 v.AddArg(p) 10008 v.AddArg(w0) 10009 v.AddArg(mem) 10010 return true 10011 } 10012 return false 10013 } 10014 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 10015 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 10016 // cond: is20Bit(ValAndOff(sc).Off()+off) 10017 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 10018 for { 10019 sc := v.AuxInt 10020 s := v.Aux 10021 _ = v.Args[1] 10022 v_0 := v.Args[0] 10023 if v_0.Op != OpS390XADDconst { 10024 break 10025 } 10026 off := v_0.AuxInt 10027 ptr := v_0.Args[0] 10028 mem := v.Args[1] 10029 if !(is20Bit(ValAndOff(sc).Off() + off)) { 10030 break 10031 } 10032 v.reset(OpS390XMOVBstoreconst) 10033 v.AuxInt = ValAndOff(sc).add(off) 10034 v.Aux = s 10035 v.AddArg(ptr) 10036 v.AddArg(mem) 10037 return true 10038 } 10039 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 10040 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 10041 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 10042 for { 10043 sc := v.AuxInt 10044 sym1 := v.Aux 10045 _ = v.Args[1] 10046 v_0 := v.Args[0] 10047 if v_0.Op != OpS390XMOVDaddr { 10048 break 10049 } 10050 off := v_0.AuxInt 10051 sym2 := v_0.Aux 10052 ptr := v_0.Args[0] 10053 mem := v.Args[1] 10054 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 10055 break 10056 } 10057 v.reset(OpS390XMOVBstoreconst) 10058 v.AuxInt = ValAndOff(sc).add(off) 10059 v.Aux = mergeSym(sym1, sym2) 10060 v.AddArg(ptr) 10061 v.AddArg(mem) 10062 return true 10063 } 10064 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 10065 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 10066 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 10067 for { 10068 c := v.AuxInt 10069 s := v.Aux 10070 _ = v.Args[1] 10071 p := v.Args[0] 10072 x := v.Args[1] 10073 if x.Op != OpS390XMOVBstoreconst { 10074 break 10075 } 10076 a := x.AuxInt 10077 if x.Aux != s { 10078 break 10079 } 10080 _ = x.Args[1] 10081 if p != x.Args[0] { 10082 break 10083 } 10084 mem := x.Args[1] 10085 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 10086 break 10087 } 10088 v.reset(OpS390XMOVHstoreconst) 10089 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 10090 v.Aux = s 10091 v.AddArg(p) 10092 v.AddArg(mem) 10093 return true 10094 } 10095 return false 10096 } 10097 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 10098 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10099 // cond: 10100 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10101 for { 10102 c := v.AuxInt 10103 sym := v.Aux 10104 _ = v.Args[3] 10105 v_0 := v.Args[0] 10106 if v_0.Op != OpS390XADDconst { 10107 break 10108 } 10109 d := v_0.AuxInt 10110 ptr := v_0.Args[0] 10111 idx := v.Args[1] 10112 val := v.Args[2] 10113 mem := v.Args[3] 10114 v.reset(OpS390XMOVBstoreidx) 10115 v.AuxInt = c + d 10116 v.Aux = sym 10117 v.AddArg(ptr) 10118 v.AddArg(idx) 10119 v.AddArg(val) 10120 v.AddArg(mem) 10121 return true 10122 } 10123 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 10124 // cond: 10125 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10126 for { 10127 c := v.AuxInt 10128 sym := v.Aux 10129 _ = v.Args[3] 10130 idx := v.Args[0] 10131 v_1 := v.Args[1] 10132 if v_1.Op != OpS390XADDconst { 10133 break 10134 } 10135 d := v_1.AuxInt 10136 ptr := v_1.Args[0] 10137 val := v.Args[2] 10138 mem := v.Args[3] 10139 v.reset(OpS390XMOVBstoreidx) 10140 v.AuxInt = c + d 10141 v.Aux = sym 10142 v.AddArg(ptr) 10143 v.AddArg(idx) 10144 v.AddArg(val) 10145 v.AddArg(mem) 10146 return true 10147 } 10148 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10149 // cond: 10150 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10151 for { 10152 c := v.AuxInt 10153 sym := v.Aux 10154 _ = v.Args[3] 10155 ptr := v.Args[0] 10156 v_1 := v.Args[1] 10157 if v_1.Op != OpS390XADDconst { 10158 break 10159 } 10160 d := v_1.AuxInt 10161 idx := v_1.Args[0] 10162 val := v.Args[2] 10163 mem := v.Args[3] 10164 v.reset(OpS390XMOVBstoreidx) 10165 v.AuxInt = c + d 10166 v.Aux = sym 10167 v.AddArg(ptr) 10168 v.AddArg(idx) 10169 v.AddArg(val) 10170 v.AddArg(mem) 10171 return true 10172 } 10173 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 10174 // cond: 10175 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10176 for { 10177 c := v.AuxInt 10178 sym := v.Aux 10179 _ = v.Args[3] 10180 v_0 := v.Args[0] 10181 if v_0.Op != OpS390XADDconst { 10182 break 10183 } 10184 d := v_0.AuxInt 10185 idx := v_0.Args[0] 10186 ptr := v.Args[1] 10187 val := v.Args[2] 10188 mem := v.Args[3] 10189 v.reset(OpS390XMOVBstoreidx) 10190 v.AuxInt = c + d 10191 v.Aux = sym 10192 v.AddArg(ptr) 10193 v.AddArg(idx) 10194 v.AddArg(val) 10195 v.AddArg(mem) 10196 return true 10197 } 10198 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10199 // cond: x.Uses == 1 && clobber(x) 10200 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10201 for { 10202 i := v.AuxInt 10203 s := v.Aux 10204 _ = v.Args[3] 10205 p := v.Args[0] 10206 idx := v.Args[1] 10207 w := v.Args[2] 10208 x := v.Args[3] 10209 if x.Op != OpS390XMOVBstoreidx { 10210 break 10211 } 10212 if x.AuxInt != i-1 { 10213 break 10214 } 10215 if x.Aux != s { 10216 break 10217 } 10218 _ = x.Args[3] 10219 if p != x.Args[0] { 10220 break 10221 } 10222 if idx != x.Args[1] { 10223 break 10224 } 10225 x_2 := x.Args[2] 10226 if x_2.Op != OpS390XSRDconst { 10227 break 10228 } 10229 if x_2.AuxInt != 8 { 10230 break 10231 } 10232 if w != x_2.Args[0] { 10233 break 10234 } 10235 mem := x.Args[3] 10236 if !(x.Uses == 1 && clobber(x)) { 10237 break 10238 } 10239 v.reset(OpS390XMOVHstoreidx) 10240 v.AuxInt = i - 1 10241 v.Aux = s 10242 v.AddArg(p) 10243 v.AddArg(idx) 10244 v.AddArg(w) 10245 v.AddArg(mem) 10246 return true 10247 } 10248 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10249 // cond: x.Uses == 1 && clobber(x) 10250 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10251 for { 10252 i := v.AuxInt 10253 s := v.Aux 10254 _ = v.Args[3] 10255 p := v.Args[0] 10256 idx := v.Args[1] 10257 w := v.Args[2] 10258 x := v.Args[3] 10259 if x.Op != OpS390XMOVBstoreidx { 10260 break 10261 } 10262 if x.AuxInt != i-1 { 10263 break 10264 } 10265 if x.Aux != s { 10266 break 10267 } 10268 _ = x.Args[3] 10269 if idx != x.Args[0] { 10270 break 10271 } 10272 if p != x.Args[1] { 10273 break 10274 } 10275 x_2 := x.Args[2] 10276 if x_2.Op != OpS390XSRDconst { 10277 break 10278 } 10279 if x_2.AuxInt != 8 { 10280 break 10281 } 10282 if w != x_2.Args[0] { 10283 break 10284 } 10285 mem := x.Args[3] 10286 if !(x.Uses == 1 && clobber(x)) { 10287 break 10288 } 10289 v.reset(OpS390XMOVHstoreidx) 10290 v.AuxInt = i - 1 10291 v.Aux = s 10292 v.AddArg(p) 10293 v.AddArg(idx) 10294 v.AddArg(w) 10295 v.AddArg(mem) 10296 return true 10297 } 10298 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10299 // cond: x.Uses == 1 && clobber(x) 10300 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10301 for { 10302 i := v.AuxInt 10303 s := v.Aux 10304 _ = v.Args[3] 10305 idx := v.Args[0] 10306 p := v.Args[1] 10307 w := v.Args[2] 10308 x := v.Args[3] 10309 if x.Op != OpS390XMOVBstoreidx { 10310 break 10311 } 10312 if x.AuxInt != i-1 { 10313 break 10314 } 10315 if x.Aux != s { 10316 break 10317 } 10318 _ = x.Args[3] 10319 if p != x.Args[0] { 10320 break 10321 } 10322 if idx != x.Args[1] { 10323 break 10324 } 10325 x_2 := x.Args[2] 10326 if x_2.Op != OpS390XSRDconst { 10327 break 10328 } 10329 if x_2.AuxInt != 8 { 10330 break 10331 } 10332 if w != x_2.Args[0] { 10333 break 10334 } 10335 mem := x.Args[3] 10336 if !(x.Uses == 1 && clobber(x)) { 10337 break 10338 } 10339 v.reset(OpS390XMOVHstoreidx) 10340 v.AuxInt = i - 1 10341 v.Aux = s 10342 v.AddArg(p) 10343 v.AddArg(idx) 10344 v.AddArg(w) 10345 v.AddArg(mem) 10346 return true 10347 } 10348 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10349 // cond: x.Uses == 1 && clobber(x) 10350 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10351 for { 10352 i := v.AuxInt 10353 s := v.Aux 10354 _ = v.Args[3] 10355 idx := v.Args[0] 10356 p := v.Args[1] 10357 w := v.Args[2] 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 idx != x.Args[0] { 10370 break 10371 } 10372 if p != 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 != 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(w) 10395 v.AddArg(mem) 10396 return true 10397 } 10398 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (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 p != x.Args[0] { 10425 break 10426 } 10427 if idx != 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 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10454 // cond: x.Uses == 1 && clobber(x) 10455 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10456 for { 10457 i := v.AuxInt 10458 s := v.Aux 10459 _ = v.Args[3] 10460 p := v.Args[0] 10461 idx := v.Args[1] 10462 w0 := v.Args[2] 10463 if w0.Op != OpS390XSRDconst { 10464 break 10465 } 10466 j := w0.AuxInt 10467 w := w0.Args[0] 10468 x := v.Args[3] 10469 if x.Op != OpS390XMOVBstoreidx { 10470 break 10471 } 10472 if x.AuxInt != i-1 { 10473 break 10474 } 10475 if x.Aux != s { 10476 break 10477 } 10478 _ = x.Args[3] 10479 if idx != x.Args[0] { 10480 break 10481 } 10482 if p != x.Args[1] { 10483 break 10484 } 10485 x_2 := x.Args[2] 10486 if x_2.Op != OpS390XSRDconst { 10487 break 10488 } 10489 if x_2.AuxInt != j+8 { 10490 break 10491 } 10492 if w != x_2.Args[0] { 10493 break 10494 } 10495 mem := x.Args[3] 10496 if !(x.Uses == 1 && clobber(x)) { 10497 break 10498 } 10499 v.reset(OpS390XMOVHstoreidx) 10500 v.AuxInt = i - 1 10501 v.Aux = s 10502 v.AddArg(p) 10503 v.AddArg(idx) 10504 v.AddArg(w0) 10505 v.AddArg(mem) 10506 return true 10507 } 10508 return false 10509 } 10510 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 10511 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (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 p != x.Args[0] { 10538 break 10539 } 10540 if idx != 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} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10567 // cond: x.Uses == 1 && clobber(x) 10568 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10569 for { 10570 i := v.AuxInt 10571 s := v.Aux 10572 _ = v.Args[3] 10573 idx := v.Args[0] 10574 p := v.Args[1] 10575 w0 := v.Args[2] 10576 if w0.Op != OpS390XSRDconst { 10577 break 10578 } 10579 j := w0.AuxInt 10580 w := w0.Args[0] 10581 x := v.Args[3] 10582 if x.Op != OpS390XMOVBstoreidx { 10583 break 10584 } 10585 if x.AuxInt != i-1 { 10586 break 10587 } 10588 if x.Aux != s { 10589 break 10590 } 10591 _ = x.Args[3] 10592 if idx != x.Args[0] { 10593 break 10594 } 10595 if p != x.Args[1] { 10596 break 10597 } 10598 x_2 := x.Args[2] 10599 if x_2.Op != OpS390XSRDconst { 10600 break 10601 } 10602 if x_2.AuxInt != j+8 { 10603 break 10604 } 10605 if w != x_2.Args[0] { 10606 break 10607 } 10608 mem := x.Args[3] 10609 if !(x.Uses == 1 && clobber(x)) { 10610 break 10611 } 10612 v.reset(OpS390XMOVHstoreidx) 10613 v.AuxInt = i - 1 10614 v.Aux = s 10615 v.AddArg(p) 10616 v.AddArg(idx) 10617 v.AddArg(w0) 10618 v.AddArg(mem) 10619 return true 10620 } 10621 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10622 // cond: x.Uses == 1 && clobber(x) 10623 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10624 for { 10625 i := v.AuxInt 10626 s := v.Aux 10627 _ = v.Args[3] 10628 p := v.Args[0] 10629 idx := v.Args[1] 10630 w := v.Args[2] 10631 x := v.Args[3] 10632 if x.Op != OpS390XMOVBstoreidx { 10633 break 10634 } 10635 if x.AuxInt != i-1 { 10636 break 10637 } 10638 if x.Aux != s { 10639 break 10640 } 10641 _ = x.Args[3] 10642 if p != x.Args[0] { 10643 break 10644 } 10645 if idx != x.Args[1] { 10646 break 10647 } 10648 x_2 := x.Args[2] 10649 if x_2.Op != OpS390XSRWconst { 10650 break 10651 } 10652 if x_2.AuxInt != 8 { 10653 break 10654 } 10655 if w != x_2.Args[0] { 10656 break 10657 } 10658 mem := x.Args[3] 10659 if !(x.Uses == 1 && clobber(x)) { 10660 break 10661 } 10662 v.reset(OpS390XMOVHstoreidx) 10663 v.AuxInt = i - 1 10664 v.Aux = s 10665 v.AddArg(p) 10666 v.AddArg(idx) 10667 v.AddArg(w) 10668 v.AddArg(mem) 10669 return true 10670 } 10671 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10672 // cond: x.Uses == 1 && clobber(x) 10673 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10674 for { 10675 i := v.AuxInt 10676 s := v.Aux 10677 _ = v.Args[3] 10678 p := v.Args[0] 10679 idx := v.Args[1] 10680 w := v.Args[2] 10681 x := v.Args[3] 10682 if x.Op != OpS390XMOVBstoreidx { 10683 break 10684 } 10685 if x.AuxInt != i-1 { 10686 break 10687 } 10688 if x.Aux != s { 10689 break 10690 } 10691 _ = x.Args[3] 10692 if idx != x.Args[0] { 10693 break 10694 } 10695 if p != x.Args[1] { 10696 break 10697 } 10698 x_2 := x.Args[2] 10699 if x_2.Op != OpS390XSRWconst { 10700 break 10701 } 10702 if x_2.AuxInt != 8 { 10703 break 10704 } 10705 if w != x_2.Args[0] { 10706 break 10707 } 10708 mem := x.Args[3] 10709 if !(x.Uses == 1 && clobber(x)) { 10710 break 10711 } 10712 v.reset(OpS390XMOVHstoreidx) 10713 v.AuxInt = i - 1 10714 v.Aux = s 10715 v.AddArg(p) 10716 v.AddArg(idx) 10717 v.AddArg(w) 10718 v.AddArg(mem) 10719 return true 10720 } 10721 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10722 // cond: x.Uses == 1 && clobber(x) 10723 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10724 for { 10725 i := v.AuxInt 10726 s := v.Aux 10727 _ = v.Args[3] 10728 idx := v.Args[0] 10729 p := v.Args[1] 10730 w := v.Args[2] 10731 x := v.Args[3] 10732 if x.Op != OpS390XMOVBstoreidx { 10733 break 10734 } 10735 if x.AuxInt != i-1 { 10736 break 10737 } 10738 if x.Aux != s { 10739 break 10740 } 10741 _ = x.Args[3] 10742 if p != x.Args[0] { 10743 break 10744 } 10745 if idx != x.Args[1] { 10746 break 10747 } 10748 x_2 := x.Args[2] 10749 if x_2.Op != OpS390XSRWconst { 10750 break 10751 } 10752 if x_2.AuxInt != 8 { 10753 break 10754 } 10755 if w != x_2.Args[0] { 10756 break 10757 } 10758 mem := x.Args[3] 10759 if !(x.Uses == 1 && clobber(x)) { 10760 break 10761 } 10762 v.reset(OpS390XMOVHstoreidx) 10763 v.AuxInt = i - 1 10764 v.Aux = s 10765 v.AddArg(p) 10766 v.AddArg(idx) 10767 v.AddArg(w) 10768 v.AddArg(mem) 10769 return true 10770 } 10771 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10772 // cond: x.Uses == 1 && clobber(x) 10773 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10774 for { 10775 i := v.AuxInt 10776 s := v.Aux 10777 _ = v.Args[3] 10778 idx := v.Args[0] 10779 p := v.Args[1] 10780 w := v.Args[2] 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 idx != x.Args[0] { 10793 break 10794 } 10795 if p != 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 != 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(w) 10818 v.AddArg(mem) 10819 return true 10820 } 10821 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (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 p != x.Args[0] { 10848 break 10849 } 10850 if idx != 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} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (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 p := v.Args[0] 10884 idx := 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 idx != x.Args[0] { 10903 break 10904 } 10905 if p != 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} p idx (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 p != x.Args[0] { 10958 break 10959 } 10960 if idx != 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 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10987 // cond: x.Uses == 1 && clobber(x) 10988 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10989 for { 10990 i := v.AuxInt 10991 s := v.Aux 10992 _ = v.Args[3] 10993 idx := v.Args[0] 10994 p := v.Args[1] 10995 w0 := v.Args[2] 10996 if w0.Op != OpS390XSRWconst { 10997 break 10998 } 10999 j := w0.AuxInt 11000 w := w0.Args[0] 11001 x := v.Args[3] 11002 if x.Op != OpS390XMOVBstoreidx { 11003 break 11004 } 11005 if x.AuxInt != i-1 { 11006 break 11007 } 11008 if x.Aux != s { 11009 break 11010 } 11011 _ = x.Args[3] 11012 if idx != x.Args[0] { 11013 break 11014 } 11015 if p != x.Args[1] { 11016 break 11017 } 11018 x_2 := x.Args[2] 11019 if x_2.Op != OpS390XSRWconst { 11020 break 11021 } 11022 if x_2.AuxInt != j+8 { 11023 break 11024 } 11025 if w != x_2.Args[0] { 11026 break 11027 } 11028 mem := x.Args[3] 11029 if !(x.Uses == 1 && clobber(x)) { 11030 break 11031 } 11032 v.reset(OpS390XMOVHstoreidx) 11033 v.AuxInt = i - 1 11034 v.Aux = s 11035 v.AddArg(p) 11036 v.AddArg(idx) 11037 v.AddArg(w0) 11038 v.AddArg(mem) 11039 return true 11040 } 11041 return false 11042 } 11043 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 11044 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11045 // cond: x.Uses == 1 && clobber(x) 11046 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11047 for { 11048 i := v.AuxInt 11049 s := v.Aux 11050 _ = v.Args[3] 11051 p := v.Args[0] 11052 idx := v.Args[1] 11053 v_2 := v.Args[2] 11054 if v_2.Op != OpS390XSRDconst { 11055 break 11056 } 11057 if v_2.AuxInt != 8 { 11058 break 11059 } 11060 w := v_2.Args[0] 11061 x := v.Args[3] 11062 if x.Op != OpS390XMOVBstoreidx { 11063 break 11064 } 11065 if x.AuxInt != i-1 { 11066 break 11067 } 11068 if x.Aux != s { 11069 break 11070 } 11071 _ = x.Args[3] 11072 if p != x.Args[0] { 11073 break 11074 } 11075 if idx != x.Args[1] { 11076 break 11077 } 11078 if w != x.Args[2] { 11079 break 11080 } 11081 mem := x.Args[3] 11082 if !(x.Uses == 1 && clobber(x)) { 11083 break 11084 } 11085 v.reset(OpS390XMOVHBRstoreidx) 11086 v.AuxInt = i - 1 11087 v.Aux = s 11088 v.AddArg(p) 11089 v.AddArg(idx) 11090 v.AddArg(w) 11091 v.AddArg(mem) 11092 return true 11093 } 11094 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11095 // cond: x.Uses == 1 && clobber(x) 11096 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11097 for { 11098 i := v.AuxInt 11099 s := v.Aux 11100 _ = v.Args[3] 11101 p := v.Args[0] 11102 idx := v.Args[1] 11103 v_2 := v.Args[2] 11104 if v_2.Op != OpS390XSRDconst { 11105 break 11106 } 11107 if v_2.AuxInt != 8 { 11108 break 11109 } 11110 w := v_2.Args[0] 11111 x := v.Args[3] 11112 if x.Op != OpS390XMOVBstoreidx { 11113 break 11114 } 11115 if x.AuxInt != i-1 { 11116 break 11117 } 11118 if x.Aux != s { 11119 break 11120 } 11121 _ = x.Args[3] 11122 if idx != x.Args[0] { 11123 break 11124 } 11125 if p != x.Args[1] { 11126 break 11127 } 11128 if w != x.Args[2] { 11129 break 11130 } 11131 mem := x.Args[3] 11132 if !(x.Uses == 1 && clobber(x)) { 11133 break 11134 } 11135 v.reset(OpS390XMOVHBRstoreidx) 11136 v.AuxInt = i - 1 11137 v.Aux = s 11138 v.AddArg(p) 11139 v.AddArg(idx) 11140 v.AddArg(w) 11141 v.AddArg(mem) 11142 return true 11143 } 11144 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11145 // cond: x.Uses == 1 && clobber(x) 11146 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11147 for { 11148 i := v.AuxInt 11149 s := v.Aux 11150 _ = v.Args[3] 11151 idx := v.Args[0] 11152 p := v.Args[1] 11153 v_2 := v.Args[2] 11154 if v_2.Op != OpS390XSRDconst { 11155 break 11156 } 11157 if v_2.AuxInt != 8 { 11158 break 11159 } 11160 w := v_2.Args[0] 11161 x := v.Args[3] 11162 if x.Op != OpS390XMOVBstoreidx { 11163 break 11164 } 11165 if x.AuxInt != i-1 { 11166 break 11167 } 11168 if x.Aux != s { 11169 break 11170 } 11171 _ = x.Args[3] 11172 if p != x.Args[0] { 11173 break 11174 } 11175 if idx != x.Args[1] { 11176 break 11177 } 11178 if w != x.Args[2] { 11179 break 11180 } 11181 mem := x.Args[3] 11182 if !(x.Uses == 1 && clobber(x)) { 11183 break 11184 } 11185 v.reset(OpS390XMOVHBRstoreidx) 11186 v.AuxInt = i - 1 11187 v.Aux = s 11188 v.AddArg(p) 11189 v.AddArg(idx) 11190 v.AddArg(w) 11191 v.AddArg(mem) 11192 return true 11193 } 11194 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11195 // cond: x.Uses == 1 && clobber(x) 11196 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11197 for { 11198 i := v.AuxInt 11199 s := v.Aux 11200 _ = v.Args[3] 11201 idx := v.Args[0] 11202 p := v.Args[1] 11203 v_2 := v.Args[2] 11204 if v_2.Op != OpS390XSRDconst { 11205 break 11206 } 11207 if v_2.AuxInt != 8 { 11208 break 11209 } 11210 w := v_2.Args[0] 11211 x := v.Args[3] 11212 if x.Op != OpS390XMOVBstoreidx { 11213 break 11214 } 11215 if x.AuxInt != i-1 { 11216 break 11217 } 11218 if x.Aux != s { 11219 break 11220 } 11221 _ = x.Args[3] 11222 if idx != x.Args[0] { 11223 break 11224 } 11225 if p != x.Args[1] { 11226 break 11227 } 11228 if w != x.Args[2] { 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(w) 11241 v.AddArg(mem) 11242 return true 11243 } 11244 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx 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 p != x.Args[0] { 11271 break 11272 } 11273 if idx != 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} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p 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 p := v.Args[0] 11307 idx := 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 idx != x.Args[0] { 11326 break 11327 } 11328 if p != 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} p idx 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 p != x.Args[0] { 11381 break 11382 } 11383 if idx != 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} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 11410 // cond: x.Uses == 1 && clobber(x) 11411 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11412 for { 11413 i := v.AuxInt 11414 s := v.Aux 11415 _ = v.Args[3] 11416 idx := v.Args[0] 11417 p := v.Args[1] 11418 v_2 := v.Args[2] 11419 if v_2.Op != OpS390XSRDconst { 11420 break 11421 } 11422 j := v_2.AuxInt 11423 w := v_2.Args[0] 11424 x := v.Args[3] 11425 if x.Op != OpS390XMOVBstoreidx { 11426 break 11427 } 11428 if x.AuxInt != i-1 { 11429 break 11430 } 11431 if x.Aux != s { 11432 break 11433 } 11434 _ = x.Args[3] 11435 if idx != x.Args[0] { 11436 break 11437 } 11438 if p != x.Args[1] { 11439 break 11440 } 11441 w0 := x.Args[2] 11442 if w0.Op != OpS390XSRDconst { 11443 break 11444 } 11445 if w0.AuxInt != j-8 { 11446 break 11447 } 11448 if w != w0.Args[0] { 11449 break 11450 } 11451 mem := x.Args[3] 11452 if !(x.Uses == 1 && clobber(x)) { 11453 break 11454 } 11455 v.reset(OpS390XMOVHBRstoreidx) 11456 v.AuxInt = i - 1 11457 v.Aux = s 11458 v.AddArg(p) 11459 v.AddArg(idx) 11460 v.AddArg(w0) 11461 v.AddArg(mem) 11462 return true 11463 } 11464 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11465 // cond: x.Uses == 1 && clobber(x) 11466 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11467 for { 11468 i := v.AuxInt 11469 s := v.Aux 11470 _ = v.Args[3] 11471 p := v.Args[0] 11472 idx := v.Args[1] 11473 v_2 := v.Args[2] 11474 if v_2.Op != OpS390XSRWconst { 11475 break 11476 } 11477 if v_2.AuxInt != 8 { 11478 break 11479 } 11480 w := v_2.Args[0] 11481 x := v.Args[3] 11482 if x.Op != OpS390XMOVBstoreidx { 11483 break 11484 } 11485 if x.AuxInt != i-1 { 11486 break 11487 } 11488 if x.Aux != s { 11489 break 11490 } 11491 _ = x.Args[3] 11492 if p != x.Args[0] { 11493 break 11494 } 11495 if idx != x.Args[1] { 11496 break 11497 } 11498 if w != x.Args[2] { 11499 break 11500 } 11501 mem := x.Args[3] 11502 if !(x.Uses == 1 && clobber(x)) { 11503 break 11504 } 11505 v.reset(OpS390XMOVHBRstoreidx) 11506 v.AuxInt = i - 1 11507 v.Aux = s 11508 v.AddArg(p) 11509 v.AddArg(idx) 11510 v.AddArg(w) 11511 v.AddArg(mem) 11512 return true 11513 } 11514 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11515 // cond: x.Uses == 1 && clobber(x) 11516 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11517 for { 11518 i := v.AuxInt 11519 s := v.Aux 11520 _ = v.Args[3] 11521 p := v.Args[0] 11522 idx := v.Args[1] 11523 v_2 := v.Args[2] 11524 if v_2.Op != OpS390XSRWconst { 11525 break 11526 } 11527 if v_2.AuxInt != 8 { 11528 break 11529 } 11530 w := v_2.Args[0] 11531 x := v.Args[3] 11532 if x.Op != OpS390XMOVBstoreidx { 11533 break 11534 } 11535 if x.AuxInt != i-1 { 11536 break 11537 } 11538 if x.Aux != s { 11539 break 11540 } 11541 _ = x.Args[3] 11542 if idx != x.Args[0] { 11543 break 11544 } 11545 if p != x.Args[1] { 11546 break 11547 } 11548 if w != x.Args[2] { 11549 break 11550 } 11551 mem := x.Args[3] 11552 if !(x.Uses == 1 && clobber(x)) { 11553 break 11554 } 11555 v.reset(OpS390XMOVHBRstoreidx) 11556 v.AuxInt = i - 1 11557 v.Aux = s 11558 v.AddArg(p) 11559 v.AddArg(idx) 11560 v.AddArg(w) 11561 v.AddArg(mem) 11562 return true 11563 } 11564 return false 11565 } 11566 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 11567 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11568 // cond: x.Uses == 1 && clobber(x) 11569 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11570 for { 11571 i := v.AuxInt 11572 s := v.Aux 11573 _ = v.Args[3] 11574 idx := v.Args[0] 11575 p := v.Args[1] 11576 v_2 := v.Args[2] 11577 if v_2.Op != OpS390XSRWconst { 11578 break 11579 } 11580 if v_2.AuxInt != 8 { 11581 break 11582 } 11583 w := v_2.Args[0] 11584 x := v.Args[3] 11585 if x.Op != OpS390XMOVBstoreidx { 11586 break 11587 } 11588 if x.AuxInt != i-1 { 11589 break 11590 } 11591 if x.Aux != s { 11592 break 11593 } 11594 _ = x.Args[3] 11595 if p != x.Args[0] { 11596 break 11597 } 11598 if idx != x.Args[1] { 11599 break 11600 } 11601 if w != x.Args[2] { 11602 break 11603 } 11604 mem := x.Args[3] 11605 if !(x.Uses == 1 && clobber(x)) { 11606 break 11607 } 11608 v.reset(OpS390XMOVHBRstoreidx) 11609 v.AuxInt = i - 1 11610 v.Aux = s 11611 v.AddArg(p) 11612 v.AddArg(idx) 11613 v.AddArg(w) 11614 v.AddArg(mem) 11615 return true 11616 } 11617 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11618 // cond: x.Uses == 1 && clobber(x) 11619 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11620 for { 11621 i := v.AuxInt 11622 s := v.Aux 11623 _ = v.Args[3] 11624 idx := v.Args[0] 11625 p := v.Args[1] 11626 v_2 := v.Args[2] 11627 if v_2.Op != OpS390XSRWconst { 11628 break 11629 } 11630 if v_2.AuxInt != 8 { 11631 break 11632 } 11633 w := v_2.Args[0] 11634 x := v.Args[3] 11635 if x.Op != OpS390XMOVBstoreidx { 11636 break 11637 } 11638 if x.AuxInt != i-1 { 11639 break 11640 } 11641 if x.Aux != s { 11642 break 11643 } 11644 _ = x.Args[3] 11645 if idx != x.Args[0] { 11646 break 11647 } 11648 if p != x.Args[1] { 11649 break 11650 } 11651 if w != x.Args[2] { 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(w) 11664 v.AddArg(mem) 11665 return true 11666 } 11667 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx 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 p != x.Args[0] { 11694 break 11695 } 11696 if idx != 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} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p 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 p := v.Args[0] 11730 idx := 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 idx != x.Args[0] { 11749 break 11750 } 11751 if p != 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} p idx 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 p != x.Args[0] { 11804 break 11805 } 11806 if idx != 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 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11833 // cond: x.Uses == 1 && clobber(x) 11834 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11835 for { 11836 i := v.AuxInt 11837 s := v.Aux 11838 _ = v.Args[3] 11839 idx := v.Args[0] 11840 p := v.Args[1] 11841 v_2 := v.Args[2] 11842 if v_2.Op != OpS390XSRWconst { 11843 break 11844 } 11845 j := v_2.AuxInt 11846 w := v_2.Args[0] 11847 x := v.Args[3] 11848 if x.Op != OpS390XMOVBstoreidx { 11849 break 11850 } 11851 if x.AuxInt != i-1 { 11852 break 11853 } 11854 if x.Aux != s { 11855 break 11856 } 11857 _ = x.Args[3] 11858 if idx != x.Args[0] { 11859 break 11860 } 11861 if p != x.Args[1] { 11862 break 11863 } 11864 w0 := x.Args[2] 11865 if w0.Op != OpS390XSRWconst { 11866 break 11867 } 11868 if w0.AuxInt != j-8 { 11869 break 11870 } 11871 if w != w0.Args[0] { 11872 break 11873 } 11874 mem := x.Args[3] 11875 if !(x.Uses == 1 && clobber(x)) { 11876 break 11877 } 11878 v.reset(OpS390XMOVHBRstoreidx) 11879 v.AuxInt = i - 1 11880 v.Aux = s 11881 v.AddArg(p) 11882 v.AddArg(idx) 11883 v.AddArg(w0) 11884 v.AddArg(mem) 11885 return true 11886 } 11887 return false 11888 } 11889 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 11890 // match: (MOVDEQ x y (InvertFlags cmp)) 11891 // cond: 11892 // result: (MOVDEQ x y cmp) 11893 for { 11894 _ = v.Args[2] 11895 x := v.Args[0] 11896 y := v.Args[1] 11897 v_2 := v.Args[2] 11898 if v_2.Op != OpS390XInvertFlags { 11899 break 11900 } 11901 cmp := v_2.Args[0] 11902 v.reset(OpS390XMOVDEQ) 11903 v.AddArg(x) 11904 v.AddArg(y) 11905 v.AddArg(cmp) 11906 return true 11907 } 11908 // match: (MOVDEQ _ x (FlagEQ)) 11909 // cond: 11910 // result: x 11911 for { 11912 _ = v.Args[2] 11913 x := v.Args[1] 11914 v_2 := v.Args[2] 11915 if v_2.Op != OpS390XFlagEQ { 11916 break 11917 } 11918 v.reset(OpCopy) 11919 v.Type = x.Type 11920 v.AddArg(x) 11921 return true 11922 } 11923 // match: (MOVDEQ y _ (FlagLT)) 11924 // cond: 11925 // result: y 11926 for { 11927 _ = v.Args[2] 11928 y := v.Args[0] 11929 v_2 := v.Args[2] 11930 if v_2.Op != OpS390XFlagLT { 11931 break 11932 } 11933 v.reset(OpCopy) 11934 v.Type = y.Type 11935 v.AddArg(y) 11936 return true 11937 } 11938 // match: (MOVDEQ y _ (FlagGT)) 11939 // cond: 11940 // result: y 11941 for { 11942 _ = v.Args[2] 11943 y := v.Args[0] 11944 v_2 := v.Args[2] 11945 if v_2.Op != OpS390XFlagGT { 11946 break 11947 } 11948 v.reset(OpCopy) 11949 v.Type = y.Type 11950 v.AddArg(y) 11951 return true 11952 } 11953 return false 11954 } 11955 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 11956 // match: (MOVDGE x y (InvertFlags cmp)) 11957 // cond: 11958 // result: (MOVDLE x y cmp) 11959 for { 11960 _ = v.Args[2] 11961 x := v.Args[0] 11962 y := v.Args[1] 11963 v_2 := v.Args[2] 11964 if v_2.Op != OpS390XInvertFlags { 11965 break 11966 } 11967 cmp := v_2.Args[0] 11968 v.reset(OpS390XMOVDLE) 11969 v.AddArg(x) 11970 v.AddArg(y) 11971 v.AddArg(cmp) 11972 return true 11973 } 11974 // match: (MOVDGE _ x (FlagEQ)) 11975 // cond: 11976 // result: x 11977 for { 11978 _ = v.Args[2] 11979 x := v.Args[1] 11980 v_2 := v.Args[2] 11981 if v_2.Op != OpS390XFlagEQ { 11982 break 11983 } 11984 v.reset(OpCopy) 11985 v.Type = x.Type 11986 v.AddArg(x) 11987 return true 11988 } 11989 // match: (MOVDGE y _ (FlagLT)) 11990 // cond: 11991 // result: y 11992 for { 11993 _ = v.Args[2] 11994 y := v.Args[0] 11995 v_2 := v.Args[2] 11996 if v_2.Op != OpS390XFlagLT { 11997 break 11998 } 11999 v.reset(OpCopy) 12000 v.Type = y.Type 12001 v.AddArg(y) 12002 return true 12003 } 12004 // match: (MOVDGE _ x (FlagGT)) 12005 // cond: 12006 // result: x 12007 for { 12008 _ = v.Args[2] 12009 x := v.Args[1] 12010 v_2 := v.Args[2] 12011 if v_2.Op != OpS390XFlagGT { 12012 break 12013 } 12014 v.reset(OpCopy) 12015 v.Type = x.Type 12016 v.AddArg(x) 12017 return true 12018 } 12019 return false 12020 } 12021 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 12022 // match: (MOVDGT x y (InvertFlags cmp)) 12023 // cond: 12024 // result: (MOVDLT x y cmp) 12025 for { 12026 _ = v.Args[2] 12027 x := v.Args[0] 12028 y := v.Args[1] 12029 v_2 := v.Args[2] 12030 if v_2.Op != OpS390XInvertFlags { 12031 break 12032 } 12033 cmp := v_2.Args[0] 12034 v.reset(OpS390XMOVDLT) 12035 v.AddArg(x) 12036 v.AddArg(y) 12037 v.AddArg(cmp) 12038 return true 12039 } 12040 // match: (MOVDGT y _ (FlagEQ)) 12041 // cond: 12042 // result: y 12043 for { 12044 _ = v.Args[2] 12045 y := v.Args[0] 12046 v_2 := v.Args[2] 12047 if v_2.Op != OpS390XFlagEQ { 12048 break 12049 } 12050 v.reset(OpCopy) 12051 v.Type = y.Type 12052 v.AddArg(y) 12053 return true 12054 } 12055 // match: (MOVDGT y _ (FlagLT)) 12056 // cond: 12057 // result: y 12058 for { 12059 _ = v.Args[2] 12060 y := v.Args[0] 12061 v_2 := v.Args[2] 12062 if v_2.Op != OpS390XFlagLT { 12063 break 12064 } 12065 v.reset(OpCopy) 12066 v.Type = y.Type 12067 v.AddArg(y) 12068 return true 12069 } 12070 // match: (MOVDGT _ x (FlagGT)) 12071 // cond: 12072 // result: x 12073 for { 12074 _ = v.Args[2] 12075 x := v.Args[1] 12076 v_2 := v.Args[2] 12077 if v_2.Op != OpS390XFlagGT { 12078 break 12079 } 12080 v.reset(OpCopy) 12081 v.Type = x.Type 12082 v.AddArg(x) 12083 return true 12084 } 12085 return false 12086 } 12087 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 12088 // match: (MOVDLE x y (InvertFlags cmp)) 12089 // cond: 12090 // result: (MOVDGE x y cmp) 12091 for { 12092 _ = v.Args[2] 12093 x := v.Args[0] 12094 y := v.Args[1] 12095 v_2 := v.Args[2] 12096 if v_2.Op != OpS390XInvertFlags { 12097 break 12098 } 12099 cmp := v_2.Args[0] 12100 v.reset(OpS390XMOVDGE) 12101 v.AddArg(x) 12102 v.AddArg(y) 12103 v.AddArg(cmp) 12104 return true 12105 } 12106 // match: (MOVDLE _ x (FlagEQ)) 12107 // cond: 12108 // result: x 12109 for { 12110 _ = v.Args[2] 12111 x := v.Args[1] 12112 v_2 := v.Args[2] 12113 if v_2.Op != OpS390XFlagEQ { 12114 break 12115 } 12116 v.reset(OpCopy) 12117 v.Type = x.Type 12118 v.AddArg(x) 12119 return true 12120 } 12121 // match: (MOVDLE _ x (FlagLT)) 12122 // cond: 12123 // result: x 12124 for { 12125 _ = v.Args[2] 12126 x := v.Args[1] 12127 v_2 := v.Args[2] 12128 if v_2.Op != OpS390XFlagLT { 12129 break 12130 } 12131 v.reset(OpCopy) 12132 v.Type = x.Type 12133 v.AddArg(x) 12134 return true 12135 } 12136 // match: (MOVDLE y _ (FlagGT)) 12137 // cond: 12138 // result: y 12139 for { 12140 _ = v.Args[2] 12141 y := v.Args[0] 12142 v_2 := v.Args[2] 12143 if v_2.Op != OpS390XFlagGT { 12144 break 12145 } 12146 v.reset(OpCopy) 12147 v.Type = y.Type 12148 v.AddArg(y) 12149 return true 12150 } 12151 return false 12152 } 12153 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 12154 // match: (MOVDLT x y (InvertFlags cmp)) 12155 // cond: 12156 // result: (MOVDGT x y cmp) 12157 for { 12158 _ = v.Args[2] 12159 x := v.Args[0] 12160 y := v.Args[1] 12161 v_2 := v.Args[2] 12162 if v_2.Op != OpS390XInvertFlags { 12163 break 12164 } 12165 cmp := v_2.Args[0] 12166 v.reset(OpS390XMOVDGT) 12167 v.AddArg(x) 12168 v.AddArg(y) 12169 v.AddArg(cmp) 12170 return true 12171 } 12172 // match: (MOVDLT y _ (FlagEQ)) 12173 // cond: 12174 // result: y 12175 for { 12176 _ = v.Args[2] 12177 y := v.Args[0] 12178 v_2 := v.Args[2] 12179 if v_2.Op != OpS390XFlagEQ { 12180 break 12181 } 12182 v.reset(OpCopy) 12183 v.Type = y.Type 12184 v.AddArg(y) 12185 return true 12186 } 12187 // match: (MOVDLT _ x (FlagLT)) 12188 // cond: 12189 // result: x 12190 for { 12191 _ = v.Args[2] 12192 x := v.Args[1] 12193 v_2 := v.Args[2] 12194 if v_2.Op != OpS390XFlagLT { 12195 break 12196 } 12197 v.reset(OpCopy) 12198 v.Type = x.Type 12199 v.AddArg(x) 12200 return true 12201 } 12202 // match: (MOVDLT y _ (FlagGT)) 12203 // cond: 12204 // result: y 12205 for { 12206 _ = v.Args[2] 12207 y := v.Args[0] 12208 v_2 := v.Args[2] 12209 if v_2.Op != OpS390XFlagGT { 12210 break 12211 } 12212 v.reset(OpCopy) 12213 v.Type = y.Type 12214 v.AddArg(y) 12215 return true 12216 } 12217 return false 12218 } 12219 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 12220 // match: (MOVDNE x y (InvertFlags cmp)) 12221 // cond: 12222 // result: (MOVDNE x y cmp) 12223 for { 12224 _ = v.Args[2] 12225 x := v.Args[0] 12226 y := v.Args[1] 12227 v_2 := v.Args[2] 12228 if v_2.Op != OpS390XInvertFlags { 12229 break 12230 } 12231 cmp := v_2.Args[0] 12232 v.reset(OpS390XMOVDNE) 12233 v.AddArg(x) 12234 v.AddArg(y) 12235 v.AddArg(cmp) 12236 return true 12237 } 12238 // match: (MOVDNE y _ (FlagEQ)) 12239 // cond: 12240 // result: y 12241 for { 12242 _ = v.Args[2] 12243 y := v.Args[0] 12244 v_2 := v.Args[2] 12245 if v_2.Op != OpS390XFlagEQ { 12246 break 12247 } 12248 v.reset(OpCopy) 12249 v.Type = y.Type 12250 v.AddArg(y) 12251 return true 12252 } 12253 // match: (MOVDNE _ x (FlagLT)) 12254 // cond: 12255 // result: x 12256 for { 12257 _ = v.Args[2] 12258 x := v.Args[1] 12259 v_2 := v.Args[2] 12260 if v_2.Op != OpS390XFlagLT { 12261 break 12262 } 12263 v.reset(OpCopy) 12264 v.Type = x.Type 12265 v.AddArg(x) 12266 return true 12267 } 12268 // match: (MOVDNE _ x (FlagGT)) 12269 // cond: 12270 // result: x 12271 for { 12272 _ = v.Args[2] 12273 x := v.Args[1] 12274 v_2 := v.Args[2] 12275 if v_2.Op != OpS390XFlagGT { 12276 break 12277 } 12278 v.reset(OpCopy) 12279 v.Type = x.Type 12280 v.AddArg(x) 12281 return true 12282 } 12283 return false 12284 } 12285 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 12286 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 12287 // cond: is20Bit(c+d) && x.Op != OpSB 12288 // result: (MOVDaddridx [c+d] {s} x y) 12289 for { 12290 c := v.AuxInt 12291 s := v.Aux 12292 _ = v.Args[1] 12293 v_0 := v.Args[0] 12294 if v_0.Op != OpS390XADDconst { 12295 break 12296 } 12297 d := v_0.AuxInt 12298 x := v_0.Args[0] 12299 y := v.Args[1] 12300 if !(is20Bit(c+d) && x.Op != OpSB) { 12301 break 12302 } 12303 v.reset(OpS390XMOVDaddridx) 12304 v.AuxInt = c + d 12305 v.Aux = s 12306 v.AddArg(x) 12307 v.AddArg(y) 12308 return true 12309 } 12310 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 12311 // cond: is20Bit(c+d) && y.Op != OpSB 12312 // result: (MOVDaddridx [c+d] {s} x y) 12313 for { 12314 c := v.AuxInt 12315 s := v.Aux 12316 _ = v.Args[1] 12317 x := v.Args[0] 12318 v_1 := v.Args[1] 12319 if v_1.Op != OpS390XADDconst { 12320 break 12321 } 12322 d := v_1.AuxInt 12323 y := v_1.Args[0] 12324 if !(is20Bit(c+d) && y.Op != OpSB) { 12325 break 12326 } 12327 v.reset(OpS390XMOVDaddridx) 12328 v.AuxInt = c + d 12329 v.Aux = s 12330 v.AddArg(x) 12331 v.AddArg(y) 12332 return true 12333 } 12334 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 12335 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 12336 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12337 for { 12338 off1 := v.AuxInt 12339 sym1 := v.Aux 12340 _ = v.Args[1] 12341 v_0 := v.Args[0] 12342 if v_0.Op != OpS390XMOVDaddr { 12343 break 12344 } 12345 off2 := v_0.AuxInt 12346 sym2 := v_0.Aux 12347 x := v_0.Args[0] 12348 y := v.Args[1] 12349 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 12350 break 12351 } 12352 v.reset(OpS390XMOVDaddridx) 12353 v.AuxInt = off1 + off2 12354 v.Aux = mergeSym(sym1, sym2) 12355 v.AddArg(x) 12356 v.AddArg(y) 12357 return true 12358 } 12359 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 12360 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 12361 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12362 for { 12363 off1 := v.AuxInt 12364 sym1 := v.Aux 12365 _ = v.Args[1] 12366 x := v.Args[0] 12367 v_1 := v.Args[1] 12368 if v_1.Op != OpS390XMOVDaddr { 12369 break 12370 } 12371 off2 := v_1.AuxInt 12372 sym2 := v_1.Aux 12373 y := v_1.Args[0] 12374 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 12375 break 12376 } 12377 v.reset(OpS390XMOVDaddridx) 12378 v.AuxInt = off1 + off2 12379 v.Aux = mergeSym(sym1, sym2) 12380 v.AddArg(x) 12381 v.AddArg(y) 12382 return true 12383 } 12384 return false 12385 } 12386 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 12387 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 12388 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 12389 // result: (MOVDreg x) 12390 for { 12391 off := v.AuxInt 12392 sym := v.Aux 12393 _ = v.Args[1] 12394 ptr := v.Args[0] 12395 v_1 := v.Args[1] 12396 if v_1.Op != OpS390XMOVDstore { 12397 break 12398 } 12399 off2 := v_1.AuxInt 12400 sym2 := v_1.Aux 12401 _ = v_1.Args[2] 12402 ptr2 := v_1.Args[0] 12403 x := v_1.Args[1] 12404 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 12405 break 12406 } 12407 v.reset(OpS390XMOVDreg) 12408 v.AddArg(x) 12409 return true 12410 } 12411 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 12412 // cond: is20Bit(off1+off2) 12413 // result: (MOVDload [off1+off2] {sym} ptr mem) 12414 for { 12415 off1 := v.AuxInt 12416 sym := v.Aux 12417 _ = v.Args[1] 12418 v_0 := v.Args[0] 12419 if v_0.Op != OpS390XADDconst { 12420 break 12421 } 12422 off2 := v_0.AuxInt 12423 ptr := v_0.Args[0] 12424 mem := v.Args[1] 12425 if !(is20Bit(off1 + off2)) { 12426 break 12427 } 12428 v.reset(OpS390XMOVDload) 12429 v.AuxInt = off1 + off2 12430 v.Aux = sym 12431 v.AddArg(ptr) 12432 v.AddArg(mem) 12433 return true 12434 } 12435 // match: (MOVDload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 12436 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 12437 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 12438 for { 12439 off1 := v.AuxInt 12440 sym1 := v.Aux 12441 _ = v.Args[1] 12442 v_0 := v.Args[0] 12443 if v_0.Op != OpS390XMOVDaddr { 12444 break 12445 } 12446 t := v_0.Type 12447 off2 := v_0.AuxInt 12448 sym2 := v_0.Aux 12449 base := v_0.Args[0] 12450 mem := v.Args[1] 12451 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 12452 break 12453 } 12454 v.reset(OpS390XMOVDload) 12455 v.AuxInt = off1 + off2 12456 v.Aux = mergeSym(sym1, sym2) 12457 v.AddArg(base) 12458 v.AddArg(mem) 12459 return true 12460 } 12461 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 12462 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12463 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 12464 for { 12465 off1 := v.AuxInt 12466 sym1 := v.Aux 12467 _ = v.Args[1] 12468 v_0 := v.Args[0] 12469 if v_0.Op != OpS390XMOVDaddridx { 12470 break 12471 } 12472 off2 := v_0.AuxInt 12473 sym2 := v_0.Aux 12474 _ = v_0.Args[1] 12475 ptr := v_0.Args[0] 12476 idx := v_0.Args[1] 12477 mem := v.Args[1] 12478 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12479 break 12480 } 12481 v.reset(OpS390XMOVDloadidx) 12482 v.AuxInt = off1 + off2 12483 v.Aux = mergeSym(sym1, sym2) 12484 v.AddArg(ptr) 12485 v.AddArg(idx) 12486 v.AddArg(mem) 12487 return true 12488 } 12489 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 12490 // cond: ptr.Op != OpSB 12491 // result: (MOVDloadidx [off] {sym} ptr idx mem) 12492 for { 12493 off := v.AuxInt 12494 sym := v.Aux 12495 _ = v.Args[1] 12496 v_0 := v.Args[0] 12497 if v_0.Op != OpS390XADD { 12498 break 12499 } 12500 _ = v_0.Args[1] 12501 ptr := v_0.Args[0] 12502 idx := v_0.Args[1] 12503 mem := v.Args[1] 12504 if !(ptr.Op != OpSB) { 12505 break 12506 } 12507 v.reset(OpS390XMOVDloadidx) 12508 v.AuxInt = off 12509 v.Aux = sym 12510 v.AddArg(ptr) 12511 v.AddArg(idx) 12512 v.AddArg(mem) 12513 return true 12514 } 12515 return false 12516 } 12517 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 12518 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 12519 // cond: 12520 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12521 for { 12522 c := v.AuxInt 12523 sym := v.Aux 12524 _ = v.Args[2] 12525 v_0 := v.Args[0] 12526 if v_0.Op != OpS390XADDconst { 12527 break 12528 } 12529 d := v_0.AuxInt 12530 ptr := v_0.Args[0] 12531 idx := v.Args[1] 12532 mem := v.Args[2] 12533 v.reset(OpS390XMOVDloadidx) 12534 v.AuxInt = c + d 12535 v.Aux = sym 12536 v.AddArg(ptr) 12537 v.AddArg(idx) 12538 v.AddArg(mem) 12539 return true 12540 } 12541 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 12542 // cond: 12543 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12544 for { 12545 c := v.AuxInt 12546 sym := v.Aux 12547 _ = v.Args[2] 12548 idx := v.Args[0] 12549 v_1 := v.Args[1] 12550 if v_1.Op != OpS390XADDconst { 12551 break 12552 } 12553 d := v_1.AuxInt 12554 ptr := v_1.Args[0] 12555 mem := v.Args[2] 12556 v.reset(OpS390XMOVDloadidx) 12557 v.AuxInt = c + d 12558 v.Aux = sym 12559 v.AddArg(ptr) 12560 v.AddArg(idx) 12561 v.AddArg(mem) 12562 return true 12563 } 12564 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 12565 // cond: 12566 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12567 for { 12568 c := v.AuxInt 12569 sym := v.Aux 12570 _ = v.Args[2] 12571 ptr := v.Args[0] 12572 v_1 := v.Args[1] 12573 if v_1.Op != OpS390XADDconst { 12574 break 12575 } 12576 d := v_1.AuxInt 12577 idx := v_1.Args[0] 12578 mem := v.Args[2] 12579 v.reset(OpS390XMOVDloadidx) 12580 v.AuxInt = c + d 12581 v.Aux = sym 12582 v.AddArg(ptr) 12583 v.AddArg(idx) 12584 v.AddArg(mem) 12585 return true 12586 } 12587 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 12588 // cond: 12589 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12590 for { 12591 c := v.AuxInt 12592 sym := v.Aux 12593 _ = v.Args[2] 12594 v_0 := v.Args[0] 12595 if v_0.Op != OpS390XADDconst { 12596 break 12597 } 12598 d := v_0.AuxInt 12599 idx := v_0.Args[0] 12600 ptr := v.Args[1] 12601 mem := v.Args[2] 12602 v.reset(OpS390XMOVDloadidx) 12603 v.AuxInt = c + d 12604 v.Aux = sym 12605 v.AddArg(ptr) 12606 v.AddArg(idx) 12607 v.AddArg(mem) 12608 return true 12609 } 12610 return false 12611 } 12612 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 12613 b := v.Block 12614 _ = b 12615 // match: (MOVDnop <t> x) 12616 // cond: t.Compare(x.Type) == types.CMPeq 12617 // result: x 12618 for { 12619 t := v.Type 12620 x := v.Args[0] 12621 if !(t.Compare(x.Type) == types.CMPeq) { 12622 break 12623 } 12624 v.reset(OpCopy) 12625 v.Type = x.Type 12626 v.AddArg(x) 12627 return true 12628 } 12629 // match: (MOVDnop (MOVDconst [c])) 12630 // cond: 12631 // result: (MOVDconst [c]) 12632 for { 12633 v_0 := v.Args[0] 12634 if v_0.Op != OpS390XMOVDconst { 12635 break 12636 } 12637 c := v_0.AuxInt 12638 v.reset(OpS390XMOVDconst) 12639 v.AuxInt = c 12640 return true 12641 } 12642 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 12643 // cond: x.Uses == 1 && clobber(x) 12644 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12645 for { 12646 t := v.Type 12647 x := v.Args[0] 12648 if x.Op != OpS390XMOVBZload { 12649 break 12650 } 12651 off := x.AuxInt 12652 sym := x.Aux 12653 _ = x.Args[1] 12654 ptr := x.Args[0] 12655 mem := x.Args[1] 12656 if !(x.Uses == 1 && clobber(x)) { 12657 break 12658 } 12659 b = x.Block 12660 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12661 v.reset(OpCopy) 12662 v.AddArg(v0) 12663 v0.AuxInt = off 12664 v0.Aux = sym 12665 v0.AddArg(ptr) 12666 v0.AddArg(mem) 12667 return true 12668 } 12669 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 12670 // cond: x.Uses == 1 && clobber(x) 12671 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12672 for { 12673 t := v.Type 12674 x := v.Args[0] 12675 if x.Op != OpS390XMOVBload { 12676 break 12677 } 12678 off := x.AuxInt 12679 sym := x.Aux 12680 _ = x.Args[1] 12681 ptr := x.Args[0] 12682 mem := x.Args[1] 12683 if !(x.Uses == 1 && clobber(x)) { 12684 break 12685 } 12686 b = x.Block 12687 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12688 v.reset(OpCopy) 12689 v.AddArg(v0) 12690 v0.AuxInt = off 12691 v0.Aux = sym 12692 v0.AddArg(ptr) 12693 v0.AddArg(mem) 12694 return true 12695 } 12696 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 12697 // cond: x.Uses == 1 && clobber(x) 12698 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12699 for { 12700 t := v.Type 12701 x := v.Args[0] 12702 if x.Op != OpS390XMOVHZload { 12703 break 12704 } 12705 off := x.AuxInt 12706 sym := x.Aux 12707 _ = x.Args[1] 12708 ptr := x.Args[0] 12709 mem := x.Args[1] 12710 if !(x.Uses == 1 && clobber(x)) { 12711 break 12712 } 12713 b = x.Block 12714 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12715 v.reset(OpCopy) 12716 v.AddArg(v0) 12717 v0.AuxInt = off 12718 v0.Aux = sym 12719 v0.AddArg(ptr) 12720 v0.AddArg(mem) 12721 return true 12722 } 12723 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 12724 // cond: x.Uses == 1 && clobber(x) 12725 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12726 for { 12727 t := v.Type 12728 x := v.Args[0] 12729 if x.Op != OpS390XMOVHload { 12730 break 12731 } 12732 off := x.AuxInt 12733 sym := x.Aux 12734 _ = x.Args[1] 12735 ptr := x.Args[0] 12736 mem := x.Args[1] 12737 if !(x.Uses == 1 && clobber(x)) { 12738 break 12739 } 12740 b = x.Block 12741 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12742 v.reset(OpCopy) 12743 v.AddArg(v0) 12744 v0.AuxInt = off 12745 v0.Aux = sym 12746 v0.AddArg(ptr) 12747 v0.AddArg(mem) 12748 return true 12749 } 12750 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 12751 // cond: x.Uses == 1 && clobber(x) 12752 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12753 for { 12754 t := v.Type 12755 x := v.Args[0] 12756 if x.Op != OpS390XMOVWZload { 12757 break 12758 } 12759 off := x.AuxInt 12760 sym := x.Aux 12761 _ = x.Args[1] 12762 ptr := x.Args[0] 12763 mem := x.Args[1] 12764 if !(x.Uses == 1 && clobber(x)) { 12765 break 12766 } 12767 b = x.Block 12768 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12769 v.reset(OpCopy) 12770 v.AddArg(v0) 12771 v0.AuxInt = off 12772 v0.Aux = sym 12773 v0.AddArg(ptr) 12774 v0.AddArg(mem) 12775 return true 12776 } 12777 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 12778 // cond: x.Uses == 1 && clobber(x) 12779 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12780 for { 12781 t := v.Type 12782 x := v.Args[0] 12783 if x.Op != OpS390XMOVWload { 12784 break 12785 } 12786 off := x.AuxInt 12787 sym := x.Aux 12788 _ = x.Args[1] 12789 ptr := x.Args[0] 12790 mem := x.Args[1] 12791 if !(x.Uses == 1 && clobber(x)) { 12792 break 12793 } 12794 b = x.Block 12795 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12796 v.reset(OpCopy) 12797 v.AddArg(v0) 12798 v0.AuxInt = off 12799 v0.Aux = sym 12800 v0.AddArg(ptr) 12801 v0.AddArg(mem) 12802 return true 12803 } 12804 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 12805 // cond: x.Uses == 1 && clobber(x) 12806 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12807 for { 12808 t := v.Type 12809 x := v.Args[0] 12810 if x.Op != OpS390XMOVDload { 12811 break 12812 } 12813 off := x.AuxInt 12814 sym := x.Aux 12815 _ = x.Args[1] 12816 ptr := x.Args[0] 12817 mem := x.Args[1] 12818 if !(x.Uses == 1 && clobber(x)) { 12819 break 12820 } 12821 b = x.Block 12822 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12823 v.reset(OpCopy) 12824 v.AddArg(v0) 12825 v0.AuxInt = off 12826 v0.Aux = sym 12827 v0.AddArg(ptr) 12828 v0.AddArg(mem) 12829 return true 12830 } 12831 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12832 // cond: x.Uses == 1 && clobber(x) 12833 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12834 for { 12835 t := v.Type 12836 x := v.Args[0] 12837 if x.Op != OpS390XMOVBZloadidx { 12838 break 12839 } 12840 off := x.AuxInt 12841 sym := x.Aux 12842 _ = x.Args[2] 12843 ptr := x.Args[0] 12844 idx := x.Args[1] 12845 mem := x.Args[2] 12846 if !(x.Uses == 1 && clobber(x)) { 12847 break 12848 } 12849 b = x.Block 12850 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12851 v.reset(OpCopy) 12852 v.AddArg(v0) 12853 v0.AuxInt = off 12854 v0.Aux = sym 12855 v0.AddArg(ptr) 12856 v0.AddArg(idx) 12857 v0.AddArg(mem) 12858 return true 12859 } 12860 return false 12861 } 12862 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 12863 b := v.Block 12864 _ = b 12865 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12866 // cond: x.Uses == 1 && clobber(x) 12867 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12868 for { 12869 t := v.Type 12870 x := v.Args[0] 12871 if x.Op != OpS390XMOVHZloadidx { 12872 break 12873 } 12874 off := x.AuxInt 12875 sym := x.Aux 12876 _ = x.Args[2] 12877 ptr := x.Args[0] 12878 idx := x.Args[1] 12879 mem := x.Args[2] 12880 if !(x.Uses == 1 && clobber(x)) { 12881 break 12882 } 12883 b = x.Block 12884 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12885 v.reset(OpCopy) 12886 v.AddArg(v0) 12887 v0.AuxInt = off 12888 v0.Aux = sym 12889 v0.AddArg(ptr) 12890 v0.AddArg(idx) 12891 v0.AddArg(mem) 12892 return true 12893 } 12894 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12895 // cond: x.Uses == 1 && clobber(x) 12896 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12897 for { 12898 t := v.Type 12899 x := v.Args[0] 12900 if x.Op != OpS390XMOVWZloadidx { 12901 break 12902 } 12903 off := x.AuxInt 12904 sym := x.Aux 12905 _ = x.Args[2] 12906 ptr := x.Args[0] 12907 idx := x.Args[1] 12908 mem := x.Args[2] 12909 if !(x.Uses == 1 && clobber(x)) { 12910 break 12911 } 12912 b = x.Block 12913 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12914 v.reset(OpCopy) 12915 v.AddArg(v0) 12916 v0.AuxInt = off 12917 v0.Aux = sym 12918 v0.AddArg(ptr) 12919 v0.AddArg(idx) 12920 v0.AddArg(mem) 12921 return true 12922 } 12923 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12924 // cond: x.Uses == 1 && clobber(x) 12925 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12926 for { 12927 t := v.Type 12928 x := v.Args[0] 12929 if x.Op != OpS390XMOVDloadidx { 12930 break 12931 } 12932 off := x.AuxInt 12933 sym := x.Aux 12934 _ = x.Args[2] 12935 ptr := x.Args[0] 12936 idx := x.Args[1] 12937 mem := x.Args[2] 12938 if !(x.Uses == 1 && clobber(x)) { 12939 break 12940 } 12941 b = x.Block 12942 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12943 v.reset(OpCopy) 12944 v.AddArg(v0) 12945 v0.AuxInt = off 12946 v0.Aux = sym 12947 v0.AddArg(ptr) 12948 v0.AddArg(idx) 12949 v0.AddArg(mem) 12950 return true 12951 } 12952 return false 12953 } 12954 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 12955 b := v.Block 12956 _ = b 12957 // match: (MOVDreg <t> x) 12958 // cond: t.Compare(x.Type) == types.CMPeq 12959 // result: x 12960 for { 12961 t := v.Type 12962 x := v.Args[0] 12963 if !(t.Compare(x.Type) == types.CMPeq) { 12964 break 12965 } 12966 v.reset(OpCopy) 12967 v.Type = x.Type 12968 v.AddArg(x) 12969 return true 12970 } 12971 // match: (MOVDreg (MOVDconst [c])) 12972 // cond: 12973 // result: (MOVDconst [c]) 12974 for { 12975 v_0 := v.Args[0] 12976 if v_0.Op != OpS390XMOVDconst { 12977 break 12978 } 12979 c := v_0.AuxInt 12980 v.reset(OpS390XMOVDconst) 12981 v.AuxInt = c 12982 return true 12983 } 12984 // match: (MOVDreg x) 12985 // cond: x.Uses == 1 12986 // result: (MOVDnop x) 12987 for { 12988 x := v.Args[0] 12989 if !(x.Uses == 1) { 12990 break 12991 } 12992 v.reset(OpS390XMOVDnop) 12993 v.AddArg(x) 12994 return true 12995 } 12996 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 12997 // cond: x.Uses == 1 && clobber(x) 12998 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12999 for { 13000 t := v.Type 13001 x := v.Args[0] 13002 if x.Op != OpS390XMOVBZload { 13003 break 13004 } 13005 off := x.AuxInt 13006 sym := x.Aux 13007 _ = x.Args[1] 13008 ptr := x.Args[0] 13009 mem := x.Args[1] 13010 if !(x.Uses == 1 && clobber(x)) { 13011 break 13012 } 13013 b = x.Block 13014 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 13015 v.reset(OpCopy) 13016 v.AddArg(v0) 13017 v0.AuxInt = off 13018 v0.Aux = sym 13019 v0.AddArg(ptr) 13020 v0.AddArg(mem) 13021 return true 13022 } 13023 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 13024 // cond: x.Uses == 1 && clobber(x) 13025 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 13026 for { 13027 t := v.Type 13028 x := v.Args[0] 13029 if x.Op != OpS390XMOVBload { 13030 break 13031 } 13032 off := x.AuxInt 13033 sym := x.Aux 13034 _ = x.Args[1] 13035 ptr := x.Args[0] 13036 mem := x.Args[1] 13037 if !(x.Uses == 1 && clobber(x)) { 13038 break 13039 } 13040 b = x.Block 13041 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 13042 v.reset(OpCopy) 13043 v.AddArg(v0) 13044 v0.AuxInt = off 13045 v0.Aux = sym 13046 v0.AddArg(ptr) 13047 v0.AddArg(mem) 13048 return true 13049 } 13050 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 13051 // cond: x.Uses == 1 && clobber(x) 13052 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 13053 for { 13054 t := v.Type 13055 x := v.Args[0] 13056 if x.Op != OpS390XMOVHZload { 13057 break 13058 } 13059 off := x.AuxInt 13060 sym := x.Aux 13061 _ = x.Args[1] 13062 ptr := x.Args[0] 13063 mem := x.Args[1] 13064 if !(x.Uses == 1 && clobber(x)) { 13065 break 13066 } 13067 b = x.Block 13068 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 13069 v.reset(OpCopy) 13070 v.AddArg(v0) 13071 v0.AuxInt = off 13072 v0.Aux = sym 13073 v0.AddArg(ptr) 13074 v0.AddArg(mem) 13075 return true 13076 } 13077 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 13078 // cond: x.Uses == 1 && clobber(x) 13079 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 13080 for { 13081 t := v.Type 13082 x := v.Args[0] 13083 if x.Op != OpS390XMOVHload { 13084 break 13085 } 13086 off := x.AuxInt 13087 sym := x.Aux 13088 _ = x.Args[1] 13089 ptr := x.Args[0] 13090 mem := x.Args[1] 13091 if !(x.Uses == 1 && clobber(x)) { 13092 break 13093 } 13094 b = x.Block 13095 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 13096 v.reset(OpCopy) 13097 v.AddArg(v0) 13098 v0.AuxInt = off 13099 v0.Aux = sym 13100 v0.AddArg(ptr) 13101 v0.AddArg(mem) 13102 return true 13103 } 13104 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 13105 // cond: x.Uses == 1 && clobber(x) 13106 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 13107 for { 13108 t := v.Type 13109 x := v.Args[0] 13110 if x.Op != OpS390XMOVWZload { 13111 break 13112 } 13113 off := x.AuxInt 13114 sym := x.Aux 13115 _ = x.Args[1] 13116 ptr := x.Args[0] 13117 mem := x.Args[1] 13118 if !(x.Uses == 1 && clobber(x)) { 13119 break 13120 } 13121 b = x.Block 13122 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 13123 v.reset(OpCopy) 13124 v.AddArg(v0) 13125 v0.AuxInt = off 13126 v0.Aux = sym 13127 v0.AddArg(ptr) 13128 v0.AddArg(mem) 13129 return true 13130 } 13131 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 13132 // cond: x.Uses == 1 && clobber(x) 13133 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 13134 for { 13135 t := v.Type 13136 x := v.Args[0] 13137 if x.Op != OpS390XMOVWload { 13138 break 13139 } 13140 off := x.AuxInt 13141 sym := x.Aux 13142 _ = x.Args[1] 13143 ptr := x.Args[0] 13144 mem := x.Args[1] 13145 if !(x.Uses == 1 && clobber(x)) { 13146 break 13147 } 13148 b = x.Block 13149 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 13150 v.reset(OpCopy) 13151 v.AddArg(v0) 13152 v0.AuxInt = off 13153 v0.Aux = sym 13154 v0.AddArg(ptr) 13155 v0.AddArg(mem) 13156 return true 13157 } 13158 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 13159 // cond: x.Uses == 1 && clobber(x) 13160 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 13161 for { 13162 t := v.Type 13163 x := v.Args[0] 13164 if x.Op != OpS390XMOVDload { 13165 break 13166 } 13167 off := x.AuxInt 13168 sym := x.Aux 13169 _ = x.Args[1] 13170 ptr := x.Args[0] 13171 mem := x.Args[1] 13172 if !(x.Uses == 1 && clobber(x)) { 13173 break 13174 } 13175 b = x.Block 13176 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 13177 v.reset(OpCopy) 13178 v.AddArg(v0) 13179 v0.AuxInt = off 13180 v0.Aux = sym 13181 v0.AddArg(ptr) 13182 v0.AddArg(mem) 13183 return true 13184 } 13185 return false 13186 } 13187 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 13188 b := v.Block 13189 _ = b 13190 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 13191 // cond: x.Uses == 1 && clobber(x) 13192 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 13193 for { 13194 t := v.Type 13195 x := v.Args[0] 13196 if x.Op != OpS390XMOVBZloadidx { 13197 break 13198 } 13199 off := x.AuxInt 13200 sym := x.Aux 13201 _ = x.Args[2] 13202 ptr := x.Args[0] 13203 idx := x.Args[1] 13204 mem := x.Args[2] 13205 if !(x.Uses == 1 && clobber(x)) { 13206 break 13207 } 13208 b = x.Block 13209 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 13210 v.reset(OpCopy) 13211 v.AddArg(v0) 13212 v0.AuxInt = off 13213 v0.Aux = sym 13214 v0.AddArg(ptr) 13215 v0.AddArg(idx) 13216 v0.AddArg(mem) 13217 return true 13218 } 13219 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 13220 // cond: x.Uses == 1 && clobber(x) 13221 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 13222 for { 13223 t := v.Type 13224 x := v.Args[0] 13225 if x.Op != OpS390XMOVHZloadidx { 13226 break 13227 } 13228 off := x.AuxInt 13229 sym := x.Aux 13230 _ = x.Args[2] 13231 ptr := x.Args[0] 13232 idx := x.Args[1] 13233 mem := x.Args[2] 13234 if !(x.Uses == 1 && clobber(x)) { 13235 break 13236 } 13237 b = x.Block 13238 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 13239 v.reset(OpCopy) 13240 v.AddArg(v0) 13241 v0.AuxInt = off 13242 v0.Aux = sym 13243 v0.AddArg(ptr) 13244 v0.AddArg(idx) 13245 v0.AddArg(mem) 13246 return true 13247 } 13248 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 13249 // cond: x.Uses == 1 && clobber(x) 13250 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 13251 for { 13252 t := v.Type 13253 x := v.Args[0] 13254 if x.Op != OpS390XMOVWZloadidx { 13255 break 13256 } 13257 off := x.AuxInt 13258 sym := x.Aux 13259 _ = x.Args[2] 13260 ptr := x.Args[0] 13261 idx := x.Args[1] 13262 mem := x.Args[2] 13263 if !(x.Uses == 1 && clobber(x)) { 13264 break 13265 } 13266 b = x.Block 13267 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 13268 v.reset(OpCopy) 13269 v.AddArg(v0) 13270 v0.AuxInt = off 13271 v0.Aux = sym 13272 v0.AddArg(ptr) 13273 v0.AddArg(idx) 13274 v0.AddArg(mem) 13275 return true 13276 } 13277 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 13278 // cond: x.Uses == 1 && clobber(x) 13279 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 13280 for { 13281 t := v.Type 13282 x := v.Args[0] 13283 if x.Op != OpS390XMOVDloadidx { 13284 break 13285 } 13286 off := x.AuxInt 13287 sym := x.Aux 13288 _ = x.Args[2] 13289 ptr := x.Args[0] 13290 idx := x.Args[1] 13291 mem := x.Args[2] 13292 if !(x.Uses == 1 && clobber(x)) { 13293 break 13294 } 13295 b = x.Block 13296 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 13297 v.reset(OpCopy) 13298 v.AddArg(v0) 13299 v0.AuxInt = off 13300 v0.Aux = sym 13301 v0.AddArg(ptr) 13302 v0.AddArg(idx) 13303 v0.AddArg(mem) 13304 return true 13305 } 13306 return false 13307 } 13308 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 13309 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 13310 // cond: is20Bit(off1+off2) 13311 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 13312 for { 13313 off1 := v.AuxInt 13314 sym := v.Aux 13315 _ = v.Args[2] 13316 v_0 := v.Args[0] 13317 if v_0.Op != OpS390XADDconst { 13318 break 13319 } 13320 off2 := v_0.AuxInt 13321 ptr := v_0.Args[0] 13322 val := v.Args[1] 13323 mem := v.Args[2] 13324 if !(is20Bit(off1 + off2)) { 13325 break 13326 } 13327 v.reset(OpS390XMOVDstore) 13328 v.AuxInt = off1 + off2 13329 v.Aux = sym 13330 v.AddArg(ptr) 13331 v.AddArg(val) 13332 v.AddArg(mem) 13333 return true 13334 } 13335 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 13336 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 13337 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 13338 for { 13339 off := v.AuxInt 13340 sym := v.Aux 13341 _ = v.Args[2] 13342 ptr := v.Args[0] 13343 v_1 := v.Args[1] 13344 if v_1.Op != OpS390XMOVDconst { 13345 break 13346 } 13347 c := v_1.AuxInt 13348 mem := v.Args[2] 13349 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 13350 break 13351 } 13352 v.reset(OpS390XMOVDstoreconst) 13353 v.AuxInt = makeValAndOff(c, off) 13354 v.Aux = sym 13355 v.AddArg(ptr) 13356 v.AddArg(mem) 13357 return true 13358 } 13359 // match: (MOVDstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 13360 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0)) 13361 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 13362 for { 13363 off1 := v.AuxInt 13364 sym1 := v.Aux 13365 _ = v.Args[2] 13366 v_0 := v.Args[0] 13367 if v_0.Op != OpS390XMOVDaddr { 13368 break 13369 } 13370 t := v_0.Type 13371 off2 := v_0.AuxInt 13372 sym2 := v_0.Aux 13373 base := v_0.Args[0] 13374 val := v.Args[1] 13375 mem := v.Args[2] 13376 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { 13377 break 13378 } 13379 v.reset(OpS390XMOVDstore) 13380 v.AuxInt = off1 + off2 13381 v.Aux = mergeSym(sym1, sym2) 13382 v.AddArg(base) 13383 v.AddArg(val) 13384 v.AddArg(mem) 13385 return true 13386 } 13387 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 13388 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13389 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 13390 for { 13391 off1 := v.AuxInt 13392 sym1 := v.Aux 13393 _ = v.Args[2] 13394 v_0 := v.Args[0] 13395 if v_0.Op != OpS390XMOVDaddridx { 13396 break 13397 } 13398 off2 := v_0.AuxInt 13399 sym2 := v_0.Aux 13400 _ = v_0.Args[1] 13401 ptr := v_0.Args[0] 13402 idx := v_0.Args[1] 13403 val := v.Args[1] 13404 mem := v.Args[2] 13405 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13406 break 13407 } 13408 v.reset(OpS390XMOVDstoreidx) 13409 v.AuxInt = off1 + off2 13410 v.Aux = mergeSym(sym1, sym2) 13411 v.AddArg(ptr) 13412 v.AddArg(idx) 13413 v.AddArg(val) 13414 v.AddArg(mem) 13415 return true 13416 } 13417 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 13418 // cond: ptr.Op != OpSB 13419 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 13420 for { 13421 off := v.AuxInt 13422 sym := v.Aux 13423 _ = v.Args[2] 13424 v_0 := v.Args[0] 13425 if v_0.Op != OpS390XADD { 13426 break 13427 } 13428 _ = v_0.Args[1] 13429 ptr := v_0.Args[0] 13430 idx := v_0.Args[1] 13431 val := v.Args[1] 13432 mem := v.Args[2] 13433 if !(ptr.Op != OpSB) { 13434 break 13435 } 13436 v.reset(OpS390XMOVDstoreidx) 13437 v.AuxInt = off 13438 v.Aux = sym 13439 v.AddArg(ptr) 13440 v.AddArg(idx) 13441 v.AddArg(val) 13442 v.AddArg(mem) 13443 return true 13444 } 13445 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 13446 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 13447 // result: (STMG2 [i-8] {s} p w0 w1 mem) 13448 for { 13449 i := v.AuxInt 13450 s := v.Aux 13451 _ = v.Args[2] 13452 p := v.Args[0] 13453 w1 := v.Args[1] 13454 x := v.Args[2] 13455 if x.Op != OpS390XMOVDstore { 13456 break 13457 } 13458 if x.AuxInt != i-8 { 13459 break 13460 } 13461 if x.Aux != s { 13462 break 13463 } 13464 _ = x.Args[2] 13465 if p != x.Args[0] { 13466 break 13467 } 13468 w0 := x.Args[1] 13469 mem := x.Args[2] 13470 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 13471 break 13472 } 13473 v.reset(OpS390XSTMG2) 13474 v.AuxInt = i - 8 13475 v.Aux = s 13476 v.AddArg(p) 13477 v.AddArg(w0) 13478 v.AddArg(w1) 13479 v.AddArg(mem) 13480 return true 13481 } 13482 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 13483 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 13484 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 13485 for { 13486 i := v.AuxInt 13487 s := v.Aux 13488 _ = v.Args[2] 13489 p := v.Args[0] 13490 w2 := v.Args[1] 13491 x := v.Args[2] 13492 if x.Op != OpS390XSTMG2 { 13493 break 13494 } 13495 if x.AuxInt != i-16 { 13496 break 13497 } 13498 if x.Aux != s { 13499 break 13500 } 13501 _ = x.Args[3] 13502 if p != x.Args[0] { 13503 break 13504 } 13505 w0 := x.Args[1] 13506 w1 := x.Args[2] 13507 mem := x.Args[3] 13508 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 13509 break 13510 } 13511 v.reset(OpS390XSTMG3) 13512 v.AuxInt = i - 16 13513 v.Aux = s 13514 v.AddArg(p) 13515 v.AddArg(w0) 13516 v.AddArg(w1) 13517 v.AddArg(w2) 13518 v.AddArg(mem) 13519 return true 13520 } 13521 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 13522 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 13523 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 13524 for { 13525 i := v.AuxInt 13526 s := v.Aux 13527 _ = v.Args[2] 13528 p := v.Args[0] 13529 w3 := v.Args[1] 13530 x := v.Args[2] 13531 if x.Op != OpS390XSTMG3 { 13532 break 13533 } 13534 if x.AuxInt != i-24 { 13535 break 13536 } 13537 if x.Aux != s { 13538 break 13539 } 13540 _ = x.Args[4] 13541 if p != x.Args[0] { 13542 break 13543 } 13544 w0 := x.Args[1] 13545 w1 := x.Args[2] 13546 w2 := x.Args[3] 13547 mem := x.Args[4] 13548 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 13549 break 13550 } 13551 v.reset(OpS390XSTMG4) 13552 v.AuxInt = i - 24 13553 v.Aux = s 13554 v.AddArg(p) 13555 v.AddArg(w0) 13556 v.AddArg(w1) 13557 v.AddArg(w2) 13558 v.AddArg(w3) 13559 v.AddArg(mem) 13560 return true 13561 } 13562 return false 13563 } 13564 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 13565 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 13566 // cond: isU12Bit(ValAndOff(sc).Off()+off) 13567 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 13568 for { 13569 sc := v.AuxInt 13570 s := v.Aux 13571 _ = v.Args[1] 13572 v_0 := v.Args[0] 13573 if v_0.Op != OpS390XADDconst { 13574 break 13575 } 13576 off := v_0.AuxInt 13577 ptr := v_0.Args[0] 13578 mem := v.Args[1] 13579 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 13580 break 13581 } 13582 v.reset(OpS390XMOVDstoreconst) 13583 v.AuxInt = ValAndOff(sc).add(off) 13584 v.Aux = s 13585 v.AddArg(ptr) 13586 v.AddArg(mem) 13587 return true 13588 } 13589 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 13590 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 13591 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 13592 for { 13593 sc := v.AuxInt 13594 sym1 := v.Aux 13595 _ = v.Args[1] 13596 v_0 := v.Args[0] 13597 if v_0.Op != OpS390XMOVDaddr { 13598 break 13599 } 13600 off := v_0.AuxInt 13601 sym2 := v_0.Aux 13602 ptr := v_0.Args[0] 13603 mem := v.Args[1] 13604 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 13605 break 13606 } 13607 v.reset(OpS390XMOVDstoreconst) 13608 v.AuxInt = ValAndOff(sc).add(off) 13609 v.Aux = mergeSym(sym1, sym2) 13610 v.AddArg(ptr) 13611 v.AddArg(mem) 13612 return true 13613 } 13614 return false 13615 } 13616 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 13617 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 13618 // cond: 13619 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13620 for { 13621 c := v.AuxInt 13622 sym := v.Aux 13623 _ = v.Args[3] 13624 v_0 := v.Args[0] 13625 if v_0.Op != OpS390XADDconst { 13626 break 13627 } 13628 d := v_0.AuxInt 13629 ptr := v_0.Args[0] 13630 idx := v.Args[1] 13631 val := v.Args[2] 13632 mem := v.Args[3] 13633 v.reset(OpS390XMOVDstoreidx) 13634 v.AuxInt = c + d 13635 v.Aux = sym 13636 v.AddArg(ptr) 13637 v.AddArg(idx) 13638 v.AddArg(val) 13639 v.AddArg(mem) 13640 return true 13641 } 13642 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 13643 // cond: 13644 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13645 for { 13646 c := v.AuxInt 13647 sym := v.Aux 13648 _ = v.Args[3] 13649 idx := v.Args[0] 13650 v_1 := v.Args[1] 13651 if v_1.Op != OpS390XADDconst { 13652 break 13653 } 13654 d := v_1.AuxInt 13655 ptr := v_1.Args[0] 13656 val := v.Args[2] 13657 mem := v.Args[3] 13658 v.reset(OpS390XMOVDstoreidx) 13659 v.AuxInt = c + d 13660 v.Aux = sym 13661 v.AddArg(ptr) 13662 v.AddArg(idx) 13663 v.AddArg(val) 13664 v.AddArg(mem) 13665 return true 13666 } 13667 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13668 // cond: 13669 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13670 for { 13671 c := v.AuxInt 13672 sym := v.Aux 13673 _ = v.Args[3] 13674 ptr := v.Args[0] 13675 v_1 := v.Args[1] 13676 if v_1.Op != OpS390XADDconst { 13677 break 13678 } 13679 d := v_1.AuxInt 13680 idx := v_1.Args[0] 13681 val := v.Args[2] 13682 mem := v.Args[3] 13683 v.reset(OpS390XMOVDstoreidx) 13684 v.AuxInt = c + d 13685 v.Aux = sym 13686 v.AddArg(ptr) 13687 v.AddArg(idx) 13688 v.AddArg(val) 13689 v.AddArg(mem) 13690 return true 13691 } 13692 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 13693 // cond: 13694 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13695 for { 13696 c := v.AuxInt 13697 sym := v.Aux 13698 _ = v.Args[3] 13699 v_0 := v.Args[0] 13700 if v_0.Op != OpS390XADDconst { 13701 break 13702 } 13703 d := v_0.AuxInt 13704 idx := v_0.Args[0] 13705 ptr := v.Args[1] 13706 val := v.Args[2] 13707 mem := v.Args[3] 13708 v.reset(OpS390XMOVDstoreidx) 13709 v.AuxInt = c + d 13710 v.Aux = sym 13711 v.AddArg(ptr) 13712 v.AddArg(idx) 13713 v.AddArg(val) 13714 v.AddArg(mem) 13715 return true 13716 } 13717 return false 13718 } 13719 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 13720 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13721 // cond: x.Uses == 1 && clobber(x) 13722 // result: (MOVWBRstore [i-2] {s} p w mem) 13723 for { 13724 i := v.AuxInt 13725 s := v.Aux 13726 _ = v.Args[2] 13727 p := v.Args[0] 13728 v_1 := v.Args[1] 13729 if v_1.Op != OpS390XSRDconst { 13730 break 13731 } 13732 if v_1.AuxInt != 16 { 13733 break 13734 } 13735 w := v_1.Args[0] 13736 x := v.Args[2] 13737 if x.Op != OpS390XMOVHBRstore { 13738 break 13739 } 13740 if x.AuxInt != i-2 { 13741 break 13742 } 13743 if x.Aux != s { 13744 break 13745 } 13746 _ = x.Args[2] 13747 if p != x.Args[0] { 13748 break 13749 } 13750 if w != x.Args[1] { 13751 break 13752 } 13753 mem := x.Args[2] 13754 if !(x.Uses == 1 && clobber(x)) { 13755 break 13756 } 13757 v.reset(OpS390XMOVWBRstore) 13758 v.AuxInt = i - 2 13759 v.Aux = s 13760 v.AddArg(p) 13761 v.AddArg(w) 13762 v.AddArg(mem) 13763 return true 13764 } 13765 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 13766 // cond: x.Uses == 1 && clobber(x) 13767 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13768 for { 13769 i := v.AuxInt 13770 s := v.Aux 13771 _ = v.Args[2] 13772 p := v.Args[0] 13773 v_1 := v.Args[1] 13774 if v_1.Op != OpS390XSRDconst { 13775 break 13776 } 13777 j := v_1.AuxInt 13778 w := v_1.Args[0] 13779 x := v.Args[2] 13780 if x.Op != OpS390XMOVHBRstore { 13781 break 13782 } 13783 if x.AuxInt != i-2 { 13784 break 13785 } 13786 if x.Aux != s { 13787 break 13788 } 13789 _ = x.Args[2] 13790 if p != x.Args[0] { 13791 break 13792 } 13793 w0 := x.Args[1] 13794 if w0.Op != OpS390XSRDconst { 13795 break 13796 } 13797 if w0.AuxInt != j-16 { 13798 break 13799 } 13800 if w != w0.Args[0] { 13801 break 13802 } 13803 mem := x.Args[2] 13804 if !(x.Uses == 1 && clobber(x)) { 13805 break 13806 } 13807 v.reset(OpS390XMOVWBRstore) 13808 v.AuxInt = i - 2 13809 v.Aux = s 13810 v.AddArg(p) 13811 v.AddArg(w0) 13812 v.AddArg(mem) 13813 return true 13814 } 13815 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13816 // cond: x.Uses == 1 && clobber(x) 13817 // result: (MOVWBRstore [i-2] {s} p w mem) 13818 for { 13819 i := v.AuxInt 13820 s := v.Aux 13821 _ = v.Args[2] 13822 p := v.Args[0] 13823 v_1 := v.Args[1] 13824 if v_1.Op != OpS390XSRWconst { 13825 break 13826 } 13827 if v_1.AuxInt != 16 { 13828 break 13829 } 13830 w := v_1.Args[0] 13831 x := v.Args[2] 13832 if x.Op != OpS390XMOVHBRstore { 13833 break 13834 } 13835 if x.AuxInt != i-2 { 13836 break 13837 } 13838 if x.Aux != s { 13839 break 13840 } 13841 _ = x.Args[2] 13842 if p != x.Args[0] { 13843 break 13844 } 13845 if w != x.Args[1] { 13846 break 13847 } 13848 mem := x.Args[2] 13849 if !(x.Uses == 1 && clobber(x)) { 13850 break 13851 } 13852 v.reset(OpS390XMOVWBRstore) 13853 v.AuxInt = i - 2 13854 v.Aux = s 13855 v.AddArg(p) 13856 v.AddArg(w) 13857 v.AddArg(mem) 13858 return true 13859 } 13860 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 13861 // cond: x.Uses == 1 && clobber(x) 13862 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13863 for { 13864 i := v.AuxInt 13865 s := v.Aux 13866 _ = v.Args[2] 13867 p := v.Args[0] 13868 v_1 := v.Args[1] 13869 if v_1.Op != OpS390XSRWconst { 13870 break 13871 } 13872 j := v_1.AuxInt 13873 w := v_1.Args[0] 13874 x := v.Args[2] 13875 if x.Op != OpS390XMOVHBRstore { 13876 break 13877 } 13878 if x.AuxInt != i-2 { 13879 break 13880 } 13881 if x.Aux != s { 13882 break 13883 } 13884 _ = x.Args[2] 13885 if p != x.Args[0] { 13886 break 13887 } 13888 w0 := x.Args[1] 13889 if w0.Op != OpS390XSRWconst { 13890 break 13891 } 13892 if w0.AuxInt != j-16 { 13893 break 13894 } 13895 if w != w0.Args[0] { 13896 break 13897 } 13898 mem := x.Args[2] 13899 if !(x.Uses == 1 && clobber(x)) { 13900 break 13901 } 13902 v.reset(OpS390XMOVWBRstore) 13903 v.AuxInt = i - 2 13904 v.Aux = s 13905 v.AddArg(p) 13906 v.AddArg(w0) 13907 v.AddArg(mem) 13908 return true 13909 } 13910 return false 13911 } 13912 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 13913 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13914 // cond: x.Uses == 1 && clobber(x) 13915 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13916 for { 13917 i := v.AuxInt 13918 s := v.Aux 13919 _ = v.Args[3] 13920 p := v.Args[0] 13921 idx := v.Args[1] 13922 v_2 := v.Args[2] 13923 if v_2.Op != OpS390XSRDconst { 13924 break 13925 } 13926 if v_2.AuxInt != 16 { 13927 break 13928 } 13929 w := v_2.Args[0] 13930 x := v.Args[3] 13931 if x.Op != OpS390XMOVHBRstoreidx { 13932 break 13933 } 13934 if x.AuxInt != i-2 { 13935 break 13936 } 13937 if x.Aux != s { 13938 break 13939 } 13940 _ = x.Args[3] 13941 if p != x.Args[0] { 13942 break 13943 } 13944 if idx != x.Args[1] { 13945 break 13946 } 13947 if w != x.Args[2] { 13948 break 13949 } 13950 mem := x.Args[3] 13951 if !(x.Uses == 1 && clobber(x)) { 13952 break 13953 } 13954 v.reset(OpS390XMOVWBRstoreidx) 13955 v.AuxInt = i - 2 13956 v.Aux = s 13957 v.AddArg(p) 13958 v.AddArg(idx) 13959 v.AddArg(w) 13960 v.AddArg(mem) 13961 return true 13962 } 13963 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13964 // cond: x.Uses == 1 && clobber(x) 13965 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13966 for { 13967 i := v.AuxInt 13968 s := v.Aux 13969 _ = v.Args[3] 13970 p := v.Args[0] 13971 idx := v.Args[1] 13972 v_2 := v.Args[2] 13973 if v_2.Op != OpS390XSRDconst { 13974 break 13975 } 13976 if v_2.AuxInt != 16 { 13977 break 13978 } 13979 w := v_2.Args[0] 13980 x := v.Args[3] 13981 if x.Op != OpS390XMOVHBRstoreidx { 13982 break 13983 } 13984 if x.AuxInt != i-2 { 13985 break 13986 } 13987 if x.Aux != s { 13988 break 13989 } 13990 _ = x.Args[3] 13991 if idx != x.Args[0] { 13992 break 13993 } 13994 if p != x.Args[1] { 13995 break 13996 } 13997 if w != x.Args[2] { 13998 break 13999 } 14000 mem := x.Args[3] 14001 if !(x.Uses == 1 && clobber(x)) { 14002 break 14003 } 14004 v.reset(OpS390XMOVWBRstoreidx) 14005 v.AuxInt = i - 2 14006 v.Aux = s 14007 v.AddArg(p) 14008 v.AddArg(idx) 14009 v.AddArg(w) 14010 v.AddArg(mem) 14011 return true 14012 } 14013 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14014 // cond: x.Uses == 1 && clobber(x) 14015 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14016 for { 14017 i := v.AuxInt 14018 s := v.Aux 14019 _ = v.Args[3] 14020 idx := v.Args[0] 14021 p := v.Args[1] 14022 v_2 := v.Args[2] 14023 if v_2.Op != OpS390XSRDconst { 14024 break 14025 } 14026 if v_2.AuxInt != 16 { 14027 break 14028 } 14029 w := v_2.Args[0] 14030 x := v.Args[3] 14031 if x.Op != OpS390XMOVHBRstoreidx { 14032 break 14033 } 14034 if x.AuxInt != i-2 { 14035 break 14036 } 14037 if x.Aux != s { 14038 break 14039 } 14040 _ = x.Args[3] 14041 if p != x.Args[0] { 14042 break 14043 } 14044 if idx != x.Args[1] { 14045 break 14046 } 14047 if w != x.Args[2] { 14048 break 14049 } 14050 mem := x.Args[3] 14051 if !(x.Uses == 1 && clobber(x)) { 14052 break 14053 } 14054 v.reset(OpS390XMOVWBRstoreidx) 14055 v.AuxInt = i - 2 14056 v.Aux = s 14057 v.AddArg(p) 14058 v.AddArg(idx) 14059 v.AddArg(w) 14060 v.AddArg(mem) 14061 return true 14062 } 14063 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14064 // cond: x.Uses == 1 && clobber(x) 14065 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14066 for { 14067 i := v.AuxInt 14068 s := v.Aux 14069 _ = v.Args[3] 14070 idx := v.Args[0] 14071 p := v.Args[1] 14072 v_2 := v.Args[2] 14073 if v_2.Op != OpS390XSRDconst { 14074 break 14075 } 14076 if v_2.AuxInt != 16 { 14077 break 14078 } 14079 w := v_2.Args[0] 14080 x := v.Args[3] 14081 if x.Op != OpS390XMOVHBRstoreidx { 14082 break 14083 } 14084 if x.AuxInt != i-2 { 14085 break 14086 } 14087 if x.Aux != s { 14088 break 14089 } 14090 _ = x.Args[3] 14091 if idx != x.Args[0] { 14092 break 14093 } 14094 if p != x.Args[1] { 14095 break 14096 } 14097 if w != x.Args[2] { 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(w) 14110 v.AddArg(mem) 14111 return true 14112 } 14113 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx 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 p != x.Args[0] { 14140 break 14141 } 14142 if idx != 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} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p 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 p := v.Args[0] 14176 idx := 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 idx != x.Args[0] { 14195 break 14196 } 14197 if p != 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} p idx 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 p != x.Args[0] { 14250 break 14251 } 14252 if idx != 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} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 14279 // cond: x.Uses == 1 && clobber(x) 14280 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14281 for { 14282 i := v.AuxInt 14283 s := v.Aux 14284 _ = v.Args[3] 14285 idx := v.Args[0] 14286 p := v.Args[1] 14287 v_2 := v.Args[2] 14288 if v_2.Op != OpS390XSRDconst { 14289 break 14290 } 14291 j := v_2.AuxInt 14292 w := v_2.Args[0] 14293 x := v.Args[3] 14294 if x.Op != OpS390XMOVHBRstoreidx { 14295 break 14296 } 14297 if x.AuxInt != i-2 { 14298 break 14299 } 14300 if x.Aux != s { 14301 break 14302 } 14303 _ = x.Args[3] 14304 if idx != x.Args[0] { 14305 break 14306 } 14307 if p != x.Args[1] { 14308 break 14309 } 14310 w0 := x.Args[2] 14311 if w0.Op != OpS390XSRDconst { 14312 break 14313 } 14314 if w0.AuxInt != j-16 { 14315 break 14316 } 14317 if w != w0.Args[0] { 14318 break 14319 } 14320 mem := x.Args[3] 14321 if !(x.Uses == 1 && clobber(x)) { 14322 break 14323 } 14324 v.reset(OpS390XMOVWBRstoreidx) 14325 v.AuxInt = i - 2 14326 v.Aux = s 14327 v.AddArg(p) 14328 v.AddArg(idx) 14329 v.AddArg(w0) 14330 v.AddArg(mem) 14331 return true 14332 } 14333 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14334 // cond: x.Uses == 1 && clobber(x) 14335 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14336 for { 14337 i := v.AuxInt 14338 s := v.Aux 14339 _ = v.Args[3] 14340 p := v.Args[0] 14341 idx := v.Args[1] 14342 v_2 := v.Args[2] 14343 if v_2.Op != OpS390XSRWconst { 14344 break 14345 } 14346 if v_2.AuxInt != 16 { 14347 break 14348 } 14349 w := v_2.Args[0] 14350 x := v.Args[3] 14351 if x.Op != OpS390XMOVHBRstoreidx { 14352 break 14353 } 14354 if x.AuxInt != i-2 { 14355 break 14356 } 14357 if x.Aux != s { 14358 break 14359 } 14360 _ = x.Args[3] 14361 if p != x.Args[0] { 14362 break 14363 } 14364 if idx != x.Args[1] { 14365 break 14366 } 14367 if w != x.Args[2] { 14368 break 14369 } 14370 mem := x.Args[3] 14371 if !(x.Uses == 1 && clobber(x)) { 14372 break 14373 } 14374 v.reset(OpS390XMOVWBRstoreidx) 14375 v.AuxInt = i - 2 14376 v.Aux = s 14377 v.AddArg(p) 14378 v.AddArg(idx) 14379 v.AddArg(w) 14380 v.AddArg(mem) 14381 return true 14382 } 14383 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14384 // cond: x.Uses == 1 && clobber(x) 14385 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14386 for { 14387 i := v.AuxInt 14388 s := v.Aux 14389 _ = v.Args[3] 14390 p := v.Args[0] 14391 idx := v.Args[1] 14392 v_2 := v.Args[2] 14393 if v_2.Op != OpS390XSRWconst { 14394 break 14395 } 14396 if v_2.AuxInt != 16 { 14397 break 14398 } 14399 w := v_2.Args[0] 14400 x := v.Args[3] 14401 if x.Op != OpS390XMOVHBRstoreidx { 14402 break 14403 } 14404 if x.AuxInt != i-2 { 14405 break 14406 } 14407 if x.Aux != s { 14408 break 14409 } 14410 _ = x.Args[3] 14411 if idx != x.Args[0] { 14412 break 14413 } 14414 if p != x.Args[1] { 14415 break 14416 } 14417 if w != x.Args[2] { 14418 break 14419 } 14420 mem := x.Args[3] 14421 if !(x.Uses == 1 && clobber(x)) { 14422 break 14423 } 14424 v.reset(OpS390XMOVWBRstoreidx) 14425 v.AuxInt = i - 2 14426 v.Aux = s 14427 v.AddArg(p) 14428 v.AddArg(idx) 14429 v.AddArg(w) 14430 v.AddArg(mem) 14431 return true 14432 } 14433 return false 14434 } 14435 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 14436 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14437 // cond: x.Uses == 1 && clobber(x) 14438 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14439 for { 14440 i := v.AuxInt 14441 s := v.Aux 14442 _ = v.Args[3] 14443 idx := v.Args[0] 14444 p := v.Args[1] 14445 v_2 := v.Args[2] 14446 if v_2.Op != OpS390XSRWconst { 14447 break 14448 } 14449 if v_2.AuxInt != 16 { 14450 break 14451 } 14452 w := v_2.Args[0] 14453 x := v.Args[3] 14454 if x.Op != OpS390XMOVHBRstoreidx { 14455 break 14456 } 14457 if x.AuxInt != i-2 { 14458 break 14459 } 14460 if x.Aux != s { 14461 break 14462 } 14463 _ = x.Args[3] 14464 if p != x.Args[0] { 14465 break 14466 } 14467 if idx != x.Args[1] { 14468 break 14469 } 14470 if w != x.Args[2] { 14471 break 14472 } 14473 mem := x.Args[3] 14474 if !(x.Uses == 1 && clobber(x)) { 14475 break 14476 } 14477 v.reset(OpS390XMOVWBRstoreidx) 14478 v.AuxInt = i - 2 14479 v.Aux = s 14480 v.AddArg(p) 14481 v.AddArg(idx) 14482 v.AddArg(w) 14483 v.AddArg(mem) 14484 return true 14485 } 14486 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14487 // cond: x.Uses == 1 && clobber(x) 14488 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14489 for { 14490 i := v.AuxInt 14491 s := v.Aux 14492 _ = v.Args[3] 14493 idx := v.Args[0] 14494 p := v.Args[1] 14495 v_2 := v.Args[2] 14496 if v_2.Op != OpS390XSRWconst { 14497 break 14498 } 14499 if v_2.AuxInt != 16 { 14500 break 14501 } 14502 w := v_2.Args[0] 14503 x := v.Args[3] 14504 if x.Op != OpS390XMOVHBRstoreidx { 14505 break 14506 } 14507 if x.AuxInt != i-2 { 14508 break 14509 } 14510 if x.Aux != s { 14511 break 14512 } 14513 _ = x.Args[3] 14514 if idx != x.Args[0] { 14515 break 14516 } 14517 if p != x.Args[1] { 14518 break 14519 } 14520 if w != x.Args[2] { 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(w) 14533 v.AddArg(mem) 14534 return true 14535 } 14536 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx 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 p != x.Args[0] { 14563 break 14564 } 14565 if idx != 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} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p 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 p := v.Args[0] 14599 idx := 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 idx != x.Args[0] { 14618 break 14619 } 14620 if p != 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} p idx 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 p != x.Args[0] { 14673 break 14674 } 14675 if idx != 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 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14702 // cond: x.Uses == 1 && clobber(x) 14703 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14704 for { 14705 i := v.AuxInt 14706 s := v.Aux 14707 _ = v.Args[3] 14708 idx := v.Args[0] 14709 p := v.Args[1] 14710 v_2 := v.Args[2] 14711 if v_2.Op != OpS390XSRWconst { 14712 break 14713 } 14714 j := v_2.AuxInt 14715 w := v_2.Args[0] 14716 x := v.Args[3] 14717 if x.Op != OpS390XMOVHBRstoreidx { 14718 break 14719 } 14720 if x.AuxInt != i-2 { 14721 break 14722 } 14723 if x.Aux != s { 14724 break 14725 } 14726 _ = x.Args[3] 14727 if idx != x.Args[0] { 14728 break 14729 } 14730 if p != x.Args[1] { 14731 break 14732 } 14733 w0 := x.Args[2] 14734 if w0.Op != OpS390XSRWconst { 14735 break 14736 } 14737 if w0.AuxInt != j-16 { 14738 break 14739 } 14740 if w != w0.Args[0] { 14741 break 14742 } 14743 mem := x.Args[3] 14744 if !(x.Uses == 1 && clobber(x)) { 14745 break 14746 } 14747 v.reset(OpS390XMOVWBRstoreidx) 14748 v.AuxInt = i - 2 14749 v.Aux = s 14750 v.AddArg(p) 14751 v.AddArg(idx) 14752 v.AddArg(w0) 14753 v.AddArg(mem) 14754 return true 14755 } 14756 return false 14757 } 14758 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 14759 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 14760 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 14761 // result: (MOVHZreg x) 14762 for { 14763 off := v.AuxInt 14764 sym := v.Aux 14765 _ = v.Args[1] 14766 ptr := v.Args[0] 14767 v_1 := v.Args[1] 14768 if v_1.Op != OpS390XMOVHstore { 14769 break 14770 } 14771 off2 := v_1.AuxInt 14772 sym2 := v_1.Aux 14773 _ = v_1.Args[2] 14774 ptr2 := v_1.Args[0] 14775 x := v_1.Args[1] 14776 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 14777 break 14778 } 14779 v.reset(OpS390XMOVHZreg) 14780 v.AddArg(x) 14781 return true 14782 } 14783 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 14784 // cond: is20Bit(off1+off2) 14785 // result: (MOVHZload [off1+off2] {sym} ptr mem) 14786 for { 14787 off1 := v.AuxInt 14788 sym := v.Aux 14789 _ = v.Args[1] 14790 v_0 := v.Args[0] 14791 if v_0.Op != OpS390XADDconst { 14792 break 14793 } 14794 off2 := v_0.AuxInt 14795 ptr := v_0.Args[0] 14796 mem := v.Args[1] 14797 if !(is20Bit(off1 + off2)) { 14798 break 14799 } 14800 v.reset(OpS390XMOVHZload) 14801 v.AuxInt = off1 + off2 14802 v.Aux = sym 14803 v.AddArg(ptr) 14804 v.AddArg(mem) 14805 return true 14806 } 14807 // match: (MOVHZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 14808 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 14809 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14810 for { 14811 off1 := v.AuxInt 14812 sym1 := v.Aux 14813 _ = v.Args[1] 14814 v_0 := v.Args[0] 14815 if v_0.Op != OpS390XMOVDaddr { 14816 break 14817 } 14818 t := v_0.Type 14819 off2 := v_0.AuxInt 14820 sym2 := v_0.Aux 14821 base := v_0.Args[0] 14822 mem := v.Args[1] 14823 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 14824 break 14825 } 14826 v.reset(OpS390XMOVHZload) 14827 v.AuxInt = off1 + off2 14828 v.Aux = mergeSym(sym1, sym2) 14829 v.AddArg(base) 14830 v.AddArg(mem) 14831 return true 14832 } 14833 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 14834 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14835 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 14836 for { 14837 off1 := v.AuxInt 14838 sym1 := v.Aux 14839 _ = v.Args[1] 14840 v_0 := v.Args[0] 14841 if v_0.Op != OpS390XMOVDaddridx { 14842 break 14843 } 14844 off2 := v_0.AuxInt 14845 sym2 := v_0.Aux 14846 _ = v_0.Args[1] 14847 ptr := v_0.Args[0] 14848 idx := v_0.Args[1] 14849 mem := v.Args[1] 14850 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14851 break 14852 } 14853 v.reset(OpS390XMOVHZloadidx) 14854 v.AuxInt = off1 + off2 14855 v.Aux = mergeSym(sym1, sym2) 14856 v.AddArg(ptr) 14857 v.AddArg(idx) 14858 v.AddArg(mem) 14859 return true 14860 } 14861 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 14862 // cond: ptr.Op != OpSB 14863 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 14864 for { 14865 off := v.AuxInt 14866 sym := v.Aux 14867 _ = v.Args[1] 14868 v_0 := v.Args[0] 14869 if v_0.Op != OpS390XADD { 14870 break 14871 } 14872 _ = v_0.Args[1] 14873 ptr := v_0.Args[0] 14874 idx := v_0.Args[1] 14875 mem := v.Args[1] 14876 if !(ptr.Op != OpSB) { 14877 break 14878 } 14879 v.reset(OpS390XMOVHZloadidx) 14880 v.AuxInt = off 14881 v.Aux = sym 14882 v.AddArg(ptr) 14883 v.AddArg(idx) 14884 v.AddArg(mem) 14885 return true 14886 } 14887 return false 14888 } 14889 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 14890 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 14891 // cond: 14892 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14893 for { 14894 c := v.AuxInt 14895 sym := v.Aux 14896 _ = v.Args[2] 14897 v_0 := v.Args[0] 14898 if v_0.Op != OpS390XADDconst { 14899 break 14900 } 14901 d := v_0.AuxInt 14902 ptr := v_0.Args[0] 14903 idx := v.Args[1] 14904 mem := v.Args[2] 14905 v.reset(OpS390XMOVHZloadidx) 14906 v.AuxInt = c + d 14907 v.Aux = sym 14908 v.AddArg(ptr) 14909 v.AddArg(idx) 14910 v.AddArg(mem) 14911 return true 14912 } 14913 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 14914 // cond: 14915 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14916 for { 14917 c := v.AuxInt 14918 sym := v.Aux 14919 _ = v.Args[2] 14920 idx := v.Args[0] 14921 v_1 := v.Args[1] 14922 if v_1.Op != OpS390XADDconst { 14923 break 14924 } 14925 d := v_1.AuxInt 14926 ptr := v_1.Args[0] 14927 mem := v.Args[2] 14928 v.reset(OpS390XMOVHZloadidx) 14929 v.AuxInt = c + d 14930 v.Aux = sym 14931 v.AddArg(ptr) 14932 v.AddArg(idx) 14933 v.AddArg(mem) 14934 return true 14935 } 14936 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 14937 // cond: 14938 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14939 for { 14940 c := v.AuxInt 14941 sym := v.Aux 14942 _ = v.Args[2] 14943 ptr := v.Args[0] 14944 v_1 := v.Args[1] 14945 if v_1.Op != OpS390XADDconst { 14946 break 14947 } 14948 d := v_1.AuxInt 14949 idx := v_1.Args[0] 14950 mem := v.Args[2] 14951 v.reset(OpS390XMOVHZloadidx) 14952 v.AuxInt = c + d 14953 v.Aux = sym 14954 v.AddArg(ptr) 14955 v.AddArg(idx) 14956 v.AddArg(mem) 14957 return true 14958 } 14959 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 14960 // cond: 14961 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14962 for { 14963 c := v.AuxInt 14964 sym := v.Aux 14965 _ = v.Args[2] 14966 v_0 := v.Args[0] 14967 if v_0.Op != OpS390XADDconst { 14968 break 14969 } 14970 d := v_0.AuxInt 14971 idx := v_0.Args[0] 14972 ptr := v.Args[1] 14973 mem := v.Args[2] 14974 v.reset(OpS390XMOVHZloadidx) 14975 v.AuxInt = c + d 14976 v.Aux = sym 14977 v.AddArg(ptr) 14978 v.AddArg(idx) 14979 v.AddArg(mem) 14980 return true 14981 } 14982 return false 14983 } 14984 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 14985 b := v.Block 14986 _ = b 14987 // match: (MOVHZreg x:(MOVBZload _ _)) 14988 // cond: 14989 // result: (MOVDreg x) 14990 for { 14991 x := v.Args[0] 14992 if x.Op != OpS390XMOVBZload { 14993 break 14994 } 14995 _ = x.Args[1] 14996 v.reset(OpS390XMOVDreg) 14997 v.AddArg(x) 14998 return true 14999 } 15000 // match: (MOVHZreg x:(MOVHZload _ _)) 15001 // cond: 15002 // result: (MOVDreg x) 15003 for { 15004 x := v.Args[0] 15005 if x.Op != OpS390XMOVHZload { 15006 break 15007 } 15008 _ = x.Args[1] 15009 v.reset(OpS390XMOVDreg) 15010 v.AddArg(x) 15011 return true 15012 } 15013 // match: (MOVHZreg x:(Arg <t>)) 15014 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 15015 // result: (MOVDreg x) 15016 for { 15017 x := v.Args[0] 15018 if x.Op != OpArg { 15019 break 15020 } 15021 t := x.Type 15022 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 15023 break 15024 } 15025 v.reset(OpS390XMOVDreg) 15026 v.AddArg(x) 15027 return true 15028 } 15029 // match: (MOVHZreg x:(MOVBZreg _)) 15030 // cond: 15031 // result: (MOVDreg x) 15032 for { 15033 x := v.Args[0] 15034 if x.Op != OpS390XMOVBZreg { 15035 break 15036 } 15037 v.reset(OpS390XMOVDreg) 15038 v.AddArg(x) 15039 return true 15040 } 15041 // match: (MOVHZreg x:(MOVHZreg _)) 15042 // cond: 15043 // result: (MOVDreg x) 15044 for { 15045 x := v.Args[0] 15046 if x.Op != OpS390XMOVHZreg { 15047 break 15048 } 15049 v.reset(OpS390XMOVDreg) 15050 v.AddArg(x) 15051 return true 15052 } 15053 // match: (MOVHZreg (MOVDconst [c])) 15054 // cond: 15055 // result: (MOVDconst [int64(uint16(c))]) 15056 for { 15057 v_0 := v.Args[0] 15058 if v_0.Op != OpS390XMOVDconst { 15059 break 15060 } 15061 c := v_0.AuxInt 15062 v.reset(OpS390XMOVDconst) 15063 v.AuxInt = int64(uint16(c)) 15064 return true 15065 } 15066 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 15067 // cond: x.Uses == 1 && clobber(x) 15068 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 15069 for { 15070 x := v.Args[0] 15071 if x.Op != OpS390XMOVHZload { 15072 break 15073 } 15074 off := x.AuxInt 15075 sym := x.Aux 15076 _ = x.Args[1] 15077 ptr := x.Args[0] 15078 mem := x.Args[1] 15079 if !(x.Uses == 1 && clobber(x)) { 15080 break 15081 } 15082 b = x.Block 15083 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 15084 v.reset(OpCopy) 15085 v.AddArg(v0) 15086 v0.AuxInt = off 15087 v0.Aux = sym 15088 v0.AddArg(ptr) 15089 v0.AddArg(mem) 15090 return true 15091 } 15092 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 15093 // cond: x.Uses == 1 && clobber(x) 15094 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 15095 for { 15096 x := v.Args[0] 15097 if x.Op != OpS390XMOVHZloadidx { 15098 break 15099 } 15100 off := x.AuxInt 15101 sym := x.Aux 15102 _ = x.Args[2] 15103 ptr := x.Args[0] 15104 idx := x.Args[1] 15105 mem := x.Args[2] 15106 if !(x.Uses == 1 && clobber(x)) { 15107 break 15108 } 15109 b = x.Block 15110 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 15111 v.reset(OpCopy) 15112 v.AddArg(v0) 15113 v0.AuxInt = off 15114 v0.Aux = sym 15115 v0.AddArg(ptr) 15116 v0.AddArg(idx) 15117 v0.AddArg(mem) 15118 return true 15119 } 15120 return false 15121 } 15122 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 15123 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 15124 // cond: is20Bit(off1+off2) 15125 // result: (MOVHload [off1+off2] {sym} ptr mem) 15126 for { 15127 off1 := v.AuxInt 15128 sym := v.Aux 15129 _ = v.Args[1] 15130 v_0 := v.Args[0] 15131 if v_0.Op != OpS390XADDconst { 15132 break 15133 } 15134 off2 := v_0.AuxInt 15135 ptr := v_0.Args[0] 15136 mem := v.Args[1] 15137 if !(is20Bit(off1 + off2)) { 15138 break 15139 } 15140 v.reset(OpS390XMOVHload) 15141 v.AuxInt = off1 + off2 15142 v.Aux = sym 15143 v.AddArg(ptr) 15144 v.AddArg(mem) 15145 return true 15146 } 15147 // match: (MOVHload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 15148 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 15149 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 15150 for { 15151 off1 := v.AuxInt 15152 sym1 := v.Aux 15153 _ = v.Args[1] 15154 v_0 := v.Args[0] 15155 if v_0.Op != OpS390XMOVDaddr { 15156 break 15157 } 15158 t := v_0.Type 15159 off2 := v_0.AuxInt 15160 sym2 := v_0.Aux 15161 base := v_0.Args[0] 15162 mem := v.Args[1] 15163 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 15164 break 15165 } 15166 v.reset(OpS390XMOVHload) 15167 v.AuxInt = off1 + off2 15168 v.Aux = mergeSym(sym1, sym2) 15169 v.AddArg(base) 15170 v.AddArg(mem) 15171 return true 15172 } 15173 return false 15174 } 15175 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 15176 b := v.Block 15177 _ = b 15178 // match: (MOVHreg x:(MOVBload _ _)) 15179 // cond: 15180 // result: (MOVDreg x) 15181 for { 15182 x := v.Args[0] 15183 if x.Op != OpS390XMOVBload { 15184 break 15185 } 15186 _ = x.Args[1] 15187 v.reset(OpS390XMOVDreg) 15188 v.AddArg(x) 15189 return true 15190 } 15191 // match: (MOVHreg x:(MOVBZload _ _)) 15192 // cond: 15193 // result: (MOVDreg x) 15194 for { 15195 x := v.Args[0] 15196 if x.Op != OpS390XMOVBZload { 15197 break 15198 } 15199 _ = x.Args[1] 15200 v.reset(OpS390XMOVDreg) 15201 v.AddArg(x) 15202 return true 15203 } 15204 // match: (MOVHreg x:(MOVHload _ _)) 15205 // cond: 15206 // result: (MOVDreg x) 15207 for { 15208 x := v.Args[0] 15209 if x.Op != OpS390XMOVHload { 15210 break 15211 } 15212 _ = x.Args[1] 15213 v.reset(OpS390XMOVDreg) 15214 v.AddArg(x) 15215 return true 15216 } 15217 // match: (MOVHreg x:(Arg <t>)) 15218 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 15219 // result: (MOVDreg x) 15220 for { 15221 x := v.Args[0] 15222 if x.Op != OpArg { 15223 break 15224 } 15225 t := x.Type 15226 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 15227 break 15228 } 15229 v.reset(OpS390XMOVDreg) 15230 v.AddArg(x) 15231 return true 15232 } 15233 // match: (MOVHreg x:(MOVBreg _)) 15234 // cond: 15235 // result: (MOVDreg x) 15236 for { 15237 x := v.Args[0] 15238 if x.Op != OpS390XMOVBreg { 15239 break 15240 } 15241 v.reset(OpS390XMOVDreg) 15242 v.AddArg(x) 15243 return true 15244 } 15245 // match: (MOVHreg x:(MOVBZreg _)) 15246 // cond: 15247 // result: (MOVDreg x) 15248 for { 15249 x := v.Args[0] 15250 if x.Op != OpS390XMOVBZreg { 15251 break 15252 } 15253 v.reset(OpS390XMOVDreg) 15254 v.AddArg(x) 15255 return true 15256 } 15257 // match: (MOVHreg x:(MOVHreg _)) 15258 // cond: 15259 // result: (MOVDreg x) 15260 for { 15261 x := v.Args[0] 15262 if x.Op != OpS390XMOVHreg { 15263 break 15264 } 15265 v.reset(OpS390XMOVDreg) 15266 v.AddArg(x) 15267 return true 15268 } 15269 // match: (MOVHreg (MOVDconst [c])) 15270 // cond: 15271 // result: (MOVDconst [int64(int16(c))]) 15272 for { 15273 v_0 := v.Args[0] 15274 if v_0.Op != OpS390XMOVDconst { 15275 break 15276 } 15277 c := v_0.AuxInt 15278 v.reset(OpS390XMOVDconst) 15279 v.AuxInt = int64(int16(c)) 15280 return true 15281 } 15282 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 15283 // cond: x.Uses == 1 && clobber(x) 15284 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 15285 for { 15286 x := v.Args[0] 15287 if x.Op != OpS390XMOVHZload { 15288 break 15289 } 15290 off := x.AuxInt 15291 sym := x.Aux 15292 _ = x.Args[1] 15293 ptr := x.Args[0] 15294 mem := x.Args[1] 15295 if !(x.Uses == 1 && clobber(x)) { 15296 break 15297 } 15298 b = x.Block 15299 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 15300 v.reset(OpCopy) 15301 v.AddArg(v0) 15302 v0.AuxInt = off 15303 v0.Aux = sym 15304 v0.AddArg(ptr) 15305 v0.AddArg(mem) 15306 return true 15307 } 15308 return false 15309 } 15310 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 15311 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 15312 // cond: 15313 // result: (MOVHstore [off] {sym} ptr x mem) 15314 for { 15315 off := v.AuxInt 15316 sym := v.Aux 15317 _ = v.Args[2] 15318 ptr := v.Args[0] 15319 v_1 := v.Args[1] 15320 if v_1.Op != OpS390XMOVHreg { 15321 break 15322 } 15323 x := v_1.Args[0] 15324 mem := v.Args[2] 15325 v.reset(OpS390XMOVHstore) 15326 v.AuxInt = off 15327 v.Aux = sym 15328 v.AddArg(ptr) 15329 v.AddArg(x) 15330 v.AddArg(mem) 15331 return true 15332 } 15333 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 15334 // cond: 15335 // result: (MOVHstore [off] {sym} ptr x mem) 15336 for { 15337 off := v.AuxInt 15338 sym := v.Aux 15339 _ = v.Args[2] 15340 ptr := v.Args[0] 15341 v_1 := v.Args[1] 15342 if v_1.Op != OpS390XMOVHZreg { 15343 break 15344 } 15345 x := v_1.Args[0] 15346 mem := v.Args[2] 15347 v.reset(OpS390XMOVHstore) 15348 v.AuxInt = off 15349 v.Aux = sym 15350 v.AddArg(ptr) 15351 v.AddArg(x) 15352 v.AddArg(mem) 15353 return true 15354 } 15355 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 15356 // cond: is20Bit(off1+off2) 15357 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 15358 for { 15359 off1 := v.AuxInt 15360 sym := v.Aux 15361 _ = v.Args[2] 15362 v_0 := v.Args[0] 15363 if v_0.Op != OpS390XADDconst { 15364 break 15365 } 15366 off2 := v_0.AuxInt 15367 ptr := v_0.Args[0] 15368 val := v.Args[1] 15369 mem := v.Args[2] 15370 if !(is20Bit(off1 + off2)) { 15371 break 15372 } 15373 v.reset(OpS390XMOVHstore) 15374 v.AuxInt = off1 + off2 15375 v.Aux = sym 15376 v.AddArg(ptr) 15377 v.AddArg(val) 15378 v.AddArg(mem) 15379 return true 15380 } 15381 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 15382 // cond: isU12Bit(off) && ptr.Op != OpSB 15383 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 15384 for { 15385 off := v.AuxInt 15386 sym := v.Aux 15387 _ = v.Args[2] 15388 ptr := v.Args[0] 15389 v_1 := v.Args[1] 15390 if v_1.Op != OpS390XMOVDconst { 15391 break 15392 } 15393 c := v_1.AuxInt 15394 mem := v.Args[2] 15395 if !(isU12Bit(off) && ptr.Op != OpSB) { 15396 break 15397 } 15398 v.reset(OpS390XMOVHstoreconst) 15399 v.AuxInt = makeValAndOff(int64(int16(c)), off) 15400 v.Aux = sym 15401 v.AddArg(ptr) 15402 v.AddArg(mem) 15403 return true 15404 } 15405 // match: (MOVHstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 15406 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0)) 15407 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 15408 for { 15409 off1 := v.AuxInt 15410 sym1 := v.Aux 15411 _ = v.Args[2] 15412 v_0 := v.Args[0] 15413 if v_0.Op != OpS390XMOVDaddr { 15414 break 15415 } 15416 t := v_0.Type 15417 off2 := v_0.AuxInt 15418 sym2 := v_0.Aux 15419 base := v_0.Args[0] 15420 val := v.Args[1] 15421 mem := v.Args[2] 15422 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { 15423 break 15424 } 15425 v.reset(OpS390XMOVHstore) 15426 v.AuxInt = off1 + off2 15427 v.Aux = mergeSym(sym1, sym2) 15428 v.AddArg(base) 15429 v.AddArg(val) 15430 v.AddArg(mem) 15431 return true 15432 } 15433 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 15434 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15435 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 15436 for { 15437 off1 := v.AuxInt 15438 sym1 := v.Aux 15439 _ = v.Args[2] 15440 v_0 := v.Args[0] 15441 if v_0.Op != OpS390XMOVDaddridx { 15442 break 15443 } 15444 off2 := v_0.AuxInt 15445 sym2 := v_0.Aux 15446 _ = v_0.Args[1] 15447 ptr := v_0.Args[0] 15448 idx := v_0.Args[1] 15449 val := v.Args[1] 15450 mem := v.Args[2] 15451 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15452 break 15453 } 15454 v.reset(OpS390XMOVHstoreidx) 15455 v.AuxInt = off1 + off2 15456 v.Aux = mergeSym(sym1, sym2) 15457 v.AddArg(ptr) 15458 v.AddArg(idx) 15459 v.AddArg(val) 15460 v.AddArg(mem) 15461 return true 15462 } 15463 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 15464 // cond: ptr.Op != OpSB 15465 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 15466 for { 15467 off := v.AuxInt 15468 sym := v.Aux 15469 _ = v.Args[2] 15470 v_0 := v.Args[0] 15471 if v_0.Op != OpS390XADD { 15472 break 15473 } 15474 _ = v_0.Args[1] 15475 ptr := v_0.Args[0] 15476 idx := v_0.Args[1] 15477 val := v.Args[1] 15478 mem := v.Args[2] 15479 if !(ptr.Op != OpSB) { 15480 break 15481 } 15482 v.reset(OpS390XMOVHstoreidx) 15483 v.AuxInt = off 15484 v.Aux = sym 15485 v.AddArg(ptr) 15486 v.AddArg(idx) 15487 v.AddArg(val) 15488 v.AddArg(mem) 15489 return true 15490 } 15491 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 15492 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15493 // result: (MOVWstore [i-2] {s} p w mem) 15494 for { 15495 i := v.AuxInt 15496 s := v.Aux 15497 _ = v.Args[2] 15498 p := v.Args[0] 15499 w := v.Args[1] 15500 x := v.Args[2] 15501 if x.Op != OpS390XMOVHstore { 15502 break 15503 } 15504 if x.AuxInt != i-2 { 15505 break 15506 } 15507 if x.Aux != s { 15508 break 15509 } 15510 _ = x.Args[2] 15511 if p != x.Args[0] { 15512 break 15513 } 15514 x_1 := x.Args[1] 15515 if x_1.Op != OpS390XSRDconst { 15516 break 15517 } 15518 if x_1.AuxInt != 16 { 15519 break 15520 } 15521 if w != x_1.Args[0] { 15522 break 15523 } 15524 mem := x.Args[2] 15525 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15526 break 15527 } 15528 v.reset(OpS390XMOVWstore) 15529 v.AuxInt = i - 2 15530 v.Aux = s 15531 v.AddArg(p) 15532 v.AddArg(w) 15533 v.AddArg(mem) 15534 return true 15535 } 15536 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 15537 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15538 // result: (MOVWstore [i-2] {s} p w0 mem) 15539 for { 15540 i := v.AuxInt 15541 s := v.Aux 15542 _ = v.Args[2] 15543 p := v.Args[0] 15544 w0 := v.Args[1] 15545 if w0.Op != OpS390XSRDconst { 15546 break 15547 } 15548 j := w0.AuxInt 15549 w := w0.Args[0] 15550 x := v.Args[2] 15551 if x.Op != OpS390XMOVHstore { 15552 break 15553 } 15554 if x.AuxInt != i-2 { 15555 break 15556 } 15557 if x.Aux != s { 15558 break 15559 } 15560 _ = x.Args[2] 15561 if p != x.Args[0] { 15562 break 15563 } 15564 x_1 := x.Args[1] 15565 if x_1.Op != OpS390XSRDconst { 15566 break 15567 } 15568 if x_1.AuxInt != j+16 { 15569 break 15570 } 15571 if w != x_1.Args[0] { 15572 break 15573 } 15574 mem := x.Args[2] 15575 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15576 break 15577 } 15578 v.reset(OpS390XMOVWstore) 15579 v.AuxInt = i - 2 15580 v.Aux = s 15581 v.AddArg(p) 15582 v.AddArg(w0) 15583 v.AddArg(mem) 15584 return true 15585 } 15586 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 15587 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15588 // result: (MOVWstore [i-2] {s} p w mem) 15589 for { 15590 i := v.AuxInt 15591 s := v.Aux 15592 _ = v.Args[2] 15593 p := v.Args[0] 15594 w := v.Args[1] 15595 x := v.Args[2] 15596 if x.Op != OpS390XMOVHstore { 15597 break 15598 } 15599 if x.AuxInt != i-2 { 15600 break 15601 } 15602 if x.Aux != s { 15603 break 15604 } 15605 _ = x.Args[2] 15606 if p != x.Args[0] { 15607 break 15608 } 15609 x_1 := x.Args[1] 15610 if x_1.Op != OpS390XSRWconst { 15611 break 15612 } 15613 if x_1.AuxInt != 16 { 15614 break 15615 } 15616 if w != x_1.Args[0] { 15617 break 15618 } 15619 mem := x.Args[2] 15620 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15621 break 15622 } 15623 v.reset(OpS390XMOVWstore) 15624 v.AuxInt = i - 2 15625 v.Aux = s 15626 v.AddArg(p) 15627 v.AddArg(w) 15628 v.AddArg(mem) 15629 return true 15630 } 15631 return false 15632 } 15633 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 15634 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 15635 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15636 // result: (MOVWstore [i-2] {s} p w0 mem) 15637 for { 15638 i := v.AuxInt 15639 s := v.Aux 15640 _ = v.Args[2] 15641 p := v.Args[0] 15642 w0 := v.Args[1] 15643 if w0.Op != OpS390XSRWconst { 15644 break 15645 } 15646 j := w0.AuxInt 15647 w := w0.Args[0] 15648 x := v.Args[2] 15649 if x.Op != OpS390XMOVHstore { 15650 break 15651 } 15652 if x.AuxInt != i-2 { 15653 break 15654 } 15655 if x.Aux != s { 15656 break 15657 } 15658 _ = x.Args[2] 15659 if p != x.Args[0] { 15660 break 15661 } 15662 x_1 := x.Args[1] 15663 if x_1.Op != OpS390XSRWconst { 15664 break 15665 } 15666 if x_1.AuxInt != j+16 { 15667 break 15668 } 15669 if w != x_1.Args[0] { 15670 break 15671 } 15672 mem := x.Args[2] 15673 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15674 break 15675 } 15676 v.reset(OpS390XMOVWstore) 15677 v.AuxInt = i - 2 15678 v.Aux = s 15679 v.AddArg(p) 15680 v.AddArg(w0) 15681 v.AddArg(mem) 15682 return true 15683 } 15684 return false 15685 } 15686 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 15687 b := v.Block 15688 _ = b 15689 typ := &b.Func.Config.Types 15690 _ = typ 15691 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 15692 // cond: isU12Bit(ValAndOff(sc).Off()+off) 15693 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 15694 for { 15695 sc := v.AuxInt 15696 s := v.Aux 15697 _ = v.Args[1] 15698 v_0 := v.Args[0] 15699 if v_0.Op != OpS390XADDconst { 15700 break 15701 } 15702 off := v_0.AuxInt 15703 ptr := v_0.Args[0] 15704 mem := v.Args[1] 15705 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 15706 break 15707 } 15708 v.reset(OpS390XMOVHstoreconst) 15709 v.AuxInt = ValAndOff(sc).add(off) 15710 v.Aux = s 15711 v.AddArg(ptr) 15712 v.AddArg(mem) 15713 return true 15714 } 15715 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 15716 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 15717 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 15718 for { 15719 sc := v.AuxInt 15720 sym1 := v.Aux 15721 _ = v.Args[1] 15722 v_0 := v.Args[0] 15723 if v_0.Op != OpS390XMOVDaddr { 15724 break 15725 } 15726 off := v_0.AuxInt 15727 sym2 := v_0.Aux 15728 ptr := v_0.Args[0] 15729 mem := v.Args[1] 15730 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 15731 break 15732 } 15733 v.reset(OpS390XMOVHstoreconst) 15734 v.AuxInt = ValAndOff(sc).add(off) 15735 v.Aux = mergeSym(sym1, sym2) 15736 v.AddArg(ptr) 15737 v.AddArg(mem) 15738 return true 15739 } 15740 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 15741 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 15742 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 15743 for { 15744 c := v.AuxInt 15745 s := v.Aux 15746 _ = v.Args[1] 15747 p := v.Args[0] 15748 x := v.Args[1] 15749 if x.Op != OpS390XMOVHstoreconst { 15750 break 15751 } 15752 a := x.AuxInt 15753 if x.Aux != s { 15754 break 15755 } 15756 _ = x.Args[1] 15757 if p != x.Args[0] { 15758 break 15759 } 15760 mem := x.Args[1] 15761 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 15762 break 15763 } 15764 v.reset(OpS390XMOVWstore) 15765 v.AuxInt = ValAndOff(a).Off() 15766 v.Aux = s 15767 v.AddArg(p) 15768 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 15769 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 15770 v.AddArg(v0) 15771 v.AddArg(mem) 15772 return true 15773 } 15774 return false 15775 } 15776 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 15777 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 15778 // cond: 15779 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15780 for { 15781 c := v.AuxInt 15782 sym := v.Aux 15783 _ = v.Args[3] 15784 v_0 := v.Args[0] 15785 if v_0.Op != OpS390XADDconst { 15786 break 15787 } 15788 d := v_0.AuxInt 15789 ptr := v_0.Args[0] 15790 idx := v.Args[1] 15791 val := v.Args[2] 15792 mem := v.Args[3] 15793 v.reset(OpS390XMOVHstoreidx) 15794 v.AuxInt = c + d 15795 v.Aux = sym 15796 v.AddArg(ptr) 15797 v.AddArg(idx) 15798 v.AddArg(val) 15799 v.AddArg(mem) 15800 return true 15801 } 15802 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 15803 // cond: 15804 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15805 for { 15806 c := v.AuxInt 15807 sym := v.Aux 15808 _ = v.Args[3] 15809 idx := v.Args[0] 15810 v_1 := v.Args[1] 15811 if v_1.Op != OpS390XADDconst { 15812 break 15813 } 15814 d := v_1.AuxInt 15815 ptr := v_1.Args[0] 15816 val := v.Args[2] 15817 mem := v.Args[3] 15818 v.reset(OpS390XMOVHstoreidx) 15819 v.AuxInt = c + d 15820 v.Aux = sym 15821 v.AddArg(ptr) 15822 v.AddArg(idx) 15823 v.AddArg(val) 15824 v.AddArg(mem) 15825 return true 15826 } 15827 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 15828 // cond: 15829 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15830 for { 15831 c := v.AuxInt 15832 sym := v.Aux 15833 _ = v.Args[3] 15834 ptr := v.Args[0] 15835 v_1 := v.Args[1] 15836 if v_1.Op != OpS390XADDconst { 15837 break 15838 } 15839 d := v_1.AuxInt 15840 idx := v_1.Args[0] 15841 val := v.Args[2] 15842 mem := v.Args[3] 15843 v.reset(OpS390XMOVHstoreidx) 15844 v.AuxInt = c + d 15845 v.Aux = sym 15846 v.AddArg(ptr) 15847 v.AddArg(idx) 15848 v.AddArg(val) 15849 v.AddArg(mem) 15850 return true 15851 } 15852 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15853 // cond: 15854 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15855 for { 15856 c := v.AuxInt 15857 sym := v.Aux 15858 _ = v.Args[3] 15859 v_0 := v.Args[0] 15860 if v_0.Op != OpS390XADDconst { 15861 break 15862 } 15863 d := v_0.AuxInt 15864 idx := v_0.Args[0] 15865 ptr := v.Args[1] 15866 val := v.Args[2] 15867 mem := v.Args[3] 15868 v.reset(OpS390XMOVHstoreidx) 15869 v.AuxInt = c + d 15870 v.Aux = sym 15871 v.AddArg(ptr) 15872 v.AddArg(idx) 15873 v.AddArg(val) 15874 v.AddArg(mem) 15875 return true 15876 } 15877 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15878 // cond: x.Uses == 1 && clobber(x) 15879 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15880 for { 15881 i := v.AuxInt 15882 s := v.Aux 15883 _ = v.Args[3] 15884 p := v.Args[0] 15885 idx := v.Args[1] 15886 w := v.Args[2] 15887 x := v.Args[3] 15888 if x.Op != OpS390XMOVHstoreidx { 15889 break 15890 } 15891 if x.AuxInt != i-2 { 15892 break 15893 } 15894 if x.Aux != s { 15895 break 15896 } 15897 _ = x.Args[3] 15898 if p != x.Args[0] { 15899 break 15900 } 15901 if idx != x.Args[1] { 15902 break 15903 } 15904 x_2 := x.Args[2] 15905 if x_2.Op != OpS390XSRDconst { 15906 break 15907 } 15908 if x_2.AuxInt != 16 { 15909 break 15910 } 15911 if w != x_2.Args[0] { 15912 break 15913 } 15914 mem := x.Args[3] 15915 if !(x.Uses == 1 && clobber(x)) { 15916 break 15917 } 15918 v.reset(OpS390XMOVWstoreidx) 15919 v.AuxInt = i - 2 15920 v.Aux = s 15921 v.AddArg(p) 15922 v.AddArg(idx) 15923 v.AddArg(w) 15924 v.AddArg(mem) 15925 return true 15926 } 15927 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15928 // cond: x.Uses == 1 && clobber(x) 15929 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15930 for { 15931 i := v.AuxInt 15932 s := v.Aux 15933 _ = v.Args[3] 15934 p := v.Args[0] 15935 idx := v.Args[1] 15936 w := v.Args[2] 15937 x := v.Args[3] 15938 if x.Op != OpS390XMOVHstoreidx { 15939 break 15940 } 15941 if x.AuxInt != i-2 { 15942 break 15943 } 15944 if x.Aux != s { 15945 break 15946 } 15947 _ = x.Args[3] 15948 if idx != x.Args[0] { 15949 break 15950 } 15951 if p != x.Args[1] { 15952 break 15953 } 15954 x_2 := x.Args[2] 15955 if x_2.Op != OpS390XSRDconst { 15956 break 15957 } 15958 if x_2.AuxInt != 16 { 15959 break 15960 } 15961 if w != x_2.Args[0] { 15962 break 15963 } 15964 mem := x.Args[3] 15965 if !(x.Uses == 1 && clobber(x)) { 15966 break 15967 } 15968 v.reset(OpS390XMOVWstoreidx) 15969 v.AuxInt = i - 2 15970 v.Aux = s 15971 v.AddArg(p) 15972 v.AddArg(idx) 15973 v.AddArg(w) 15974 v.AddArg(mem) 15975 return true 15976 } 15977 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15978 // cond: x.Uses == 1 && clobber(x) 15979 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15980 for { 15981 i := v.AuxInt 15982 s := v.Aux 15983 _ = v.Args[3] 15984 idx := v.Args[0] 15985 p := v.Args[1] 15986 w := v.Args[2] 15987 x := v.Args[3] 15988 if x.Op != OpS390XMOVHstoreidx { 15989 break 15990 } 15991 if x.AuxInt != i-2 { 15992 break 15993 } 15994 if x.Aux != s { 15995 break 15996 } 15997 _ = x.Args[3] 15998 if p != x.Args[0] { 15999 break 16000 } 16001 if idx != x.Args[1] { 16002 break 16003 } 16004 x_2 := x.Args[2] 16005 if x_2.Op != OpS390XSRDconst { 16006 break 16007 } 16008 if x_2.AuxInt != 16 { 16009 break 16010 } 16011 if w != x_2.Args[0] { 16012 break 16013 } 16014 mem := x.Args[3] 16015 if !(x.Uses == 1 && clobber(x)) { 16016 break 16017 } 16018 v.reset(OpS390XMOVWstoreidx) 16019 v.AuxInt = i - 2 16020 v.Aux = s 16021 v.AddArg(p) 16022 v.AddArg(idx) 16023 v.AddArg(w) 16024 v.AddArg(mem) 16025 return true 16026 } 16027 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 16028 // cond: x.Uses == 1 && clobber(x) 16029 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16030 for { 16031 i := v.AuxInt 16032 s := v.Aux 16033 _ = v.Args[3] 16034 idx := v.Args[0] 16035 p := v.Args[1] 16036 w := v.Args[2] 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 idx != x.Args[0] { 16049 break 16050 } 16051 if p != 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 != 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(w) 16074 v.AddArg(mem) 16075 return true 16076 } 16077 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (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 p != x.Args[0] { 16104 break 16105 } 16106 if idx != 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 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16133 // cond: x.Uses == 1 && clobber(x) 16134 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16135 for { 16136 i := v.AuxInt 16137 s := v.Aux 16138 _ = v.Args[3] 16139 p := v.Args[0] 16140 idx := v.Args[1] 16141 w0 := v.Args[2] 16142 if w0.Op != OpS390XSRDconst { 16143 break 16144 } 16145 j := w0.AuxInt 16146 w := w0.Args[0] 16147 x := v.Args[3] 16148 if x.Op != OpS390XMOVHstoreidx { 16149 break 16150 } 16151 if x.AuxInt != i-2 { 16152 break 16153 } 16154 if x.Aux != s { 16155 break 16156 } 16157 _ = x.Args[3] 16158 if idx != x.Args[0] { 16159 break 16160 } 16161 if p != x.Args[1] { 16162 break 16163 } 16164 x_2 := x.Args[2] 16165 if x_2.Op != OpS390XSRDconst { 16166 break 16167 } 16168 if x_2.AuxInt != j+16 { 16169 break 16170 } 16171 if w != x_2.Args[0] { 16172 break 16173 } 16174 mem := x.Args[3] 16175 if !(x.Uses == 1 && clobber(x)) { 16176 break 16177 } 16178 v.reset(OpS390XMOVWstoreidx) 16179 v.AuxInt = i - 2 16180 v.Aux = s 16181 v.AddArg(p) 16182 v.AddArg(idx) 16183 v.AddArg(w0) 16184 v.AddArg(mem) 16185 return true 16186 } 16187 return false 16188 } 16189 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 16190 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (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 p != x.Args[0] { 16217 break 16218 } 16219 if idx != 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} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16246 // cond: x.Uses == 1 && clobber(x) 16247 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16248 for { 16249 i := v.AuxInt 16250 s := v.Aux 16251 _ = v.Args[3] 16252 idx := v.Args[0] 16253 p := v.Args[1] 16254 w0 := v.Args[2] 16255 if w0.Op != OpS390XSRDconst { 16256 break 16257 } 16258 j := w0.AuxInt 16259 w := w0.Args[0] 16260 x := v.Args[3] 16261 if x.Op != OpS390XMOVHstoreidx { 16262 break 16263 } 16264 if x.AuxInt != i-2 { 16265 break 16266 } 16267 if x.Aux != s { 16268 break 16269 } 16270 _ = x.Args[3] 16271 if idx != x.Args[0] { 16272 break 16273 } 16274 if p != x.Args[1] { 16275 break 16276 } 16277 x_2 := x.Args[2] 16278 if x_2.Op != OpS390XSRDconst { 16279 break 16280 } 16281 if x_2.AuxInt != j+16 { 16282 break 16283 } 16284 if w != x_2.Args[0] { 16285 break 16286 } 16287 mem := x.Args[3] 16288 if !(x.Uses == 1 && clobber(x)) { 16289 break 16290 } 16291 v.reset(OpS390XMOVWstoreidx) 16292 v.AuxInt = i - 2 16293 v.Aux = s 16294 v.AddArg(p) 16295 v.AddArg(idx) 16296 v.AddArg(w0) 16297 v.AddArg(mem) 16298 return true 16299 } 16300 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16301 // cond: x.Uses == 1 && clobber(x) 16302 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16303 for { 16304 i := v.AuxInt 16305 s := v.Aux 16306 _ = v.Args[3] 16307 p := v.Args[0] 16308 idx := v.Args[1] 16309 w := v.Args[2] 16310 x := v.Args[3] 16311 if x.Op != OpS390XMOVHstoreidx { 16312 break 16313 } 16314 if x.AuxInt != i-2 { 16315 break 16316 } 16317 if x.Aux != s { 16318 break 16319 } 16320 _ = x.Args[3] 16321 if p != x.Args[0] { 16322 break 16323 } 16324 if idx != x.Args[1] { 16325 break 16326 } 16327 x_2 := x.Args[2] 16328 if x_2.Op != OpS390XSRWconst { 16329 break 16330 } 16331 if x_2.AuxInt != 16 { 16332 break 16333 } 16334 if w != x_2.Args[0] { 16335 break 16336 } 16337 mem := x.Args[3] 16338 if !(x.Uses == 1 && clobber(x)) { 16339 break 16340 } 16341 v.reset(OpS390XMOVWstoreidx) 16342 v.AuxInt = i - 2 16343 v.Aux = s 16344 v.AddArg(p) 16345 v.AddArg(idx) 16346 v.AddArg(w) 16347 v.AddArg(mem) 16348 return true 16349 } 16350 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16351 // cond: x.Uses == 1 && clobber(x) 16352 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16353 for { 16354 i := v.AuxInt 16355 s := v.Aux 16356 _ = v.Args[3] 16357 p := v.Args[0] 16358 idx := v.Args[1] 16359 w := v.Args[2] 16360 x := v.Args[3] 16361 if x.Op != OpS390XMOVHstoreidx { 16362 break 16363 } 16364 if x.AuxInt != i-2 { 16365 break 16366 } 16367 if x.Aux != s { 16368 break 16369 } 16370 _ = x.Args[3] 16371 if idx != x.Args[0] { 16372 break 16373 } 16374 if p != x.Args[1] { 16375 break 16376 } 16377 x_2 := x.Args[2] 16378 if x_2.Op != OpS390XSRWconst { 16379 break 16380 } 16381 if x_2.AuxInt != 16 { 16382 break 16383 } 16384 if w != x_2.Args[0] { 16385 break 16386 } 16387 mem := x.Args[3] 16388 if !(x.Uses == 1 && clobber(x)) { 16389 break 16390 } 16391 v.reset(OpS390XMOVWstoreidx) 16392 v.AuxInt = i - 2 16393 v.Aux = s 16394 v.AddArg(p) 16395 v.AddArg(idx) 16396 v.AddArg(w) 16397 v.AddArg(mem) 16398 return true 16399 } 16400 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16401 // cond: x.Uses == 1 && clobber(x) 16402 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16403 for { 16404 i := v.AuxInt 16405 s := v.Aux 16406 _ = v.Args[3] 16407 idx := v.Args[0] 16408 p := v.Args[1] 16409 w := v.Args[2] 16410 x := v.Args[3] 16411 if x.Op != OpS390XMOVHstoreidx { 16412 break 16413 } 16414 if x.AuxInt != i-2 { 16415 break 16416 } 16417 if x.Aux != s { 16418 break 16419 } 16420 _ = x.Args[3] 16421 if p != x.Args[0] { 16422 break 16423 } 16424 if idx != x.Args[1] { 16425 break 16426 } 16427 x_2 := x.Args[2] 16428 if x_2.Op != OpS390XSRWconst { 16429 break 16430 } 16431 if x_2.AuxInt != 16 { 16432 break 16433 } 16434 if w != x_2.Args[0] { 16435 break 16436 } 16437 mem := x.Args[3] 16438 if !(x.Uses == 1 && clobber(x)) { 16439 break 16440 } 16441 v.reset(OpS390XMOVWstoreidx) 16442 v.AuxInt = i - 2 16443 v.Aux = s 16444 v.AddArg(p) 16445 v.AddArg(idx) 16446 v.AddArg(w) 16447 v.AddArg(mem) 16448 return true 16449 } 16450 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16451 // cond: x.Uses == 1 && clobber(x) 16452 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16453 for { 16454 i := v.AuxInt 16455 s := v.Aux 16456 _ = v.Args[3] 16457 idx := v.Args[0] 16458 p := v.Args[1] 16459 w := v.Args[2] 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 idx != x.Args[0] { 16472 break 16473 } 16474 if p != 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 != 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(w) 16497 v.AddArg(mem) 16498 return true 16499 } 16500 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (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 p != x.Args[0] { 16527 break 16528 } 16529 if idx != 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} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (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 p := v.Args[0] 16563 idx := 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 idx != x.Args[0] { 16582 break 16583 } 16584 if p != 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} p idx (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 p != x.Args[0] { 16637 break 16638 } 16639 if idx != 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 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 16666 // cond: x.Uses == 1 && clobber(x) 16667 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16668 for { 16669 i := v.AuxInt 16670 s := v.Aux 16671 _ = v.Args[3] 16672 idx := v.Args[0] 16673 p := v.Args[1] 16674 w0 := v.Args[2] 16675 if w0.Op != OpS390XSRWconst { 16676 break 16677 } 16678 j := w0.AuxInt 16679 w := w0.Args[0] 16680 x := v.Args[3] 16681 if x.Op != OpS390XMOVHstoreidx { 16682 break 16683 } 16684 if x.AuxInt != i-2 { 16685 break 16686 } 16687 if x.Aux != s { 16688 break 16689 } 16690 _ = x.Args[3] 16691 if idx != x.Args[0] { 16692 break 16693 } 16694 if p != x.Args[1] { 16695 break 16696 } 16697 x_2 := x.Args[2] 16698 if x_2.Op != OpS390XSRWconst { 16699 break 16700 } 16701 if x_2.AuxInt != j+16 { 16702 break 16703 } 16704 if w != x_2.Args[0] { 16705 break 16706 } 16707 mem := x.Args[3] 16708 if !(x.Uses == 1 && clobber(x)) { 16709 break 16710 } 16711 v.reset(OpS390XMOVWstoreidx) 16712 v.AuxInt = i - 2 16713 v.Aux = s 16714 v.AddArg(p) 16715 v.AddArg(idx) 16716 v.AddArg(w0) 16717 v.AddArg(mem) 16718 return true 16719 } 16720 return false 16721 } 16722 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 16723 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 16724 // cond: x.Uses == 1 && clobber(x) 16725 // result: (MOVDBRstore [i-4] {s} p w mem) 16726 for { 16727 i := v.AuxInt 16728 s := v.Aux 16729 _ = v.Args[2] 16730 p := v.Args[0] 16731 v_1 := v.Args[1] 16732 if v_1.Op != OpS390XSRDconst { 16733 break 16734 } 16735 if v_1.AuxInt != 32 { 16736 break 16737 } 16738 w := v_1.Args[0] 16739 x := v.Args[2] 16740 if x.Op != OpS390XMOVWBRstore { 16741 break 16742 } 16743 if x.AuxInt != i-4 { 16744 break 16745 } 16746 if x.Aux != s { 16747 break 16748 } 16749 _ = x.Args[2] 16750 if p != x.Args[0] { 16751 break 16752 } 16753 if w != x.Args[1] { 16754 break 16755 } 16756 mem := x.Args[2] 16757 if !(x.Uses == 1 && clobber(x)) { 16758 break 16759 } 16760 v.reset(OpS390XMOVDBRstore) 16761 v.AuxInt = i - 4 16762 v.Aux = s 16763 v.AddArg(p) 16764 v.AddArg(w) 16765 v.AddArg(mem) 16766 return true 16767 } 16768 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 16769 // cond: x.Uses == 1 && clobber(x) 16770 // result: (MOVDBRstore [i-4] {s} p w0 mem) 16771 for { 16772 i := v.AuxInt 16773 s := v.Aux 16774 _ = v.Args[2] 16775 p := v.Args[0] 16776 v_1 := v.Args[1] 16777 if v_1.Op != OpS390XSRDconst { 16778 break 16779 } 16780 j := v_1.AuxInt 16781 w := v_1.Args[0] 16782 x := v.Args[2] 16783 if x.Op != OpS390XMOVWBRstore { 16784 break 16785 } 16786 if x.AuxInt != i-4 { 16787 break 16788 } 16789 if x.Aux != s { 16790 break 16791 } 16792 _ = x.Args[2] 16793 if p != x.Args[0] { 16794 break 16795 } 16796 w0 := x.Args[1] 16797 if w0.Op != OpS390XSRDconst { 16798 break 16799 } 16800 if w0.AuxInt != j-32 { 16801 break 16802 } 16803 if w != w0.Args[0] { 16804 break 16805 } 16806 mem := x.Args[2] 16807 if !(x.Uses == 1 && clobber(x)) { 16808 break 16809 } 16810 v.reset(OpS390XMOVDBRstore) 16811 v.AuxInt = i - 4 16812 v.Aux = s 16813 v.AddArg(p) 16814 v.AddArg(w0) 16815 v.AddArg(mem) 16816 return true 16817 } 16818 return false 16819 } 16820 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 16821 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16822 // cond: x.Uses == 1 && clobber(x) 16823 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16824 for { 16825 i := v.AuxInt 16826 s := v.Aux 16827 _ = v.Args[3] 16828 p := v.Args[0] 16829 idx := v.Args[1] 16830 v_2 := v.Args[2] 16831 if v_2.Op != OpS390XSRDconst { 16832 break 16833 } 16834 if v_2.AuxInt != 32 { 16835 break 16836 } 16837 w := v_2.Args[0] 16838 x := v.Args[3] 16839 if x.Op != OpS390XMOVWBRstoreidx { 16840 break 16841 } 16842 if x.AuxInt != i-4 { 16843 break 16844 } 16845 if x.Aux != s { 16846 break 16847 } 16848 _ = x.Args[3] 16849 if p != x.Args[0] { 16850 break 16851 } 16852 if idx != x.Args[1] { 16853 break 16854 } 16855 if w != x.Args[2] { 16856 break 16857 } 16858 mem := x.Args[3] 16859 if !(x.Uses == 1 && clobber(x)) { 16860 break 16861 } 16862 v.reset(OpS390XMOVDBRstoreidx) 16863 v.AuxInt = i - 4 16864 v.Aux = s 16865 v.AddArg(p) 16866 v.AddArg(idx) 16867 v.AddArg(w) 16868 v.AddArg(mem) 16869 return true 16870 } 16871 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16872 // cond: x.Uses == 1 && clobber(x) 16873 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16874 for { 16875 i := v.AuxInt 16876 s := v.Aux 16877 _ = v.Args[3] 16878 p := v.Args[0] 16879 idx := v.Args[1] 16880 v_2 := v.Args[2] 16881 if v_2.Op != OpS390XSRDconst { 16882 break 16883 } 16884 if v_2.AuxInt != 32 { 16885 break 16886 } 16887 w := v_2.Args[0] 16888 x := v.Args[3] 16889 if x.Op != OpS390XMOVWBRstoreidx { 16890 break 16891 } 16892 if x.AuxInt != i-4 { 16893 break 16894 } 16895 if x.Aux != s { 16896 break 16897 } 16898 _ = x.Args[3] 16899 if idx != x.Args[0] { 16900 break 16901 } 16902 if p != x.Args[1] { 16903 break 16904 } 16905 if w != x.Args[2] { 16906 break 16907 } 16908 mem := x.Args[3] 16909 if !(x.Uses == 1 && clobber(x)) { 16910 break 16911 } 16912 v.reset(OpS390XMOVDBRstoreidx) 16913 v.AuxInt = i - 4 16914 v.Aux = s 16915 v.AddArg(p) 16916 v.AddArg(idx) 16917 v.AddArg(w) 16918 v.AddArg(mem) 16919 return true 16920 } 16921 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16922 // cond: x.Uses == 1 && clobber(x) 16923 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16924 for { 16925 i := v.AuxInt 16926 s := v.Aux 16927 _ = v.Args[3] 16928 idx := v.Args[0] 16929 p := v.Args[1] 16930 v_2 := v.Args[2] 16931 if v_2.Op != OpS390XSRDconst { 16932 break 16933 } 16934 if v_2.AuxInt != 32 { 16935 break 16936 } 16937 w := v_2.Args[0] 16938 x := v.Args[3] 16939 if x.Op != OpS390XMOVWBRstoreidx { 16940 break 16941 } 16942 if x.AuxInt != i-4 { 16943 break 16944 } 16945 if x.Aux != s { 16946 break 16947 } 16948 _ = x.Args[3] 16949 if p != x.Args[0] { 16950 break 16951 } 16952 if idx != x.Args[1] { 16953 break 16954 } 16955 if w != x.Args[2] { 16956 break 16957 } 16958 mem := x.Args[3] 16959 if !(x.Uses == 1 && clobber(x)) { 16960 break 16961 } 16962 v.reset(OpS390XMOVDBRstoreidx) 16963 v.AuxInt = i - 4 16964 v.Aux = s 16965 v.AddArg(p) 16966 v.AddArg(idx) 16967 v.AddArg(w) 16968 v.AddArg(mem) 16969 return true 16970 } 16971 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16972 // cond: x.Uses == 1 && clobber(x) 16973 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16974 for { 16975 i := v.AuxInt 16976 s := v.Aux 16977 _ = v.Args[3] 16978 idx := v.Args[0] 16979 p := v.Args[1] 16980 v_2 := v.Args[2] 16981 if v_2.Op != OpS390XSRDconst { 16982 break 16983 } 16984 if v_2.AuxInt != 32 { 16985 break 16986 } 16987 w := v_2.Args[0] 16988 x := v.Args[3] 16989 if x.Op != OpS390XMOVWBRstoreidx { 16990 break 16991 } 16992 if x.AuxInt != i-4 { 16993 break 16994 } 16995 if x.Aux != s { 16996 break 16997 } 16998 _ = x.Args[3] 16999 if idx != x.Args[0] { 17000 break 17001 } 17002 if p != x.Args[1] { 17003 break 17004 } 17005 if w != x.Args[2] { 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(w) 17018 v.AddArg(mem) 17019 return true 17020 } 17021 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx 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 p != x.Args[0] { 17048 break 17049 } 17050 if idx != 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} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p 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 p := v.Args[0] 17084 idx := 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 idx != x.Args[0] { 17103 break 17104 } 17105 if p != 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} p idx 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 p != x.Args[0] { 17158 break 17159 } 17160 if idx != 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 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 17187 // cond: x.Uses == 1 && clobber(x) 17188 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17189 for { 17190 i := v.AuxInt 17191 s := v.Aux 17192 _ = v.Args[3] 17193 idx := v.Args[0] 17194 p := v.Args[1] 17195 v_2 := v.Args[2] 17196 if v_2.Op != OpS390XSRDconst { 17197 break 17198 } 17199 j := v_2.AuxInt 17200 w := v_2.Args[0] 17201 x := v.Args[3] 17202 if x.Op != OpS390XMOVWBRstoreidx { 17203 break 17204 } 17205 if x.AuxInt != i-4 { 17206 break 17207 } 17208 if x.Aux != s { 17209 break 17210 } 17211 _ = x.Args[3] 17212 if idx != x.Args[0] { 17213 break 17214 } 17215 if p != x.Args[1] { 17216 break 17217 } 17218 w0 := x.Args[2] 17219 if w0.Op != OpS390XSRDconst { 17220 break 17221 } 17222 if w0.AuxInt != j-32 { 17223 break 17224 } 17225 if w != w0.Args[0] { 17226 break 17227 } 17228 mem := x.Args[3] 17229 if !(x.Uses == 1 && clobber(x)) { 17230 break 17231 } 17232 v.reset(OpS390XMOVDBRstoreidx) 17233 v.AuxInt = i - 4 17234 v.Aux = s 17235 v.AddArg(p) 17236 v.AddArg(idx) 17237 v.AddArg(w0) 17238 v.AddArg(mem) 17239 return true 17240 } 17241 return false 17242 } 17243 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 17244 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 17245 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 17246 // result: (MOVWZreg x) 17247 for { 17248 off := v.AuxInt 17249 sym := v.Aux 17250 _ = v.Args[1] 17251 ptr := v.Args[0] 17252 v_1 := v.Args[1] 17253 if v_1.Op != OpS390XMOVWstore { 17254 break 17255 } 17256 off2 := v_1.AuxInt 17257 sym2 := v_1.Aux 17258 _ = v_1.Args[2] 17259 ptr2 := v_1.Args[0] 17260 x := v_1.Args[1] 17261 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 17262 break 17263 } 17264 v.reset(OpS390XMOVWZreg) 17265 v.AddArg(x) 17266 return true 17267 } 17268 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 17269 // cond: is20Bit(off1+off2) 17270 // result: (MOVWZload [off1+off2] {sym} ptr mem) 17271 for { 17272 off1 := v.AuxInt 17273 sym := v.Aux 17274 _ = v.Args[1] 17275 v_0 := v.Args[0] 17276 if v_0.Op != OpS390XADDconst { 17277 break 17278 } 17279 off2 := v_0.AuxInt 17280 ptr := v_0.Args[0] 17281 mem := v.Args[1] 17282 if !(is20Bit(off1 + off2)) { 17283 break 17284 } 17285 v.reset(OpS390XMOVWZload) 17286 v.AuxInt = off1 + off2 17287 v.Aux = sym 17288 v.AddArg(ptr) 17289 v.AddArg(mem) 17290 return true 17291 } 17292 // match: (MOVWZload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17293 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17294 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17295 for { 17296 off1 := v.AuxInt 17297 sym1 := v.Aux 17298 _ = v.Args[1] 17299 v_0 := v.Args[0] 17300 if v_0.Op != OpS390XMOVDaddr { 17301 break 17302 } 17303 t := v_0.Type 17304 off2 := v_0.AuxInt 17305 sym2 := v_0.Aux 17306 base := v_0.Args[0] 17307 mem := v.Args[1] 17308 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17309 break 17310 } 17311 v.reset(OpS390XMOVWZload) 17312 v.AuxInt = off1 + off2 17313 v.Aux = mergeSym(sym1, sym2) 17314 v.AddArg(base) 17315 v.AddArg(mem) 17316 return true 17317 } 17318 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 17319 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17320 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 17321 for { 17322 off1 := v.AuxInt 17323 sym1 := v.Aux 17324 _ = v.Args[1] 17325 v_0 := v.Args[0] 17326 if v_0.Op != OpS390XMOVDaddridx { 17327 break 17328 } 17329 off2 := v_0.AuxInt 17330 sym2 := v_0.Aux 17331 _ = v_0.Args[1] 17332 ptr := v_0.Args[0] 17333 idx := v_0.Args[1] 17334 mem := v.Args[1] 17335 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17336 break 17337 } 17338 v.reset(OpS390XMOVWZloadidx) 17339 v.AuxInt = off1 + off2 17340 v.Aux = mergeSym(sym1, sym2) 17341 v.AddArg(ptr) 17342 v.AddArg(idx) 17343 v.AddArg(mem) 17344 return true 17345 } 17346 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 17347 // cond: ptr.Op != OpSB 17348 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 17349 for { 17350 off := v.AuxInt 17351 sym := v.Aux 17352 _ = v.Args[1] 17353 v_0 := v.Args[0] 17354 if v_0.Op != OpS390XADD { 17355 break 17356 } 17357 _ = v_0.Args[1] 17358 ptr := v_0.Args[0] 17359 idx := v_0.Args[1] 17360 mem := v.Args[1] 17361 if !(ptr.Op != OpSB) { 17362 break 17363 } 17364 v.reset(OpS390XMOVWZloadidx) 17365 v.AuxInt = off 17366 v.Aux = sym 17367 v.AddArg(ptr) 17368 v.AddArg(idx) 17369 v.AddArg(mem) 17370 return true 17371 } 17372 return false 17373 } 17374 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 17375 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 17376 // cond: 17377 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17378 for { 17379 c := v.AuxInt 17380 sym := v.Aux 17381 _ = v.Args[2] 17382 v_0 := v.Args[0] 17383 if v_0.Op != OpS390XADDconst { 17384 break 17385 } 17386 d := v_0.AuxInt 17387 ptr := v_0.Args[0] 17388 idx := v.Args[1] 17389 mem := v.Args[2] 17390 v.reset(OpS390XMOVWZloadidx) 17391 v.AuxInt = c + d 17392 v.Aux = sym 17393 v.AddArg(ptr) 17394 v.AddArg(idx) 17395 v.AddArg(mem) 17396 return true 17397 } 17398 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 17399 // cond: 17400 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17401 for { 17402 c := v.AuxInt 17403 sym := v.Aux 17404 _ = v.Args[2] 17405 idx := v.Args[0] 17406 v_1 := v.Args[1] 17407 if v_1.Op != OpS390XADDconst { 17408 break 17409 } 17410 d := v_1.AuxInt 17411 ptr := v_1.Args[0] 17412 mem := v.Args[2] 17413 v.reset(OpS390XMOVWZloadidx) 17414 v.AuxInt = c + d 17415 v.Aux = sym 17416 v.AddArg(ptr) 17417 v.AddArg(idx) 17418 v.AddArg(mem) 17419 return true 17420 } 17421 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 17422 // cond: 17423 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17424 for { 17425 c := v.AuxInt 17426 sym := v.Aux 17427 _ = v.Args[2] 17428 ptr := v.Args[0] 17429 v_1 := v.Args[1] 17430 if v_1.Op != OpS390XADDconst { 17431 break 17432 } 17433 d := v_1.AuxInt 17434 idx := v_1.Args[0] 17435 mem := v.Args[2] 17436 v.reset(OpS390XMOVWZloadidx) 17437 v.AuxInt = c + d 17438 v.Aux = sym 17439 v.AddArg(ptr) 17440 v.AddArg(idx) 17441 v.AddArg(mem) 17442 return true 17443 } 17444 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 17445 // cond: 17446 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17447 for { 17448 c := v.AuxInt 17449 sym := v.Aux 17450 _ = v.Args[2] 17451 v_0 := v.Args[0] 17452 if v_0.Op != OpS390XADDconst { 17453 break 17454 } 17455 d := v_0.AuxInt 17456 idx := v_0.Args[0] 17457 ptr := v.Args[1] 17458 mem := v.Args[2] 17459 v.reset(OpS390XMOVWZloadidx) 17460 v.AuxInt = c + d 17461 v.Aux = sym 17462 v.AddArg(ptr) 17463 v.AddArg(idx) 17464 v.AddArg(mem) 17465 return true 17466 } 17467 return false 17468 } 17469 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 17470 b := v.Block 17471 _ = b 17472 // match: (MOVWZreg x:(MOVBZload _ _)) 17473 // cond: 17474 // result: (MOVDreg x) 17475 for { 17476 x := v.Args[0] 17477 if x.Op != OpS390XMOVBZload { 17478 break 17479 } 17480 _ = x.Args[1] 17481 v.reset(OpS390XMOVDreg) 17482 v.AddArg(x) 17483 return true 17484 } 17485 // match: (MOVWZreg x:(MOVHZload _ _)) 17486 // cond: 17487 // result: (MOVDreg x) 17488 for { 17489 x := v.Args[0] 17490 if x.Op != OpS390XMOVHZload { 17491 break 17492 } 17493 _ = x.Args[1] 17494 v.reset(OpS390XMOVDreg) 17495 v.AddArg(x) 17496 return true 17497 } 17498 // match: (MOVWZreg x:(MOVWZload _ _)) 17499 // cond: 17500 // result: (MOVDreg x) 17501 for { 17502 x := v.Args[0] 17503 if x.Op != OpS390XMOVWZload { 17504 break 17505 } 17506 _ = x.Args[1] 17507 v.reset(OpS390XMOVDreg) 17508 v.AddArg(x) 17509 return true 17510 } 17511 // match: (MOVWZreg x:(Arg <t>)) 17512 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 17513 // result: (MOVDreg x) 17514 for { 17515 x := v.Args[0] 17516 if x.Op != OpArg { 17517 break 17518 } 17519 t := x.Type 17520 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 17521 break 17522 } 17523 v.reset(OpS390XMOVDreg) 17524 v.AddArg(x) 17525 return true 17526 } 17527 // match: (MOVWZreg x:(MOVBZreg _)) 17528 // cond: 17529 // result: (MOVDreg x) 17530 for { 17531 x := v.Args[0] 17532 if x.Op != OpS390XMOVBZreg { 17533 break 17534 } 17535 v.reset(OpS390XMOVDreg) 17536 v.AddArg(x) 17537 return true 17538 } 17539 // match: (MOVWZreg x:(MOVHZreg _)) 17540 // cond: 17541 // result: (MOVDreg x) 17542 for { 17543 x := v.Args[0] 17544 if x.Op != OpS390XMOVHZreg { 17545 break 17546 } 17547 v.reset(OpS390XMOVDreg) 17548 v.AddArg(x) 17549 return true 17550 } 17551 // match: (MOVWZreg x:(MOVWZreg _)) 17552 // cond: 17553 // result: (MOVDreg x) 17554 for { 17555 x := v.Args[0] 17556 if x.Op != OpS390XMOVWZreg { 17557 break 17558 } 17559 v.reset(OpS390XMOVDreg) 17560 v.AddArg(x) 17561 return true 17562 } 17563 // match: (MOVWZreg (MOVDconst [c])) 17564 // cond: 17565 // result: (MOVDconst [int64(uint32(c))]) 17566 for { 17567 v_0 := v.Args[0] 17568 if v_0.Op != OpS390XMOVDconst { 17569 break 17570 } 17571 c := v_0.AuxInt 17572 v.reset(OpS390XMOVDconst) 17573 v.AuxInt = int64(uint32(c)) 17574 return true 17575 } 17576 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 17577 // cond: x.Uses == 1 && clobber(x) 17578 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 17579 for { 17580 x := v.Args[0] 17581 if x.Op != OpS390XMOVWZload { 17582 break 17583 } 17584 off := x.AuxInt 17585 sym := x.Aux 17586 _ = x.Args[1] 17587 ptr := x.Args[0] 17588 mem := x.Args[1] 17589 if !(x.Uses == 1 && clobber(x)) { 17590 break 17591 } 17592 b = x.Block 17593 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 17594 v.reset(OpCopy) 17595 v.AddArg(v0) 17596 v0.AuxInt = off 17597 v0.Aux = sym 17598 v0.AddArg(ptr) 17599 v0.AddArg(mem) 17600 return true 17601 } 17602 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 17603 // cond: x.Uses == 1 && clobber(x) 17604 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 17605 for { 17606 x := v.Args[0] 17607 if x.Op != OpS390XMOVWZloadidx { 17608 break 17609 } 17610 off := x.AuxInt 17611 sym := x.Aux 17612 _ = x.Args[2] 17613 ptr := x.Args[0] 17614 idx := x.Args[1] 17615 mem := x.Args[2] 17616 if !(x.Uses == 1 && clobber(x)) { 17617 break 17618 } 17619 b = x.Block 17620 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 17621 v.reset(OpCopy) 17622 v.AddArg(v0) 17623 v0.AuxInt = off 17624 v0.Aux = sym 17625 v0.AddArg(ptr) 17626 v0.AddArg(idx) 17627 v0.AddArg(mem) 17628 return true 17629 } 17630 return false 17631 } 17632 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 17633 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 17634 // cond: is20Bit(off1+off2) 17635 // result: (MOVWload [off1+off2] {sym} ptr mem) 17636 for { 17637 off1 := v.AuxInt 17638 sym := v.Aux 17639 _ = v.Args[1] 17640 v_0 := v.Args[0] 17641 if v_0.Op != OpS390XADDconst { 17642 break 17643 } 17644 off2 := v_0.AuxInt 17645 ptr := v_0.Args[0] 17646 mem := v.Args[1] 17647 if !(is20Bit(off1 + off2)) { 17648 break 17649 } 17650 v.reset(OpS390XMOVWload) 17651 v.AuxInt = off1 + off2 17652 v.Aux = sym 17653 v.AddArg(ptr) 17654 v.AddArg(mem) 17655 return true 17656 } 17657 // match: (MOVWload [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) mem) 17658 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17659 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17660 for { 17661 off1 := v.AuxInt 17662 sym1 := v.Aux 17663 _ = v.Args[1] 17664 v_0 := v.Args[0] 17665 if v_0.Op != OpS390XMOVDaddr { 17666 break 17667 } 17668 t := v_0.Type 17669 off2 := v_0.AuxInt 17670 sym2 := v_0.Aux 17671 base := v_0.Args[0] 17672 mem := v.Args[1] 17673 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17674 break 17675 } 17676 v.reset(OpS390XMOVWload) 17677 v.AuxInt = off1 + off2 17678 v.Aux = mergeSym(sym1, sym2) 17679 v.AddArg(base) 17680 v.AddArg(mem) 17681 return true 17682 } 17683 return false 17684 } 17685 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 17686 // match: (MOVWreg x:(MOVBload _ _)) 17687 // cond: 17688 // result: (MOVDreg x) 17689 for { 17690 x := v.Args[0] 17691 if x.Op != OpS390XMOVBload { 17692 break 17693 } 17694 _ = x.Args[1] 17695 v.reset(OpS390XMOVDreg) 17696 v.AddArg(x) 17697 return true 17698 } 17699 // match: (MOVWreg x:(MOVBZload _ _)) 17700 // cond: 17701 // result: (MOVDreg x) 17702 for { 17703 x := v.Args[0] 17704 if x.Op != OpS390XMOVBZload { 17705 break 17706 } 17707 _ = x.Args[1] 17708 v.reset(OpS390XMOVDreg) 17709 v.AddArg(x) 17710 return true 17711 } 17712 // match: (MOVWreg x:(MOVHload _ _)) 17713 // cond: 17714 // result: (MOVDreg x) 17715 for { 17716 x := v.Args[0] 17717 if x.Op != OpS390XMOVHload { 17718 break 17719 } 17720 _ = x.Args[1] 17721 v.reset(OpS390XMOVDreg) 17722 v.AddArg(x) 17723 return true 17724 } 17725 // match: (MOVWreg x:(MOVHZload _ _)) 17726 // cond: 17727 // result: (MOVDreg x) 17728 for { 17729 x := v.Args[0] 17730 if x.Op != OpS390XMOVHZload { 17731 break 17732 } 17733 _ = x.Args[1] 17734 v.reset(OpS390XMOVDreg) 17735 v.AddArg(x) 17736 return true 17737 } 17738 // match: (MOVWreg x:(MOVWload _ _)) 17739 // cond: 17740 // result: (MOVDreg x) 17741 for { 17742 x := v.Args[0] 17743 if x.Op != OpS390XMOVWload { 17744 break 17745 } 17746 _ = x.Args[1] 17747 v.reset(OpS390XMOVDreg) 17748 v.AddArg(x) 17749 return true 17750 } 17751 // match: (MOVWreg x:(Arg <t>)) 17752 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 17753 // result: (MOVDreg x) 17754 for { 17755 x := v.Args[0] 17756 if x.Op != OpArg { 17757 break 17758 } 17759 t := x.Type 17760 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 17761 break 17762 } 17763 v.reset(OpS390XMOVDreg) 17764 v.AddArg(x) 17765 return true 17766 } 17767 // match: (MOVWreg x:(MOVBreg _)) 17768 // cond: 17769 // result: (MOVDreg x) 17770 for { 17771 x := v.Args[0] 17772 if x.Op != OpS390XMOVBreg { 17773 break 17774 } 17775 v.reset(OpS390XMOVDreg) 17776 v.AddArg(x) 17777 return true 17778 } 17779 // match: (MOVWreg x:(MOVBZreg _)) 17780 // cond: 17781 // result: (MOVDreg x) 17782 for { 17783 x := v.Args[0] 17784 if x.Op != OpS390XMOVBZreg { 17785 break 17786 } 17787 v.reset(OpS390XMOVDreg) 17788 v.AddArg(x) 17789 return true 17790 } 17791 // match: (MOVWreg x:(MOVHreg _)) 17792 // cond: 17793 // result: (MOVDreg x) 17794 for { 17795 x := v.Args[0] 17796 if x.Op != OpS390XMOVHreg { 17797 break 17798 } 17799 v.reset(OpS390XMOVDreg) 17800 v.AddArg(x) 17801 return true 17802 } 17803 // match: (MOVWreg x:(MOVHreg _)) 17804 // cond: 17805 // result: (MOVDreg x) 17806 for { 17807 x := v.Args[0] 17808 if x.Op != OpS390XMOVHreg { 17809 break 17810 } 17811 v.reset(OpS390XMOVDreg) 17812 v.AddArg(x) 17813 return true 17814 } 17815 return false 17816 } 17817 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 17818 b := v.Block 17819 _ = b 17820 // match: (MOVWreg x:(MOVWreg _)) 17821 // cond: 17822 // result: (MOVDreg x) 17823 for { 17824 x := v.Args[0] 17825 if x.Op != OpS390XMOVWreg { 17826 break 17827 } 17828 v.reset(OpS390XMOVDreg) 17829 v.AddArg(x) 17830 return true 17831 } 17832 // match: (MOVWreg (MOVDconst [c])) 17833 // cond: 17834 // result: (MOVDconst [int64(int32(c))]) 17835 for { 17836 v_0 := v.Args[0] 17837 if v_0.Op != OpS390XMOVDconst { 17838 break 17839 } 17840 c := v_0.AuxInt 17841 v.reset(OpS390XMOVDconst) 17842 v.AuxInt = int64(int32(c)) 17843 return true 17844 } 17845 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 17846 // cond: x.Uses == 1 && clobber(x) 17847 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 17848 for { 17849 x := v.Args[0] 17850 if x.Op != OpS390XMOVWZload { 17851 break 17852 } 17853 off := x.AuxInt 17854 sym := x.Aux 17855 _ = x.Args[1] 17856 ptr := x.Args[0] 17857 mem := x.Args[1] 17858 if !(x.Uses == 1 && clobber(x)) { 17859 break 17860 } 17861 b = x.Block 17862 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 17863 v.reset(OpCopy) 17864 v.AddArg(v0) 17865 v0.AuxInt = off 17866 v0.Aux = sym 17867 v0.AddArg(ptr) 17868 v0.AddArg(mem) 17869 return true 17870 } 17871 return false 17872 } 17873 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 17874 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 17875 // cond: 17876 // result: (MOVWstore [off] {sym} ptr x mem) 17877 for { 17878 off := v.AuxInt 17879 sym := v.Aux 17880 _ = v.Args[2] 17881 ptr := v.Args[0] 17882 v_1 := v.Args[1] 17883 if v_1.Op != OpS390XMOVWreg { 17884 break 17885 } 17886 x := v_1.Args[0] 17887 mem := v.Args[2] 17888 v.reset(OpS390XMOVWstore) 17889 v.AuxInt = off 17890 v.Aux = sym 17891 v.AddArg(ptr) 17892 v.AddArg(x) 17893 v.AddArg(mem) 17894 return true 17895 } 17896 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 17897 // cond: 17898 // result: (MOVWstore [off] {sym} ptr x mem) 17899 for { 17900 off := v.AuxInt 17901 sym := v.Aux 17902 _ = v.Args[2] 17903 ptr := v.Args[0] 17904 v_1 := v.Args[1] 17905 if v_1.Op != OpS390XMOVWZreg { 17906 break 17907 } 17908 x := v_1.Args[0] 17909 mem := v.Args[2] 17910 v.reset(OpS390XMOVWstore) 17911 v.AuxInt = off 17912 v.Aux = sym 17913 v.AddArg(ptr) 17914 v.AddArg(x) 17915 v.AddArg(mem) 17916 return true 17917 } 17918 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17919 // cond: is20Bit(off1+off2) 17920 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 17921 for { 17922 off1 := v.AuxInt 17923 sym := v.Aux 17924 _ = v.Args[2] 17925 v_0 := v.Args[0] 17926 if v_0.Op != OpS390XADDconst { 17927 break 17928 } 17929 off2 := v_0.AuxInt 17930 ptr := v_0.Args[0] 17931 val := v.Args[1] 17932 mem := v.Args[2] 17933 if !(is20Bit(off1 + off2)) { 17934 break 17935 } 17936 v.reset(OpS390XMOVWstore) 17937 v.AuxInt = off1 + off2 17938 v.Aux = sym 17939 v.AddArg(ptr) 17940 v.AddArg(val) 17941 v.AddArg(mem) 17942 return true 17943 } 17944 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 17945 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 17946 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 17947 for { 17948 off := v.AuxInt 17949 sym := v.Aux 17950 _ = v.Args[2] 17951 ptr := v.Args[0] 17952 v_1 := v.Args[1] 17953 if v_1.Op != OpS390XMOVDconst { 17954 break 17955 } 17956 c := v_1.AuxInt 17957 mem := v.Args[2] 17958 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 17959 break 17960 } 17961 v.reset(OpS390XMOVWstoreconst) 17962 v.AuxInt = makeValAndOff(int64(int32(c)), off) 17963 v.Aux = sym 17964 v.AddArg(ptr) 17965 v.AddArg(mem) 17966 return true 17967 } 17968 // match: (MOVWstore [off1] {sym1} (MOVDaddr <t> [off2] {sym2} base) val mem) 17969 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0)) 17970 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17971 for { 17972 off1 := v.AuxInt 17973 sym1 := v.Aux 17974 _ = v.Args[2] 17975 v_0 := v.Args[0] 17976 if v_0.Op != OpS390XMOVDaddr { 17977 break 17978 } 17979 t := v_0.Type 17980 off2 := v_0.AuxInt 17981 sym2 := v_0.Aux 17982 base := v_0.Args[0] 17983 val := v.Args[1] 17984 mem := v.Args[2] 17985 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.ElemType().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { 17986 break 17987 } 17988 v.reset(OpS390XMOVWstore) 17989 v.AuxInt = off1 + off2 17990 v.Aux = mergeSym(sym1, sym2) 17991 v.AddArg(base) 17992 v.AddArg(val) 17993 v.AddArg(mem) 17994 return true 17995 } 17996 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17997 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17998 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17999 for { 18000 off1 := v.AuxInt 18001 sym1 := v.Aux 18002 _ = v.Args[2] 18003 v_0 := v.Args[0] 18004 if v_0.Op != OpS390XMOVDaddridx { 18005 break 18006 } 18007 off2 := v_0.AuxInt 18008 sym2 := v_0.Aux 18009 _ = v_0.Args[1] 18010 ptr := v_0.Args[0] 18011 idx := v_0.Args[1] 18012 val := v.Args[1] 18013 mem := v.Args[2] 18014 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 18015 break 18016 } 18017 v.reset(OpS390XMOVWstoreidx) 18018 v.AuxInt = off1 + off2 18019 v.Aux = mergeSym(sym1, sym2) 18020 v.AddArg(ptr) 18021 v.AddArg(idx) 18022 v.AddArg(val) 18023 v.AddArg(mem) 18024 return true 18025 } 18026 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 18027 // cond: ptr.Op != OpSB 18028 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 18029 for { 18030 off := v.AuxInt 18031 sym := v.Aux 18032 _ = v.Args[2] 18033 v_0 := v.Args[0] 18034 if v_0.Op != OpS390XADD { 18035 break 18036 } 18037 _ = v_0.Args[1] 18038 ptr := v_0.Args[0] 18039 idx := v_0.Args[1] 18040 val := v.Args[1] 18041 mem := v.Args[2] 18042 if !(ptr.Op != OpSB) { 18043 break 18044 } 18045 v.reset(OpS390XMOVWstoreidx) 18046 v.AuxInt = off 18047 v.Aux = sym 18048 v.AddArg(ptr) 18049 v.AddArg(idx) 18050 v.AddArg(val) 18051 v.AddArg(mem) 18052 return true 18053 } 18054 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 18055 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18056 // result: (MOVDstore [i-4] {s} p w mem) 18057 for { 18058 i := v.AuxInt 18059 s := v.Aux 18060 _ = v.Args[2] 18061 p := v.Args[0] 18062 v_1 := v.Args[1] 18063 if v_1.Op != OpS390XSRDconst { 18064 break 18065 } 18066 if v_1.AuxInt != 32 { 18067 break 18068 } 18069 w := v_1.Args[0] 18070 x := v.Args[2] 18071 if x.Op != OpS390XMOVWstore { 18072 break 18073 } 18074 if x.AuxInt != i-4 { 18075 break 18076 } 18077 if x.Aux != s { 18078 break 18079 } 18080 _ = x.Args[2] 18081 if p != x.Args[0] { 18082 break 18083 } 18084 if w != x.Args[1] { 18085 break 18086 } 18087 mem := x.Args[2] 18088 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18089 break 18090 } 18091 v.reset(OpS390XMOVDstore) 18092 v.AuxInt = i - 4 18093 v.Aux = s 18094 v.AddArg(p) 18095 v.AddArg(w) 18096 v.AddArg(mem) 18097 return true 18098 } 18099 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 18100 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18101 // result: (MOVDstore [i-4] {s} p w0 mem) 18102 for { 18103 i := v.AuxInt 18104 s := v.Aux 18105 _ = v.Args[2] 18106 p := v.Args[0] 18107 w0 := v.Args[1] 18108 if w0.Op != OpS390XSRDconst { 18109 break 18110 } 18111 j := w0.AuxInt 18112 w := w0.Args[0] 18113 x := v.Args[2] 18114 if x.Op != OpS390XMOVWstore { 18115 break 18116 } 18117 if x.AuxInt != i-4 { 18118 break 18119 } 18120 if x.Aux != s { 18121 break 18122 } 18123 _ = x.Args[2] 18124 if p != x.Args[0] { 18125 break 18126 } 18127 x_1 := x.Args[1] 18128 if x_1.Op != OpS390XSRDconst { 18129 break 18130 } 18131 if x_1.AuxInt != j+32 { 18132 break 18133 } 18134 if w != x_1.Args[0] { 18135 break 18136 } 18137 mem := x.Args[2] 18138 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18139 break 18140 } 18141 v.reset(OpS390XMOVDstore) 18142 v.AuxInt = i - 4 18143 v.Aux = s 18144 v.AddArg(p) 18145 v.AddArg(w0) 18146 v.AddArg(mem) 18147 return true 18148 } 18149 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 18150 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 18151 // result: (STM2 [i-4] {s} p w0 w1 mem) 18152 for { 18153 i := v.AuxInt 18154 s := v.Aux 18155 _ = v.Args[2] 18156 p := v.Args[0] 18157 w1 := v.Args[1] 18158 x := v.Args[2] 18159 if x.Op != OpS390XMOVWstore { 18160 break 18161 } 18162 if x.AuxInt != i-4 { 18163 break 18164 } 18165 if x.Aux != s { 18166 break 18167 } 18168 _ = x.Args[2] 18169 if p != x.Args[0] { 18170 break 18171 } 18172 w0 := x.Args[1] 18173 mem := x.Args[2] 18174 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 18175 break 18176 } 18177 v.reset(OpS390XSTM2) 18178 v.AuxInt = i - 4 18179 v.Aux = s 18180 v.AddArg(p) 18181 v.AddArg(w0) 18182 v.AddArg(w1) 18183 v.AddArg(mem) 18184 return true 18185 } 18186 return false 18187 } 18188 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 18189 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 18190 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 18191 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 18192 for { 18193 i := v.AuxInt 18194 s := v.Aux 18195 _ = v.Args[2] 18196 p := v.Args[0] 18197 w2 := v.Args[1] 18198 x := v.Args[2] 18199 if x.Op != OpS390XSTM2 { 18200 break 18201 } 18202 if x.AuxInt != i-8 { 18203 break 18204 } 18205 if x.Aux != s { 18206 break 18207 } 18208 _ = x.Args[3] 18209 if p != x.Args[0] { 18210 break 18211 } 18212 w0 := x.Args[1] 18213 w1 := x.Args[2] 18214 mem := x.Args[3] 18215 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 18216 break 18217 } 18218 v.reset(OpS390XSTM3) 18219 v.AuxInt = i - 8 18220 v.Aux = s 18221 v.AddArg(p) 18222 v.AddArg(w0) 18223 v.AddArg(w1) 18224 v.AddArg(w2) 18225 v.AddArg(mem) 18226 return true 18227 } 18228 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 18229 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 18230 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 18231 for { 18232 i := v.AuxInt 18233 s := v.Aux 18234 _ = v.Args[2] 18235 p := v.Args[0] 18236 w3 := v.Args[1] 18237 x := v.Args[2] 18238 if x.Op != OpS390XSTM3 { 18239 break 18240 } 18241 if x.AuxInt != i-12 { 18242 break 18243 } 18244 if x.Aux != s { 18245 break 18246 } 18247 _ = x.Args[4] 18248 if p != x.Args[0] { 18249 break 18250 } 18251 w0 := x.Args[1] 18252 w1 := x.Args[2] 18253 w2 := x.Args[3] 18254 mem := x.Args[4] 18255 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 18256 break 18257 } 18258 v.reset(OpS390XSTM4) 18259 v.AuxInt = i - 12 18260 v.Aux = s 18261 v.AddArg(p) 18262 v.AddArg(w0) 18263 v.AddArg(w1) 18264 v.AddArg(w2) 18265 v.AddArg(w3) 18266 v.AddArg(mem) 18267 return true 18268 } 18269 return false 18270 } 18271 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 18272 b := v.Block 18273 _ = b 18274 typ := &b.Func.Config.Types 18275 _ = typ 18276 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 18277 // cond: isU12Bit(ValAndOff(sc).Off()+off) 18278 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 18279 for { 18280 sc := v.AuxInt 18281 s := v.Aux 18282 _ = v.Args[1] 18283 v_0 := v.Args[0] 18284 if v_0.Op != OpS390XADDconst { 18285 break 18286 } 18287 off := v_0.AuxInt 18288 ptr := v_0.Args[0] 18289 mem := v.Args[1] 18290 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 18291 break 18292 } 18293 v.reset(OpS390XMOVWstoreconst) 18294 v.AuxInt = ValAndOff(sc).add(off) 18295 v.Aux = s 18296 v.AddArg(ptr) 18297 v.AddArg(mem) 18298 return true 18299 } 18300 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 18301 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 18302 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 18303 for { 18304 sc := v.AuxInt 18305 sym1 := v.Aux 18306 _ = v.Args[1] 18307 v_0 := v.Args[0] 18308 if v_0.Op != OpS390XMOVDaddr { 18309 break 18310 } 18311 off := v_0.AuxInt 18312 sym2 := v_0.Aux 18313 ptr := v_0.Args[0] 18314 mem := v.Args[1] 18315 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 18316 break 18317 } 18318 v.reset(OpS390XMOVWstoreconst) 18319 v.AuxInt = ValAndOff(sc).add(off) 18320 v.Aux = mergeSym(sym1, sym2) 18321 v.AddArg(ptr) 18322 v.AddArg(mem) 18323 return true 18324 } 18325 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 18326 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 18327 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 18328 for { 18329 c := v.AuxInt 18330 s := v.Aux 18331 _ = v.Args[1] 18332 p := v.Args[0] 18333 x := v.Args[1] 18334 if x.Op != OpS390XMOVWstoreconst { 18335 break 18336 } 18337 a := x.AuxInt 18338 if x.Aux != s { 18339 break 18340 } 18341 _ = x.Args[1] 18342 if p != x.Args[0] { 18343 break 18344 } 18345 mem := x.Args[1] 18346 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 18347 break 18348 } 18349 v.reset(OpS390XMOVDstore) 18350 v.AuxInt = ValAndOff(a).Off() 18351 v.Aux = s 18352 v.AddArg(p) 18353 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 18354 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 18355 v.AddArg(v0) 18356 v.AddArg(mem) 18357 return true 18358 } 18359 return false 18360 } 18361 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 18362 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 18363 // cond: 18364 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18365 for { 18366 c := v.AuxInt 18367 sym := v.Aux 18368 _ = v.Args[3] 18369 v_0 := v.Args[0] 18370 if v_0.Op != OpS390XADDconst { 18371 break 18372 } 18373 d := v_0.AuxInt 18374 ptr := v_0.Args[0] 18375 idx := v.Args[1] 18376 val := v.Args[2] 18377 mem := v.Args[3] 18378 v.reset(OpS390XMOVWstoreidx) 18379 v.AuxInt = c + d 18380 v.Aux = sym 18381 v.AddArg(ptr) 18382 v.AddArg(idx) 18383 v.AddArg(val) 18384 v.AddArg(mem) 18385 return true 18386 } 18387 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 18388 // cond: 18389 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18390 for { 18391 c := v.AuxInt 18392 sym := v.Aux 18393 _ = v.Args[3] 18394 idx := v.Args[0] 18395 v_1 := v.Args[1] 18396 if v_1.Op != OpS390XADDconst { 18397 break 18398 } 18399 d := v_1.AuxInt 18400 ptr := v_1.Args[0] 18401 val := v.Args[2] 18402 mem := v.Args[3] 18403 v.reset(OpS390XMOVWstoreidx) 18404 v.AuxInt = c + d 18405 v.Aux = sym 18406 v.AddArg(ptr) 18407 v.AddArg(idx) 18408 v.AddArg(val) 18409 v.AddArg(mem) 18410 return true 18411 } 18412 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 18413 // cond: 18414 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18415 for { 18416 c := v.AuxInt 18417 sym := v.Aux 18418 _ = v.Args[3] 18419 ptr := v.Args[0] 18420 v_1 := v.Args[1] 18421 if v_1.Op != OpS390XADDconst { 18422 break 18423 } 18424 d := v_1.AuxInt 18425 idx := v_1.Args[0] 18426 val := v.Args[2] 18427 mem := v.Args[3] 18428 v.reset(OpS390XMOVWstoreidx) 18429 v.AuxInt = c + d 18430 v.Aux = sym 18431 v.AddArg(ptr) 18432 v.AddArg(idx) 18433 v.AddArg(val) 18434 v.AddArg(mem) 18435 return true 18436 } 18437 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 18438 // cond: 18439 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18440 for { 18441 c := v.AuxInt 18442 sym := v.Aux 18443 _ = v.Args[3] 18444 v_0 := v.Args[0] 18445 if v_0.Op != OpS390XADDconst { 18446 break 18447 } 18448 d := v_0.AuxInt 18449 idx := v_0.Args[0] 18450 ptr := v.Args[1] 18451 val := v.Args[2] 18452 mem := v.Args[3] 18453 v.reset(OpS390XMOVWstoreidx) 18454 v.AuxInt = c + d 18455 v.Aux = sym 18456 v.AddArg(ptr) 18457 v.AddArg(idx) 18458 v.AddArg(val) 18459 v.AddArg(mem) 18460 return true 18461 } 18462 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18463 // cond: x.Uses == 1 && clobber(x) 18464 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18465 for { 18466 i := v.AuxInt 18467 s := v.Aux 18468 _ = v.Args[3] 18469 p := v.Args[0] 18470 idx := v.Args[1] 18471 w := v.Args[2] 18472 x := v.Args[3] 18473 if x.Op != OpS390XMOVWstoreidx { 18474 break 18475 } 18476 if x.AuxInt != i-4 { 18477 break 18478 } 18479 if x.Aux != s { 18480 break 18481 } 18482 _ = x.Args[3] 18483 if p != x.Args[0] { 18484 break 18485 } 18486 if idx != x.Args[1] { 18487 break 18488 } 18489 x_2 := x.Args[2] 18490 if x_2.Op != OpS390XSRDconst { 18491 break 18492 } 18493 if x_2.AuxInt != 32 { 18494 break 18495 } 18496 if w != x_2.Args[0] { 18497 break 18498 } 18499 mem := x.Args[3] 18500 if !(x.Uses == 1 && clobber(x)) { 18501 break 18502 } 18503 v.reset(OpS390XMOVDstoreidx) 18504 v.AuxInt = i - 4 18505 v.Aux = s 18506 v.AddArg(p) 18507 v.AddArg(idx) 18508 v.AddArg(w) 18509 v.AddArg(mem) 18510 return true 18511 } 18512 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18513 // cond: x.Uses == 1 && clobber(x) 18514 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18515 for { 18516 i := v.AuxInt 18517 s := v.Aux 18518 _ = v.Args[3] 18519 p := v.Args[0] 18520 idx := v.Args[1] 18521 w := v.Args[2] 18522 x := v.Args[3] 18523 if x.Op != OpS390XMOVWstoreidx { 18524 break 18525 } 18526 if x.AuxInt != i-4 { 18527 break 18528 } 18529 if x.Aux != s { 18530 break 18531 } 18532 _ = x.Args[3] 18533 if idx != x.Args[0] { 18534 break 18535 } 18536 if p != x.Args[1] { 18537 break 18538 } 18539 x_2 := x.Args[2] 18540 if x_2.Op != OpS390XSRDconst { 18541 break 18542 } 18543 if x_2.AuxInt != 32 { 18544 break 18545 } 18546 if w != x_2.Args[0] { 18547 break 18548 } 18549 mem := x.Args[3] 18550 if !(x.Uses == 1 && clobber(x)) { 18551 break 18552 } 18553 v.reset(OpS390XMOVDstoreidx) 18554 v.AuxInt = i - 4 18555 v.Aux = s 18556 v.AddArg(p) 18557 v.AddArg(idx) 18558 v.AddArg(w) 18559 v.AddArg(mem) 18560 return true 18561 } 18562 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18563 // cond: x.Uses == 1 && clobber(x) 18564 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18565 for { 18566 i := v.AuxInt 18567 s := v.Aux 18568 _ = v.Args[3] 18569 idx := v.Args[0] 18570 p := v.Args[1] 18571 w := v.Args[2] 18572 x := v.Args[3] 18573 if x.Op != OpS390XMOVWstoreidx { 18574 break 18575 } 18576 if x.AuxInt != i-4 { 18577 break 18578 } 18579 if x.Aux != s { 18580 break 18581 } 18582 _ = x.Args[3] 18583 if p != x.Args[0] { 18584 break 18585 } 18586 if idx != x.Args[1] { 18587 break 18588 } 18589 x_2 := x.Args[2] 18590 if x_2.Op != OpS390XSRDconst { 18591 break 18592 } 18593 if x_2.AuxInt != 32 { 18594 break 18595 } 18596 if w != x_2.Args[0] { 18597 break 18598 } 18599 mem := x.Args[3] 18600 if !(x.Uses == 1 && clobber(x)) { 18601 break 18602 } 18603 v.reset(OpS390XMOVDstoreidx) 18604 v.AuxInt = i - 4 18605 v.Aux = s 18606 v.AddArg(p) 18607 v.AddArg(idx) 18608 v.AddArg(w) 18609 v.AddArg(mem) 18610 return true 18611 } 18612 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18613 // cond: x.Uses == 1 && clobber(x) 18614 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18615 for { 18616 i := v.AuxInt 18617 s := v.Aux 18618 _ = v.Args[3] 18619 idx := v.Args[0] 18620 p := v.Args[1] 18621 w := v.Args[2] 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 idx != x.Args[0] { 18634 break 18635 } 18636 if p != 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 != 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(w) 18659 v.AddArg(mem) 18660 return true 18661 } 18662 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (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 p != x.Args[0] { 18689 break 18690 } 18691 if idx != 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 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18718 // cond: x.Uses == 1 && clobber(x) 18719 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18720 for { 18721 i := v.AuxInt 18722 s := v.Aux 18723 _ = v.Args[3] 18724 p := v.Args[0] 18725 idx := v.Args[1] 18726 w0 := v.Args[2] 18727 if w0.Op != OpS390XSRDconst { 18728 break 18729 } 18730 j := w0.AuxInt 18731 w := w0.Args[0] 18732 x := v.Args[3] 18733 if x.Op != OpS390XMOVWstoreidx { 18734 break 18735 } 18736 if x.AuxInt != i-4 { 18737 break 18738 } 18739 if x.Aux != s { 18740 break 18741 } 18742 _ = x.Args[3] 18743 if idx != x.Args[0] { 18744 break 18745 } 18746 if p != x.Args[1] { 18747 break 18748 } 18749 x_2 := x.Args[2] 18750 if x_2.Op != OpS390XSRDconst { 18751 break 18752 } 18753 if x_2.AuxInt != j+32 { 18754 break 18755 } 18756 if w != x_2.Args[0] { 18757 break 18758 } 18759 mem := x.Args[3] 18760 if !(x.Uses == 1 && clobber(x)) { 18761 break 18762 } 18763 v.reset(OpS390XMOVDstoreidx) 18764 v.AuxInt = i - 4 18765 v.Aux = s 18766 v.AddArg(p) 18767 v.AddArg(idx) 18768 v.AddArg(w0) 18769 v.AddArg(mem) 18770 return true 18771 } 18772 return false 18773 } 18774 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 18775 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (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 p != x.Args[0] { 18802 break 18803 } 18804 if idx != 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 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18831 // cond: x.Uses == 1 && clobber(x) 18832 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18833 for { 18834 i := v.AuxInt 18835 s := v.Aux 18836 _ = v.Args[3] 18837 idx := v.Args[0] 18838 p := v.Args[1] 18839 w0 := v.Args[2] 18840 if w0.Op != OpS390XSRDconst { 18841 break 18842 } 18843 j := w0.AuxInt 18844 w := w0.Args[0] 18845 x := v.Args[3] 18846 if x.Op != OpS390XMOVWstoreidx { 18847 break 18848 } 18849 if x.AuxInt != i-4 { 18850 break 18851 } 18852 if x.Aux != s { 18853 break 18854 } 18855 _ = x.Args[3] 18856 if idx != x.Args[0] { 18857 break 18858 } 18859 if p != x.Args[1] { 18860 break 18861 } 18862 x_2 := x.Args[2] 18863 if x_2.Op != OpS390XSRDconst { 18864 break 18865 } 18866 if x_2.AuxInt != j+32 { 18867 break 18868 } 18869 if w != x_2.Args[0] { 18870 break 18871 } 18872 mem := x.Args[3] 18873 if !(x.Uses == 1 && clobber(x)) { 18874 break 18875 } 18876 v.reset(OpS390XMOVDstoreidx) 18877 v.AuxInt = i - 4 18878 v.Aux = s 18879 v.AddArg(p) 18880 v.AddArg(idx) 18881 v.AddArg(w0) 18882 v.AddArg(mem) 18883 return true 18884 } 18885 return false 18886 } 18887 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 18888 // match: (MULLD x (MOVDconst [c])) 18889 // cond: is32Bit(c) 18890 // result: (MULLDconst [c] x) 18891 for { 18892 _ = v.Args[1] 18893 x := v.Args[0] 18894 v_1 := v.Args[1] 18895 if v_1.Op != OpS390XMOVDconst { 18896 break 18897 } 18898 c := v_1.AuxInt 18899 if !(is32Bit(c)) { 18900 break 18901 } 18902 v.reset(OpS390XMULLDconst) 18903 v.AuxInt = c 18904 v.AddArg(x) 18905 return true 18906 } 18907 // match: (MULLD (MOVDconst [c]) x) 18908 // cond: is32Bit(c) 18909 // result: (MULLDconst [c] x) 18910 for { 18911 _ = v.Args[1] 18912 v_0 := v.Args[0] 18913 if v_0.Op != OpS390XMOVDconst { 18914 break 18915 } 18916 c := v_0.AuxInt 18917 x := v.Args[1] 18918 if !(is32Bit(c)) { 18919 break 18920 } 18921 v.reset(OpS390XMULLDconst) 18922 v.AuxInt = c 18923 v.AddArg(x) 18924 return true 18925 } 18926 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18927 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18928 // result: (MULLDload <t> [off] {sym} x ptr mem) 18929 for { 18930 t := v.Type 18931 _ = v.Args[1] 18932 x := v.Args[0] 18933 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18943 break 18944 } 18945 v.reset(OpS390XMULLDload) 18946 v.Type = t 18947 v.AuxInt = off 18948 v.Aux = sym 18949 v.AddArg(x) 18950 v.AddArg(ptr) 18951 v.AddArg(mem) 18952 return true 18953 } 18954 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18955 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18956 // result: (MULLDload <t> [off] {sym} x ptr mem) 18957 for { 18958 t := v.Type 18959 _ = v.Args[1] 18960 g := v.Args[0] 18961 if g.Op != OpS390XMOVDload { 18962 break 18963 } 18964 off := g.AuxInt 18965 sym := g.Aux 18966 _ = g.Args[1] 18967 ptr := g.Args[0] 18968 mem := g.Args[1] 18969 x := v.Args[1] 18970 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18971 break 18972 } 18973 v.reset(OpS390XMULLDload) 18974 v.Type = t 18975 v.AuxInt = off 18976 v.Aux = sym 18977 v.AddArg(x) 18978 v.AddArg(ptr) 18979 v.AddArg(mem) 18980 return true 18981 } 18982 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18983 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18984 // result: (MULLDload <t> [off] {sym} x ptr mem) 18985 for { 18986 t := v.Type 18987 _ = v.Args[1] 18988 g := v.Args[0] 18989 if g.Op != OpS390XMOVDload { 18990 break 18991 } 18992 off := g.AuxInt 18993 sym := g.Aux 18994 _ = g.Args[1] 18995 ptr := g.Args[0] 18996 mem := g.Args[1] 18997 x := v.Args[1] 18998 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18999 break 19000 } 19001 v.reset(OpS390XMULLDload) 19002 v.Type = t 19003 v.AuxInt = off 19004 v.Aux = sym 19005 v.AddArg(x) 19006 v.AddArg(ptr) 19007 v.AddArg(mem) 19008 return true 19009 } 19010 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 19011 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19012 // result: (MULLDload <t> [off] {sym} x ptr mem) 19013 for { 19014 t := v.Type 19015 _ = v.Args[1] 19016 x := v.Args[0] 19017 g := v.Args[1] 19018 if g.Op != OpS390XMOVDload { 19019 break 19020 } 19021 off := g.AuxInt 19022 sym := g.Aux 19023 _ = g.Args[1] 19024 ptr := g.Args[0] 19025 mem := g.Args[1] 19026 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19027 break 19028 } 19029 v.reset(OpS390XMULLDload) 19030 v.Type = t 19031 v.AuxInt = off 19032 v.Aux = sym 19033 v.AddArg(x) 19034 v.AddArg(ptr) 19035 v.AddArg(mem) 19036 return true 19037 } 19038 return false 19039 } 19040 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 19041 b := v.Block 19042 _ = b 19043 // match: (MULLDconst [-1] x) 19044 // cond: 19045 // result: (NEG x) 19046 for { 19047 if v.AuxInt != -1 { 19048 break 19049 } 19050 x := v.Args[0] 19051 v.reset(OpS390XNEG) 19052 v.AddArg(x) 19053 return true 19054 } 19055 // match: (MULLDconst [0] _) 19056 // cond: 19057 // result: (MOVDconst [0]) 19058 for { 19059 if v.AuxInt != 0 { 19060 break 19061 } 19062 v.reset(OpS390XMOVDconst) 19063 v.AuxInt = 0 19064 return true 19065 } 19066 // match: (MULLDconst [1] x) 19067 // cond: 19068 // result: x 19069 for { 19070 if v.AuxInt != 1 { 19071 break 19072 } 19073 x := v.Args[0] 19074 v.reset(OpCopy) 19075 v.Type = x.Type 19076 v.AddArg(x) 19077 return true 19078 } 19079 // match: (MULLDconst [c] x) 19080 // cond: isPowerOfTwo(c) 19081 // result: (SLDconst [log2(c)] x) 19082 for { 19083 c := v.AuxInt 19084 x := v.Args[0] 19085 if !(isPowerOfTwo(c)) { 19086 break 19087 } 19088 v.reset(OpS390XSLDconst) 19089 v.AuxInt = log2(c) 19090 v.AddArg(x) 19091 return true 19092 } 19093 // match: (MULLDconst [c] x) 19094 // cond: isPowerOfTwo(c+1) && c >= 15 19095 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 19096 for { 19097 c := v.AuxInt 19098 x := v.Args[0] 19099 if !(isPowerOfTwo(c+1) && c >= 15) { 19100 break 19101 } 19102 v.reset(OpS390XSUB) 19103 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19104 v0.AuxInt = log2(c + 1) 19105 v0.AddArg(x) 19106 v.AddArg(v0) 19107 v.AddArg(x) 19108 return true 19109 } 19110 // match: (MULLDconst [c] x) 19111 // cond: isPowerOfTwo(c-1) && c >= 17 19112 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 19113 for { 19114 c := v.AuxInt 19115 x := v.Args[0] 19116 if !(isPowerOfTwo(c-1) && c >= 17) { 19117 break 19118 } 19119 v.reset(OpS390XADD) 19120 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19121 v0.AuxInt = log2(c - 1) 19122 v0.AddArg(x) 19123 v.AddArg(v0) 19124 v.AddArg(x) 19125 return true 19126 } 19127 // match: (MULLDconst [c] (MOVDconst [d])) 19128 // cond: 19129 // result: (MOVDconst [c*d]) 19130 for { 19131 c := v.AuxInt 19132 v_0 := v.Args[0] 19133 if v_0.Op != OpS390XMOVDconst { 19134 break 19135 } 19136 d := v_0.AuxInt 19137 v.reset(OpS390XMOVDconst) 19138 v.AuxInt = c * d 19139 return true 19140 } 19141 return false 19142 } 19143 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 19144 // match: (MULLW x (MOVDconst [c])) 19145 // cond: 19146 // result: (MULLWconst [c] x) 19147 for { 19148 _ = v.Args[1] 19149 x := v.Args[0] 19150 v_1 := v.Args[1] 19151 if v_1.Op != OpS390XMOVDconst { 19152 break 19153 } 19154 c := v_1.AuxInt 19155 v.reset(OpS390XMULLWconst) 19156 v.AuxInt = c 19157 v.AddArg(x) 19158 return true 19159 } 19160 // match: (MULLW (MOVDconst [c]) x) 19161 // cond: 19162 // result: (MULLWconst [c] x) 19163 for { 19164 _ = v.Args[1] 19165 v_0 := v.Args[0] 19166 if v_0.Op != OpS390XMOVDconst { 19167 break 19168 } 19169 c := v_0.AuxInt 19170 x := v.Args[1] 19171 v.reset(OpS390XMULLWconst) 19172 v.AuxInt = c 19173 v.AddArg(x) 19174 return true 19175 } 19176 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19177 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19178 // result: (MULLWload <t> [off] {sym} x ptr mem) 19179 for { 19180 t := v.Type 19181 _ = v.Args[1] 19182 x := v.Args[0] 19183 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19193 break 19194 } 19195 v.reset(OpS390XMULLWload) 19196 v.Type = t 19197 v.AuxInt = off 19198 v.Aux = sym 19199 v.AddArg(x) 19200 v.AddArg(ptr) 19201 v.AddArg(mem) 19202 return true 19203 } 19204 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19205 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19206 // result: (MULLWload <t> [off] {sym} x ptr mem) 19207 for { 19208 t := v.Type 19209 _ = v.Args[1] 19210 g := v.Args[0] 19211 if g.Op != OpS390XMOVWload { 19212 break 19213 } 19214 off := g.AuxInt 19215 sym := g.Aux 19216 _ = g.Args[1] 19217 ptr := g.Args[0] 19218 mem := g.Args[1] 19219 x := v.Args[1] 19220 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19221 break 19222 } 19223 v.reset(OpS390XMULLWload) 19224 v.Type = t 19225 v.AuxInt = off 19226 v.Aux = sym 19227 v.AddArg(x) 19228 v.AddArg(ptr) 19229 v.AddArg(mem) 19230 return true 19231 } 19232 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19233 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19234 // result: (MULLWload <t> [off] {sym} x ptr mem) 19235 for { 19236 t := v.Type 19237 _ = v.Args[1] 19238 g := v.Args[0] 19239 if g.Op != OpS390XMOVWload { 19240 break 19241 } 19242 off := g.AuxInt 19243 sym := g.Aux 19244 _ = g.Args[1] 19245 ptr := g.Args[0] 19246 mem := g.Args[1] 19247 x := v.Args[1] 19248 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19249 break 19250 } 19251 v.reset(OpS390XMULLWload) 19252 v.Type = t 19253 v.AuxInt = off 19254 v.Aux = sym 19255 v.AddArg(x) 19256 v.AddArg(ptr) 19257 v.AddArg(mem) 19258 return true 19259 } 19260 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19261 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19262 // result: (MULLWload <t> [off] {sym} x ptr mem) 19263 for { 19264 t := v.Type 19265 _ = v.Args[1] 19266 x := v.Args[0] 19267 g := v.Args[1] 19268 if g.Op != OpS390XMOVWload { 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19277 break 19278 } 19279 v.reset(OpS390XMULLWload) 19280 v.Type = t 19281 v.AuxInt = off 19282 v.Aux = sym 19283 v.AddArg(x) 19284 v.AddArg(ptr) 19285 v.AddArg(mem) 19286 return true 19287 } 19288 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19289 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19290 // result: (MULLWload <t> [off] {sym} x ptr mem) 19291 for { 19292 t := v.Type 19293 _ = v.Args[1] 19294 x := v.Args[0] 19295 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19305 break 19306 } 19307 v.reset(OpS390XMULLWload) 19308 v.Type = t 19309 v.AuxInt = off 19310 v.Aux = sym 19311 v.AddArg(x) 19312 v.AddArg(ptr) 19313 v.AddArg(mem) 19314 return true 19315 } 19316 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19317 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19318 // result: (MULLWload <t> [off] {sym} x ptr mem) 19319 for { 19320 t := v.Type 19321 _ = v.Args[1] 19322 g := v.Args[0] 19323 if g.Op != OpS390XMOVWZload { 19324 break 19325 } 19326 off := g.AuxInt 19327 sym := g.Aux 19328 _ = g.Args[1] 19329 ptr := g.Args[0] 19330 mem := g.Args[1] 19331 x := v.Args[1] 19332 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19333 break 19334 } 19335 v.reset(OpS390XMULLWload) 19336 v.Type = t 19337 v.AuxInt = off 19338 v.Aux = sym 19339 v.AddArg(x) 19340 v.AddArg(ptr) 19341 v.AddArg(mem) 19342 return true 19343 } 19344 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19345 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19346 // result: (MULLWload <t> [off] {sym} x ptr mem) 19347 for { 19348 t := v.Type 19349 _ = v.Args[1] 19350 g := v.Args[0] 19351 if g.Op != OpS390XMOVWZload { 19352 break 19353 } 19354 off := g.AuxInt 19355 sym := g.Aux 19356 _ = g.Args[1] 19357 ptr := g.Args[0] 19358 mem := g.Args[1] 19359 x := v.Args[1] 19360 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19361 break 19362 } 19363 v.reset(OpS390XMULLWload) 19364 v.Type = t 19365 v.AuxInt = off 19366 v.Aux = sym 19367 v.AddArg(x) 19368 v.AddArg(ptr) 19369 v.AddArg(mem) 19370 return true 19371 } 19372 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19373 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19374 // result: (MULLWload <t> [off] {sym} x ptr mem) 19375 for { 19376 t := v.Type 19377 _ = v.Args[1] 19378 x := v.Args[0] 19379 g := v.Args[1] 19380 if g.Op != OpS390XMOVWZload { 19381 break 19382 } 19383 off := g.AuxInt 19384 sym := g.Aux 19385 _ = g.Args[1] 19386 ptr := g.Args[0] 19387 mem := g.Args[1] 19388 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19389 break 19390 } 19391 v.reset(OpS390XMULLWload) 19392 v.Type = t 19393 v.AuxInt = off 19394 v.Aux = sym 19395 v.AddArg(x) 19396 v.AddArg(ptr) 19397 v.AddArg(mem) 19398 return true 19399 } 19400 return false 19401 } 19402 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 19403 b := v.Block 19404 _ = b 19405 // match: (MULLWconst [-1] x) 19406 // cond: 19407 // result: (NEGW x) 19408 for { 19409 if v.AuxInt != -1 { 19410 break 19411 } 19412 x := v.Args[0] 19413 v.reset(OpS390XNEGW) 19414 v.AddArg(x) 19415 return true 19416 } 19417 // match: (MULLWconst [0] _) 19418 // cond: 19419 // result: (MOVDconst [0]) 19420 for { 19421 if v.AuxInt != 0 { 19422 break 19423 } 19424 v.reset(OpS390XMOVDconst) 19425 v.AuxInt = 0 19426 return true 19427 } 19428 // match: (MULLWconst [1] x) 19429 // cond: 19430 // result: x 19431 for { 19432 if v.AuxInt != 1 { 19433 break 19434 } 19435 x := v.Args[0] 19436 v.reset(OpCopy) 19437 v.Type = x.Type 19438 v.AddArg(x) 19439 return true 19440 } 19441 // match: (MULLWconst [c] x) 19442 // cond: isPowerOfTwo(c) 19443 // result: (SLWconst [log2(c)] x) 19444 for { 19445 c := v.AuxInt 19446 x := v.Args[0] 19447 if !(isPowerOfTwo(c)) { 19448 break 19449 } 19450 v.reset(OpS390XSLWconst) 19451 v.AuxInt = log2(c) 19452 v.AddArg(x) 19453 return true 19454 } 19455 // match: (MULLWconst [c] x) 19456 // cond: isPowerOfTwo(c+1) && c >= 15 19457 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 19458 for { 19459 c := v.AuxInt 19460 x := v.Args[0] 19461 if !(isPowerOfTwo(c+1) && c >= 15) { 19462 break 19463 } 19464 v.reset(OpS390XSUBW) 19465 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19466 v0.AuxInt = log2(c + 1) 19467 v0.AddArg(x) 19468 v.AddArg(v0) 19469 v.AddArg(x) 19470 return true 19471 } 19472 // match: (MULLWconst [c] x) 19473 // cond: isPowerOfTwo(c-1) && c >= 17 19474 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 19475 for { 19476 c := v.AuxInt 19477 x := v.Args[0] 19478 if !(isPowerOfTwo(c-1) && c >= 17) { 19479 break 19480 } 19481 v.reset(OpS390XADDW) 19482 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19483 v0.AuxInt = log2(c - 1) 19484 v0.AddArg(x) 19485 v.AddArg(v0) 19486 v.AddArg(x) 19487 return true 19488 } 19489 // match: (MULLWconst [c] (MOVDconst [d])) 19490 // cond: 19491 // result: (MOVDconst [int64(int32(c*d))]) 19492 for { 19493 c := v.AuxInt 19494 v_0 := v.Args[0] 19495 if v_0.Op != OpS390XMOVDconst { 19496 break 19497 } 19498 d := v_0.AuxInt 19499 v.reset(OpS390XMOVDconst) 19500 v.AuxInt = int64(int32(c * d)) 19501 return true 19502 } 19503 return false 19504 } 19505 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 19506 // match: (NEG (MOVDconst [c])) 19507 // cond: 19508 // result: (MOVDconst [-c]) 19509 for { 19510 v_0 := v.Args[0] 19511 if v_0.Op != OpS390XMOVDconst { 19512 break 19513 } 19514 c := v_0.AuxInt 19515 v.reset(OpS390XMOVDconst) 19516 v.AuxInt = -c 19517 return true 19518 } 19519 // match: (NEG (ADDconst [c] (NEG x))) 19520 // cond: c != -(1<<31) 19521 // result: (ADDconst [-c] x) 19522 for { 19523 v_0 := v.Args[0] 19524 if v_0.Op != OpS390XADDconst { 19525 break 19526 } 19527 c := v_0.AuxInt 19528 v_0_0 := v_0.Args[0] 19529 if v_0_0.Op != OpS390XNEG { 19530 break 19531 } 19532 x := v_0_0.Args[0] 19533 if !(c != -(1 << 31)) { 19534 break 19535 } 19536 v.reset(OpS390XADDconst) 19537 v.AuxInt = -c 19538 v.AddArg(x) 19539 return true 19540 } 19541 return false 19542 } 19543 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 19544 // match: (NEGW (MOVDconst [c])) 19545 // cond: 19546 // result: (MOVDconst [int64(int32(-c))]) 19547 for { 19548 v_0 := v.Args[0] 19549 if v_0.Op != OpS390XMOVDconst { 19550 break 19551 } 19552 c := v_0.AuxInt 19553 v.reset(OpS390XMOVDconst) 19554 v.AuxInt = int64(int32(-c)) 19555 return true 19556 } 19557 return false 19558 } 19559 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 19560 b := v.Block 19561 _ = b 19562 typ := &b.Func.Config.Types 19563 _ = typ 19564 // match: (NOT x) 19565 // cond: true 19566 // result: (XOR (MOVDconst [-1]) x) 19567 for { 19568 x := v.Args[0] 19569 if !(true) { 19570 break 19571 } 19572 v.reset(OpS390XXOR) 19573 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 19574 v0.AuxInt = -1 19575 v.AddArg(v0) 19576 v.AddArg(x) 19577 return true 19578 } 19579 return false 19580 } 19581 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 19582 // match: (NOTW x) 19583 // cond: true 19584 // result: (XORWconst [-1] x) 19585 for { 19586 x := v.Args[0] 19587 if !(true) { 19588 break 19589 } 19590 v.reset(OpS390XXORWconst) 19591 v.AuxInt = -1 19592 v.AddArg(x) 19593 return true 19594 } 19595 return false 19596 } 19597 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 19598 // match: (OR x (MOVDconst [c])) 19599 // cond: isU32Bit(c) 19600 // result: (ORconst [c] x) 19601 for { 19602 _ = v.Args[1] 19603 x := v.Args[0] 19604 v_1 := v.Args[1] 19605 if v_1.Op != OpS390XMOVDconst { 19606 break 19607 } 19608 c := v_1.AuxInt 19609 if !(isU32Bit(c)) { 19610 break 19611 } 19612 v.reset(OpS390XORconst) 19613 v.AuxInt = c 19614 v.AddArg(x) 19615 return true 19616 } 19617 // match: (OR (MOVDconst [c]) x) 19618 // cond: isU32Bit(c) 19619 // result: (ORconst [c] x) 19620 for { 19621 _ = v.Args[1] 19622 v_0 := v.Args[0] 19623 if v_0.Op != OpS390XMOVDconst { 19624 break 19625 } 19626 c := v_0.AuxInt 19627 x := v.Args[1] 19628 if !(isU32Bit(c)) { 19629 break 19630 } 19631 v.reset(OpS390XORconst) 19632 v.AuxInt = c 19633 v.AddArg(x) 19634 return true 19635 } 19636 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 19637 // cond: d == 64-c 19638 // result: (RLLGconst [c] x) 19639 for { 19640 _ = v.Args[1] 19641 v_0 := v.Args[0] 19642 if v_0.Op != OpS390XSLDconst { 19643 break 19644 } 19645 c := v_0.AuxInt 19646 x := v_0.Args[0] 19647 v_1 := v.Args[1] 19648 if v_1.Op != OpS390XSRDconst { 19649 break 19650 } 19651 d := v_1.AuxInt 19652 if x != v_1.Args[0] { 19653 break 19654 } 19655 if !(d == 64-c) { 19656 break 19657 } 19658 v.reset(OpS390XRLLGconst) 19659 v.AuxInt = c 19660 v.AddArg(x) 19661 return true 19662 } 19663 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 19664 // cond: d == 64-c 19665 // result: (RLLGconst [c] x) 19666 for { 19667 _ = v.Args[1] 19668 v_0 := v.Args[0] 19669 if v_0.Op != OpS390XSRDconst { 19670 break 19671 } 19672 d := v_0.AuxInt 19673 x := v_0.Args[0] 19674 v_1 := v.Args[1] 19675 if v_1.Op != OpS390XSLDconst { 19676 break 19677 } 19678 c := v_1.AuxInt 19679 if x != v_1.Args[0] { 19680 break 19681 } 19682 if !(d == 64-c) { 19683 break 19684 } 19685 v.reset(OpS390XRLLGconst) 19686 v.AuxInt = c 19687 v.AddArg(x) 19688 return true 19689 } 19690 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 19691 // cond: 19692 // result: (MOVDconst [c|d]) 19693 for { 19694 _ = v.Args[1] 19695 v_0 := v.Args[0] 19696 if v_0.Op != OpS390XMOVDconst { 19697 break 19698 } 19699 c := v_0.AuxInt 19700 v_1 := v.Args[1] 19701 if v_1.Op != OpS390XMOVDconst { 19702 break 19703 } 19704 d := v_1.AuxInt 19705 v.reset(OpS390XMOVDconst) 19706 v.AuxInt = c | d 19707 return true 19708 } 19709 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 19710 // cond: 19711 // result: (MOVDconst [c|d]) 19712 for { 19713 _ = v.Args[1] 19714 v_0 := v.Args[0] 19715 if v_0.Op != OpS390XMOVDconst { 19716 break 19717 } 19718 d := v_0.AuxInt 19719 v_1 := v.Args[1] 19720 if v_1.Op != OpS390XMOVDconst { 19721 break 19722 } 19723 c := v_1.AuxInt 19724 v.reset(OpS390XMOVDconst) 19725 v.AuxInt = c | d 19726 return true 19727 } 19728 // match: (OR x x) 19729 // cond: 19730 // result: x 19731 for { 19732 _ = v.Args[1] 19733 x := v.Args[0] 19734 if x != v.Args[1] { 19735 break 19736 } 19737 v.reset(OpCopy) 19738 v.Type = x.Type 19739 v.AddArg(x) 19740 return true 19741 } 19742 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 19743 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19744 // result: (ORload <t> [off] {sym} x ptr mem) 19745 for { 19746 t := v.Type 19747 _ = v.Args[1] 19748 x := v.Args[0] 19749 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19759 break 19760 } 19761 v.reset(OpS390XORload) 19762 v.Type = t 19763 v.AuxInt = off 19764 v.Aux = sym 19765 v.AddArg(x) 19766 v.AddArg(ptr) 19767 v.AddArg(mem) 19768 return true 19769 } 19770 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19771 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19772 // result: (ORload <t> [off] {sym} x ptr mem) 19773 for { 19774 t := v.Type 19775 _ = v.Args[1] 19776 g := v.Args[0] 19777 if g.Op != OpS390XMOVDload { 19778 break 19779 } 19780 off := g.AuxInt 19781 sym := g.Aux 19782 _ = g.Args[1] 19783 ptr := g.Args[0] 19784 mem := g.Args[1] 19785 x := v.Args[1] 19786 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19787 break 19788 } 19789 v.reset(OpS390XORload) 19790 v.Type = t 19791 v.AuxInt = off 19792 v.Aux = sym 19793 v.AddArg(x) 19794 v.AddArg(ptr) 19795 v.AddArg(mem) 19796 return true 19797 } 19798 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19799 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19800 // result: (ORload <t> [off] {sym} x ptr mem) 19801 for { 19802 t := v.Type 19803 _ = v.Args[1] 19804 g := v.Args[0] 19805 if g.Op != OpS390XMOVDload { 19806 break 19807 } 19808 off := g.AuxInt 19809 sym := g.Aux 19810 _ = g.Args[1] 19811 ptr := g.Args[0] 19812 mem := g.Args[1] 19813 x := v.Args[1] 19814 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19815 break 19816 } 19817 v.reset(OpS390XORload) 19818 v.Type = t 19819 v.AuxInt = off 19820 v.Aux = sym 19821 v.AddArg(x) 19822 v.AddArg(ptr) 19823 v.AddArg(mem) 19824 return true 19825 } 19826 return false 19827 } 19828 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 19829 b := v.Block 19830 _ = b 19831 typ := &b.Func.Config.Types 19832 _ = typ 19833 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 19834 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19835 // result: (ORload <t> [off] {sym} x ptr mem) 19836 for { 19837 t := v.Type 19838 _ = v.Args[1] 19839 x := v.Args[0] 19840 g := v.Args[1] 19841 if g.Op != OpS390XMOVDload { 19842 break 19843 } 19844 off := g.AuxInt 19845 sym := g.Aux 19846 _ = g.Args[1] 19847 ptr := g.Args[0] 19848 mem := g.Args[1] 19849 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19850 break 19851 } 19852 v.reset(OpS390XORload) 19853 v.Type = t 19854 v.AuxInt = off 19855 v.Aux = sym 19856 v.AddArg(x) 19857 v.AddArg(ptr) 19858 v.AddArg(mem) 19859 return true 19860 } 19861 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 19862 // 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) 19863 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19864 for { 19865 _ = v.Args[1] 19866 x1 := v.Args[0] 19867 if x1.Op != OpS390XMOVBZload { 19868 break 19869 } 19870 i1 := x1.AuxInt 19871 s := x1.Aux 19872 _ = x1.Args[1] 19873 p := x1.Args[0] 19874 mem := x1.Args[1] 19875 sh := v.Args[1] 19876 if sh.Op != OpS390XSLDconst { 19877 break 19878 } 19879 if sh.AuxInt != 8 { 19880 break 19881 } 19882 x0 := sh.Args[0] 19883 if x0.Op != OpS390XMOVBZload { 19884 break 19885 } 19886 i0 := x0.AuxInt 19887 if x0.Aux != s { 19888 break 19889 } 19890 _ = x0.Args[1] 19891 if p != x0.Args[0] { 19892 break 19893 } 19894 if mem != x0.Args[1] { 19895 break 19896 } 19897 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)) { 19898 break 19899 } 19900 b = mergePoint(b, x0, x1) 19901 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19902 v.reset(OpCopy) 19903 v.AddArg(v0) 19904 v0.AuxInt = i0 19905 v0.Aux = s 19906 v0.AddArg(p) 19907 v0.AddArg(mem) 19908 return true 19909 } 19910 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 19911 // 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) 19912 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19913 for { 19914 _ = v.Args[1] 19915 sh := v.Args[0] 19916 if sh.Op != OpS390XSLDconst { 19917 break 19918 } 19919 if sh.AuxInt != 8 { 19920 break 19921 } 19922 x0 := sh.Args[0] 19923 if x0.Op != OpS390XMOVBZload { 19924 break 19925 } 19926 i0 := x0.AuxInt 19927 s := x0.Aux 19928 _ = x0.Args[1] 19929 p := x0.Args[0] 19930 mem := x0.Args[1] 19931 x1 := v.Args[1] 19932 if x1.Op != OpS390XMOVBZload { 19933 break 19934 } 19935 i1 := x1.AuxInt 19936 if x1.Aux != s { 19937 break 19938 } 19939 _ = x1.Args[1] 19940 if p != x1.Args[0] { 19941 break 19942 } 19943 if mem != x1.Args[1] { 19944 break 19945 } 19946 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)) { 19947 break 19948 } 19949 b = mergePoint(b, x0, x1) 19950 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19951 v.reset(OpCopy) 19952 v.AddArg(v0) 19953 v0.AuxInt = i0 19954 v0.Aux = s 19955 v0.AddArg(p) 19956 v0.AddArg(mem) 19957 return true 19958 } 19959 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 19960 // 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) 19961 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19962 for { 19963 _ = v.Args[1] 19964 x1 := v.Args[0] 19965 if x1.Op != OpS390XMOVHZload { 19966 break 19967 } 19968 i1 := x1.AuxInt 19969 s := x1.Aux 19970 _ = x1.Args[1] 19971 p := x1.Args[0] 19972 mem := x1.Args[1] 19973 sh := v.Args[1] 19974 if sh.Op != OpS390XSLDconst { 19975 break 19976 } 19977 if sh.AuxInt != 16 { 19978 break 19979 } 19980 x0 := sh.Args[0] 19981 if x0.Op != OpS390XMOVHZload { 19982 break 19983 } 19984 i0 := x0.AuxInt 19985 if x0.Aux != s { 19986 break 19987 } 19988 _ = x0.Args[1] 19989 if p != x0.Args[0] { 19990 break 19991 } 19992 if mem != x0.Args[1] { 19993 break 19994 } 19995 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)) { 19996 break 19997 } 19998 b = mergePoint(b, x0, x1) 19999 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20000 v.reset(OpCopy) 20001 v.AddArg(v0) 20002 v0.AuxInt = i0 20003 v0.Aux = s 20004 v0.AddArg(p) 20005 v0.AddArg(mem) 20006 return true 20007 } 20008 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 20009 // 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) 20010 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 20011 for { 20012 _ = v.Args[1] 20013 sh := v.Args[0] 20014 if sh.Op != OpS390XSLDconst { 20015 break 20016 } 20017 if sh.AuxInt != 16 { 20018 break 20019 } 20020 x0 := sh.Args[0] 20021 if x0.Op != OpS390XMOVHZload { 20022 break 20023 } 20024 i0 := x0.AuxInt 20025 s := x0.Aux 20026 _ = x0.Args[1] 20027 p := x0.Args[0] 20028 mem := x0.Args[1] 20029 x1 := v.Args[1] 20030 if x1.Op != OpS390XMOVHZload { 20031 break 20032 } 20033 i1 := x1.AuxInt 20034 if x1.Aux != s { 20035 break 20036 } 20037 _ = x1.Args[1] 20038 if p != x1.Args[0] { 20039 break 20040 } 20041 if mem != x1.Args[1] { 20042 break 20043 } 20044 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)) { 20045 break 20046 } 20047 b = mergePoint(b, x0, x1) 20048 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20049 v.reset(OpCopy) 20050 v.AddArg(v0) 20051 v0.AuxInt = i0 20052 v0.Aux = s 20053 v0.AddArg(p) 20054 v0.AddArg(mem) 20055 return true 20056 } 20057 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 20058 // 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) 20059 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 20060 for { 20061 _ = v.Args[1] 20062 x1 := v.Args[0] 20063 if x1.Op != OpS390XMOVWZload { 20064 break 20065 } 20066 i1 := x1.AuxInt 20067 s := x1.Aux 20068 _ = x1.Args[1] 20069 p := x1.Args[0] 20070 mem := x1.Args[1] 20071 sh := v.Args[1] 20072 if sh.Op != OpS390XSLDconst { 20073 break 20074 } 20075 if sh.AuxInt != 32 { 20076 break 20077 } 20078 x0 := sh.Args[0] 20079 if x0.Op != OpS390XMOVWZload { 20080 break 20081 } 20082 i0 := x0.AuxInt 20083 if x0.Aux != s { 20084 break 20085 } 20086 _ = x0.Args[1] 20087 if p != x0.Args[0] { 20088 break 20089 } 20090 if mem != x0.Args[1] { 20091 break 20092 } 20093 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)) { 20094 break 20095 } 20096 b = mergePoint(b, x0, x1) 20097 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20098 v.reset(OpCopy) 20099 v.AddArg(v0) 20100 v0.AuxInt = i0 20101 v0.Aux = s 20102 v0.AddArg(p) 20103 v0.AddArg(mem) 20104 return true 20105 } 20106 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 20107 // 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) 20108 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 20109 for { 20110 _ = v.Args[1] 20111 sh := v.Args[0] 20112 if sh.Op != OpS390XSLDconst { 20113 break 20114 } 20115 if sh.AuxInt != 32 { 20116 break 20117 } 20118 x0 := sh.Args[0] 20119 if x0.Op != OpS390XMOVWZload { 20120 break 20121 } 20122 i0 := x0.AuxInt 20123 s := x0.Aux 20124 _ = x0.Args[1] 20125 p := x0.Args[0] 20126 mem := x0.Args[1] 20127 x1 := v.Args[1] 20128 if x1.Op != OpS390XMOVWZload { 20129 break 20130 } 20131 i1 := x1.AuxInt 20132 if x1.Aux != s { 20133 break 20134 } 20135 _ = x1.Args[1] 20136 if p != x1.Args[0] { 20137 break 20138 } 20139 if mem != x1.Args[1] { 20140 break 20141 } 20142 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)) { 20143 break 20144 } 20145 b = mergePoint(b, x0, x1) 20146 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20147 v.reset(OpCopy) 20148 v.AddArg(v0) 20149 v0.AuxInt = i0 20150 v0.Aux = s 20151 v0.AddArg(p) 20152 v0.AddArg(mem) 20153 return true 20154 } 20155 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 20156 // 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) 20157 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20158 for { 20159 _ = v.Args[1] 20160 s0 := v.Args[0] 20161 if s0.Op != OpS390XSLDconst { 20162 break 20163 } 20164 j0 := s0.AuxInt 20165 x0 := s0.Args[0] 20166 if x0.Op != OpS390XMOVBZload { 20167 break 20168 } 20169 i0 := x0.AuxInt 20170 s := x0.Aux 20171 _ = x0.Args[1] 20172 p := x0.Args[0] 20173 mem := x0.Args[1] 20174 or := v.Args[1] 20175 if or.Op != OpS390XOR { 20176 break 20177 } 20178 _ = or.Args[1] 20179 s1 := or.Args[0] 20180 if s1.Op != OpS390XSLDconst { 20181 break 20182 } 20183 j1 := s1.AuxInt 20184 x1 := s1.Args[0] 20185 if x1.Op != OpS390XMOVBZload { 20186 break 20187 } 20188 i1 := x1.AuxInt 20189 if x1.Aux != s { 20190 break 20191 } 20192 _ = x1.Args[1] 20193 if p != x1.Args[0] { 20194 break 20195 } 20196 if mem != x1.Args[1] { 20197 break 20198 } 20199 y := or.Args[1] 20200 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)) { 20201 break 20202 } 20203 b = mergePoint(b, x0, x1) 20204 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20205 v.reset(OpCopy) 20206 v.AddArg(v0) 20207 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20208 v1.AuxInt = j1 20209 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20210 v2.AuxInt = i0 20211 v2.Aux = s 20212 v2.AddArg(p) 20213 v2.AddArg(mem) 20214 v1.AddArg(v2) 20215 v0.AddArg(v1) 20216 v0.AddArg(y) 20217 return true 20218 } 20219 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 20220 // 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) 20221 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20222 for { 20223 _ = v.Args[1] 20224 s0 := v.Args[0] 20225 if s0.Op != OpS390XSLDconst { 20226 break 20227 } 20228 j0 := s0.AuxInt 20229 x0 := s0.Args[0] 20230 if x0.Op != OpS390XMOVBZload { 20231 break 20232 } 20233 i0 := x0.AuxInt 20234 s := x0.Aux 20235 _ = x0.Args[1] 20236 p := x0.Args[0] 20237 mem := x0.Args[1] 20238 or := v.Args[1] 20239 if or.Op != OpS390XOR { 20240 break 20241 } 20242 _ = or.Args[1] 20243 y := or.Args[0] 20244 s1 := or.Args[1] 20245 if s1.Op != OpS390XSLDconst { 20246 break 20247 } 20248 j1 := s1.AuxInt 20249 x1 := s1.Args[0] 20250 if x1.Op != OpS390XMOVBZload { 20251 break 20252 } 20253 i1 := x1.AuxInt 20254 if x1.Aux != s { 20255 break 20256 } 20257 _ = x1.Args[1] 20258 if p != x1.Args[0] { 20259 break 20260 } 20261 if mem != x1.Args[1] { 20262 break 20263 } 20264 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)) { 20265 break 20266 } 20267 b = mergePoint(b, x0, x1) 20268 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20269 v.reset(OpCopy) 20270 v.AddArg(v0) 20271 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20272 v1.AuxInt = j1 20273 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20274 v2.AuxInt = i0 20275 v2.Aux = s 20276 v2.AddArg(p) 20277 v2.AddArg(mem) 20278 v1.AddArg(v2) 20279 v0.AddArg(v1) 20280 v0.AddArg(y) 20281 return true 20282 } 20283 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20284 // 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) 20285 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20286 for { 20287 _ = v.Args[1] 20288 or := v.Args[0] 20289 if or.Op != OpS390XOR { 20290 break 20291 } 20292 _ = or.Args[1] 20293 s1 := or.Args[0] 20294 if s1.Op != OpS390XSLDconst { 20295 break 20296 } 20297 j1 := s1.AuxInt 20298 x1 := s1.Args[0] 20299 if x1.Op != OpS390XMOVBZload { 20300 break 20301 } 20302 i1 := x1.AuxInt 20303 s := x1.Aux 20304 _ = x1.Args[1] 20305 p := x1.Args[0] 20306 mem := x1.Args[1] 20307 y := or.Args[1] 20308 s0 := v.Args[1] 20309 if s0.Op != OpS390XSLDconst { 20310 break 20311 } 20312 j0 := s0.AuxInt 20313 x0 := s0.Args[0] 20314 if x0.Op != OpS390XMOVBZload { 20315 break 20316 } 20317 i0 := x0.AuxInt 20318 if x0.Aux != s { 20319 break 20320 } 20321 _ = x0.Args[1] 20322 if p != x0.Args[0] { 20323 break 20324 } 20325 if mem != x0.Args[1] { 20326 break 20327 } 20328 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)) { 20329 break 20330 } 20331 b = mergePoint(b, x0, x1) 20332 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20333 v.reset(OpCopy) 20334 v.AddArg(v0) 20335 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20336 v1.AuxInt = j1 20337 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20338 v2.AuxInt = i0 20339 v2.Aux = s 20340 v2.AddArg(p) 20341 v2.AddArg(mem) 20342 v1.AddArg(v2) 20343 v0.AddArg(v1) 20344 v0.AddArg(y) 20345 return true 20346 } 20347 return false 20348 } 20349 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 20350 b := v.Block 20351 _ = b 20352 typ := &b.Func.Config.Types 20353 _ = typ 20354 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20355 // 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) 20356 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20357 for { 20358 _ = v.Args[1] 20359 or := v.Args[0] 20360 if or.Op != OpS390XOR { 20361 break 20362 } 20363 _ = or.Args[1] 20364 y := or.Args[0] 20365 s1 := or.Args[1] 20366 if s1.Op != OpS390XSLDconst { 20367 break 20368 } 20369 j1 := s1.AuxInt 20370 x1 := s1.Args[0] 20371 if x1.Op != OpS390XMOVBZload { 20372 break 20373 } 20374 i1 := x1.AuxInt 20375 s := x1.Aux 20376 _ = x1.Args[1] 20377 p := x1.Args[0] 20378 mem := x1.Args[1] 20379 s0 := v.Args[1] 20380 if s0.Op != OpS390XSLDconst { 20381 break 20382 } 20383 j0 := s0.AuxInt 20384 x0 := s0.Args[0] 20385 if x0.Op != OpS390XMOVBZload { 20386 break 20387 } 20388 i0 := x0.AuxInt 20389 if x0.Aux != s { 20390 break 20391 } 20392 _ = x0.Args[1] 20393 if p != x0.Args[0] { 20394 break 20395 } 20396 if mem != x0.Args[1] { 20397 break 20398 } 20399 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)) { 20400 break 20401 } 20402 b = mergePoint(b, x0, x1) 20403 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20404 v.reset(OpCopy) 20405 v.AddArg(v0) 20406 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20407 v1.AuxInt = j1 20408 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20409 v2.AuxInt = i0 20410 v2.Aux = s 20411 v2.AddArg(p) 20412 v2.AddArg(mem) 20413 v1.AddArg(v2) 20414 v0.AddArg(v1) 20415 v0.AddArg(y) 20416 return true 20417 } 20418 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 20419 // 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) 20420 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20421 for { 20422 _ = v.Args[1] 20423 s0 := v.Args[0] 20424 if s0.Op != OpS390XSLDconst { 20425 break 20426 } 20427 j0 := s0.AuxInt 20428 x0 := s0.Args[0] 20429 if x0.Op != OpS390XMOVHZload { 20430 break 20431 } 20432 i0 := x0.AuxInt 20433 s := x0.Aux 20434 _ = x0.Args[1] 20435 p := x0.Args[0] 20436 mem := x0.Args[1] 20437 or := v.Args[1] 20438 if or.Op != OpS390XOR { 20439 break 20440 } 20441 _ = or.Args[1] 20442 s1 := or.Args[0] 20443 if s1.Op != OpS390XSLDconst { 20444 break 20445 } 20446 j1 := s1.AuxInt 20447 x1 := s1.Args[0] 20448 if x1.Op != OpS390XMOVHZload { 20449 break 20450 } 20451 i1 := x1.AuxInt 20452 if x1.Aux != s { 20453 break 20454 } 20455 _ = x1.Args[1] 20456 if p != x1.Args[0] { 20457 break 20458 } 20459 if mem != x1.Args[1] { 20460 break 20461 } 20462 y := or.Args[1] 20463 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)) { 20464 break 20465 } 20466 b = mergePoint(b, x0, x1) 20467 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20468 v.reset(OpCopy) 20469 v.AddArg(v0) 20470 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20471 v1.AuxInt = j1 20472 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20473 v2.AuxInt = i0 20474 v2.Aux = s 20475 v2.AddArg(p) 20476 v2.AddArg(mem) 20477 v1.AddArg(v2) 20478 v0.AddArg(v1) 20479 v0.AddArg(y) 20480 return true 20481 } 20482 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 20483 // 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) 20484 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20485 for { 20486 _ = v.Args[1] 20487 s0 := v.Args[0] 20488 if s0.Op != OpS390XSLDconst { 20489 break 20490 } 20491 j0 := s0.AuxInt 20492 x0 := s0.Args[0] 20493 if x0.Op != OpS390XMOVHZload { 20494 break 20495 } 20496 i0 := x0.AuxInt 20497 s := x0.Aux 20498 _ = x0.Args[1] 20499 p := x0.Args[0] 20500 mem := x0.Args[1] 20501 or := v.Args[1] 20502 if or.Op != OpS390XOR { 20503 break 20504 } 20505 _ = or.Args[1] 20506 y := or.Args[0] 20507 s1 := or.Args[1] 20508 if s1.Op != OpS390XSLDconst { 20509 break 20510 } 20511 j1 := s1.AuxInt 20512 x1 := s1.Args[0] 20513 if x1.Op != OpS390XMOVHZload { 20514 break 20515 } 20516 i1 := x1.AuxInt 20517 if x1.Aux != s { 20518 break 20519 } 20520 _ = x1.Args[1] 20521 if p != x1.Args[0] { 20522 break 20523 } 20524 if mem != x1.Args[1] { 20525 break 20526 } 20527 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)) { 20528 break 20529 } 20530 b = mergePoint(b, x0, x1) 20531 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20532 v.reset(OpCopy) 20533 v.AddArg(v0) 20534 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20535 v1.AuxInt = j1 20536 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20537 v2.AuxInt = i0 20538 v2.Aux = s 20539 v2.AddArg(p) 20540 v2.AddArg(mem) 20541 v1.AddArg(v2) 20542 v0.AddArg(v1) 20543 v0.AddArg(y) 20544 return true 20545 } 20546 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20547 // 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) 20548 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20549 for { 20550 _ = v.Args[1] 20551 or := v.Args[0] 20552 if or.Op != OpS390XOR { 20553 break 20554 } 20555 _ = or.Args[1] 20556 s1 := or.Args[0] 20557 if s1.Op != OpS390XSLDconst { 20558 break 20559 } 20560 j1 := s1.AuxInt 20561 x1 := s1.Args[0] 20562 if x1.Op != OpS390XMOVHZload { 20563 break 20564 } 20565 i1 := x1.AuxInt 20566 s := x1.Aux 20567 _ = x1.Args[1] 20568 p := x1.Args[0] 20569 mem := x1.Args[1] 20570 y := or.Args[1] 20571 s0 := v.Args[1] 20572 if s0.Op != OpS390XSLDconst { 20573 break 20574 } 20575 j0 := s0.AuxInt 20576 x0 := s0.Args[0] 20577 if x0.Op != OpS390XMOVHZload { 20578 break 20579 } 20580 i0 := x0.AuxInt 20581 if x0.Aux != s { 20582 break 20583 } 20584 _ = x0.Args[1] 20585 if p != x0.Args[0] { 20586 break 20587 } 20588 if mem != x0.Args[1] { 20589 break 20590 } 20591 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)) { 20592 break 20593 } 20594 b = mergePoint(b, x0, x1) 20595 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20596 v.reset(OpCopy) 20597 v.AddArg(v0) 20598 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20599 v1.AuxInt = j1 20600 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20601 v2.AuxInt = i0 20602 v2.Aux = s 20603 v2.AddArg(p) 20604 v2.AddArg(mem) 20605 v1.AddArg(v2) 20606 v0.AddArg(v1) 20607 v0.AddArg(y) 20608 return true 20609 } 20610 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20611 // 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) 20612 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20613 for { 20614 _ = v.Args[1] 20615 or := v.Args[0] 20616 if or.Op != OpS390XOR { 20617 break 20618 } 20619 _ = or.Args[1] 20620 y := or.Args[0] 20621 s1 := or.Args[1] 20622 if s1.Op != OpS390XSLDconst { 20623 break 20624 } 20625 j1 := s1.AuxInt 20626 x1 := s1.Args[0] 20627 if x1.Op != OpS390XMOVHZload { 20628 break 20629 } 20630 i1 := x1.AuxInt 20631 s := x1.Aux 20632 _ = x1.Args[1] 20633 p := x1.Args[0] 20634 mem := x1.Args[1] 20635 s0 := v.Args[1] 20636 if s0.Op != OpS390XSLDconst { 20637 break 20638 } 20639 j0 := s0.AuxInt 20640 x0 := s0.Args[0] 20641 if x0.Op != OpS390XMOVHZload { 20642 break 20643 } 20644 i0 := x0.AuxInt 20645 if x0.Aux != s { 20646 break 20647 } 20648 _ = x0.Args[1] 20649 if p != x0.Args[0] { 20650 break 20651 } 20652 if mem != x0.Args[1] { 20653 break 20654 } 20655 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)) { 20656 break 20657 } 20658 b = mergePoint(b, x0, x1) 20659 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20660 v.reset(OpCopy) 20661 v.AddArg(v0) 20662 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20663 v1.AuxInt = j1 20664 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20665 v2.AuxInt = i0 20666 v2.Aux = s 20667 v2.AddArg(p) 20668 v2.AddArg(mem) 20669 v1.AddArg(v2) 20670 v0.AddArg(v1) 20671 v0.AddArg(y) 20672 return true 20673 } 20674 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20675 // 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) 20676 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20677 for { 20678 _ = v.Args[1] 20679 x1 := v.Args[0] 20680 if x1.Op != OpS390XMOVBZloadidx { 20681 break 20682 } 20683 i1 := x1.AuxInt 20684 s := x1.Aux 20685 _ = x1.Args[2] 20686 p := x1.Args[0] 20687 idx := x1.Args[1] 20688 mem := x1.Args[2] 20689 sh := v.Args[1] 20690 if sh.Op != OpS390XSLDconst { 20691 break 20692 } 20693 if sh.AuxInt != 8 { 20694 break 20695 } 20696 x0 := sh.Args[0] 20697 if x0.Op != OpS390XMOVBZloadidx { 20698 break 20699 } 20700 i0 := x0.AuxInt 20701 if x0.Aux != s { 20702 break 20703 } 20704 _ = x0.Args[2] 20705 if p != x0.Args[0] { 20706 break 20707 } 20708 if idx != x0.Args[1] { 20709 break 20710 } 20711 if mem != x0.Args[2] { 20712 break 20713 } 20714 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)) { 20715 break 20716 } 20717 b = mergePoint(b, x0, x1) 20718 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20719 v.reset(OpCopy) 20720 v.AddArg(v0) 20721 v0.AuxInt = i0 20722 v0.Aux = s 20723 v0.AddArg(p) 20724 v0.AddArg(idx) 20725 v0.AddArg(mem) 20726 return true 20727 } 20728 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20729 // 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) 20730 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20731 for { 20732 _ = v.Args[1] 20733 x1 := v.Args[0] 20734 if x1.Op != OpS390XMOVBZloadidx { 20735 break 20736 } 20737 i1 := x1.AuxInt 20738 s := x1.Aux 20739 _ = x1.Args[2] 20740 idx := x1.Args[0] 20741 p := x1.Args[1] 20742 mem := x1.Args[2] 20743 sh := v.Args[1] 20744 if sh.Op != OpS390XSLDconst { 20745 break 20746 } 20747 if sh.AuxInt != 8 { 20748 break 20749 } 20750 x0 := sh.Args[0] 20751 if x0.Op != OpS390XMOVBZloadidx { 20752 break 20753 } 20754 i0 := x0.AuxInt 20755 if x0.Aux != s { 20756 break 20757 } 20758 _ = x0.Args[2] 20759 if p != x0.Args[0] { 20760 break 20761 } 20762 if idx != x0.Args[1] { 20763 break 20764 } 20765 if mem != x0.Args[2] { 20766 break 20767 } 20768 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)) { 20769 break 20770 } 20771 b = mergePoint(b, x0, x1) 20772 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20773 v.reset(OpCopy) 20774 v.AddArg(v0) 20775 v0.AuxInt = i0 20776 v0.Aux = s 20777 v0.AddArg(p) 20778 v0.AddArg(idx) 20779 v0.AddArg(mem) 20780 return true 20781 } 20782 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20783 // 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) 20784 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20785 for { 20786 _ = v.Args[1] 20787 x1 := v.Args[0] 20788 if x1.Op != OpS390XMOVBZloadidx { 20789 break 20790 } 20791 i1 := x1.AuxInt 20792 s := x1.Aux 20793 _ = x1.Args[2] 20794 p := x1.Args[0] 20795 idx := x1.Args[1] 20796 mem := x1.Args[2] 20797 sh := v.Args[1] 20798 if sh.Op != OpS390XSLDconst { 20799 break 20800 } 20801 if sh.AuxInt != 8 { 20802 break 20803 } 20804 x0 := sh.Args[0] 20805 if x0.Op != OpS390XMOVBZloadidx { 20806 break 20807 } 20808 i0 := x0.AuxInt 20809 if x0.Aux != s { 20810 break 20811 } 20812 _ = x0.Args[2] 20813 if idx != x0.Args[0] { 20814 break 20815 } 20816 if p != x0.Args[1] { 20817 break 20818 } 20819 if mem != x0.Args[2] { 20820 break 20821 } 20822 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)) { 20823 break 20824 } 20825 b = mergePoint(b, x0, x1) 20826 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20827 v.reset(OpCopy) 20828 v.AddArg(v0) 20829 v0.AuxInt = i0 20830 v0.Aux = s 20831 v0.AddArg(p) 20832 v0.AddArg(idx) 20833 v0.AddArg(mem) 20834 return true 20835 } 20836 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20837 // 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) 20838 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20839 for { 20840 _ = v.Args[1] 20841 x1 := v.Args[0] 20842 if x1.Op != OpS390XMOVBZloadidx { 20843 break 20844 } 20845 i1 := x1.AuxInt 20846 s := x1.Aux 20847 _ = x1.Args[2] 20848 idx := x1.Args[0] 20849 p := x1.Args[1] 20850 mem := x1.Args[2] 20851 sh := v.Args[1] 20852 if sh.Op != OpS390XSLDconst { 20853 break 20854 } 20855 if sh.AuxInt != 8 { 20856 break 20857 } 20858 x0 := sh.Args[0] 20859 if x0.Op != OpS390XMOVBZloadidx { 20860 break 20861 } 20862 i0 := x0.AuxInt 20863 if x0.Aux != s { 20864 break 20865 } 20866 _ = x0.Args[2] 20867 if idx != x0.Args[0] { 20868 break 20869 } 20870 if p != x0.Args[1] { 20871 break 20872 } 20873 if mem != x0.Args[2] { 20874 break 20875 } 20876 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)) { 20877 break 20878 } 20879 b = mergePoint(b, x0, x1) 20880 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20881 v.reset(OpCopy) 20882 v.AddArg(v0) 20883 v0.AuxInt = i0 20884 v0.Aux = s 20885 v0.AddArg(p) 20886 v0.AddArg(idx) 20887 v0.AddArg(mem) 20888 return true 20889 } 20890 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20891 // 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) 20892 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20893 for { 20894 _ = v.Args[1] 20895 sh := v.Args[0] 20896 if sh.Op != OpS390XSLDconst { 20897 break 20898 } 20899 if sh.AuxInt != 8 { 20900 break 20901 } 20902 x0 := sh.Args[0] 20903 if x0.Op != OpS390XMOVBZloadidx { 20904 break 20905 } 20906 i0 := x0.AuxInt 20907 s := x0.Aux 20908 _ = x0.Args[2] 20909 p := x0.Args[0] 20910 idx := x0.Args[1] 20911 mem := x0.Args[2] 20912 x1 := v.Args[1] 20913 if x1.Op != OpS390XMOVBZloadidx { 20914 break 20915 } 20916 i1 := x1.AuxInt 20917 if x1.Aux != s { 20918 break 20919 } 20920 _ = x1.Args[2] 20921 if p != x1.Args[0] { 20922 break 20923 } 20924 if idx != x1.Args[1] { 20925 break 20926 } 20927 if mem != x1.Args[2] { 20928 break 20929 } 20930 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)) { 20931 break 20932 } 20933 b = mergePoint(b, x0, x1) 20934 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20935 v.reset(OpCopy) 20936 v.AddArg(v0) 20937 v0.AuxInt = i0 20938 v0.Aux = s 20939 v0.AddArg(p) 20940 v0.AddArg(idx) 20941 v0.AddArg(mem) 20942 return true 20943 } 20944 return false 20945 } 20946 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 20947 b := v.Block 20948 _ = b 20949 typ := &b.Func.Config.Types 20950 _ = typ 20951 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20952 // 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) 20953 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20954 for { 20955 _ = v.Args[1] 20956 sh := v.Args[0] 20957 if sh.Op != OpS390XSLDconst { 20958 break 20959 } 20960 if sh.AuxInt != 8 { 20961 break 20962 } 20963 x0 := sh.Args[0] 20964 if x0.Op != OpS390XMOVBZloadidx { 20965 break 20966 } 20967 i0 := x0.AuxInt 20968 s := x0.Aux 20969 _ = x0.Args[2] 20970 idx := x0.Args[0] 20971 p := x0.Args[1] 20972 mem := x0.Args[2] 20973 x1 := v.Args[1] 20974 if x1.Op != OpS390XMOVBZloadidx { 20975 break 20976 } 20977 i1 := x1.AuxInt 20978 if x1.Aux != s { 20979 break 20980 } 20981 _ = x1.Args[2] 20982 if p != x1.Args[0] { 20983 break 20984 } 20985 if idx != x1.Args[1] { 20986 break 20987 } 20988 if mem != x1.Args[2] { 20989 break 20990 } 20991 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)) { 20992 break 20993 } 20994 b = mergePoint(b, x0, x1) 20995 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20996 v.reset(OpCopy) 20997 v.AddArg(v0) 20998 v0.AuxInt = i0 20999 v0.Aux = s 21000 v0.AddArg(p) 21001 v0.AddArg(idx) 21002 v0.AddArg(mem) 21003 return true 21004 } 21005 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 21006 // 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) 21007 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 21008 for { 21009 _ = v.Args[1] 21010 sh := v.Args[0] 21011 if sh.Op != OpS390XSLDconst { 21012 break 21013 } 21014 if sh.AuxInt != 8 { 21015 break 21016 } 21017 x0 := sh.Args[0] 21018 if x0.Op != OpS390XMOVBZloadidx { 21019 break 21020 } 21021 i0 := x0.AuxInt 21022 s := x0.Aux 21023 _ = x0.Args[2] 21024 p := x0.Args[0] 21025 idx := x0.Args[1] 21026 mem := x0.Args[2] 21027 x1 := v.Args[1] 21028 if x1.Op != OpS390XMOVBZloadidx { 21029 break 21030 } 21031 i1 := x1.AuxInt 21032 if x1.Aux != s { 21033 break 21034 } 21035 _ = x1.Args[2] 21036 if idx != x1.Args[0] { 21037 break 21038 } 21039 if p != x1.Args[1] { 21040 break 21041 } 21042 if mem != x1.Args[2] { 21043 break 21044 } 21045 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)) { 21046 break 21047 } 21048 b = mergePoint(b, x0, x1) 21049 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21050 v.reset(OpCopy) 21051 v.AddArg(v0) 21052 v0.AuxInt = i0 21053 v0.Aux = s 21054 v0.AddArg(p) 21055 v0.AddArg(idx) 21056 v0.AddArg(mem) 21057 return true 21058 } 21059 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 21060 // 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) 21061 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 21062 for { 21063 _ = v.Args[1] 21064 sh := v.Args[0] 21065 if sh.Op != OpS390XSLDconst { 21066 break 21067 } 21068 if sh.AuxInt != 8 { 21069 break 21070 } 21071 x0 := sh.Args[0] 21072 if x0.Op != OpS390XMOVBZloadidx { 21073 break 21074 } 21075 i0 := x0.AuxInt 21076 s := x0.Aux 21077 _ = x0.Args[2] 21078 idx := x0.Args[0] 21079 p := x0.Args[1] 21080 mem := x0.Args[2] 21081 x1 := v.Args[1] 21082 if x1.Op != OpS390XMOVBZloadidx { 21083 break 21084 } 21085 i1 := x1.AuxInt 21086 if x1.Aux != s { 21087 break 21088 } 21089 _ = x1.Args[2] 21090 if idx != x1.Args[0] { 21091 break 21092 } 21093 if p != x1.Args[1] { 21094 break 21095 } 21096 if mem != x1.Args[2] { 21097 break 21098 } 21099 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)) { 21100 break 21101 } 21102 b = mergePoint(b, x0, x1) 21103 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21104 v.reset(OpCopy) 21105 v.AddArg(v0) 21106 v0.AuxInt = i0 21107 v0.Aux = s 21108 v0.AddArg(p) 21109 v0.AddArg(idx) 21110 v0.AddArg(mem) 21111 return true 21112 } 21113 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21114 // 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) 21115 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21116 for { 21117 _ = v.Args[1] 21118 x1 := v.Args[0] 21119 if x1.Op != OpS390XMOVHZloadidx { 21120 break 21121 } 21122 i1 := x1.AuxInt 21123 s := x1.Aux 21124 _ = x1.Args[2] 21125 p := x1.Args[0] 21126 idx := x1.Args[1] 21127 mem := x1.Args[2] 21128 sh := v.Args[1] 21129 if sh.Op != OpS390XSLDconst { 21130 break 21131 } 21132 if sh.AuxInt != 16 { 21133 break 21134 } 21135 x0 := sh.Args[0] 21136 if x0.Op != OpS390XMOVHZloadidx { 21137 break 21138 } 21139 i0 := x0.AuxInt 21140 if x0.Aux != s { 21141 break 21142 } 21143 _ = x0.Args[2] 21144 if p != x0.Args[0] { 21145 break 21146 } 21147 if idx != x0.Args[1] { 21148 break 21149 } 21150 if mem != x0.Args[2] { 21151 break 21152 } 21153 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)) { 21154 break 21155 } 21156 b = mergePoint(b, x0, x1) 21157 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21158 v.reset(OpCopy) 21159 v.AddArg(v0) 21160 v0.AuxInt = i0 21161 v0.Aux = s 21162 v0.AddArg(p) 21163 v0.AddArg(idx) 21164 v0.AddArg(mem) 21165 return true 21166 } 21167 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21168 // 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) 21169 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21170 for { 21171 _ = v.Args[1] 21172 x1 := v.Args[0] 21173 if x1.Op != OpS390XMOVHZloadidx { 21174 break 21175 } 21176 i1 := x1.AuxInt 21177 s := x1.Aux 21178 _ = x1.Args[2] 21179 idx := x1.Args[0] 21180 p := x1.Args[1] 21181 mem := x1.Args[2] 21182 sh := v.Args[1] 21183 if sh.Op != OpS390XSLDconst { 21184 break 21185 } 21186 if sh.AuxInt != 16 { 21187 break 21188 } 21189 x0 := sh.Args[0] 21190 if x0.Op != OpS390XMOVHZloadidx { 21191 break 21192 } 21193 i0 := x0.AuxInt 21194 if x0.Aux != s { 21195 break 21196 } 21197 _ = x0.Args[2] 21198 if p != x0.Args[0] { 21199 break 21200 } 21201 if idx != x0.Args[1] { 21202 break 21203 } 21204 if mem != x0.Args[2] { 21205 break 21206 } 21207 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)) { 21208 break 21209 } 21210 b = mergePoint(b, x0, x1) 21211 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21212 v.reset(OpCopy) 21213 v.AddArg(v0) 21214 v0.AuxInt = i0 21215 v0.Aux = s 21216 v0.AddArg(p) 21217 v0.AddArg(idx) 21218 v0.AddArg(mem) 21219 return true 21220 } 21221 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21222 // 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) 21223 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21224 for { 21225 _ = v.Args[1] 21226 x1 := v.Args[0] 21227 if x1.Op != OpS390XMOVHZloadidx { 21228 break 21229 } 21230 i1 := x1.AuxInt 21231 s := x1.Aux 21232 _ = x1.Args[2] 21233 p := x1.Args[0] 21234 idx := x1.Args[1] 21235 mem := x1.Args[2] 21236 sh := v.Args[1] 21237 if sh.Op != OpS390XSLDconst { 21238 break 21239 } 21240 if sh.AuxInt != 16 { 21241 break 21242 } 21243 x0 := sh.Args[0] 21244 if x0.Op != OpS390XMOVHZloadidx { 21245 break 21246 } 21247 i0 := x0.AuxInt 21248 if x0.Aux != s { 21249 break 21250 } 21251 _ = x0.Args[2] 21252 if idx != x0.Args[0] { 21253 break 21254 } 21255 if p != x0.Args[1] { 21256 break 21257 } 21258 if mem != x0.Args[2] { 21259 break 21260 } 21261 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)) { 21262 break 21263 } 21264 b = mergePoint(b, x0, x1) 21265 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21266 v.reset(OpCopy) 21267 v.AddArg(v0) 21268 v0.AuxInt = i0 21269 v0.Aux = s 21270 v0.AddArg(p) 21271 v0.AddArg(idx) 21272 v0.AddArg(mem) 21273 return true 21274 } 21275 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21276 // 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) 21277 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21278 for { 21279 _ = v.Args[1] 21280 x1 := v.Args[0] 21281 if x1.Op != OpS390XMOVHZloadidx { 21282 break 21283 } 21284 i1 := x1.AuxInt 21285 s := x1.Aux 21286 _ = x1.Args[2] 21287 idx := x1.Args[0] 21288 p := x1.Args[1] 21289 mem := x1.Args[2] 21290 sh := v.Args[1] 21291 if sh.Op != OpS390XSLDconst { 21292 break 21293 } 21294 if sh.AuxInt != 16 { 21295 break 21296 } 21297 x0 := sh.Args[0] 21298 if x0.Op != OpS390XMOVHZloadidx { 21299 break 21300 } 21301 i0 := x0.AuxInt 21302 if x0.Aux != s { 21303 break 21304 } 21305 _ = x0.Args[2] 21306 if idx != x0.Args[0] { 21307 break 21308 } 21309 if p != x0.Args[1] { 21310 break 21311 } 21312 if mem != x0.Args[2] { 21313 break 21314 } 21315 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)) { 21316 break 21317 } 21318 b = mergePoint(b, x0, x1) 21319 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21320 v.reset(OpCopy) 21321 v.AddArg(v0) 21322 v0.AuxInt = i0 21323 v0.Aux = s 21324 v0.AddArg(p) 21325 v0.AddArg(idx) 21326 v0.AddArg(mem) 21327 return true 21328 } 21329 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21330 // 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) 21331 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21332 for { 21333 _ = v.Args[1] 21334 sh := v.Args[0] 21335 if sh.Op != OpS390XSLDconst { 21336 break 21337 } 21338 if sh.AuxInt != 16 { 21339 break 21340 } 21341 x0 := sh.Args[0] 21342 if x0.Op != OpS390XMOVHZloadidx { 21343 break 21344 } 21345 i0 := x0.AuxInt 21346 s := x0.Aux 21347 _ = x0.Args[2] 21348 p := x0.Args[0] 21349 idx := x0.Args[1] 21350 mem := x0.Args[2] 21351 x1 := v.Args[1] 21352 if x1.Op != OpS390XMOVHZloadidx { 21353 break 21354 } 21355 i1 := x1.AuxInt 21356 if x1.Aux != s { 21357 break 21358 } 21359 _ = x1.Args[2] 21360 if p != x1.Args[0] { 21361 break 21362 } 21363 if idx != x1.Args[1] { 21364 break 21365 } 21366 if mem != x1.Args[2] { 21367 break 21368 } 21369 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)) { 21370 break 21371 } 21372 b = mergePoint(b, x0, x1) 21373 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21374 v.reset(OpCopy) 21375 v.AddArg(v0) 21376 v0.AuxInt = i0 21377 v0.Aux = s 21378 v0.AddArg(p) 21379 v0.AddArg(idx) 21380 v0.AddArg(mem) 21381 return true 21382 } 21383 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21384 // 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) 21385 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21386 for { 21387 _ = v.Args[1] 21388 sh := v.Args[0] 21389 if sh.Op != OpS390XSLDconst { 21390 break 21391 } 21392 if sh.AuxInt != 16 { 21393 break 21394 } 21395 x0 := sh.Args[0] 21396 if x0.Op != OpS390XMOVHZloadidx { 21397 break 21398 } 21399 i0 := x0.AuxInt 21400 s := x0.Aux 21401 _ = x0.Args[2] 21402 idx := x0.Args[0] 21403 p := x0.Args[1] 21404 mem := x0.Args[2] 21405 x1 := v.Args[1] 21406 if x1.Op != OpS390XMOVHZloadidx { 21407 break 21408 } 21409 i1 := x1.AuxInt 21410 if x1.Aux != s { 21411 break 21412 } 21413 _ = x1.Args[2] 21414 if p != x1.Args[0] { 21415 break 21416 } 21417 if idx != x1.Args[1] { 21418 break 21419 } 21420 if mem != x1.Args[2] { 21421 break 21422 } 21423 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)) { 21424 break 21425 } 21426 b = mergePoint(b, x0, x1) 21427 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21428 v.reset(OpCopy) 21429 v.AddArg(v0) 21430 v0.AuxInt = i0 21431 v0.Aux = s 21432 v0.AddArg(p) 21433 v0.AddArg(idx) 21434 v0.AddArg(mem) 21435 return true 21436 } 21437 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21438 // 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) 21439 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21440 for { 21441 _ = v.Args[1] 21442 sh := v.Args[0] 21443 if sh.Op != OpS390XSLDconst { 21444 break 21445 } 21446 if sh.AuxInt != 16 { 21447 break 21448 } 21449 x0 := sh.Args[0] 21450 if x0.Op != OpS390XMOVHZloadidx { 21451 break 21452 } 21453 i0 := x0.AuxInt 21454 s := x0.Aux 21455 _ = x0.Args[2] 21456 p := x0.Args[0] 21457 idx := x0.Args[1] 21458 mem := x0.Args[2] 21459 x1 := v.Args[1] 21460 if x1.Op != OpS390XMOVHZloadidx { 21461 break 21462 } 21463 i1 := x1.AuxInt 21464 if x1.Aux != s { 21465 break 21466 } 21467 _ = x1.Args[2] 21468 if idx != x1.Args[0] { 21469 break 21470 } 21471 if p != x1.Args[1] { 21472 break 21473 } 21474 if mem != x1.Args[2] { 21475 break 21476 } 21477 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)) { 21478 break 21479 } 21480 b = mergePoint(b, x0, x1) 21481 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21482 v.reset(OpCopy) 21483 v.AddArg(v0) 21484 v0.AuxInt = i0 21485 v0.Aux = s 21486 v0.AddArg(p) 21487 v0.AddArg(idx) 21488 v0.AddArg(mem) 21489 return true 21490 } 21491 return false 21492 } 21493 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 21494 b := v.Block 21495 _ = b 21496 typ := &b.Func.Config.Types 21497 _ = typ 21498 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21499 // 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) 21500 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21501 for { 21502 _ = v.Args[1] 21503 sh := v.Args[0] 21504 if sh.Op != OpS390XSLDconst { 21505 break 21506 } 21507 if sh.AuxInt != 16 { 21508 break 21509 } 21510 x0 := sh.Args[0] 21511 if x0.Op != OpS390XMOVHZloadidx { 21512 break 21513 } 21514 i0 := x0.AuxInt 21515 s := x0.Aux 21516 _ = x0.Args[2] 21517 idx := x0.Args[0] 21518 p := x0.Args[1] 21519 mem := x0.Args[2] 21520 x1 := v.Args[1] 21521 if x1.Op != OpS390XMOVHZloadidx { 21522 break 21523 } 21524 i1 := x1.AuxInt 21525 if x1.Aux != s { 21526 break 21527 } 21528 _ = x1.Args[2] 21529 if idx != x1.Args[0] { 21530 break 21531 } 21532 if p != x1.Args[1] { 21533 break 21534 } 21535 if mem != x1.Args[2] { 21536 break 21537 } 21538 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)) { 21539 break 21540 } 21541 b = mergePoint(b, x0, x1) 21542 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21543 v.reset(OpCopy) 21544 v.AddArg(v0) 21545 v0.AuxInt = i0 21546 v0.Aux = s 21547 v0.AddArg(p) 21548 v0.AddArg(idx) 21549 v0.AddArg(mem) 21550 return true 21551 } 21552 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21553 // 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) 21554 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21555 for { 21556 _ = v.Args[1] 21557 x1 := v.Args[0] 21558 if x1.Op != OpS390XMOVWZloadidx { 21559 break 21560 } 21561 i1 := x1.AuxInt 21562 s := x1.Aux 21563 _ = x1.Args[2] 21564 p := x1.Args[0] 21565 idx := x1.Args[1] 21566 mem := x1.Args[2] 21567 sh := v.Args[1] 21568 if sh.Op != OpS390XSLDconst { 21569 break 21570 } 21571 if sh.AuxInt != 32 { 21572 break 21573 } 21574 x0 := sh.Args[0] 21575 if x0.Op != OpS390XMOVWZloadidx { 21576 break 21577 } 21578 i0 := x0.AuxInt 21579 if x0.Aux != s { 21580 break 21581 } 21582 _ = x0.Args[2] 21583 if p != x0.Args[0] { 21584 break 21585 } 21586 if idx != x0.Args[1] { 21587 break 21588 } 21589 if mem != x0.Args[2] { 21590 break 21591 } 21592 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)) { 21593 break 21594 } 21595 b = mergePoint(b, x0, x1) 21596 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21597 v.reset(OpCopy) 21598 v.AddArg(v0) 21599 v0.AuxInt = i0 21600 v0.Aux = s 21601 v0.AddArg(p) 21602 v0.AddArg(idx) 21603 v0.AddArg(mem) 21604 return true 21605 } 21606 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21607 // 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) 21608 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21609 for { 21610 _ = v.Args[1] 21611 x1 := v.Args[0] 21612 if x1.Op != OpS390XMOVWZloadidx { 21613 break 21614 } 21615 i1 := x1.AuxInt 21616 s := x1.Aux 21617 _ = x1.Args[2] 21618 idx := x1.Args[0] 21619 p := x1.Args[1] 21620 mem := x1.Args[2] 21621 sh := v.Args[1] 21622 if sh.Op != OpS390XSLDconst { 21623 break 21624 } 21625 if sh.AuxInt != 32 { 21626 break 21627 } 21628 x0 := sh.Args[0] 21629 if x0.Op != OpS390XMOVWZloadidx { 21630 break 21631 } 21632 i0 := x0.AuxInt 21633 if x0.Aux != s { 21634 break 21635 } 21636 _ = x0.Args[2] 21637 if p != x0.Args[0] { 21638 break 21639 } 21640 if idx != x0.Args[1] { 21641 break 21642 } 21643 if mem != x0.Args[2] { 21644 break 21645 } 21646 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)) { 21647 break 21648 } 21649 b = mergePoint(b, x0, x1) 21650 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21651 v.reset(OpCopy) 21652 v.AddArg(v0) 21653 v0.AuxInt = i0 21654 v0.Aux = s 21655 v0.AddArg(p) 21656 v0.AddArg(idx) 21657 v0.AddArg(mem) 21658 return true 21659 } 21660 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21661 // 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) 21662 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21663 for { 21664 _ = v.Args[1] 21665 x1 := v.Args[0] 21666 if x1.Op != OpS390XMOVWZloadidx { 21667 break 21668 } 21669 i1 := x1.AuxInt 21670 s := x1.Aux 21671 _ = x1.Args[2] 21672 p := x1.Args[0] 21673 idx := x1.Args[1] 21674 mem := x1.Args[2] 21675 sh := v.Args[1] 21676 if sh.Op != OpS390XSLDconst { 21677 break 21678 } 21679 if sh.AuxInt != 32 { 21680 break 21681 } 21682 x0 := sh.Args[0] 21683 if x0.Op != OpS390XMOVWZloadidx { 21684 break 21685 } 21686 i0 := x0.AuxInt 21687 if x0.Aux != s { 21688 break 21689 } 21690 _ = x0.Args[2] 21691 if idx != x0.Args[0] { 21692 break 21693 } 21694 if p != x0.Args[1] { 21695 break 21696 } 21697 if mem != x0.Args[2] { 21698 break 21699 } 21700 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)) { 21701 break 21702 } 21703 b = mergePoint(b, x0, x1) 21704 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21705 v.reset(OpCopy) 21706 v.AddArg(v0) 21707 v0.AuxInt = i0 21708 v0.Aux = s 21709 v0.AddArg(p) 21710 v0.AddArg(idx) 21711 v0.AddArg(mem) 21712 return true 21713 } 21714 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21715 // 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) 21716 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21717 for { 21718 _ = v.Args[1] 21719 x1 := v.Args[0] 21720 if x1.Op != OpS390XMOVWZloadidx { 21721 break 21722 } 21723 i1 := x1.AuxInt 21724 s := x1.Aux 21725 _ = x1.Args[2] 21726 idx := x1.Args[0] 21727 p := x1.Args[1] 21728 mem := x1.Args[2] 21729 sh := v.Args[1] 21730 if sh.Op != OpS390XSLDconst { 21731 break 21732 } 21733 if sh.AuxInt != 32 { 21734 break 21735 } 21736 x0 := sh.Args[0] 21737 if x0.Op != OpS390XMOVWZloadidx { 21738 break 21739 } 21740 i0 := x0.AuxInt 21741 if x0.Aux != s { 21742 break 21743 } 21744 _ = x0.Args[2] 21745 if idx != x0.Args[0] { 21746 break 21747 } 21748 if p != x0.Args[1] { 21749 break 21750 } 21751 if mem != x0.Args[2] { 21752 break 21753 } 21754 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)) { 21755 break 21756 } 21757 b = mergePoint(b, x0, x1) 21758 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21759 v.reset(OpCopy) 21760 v.AddArg(v0) 21761 v0.AuxInt = i0 21762 v0.Aux = s 21763 v0.AddArg(p) 21764 v0.AddArg(idx) 21765 v0.AddArg(mem) 21766 return true 21767 } 21768 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21769 // 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) 21770 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21771 for { 21772 _ = v.Args[1] 21773 sh := v.Args[0] 21774 if sh.Op != OpS390XSLDconst { 21775 break 21776 } 21777 if sh.AuxInt != 32 { 21778 break 21779 } 21780 x0 := sh.Args[0] 21781 if x0.Op != OpS390XMOVWZloadidx { 21782 break 21783 } 21784 i0 := x0.AuxInt 21785 s := x0.Aux 21786 _ = x0.Args[2] 21787 p := x0.Args[0] 21788 idx := x0.Args[1] 21789 mem := x0.Args[2] 21790 x1 := v.Args[1] 21791 if x1.Op != OpS390XMOVWZloadidx { 21792 break 21793 } 21794 i1 := x1.AuxInt 21795 if x1.Aux != s { 21796 break 21797 } 21798 _ = x1.Args[2] 21799 if p != x1.Args[0] { 21800 break 21801 } 21802 if idx != x1.Args[1] { 21803 break 21804 } 21805 if mem != x1.Args[2] { 21806 break 21807 } 21808 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)) { 21809 break 21810 } 21811 b = mergePoint(b, x0, x1) 21812 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21813 v.reset(OpCopy) 21814 v.AddArg(v0) 21815 v0.AuxInt = i0 21816 v0.Aux = s 21817 v0.AddArg(p) 21818 v0.AddArg(idx) 21819 v0.AddArg(mem) 21820 return true 21821 } 21822 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21823 // 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) 21824 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21825 for { 21826 _ = v.Args[1] 21827 sh := v.Args[0] 21828 if sh.Op != OpS390XSLDconst { 21829 break 21830 } 21831 if sh.AuxInt != 32 { 21832 break 21833 } 21834 x0 := sh.Args[0] 21835 if x0.Op != OpS390XMOVWZloadidx { 21836 break 21837 } 21838 i0 := x0.AuxInt 21839 s := x0.Aux 21840 _ = x0.Args[2] 21841 idx := x0.Args[0] 21842 p := x0.Args[1] 21843 mem := x0.Args[2] 21844 x1 := v.Args[1] 21845 if x1.Op != OpS390XMOVWZloadidx { 21846 break 21847 } 21848 i1 := x1.AuxInt 21849 if x1.Aux != s { 21850 break 21851 } 21852 _ = x1.Args[2] 21853 if p != x1.Args[0] { 21854 break 21855 } 21856 if idx != x1.Args[1] { 21857 break 21858 } 21859 if mem != x1.Args[2] { 21860 break 21861 } 21862 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)) { 21863 break 21864 } 21865 b = mergePoint(b, x0, x1) 21866 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21867 v.reset(OpCopy) 21868 v.AddArg(v0) 21869 v0.AuxInt = i0 21870 v0.Aux = s 21871 v0.AddArg(p) 21872 v0.AddArg(idx) 21873 v0.AddArg(mem) 21874 return true 21875 } 21876 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21877 // 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) 21878 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21879 for { 21880 _ = v.Args[1] 21881 sh := v.Args[0] 21882 if sh.Op != OpS390XSLDconst { 21883 break 21884 } 21885 if sh.AuxInt != 32 { 21886 break 21887 } 21888 x0 := sh.Args[0] 21889 if x0.Op != OpS390XMOVWZloadidx { 21890 break 21891 } 21892 i0 := x0.AuxInt 21893 s := x0.Aux 21894 _ = x0.Args[2] 21895 p := x0.Args[0] 21896 idx := x0.Args[1] 21897 mem := x0.Args[2] 21898 x1 := v.Args[1] 21899 if x1.Op != OpS390XMOVWZloadidx { 21900 break 21901 } 21902 i1 := x1.AuxInt 21903 if x1.Aux != s { 21904 break 21905 } 21906 _ = x1.Args[2] 21907 if idx != x1.Args[0] { 21908 break 21909 } 21910 if p != x1.Args[1] { 21911 break 21912 } 21913 if mem != x1.Args[2] { 21914 break 21915 } 21916 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)) { 21917 break 21918 } 21919 b = mergePoint(b, x0, x1) 21920 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21921 v.reset(OpCopy) 21922 v.AddArg(v0) 21923 v0.AuxInt = i0 21924 v0.Aux = s 21925 v0.AddArg(p) 21926 v0.AddArg(idx) 21927 v0.AddArg(mem) 21928 return true 21929 } 21930 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21931 // 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) 21932 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21933 for { 21934 _ = v.Args[1] 21935 sh := v.Args[0] 21936 if sh.Op != OpS390XSLDconst { 21937 break 21938 } 21939 if sh.AuxInt != 32 { 21940 break 21941 } 21942 x0 := sh.Args[0] 21943 if x0.Op != OpS390XMOVWZloadidx { 21944 break 21945 } 21946 i0 := x0.AuxInt 21947 s := x0.Aux 21948 _ = x0.Args[2] 21949 idx := x0.Args[0] 21950 p := x0.Args[1] 21951 mem := x0.Args[2] 21952 x1 := v.Args[1] 21953 if x1.Op != OpS390XMOVWZloadidx { 21954 break 21955 } 21956 i1 := x1.AuxInt 21957 if x1.Aux != s { 21958 break 21959 } 21960 _ = x1.Args[2] 21961 if idx != x1.Args[0] { 21962 break 21963 } 21964 if p != x1.Args[1] { 21965 break 21966 } 21967 if mem != x1.Args[2] { 21968 break 21969 } 21970 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)) { 21971 break 21972 } 21973 b = mergePoint(b, x0, x1) 21974 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21975 v.reset(OpCopy) 21976 v.AddArg(v0) 21977 v0.AuxInt = i0 21978 v0.Aux = s 21979 v0.AddArg(p) 21980 v0.AddArg(idx) 21981 v0.AddArg(mem) 21982 return true 21983 } 21984 // 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)) 21985 // 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) 21986 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21987 for { 21988 _ = v.Args[1] 21989 s0 := v.Args[0] 21990 if s0.Op != OpS390XSLDconst { 21991 break 21992 } 21993 j0 := s0.AuxInt 21994 x0 := s0.Args[0] 21995 if x0.Op != OpS390XMOVBZloadidx { 21996 break 21997 } 21998 i0 := x0.AuxInt 21999 s := x0.Aux 22000 _ = x0.Args[2] 22001 p := x0.Args[0] 22002 idx := x0.Args[1] 22003 mem := x0.Args[2] 22004 or := v.Args[1] 22005 if or.Op != OpS390XOR { 22006 break 22007 } 22008 _ = or.Args[1] 22009 s1 := or.Args[0] 22010 if s1.Op != OpS390XSLDconst { 22011 break 22012 } 22013 j1 := s1.AuxInt 22014 x1 := s1.Args[0] 22015 if x1.Op != OpS390XMOVBZloadidx { 22016 break 22017 } 22018 i1 := x1.AuxInt 22019 if x1.Aux != s { 22020 break 22021 } 22022 _ = x1.Args[2] 22023 if p != x1.Args[0] { 22024 break 22025 } 22026 if idx != x1.Args[1] { 22027 break 22028 } 22029 if mem != x1.Args[2] { 22030 break 22031 } 22032 y := or.Args[1] 22033 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)) { 22034 break 22035 } 22036 b = mergePoint(b, x0, x1) 22037 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22038 v.reset(OpCopy) 22039 v.AddArg(v0) 22040 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22041 v1.AuxInt = j1 22042 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22043 v2.AuxInt = i0 22044 v2.Aux = s 22045 v2.AddArg(p) 22046 v2.AddArg(idx) 22047 v2.AddArg(mem) 22048 v1.AddArg(v2) 22049 v0.AddArg(v1) 22050 v0.AddArg(y) 22051 return true 22052 } 22053 return false 22054 } 22055 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 22056 b := v.Block 22057 _ = b 22058 typ := &b.Func.Config.Types 22059 _ = typ 22060 // 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)) 22061 // 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) 22062 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22063 for { 22064 _ = v.Args[1] 22065 s0 := v.Args[0] 22066 if s0.Op != OpS390XSLDconst { 22067 break 22068 } 22069 j0 := s0.AuxInt 22070 x0 := s0.Args[0] 22071 if x0.Op != OpS390XMOVBZloadidx { 22072 break 22073 } 22074 i0 := x0.AuxInt 22075 s := x0.Aux 22076 _ = x0.Args[2] 22077 idx := x0.Args[0] 22078 p := x0.Args[1] 22079 mem := x0.Args[2] 22080 or := v.Args[1] 22081 if or.Op != OpS390XOR { 22082 break 22083 } 22084 _ = or.Args[1] 22085 s1 := or.Args[0] 22086 if s1.Op != OpS390XSLDconst { 22087 break 22088 } 22089 j1 := s1.AuxInt 22090 x1 := s1.Args[0] 22091 if x1.Op != OpS390XMOVBZloadidx { 22092 break 22093 } 22094 i1 := x1.AuxInt 22095 if x1.Aux != s { 22096 break 22097 } 22098 _ = x1.Args[2] 22099 if p != x1.Args[0] { 22100 break 22101 } 22102 if idx != x1.Args[1] { 22103 break 22104 } 22105 if mem != x1.Args[2] { 22106 break 22107 } 22108 y := or.Args[1] 22109 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)) { 22110 break 22111 } 22112 b = mergePoint(b, x0, x1) 22113 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22114 v.reset(OpCopy) 22115 v.AddArg(v0) 22116 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22117 v1.AuxInt = j1 22118 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22119 v2.AuxInt = i0 22120 v2.Aux = s 22121 v2.AddArg(p) 22122 v2.AddArg(idx) 22123 v2.AddArg(mem) 22124 v1.AddArg(v2) 22125 v0.AddArg(v1) 22126 v0.AddArg(y) 22127 return true 22128 } 22129 // 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)) 22130 // 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) 22131 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22132 for { 22133 _ = v.Args[1] 22134 s0 := v.Args[0] 22135 if s0.Op != OpS390XSLDconst { 22136 break 22137 } 22138 j0 := s0.AuxInt 22139 x0 := s0.Args[0] 22140 if x0.Op != OpS390XMOVBZloadidx { 22141 break 22142 } 22143 i0 := x0.AuxInt 22144 s := x0.Aux 22145 _ = x0.Args[2] 22146 p := x0.Args[0] 22147 idx := x0.Args[1] 22148 mem := x0.Args[2] 22149 or := v.Args[1] 22150 if or.Op != OpS390XOR { 22151 break 22152 } 22153 _ = or.Args[1] 22154 s1 := or.Args[0] 22155 if s1.Op != OpS390XSLDconst { 22156 break 22157 } 22158 j1 := s1.AuxInt 22159 x1 := s1.Args[0] 22160 if x1.Op != OpS390XMOVBZloadidx { 22161 break 22162 } 22163 i1 := x1.AuxInt 22164 if x1.Aux != s { 22165 break 22166 } 22167 _ = x1.Args[2] 22168 if idx != x1.Args[0] { 22169 break 22170 } 22171 if p != x1.Args[1] { 22172 break 22173 } 22174 if mem != x1.Args[2] { 22175 break 22176 } 22177 y := or.Args[1] 22178 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)) { 22179 break 22180 } 22181 b = mergePoint(b, x0, x1) 22182 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22183 v.reset(OpCopy) 22184 v.AddArg(v0) 22185 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22186 v1.AuxInt = j1 22187 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22188 v2.AuxInt = i0 22189 v2.Aux = s 22190 v2.AddArg(p) 22191 v2.AddArg(idx) 22192 v2.AddArg(mem) 22193 v1.AddArg(v2) 22194 v0.AddArg(v1) 22195 v0.AddArg(y) 22196 return true 22197 } 22198 // 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)) 22199 // 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) 22200 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22201 for { 22202 _ = v.Args[1] 22203 s0 := v.Args[0] 22204 if s0.Op != OpS390XSLDconst { 22205 break 22206 } 22207 j0 := s0.AuxInt 22208 x0 := s0.Args[0] 22209 if x0.Op != OpS390XMOVBZloadidx { 22210 break 22211 } 22212 i0 := x0.AuxInt 22213 s := x0.Aux 22214 _ = x0.Args[2] 22215 idx := x0.Args[0] 22216 p := x0.Args[1] 22217 mem := x0.Args[2] 22218 or := v.Args[1] 22219 if or.Op != OpS390XOR { 22220 break 22221 } 22222 _ = or.Args[1] 22223 s1 := or.Args[0] 22224 if s1.Op != OpS390XSLDconst { 22225 break 22226 } 22227 j1 := s1.AuxInt 22228 x1 := s1.Args[0] 22229 if x1.Op != OpS390XMOVBZloadidx { 22230 break 22231 } 22232 i1 := x1.AuxInt 22233 if x1.Aux != s { 22234 break 22235 } 22236 _ = x1.Args[2] 22237 if idx != x1.Args[0] { 22238 break 22239 } 22240 if p != x1.Args[1] { 22241 break 22242 } 22243 if mem != x1.Args[2] { 22244 break 22245 } 22246 y := or.Args[1] 22247 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)) { 22248 break 22249 } 22250 b = mergePoint(b, x0, x1) 22251 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22252 v.reset(OpCopy) 22253 v.AddArg(v0) 22254 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22255 v1.AuxInt = j1 22256 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22257 v2.AuxInt = i0 22258 v2.Aux = s 22259 v2.AddArg(p) 22260 v2.AddArg(idx) 22261 v2.AddArg(mem) 22262 v1.AddArg(v2) 22263 v0.AddArg(v1) 22264 v0.AddArg(y) 22265 return true 22266 } 22267 // 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)))) 22268 // 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) 22269 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22270 for { 22271 _ = v.Args[1] 22272 s0 := v.Args[0] 22273 if s0.Op != OpS390XSLDconst { 22274 break 22275 } 22276 j0 := s0.AuxInt 22277 x0 := s0.Args[0] 22278 if x0.Op != OpS390XMOVBZloadidx { 22279 break 22280 } 22281 i0 := x0.AuxInt 22282 s := x0.Aux 22283 _ = x0.Args[2] 22284 p := x0.Args[0] 22285 idx := x0.Args[1] 22286 mem := x0.Args[2] 22287 or := v.Args[1] 22288 if or.Op != OpS390XOR { 22289 break 22290 } 22291 _ = or.Args[1] 22292 y := or.Args[0] 22293 s1 := or.Args[1] 22294 if s1.Op != OpS390XSLDconst { 22295 break 22296 } 22297 j1 := s1.AuxInt 22298 x1 := s1.Args[0] 22299 if x1.Op != OpS390XMOVBZloadidx { 22300 break 22301 } 22302 i1 := x1.AuxInt 22303 if x1.Aux != s { 22304 break 22305 } 22306 _ = x1.Args[2] 22307 if p != x1.Args[0] { 22308 break 22309 } 22310 if idx != x1.Args[1] { 22311 break 22312 } 22313 if mem != x1.Args[2] { 22314 break 22315 } 22316 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)) { 22317 break 22318 } 22319 b = mergePoint(b, x0, x1) 22320 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22321 v.reset(OpCopy) 22322 v.AddArg(v0) 22323 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22324 v1.AuxInt = j1 22325 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22326 v2.AuxInt = i0 22327 v2.Aux = s 22328 v2.AddArg(p) 22329 v2.AddArg(idx) 22330 v2.AddArg(mem) 22331 v1.AddArg(v2) 22332 v0.AddArg(v1) 22333 v0.AddArg(y) 22334 return true 22335 } 22336 // 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)))) 22337 // 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) 22338 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22339 for { 22340 _ = v.Args[1] 22341 s0 := v.Args[0] 22342 if s0.Op != OpS390XSLDconst { 22343 break 22344 } 22345 j0 := s0.AuxInt 22346 x0 := s0.Args[0] 22347 if x0.Op != OpS390XMOVBZloadidx { 22348 break 22349 } 22350 i0 := x0.AuxInt 22351 s := x0.Aux 22352 _ = x0.Args[2] 22353 idx := x0.Args[0] 22354 p := x0.Args[1] 22355 mem := x0.Args[2] 22356 or := v.Args[1] 22357 if or.Op != OpS390XOR { 22358 break 22359 } 22360 _ = or.Args[1] 22361 y := or.Args[0] 22362 s1 := or.Args[1] 22363 if s1.Op != OpS390XSLDconst { 22364 break 22365 } 22366 j1 := s1.AuxInt 22367 x1 := s1.Args[0] 22368 if x1.Op != OpS390XMOVBZloadidx { 22369 break 22370 } 22371 i1 := x1.AuxInt 22372 if x1.Aux != s { 22373 break 22374 } 22375 _ = x1.Args[2] 22376 if p != x1.Args[0] { 22377 break 22378 } 22379 if idx != x1.Args[1] { 22380 break 22381 } 22382 if mem != x1.Args[2] { 22383 break 22384 } 22385 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)) { 22386 break 22387 } 22388 b = mergePoint(b, x0, x1) 22389 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22390 v.reset(OpCopy) 22391 v.AddArg(v0) 22392 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22393 v1.AuxInt = j1 22394 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22395 v2.AuxInt = i0 22396 v2.Aux = s 22397 v2.AddArg(p) 22398 v2.AddArg(idx) 22399 v2.AddArg(mem) 22400 v1.AddArg(v2) 22401 v0.AddArg(v1) 22402 v0.AddArg(y) 22403 return true 22404 } 22405 // 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)))) 22406 // 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) 22407 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22408 for { 22409 _ = v.Args[1] 22410 s0 := v.Args[0] 22411 if s0.Op != OpS390XSLDconst { 22412 break 22413 } 22414 j0 := s0.AuxInt 22415 x0 := s0.Args[0] 22416 if x0.Op != OpS390XMOVBZloadidx { 22417 break 22418 } 22419 i0 := x0.AuxInt 22420 s := x0.Aux 22421 _ = x0.Args[2] 22422 p := x0.Args[0] 22423 idx := x0.Args[1] 22424 mem := x0.Args[2] 22425 or := v.Args[1] 22426 if or.Op != OpS390XOR { 22427 break 22428 } 22429 _ = or.Args[1] 22430 y := or.Args[0] 22431 s1 := or.Args[1] 22432 if s1.Op != OpS390XSLDconst { 22433 break 22434 } 22435 j1 := s1.AuxInt 22436 x1 := s1.Args[0] 22437 if x1.Op != OpS390XMOVBZloadidx { 22438 break 22439 } 22440 i1 := x1.AuxInt 22441 if x1.Aux != s { 22442 break 22443 } 22444 _ = x1.Args[2] 22445 if idx != x1.Args[0] { 22446 break 22447 } 22448 if p != x1.Args[1] { 22449 break 22450 } 22451 if mem != x1.Args[2] { 22452 break 22453 } 22454 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)) { 22455 break 22456 } 22457 b = mergePoint(b, x0, x1) 22458 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22459 v.reset(OpCopy) 22460 v.AddArg(v0) 22461 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22462 v1.AuxInt = j1 22463 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22464 v2.AuxInt = i0 22465 v2.Aux = s 22466 v2.AddArg(p) 22467 v2.AddArg(idx) 22468 v2.AddArg(mem) 22469 v1.AddArg(v2) 22470 v0.AddArg(v1) 22471 v0.AddArg(y) 22472 return true 22473 } 22474 // 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)))) 22475 // 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) 22476 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22477 for { 22478 _ = v.Args[1] 22479 s0 := v.Args[0] 22480 if s0.Op != OpS390XSLDconst { 22481 break 22482 } 22483 j0 := s0.AuxInt 22484 x0 := s0.Args[0] 22485 if x0.Op != OpS390XMOVBZloadidx { 22486 break 22487 } 22488 i0 := x0.AuxInt 22489 s := x0.Aux 22490 _ = x0.Args[2] 22491 idx := x0.Args[0] 22492 p := x0.Args[1] 22493 mem := x0.Args[2] 22494 or := v.Args[1] 22495 if or.Op != OpS390XOR { 22496 break 22497 } 22498 _ = or.Args[1] 22499 y := or.Args[0] 22500 s1 := or.Args[1] 22501 if s1.Op != OpS390XSLDconst { 22502 break 22503 } 22504 j1 := s1.AuxInt 22505 x1 := s1.Args[0] 22506 if x1.Op != OpS390XMOVBZloadidx { 22507 break 22508 } 22509 i1 := x1.AuxInt 22510 if x1.Aux != s { 22511 break 22512 } 22513 _ = x1.Args[2] 22514 if idx != x1.Args[0] { 22515 break 22516 } 22517 if p != x1.Args[1] { 22518 break 22519 } 22520 if mem != x1.Args[2] { 22521 break 22522 } 22523 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)) { 22524 break 22525 } 22526 b = mergePoint(b, x0, x1) 22527 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22528 v.reset(OpCopy) 22529 v.AddArg(v0) 22530 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22531 v1.AuxInt = j1 22532 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22533 v2.AuxInt = i0 22534 v2.Aux = s 22535 v2.AddArg(p) 22536 v2.AddArg(idx) 22537 v2.AddArg(mem) 22538 v1.AddArg(v2) 22539 v0.AddArg(v1) 22540 v0.AddArg(y) 22541 return true 22542 } 22543 // 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))) 22544 // 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) 22545 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22546 for { 22547 _ = v.Args[1] 22548 or := v.Args[0] 22549 if or.Op != OpS390XOR { 22550 break 22551 } 22552 _ = or.Args[1] 22553 s1 := or.Args[0] 22554 if s1.Op != OpS390XSLDconst { 22555 break 22556 } 22557 j1 := s1.AuxInt 22558 x1 := s1.Args[0] 22559 if x1.Op != OpS390XMOVBZloadidx { 22560 break 22561 } 22562 i1 := x1.AuxInt 22563 s := x1.Aux 22564 _ = x1.Args[2] 22565 p := x1.Args[0] 22566 idx := x1.Args[1] 22567 mem := x1.Args[2] 22568 y := or.Args[1] 22569 s0 := v.Args[1] 22570 if s0.Op != OpS390XSLDconst { 22571 break 22572 } 22573 j0 := s0.AuxInt 22574 x0 := s0.Args[0] 22575 if x0.Op != OpS390XMOVBZloadidx { 22576 break 22577 } 22578 i0 := x0.AuxInt 22579 if x0.Aux != s { 22580 break 22581 } 22582 _ = x0.Args[2] 22583 if p != x0.Args[0] { 22584 break 22585 } 22586 if idx != x0.Args[1] { 22587 break 22588 } 22589 if mem != x0.Args[2] { 22590 break 22591 } 22592 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)) { 22593 break 22594 } 22595 b = mergePoint(b, x0, x1) 22596 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22597 v.reset(OpCopy) 22598 v.AddArg(v0) 22599 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22600 v1.AuxInt = j1 22601 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22602 v2.AuxInt = i0 22603 v2.Aux = s 22604 v2.AddArg(p) 22605 v2.AddArg(idx) 22606 v2.AddArg(mem) 22607 v1.AddArg(v2) 22608 v0.AddArg(v1) 22609 v0.AddArg(y) 22610 return true 22611 } 22612 // 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))) 22613 // 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) 22614 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22615 for { 22616 _ = v.Args[1] 22617 or := v.Args[0] 22618 if or.Op != OpS390XOR { 22619 break 22620 } 22621 _ = or.Args[1] 22622 s1 := or.Args[0] 22623 if s1.Op != OpS390XSLDconst { 22624 break 22625 } 22626 j1 := s1.AuxInt 22627 x1 := s1.Args[0] 22628 if x1.Op != OpS390XMOVBZloadidx { 22629 break 22630 } 22631 i1 := x1.AuxInt 22632 s := x1.Aux 22633 _ = x1.Args[2] 22634 idx := x1.Args[0] 22635 p := x1.Args[1] 22636 mem := x1.Args[2] 22637 y := or.Args[1] 22638 s0 := v.Args[1] 22639 if s0.Op != OpS390XSLDconst { 22640 break 22641 } 22642 j0 := s0.AuxInt 22643 x0 := s0.Args[0] 22644 if x0.Op != OpS390XMOVBZloadidx { 22645 break 22646 } 22647 i0 := x0.AuxInt 22648 if x0.Aux != s { 22649 break 22650 } 22651 _ = x0.Args[2] 22652 if p != x0.Args[0] { 22653 break 22654 } 22655 if idx != x0.Args[1] { 22656 break 22657 } 22658 if mem != x0.Args[2] { 22659 break 22660 } 22661 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)) { 22662 break 22663 } 22664 b = mergePoint(b, x0, x1) 22665 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22666 v.reset(OpCopy) 22667 v.AddArg(v0) 22668 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22669 v1.AuxInt = j1 22670 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22671 v2.AuxInt = i0 22672 v2.Aux = s 22673 v2.AddArg(p) 22674 v2.AddArg(idx) 22675 v2.AddArg(mem) 22676 v1.AddArg(v2) 22677 v0.AddArg(v1) 22678 v0.AddArg(y) 22679 return true 22680 } 22681 // 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))) 22682 // 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) 22683 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22684 for { 22685 _ = v.Args[1] 22686 or := v.Args[0] 22687 if or.Op != OpS390XOR { 22688 break 22689 } 22690 _ = or.Args[1] 22691 y := or.Args[0] 22692 s1 := or.Args[1] 22693 if s1.Op != OpS390XSLDconst { 22694 break 22695 } 22696 j1 := s1.AuxInt 22697 x1 := s1.Args[0] 22698 if x1.Op != OpS390XMOVBZloadidx { 22699 break 22700 } 22701 i1 := x1.AuxInt 22702 s := x1.Aux 22703 _ = x1.Args[2] 22704 p := x1.Args[0] 22705 idx := x1.Args[1] 22706 mem := x1.Args[2] 22707 s0 := v.Args[1] 22708 if s0.Op != OpS390XSLDconst { 22709 break 22710 } 22711 j0 := s0.AuxInt 22712 x0 := s0.Args[0] 22713 if x0.Op != OpS390XMOVBZloadidx { 22714 break 22715 } 22716 i0 := x0.AuxInt 22717 if x0.Aux != s { 22718 break 22719 } 22720 _ = x0.Args[2] 22721 if p != x0.Args[0] { 22722 break 22723 } 22724 if idx != x0.Args[1] { 22725 break 22726 } 22727 if mem != x0.Args[2] { 22728 break 22729 } 22730 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)) { 22731 break 22732 } 22733 b = mergePoint(b, x0, x1) 22734 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22735 v.reset(OpCopy) 22736 v.AddArg(v0) 22737 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22738 v1.AuxInt = j1 22739 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22740 v2.AuxInt = i0 22741 v2.Aux = s 22742 v2.AddArg(p) 22743 v2.AddArg(idx) 22744 v2.AddArg(mem) 22745 v1.AddArg(v2) 22746 v0.AddArg(v1) 22747 v0.AddArg(y) 22748 return true 22749 } 22750 return false 22751 } 22752 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 22753 b := v.Block 22754 _ = b 22755 typ := &b.Func.Config.Types 22756 _ = typ 22757 // 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))) 22758 // 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) 22759 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22760 for { 22761 _ = v.Args[1] 22762 or := v.Args[0] 22763 if or.Op != OpS390XOR { 22764 break 22765 } 22766 _ = or.Args[1] 22767 y := or.Args[0] 22768 s1 := or.Args[1] 22769 if s1.Op != OpS390XSLDconst { 22770 break 22771 } 22772 j1 := s1.AuxInt 22773 x1 := s1.Args[0] 22774 if x1.Op != OpS390XMOVBZloadidx { 22775 break 22776 } 22777 i1 := x1.AuxInt 22778 s := x1.Aux 22779 _ = x1.Args[2] 22780 idx := x1.Args[0] 22781 p := x1.Args[1] 22782 mem := x1.Args[2] 22783 s0 := v.Args[1] 22784 if s0.Op != OpS390XSLDconst { 22785 break 22786 } 22787 j0 := s0.AuxInt 22788 x0 := s0.Args[0] 22789 if x0.Op != OpS390XMOVBZloadidx { 22790 break 22791 } 22792 i0 := x0.AuxInt 22793 if x0.Aux != s { 22794 break 22795 } 22796 _ = x0.Args[2] 22797 if p != x0.Args[0] { 22798 break 22799 } 22800 if idx != x0.Args[1] { 22801 break 22802 } 22803 if mem != x0.Args[2] { 22804 break 22805 } 22806 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)) { 22807 break 22808 } 22809 b = mergePoint(b, x0, x1) 22810 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22811 v.reset(OpCopy) 22812 v.AddArg(v0) 22813 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22814 v1.AuxInt = j1 22815 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22816 v2.AuxInt = i0 22817 v2.Aux = s 22818 v2.AddArg(p) 22819 v2.AddArg(idx) 22820 v2.AddArg(mem) 22821 v1.AddArg(v2) 22822 v0.AddArg(v1) 22823 v0.AddArg(y) 22824 return true 22825 } 22826 // 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))) 22827 // 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) 22828 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22829 for { 22830 _ = v.Args[1] 22831 or := v.Args[0] 22832 if or.Op != OpS390XOR { 22833 break 22834 } 22835 _ = or.Args[1] 22836 s1 := or.Args[0] 22837 if s1.Op != OpS390XSLDconst { 22838 break 22839 } 22840 j1 := s1.AuxInt 22841 x1 := s1.Args[0] 22842 if x1.Op != OpS390XMOVBZloadidx { 22843 break 22844 } 22845 i1 := x1.AuxInt 22846 s := x1.Aux 22847 _ = x1.Args[2] 22848 p := x1.Args[0] 22849 idx := x1.Args[1] 22850 mem := x1.Args[2] 22851 y := or.Args[1] 22852 s0 := v.Args[1] 22853 if s0.Op != OpS390XSLDconst { 22854 break 22855 } 22856 j0 := s0.AuxInt 22857 x0 := s0.Args[0] 22858 if x0.Op != OpS390XMOVBZloadidx { 22859 break 22860 } 22861 i0 := x0.AuxInt 22862 if x0.Aux != s { 22863 break 22864 } 22865 _ = x0.Args[2] 22866 if idx != x0.Args[0] { 22867 break 22868 } 22869 if p != x0.Args[1] { 22870 break 22871 } 22872 if mem != x0.Args[2] { 22873 break 22874 } 22875 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)) { 22876 break 22877 } 22878 b = mergePoint(b, x0, x1) 22879 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22880 v.reset(OpCopy) 22881 v.AddArg(v0) 22882 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22883 v1.AuxInt = j1 22884 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22885 v2.AuxInt = i0 22886 v2.Aux = s 22887 v2.AddArg(p) 22888 v2.AddArg(idx) 22889 v2.AddArg(mem) 22890 v1.AddArg(v2) 22891 v0.AddArg(v1) 22892 v0.AddArg(y) 22893 return true 22894 } 22895 // 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))) 22896 // 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) 22897 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22898 for { 22899 _ = v.Args[1] 22900 or := v.Args[0] 22901 if or.Op != OpS390XOR { 22902 break 22903 } 22904 _ = or.Args[1] 22905 s1 := or.Args[0] 22906 if s1.Op != OpS390XSLDconst { 22907 break 22908 } 22909 j1 := s1.AuxInt 22910 x1 := s1.Args[0] 22911 if x1.Op != OpS390XMOVBZloadidx { 22912 break 22913 } 22914 i1 := x1.AuxInt 22915 s := x1.Aux 22916 _ = x1.Args[2] 22917 idx := x1.Args[0] 22918 p := x1.Args[1] 22919 mem := x1.Args[2] 22920 y := or.Args[1] 22921 s0 := v.Args[1] 22922 if s0.Op != OpS390XSLDconst { 22923 break 22924 } 22925 j0 := s0.AuxInt 22926 x0 := s0.Args[0] 22927 if x0.Op != OpS390XMOVBZloadidx { 22928 break 22929 } 22930 i0 := x0.AuxInt 22931 if x0.Aux != s { 22932 break 22933 } 22934 _ = x0.Args[2] 22935 if idx != x0.Args[0] { 22936 break 22937 } 22938 if p != x0.Args[1] { 22939 break 22940 } 22941 if mem != x0.Args[2] { 22942 break 22943 } 22944 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)) { 22945 break 22946 } 22947 b = mergePoint(b, x0, x1) 22948 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22949 v.reset(OpCopy) 22950 v.AddArg(v0) 22951 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22952 v1.AuxInt = j1 22953 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22954 v2.AuxInt = i0 22955 v2.Aux = s 22956 v2.AddArg(p) 22957 v2.AddArg(idx) 22958 v2.AddArg(mem) 22959 v1.AddArg(v2) 22960 v0.AddArg(v1) 22961 v0.AddArg(y) 22962 return true 22963 } 22964 // 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))) 22965 // 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) 22966 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22967 for { 22968 _ = v.Args[1] 22969 or := v.Args[0] 22970 if or.Op != OpS390XOR { 22971 break 22972 } 22973 _ = or.Args[1] 22974 y := or.Args[0] 22975 s1 := or.Args[1] 22976 if s1.Op != OpS390XSLDconst { 22977 break 22978 } 22979 j1 := s1.AuxInt 22980 x1 := s1.Args[0] 22981 if x1.Op != OpS390XMOVBZloadidx { 22982 break 22983 } 22984 i1 := x1.AuxInt 22985 s := x1.Aux 22986 _ = x1.Args[2] 22987 p := x1.Args[0] 22988 idx := x1.Args[1] 22989 mem := x1.Args[2] 22990 s0 := v.Args[1] 22991 if s0.Op != OpS390XSLDconst { 22992 break 22993 } 22994 j0 := s0.AuxInt 22995 x0 := s0.Args[0] 22996 if x0.Op != OpS390XMOVBZloadidx { 22997 break 22998 } 22999 i0 := x0.AuxInt 23000 if x0.Aux != s { 23001 break 23002 } 23003 _ = x0.Args[2] 23004 if idx != x0.Args[0] { 23005 break 23006 } 23007 if p != x0.Args[1] { 23008 break 23009 } 23010 if mem != x0.Args[2] { 23011 break 23012 } 23013 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)) { 23014 break 23015 } 23016 b = mergePoint(b, x0, x1) 23017 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23018 v.reset(OpCopy) 23019 v.AddArg(v0) 23020 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23021 v1.AuxInt = j1 23022 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23023 v2.AuxInt = i0 23024 v2.Aux = s 23025 v2.AddArg(p) 23026 v2.AddArg(idx) 23027 v2.AddArg(mem) 23028 v1.AddArg(v2) 23029 v0.AddArg(v1) 23030 v0.AddArg(y) 23031 return true 23032 } 23033 // 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))) 23034 // 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) 23035 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 23036 for { 23037 _ = v.Args[1] 23038 or := v.Args[0] 23039 if or.Op != OpS390XOR { 23040 break 23041 } 23042 _ = or.Args[1] 23043 y := or.Args[0] 23044 s1 := or.Args[1] 23045 if s1.Op != OpS390XSLDconst { 23046 break 23047 } 23048 j1 := s1.AuxInt 23049 x1 := s1.Args[0] 23050 if x1.Op != OpS390XMOVBZloadidx { 23051 break 23052 } 23053 i1 := x1.AuxInt 23054 s := x1.Aux 23055 _ = x1.Args[2] 23056 idx := x1.Args[0] 23057 p := x1.Args[1] 23058 mem := x1.Args[2] 23059 s0 := v.Args[1] 23060 if s0.Op != OpS390XSLDconst { 23061 break 23062 } 23063 j0 := s0.AuxInt 23064 x0 := s0.Args[0] 23065 if x0.Op != OpS390XMOVBZloadidx { 23066 break 23067 } 23068 i0 := x0.AuxInt 23069 if x0.Aux != s { 23070 break 23071 } 23072 _ = x0.Args[2] 23073 if idx != x0.Args[0] { 23074 break 23075 } 23076 if p != x0.Args[1] { 23077 break 23078 } 23079 if mem != x0.Args[2] { 23080 break 23081 } 23082 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)) { 23083 break 23084 } 23085 b = mergePoint(b, x0, x1) 23086 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23087 v.reset(OpCopy) 23088 v.AddArg(v0) 23089 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23090 v1.AuxInt = j1 23091 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23092 v2.AuxInt = i0 23093 v2.Aux = s 23094 v2.AddArg(p) 23095 v2.AddArg(idx) 23096 v2.AddArg(mem) 23097 v1.AddArg(v2) 23098 v0.AddArg(v1) 23099 v0.AddArg(y) 23100 return true 23101 } 23102 // 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)) 23103 // 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) 23104 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23105 for { 23106 _ = v.Args[1] 23107 s0 := v.Args[0] 23108 if s0.Op != OpS390XSLDconst { 23109 break 23110 } 23111 j0 := s0.AuxInt 23112 x0 := s0.Args[0] 23113 if x0.Op != OpS390XMOVHZloadidx { 23114 break 23115 } 23116 i0 := x0.AuxInt 23117 s := x0.Aux 23118 _ = x0.Args[2] 23119 p := x0.Args[0] 23120 idx := x0.Args[1] 23121 mem := x0.Args[2] 23122 or := v.Args[1] 23123 if or.Op != OpS390XOR { 23124 break 23125 } 23126 _ = or.Args[1] 23127 s1 := or.Args[0] 23128 if s1.Op != OpS390XSLDconst { 23129 break 23130 } 23131 j1 := s1.AuxInt 23132 x1 := s1.Args[0] 23133 if x1.Op != OpS390XMOVHZloadidx { 23134 break 23135 } 23136 i1 := x1.AuxInt 23137 if x1.Aux != s { 23138 break 23139 } 23140 _ = x1.Args[2] 23141 if p != x1.Args[0] { 23142 break 23143 } 23144 if idx != x1.Args[1] { 23145 break 23146 } 23147 if mem != x1.Args[2] { 23148 break 23149 } 23150 y := or.Args[1] 23151 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)) { 23152 break 23153 } 23154 b = mergePoint(b, x0, x1) 23155 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23156 v.reset(OpCopy) 23157 v.AddArg(v0) 23158 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23159 v1.AuxInt = j1 23160 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23161 v2.AuxInt = i0 23162 v2.Aux = s 23163 v2.AddArg(p) 23164 v2.AddArg(idx) 23165 v2.AddArg(mem) 23166 v1.AddArg(v2) 23167 v0.AddArg(v1) 23168 v0.AddArg(y) 23169 return true 23170 } 23171 // 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)) 23172 // 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) 23173 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23174 for { 23175 _ = v.Args[1] 23176 s0 := v.Args[0] 23177 if s0.Op != OpS390XSLDconst { 23178 break 23179 } 23180 j0 := s0.AuxInt 23181 x0 := s0.Args[0] 23182 if x0.Op != OpS390XMOVHZloadidx { 23183 break 23184 } 23185 i0 := x0.AuxInt 23186 s := x0.Aux 23187 _ = x0.Args[2] 23188 idx := x0.Args[0] 23189 p := x0.Args[1] 23190 mem := x0.Args[2] 23191 or := v.Args[1] 23192 if or.Op != OpS390XOR { 23193 break 23194 } 23195 _ = or.Args[1] 23196 s1 := or.Args[0] 23197 if s1.Op != OpS390XSLDconst { 23198 break 23199 } 23200 j1 := s1.AuxInt 23201 x1 := s1.Args[0] 23202 if x1.Op != OpS390XMOVHZloadidx { 23203 break 23204 } 23205 i1 := x1.AuxInt 23206 if x1.Aux != s { 23207 break 23208 } 23209 _ = x1.Args[2] 23210 if p != x1.Args[0] { 23211 break 23212 } 23213 if idx != x1.Args[1] { 23214 break 23215 } 23216 if mem != x1.Args[2] { 23217 break 23218 } 23219 y := or.Args[1] 23220 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)) { 23221 break 23222 } 23223 b = mergePoint(b, x0, x1) 23224 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23225 v.reset(OpCopy) 23226 v.AddArg(v0) 23227 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23228 v1.AuxInt = j1 23229 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23230 v2.AuxInt = i0 23231 v2.Aux = s 23232 v2.AddArg(p) 23233 v2.AddArg(idx) 23234 v2.AddArg(mem) 23235 v1.AddArg(v2) 23236 v0.AddArg(v1) 23237 v0.AddArg(y) 23238 return true 23239 } 23240 // 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)) 23241 // 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) 23242 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23243 for { 23244 _ = v.Args[1] 23245 s0 := v.Args[0] 23246 if s0.Op != OpS390XSLDconst { 23247 break 23248 } 23249 j0 := s0.AuxInt 23250 x0 := s0.Args[0] 23251 if x0.Op != OpS390XMOVHZloadidx { 23252 break 23253 } 23254 i0 := x0.AuxInt 23255 s := x0.Aux 23256 _ = x0.Args[2] 23257 p := x0.Args[0] 23258 idx := x0.Args[1] 23259 mem := x0.Args[2] 23260 or := v.Args[1] 23261 if or.Op != OpS390XOR { 23262 break 23263 } 23264 _ = or.Args[1] 23265 s1 := or.Args[0] 23266 if s1.Op != OpS390XSLDconst { 23267 break 23268 } 23269 j1 := s1.AuxInt 23270 x1 := s1.Args[0] 23271 if x1.Op != OpS390XMOVHZloadidx { 23272 break 23273 } 23274 i1 := x1.AuxInt 23275 if x1.Aux != s { 23276 break 23277 } 23278 _ = x1.Args[2] 23279 if idx != x1.Args[0] { 23280 break 23281 } 23282 if p != x1.Args[1] { 23283 break 23284 } 23285 if mem != x1.Args[2] { 23286 break 23287 } 23288 y := or.Args[1] 23289 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)) { 23290 break 23291 } 23292 b = mergePoint(b, x0, x1) 23293 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23294 v.reset(OpCopy) 23295 v.AddArg(v0) 23296 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23297 v1.AuxInt = j1 23298 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23299 v2.AuxInt = i0 23300 v2.Aux = s 23301 v2.AddArg(p) 23302 v2.AddArg(idx) 23303 v2.AddArg(mem) 23304 v1.AddArg(v2) 23305 v0.AddArg(v1) 23306 v0.AddArg(y) 23307 return true 23308 } 23309 // 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)) 23310 // 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) 23311 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23312 for { 23313 _ = v.Args[1] 23314 s0 := v.Args[0] 23315 if s0.Op != OpS390XSLDconst { 23316 break 23317 } 23318 j0 := s0.AuxInt 23319 x0 := s0.Args[0] 23320 if x0.Op != OpS390XMOVHZloadidx { 23321 break 23322 } 23323 i0 := x0.AuxInt 23324 s := x0.Aux 23325 _ = x0.Args[2] 23326 idx := x0.Args[0] 23327 p := x0.Args[1] 23328 mem := x0.Args[2] 23329 or := v.Args[1] 23330 if or.Op != OpS390XOR { 23331 break 23332 } 23333 _ = or.Args[1] 23334 s1 := or.Args[0] 23335 if s1.Op != OpS390XSLDconst { 23336 break 23337 } 23338 j1 := s1.AuxInt 23339 x1 := s1.Args[0] 23340 if x1.Op != OpS390XMOVHZloadidx { 23341 break 23342 } 23343 i1 := x1.AuxInt 23344 if x1.Aux != s { 23345 break 23346 } 23347 _ = x1.Args[2] 23348 if idx != x1.Args[0] { 23349 break 23350 } 23351 if p != x1.Args[1] { 23352 break 23353 } 23354 if mem != x1.Args[2] { 23355 break 23356 } 23357 y := or.Args[1] 23358 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)) { 23359 break 23360 } 23361 b = mergePoint(b, x0, x1) 23362 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23363 v.reset(OpCopy) 23364 v.AddArg(v0) 23365 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23366 v1.AuxInt = j1 23367 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23368 v2.AuxInt = i0 23369 v2.Aux = s 23370 v2.AddArg(p) 23371 v2.AddArg(idx) 23372 v2.AddArg(mem) 23373 v1.AddArg(v2) 23374 v0.AddArg(v1) 23375 v0.AddArg(y) 23376 return true 23377 } 23378 // 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)))) 23379 // 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) 23380 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23381 for { 23382 _ = v.Args[1] 23383 s0 := v.Args[0] 23384 if s0.Op != OpS390XSLDconst { 23385 break 23386 } 23387 j0 := s0.AuxInt 23388 x0 := s0.Args[0] 23389 if x0.Op != OpS390XMOVHZloadidx { 23390 break 23391 } 23392 i0 := x0.AuxInt 23393 s := x0.Aux 23394 _ = x0.Args[2] 23395 p := x0.Args[0] 23396 idx := x0.Args[1] 23397 mem := x0.Args[2] 23398 or := v.Args[1] 23399 if or.Op != OpS390XOR { 23400 break 23401 } 23402 _ = or.Args[1] 23403 y := or.Args[0] 23404 s1 := or.Args[1] 23405 if s1.Op != OpS390XSLDconst { 23406 break 23407 } 23408 j1 := s1.AuxInt 23409 x1 := s1.Args[0] 23410 if x1.Op != OpS390XMOVHZloadidx { 23411 break 23412 } 23413 i1 := x1.AuxInt 23414 if x1.Aux != s { 23415 break 23416 } 23417 _ = x1.Args[2] 23418 if p != x1.Args[0] { 23419 break 23420 } 23421 if idx != x1.Args[1] { 23422 break 23423 } 23424 if mem != x1.Args[2] { 23425 break 23426 } 23427 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)) { 23428 break 23429 } 23430 b = mergePoint(b, x0, x1) 23431 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23432 v.reset(OpCopy) 23433 v.AddArg(v0) 23434 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23435 v1.AuxInt = j1 23436 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23437 v2.AuxInt = i0 23438 v2.Aux = s 23439 v2.AddArg(p) 23440 v2.AddArg(idx) 23441 v2.AddArg(mem) 23442 v1.AddArg(v2) 23443 v0.AddArg(v1) 23444 v0.AddArg(y) 23445 return true 23446 } 23447 return false 23448 } 23449 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 23450 b := v.Block 23451 _ = b 23452 typ := &b.Func.Config.Types 23453 _ = typ 23454 // 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)))) 23455 // 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) 23456 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23457 for { 23458 _ = v.Args[1] 23459 s0 := v.Args[0] 23460 if s0.Op != OpS390XSLDconst { 23461 break 23462 } 23463 j0 := s0.AuxInt 23464 x0 := s0.Args[0] 23465 if x0.Op != OpS390XMOVHZloadidx { 23466 break 23467 } 23468 i0 := x0.AuxInt 23469 s := x0.Aux 23470 _ = x0.Args[2] 23471 idx := x0.Args[0] 23472 p := x0.Args[1] 23473 mem := x0.Args[2] 23474 or := v.Args[1] 23475 if or.Op != OpS390XOR { 23476 break 23477 } 23478 _ = or.Args[1] 23479 y := or.Args[0] 23480 s1 := or.Args[1] 23481 if s1.Op != OpS390XSLDconst { 23482 break 23483 } 23484 j1 := s1.AuxInt 23485 x1 := s1.Args[0] 23486 if x1.Op != OpS390XMOVHZloadidx { 23487 break 23488 } 23489 i1 := x1.AuxInt 23490 if x1.Aux != s { 23491 break 23492 } 23493 _ = x1.Args[2] 23494 if p != x1.Args[0] { 23495 break 23496 } 23497 if idx != x1.Args[1] { 23498 break 23499 } 23500 if mem != x1.Args[2] { 23501 break 23502 } 23503 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)) { 23504 break 23505 } 23506 b = mergePoint(b, x0, x1) 23507 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23508 v.reset(OpCopy) 23509 v.AddArg(v0) 23510 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23511 v1.AuxInt = j1 23512 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23513 v2.AuxInt = i0 23514 v2.Aux = s 23515 v2.AddArg(p) 23516 v2.AddArg(idx) 23517 v2.AddArg(mem) 23518 v1.AddArg(v2) 23519 v0.AddArg(v1) 23520 v0.AddArg(y) 23521 return true 23522 } 23523 // 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)))) 23524 // 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) 23525 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23526 for { 23527 _ = v.Args[1] 23528 s0 := v.Args[0] 23529 if s0.Op != OpS390XSLDconst { 23530 break 23531 } 23532 j0 := s0.AuxInt 23533 x0 := s0.Args[0] 23534 if x0.Op != OpS390XMOVHZloadidx { 23535 break 23536 } 23537 i0 := x0.AuxInt 23538 s := x0.Aux 23539 _ = x0.Args[2] 23540 p := x0.Args[0] 23541 idx := x0.Args[1] 23542 mem := x0.Args[2] 23543 or := v.Args[1] 23544 if or.Op != OpS390XOR { 23545 break 23546 } 23547 _ = or.Args[1] 23548 y := or.Args[0] 23549 s1 := or.Args[1] 23550 if s1.Op != OpS390XSLDconst { 23551 break 23552 } 23553 j1 := s1.AuxInt 23554 x1 := s1.Args[0] 23555 if x1.Op != OpS390XMOVHZloadidx { 23556 break 23557 } 23558 i1 := x1.AuxInt 23559 if x1.Aux != s { 23560 break 23561 } 23562 _ = x1.Args[2] 23563 if idx != x1.Args[0] { 23564 break 23565 } 23566 if p != x1.Args[1] { 23567 break 23568 } 23569 if mem != x1.Args[2] { 23570 break 23571 } 23572 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)) { 23573 break 23574 } 23575 b = mergePoint(b, x0, x1) 23576 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23577 v.reset(OpCopy) 23578 v.AddArg(v0) 23579 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23580 v1.AuxInt = j1 23581 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23582 v2.AuxInt = i0 23583 v2.Aux = s 23584 v2.AddArg(p) 23585 v2.AddArg(idx) 23586 v2.AddArg(mem) 23587 v1.AddArg(v2) 23588 v0.AddArg(v1) 23589 v0.AddArg(y) 23590 return true 23591 } 23592 // 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)))) 23593 // 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) 23594 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23595 for { 23596 _ = v.Args[1] 23597 s0 := v.Args[0] 23598 if s0.Op != OpS390XSLDconst { 23599 break 23600 } 23601 j0 := s0.AuxInt 23602 x0 := s0.Args[0] 23603 if x0.Op != OpS390XMOVHZloadidx { 23604 break 23605 } 23606 i0 := x0.AuxInt 23607 s := x0.Aux 23608 _ = x0.Args[2] 23609 idx := x0.Args[0] 23610 p := x0.Args[1] 23611 mem := x0.Args[2] 23612 or := v.Args[1] 23613 if or.Op != OpS390XOR { 23614 break 23615 } 23616 _ = or.Args[1] 23617 y := or.Args[0] 23618 s1 := or.Args[1] 23619 if s1.Op != OpS390XSLDconst { 23620 break 23621 } 23622 j1 := s1.AuxInt 23623 x1 := s1.Args[0] 23624 if x1.Op != OpS390XMOVHZloadidx { 23625 break 23626 } 23627 i1 := x1.AuxInt 23628 if x1.Aux != s { 23629 break 23630 } 23631 _ = x1.Args[2] 23632 if idx != x1.Args[0] { 23633 break 23634 } 23635 if p != x1.Args[1] { 23636 break 23637 } 23638 if mem != x1.Args[2] { 23639 break 23640 } 23641 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)) { 23642 break 23643 } 23644 b = mergePoint(b, x0, x1) 23645 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23646 v.reset(OpCopy) 23647 v.AddArg(v0) 23648 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23649 v1.AuxInt = j1 23650 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23651 v2.AuxInt = i0 23652 v2.Aux = s 23653 v2.AddArg(p) 23654 v2.AddArg(idx) 23655 v2.AddArg(mem) 23656 v1.AddArg(v2) 23657 v0.AddArg(v1) 23658 v0.AddArg(y) 23659 return true 23660 } 23661 // 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))) 23662 // 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) 23663 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23664 for { 23665 _ = v.Args[1] 23666 or := v.Args[0] 23667 if or.Op != OpS390XOR { 23668 break 23669 } 23670 _ = or.Args[1] 23671 s1 := or.Args[0] 23672 if s1.Op != OpS390XSLDconst { 23673 break 23674 } 23675 j1 := s1.AuxInt 23676 x1 := s1.Args[0] 23677 if x1.Op != OpS390XMOVHZloadidx { 23678 break 23679 } 23680 i1 := x1.AuxInt 23681 s := x1.Aux 23682 _ = x1.Args[2] 23683 p := x1.Args[0] 23684 idx := x1.Args[1] 23685 mem := x1.Args[2] 23686 y := or.Args[1] 23687 s0 := v.Args[1] 23688 if s0.Op != OpS390XSLDconst { 23689 break 23690 } 23691 j0 := s0.AuxInt 23692 x0 := s0.Args[0] 23693 if x0.Op != OpS390XMOVHZloadidx { 23694 break 23695 } 23696 i0 := x0.AuxInt 23697 if x0.Aux != s { 23698 break 23699 } 23700 _ = x0.Args[2] 23701 if p != x0.Args[0] { 23702 break 23703 } 23704 if idx != x0.Args[1] { 23705 break 23706 } 23707 if mem != x0.Args[2] { 23708 break 23709 } 23710 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)) { 23711 break 23712 } 23713 b = mergePoint(b, x0, x1) 23714 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23715 v.reset(OpCopy) 23716 v.AddArg(v0) 23717 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23718 v1.AuxInt = j1 23719 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23720 v2.AuxInt = i0 23721 v2.Aux = s 23722 v2.AddArg(p) 23723 v2.AddArg(idx) 23724 v2.AddArg(mem) 23725 v1.AddArg(v2) 23726 v0.AddArg(v1) 23727 v0.AddArg(y) 23728 return true 23729 } 23730 // 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))) 23731 // 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) 23732 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23733 for { 23734 _ = v.Args[1] 23735 or := v.Args[0] 23736 if or.Op != OpS390XOR { 23737 break 23738 } 23739 _ = or.Args[1] 23740 s1 := or.Args[0] 23741 if s1.Op != OpS390XSLDconst { 23742 break 23743 } 23744 j1 := s1.AuxInt 23745 x1 := s1.Args[0] 23746 if x1.Op != OpS390XMOVHZloadidx { 23747 break 23748 } 23749 i1 := x1.AuxInt 23750 s := x1.Aux 23751 _ = x1.Args[2] 23752 idx := x1.Args[0] 23753 p := x1.Args[1] 23754 mem := x1.Args[2] 23755 y := or.Args[1] 23756 s0 := v.Args[1] 23757 if s0.Op != OpS390XSLDconst { 23758 break 23759 } 23760 j0 := s0.AuxInt 23761 x0 := s0.Args[0] 23762 if x0.Op != OpS390XMOVHZloadidx { 23763 break 23764 } 23765 i0 := x0.AuxInt 23766 if x0.Aux != s { 23767 break 23768 } 23769 _ = x0.Args[2] 23770 if p != x0.Args[0] { 23771 break 23772 } 23773 if idx != x0.Args[1] { 23774 break 23775 } 23776 if mem != x0.Args[2] { 23777 break 23778 } 23779 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)) { 23780 break 23781 } 23782 b = mergePoint(b, x0, x1) 23783 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23784 v.reset(OpCopy) 23785 v.AddArg(v0) 23786 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23787 v1.AuxInt = j1 23788 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23789 v2.AuxInt = i0 23790 v2.Aux = s 23791 v2.AddArg(p) 23792 v2.AddArg(idx) 23793 v2.AddArg(mem) 23794 v1.AddArg(v2) 23795 v0.AddArg(v1) 23796 v0.AddArg(y) 23797 return true 23798 } 23799 // 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))) 23800 // 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) 23801 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23802 for { 23803 _ = v.Args[1] 23804 or := v.Args[0] 23805 if or.Op != OpS390XOR { 23806 break 23807 } 23808 _ = or.Args[1] 23809 y := or.Args[0] 23810 s1 := or.Args[1] 23811 if s1.Op != OpS390XSLDconst { 23812 break 23813 } 23814 j1 := s1.AuxInt 23815 x1 := s1.Args[0] 23816 if x1.Op != OpS390XMOVHZloadidx { 23817 break 23818 } 23819 i1 := x1.AuxInt 23820 s := x1.Aux 23821 _ = x1.Args[2] 23822 p := x1.Args[0] 23823 idx := x1.Args[1] 23824 mem := x1.Args[2] 23825 s0 := v.Args[1] 23826 if s0.Op != OpS390XSLDconst { 23827 break 23828 } 23829 j0 := s0.AuxInt 23830 x0 := s0.Args[0] 23831 if x0.Op != OpS390XMOVHZloadidx { 23832 break 23833 } 23834 i0 := x0.AuxInt 23835 if x0.Aux != s { 23836 break 23837 } 23838 _ = x0.Args[2] 23839 if p != x0.Args[0] { 23840 break 23841 } 23842 if idx != x0.Args[1] { 23843 break 23844 } 23845 if mem != x0.Args[2] { 23846 break 23847 } 23848 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)) { 23849 break 23850 } 23851 b = mergePoint(b, x0, x1) 23852 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23853 v.reset(OpCopy) 23854 v.AddArg(v0) 23855 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23856 v1.AuxInt = j1 23857 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23858 v2.AuxInt = i0 23859 v2.Aux = s 23860 v2.AddArg(p) 23861 v2.AddArg(idx) 23862 v2.AddArg(mem) 23863 v1.AddArg(v2) 23864 v0.AddArg(v1) 23865 v0.AddArg(y) 23866 return true 23867 } 23868 // 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))) 23869 // 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) 23870 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23871 for { 23872 _ = v.Args[1] 23873 or := v.Args[0] 23874 if or.Op != OpS390XOR { 23875 break 23876 } 23877 _ = or.Args[1] 23878 y := or.Args[0] 23879 s1 := or.Args[1] 23880 if s1.Op != OpS390XSLDconst { 23881 break 23882 } 23883 j1 := s1.AuxInt 23884 x1 := s1.Args[0] 23885 if x1.Op != OpS390XMOVHZloadidx { 23886 break 23887 } 23888 i1 := x1.AuxInt 23889 s := x1.Aux 23890 _ = x1.Args[2] 23891 idx := x1.Args[0] 23892 p := x1.Args[1] 23893 mem := x1.Args[2] 23894 s0 := v.Args[1] 23895 if s0.Op != OpS390XSLDconst { 23896 break 23897 } 23898 j0 := s0.AuxInt 23899 x0 := s0.Args[0] 23900 if x0.Op != OpS390XMOVHZloadidx { 23901 break 23902 } 23903 i0 := x0.AuxInt 23904 if x0.Aux != s { 23905 break 23906 } 23907 _ = x0.Args[2] 23908 if p != x0.Args[0] { 23909 break 23910 } 23911 if idx != x0.Args[1] { 23912 break 23913 } 23914 if mem != x0.Args[2] { 23915 break 23916 } 23917 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)) { 23918 break 23919 } 23920 b = mergePoint(b, x0, x1) 23921 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23922 v.reset(OpCopy) 23923 v.AddArg(v0) 23924 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23925 v1.AuxInt = j1 23926 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23927 v2.AuxInt = i0 23928 v2.Aux = s 23929 v2.AddArg(p) 23930 v2.AddArg(idx) 23931 v2.AddArg(mem) 23932 v1.AddArg(v2) 23933 v0.AddArg(v1) 23934 v0.AddArg(y) 23935 return true 23936 } 23937 // 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))) 23938 // 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) 23939 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23940 for { 23941 _ = v.Args[1] 23942 or := v.Args[0] 23943 if or.Op != OpS390XOR { 23944 break 23945 } 23946 _ = or.Args[1] 23947 s1 := or.Args[0] 23948 if s1.Op != OpS390XSLDconst { 23949 break 23950 } 23951 j1 := s1.AuxInt 23952 x1 := s1.Args[0] 23953 if x1.Op != OpS390XMOVHZloadidx { 23954 break 23955 } 23956 i1 := x1.AuxInt 23957 s := x1.Aux 23958 _ = x1.Args[2] 23959 p := x1.Args[0] 23960 idx := x1.Args[1] 23961 mem := x1.Args[2] 23962 y := or.Args[1] 23963 s0 := v.Args[1] 23964 if s0.Op != OpS390XSLDconst { 23965 break 23966 } 23967 j0 := s0.AuxInt 23968 x0 := s0.Args[0] 23969 if x0.Op != OpS390XMOVHZloadidx { 23970 break 23971 } 23972 i0 := x0.AuxInt 23973 if x0.Aux != s { 23974 break 23975 } 23976 _ = x0.Args[2] 23977 if idx != x0.Args[0] { 23978 break 23979 } 23980 if p != x0.Args[1] { 23981 break 23982 } 23983 if mem != x0.Args[2] { 23984 break 23985 } 23986 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)) { 23987 break 23988 } 23989 b = mergePoint(b, x0, x1) 23990 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23991 v.reset(OpCopy) 23992 v.AddArg(v0) 23993 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23994 v1.AuxInt = j1 23995 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23996 v2.AuxInt = i0 23997 v2.Aux = s 23998 v2.AddArg(p) 23999 v2.AddArg(idx) 24000 v2.AddArg(mem) 24001 v1.AddArg(v2) 24002 v0.AddArg(v1) 24003 v0.AddArg(y) 24004 return true 24005 } 24006 // 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))) 24007 // 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) 24008 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24009 for { 24010 _ = v.Args[1] 24011 or := v.Args[0] 24012 if or.Op != OpS390XOR { 24013 break 24014 } 24015 _ = or.Args[1] 24016 s1 := or.Args[0] 24017 if s1.Op != OpS390XSLDconst { 24018 break 24019 } 24020 j1 := s1.AuxInt 24021 x1 := s1.Args[0] 24022 if x1.Op != OpS390XMOVHZloadidx { 24023 break 24024 } 24025 i1 := x1.AuxInt 24026 s := x1.Aux 24027 _ = x1.Args[2] 24028 idx := x1.Args[0] 24029 p := x1.Args[1] 24030 mem := x1.Args[2] 24031 y := or.Args[1] 24032 s0 := v.Args[1] 24033 if s0.Op != OpS390XSLDconst { 24034 break 24035 } 24036 j0 := s0.AuxInt 24037 x0 := s0.Args[0] 24038 if x0.Op != OpS390XMOVHZloadidx { 24039 break 24040 } 24041 i0 := x0.AuxInt 24042 if x0.Aux != s { 24043 break 24044 } 24045 _ = x0.Args[2] 24046 if idx != x0.Args[0] { 24047 break 24048 } 24049 if p != x0.Args[1] { 24050 break 24051 } 24052 if mem != x0.Args[2] { 24053 break 24054 } 24055 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)) { 24056 break 24057 } 24058 b = mergePoint(b, x0, x1) 24059 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24060 v.reset(OpCopy) 24061 v.AddArg(v0) 24062 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24063 v1.AuxInt = j1 24064 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24065 v2.AuxInt = i0 24066 v2.Aux = s 24067 v2.AddArg(p) 24068 v2.AddArg(idx) 24069 v2.AddArg(mem) 24070 v1.AddArg(v2) 24071 v0.AddArg(v1) 24072 v0.AddArg(y) 24073 return true 24074 } 24075 // 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))) 24076 // 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) 24077 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24078 for { 24079 _ = v.Args[1] 24080 or := v.Args[0] 24081 if or.Op != OpS390XOR { 24082 break 24083 } 24084 _ = or.Args[1] 24085 y := or.Args[0] 24086 s1 := or.Args[1] 24087 if s1.Op != OpS390XSLDconst { 24088 break 24089 } 24090 j1 := s1.AuxInt 24091 x1 := s1.Args[0] 24092 if x1.Op != OpS390XMOVHZloadidx { 24093 break 24094 } 24095 i1 := x1.AuxInt 24096 s := x1.Aux 24097 _ = x1.Args[2] 24098 p := x1.Args[0] 24099 idx := x1.Args[1] 24100 mem := x1.Args[2] 24101 s0 := v.Args[1] 24102 if s0.Op != OpS390XSLDconst { 24103 break 24104 } 24105 j0 := s0.AuxInt 24106 x0 := s0.Args[0] 24107 if x0.Op != OpS390XMOVHZloadidx { 24108 break 24109 } 24110 i0 := x0.AuxInt 24111 if x0.Aux != s { 24112 break 24113 } 24114 _ = x0.Args[2] 24115 if idx != x0.Args[0] { 24116 break 24117 } 24118 if p != x0.Args[1] { 24119 break 24120 } 24121 if mem != x0.Args[2] { 24122 break 24123 } 24124 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)) { 24125 break 24126 } 24127 b = mergePoint(b, x0, x1) 24128 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24129 v.reset(OpCopy) 24130 v.AddArg(v0) 24131 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24132 v1.AuxInt = j1 24133 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24134 v2.AuxInt = i0 24135 v2.Aux = s 24136 v2.AddArg(p) 24137 v2.AddArg(idx) 24138 v2.AddArg(mem) 24139 v1.AddArg(v2) 24140 v0.AddArg(v1) 24141 v0.AddArg(y) 24142 return true 24143 } 24144 return false 24145 } 24146 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 24147 b := v.Block 24148 _ = b 24149 typ := &b.Func.Config.Types 24150 _ = typ 24151 // 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))) 24152 // 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) 24153 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24154 for { 24155 _ = v.Args[1] 24156 or := v.Args[0] 24157 if or.Op != OpS390XOR { 24158 break 24159 } 24160 _ = or.Args[1] 24161 y := or.Args[0] 24162 s1 := or.Args[1] 24163 if s1.Op != OpS390XSLDconst { 24164 break 24165 } 24166 j1 := s1.AuxInt 24167 x1 := s1.Args[0] 24168 if x1.Op != OpS390XMOVHZloadidx { 24169 break 24170 } 24171 i1 := x1.AuxInt 24172 s := x1.Aux 24173 _ = x1.Args[2] 24174 idx := x1.Args[0] 24175 p := x1.Args[1] 24176 mem := x1.Args[2] 24177 s0 := v.Args[1] 24178 if s0.Op != OpS390XSLDconst { 24179 break 24180 } 24181 j0 := s0.AuxInt 24182 x0 := s0.Args[0] 24183 if x0.Op != OpS390XMOVHZloadidx { 24184 break 24185 } 24186 i0 := x0.AuxInt 24187 if x0.Aux != s { 24188 break 24189 } 24190 _ = x0.Args[2] 24191 if idx != x0.Args[0] { 24192 break 24193 } 24194 if p != x0.Args[1] { 24195 break 24196 } 24197 if mem != x0.Args[2] { 24198 break 24199 } 24200 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)) { 24201 break 24202 } 24203 b = mergePoint(b, x0, x1) 24204 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24205 v.reset(OpCopy) 24206 v.AddArg(v0) 24207 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24208 v1.AuxInt = j1 24209 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24210 v2.AuxInt = i0 24211 v2.Aux = s 24212 v2.AddArg(p) 24213 v2.AddArg(idx) 24214 v2.AddArg(mem) 24215 v1.AddArg(v2) 24216 v0.AddArg(v1) 24217 v0.AddArg(y) 24218 return true 24219 } 24220 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 24221 // 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) 24222 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24223 for { 24224 _ = v.Args[1] 24225 x0 := v.Args[0] 24226 if x0.Op != OpS390XMOVBZload { 24227 break 24228 } 24229 i0 := x0.AuxInt 24230 s := x0.Aux 24231 _ = x0.Args[1] 24232 p := x0.Args[0] 24233 mem := x0.Args[1] 24234 sh := v.Args[1] 24235 if sh.Op != OpS390XSLDconst { 24236 break 24237 } 24238 if sh.AuxInt != 8 { 24239 break 24240 } 24241 x1 := sh.Args[0] 24242 if x1.Op != OpS390XMOVBZload { 24243 break 24244 } 24245 i1 := x1.AuxInt 24246 if x1.Aux != s { 24247 break 24248 } 24249 _ = x1.Args[1] 24250 if p != x1.Args[0] { 24251 break 24252 } 24253 if mem != x1.Args[1] { 24254 break 24255 } 24256 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)) { 24257 break 24258 } 24259 b = mergePoint(b, x0, x1) 24260 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24261 v.reset(OpCopy) 24262 v.AddArg(v0) 24263 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24264 v1.AuxInt = i0 24265 v1.Aux = s 24266 v1.AddArg(p) 24267 v1.AddArg(mem) 24268 v0.AddArg(v1) 24269 return true 24270 } 24271 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 24272 // 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) 24273 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24274 for { 24275 _ = v.Args[1] 24276 sh := v.Args[0] 24277 if sh.Op != OpS390XSLDconst { 24278 break 24279 } 24280 if sh.AuxInt != 8 { 24281 break 24282 } 24283 x1 := sh.Args[0] 24284 if x1.Op != OpS390XMOVBZload { 24285 break 24286 } 24287 i1 := x1.AuxInt 24288 s := x1.Aux 24289 _ = x1.Args[1] 24290 p := x1.Args[0] 24291 mem := x1.Args[1] 24292 x0 := v.Args[1] 24293 if x0.Op != OpS390XMOVBZload { 24294 break 24295 } 24296 i0 := x0.AuxInt 24297 if x0.Aux != s { 24298 break 24299 } 24300 _ = x0.Args[1] 24301 if p != x0.Args[0] { 24302 break 24303 } 24304 if mem != x0.Args[1] { 24305 break 24306 } 24307 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)) { 24308 break 24309 } 24310 b = mergePoint(b, x0, x1) 24311 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24312 v.reset(OpCopy) 24313 v.AddArg(v0) 24314 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24315 v1.AuxInt = i0 24316 v1.Aux = s 24317 v1.AddArg(p) 24318 v1.AddArg(mem) 24319 v0.AddArg(v1) 24320 return true 24321 } 24322 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 24323 // 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) 24324 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24325 for { 24326 _ = v.Args[1] 24327 r0 := v.Args[0] 24328 if r0.Op != OpS390XMOVHZreg { 24329 break 24330 } 24331 x0 := r0.Args[0] 24332 if x0.Op != OpS390XMOVHBRload { 24333 break 24334 } 24335 i0 := x0.AuxInt 24336 s := x0.Aux 24337 _ = x0.Args[1] 24338 p := x0.Args[0] 24339 mem := x0.Args[1] 24340 sh := v.Args[1] 24341 if sh.Op != OpS390XSLDconst { 24342 break 24343 } 24344 if sh.AuxInt != 16 { 24345 break 24346 } 24347 r1 := sh.Args[0] 24348 if r1.Op != OpS390XMOVHZreg { 24349 break 24350 } 24351 x1 := r1.Args[0] 24352 if x1.Op != OpS390XMOVHBRload { 24353 break 24354 } 24355 i1 := x1.AuxInt 24356 if x1.Aux != s { 24357 break 24358 } 24359 _ = x1.Args[1] 24360 if p != x1.Args[0] { 24361 break 24362 } 24363 if mem != x1.Args[1] { 24364 break 24365 } 24366 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)) { 24367 break 24368 } 24369 b = mergePoint(b, x0, x1) 24370 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24371 v.reset(OpCopy) 24372 v.AddArg(v0) 24373 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24374 v1.AuxInt = i0 24375 v1.Aux = s 24376 v1.AddArg(p) 24377 v1.AddArg(mem) 24378 v0.AddArg(v1) 24379 return true 24380 } 24381 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 24382 // 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) 24383 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24384 for { 24385 _ = v.Args[1] 24386 sh := v.Args[0] 24387 if sh.Op != OpS390XSLDconst { 24388 break 24389 } 24390 if sh.AuxInt != 16 { 24391 break 24392 } 24393 r1 := sh.Args[0] 24394 if r1.Op != OpS390XMOVHZreg { 24395 break 24396 } 24397 x1 := r1.Args[0] 24398 if x1.Op != OpS390XMOVHBRload { 24399 break 24400 } 24401 i1 := x1.AuxInt 24402 s := x1.Aux 24403 _ = x1.Args[1] 24404 p := x1.Args[0] 24405 mem := x1.Args[1] 24406 r0 := v.Args[1] 24407 if r0.Op != OpS390XMOVHZreg { 24408 break 24409 } 24410 x0 := r0.Args[0] 24411 if x0.Op != OpS390XMOVHBRload { 24412 break 24413 } 24414 i0 := x0.AuxInt 24415 if x0.Aux != s { 24416 break 24417 } 24418 _ = x0.Args[1] 24419 if p != x0.Args[0] { 24420 break 24421 } 24422 if mem != x0.Args[1] { 24423 break 24424 } 24425 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)) { 24426 break 24427 } 24428 b = mergePoint(b, x0, x1) 24429 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24430 v.reset(OpCopy) 24431 v.AddArg(v0) 24432 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24433 v1.AuxInt = i0 24434 v1.Aux = s 24435 v1.AddArg(p) 24436 v1.AddArg(mem) 24437 v0.AddArg(v1) 24438 return true 24439 } 24440 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 24441 // 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) 24442 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24443 for { 24444 _ = v.Args[1] 24445 r0 := v.Args[0] 24446 if r0.Op != OpS390XMOVWZreg { 24447 break 24448 } 24449 x0 := r0.Args[0] 24450 if x0.Op != OpS390XMOVWBRload { 24451 break 24452 } 24453 i0 := x0.AuxInt 24454 s := x0.Aux 24455 _ = x0.Args[1] 24456 p := x0.Args[0] 24457 mem := x0.Args[1] 24458 sh := v.Args[1] 24459 if sh.Op != OpS390XSLDconst { 24460 break 24461 } 24462 if sh.AuxInt != 32 { 24463 break 24464 } 24465 r1 := sh.Args[0] 24466 if r1.Op != OpS390XMOVWZreg { 24467 break 24468 } 24469 x1 := r1.Args[0] 24470 if x1.Op != OpS390XMOVWBRload { 24471 break 24472 } 24473 i1 := x1.AuxInt 24474 if x1.Aux != s { 24475 break 24476 } 24477 _ = x1.Args[1] 24478 if p != x1.Args[0] { 24479 break 24480 } 24481 if mem != x1.Args[1] { 24482 break 24483 } 24484 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)) { 24485 break 24486 } 24487 b = mergePoint(b, x0, x1) 24488 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24489 v.reset(OpCopy) 24490 v.AddArg(v0) 24491 v0.AuxInt = i0 24492 v0.Aux = s 24493 v0.AddArg(p) 24494 v0.AddArg(mem) 24495 return true 24496 } 24497 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 24498 // 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) 24499 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24500 for { 24501 _ = v.Args[1] 24502 sh := v.Args[0] 24503 if sh.Op != OpS390XSLDconst { 24504 break 24505 } 24506 if sh.AuxInt != 32 { 24507 break 24508 } 24509 r1 := sh.Args[0] 24510 if r1.Op != OpS390XMOVWZreg { 24511 break 24512 } 24513 x1 := r1.Args[0] 24514 if x1.Op != OpS390XMOVWBRload { 24515 break 24516 } 24517 i1 := x1.AuxInt 24518 s := x1.Aux 24519 _ = x1.Args[1] 24520 p := x1.Args[0] 24521 mem := x1.Args[1] 24522 r0 := v.Args[1] 24523 if r0.Op != OpS390XMOVWZreg { 24524 break 24525 } 24526 x0 := r0.Args[0] 24527 if x0.Op != OpS390XMOVWBRload { 24528 break 24529 } 24530 i0 := x0.AuxInt 24531 if x0.Aux != s { 24532 break 24533 } 24534 _ = x0.Args[1] 24535 if p != x0.Args[0] { 24536 break 24537 } 24538 if mem != x0.Args[1] { 24539 break 24540 } 24541 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)) { 24542 break 24543 } 24544 b = mergePoint(b, x0, x1) 24545 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24546 v.reset(OpCopy) 24547 v.AddArg(v0) 24548 v0.AuxInt = i0 24549 v0.Aux = s 24550 v0.AddArg(p) 24551 v0.AddArg(mem) 24552 return true 24553 } 24554 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 24555 // 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) 24556 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24557 for { 24558 _ = v.Args[1] 24559 s1 := v.Args[0] 24560 if s1.Op != OpS390XSLDconst { 24561 break 24562 } 24563 j1 := s1.AuxInt 24564 x1 := s1.Args[0] 24565 if x1.Op != OpS390XMOVBZload { 24566 break 24567 } 24568 i1 := x1.AuxInt 24569 s := x1.Aux 24570 _ = x1.Args[1] 24571 p := x1.Args[0] 24572 mem := x1.Args[1] 24573 or := v.Args[1] 24574 if or.Op != OpS390XOR { 24575 break 24576 } 24577 _ = or.Args[1] 24578 s0 := or.Args[0] 24579 if s0.Op != OpS390XSLDconst { 24580 break 24581 } 24582 j0 := s0.AuxInt 24583 x0 := s0.Args[0] 24584 if x0.Op != OpS390XMOVBZload { 24585 break 24586 } 24587 i0 := x0.AuxInt 24588 if x0.Aux != s { 24589 break 24590 } 24591 _ = x0.Args[1] 24592 if p != x0.Args[0] { 24593 break 24594 } 24595 if mem != x0.Args[1] { 24596 break 24597 } 24598 y := or.Args[1] 24599 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)) { 24600 break 24601 } 24602 b = mergePoint(b, x0, x1) 24603 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24604 v.reset(OpCopy) 24605 v.AddArg(v0) 24606 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24607 v1.AuxInt = j0 24608 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24609 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24610 v3.AuxInt = i0 24611 v3.Aux = s 24612 v3.AddArg(p) 24613 v3.AddArg(mem) 24614 v2.AddArg(v3) 24615 v1.AddArg(v2) 24616 v0.AddArg(v1) 24617 v0.AddArg(y) 24618 return true 24619 } 24620 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 24621 // 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) 24622 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24623 for { 24624 _ = v.Args[1] 24625 s1 := v.Args[0] 24626 if s1.Op != OpS390XSLDconst { 24627 break 24628 } 24629 j1 := s1.AuxInt 24630 x1 := s1.Args[0] 24631 if x1.Op != OpS390XMOVBZload { 24632 break 24633 } 24634 i1 := x1.AuxInt 24635 s := x1.Aux 24636 _ = x1.Args[1] 24637 p := x1.Args[0] 24638 mem := x1.Args[1] 24639 or := v.Args[1] 24640 if or.Op != OpS390XOR { 24641 break 24642 } 24643 _ = or.Args[1] 24644 y := or.Args[0] 24645 s0 := or.Args[1] 24646 if s0.Op != OpS390XSLDconst { 24647 break 24648 } 24649 j0 := s0.AuxInt 24650 x0 := s0.Args[0] 24651 if x0.Op != OpS390XMOVBZload { 24652 break 24653 } 24654 i0 := x0.AuxInt 24655 if x0.Aux != s { 24656 break 24657 } 24658 _ = x0.Args[1] 24659 if p != x0.Args[0] { 24660 break 24661 } 24662 if mem != x0.Args[1] { 24663 break 24664 } 24665 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)) { 24666 break 24667 } 24668 b = mergePoint(b, x0, x1) 24669 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24670 v.reset(OpCopy) 24671 v.AddArg(v0) 24672 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24673 v1.AuxInt = j0 24674 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24675 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24676 v3.AuxInt = i0 24677 v3.Aux = s 24678 v3.AddArg(p) 24679 v3.AddArg(mem) 24680 v2.AddArg(v3) 24681 v1.AddArg(v2) 24682 v0.AddArg(v1) 24683 v0.AddArg(y) 24684 return true 24685 } 24686 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24687 // 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) 24688 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24689 for { 24690 _ = v.Args[1] 24691 or := v.Args[0] 24692 if or.Op != OpS390XOR { 24693 break 24694 } 24695 _ = or.Args[1] 24696 s0 := or.Args[0] 24697 if s0.Op != OpS390XSLDconst { 24698 break 24699 } 24700 j0 := s0.AuxInt 24701 x0 := s0.Args[0] 24702 if x0.Op != OpS390XMOVBZload { 24703 break 24704 } 24705 i0 := x0.AuxInt 24706 s := x0.Aux 24707 _ = x0.Args[1] 24708 p := x0.Args[0] 24709 mem := x0.Args[1] 24710 y := or.Args[1] 24711 s1 := v.Args[1] 24712 if s1.Op != OpS390XSLDconst { 24713 break 24714 } 24715 j1 := s1.AuxInt 24716 x1 := s1.Args[0] 24717 if x1.Op != OpS390XMOVBZload { 24718 break 24719 } 24720 i1 := x1.AuxInt 24721 if x1.Aux != s { 24722 break 24723 } 24724 _ = x1.Args[1] 24725 if p != x1.Args[0] { 24726 break 24727 } 24728 if mem != x1.Args[1] { 24729 break 24730 } 24731 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)) { 24732 break 24733 } 24734 b = mergePoint(b, x0, x1) 24735 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24736 v.reset(OpCopy) 24737 v.AddArg(v0) 24738 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24739 v1.AuxInt = j0 24740 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24741 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24742 v3.AuxInt = i0 24743 v3.Aux = s 24744 v3.AddArg(p) 24745 v3.AddArg(mem) 24746 v2.AddArg(v3) 24747 v1.AddArg(v2) 24748 v0.AddArg(v1) 24749 v0.AddArg(y) 24750 return true 24751 } 24752 return false 24753 } 24754 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 24755 b := v.Block 24756 _ = b 24757 typ := &b.Func.Config.Types 24758 _ = typ 24759 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24760 // 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) 24761 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24762 for { 24763 _ = v.Args[1] 24764 or := v.Args[0] 24765 if or.Op != OpS390XOR { 24766 break 24767 } 24768 _ = or.Args[1] 24769 y := or.Args[0] 24770 s0 := or.Args[1] 24771 if s0.Op != OpS390XSLDconst { 24772 break 24773 } 24774 j0 := s0.AuxInt 24775 x0 := s0.Args[0] 24776 if x0.Op != OpS390XMOVBZload { 24777 break 24778 } 24779 i0 := x0.AuxInt 24780 s := x0.Aux 24781 _ = x0.Args[1] 24782 p := x0.Args[0] 24783 mem := x0.Args[1] 24784 s1 := v.Args[1] 24785 if s1.Op != OpS390XSLDconst { 24786 break 24787 } 24788 j1 := s1.AuxInt 24789 x1 := s1.Args[0] 24790 if x1.Op != OpS390XMOVBZload { 24791 break 24792 } 24793 i1 := x1.AuxInt 24794 if x1.Aux != s { 24795 break 24796 } 24797 _ = x1.Args[1] 24798 if p != x1.Args[0] { 24799 break 24800 } 24801 if mem != x1.Args[1] { 24802 break 24803 } 24804 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)) { 24805 break 24806 } 24807 b = mergePoint(b, x0, x1) 24808 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24809 v.reset(OpCopy) 24810 v.AddArg(v0) 24811 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24812 v1.AuxInt = j0 24813 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24814 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24815 v3.AuxInt = i0 24816 v3.Aux = s 24817 v3.AddArg(p) 24818 v3.AddArg(mem) 24819 v2.AddArg(v3) 24820 v1.AddArg(v2) 24821 v0.AddArg(v1) 24822 v0.AddArg(y) 24823 return true 24824 } 24825 // 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)) 24826 // 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) 24827 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24828 for { 24829 _ = v.Args[1] 24830 s1 := v.Args[0] 24831 if s1.Op != OpS390XSLDconst { 24832 break 24833 } 24834 j1 := s1.AuxInt 24835 r1 := s1.Args[0] 24836 if r1.Op != OpS390XMOVHZreg { 24837 break 24838 } 24839 x1 := r1.Args[0] 24840 if x1.Op != OpS390XMOVHBRload { 24841 break 24842 } 24843 i1 := x1.AuxInt 24844 s := x1.Aux 24845 _ = x1.Args[1] 24846 p := x1.Args[0] 24847 mem := x1.Args[1] 24848 or := v.Args[1] 24849 if or.Op != OpS390XOR { 24850 break 24851 } 24852 _ = or.Args[1] 24853 s0 := or.Args[0] 24854 if s0.Op != OpS390XSLDconst { 24855 break 24856 } 24857 j0 := s0.AuxInt 24858 r0 := s0.Args[0] 24859 if r0.Op != OpS390XMOVHZreg { 24860 break 24861 } 24862 x0 := r0.Args[0] 24863 if x0.Op != OpS390XMOVHBRload { 24864 break 24865 } 24866 i0 := x0.AuxInt 24867 if x0.Aux != s { 24868 break 24869 } 24870 _ = x0.Args[1] 24871 if p != x0.Args[0] { 24872 break 24873 } 24874 if mem != x0.Args[1] { 24875 break 24876 } 24877 y := or.Args[1] 24878 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)) { 24879 break 24880 } 24881 b = mergePoint(b, x0, x1) 24882 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24883 v.reset(OpCopy) 24884 v.AddArg(v0) 24885 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24886 v1.AuxInt = j0 24887 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24888 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24889 v3.AuxInt = i0 24890 v3.Aux = s 24891 v3.AddArg(p) 24892 v3.AddArg(mem) 24893 v2.AddArg(v3) 24894 v1.AddArg(v2) 24895 v0.AddArg(v1) 24896 v0.AddArg(y) 24897 return true 24898 } 24899 // 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))))) 24900 // 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) 24901 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24902 for { 24903 _ = v.Args[1] 24904 s1 := v.Args[0] 24905 if s1.Op != OpS390XSLDconst { 24906 break 24907 } 24908 j1 := s1.AuxInt 24909 r1 := s1.Args[0] 24910 if r1.Op != OpS390XMOVHZreg { 24911 break 24912 } 24913 x1 := r1.Args[0] 24914 if x1.Op != OpS390XMOVHBRload { 24915 break 24916 } 24917 i1 := x1.AuxInt 24918 s := x1.Aux 24919 _ = x1.Args[1] 24920 p := x1.Args[0] 24921 mem := x1.Args[1] 24922 or := v.Args[1] 24923 if or.Op != OpS390XOR { 24924 break 24925 } 24926 _ = or.Args[1] 24927 y := or.Args[0] 24928 s0 := or.Args[1] 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 if x0.Aux != s { 24943 break 24944 } 24945 _ = x0.Args[1] 24946 if p != x0.Args[0] { 24947 break 24948 } 24949 if mem != x0.Args[1] { 24950 break 24951 } 24952 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)) { 24953 break 24954 } 24955 b = mergePoint(b, x0, x1) 24956 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24957 v.reset(OpCopy) 24958 v.AddArg(v0) 24959 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24960 v1.AuxInt = j0 24961 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24962 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24963 v3.AuxInt = i0 24964 v3.Aux = s 24965 v3.AddArg(p) 24966 v3.AddArg(mem) 24967 v2.AddArg(v3) 24968 v1.AddArg(v2) 24969 v0.AddArg(v1) 24970 v0.AddArg(y) 24971 return true 24972 } 24973 // 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)))) 24974 // 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) 24975 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24976 for { 24977 _ = v.Args[1] 24978 or := v.Args[0] 24979 if or.Op != OpS390XOR { 24980 break 24981 } 24982 _ = or.Args[1] 24983 s0 := or.Args[0] 24984 if s0.Op != OpS390XSLDconst { 24985 break 24986 } 24987 j0 := s0.AuxInt 24988 r0 := s0.Args[0] 24989 if r0.Op != OpS390XMOVHZreg { 24990 break 24991 } 24992 x0 := r0.Args[0] 24993 if x0.Op != OpS390XMOVHBRload { 24994 break 24995 } 24996 i0 := x0.AuxInt 24997 s := x0.Aux 24998 _ = x0.Args[1] 24999 p := x0.Args[0] 25000 mem := x0.Args[1] 25001 y := or.Args[1] 25002 s1 := v.Args[1] 25003 if s1.Op != OpS390XSLDconst { 25004 break 25005 } 25006 j1 := s1.AuxInt 25007 r1 := s1.Args[0] 25008 if r1.Op != OpS390XMOVHZreg { 25009 break 25010 } 25011 x1 := r1.Args[0] 25012 if x1.Op != OpS390XMOVHBRload { 25013 break 25014 } 25015 i1 := x1.AuxInt 25016 if x1.Aux != s { 25017 break 25018 } 25019 _ = x1.Args[1] 25020 if p != x1.Args[0] { 25021 break 25022 } 25023 if mem != x1.Args[1] { 25024 break 25025 } 25026 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)) { 25027 break 25028 } 25029 b = mergePoint(b, x0, x1) 25030 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25031 v.reset(OpCopy) 25032 v.AddArg(v0) 25033 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25034 v1.AuxInt = j0 25035 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25036 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 25037 v3.AuxInt = i0 25038 v3.Aux = s 25039 v3.AddArg(p) 25040 v3.AddArg(mem) 25041 v2.AddArg(v3) 25042 v1.AddArg(v2) 25043 v0.AddArg(v1) 25044 v0.AddArg(y) 25045 return true 25046 } 25047 // 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)))) 25048 // 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) 25049 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 25050 for { 25051 _ = v.Args[1] 25052 or := v.Args[0] 25053 if or.Op != OpS390XOR { 25054 break 25055 } 25056 _ = or.Args[1] 25057 y := or.Args[0] 25058 s0 := or.Args[1] 25059 if s0.Op != OpS390XSLDconst { 25060 break 25061 } 25062 j0 := s0.AuxInt 25063 r0 := s0.Args[0] 25064 if r0.Op != OpS390XMOVHZreg { 25065 break 25066 } 25067 x0 := r0.Args[0] 25068 if x0.Op != OpS390XMOVHBRload { 25069 break 25070 } 25071 i0 := x0.AuxInt 25072 s := x0.Aux 25073 _ = x0.Args[1] 25074 p := x0.Args[0] 25075 mem := x0.Args[1] 25076 s1 := v.Args[1] 25077 if s1.Op != OpS390XSLDconst { 25078 break 25079 } 25080 j1 := s1.AuxInt 25081 r1 := s1.Args[0] 25082 if r1.Op != OpS390XMOVHZreg { 25083 break 25084 } 25085 x1 := r1.Args[0] 25086 if x1.Op != OpS390XMOVHBRload { 25087 break 25088 } 25089 i1 := x1.AuxInt 25090 if x1.Aux != s { 25091 break 25092 } 25093 _ = x1.Args[1] 25094 if p != x1.Args[0] { 25095 break 25096 } 25097 if mem != x1.Args[1] { 25098 break 25099 } 25100 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)) { 25101 break 25102 } 25103 b = mergePoint(b, x0, x1) 25104 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25105 v.reset(OpCopy) 25106 v.AddArg(v0) 25107 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25108 v1.AuxInt = j0 25109 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25110 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 25111 v3.AuxInt = i0 25112 v3.Aux = s 25113 v3.AddArg(p) 25114 v3.AddArg(mem) 25115 v2.AddArg(v3) 25116 v1.AddArg(v2) 25117 v0.AddArg(v1) 25118 v0.AddArg(y) 25119 return true 25120 } 25121 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25122 // 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) 25123 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25124 for { 25125 _ = v.Args[1] 25126 x0 := v.Args[0] 25127 if x0.Op != OpS390XMOVBZloadidx { 25128 break 25129 } 25130 i0 := x0.AuxInt 25131 s := x0.Aux 25132 _ = x0.Args[2] 25133 p := x0.Args[0] 25134 idx := x0.Args[1] 25135 mem := x0.Args[2] 25136 sh := v.Args[1] 25137 if sh.Op != OpS390XSLDconst { 25138 break 25139 } 25140 if sh.AuxInt != 8 { 25141 break 25142 } 25143 x1 := sh.Args[0] 25144 if x1.Op != OpS390XMOVBZloadidx { 25145 break 25146 } 25147 i1 := x1.AuxInt 25148 if x1.Aux != s { 25149 break 25150 } 25151 _ = x1.Args[2] 25152 if p != x1.Args[0] { 25153 break 25154 } 25155 if idx != x1.Args[1] { 25156 break 25157 } 25158 if mem != x1.Args[2] { 25159 break 25160 } 25161 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)) { 25162 break 25163 } 25164 b = mergePoint(b, x0, x1) 25165 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25166 v.reset(OpCopy) 25167 v.AddArg(v0) 25168 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25169 v1.AuxInt = i0 25170 v1.Aux = s 25171 v1.AddArg(p) 25172 v1.AddArg(idx) 25173 v1.AddArg(mem) 25174 v0.AddArg(v1) 25175 return true 25176 } 25177 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25178 // 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) 25179 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25180 for { 25181 _ = v.Args[1] 25182 x0 := v.Args[0] 25183 if x0.Op != OpS390XMOVBZloadidx { 25184 break 25185 } 25186 i0 := x0.AuxInt 25187 s := x0.Aux 25188 _ = x0.Args[2] 25189 idx := x0.Args[0] 25190 p := x0.Args[1] 25191 mem := x0.Args[2] 25192 sh := v.Args[1] 25193 if sh.Op != OpS390XSLDconst { 25194 break 25195 } 25196 if sh.AuxInt != 8 { 25197 break 25198 } 25199 x1 := sh.Args[0] 25200 if x1.Op != OpS390XMOVBZloadidx { 25201 break 25202 } 25203 i1 := x1.AuxInt 25204 if x1.Aux != s { 25205 break 25206 } 25207 _ = x1.Args[2] 25208 if p != x1.Args[0] { 25209 break 25210 } 25211 if idx != x1.Args[1] { 25212 break 25213 } 25214 if mem != x1.Args[2] { 25215 break 25216 } 25217 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)) { 25218 break 25219 } 25220 b = mergePoint(b, x0, x1) 25221 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25222 v.reset(OpCopy) 25223 v.AddArg(v0) 25224 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25225 v1.AuxInt = i0 25226 v1.Aux = s 25227 v1.AddArg(p) 25228 v1.AddArg(idx) 25229 v1.AddArg(mem) 25230 v0.AddArg(v1) 25231 return true 25232 } 25233 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25234 // 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) 25235 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25236 for { 25237 _ = v.Args[1] 25238 x0 := v.Args[0] 25239 if x0.Op != OpS390XMOVBZloadidx { 25240 break 25241 } 25242 i0 := x0.AuxInt 25243 s := x0.Aux 25244 _ = x0.Args[2] 25245 p := x0.Args[0] 25246 idx := x0.Args[1] 25247 mem := x0.Args[2] 25248 sh := v.Args[1] 25249 if sh.Op != OpS390XSLDconst { 25250 break 25251 } 25252 if sh.AuxInt != 8 { 25253 break 25254 } 25255 x1 := sh.Args[0] 25256 if x1.Op != OpS390XMOVBZloadidx { 25257 break 25258 } 25259 i1 := x1.AuxInt 25260 if x1.Aux != s { 25261 break 25262 } 25263 _ = x1.Args[2] 25264 if idx != x1.Args[0] { 25265 break 25266 } 25267 if p != x1.Args[1] { 25268 break 25269 } 25270 if mem != x1.Args[2] { 25271 break 25272 } 25273 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)) { 25274 break 25275 } 25276 b = mergePoint(b, x0, x1) 25277 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25278 v.reset(OpCopy) 25279 v.AddArg(v0) 25280 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25281 v1.AuxInt = i0 25282 v1.Aux = s 25283 v1.AddArg(p) 25284 v1.AddArg(idx) 25285 v1.AddArg(mem) 25286 v0.AddArg(v1) 25287 return true 25288 } 25289 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25290 // 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) 25291 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25292 for { 25293 _ = v.Args[1] 25294 x0 := v.Args[0] 25295 if x0.Op != OpS390XMOVBZloadidx { 25296 break 25297 } 25298 i0 := x0.AuxInt 25299 s := x0.Aux 25300 _ = x0.Args[2] 25301 idx := x0.Args[0] 25302 p := x0.Args[1] 25303 mem := x0.Args[2] 25304 sh := v.Args[1] 25305 if sh.Op != OpS390XSLDconst { 25306 break 25307 } 25308 if sh.AuxInt != 8 { 25309 break 25310 } 25311 x1 := sh.Args[0] 25312 if x1.Op != OpS390XMOVBZloadidx { 25313 break 25314 } 25315 i1 := x1.AuxInt 25316 if x1.Aux != s { 25317 break 25318 } 25319 _ = x1.Args[2] 25320 if idx != x1.Args[0] { 25321 break 25322 } 25323 if p != x1.Args[1] { 25324 break 25325 } 25326 if mem != x1.Args[2] { 25327 break 25328 } 25329 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)) { 25330 break 25331 } 25332 b = mergePoint(b, x0, x1) 25333 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25334 v.reset(OpCopy) 25335 v.AddArg(v0) 25336 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25337 v1.AuxInt = i0 25338 v1.Aux = s 25339 v1.AddArg(p) 25340 v1.AddArg(idx) 25341 v1.AddArg(mem) 25342 v0.AddArg(v1) 25343 return true 25344 } 25345 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 25346 // 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) 25347 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25348 for { 25349 _ = v.Args[1] 25350 sh := v.Args[0] 25351 if sh.Op != OpS390XSLDconst { 25352 break 25353 } 25354 if sh.AuxInt != 8 { 25355 break 25356 } 25357 x1 := sh.Args[0] 25358 if x1.Op != OpS390XMOVBZloadidx { 25359 break 25360 } 25361 i1 := x1.AuxInt 25362 s := x1.Aux 25363 _ = x1.Args[2] 25364 p := x1.Args[0] 25365 idx := x1.Args[1] 25366 mem := x1.Args[2] 25367 x0 := v.Args[1] 25368 if x0.Op != OpS390XMOVBZloadidx { 25369 break 25370 } 25371 i0 := x0.AuxInt 25372 if x0.Aux != s { 25373 break 25374 } 25375 _ = x0.Args[2] 25376 if p != x0.Args[0] { 25377 break 25378 } 25379 if idx != x0.Args[1] { 25380 break 25381 } 25382 if mem != x0.Args[2] { 25383 break 25384 } 25385 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)) { 25386 break 25387 } 25388 b = mergePoint(b, x0, x1) 25389 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25390 v.reset(OpCopy) 25391 v.AddArg(v0) 25392 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25393 v1.AuxInt = i0 25394 v1.Aux = s 25395 v1.AddArg(p) 25396 v1.AddArg(idx) 25397 v1.AddArg(mem) 25398 v0.AddArg(v1) 25399 return true 25400 } 25401 return false 25402 } 25403 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 25404 b := v.Block 25405 _ = b 25406 typ := &b.Func.Config.Types 25407 _ = typ 25408 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 25409 // 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) 25410 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25411 for { 25412 _ = v.Args[1] 25413 sh := v.Args[0] 25414 if sh.Op != OpS390XSLDconst { 25415 break 25416 } 25417 if sh.AuxInt != 8 { 25418 break 25419 } 25420 x1 := sh.Args[0] 25421 if x1.Op != OpS390XMOVBZloadidx { 25422 break 25423 } 25424 i1 := x1.AuxInt 25425 s := x1.Aux 25426 _ = x1.Args[2] 25427 idx := x1.Args[0] 25428 p := x1.Args[1] 25429 mem := x1.Args[2] 25430 x0 := v.Args[1] 25431 if x0.Op != OpS390XMOVBZloadidx { 25432 break 25433 } 25434 i0 := x0.AuxInt 25435 if x0.Aux != s { 25436 break 25437 } 25438 _ = x0.Args[2] 25439 if p != x0.Args[0] { 25440 break 25441 } 25442 if idx != x0.Args[1] { 25443 break 25444 } 25445 if mem != x0.Args[2] { 25446 break 25447 } 25448 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)) { 25449 break 25450 } 25451 b = mergePoint(b, x0, x1) 25452 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25453 v.reset(OpCopy) 25454 v.AddArg(v0) 25455 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25456 v1.AuxInt = i0 25457 v1.Aux = s 25458 v1.AddArg(p) 25459 v1.AddArg(idx) 25460 v1.AddArg(mem) 25461 v0.AddArg(v1) 25462 return true 25463 } 25464 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25465 // 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) 25466 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25467 for { 25468 _ = v.Args[1] 25469 sh := v.Args[0] 25470 if sh.Op != OpS390XSLDconst { 25471 break 25472 } 25473 if sh.AuxInt != 8 { 25474 break 25475 } 25476 x1 := sh.Args[0] 25477 if x1.Op != OpS390XMOVBZloadidx { 25478 break 25479 } 25480 i1 := x1.AuxInt 25481 s := x1.Aux 25482 _ = x1.Args[2] 25483 p := x1.Args[0] 25484 idx := x1.Args[1] 25485 mem := x1.Args[2] 25486 x0 := v.Args[1] 25487 if x0.Op != OpS390XMOVBZloadidx { 25488 break 25489 } 25490 i0 := x0.AuxInt 25491 if x0.Aux != s { 25492 break 25493 } 25494 _ = x0.Args[2] 25495 if idx != x0.Args[0] { 25496 break 25497 } 25498 if p != x0.Args[1] { 25499 break 25500 } 25501 if mem != x0.Args[2] { 25502 break 25503 } 25504 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)) { 25505 break 25506 } 25507 b = mergePoint(b, x0, x1) 25508 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25509 v.reset(OpCopy) 25510 v.AddArg(v0) 25511 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25512 v1.AuxInt = i0 25513 v1.Aux = s 25514 v1.AddArg(p) 25515 v1.AddArg(idx) 25516 v1.AddArg(mem) 25517 v0.AddArg(v1) 25518 return true 25519 } 25520 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25521 // 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) 25522 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25523 for { 25524 _ = v.Args[1] 25525 sh := v.Args[0] 25526 if sh.Op != OpS390XSLDconst { 25527 break 25528 } 25529 if sh.AuxInt != 8 { 25530 break 25531 } 25532 x1 := sh.Args[0] 25533 if x1.Op != OpS390XMOVBZloadidx { 25534 break 25535 } 25536 i1 := x1.AuxInt 25537 s := x1.Aux 25538 _ = x1.Args[2] 25539 idx := x1.Args[0] 25540 p := x1.Args[1] 25541 mem := x1.Args[2] 25542 x0 := v.Args[1] 25543 if x0.Op != OpS390XMOVBZloadidx { 25544 break 25545 } 25546 i0 := x0.AuxInt 25547 if x0.Aux != s { 25548 break 25549 } 25550 _ = x0.Args[2] 25551 if idx != x0.Args[0] { 25552 break 25553 } 25554 if p != x0.Args[1] { 25555 break 25556 } 25557 if mem != x0.Args[2] { 25558 break 25559 } 25560 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)) { 25561 break 25562 } 25563 b = mergePoint(b, x0, x1) 25564 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25565 v.reset(OpCopy) 25566 v.AddArg(v0) 25567 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25568 v1.AuxInt = i0 25569 v1.Aux = s 25570 v1.AddArg(p) 25571 v1.AddArg(idx) 25572 v1.AddArg(mem) 25573 v0.AddArg(v1) 25574 return true 25575 } 25576 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25577 // 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) 25578 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25579 for { 25580 _ = v.Args[1] 25581 r0 := v.Args[0] 25582 if r0.Op != OpS390XMOVHZreg { 25583 break 25584 } 25585 x0 := r0.Args[0] 25586 if x0.Op != OpS390XMOVHBRloadidx { 25587 break 25588 } 25589 i0 := x0.AuxInt 25590 s := x0.Aux 25591 _ = x0.Args[2] 25592 p := x0.Args[0] 25593 idx := x0.Args[1] 25594 mem := x0.Args[2] 25595 sh := v.Args[1] 25596 if sh.Op != OpS390XSLDconst { 25597 break 25598 } 25599 if sh.AuxInt != 16 { 25600 break 25601 } 25602 r1 := sh.Args[0] 25603 if r1.Op != OpS390XMOVHZreg { 25604 break 25605 } 25606 x1 := r1.Args[0] 25607 if x1.Op != OpS390XMOVHBRloadidx { 25608 break 25609 } 25610 i1 := x1.AuxInt 25611 if x1.Aux != s { 25612 break 25613 } 25614 _ = x1.Args[2] 25615 if p != x1.Args[0] { 25616 break 25617 } 25618 if idx != x1.Args[1] { 25619 break 25620 } 25621 if mem != x1.Args[2] { 25622 break 25623 } 25624 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)) { 25625 break 25626 } 25627 b = mergePoint(b, x0, x1) 25628 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25629 v.reset(OpCopy) 25630 v.AddArg(v0) 25631 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25632 v1.AuxInt = i0 25633 v1.Aux = s 25634 v1.AddArg(p) 25635 v1.AddArg(idx) 25636 v1.AddArg(mem) 25637 v0.AddArg(v1) 25638 return true 25639 } 25640 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25641 // 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) 25642 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25643 for { 25644 _ = v.Args[1] 25645 r0 := v.Args[0] 25646 if r0.Op != OpS390XMOVHZreg { 25647 break 25648 } 25649 x0 := r0.Args[0] 25650 if x0.Op != OpS390XMOVHBRloadidx { 25651 break 25652 } 25653 i0 := x0.AuxInt 25654 s := x0.Aux 25655 _ = x0.Args[2] 25656 idx := x0.Args[0] 25657 p := x0.Args[1] 25658 mem := x0.Args[2] 25659 sh := v.Args[1] 25660 if sh.Op != OpS390XSLDconst { 25661 break 25662 } 25663 if sh.AuxInt != 16 { 25664 break 25665 } 25666 r1 := sh.Args[0] 25667 if r1.Op != OpS390XMOVHZreg { 25668 break 25669 } 25670 x1 := r1.Args[0] 25671 if x1.Op != OpS390XMOVHBRloadidx { 25672 break 25673 } 25674 i1 := x1.AuxInt 25675 if x1.Aux != s { 25676 break 25677 } 25678 _ = x1.Args[2] 25679 if p != x1.Args[0] { 25680 break 25681 } 25682 if idx != x1.Args[1] { 25683 break 25684 } 25685 if mem != x1.Args[2] { 25686 break 25687 } 25688 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)) { 25689 break 25690 } 25691 b = mergePoint(b, x0, x1) 25692 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25693 v.reset(OpCopy) 25694 v.AddArg(v0) 25695 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25696 v1.AuxInt = i0 25697 v1.Aux = s 25698 v1.AddArg(p) 25699 v1.AddArg(idx) 25700 v1.AddArg(mem) 25701 v0.AddArg(v1) 25702 return true 25703 } 25704 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25705 // 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) 25706 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25707 for { 25708 _ = v.Args[1] 25709 r0 := v.Args[0] 25710 if r0.Op != OpS390XMOVHZreg { 25711 break 25712 } 25713 x0 := r0.Args[0] 25714 if x0.Op != OpS390XMOVHBRloadidx { 25715 break 25716 } 25717 i0 := x0.AuxInt 25718 s := x0.Aux 25719 _ = x0.Args[2] 25720 p := x0.Args[0] 25721 idx := x0.Args[1] 25722 mem := x0.Args[2] 25723 sh := v.Args[1] 25724 if sh.Op != OpS390XSLDconst { 25725 break 25726 } 25727 if sh.AuxInt != 16 { 25728 break 25729 } 25730 r1 := sh.Args[0] 25731 if r1.Op != OpS390XMOVHZreg { 25732 break 25733 } 25734 x1 := r1.Args[0] 25735 if x1.Op != OpS390XMOVHBRloadidx { 25736 break 25737 } 25738 i1 := x1.AuxInt 25739 if x1.Aux != s { 25740 break 25741 } 25742 _ = x1.Args[2] 25743 if idx != x1.Args[0] { 25744 break 25745 } 25746 if p != x1.Args[1] { 25747 break 25748 } 25749 if mem != x1.Args[2] { 25750 break 25751 } 25752 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)) { 25753 break 25754 } 25755 b = mergePoint(b, x0, x1) 25756 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25757 v.reset(OpCopy) 25758 v.AddArg(v0) 25759 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25760 v1.AuxInt = i0 25761 v1.Aux = s 25762 v1.AddArg(p) 25763 v1.AddArg(idx) 25764 v1.AddArg(mem) 25765 v0.AddArg(v1) 25766 return true 25767 } 25768 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25769 // 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) 25770 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25771 for { 25772 _ = v.Args[1] 25773 r0 := v.Args[0] 25774 if r0.Op != OpS390XMOVHZreg { 25775 break 25776 } 25777 x0 := r0.Args[0] 25778 if x0.Op != OpS390XMOVHBRloadidx { 25779 break 25780 } 25781 i0 := x0.AuxInt 25782 s := x0.Aux 25783 _ = x0.Args[2] 25784 idx := x0.Args[0] 25785 p := x0.Args[1] 25786 mem := x0.Args[2] 25787 sh := v.Args[1] 25788 if sh.Op != OpS390XSLDconst { 25789 break 25790 } 25791 if sh.AuxInt != 16 { 25792 break 25793 } 25794 r1 := sh.Args[0] 25795 if r1.Op != OpS390XMOVHZreg { 25796 break 25797 } 25798 x1 := r1.Args[0] 25799 if x1.Op != OpS390XMOVHBRloadidx { 25800 break 25801 } 25802 i1 := x1.AuxInt 25803 if x1.Aux != s { 25804 break 25805 } 25806 _ = x1.Args[2] 25807 if idx != x1.Args[0] { 25808 break 25809 } 25810 if p != x1.Args[1] { 25811 break 25812 } 25813 if mem != x1.Args[2] { 25814 break 25815 } 25816 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)) { 25817 break 25818 } 25819 b = mergePoint(b, x0, x1) 25820 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25821 v.reset(OpCopy) 25822 v.AddArg(v0) 25823 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25824 v1.AuxInt = i0 25825 v1.Aux = s 25826 v1.AddArg(p) 25827 v1.AddArg(idx) 25828 v1.AddArg(mem) 25829 v0.AddArg(v1) 25830 return true 25831 } 25832 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25833 // 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) 25834 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25835 for { 25836 _ = v.Args[1] 25837 sh := v.Args[0] 25838 if sh.Op != OpS390XSLDconst { 25839 break 25840 } 25841 if sh.AuxInt != 16 { 25842 break 25843 } 25844 r1 := sh.Args[0] 25845 if r1.Op != OpS390XMOVHZreg { 25846 break 25847 } 25848 x1 := r1.Args[0] 25849 if x1.Op != OpS390XMOVHBRloadidx { 25850 break 25851 } 25852 i1 := x1.AuxInt 25853 s := x1.Aux 25854 _ = x1.Args[2] 25855 p := x1.Args[0] 25856 idx := x1.Args[1] 25857 mem := x1.Args[2] 25858 r0 := v.Args[1] 25859 if r0.Op != OpS390XMOVHZreg { 25860 break 25861 } 25862 x0 := r0.Args[0] 25863 if x0.Op != OpS390XMOVHBRloadidx { 25864 break 25865 } 25866 i0 := x0.AuxInt 25867 if x0.Aux != s { 25868 break 25869 } 25870 _ = x0.Args[2] 25871 if p != x0.Args[0] { 25872 break 25873 } 25874 if idx != x0.Args[1] { 25875 break 25876 } 25877 if mem != x0.Args[2] { 25878 break 25879 } 25880 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)) { 25881 break 25882 } 25883 b = mergePoint(b, x0, x1) 25884 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25885 v.reset(OpCopy) 25886 v.AddArg(v0) 25887 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25888 v1.AuxInt = i0 25889 v1.Aux = s 25890 v1.AddArg(p) 25891 v1.AddArg(idx) 25892 v1.AddArg(mem) 25893 v0.AddArg(v1) 25894 return true 25895 } 25896 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25897 // 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) 25898 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25899 for { 25900 _ = v.Args[1] 25901 sh := v.Args[0] 25902 if sh.Op != OpS390XSLDconst { 25903 break 25904 } 25905 if sh.AuxInt != 16 { 25906 break 25907 } 25908 r1 := sh.Args[0] 25909 if r1.Op != OpS390XMOVHZreg { 25910 break 25911 } 25912 x1 := r1.Args[0] 25913 if x1.Op != OpS390XMOVHBRloadidx { 25914 break 25915 } 25916 i1 := x1.AuxInt 25917 s := x1.Aux 25918 _ = x1.Args[2] 25919 idx := x1.Args[0] 25920 p := x1.Args[1] 25921 mem := x1.Args[2] 25922 r0 := v.Args[1] 25923 if r0.Op != OpS390XMOVHZreg { 25924 break 25925 } 25926 x0 := r0.Args[0] 25927 if x0.Op != OpS390XMOVHBRloadidx { 25928 break 25929 } 25930 i0 := x0.AuxInt 25931 if x0.Aux != s { 25932 break 25933 } 25934 _ = x0.Args[2] 25935 if p != x0.Args[0] { 25936 break 25937 } 25938 if idx != x0.Args[1] { 25939 break 25940 } 25941 if mem != x0.Args[2] { 25942 break 25943 } 25944 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)) { 25945 break 25946 } 25947 b = mergePoint(b, x0, x1) 25948 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25949 v.reset(OpCopy) 25950 v.AddArg(v0) 25951 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25952 v1.AuxInt = i0 25953 v1.Aux = s 25954 v1.AddArg(p) 25955 v1.AddArg(idx) 25956 v1.AddArg(mem) 25957 v0.AddArg(v1) 25958 return true 25959 } 25960 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 25961 // 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) 25962 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25963 for { 25964 _ = v.Args[1] 25965 sh := v.Args[0] 25966 if sh.Op != OpS390XSLDconst { 25967 break 25968 } 25969 if sh.AuxInt != 16 { 25970 break 25971 } 25972 r1 := sh.Args[0] 25973 if r1.Op != OpS390XMOVHZreg { 25974 break 25975 } 25976 x1 := r1.Args[0] 25977 if x1.Op != OpS390XMOVHBRloadidx { 25978 break 25979 } 25980 i1 := x1.AuxInt 25981 s := x1.Aux 25982 _ = x1.Args[2] 25983 p := x1.Args[0] 25984 idx := x1.Args[1] 25985 mem := x1.Args[2] 25986 r0 := v.Args[1] 25987 if r0.Op != OpS390XMOVHZreg { 25988 break 25989 } 25990 x0 := r0.Args[0] 25991 if x0.Op != OpS390XMOVHBRloadidx { 25992 break 25993 } 25994 i0 := x0.AuxInt 25995 if x0.Aux != s { 25996 break 25997 } 25998 _ = x0.Args[2] 25999 if idx != x0.Args[0] { 26000 break 26001 } 26002 if p != x0.Args[1] { 26003 break 26004 } 26005 if mem != x0.Args[2] { 26006 break 26007 } 26008 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)) { 26009 break 26010 } 26011 b = mergePoint(b, x0, x1) 26012 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26013 v.reset(OpCopy) 26014 v.AddArg(v0) 26015 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 26016 v1.AuxInt = i0 26017 v1.Aux = s 26018 v1.AddArg(p) 26019 v1.AddArg(idx) 26020 v1.AddArg(mem) 26021 v0.AddArg(v1) 26022 return true 26023 } 26024 return false 26025 } 26026 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 26027 b := v.Block 26028 _ = b 26029 typ := &b.Func.Config.Types 26030 _ = typ 26031 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 26032 // 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) 26033 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 26034 for { 26035 _ = v.Args[1] 26036 sh := v.Args[0] 26037 if sh.Op != OpS390XSLDconst { 26038 break 26039 } 26040 if sh.AuxInt != 16 { 26041 break 26042 } 26043 r1 := sh.Args[0] 26044 if r1.Op != OpS390XMOVHZreg { 26045 break 26046 } 26047 x1 := r1.Args[0] 26048 if x1.Op != OpS390XMOVHBRloadidx { 26049 break 26050 } 26051 i1 := x1.AuxInt 26052 s := x1.Aux 26053 _ = x1.Args[2] 26054 idx := x1.Args[0] 26055 p := x1.Args[1] 26056 mem := x1.Args[2] 26057 r0 := v.Args[1] 26058 if r0.Op != OpS390XMOVHZreg { 26059 break 26060 } 26061 x0 := r0.Args[0] 26062 if x0.Op != OpS390XMOVHBRloadidx { 26063 break 26064 } 26065 i0 := x0.AuxInt 26066 if x0.Aux != s { 26067 break 26068 } 26069 _ = x0.Args[2] 26070 if idx != x0.Args[0] { 26071 break 26072 } 26073 if p != x0.Args[1] { 26074 break 26075 } 26076 if mem != x0.Args[2] { 26077 break 26078 } 26079 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)) { 26080 break 26081 } 26082 b = mergePoint(b, x0, x1) 26083 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26084 v.reset(OpCopy) 26085 v.AddArg(v0) 26086 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 26087 v1.AuxInt = i0 26088 v1.Aux = s 26089 v1.AddArg(p) 26090 v1.AddArg(idx) 26091 v1.AddArg(mem) 26092 v0.AddArg(v1) 26093 return true 26094 } 26095 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26096 // 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) 26097 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26098 for { 26099 _ = v.Args[1] 26100 r0 := v.Args[0] 26101 if r0.Op != OpS390XMOVWZreg { 26102 break 26103 } 26104 x0 := r0.Args[0] 26105 if x0.Op != OpS390XMOVWBRloadidx { 26106 break 26107 } 26108 i0 := x0.AuxInt 26109 s := x0.Aux 26110 _ = x0.Args[2] 26111 p := x0.Args[0] 26112 idx := x0.Args[1] 26113 mem := x0.Args[2] 26114 sh := v.Args[1] 26115 if sh.Op != OpS390XSLDconst { 26116 break 26117 } 26118 if sh.AuxInt != 32 { 26119 break 26120 } 26121 r1 := sh.Args[0] 26122 if r1.Op != OpS390XMOVWZreg { 26123 break 26124 } 26125 x1 := r1.Args[0] 26126 if x1.Op != OpS390XMOVWBRloadidx { 26127 break 26128 } 26129 i1 := x1.AuxInt 26130 if x1.Aux != s { 26131 break 26132 } 26133 _ = x1.Args[2] 26134 if p != x1.Args[0] { 26135 break 26136 } 26137 if idx != x1.Args[1] { 26138 break 26139 } 26140 if mem != x1.Args[2] { 26141 break 26142 } 26143 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)) { 26144 break 26145 } 26146 b = mergePoint(b, x0, x1) 26147 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26148 v.reset(OpCopy) 26149 v.AddArg(v0) 26150 v0.AuxInt = i0 26151 v0.Aux = s 26152 v0.AddArg(p) 26153 v0.AddArg(idx) 26154 v0.AddArg(mem) 26155 return true 26156 } 26157 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26158 // 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) 26159 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26160 for { 26161 _ = v.Args[1] 26162 r0 := v.Args[0] 26163 if r0.Op != OpS390XMOVWZreg { 26164 break 26165 } 26166 x0 := r0.Args[0] 26167 if x0.Op != OpS390XMOVWBRloadidx { 26168 break 26169 } 26170 i0 := x0.AuxInt 26171 s := x0.Aux 26172 _ = x0.Args[2] 26173 idx := x0.Args[0] 26174 p := x0.Args[1] 26175 mem := x0.Args[2] 26176 sh := v.Args[1] 26177 if sh.Op != OpS390XSLDconst { 26178 break 26179 } 26180 if sh.AuxInt != 32 { 26181 break 26182 } 26183 r1 := sh.Args[0] 26184 if r1.Op != OpS390XMOVWZreg { 26185 break 26186 } 26187 x1 := r1.Args[0] 26188 if x1.Op != OpS390XMOVWBRloadidx { 26189 break 26190 } 26191 i1 := x1.AuxInt 26192 if x1.Aux != s { 26193 break 26194 } 26195 _ = x1.Args[2] 26196 if p != x1.Args[0] { 26197 break 26198 } 26199 if idx != x1.Args[1] { 26200 break 26201 } 26202 if mem != x1.Args[2] { 26203 break 26204 } 26205 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)) { 26206 break 26207 } 26208 b = mergePoint(b, x0, x1) 26209 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26210 v.reset(OpCopy) 26211 v.AddArg(v0) 26212 v0.AuxInt = i0 26213 v0.Aux = s 26214 v0.AddArg(p) 26215 v0.AddArg(idx) 26216 v0.AddArg(mem) 26217 return true 26218 } 26219 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26220 // 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) 26221 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26222 for { 26223 _ = v.Args[1] 26224 r0 := v.Args[0] 26225 if r0.Op != OpS390XMOVWZreg { 26226 break 26227 } 26228 x0 := r0.Args[0] 26229 if x0.Op != OpS390XMOVWBRloadidx { 26230 break 26231 } 26232 i0 := x0.AuxInt 26233 s := x0.Aux 26234 _ = x0.Args[2] 26235 p := x0.Args[0] 26236 idx := x0.Args[1] 26237 mem := x0.Args[2] 26238 sh := v.Args[1] 26239 if sh.Op != OpS390XSLDconst { 26240 break 26241 } 26242 if sh.AuxInt != 32 { 26243 break 26244 } 26245 r1 := sh.Args[0] 26246 if r1.Op != OpS390XMOVWZreg { 26247 break 26248 } 26249 x1 := r1.Args[0] 26250 if x1.Op != OpS390XMOVWBRloadidx { 26251 break 26252 } 26253 i1 := x1.AuxInt 26254 if x1.Aux != s { 26255 break 26256 } 26257 _ = x1.Args[2] 26258 if idx != x1.Args[0] { 26259 break 26260 } 26261 if p != x1.Args[1] { 26262 break 26263 } 26264 if mem != x1.Args[2] { 26265 break 26266 } 26267 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)) { 26268 break 26269 } 26270 b = mergePoint(b, x0, x1) 26271 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26272 v.reset(OpCopy) 26273 v.AddArg(v0) 26274 v0.AuxInt = i0 26275 v0.Aux = s 26276 v0.AddArg(p) 26277 v0.AddArg(idx) 26278 v0.AddArg(mem) 26279 return true 26280 } 26281 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26282 // 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) 26283 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26284 for { 26285 _ = v.Args[1] 26286 r0 := v.Args[0] 26287 if r0.Op != OpS390XMOVWZreg { 26288 break 26289 } 26290 x0 := r0.Args[0] 26291 if x0.Op != OpS390XMOVWBRloadidx { 26292 break 26293 } 26294 i0 := x0.AuxInt 26295 s := x0.Aux 26296 _ = x0.Args[2] 26297 idx := x0.Args[0] 26298 p := x0.Args[1] 26299 mem := x0.Args[2] 26300 sh := v.Args[1] 26301 if sh.Op != OpS390XSLDconst { 26302 break 26303 } 26304 if sh.AuxInt != 32 { 26305 break 26306 } 26307 r1 := sh.Args[0] 26308 if r1.Op != OpS390XMOVWZreg { 26309 break 26310 } 26311 x1 := r1.Args[0] 26312 if x1.Op != OpS390XMOVWBRloadidx { 26313 break 26314 } 26315 i1 := x1.AuxInt 26316 if x1.Aux != s { 26317 break 26318 } 26319 _ = x1.Args[2] 26320 if idx != x1.Args[0] { 26321 break 26322 } 26323 if p != x1.Args[1] { 26324 break 26325 } 26326 if mem != x1.Args[2] { 26327 break 26328 } 26329 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)) { 26330 break 26331 } 26332 b = mergePoint(b, x0, x1) 26333 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26334 v.reset(OpCopy) 26335 v.AddArg(v0) 26336 v0.AuxInt = i0 26337 v0.Aux = s 26338 v0.AddArg(p) 26339 v0.AddArg(idx) 26340 v0.AddArg(mem) 26341 return true 26342 } 26343 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26344 // 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) 26345 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26346 for { 26347 _ = v.Args[1] 26348 sh := v.Args[0] 26349 if sh.Op != OpS390XSLDconst { 26350 break 26351 } 26352 if sh.AuxInt != 32 { 26353 break 26354 } 26355 r1 := sh.Args[0] 26356 if r1.Op != OpS390XMOVWZreg { 26357 break 26358 } 26359 x1 := r1.Args[0] 26360 if x1.Op != OpS390XMOVWBRloadidx { 26361 break 26362 } 26363 i1 := x1.AuxInt 26364 s := x1.Aux 26365 _ = x1.Args[2] 26366 p := x1.Args[0] 26367 idx := x1.Args[1] 26368 mem := x1.Args[2] 26369 r0 := v.Args[1] 26370 if r0.Op != OpS390XMOVWZreg { 26371 break 26372 } 26373 x0 := r0.Args[0] 26374 if x0.Op != OpS390XMOVWBRloadidx { 26375 break 26376 } 26377 i0 := x0.AuxInt 26378 if x0.Aux != s { 26379 break 26380 } 26381 _ = x0.Args[2] 26382 if p != x0.Args[0] { 26383 break 26384 } 26385 if idx != x0.Args[1] { 26386 break 26387 } 26388 if mem != x0.Args[2] { 26389 break 26390 } 26391 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)) { 26392 break 26393 } 26394 b = mergePoint(b, x0, x1) 26395 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26396 v.reset(OpCopy) 26397 v.AddArg(v0) 26398 v0.AuxInt = i0 26399 v0.Aux = s 26400 v0.AddArg(p) 26401 v0.AddArg(idx) 26402 v0.AddArg(mem) 26403 return true 26404 } 26405 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26406 // 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) 26407 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26408 for { 26409 _ = v.Args[1] 26410 sh := v.Args[0] 26411 if sh.Op != OpS390XSLDconst { 26412 break 26413 } 26414 if sh.AuxInt != 32 { 26415 break 26416 } 26417 r1 := sh.Args[0] 26418 if r1.Op != OpS390XMOVWZreg { 26419 break 26420 } 26421 x1 := r1.Args[0] 26422 if x1.Op != OpS390XMOVWBRloadidx { 26423 break 26424 } 26425 i1 := x1.AuxInt 26426 s := x1.Aux 26427 _ = x1.Args[2] 26428 idx := x1.Args[0] 26429 p := x1.Args[1] 26430 mem := x1.Args[2] 26431 r0 := v.Args[1] 26432 if r0.Op != OpS390XMOVWZreg { 26433 break 26434 } 26435 x0 := r0.Args[0] 26436 if x0.Op != OpS390XMOVWBRloadidx { 26437 break 26438 } 26439 i0 := x0.AuxInt 26440 if x0.Aux != s { 26441 break 26442 } 26443 _ = x0.Args[2] 26444 if p != x0.Args[0] { 26445 break 26446 } 26447 if idx != x0.Args[1] { 26448 break 26449 } 26450 if mem != x0.Args[2] { 26451 break 26452 } 26453 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)) { 26454 break 26455 } 26456 b = mergePoint(b, x0, x1) 26457 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26458 v.reset(OpCopy) 26459 v.AddArg(v0) 26460 v0.AuxInt = i0 26461 v0.Aux = s 26462 v0.AddArg(p) 26463 v0.AddArg(idx) 26464 v0.AddArg(mem) 26465 return true 26466 } 26467 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26468 // 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) 26469 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26470 for { 26471 _ = v.Args[1] 26472 sh := v.Args[0] 26473 if sh.Op != OpS390XSLDconst { 26474 break 26475 } 26476 if sh.AuxInt != 32 { 26477 break 26478 } 26479 r1 := sh.Args[0] 26480 if r1.Op != OpS390XMOVWZreg { 26481 break 26482 } 26483 x1 := r1.Args[0] 26484 if x1.Op != OpS390XMOVWBRloadidx { 26485 break 26486 } 26487 i1 := x1.AuxInt 26488 s := x1.Aux 26489 _ = x1.Args[2] 26490 p := x1.Args[0] 26491 idx := x1.Args[1] 26492 mem := x1.Args[2] 26493 r0 := v.Args[1] 26494 if r0.Op != OpS390XMOVWZreg { 26495 break 26496 } 26497 x0 := r0.Args[0] 26498 if x0.Op != OpS390XMOVWBRloadidx { 26499 break 26500 } 26501 i0 := x0.AuxInt 26502 if x0.Aux != s { 26503 break 26504 } 26505 _ = x0.Args[2] 26506 if idx != x0.Args[0] { 26507 break 26508 } 26509 if p != x0.Args[1] { 26510 break 26511 } 26512 if mem != x0.Args[2] { 26513 break 26514 } 26515 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)) { 26516 break 26517 } 26518 b = mergePoint(b, x0, x1) 26519 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26520 v.reset(OpCopy) 26521 v.AddArg(v0) 26522 v0.AuxInt = i0 26523 v0.Aux = s 26524 v0.AddArg(p) 26525 v0.AddArg(idx) 26526 v0.AddArg(mem) 26527 return true 26528 } 26529 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26530 // 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) 26531 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26532 for { 26533 _ = v.Args[1] 26534 sh := v.Args[0] 26535 if sh.Op != OpS390XSLDconst { 26536 break 26537 } 26538 if sh.AuxInt != 32 { 26539 break 26540 } 26541 r1 := sh.Args[0] 26542 if r1.Op != OpS390XMOVWZreg { 26543 break 26544 } 26545 x1 := r1.Args[0] 26546 if x1.Op != OpS390XMOVWBRloadidx { 26547 break 26548 } 26549 i1 := x1.AuxInt 26550 s := x1.Aux 26551 _ = x1.Args[2] 26552 idx := x1.Args[0] 26553 p := x1.Args[1] 26554 mem := x1.Args[2] 26555 r0 := v.Args[1] 26556 if r0.Op != OpS390XMOVWZreg { 26557 break 26558 } 26559 x0 := r0.Args[0] 26560 if x0.Op != OpS390XMOVWBRloadidx { 26561 break 26562 } 26563 i0 := x0.AuxInt 26564 if x0.Aux != s { 26565 break 26566 } 26567 _ = x0.Args[2] 26568 if idx != x0.Args[0] { 26569 break 26570 } 26571 if p != x0.Args[1] { 26572 break 26573 } 26574 if mem != x0.Args[2] { 26575 break 26576 } 26577 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)) { 26578 break 26579 } 26580 b = mergePoint(b, x0, x1) 26581 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26582 v.reset(OpCopy) 26583 v.AddArg(v0) 26584 v0.AuxInt = i0 26585 v0.Aux = s 26586 v0.AddArg(p) 26587 v0.AddArg(idx) 26588 v0.AddArg(mem) 26589 return true 26590 } 26591 // 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)) 26592 // 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) 26593 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26594 for { 26595 _ = v.Args[1] 26596 s1 := v.Args[0] 26597 if s1.Op != OpS390XSLDconst { 26598 break 26599 } 26600 j1 := s1.AuxInt 26601 x1 := s1.Args[0] 26602 if x1.Op != OpS390XMOVBZloadidx { 26603 break 26604 } 26605 i1 := x1.AuxInt 26606 s := x1.Aux 26607 _ = x1.Args[2] 26608 p := x1.Args[0] 26609 idx := x1.Args[1] 26610 mem := x1.Args[2] 26611 or := v.Args[1] 26612 if or.Op != OpS390XOR { 26613 break 26614 } 26615 _ = or.Args[1] 26616 s0 := or.Args[0] 26617 if s0.Op != OpS390XSLDconst { 26618 break 26619 } 26620 j0 := s0.AuxInt 26621 x0 := s0.Args[0] 26622 if x0.Op != OpS390XMOVBZloadidx { 26623 break 26624 } 26625 i0 := x0.AuxInt 26626 if x0.Aux != s { 26627 break 26628 } 26629 _ = x0.Args[2] 26630 if p != x0.Args[0] { 26631 break 26632 } 26633 if idx != x0.Args[1] { 26634 break 26635 } 26636 if mem != x0.Args[2] { 26637 break 26638 } 26639 y := or.Args[1] 26640 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)) { 26641 break 26642 } 26643 b = mergePoint(b, x0, x1) 26644 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26645 v.reset(OpCopy) 26646 v.AddArg(v0) 26647 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26648 v1.AuxInt = j0 26649 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26650 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26651 v3.AuxInt = i0 26652 v3.Aux = s 26653 v3.AddArg(p) 26654 v3.AddArg(idx) 26655 v3.AddArg(mem) 26656 v2.AddArg(v3) 26657 v1.AddArg(v2) 26658 v0.AddArg(v1) 26659 v0.AddArg(y) 26660 return true 26661 } 26662 return false 26663 } 26664 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 26665 b := v.Block 26666 _ = b 26667 typ := &b.Func.Config.Types 26668 _ = typ 26669 // 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)) 26670 // 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) 26671 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26672 for { 26673 _ = v.Args[1] 26674 s1 := v.Args[0] 26675 if s1.Op != OpS390XSLDconst { 26676 break 26677 } 26678 j1 := s1.AuxInt 26679 x1 := s1.Args[0] 26680 if x1.Op != OpS390XMOVBZloadidx { 26681 break 26682 } 26683 i1 := x1.AuxInt 26684 s := x1.Aux 26685 _ = x1.Args[2] 26686 idx := x1.Args[0] 26687 p := x1.Args[1] 26688 mem := x1.Args[2] 26689 or := v.Args[1] 26690 if or.Op != OpS390XOR { 26691 break 26692 } 26693 _ = or.Args[1] 26694 s0 := or.Args[0] 26695 if s0.Op != OpS390XSLDconst { 26696 break 26697 } 26698 j0 := s0.AuxInt 26699 x0 := s0.Args[0] 26700 if x0.Op != OpS390XMOVBZloadidx { 26701 break 26702 } 26703 i0 := x0.AuxInt 26704 if x0.Aux != s { 26705 break 26706 } 26707 _ = x0.Args[2] 26708 if p != x0.Args[0] { 26709 break 26710 } 26711 if idx != x0.Args[1] { 26712 break 26713 } 26714 if mem != x0.Args[2] { 26715 break 26716 } 26717 y := or.Args[1] 26718 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)) { 26719 break 26720 } 26721 b = mergePoint(b, x0, x1) 26722 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26723 v.reset(OpCopy) 26724 v.AddArg(v0) 26725 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26726 v1.AuxInt = j0 26727 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26728 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26729 v3.AuxInt = i0 26730 v3.Aux = s 26731 v3.AddArg(p) 26732 v3.AddArg(idx) 26733 v3.AddArg(mem) 26734 v2.AddArg(v3) 26735 v1.AddArg(v2) 26736 v0.AddArg(v1) 26737 v0.AddArg(y) 26738 return true 26739 } 26740 // 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)) 26741 // 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) 26742 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26743 for { 26744 _ = v.Args[1] 26745 s1 := v.Args[0] 26746 if s1.Op != OpS390XSLDconst { 26747 break 26748 } 26749 j1 := s1.AuxInt 26750 x1 := s1.Args[0] 26751 if x1.Op != OpS390XMOVBZloadidx { 26752 break 26753 } 26754 i1 := x1.AuxInt 26755 s := x1.Aux 26756 _ = x1.Args[2] 26757 p := x1.Args[0] 26758 idx := x1.Args[1] 26759 mem := x1.Args[2] 26760 or := v.Args[1] 26761 if or.Op != OpS390XOR { 26762 break 26763 } 26764 _ = or.Args[1] 26765 s0 := or.Args[0] 26766 if s0.Op != OpS390XSLDconst { 26767 break 26768 } 26769 j0 := s0.AuxInt 26770 x0 := s0.Args[0] 26771 if x0.Op != OpS390XMOVBZloadidx { 26772 break 26773 } 26774 i0 := x0.AuxInt 26775 if x0.Aux != s { 26776 break 26777 } 26778 _ = x0.Args[2] 26779 if idx != x0.Args[0] { 26780 break 26781 } 26782 if p != x0.Args[1] { 26783 break 26784 } 26785 if mem != x0.Args[2] { 26786 break 26787 } 26788 y := or.Args[1] 26789 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)) { 26790 break 26791 } 26792 b = mergePoint(b, x0, x1) 26793 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26794 v.reset(OpCopy) 26795 v.AddArg(v0) 26796 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26797 v1.AuxInt = j0 26798 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26799 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26800 v3.AuxInt = i0 26801 v3.Aux = s 26802 v3.AddArg(p) 26803 v3.AddArg(idx) 26804 v3.AddArg(mem) 26805 v2.AddArg(v3) 26806 v1.AddArg(v2) 26807 v0.AddArg(v1) 26808 v0.AddArg(y) 26809 return true 26810 } 26811 // 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)) 26812 // 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) 26813 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26814 for { 26815 _ = v.Args[1] 26816 s1 := v.Args[0] 26817 if s1.Op != OpS390XSLDconst { 26818 break 26819 } 26820 j1 := s1.AuxInt 26821 x1 := s1.Args[0] 26822 if x1.Op != OpS390XMOVBZloadidx { 26823 break 26824 } 26825 i1 := x1.AuxInt 26826 s := x1.Aux 26827 _ = x1.Args[2] 26828 idx := x1.Args[0] 26829 p := x1.Args[1] 26830 mem := x1.Args[2] 26831 or := v.Args[1] 26832 if or.Op != OpS390XOR { 26833 break 26834 } 26835 _ = or.Args[1] 26836 s0 := or.Args[0] 26837 if s0.Op != OpS390XSLDconst { 26838 break 26839 } 26840 j0 := s0.AuxInt 26841 x0 := s0.Args[0] 26842 if x0.Op != OpS390XMOVBZloadidx { 26843 break 26844 } 26845 i0 := x0.AuxInt 26846 if x0.Aux != s { 26847 break 26848 } 26849 _ = x0.Args[2] 26850 if idx != x0.Args[0] { 26851 break 26852 } 26853 if p != x0.Args[1] { 26854 break 26855 } 26856 if mem != x0.Args[2] { 26857 break 26858 } 26859 y := or.Args[1] 26860 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)) { 26861 break 26862 } 26863 b = mergePoint(b, x0, x1) 26864 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26865 v.reset(OpCopy) 26866 v.AddArg(v0) 26867 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26868 v1.AuxInt = j0 26869 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26870 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26871 v3.AuxInt = i0 26872 v3.Aux = s 26873 v3.AddArg(p) 26874 v3.AddArg(idx) 26875 v3.AddArg(mem) 26876 v2.AddArg(v3) 26877 v1.AddArg(v2) 26878 v0.AddArg(v1) 26879 v0.AddArg(y) 26880 return true 26881 } 26882 // 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)))) 26883 // 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) 26884 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26885 for { 26886 _ = v.Args[1] 26887 s1 := v.Args[0] 26888 if s1.Op != OpS390XSLDconst { 26889 break 26890 } 26891 j1 := s1.AuxInt 26892 x1 := s1.Args[0] 26893 if x1.Op != OpS390XMOVBZloadidx { 26894 break 26895 } 26896 i1 := x1.AuxInt 26897 s := x1.Aux 26898 _ = x1.Args[2] 26899 p := x1.Args[0] 26900 idx := x1.Args[1] 26901 mem := x1.Args[2] 26902 or := v.Args[1] 26903 if or.Op != OpS390XOR { 26904 break 26905 } 26906 _ = or.Args[1] 26907 y := or.Args[0] 26908 s0 := or.Args[1] 26909 if s0.Op != OpS390XSLDconst { 26910 break 26911 } 26912 j0 := s0.AuxInt 26913 x0 := s0.Args[0] 26914 if x0.Op != OpS390XMOVBZloadidx { 26915 break 26916 } 26917 i0 := x0.AuxInt 26918 if x0.Aux != s { 26919 break 26920 } 26921 _ = x0.Args[2] 26922 if p != x0.Args[0] { 26923 break 26924 } 26925 if idx != x0.Args[1] { 26926 break 26927 } 26928 if mem != x0.Args[2] { 26929 break 26930 } 26931 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)) { 26932 break 26933 } 26934 b = mergePoint(b, x0, x1) 26935 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26936 v.reset(OpCopy) 26937 v.AddArg(v0) 26938 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26939 v1.AuxInt = j0 26940 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26941 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26942 v3.AuxInt = i0 26943 v3.Aux = s 26944 v3.AddArg(p) 26945 v3.AddArg(idx) 26946 v3.AddArg(mem) 26947 v2.AddArg(v3) 26948 v1.AddArg(v2) 26949 v0.AddArg(v1) 26950 v0.AddArg(y) 26951 return true 26952 } 26953 // 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)))) 26954 // 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) 26955 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26956 for { 26957 _ = v.Args[1] 26958 s1 := v.Args[0] 26959 if s1.Op != OpS390XSLDconst { 26960 break 26961 } 26962 j1 := s1.AuxInt 26963 x1 := s1.Args[0] 26964 if x1.Op != OpS390XMOVBZloadidx { 26965 break 26966 } 26967 i1 := x1.AuxInt 26968 s := x1.Aux 26969 _ = x1.Args[2] 26970 idx := x1.Args[0] 26971 p := x1.Args[1] 26972 mem := x1.Args[2] 26973 or := v.Args[1] 26974 if or.Op != OpS390XOR { 26975 break 26976 } 26977 _ = or.Args[1] 26978 y := or.Args[0] 26979 s0 := or.Args[1] 26980 if s0.Op != OpS390XSLDconst { 26981 break 26982 } 26983 j0 := s0.AuxInt 26984 x0 := s0.Args[0] 26985 if x0.Op != OpS390XMOVBZloadidx { 26986 break 26987 } 26988 i0 := x0.AuxInt 26989 if x0.Aux != s { 26990 break 26991 } 26992 _ = x0.Args[2] 26993 if p != x0.Args[0] { 26994 break 26995 } 26996 if idx != x0.Args[1] { 26997 break 26998 } 26999 if mem != x0.Args[2] { 27000 break 27001 } 27002 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)) { 27003 break 27004 } 27005 b = mergePoint(b, x0, x1) 27006 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27007 v.reset(OpCopy) 27008 v.AddArg(v0) 27009 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27010 v1.AuxInt = j0 27011 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27012 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27013 v3.AuxInt = i0 27014 v3.Aux = s 27015 v3.AddArg(p) 27016 v3.AddArg(idx) 27017 v3.AddArg(mem) 27018 v2.AddArg(v3) 27019 v1.AddArg(v2) 27020 v0.AddArg(v1) 27021 v0.AddArg(y) 27022 return true 27023 } 27024 // 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)))) 27025 // 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) 27026 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27027 for { 27028 _ = v.Args[1] 27029 s1 := v.Args[0] 27030 if s1.Op != OpS390XSLDconst { 27031 break 27032 } 27033 j1 := s1.AuxInt 27034 x1 := s1.Args[0] 27035 if x1.Op != OpS390XMOVBZloadidx { 27036 break 27037 } 27038 i1 := x1.AuxInt 27039 s := x1.Aux 27040 _ = x1.Args[2] 27041 p := x1.Args[0] 27042 idx := x1.Args[1] 27043 mem := x1.Args[2] 27044 or := v.Args[1] 27045 if or.Op != OpS390XOR { 27046 break 27047 } 27048 _ = or.Args[1] 27049 y := or.Args[0] 27050 s0 := or.Args[1] 27051 if s0.Op != OpS390XSLDconst { 27052 break 27053 } 27054 j0 := s0.AuxInt 27055 x0 := s0.Args[0] 27056 if x0.Op != OpS390XMOVBZloadidx { 27057 break 27058 } 27059 i0 := x0.AuxInt 27060 if x0.Aux != s { 27061 break 27062 } 27063 _ = x0.Args[2] 27064 if idx != x0.Args[0] { 27065 break 27066 } 27067 if p != x0.Args[1] { 27068 break 27069 } 27070 if mem != x0.Args[2] { 27071 break 27072 } 27073 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)) { 27074 break 27075 } 27076 b = mergePoint(b, x0, x1) 27077 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27078 v.reset(OpCopy) 27079 v.AddArg(v0) 27080 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27081 v1.AuxInt = j0 27082 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27083 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27084 v3.AuxInt = i0 27085 v3.Aux = s 27086 v3.AddArg(p) 27087 v3.AddArg(idx) 27088 v3.AddArg(mem) 27089 v2.AddArg(v3) 27090 v1.AddArg(v2) 27091 v0.AddArg(v1) 27092 v0.AddArg(y) 27093 return true 27094 } 27095 // 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)))) 27096 // 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) 27097 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27098 for { 27099 _ = v.Args[1] 27100 s1 := v.Args[0] 27101 if s1.Op != OpS390XSLDconst { 27102 break 27103 } 27104 j1 := s1.AuxInt 27105 x1 := s1.Args[0] 27106 if x1.Op != OpS390XMOVBZloadidx { 27107 break 27108 } 27109 i1 := x1.AuxInt 27110 s := x1.Aux 27111 _ = x1.Args[2] 27112 idx := x1.Args[0] 27113 p := x1.Args[1] 27114 mem := x1.Args[2] 27115 or := v.Args[1] 27116 if or.Op != OpS390XOR { 27117 break 27118 } 27119 _ = or.Args[1] 27120 y := or.Args[0] 27121 s0 := or.Args[1] 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 if x0.Aux != s { 27132 break 27133 } 27134 _ = x0.Args[2] 27135 if idx != x0.Args[0] { 27136 break 27137 } 27138 if p != x0.Args[1] { 27139 break 27140 } 27141 if mem != x0.Args[2] { 27142 break 27143 } 27144 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)) { 27145 break 27146 } 27147 b = mergePoint(b, x0, x1) 27148 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27149 v.reset(OpCopy) 27150 v.AddArg(v0) 27151 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27152 v1.AuxInt = j0 27153 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27154 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27155 v3.AuxInt = i0 27156 v3.Aux = s 27157 v3.AddArg(p) 27158 v3.AddArg(idx) 27159 v3.AddArg(mem) 27160 v2.AddArg(v3) 27161 v1.AddArg(v2) 27162 v0.AddArg(v1) 27163 v0.AddArg(y) 27164 return true 27165 } 27166 // 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))) 27167 // 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) 27168 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27169 for { 27170 _ = v.Args[1] 27171 or := v.Args[0] 27172 if or.Op != OpS390XOR { 27173 break 27174 } 27175 _ = or.Args[1] 27176 s0 := or.Args[0] 27177 if s0.Op != OpS390XSLDconst { 27178 break 27179 } 27180 j0 := s0.AuxInt 27181 x0 := s0.Args[0] 27182 if x0.Op != OpS390XMOVBZloadidx { 27183 break 27184 } 27185 i0 := x0.AuxInt 27186 s := x0.Aux 27187 _ = x0.Args[2] 27188 p := x0.Args[0] 27189 idx := x0.Args[1] 27190 mem := x0.Args[2] 27191 y := or.Args[1] 27192 s1 := v.Args[1] 27193 if s1.Op != OpS390XSLDconst { 27194 break 27195 } 27196 j1 := s1.AuxInt 27197 x1 := s1.Args[0] 27198 if x1.Op != OpS390XMOVBZloadidx { 27199 break 27200 } 27201 i1 := x1.AuxInt 27202 if x1.Aux != s { 27203 break 27204 } 27205 _ = x1.Args[2] 27206 if p != x1.Args[0] { 27207 break 27208 } 27209 if idx != x1.Args[1] { 27210 break 27211 } 27212 if mem != x1.Args[2] { 27213 break 27214 } 27215 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)) { 27216 break 27217 } 27218 b = mergePoint(b, x0, x1) 27219 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27220 v.reset(OpCopy) 27221 v.AddArg(v0) 27222 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27223 v1.AuxInt = j0 27224 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27225 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27226 v3.AuxInt = i0 27227 v3.Aux = s 27228 v3.AddArg(p) 27229 v3.AddArg(idx) 27230 v3.AddArg(mem) 27231 v2.AddArg(v3) 27232 v1.AddArg(v2) 27233 v0.AddArg(v1) 27234 v0.AddArg(y) 27235 return true 27236 } 27237 // 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))) 27238 // 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) 27239 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27240 for { 27241 _ = v.Args[1] 27242 or := v.Args[0] 27243 if or.Op != OpS390XOR { 27244 break 27245 } 27246 _ = or.Args[1] 27247 s0 := or.Args[0] 27248 if s0.Op != OpS390XSLDconst { 27249 break 27250 } 27251 j0 := s0.AuxInt 27252 x0 := s0.Args[0] 27253 if x0.Op != OpS390XMOVBZloadidx { 27254 break 27255 } 27256 i0 := x0.AuxInt 27257 s := x0.Aux 27258 _ = x0.Args[2] 27259 idx := x0.Args[0] 27260 p := x0.Args[1] 27261 mem := x0.Args[2] 27262 y := or.Args[1] 27263 s1 := v.Args[1] 27264 if s1.Op != OpS390XSLDconst { 27265 break 27266 } 27267 j1 := s1.AuxInt 27268 x1 := s1.Args[0] 27269 if x1.Op != OpS390XMOVBZloadidx { 27270 break 27271 } 27272 i1 := x1.AuxInt 27273 if x1.Aux != s { 27274 break 27275 } 27276 _ = x1.Args[2] 27277 if p != x1.Args[0] { 27278 break 27279 } 27280 if idx != x1.Args[1] { 27281 break 27282 } 27283 if mem != x1.Args[2] { 27284 break 27285 } 27286 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)) { 27287 break 27288 } 27289 b = mergePoint(b, x0, x1) 27290 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27291 v.reset(OpCopy) 27292 v.AddArg(v0) 27293 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27294 v1.AuxInt = j0 27295 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27296 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27297 v3.AuxInt = i0 27298 v3.Aux = s 27299 v3.AddArg(p) 27300 v3.AddArg(idx) 27301 v3.AddArg(mem) 27302 v2.AddArg(v3) 27303 v1.AddArg(v2) 27304 v0.AddArg(v1) 27305 v0.AddArg(y) 27306 return true 27307 } 27308 // 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))) 27309 // 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) 27310 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27311 for { 27312 _ = v.Args[1] 27313 or := v.Args[0] 27314 if or.Op != OpS390XOR { 27315 break 27316 } 27317 _ = or.Args[1] 27318 y := or.Args[0] 27319 s0 := or.Args[1] 27320 if s0.Op != OpS390XSLDconst { 27321 break 27322 } 27323 j0 := s0.AuxInt 27324 x0 := s0.Args[0] 27325 if x0.Op != OpS390XMOVBZloadidx { 27326 break 27327 } 27328 i0 := x0.AuxInt 27329 s := x0.Aux 27330 _ = x0.Args[2] 27331 p := x0.Args[0] 27332 idx := x0.Args[1] 27333 mem := x0.Args[2] 27334 s1 := v.Args[1] 27335 if s1.Op != OpS390XSLDconst { 27336 break 27337 } 27338 j1 := s1.AuxInt 27339 x1 := s1.Args[0] 27340 if x1.Op != OpS390XMOVBZloadidx { 27341 break 27342 } 27343 i1 := x1.AuxInt 27344 if x1.Aux != s { 27345 break 27346 } 27347 _ = x1.Args[2] 27348 if p != x1.Args[0] { 27349 break 27350 } 27351 if idx != x1.Args[1] { 27352 break 27353 } 27354 if mem != x1.Args[2] { 27355 break 27356 } 27357 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)) { 27358 break 27359 } 27360 b = mergePoint(b, x0, x1) 27361 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27362 v.reset(OpCopy) 27363 v.AddArg(v0) 27364 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27365 v1.AuxInt = j0 27366 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27367 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27368 v3.AuxInt = i0 27369 v3.Aux = s 27370 v3.AddArg(p) 27371 v3.AddArg(idx) 27372 v3.AddArg(mem) 27373 v2.AddArg(v3) 27374 v1.AddArg(v2) 27375 v0.AddArg(v1) 27376 v0.AddArg(y) 27377 return true 27378 } 27379 return false 27380 } 27381 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 27382 b := v.Block 27383 _ = b 27384 typ := &b.Func.Config.Types 27385 _ = typ 27386 // 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))) 27387 // 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) 27388 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27389 for { 27390 _ = v.Args[1] 27391 or := v.Args[0] 27392 if or.Op != OpS390XOR { 27393 break 27394 } 27395 _ = or.Args[1] 27396 y := or.Args[0] 27397 s0 := or.Args[1] 27398 if s0.Op != OpS390XSLDconst { 27399 break 27400 } 27401 j0 := s0.AuxInt 27402 x0 := s0.Args[0] 27403 if x0.Op != OpS390XMOVBZloadidx { 27404 break 27405 } 27406 i0 := x0.AuxInt 27407 s := x0.Aux 27408 _ = x0.Args[2] 27409 idx := x0.Args[0] 27410 p := x0.Args[1] 27411 mem := x0.Args[2] 27412 s1 := v.Args[1] 27413 if s1.Op != OpS390XSLDconst { 27414 break 27415 } 27416 j1 := s1.AuxInt 27417 x1 := s1.Args[0] 27418 if x1.Op != OpS390XMOVBZloadidx { 27419 break 27420 } 27421 i1 := x1.AuxInt 27422 if x1.Aux != s { 27423 break 27424 } 27425 _ = x1.Args[2] 27426 if p != x1.Args[0] { 27427 break 27428 } 27429 if idx != x1.Args[1] { 27430 break 27431 } 27432 if mem != x1.Args[2] { 27433 break 27434 } 27435 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)) { 27436 break 27437 } 27438 b = mergePoint(b, x0, x1) 27439 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27440 v.reset(OpCopy) 27441 v.AddArg(v0) 27442 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27443 v1.AuxInt = j0 27444 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27445 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27446 v3.AuxInt = i0 27447 v3.Aux = s 27448 v3.AddArg(p) 27449 v3.AddArg(idx) 27450 v3.AddArg(mem) 27451 v2.AddArg(v3) 27452 v1.AddArg(v2) 27453 v0.AddArg(v1) 27454 v0.AddArg(y) 27455 return true 27456 } 27457 // 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))) 27458 // 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) 27459 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27460 for { 27461 _ = v.Args[1] 27462 or := v.Args[0] 27463 if or.Op != OpS390XOR { 27464 break 27465 } 27466 _ = or.Args[1] 27467 s0 := or.Args[0] 27468 if s0.Op != OpS390XSLDconst { 27469 break 27470 } 27471 j0 := s0.AuxInt 27472 x0 := s0.Args[0] 27473 if x0.Op != OpS390XMOVBZloadidx { 27474 break 27475 } 27476 i0 := x0.AuxInt 27477 s := x0.Aux 27478 _ = x0.Args[2] 27479 p := x0.Args[0] 27480 idx := x0.Args[1] 27481 mem := x0.Args[2] 27482 y := or.Args[1] 27483 s1 := v.Args[1] 27484 if s1.Op != OpS390XSLDconst { 27485 break 27486 } 27487 j1 := s1.AuxInt 27488 x1 := s1.Args[0] 27489 if x1.Op != OpS390XMOVBZloadidx { 27490 break 27491 } 27492 i1 := x1.AuxInt 27493 if x1.Aux != s { 27494 break 27495 } 27496 _ = x1.Args[2] 27497 if idx != x1.Args[0] { 27498 break 27499 } 27500 if p != x1.Args[1] { 27501 break 27502 } 27503 if mem != x1.Args[2] { 27504 break 27505 } 27506 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)) { 27507 break 27508 } 27509 b = mergePoint(b, x0, x1) 27510 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27511 v.reset(OpCopy) 27512 v.AddArg(v0) 27513 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27514 v1.AuxInt = j0 27515 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27516 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27517 v3.AuxInt = i0 27518 v3.Aux = s 27519 v3.AddArg(p) 27520 v3.AddArg(idx) 27521 v3.AddArg(mem) 27522 v2.AddArg(v3) 27523 v1.AddArg(v2) 27524 v0.AddArg(v1) 27525 v0.AddArg(y) 27526 return true 27527 } 27528 // 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))) 27529 // 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) 27530 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27531 for { 27532 _ = v.Args[1] 27533 or := v.Args[0] 27534 if or.Op != OpS390XOR { 27535 break 27536 } 27537 _ = or.Args[1] 27538 s0 := or.Args[0] 27539 if s0.Op != OpS390XSLDconst { 27540 break 27541 } 27542 j0 := s0.AuxInt 27543 x0 := s0.Args[0] 27544 if x0.Op != OpS390XMOVBZloadidx { 27545 break 27546 } 27547 i0 := x0.AuxInt 27548 s := x0.Aux 27549 _ = x0.Args[2] 27550 idx := x0.Args[0] 27551 p := x0.Args[1] 27552 mem := x0.Args[2] 27553 y := or.Args[1] 27554 s1 := v.Args[1] 27555 if s1.Op != OpS390XSLDconst { 27556 break 27557 } 27558 j1 := s1.AuxInt 27559 x1 := s1.Args[0] 27560 if x1.Op != OpS390XMOVBZloadidx { 27561 break 27562 } 27563 i1 := x1.AuxInt 27564 if x1.Aux != s { 27565 break 27566 } 27567 _ = x1.Args[2] 27568 if idx != x1.Args[0] { 27569 break 27570 } 27571 if p != x1.Args[1] { 27572 break 27573 } 27574 if mem != x1.Args[2] { 27575 break 27576 } 27577 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)) { 27578 break 27579 } 27580 b = mergePoint(b, x0, x1) 27581 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27582 v.reset(OpCopy) 27583 v.AddArg(v0) 27584 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27585 v1.AuxInt = j0 27586 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27587 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27588 v3.AuxInt = i0 27589 v3.Aux = s 27590 v3.AddArg(p) 27591 v3.AddArg(idx) 27592 v3.AddArg(mem) 27593 v2.AddArg(v3) 27594 v1.AddArg(v2) 27595 v0.AddArg(v1) 27596 v0.AddArg(y) 27597 return true 27598 } 27599 // 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))) 27600 // 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) 27601 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27602 for { 27603 _ = v.Args[1] 27604 or := v.Args[0] 27605 if or.Op != OpS390XOR { 27606 break 27607 } 27608 _ = or.Args[1] 27609 y := or.Args[0] 27610 s0 := or.Args[1] 27611 if s0.Op != OpS390XSLDconst { 27612 break 27613 } 27614 j0 := s0.AuxInt 27615 x0 := s0.Args[0] 27616 if x0.Op != OpS390XMOVBZloadidx { 27617 break 27618 } 27619 i0 := x0.AuxInt 27620 s := x0.Aux 27621 _ = x0.Args[2] 27622 p := x0.Args[0] 27623 idx := x0.Args[1] 27624 mem := x0.Args[2] 27625 s1 := v.Args[1] 27626 if s1.Op != OpS390XSLDconst { 27627 break 27628 } 27629 j1 := s1.AuxInt 27630 x1 := s1.Args[0] 27631 if x1.Op != OpS390XMOVBZloadidx { 27632 break 27633 } 27634 i1 := x1.AuxInt 27635 if x1.Aux != s { 27636 break 27637 } 27638 _ = x1.Args[2] 27639 if idx != x1.Args[0] { 27640 break 27641 } 27642 if p != x1.Args[1] { 27643 break 27644 } 27645 if mem != x1.Args[2] { 27646 break 27647 } 27648 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)) { 27649 break 27650 } 27651 b = mergePoint(b, x0, x1) 27652 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27653 v.reset(OpCopy) 27654 v.AddArg(v0) 27655 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27656 v1.AuxInt = j0 27657 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27658 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27659 v3.AuxInt = i0 27660 v3.Aux = s 27661 v3.AddArg(p) 27662 v3.AddArg(idx) 27663 v3.AddArg(mem) 27664 v2.AddArg(v3) 27665 v1.AddArg(v2) 27666 v0.AddArg(v1) 27667 v0.AddArg(y) 27668 return true 27669 } 27670 // 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))) 27671 // 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) 27672 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27673 for { 27674 _ = v.Args[1] 27675 or := v.Args[0] 27676 if or.Op != OpS390XOR { 27677 break 27678 } 27679 _ = or.Args[1] 27680 y := or.Args[0] 27681 s0 := or.Args[1] 27682 if s0.Op != OpS390XSLDconst { 27683 break 27684 } 27685 j0 := s0.AuxInt 27686 x0 := s0.Args[0] 27687 if x0.Op != OpS390XMOVBZloadidx { 27688 break 27689 } 27690 i0 := x0.AuxInt 27691 s := x0.Aux 27692 _ = x0.Args[2] 27693 idx := x0.Args[0] 27694 p := x0.Args[1] 27695 mem := x0.Args[2] 27696 s1 := v.Args[1] 27697 if s1.Op != OpS390XSLDconst { 27698 break 27699 } 27700 j1 := s1.AuxInt 27701 x1 := s1.Args[0] 27702 if x1.Op != OpS390XMOVBZloadidx { 27703 break 27704 } 27705 i1 := x1.AuxInt 27706 if x1.Aux != s { 27707 break 27708 } 27709 _ = x1.Args[2] 27710 if idx != x1.Args[0] { 27711 break 27712 } 27713 if p != x1.Args[1] { 27714 break 27715 } 27716 if mem != x1.Args[2] { 27717 break 27718 } 27719 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)) { 27720 break 27721 } 27722 b = mergePoint(b, x0, x1) 27723 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27724 v.reset(OpCopy) 27725 v.AddArg(v0) 27726 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27727 v1.AuxInt = j0 27728 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27729 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27730 v3.AuxInt = i0 27731 v3.Aux = s 27732 v3.AddArg(p) 27733 v3.AddArg(idx) 27734 v3.AddArg(mem) 27735 v2.AddArg(v3) 27736 v1.AddArg(v2) 27737 v0.AddArg(v1) 27738 v0.AddArg(y) 27739 return true 27740 } 27741 // 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)) 27742 // 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) 27743 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27744 for { 27745 _ = v.Args[1] 27746 s1 := v.Args[0] 27747 if s1.Op != OpS390XSLDconst { 27748 break 27749 } 27750 j1 := s1.AuxInt 27751 r1 := s1.Args[0] 27752 if r1.Op != OpS390XMOVHZreg { 27753 break 27754 } 27755 x1 := r1.Args[0] 27756 if x1.Op != OpS390XMOVHBRloadidx { 27757 break 27758 } 27759 i1 := x1.AuxInt 27760 s := x1.Aux 27761 _ = x1.Args[2] 27762 p := x1.Args[0] 27763 idx := x1.Args[1] 27764 mem := x1.Args[2] 27765 or := v.Args[1] 27766 if or.Op != OpS390XOR { 27767 break 27768 } 27769 _ = or.Args[1] 27770 s0 := or.Args[0] 27771 if s0.Op != OpS390XSLDconst { 27772 break 27773 } 27774 j0 := s0.AuxInt 27775 r0 := s0.Args[0] 27776 if r0.Op != OpS390XMOVHZreg { 27777 break 27778 } 27779 x0 := r0.Args[0] 27780 if x0.Op != OpS390XMOVHBRloadidx { 27781 break 27782 } 27783 i0 := x0.AuxInt 27784 if x0.Aux != s { 27785 break 27786 } 27787 _ = x0.Args[2] 27788 if p != x0.Args[0] { 27789 break 27790 } 27791 if idx != x0.Args[1] { 27792 break 27793 } 27794 if mem != x0.Args[2] { 27795 break 27796 } 27797 y := or.Args[1] 27798 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)) { 27799 break 27800 } 27801 b = mergePoint(b, x0, x1) 27802 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27803 v.reset(OpCopy) 27804 v.AddArg(v0) 27805 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27806 v1.AuxInt = j0 27807 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27808 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27809 v3.AuxInt = i0 27810 v3.Aux = s 27811 v3.AddArg(p) 27812 v3.AddArg(idx) 27813 v3.AddArg(mem) 27814 v2.AddArg(v3) 27815 v1.AddArg(v2) 27816 v0.AddArg(v1) 27817 v0.AddArg(y) 27818 return true 27819 } 27820 // 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)) 27821 // 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) 27822 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27823 for { 27824 _ = v.Args[1] 27825 s1 := v.Args[0] 27826 if s1.Op != OpS390XSLDconst { 27827 break 27828 } 27829 j1 := s1.AuxInt 27830 r1 := s1.Args[0] 27831 if r1.Op != OpS390XMOVHZreg { 27832 break 27833 } 27834 x1 := r1.Args[0] 27835 if x1.Op != OpS390XMOVHBRloadidx { 27836 break 27837 } 27838 i1 := x1.AuxInt 27839 s := x1.Aux 27840 _ = x1.Args[2] 27841 idx := x1.Args[0] 27842 p := x1.Args[1] 27843 mem := x1.Args[2] 27844 or := v.Args[1] 27845 if or.Op != OpS390XOR { 27846 break 27847 } 27848 _ = or.Args[1] 27849 s0 := or.Args[0] 27850 if s0.Op != OpS390XSLDconst { 27851 break 27852 } 27853 j0 := s0.AuxInt 27854 r0 := s0.Args[0] 27855 if r0.Op != OpS390XMOVHZreg { 27856 break 27857 } 27858 x0 := r0.Args[0] 27859 if x0.Op != OpS390XMOVHBRloadidx { 27860 break 27861 } 27862 i0 := x0.AuxInt 27863 if x0.Aux != s { 27864 break 27865 } 27866 _ = x0.Args[2] 27867 if p != x0.Args[0] { 27868 break 27869 } 27870 if idx != x0.Args[1] { 27871 break 27872 } 27873 if mem != x0.Args[2] { 27874 break 27875 } 27876 y := or.Args[1] 27877 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)) { 27878 break 27879 } 27880 b = mergePoint(b, x0, x1) 27881 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27882 v.reset(OpCopy) 27883 v.AddArg(v0) 27884 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27885 v1.AuxInt = j0 27886 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27887 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27888 v3.AuxInt = i0 27889 v3.Aux = s 27890 v3.AddArg(p) 27891 v3.AddArg(idx) 27892 v3.AddArg(mem) 27893 v2.AddArg(v3) 27894 v1.AddArg(v2) 27895 v0.AddArg(v1) 27896 v0.AddArg(y) 27897 return true 27898 } 27899 // 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)) 27900 // 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) 27901 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27902 for { 27903 _ = v.Args[1] 27904 s1 := v.Args[0] 27905 if s1.Op != OpS390XSLDconst { 27906 break 27907 } 27908 j1 := s1.AuxInt 27909 r1 := s1.Args[0] 27910 if r1.Op != OpS390XMOVHZreg { 27911 break 27912 } 27913 x1 := r1.Args[0] 27914 if x1.Op != OpS390XMOVHBRloadidx { 27915 break 27916 } 27917 i1 := x1.AuxInt 27918 s := x1.Aux 27919 _ = x1.Args[2] 27920 p := x1.Args[0] 27921 idx := x1.Args[1] 27922 mem := x1.Args[2] 27923 or := v.Args[1] 27924 if or.Op != OpS390XOR { 27925 break 27926 } 27927 _ = or.Args[1] 27928 s0 := or.Args[0] 27929 if s0.Op != OpS390XSLDconst { 27930 break 27931 } 27932 j0 := s0.AuxInt 27933 r0 := s0.Args[0] 27934 if r0.Op != OpS390XMOVHZreg { 27935 break 27936 } 27937 x0 := r0.Args[0] 27938 if x0.Op != OpS390XMOVHBRloadidx { 27939 break 27940 } 27941 i0 := x0.AuxInt 27942 if x0.Aux != s { 27943 break 27944 } 27945 _ = x0.Args[2] 27946 if idx != x0.Args[0] { 27947 break 27948 } 27949 if p != x0.Args[1] { 27950 break 27951 } 27952 if mem != x0.Args[2] { 27953 break 27954 } 27955 y := or.Args[1] 27956 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)) { 27957 break 27958 } 27959 b = mergePoint(b, x0, x1) 27960 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27961 v.reset(OpCopy) 27962 v.AddArg(v0) 27963 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27964 v1.AuxInt = j0 27965 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27966 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27967 v3.AuxInt = i0 27968 v3.Aux = s 27969 v3.AddArg(p) 27970 v3.AddArg(idx) 27971 v3.AddArg(mem) 27972 v2.AddArg(v3) 27973 v1.AddArg(v2) 27974 v0.AddArg(v1) 27975 v0.AddArg(y) 27976 return true 27977 } 27978 // 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)) 27979 // 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) 27980 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27981 for { 27982 _ = v.Args[1] 27983 s1 := v.Args[0] 27984 if s1.Op != OpS390XSLDconst { 27985 break 27986 } 27987 j1 := s1.AuxInt 27988 r1 := s1.Args[0] 27989 if r1.Op != OpS390XMOVHZreg { 27990 break 27991 } 27992 x1 := r1.Args[0] 27993 if x1.Op != OpS390XMOVHBRloadidx { 27994 break 27995 } 27996 i1 := x1.AuxInt 27997 s := x1.Aux 27998 _ = x1.Args[2] 27999 idx := x1.Args[0] 28000 p := x1.Args[1] 28001 mem := x1.Args[2] 28002 or := v.Args[1] 28003 if or.Op != OpS390XOR { 28004 break 28005 } 28006 _ = or.Args[1] 28007 s0 := or.Args[0] 28008 if s0.Op != OpS390XSLDconst { 28009 break 28010 } 28011 j0 := s0.AuxInt 28012 r0 := s0.Args[0] 28013 if r0.Op != OpS390XMOVHZreg { 28014 break 28015 } 28016 x0 := r0.Args[0] 28017 if x0.Op != OpS390XMOVHBRloadidx { 28018 break 28019 } 28020 i0 := x0.AuxInt 28021 if x0.Aux != s { 28022 break 28023 } 28024 _ = x0.Args[2] 28025 if idx != x0.Args[0] { 28026 break 28027 } 28028 if p != x0.Args[1] { 28029 break 28030 } 28031 if mem != x0.Args[2] { 28032 break 28033 } 28034 y := or.Args[1] 28035 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)) { 28036 break 28037 } 28038 b = mergePoint(b, x0, x1) 28039 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28040 v.reset(OpCopy) 28041 v.AddArg(v0) 28042 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28043 v1.AuxInt = j0 28044 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28045 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28046 v3.AuxInt = i0 28047 v3.Aux = s 28048 v3.AddArg(p) 28049 v3.AddArg(idx) 28050 v3.AddArg(mem) 28051 v2.AddArg(v3) 28052 v1.AddArg(v2) 28053 v0.AddArg(v1) 28054 v0.AddArg(y) 28055 return true 28056 } 28057 // 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))))) 28058 // 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) 28059 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28060 for { 28061 _ = v.Args[1] 28062 s1 := v.Args[0] 28063 if s1.Op != OpS390XSLDconst { 28064 break 28065 } 28066 j1 := s1.AuxInt 28067 r1 := s1.Args[0] 28068 if r1.Op != OpS390XMOVHZreg { 28069 break 28070 } 28071 x1 := r1.Args[0] 28072 if x1.Op != OpS390XMOVHBRloadidx { 28073 break 28074 } 28075 i1 := x1.AuxInt 28076 s := x1.Aux 28077 _ = x1.Args[2] 28078 p := x1.Args[0] 28079 idx := x1.Args[1] 28080 mem := x1.Args[2] 28081 or := v.Args[1] 28082 if or.Op != OpS390XOR { 28083 break 28084 } 28085 _ = or.Args[1] 28086 y := or.Args[0] 28087 s0 := or.Args[1] 28088 if s0.Op != OpS390XSLDconst { 28089 break 28090 } 28091 j0 := s0.AuxInt 28092 r0 := s0.Args[0] 28093 if r0.Op != OpS390XMOVHZreg { 28094 break 28095 } 28096 x0 := r0.Args[0] 28097 if x0.Op != OpS390XMOVHBRloadidx { 28098 break 28099 } 28100 i0 := x0.AuxInt 28101 if x0.Aux != s { 28102 break 28103 } 28104 _ = x0.Args[2] 28105 if p != x0.Args[0] { 28106 break 28107 } 28108 if idx != x0.Args[1] { 28109 break 28110 } 28111 if mem != x0.Args[2] { 28112 break 28113 } 28114 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)) { 28115 break 28116 } 28117 b = mergePoint(b, x0, x1) 28118 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28119 v.reset(OpCopy) 28120 v.AddArg(v0) 28121 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28122 v1.AuxInt = j0 28123 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28124 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28125 v3.AuxInt = i0 28126 v3.Aux = s 28127 v3.AddArg(p) 28128 v3.AddArg(idx) 28129 v3.AddArg(mem) 28130 v2.AddArg(v3) 28131 v1.AddArg(v2) 28132 v0.AddArg(v1) 28133 v0.AddArg(y) 28134 return true 28135 } 28136 return false 28137 } 28138 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 28139 b := v.Block 28140 _ = b 28141 typ := &b.Func.Config.Types 28142 _ = typ 28143 // 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))))) 28144 // 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) 28145 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28146 for { 28147 _ = v.Args[1] 28148 s1 := v.Args[0] 28149 if s1.Op != OpS390XSLDconst { 28150 break 28151 } 28152 j1 := s1.AuxInt 28153 r1 := s1.Args[0] 28154 if r1.Op != OpS390XMOVHZreg { 28155 break 28156 } 28157 x1 := r1.Args[0] 28158 if x1.Op != OpS390XMOVHBRloadidx { 28159 break 28160 } 28161 i1 := x1.AuxInt 28162 s := x1.Aux 28163 _ = x1.Args[2] 28164 idx := x1.Args[0] 28165 p := x1.Args[1] 28166 mem := x1.Args[2] 28167 or := v.Args[1] 28168 if or.Op != OpS390XOR { 28169 break 28170 } 28171 _ = or.Args[1] 28172 y := or.Args[0] 28173 s0 := or.Args[1] 28174 if s0.Op != OpS390XSLDconst { 28175 break 28176 } 28177 j0 := s0.AuxInt 28178 r0 := s0.Args[0] 28179 if r0.Op != OpS390XMOVHZreg { 28180 break 28181 } 28182 x0 := r0.Args[0] 28183 if x0.Op != OpS390XMOVHBRloadidx { 28184 break 28185 } 28186 i0 := x0.AuxInt 28187 if x0.Aux != s { 28188 break 28189 } 28190 _ = x0.Args[2] 28191 if p != x0.Args[0] { 28192 break 28193 } 28194 if idx != x0.Args[1] { 28195 break 28196 } 28197 if mem != x0.Args[2] { 28198 break 28199 } 28200 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)) { 28201 break 28202 } 28203 b = mergePoint(b, x0, x1) 28204 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28205 v.reset(OpCopy) 28206 v.AddArg(v0) 28207 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28208 v1.AuxInt = j0 28209 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28210 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28211 v3.AuxInt = i0 28212 v3.Aux = s 28213 v3.AddArg(p) 28214 v3.AddArg(idx) 28215 v3.AddArg(mem) 28216 v2.AddArg(v3) 28217 v1.AddArg(v2) 28218 v0.AddArg(v1) 28219 v0.AddArg(y) 28220 return true 28221 } 28222 // 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))))) 28223 // 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) 28224 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28225 for { 28226 _ = v.Args[1] 28227 s1 := v.Args[0] 28228 if s1.Op != OpS390XSLDconst { 28229 break 28230 } 28231 j1 := s1.AuxInt 28232 r1 := s1.Args[0] 28233 if r1.Op != OpS390XMOVHZreg { 28234 break 28235 } 28236 x1 := r1.Args[0] 28237 if x1.Op != OpS390XMOVHBRloadidx { 28238 break 28239 } 28240 i1 := x1.AuxInt 28241 s := x1.Aux 28242 _ = x1.Args[2] 28243 p := x1.Args[0] 28244 idx := x1.Args[1] 28245 mem := x1.Args[2] 28246 or := v.Args[1] 28247 if or.Op != OpS390XOR { 28248 break 28249 } 28250 _ = or.Args[1] 28251 y := or.Args[0] 28252 s0 := or.Args[1] 28253 if s0.Op != OpS390XSLDconst { 28254 break 28255 } 28256 j0 := s0.AuxInt 28257 r0 := s0.Args[0] 28258 if r0.Op != OpS390XMOVHZreg { 28259 break 28260 } 28261 x0 := r0.Args[0] 28262 if x0.Op != OpS390XMOVHBRloadidx { 28263 break 28264 } 28265 i0 := x0.AuxInt 28266 if x0.Aux != s { 28267 break 28268 } 28269 _ = x0.Args[2] 28270 if idx != x0.Args[0] { 28271 break 28272 } 28273 if p != x0.Args[1] { 28274 break 28275 } 28276 if mem != x0.Args[2] { 28277 break 28278 } 28279 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)) { 28280 break 28281 } 28282 b = mergePoint(b, x0, x1) 28283 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28284 v.reset(OpCopy) 28285 v.AddArg(v0) 28286 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28287 v1.AuxInt = j0 28288 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28289 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28290 v3.AuxInt = i0 28291 v3.Aux = s 28292 v3.AddArg(p) 28293 v3.AddArg(idx) 28294 v3.AddArg(mem) 28295 v2.AddArg(v3) 28296 v1.AddArg(v2) 28297 v0.AddArg(v1) 28298 v0.AddArg(y) 28299 return true 28300 } 28301 // 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))))) 28302 // 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) 28303 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28304 for { 28305 _ = v.Args[1] 28306 s1 := v.Args[0] 28307 if s1.Op != OpS390XSLDconst { 28308 break 28309 } 28310 j1 := s1.AuxInt 28311 r1 := s1.Args[0] 28312 if r1.Op != OpS390XMOVHZreg { 28313 break 28314 } 28315 x1 := r1.Args[0] 28316 if x1.Op != OpS390XMOVHBRloadidx { 28317 break 28318 } 28319 i1 := x1.AuxInt 28320 s := x1.Aux 28321 _ = x1.Args[2] 28322 idx := x1.Args[0] 28323 p := x1.Args[1] 28324 mem := x1.Args[2] 28325 or := v.Args[1] 28326 if or.Op != OpS390XOR { 28327 break 28328 } 28329 _ = or.Args[1] 28330 y := or.Args[0] 28331 s0 := or.Args[1] 28332 if s0.Op != OpS390XSLDconst { 28333 break 28334 } 28335 j0 := s0.AuxInt 28336 r0 := s0.Args[0] 28337 if r0.Op != OpS390XMOVHZreg { 28338 break 28339 } 28340 x0 := r0.Args[0] 28341 if x0.Op != OpS390XMOVHBRloadidx { 28342 break 28343 } 28344 i0 := x0.AuxInt 28345 if x0.Aux != s { 28346 break 28347 } 28348 _ = x0.Args[2] 28349 if idx != x0.Args[0] { 28350 break 28351 } 28352 if p != x0.Args[1] { 28353 break 28354 } 28355 if mem != x0.Args[2] { 28356 break 28357 } 28358 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)) { 28359 break 28360 } 28361 b = mergePoint(b, x0, x1) 28362 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28363 v.reset(OpCopy) 28364 v.AddArg(v0) 28365 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28366 v1.AuxInt = j0 28367 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28368 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28369 v3.AuxInt = i0 28370 v3.Aux = s 28371 v3.AddArg(p) 28372 v3.AddArg(idx) 28373 v3.AddArg(mem) 28374 v2.AddArg(v3) 28375 v1.AddArg(v2) 28376 v0.AddArg(v1) 28377 v0.AddArg(y) 28378 return true 28379 } 28380 // 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)))) 28381 // 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) 28382 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28383 for { 28384 _ = v.Args[1] 28385 or := v.Args[0] 28386 if or.Op != OpS390XOR { 28387 break 28388 } 28389 _ = or.Args[1] 28390 s0 := or.Args[0] 28391 if s0.Op != OpS390XSLDconst { 28392 break 28393 } 28394 j0 := s0.AuxInt 28395 r0 := s0.Args[0] 28396 if r0.Op != OpS390XMOVHZreg { 28397 break 28398 } 28399 x0 := r0.Args[0] 28400 if x0.Op != OpS390XMOVHBRloadidx { 28401 break 28402 } 28403 i0 := x0.AuxInt 28404 s := x0.Aux 28405 _ = x0.Args[2] 28406 p := x0.Args[0] 28407 idx := x0.Args[1] 28408 mem := x0.Args[2] 28409 y := or.Args[1] 28410 s1 := v.Args[1] 28411 if s1.Op != OpS390XSLDconst { 28412 break 28413 } 28414 j1 := s1.AuxInt 28415 r1 := s1.Args[0] 28416 if r1.Op != OpS390XMOVHZreg { 28417 break 28418 } 28419 x1 := r1.Args[0] 28420 if x1.Op != OpS390XMOVHBRloadidx { 28421 break 28422 } 28423 i1 := x1.AuxInt 28424 if x1.Aux != s { 28425 break 28426 } 28427 _ = x1.Args[2] 28428 if p != x1.Args[0] { 28429 break 28430 } 28431 if idx != x1.Args[1] { 28432 break 28433 } 28434 if mem != x1.Args[2] { 28435 break 28436 } 28437 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)) { 28438 break 28439 } 28440 b = mergePoint(b, x0, x1) 28441 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28442 v.reset(OpCopy) 28443 v.AddArg(v0) 28444 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28445 v1.AuxInt = j0 28446 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28447 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28448 v3.AuxInt = i0 28449 v3.Aux = s 28450 v3.AddArg(p) 28451 v3.AddArg(idx) 28452 v3.AddArg(mem) 28453 v2.AddArg(v3) 28454 v1.AddArg(v2) 28455 v0.AddArg(v1) 28456 v0.AddArg(y) 28457 return true 28458 } 28459 // 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)))) 28460 // 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) 28461 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28462 for { 28463 _ = v.Args[1] 28464 or := v.Args[0] 28465 if or.Op != OpS390XOR { 28466 break 28467 } 28468 _ = or.Args[1] 28469 s0 := or.Args[0] 28470 if s0.Op != OpS390XSLDconst { 28471 break 28472 } 28473 j0 := s0.AuxInt 28474 r0 := s0.Args[0] 28475 if r0.Op != OpS390XMOVHZreg { 28476 break 28477 } 28478 x0 := r0.Args[0] 28479 if x0.Op != OpS390XMOVHBRloadidx { 28480 break 28481 } 28482 i0 := x0.AuxInt 28483 s := x0.Aux 28484 _ = x0.Args[2] 28485 idx := x0.Args[0] 28486 p := x0.Args[1] 28487 mem := x0.Args[2] 28488 y := or.Args[1] 28489 s1 := v.Args[1] 28490 if s1.Op != OpS390XSLDconst { 28491 break 28492 } 28493 j1 := s1.AuxInt 28494 r1 := s1.Args[0] 28495 if r1.Op != OpS390XMOVHZreg { 28496 break 28497 } 28498 x1 := r1.Args[0] 28499 if x1.Op != OpS390XMOVHBRloadidx { 28500 break 28501 } 28502 i1 := x1.AuxInt 28503 if x1.Aux != s { 28504 break 28505 } 28506 _ = x1.Args[2] 28507 if p != x1.Args[0] { 28508 break 28509 } 28510 if idx != x1.Args[1] { 28511 break 28512 } 28513 if mem != x1.Args[2] { 28514 break 28515 } 28516 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)) { 28517 break 28518 } 28519 b = mergePoint(b, x0, x1) 28520 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28521 v.reset(OpCopy) 28522 v.AddArg(v0) 28523 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28524 v1.AuxInt = j0 28525 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28526 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28527 v3.AuxInt = i0 28528 v3.Aux = s 28529 v3.AddArg(p) 28530 v3.AddArg(idx) 28531 v3.AddArg(mem) 28532 v2.AddArg(v3) 28533 v1.AddArg(v2) 28534 v0.AddArg(v1) 28535 v0.AddArg(y) 28536 return true 28537 } 28538 // 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)))) 28539 // 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) 28540 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28541 for { 28542 _ = v.Args[1] 28543 or := v.Args[0] 28544 if or.Op != OpS390XOR { 28545 break 28546 } 28547 _ = or.Args[1] 28548 y := or.Args[0] 28549 s0 := or.Args[1] 28550 if s0.Op != OpS390XSLDconst { 28551 break 28552 } 28553 j0 := s0.AuxInt 28554 r0 := s0.Args[0] 28555 if r0.Op != OpS390XMOVHZreg { 28556 break 28557 } 28558 x0 := r0.Args[0] 28559 if x0.Op != OpS390XMOVHBRloadidx { 28560 break 28561 } 28562 i0 := x0.AuxInt 28563 s := x0.Aux 28564 _ = x0.Args[2] 28565 p := x0.Args[0] 28566 idx := x0.Args[1] 28567 mem := x0.Args[2] 28568 s1 := v.Args[1] 28569 if s1.Op != OpS390XSLDconst { 28570 break 28571 } 28572 j1 := s1.AuxInt 28573 r1 := s1.Args[0] 28574 if r1.Op != OpS390XMOVHZreg { 28575 break 28576 } 28577 x1 := r1.Args[0] 28578 if x1.Op != OpS390XMOVHBRloadidx { 28579 break 28580 } 28581 i1 := x1.AuxInt 28582 if x1.Aux != s { 28583 break 28584 } 28585 _ = x1.Args[2] 28586 if p != x1.Args[0] { 28587 break 28588 } 28589 if idx != x1.Args[1] { 28590 break 28591 } 28592 if mem != x1.Args[2] { 28593 break 28594 } 28595 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)) { 28596 break 28597 } 28598 b = mergePoint(b, x0, x1) 28599 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28600 v.reset(OpCopy) 28601 v.AddArg(v0) 28602 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28603 v1.AuxInt = j0 28604 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28605 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28606 v3.AuxInt = i0 28607 v3.Aux = s 28608 v3.AddArg(p) 28609 v3.AddArg(idx) 28610 v3.AddArg(mem) 28611 v2.AddArg(v3) 28612 v1.AddArg(v2) 28613 v0.AddArg(v1) 28614 v0.AddArg(y) 28615 return true 28616 } 28617 // 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)))) 28618 // 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) 28619 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28620 for { 28621 _ = v.Args[1] 28622 or := v.Args[0] 28623 if or.Op != OpS390XOR { 28624 break 28625 } 28626 _ = or.Args[1] 28627 y := or.Args[0] 28628 s0 := or.Args[1] 28629 if s0.Op != OpS390XSLDconst { 28630 break 28631 } 28632 j0 := s0.AuxInt 28633 r0 := s0.Args[0] 28634 if r0.Op != OpS390XMOVHZreg { 28635 break 28636 } 28637 x0 := r0.Args[0] 28638 if x0.Op != OpS390XMOVHBRloadidx { 28639 break 28640 } 28641 i0 := x0.AuxInt 28642 s := x0.Aux 28643 _ = x0.Args[2] 28644 idx := x0.Args[0] 28645 p := x0.Args[1] 28646 mem := x0.Args[2] 28647 s1 := v.Args[1] 28648 if s1.Op != OpS390XSLDconst { 28649 break 28650 } 28651 j1 := s1.AuxInt 28652 r1 := s1.Args[0] 28653 if r1.Op != OpS390XMOVHZreg { 28654 break 28655 } 28656 x1 := r1.Args[0] 28657 if x1.Op != OpS390XMOVHBRloadidx { 28658 break 28659 } 28660 i1 := x1.AuxInt 28661 if x1.Aux != s { 28662 break 28663 } 28664 _ = x1.Args[2] 28665 if p != x1.Args[0] { 28666 break 28667 } 28668 if idx != x1.Args[1] { 28669 break 28670 } 28671 if mem != x1.Args[2] { 28672 break 28673 } 28674 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)) { 28675 break 28676 } 28677 b = mergePoint(b, x0, x1) 28678 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28679 v.reset(OpCopy) 28680 v.AddArg(v0) 28681 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28682 v1.AuxInt = j0 28683 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28684 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28685 v3.AuxInt = i0 28686 v3.Aux = s 28687 v3.AddArg(p) 28688 v3.AddArg(idx) 28689 v3.AddArg(mem) 28690 v2.AddArg(v3) 28691 v1.AddArg(v2) 28692 v0.AddArg(v1) 28693 v0.AddArg(y) 28694 return true 28695 } 28696 // 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)))) 28697 // 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) 28698 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28699 for { 28700 _ = v.Args[1] 28701 or := v.Args[0] 28702 if or.Op != OpS390XOR { 28703 break 28704 } 28705 _ = or.Args[1] 28706 s0 := or.Args[0] 28707 if s0.Op != OpS390XSLDconst { 28708 break 28709 } 28710 j0 := s0.AuxInt 28711 r0 := s0.Args[0] 28712 if r0.Op != OpS390XMOVHZreg { 28713 break 28714 } 28715 x0 := r0.Args[0] 28716 if x0.Op != OpS390XMOVHBRloadidx { 28717 break 28718 } 28719 i0 := x0.AuxInt 28720 s := x0.Aux 28721 _ = x0.Args[2] 28722 p := x0.Args[0] 28723 idx := x0.Args[1] 28724 mem := x0.Args[2] 28725 y := or.Args[1] 28726 s1 := v.Args[1] 28727 if s1.Op != OpS390XSLDconst { 28728 break 28729 } 28730 j1 := s1.AuxInt 28731 r1 := s1.Args[0] 28732 if r1.Op != OpS390XMOVHZreg { 28733 break 28734 } 28735 x1 := r1.Args[0] 28736 if x1.Op != OpS390XMOVHBRloadidx { 28737 break 28738 } 28739 i1 := x1.AuxInt 28740 if x1.Aux != s { 28741 break 28742 } 28743 _ = x1.Args[2] 28744 if idx != x1.Args[0] { 28745 break 28746 } 28747 if p != x1.Args[1] { 28748 break 28749 } 28750 if mem != x1.Args[2] { 28751 break 28752 } 28753 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)) { 28754 break 28755 } 28756 b = mergePoint(b, x0, x1) 28757 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28758 v.reset(OpCopy) 28759 v.AddArg(v0) 28760 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28761 v1.AuxInt = j0 28762 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28763 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28764 v3.AuxInt = i0 28765 v3.Aux = s 28766 v3.AddArg(p) 28767 v3.AddArg(idx) 28768 v3.AddArg(mem) 28769 v2.AddArg(v3) 28770 v1.AddArg(v2) 28771 v0.AddArg(v1) 28772 v0.AddArg(y) 28773 return true 28774 } 28775 // 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)))) 28776 // 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) 28777 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28778 for { 28779 _ = v.Args[1] 28780 or := v.Args[0] 28781 if or.Op != OpS390XOR { 28782 break 28783 } 28784 _ = or.Args[1] 28785 s0 := or.Args[0] 28786 if s0.Op != OpS390XSLDconst { 28787 break 28788 } 28789 j0 := s0.AuxInt 28790 r0 := s0.Args[0] 28791 if r0.Op != OpS390XMOVHZreg { 28792 break 28793 } 28794 x0 := r0.Args[0] 28795 if x0.Op != OpS390XMOVHBRloadidx { 28796 break 28797 } 28798 i0 := x0.AuxInt 28799 s := x0.Aux 28800 _ = x0.Args[2] 28801 idx := x0.Args[0] 28802 p := x0.Args[1] 28803 mem := x0.Args[2] 28804 y := or.Args[1] 28805 s1 := v.Args[1] 28806 if s1.Op != OpS390XSLDconst { 28807 break 28808 } 28809 j1 := s1.AuxInt 28810 r1 := s1.Args[0] 28811 if r1.Op != OpS390XMOVHZreg { 28812 break 28813 } 28814 x1 := r1.Args[0] 28815 if x1.Op != OpS390XMOVHBRloadidx { 28816 break 28817 } 28818 i1 := x1.AuxInt 28819 if x1.Aux != s { 28820 break 28821 } 28822 _ = x1.Args[2] 28823 if idx != x1.Args[0] { 28824 break 28825 } 28826 if p != x1.Args[1] { 28827 break 28828 } 28829 if mem != x1.Args[2] { 28830 break 28831 } 28832 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)) { 28833 break 28834 } 28835 b = mergePoint(b, x0, x1) 28836 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28837 v.reset(OpCopy) 28838 v.AddArg(v0) 28839 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28840 v1.AuxInt = j0 28841 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28842 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28843 v3.AuxInt = i0 28844 v3.Aux = s 28845 v3.AddArg(p) 28846 v3.AddArg(idx) 28847 v3.AddArg(mem) 28848 v2.AddArg(v3) 28849 v1.AddArg(v2) 28850 v0.AddArg(v1) 28851 v0.AddArg(y) 28852 return true 28853 } 28854 // 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)))) 28855 // 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) 28856 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28857 for { 28858 _ = v.Args[1] 28859 or := v.Args[0] 28860 if or.Op != OpS390XOR { 28861 break 28862 } 28863 _ = or.Args[1] 28864 y := or.Args[0] 28865 s0 := or.Args[1] 28866 if s0.Op != OpS390XSLDconst { 28867 break 28868 } 28869 j0 := s0.AuxInt 28870 r0 := s0.Args[0] 28871 if r0.Op != OpS390XMOVHZreg { 28872 break 28873 } 28874 x0 := r0.Args[0] 28875 if x0.Op != OpS390XMOVHBRloadidx { 28876 break 28877 } 28878 i0 := x0.AuxInt 28879 s := x0.Aux 28880 _ = x0.Args[2] 28881 p := x0.Args[0] 28882 idx := x0.Args[1] 28883 mem := x0.Args[2] 28884 s1 := v.Args[1] 28885 if s1.Op != OpS390XSLDconst { 28886 break 28887 } 28888 j1 := s1.AuxInt 28889 r1 := s1.Args[0] 28890 if r1.Op != OpS390XMOVHZreg { 28891 break 28892 } 28893 x1 := r1.Args[0] 28894 if x1.Op != OpS390XMOVHBRloadidx { 28895 break 28896 } 28897 i1 := x1.AuxInt 28898 if x1.Aux != s { 28899 break 28900 } 28901 _ = x1.Args[2] 28902 if idx != x1.Args[0] { 28903 break 28904 } 28905 if p != x1.Args[1] { 28906 break 28907 } 28908 if mem != x1.Args[2] { 28909 break 28910 } 28911 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)) { 28912 break 28913 } 28914 b = mergePoint(b, x0, x1) 28915 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28916 v.reset(OpCopy) 28917 v.AddArg(v0) 28918 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28919 v1.AuxInt = j0 28920 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28921 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28922 v3.AuxInt = i0 28923 v3.Aux = s 28924 v3.AddArg(p) 28925 v3.AddArg(idx) 28926 v3.AddArg(mem) 28927 v2.AddArg(v3) 28928 v1.AddArg(v2) 28929 v0.AddArg(v1) 28930 v0.AddArg(y) 28931 return true 28932 } 28933 return false 28934 } 28935 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 28936 b := v.Block 28937 _ = b 28938 typ := &b.Func.Config.Types 28939 _ = typ 28940 // 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)))) 28941 // 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) 28942 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28943 for { 28944 _ = v.Args[1] 28945 or := v.Args[0] 28946 if or.Op != OpS390XOR { 28947 break 28948 } 28949 _ = or.Args[1] 28950 y := or.Args[0] 28951 s0 := or.Args[1] 28952 if s0.Op != OpS390XSLDconst { 28953 break 28954 } 28955 j0 := s0.AuxInt 28956 r0 := s0.Args[0] 28957 if r0.Op != OpS390XMOVHZreg { 28958 break 28959 } 28960 x0 := r0.Args[0] 28961 if x0.Op != OpS390XMOVHBRloadidx { 28962 break 28963 } 28964 i0 := x0.AuxInt 28965 s := x0.Aux 28966 _ = x0.Args[2] 28967 idx := x0.Args[0] 28968 p := x0.Args[1] 28969 mem := x0.Args[2] 28970 s1 := v.Args[1] 28971 if s1.Op != OpS390XSLDconst { 28972 break 28973 } 28974 j1 := s1.AuxInt 28975 r1 := s1.Args[0] 28976 if r1.Op != OpS390XMOVHZreg { 28977 break 28978 } 28979 x1 := r1.Args[0] 28980 if x1.Op != OpS390XMOVHBRloadidx { 28981 break 28982 } 28983 i1 := x1.AuxInt 28984 if x1.Aux != s { 28985 break 28986 } 28987 _ = x1.Args[2] 28988 if idx != x1.Args[0] { 28989 break 28990 } 28991 if p != x1.Args[1] { 28992 break 28993 } 28994 if mem != x1.Args[2] { 28995 break 28996 } 28997 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)) { 28998 break 28999 } 29000 b = mergePoint(b, x0, x1) 29001 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 29002 v.reset(OpCopy) 29003 v.AddArg(v0) 29004 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 29005 v1.AuxInt = j0 29006 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 29007 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 29008 v3.AuxInt = i0 29009 v3.Aux = s 29010 v3.AddArg(p) 29011 v3.AddArg(idx) 29012 v3.AddArg(mem) 29013 v2.AddArg(v3) 29014 v1.AddArg(v2) 29015 v0.AddArg(v1) 29016 v0.AddArg(y) 29017 return true 29018 } 29019 return false 29020 } 29021 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 29022 // match: (ORW x (MOVDconst [c])) 29023 // cond: 29024 // result: (ORWconst [c] x) 29025 for { 29026 _ = v.Args[1] 29027 x := v.Args[0] 29028 v_1 := v.Args[1] 29029 if v_1.Op != OpS390XMOVDconst { 29030 break 29031 } 29032 c := v_1.AuxInt 29033 v.reset(OpS390XORWconst) 29034 v.AuxInt = c 29035 v.AddArg(x) 29036 return true 29037 } 29038 // match: (ORW (MOVDconst [c]) x) 29039 // cond: 29040 // result: (ORWconst [c] x) 29041 for { 29042 _ = v.Args[1] 29043 v_0 := v.Args[0] 29044 if v_0.Op != OpS390XMOVDconst { 29045 break 29046 } 29047 c := v_0.AuxInt 29048 x := v.Args[1] 29049 v.reset(OpS390XORWconst) 29050 v.AuxInt = c 29051 v.AddArg(x) 29052 return true 29053 } 29054 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 29055 // cond: d == 32-c 29056 // result: (RLLconst [c] x) 29057 for { 29058 _ = v.Args[1] 29059 v_0 := v.Args[0] 29060 if v_0.Op != OpS390XSLWconst { 29061 break 29062 } 29063 c := v_0.AuxInt 29064 x := v_0.Args[0] 29065 v_1 := v.Args[1] 29066 if v_1.Op != OpS390XSRWconst { 29067 break 29068 } 29069 d := v_1.AuxInt 29070 if x != v_1.Args[0] { 29071 break 29072 } 29073 if !(d == 32-c) { 29074 break 29075 } 29076 v.reset(OpS390XRLLconst) 29077 v.AuxInt = c 29078 v.AddArg(x) 29079 return true 29080 } 29081 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 29082 // cond: d == 32-c 29083 // result: (RLLconst [c] x) 29084 for { 29085 _ = v.Args[1] 29086 v_0 := v.Args[0] 29087 if v_0.Op != OpS390XSRWconst { 29088 break 29089 } 29090 d := v_0.AuxInt 29091 x := v_0.Args[0] 29092 v_1 := v.Args[1] 29093 if v_1.Op != OpS390XSLWconst { 29094 break 29095 } 29096 c := v_1.AuxInt 29097 if x != v_1.Args[0] { 29098 break 29099 } 29100 if !(d == 32-c) { 29101 break 29102 } 29103 v.reset(OpS390XRLLconst) 29104 v.AuxInt = c 29105 v.AddArg(x) 29106 return true 29107 } 29108 // match: (ORW x x) 29109 // cond: 29110 // result: x 29111 for { 29112 _ = v.Args[1] 29113 x := v.Args[0] 29114 if x != v.Args[1] { 29115 break 29116 } 29117 v.reset(OpCopy) 29118 v.Type = x.Type 29119 v.AddArg(x) 29120 return true 29121 } 29122 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29123 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29124 // result: (ORWload <t> [off] {sym} x ptr mem) 29125 for { 29126 t := v.Type 29127 _ = v.Args[1] 29128 x := v.Args[0] 29129 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29139 break 29140 } 29141 v.reset(OpS390XORWload) 29142 v.Type = t 29143 v.AuxInt = off 29144 v.Aux = sym 29145 v.AddArg(x) 29146 v.AddArg(ptr) 29147 v.AddArg(mem) 29148 return true 29149 } 29150 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29151 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29152 // result: (ORWload <t> [off] {sym} x ptr mem) 29153 for { 29154 t := v.Type 29155 _ = v.Args[1] 29156 g := v.Args[0] 29157 if g.Op != OpS390XMOVWload { 29158 break 29159 } 29160 off := g.AuxInt 29161 sym := g.Aux 29162 _ = g.Args[1] 29163 ptr := g.Args[0] 29164 mem := g.Args[1] 29165 x := v.Args[1] 29166 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29167 break 29168 } 29169 v.reset(OpS390XORWload) 29170 v.Type = t 29171 v.AuxInt = off 29172 v.Aux = sym 29173 v.AddArg(x) 29174 v.AddArg(ptr) 29175 v.AddArg(mem) 29176 return true 29177 } 29178 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29179 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29180 // result: (ORWload <t> [off] {sym} x ptr mem) 29181 for { 29182 t := v.Type 29183 _ = v.Args[1] 29184 g := v.Args[0] 29185 if g.Op != OpS390XMOVWload { 29186 break 29187 } 29188 off := g.AuxInt 29189 sym := g.Aux 29190 _ = g.Args[1] 29191 ptr := g.Args[0] 29192 mem := g.Args[1] 29193 x := v.Args[1] 29194 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29195 break 29196 } 29197 v.reset(OpS390XORWload) 29198 v.Type = t 29199 v.AuxInt = off 29200 v.Aux = sym 29201 v.AddArg(x) 29202 v.AddArg(ptr) 29203 v.AddArg(mem) 29204 return true 29205 } 29206 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29207 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29208 // result: (ORWload <t> [off] {sym} x ptr mem) 29209 for { 29210 t := v.Type 29211 _ = v.Args[1] 29212 x := v.Args[0] 29213 g := v.Args[1] 29214 if g.Op != OpS390XMOVWload { 29215 break 29216 } 29217 off := g.AuxInt 29218 sym := g.Aux 29219 _ = g.Args[1] 29220 ptr := g.Args[0] 29221 mem := g.Args[1] 29222 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29223 break 29224 } 29225 v.reset(OpS390XORWload) 29226 v.Type = t 29227 v.AuxInt = off 29228 v.Aux = sym 29229 v.AddArg(x) 29230 v.AddArg(ptr) 29231 v.AddArg(mem) 29232 return true 29233 } 29234 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29235 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29236 // result: (ORWload <t> [off] {sym} x ptr mem) 29237 for { 29238 t := v.Type 29239 _ = v.Args[1] 29240 x := v.Args[0] 29241 g := v.Args[1] 29242 if g.Op != OpS390XMOVWZload { 29243 break 29244 } 29245 off := g.AuxInt 29246 sym := g.Aux 29247 _ = g.Args[1] 29248 ptr := g.Args[0] 29249 mem := g.Args[1] 29250 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29251 break 29252 } 29253 v.reset(OpS390XORWload) 29254 v.Type = t 29255 v.AuxInt = off 29256 v.Aux = sym 29257 v.AddArg(x) 29258 v.AddArg(ptr) 29259 v.AddArg(mem) 29260 return true 29261 } 29262 return false 29263 } 29264 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 29265 b := v.Block 29266 _ = b 29267 typ := &b.Func.Config.Types 29268 _ = typ 29269 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 29270 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29271 // result: (ORWload <t> [off] {sym} x ptr mem) 29272 for { 29273 t := v.Type 29274 _ = v.Args[1] 29275 g := v.Args[0] 29276 if g.Op != OpS390XMOVWZload { 29277 break 29278 } 29279 off := g.AuxInt 29280 sym := g.Aux 29281 _ = g.Args[1] 29282 ptr := g.Args[0] 29283 mem := g.Args[1] 29284 x := v.Args[1] 29285 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29286 break 29287 } 29288 v.reset(OpS390XORWload) 29289 v.Type = t 29290 v.AuxInt = off 29291 v.Aux = sym 29292 v.AddArg(x) 29293 v.AddArg(ptr) 29294 v.AddArg(mem) 29295 return true 29296 } 29297 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 29298 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29299 // result: (ORWload <t> [off] {sym} x ptr mem) 29300 for { 29301 t := v.Type 29302 _ = v.Args[1] 29303 g := v.Args[0] 29304 if g.Op != OpS390XMOVWZload { 29305 break 29306 } 29307 off := g.AuxInt 29308 sym := g.Aux 29309 _ = g.Args[1] 29310 ptr := g.Args[0] 29311 mem := g.Args[1] 29312 x := v.Args[1] 29313 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29314 break 29315 } 29316 v.reset(OpS390XORWload) 29317 v.Type = t 29318 v.AuxInt = off 29319 v.Aux = sym 29320 v.AddArg(x) 29321 v.AddArg(ptr) 29322 v.AddArg(mem) 29323 return true 29324 } 29325 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29326 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29327 // result: (ORWload <t> [off] {sym} x ptr mem) 29328 for { 29329 t := v.Type 29330 _ = v.Args[1] 29331 x := v.Args[0] 29332 g := v.Args[1] 29333 if g.Op != OpS390XMOVWZload { 29334 break 29335 } 29336 off := g.AuxInt 29337 sym := g.Aux 29338 _ = g.Args[1] 29339 ptr := g.Args[0] 29340 mem := g.Args[1] 29341 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29342 break 29343 } 29344 v.reset(OpS390XORWload) 29345 v.Type = t 29346 v.AuxInt = off 29347 v.Aux = sym 29348 v.AddArg(x) 29349 v.AddArg(ptr) 29350 v.AddArg(mem) 29351 return true 29352 } 29353 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 29354 // 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) 29355 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29356 for { 29357 _ = v.Args[1] 29358 x1 := v.Args[0] 29359 if x1.Op != OpS390XMOVBZload { 29360 break 29361 } 29362 i1 := x1.AuxInt 29363 s := x1.Aux 29364 _ = x1.Args[1] 29365 p := x1.Args[0] 29366 mem := x1.Args[1] 29367 sh := v.Args[1] 29368 if sh.Op != OpS390XSLWconst { 29369 break 29370 } 29371 if sh.AuxInt != 8 { 29372 break 29373 } 29374 x0 := sh.Args[0] 29375 if x0.Op != OpS390XMOVBZload { 29376 break 29377 } 29378 i0 := x0.AuxInt 29379 if x0.Aux != s { 29380 break 29381 } 29382 _ = x0.Args[1] 29383 if p != x0.Args[0] { 29384 break 29385 } 29386 if mem != x0.Args[1] { 29387 break 29388 } 29389 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)) { 29390 break 29391 } 29392 b = mergePoint(b, x0, x1) 29393 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29394 v.reset(OpCopy) 29395 v.AddArg(v0) 29396 v0.AuxInt = i0 29397 v0.Aux = s 29398 v0.AddArg(p) 29399 v0.AddArg(mem) 29400 return true 29401 } 29402 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 29403 // 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) 29404 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29405 for { 29406 _ = v.Args[1] 29407 sh := v.Args[0] 29408 if sh.Op != OpS390XSLWconst { 29409 break 29410 } 29411 if sh.AuxInt != 8 { 29412 break 29413 } 29414 x0 := sh.Args[0] 29415 if x0.Op != OpS390XMOVBZload { 29416 break 29417 } 29418 i0 := x0.AuxInt 29419 s := x0.Aux 29420 _ = x0.Args[1] 29421 p := x0.Args[0] 29422 mem := x0.Args[1] 29423 x1 := v.Args[1] 29424 if x1.Op != OpS390XMOVBZload { 29425 break 29426 } 29427 i1 := x1.AuxInt 29428 if x1.Aux != s { 29429 break 29430 } 29431 _ = x1.Args[1] 29432 if p != x1.Args[0] { 29433 break 29434 } 29435 if mem != x1.Args[1] { 29436 break 29437 } 29438 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)) { 29439 break 29440 } 29441 b = mergePoint(b, x0, x1) 29442 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29443 v.reset(OpCopy) 29444 v.AddArg(v0) 29445 v0.AuxInt = i0 29446 v0.Aux = s 29447 v0.AddArg(p) 29448 v0.AddArg(mem) 29449 return true 29450 } 29451 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 29452 // 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) 29453 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29454 for { 29455 _ = v.Args[1] 29456 x1 := v.Args[0] 29457 if x1.Op != OpS390XMOVHZload { 29458 break 29459 } 29460 i1 := x1.AuxInt 29461 s := x1.Aux 29462 _ = x1.Args[1] 29463 p := x1.Args[0] 29464 mem := x1.Args[1] 29465 sh := v.Args[1] 29466 if sh.Op != OpS390XSLWconst { 29467 break 29468 } 29469 if sh.AuxInt != 16 { 29470 break 29471 } 29472 x0 := sh.Args[0] 29473 if x0.Op != OpS390XMOVHZload { 29474 break 29475 } 29476 i0 := x0.AuxInt 29477 if x0.Aux != s { 29478 break 29479 } 29480 _ = x0.Args[1] 29481 if p != x0.Args[0] { 29482 break 29483 } 29484 if mem != x0.Args[1] { 29485 break 29486 } 29487 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)) { 29488 break 29489 } 29490 b = mergePoint(b, x0, x1) 29491 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29492 v.reset(OpCopy) 29493 v.AddArg(v0) 29494 v0.AuxInt = i0 29495 v0.Aux = s 29496 v0.AddArg(p) 29497 v0.AddArg(mem) 29498 return true 29499 } 29500 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 29501 // 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) 29502 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29503 for { 29504 _ = v.Args[1] 29505 sh := v.Args[0] 29506 if sh.Op != OpS390XSLWconst { 29507 break 29508 } 29509 if sh.AuxInt != 16 { 29510 break 29511 } 29512 x0 := sh.Args[0] 29513 if x0.Op != OpS390XMOVHZload { 29514 break 29515 } 29516 i0 := x0.AuxInt 29517 s := x0.Aux 29518 _ = x0.Args[1] 29519 p := x0.Args[0] 29520 mem := x0.Args[1] 29521 x1 := v.Args[1] 29522 if x1.Op != OpS390XMOVHZload { 29523 break 29524 } 29525 i1 := x1.AuxInt 29526 if x1.Aux != s { 29527 break 29528 } 29529 _ = x1.Args[1] 29530 if p != x1.Args[0] { 29531 break 29532 } 29533 if mem != x1.Args[1] { 29534 break 29535 } 29536 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)) { 29537 break 29538 } 29539 b = mergePoint(b, x0, x1) 29540 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29541 v.reset(OpCopy) 29542 v.AddArg(v0) 29543 v0.AuxInt = i0 29544 v0.Aux = s 29545 v0.AddArg(p) 29546 v0.AddArg(mem) 29547 return true 29548 } 29549 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 29550 // 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) 29551 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29552 for { 29553 _ = v.Args[1] 29554 s0 := v.Args[0] 29555 if s0.Op != OpS390XSLWconst { 29556 break 29557 } 29558 j0 := s0.AuxInt 29559 x0 := s0.Args[0] 29560 if x0.Op != OpS390XMOVBZload { 29561 break 29562 } 29563 i0 := x0.AuxInt 29564 s := x0.Aux 29565 _ = x0.Args[1] 29566 p := x0.Args[0] 29567 mem := x0.Args[1] 29568 or := v.Args[1] 29569 if or.Op != OpS390XORW { 29570 break 29571 } 29572 _ = or.Args[1] 29573 s1 := or.Args[0] 29574 if s1.Op != OpS390XSLWconst { 29575 break 29576 } 29577 j1 := s1.AuxInt 29578 x1 := s1.Args[0] 29579 if x1.Op != OpS390XMOVBZload { 29580 break 29581 } 29582 i1 := x1.AuxInt 29583 if x1.Aux != s { 29584 break 29585 } 29586 _ = x1.Args[1] 29587 if p != x1.Args[0] { 29588 break 29589 } 29590 if mem != x1.Args[1] { 29591 break 29592 } 29593 y := or.Args[1] 29594 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)) { 29595 break 29596 } 29597 b = mergePoint(b, x0, x1) 29598 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29599 v.reset(OpCopy) 29600 v.AddArg(v0) 29601 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29602 v1.AuxInt = j1 29603 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29604 v2.AuxInt = i0 29605 v2.Aux = s 29606 v2.AddArg(p) 29607 v2.AddArg(mem) 29608 v1.AddArg(v2) 29609 v0.AddArg(v1) 29610 v0.AddArg(y) 29611 return true 29612 } 29613 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 29614 // 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) 29615 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29616 for { 29617 _ = v.Args[1] 29618 s0 := v.Args[0] 29619 if s0.Op != OpS390XSLWconst { 29620 break 29621 } 29622 j0 := s0.AuxInt 29623 x0 := s0.Args[0] 29624 if x0.Op != OpS390XMOVBZload { 29625 break 29626 } 29627 i0 := x0.AuxInt 29628 s := x0.Aux 29629 _ = x0.Args[1] 29630 p := x0.Args[0] 29631 mem := x0.Args[1] 29632 or := v.Args[1] 29633 if or.Op != OpS390XORW { 29634 break 29635 } 29636 _ = or.Args[1] 29637 y := or.Args[0] 29638 s1 := or.Args[1] 29639 if s1.Op != OpS390XSLWconst { 29640 break 29641 } 29642 j1 := s1.AuxInt 29643 x1 := s1.Args[0] 29644 if x1.Op != OpS390XMOVBZload { 29645 break 29646 } 29647 i1 := x1.AuxInt 29648 if x1.Aux != s { 29649 break 29650 } 29651 _ = x1.Args[1] 29652 if p != x1.Args[0] { 29653 break 29654 } 29655 if mem != x1.Args[1] { 29656 break 29657 } 29658 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)) { 29659 break 29660 } 29661 b = mergePoint(b, x0, x1) 29662 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29663 v.reset(OpCopy) 29664 v.AddArg(v0) 29665 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29666 v1.AuxInt = j1 29667 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29668 v2.AuxInt = i0 29669 v2.Aux = s 29670 v2.AddArg(p) 29671 v2.AddArg(mem) 29672 v1.AddArg(v2) 29673 v0.AddArg(v1) 29674 v0.AddArg(y) 29675 return true 29676 } 29677 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29678 // 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) 29679 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29680 for { 29681 _ = v.Args[1] 29682 or := v.Args[0] 29683 if or.Op != OpS390XORW { 29684 break 29685 } 29686 _ = or.Args[1] 29687 s1 := or.Args[0] 29688 if s1.Op != OpS390XSLWconst { 29689 break 29690 } 29691 j1 := s1.AuxInt 29692 x1 := s1.Args[0] 29693 if x1.Op != OpS390XMOVBZload { 29694 break 29695 } 29696 i1 := x1.AuxInt 29697 s := x1.Aux 29698 _ = x1.Args[1] 29699 p := x1.Args[0] 29700 mem := x1.Args[1] 29701 y := or.Args[1] 29702 s0 := v.Args[1] 29703 if s0.Op != OpS390XSLWconst { 29704 break 29705 } 29706 j0 := s0.AuxInt 29707 x0 := s0.Args[0] 29708 if x0.Op != OpS390XMOVBZload { 29709 break 29710 } 29711 i0 := x0.AuxInt 29712 if x0.Aux != s { 29713 break 29714 } 29715 _ = x0.Args[1] 29716 if p != x0.Args[0] { 29717 break 29718 } 29719 if mem != x0.Args[1] { 29720 break 29721 } 29722 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)) { 29723 break 29724 } 29725 b = mergePoint(b, x0, x1) 29726 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29727 v.reset(OpCopy) 29728 v.AddArg(v0) 29729 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29730 v1.AuxInt = j1 29731 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29732 v2.AuxInt = i0 29733 v2.Aux = s 29734 v2.AddArg(p) 29735 v2.AddArg(mem) 29736 v1.AddArg(v2) 29737 v0.AddArg(v1) 29738 v0.AddArg(y) 29739 return true 29740 } 29741 return false 29742 } 29743 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 29744 b := v.Block 29745 _ = b 29746 typ := &b.Func.Config.Types 29747 _ = typ 29748 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29749 // 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) 29750 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29751 for { 29752 _ = v.Args[1] 29753 or := v.Args[0] 29754 if or.Op != OpS390XORW { 29755 break 29756 } 29757 _ = or.Args[1] 29758 y := or.Args[0] 29759 s1 := or.Args[1] 29760 if s1.Op != OpS390XSLWconst { 29761 break 29762 } 29763 j1 := s1.AuxInt 29764 x1 := s1.Args[0] 29765 if x1.Op != OpS390XMOVBZload { 29766 break 29767 } 29768 i1 := x1.AuxInt 29769 s := x1.Aux 29770 _ = x1.Args[1] 29771 p := x1.Args[0] 29772 mem := x1.Args[1] 29773 s0 := v.Args[1] 29774 if s0.Op != OpS390XSLWconst { 29775 break 29776 } 29777 j0 := s0.AuxInt 29778 x0 := s0.Args[0] 29779 if x0.Op != OpS390XMOVBZload { 29780 break 29781 } 29782 i0 := x0.AuxInt 29783 if x0.Aux != s { 29784 break 29785 } 29786 _ = x0.Args[1] 29787 if p != x0.Args[0] { 29788 break 29789 } 29790 if mem != x0.Args[1] { 29791 break 29792 } 29793 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)) { 29794 break 29795 } 29796 b = mergePoint(b, x0, x1) 29797 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29798 v.reset(OpCopy) 29799 v.AddArg(v0) 29800 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29801 v1.AuxInt = j1 29802 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29803 v2.AuxInt = i0 29804 v2.Aux = s 29805 v2.AddArg(p) 29806 v2.AddArg(mem) 29807 v1.AddArg(v2) 29808 v0.AddArg(v1) 29809 v0.AddArg(y) 29810 return true 29811 } 29812 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29813 // 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) 29814 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29815 for { 29816 _ = v.Args[1] 29817 x1 := v.Args[0] 29818 if x1.Op != OpS390XMOVBZloadidx { 29819 break 29820 } 29821 i1 := x1.AuxInt 29822 s := x1.Aux 29823 _ = x1.Args[2] 29824 p := x1.Args[0] 29825 idx := x1.Args[1] 29826 mem := x1.Args[2] 29827 sh := v.Args[1] 29828 if sh.Op != OpS390XSLWconst { 29829 break 29830 } 29831 if sh.AuxInt != 8 { 29832 break 29833 } 29834 x0 := sh.Args[0] 29835 if x0.Op != OpS390XMOVBZloadidx { 29836 break 29837 } 29838 i0 := x0.AuxInt 29839 if x0.Aux != s { 29840 break 29841 } 29842 _ = x0.Args[2] 29843 if p != x0.Args[0] { 29844 break 29845 } 29846 if idx != x0.Args[1] { 29847 break 29848 } 29849 if mem != x0.Args[2] { 29850 break 29851 } 29852 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)) { 29853 break 29854 } 29855 b = mergePoint(b, x0, x1) 29856 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29857 v.reset(OpCopy) 29858 v.AddArg(v0) 29859 v0.AuxInt = i0 29860 v0.Aux = s 29861 v0.AddArg(p) 29862 v0.AddArg(idx) 29863 v0.AddArg(mem) 29864 return true 29865 } 29866 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29867 // 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) 29868 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29869 for { 29870 _ = v.Args[1] 29871 x1 := v.Args[0] 29872 if x1.Op != OpS390XMOVBZloadidx { 29873 break 29874 } 29875 i1 := x1.AuxInt 29876 s := x1.Aux 29877 _ = x1.Args[2] 29878 idx := x1.Args[0] 29879 p := x1.Args[1] 29880 mem := x1.Args[2] 29881 sh := v.Args[1] 29882 if sh.Op != OpS390XSLWconst { 29883 break 29884 } 29885 if sh.AuxInt != 8 { 29886 break 29887 } 29888 x0 := sh.Args[0] 29889 if x0.Op != OpS390XMOVBZloadidx { 29890 break 29891 } 29892 i0 := x0.AuxInt 29893 if x0.Aux != s { 29894 break 29895 } 29896 _ = x0.Args[2] 29897 if p != x0.Args[0] { 29898 break 29899 } 29900 if idx != x0.Args[1] { 29901 break 29902 } 29903 if mem != x0.Args[2] { 29904 break 29905 } 29906 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)) { 29907 break 29908 } 29909 b = mergePoint(b, x0, x1) 29910 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29911 v.reset(OpCopy) 29912 v.AddArg(v0) 29913 v0.AuxInt = i0 29914 v0.Aux = s 29915 v0.AddArg(p) 29916 v0.AddArg(idx) 29917 v0.AddArg(mem) 29918 return true 29919 } 29920 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29921 // 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) 29922 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29923 for { 29924 _ = v.Args[1] 29925 x1 := v.Args[0] 29926 if x1.Op != OpS390XMOVBZloadidx { 29927 break 29928 } 29929 i1 := x1.AuxInt 29930 s := x1.Aux 29931 _ = x1.Args[2] 29932 p := x1.Args[0] 29933 idx := x1.Args[1] 29934 mem := x1.Args[2] 29935 sh := v.Args[1] 29936 if sh.Op != OpS390XSLWconst { 29937 break 29938 } 29939 if sh.AuxInt != 8 { 29940 break 29941 } 29942 x0 := sh.Args[0] 29943 if x0.Op != OpS390XMOVBZloadidx { 29944 break 29945 } 29946 i0 := x0.AuxInt 29947 if x0.Aux != s { 29948 break 29949 } 29950 _ = x0.Args[2] 29951 if idx != x0.Args[0] { 29952 break 29953 } 29954 if p != x0.Args[1] { 29955 break 29956 } 29957 if mem != x0.Args[2] { 29958 break 29959 } 29960 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)) { 29961 break 29962 } 29963 b = mergePoint(b, x0, x1) 29964 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29965 v.reset(OpCopy) 29966 v.AddArg(v0) 29967 v0.AuxInt = i0 29968 v0.Aux = s 29969 v0.AddArg(p) 29970 v0.AddArg(idx) 29971 v0.AddArg(mem) 29972 return true 29973 } 29974 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29975 // 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) 29976 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29977 for { 29978 _ = v.Args[1] 29979 x1 := v.Args[0] 29980 if x1.Op != OpS390XMOVBZloadidx { 29981 break 29982 } 29983 i1 := x1.AuxInt 29984 s := x1.Aux 29985 _ = x1.Args[2] 29986 idx := x1.Args[0] 29987 p := x1.Args[1] 29988 mem := x1.Args[2] 29989 sh := v.Args[1] 29990 if sh.Op != OpS390XSLWconst { 29991 break 29992 } 29993 if sh.AuxInt != 8 { 29994 break 29995 } 29996 x0 := sh.Args[0] 29997 if x0.Op != OpS390XMOVBZloadidx { 29998 break 29999 } 30000 i0 := x0.AuxInt 30001 if x0.Aux != s { 30002 break 30003 } 30004 _ = x0.Args[2] 30005 if idx != x0.Args[0] { 30006 break 30007 } 30008 if p != x0.Args[1] { 30009 break 30010 } 30011 if mem != x0.Args[2] { 30012 break 30013 } 30014 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)) { 30015 break 30016 } 30017 b = mergePoint(b, x0, x1) 30018 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30019 v.reset(OpCopy) 30020 v.AddArg(v0) 30021 v0.AuxInt = i0 30022 v0.Aux = s 30023 v0.AddArg(p) 30024 v0.AddArg(idx) 30025 v0.AddArg(mem) 30026 return true 30027 } 30028 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 30029 // 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) 30030 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30031 for { 30032 _ = v.Args[1] 30033 sh := v.Args[0] 30034 if sh.Op != OpS390XSLWconst { 30035 break 30036 } 30037 if sh.AuxInt != 8 { 30038 break 30039 } 30040 x0 := sh.Args[0] 30041 if x0.Op != OpS390XMOVBZloadidx { 30042 break 30043 } 30044 i0 := x0.AuxInt 30045 s := x0.Aux 30046 _ = x0.Args[2] 30047 p := x0.Args[0] 30048 idx := x0.Args[1] 30049 mem := x0.Args[2] 30050 x1 := v.Args[1] 30051 if x1.Op != OpS390XMOVBZloadidx { 30052 break 30053 } 30054 i1 := x1.AuxInt 30055 if x1.Aux != s { 30056 break 30057 } 30058 _ = x1.Args[2] 30059 if p != x1.Args[0] { 30060 break 30061 } 30062 if idx != x1.Args[1] { 30063 break 30064 } 30065 if mem != x1.Args[2] { 30066 break 30067 } 30068 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)) { 30069 break 30070 } 30071 b = mergePoint(b, x0, x1) 30072 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30073 v.reset(OpCopy) 30074 v.AddArg(v0) 30075 v0.AuxInt = i0 30076 v0.Aux = s 30077 v0.AddArg(p) 30078 v0.AddArg(idx) 30079 v0.AddArg(mem) 30080 return true 30081 } 30082 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 30083 // 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) 30084 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30085 for { 30086 _ = v.Args[1] 30087 sh := v.Args[0] 30088 if sh.Op != OpS390XSLWconst { 30089 break 30090 } 30091 if sh.AuxInt != 8 { 30092 break 30093 } 30094 x0 := sh.Args[0] 30095 if x0.Op != OpS390XMOVBZloadidx { 30096 break 30097 } 30098 i0 := x0.AuxInt 30099 s := x0.Aux 30100 _ = x0.Args[2] 30101 idx := x0.Args[0] 30102 p := x0.Args[1] 30103 mem := x0.Args[2] 30104 x1 := v.Args[1] 30105 if x1.Op != OpS390XMOVBZloadidx { 30106 break 30107 } 30108 i1 := x1.AuxInt 30109 if x1.Aux != s { 30110 break 30111 } 30112 _ = x1.Args[2] 30113 if p != x1.Args[0] { 30114 break 30115 } 30116 if idx != x1.Args[1] { 30117 break 30118 } 30119 if mem != x1.Args[2] { 30120 break 30121 } 30122 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)) { 30123 break 30124 } 30125 b = mergePoint(b, x0, x1) 30126 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30127 v.reset(OpCopy) 30128 v.AddArg(v0) 30129 v0.AuxInt = i0 30130 v0.Aux = s 30131 v0.AddArg(p) 30132 v0.AddArg(idx) 30133 v0.AddArg(mem) 30134 return true 30135 } 30136 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30137 // 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) 30138 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30139 for { 30140 _ = v.Args[1] 30141 sh := v.Args[0] 30142 if sh.Op != OpS390XSLWconst { 30143 break 30144 } 30145 if sh.AuxInt != 8 { 30146 break 30147 } 30148 x0 := sh.Args[0] 30149 if x0.Op != OpS390XMOVBZloadidx { 30150 break 30151 } 30152 i0 := x0.AuxInt 30153 s := x0.Aux 30154 _ = x0.Args[2] 30155 p := x0.Args[0] 30156 idx := x0.Args[1] 30157 mem := x0.Args[2] 30158 x1 := v.Args[1] 30159 if x1.Op != OpS390XMOVBZloadidx { 30160 break 30161 } 30162 i1 := x1.AuxInt 30163 if x1.Aux != s { 30164 break 30165 } 30166 _ = x1.Args[2] 30167 if idx != x1.Args[0] { 30168 break 30169 } 30170 if p != x1.Args[1] { 30171 break 30172 } 30173 if mem != x1.Args[2] { 30174 break 30175 } 30176 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)) { 30177 break 30178 } 30179 b = mergePoint(b, x0, x1) 30180 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30181 v.reset(OpCopy) 30182 v.AddArg(v0) 30183 v0.AuxInt = i0 30184 v0.Aux = s 30185 v0.AddArg(p) 30186 v0.AddArg(idx) 30187 v0.AddArg(mem) 30188 return true 30189 } 30190 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30191 // 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) 30192 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30193 for { 30194 _ = v.Args[1] 30195 sh := v.Args[0] 30196 if sh.Op != OpS390XSLWconst { 30197 break 30198 } 30199 if sh.AuxInt != 8 { 30200 break 30201 } 30202 x0 := sh.Args[0] 30203 if x0.Op != OpS390XMOVBZloadidx { 30204 break 30205 } 30206 i0 := x0.AuxInt 30207 s := x0.Aux 30208 _ = x0.Args[2] 30209 idx := x0.Args[0] 30210 p := x0.Args[1] 30211 mem := x0.Args[2] 30212 x1 := v.Args[1] 30213 if x1.Op != OpS390XMOVBZloadidx { 30214 break 30215 } 30216 i1 := x1.AuxInt 30217 if x1.Aux != s { 30218 break 30219 } 30220 _ = x1.Args[2] 30221 if idx != x1.Args[0] { 30222 break 30223 } 30224 if p != x1.Args[1] { 30225 break 30226 } 30227 if mem != x1.Args[2] { 30228 break 30229 } 30230 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)) { 30231 break 30232 } 30233 b = mergePoint(b, x0, x1) 30234 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30235 v.reset(OpCopy) 30236 v.AddArg(v0) 30237 v0.AuxInt = i0 30238 v0.Aux = s 30239 v0.AddArg(p) 30240 v0.AddArg(idx) 30241 v0.AddArg(mem) 30242 return true 30243 } 30244 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30245 // 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) 30246 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30247 for { 30248 _ = v.Args[1] 30249 x1 := v.Args[0] 30250 if x1.Op != OpS390XMOVHZloadidx { 30251 break 30252 } 30253 i1 := x1.AuxInt 30254 s := x1.Aux 30255 _ = x1.Args[2] 30256 p := x1.Args[0] 30257 idx := x1.Args[1] 30258 mem := x1.Args[2] 30259 sh := v.Args[1] 30260 if sh.Op != OpS390XSLWconst { 30261 break 30262 } 30263 if sh.AuxInt != 16 { 30264 break 30265 } 30266 x0 := sh.Args[0] 30267 if x0.Op != OpS390XMOVHZloadidx { 30268 break 30269 } 30270 i0 := x0.AuxInt 30271 if x0.Aux != s { 30272 break 30273 } 30274 _ = x0.Args[2] 30275 if p != x0.Args[0] { 30276 break 30277 } 30278 if idx != x0.Args[1] { 30279 break 30280 } 30281 if mem != x0.Args[2] { 30282 break 30283 } 30284 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)) { 30285 break 30286 } 30287 b = mergePoint(b, x0, x1) 30288 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30289 v.reset(OpCopy) 30290 v.AddArg(v0) 30291 v0.AuxInt = i0 30292 v0.Aux = s 30293 v0.AddArg(p) 30294 v0.AddArg(idx) 30295 v0.AddArg(mem) 30296 return true 30297 } 30298 return false 30299 } 30300 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 30301 b := v.Block 30302 _ = b 30303 typ := &b.Func.Config.Types 30304 _ = typ 30305 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30306 // 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) 30307 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30308 for { 30309 _ = v.Args[1] 30310 x1 := v.Args[0] 30311 if x1.Op != OpS390XMOVHZloadidx { 30312 break 30313 } 30314 i1 := x1.AuxInt 30315 s := x1.Aux 30316 _ = x1.Args[2] 30317 idx := x1.Args[0] 30318 p := x1.Args[1] 30319 mem := x1.Args[2] 30320 sh := v.Args[1] 30321 if sh.Op != OpS390XSLWconst { 30322 break 30323 } 30324 if sh.AuxInt != 16 { 30325 break 30326 } 30327 x0 := sh.Args[0] 30328 if x0.Op != OpS390XMOVHZloadidx { 30329 break 30330 } 30331 i0 := x0.AuxInt 30332 if x0.Aux != s { 30333 break 30334 } 30335 _ = x0.Args[2] 30336 if p != x0.Args[0] { 30337 break 30338 } 30339 if idx != x0.Args[1] { 30340 break 30341 } 30342 if mem != x0.Args[2] { 30343 break 30344 } 30345 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)) { 30346 break 30347 } 30348 b = mergePoint(b, x0, x1) 30349 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30350 v.reset(OpCopy) 30351 v.AddArg(v0) 30352 v0.AuxInt = i0 30353 v0.Aux = s 30354 v0.AddArg(p) 30355 v0.AddArg(idx) 30356 v0.AddArg(mem) 30357 return true 30358 } 30359 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30360 // 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) 30361 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30362 for { 30363 _ = v.Args[1] 30364 x1 := v.Args[0] 30365 if x1.Op != OpS390XMOVHZloadidx { 30366 break 30367 } 30368 i1 := x1.AuxInt 30369 s := x1.Aux 30370 _ = x1.Args[2] 30371 p := x1.Args[0] 30372 idx := x1.Args[1] 30373 mem := x1.Args[2] 30374 sh := v.Args[1] 30375 if sh.Op != OpS390XSLWconst { 30376 break 30377 } 30378 if sh.AuxInt != 16 { 30379 break 30380 } 30381 x0 := sh.Args[0] 30382 if x0.Op != OpS390XMOVHZloadidx { 30383 break 30384 } 30385 i0 := x0.AuxInt 30386 if x0.Aux != s { 30387 break 30388 } 30389 _ = x0.Args[2] 30390 if idx != x0.Args[0] { 30391 break 30392 } 30393 if p != x0.Args[1] { 30394 break 30395 } 30396 if mem != x0.Args[2] { 30397 break 30398 } 30399 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)) { 30400 break 30401 } 30402 b = mergePoint(b, x0, x1) 30403 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30404 v.reset(OpCopy) 30405 v.AddArg(v0) 30406 v0.AuxInt = i0 30407 v0.Aux = s 30408 v0.AddArg(p) 30409 v0.AddArg(idx) 30410 v0.AddArg(mem) 30411 return true 30412 } 30413 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30414 // 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) 30415 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30416 for { 30417 _ = v.Args[1] 30418 x1 := v.Args[0] 30419 if x1.Op != OpS390XMOVHZloadidx { 30420 break 30421 } 30422 i1 := x1.AuxInt 30423 s := x1.Aux 30424 _ = x1.Args[2] 30425 idx := x1.Args[0] 30426 p := x1.Args[1] 30427 mem := x1.Args[2] 30428 sh := v.Args[1] 30429 if sh.Op != OpS390XSLWconst { 30430 break 30431 } 30432 if sh.AuxInt != 16 { 30433 break 30434 } 30435 x0 := sh.Args[0] 30436 if x0.Op != OpS390XMOVHZloadidx { 30437 break 30438 } 30439 i0 := x0.AuxInt 30440 if x0.Aux != s { 30441 break 30442 } 30443 _ = x0.Args[2] 30444 if idx != x0.Args[0] { 30445 break 30446 } 30447 if p != x0.Args[1] { 30448 break 30449 } 30450 if mem != x0.Args[2] { 30451 break 30452 } 30453 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)) { 30454 break 30455 } 30456 b = mergePoint(b, x0, x1) 30457 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30458 v.reset(OpCopy) 30459 v.AddArg(v0) 30460 v0.AuxInt = i0 30461 v0.Aux = s 30462 v0.AddArg(p) 30463 v0.AddArg(idx) 30464 v0.AddArg(mem) 30465 return true 30466 } 30467 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30468 // 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) 30469 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30470 for { 30471 _ = v.Args[1] 30472 sh := v.Args[0] 30473 if sh.Op != OpS390XSLWconst { 30474 break 30475 } 30476 if sh.AuxInt != 16 { 30477 break 30478 } 30479 x0 := sh.Args[0] 30480 if x0.Op != OpS390XMOVHZloadidx { 30481 break 30482 } 30483 i0 := x0.AuxInt 30484 s := x0.Aux 30485 _ = x0.Args[2] 30486 p := x0.Args[0] 30487 idx := x0.Args[1] 30488 mem := x0.Args[2] 30489 x1 := v.Args[1] 30490 if x1.Op != OpS390XMOVHZloadidx { 30491 break 30492 } 30493 i1 := x1.AuxInt 30494 if x1.Aux != s { 30495 break 30496 } 30497 _ = x1.Args[2] 30498 if p != x1.Args[0] { 30499 break 30500 } 30501 if idx != x1.Args[1] { 30502 break 30503 } 30504 if mem != x1.Args[2] { 30505 break 30506 } 30507 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)) { 30508 break 30509 } 30510 b = mergePoint(b, x0, x1) 30511 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30512 v.reset(OpCopy) 30513 v.AddArg(v0) 30514 v0.AuxInt = i0 30515 v0.Aux = s 30516 v0.AddArg(p) 30517 v0.AddArg(idx) 30518 v0.AddArg(mem) 30519 return true 30520 } 30521 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30522 // 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) 30523 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30524 for { 30525 _ = v.Args[1] 30526 sh := v.Args[0] 30527 if sh.Op != OpS390XSLWconst { 30528 break 30529 } 30530 if sh.AuxInt != 16 { 30531 break 30532 } 30533 x0 := sh.Args[0] 30534 if x0.Op != OpS390XMOVHZloadidx { 30535 break 30536 } 30537 i0 := x0.AuxInt 30538 s := x0.Aux 30539 _ = x0.Args[2] 30540 idx := x0.Args[0] 30541 p := x0.Args[1] 30542 mem := x0.Args[2] 30543 x1 := v.Args[1] 30544 if x1.Op != OpS390XMOVHZloadidx { 30545 break 30546 } 30547 i1 := x1.AuxInt 30548 if x1.Aux != s { 30549 break 30550 } 30551 _ = x1.Args[2] 30552 if p != x1.Args[0] { 30553 break 30554 } 30555 if idx != x1.Args[1] { 30556 break 30557 } 30558 if mem != x1.Args[2] { 30559 break 30560 } 30561 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)) { 30562 break 30563 } 30564 b = mergePoint(b, x0, x1) 30565 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30566 v.reset(OpCopy) 30567 v.AddArg(v0) 30568 v0.AuxInt = i0 30569 v0.Aux = s 30570 v0.AddArg(p) 30571 v0.AddArg(idx) 30572 v0.AddArg(mem) 30573 return true 30574 } 30575 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30576 // 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) 30577 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30578 for { 30579 _ = v.Args[1] 30580 sh := v.Args[0] 30581 if sh.Op != OpS390XSLWconst { 30582 break 30583 } 30584 if sh.AuxInt != 16 { 30585 break 30586 } 30587 x0 := sh.Args[0] 30588 if x0.Op != OpS390XMOVHZloadidx { 30589 break 30590 } 30591 i0 := x0.AuxInt 30592 s := x0.Aux 30593 _ = x0.Args[2] 30594 p := x0.Args[0] 30595 idx := x0.Args[1] 30596 mem := x0.Args[2] 30597 x1 := v.Args[1] 30598 if x1.Op != OpS390XMOVHZloadidx { 30599 break 30600 } 30601 i1 := x1.AuxInt 30602 if x1.Aux != s { 30603 break 30604 } 30605 _ = x1.Args[2] 30606 if idx != x1.Args[0] { 30607 break 30608 } 30609 if p != x1.Args[1] { 30610 break 30611 } 30612 if mem != x1.Args[2] { 30613 break 30614 } 30615 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)) { 30616 break 30617 } 30618 b = mergePoint(b, x0, x1) 30619 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30620 v.reset(OpCopy) 30621 v.AddArg(v0) 30622 v0.AuxInt = i0 30623 v0.Aux = s 30624 v0.AddArg(p) 30625 v0.AddArg(idx) 30626 v0.AddArg(mem) 30627 return true 30628 } 30629 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30630 // 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) 30631 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30632 for { 30633 _ = v.Args[1] 30634 sh := v.Args[0] 30635 if sh.Op != OpS390XSLWconst { 30636 break 30637 } 30638 if sh.AuxInt != 16 { 30639 break 30640 } 30641 x0 := sh.Args[0] 30642 if x0.Op != OpS390XMOVHZloadidx { 30643 break 30644 } 30645 i0 := x0.AuxInt 30646 s := x0.Aux 30647 _ = x0.Args[2] 30648 idx := x0.Args[0] 30649 p := x0.Args[1] 30650 mem := x0.Args[2] 30651 x1 := v.Args[1] 30652 if x1.Op != OpS390XMOVHZloadidx { 30653 break 30654 } 30655 i1 := x1.AuxInt 30656 if x1.Aux != s { 30657 break 30658 } 30659 _ = x1.Args[2] 30660 if idx != x1.Args[0] { 30661 break 30662 } 30663 if p != x1.Args[1] { 30664 break 30665 } 30666 if mem != x1.Args[2] { 30667 break 30668 } 30669 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)) { 30670 break 30671 } 30672 b = mergePoint(b, x0, x1) 30673 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30674 v.reset(OpCopy) 30675 v.AddArg(v0) 30676 v0.AuxInt = i0 30677 v0.Aux = s 30678 v0.AddArg(p) 30679 v0.AddArg(idx) 30680 v0.AddArg(mem) 30681 return true 30682 } 30683 // 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)) 30684 // 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) 30685 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30686 for { 30687 _ = v.Args[1] 30688 s0 := v.Args[0] 30689 if s0.Op != OpS390XSLWconst { 30690 break 30691 } 30692 j0 := s0.AuxInt 30693 x0 := s0.Args[0] 30694 if x0.Op != OpS390XMOVBZloadidx { 30695 break 30696 } 30697 i0 := x0.AuxInt 30698 s := x0.Aux 30699 _ = x0.Args[2] 30700 p := x0.Args[0] 30701 idx := x0.Args[1] 30702 mem := x0.Args[2] 30703 or := v.Args[1] 30704 if or.Op != OpS390XORW { 30705 break 30706 } 30707 _ = or.Args[1] 30708 s1 := or.Args[0] 30709 if s1.Op != OpS390XSLWconst { 30710 break 30711 } 30712 j1 := s1.AuxInt 30713 x1 := s1.Args[0] 30714 if x1.Op != OpS390XMOVBZloadidx { 30715 break 30716 } 30717 i1 := x1.AuxInt 30718 if x1.Aux != s { 30719 break 30720 } 30721 _ = x1.Args[2] 30722 if p != x1.Args[0] { 30723 break 30724 } 30725 if idx != x1.Args[1] { 30726 break 30727 } 30728 if mem != x1.Args[2] { 30729 break 30730 } 30731 y := or.Args[1] 30732 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)) { 30733 break 30734 } 30735 b = mergePoint(b, x0, x1) 30736 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30737 v.reset(OpCopy) 30738 v.AddArg(v0) 30739 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30740 v1.AuxInt = j1 30741 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30742 v2.AuxInt = i0 30743 v2.Aux = s 30744 v2.AddArg(p) 30745 v2.AddArg(idx) 30746 v2.AddArg(mem) 30747 v1.AddArg(v2) 30748 v0.AddArg(v1) 30749 v0.AddArg(y) 30750 return true 30751 } 30752 // 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)) 30753 // 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) 30754 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30755 for { 30756 _ = v.Args[1] 30757 s0 := v.Args[0] 30758 if s0.Op != OpS390XSLWconst { 30759 break 30760 } 30761 j0 := s0.AuxInt 30762 x0 := s0.Args[0] 30763 if x0.Op != OpS390XMOVBZloadidx { 30764 break 30765 } 30766 i0 := x0.AuxInt 30767 s := x0.Aux 30768 _ = x0.Args[2] 30769 idx := x0.Args[0] 30770 p := x0.Args[1] 30771 mem := x0.Args[2] 30772 or := v.Args[1] 30773 if or.Op != OpS390XORW { 30774 break 30775 } 30776 _ = or.Args[1] 30777 s1 := or.Args[0] 30778 if s1.Op != OpS390XSLWconst { 30779 break 30780 } 30781 j1 := s1.AuxInt 30782 x1 := s1.Args[0] 30783 if x1.Op != OpS390XMOVBZloadidx { 30784 break 30785 } 30786 i1 := x1.AuxInt 30787 if x1.Aux != s { 30788 break 30789 } 30790 _ = x1.Args[2] 30791 if p != x1.Args[0] { 30792 break 30793 } 30794 if idx != x1.Args[1] { 30795 break 30796 } 30797 if mem != x1.Args[2] { 30798 break 30799 } 30800 y := or.Args[1] 30801 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)) { 30802 break 30803 } 30804 b = mergePoint(b, x0, x1) 30805 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30806 v.reset(OpCopy) 30807 v.AddArg(v0) 30808 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30809 v1.AuxInt = j1 30810 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30811 v2.AuxInt = i0 30812 v2.Aux = s 30813 v2.AddArg(p) 30814 v2.AddArg(idx) 30815 v2.AddArg(mem) 30816 v1.AddArg(v2) 30817 v0.AddArg(v1) 30818 v0.AddArg(y) 30819 return true 30820 } 30821 // 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)) 30822 // 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) 30823 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30824 for { 30825 _ = v.Args[1] 30826 s0 := v.Args[0] 30827 if s0.Op != OpS390XSLWconst { 30828 break 30829 } 30830 j0 := s0.AuxInt 30831 x0 := s0.Args[0] 30832 if x0.Op != OpS390XMOVBZloadidx { 30833 break 30834 } 30835 i0 := x0.AuxInt 30836 s := x0.Aux 30837 _ = x0.Args[2] 30838 p := x0.Args[0] 30839 idx := x0.Args[1] 30840 mem := x0.Args[2] 30841 or := v.Args[1] 30842 if or.Op != OpS390XORW { 30843 break 30844 } 30845 _ = or.Args[1] 30846 s1 := or.Args[0] 30847 if s1.Op != OpS390XSLWconst { 30848 break 30849 } 30850 j1 := s1.AuxInt 30851 x1 := s1.Args[0] 30852 if x1.Op != OpS390XMOVBZloadidx { 30853 break 30854 } 30855 i1 := x1.AuxInt 30856 if x1.Aux != s { 30857 break 30858 } 30859 _ = x1.Args[2] 30860 if idx != x1.Args[0] { 30861 break 30862 } 30863 if p != x1.Args[1] { 30864 break 30865 } 30866 if mem != x1.Args[2] { 30867 break 30868 } 30869 y := or.Args[1] 30870 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)) { 30871 break 30872 } 30873 b = mergePoint(b, x0, x1) 30874 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30875 v.reset(OpCopy) 30876 v.AddArg(v0) 30877 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30878 v1.AuxInt = j1 30879 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30880 v2.AuxInt = i0 30881 v2.Aux = s 30882 v2.AddArg(p) 30883 v2.AddArg(idx) 30884 v2.AddArg(mem) 30885 v1.AddArg(v2) 30886 v0.AddArg(v1) 30887 v0.AddArg(y) 30888 return true 30889 } 30890 return false 30891 } 30892 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 30893 b := v.Block 30894 _ = b 30895 typ := &b.Func.Config.Types 30896 _ = typ 30897 // 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)) 30898 // 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) 30899 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30900 for { 30901 _ = v.Args[1] 30902 s0 := v.Args[0] 30903 if s0.Op != OpS390XSLWconst { 30904 break 30905 } 30906 j0 := s0.AuxInt 30907 x0 := s0.Args[0] 30908 if x0.Op != OpS390XMOVBZloadidx { 30909 break 30910 } 30911 i0 := x0.AuxInt 30912 s := x0.Aux 30913 _ = x0.Args[2] 30914 idx := x0.Args[0] 30915 p := x0.Args[1] 30916 mem := x0.Args[2] 30917 or := v.Args[1] 30918 if or.Op != OpS390XORW { 30919 break 30920 } 30921 _ = or.Args[1] 30922 s1 := or.Args[0] 30923 if s1.Op != OpS390XSLWconst { 30924 break 30925 } 30926 j1 := s1.AuxInt 30927 x1 := s1.Args[0] 30928 if x1.Op != OpS390XMOVBZloadidx { 30929 break 30930 } 30931 i1 := x1.AuxInt 30932 if x1.Aux != s { 30933 break 30934 } 30935 _ = x1.Args[2] 30936 if idx != x1.Args[0] { 30937 break 30938 } 30939 if p != x1.Args[1] { 30940 break 30941 } 30942 if mem != x1.Args[2] { 30943 break 30944 } 30945 y := or.Args[1] 30946 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)) { 30947 break 30948 } 30949 b = mergePoint(b, x0, x1) 30950 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30951 v.reset(OpCopy) 30952 v.AddArg(v0) 30953 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30954 v1.AuxInt = j1 30955 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30956 v2.AuxInt = i0 30957 v2.Aux = s 30958 v2.AddArg(p) 30959 v2.AddArg(idx) 30960 v2.AddArg(mem) 30961 v1.AddArg(v2) 30962 v0.AddArg(v1) 30963 v0.AddArg(y) 30964 return true 30965 } 30966 // 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)))) 30967 // 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) 30968 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30969 for { 30970 _ = v.Args[1] 30971 s0 := v.Args[0] 30972 if s0.Op != OpS390XSLWconst { 30973 break 30974 } 30975 j0 := s0.AuxInt 30976 x0 := s0.Args[0] 30977 if x0.Op != OpS390XMOVBZloadidx { 30978 break 30979 } 30980 i0 := x0.AuxInt 30981 s := x0.Aux 30982 _ = x0.Args[2] 30983 p := x0.Args[0] 30984 idx := x0.Args[1] 30985 mem := x0.Args[2] 30986 or := v.Args[1] 30987 if or.Op != OpS390XORW { 30988 break 30989 } 30990 _ = or.Args[1] 30991 y := or.Args[0] 30992 s1 := or.Args[1] 30993 if s1.Op != OpS390XSLWconst { 30994 break 30995 } 30996 j1 := s1.AuxInt 30997 x1 := s1.Args[0] 30998 if x1.Op != OpS390XMOVBZloadidx { 30999 break 31000 } 31001 i1 := x1.AuxInt 31002 if x1.Aux != s { 31003 break 31004 } 31005 _ = x1.Args[2] 31006 if p != x1.Args[0] { 31007 break 31008 } 31009 if idx != x1.Args[1] { 31010 break 31011 } 31012 if mem != x1.Args[2] { 31013 break 31014 } 31015 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)) { 31016 break 31017 } 31018 b = mergePoint(b, x0, x1) 31019 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31020 v.reset(OpCopy) 31021 v.AddArg(v0) 31022 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31023 v1.AuxInt = j1 31024 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31025 v2.AuxInt = i0 31026 v2.Aux = s 31027 v2.AddArg(p) 31028 v2.AddArg(idx) 31029 v2.AddArg(mem) 31030 v1.AddArg(v2) 31031 v0.AddArg(v1) 31032 v0.AddArg(y) 31033 return true 31034 } 31035 // 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)))) 31036 // 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) 31037 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31038 for { 31039 _ = v.Args[1] 31040 s0 := v.Args[0] 31041 if s0.Op != OpS390XSLWconst { 31042 break 31043 } 31044 j0 := s0.AuxInt 31045 x0 := s0.Args[0] 31046 if x0.Op != OpS390XMOVBZloadidx { 31047 break 31048 } 31049 i0 := x0.AuxInt 31050 s := x0.Aux 31051 _ = x0.Args[2] 31052 idx := x0.Args[0] 31053 p := x0.Args[1] 31054 mem := x0.Args[2] 31055 or := v.Args[1] 31056 if or.Op != OpS390XORW { 31057 break 31058 } 31059 _ = or.Args[1] 31060 y := or.Args[0] 31061 s1 := or.Args[1] 31062 if s1.Op != OpS390XSLWconst { 31063 break 31064 } 31065 j1 := s1.AuxInt 31066 x1 := s1.Args[0] 31067 if x1.Op != OpS390XMOVBZloadidx { 31068 break 31069 } 31070 i1 := x1.AuxInt 31071 if x1.Aux != s { 31072 break 31073 } 31074 _ = x1.Args[2] 31075 if p != x1.Args[0] { 31076 break 31077 } 31078 if idx != x1.Args[1] { 31079 break 31080 } 31081 if mem != x1.Args[2] { 31082 break 31083 } 31084 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)) { 31085 break 31086 } 31087 b = mergePoint(b, x0, x1) 31088 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31089 v.reset(OpCopy) 31090 v.AddArg(v0) 31091 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31092 v1.AuxInt = j1 31093 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31094 v2.AuxInt = i0 31095 v2.Aux = s 31096 v2.AddArg(p) 31097 v2.AddArg(idx) 31098 v2.AddArg(mem) 31099 v1.AddArg(v2) 31100 v0.AddArg(v1) 31101 v0.AddArg(y) 31102 return true 31103 } 31104 // 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)))) 31105 // 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) 31106 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31107 for { 31108 _ = v.Args[1] 31109 s0 := v.Args[0] 31110 if s0.Op != OpS390XSLWconst { 31111 break 31112 } 31113 j0 := s0.AuxInt 31114 x0 := s0.Args[0] 31115 if x0.Op != OpS390XMOVBZloadidx { 31116 break 31117 } 31118 i0 := x0.AuxInt 31119 s := x0.Aux 31120 _ = x0.Args[2] 31121 p := x0.Args[0] 31122 idx := x0.Args[1] 31123 mem := x0.Args[2] 31124 or := v.Args[1] 31125 if or.Op != OpS390XORW { 31126 break 31127 } 31128 _ = or.Args[1] 31129 y := or.Args[0] 31130 s1 := or.Args[1] 31131 if s1.Op != OpS390XSLWconst { 31132 break 31133 } 31134 j1 := s1.AuxInt 31135 x1 := s1.Args[0] 31136 if x1.Op != OpS390XMOVBZloadidx { 31137 break 31138 } 31139 i1 := x1.AuxInt 31140 if x1.Aux != s { 31141 break 31142 } 31143 _ = x1.Args[2] 31144 if idx != x1.Args[0] { 31145 break 31146 } 31147 if p != x1.Args[1] { 31148 break 31149 } 31150 if mem != x1.Args[2] { 31151 break 31152 } 31153 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)) { 31154 break 31155 } 31156 b = mergePoint(b, x0, x1) 31157 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31158 v.reset(OpCopy) 31159 v.AddArg(v0) 31160 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31161 v1.AuxInt = j1 31162 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31163 v2.AuxInt = i0 31164 v2.Aux = s 31165 v2.AddArg(p) 31166 v2.AddArg(idx) 31167 v2.AddArg(mem) 31168 v1.AddArg(v2) 31169 v0.AddArg(v1) 31170 v0.AddArg(y) 31171 return true 31172 } 31173 // 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)))) 31174 // 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) 31175 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31176 for { 31177 _ = v.Args[1] 31178 s0 := v.Args[0] 31179 if s0.Op != OpS390XSLWconst { 31180 break 31181 } 31182 j0 := s0.AuxInt 31183 x0 := s0.Args[0] 31184 if x0.Op != OpS390XMOVBZloadidx { 31185 break 31186 } 31187 i0 := x0.AuxInt 31188 s := x0.Aux 31189 _ = x0.Args[2] 31190 idx := x0.Args[0] 31191 p := x0.Args[1] 31192 mem := x0.Args[2] 31193 or := v.Args[1] 31194 if or.Op != OpS390XORW { 31195 break 31196 } 31197 _ = or.Args[1] 31198 y := or.Args[0] 31199 s1 := or.Args[1] 31200 if s1.Op != OpS390XSLWconst { 31201 break 31202 } 31203 j1 := s1.AuxInt 31204 x1 := s1.Args[0] 31205 if x1.Op != OpS390XMOVBZloadidx { 31206 break 31207 } 31208 i1 := x1.AuxInt 31209 if x1.Aux != s { 31210 break 31211 } 31212 _ = x1.Args[2] 31213 if idx != x1.Args[0] { 31214 break 31215 } 31216 if p != x1.Args[1] { 31217 break 31218 } 31219 if mem != x1.Args[2] { 31220 break 31221 } 31222 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)) { 31223 break 31224 } 31225 b = mergePoint(b, x0, x1) 31226 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31227 v.reset(OpCopy) 31228 v.AddArg(v0) 31229 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31230 v1.AuxInt = j1 31231 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31232 v2.AuxInt = i0 31233 v2.Aux = s 31234 v2.AddArg(p) 31235 v2.AddArg(idx) 31236 v2.AddArg(mem) 31237 v1.AddArg(v2) 31238 v0.AddArg(v1) 31239 v0.AddArg(y) 31240 return true 31241 } 31242 // 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))) 31243 // 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) 31244 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31245 for { 31246 _ = v.Args[1] 31247 or := v.Args[0] 31248 if or.Op != OpS390XORW { 31249 break 31250 } 31251 _ = or.Args[1] 31252 s1 := or.Args[0] 31253 if s1.Op != OpS390XSLWconst { 31254 break 31255 } 31256 j1 := s1.AuxInt 31257 x1 := s1.Args[0] 31258 if x1.Op != OpS390XMOVBZloadidx { 31259 break 31260 } 31261 i1 := x1.AuxInt 31262 s := x1.Aux 31263 _ = x1.Args[2] 31264 p := x1.Args[0] 31265 idx := x1.Args[1] 31266 mem := x1.Args[2] 31267 y := or.Args[1] 31268 s0 := v.Args[1] 31269 if s0.Op != OpS390XSLWconst { 31270 break 31271 } 31272 j0 := s0.AuxInt 31273 x0 := s0.Args[0] 31274 if x0.Op != OpS390XMOVBZloadidx { 31275 break 31276 } 31277 i0 := x0.AuxInt 31278 if x0.Aux != s { 31279 break 31280 } 31281 _ = x0.Args[2] 31282 if p != x0.Args[0] { 31283 break 31284 } 31285 if idx != x0.Args[1] { 31286 break 31287 } 31288 if mem != x0.Args[2] { 31289 break 31290 } 31291 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)) { 31292 break 31293 } 31294 b = mergePoint(b, x0, x1) 31295 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31296 v.reset(OpCopy) 31297 v.AddArg(v0) 31298 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31299 v1.AuxInt = j1 31300 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31301 v2.AuxInt = i0 31302 v2.Aux = s 31303 v2.AddArg(p) 31304 v2.AddArg(idx) 31305 v2.AddArg(mem) 31306 v1.AddArg(v2) 31307 v0.AddArg(v1) 31308 v0.AddArg(y) 31309 return true 31310 } 31311 // 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))) 31312 // 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) 31313 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31314 for { 31315 _ = v.Args[1] 31316 or := v.Args[0] 31317 if or.Op != OpS390XORW { 31318 break 31319 } 31320 _ = or.Args[1] 31321 s1 := or.Args[0] 31322 if s1.Op != OpS390XSLWconst { 31323 break 31324 } 31325 j1 := s1.AuxInt 31326 x1 := s1.Args[0] 31327 if x1.Op != OpS390XMOVBZloadidx { 31328 break 31329 } 31330 i1 := x1.AuxInt 31331 s := x1.Aux 31332 _ = x1.Args[2] 31333 idx := x1.Args[0] 31334 p := x1.Args[1] 31335 mem := x1.Args[2] 31336 y := or.Args[1] 31337 s0 := v.Args[1] 31338 if s0.Op != OpS390XSLWconst { 31339 break 31340 } 31341 j0 := s0.AuxInt 31342 x0 := s0.Args[0] 31343 if x0.Op != OpS390XMOVBZloadidx { 31344 break 31345 } 31346 i0 := x0.AuxInt 31347 if x0.Aux != s { 31348 break 31349 } 31350 _ = x0.Args[2] 31351 if p != x0.Args[0] { 31352 break 31353 } 31354 if idx != x0.Args[1] { 31355 break 31356 } 31357 if mem != x0.Args[2] { 31358 break 31359 } 31360 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)) { 31361 break 31362 } 31363 b = mergePoint(b, x0, x1) 31364 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31365 v.reset(OpCopy) 31366 v.AddArg(v0) 31367 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31368 v1.AuxInt = j1 31369 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31370 v2.AuxInt = i0 31371 v2.Aux = s 31372 v2.AddArg(p) 31373 v2.AddArg(idx) 31374 v2.AddArg(mem) 31375 v1.AddArg(v2) 31376 v0.AddArg(v1) 31377 v0.AddArg(y) 31378 return true 31379 } 31380 // 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))) 31381 // 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) 31382 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31383 for { 31384 _ = v.Args[1] 31385 or := v.Args[0] 31386 if or.Op != OpS390XORW { 31387 break 31388 } 31389 _ = or.Args[1] 31390 y := or.Args[0] 31391 s1 := or.Args[1] 31392 if s1.Op != OpS390XSLWconst { 31393 break 31394 } 31395 j1 := s1.AuxInt 31396 x1 := s1.Args[0] 31397 if x1.Op != OpS390XMOVBZloadidx { 31398 break 31399 } 31400 i1 := x1.AuxInt 31401 s := x1.Aux 31402 _ = x1.Args[2] 31403 p := x1.Args[0] 31404 idx := x1.Args[1] 31405 mem := x1.Args[2] 31406 s0 := v.Args[1] 31407 if s0.Op != OpS390XSLWconst { 31408 break 31409 } 31410 j0 := s0.AuxInt 31411 x0 := s0.Args[0] 31412 if x0.Op != OpS390XMOVBZloadidx { 31413 break 31414 } 31415 i0 := x0.AuxInt 31416 if x0.Aux != s { 31417 break 31418 } 31419 _ = x0.Args[2] 31420 if p != x0.Args[0] { 31421 break 31422 } 31423 if idx != x0.Args[1] { 31424 break 31425 } 31426 if mem != x0.Args[2] { 31427 break 31428 } 31429 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)) { 31430 break 31431 } 31432 b = mergePoint(b, x0, x1) 31433 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31434 v.reset(OpCopy) 31435 v.AddArg(v0) 31436 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31437 v1.AuxInt = j1 31438 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31439 v2.AuxInt = i0 31440 v2.Aux = s 31441 v2.AddArg(p) 31442 v2.AddArg(idx) 31443 v2.AddArg(mem) 31444 v1.AddArg(v2) 31445 v0.AddArg(v1) 31446 v0.AddArg(y) 31447 return true 31448 } 31449 // 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))) 31450 // 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) 31451 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31452 for { 31453 _ = v.Args[1] 31454 or := v.Args[0] 31455 if or.Op != OpS390XORW { 31456 break 31457 } 31458 _ = or.Args[1] 31459 y := or.Args[0] 31460 s1 := or.Args[1] 31461 if s1.Op != OpS390XSLWconst { 31462 break 31463 } 31464 j1 := s1.AuxInt 31465 x1 := s1.Args[0] 31466 if x1.Op != OpS390XMOVBZloadidx { 31467 break 31468 } 31469 i1 := x1.AuxInt 31470 s := x1.Aux 31471 _ = x1.Args[2] 31472 idx := x1.Args[0] 31473 p := x1.Args[1] 31474 mem := x1.Args[2] 31475 s0 := v.Args[1] 31476 if s0.Op != OpS390XSLWconst { 31477 break 31478 } 31479 j0 := s0.AuxInt 31480 x0 := s0.Args[0] 31481 if x0.Op != OpS390XMOVBZloadidx { 31482 break 31483 } 31484 i0 := x0.AuxInt 31485 if x0.Aux != s { 31486 break 31487 } 31488 _ = x0.Args[2] 31489 if p != x0.Args[0] { 31490 break 31491 } 31492 if idx != x0.Args[1] { 31493 break 31494 } 31495 if mem != x0.Args[2] { 31496 break 31497 } 31498 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)) { 31499 break 31500 } 31501 b = mergePoint(b, x0, x1) 31502 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31503 v.reset(OpCopy) 31504 v.AddArg(v0) 31505 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31506 v1.AuxInt = j1 31507 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31508 v2.AuxInt = i0 31509 v2.Aux = s 31510 v2.AddArg(p) 31511 v2.AddArg(idx) 31512 v2.AddArg(mem) 31513 v1.AddArg(v2) 31514 v0.AddArg(v1) 31515 v0.AddArg(y) 31516 return true 31517 } 31518 // 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))) 31519 // 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) 31520 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31521 for { 31522 _ = v.Args[1] 31523 or := v.Args[0] 31524 if or.Op != OpS390XORW { 31525 break 31526 } 31527 _ = or.Args[1] 31528 s1 := or.Args[0] 31529 if s1.Op != OpS390XSLWconst { 31530 break 31531 } 31532 j1 := s1.AuxInt 31533 x1 := s1.Args[0] 31534 if x1.Op != OpS390XMOVBZloadidx { 31535 break 31536 } 31537 i1 := x1.AuxInt 31538 s := x1.Aux 31539 _ = x1.Args[2] 31540 p := x1.Args[0] 31541 idx := x1.Args[1] 31542 mem := x1.Args[2] 31543 y := or.Args[1] 31544 s0 := v.Args[1] 31545 if s0.Op != OpS390XSLWconst { 31546 break 31547 } 31548 j0 := s0.AuxInt 31549 x0 := s0.Args[0] 31550 if x0.Op != OpS390XMOVBZloadidx { 31551 break 31552 } 31553 i0 := x0.AuxInt 31554 if x0.Aux != s { 31555 break 31556 } 31557 _ = x0.Args[2] 31558 if idx != x0.Args[0] { 31559 break 31560 } 31561 if p != x0.Args[1] { 31562 break 31563 } 31564 if mem != x0.Args[2] { 31565 break 31566 } 31567 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)) { 31568 break 31569 } 31570 b = mergePoint(b, x0, x1) 31571 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31572 v.reset(OpCopy) 31573 v.AddArg(v0) 31574 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31575 v1.AuxInt = j1 31576 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31577 v2.AuxInt = i0 31578 v2.Aux = s 31579 v2.AddArg(p) 31580 v2.AddArg(idx) 31581 v2.AddArg(mem) 31582 v1.AddArg(v2) 31583 v0.AddArg(v1) 31584 v0.AddArg(y) 31585 return true 31586 } 31587 return false 31588 } 31589 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 31590 b := v.Block 31591 _ = b 31592 typ := &b.Func.Config.Types 31593 _ = typ 31594 // 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))) 31595 // 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) 31596 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31597 for { 31598 _ = v.Args[1] 31599 or := v.Args[0] 31600 if or.Op != OpS390XORW { 31601 break 31602 } 31603 _ = or.Args[1] 31604 s1 := or.Args[0] 31605 if s1.Op != OpS390XSLWconst { 31606 break 31607 } 31608 j1 := s1.AuxInt 31609 x1 := s1.Args[0] 31610 if x1.Op != OpS390XMOVBZloadidx { 31611 break 31612 } 31613 i1 := x1.AuxInt 31614 s := x1.Aux 31615 _ = x1.Args[2] 31616 idx := x1.Args[0] 31617 p := x1.Args[1] 31618 mem := x1.Args[2] 31619 y := or.Args[1] 31620 s0 := v.Args[1] 31621 if s0.Op != OpS390XSLWconst { 31622 break 31623 } 31624 j0 := s0.AuxInt 31625 x0 := s0.Args[0] 31626 if x0.Op != OpS390XMOVBZloadidx { 31627 break 31628 } 31629 i0 := x0.AuxInt 31630 if x0.Aux != s { 31631 break 31632 } 31633 _ = x0.Args[2] 31634 if idx != x0.Args[0] { 31635 break 31636 } 31637 if p != x0.Args[1] { 31638 break 31639 } 31640 if mem != x0.Args[2] { 31641 break 31642 } 31643 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)) { 31644 break 31645 } 31646 b = mergePoint(b, x0, x1) 31647 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31648 v.reset(OpCopy) 31649 v.AddArg(v0) 31650 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31651 v1.AuxInt = j1 31652 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31653 v2.AuxInt = i0 31654 v2.Aux = s 31655 v2.AddArg(p) 31656 v2.AddArg(idx) 31657 v2.AddArg(mem) 31658 v1.AddArg(v2) 31659 v0.AddArg(v1) 31660 v0.AddArg(y) 31661 return true 31662 } 31663 // 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))) 31664 // 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) 31665 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31666 for { 31667 _ = v.Args[1] 31668 or := v.Args[0] 31669 if or.Op != OpS390XORW { 31670 break 31671 } 31672 _ = or.Args[1] 31673 y := or.Args[0] 31674 s1 := or.Args[1] 31675 if s1.Op != OpS390XSLWconst { 31676 break 31677 } 31678 j1 := s1.AuxInt 31679 x1 := s1.Args[0] 31680 if x1.Op != OpS390XMOVBZloadidx { 31681 break 31682 } 31683 i1 := x1.AuxInt 31684 s := x1.Aux 31685 _ = x1.Args[2] 31686 p := x1.Args[0] 31687 idx := x1.Args[1] 31688 mem := x1.Args[2] 31689 s0 := v.Args[1] 31690 if s0.Op != OpS390XSLWconst { 31691 break 31692 } 31693 j0 := s0.AuxInt 31694 x0 := s0.Args[0] 31695 if x0.Op != OpS390XMOVBZloadidx { 31696 break 31697 } 31698 i0 := x0.AuxInt 31699 if x0.Aux != s { 31700 break 31701 } 31702 _ = x0.Args[2] 31703 if idx != x0.Args[0] { 31704 break 31705 } 31706 if p != x0.Args[1] { 31707 break 31708 } 31709 if mem != x0.Args[2] { 31710 break 31711 } 31712 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)) { 31713 break 31714 } 31715 b = mergePoint(b, x0, x1) 31716 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31717 v.reset(OpCopy) 31718 v.AddArg(v0) 31719 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31720 v1.AuxInt = j1 31721 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31722 v2.AuxInt = i0 31723 v2.Aux = s 31724 v2.AddArg(p) 31725 v2.AddArg(idx) 31726 v2.AddArg(mem) 31727 v1.AddArg(v2) 31728 v0.AddArg(v1) 31729 v0.AddArg(y) 31730 return true 31731 } 31732 // 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))) 31733 // 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) 31734 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31735 for { 31736 _ = v.Args[1] 31737 or := v.Args[0] 31738 if or.Op != OpS390XORW { 31739 break 31740 } 31741 _ = or.Args[1] 31742 y := or.Args[0] 31743 s1 := or.Args[1] 31744 if s1.Op != OpS390XSLWconst { 31745 break 31746 } 31747 j1 := s1.AuxInt 31748 x1 := s1.Args[0] 31749 if x1.Op != OpS390XMOVBZloadidx { 31750 break 31751 } 31752 i1 := x1.AuxInt 31753 s := x1.Aux 31754 _ = x1.Args[2] 31755 idx := x1.Args[0] 31756 p := x1.Args[1] 31757 mem := x1.Args[2] 31758 s0 := v.Args[1] 31759 if s0.Op != OpS390XSLWconst { 31760 break 31761 } 31762 j0 := s0.AuxInt 31763 x0 := s0.Args[0] 31764 if x0.Op != OpS390XMOVBZloadidx { 31765 break 31766 } 31767 i0 := x0.AuxInt 31768 if x0.Aux != s { 31769 break 31770 } 31771 _ = x0.Args[2] 31772 if idx != x0.Args[0] { 31773 break 31774 } 31775 if p != x0.Args[1] { 31776 break 31777 } 31778 if mem != x0.Args[2] { 31779 break 31780 } 31781 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)) { 31782 break 31783 } 31784 b = mergePoint(b, x0, x1) 31785 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31786 v.reset(OpCopy) 31787 v.AddArg(v0) 31788 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31789 v1.AuxInt = j1 31790 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31791 v2.AuxInt = i0 31792 v2.Aux = s 31793 v2.AddArg(p) 31794 v2.AddArg(idx) 31795 v2.AddArg(mem) 31796 v1.AddArg(v2) 31797 v0.AddArg(v1) 31798 v0.AddArg(y) 31799 return true 31800 } 31801 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 31802 // 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) 31803 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31804 for { 31805 _ = v.Args[1] 31806 x0 := v.Args[0] 31807 if x0.Op != OpS390XMOVBZload { 31808 break 31809 } 31810 i0 := x0.AuxInt 31811 s := x0.Aux 31812 _ = x0.Args[1] 31813 p := x0.Args[0] 31814 mem := x0.Args[1] 31815 sh := v.Args[1] 31816 if sh.Op != OpS390XSLWconst { 31817 break 31818 } 31819 if sh.AuxInt != 8 { 31820 break 31821 } 31822 x1 := sh.Args[0] 31823 if x1.Op != OpS390XMOVBZload { 31824 break 31825 } 31826 i1 := x1.AuxInt 31827 if x1.Aux != s { 31828 break 31829 } 31830 _ = x1.Args[1] 31831 if p != x1.Args[0] { 31832 break 31833 } 31834 if mem != x1.Args[1] { 31835 break 31836 } 31837 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)) { 31838 break 31839 } 31840 b = mergePoint(b, x0, x1) 31841 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31842 v.reset(OpCopy) 31843 v.AddArg(v0) 31844 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31845 v1.AuxInt = i0 31846 v1.Aux = s 31847 v1.AddArg(p) 31848 v1.AddArg(mem) 31849 v0.AddArg(v1) 31850 return true 31851 } 31852 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 31853 // 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) 31854 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31855 for { 31856 _ = v.Args[1] 31857 sh := v.Args[0] 31858 if sh.Op != OpS390XSLWconst { 31859 break 31860 } 31861 if sh.AuxInt != 8 { 31862 break 31863 } 31864 x1 := sh.Args[0] 31865 if x1.Op != OpS390XMOVBZload { 31866 break 31867 } 31868 i1 := x1.AuxInt 31869 s := x1.Aux 31870 _ = x1.Args[1] 31871 p := x1.Args[0] 31872 mem := x1.Args[1] 31873 x0 := v.Args[1] 31874 if x0.Op != OpS390XMOVBZload { 31875 break 31876 } 31877 i0 := x0.AuxInt 31878 if x0.Aux != s { 31879 break 31880 } 31881 _ = x0.Args[1] 31882 if p != x0.Args[0] { 31883 break 31884 } 31885 if mem != x0.Args[1] { 31886 break 31887 } 31888 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)) { 31889 break 31890 } 31891 b = mergePoint(b, x0, x1) 31892 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31893 v.reset(OpCopy) 31894 v.AddArg(v0) 31895 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31896 v1.AuxInt = i0 31897 v1.Aux = s 31898 v1.AddArg(p) 31899 v1.AddArg(mem) 31900 v0.AddArg(v1) 31901 return true 31902 } 31903 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 31904 // 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) 31905 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31906 for { 31907 _ = v.Args[1] 31908 r0 := v.Args[0] 31909 if r0.Op != OpS390XMOVHZreg { 31910 break 31911 } 31912 x0 := r0.Args[0] 31913 if x0.Op != OpS390XMOVHBRload { 31914 break 31915 } 31916 i0 := x0.AuxInt 31917 s := x0.Aux 31918 _ = x0.Args[1] 31919 p := x0.Args[0] 31920 mem := x0.Args[1] 31921 sh := v.Args[1] 31922 if sh.Op != OpS390XSLWconst { 31923 break 31924 } 31925 if sh.AuxInt != 16 { 31926 break 31927 } 31928 r1 := sh.Args[0] 31929 if r1.Op != OpS390XMOVHZreg { 31930 break 31931 } 31932 x1 := r1.Args[0] 31933 if x1.Op != OpS390XMOVHBRload { 31934 break 31935 } 31936 i1 := x1.AuxInt 31937 if x1.Aux != s { 31938 break 31939 } 31940 _ = x1.Args[1] 31941 if p != x1.Args[0] { 31942 break 31943 } 31944 if mem != x1.Args[1] { 31945 break 31946 } 31947 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)) { 31948 break 31949 } 31950 b = mergePoint(b, x0, x1) 31951 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 31952 v.reset(OpCopy) 31953 v.AddArg(v0) 31954 v0.AuxInt = i0 31955 v0.Aux = s 31956 v0.AddArg(p) 31957 v0.AddArg(mem) 31958 return true 31959 } 31960 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 31961 // 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) 31962 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31963 for { 31964 _ = v.Args[1] 31965 sh := v.Args[0] 31966 if sh.Op != OpS390XSLWconst { 31967 break 31968 } 31969 if sh.AuxInt != 16 { 31970 break 31971 } 31972 r1 := sh.Args[0] 31973 if r1.Op != OpS390XMOVHZreg { 31974 break 31975 } 31976 x1 := r1.Args[0] 31977 if x1.Op != OpS390XMOVHBRload { 31978 break 31979 } 31980 i1 := x1.AuxInt 31981 s := x1.Aux 31982 _ = x1.Args[1] 31983 p := x1.Args[0] 31984 mem := x1.Args[1] 31985 r0 := v.Args[1] 31986 if r0.Op != OpS390XMOVHZreg { 31987 break 31988 } 31989 x0 := r0.Args[0] 31990 if x0.Op != OpS390XMOVHBRload { 31991 break 31992 } 31993 i0 := x0.AuxInt 31994 if x0.Aux != s { 31995 break 31996 } 31997 _ = x0.Args[1] 31998 if p != x0.Args[0] { 31999 break 32000 } 32001 if mem != x0.Args[1] { 32002 break 32003 } 32004 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)) { 32005 break 32006 } 32007 b = mergePoint(b, x0, x1) 32008 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 32009 v.reset(OpCopy) 32010 v.AddArg(v0) 32011 v0.AuxInt = i0 32012 v0.Aux = s 32013 v0.AddArg(p) 32014 v0.AddArg(mem) 32015 return true 32016 } 32017 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 32018 // 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) 32019 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32020 for { 32021 _ = v.Args[1] 32022 s1 := v.Args[0] 32023 if s1.Op != OpS390XSLWconst { 32024 break 32025 } 32026 j1 := s1.AuxInt 32027 x1 := s1.Args[0] 32028 if x1.Op != OpS390XMOVBZload { 32029 break 32030 } 32031 i1 := x1.AuxInt 32032 s := x1.Aux 32033 _ = x1.Args[1] 32034 p := x1.Args[0] 32035 mem := x1.Args[1] 32036 or := v.Args[1] 32037 if or.Op != OpS390XORW { 32038 break 32039 } 32040 _ = or.Args[1] 32041 s0 := or.Args[0] 32042 if s0.Op != OpS390XSLWconst { 32043 break 32044 } 32045 j0 := s0.AuxInt 32046 x0 := s0.Args[0] 32047 if x0.Op != OpS390XMOVBZload { 32048 break 32049 } 32050 i0 := x0.AuxInt 32051 if x0.Aux != s { 32052 break 32053 } 32054 _ = x0.Args[1] 32055 if p != x0.Args[0] { 32056 break 32057 } 32058 if mem != x0.Args[1] { 32059 break 32060 } 32061 y := or.Args[1] 32062 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)) { 32063 break 32064 } 32065 b = mergePoint(b, x0, x1) 32066 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32067 v.reset(OpCopy) 32068 v.AddArg(v0) 32069 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32070 v1.AuxInt = j0 32071 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32072 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32073 v3.AuxInt = i0 32074 v3.Aux = s 32075 v3.AddArg(p) 32076 v3.AddArg(mem) 32077 v2.AddArg(v3) 32078 v1.AddArg(v2) 32079 v0.AddArg(v1) 32080 v0.AddArg(y) 32081 return true 32082 } 32083 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 32084 // 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) 32085 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32086 for { 32087 _ = v.Args[1] 32088 s1 := v.Args[0] 32089 if s1.Op != OpS390XSLWconst { 32090 break 32091 } 32092 j1 := s1.AuxInt 32093 x1 := s1.Args[0] 32094 if x1.Op != OpS390XMOVBZload { 32095 break 32096 } 32097 i1 := x1.AuxInt 32098 s := x1.Aux 32099 _ = x1.Args[1] 32100 p := x1.Args[0] 32101 mem := x1.Args[1] 32102 or := v.Args[1] 32103 if or.Op != OpS390XORW { 32104 break 32105 } 32106 _ = or.Args[1] 32107 y := or.Args[0] 32108 s0 := or.Args[1] 32109 if s0.Op != OpS390XSLWconst { 32110 break 32111 } 32112 j0 := s0.AuxInt 32113 x0 := s0.Args[0] 32114 if x0.Op != OpS390XMOVBZload { 32115 break 32116 } 32117 i0 := x0.AuxInt 32118 if x0.Aux != s { 32119 break 32120 } 32121 _ = x0.Args[1] 32122 if p != x0.Args[0] { 32123 break 32124 } 32125 if mem != x0.Args[1] { 32126 break 32127 } 32128 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)) { 32129 break 32130 } 32131 b = mergePoint(b, x0, x1) 32132 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32133 v.reset(OpCopy) 32134 v.AddArg(v0) 32135 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32136 v1.AuxInt = j0 32137 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32138 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32139 v3.AuxInt = i0 32140 v3.Aux = s 32141 v3.AddArg(p) 32142 v3.AddArg(mem) 32143 v2.AddArg(v3) 32144 v1.AddArg(v2) 32145 v0.AddArg(v1) 32146 v0.AddArg(y) 32147 return true 32148 } 32149 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32150 // 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) 32151 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32152 for { 32153 _ = v.Args[1] 32154 or := v.Args[0] 32155 if or.Op != OpS390XORW { 32156 break 32157 } 32158 _ = or.Args[1] 32159 s0 := or.Args[0] 32160 if s0.Op != OpS390XSLWconst { 32161 break 32162 } 32163 j0 := s0.AuxInt 32164 x0 := s0.Args[0] 32165 if x0.Op != OpS390XMOVBZload { 32166 break 32167 } 32168 i0 := x0.AuxInt 32169 s := x0.Aux 32170 _ = x0.Args[1] 32171 p := x0.Args[0] 32172 mem := x0.Args[1] 32173 y := or.Args[1] 32174 s1 := v.Args[1] 32175 if s1.Op != OpS390XSLWconst { 32176 break 32177 } 32178 j1 := s1.AuxInt 32179 x1 := s1.Args[0] 32180 if x1.Op != OpS390XMOVBZload { 32181 break 32182 } 32183 i1 := x1.AuxInt 32184 if x1.Aux != s { 32185 break 32186 } 32187 _ = x1.Args[1] 32188 if p != x1.Args[0] { 32189 break 32190 } 32191 if mem != x1.Args[1] { 32192 break 32193 } 32194 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)) { 32195 break 32196 } 32197 b = mergePoint(b, x0, x1) 32198 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32199 v.reset(OpCopy) 32200 v.AddArg(v0) 32201 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32202 v1.AuxInt = j0 32203 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32204 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32205 v3.AuxInt = i0 32206 v3.Aux = s 32207 v3.AddArg(p) 32208 v3.AddArg(mem) 32209 v2.AddArg(v3) 32210 v1.AddArg(v2) 32211 v0.AddArg(v1) 32212 v0.AddArg(y) 32213 return true 32214 } 32215 return false 32216 } 32217 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 32218 b := v.Block 32219 _ = b 32220 typ := &b.Func.Config.Types 32221 _ = typ 32222 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32223 // 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) 32224 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32225 for { 32226 _ = v.Args[1] 32227 or := v.Args[0] 32228 if or.Op != OpS390XORW { 32229 break 32230 } 32231 _ = or.Args[1] 32232 y := or.Args[0] 32233 s0 := or.Args[1] 32234 if s0.Op != OpS390XSLWconst { 32235 break 32236 } 32237 j0 := s0.AuxInt 32238 x0 := s0.Args[0] 32239 if x0.Op != OpS390XMOVBZload { 32240 break 32241 } 32242 i0 := x0.AuxInt 32243 s := x0.Aux 32244 _ = x0.Args[1] 32245 p := x0.Args[0] 32246 mem := x0.Args[1] 32247 s1 := v.Args[1] 32248 if s1.Op != OpS390XSLWconst { 32249 break 32250 } 32251 j1 := s1.AuxInt 32252 x1 := s1.Args[0] 32253 if x1.Op != OpS390XMOVBZload { 32254 break 32255 } 32256 i1 := x1.AuxInt 32257 if x1.Aux != s { 32258 break 32259 } 32260 _ = x1.Args[1] 32261 if p != x1.Args[0] { 32262 break 32263 } 32264 if mem != x1.Args[1] { 32265 break 32266 } 32267 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)) { 32268 break 32269 } 32270 b = mergePoint(b, x0, x1) 32271 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32272 v.reset(OpCopy) 32273 v.AddArg(v0) 32274 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32275 v1.AuxInt = j0 32276 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32277 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32278 v3.AuxInt = i0 32279 v3.Aux = s 32280 v3.AddArg(p) 32281 v3.AddArg(mem) 32282 v2.AddArg(v3) 32283 v1.AddArg(v2) 32284 v0.AddArg(v1) 32285 v0.AddArg(y) 32286 return true 32287 } 32288 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32289 // 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) 32290 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32291 for { 32292 _ = v.Args[1] 32293 x0 := v.Args[0] 32294 if x0.Op != OpS390XMOVBZloadidx { 32295 break 32296 } 32297 i0 := x0.AuxInt 32298 s := x0.Aux 32299 _ = x0.Args[2] 32300 p := x0.Args[0] 32301 idx := x0.Args[1] 32302 mem := x0.Args[2] 32303 sh := v.Args[1] 32304 if sh.Op != OpS390XSLWconst { 32305 break 32306 } 32307 if sh.AuxInt != 8 { 32308 break 32309 } 32310 x1 := sh.Args[0] 32311 if x1.Op != OpS390XMOVBZloadidx { 32312 break 32313 } 32314 i1 := x1.AuxInt 32315 if x1.Aux != s { 32316 break 32317 } 32318 _ = x1.Args[2] 32319 if p != x1.Args[0] { 32320 break 32321 } 32322 if idx != x1.Args[1] { 32323 break 32324 } 32325 if mem != x1.Args[2] { 32326 break 32327 } 32328 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)) { 32329 break 32330 } 32331 b = mergePoint(b, x0, x1) 32332 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32333 v.reset(OpCopy) 32334 v.AddArg(v0) 32335 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32336 v1.AuxInt = i0 32337 v1.Aux = s 32338 v1.AddArg(p) 32339 v1.AddArg(idx) 32340 v1.AddArg(mem) 32341 v0.AddArg(v1) 32342 return true 32343 } 32344 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32345 // 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) 32346 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32347 for { 32348 _ = v.Args[1] 32349 x0 := v.Args[0] 32350 if x0.Op != OpS390XMOVBZloadidx { 32351 break 32352 } 32353 i0 := x0.AuxInt 32354 s := x0.Aux 32355 _ = x0.Args[2] 32356 idx := x0.Args[0] 32357 p := x0.Args[1] 32358 mem := x0.Args[2] 32359 sh := v.Args[1] 32360 if sh.Op != OpS390XSLWconst { 32361 break 32362 } 32363 if sh.AuxInt != 8 { 32364 break 32365 } 32366 x1 := sh.Args[0] 32367 if x1.Op != OpS390XMOVBZloadidx { 32368 break 32369 } 32370 i1 := x1.AuxInt 32371 if x1.Aux != s { 32372 break 32373 } 32374 _ = x1.Args[2] 32375 if p != x1.Args[0] { 32376 break 32377 } 32378 if idx != x1.Args[1] { 32379 break 32380 } 32381 if mem != x1.Args[2] { 32382 break 32383 } 32384 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)) { 32385 break 32386 } 32387 b = mergePoint(b, x0, x1) 32388 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32389 v.reset(OpCopy) 32390 v.AddArg(v0) 32391 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32392 v1.AuxInt = i0 32393 v1.Aux = s 32394 v1.AddArg(p) 32395 v1.AddArg(idx) 32396 v1.AddArg(mem) 32397 v0.AddArg(v1) 32398 return true 32399 } 32400 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32401 // 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) 32402 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32403 for { 32404 _ = v.Args[1] 32405 x0 := v.Args[0] 32406 if x0.Op != OpS390XMOVBZloadidx { 32407 break 32408 } 32409 i0 := x0.AuxInt 32410 s := x0.Aux 32411 _ = x0.Args[2] 32412 p := x0.Args[0] 32413 idx := x0.Args[1] 32414 mem := x0.Args[2] 32415 sh := v.Args[1] 32416 if sh.Op != OpS390XSLWconst { 32417 break 32418 } 32419 if sh.AuxInt != 8 { 32420 break 32421 } 32422 x1 := sh.Args[0] 32423 if x1.Op != OpS390XMOVBZloadidx { 32424 break 32425 } 32426 i1 := x1.AuxInt 32427 if x1.Aux != s { 32428 break 32429 } 32430 _ = x1.Args[2] 32431 if idx != x1.Args[0] { 32432 break 32433 } 32434 if p != x1.Args[1] { 32435 break 32436 } 32437 if mem != x1.Args[2] { 32438 break 32439 } 32440 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)) { 32441 break 32442 } 32443 b = mergePoint(b, x0, x1) 32444 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32445 v.reset(OpCopy) 32446 v.AddArg(v0) 32447 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32448 v1.AuxInt = i0 32449 v1.Aux = s 32450 v1.AddArg(p) 32451 v1.AddArg(idx) 32452 v1.AddArg(mem) 32453 v0.AddArg(v1) 32454 return true 32455 } 32456 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32457 // 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) 32458 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32459 for { 32460 _ = v.Args[1] 32461 x0 := v.Args[0] 32462 if x0.Op != OpS390XMOVBZloadidx { 32463 break 32464 } 32465 i0 := x0.AuxInt 32466 s := x0.Aux 32467 _ = x0.Args[2] 32468 idx := x0.Args[0] 32469 p := x0.Args[1] 32470 mem := x0.Args[2] 32471 sh := v.Args[1] 32472 if sh.Op != OpS390XSLWconst { 32473 break 32474 } 32475 if sh.AuxInt != 8 { 32476 break 32477 } 32478 x1 := sh.Args[0] 32479 if x1.Op != OpS390XMOVBZloadidx { 32480 break 32481 } 32482 i1 := x1.AuxInt 32483 if x1.Aux != s { 32484 break 32485 } 32486 _ = x1.Args[2] 32487 if idx != x1.Args[0] { 32488 break 32489 } 32490 if p != x1.Args[1] { 32491 break 32492 } 32493 if mem != x1.Args[2] { 32494 break 32495 } 32496 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)) { 32497 break 32498 } 32499 b = mergePoint(b, x0, x1) 32500 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32501 v.reset(OpCopy) 32502 v.AddArg(v0) 32503 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32504 v1.AuxInt = i0 32505 v1.Aux = s 32506 v1.AddArg(p) 32507 v1.AddArg(idx) 32508 v1.AddArg(mem) 32509 v0.AddArg(v1) 32510 return true 32511 } 32512 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32513 // 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) 32514 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32515 for { 32516 _ = v.Args[1] 32517 sh := v.Args[0] 32518 if sh.Op != OpS390XSLWconst { 32519 break 32520 } 32521 if sh.AuxInt != 8 { 32522 break 32523 } 32524 x1 := sh.Args[0] 32525 if x1.Op != OpS390XMOVBZloadidx { 32526 break 32527 } 32528 i1 := x1.AuxInt 32529 s := x1.Aux 32530 _ = x1.Args[2] 32531 p := x1.Args[0] 32532 idx := x1.Args[1] 32533 mem := x1.Args[2] 32534 x0 := v.Args[1] 32535 if x0.Op != OpS390XMOVBZloadidx { 32536 break 32537 } 32538 i0 := x0.AuxInt 32539 if x0.Aux != s { 32540 break 32541 } 32542 _ = x0.Args[2] 32543 if p != x0.Args[0] { 32544 break 32545 } 32546 if idx != x0.Args[1] { 32547 break 32548 } 32549 if mem != x0.Args[2] { 32550 break 32551 } 32552 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)) { 32553 break 32554 } 32555 b = mergePoint(b, x0, x1) 32556 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32557 v.reset(OpCopy) 32558 v.AddArg(v0) 32559 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32560 v1.AuxInt = i0 32561 v1.Aux = s 32562 v1.AddArg(p) 32563 v1.AddArg(idx) 32564 v1.AddArg(mem) 32565 v0.AddArg(v1) 32566 return true 32567 } 32568 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32569 // 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) 32570 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32571 for { 32572 _ = v.Args[1] 32573 sh := v.Args[0] 32574 if sh.Op != OpS390XSLWconst { 32575 break 32576 } 32577 if sh.AuxInt != 8 { 32578 break 32579 } 32580 x1 := sh.Args[0] 32581 if x1.Op != OpS390XMOVBZloadidx { 32582 break 32583 } 32584 i1 := x1.AuxInt 32585 s := x1.Aux 32586 _ = x1.Args[2] 32587 idx := x1.Args[0] 32588 p := x1.Args[1] 32589 mem := x1.Args[2] 32590 x0 := v.Args[1] 32591 if x0.Op != OpS390XMOVBZloadidx { 32592 break 32593 } 32594 i0 := x0.AuxInt 32595 if x0.Aux != s { 32596 break 32597 } 32598 _ = x0.Args[2] 32599 if p != x0.Args[0] { 32600 break 32601 } 32602 if idx != x0.Args[1] { 32603 break 32604 } 32605 if mem != x0.Args[2] { 32606 break 32607 } 32608 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)) { 32609 break 32610 } 32611 b = mergePoint(b, x0, x1) 32612 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32613 v.reset(OpCopy) 32614 v.AddArg(v0) 32615 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32616 v1.AuxInt = i0 32617 v1.Aux = s 32618 v1.AddArg(p) 32619 v1.AddArg(idx) 32620 v1.AddArg(mem) 32621 v0.AddArg(v1) 32622 return true 32623 } 32624 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32625 // 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) 32626 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32627 for { 32628 _ = v.Args[1] 32629 sh := v.Args[0] 32630 if sh.Op != OpS390XSLWconst { 32631 break 32632 } 32633 if sh.AuxInt != 8 { 32634 break 32635 } 32636 x1 := sh.Args[0] 32637 if x1.Op != OpS390XMOVBZloadidx { 32638 break 32639 } 32640 i1 := x1.AuxInt 32641 s := x1.Aux 32642 _ = x1.Args[2] 32643 p := x1.Args[0] 32644 idx := x1.Args[1] 32645 mem := x1.Args[2] 32646 x0 := v.Args[1] 32647 if x0.Op != OpS390XMOVBZloadidx { 32648 break 32649 } 32650 i0 := x0.AuxInt 32651 if x0.Aux != s { 32652 break 32653 } 32654 _ = x0.Args[2] 32655 if idx != x0.Args[0] { 32656 break 32657 } 32658 if p != x0.Args[1] { 32659 break 32660 } 32661 if mem != x0.Args[2] { 32662 break 32663 } 32664 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)) { 32665 break 32666 } 32667 b = mergePoint(b, x0, x1) 32668 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32669 v.reset(OpCopy) 32670 v.AddArg(v0) 32671 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32672 v1.AuxInt = i0 32673 v1.Aux = s 32674 v1.AddArg(p) 32675 v1.AddArg(idx) 32676 v1.AddArg(mem) 32677 v0.AddArg(v1) 32678 return true 32679 } 32680 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32681 // 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) 32682 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32683 for { 32684 _ = v.Args[1] 32685 sh := v.Args[0] 32686 if sh.Op != OpS390XSLWconst { 32687 break 32688 } 32689 if sh.AuxInt != 8 { 32690 break 32691 } 32692 x1 := sh.Args[0] 32693 if x1.Op != OpS390XMOVBZloadidx { 32694 break 32695 } 32696 i1 := x1.AuxInt 32697 s := x1.Aux 32698 _ = x1.Args[2] 32699 idx := x1.Args[0] 32700 p := x1.Args[1] 32701 mem := x1.Args[2] 32702 x0 := v.Args[1] 32703 if x0.Op != OpS390XMOVBZloadidx { 32704 break 32705 } 32706 i0 := x0.AuxInt 32707 if x0.Aux != s { 32708 break 32709 } 32710 _ = x0.Args[2] 32711 if idx != x0.Args[0] { 32712 break 32713 } 32714 if p != x0.Args[1] { 32715 break 32716 } 32717 if mem != x0.Args[2] { 32718 break 32719 } 32720 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)) { 32721 break 32722 } 32723 b = mergePoint(b, x0, x1) 32724 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32725 v.reset(OpCopy) 32726 v.AddArg(v0) 32727 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32728 v1.AuxInt = i0 32729 v1.Aux = s 32730 v1.AddArg(p) 32731 v1.AddArg(idx) 32732 v1.AddArg(mem) 32733 v0.AddArg(v1) 32734 return true 32735 } 32736 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32737 // 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) 32738 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32739 for { 32740 _ = v.Args[1] 32741 r0 := v.Args[0] 32742 if r0.Op != OpS390XMOVHZreg { 32743 break 32744 } 32745 x0 := r0.Args[0] 32746 if x0.Op != OpS390XMOVHBRloadidx { 32747 break 32748 } 32749 i0 := x0.AuxInt 32750 s := x0.Aux 32751 _ = x0.Args[2] 32752 p := x0.Args[0] 32753 idx := x0.Args[1] 32754 mem := x0.Args[2] 32755 sh := v.Args[1] 32756 if sh.Op != OpS390XSLWconst { 32757 break 32758 } 32759 if sh.AuxInt != 16 { 32760 break 32761 } 32762 r1 := sh.Args[0] 32763 if r1.Op != OpS390XMOVHZreg { 32764 break 32765 } 32766 x1 := r1.Args[0] 32767 if x1.Op != OpS390XMOVHBRloadidx { 32768 break 32769 } 32770 i1 := x1.AuxInt 32771 if x1.Aux != s { 32772 break 32773 } 32774 _ = x1.Args[2] 32775 if p != x1.Args[0] { 32776 break 32777 } 32778 if idx != x1.Args[1] { 32779 break 32780 } 32781 if mem != x1.Args[2] { 32782 break 32783 } 32784 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)) { 32785 break 32786 } 32787 b = mergePoint(b, x0, x1) 32788 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32789 v.reset(OpCopy) 32790 v.AddArg(v0) 32791 v0.AuxInt = i0 32792 v0.Aux = s 32793 v0.AddArg(p) 32794 v0.AddArg(idx) 32795 v0.AddArg(mem) 32796 return true 32797 } 32798 return false 32799 } 32800 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 32801 b := v.Block 32802 _ = b 32803 typ := &b.Func.Config.Types 32804 _ = typ 32805 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32806 // 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) 32807 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32808 for { 32809 _ = v.Args[1] 32810 r0 := v.Args[0] 32811 if r0.Op != OpS390XMOVHZreg { 32812 break 32813 } 32814 x0 := r0.Args[0] 32815 if x0.Op != OpS390XMOVHBRloadidx { 32816 break 32817 } 32818 i0 := x0.AuxInt 32819 s := x0.Aux 32820 _ = x0.Args[2] 32821 idx := x0.Args[0] 32822 p := x0.Args[1] 32823 mem := x0.Args[2] 32824 sh := v.Args[1] 32825 if sh.Op != OpS390XSLWconst { 32826 break 32827 } 32828 if sh.AuxInt != 16 { 32829 break 32830 } 32831 r1 := sh.Args[0] 32832 if r1.Op != OpS390XMOVHZreg { 32833 break 32834 } 32835 x1 := r1.Args[0] 32836 if x1.Op != OpS390XMOVHBRloadidx { 32837 break 32838 } 32839 i1 := x1.AuxInt 32840 if x1.Aux != s { 32841 break 32842 } 32843 _ = x1.Args[2] 32844 if p != x1.Args[0] { 32845 break 32846 } 32847 if idx != x1.Args[1] { 32848 break 32849 } 32850 if mem != x1.Args[2] { 32851 break 32852 } 32853 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)) { 32854 break 32855 } 32856 b = mergePoint(b, x0, x1) 32857 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32858 v.reset(OpCopy) 32859 v.AddArg(v0) 32860 v0.AuxInt = i0 32861 v0.Aux = s 32862 v0.AddArg(p) 32863 v0.AddArg(idx) 32864 v0.AddArg(mem) 32865 return true 32866 } 32867 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32868 // 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) 32869 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32870 for { 32871 _ = v.Args[1] 32872 r0 := v.Args[0] 32873 if r0.Op != OpS390XMOVHZreg { 32874 break 32875 } 32876 x0 := r0.Args[0] 32877 if x0.Op != OpS390XMOVHBRloadidx { 32878 break 32879 } 32880 i0 := x0.AuxInt 32881 s := x0.Aux 32882 _ = x0.Args[2] 32883 p := x0.Args[0] 32884 idx := x0.Args[1] 32885 mem := x0.Args[2] 32886 sh := v.Args[1] 32887 if sh.Op != OpS390XSLWconst { 32888 break 32889 } 32890 if sh.AuxInt != 16 { 32891 break 32892 } 32893 r1 := sh.Args[0] 32894 if r1.Op != OpS390XMOVHZreg { 32895 break 32896 } 32897 x1 := r1.Args[0] 32898 if x1.Op != OpS390XMOVHBRloadidx { 32899 break 32900 } 32901 i1 := x1.AuxInt 32902 if x1.Aux != s { 32903 break 32904 } 32905 _ = x1.Args[2] 32906 if idx != x1.Args[0] { 32907 break 32908 } 32909 if p != x1.Args[1] { 32910 break 32911 } 32912 if mem != x1.Args[2] { 32913 break 32914 } 32915 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)) { 32916 break 32917 } 32918 b = mergePoint(b, x0, x1) 32919 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32920 v.reset(OpCopy) 32921 v.AddArg(v0) 32922 v0.AuxInt = i0 32923 v0.Aux = s 32924 v0.AddArg(p) 32925 v0.AddArg(idx) 32926 v0.AddArg(mem) 32927 return true 32928 } 32929 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32930 // 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) 32931 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32932 for { 32933 _ = v.Args[1] 32934 r0 := v.Args[0] 32935 if r0.Op != OpS390XMOVHZreg { 32936 break 32937 } 32938 x0 := r0.Args[0] 32939 if x0.Op != OpS390XMOVHBRloadidx { 32940 break 32941 } 32942 i0 := x0.AuxInt 32943 s := x0.Aux 32944 _ = x0.Args[2] 32945 idx := x0.Args[0] 32946 p := x0.Args[1] 32947 mem := x0.Args[2] 32948 sh := v.Args[1] 32949 if sh.Op != OpS390XSLWconst { 32950 break 32951 } 32952 if sh.AuxInt != 16 { 32953 break 32954 } 32955 r1 := sh.Args[0] 32956 if r1.Op != OpS390XMOVHZreg { 32957 break 32958 } 32959 x1 := r1.Args[0] 32960 if x1.Op != OpS390XMOVHBRloadidx { 32961 break 32962 } 32963 i1 := x1.AuxInt 32964 if x1.Aux != s { 32965 break 32966 } 32967 _ = x1.Args[2] 32968 if idx != x1.Args[0] { 32969 break 32970 } 32971 if p != x1.Args[1] { 32972 break 32973 } 32974 if mem != x1.Args[2] { 32975 break 32976 } 32977 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)) { 32978 break 32979 } 32980 b = mergePoint(b, x0, x1) 32981 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32982 v.reset(OpCopy) 32983 v.AddArg(v0) 32984 v0.AuxInt = i0 32985 v0.Aux = s 32986 v0.AddArg(p) 32987 v0.AddArg(idx) 32988 v0.AddArg(mem) 32989 return true 32990 } 32991 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 32992 // 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) 32993 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32994 for { 32995 _ = v.Args[1] 32996 sh := v.Args[0] 32997 if sh.Op != OpS390XSLWconst { 32998 break 32999 } 33000 if sh.AuxInt != 16 { 33001 break 33002 } 33003 r1 := sh.Args[0] 33004 if r1.Op != OpS390XMOVHZreg { 33005 break 33006 } 33007 x1 := r1.Args[0] 33008 if x1.Op != OpS390XMOVHBRloadidx { 33009 break 33010 } 33011 i1 := x1.AuxInt 33012 s := x1.Aux 33013 _ = x1.Args[2] 33014 p := x1.Args[0] 33015 idx := x1.Args[1] 33016 mem := x1.Args[2] 33017 r0 := v.Args[1] 33018 if r0.Op != OpS390XMOVHZreg { 33019 break 33020 } 33021 x0 := r0.Args[0] 33022 if x0.Op != OpS390XMOVHBRloadidx { 33023 break 33024 } 33025 i0 := x0.AuxInt 33026 if x0.Aux != s { 33027 break 33028 } 33029 _ = x0.Args[2] 33030 if p != x0.Args[0] { 33031 break 33032 } 33033 if idx != x0.Args[1] { 33034 break 33035 } 33036 if mem != x0.Args[2] { 33037 break 33038 } 33039 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)) { 33040 break 33041 } 33042 b = mergePoint(b, x0, x1) 33043 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33044 v.reset(OpCopy) 33045 v.AddArg(v0) 33046 v0.AuxInt = i0 33047 v0.Aux = s 33048 v0.AddArg(p) 33049 v0.AddArg(idx) 33050 v0.AddArg(mem) 33051 return true 33052 } 33053 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 33054 // 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) 33055 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33056 for { 33057 _ = v.Args[1] 33058 sh := v.Args[0] 33059 if sh.Op != OpS390XSLWconst { 33060 break 33061 } 33062 if sh.AuxInt != 16 { 33063 break 33064 } 33065 r1 := sh.Args[0] 33066 if r1.Op != OpS390XMOVHZreg { 33067 break 33068 } 33069 x1 := r1.Args[0] 33070 if x1.Op != OpS390XMOVHBRloadidx { 33071 break 33072 } 33073 i1 := x1.AuxInt 33074 s := x1.Aux 33075 _ = x1.Args[2] 33076 idx := x1.Args[0] 33077 p := x1.Args[1] 33078 mem := x1.Args[2] 33079 r0 := v.Args[1] 33080 if r0.Op != OpS390XMOVHZreg { 33081 break 33082 } 33083 x0 := r0.Args[0] 33084 if x0.Op != OpS390XMOVHBRloadidx { 33085 break 33086 } 33087 i0 := x0.AuxInt 33088 if x0.Aux != s { 33089 break 33090 } 33091 _ = x0.Args[2] 33092 if p != x0.Args[0] { 33093 break 33094 } 33095 if idx != x0.Args[1] { 33096 break 33097 } 33098 if mem != x0.Args[2] { 33099 break 33100 } 33101 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)) { 33102 break 33103 } 33104 b = mergePoint(b, x0, x1) 33105 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33106 v.reset(OpCopy) 33107 v.AddArg(v0) 33108 v0.AuxInt = i0 33109 v0.Aux = s 33110 v0.AddArg(p) 33111 v0.AddArg(idx) 33112 v0.AddArg(mem) 33113 return true 33114 } 33115 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33116 // 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) 33117 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33118 for { 33119 _ = v.Args[1] 33120 sh := v.Args[0] 33121 if sh.Op != OpS390XSLWconst { 33122 break 33123 } 33124 if sh.AuxInt != 16 { 33125 break 33126 } 33127 r1 := sh.Args[0] 33128 if r1.Op != OpS390XMOVHZreg { 33129 break 33130 } 33131 x1 := r1.Args[0] 33132 if x1.Op != OpS390XMOVHBRloadidx { 33133 break 33134 } 33135 i1 := x1.AuxInt 33136 s := x1.Aux 33137 _ = x1.Args[2] 33138 p := x1.Args[0] 33139 idx := x1.Args[1] 33140 mem := x1.Args[2] 33141 r0 := v.Args[1] 33142 if r0.Op != OpS390XMOVHZreg { 33143 break 33144 } 33145 x0 := r0.Args[0] 33146 if x0.Op != OpS390XMOVHBRloadidx { 33147 break 33148 } 33149 i0 := x0.AuxInt 33150 if x0.Aux != s { 33151 break 33152 } 33153 _ = x0.Args[2] 33154 if idx != x0.Args[0] { 33155 break 33156 } 33157 if p != x0.Args[1] { 33158 break 33159 } 33160 if mem != x0.Args[2] { 33161 break 33162 } 33163 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)) { 33164 break 33165 } 33166 b = mergePoint(b, x0, x1) 33167 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33168 v.reset(OpCopy) 33169 v.AddArg(v0) 33170 v0.AuxInt = i0 33171 v0.Aux = s 33172 v0.AddArg(p) 33173 v0.AddArg(idx) 33174 v0.AddArg(mem) 33175 return true 33176 } 33177 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33178 // 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) 33179 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33180 for { 33181 _ = v.Args[1] 33182 sh := v.Args[0] 33183 if sh.Op != OpS390XSLWconst { 33184 break 33185 } 33186 if sh.AuxInt != 16 { 33187 break 33188 } 33189 r1 := sh.Args[0] 33190 if r1.Op != OpS390XMOVHZreg { 33191 break 33192 } 33193 x1 := r1.Args[0] 33194 if x1.Op != OpS390XMOVHBRloadidx { 33195 break 33196 } 33197 i1 := x1.AuxInt 33198 s := x1.Aux 33199 _ = x1.Args[2] 33200 idx := x1.Args[0] 33201 p := x1.Args[1] 33202 mem := x1.Args[2] 33203 r0 := v.Args[1] 33204 if r0.Op != OpS390XMOVHZreg { 33205 break 33206 } 33207 x0 := r0.Args[0] 33208 if x0.Op != OpS390XMOVHBRloadidx { 33209 break 33210 } 33211 i0 := x0.AuxInt 33212 if x0.Aux != s { 33213 break 33214 } 33215 _ = x0.Args[2] 33216 if idx != x0.Args[0] { 33217 break 33218 } 33219 if p != x0.Args[1] { 33220 break 33221 } 33222 if mem != x0.Args[2] { 33223 break 33224 } 33225 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)) { 33226 break 33227 } 33228 b = mergePoint(b, x0, x1) 33229 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33230 v.reset(OpCopy) 33231 v.AddArg(v0) 33232 v0.AuxInt = i0 33233 v0.Aux = s 33234 v0.AddArg(p) 33235 v0.AddArg(idx) 33236 v0.AddArg(mem) 33237 return true 33238 } 33239 // 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)) 33240 // 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) 33241 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33242 for { 33243 _ = v.Args[1] 33244 s1 := v.Args[0] 33245 if s1.Op != OpS390XSLWconst { 33246 break 33247 } 33248 j1 := s1.AuxInt 33249 x1 := s1.Args[0] 33250 if x1.Op != OpS390XMOVBZloadidx { 33251 break 33252 } 33253 i1 := x1.AuxInt 33254 s := x1.Aux 33255 _ = x1.Args[2] 33256 p := x1.Args[0] 33257 idx := x1.Args[1] 33258 mem := x1.Args[2] 33259 or := v.Args[1] 33260 if or.Op != OpS390XORW { 33261 break 33262 } 33263 _ = or.Args[1] 33264 s0 := or.Args[0] 33265 if s0.Op != OpS390XSLWconst { 33266 break 33267 } 33268 j0 := s0.AuxInt 33269 x0 := s0.Args[0] 33270 if x0.Op != OpS390XMOVBZloadidx { 33271 break 33272 } 33273 i0 := x0.AuxInt 33274 if x0.Aux != s { 33275 break 33276 } 33277 _ = x0.Args[2] 33278 if p != x0.Args[0] { 33279 break 33280 } 33281 if idx != x0.Args[1] { 33282 break 33283 } 33284 if mem != x0.Args[2] { 33285 break 33286 } 33287 y := or.Args[1] 33288 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)) { 33289 break 33290 } 33291 b = mergePoint(b, x0, x1) 33292 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33293 v.reset(OpCopy) 33294 v.AddArg(v0) 33295 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33296 v1.AuxInt = j0 33297 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33298 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33299 v3.AuxInt = i0 33300 v3.Aux = s 33301 v3.AddArg(p) 33302 v3.AddArg(idx) 33303 v3.AddArg(mem) 33304 v2.AddArg(v3) 33305 v1.AddArg(v2) 33306 v0.AddArg(v1) 33307 v0.AddArg(y) 33308 return true 33309 } 33310 // 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)) 33311 // 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) 33312 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33313 for { 33314 _ = v.Args[1] 33315 s1 := v.Args[0] 33316 if s1.Op != OpS390XSLWconst { 33317 break 33318 } 33319 j1 := s1.AuxInt 33320 x1 := s1.Args[0] 33321 if x1.Op != OpS390XMOVBZloadidx { 33322 break 33323 } 33324 i1 := x1.AuxInt 33325 s := x1.Aux 33326 _ = x1.Args[2] 33327 idx := x1.Args[0] 33328 p := x1.Args[1] 33329 mem := x1.Args[2] 33330 or := v.Args[1] 33331 if or.Op != OpS390XORW { 33332 break 33333 } 33334 _ = or.Args[1] 33335 s0 := or.Args[0] 33336 if s0.Op != OpS390XSLWconst { 33337 break 33338 } 33339 j0 := s0.AuxInt 33340 x0 := s0.Args[0] 33341 if x0.Op != OpS390XMOVBZloadidx { 33342 break 33343 } 33344 i0 := x0.AuxInt 33345 if x0.Aux != s { 33346 break 33347 } 33348 _ = x0.Args[2] 33349 if p != x0.Args[0] { 33350 break 33351 } 33352 if idx != x0.Args[1] { 33353 break 33354 } 33355 if mem != x0.Args[2] { 33356 break 33357 } 33358 y := or.Args[1] 33359 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)) { 33360 break 33361 } 33362 b = mergePoint(b, x0, x1) 33363 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33364 v.reset(OpCopy) 33365 v.AddArg(v0) 33366 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33367 v1.AuxInt = j0 33368 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33369 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33370 v3.AuxInt = i0 33371 v3.Aux = s 33372 v3.AddArg(p) 33373 v3.AddArg(idx) 33374 v3.AddArg(mem) 33375 v2.AddArg(v3) 33376 v1.AddArg(v2) 33377 v0.AddArg(v1) 33378 v0.AddArg(y) 33379 return true 33380 } 33381 // 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)) 33382 // 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) 33383 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33384 for { 33385 _ = v.Args[1] 33386 s1 := v.Args[0] 33387 if s1.Op != OpS390XSLWconst { 33388 break 33389 } 33390 j1 := s1.AuxInt 33391 x1 := s1.Args[0] 33392 if x1.Op != OpS390XMOVBZloadidx { 33393 break 33394 } 33395 i1 := x1.AuxInt 33396 s := x1.Aux 33397 _ = x1.Args[2] 33398 p := x1.Args[0] 33399 idx := x1.Args[1] 33400 mem := x1.Args[2] 33401 or := v.Args[1] 33402 if or.Op != OpS390XORW { 33403 break 33404 } 33405 _ = or.Args[1] 33406 s0 := or.Args[0] 33407 if s0.Op != OpS390XSLWconst { 33408 break 33409 } 33410 j0 := s0.AuxInt 33411 x0 := s0.Args[0] 33412 if x0.Op != OpS390XMOVBZloadidx { 33413 break 33414 } 33415 i0 := x0.AuxInt 33416 if x0.Aux != s { 33417 break 33418 } 33419 _ = x0.Args[2] 33420 if idx != x0.Args[0] { 33421 break 33422 } 33423 if p != x0.Args[1] { 33424 break 33425 } 33426 if mem != x0.Args[2] { 33427 break 33428 } 33429 y := or.Args[1] 33430 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)) { 33431 break 33432 } 33433 b = mergePoint(b, x0, x1) 33434 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33435 v.reset(OpCopy) 33436 v.AddArg(v0) 33437 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33438 v1.AuxInt = j0 33439 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33440 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33441 v3.AuxInt = i0 33442 v3.Aux = s 33443 v3.AddArg(p) 33444 v3.AddArg(idx) 33445 v3.AddArg(mem) 33446 v2.AddArg(v3) 33447 v1.AddArg(v2) 33448 v0.AddArg(v1) 33449 v0.AddArg(y) 33450 return true 33451 } 33452 return false 33453 } 33454 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 33455 b := v.Block 33456 _ = b 33457 typ := &b.Func.Config.Types 33458 _ = typ 33459 // 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)) 33460 // 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) 33461 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33462 for { 33463 _ = v.Args[1] 33464 s1 := v.Args[0] 33465 if s1.Op != OpS390XSLWconst { 33466 break 33467 } 33468 j1 := s1.AuxInt 33469 x1 := s1.Args[0] 33470 if x1.Op != OpS390XMOVBZloadidx { 33471 break 33472 } 33473 i1 := x1.AuxInt 33474 s := x1.Aux 33475 _ = x1.Args[2] 33476 idx := x1.Args[0] 33477 p := x1.Args[1] 33478 mem := x1.Args[2] 33479 or := v.Args[1] 33480 if or.Op != OpS390XORW { 33481 break 33482 } 33483 _ = or.Args[1] 33484 s0 := or.Args[0] 33485 if s0.Op != OpS390XSLWconst { 33486 break 33487 } 33488 j0 := s0.AuxInt 33489 x0 := s0.Args[0] 33490 if x0.Op != OpS390XMOVBZloadidx { 33491 break 33492 } 33493 i0 := x0.AuxInt 33494 if x0.Aux != s { 33495 break 33496 } 33497 _ = x0.Args[2] 33498 if idx != x0.Args[0] { 33499 break 33500 } 33501 if p != x0.Args[1] { 33502 break 33503 } 33504 if mem != x0.Args[2] { 33505 break 33506 } 33507 y := or.Args[1] 33508 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)) { 33509 break 33510 } 33511 b = mergePoint(b, x0, x1) 33512 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33513 v.reset(OpCopy) 33514 v.AddArg(v0) 33515 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33516 v1.AuxInt = j0 33517 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33518 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33519 v3.AuxInt = i0 33520 v3.Aux = s 33521 v3.AddArg(p) 33522 v3.AddArg(idx) 33523 v3.AddArg(mem) 33524 v2.AddArg(v3) 33525 v1.AddArg(v2) 33526 v0.AddArg(v1) 33527 v0.AddArg(y) 33528 return true 33529 } 33530 // 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)))) 33531 // 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) 33532 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33533 for { 33534 _ = v.Args[1] 33535 s1 := v.Args[0] 33536 if s1.Op != OpS390XSLWconst { 33537 break 33538 } 33539 j1 := s1.AuxInt 33540 x1 := s1.Args[0] 33541 if x1.Op != OpS390XMOVBZloadidx { 33542 break 33543 } 33544 i1 := x1.AuxInt 33545 s := x1.Aux 33546 _ = x1.Args[2] 33547 p := x1.Args[0] 33548 idx := x1.Args[1] 33549 mem := x1.Args[2] 33550 or := v.Args[1] 33551 if or.Op != OpS390XORW { 33552 break 33553 } 33554 _ = or.Args[1] 33555 y := or.Args[0] 33556 s0 := or.Args[1] 33557 if s0.Op != OpS390XSLWconst { 33558 break 33559 } 33560 j0 := s0.AuxInt 33561 x0 := s0.Args[0] 33562 if x0.Op != OpS390XMOVBZloadidx { 33563 break 33564 } 33565 i0 := x0.AuxInt 33566 if x0.Aux != s { 33567 break 33568 } 33569 _ = x0.Args[2] 33570 if p != x0.Args[0] { 33571 break 33572 } 33573 if idx != x0.Args[1] { 33574 break 33575 } 33576 if mem != x0.Args[2] { 33577 break 33578 } 33579 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)) { 33580 break 33581 } 33582 b = mergePoint(b, x0, x1) 33583 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33584 v.reset(OpCopy) 33585 v.AddArg(v0) 33586 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33587 v1.AuxInt = j0 33588 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33589 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33590 v3.AuxInt = i0 33591 v3.Aux = s 33592 v3.AddArg(p) 33593 v3.AddArg(idx) 33594 v3.AddArg(mem) 33595 v2.AddArg(v3) 33596 v1.AddArg(v2) 33597 v0.AddArg(v1) 33598 v0.AddArg(y) 33599 return true 33600 } 33601 // 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)))) 33602 // 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) 33603 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33604 for { 33605 _ = v.Args[1] 33606 s1 := v.Args[0] 33607 if s1.Op != OpS390XSLWconst { 33608 break 33609 } 33610 j1 := s1.AuxInt 33611 x1 := s1.Args[0] 33612 if x1.Op != OpS390XMOVBZloadidx { 33613 break 33614 } 33615 i1 := x1.AuxInt 33616 s := x1.Aux 33617 _ = x1.Args[2] 33618 idx := x1.Args[0] 33619 p := x1.Args[1] 33620 mem := x1.Args[2] 33621 or := v.Args[1] 33622 if or.Op != OpS390XORW { 33623 break 33624 } 33625 _ = or.Args[1] 33626 y := or.Args[0] 33627 s0 := or.Args[1] 33628 if s0.Op != OpS390XSLWconst { 33629 break 33630 } 33631 j0 := s0.AuxInt 33632 x0 := s0.Args[0] 33633 if x0.Op != OpS390XMOVBZloadidx { 33634 break 33635 } 33636 i0 := x0.AuxInt 33637 if x0.Aux != s { 33638 break 33639 } 33640 _ = x0.Args[2] 33641 if p != x0.Args[0] { 33642 break 33643 } 33644 if idx != x0.Args[1] { 33645 break 33646 } 33647 if mem != x0.Args[2] { 33648 break 33649 } 33650 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)) { 33651 break 33652 } 33653 b = mergePoint(b, x0, x1) 33654 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33655 v.reset(OpCopy) 33656 v.AddArg(v0) 33657 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33658 v1.AuxInt = j0 33659 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33660 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33661 v3.AuxInt = i0 33662 v3.Aux = s 33663 v3.AddArg(p) 33664 v3.AddArg(idx) 33665 v3.AddArg(mem) 33666 v2.AddArg(v3) 33667 v1.AddArg(v2) 33668 v0.AddArg(v1) 33669 v0.AddArg(y) 33670 return true 33671 } 33672 // 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)))) 33673 // 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) 33674 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33675 for { 33676 _ = v.Args[1] 33677 s1 := v.Args[0] 33678 if s1.Op != OpS390XSLWconst { 33679 break 33680 } 33681 j1 := s1.AuxInt 33682 x1 := s1.Args[0] 33683 if x1.Op != OpS390XMOVBZloadidx { 33684 break 33685 } 33686 i1 := x1.AuxInt 33687 s := x1.Aux 33688 _ = x1.Args[2] 33689 p := x1.Args[0] 33690 idx := x1.Args[1] 33691 mem := x1.Args[2] 33692 or := v.Args[1] 33693 if or.Op != OpS390XORW { 33694 break 33695 } 33696 _ = or.Args[1] 33697 y := or.Args[0] 33698 s0 := or.Args[1] 33699 if s0.Op != OpS390XSLWconst { 33700 break 33701 } 33702 j0 := s0.AuxInt 33703 x0 := s0.Args[0] 33704 if x0.Op != OpS390XMOVBZloadidx { 33705 break 33706 } 33707 i0 := x0.AuxInt 33708 if x0.Aux != s { 33709 break 33710 } 33711 _ = x0.Args[2] 33712 if idx != x0.Args[0] { 33713 break 33714 } 33715 if p != x0.Args[1] { 33716 break 33717 } 33718 if mem != x0.Args[2] { 33719 break 33720 } 33721 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)) { 33722 break 33723 } 33724 b = mergePoint(b, x0, x1) 33725 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33726 v.reset(OpCopy) 33727 v.AddArg(v0) 33728 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33729 v1.AuxInt = j0 33730 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33731 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33732 v3.AuxInt = i0 33733 v3.Aux = s 33734 v3.AddArg(p) 33735 v3.AddArg(idx) 33736 v3.AddArg(mem) 33737 v2.AddArg(v3) 33738 v1.AddArg(v2) 33739 v0.AddArg(v1) 33740 v0.AddArg(y) 33741 return true 33742 } 33743 // 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)))) 33744 // 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) 33745 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33746 for { 33747 _ = v.Args[1] 33748 s1 := v.Args[0] 33749 if s1.Op != OpS390XSLWconst { 33750 break 33751 } 33752 j1 := s1.AuxInt 33753 x1 := s1.Args[0] 33754 if x1.Op != OpS390XMOVBZloadidx { 33755 break 33756 } 33757 i1 := x1.AuxInt 33758 s := x1.Aux 33759 _ = x1.Args[2] 33760 idx := x1.Args[0] 33761 p := x1.Args[1] 33762 mem := x1.Args[2] 33763 or := v.Args[1] 33764 if or.Op != OpS390XORW { 33765 break 33766 } 33767 _ = or.Args[1] 33768 y := or.Args[0] 33769 s0 := or.Args[1] 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 if x0.Aux != s { 33780 break 33781 } 33782 _ = x0.Args[2] 33783 if idx != x0.Args[0] { 33784 break 33785 } 33786 if p != x0.Args[1] { 33787 break 33788 } 33789 if mem != x0.Args[2] { 33790 break 33791 } 33792 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)) { 33793 break 33794 } 33795 b = mergePoint(b, x0, x1) 33796 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33797 v.reset(OpCopy) 33798 v.AddArg(v0) 33799 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33800 v1.AuxInt = j0 33801 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33802 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33803 v3.AuxInt = i0 33804 v3.Aux = s 33805 v3.AddArg(p) 33806 v3.AddArg(idx) 33807 v3.AddArg(mem) 33808 v2.AddArg(v3) 33809 v1.AddArg(v2) 33810 v0.AddArg(v1) 33811 v0.AddArg(y) 33812 return true 33813 } 33814 // 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))) 33815 // 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) 33816 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33817 for { 33818 _ = v.Args[1] 33819 or := v.Args[0] 33820 if or.Op != OpS390XORW { 33821 break 33822 } 33823 _ = or.Args[1] 33824 s0 := or.Args[0] 33825 if s0.Op != OpS390XSLWconst { 33826 break 33827 } 33828 j0 := s0.AuxInt 33829 x0 := s0.Args[0] 33830 if x0.Op != OpS390XMOVBZloadidx { 33831 break 33832 } 33833 i0 := x0.AuxInt 33834 s := x0.Aux 33835 _ = x0.Args[2] 33836 p := x0.Args[0] 33837 idx := x0.Args[1] 33838 mem := x0.Args[2] 33839 y := or.Args[1] 33840 s1 := v.Args[1] 33841 if s1.Op != OpS390XSLWconst { 33842 break 33843 } 33844 j1 := s1.AuxInt 33845 x1 := s1.Args[0] 33846 if x1.Op != OpS390XMOVBZloadidx { 33847 break 33848 } 33849 i1 := x1.AuxInt 33850 if x1.Aux != s { 33851 break 33852 } 33853 _ = x1.Args[2] 33854 if p != x1.Args[0] { 33855 break 33856 } 33857 if idx != x1.Args[1] { 33858 break 33859 } 33860 if mem != x1.Args[2] { 33861 break 33862 } 33863 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)) { 33864 break 33865 } 33866 b = mergePoint(b, x0, x1) 33867 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33868 v.reset(OpCopy) 33869 v.AddArg(v0) 33870 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33871 v1.AuxInt = j0 33872 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33873 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33874 v3.AuxInt = i0 33875 v3.Aux = s 33876 v3.AddArg(p) 33877 v3.AddArg(idx) 33878 v3.AddArg(mem) 33879 v2.AddArg(v3) 33880 v1.AddArg(v2) 33881 v0.AddArg(v1) 33882 v0.AddArg(y) 33883 return true 33884 } 33885 // 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))) 33886 // 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) 33887 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33888 for { 33889 _ = v.Args[1] 33890 or := v.Args[0] 33891 if or.Op != OpS390XORW { 33892 break 33893 } 33894 _ = or.Args[1] 33895 s0 := or.Args[0] 33896 if s0.Op != OpS390XSLWconst { 33897 break 33898 } 33899 j0 := s0.AuxInt 33900 x0 := s0.Args[0] 33901 if x0.Op != OpS390XMOVBZloadidx { 33902 break 33903 } 33904 i0 := x0.AuxInt 33905 s := x0.Aux 33906 _ = x0.Args[2] 33907 idx := x0.Args[0] 33908 p := x0.Args[1] 33909 mem := x0.Args[2] 33910 y := or.Args[1] 33911 s1 := v.Args[1] 33912 if s1.Op != OpS390XSLWconst { 33913 break 33914 } 33915 j1 := s1.AuxInt 33916 x1 := s1.Args[0] 33917 if x1.Op != OpS390XMOVBZloadidx { 33918 break 33919 } 33920 i1 := x1.AuxInt 33921 if x1.Aux != s { 33922 break 33923 } 33924 _ = x1.Args[2] 33925 if p != x1.Args[0] { 33926 break 33927 } 33928 if idx != x1.Args[1] { 33929 break 33930 } 33931 if mem != x1.Args[2] { 33932 break 33933 } 33934 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)) { 33935 break 33936 } 33937 b = mergePoint(b, x0, x1) 33938 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33939 v.reset(OpCopy) 33940 v.AddArg(v0) 33941 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33942 v1.AuxInt = j0 33943 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33944 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33945 v3.AuxInt = i0 33946 v3.Aux = s 33947 v3.AddArg(p) 33948 v3.AddArg(idx) 33949 v3.AddArg(mem) 33950 v2.AddArg(v3) 33951 v1.AddArg(v2) 33952 v0.AddArg(v1) 33953 v0.AddArg(y) 33954 return true 33955 } 33956 // 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))) 33957 // 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) 33958 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33959 for { 33960 _ = v.Args[1] 33961 or := v.Args[0] 33962 if or.Op != OpS390XORW { 33963 break 33964 } 33965 _ = or.Args[1] 33966 y := or.Args[0] 33967 s0 := or.Args[1] 33968 if s0.Op != OpS390XSLWconst { 33969 break 33970 } 33971 j0 := s0.AuxInt 33972 x0 := s0.Args[0] 33973 if x0.Op != OpS390XMOVBZloadidx { 33974 break 33975 } 33976 i0 := x0.AuxInt 33977 s := x0.Aux 33978 _ = x0.Args[2] 33979 p := x0.Args[0] 33980 idx := x0.Args[1] 33981 mem := x0.Args[2] 33982 s1 := v.Args[1] 33983 if s1.Op != OpS390XSLWconst { 33984 break 33985 } 33986 j1 := s1.AuxInt 33987 x1 := s1.Args[0] 33988 if x1.Op != OpS390XMOVBZloadidx { 33989 break 33990 } 33991 i1 := x1.AuxInt 33992 if x1.Aux != s { 33993 break 33994 } 33995 _ = x1.Args[2] 33996 if p != x1.Args[0] { 33997 break 33998 } 33999 if idx != x1.Args[1] { 34000 break 34001 } 34002 if mem != x1.Args[2] { 34003 break 34004 } 34005 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)) { 34006 break 34007 } 34008 b = mergePoint(b, x0, x1) 34009 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34010 v.reset(OpCopy) 34011 v.AddArg(v0) 34012 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34013 v1.AuxInt = j0 34014 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34015 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34016 v3.AuxInt = i0 34017 v3.Aux = s 34018 v3.AddArg(p) 34019 v3.AddArg(idx) 34020 v3.AddArg(mem) 34021 v2.AddArg(v3) 34022 v1.AddArg(v2) 34023 v0.AddArg(v1) 34024 v0.AddArg(y) 34025 return true 34026 } 34027 // 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))) 34028 // 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) 34029 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34030 for { 34031 _ = v.Args[1] 34032 or := v.Args[0] 34033 if or.Op != OpS390XORW { 34034 break 34035 } 34036 _ = or.Args[1] 34037 y := or.Args[0] 34038 s0 := or.Args[1] 34039 if s0.Op != OpS390XSLWconst { 34040 break 34041 } 34042 j0 := s0.AuxInt 34043 x0 := s0.Args[0] 34044 if x0.Op != OpS390XMOVBZloadidx { 34045 break 34046 } 34047 i0 := x0.AuxInt 34048 s := x0.Aux 34049 _ = x0.Args[2] 34050 idx := x0.Args[0] 34051 p := x0.Args[1] 34052 mem := x0.Args[2] 34053 s1 := v.Args[1] 34054 if s1.Op != OpS390XSLWconst { 34055 break 34056 } 34057 j1 := s1.AuxInt 34058 x1 := s1.Args[0] 34059 if x1.Op != OpS390XMOVBZloadidx { 34060 break 34061 } 34062 i1 := x1.AuxInt 34063 if x1.Aux != s { 34064 break 34065 } 34066 _ = x1.Args[2] 34067 if p != x1.Args[0] { 34068 break 34069 } 34070 if idx != x1.Args[1] { 34071 break 34072 } 34073 if mem != x1.Args[2] { 34074 break 34075 } 34076 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)) { 34077 break 34078 } 34079 b = mergePoint(b, x0, x1) 34080 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34081 v.reset(OpCopy) 34082 v.AddArg(v0) 34083 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34084 v1.AuxInt = j0 34085 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34086 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34087 v3.AuxInt = i0 34088 v3.Aux = s 34089 v3.AddArg(p) 34090 v3.AddArg(idx) 34091 v3.AddArg(mem) 34092 v2.AddArg(v3) 34093 v1.AddArg(v2) 34094 v0.AddArg(v1) 34095 v0.AddArg(y) 34096 return true 34097 } 34098 // 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))) 34099 // 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) 34100 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34101 for { 34102 _ = v.Args[1] 34103 or := v.Args[0] 34104 if or.Op != OpS390XORW { 34105 break 34106 } 34107 _ = or.Args[1] 34108 s0 := or.Args[0] 34109 if s0.Op != OpS390XSLWconst { 34110 break 34111 } 34112 j0 := s0.AuxInt 34113 x0 := s0.Args[0] 34114 if x0.Op != OpS390XMOVBZloadidx { 34115 break 34116 } 34117 i0 := x0.AuxInt 34118 s := x0.Aux 34119 _ = x0.Args[2] 34120 p := x0.Args[0] 34121 idx := x0.Args[1] 34122 mem := x0.Args[2] 34123 y := or.Args[1] 34124 s1 := v.Args[1] 34125 if s1.Op != OpS390XSLWconst { 34126 break 34127 } 34128 j1 := s1.AuxInt 34129 x1 := s1.Args[0] 34130 if x1.Op != OpS390XMOVBZloadidx { 34131 break 34132 } 34133 i1 := x1.AuxInt 34134 if x1.Aux != s { 34135 break 34136 } 34137 _ = x1.Args[2] 34138 if idx != x1.Args[0] { 34139 break 34140 } 34141 if p != x1.Args[1] { 34142 break 34143 } 34144 if mem != x1.Args[2] { 34145 break 34146 } 34147 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)) { 34148 break 34149 } 34150 b = mergePoint(b, x0, x1) 34151 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34152 v.reset(OpCopy) 34153 v.AddArg(v0) 34154 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34155 v1.AuxInt = j0 34156 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34157 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34158 v3.AuxInt = i0 34159 v3.Aux = s 34160 v3.AddArg(p) 34161 v3.AddArg(idx) 34162 v3.AddArg(mem) 34163 v2.AddArg(v3) 34164 v1.AddArg(v2) 34165 v0.AddArg(v1) 34166 v0.AddArg(y) 34167 return true 34168 } 34169 return false 34170 } 34171 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 34172 b := v.Block 34173 _ = b 34174 typ := &b.Func.Config.Types 34175 _ = typ 34176 // 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))) 34177 // 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) 34178 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34179 for { 34180 _ = v.Args[1] 34181 or := v.Args[0] 34182 if or.Op != OpS390XORW { 34183 break 34184 } 34185 _ = or.Args[1] 34186 s0 := or.Args[0] 34187 if s0.Op != OpS390XSLWconst { 34188 break 34189 } 34190 j0 := s0.AuxInt 34191 x0 := s0.Args[0] 34192 if x0.Op != OpS390XMOVBZloadidx { 34193 break 34194 } 34195 i0 := x0.AuxInt 34196 s := x0.Aux 34197 _ = x0.Args[2] 34198 idx := x0.Args[0] 34199 p := x0.Args[1] 34200 mem := x0.Args[2] 34201 y := or.Args[1] 34202 s1 := v.Args[1] 34203 if s1.Op != OpS390XSLWconst { 34204 break 34205 } 34206 j1 := s1.AuxInt 34207 x1 := s1.Args[0] 34208 if x1.Op != OpS390XMOVBZloadidx { 34209 break 34210 } 34211 i1 := x1.AuxInt 34212 if x1.Aux != s { 34213 break 34214 } 34215 _ = x1.Args[2] 34216 if idx != x1.Args[0] { 34217 break 34218 } 34219 if p != x1.Args[1] { 34220 break 34221 } 34222 if mem != x1.Args[2] { 34223 break 34224 } 34225 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)) { 34226 break 34227 } 34228 b = mergePoint(b, x0, x1) 34229 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34230 v.reset(OpCopy) 34231 v.AddArg(v0) 34232 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34233 v1.AuxInt = j0 34234 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34235 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34236 v3.AuxInt = i0 34237 v3.Aux = s 34238 v3.AddArg(p) 34239 v3.AddArg(idx) 34240 v3.AddArg(mem) 34241 v2.AddArg(v3) 34242 v1.AddArg(v2) 34243 v0.AddArg(v1) 34244 v0.AddArg(y) 34245 return true 34246 } 34247 // 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))) 34248 // 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) 34249 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34250 for { 34251 _ = v.Args[1] 34252 or := v.Args[0] 34253 if or.Op != OpS390XORW { 34254 break 34255 } 34256 _ = or.Args[1] 34257 y := or.Args[0] 34258 s0 := or.Args[1] 34259 if s0.Op != OpS390XSLWconst { 34260 break 34261 } 34262 j0 := s0.AuxInt 34263 x0 := s0.Args[0] 34264 if x0.Op != OpS390XMOVBZloadidx { 34265 break 34266 } 34267 i0 := x0.AuxInt 34268 s := x0.Aux 34269 _ = x0.Args[2] 34270 p := x0.Args[0] 34271 idx := x0.Args[1] 34272 mem := x0.Args[2] 34273 s1 := v.Args[1] 34274 if s1.Op != OpS390XSLWconst { 34275 break 34276 } 34277 j1 := s1.AuxInt 34278 x1 := s1.Args[0] 34279 if x1.Op != OpS390XMOVBZloadidx { 34280 break 34281 } 34282 i1 := x1.AuxInt 34283 if x1.Aux != s { 34284 break 34285 } 34286 _ = x1.Args[2] 34287 if idx != x1.Args[0] { 34288 break 34289 } 34290 if p != x1.Args[1] { 34291 break 34292 } 34293 if mem != x1.Args[2] { 34294 break 34295 } 34296 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)) { 34297 break 34298 } 34299 b = mergePoint(b, x0, x1) 34300 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34301 v.reset(OpCopy) 34302 v.AddArg(v0) 34303 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34304 v1.AuxInt = j0 34305 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34306 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34307 v3.AuxInt = i0 34308 v3.Aux = s 34309 v3.AddArg(p) 34310 v3.AddArg(idx) 34311 v3.AddArg(mem) 34312 v2.AddArg(v3) 34313 v1.AddArg(v2) 34314 v0.AddArg(v1) 34315 v0.AddArg(y) 34316 return true 34317 } 34318 // 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))) 34319 // 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) 34320 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34321 for { 34322 _ = v.Args[1] 34323 or := v.Args[0] 34324 if or.Op != OpS390XORW { 34325 break 34326 } 34327 _ = or.Args[1] 34328 y := or.Args[0] 34329 s0 := or.Args[1] 34330 if s0.Op != OpS390XSLWconst { 34331 break 34332 } 34333 j0 := s0.AuxInt 34334 x0 := s0.Args[0] 34335 if x0.Op != OpS390XMOVBZloadidx { 34336 break 34337 } 34338 i0 := x0.AuxInt 34339 s := x0.Aux 34340 _ = x0.Args[2] 34341 idx := x0.Args[0] 34342 p := x0.Args[1] 34343 mem := x0.Args[2] 34344 s1 := v.Args[1] 34345 if s1.Op != OpS390XSLWconst { 34346 break 34347 } 34348 j1 := s1.AuxInt 34349 x1 := s1.Args[0] 34350 if x1.Op != OpS390XMOVBZloadidx { 34351 break 34352 } 34353 i1 := x1.AuxInt 34354 if x1.Aux != s { 34355 break 34356 } 34357 _ = x1.Args[2] 34358 if idx != x1.Args[0] { 34359 break 34360 } 34361 if p != x1.Args[1] { 34362 break 34363 } 34364 if mem != x1.Args[2] { 34365 break 34366 } 34367 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)) { 34368 break 34369 } 34370 b = mergePoint(b, x0, x1) 34371 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34372 v.reset(OpCopy) 34373 v.AddArg(v0) 34374 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34375 v1.AuxInt = j0 34376 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34377 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34378 v3.AuxInt = i0 34379 v3.Aux = s 34380 v3.AddArg(p) 34381 v3.AddArg(idx) 34382 v3.AddArg(mem) 34383 v2.AddArg(v3) 34384 v1.AddArg(v2) 34385 v0.AddArg(v1) 34386 v0.AddArg(y) 34387 return true 34388 } 34389 return false 34390 } 34391 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 34392 // match: (ORWconst [c] x) 34393 // cond: int32(c)==0 34394 // result: x 34395 for { 34396 c := v.AuxInt 34397 x := v.Args[0] 34398 if !(int32(c) == 0) { 34399 break 34400 } 34401 v.reset(OpCopy) 34402 v.Type = x.Type 34403 v.AddArg(x) 34404 return true 34405 } 34406 // match: (ORWconst [c] _) 34407 // cond: int32(c)==-1 34408 // result: (MOVDconst [-1]) 34409 for { 34410 c := v.AuxInt 34411 if !(int32(c) == -1) { 34412 break 34413 } 34414 v.reset(OpS390XMOVDconst) 34415 v.AuxInt = -1 34416 return true 34417 } 34418 // match: (ORWconst [c] (MOVDconst [d])) 34419 // cond: 34420 // result: (MOVDconst [c|d]) 34421 for { 34422 c := v.AuxInt 34423 v_0 := v.Args[0] 34424 if v_0.Op != OpS390XMOVDconst { 34425 break 34426 } 34427 d := v_0.AuxInt 34428 v.reset(OpS390XMOVDconst) 34429 v.AuxInt = c | d 34430 return true 34431 } 34432 return false 34433 } 34434 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 34435 // match: (ORconst [0] x) 34436 // cond: 34437 // result: x 34438 for { 34439 if v.AuxInt != 0 { 34440 break 34441 } 34442 x := v.Args[0] 34443 v.reset(OpCopy) 34444 v.Type = x.Type 34445 v.AddArg(x) 34446 return true 34447 } 34448 // match: (ORconst [-1] _) 34449 // cond: 34450 // result: (MOVDconst [-1]) 34451 for { 34452 if v.AuxInt != -1 { 34453 break 34454 } 34455 v.reset(OpS390XMOVDconst) 34456 v.AuxInt = -1 34457 return true 34458 } 34459 // match: (ORconst [c] (MOVDconst [d])) 34460 // cond: 34461 // result: (MOVDconst [c|d]) 34462 for { 34463 c := v.AuxInt 34464 v_0 := v.Args[0] 34465 if v_0.Op != OpS390XMOVDconst { 34466 break 34467 } 34468 d := v_0.AuxInt 34469 v.reset(OpS390XMOVDconst) 34470 v.AuxInt = c | d 34471 return true 34472 } 34473 return false 34474 } 34475 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 34476 // match: (SLD x (MOVDconst [c])) 34477 // cond: 34478 // result: (SLDconst [c&63] x) 34479 for { 34480 _ = v.Args[1] 34481 x := v.Args[0] 34482 v_1 := v.Args[1] 34483 if v_1.Op != OpS390XMOVDconst { 34484 break 34485 } 34486 c := v_1.AuxInt 34487 v.reset(OpS390XSLDconst) 34488 v.AuxInt = c & 63 34489 v.AddArg(x) 34490 return true 34491 } 34492 // match: (SLD x (ANDconst [63] y)) 34493 // cond: 34494 // result: (SLD x y) 34495 for { 34496 _ = v.Args[1] 34497 x := v.Args[0] 34498 v_1 := v.Args[1] 34499 if v_1.Op != OpS390XANDconst { 34500 break 34501 } 34502 if v_1.AuxInt != 63 { 34503 break 34504 } 34505 y := v_1.Args[0] 34506 v.reset(OpS390XSLD) 34507 v.AddArg(x) 34508 v.AddArg(y) 34509 return true 34510 } 34511 return false 34512 } 34513 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 34514 // match: (SLW x (MOVDconst [c])) 34515 // cond: 34516 // result: (SLWconst [c&63] x) 34517 for { 34518 _ = v.Args[1] 34519 x := v.Args[0] 34520 v_1 := v.Args[1] 34521 if v_1.Op != OpS390XMOVDconst { 34522 break 34523 } 34524 c := v_1.AuxInt 34525 v.reset(OpS390XSLWconst) 34526 v.AuxInt = c & 63 34527 v.AddArg(x) 34528 return true 34529 } 34530 // match: (SLW x (ANDWconst [63] y)) 34531 // cond: 34532 // result: (SLW x y) 34533 for { 34534 _ = v.Args[1] 34535 x := v.Args[0] 34536 v_1 := v.Args[1] 34537 if v_1.Op != OpS390XANDWconst { 34538 break 34539 } 34540 if v_1.AuxInt != 63 { 34541 break 34542 } 34543 y := v_1.Args[0] 34544 v.reset(OpS390XSLW) 34545 v.AddArg(x) 34546 v.AddArg(y) 34547 return true 34548 } 34549 return false 34550 } 34551 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 34552 // match: (SRAD x (MOVDconst [c])) 34553 // cond: 34554 // result: (SRADconst [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(OpS390XSRADconst) 34564 v.AuxInt = c & 63 34565 v.AddArg(x) 34566 return true 34567 } 34568 // match: (SRAD x (ANDconst [63] y)) 34569 // cond: 34570 // result: (SRAD x y) 34571 for { 34572 _ = v.Args[1] 34573 x := v.Args[0] 34574 v_1 := v.Args[1] 34575 if v_1.Op != OpS390XANDconst { 34576 break 34577 } 34578 if v_1.AuxInt != 63 { 34579 break 34580 } 34581 y := v_1.Args[0] 34582 v.reset(OpS390XSRAD) 34583 v.AddArg(x) 34584 v.AddArg(y) 34585 return true 34586 } 34587 return false 34588 } 34589 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 34590 // match: (SRADconst [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_OpS390XSRAW_0(v *Value) bool { 34607 // match: (SRAW x (MOVDconst [c])) 34608 // cond: 34609 // result: (SRAWconst [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(OpS390XSRAWconst) 34619 v.AuxInt = c & 63 34620 v.AddArg(x) 34621 return true 34622 } 34623 // match: (SRAW x (ANDWconst [63] y)) 34624 // cond: 34625 // result: (SRAW x y) 34626 for { 34627 _ = v.Args[1] 34628 x := v.Args[0] 34629 v_1 := v.Args[1] 34630 if v_1.Op != OpS390XANDWconst { 34631 break 34632 } 34633 if v_1.AuxInt != 63 { 34634 break 34635 } 34636 y := v_1.Args[0] 34637 v.reset(OpS390XSRAW) 34638 v.AddArg(x) 34639 v.AddArg(y) 34640 return true 34641 } 34642 return false 34643 } 34644 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 34645 // match: (SRAWconst [c] (MOVDconst [d])) 34646 // cond: 34647 // result: (MOVDconst [d>>uint64(c)]) 34648 for { 34649 c := v.AuxInt 34650 v_0 := v.Args[0] 34651 if v_0.Op != OpS390XMOVDconst { 34652 break 34653 } 34654 d := v_0.AuxInt 34655 v.reset(OpS390XMOVDconst) 34656 v.AuxInt = d >> uint64(c) 34657 return true 34658 } 34659 return false 34660 } 34661 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 34662 // match: (SRD x (MOVDconst [c])) 34663 // cond: 34664 // result: (SRDconst [c&63] x) 34665 for { 34666 _ = v.Args[1] 34667 x := v.Args[0] 34668 v_1 := v.Args[1] 34669 if v_1.Op != OpS390XMOVDconst { 34670 break 34671 } 34672 c := v_1.AuxInt 34673 v.reset(OpS390XSRDconst) 34674 v.AuxInt = c & 63 34675 v.AddArg(x) 34676 return true 34677 } 34678 // match: (SRD x (ANDconst [63] y)) 34679 // cond: 34680 // result: (SRD x y) 34681 for { 34682 _ = v.Args[1] 34683 x := v.Args[0] 34684 v_1 := v.Args[1] 34685 if v_1.Op != OpS390XANDconst { 34686 break 34687 } 34688 if v_1.AuxInt != 63 { 34689 break 34690 } 34691 y := v_1.Args[0] 34692 v.reset(OpS390XSRD) 34693 v.AddArg(x) 34694 v.AddArg(y) 34695 return true 34696 } 34697 return false 34698 } 34699 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 34700 // match: (SRW x (MOVDconst [c])) 34701 // cond: 34702 // result: (SRWconst [c&63] x) 34703 for { 34704 _ = v.Args[1] 34705 x := v.Args[0] 34706 v_1 := v.Args[1] 34707 if v_1.Op != OpS390XMOVDconst { 34708 break 34709 } 34710 c := v_1.AuxInt 34711 v.reset(OpS390XSRWconst) 34712 v.AuxInt = c & 63 34713 v.AddArg(x) 34714 return true 34715 } 34716 // match: (SRW x (ANDWconst [63] y)) 34717 // cond: 34718 // result: (SRW x y) 34719 for { 34720 _ = v.Args[1] 34721 x := v.Args[0] 34722 v_1 := v.Args[1] 34723 if v_1.Op != OpS390XANDWconst { 34724 break 34725 } 34726 if v_1.AuxInt != 63 { 34727 break 34728 } 34729 y := v_1.Args[0] 34730 v.reset(OpS390XSRW) 34731 v.AddArg(x) 34732 v.AddArg(y) 34733 return true 34734 } 34735 return false 34736 } 34737 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 34738 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 34739 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 34740 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 34741 for { 34742 i := v.AuxInt 34743 s := v.Aux 34744 _ = v.Args[3] 34745 p := v.Args[0] 34746 w2 := v.Args[1] 34747 w3 := v.Args[2] 34748 x := v.Args[3] 34749 if x.Op != OpS390XSTM2 { 34750 break 34751 } 34752 if x.AuxInt != i-8 { 34753 break 34754 } 34755 if x.Aux != s { 34756 break 34757 } 34758 _ = x.Args[3] 34759 if p != x.Args[0] { 34760 break 34761 } 34762 w0 := x.Args[1] 34763 w1 := x.Args[2] 34764 mem := x.Args[3] 34765 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 34766 break 34767 } 34768 v.reset(OpS390XSTM4) 34769 v.AuxInt = i - 8 34770 v.Aux = s 34771 v.AddArg(p) 34772 v.AddArg(w0) 34773 v.AddArg(w1) 34774 v.AddArg(w2) 34775 v.AddArg(w3) 34776 v.AddArg(mem) 34777 return true 34778 } 34779 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 34780 // cond: 34781 // result: (MOVDstore [i] {s} p x mem) 34782 for { 34783 i := v.AuxInt 34784 s := v.Aux 34785 _ = v.Args[3] 34786 p := v.Args[0] 34787 v_1 := v.Args[1] 34788 if v_1.Op != OpS390XSRDconst { 34789 break 34790 } 34791 if v_1.AuxInt != 32 { 34792 break 34793 } 34794 x := v_1.Args[0] 34795 if x != v.Args[2] { 34796 break 34797 } 34798 mem := v.Args[3] 34799 v.reset(OpS390XMOVDstore) 34800 v.AuxInt = i 34801 v.Aux = s 34802 v.AddArg(p) 34803 v.AddArg(x) 34804 v.AddArg(mem) 34805 return true 34806 } 34807 return false 34808 } 34809 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 34810 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 34811 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 34812 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 34813 for { 34814 i := v.AuxInt 34815 s := v.Aux 34816 _ = v.Args[3] 34817 p := v.Args[0] 34818 w2 := v.Args[1] 34819 w3 := v.Args[2] 34820 x := v.Args[3] 34821 if x.Op != OpS390XSTMG2 { 34822 break 34823 } 34824 if x.AuxInt != i-16 { 34825 break 34826 } 34827 if x.Aux != s { 34828 break 34829 } 34830 _ = x.Args[3] 34831 if p != x.Args[0] { 34832 break 34833 } 34834 w0 := x.Args[1] 34835 w1 := x.Args[2] 34836 mem := x.Args[3] 34837 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 34838 break 34839 } 34840 v.reset(OpS390XSTMG4) 34841 v.AuxInt = i - 16 34842 v.Aux = s 34843 v.AddArg(p) 34844 v.AddArg(w0) 34845 v.AddArg(w1) 34846 v.AddArg(w2) 34847 v.AddArg(w3) 34848 v.AddArg(mem) 34849 return true 34850 } 34851 return false 34852 } 34853 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 34854 b := v.Block 34855 _ = b 34856 // match: (SUB x (MOVDconst [c])) 34857 // cond: is32Bit(c) 34858 // result: (SUBconst x [c]) 34859 for { 34860 _ = v.Args[1] 34861 x := v.Args[0] 34862 v_1 := v.Args[1] 34863 if v_1.Op != OpS390XMOVDconst { 34864 break 34865 } 34866 c := v_1.AuxInt 34867 if !(is32Bit(c)) { 34868 break 34869 } 34870 v.reset(OpS390XSUBconst) 34871 v.AuxInt = c 34872 v.AddArg(x) 34873 return true 34874 } 34875 // match: (SUB (MOVDconst [c]) x) 34876 // cond: is32Bit(c) 34877 // result: (NEG (SUBconst <v.Type> x [c])) 34878 for { 34879 _ = v.Args[1] 34880 v_0 := v.Args[0] 34881 if v_0.Op != OpS390XMOVDconst { 34882 break 34883 } 34884 c := v_0.AuxInt 34885 x := v.Args[1] 34886 if !(is32Bit(c)) { 34887 break 34888 } 34889 v.reset(OpS390XNEG) 34890 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 34891 v0.AuxInt = c 34892 v0.AddArg(x) 34893 v.AddArg(v0) 34894 return true 34895 } 34896 // match: (SUB x x) 34897 // cond: 34898 // result: (MOVDconst [0]) 34899 for { 34900 _ = v.Args[1] 34901 x := v.Args[0] 34902 if x != v.Args[1] { 34903 break 34904 } 34905 v.reset(OpS390XMOVDconst) 34906 v.AuxInt = 0 34907 return true 34908 } 34909 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 34910 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34911 // result: (SUBload <t> [off] {sym} x ptr mem) 34912 for { 34913 t := v.Type 34914 _ = v.Args[1] 34915 x := v.Args[0] 34916 g := v.Args[1] 34917 if g.Op != OpS390XMOVDload { 34918 break 34919 } 34920 off := g.AuxInt 34921 sym := g.Aux 34922 _ = g.Args[1] 34923 ptr := g.Args[0] 34924 mem := g.Args[1] 34925 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34926 break 34927 } 34928 v.reset(OpS390XSUBload) 34929 v.Type = t 34930 v.AuxInt = off 34931 v.Aux = sym 34932 v.AddArg(x) 34933 v.AddArg(ptr) 34934 v.AddArg(mem) 34935 return true 34936 } 34937 return false 34938 } 34939 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool { 34940 // match: (SUBEWcarrymask (FlagEQ)) 34941 // cond: 34942 // result: (MOVDconst [-1]) 34943 for { 34944 v_0 := v.Args[0] 34945 if v_0.Op != OpS390XFlagEQ { 34946 break 34947 } 34948 v.reset(OpS390XMOVDconst) 34949 v.AuxInt = -1 34950 return true 34951 } 34952 // match: (SUBEWcarrymask (FlagLT)) 34953 // cond: 34954 // result: (MOVDconst [-1]) 34955 for { 34956 v_0 := v.Args[0] 34957 if v_0.Op != OpS390XFlagLT { 34958 break 34959 } 34960 v.reset(OpS390XMOVDconst) 34961 v.AuxInt = -1 34962 return true 34963 } 34964 // match: (SUBEWcarrymask (FlagGT)) 34965 // cond: 34966 // result: (MOVDconst [0]) 34967 for { 34968 v_0 := v.Args[0] 34969 if v_0.Op != OpS390XFlagGT { 34970 break 34971 } 34972 v.reset(OpS390XMOVDconst) 34973 v.AuxInt = 0 34974 return true 34975 } 34976 return false 34977 } 34978 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool { 34979 // match: (SUBEcarrymask (FlagEQ)) 34980 // cond: 34981 // result: (MOVDconst [-1]) 34982 for { 34983 v_0 := v.Args[0] 34984 if v_0.Op != OpS390XFlagEQ { 34985 break 34986 } 34987 v.reset(OpS390XMOVDconst) 34988 v.AuxInt = -1 34989 return true 34990 } 34991 // match: (SUBEcarrymask (FlagLT)) 34992 // cond: 34993 // result: (MOVDconst [-1]) 34994 for { 34995 v_0 := v.Args[0] 34996 if v_0.Op != OpS390XFlagLT { 34997 break 34998 } 34999 v.reset(OpS390XMOVDconst) 35000 v.AuxInt = -1 35001 return true 35002 } 35003 // match: (SUBEcarrymask (FlagGT)) 35004 // cond: 35005 // result: (MOVDconst [0]) 35006 for { 35007 v_0 := v.Args[0] 35008 if v_0.Op != OpS390XFlagGT { 35009 break 35010 } 35011 v.reset(OpS390XMOVDconst) 35012 v.AuxInt = 0 35013 return true 35014 } 35015 return false 35016 } 35017 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 35018 b := v.Block 35019 _ = b 35020 // match: (SUBW x (MOVDconst [c])) 35021 // cond: 35022 // result: (SUBWconst x [c]) 35023 for { 35024 _ = v.Args[1] 35025 x := v.Args[0] 35026 v_1 := v.Args[1] 35027 if v_1.Op != OpS390XMOVDconst { 35028 break 35029 } 35030 c := v_1.AuxInt 35031 v.reset(OpS390XSUBWconst) 35032 v.AuxInt = c 35033 v.AddArg(x) 35034 return true 35035 } 35036 // match: (SUBW (MOVDconst [c]) x) 35037 // cond: 35038 // result: (NEGW (SUBWconst <v.Type> x [c])) 35039 for { 35040 _ = v.Args[1] 35041 v_0 := v.Args[0] 35042 if v_0.Op != OpS390XMOVDconst { 35043 break 35044 } 35045 c := v_0.AuxInt 35046 x := v.Args[1] 35047 v.reset(OpS390XNEGW) 35048 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 35049 v0.AuxInt = c 35050 v0.AddArg(x) 35051 v.AddArg(v0) 35052 return true 35053 } 35054 // match: (SUBW x x) 35055 // cond: 35056 // result: (MOVDconst [0]) 35057 for { 35058 _ = v.Args[1] 35059 x := v.Args[0] 35060 if x != v.Args[1] { 35061 break 35062 } 35063 v.reset(OpS390XMOVDconst) 35064 v.AuxInt = 0 35065 return true 35066 } 35067 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 35068 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35069 // result: (SUBWload <t> [off] {sym} x ptr mem) 35070 for { 35071 t := v.Type 35072 _ = v.Args[1] 35073 x := v.Args[0] 35074 g := v.Args[1] 35075 if g.Op != OpS390XMOVWload { 35076 break 35077 } 35078 off := g.AuxInt 35079 sym := g.Aux 35080 _ = g.Args[1] 35081 ptr := g.Args[0] 35082 mem := g.Args[1] 35083 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35084 break 35085 } 35086 v.reset(OpS390XSUBWload) 35087 v.Type = t 35088 v.AuxInt = off 35089 v.Aux = sym 35090 v.AddArg(x) 35091 v.AddArg(ptr) 35092 v.AddArg(mem) 35093 return true 35094 } 35095 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35096 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35097 // result: (SUBWload <t> [off] {sym} x ptr mem) 35098 for { 35099 t := v.Type 35100 _ = v.Args[1] 35101 x := v.Args[0] 35102 g := v.Args[1] 35103 if g.Op != OpS390XMOVWZload { 35104 break 35105 } 35106 off := g.AuxInt 35107 sym := g.Aux 35108 _ = g.Args[1] 35109 ptr := g.Args[0] 35110 mem := g.Args[1] 35111 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35112 break 35113 } 35114 v.reset(OpS390XSUBWload) 35115 v.Type = t 35116 v.AuxInt = off 35117 v.Aux = sym 35118 v.AddArg(x) 35119 v.AddArg(ptr) 35120 v.AddArg(mem) 35121 return true 35122 } 35123 return false 35124 } 35125 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 35126 // match: (SUBWconst [c] x) 35127 // cond: int32(c) == 0 35128 // result: x 35129 for { 35130 c := v.AuxInt 35131 x := v.Args[0] 35132 if !(int32(c) == 0) { 35133 break 35134 } 35135 v.reset(OpCopy) 35136 v.Type = x.Type 35137 v.AddArg(x) 35138 return true 35139 } 35140 // match: (SUBWconst [c] x) 35141 // cond: 35142 // result: (ADDWconst [int64(int32(-c))] x) 35143 for { 35144 c := v.AuxInt 35145 x := v.Args[0] 35146 v.reset(OpS390XADDWconst) 35147 v.AuxInt = int64(int32(-c)) 35148 v.AddArg(x) 35149 return true 35150 } 35151 } 35152 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 35153 // match: (SUBconst [0] x) 35154 // cond: 35155 // result: x 35156 for { 35157 if v.AuxInt != 0 { 35158 break 35159 } 35160 x := v.Args[0] 35161 v.reset(OpCopy) 35162 v.Type = x.Type 35163 v.AddArg(x) 35164 return true 35165 } 35166 // match: (SUBconst [c] x) 35167 // cond: c != -(1<<31) 35168 // result: (ADDconst [-c] x) 35169 for { 35170 c := v.AuxInt 35171 x := v.Args[0] 35172 if !(c != -(1 << 31)) { 35173 break 35174 } 35175 v.reset(OpS390XADDconst) 35176 v.AuxInt = -c 35177 v.AddArg(x) 35178 return true 35179 } 35180 // match: (SUBconst (MOVDconst [d]) [c]) 35181 // cond: 35182 // result: (MOVDconst [d-c]) 35183 for { 35184 c := v.AuxInt 35185 v_0 := v.Args[0] 35186 if v_0.Op != OpS390XMOVDconst { 35187 break 35188 } 35189 d := v_0.AuxInt 35190 v.reset(OpS390XMOVDconst) 35191 v.AuxInt = d - c 35192 return true 35193 } 35194 // match: (SUBconst (SUBconst x [d]) [c]) 35195 // cond: is32Bit(-c-d) 35196 // result: (ADDconst [-c-d] x) 35197 for { 35198 c := v.AuxInt 35199 v_0 := v.Args[0] 35200 if v_0.Op != OpS390XSUBconst { 35201 break 35202 } 35203 d := v_0.AuxInt 35204 x := v_0.Args[0] 35205 if !(is32Bit(-c - d)) { 35206 break 35207 } 35208 v.reset(OpS390XADDconst) 35209 v.AuxInt = -c - d 35210 v.AddArg(x) 35211 return true 35212 } 35213 return false 35214 } 35215 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 35216 // match: (XOR x (MOVDconst [c])) 35217 // cond: isU32Bit(c) 35218 // result: (XORconst [c] x) 35219 for { 35220 _ = v.Args[1] 35221 x := v.Args[0] 35222 v_1 := v.Args[1] 35223 if v_1.Op != OpS390XMOVDconst { 35224 break 35225 } 35226 c := v_1.AuxInt 35227 if !(isU32Bit(c)) { 35228 break 35229 } 35230 v.reset(OpS390XXORconst) 35231 v.AuxInt = c 35232 v.AddArg(x) 35233 return true 35234 } 35235 // match: (XOR (MOVDconst [c]) x) 35236 // cond: isU32Bit(c) 35237 // result: (XORconst [c] x) 35238 for { 35239 _ = v.Args[1] 35240 v_0 := v.Args[0] 35241 if v_0.Op != OpS390XMOVDconst { 35242 break 35243 } 35244 c := v_0.AuxInt 35245 x := v.Args[1] 35246 if !(isU32Bit(c)) { 35247 break 35248 } 35249 v.reset(OpS390XXORconst) 35250 v.AuxInt = c 35251 v.AddArg(x) 35252 return true 35253 } 35254 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 35255 // cond: d == 64-c 35256 // result: (RLLGconst [c] x) 35257 for { 35258 _ = v.Args[1] 35259 v_0 := v.Args[0] 35260 if v_0.Op != OpS390XSLDconst { 35261 break 35262 } 35263 c := v_0.AuxInt 35264 x := v_0.Args[0] 35265 v_1 := v.Args[1] 35266 if v_1.Op != OpS390XSRDconst { 35267 break 35268 } 35269 d := v_1.AuxInt 35270 if x != v_1.Args[0] { 35271 break 35272 } 35273 if !(d == 64-c) { 35274 break 35275 } 35276 v.reset(OpS390XRLLGconst) 35277 v.AuxInt = c 35278 v.AddArg(x) 35279 return true 35280 } 35281 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 35282 // cond: d == 64-c 35283 // result: (RLLGconst [c] x) 35284 for { 35285 _ = v.Args[1] 35286 v_0 := v.Args[0] 35287 if v_0.Op != OpS390XSRDconst { 35288 break 35289 } 35290 d := v_0.AuxInt 35291 x := v_0.Args[0] 35292 v_1 := v.Args[1] 35293 if v_1.Op != OpS390XSLDconst { 35294 break 35295 } 35296 c := v_1.AuxInt 35297 if x != v_1.Args[0] { 35298 break 35299 } 35300 if !(d == 64-c) { 35301 break 35302 } 35303 v.reset(OpS390XRLLGconst) 35304 v.AuxInt = c 35305 v.AddArg(x) 35306 return true 35307 } 35308 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 35309 // cond: 35310 // result: (MOVDconst [c^d]) 35311 for { 35312 _ = v.Args[1] 35313 v_0 := v.Args[0] 35314 if v_0.Op != OpS390XMOVDconst { 35315 break 35316 } 35317 c := v_0.AuxInt 35318 v_1 := v.Args[1] 35319 if v_1.Op != OpS390XMOVDconst { 35320 break 35321 } 35322 d := v_1.AuxInt 35323 v.reset(OpS390XMOVDconst) 35324 v.AuxInt = c ^ d 35325 return true 35326 } 35327 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 35328 // cond: 35329 // result: (MOVDconst [c^d]) 35330 for { 35331 _ = v.Args[1] 35332 v_0 := v.Args[0] 35333 if v_0.Op != OpS390XMOVDconst { 35334 break 35335 } 35336 d := v_0.AuxInt 35337 v_1 := v.Args[1] 35338 if v_1.Op != OpS390XMOVDconst { 35339 break 35340 } 35341 c := v_1.AuxInt 35342 v.reset(OpS390XMOVDconst) 35343 v.AuxInt = c ^ d 35344 return true 35345 } 35346 // match: (XOR x x) 35347 // cond: 35348 // result: (MOVDconst [0]) 35349 for { 35350 _ = v.Args[1] 35351 x := v.Args[0] 35352 if x != v.Args[1] { 35353 break 35354 } 35355 v.reset(OpS390XMOVDconst) 35356 v.AuxInt = 0 35357 return true 35358 } 35359 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35360 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35361 // result: (XORload <t> [off] {sym} x ptr mem) 35362 for { 35363 t := v.Type 35364 _ = v.Args[1] 35365 x := v.Args[0] 35366 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35376 break 35377 } 35378 v.reset(OpS390XXORload) 35379 v.Type = t 35380 v.AuxInt = off 35381 v.Aux = sym 35382 v.AddArg(x) 35383 v.AddArg(ptr) 35384 v.AddArg(mem) 35385 return true 35386 } 35387 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35388 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35389 // result: (XORload <t> [off] {sym} x ptr mem) 35390 for { 35391 t := v.Type 35392 _ = v.Args[1] 35393 g := v.Args[0] 35394 if g.Op != OpS390XMOVDload { 35395 break 35396 } 35397 off := g.AuxInt 35398 sym := g.Aux 35399 _ = g.Args[1] 35400 ptr := g.Args[0] 35401 mem := g.Args[1] 35402 x := v.Args[1] 35403 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35404 break 35405 } 35406 v.reset(OpS390XXORload) 35407 v.Type = t 35408 v.AuxInt = off 35409 v.Aux = sym 35410 v.AddArg(x) 35411 v.AddArg(ptr) 35412 v.AddArg(mem) 35413 return true 35414 } 35415 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35416 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35417 // result: (XORload <t> [off] {sym} x ptr mem) 35418 for { 35419 t := v.Type 35420 _ = v.Args[1] 35421 g := v.Args[0] 35422 if g.Op != OpS390XMOVDload { 35423 break 35424 } 35425 off := g.AuxInt 35426 sym := g.Aux 35427 _ = g.Args[1] 35428 ptr := g.Args[0] 35429 mem := g.Args[1] 35430 x := v.Args[1] 35431 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35432 break 35433 } 35434 v.reset(OpS390XXORload) 35435 v.Type = t 35436 v.AuxInt = off 35437 v.Aux = sym 35438 v.AddArg(x) 35439 v.AddArg(ptr) 35440 v.AddArg(mem) 35441 return true 35442 } 35443 return false 35444 } 35445 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 35446 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35447 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35448 // result: (XORload <t> [off] {sym} x ptr mem) 35449 for { 35450 t := v.Type 35451 _ = v.Args[1] 35452 x := v.Args[0] 35453 g := v.Args[1] 35454 if g.Op != OpS390XMOVDload { 35455 break 35456 } 35457 off := g.AuxInt 35458 sym := g.Aux 35459 _ = g.Args[1] 35460 ptr := g.Args[0] 35461 mem := g.Args[1] 35462 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35463 break 35464 } 35465 v.reset(OpS390XXORload) 35466 v.Type = t 35467 v.AuxInt = off 35468 v.Aux = sym 35469 v.AddArg(x) 35470 v.AddArg(ptr) 35471 v.AddArg(mem) 35472 return true 35473 } 35474 return false 35475 } 35476 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 35477 // match: (XORW x (MOVDconst [c])) 35478 // cond: 35479 // result: (XORWconst [c] x) 35480 for { 35481 _ = v.Args[1] 35482 x := v.Args[0] 35483 v_1 := v.Args[1] 35484 if v_1.Op != OpS390XMOVDconst { 35485 break 35486 } 35487 c := v_1.AuxInt 35488 v.reset(OpS390XXORWconst) 35489 v.AuxInt = c 35490 v.AddArg(x) 35491 return true 35492 } 35493 // match: (XORW (MOVDconst [c]) x) 35494 // cond: 35495 // result: (XORWconst [c] x) 35496 for { 35497 _ = v.Args[1] 35498 v_0 := v.Args[0] 35499 if v_0.Op != OpS390XMOVDconst { 35500 break 35501 } 35502 c := v_0.AuxInt 35503 x := v.Args[1] 35504 v.reset(OpS390XXORWconst) 35505 v.AuxInt = c 35506 v.AddArg(x) 35507 return true 35508 } 35509 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 35510 // cond: d == 32-c 35511 // result: (RLLconst [c] x) 35512 for { 35513 _ = v.Args[1] 35514 v_0 := v.Args[0] 35515 if v_0.Op != OpS390XSLWconst { 35516 break 35517 } 35518 c := v_0.AuxInt 35519 x := v_0.Args[0] 35520 v_1 := v.Args[1] 35521 if v_1.Op != OpS390XSRWconst { 35522 break 35523 } 35524 d := v_1.AuxInt 35525 if x != v_1.Args[0] { 35526 break 35527 } 35528 if !(d == 32-c) { 35529 break 35530 } 35531 v.reset(OpS390XRLLconst) 35532 v.AuxInt = c 35533 v.AddArg(x) 35534 return true 35535 } 35536 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 35537 // cond: d == 32-c 35538 // result: (RLLconst [c] x) 35539 for { 35540 _ = v.Args[1] 35541 v_0 := v.Args[0] 35542 if v_0.Op != OpS390XSRWconst { 35543 break 35544 } 35545 d := v_0.AuxInt 35546 x := v_0.Args[0] 35547 v_1 := v.Args[1] 35548 if v_1.Op != OpS390XSLWconst { 35549 break 35550 } 35551 c := v_1.AuxInt 35552 if x != v_1.Args[0] { 35553 break 35554 } 35555 if !(d == 32-c) { 35556 break 35557 } 35558 v.reset(OpS390XRLLconst) 35559 v.AuxInt = c 35560 v.AddArg(x) 35561 return true 35562 } 35563 // match: (XORW x x) 35564 // cond: 35565 // result: (MOVDconst [0]) 35566 for { 35567 _ = v.Args[1] 35568 x := v.Args[0] 35569 if x != v.Args[1] { 35570 break 35571 } 35572 v.reset(OpS390XMOVDconst) 35573 v.AuxInt = 0 35574 return true 35575 } 35576 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35577 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35578 // result: (XORWload <t> [off] {sym} x ptr mem) 35579 for { 35580 t := v.Type 35581 _ = v.Args[1] 35582 x := v.Args[0] 35583 g := v.Args[1] 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 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35593 break 35594 } 35595 v.reset(OpS390XXORWload) 35596 v.Type = t 35597 v.AuxInt = off 35598 v.Aux = sym 35599 v.AddArg(x) 35600 v.AddArg(ptr) 35601 v.AddArg(mem) 35602 return true 35603 } 35604 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35605 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35606 // result: (XORWload <t> [off] {sym} x ptr mem) 35607 for { 35608 t := v.Type 35609 _ = v.Args[1] 35610 g := v.Args[0] 35611 if g.Op != OpS390XMOVWload { 35612 break 35613 } 35614 off := g.AuxInt 35615 sym := g.Aux 35616 _ = g.Args[1] 35617 ptr := g.Args[0] 35618 mem := g.Args[1] 35619 x := v.Args[1] 35620 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35621 break 35622 } 35623 v.reset(OpS390XXORWload) 35624 v.Type = t 35625 v.AuxInt = off 35626 v.Aux = sym 35627 v.AddArg(x) 35628 v.AddArg(ptr) 35629 v.AddArg(mem) 35630 return true 35631 } 35632 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35633 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35634 // result: (XORWload <t> [off] {sym} x ptr mem) 35635 for { 35636 t := v.Type 35637 _ = v.Args[1] 35638 g := v.Args[0] 35639 if g.Op != OpS390XMOVWload { 35640 break 35641 } 35642 off := g.AuxInt 35643 sym := g.Aux 35644 _ = g.Args[1] 35645 ptr := g.Args[0] 35646 mem := g.Args[1] 35647 x := v.Args[1] 35648 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35649 break 35650 } 35651 v.reset(OpS390XXORWload) 35652 v.Type = t 35653 v.AuxInt = off 35654 v.Aux = sym 35655 v.AddArg(x) 35656 v.AddArg(ptr) 35657 v.AddArg(mem) 35658 return true 35659 } 35660 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35661 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35662 // result: (XORWload <t> [off] {sym} x ptr mem) 35663 for { 35664 t := v.Type 35665 _ = v.Args[1] 35666 x := v.Args[0] 35667 g := v.Args[1] 35668 if g.Op != OpS390XMOVWload { 35669 break 35670 } 35671 off := g.AuxInt 35672 sym := g.Aux 35673 _ = g.Args[1] 35674 ptr := g.Args[0] 35675 mem := g.Args[1] 35676 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35677 break 35678 } 35679 v.reset(OpS390XXORWload) 35680 v.Type = t 35681 v.AuxInt = off 35682 v.Aux = sym 35683 v.AddArg(x) 35684 v.AddArg(ptr) 35685 v.AddArg(mem) 35686 return true 35687 } 35688 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35689 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35690 // result: (XORWload <t> [off] {sym} x ptr mem) 35691 for { 35692 t := v.Type 35693 _ = v.Args[1] 35694 x := v.Args[0] 35695 g := v.Args[1] 35696 if g.Op != OpS390XMOVWZload { 35697 break 35698 } 35699 off := g.AuxInt 35700 sym := g.Aux 35701 _ = g.Args[1] 35702 ptr := g.Args[0] 35703 mem := g.Args[1] 35704 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35705 break 35706 } 35707 v.reset(OpS390XXORWload) 35708 v.Type = t 35709 v.AuxInt = off 35710 v.Aux = sym 35711 v.AddArg(x) 35712 v.AddArg(ptr) 35713 v.AddArg(mem) 35714 return true 35715 } 35716 return false 35717 } 35718 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 35719 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35720 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35721 // result: (XORWload <t> [off] {sym} x ptr mem) 35722 for { 35723 t := v.Type 35724 _ = v.Args[1] 35725 g := v.Args[0] 35726 if g.Op != OpS390XMOVWZload { 35727 break 35728 } 35729 off := g.AuxInt 35730 sym := g.Aux 35731 _ = g.Args[1] 35732 ptr := g.Args[0] 35733 mem := g.Args[1] 35734 x := v.Args[1] 35735 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35736 break 35737 } 35738 v.reset(OpS390XXORWload) 35739 v.Type = t 35740 v.AuxInt = off 35741 v.Aux = sym 35742 v.AddArg(x) 35743 v.AddArg(ptr) 35744 v.AddArg(mem) 35745 return true 35746 } 35747 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35748 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35749 // result: (XORWload <t> [off] {sym} x ptr mem) 35750 for { 35751 t := v.Type 35752 _ = v.Args[1] 35753 g := v.Args[0] 35754 if g.Op != OpS390XMOVWZload { 35755 break 35756 } 35757 off := g.AuxInt 35758 sym := g.Aux 35759 _ = g.Args[1] 35760 ptr := g.Args[0] 35761 mem := g.Args[1] 35762 x := v.Args[1] 35763 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35764 break 35765 } 35766 v.reset(OpS390XXORWload) 35767 v.Type = t 35768 v.AuxInt = off 35769 v.Aux = sym 35770 v.AddArg(x) 35771 v.AddArg(ptr) 35772 v.AddArg(mem) 35773 return true 35774 } 35775 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35776 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35777 // result: (XORWload <t> [off] {sym} x ptr mem) 35778 for { 35779 t := v.Type 35780 _ = v.Args[1] 35781 x := v.Args[0] 35782 g := v.Args[1] 35783 if g.Op != OpS390XMOVWZload { 35784 break 35785 } 35786 off := g.AuxInt 35787 sym := g.Aux 35788 _ = g.Args[1] 35789 ptr := g.Args[0] 35790 mem := g.Args[1] 35791 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35792 break 35793 } 35794 v.reset(OpS390XXORWload) 35795 v.Type = t 35796 v.AuxInt = off 35797 v.Aux = sym 35798 v.AddArg(x) 35799 v.AddArg(ptr) 35800 v.AddArg(mem) 35801 return true 35802 } 35803 return false 35804 } 35805 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 35806 // match: (XORWconst [c] x) 35807 // cond: int32(c)==0 35808 // result: x 35809 for { 35810 c := v.AuxInt 35811 x := v.Args[0] 35812 if !(int32(c) == 0) { 35813 break 35814 } 35815 v.reset(OpCopy) 35816 v.Type = x.Type 35817 v.AddArg(x) 35818 return true 35819 } 35820 // match: (XORWconst [c] (MOVDconst [d])) 35821 // cond: 35822 // result: (MOVDconst [c^d]) 35823 for { 35824 c := v.AuxInt 35825 v_0 := v.Args[0] 35826 if v_0.Op != OpS390XMOVDconst { 35827 break 35828 } 35829 d := v_0.AuxInt 35830 v.reset(OpS390XMOVDconst) 35831 v.AuxInt = c ^ d 35832 return true 35833 } 35834 return false 35835 } 35836 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 35837 // match: (XORconst [0] x) 35838 // cond: 35839 // result: x 35840 for { 35841 if v.AuxInt != 0 { 35842 break 35843 } 35844 x := v.Args[0] 35845 v.reset(OpCopy) 35846 v.Type = x.Type 35847 v.AddArg(x) 35848 return true 35849 } 35850 // match: (XORconst [c] (MOVDconst [d])) 35851 // cond: 35852 // result: (MOVDconst [c^d]) 35853 for { 35854 c := v.AuxInt 35855 v_0 := v.Args[0] 35856 if v_0.Op != OpS390XMOVDconst { 35857 break 35858 } 35859 d := v_0.AuxInt 35860 v.reset(OpS390XMOVDconst) 35861 v.AuxInt = c ^ d 35862 return true 35863 } 35864 return false 35865 } 35866 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 35867 b := v.Block 35868 _ = b 35869 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 35870 // cond: 35871 // result: (ADDW val (Select0 <t> tuple)) 35872 for { 35873 t := v.Type 35874 v_0 := v.Args[0] 35875 if v_0.Op != OpS390XAddTupleFirst32 { 35876 break 35877 } 35878 _ = v_0.Args[1] 35879 val := v_0.Args[0] 35880 tuple := v_0.Args[1] 35881 v.reset(OpS390XADDW) 35882 v.AddArg(val) 35883 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35884 v0.AddArg(tuple) 35885 v.AddArg(v0) 35886 return true 35887 } 35888 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 35889 // cond: 35890 // result: (ADD val (Select0 <t> tuple)) 35891 for { 35892 t := v.Type 35893 v_0 := v.Args[0] 35894 if v_0.Op != OpS390XAddTupleFirst64 { 35895 break 35896 } 35897 _ = v_0.Args[1] 35898 val := v_0.Args[0] 35899 tuple := v_0.Args[1] 35900 v.reset(OpS390XADD) 35901 v.AddArg(val) 35902 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35903 v0.AddArg(tuple) 35904 v.AddArg(v0) 35905 return true 35906 } 35907 return false 35908 } 35909 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 35910 // match: (Select1 (AddTupleFirst32 _ tuple)) 35911 // cond: 35912 // result: (Select1 tuple) 35913 for { 35914 v_0 := v.Args[0] 35915 if v_0.Op != OpS390XAddTupleFirst32 { 35916 break 35917 } 35918 _ = v_0.Args[1] 35919 tuple := v_0.Args[1] 35920 v.reset(OpSelect1) 35921 v.AddArg(tuple) 35922 return true 35923 } 35924 // match: (Select1 (AddTupleFirst64 _ tuple)) 35925 // cond: 35926 // result: (Select1 tuple) 35927 for { 35928 v_0 := v.Args[0] 35929 if v_0.Op != OpS390XAddTupleFirst64 { 35930 break 35931 } 35932 _ = v_0.Args[1] 35933 tuple := v_0.Args[1] 35934 v.reset(OpSelect1) 35935 v.AddArg(tuple) 35936 return true 35937 } 35938 return false 35939 } 35940 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 35941 // match: (SignExt16to32 x) 35942 // cond: 35943 // result: (MOVHreg x) 35944 for { 35945 x := v.Args[0] 35946 v.reset(OpS390XMOVHreg) 35947 v.AddArg(x) 35948 return true 35949 } 35950 } 35951 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 35952 // match: (SignExt16to64 x) 35953 // cond: 35954 // result: (MOVHreg x) 35955 for { 35956 x := v.Args[0] 35957 v.reset(OpS390XMOVHreg) 35958 v.AddArg(x) 35959 return true 35960 } 35961 } 35962 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 35963 // match: (SignExt32to64 x) 35964 // cond: 35965 // result: (MOVWreg x) 35966 for { 35967 x := v.Args[0] 35968 v.reset(OpS390XMOVWreg) 35969 v.AddArg(x) 35970 return true 35971 } 35972 } 35973 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 35974 // match: (SignExt8to16 x) 35975 // cond: 35976 // result: (MOVBreg x) 35977 for { 35978 x := v.Args[0] 35979 v.reset(OpS390XMOVBreg) 35980 v.AddArg(x) 35981 return true 35982 } 35983 } 35984 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 35985 // match: (SignExt8to32 x) 35986 // cond: 35987 // result: (MOVBreg x) 35988 for { 35989 x := v.Args[0] 35990 v.reset(OpS390XMOVBreg) 35991 v.AddArg(x) 35992 return true 35993 } 35994 } 35995 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 35996 // match: (SignExt8to64 x) 35997 // cond: 35998 // result: (MOVBreg x) 35999 for { 36000 x := v.Args[0] 36001 v.reset(OpS390XMOVBreg) 36002 v.AddArg(x) 36003 return true 36004 } 36005 } 36006 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 36007 b := v.Block 36008 _ = b 36009 // match: (Slicemask <t> x) 36010 // cond: 36011 // result: (SRADconst (NEG <t> x) [63]) 36012 for { 36013 t := v.Type 36014 x := v.Args[0] 36015 v.reset(OpS390XSRADconst) 36016 v.AuxInt = 63 36017 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 36018 v0.AddArg(x) 36019 v.AddArg(v0) 36020 return true 36021 } 36022 } 36023 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 36024 // match: (Sqrt x) 36025 // cond: 36026 // result: (FSQRT x) 36027 for { 36028 x := v.Args[0] 36029 v.reset(OpS390XFSQRT) 36030 v.AddArg(x) 36031 return true 36032 } 36033 } 36034 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 36035 // match: (StaticCall [argwid] {target} mem) 36036 // cond: 36037 // result: (CALLstatic [argwid] {target} mem) 36038 for { 36039 argwid := v.AuxInt 36040 target := v.Aux 36041 mem := v.Args[0] 36042 v.reset(OpS390XCALLstatic) 36043 v.AuxInt = argwid 36044 v.Aux = target 36045 v.AddArg(mem) 36046 return true 36047 } 36048 } 36049 func rewriteValueS390X_OpStore_0(v *Value) bool { 36050 // match: (Store {t} ptr val mem) 36051 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 36052 // result: (FMOVDstore ptr val mem) 36053 for { 36054 t := v.Aux 36055 _ = v.Args[2] 36056 ptr := v.Args[0] 36057 val := v.Args[1] 36058 mem := v.Args[2] 36059 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 36060 break 36061 } 36062 v.reset(OpS390XFMOVDstore) 36063 v.AddArg(ptr) 36064 v.AddArg(val) 36065 v.AddArg(mem) 36066 return true 36067 } 36068 // match: (Store {t} ptr val mem) 36069 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 36070 // result: (FMOVSstore ptr val mem) 36071 for { 36072 t := v.Aux 36073 _ = v.Args[2] 36074 ptr := v.Args[0] 36075 val := v.Args[1] 36076 mem := v.Args[2] 36077 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 36078 break 36079 } 36080 v.reset(OpS390XFMOVSstore) 36081 v.AddArg(ptr) 36082 v.AddArg(val) 36083 v.AddArg(mem) 36084 return true 36085 } 36086 // match: (Store {t} ptr val mem) 36087 // cond: t.(*types.Type).Size() == 8 36088 // result: (MOVDstore ptr val mem) 36089 for { 36090 t := v.Aux 36091 _ = v.Args[2] 36092 ptr := v.Args[0] 36093 val := v.Args[1] 36094 mem := v.Args[2] 36095 if !(t.(*types.Type).Size() == 8) { 36096 break 36097 } 36098 v.reset(OpS390XMOVDstore) 36099 v.AddArg(ptr) 36100 v.AddArg(val) 36101 v.AddArg(mem) 36102 return true 36103 } 36104 // match: (Store {t} ptr val mem) 36105 // cond: t.(*types.Type).Size() == 4 36106 // result: (MOVWstore ptr val mem) 36107 for { 36108 t := v.Aux 36109 _ = v.Args[2] 36110 ptr := v.Args[0] 36111 val := v.Args[1] 36112 mem := v.Args[2] 36113 if !(t.(*types.Type).Size() == 4) { 36114 break 36115 } 36116 v.reset(OpS390XMOVWstore) 36117 v.AddArg(ptr) 36118 v.AddArg(val) 36119 v.AddArg(mem) 36120 return true 36121 } 36122 // match: (Store {t} ptr val mem) 36123 // cond: t.(*types.Type).Size() == 2 36124 // result: (MOVHstore ptr val mem) 36125 for { 36126 t := v.Aux 36127 _ = v.Args[2] 36128 ptr := v.Args[0] 36129 val := v.Args[1] 36130 mem := v.Args[2] 36131 if !(t.(*types.Type).Size() == 2) { 36132 break 36133 } 36134 v.reset(OpS390XMOVHstore) 36135 v.AddArg(ptr) 36136 v.AddArg(val) 36137 v.AddArg(mem) 36138 return true 36139 } 36140 // match: (Store {t} ptr val mem) 36141 // cond: t.(*types.Type).Size() == 1 36142 // result: (MOVBstore ptr val mem) 36143 for { 36144 t := v.Aux 36145 _ = v.Args[2] 36146 ptr := v.Args[0] 36147 val := v.Args[1] 36148 mem := v.Args[2] 36149 if !(t.(*types.Type).Size() == 1) { 36150 break 36151 } 36152 v.reset(OpS390XMOVBstore) 36153 v.AddArg(ptr) 36154 v.AddArg(val) 36155 v.AddArg(mem) 36156 return true 36157 } 36158 return false 36159 } 36160 func rewriteValueS390X_OpSub16_0(v *Value) bool { 36161 // match: (Sub16 x y) 36162 // cond: 36163 // result: (SUBW x y) 36164 for { 36165 _ = v.Args[1] 36166 x := v.Args[0] 36167 y := v.Args[1] 36168 v.reset(OpS390XSUBW) 36169 v.AddArg(x) 36170 v.AddArg(y) 36171 return true 36172 } 36173 } 36174 func rewriteValueS390X_OpSub32_0(v *Value) bool { 36175 // match: (Sub32 x y) 36176 // cond: 36177 // result: (SUBW x y) 36178 for { 36179 _ = v.Args[1] 36180 x := v.Args[0] 36181 y := v.Args[1] 36182 v.reset(OpS390XSUBW) 36183 v.AddArg(x) 36184 v.AddArg(y) 36185 return true 36186 } 36187 } 36188 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 36189 // match: (Sub32F x y) 36190 // cond: 36191 // result: (FSUBS x y) 36192 for { 36193 _ = v.Args[1] 36194 x := v.Args[0] 36195 y := v.Args[1] 36196 v.reset(OpS390XFSUBS) 36197 v.AddArg(x) 36198 v.AddArg(y) 36199 return true 36200 } 36201 } 36202 func rewriteValueS390X_OpSub64_0(v *Value) bool { 36203 // match: (Sub64 x y) 36204 // cond: 36205 // result: (SUB x y) 36206 for { 36207 _ = v.Args[1] 36208 x := v.Args[0] 36209 y := v.Args[1] 36210 v.reset(OpS390XSUB) 36211 v.AddArg(x) 36212 v.AddArg(y) 36213 return true 36214 } 36215 } 36216 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 36217 // match: (Sub64F x y) 36218 // cond: 36219 // result: (FSUB x y) 36220 for { 36221 _ = v.Args[1] 36222 x := v.Args[0] 36223 y := v.Args[1] 36224 v.reset(OpS390XFSUB) 36225 v.AddArg(x) 36226 v.AddArg(y) 36227 return true 36228 } 36229 } 36230 func rewriteValueS390X_OpSub8_0(v *Value) bool { 36231 // match: (Sub8 x y) 36232 // cond: 36233 // result: (SUBW x y) 36234 for { 36235 _ = v.Args[1] 36236 x := v.Args[0] 36237 y := v.Args[1] 36238 v.reset(OpS390XSUBW) 36239 v.AddArg(x) 36240 v.AddArg(y) 36241 return true 36242 } 36243 } 36244 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 36245 // match: (SubPtr x y) 36246 // cond: 36247 // result: (SUB x y) 36248 for { 36249 _ = v.Args[1] 36250 x := v.Args[0] 36251 y := v.Args[1] 36252 v.reset(OpS390XSUB) 36253 v.AddArg(x) 36254 v.AddArg(y) 36255 return true 36256 } 36257 } 36258 func rewriteValueS390X_OpTrunc_0(v *Value) bool { 36259 // match: (Trunc x) 36260 // cond: 36261 // result: (FIDBR [5] x) 36262 for { 36263 x := v.Args[0] 36264 v.reset(OpS390XFIDBR) 36265 v.AuxInt = 5 36266 v.AddArg(x) 36267 return true 36268 } 36269 } 36270 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 36271 // match: (Trunc16to8 x) 36272 // cond: 36273 // result: x 36274 for { 36275 x := v.Args[0] 36276 v.reset(OpCopy) 36277 v.Type = x.Type 36278 v.AddArg(x) 36279 return true 36280 } 36281 } 36282 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 36283 // match: (Trunc32to16 x) 36284 // cond: 36285 // result: x 36286 for { 36287 x := v.Args[0] 36288 v.reset(OpCopy) 36289 v.Type = x.Type 36290 v.AddArg(x) 36291 return true 36292 } 36293 } 36294 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 36295 // match: (Trunc32to8 x) 36296 // cond: 36297 // result: x 36298 for { 36299 x := v.Args[0] 36300 v.reset(OpCopy) 36301 v.Type = x.Type 36302 v.AddArg(x) 36303 return true 36304 } 36305 } 36306 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 36307 // match: (Trunc64to16 x) 36308 // cond: 36309 // result: x 36310 for { 36311 x := v.Args[0] 36312 v.reset(OpCopy) 36313 v.Type = x.Type 36314 v.AddArg(x) 36315 return true 36316 } 36317 } 36318 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 36319 // match: (Trunc64to32 x) 36320 // cond: 36321 // result: x 36322 for { 36323 x := v.Args[0] 36324 v.reset(OpCopy) 36325 v.Type = x.Type 36326 v.AddArg(x) 36327 return true 36328 } 36329 } 36330 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 36331 // match: (Trunc64to8 x) 36332 // cond: 36333 // result: x 36334 for { 36335 x := v.Args[0] 36336 v.reset(OpCopy) 36337 v.Type = x.Type 36338 v.AddArg(x) 36339 return true 36340 } 36341 } 36342 func rewriteValueS390X_OpXor16_0(v *Value) bool { 36343 // match: (Xor16 x y) 36344 // cond: 36345 // result: (XORW x y) 36346 for { 36347 _ = v.Args[1] 36348 x := v.Args[0] 36349 y := v.Args[1] 36350 v.reset(OpS390XXORW) 36351 v.AddArg(x) 36352 v.AddArg(y) 36353 return true 36354 } 36355 } 36356 func rewriteValueS390X_OpXor32_0(v *Value) bool { 36357 // match: (Xor32 x y) 36358 // cond: 36359 // result: (XORW x y) 36360 for { 36361 _ = v.Args[1] 36362 x := v.Args[0] 36363 y := v.Args[1] 36364 v.reset(OpS390XXORW) 36365 v.AddArg(x) 36366 v.AddArg(y) 36367 return true 36368 } 36369 } 36370 func rewriteValueS390X_OpXor64_0(v *Value) bool { 36371 // match: (Xor64 x y) 36372 // cond: 36373 // result: (XOR x y) 36374 for { 36375 _ = v.Args[1] 36376 x := v.Args[0] 36377 y := v.Args[1] 36378 v.reset(OpS390XXOR) 36379 v.AddArg(x) 36380 v.AddArg(y) 36381 return true 36382 } 36383 } 36384 func rewriteValueS390X_OpXor8_0(v *Value) bool { 36385 // match: (Xor8 x y) 36386 // cond: 36387 // result: (XORW x y) 36388 for { 36389 _ = v.Args[1] 36390 x := v.Args[0] 36391 y := v.Args[1] 36392 v.reset(OpS390XXORW) 36393 v.AddArg(x) 36394 v.AddArg(y) 36395 return true 36396 } 36397 } 36398 func rewriteValueS390X_OpZero_0(v *Value) bool { 36399 b := v.Block 36400 _ = b 36401 // match: (Zero [0] _ mem) 36402 // cond: 36403 // result: mem 36404 for { 36405 if v.AuxInt != 0 { 36406 break 36407 } 36408 _ = v.Args[1] 36409 mem := v.Args[1] 36410 v.reset(OpCopy) 36411 v.Type = mem.Type 36412 v.AddArg(mem) 36413 return true 36414 } 36415 // match: (Zero [1] destptr mem) 36416 // cond: 36417 // result: (MOVBstoreconst [0] destptr mem) 36418 for { 36419 if v.AuxInt != 1 { 36420 break 36421 } 36422 _ = v.Args[1] 36423 destptr := v.Args[0] 36424 mem := v.Args[1] 36425 v.reset(OpS390XMOVBstoreconst) 36426 v.AuxInt = 0 36427 v.AddArg(destptr) 36428 v.AddArg(mem) 36429 return true 36430 } 36431 // match: (Zero [2] destptr mem) 36432 // cond: 36433 // result: (MOVHstoreconst [0] destptr mem) 36434 for { 36435 if v.AuxInt != 2 { 36436 break 36437 } 36438 _ = v.Args[1] 36439 destptr := v.Args[0] 36440 mem := v.Args[1] 36441 v.reset(OpS390XMOVHstoreconst) 36442 v.AuxInt = 0 36443 v.AddArg(destptr) 36444 v.AddArg(mem) 36445 return true 36446 } 36447 // match: (Zero [4] destptr mem) 36448 // cond: 36449 // result: (MOVWstoreconst [0] destptr mem) 36450 for { 36451 if v.AuxInt != 4 { 36452 break 36453 } 36454 _ = v.Args[1] 36455 destptr := v.Args[0] 36456 mem := v.Args[1] 36457 v.reset(OpS390XMOVWstoreconst) 36458 v.AuxInt = 0 36459 v.AddArg(destptr) 36460 v.AddArg(mem) 36461 return true 36462 } 36463 // match: (Zero [8] destptr mem) 36464 // cond: 36465 // result: (MOVDstoreconst [0] destptr mem) 36466 for { 36467 if v.AuxInt != 8 { 36468 break 36469 } 36470 _ = v.Args[1] 36471 destptr := v.Args[0] 36472 mem := v.Args[1] 36473 v.reset(OpS390XMOVDstoreconst) 36474 v.AuxInt = 0 36475 v.AddArg(destptr) 36476 v.AddArg(mem) 36477 return true 36478 } 36479 // match: (Zero [3] destptr mem) 36480 // cond: 36481 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 36482 for { 36483 if v.AuxInt != 3 { 36484 break 36485 } 36486 _ = v.Args[1] 36487 destptr := v.Args[0] 36488 mem := v.Args[1] 36489 v.reset(OpS390XMOVBstoreconst) 36490 v.AuxInt = makeValAndOff(0, 2) 36491 v.AddArg(destptr) 36492 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 36493 v0.AuxInt = 0 36494 v0.AddArg(destptr) 36495 v0.AddArg(mem) 36496 v.AddArg(v0) 36497 return true 36498 } 36499 // match: (Zero [5] destptr mem) 36500 // cond: 36501 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36502 for { 36503 if v.AuxInt != 5 { 36504 break 36505 } 36506 _ = v.Args[1] 36507 destptr := v.Args[0] 36508 mem := v.Args[1] 36509 v.reset(OpS390XMOVBstoreconst) 36510 v.AuxInt = makeValAndOff(0, 4) 36511 v.AddArg(destptr) 36512 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36513 v0.AuxInt = 0 36514 v0.AddArg(destptr) 36515 v0.AddArg(mem) 36516 v.AddArg(v0) 36517 return true 36518 } 36519 // match: (Zero [6] destptr mem) 36520 // cond: 36521 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36522 for { 36523 if v.AuxInt != 6 { 36524 break 36525 } 36526 _ = v.Args[1] 36527 destptr := v.Args[0] 36528 mem := v.Args[1] 36529 v.reset(OpS390XMOVHstoreconst) 36530 v.AuxInt = makeValAndOff(0, 4) 36531 v.AddArg(destptr) 36532 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36533 v0.AuxInt = 0 36534 v0.AddArg(destptr) 36535 v0.AddArg(mem) 36536 v.AddArg(v0) 36537 return true 36538 } 36539 // match: (Zero [7] destptr mem) 36540 // cond: 36541 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 36542 for { 36543 if v.AuxInt != 7 { 36544 break 36545 } 36546 _ = v.Args[1] 36547 destptr := v.Args[0] 36548 mem := v.Args[1] 36549 v.reset(OpS390XMOVWstoreconst) 36550 v.AuxInt = makeValAndOff(0, 3) 36551 v.AddArg(destptr) 36552 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36553 v0.AuxInt = 0 36554 v0.AddArg(destptr) 36555 v0.AddArg(mem) 36556 v.AddArg(v0) 36557 return true 36558 } 36559 // match: (Zero [s] destptr mem) 36560 // cond: s > 0 && s <= 1024 36561 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 36562 for { 36563 s := v.AuxInt 36564 _ = v.Args[1] 36565 destptr := v.Args[0] 36566 mem := v.Args[1] 36567 if !(s > 0 && s <= 1024) { 36568 break 36569 } 36570 v.reset(OpS390XCLEAR) 36571 v.AuxInt = makeValAndOff(s, 0) 36572 v.AddArg(destptr) 36573 v.AddArg(mem) 36574 return true 36575 } 36576 return false 36577 } 36578 func rewriteValueS390X_OpZero_10(v *Value) bool { 36579 b := v.Block 36580 _ = b 36581 // match: (Zero [s] destptr mem) 36582 // cond: s > 1024 36583 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 36584 for { 36585 s := v.AuxInt 36586 _ = v.Args[1] 36587 destptr := v.Args[0] 36588 mem := v.Args[1] 36589 if !(s > 1024) { 36590 break 36591 } 36592 v.reset(OpS390XLoweredZero) 36593 v.AuxInt = s % 256 36594 v.AddArg(destptr) 36595 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 36596 v0.AuxInt = (s / 256) * 256 36597 v0.AddArg(destptr) 36598 v.AddArg(v0) 36599 v.AddArg(mem) 36600 return true 36601 } 36602 return false 36603 } 36604 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 36605 // match: (ZeroExt16to32 x) 36606 // cond: 36607 // result: (MOVHZreg x) 36608 for { 36609 x := v.Args[0] 36610 v.reset(OpS390XMOVHZreg) 36611 v.AddArg(x) 36612 return true 36613 } 36614 } 36615 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 36616 // match: (ZeroExt16to64 x) 36617 // cond: 36618 // result: (MOVHZreg x) 36619 for { 36620 x := v.Args[0] 36621 v.reset(OpS390XMOVHZreg) 36622 v.AddArg(x) 36623 return true 36624 } 36625 } 36626 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 36627 // match: (ZeroExt32to64 x) 36628 // cond: 36629 // result: (MOVWZreg x) 36630 for { 36631 x := v.Args[0] 36632 v.reset(OpS390XMOVWZreg) 36633 v.AddArg(x) 36634 return true 36635 } 36636 } 36637 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 36638 // match: (ZeroExt8to16 x) 36639 // cond: 36640 // result: (MOVBZreg x) 36641 for { 36642 x := v.Args[0] 36643 v.reset(OpS390XMOVBZreg) 36644 v.AddArg(x) 36645 return true 36646 } 36647 } 36648 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 36649 // match: (ZeroExt8to32 x) 36650 // cond: 36651 // result: (MOVBZreg x) 36652 for { 36653 x := v.Args[0] 36654 v.reset(OpS390XMOVBZreg) 36655 v.AddArg(x) 36656 return true 36657 } 36658 } 36659 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 36660 // match: (ZeroExt8to64 x) 36661 // cond: 36662 // result: (MOVBZreg x) 36663 for { 36664 x := v.Args[0] 36665 v.reset(OpS390XMOVBZreg) 36666 v.AddArg(x) 36667 return true 36668 } 36669 } 36670 func rewriteBlockS390X(b *Block) bool { 36671 config := b.Func.Config 36672 _ = config 36673 fe := b.Func.fe 36674 _ = fe 36675 typ := &config.Types 36676 _ = typ 36677 switch b.Kind { 36678 case BlockS390XEQ: 36679 // match: (EQ (InvertFlags cmp) yes no) 36680 // cond: 36681 // result: (EQ cmp yes no) 36682 for { 36683 v := b.Control 36684 if v.Op != OpS390XInvertFlags { 36685 break 36686 } 36687 cmp := v.Args[0] 36688 b.Kind = BlockS390XEQ 36689 b.SetControl(cmp) 36690 b.Aux = nil 36691 return true 36692 } 36693 // match: (EQ (FlagEQ) yes no) 36694 // cond: 36695 // result: (First nil yes no) 36696 for { 36697 v := b.Control 36698 if v.Op != OpS390XFlagEQ { 36699 break 36700 } 36701 b.Kind = BlockFirst 36702 b.SetControl(nil) 36703 b.Aux = nil 36704 return true 36705 } 36706 // match: (EQ (FlagLT) yes no) 36707 // cond: 36708 // result: (First nil no yes) 36709 for { 36710 v := b.Control 36711 if v.Op != OpS390XFlagLT { 36712 break 36713 } 36714 b.Kind = BlockFirst 36715 b.SetControl(nil) 36716 b.Aux = nil 36717 b.swapSuccessors() 36718 return true 36719 } 36720 // match: (EQ (FlagGT) yes no) 36721 // cond: 36722 // result: (First nil no yes) 36723 for { 36724 v := b.Control 36725 if v.Op != OpS390XFlagGT { 36726 break 36727 } 36728 b.Kind = BlockFirst 36729 b.SetControl(nil) 36730 b.Aux = nil 36731 b.swapSuccessors() 36732 return true 36733 } 36734 case BlockS390XGE: 36735 // match: (GE (InvertFlags cmp) yes no) 36736 // cond: 36737 // result: (LE cmp yes no) 36738 for { 36739 v := b.Control 36740 if v.Op != OpS390XInvertFlags { 36741 break 36742 } 36743 cmp := v.Args[0] 36744 b.Kind = BlockS390XLE 36745 b.SetControl(cmp) 36746 b.Aux = nil 36747 return true 36748 } 36749 // match: (GE (FlagEQ) yes no) 36750 // cond: 36751 // result: (First nil yes no) 36752 for { 36753 v := b.Control 36754 if v.Op != OpS390XFlagEQ { 36755 break 36756 } 36757 b.Kind = BlockFirst 36758 b.SetControl(nil) 36759 b.Aux = nil 36760 return true 36761 } 36762 // match: (GE (FlagLT) yes no) 36763 // cond: 36764 // result: (First nil no yes) 36765 for { 36766 v := b.Control 36767 if v.Op != OpS390XFlagLT { 36768 break 36769 } 36770 b.Kind = BlockFirst 36771 b.SetControl(nil) 36772 b.Aux = nil 36773 b.swapSuccessors() 36774 return true 36775 } 36776 // match: (GE (FlagGT) yes no) 36777 // cond: 36778 // result: (First nil yes no) 36779 for { 36780 v := b.Control 36781 if v.Op != OpS390XFlagGT { 36782 break 36783 } 36784 b.Kind = BlockFirst 36785 b.SetControl(nil) 36786 b.Aux = nil 36787 return true 36788 } 36789 case BlockS390XGT: 36790 // match: (GT (InvertFlags cmp) yes no) 36791 // cond: 36792 // result: (LT cmp yes no) 36793 for { 36794 v := b.Control 36795 if v.Op != OpS390XInvertFlags { 36796 break 36797 } 36798 cmp := v.Args[0] 36799 b.Kind = BlockS390XLT 36800 b.SetControl(cmp) 36801 b.Aux = nil 36802 return true 36803 } 36804 // match: (GT (FlagEQ) yes no) 36805 // cond: 36806 // result: (First nil no yes) 36807 for { 36808 v := b.Control 36809 if v.Op != OpS390XFlagEQ { 36810 break 36811 } 36812 b.Kind = BlockFirst 36813 b.SetControl(nil) 36814 b.Aux = nil 36815 b.swapSuccessors() 36816 return true 36817 } 36818 // match: (GT (FlagLT) yes no) 36819 // cond: 36820 // result: (First nil no yes) 36821 for { 36822 v := b.Control 36823 if v.Op != OpS390XFlagLT { 36824 break 36825 } 36826 b.Kind = BlockFirst 36827 b.SetControl(nil) 36828 b.Aux = nil 36829 b.swapSuccessors() 36830 return true 36831 } 36832 // match: (GT (FlagGT) yes no) 36833 // cond: 36834 // result: (First nil yes no) 36835 for { 36836 v := b.Control 36837 if v.Op != OpS390XFlagGT { 36838 break 36839 } 36840 b.Kind = BlockFirst 36841 b.SetControl(nil) 36842 b.Aux = nil 36843 return true 36844 } 36845 case BlockIf: 36846 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36847 // cond: 36848 // result: (LT cmp yes no) 36849 for { 36850 v := b.Control 36851 if v.Op != OpS390XMOVDLT { 36852 break 36853 } 36854 _ = v.Args[2] 36855 v_0 := v.Args[0] 36856 if v_0.Op != OpS390XMOVDconst { 36857 break 36858 } 36859 if v_0.AuxInt != 0 { 36860 break 36861 } 36862 v_1 := v.Args[1] 36863 if v_1.Op != OpS390XMOVDconst { 36864 break 36865 } 36866 if v_1.AuxInt != 1 { 36867 break 36868 } 36869 cmp := v.Args[2] 36870 b.Kind = BlockS390XLT 36871 b.SetControl(cmp) 36872 b.Aux = nil 36873 return true 36874 } 36875 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36876 // cond: 36877 // result: (LE cmp yes no) 36878 for { 36879 v := b.Control 36880 if v.Op != OpS390XMOVDLE { 36881 break 36882 } 36883 _ = v.Args[2] 36884 v_0 := v.Args[0] 36885 if v_0.Op != OpS390XMOVDconst { 36886 break 36887 } 36888 if v_0.AuxInt != 0 { 36889 break 36890 } 36891 v_1 := v.Args[1] 36892 if v_1.Op != OpS390XMOVDconst { 36893 break 36894 } 36895 if v_1.AuxInt != 1 { 36896 break 36897 } 36898 cmp := v.Args[2] 36899 b.Kind = BlockS390XLE 36900 b.SetControl(cmp) 36901 b.Aux = nil 36902 return true 36903 } 36904 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36905 // cond: 36906 // result: (GT cmp yes no) 36907 for { 36908 v := b.Control 36909 if v.Op != OpS390XMOVDGT { 36910 break 36911 } 36912 _ = v.Args[2] 36913 v_0 := v.Args[0] 36914 if v_0.Op != OpS390XMOVDconst { 36915 break 36916 } 36917 if v_0.AuxInt != 0 { 36918 break 36919 } 36920 v_1 := v.Args[1] 36921 if v_1.Op != OpS390XMOVDconst { 36922 break 36923 } 36924 if v_1.AuxInt != 1 { 36925 break 36926 } 36927 cmp := v.Args[2] 36928 b.Kind = BlockS390XGT 36929 b.SetControl(cmp) 36930 b.Aux = nil 36931 return true 36932 } 36933 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36934 // cond: 36935 // result: (GE cmp yes no) 36936 for { 36937 v := b.Control 36938 if v.Op != OpS390XMOVDGE { 36939 break 36940 } 36941 _ = v.Args[2] 36942 v_0 := v.Args[0] 36943 if v_0.Op != OpS390XMOVDconst { 36944 break 36945 } 36946 if v_0.AuxInt != 0 { 36947 break 36948 } 36949 v_1 := v.Args[1] 36950 if v_1.Op != OpS390XMOVDconst { 36951 break 36952 } 36953 if v_1.AuxInt != 1 { 36954 break 36955 } 36956 cmp := v.Args[2] 36957 b.Kind = BlockS390XGE 36958 b.SetControl(cmp) 36959 b.Aux = nil 36960 return true 36961 } 36962 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36963 // cond: 36964 // result: (EQ cmp yes no) 36965 for { 36966 v := b.Control 36967 if v.Op != OpS390XMOVDEQ { 36968 break 36969 } 36970 _ = v.Args[2] 36971 v_0 := v.Args[0] 36972 if v_0.Op != OpS390XMOVDconst { 36973 break 36974 } 36975 if v_0.AuxInt != 0 { 36976 break 36977 } 36978 v_1 := v.Args[1] 36979 if v_1.Op != OpS390XMOVDconst { 36980 break 36981 } 36982 if v_1.AuxInt != 1 { 36983 break 36984 } 36985 cmp := v.Args[2] 36986 b.Kind = BlockS390XEQ 36987 b.SetControl(cmp) 36988 b.Aux = nil 36989 return true 36990 } 36991 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36992 // cond: 36993 // result: (NE cmp yes no) 36994 for { 36995 v := b.Control 36996 if v.Op != OpS390XMOVDNE { 36997 break 36998 } 36999 _ = v.Args[2] 37000 v_0 := v.Args[0] 37001 if v_0.Op != OpS390XMOVDconst { 37002 break 37003 } 37004 if v_0.AuxInt != 0 { 37005 break 37006 } 37007 v_1 := v.Args[1] 37008 if v_1.Op != OpS390XMOVDconst { 37009 break 37010 } 37011 if v_1.AuxInt != 1 { 37012 break 37013 } 37014 cmp := v.Args[2] 37015 b.Kind = BlockS390XNE 37016 b.SetControl(cmp) 37017 b.Aux = nil 37018 return true 37019 } 37020 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 37021 // cond: 37022 // result: (GTF cmp yes no) 37023 for { 37024 v := b.Control 37025 if v.Op != OpS390XMOVDGTnoinv { 37026 break 37027 } 37028 _ = v.Args[2] 37029 v_0 := v.Args[0] 37030 if v_0.Op != OpS390XMOVDconst { 37031 break 37032 } 37033 if v_0.AuxInt != 0 { 37034 break 37035 } 37036 v_1 := v.Args[1] 37037 if v_1.Op != OpS390XMOVDconst { 37038 break 37039 } 37040 if v_1.AuxInt != 1 { 37041 break 37042 } 37043 cmp := v.Args[2] 37044 b.Kind = BlockS390XGTF 37045 b.SetControl(cmp) 37046 b.Aux = nil 37047 return true 37048 } 37049 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 37050 // cond: 37051 // result: (GEF cmp yes no) 37052 for { 37053 v := b.Control 37054 if v.Op != OpS390XMOVDGEnoinv { 37055 break 37056 } 37057 _ = v.Args[2] 37058 v_0 := v.Args[0] 37059 if v_0.Op != OpS390XMOVDconst { 37060 break 37061 } 37062 if v_0.AuxInt != 0 { 37063 break 37064 } 37065 v_1 := v.Args[1] 37066 if v_1.Op != OpS390XMOVDconst { 37067 break 37068 } 37069 if v_1.AuxInt != 1 { 37070 break 37071 } 37072 cmp := v.Args[2] 37073 b.Kind = BlockS390XGEF 37074 b.SetControl(cmp) 37075 b.Aux = nil 37076 return true 37077 } 37078 // match: (If cond yes no) 37079 // cond: 37080 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 37081 for { 37082 v := b.Control 37083 _ = v 37084 cond := b.Control 37085 b.Kind = BlockS390XNE 37086 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 37087 v0.AuxInt = 0 37088 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 37089 v1.AddArg(cond) 37090 v0.AddArg(v1) 37091 b.SetControl(v0) 37092 b.Aux = nil 37093 return true 37094 } 37095 case BlockS390XLE: 37096 // match: (LE (InvertFlags cmp) yes no) 37097 // cond: 37098 // result: (GE cmp yes no) 37099 for { 37100 v := b.Control 37101 if v.Op != OpS390XInvertFlags { 37102 break 37103 } 37104 cmp := v.Args[0] 37105 b.Kind = BlockS390XGE 37106 b.SetControl(cmp) 37107 b.Aux = nil 37108 return true 37109 } 37110 // match: (LE (FlagEQ) yes no) 37111 // cond: 37112 // result: (First nil yes no) 37113 for { 37114 v := b.Control 37115 if v.Op != OpS390XFlagEQ { 37116 break 37117 } 37118 b.Kind = BlockFirst 37119 b.SetControl(nil) 37120 b.Aux = nil 37121 return true 37122 } 37123 // match: (LE (FlagLT) yes no) 37124 // cond: 37125 // result: (First nil yes no) 37126 for { 37127 v := b.Control 37128 if v.Op != OpS390XFlagLT { 37129 break 37130 } 37131 b.Kind = BlockFirst 37132 b.SetControl(nil) 37133 b.Aux = nil 37134 return true 37135 } 37136 // match: (LE (FlagGT) yes no) 37137 // cond: 37138 // result: (First nil no yes) 37139 for { 37140 v := b.Control 37141 if v.Op != OpS390XFlagGT { 37142 break 37143 } 37144 b.Kind = BlockFirst 37145 b.SetControl(nil) 37146 b.Aux = nil 37147 b.swapSuccessors() 37148 return true 37149 } 37150 case BlockS390XLT: 37151 // match: (LT (InvertFlags cmp) yes no) 37152 // cond: 37153 // result: (GT cmp yes no) 37154 for { 37155 v := b.Control 37156 if v.Op != OpS390XInvertFlags { 37157 break 37158 } 37159 cmp := v.Args[0] 37160 b.Kind = BlockS390XGT 37161 b.SetControl(cmp) 37162 b.Aux = nil 37163 return true 37164 } 37165 // match: (LT (FlagEQ) yes no) 37166 // cond: 37167 // result: (First nil no yes) 37168 for { 37169 v := b.Control 37170 if v.Op != OpS390XFlagEQ { 37171 break 37172 } 37173 b.Kind = BlockFirst 37174 b.SetControl(nil) 37175 b.Aux = nil 37176 b.swapSuccessors() 37177 return true 37178 } 37179 // match: (LT (FlagLT) yes no) 37180 // cond: 37181 // result: (First nil yes no) 37182 for { 37183 v := b.Control 37184 if v.Op != OpS390XFlagLT { 37185 break 37186 } 37187 b.Kind = BlockFirst 37188 b.SetControl(nil) 37189 b.Aux = nil 37190 return true 37191 } 37192 // match: (LT (FlagGT) yes no) 37193 // cond: 37194 // result: (First nil no yes) 37195 for { 37196 v := b.Control 37197 if v.Op != OpS390XFlagGT { 37198 break 37199 } 37200 b.Kind = BlockFirst 37201 b.SetControl(nil) 37202 b.Aux = nil 37203 b.swapSuccessors() 37204 return true 37205 } 37206 case BlockS390XNE: 37207 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37208 // cond: 37209 // result: (LT cmp yes no) 37210 for { 37211 v := b.Control 37212 if v.Op != OpS390XCMPWconst { 37213 break 37214 } 37215 if v.AuxInt != 0 { 37216 break 37217 } 37218 v_0 := v.Args[0] 37219 if v_0.Op != OpS390XMOVDLT { 37220 break 37221 } 37222 _ = v_0.Args[2] 37223 v_0_0 := v_0.Args[0] 37224 if v_0_0.Op != OpS390XMOVDconst { 37225 break 37226 } 37227 if v_0_0.AuxInt != 0 { 37228 break 37229 } 37230 v_0_1 := v_0.Args[1] 37231 if v_0_1.Op != OpS390XMOVDconst { 37232 break 37233 } 37234 if v_0_1.AuxInt != 1 { 37235 break 37236 } 37237 cmp := v_0.Args[2] 37238 b.Kind = BlockS390XLT 37239 b.SetControl(cmp) 37240 b.Aux = nil 37241 return true 37242 } 37243 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37244 // cond: 37245 // result: (LE cmp yes no) 37246 for { 37247 v := b.Control 37248 if v.Op != OpS390XCMPWconst { 37249 break 37250 } 37251 if v.AuxInt != 0 { 37252 break 37253 } 37254 v_0 := v.Args[0] 37255 if v_0.Op != OpS390XMOVDLE { 37256 break 37257 } 37258 _ = v_0.Args[2] 37259 v_0_0 := v_0.Args[0] 37260 if v_0_0.Op != OpS390XMOVDconst { 37261 break 37262 } 37263 if v_0_0.AuxInt != 0 { 37264 break 37265 } 37266 v_0_1 := v_0.Args[1] 37267 if v_0_1.Op != OpS390XMOVDconst { 37268 break 37269 } 37270 if v_0_1.AuxInt != 1 { 37271 break 37272 } 37273 cmp := v_0.Args[2] 37274 b.Kind = BlockS390XLE 37275 b.SetControl(cmp) 37276 b.Aux = nil 37277 return true 37278 } 37279 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37280 // cond: 37281 // result: (GT cmp yes no) 37282 for { 37283 v := b.Control 37284 if v.Op != OpS390XCMPWconst { 37285 break 37286 } 37287 if v.AuxInt != 0 { 37288 break 37289 } 37290 v_0 := v.Args[0] 37291 if v_0.Op != OpS390XMOVDGT { 37292 break 37293 } 37294 _ = v_0.Args[2] 37295 v_0_0 := v_0.Args[0] 37296 if v_0_0.Op != OpS390XMOVDconst { 37297 break 37298 } 37299 if v_0_0.AuxInt != 0 { 37300 break 37301 } 37302 v_0_1 := v_0.Args[1] 37303 if v_0_1.Op != OpS390XMOVDconst { 37304 break 37305 } 37306 if v_0_1.AuxInt != 1 { 37307 break 37308 } 37309 cmp := v_0.Args[2] 37310 b.Kind = BlockS390XGT 37311 b.SetControl(cmp) 37312 b.Aux = nil 37313 return true 37314 } 37315 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37316 // cond: 37317 // result: (GE cmp yes no) 37318 for { 37319 v := b.Control 37320 if v.Op != OpS390XCMPWconst { 37321 break 37322 } 37323 if v.AuxInt != 0 { 37324 break 37325 } 37326 v_0 := v.Args[0] 37327 if v_0.Op != OpS390XMOVDGE { 37328 break 37329 } 37330 _ = v_0.Args[2] 37331 v_0_0 := v_0.Args[0] 37332 if v_0_0.Op != OpS390XMOVDconst { 37333 break 37334 } 37335 if v_0_0.AuxInt != 0 { 37336 break 37337 } 37338 v_0_1 := v_0.Args[1] 37339 if v_0_1.Op != OpS390XMOVDconst { 37340 break 37341 } 37342 if v_0_1.AuxInt != 1 { 37343 break 37344 } 37345 cmp := v_0.Args[2] 37346 b.Kind = BlockS390XGE 37347 b.SetControl(cmp) 37348 b.Aux = nil 37349 return true 37350 } 37351 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37352 // cond: 37353 // result: (EQ cmp yes no) 37354 for { 37355 v := b.Control 37356 if v.Op != OpS390XCMPWconst { 37357 break 37358 } 37359 if v.AuxInt != 0 { 37360 break 37361 } 37362 v_0 := v.Args[0] 37363 if v_0.Op != OpS390XMOVDEQ { 37364 break 37365 } 37366 _ = v_0.Args[2] 37367 v_0_0 := v_0.Args[0] 37368 if v_0_0.Op != OpS390XMOVDconst { 37369 break 37370 } 37371 if v_0_0.AuxInt != 0 { 37372 break 37373 } 37374 v_0_1 := v_0.Args[1] 37375 if v_0_1.Op != OpS390XMOVDconst { 37376 break 37377 } 37378 if v_0_1.AuxInt != 1 { 37379 break 37380 } 37381 cmp := v_0.Args[2] 37382 b.Kind = BlockS390XEQ 37383 b.SetControl(cmp) 37384 b.Aux = nil 37385 return true 37386 } 37387 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37388 // cond: 37389 // result: (NE cmp yes no) 37390 for { 37391 v := b.Control 37392 if v.Op != OpS390XCMPWconst { 37393 break 37394 } 37395 if v.AuxInt != 0 { 37396 break 37397 } 37398 v_0 := v.Args[0] 37399 if v_0.Op != OpS390XMOVDNE { 37400 break 37401 } 37402 _ = v_0.Args[2] 37403 v_0_0 := v_0.Args[0] 37404 if v_0_0.Op != OpS390XMOVDconst { 37405 break 37406 } 37407 if v_0_0.AuxInt != 0 { 37408 break 37409 } 37410 v_0_1 := v_0.Args[1] 37411 if v_0_1.Op != OpS390XMOVDconst { 37412 break 37413 } 37414 if v_0_1.AuxInt != 1 { 37415 break 37416 } 37417 cmp := v_0.Args[2] 37418 b.Kind = BlockS390XNE 37419 b.SetControl(cmp) 37420 b.Aux = nil 37421 return true 37422 } 37423 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37424 // cond: 37425 // result: (GTF cmp yes no) 37426 for { 37427 v := b.Control 37428 if v.Op != OpS390XCMPWconst { 37429 break 37430 } 37431 if v.AuxInt != 0 { 37432 break 37433 } 37434 v_0 := v.Args[0] 37435 if v_0.Op != OpS390XMOVDGTnoinv { 37436 break 37437 } 37438 _ = v_0.Args[2] 37439 v_0_0 := v_0.Args[0] 37440 if v_0_0.Op != OpS390XMOVDconst { 37441 break 37442 } 37443 if v_0_0.AuxInt != 0 { 37444 break 37445 } 37446 v_0_1 := v_0.Args[1] 37447 if v_0_1.Op != OpS390XMOVDconst { 37448 break 37449 } 37450 if v_0_1.AuxInt != 1 { 37451 break 37452 } 37453 cmp := v_0.Args[2] 37454 b.Kind = BlockS390XGTF 37455 b.SetControl(cmp) 37456 b.Aux = nil 37457 return true 37458 } 37459 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37460 // cond: 37461 // result: (GEF cmp yes no) 37462 for { 37463 v := b.Control 37464 if v.Op != OpS390XCMPWconst { 37465 break 37466 } 37467 if v.AuxInt != 0 { 37468 break 37469 } 37470 v_0 := v.Args[0] 37471 if v_0.Op != OpS390XMOVDGEnoinv { 37472 break 37473 } 37474 _ = v_0.Args[2] 37475 v_0_0 := v_0.Args[0] 37476 if v_0_0.Op != OpS390XMOVDconst { 37477 break 37478 } 37479 if v_0_0.AuxInt != 0 { 37480 break 37481 } 37482 v_0_1 := v_0.Args[1] 37483 if v_0_1.Op != OpS390XMOVDconst { 37484 break 37485 } 37486 if v_0_1.AuxInt != 1 { 37487 break 37488 } 37489 cmp := v_0.Args[2] 37490 b.Kind = BlockS390XGEF 37491 b.SetControl(cmp) 37492 b.Aux = nil 37493 return true 37494 } 37495 // match: (NE (InvertFlags cmp) yes no) 37496 // cond: 37497 // result: (NE cmp yes no) 37498 for { 37499 v := b.Control 37500 if v.Op != OpS390XInvertFlags { 37501 break 37502 } 37503 cmp := v.Args[0] 37504 b.Kind = BlockS390XNE 37505 b.SetControl(cmp) 37506 b.Aux = nil 37507 return true 37508 } 37509 // match: (NE (FlagEQ) yes no) 37510 // cond: 37511 // result: (First nil no yes) 37512 for { 37513 v := b.Control 37514 if v.Op != OpS390XFlagEQ { 37515 break 37516 } 37517 b.Kind = BlockFirst 37518 b.SetControl(nil) 37519 b.Aux = nil 37520 b.swapSuccessors() 37521 return true 37522 } 37523 // match: (NE (FlagLT) yes no) 37524 // cond: 37525 // result: (First nil yes no) 37526 for { 37527 v := b.Control 37528 if v.Op != OpS390XFlagLT { 37529 break 37530 } 37531 b.Kind = BlockFirst 37532 b.SetControl(nil) 37533 b.Aux = nil 37534 return true 37535 } 37536 // match: (NE (FlagGT) yes no) 37537 // cond: 37538 // result: (First nil yes no) 37539 for { 37540 v := b.Control 37541 if v.Op != OpS390XFlagGT { 37542 break 37543 } 37544 b.Kind = BlockFirst 37545 b.SetControl(nil) 37546 b.Aux = nil 37547 return true 37548 } 37549 } 37550 return false 37551 }