github.com/sanprasirt/go@v0.0.0-20170607001320-a027466e4b6d/src/cmd/compile/internal/ssa/rewriteS390X.go (about) 1 // Code generated from gen/S390X.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueS390X(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValueS390X_OpAdd16_0(v) 20 case OpAdd32: 21 return rewriteValueS390X_OpAdd32_0(v) 22 case OpAdd32F: 23 return rewriteValueS390X_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValueS390X_OpAdd64_0(v) 26 case OpAdd64F: 27 return rewriteValueS390X_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValueS390X_OpAdd8_0(v) 30 case OpAddPtr: 31 return rewriteValueS390X_OpAddPtr_0(v) 32 case OpAddr: 33 return rewriteValueS390X_OpAddr_0(v) 34 case OpAnd16: 35 return rewriteValueS390X_OpAnd16_0(v) 36 case OpAnd32: 37 return rewriteValueS390X_OpAnd32_0(v) 38 case OpAnd64: 39 return rewriteValueS390X_OpAnd64_0(v) 40 case OpAnd8: 41 return rewriteValueS390X_OpAnd8_0(v) 42 case OpAndB: 43 return rewriteValueS390X_OpAndB_0(v) 44 case OpAtomicAdd32: 45 return rewriteValueS390X_OpAtomicAdd32_0(v) 46 case OpAtomicAdd64: 47 return rewriteValueS390X_OpAtomicAdd64_0(v) 48 case OpAtomicCompareAndSwap32: 49 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 50 case OpAtomicCompareAndSwap64: 51 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 52 case OpAtomicExchange32: 53 return rewriteValueS390X_OpAtomicExchange32_0(v) 54 case OpAtomicExchange64: 55 return rewriteValueS390X_OpAtomicExchange64_0(v) 56 case OpAtomicLoad32: 57 return rewriteValueS390X_OpAtomicLoad32_0(v) 58 case OpAtomicLoad64: 59 return rewriteValueS390X_OpAtomicLoad64_0(v) 60 case OpAtomicLoadPtr: 61 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 62 case OpAtomicStore32: 63 return rewriteValueS390X_OpAtomicStore32_0(v) 64 case OpAtomicStore64: 65 return rewriteValueS390X_OpAtomicStore64_0(v) 66 case OpAtomicStorePtrNoWB: 67 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 68 case OpAvg64u: 69 return rewriteValueS390X_OpAvg64u_0(v) 70 case OpBitLen64: 71 return rewriteValueS390X_OpBitLen64_0(v) 72 case OpBswap32: 73 return rewriteValueS390X_OpBswap32_0(v) 74 case OpBswap64: 75 return rewriteValueS390X_OpBswap64_0(v) 76 case OpClosureCall: 77 return rewriteValueS390X_OpClosureCall_0(v) 78 case OpCom16: 79 return rewriteValueS390X_OpCom16_0(v) 80 case OpCom32: 81 return rewriteValueS390X_OpCom32_0(v) 82 case OpCom64: 83 return rewriteValueS390X_OpCom64_0(v) 84 case OpCom8: 85 return rewriteValueS390X_OpCom8_0(v) 86 case OpConst16: 87 return rewriteValueS390X_OpConst16_0(v) 88 case OpConst32: 89 return rewriteValueS390X_OpConst32_0(v) 90 case OpConst32F: 91 return rewriteValueS390X_OpConst32F_0(v) 92 case OpConst64: 93 return rewriteValueS390X_OpConst64_0(v) 94 case OpConst64F: 95 return rewriteValueS390X_OpConst64F_0(v) 96 case OpConst8: 97 return rewriteValueS390X_OpConst8_0(v) 98 case OpConstBool: 99 return rewriteValueS390X_OpConstBool_0(v) 100 case OpConstNil: 101 return rewriteValueS390X_OpConstNil_0(v) 102 case OpConvert: 103 return rewriteValueS390X_OpConvert_0(v) 104 case OpCtz32: 105 return rewriteValueS390X_OpCtz32_0(v) 106 case OpCtz64: 107 return rewriteValueS390X_OpCtz64_0(v) 108 case OpCvt32Fto32: 109 return rewriteValueS390X_OpCvt32Fto32_0(v) 110 case OpCvt32Fto64: 111 return rewriteValueS390X_OpCvt32Fto64_0(v) 112 case OpCvt32Fto64F: 113 return rewriteValueS390X_OpCvt32Fto64F_0(v) 114 case OpCvt32to32F: 115 return rewriteValueS390X_OpCvt32to32F_0(v) 116 case OpCvt32to64F: 117 return rewriteValueS390X_OpCvt32to64F_0(v) 118 case OpCvt64Fto32: 119 return rewriteValueS390X_OpCvt64Fto32_0(v) 120 case OpCvt64Fto32F: 121 return rewriteValueS390X_OpCvt64Fto32F_0(v) 122 case OpCvt64Fto64: 123 return rewriteValueS390X_OpCvt64Fto64_0(v) 124 case OpCvt64to32F: 125 return rewriteValueS390X_OpCvt64to32F_0(v) 126 case OpCvt64to64F: 127 return rewriteValueS390X_OpCvt64to64F_0(v) 128 case OpDiv16: 129 return rewriteValueS390X_OpDiv16_0(v) 130 case OpDiv16u: 131 return rewriteValueS390X_OpDiv16u_0(v) 132 case OpDiv32: 133 return rewriteValueS390X_OpDiv32_0(v) 134 case OpDiv32F: 135 return rewriteValueS390X_OpDiv32F_0(v) 136 case OpDiv32u: 137 return rewriteValueS390X_OpDiv32u_0(v) 138 case OpDiv64: 139 return rewriteValueS390X_OpDiv64_0(v) 140 case OpDiv64F: 141 return rewriteValueS390X_OpDiv64F_0(v) 142 case OpDiv64u: 143 return rewriteValueS390X_OpDiv64u_0(v) 144 case OpDiv8: 145 return rewriteValueS390X_OpDiv8_0(v) 146 case OpDiv8u: 147 return rewriteValueS390X_OpDiv8u_0(v) 148 case OpEq16: 149 return rewriteValueS390X_OpEq16_0(v) 150 case OpEq32: 151 return rewriteValueS390X_OpEq32_0(v) 152 case OpEq32F: 153 return rewriteValueS390X_OpEq32F_0(v) 154 case OpEq64: 155 return rewriteValueS390X_OpEq64_0(v) 156 case OpEq64F: 157 return rewriteValueS390X_OpEq64F_0(v) 158 case OpEq8: 159 return rewriteValueS390X_OpEq8_0(v) 160 case OpEqB: 161 return rewriteValueS390X_OpEqB_0(v) 162 case OpEqPtr: 163 return rewriteValueS390X_OpEqPtr_0(v) 164 case OpGeq16: 165 return rewriteValueS390X_OpGeq16_0(v) 166 case OpGeq16U: 167 return rewriteValueS390X_OpGeq16U_0(v) 168 case OpGeq32: 169 return rewriteValueS390X_OpGeq32_0(v) 170 case OpGeq32F: 171 return rewriteValueS390X_OpGeq32F_0(v) 172 case OpGeq32U: 173 return rewriteValueS390X_OpGeq32U_0(v) 174 case OpGeq64: 175 return rewriteValueS390X_OpGeq64_0(v) 176 case OpGeq64F: 177 return rewriteValueS390X_OpGeq64F_0(v) 178 case OpGeq64U: 179 return rewriteValueS390X_OpGeq64U_0(v) 180 case OpGeq8: 181 return rewriteValueS390X_OpGeq8_0(v) 182 case OpGeq8U: 183 return rewriteValueS390X_OpGeq8U_0(v) 184 case OpGetClosurePtr: 185 return rewriteValueS390X_OpGetClosurePtr_0(v) 186 case OpGetG: 187 return rewriteValueS390X_OpGetG_0(v) 188 case OpGreater16: 189 return rewriteValueS390X_OpGreater16_0(v) 190 case OpGreater16U: 191 return rewriteValueS390X_OpGreater16U_0(v) 192 case OpGreater32: 193 return rewriteValueS390X_OpGreater32_0(v) 194 case OpGreater32F: 195 return rewriteValueS390X_OpGreater32F_0(v) 196 case OpGreater32U: 197 return rewriteValueS390X_OpGreater32U_0(v) 198 case OpGreater64: 199 return rewriteValueS390X_OpGreater64_0(v) 200 case OpGreater64F: 201 return rewriteValueS390X_OpGreater64F_0(v) 202 case OpGreater64U: 203 return rewriteValueS390X_OpGreater64U_0(v) 204 case OpGreater8: 205 return rewriteValueS390X_OpGreater8_0(v) 206 case OpGreater8U: 207 return rewriteValueS390X_OpGreater8U_0(v) 208 case OpHmul32: 209 return rewriteValueS390X_OpHmul32_0(v) 210 case OpHmul32u: 211 return rewriteValueS390X_OpHmul32u_0(v) 212 case OpHmul64: 213 return rewriteValueS390X_OpHmul64_0(v) 214 case OpHmul64u: 215 return rewriteValueS390X_OpHmul64u_0(v) 216 case OpITab: 217 return rewriteValueS390X_OpITab_0(v) 218 case OpInterCall: 219 return rewriteValueS390X_OpInterCall_0(v) 220 case OpIsInBounds: 221 return rewriteValueS390X_OpIsInBounds_0(v) 222 case OpIsNonNil: 223 return rewriteValueS390X_OpIsNonNil_0(v) 224 case OpIsSliceInBounds: 225 return rewriteValueS390X_OpIsSliceInBounds_0(v) 226 case OpLeq16: 227 return rewriteValueS390X_OpLeq16_0(v) 228 case OpLeq16U: 229 return rewriteValueS390X_OpLeq16U_0(v) 230 case OpLeq32: 231 return rewriteValueS390X_OpLeq32_0(v) 232 case OpLeq32F: 233 return rewriteValueS390X_OpLeq32F_0(v) 234 case OpLeq32U: 235 return rewriteValueS390X_OpLeq32U_0(v) 236 case OpLeq64: 237 return rewriteValueS390X_OpLeq64_0(v) 238 case OpLeq64F: 239 return rewriteValueS390X_OpLeq64F_0(v) 240 case OpLeq64U: 241 return rewriteValueS390X_OpLeq64U_0(v) 242 case OpLeq8: 243 return rewriteValueS390X_OpLeq8_0(v) 244 case OpLeq8U: 245 return rewriteValueS390X_OpLeq8U_0(v) 246 case OpLess16: 247 return rewriteValueS390X_OpLess16_0(v) 248 case OpLess16U: 249 return rewriteValueS390X_OpLess16U_0(v) 250 case OpLess32: 251 return rewriteValueS390X_OpLess32_0(v) 252 case OpLess32F: 253 return rewriteValueS390X_OpLess32F_0(v) 254 case OpLess32U: 255 return rewriteValueS390X_OpLess32U_0(v) 256 case OpLess64: 257 return rewriteValueS390X_OpLess64_0(v) 258 case OpLess64F: 259 return rewriteValueS390X_OpLess64F_0(v) 260 case OpLess64U: 261 return rewriteValueS390X_OpLess64U_0(v) 262 case OpLess8: 263 return rewriteValueS390X_OpLess8_0(v) 264 case OpLess8U: 265 return rewriteValueS390X_OpLess8U_0(v) 266 case OpLoad: 267 return rewriteValueS390X_OpLoad_0(v) 268 case OpLsh16x16: 269 return rewriteValueS390X_OpLsh16x16_0(v) 270 case OpLsh16x32: 271 return rewriteValueS390X_OpLsh16x32_0(v) 272 case OpLsh16x64: 273 return rewriteValueS390X_OpLsh16x64_0(v) 274 case OpLsh16x8: 275 return rewriteValueS390X_OpLsh16x8_0(v) 276 case OpLsh32x16: 277 return rewriteValueS390X_OpLsh32x16_0(v) 278 case OpLsh32x32: 279 return rewriteValueS390X_OpLsh32x32_0(v) 280 case OpLsh32x64: 281 return rewriteValueS390X_OpLsh32x64_0(v) 282 case OpLsh32x8: 283 return rewriteValueS390X_OpLsh32x8_0(v) 284 case OpLsh64x16: 285 return rewriteValueS390X_OpLsh64x16_0(v) 286 case OpLsh64x32: 287 return rewriteValueS390X_OpLsh64x32_0(v) 288 case OpLsh64x64: 289 return rewriteValueS390X_OpLsh64x64_0(v) 290 case OpLsh64x8: 291 return rewriteValueS390X_OpLsh64x8_0(v) 292 case OpLsh8x16: 293 return rewriteValueS390X_OpLsh8x16_0(v) 294 case OpLsh8x32: 295 return rewriteValueS390X_OpLsh8x32_0(v) 296 case OpLsh8x64: 297 return rewriteValueS390X_OpLsh8x64_0(v) 298 case OpLsh8x8: 299 return rewriteValueS390X_OpLsh8x8_0(v) 300 case OpMod16: 301 return rewriteValueS390X_OpMod16_0(v) 302 case OpMod16u: 303 return rewriteValueS390X_OpMod16u_0(v) 304 case OpMod32: 305 return rewriteValueS390X_OpMod32_0(v) 306 case OpMod32u: 307 return rewriteValueS390X_OpMod32u_0(v) 308 case OpMod64: 309 return rewriteValueS390X_OpMod64_0(v) 310 case OpMod64u: 311 return rewriteValueS390X_OpMod64u_0(v) 312 case OpMod8: 313 return rewriteValueS390X_OpMod8_0(v) 314 case OpMod8u: 315 return rewriteValueS390X_OpMod8u_0(v) 316 case OpMove: 317 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 318 case OpMul16: 319 return rewriteValueS390X_OpMul16_0(v) 320 case OpMul32: 321 return rewriteValueS390X_OpMul32_0(v) 322 case OpMul32F: 323 return rewriteValueS390X_OpMul32F_0(v) 324 case OpMul64: 325 return rewriteValueS390X_OpMul64_0(v) 326 case OpMul64F: 327 return rewriteValueS390X_OpMul64F_0(v) 328 case OpMul8: 329 return rewriteValueS390X_OpMul8_0(v) 330 case OpNeg16: 331 return rewriteValueS390X_OpNeg16_0(v) 332 case OpNeg32: 333 return rewriteValueS390X_OpNeg32_0(v) 334 case OpNeg32F: 335 return rewriteValueS390X_OpNeg32F_0(v) 336 case OpNeg64: 337 return rewriteValueS390X_OpNeg64_0(v) 338 case OpNeg64F: 339 return rewriteValueS390X_OpNeg64F_0(v) 340 case OpNeg8: 341 return rewriteValueS390X_OpNeg8_0(v) 342 case OpNeq16: 343 return rewriteValueS390X_OpNeq16_0(v) 344 case OpNeq32: 345 return rewriteValueS390X_OpNeq32_0(v) 346 case OpNeq32F: 347 return rewriteValueS390X_OpNeq32F_0(v) 348 case OpNeq64: 349 return rewriteValueS390X_OpNeq64_0(v) 350 case OpNeq64F: 351 return rewriteValueS390X_OpNeq64F_0(v) 352 case OpNeq8: 353 return rewriteValueS390X_OpNeq8_0(v) 354 case OpNeqB: 355 return rewriteValueS390X_OpNeqB_0(v) 356 case OpNeqPtr: 357 return rewriteValueS390X_OpNeqPtr_0(v) 358 case OpNilCheck: 359 return rewriteValueS390X_OpNilCheck_0(v) 360 case OpNot: 361 return rewriteValueS390X_OpNot_0(v) 362 case OpOffPtr: 363 return rewriteValueS390X_OpOffPtr_0(v) 364 case OpOr16: 365 return rewriteValueS390X_OpOr16_0(v) 366 case OpOr32: 367 return rewriteValueS390X_OpOr32_0(v) 368 case OpOr64: 369 return rewriteValueS390X_OpOr64_0(v) 370 case OpOr8: 371 return rewriteValueS390X_OpOr8_0(v) 372 case OpOrB: 373 return rewriteValueS390X_OpOrB_0(v) 374 case OpRound32F: 375 return rewriteValueS390X_OpRound32F_0(v) 376 case OpRound64F: 377 return rewriteValueS390X_OpRound64F_0(v) 378 case OpRsh16Ux16: 379 return rewriteValueS390X_OpRsh16Ux16_0(v) 380 case OpRsh16Ux32: 381 return rewriteValueS390X_OpRsh16Ux32_0(v) 382 case OpRsh16Ux64: 383 return rewriteValueS390X_OpRsh16Ux64_0(v) 384 case OpRsh16Ux8: 385 return rewriteValueS390X_OpRsh16Ux8_0(v) 386 case OpRsh16x16: 387 return rewriteValueS390X_OpRsh16x16_0(v) 388 case OpRsh16x32: 389 return rewriteValueS390X_OpRsh16x32_0(v) 390 case OpRsh16x64: 391 return rewriteValueS390X_OpRsh16x64_0(v) 392 case OpRsh16x8: 393 return rewriteValueS390X_OpRsh16x8_0(v) 394 case OpRsh32Ux16: 395 return rewriteValueS390X_OpRsh32Ux16_0(v) 396 case OpRsh32Ux32: 397 return rewriteValueS390X_OpRsh32Ux32_0(v) 398 case OpRsh32Ux64: 399 return rewriteValueS390X_OpRsh32Ux64_0(v) 400 case OpRsh32Ux8: 401 return rewriteValueS390X_OpRsh32Ux8_0(v) 402 case OpRsh32x16: 403 return rewriteValueS390X_OpRsh32x16_0(v) 404 case OpRsh32x32: 405 return rewriteValueS390X_OpRsh32x32_0(v) 406 case OpRsh32x64: 407 return rewriteValueS390X_OpRsh32x64_0(v) 408 case OpRsh32x8: 409 return rewriteValueS390X_OpRsh32x8_0(v) 410 case OpRsh64Ux16: 411 return rewriteValueS390X_OpRsh64Ux16_0(v) 412 case OpRsh64Ux32: 413 return rewriteValueS390X_OpRsh64Ux32_0(v) 414 case OpRsh64Ux64: 415 return rewriteValueS390X_OpRsh64Ux64_0(v) 416 case OpRsh64Ux8: 417 return rewriteValueS390X_OpRsh64Ux8_0(v) 418 case OpRsh64x16: 419 return rewriteValueS390X_OpRsh64x16_0(v) 420 case OpRsh64x32: 421 return rewriteValueS390X_OpRsh64x32_0(v) 422 case OpRsh64x64: 423 return rewriteValueS390X_OpRsh64x64_0(v) 424 case OpRsh64x8: 425 return rewriteValueS390X_OpRsh64x8_0(v) 426 case OpRsh8Ux16: 427 return rewriteValueS390X_OpRsh8Ux16_0(v) 428 case OpRsh8Ux32: 429 return rewriteValueS390X_OpRsh8Ux32_0(v) 430 case OpRsh8Ux64: 431 return rewriteValueS390X_OpRsh8Ux64_0(v) 432 case OpRsh8Ux8: 433 return rewriteValueS390X_OpRsh8Ux8_0(v) 434 case OpRsh8x16: 435 return rewriteValueS390X_OpRsh8x16_0(v) 436 case OpRsh8x32: 437 return rewriteValueS390X_OpRsh8x32_0(v) 438 case OpRsh8x64: 439 return rewriteValueS390X_OpRsh8x64_0(v) 440 case OpRsh8x8: 441 return rewriteValueS390X_OpRsh8x8_0(v) 442 case OpS390XADD: 443 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 444 case OpS390XADDW: 445 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 446 case OpS390XADDWconst: 447 return rewriteValueS390X_OpS390XADDWconst_0(v) 448 case OpS390XADDconst: 449 return rewriteValueS390X_OpS390XADDconst_0(v) 450 case OpS390XAND: 451 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 452 case OpS390XANDW: 453 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 454 case OpS390XANDWconst: 455 return rewriteValueS390X_OpS390XANDWconst_0(v) 456 case OpS390XANDconst: 457 return rewriteValueS390X_OpS390XANDconst_0(v) 458 case OpS390XCMP: 459 return rewriteValueS390X_OpS390XCMP_0(v) 460 case OpS390XCMPU: 461 return rewriteValueS390X_OpS390XCMPU_0(v) 462 case OpS390XCMPUconst: 463 return rewriteValueS390X_OpS390XCMPUconst_0(v) 464 case OpS390XCMPW: 465 return rewriteValueS390X_OpS390XCMPW_0(v) 466 case OpS390XCMPWU: 467 return rewriteValueS390X_OpS390XCMPWU_0(v) 468 case OpS390XCMPWUconst: 469 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 470 case OpS390XCMPWconst: 471 return rewriteValueS390X_OpS390XCMPWconst_0(v) 472 case OpS390XCMPconst: 473 return rewriteValueS390X_OpS390XCMPconst_0(v) 474 case OpS390XFADD: 475 return rewriteValueS390X_OpS390XFADD_0(v) 476 case OpS390XFADDS: 477 return rewriteValueS390X_OpS390XFADDS_0(v) 478 case OpS390XFMOVDload: 479 return rewriteValueS390X_OpS390XFMOVDload_0(v) 480 case OpS390XFMOVDloadidx: 481 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 482 case OpS390XFMOVDstore: 483 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 484 case OpS390XFMOVDstoreidx: 485 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 486 case OpS390XFMOVSload: 487 return rewriteValueS390X_OpS390XFMOVSload_0(v) 488 case OpS390XFMOVSloadidx: 489 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 490 case OpS390XFMOVSstore: 491 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 492 case OpS390XFMOVSstoreidx: 493 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 494 case OpS390XFSUB: 495 return rewriteValueS390X_OpS390XFSUB_0(v) 496 case OpS390XFSUBS: 497 return rewriteValueS390X_OpS390XFSUBS_0(v) 498 case OpS390XLoweredRound32F: 499 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 500 case OpS390XLoweredRound64F: 501 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 502 case OpS390XMOVBZload: 503 return rewriteValueS390X_OpS390XMOVBZload_0(v) 504 case OpS390XMOVBZloadidx: 505 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 506 case OpS390XMOVBZreg: 507 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 508 case OpS390XMOVBload: 509 return rewriteValueS390X_OpS390XMOVBload_0(v) 510 case OpS390XMOVBreg: 511 return rewriteValueS390X_OpS390XMOVBreg_0(v) 512 case OpS390XMOVBstore: 513 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 514 case OpS390XMOVBstoreconst: 515 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 516 case OpS390XMOVBstoreidx: 517 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 518 case OpS390XMOVDEQ: 519 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 520 case OpS390XMOVDGE: 521 return rewriteValueS390X_OpS390XMOVDGE_0(v) 522 case OpS390XMOVDGT: 523 return rewriteValueS390X_OpS390XMOVDGT_0(v) 524 case OpS390XMOVDLE: 525 return rewriteValueS390X_OpS390XMOVDLE_0(v) 526 case OpS390XMOVDLT: 527 return rewriteValueS390X_OpS390XMOVDLT_0(v) 528 case OpS390XMOVDNE: 529 return rewriteValueS390X_OpS390XMOVDNE_0(v) 530 case OpS390XMOVDaddridx: 531 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 532 case OpS390XMOVDload: 533 return rewriteValueS390X_OpS390XMOVDload_0(v) 534 case OpS390XMOVDloadidx: 535 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 536 case OpS390XMOVDnop: 537 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 538 case OpS390XMOVDreg: 539 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 540 case OpS390XMOVDstore: 541 return rewriteValueS390X_OpS390XMOVDstore_0(v) 542 case OpS390XMOVDstoreconst: 543 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 544 case OpS390XMOVDstoreidx: 545 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 546 case OpS390XMOVHBRstore: 547 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 548 case OpS390XMOVHBRstoreidx: 549 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 550 case OpS390XMOVHZload: 551 return rewriteValueS390X_OpS390XMOVHZload_0(v) 552 case OpS390XMOVHZloadidx: 553 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 554 case OpS390XMOVHZreg: 555 return rewriteValueS390X_OpS390XMOVHZreg_0(v) 556 case OpS390XMOVHload: 557 return rewriteValueS390X_OpS390XMOVHload_0(v) 558 case OpS390XMOVHreg: 559 return rewriteValueS390X_OpS390XMOVHreg_0(v) 560 case OpS390XMOVHstore: 561 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 562 case OpS390XMOVHstoreconst: 563 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 564 case OpS390XMOVHstoreidx: 565 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 566 case OpS390XMOVWBRstore: 567 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 568 case OpS390XMOVWBRstoreidx: 569 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 570 case OpS390XMOVWZload: 571 return rewriteValueS390X_OpS390XMOVWZload_0(v) 572 case OpS390XMOVWZloadidx: 573 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 574 case OpS390XMOVWZreg: 575 return rewriteValueS390X_OpS390XMOVWZreg_0(v) 576 case OpS390XMOVWload: 577 return rewriteValueS390X_OpS390XMOVWload_0(v) 578 case OpS390XMOVWreg: 579 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 580 case OpS390XMOVWstore: 581 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 582 case OpS390XMOVWstoreconst: 583 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 584 case OpS390XMOVWstoreidx: 585 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 586 case OpS390XMULLD: 587 return rewriteValueS390X_OpS390XMULLD_0(v) 588 case OpS390XMULLDconst: 589 return rewriteValueS390X_OpS390XMULLDconst_0(v) 590 case OpS390XMULLW: 591 return rewriteValueS390X_OpS390XMULLW_0(v) 592 case OpS390XMULLWconst: 593 return rewriteValueS390X_OpS390XMULLWconst_0(v) 594 case OpS390XNEG: 595 return rewriteValueS390X_OpS390XNEG_0(v) 596 case OpS390XNEGW: 597 return rewriteValueS390X_OpS390XNEGW_0(v) 598 case OpS390XNOT: 599 return rewriteValueS390X_OpS390XNOT_0(v) 600 case OpS390XNOTW: 601 return rewriteValueS390X_OpS390XNOTW_0(v) 602 case OpS390XOR: 603 return rewriteValueS390X_OpS390XOR_0(v) || rewriteValueS390X_OpS390XOR_10(v) || rewriteValueS390X_OpS390XOR_20(v) || rewriteValueS390X_OpS390XOR_30(v) || rewriteValueS390X_OpS390XOR_40(v) || rewriteValueS390X_OpS390XOR_50(v) || rewriteValueS390X_OpS390XOR_60(v) || rewriteValueS390X_OpS390XOR_70(v) || rewriteValueS390X_OpS390XOR_80(v) || rewriteValueS390X_OpS390XOR_90(v) || rewriteValueS390X_OpS390XOR_100(v) || rewriteValueS390X_OpS390XOR_110(v) || rewriteValueS390X_OpS390XOR_120(v) || rewriteValueS390X_OpS390XOR_130(v) || rewriteValueS390X_OpS390XOR_140(v) || rewriteValueS390X_OpS390XOR_150(v) 604 case OpS390XORW: 605 return rewriteValueS390X_OpS390XORW_0(v) || rewriteValueS390X_OpS390XORW_10(v) || rewriteValueS390X_OpS390XORW_20(v) || rewriteValueS390X_OpS390XORW_30(v) || rewriteValueS390X_OpS390XORW_40(v) || rewriteValueS390X_OpS390XORW_50(v) || rewriteValueS390X_OpS390XORW_60(v) || rewriteValueS390X_OpS390XORW_70(v) || rewriteValueS390X_OpS390XORW_80(v) || rewriteValueS390X_OpS390XORW_90(v) 606 case OpS390XORWconst: 607 return rewriteValueS390X_OpS390XORWconst_0(v) 608 case OpS390XORconst: 609 return rewriteValueS390X_OpS390XORconst_0(v) 610 case OpS390XSLD: 611 return rewriteValueS390X_OpS390XSLD_0(v) 612 case OpS390XSLW: 613 return rewriteValueS390X_OpS390XSLW_0(v) 614 case OpS390XSRAD: 615 return rewriteValueS390X_OpS390XSRAD_0(v) 616 case OpS390XSRADconst: 617 return rewriteValueS390X_OpS390XSRADconst_0(v) 618 case OpS390XSRAW: 619 return rewriteValueS390X_OpS390XSRAW_0(v) 620 case OpS390XSRAWconst: 621 return rewriteValueS390X_OpS390XSRAWconst_0(v) 622 case OpS390XSRD: 623 return rewriteValueS390X_OpS390XSRD_0(v) 624 case OpS390XSRW: 625 return rewriteValueS390X_OpS390XSRW_0(v) 626 case OpS390XSTM2: 627 return rewriteValueS390X_OpS390XSTM2_0(v) 628 case OpS390XSTMG2: 629 return rewriteValueS390X_OpS390XSTMG2_0(v) 630 case OpS390XSUB: 631 return rewriteValueS390X_OpS390XSUB_0(v) 632 case OpS390XSUBEWcarrymask: 633 return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v) 634 case OpS390XSUBEcarrymask: 635 return rewriteValueS390X_OpS390XSUBEcarrymask_0(v) 636 case OpS390XSUBW: 637 return rewriteValueS390X_OpS390XSUBW_0(v) 638 case OpS390XSUBWconst: 639 return rewriteValueS390X_OpS390XSUBWconst_0(v) 640 case OpS390XSUBconst: 641 return rewriteValueS390X_OpS390XSUBconst_0(v) 642 case OpS390XXOR: 643 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 644 case OpS390XXORW: 645 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 646 case OpS390XXORWconst: 647 return rewriteValueS390X_OpS390XXORWconst_0(v) 648 case OpS390XXORconst: 649 return rewriteValueS390X_OpS390XXORconst_0(v) 650 case OpSelect0: 651 return rewriteValueS390X_OpSelect0_0(v) 652 case OpSelect1: 653 return rewriteValueS390X_OpSelect1_0(v) 654 case OpSignExt16to32: 655 return rewriteValueS390X_OpSignExt16to32_0(v) 656 case OpSignExt16to64: 657 return rewriteValueS390X_OpSignExt16to64_0(v) 658 case OpSignExt32to64: 659 return rewriteValueS390X_OpSignExt32to64_0(v) 660 case OpSignExt8to16: 661 return rewriteValueS390X_OpSignExt8to16_0(v) 662 case OpSignExt8to32: 663 return rewriteValueS390X_OpSignExt8to32_0(v) 664 case OpSignExt8to64: 665 return rewriteValueS390X_OpSignExt8to64_0(v) 666 case OpSlicemask: 667 return rewriteValueS390X_OpSlicemask_0(v) 668 case OpSqrt: 669 return rewriteValueS390X_OpSqrt_0(v) 670 case OpStaticCall: 671 return rewriteValueS390X_OpStaticCall_0(v) 672 case OpStore: 673 return rewriteValueS390X_OpStore_0(v) 674 case OpSub16: 675 return rewriteValueS390X_OpSub16_0(v) 676 case OpSub32: 677 return rewriteValueS390X_OpSub32_0(v) 678 case OpSub32F: 679 return rewriteValueS390X_OpSub32F_0(v) 680 case OpSub64: 681 return rewriteValueS390X_OpSub64_0(v) 682 case OpSub64F: 683 return rewriteValueS390X_OpSub64F_0(v) 684 case OpSub8: 685 return rewriteValueS390X_OpSub8_0(v) 686 case OpSubPtr: 687 return rewriteValueS390X_OpSubPtr_0(v) 688 case OpTrunc16to8: 689 return rewriteValueS390X_OpTrunc16to8_0(v) 690 case OpTrunc32to16: 691 return rewriteValueS390X_OpTrunc32to16_0(v) 692 case OpTrunc32to8: 693 return rewriteValueS390X_OpTrunc32to8_0(v) 694 case OpTrunc64to16: 695 return rewriteValueS390X_OpTrunc64to16_0(v) 696 case OpTrunc64to32: 697 return rewriteValueS390X_OpTrunc64to32_0(v) 698 case OpTrunc64to8: 699 return rewriteValueS390X_OpTrunc64to8_0(v) 700 case OpXor16: 701 return rewriteValueS390X_OpXor16_0(v) 702 case OpXor32: 703 return rewriteValueS390X_OpXor32_0(v) 704 case OpXor64: 705 return rewriteValueS390X_OpXor64_0(v) 706 case OpXor8: 707 return rewriteValueS390X_OpXor8_0(v) 708 case OpZero: 709 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 710 case OpZeroExt16to32: 711 return rewriteValueS390X_OpZeroExt16to32_0(v) 712 case OpZeroExt16to64: 713 return rewriteValueS390X_OpZeroExt16to64_0(v) 714 case OpZeroExt32to64: 715 return rewriteValueS390X_OpZeroExt32to64_0(v) 716 case OpZeroExt8to16: 717 return rewriteValueS390X_OpZeroExt8to16_0(v) 718 case OpZeroExt8to32: 719 return rewriteValueS390X_OpZeroExt8to32_0(v) 720 case OpZeroExt8to64: 721 return rewriteValueS390X_OpZeroExt8to64_0(v) 722 } 723 return false 724 } 725 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 726 // match: (Add16 x y) 727 // cond: 728 // result: (ADDW x y) 729 for { 730 _ = v.Args[1] 731 x := v.Args[0] 732 y := v.Args[1] 733 v.reset(OpS390XADDW) 734 v.AddArg(x) 735 v.AddArg(y) 736 return true 737 } 738 } 739 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 740 // match: (Add32 x y) 741 // cond: 742 // result: (ADDW x y) 743 for { 744 _ = v.Args[1] 745 x := v.Args[0] 746 y := v.Args[1] 747 v.reset(OpS390XADDW) 748 v.AddArg(x) 749 v.AddArg(y) 750 return true 751 } 752 } 753 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 754 // match: (Add32F x y) 755 // cond: 756 // result: (FADDS x y) 757 for { 758 _ = v.Args[1] 759 x := v.Args[0] 760 y := v.Args[1] 761 v.reset(OpS390XFADDS) 762 v.AddArg(x) 763 v.AddArg(y) 764 return true 765 } 766 } 767 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 768 // match: (Add64 x y) 769 // cond: 770 // result: (ADD x y) 771 for { 772 _ = v.Args[1] 773 x := v.Args[0] 774 y := v.Args[1] 775 v.reset(OpS390XADD) 776 v.AddArg(x) 777 v.AddArg(y) 778 return true 779 } 780 } 781 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 782 // match: (Add64F x y) 783 // cond: 784 // result: (FADD x y) 785 for { 786 _ = v.Args[1] 787 x := v.Args[0] 788 y := v.Args[1] 789 v.reset(OpS390XFADD) 790 v.AddArg(x) 791 v.AddArg(y) 792 return true 793 } 794 } 795 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 796 // match: (Add8 x y) 797 // cond: 798 // result: (ADDW x y) 799 for { 800 _ = v.Args[1] 801 x := v.Args[0] 802 y := v.Args[1] 803 v.reset(OpS390XADDW) 804 v.AddArg(x) 805 v.AddArg(y) 806 return true 807 } 808 } 809 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 810 // match: (AddPtr x y) 811 // cond: 812 // result: (ADD x y) 813 for { 814 _ = v.Args[1] 815 x := v.Args[0] 816 y := v.Args[1] 817 v.reset(OpS390XADD) 818 v.AddArg(x) 819 v.AddArg(y) 820 return true 821 } 822 } 823 func rewriteValueS390X_OpAddr_0(v *Value) bool { 824 // match: (Addr {sym} base) 825 // cond: 826 // result: (MOVDaddr {sym} base) 827 for { 828 sym := v.Aux 829 base := v.Args[0] 830 v.reset(OpS390XMOVDaddr) 831 v.Aux = sym 832 v.AddArg(base) 833 return true 834 } 835 } 836 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 837 // match: (And16 x y) 838 // cond: 839 // result: (ANDW x y) 840 for { 841 _ = v.Args[1] 842 x := v.Args[0] 843 y := v.Args[1] 844 v.reset(OpS390XANDW) 845 v.AddArg(x) 846 v.AddArg(y) 847 return true 848 } 849 } 850 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 851 // match: (And32 x y) 852 // cond: 853 // result: (ANDW x y) 854 for { 855 _ = v.Args[1] 856 x := v.Args[0] 857 y := v.Args[1] 858 v.reset(OpS390XANDW) 859 v.AddArg(x) 860 v.AddArg(y) 861 return true 862 } 863 } 864 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 865 // match: (And64 x y) 866 // cond: 867 // result: (AND x y) 868 for { 869 _ = v.Args[1] 870 x := v.Args[0] 871 y := v.Args[1] 872 v.reset(OpS390XAND) 873 v.AddArg(x) 874 v.AddArg(y) 875 return true 876 } 877 } 878 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 879 // match: (And8 x y) 880 // cond: 881 // result: (ANDW x y) 882 for { 883 _ = v.Args[1] 884 x := v.Args[0] 885 y := v.Args[1] 886 v.reset(OpS390XANDW) 887 v.AddArg(x) 888 v.AddArg(y) 889 return true 890 } 891 } 892 func rewriteValueS390X_OpAndB_0(v *Value) bool { 893 // match: (AndB x y) 894 // cond: 895 // result: (ANDW x y) 896 for { 897 _ = v.Args[1] 898 x := v.Args[0] 899 y := v.Args[1] 900 v.reset(OpS390XANDW) 901 v.AddArg(x) 902 v.AddArg(y) 903 return true 904 } 905 } 906 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 907 b := v.Block 908 _ = b 909 typ := &b.Func.Config.Types 910 _ = typ 911 // match: (AtomicAdd32 ptr val mem) 912 // cond: 913 // result: (AddTupleFirst32 val (LAA ptr val mem)) 914 for { 915 _ = v.Args[2] 916 ptr := v.Args[0] 917 val := v.Args[1] 918 mem := v.Args[2] 919 v.reset(OpS390XAddTupleFirst32) 920 v.AddArg(val) 921 v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) 922 v0.AddArg(ptr) 923 v0.AddArg(val) 924 v0.AddArg(mem) 925 v.AddArg(v0) 926 return true 927 } 928 } 929 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 930 b := v.Block 931 _ = b 932 typ := &b.Func.Config.Types 933 _ = typ 934 // match: (AtomicAdd64 ptr val mem) 935 // cond: 936 // result: (AddTupleFirst64 val (LAAG ptr val mem)) 937 for { 938 _ = v.Args[2] 939 ptr := v.Args[0] 940 val := v.Args[1] 941 mem := v.Args[2] 942 v.reset(OpS390XAddTupleFirst64) 943 v.AddArg(val) 944 v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) 945 v0.AddArg(ptr) 946 v0.AddArg(val) 947 v0.AddArg(mem) 948 v.AddArg(v0) 949 return true 950 } 951 } 952 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 953 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 954 // cond: 955 // result: (LoweredAtomicCas32 ptr old new_ mem) 956 for { 957 _ = v.Args[3] 958 ptr := v.Args[0] 959 old := v.Args[1] 960 new_ := v.Args[2] 961 mem := v.Args[3] 962 v.reset(OpS390XLoweredAtomicCas32) 963 v.AddArg(ptr) 964 v.AddArg(old) 965 v.AddArg(new_) 966 v.AddArg(mem) 967 return true 968 } 969 } 970 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 971 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 972 // cond: 973 // result: (LoweredAtomicCas64 ptr old new_ mem) 974 for { 975 _ = v.Args[3] 976 ptr := v.Args[0] 977 old := v.Args[1] 978 new_ := v.Args[2] 979 mem := v.Args[3] 980 v.reset(OpS390XLoweredAtomicCas64) 981 v.AddArg(ptr) 982 v.AddArg(old) 983 v.AddArg(new_) 984 v.AddArg(mem) 985 return true 986 } 987 } 988 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 989 // match: (AtomicExchange32 ptr val mem) 990 // cond: 991 // result: (LoweredAtomicExchange32 ptr val mem) 992 for { 993 _ = v.Args[2] 994 ptr := v.Args[0] 995 val := v.Args[1] 996 mem := v.Args[2] 997 v.reset(OpS390XLoweredAtomicExchange32) 998 v.AddArg(ptr) 999 v.AddArg(val) 1000 v.AddArg(mem) 1001 return true 1002 } 1003 } 1004 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 1005 // match: (AtomicExchange64 ptr val mem) 1006 // cond: 1007 // result: (LoweredAtomicExchange64 ptr val mem) 1008 for { 1009 _ = v.Args[2] 1010 ptr := v.Args[0] 1011 val := v.Args[1] 1012 mem := v.Args[2] 1013 v.reset(OpS390XLoweredAtomicExchange64) 1014 v.AddArg(ptr) 1015 v.AddArg(val) 1016 v.AddArg(mem) 1017 return true 1018 } 1019 } 1020 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1021 // match: (AtomicLoad32 ptr mem) 1022 // cond: 1023 // result: (MOVWZatomicload ptr mem) 1024 for { 1025 _ = v.Args[1] 1026 ptr := v.Args[0] 1027 mem := v.Args[1] 1028 v.reset(OpS390XMOVWZatomicload) 1029 v.AddArg(ptr) 1030 v.AddArg(mem) 1031 return true 1032 } 1033 } 1034 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1035 // match: (AtomicLoad64 ptr mem) 1036 // cond: 1037 // result: (MOVDatomicload ptr mem) 1038 for { 1039 _ = v.Args[1] 1040 ptr := v.Args[0] 1041 mem := v.Args[1] 1042 v.reset(OpS390XMOVDatomicload) 1043 v.AddArg(ptr) 1044 v.AddArg(mem) 1045 return true 1046 } 1047 } 1048 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1049 // match: (AtomicLoadPtr ptr mem) 1050 // cond: 1051 // result: (MOVDatomicload ptr mem) 1052 for { 1053 _ = v.Args[1] 1054 ptr := v.Args[0] 1055 mem := v.Args[1] 1056 v.reset(OpS390XMOVDatomicload) 1057 v.AddArg(ptr) 1058 v.AddArg(mem) 1059 return true 1060 } 1061 } 1062 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1063 // match: (AtomicStore32 ptr val mem) 1064 // cond: 1065 // result: (MOVWatomicstore ptr val mem) 1066 for { 1067 _ = v.Args[2] 1068 ptr := v.Args[0] 1069 val := v.Args[1] 1070 mem := v.Args[2] 1071 v.reset(OpS390XMOVWatomicstore) 1072 v.AddArg(ptr) 1073 v.AddArg(val) 1074 v.AddArg(mem) 1075 return true 1076 } 1077 } 1078 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1079 // match: (AtomicStore64 ptr val mem) 1080 // cond: 1081 // result: (MOVDatomicstore ptr val mem) 1082 for { 1083 _ = v.Args[2] 1084 ptr := v.Args[0] 1085 val := v.Args[1] 1086 mem := v.Args[2] 1087 v.reset(OpS390XMOVDatomicstore) 1088 v.AddArg(ptr) 1089 v.AddArg(val) 1090 v.AddArg(mem) 1091 return true 1092 } 1093 } 1094 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1095 // match: (AtomicStorePtrNoWB ptr val mem) 1096 // cond: 1097 // result: (MOVDatomicstore ptr val mem) 1098 for { 1099 _ = v.Args[2] 1100 ptr := v.Args[0] 1101 val := v.Args[1] 1102 mem := v.Args[2] 1103 v.reset(OpS390XMOVDatomicstore) 1104 v.AddArg(ptr) 1105 v.AddArg(val) 1106 v.AddArg(mem) 1107 return true 1108 } 1109 } 1110 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1111 b := v.Block 1112 _ = b 1113 // match: (Avg64u <t> x y) 1114 // cond: 1115 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1116 for { 1117 t := v.Type 1118 _ = v.Args[1] 1119 x := v.Args[0] 1120 y := v.Args[1] 1121 v.reset(OpS390XADD) 1122 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1123 v0.AuxInt = 1 1124 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1125 v1.AddArg(x) 1126 v1.AddArg(y) 1127 v0.AddArg(v1) 1128 v.AddArg(v0) 1129 v.AddArg(y) 1130 return true 1131 } 1132 } 1133 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1134 b := v.Block 1135 _ = b 1136 typ := &b.Func.Config.Types 1137 _ = typ 1138 // match: (BitLen64 x) 1139 // cond: 1140 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1141 for { 1142 x := v.Args[0] 1143 v.reset(OpS390XSUB) 1144 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1145 v0.AuxInt = 64 1146 v.AddArg(v0) 1147 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1148 v1.AddArg(x) 1149 v.AddArg(v1) 1150 return true 1151 } 1152 } 1153 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1154 // match: (Bswap32 x) 1155 // cond: 1156 // result: (MOVWBR x) 1157 for { 1158 x := v.Args[0] 1159 v.reset(OpS390XMOVWBR) 1160 v.AddArg(x) 1161 return true 1162 } 1163 } 1164 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1165 // match: (Bswap64 x) 1166 // cond: 1167 // result: (MOVDBR x) 1168 for { 1169 x := v.Args[0] 1170 v.reset(OpS390XMOVDBR) 1171 v.AddArg(x) 1172 return true 1173 } 1174 } 1175 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1176 // match: (ClosureCall [argwid] entry closure mem) 1177 // cond: 1178 // result: (CALLclosure [argwid] entry closure mem) 1179 for { 1180 argwid := v.AuxInt 1181 _ = v.Args[2] 1182 entry := v.Args[0] 1183 closure := v.Args[1] 1184 mem := v.Args[2] 1185 v.reset(OpS390XCALLclosure) 1186 v.AuxInt = argwid 1187 v.AddArg(entry) 1188 v.AddArg(closure) 1189 v.AddArg(mem) 1190 return true 1191 } 1192 } 1193 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1194 // match: (Com16 x) 1195 // cond: 1196 // result: (NOTW x) 1197 for { 1198 x := v.Args[0] 1199 v.reset(OpS390XNOTW) 1200 v.AddArg(x) 1201 return true 1202 } 1203 } 1204 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1205 // match: (Com32 x) 1206 // cond: 1207 // result: (NOTW x) 1208 for { 1209 x := v.Args[0] 1210 v.reset(OpS390XNOTW) 1211 v.AddArg(x) 1212 return true 1213 } 1214 } 1215 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1216 // match: (Com64 x) 1217 // cond: 1218 // result: (NOT x) 1219 for { 1220 x := v.Args[0] 1221 v.reset(OpS390XNOT) 1222 v.AddArg(x) 1223 return true 1224 } 1225 } 1226 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1227 // match: (Com8 x) 1228 // cond: 1229 // result: (NOTW x) 1230 for { 1231 x := v.Args[0] 1232 v.reset(OpS390XNOTW) 1233 v.AddArg(x) 1234 return true 1235 } 1236 } 1237 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1238 // match: (Const16 [val]) 1239 // cond: 1240 // result: (MOVDconst [val]) 1241 for { 1242 val := v.AuxInt 1243 v.reset(OpS390XMOVDconst) 1244 v.AuxInt = val 1245 return true 1246 } 1247 } 1248 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1249 // match: (Const32 [val]) 1250 // cond: 1251 // result: (MOVDconst [val]) 1252 for { 1253 val := v.AuxInt 1254 v.reset(OpS390XMOVDconst) 1255 v.AuxInt = val 1256 return true 1257 } 1258 } 1259 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1260 // match: (Const32F [val]) 1261 // cond: 1262 // result: (FMOVSconst [val]) 1263 for { 1264 val := v.AuxInt 1265 v.reset(OpS390XFMOVSconst) 1266 v.AuxInt = val 1267 return true 1268 } 1269 } 1270 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1271 // match: (Const64 [val]) 1272 // cond: 1273 // result: (MOVDconst [val]) 1274 for { 1275 val := v.AuxInt 1276 v.reset(OpS390XMOVDconst) 1277 v.AuxInt = val 1278 return true 1279 } 1280 } 1281 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1282 // match: (Const64F [val]) 1283 // cond: 1284 // result: (FMOVDconst [val]) 1285 for { 1286 val := v.AuxInt 1287 v.reset(OpS390XFMOVDconst) 1288 v.AuxInt = val 1289 return true 1290 } 1291 } 1292 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1293 // match: (Const8 [val]) 1294 // cond: 1295 // result: (MOVDconst [val]) 1296 for { 1297 val := v.AuxInt 1298 v.reset(OpS390XMOVDconst) 1299 v.AuxInt = val 1300 return true 1301 } 1302 } 1303 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1304 // match: (ConstBool [b]) 1305 // cond: 1306 // result: (MOVDconst [b]) 1307 for { 1308 b := v.AuxInt 1309 v.reset(OpS390XMOVDconst) 1310 v.AuxInt = b 1311 return true 1312 } 1313 } 1314 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1315 // match: (ConstNil) 1316 // cond: 1317 // result: (MOVDconst [0]) 1318 for { 1319 v.reset(OpS390XMOVDconst) 1320 v.AuxInt = 0 1321 return true 1322 } 1323 } 1324 func rewriteValueS390X_OpConvert_0(v *Value) bool { 1325 // match: (Convert <t> x mem) 1326 // cond: 1327 // result: (MOVDconvert <t> x mem) 1328 for { 1329 t := v.Type 1330 _ = v.Args[1] 1331 x := v.Args[0] 1332 mem := v.Args[1] 1333 v.reset(OpS390XMOVDconvert) 1334 v.Type = t 1335 v.AddArg(x) 1336 v.AddArg(mem) 1337 return true 1338 } 1339 } 1340 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1341 b := v.Block 1342 _ = b 1343 typ := &b.Func.Config.Types 1344 _ = typ 1345 // match: (Ctz32 <t> x) 1346 // cond: 1347 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1348 for { 1349 t := v.Type 1350 x := v.Args[0] 1351 v.reset(OpS390XSUB) 1352 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1353 v0.AuxInt = 64 1354 v.AddArg(v0) 1355 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1356 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1357 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1358 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1359 v4.AuxInt = 1 1360 v4.AddArg(x) 1361 v3.AddArg(v4) 1362 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1363 v5.AddArg(x) 1364 v3.AddArg(v5) 1365 v2.AddArg(v3) 1366 v1.AddArg(v2) 1367 v.AddArg(v1) 1368 return true 1369 } 1370 } 1371 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1372 b := v.Block 1373 _ = b 1374 typ := &b.Func.Config.Types 1375 _ = typ 1376 // match: (Ctz64 <t> x) 1377 // cond: 1378 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1379 for { 1380 t := v.Type 1381 x := v.Args[0] 1382 v.reset(OpS390XSUB) 1383 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1384 v0.AuxInt = 64 1385 v.AddArg(v0) 1386 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, typ.UInt64) 1387 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1388 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1389 v3.AuxInt = 1 1390 v3.AddArg(x) 1391 v2.AddArg(v3) 1392 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1393 v4.AddArg(x) 1394 v2.AddArg(v4) 1395 v1.AddArg(v2) 1396 v.AddArg(v1) 1397 return true 1398 } 1399 } 1400 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1401 // match: (Cvt32Fto32 x) 1402 // cond: 1403 // result: (CFEBRA x) 1404 for { 1405 x := v.Args[0] 1406 v.reset(OpS390XCFEBRA) 1407 v.AddArg(x) 1408 return true 1409 } 1410 } 1411 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1412 // match: (Cvt32Fto64 x) 1413 // cond: 1414 // result: (CGEBRA x) 1415 for { 1416 x := v.Args[0] 1417 v.reset(OpS390XCGEBRA) 1418 v.AddArg(x) 1419 return true 1420 } 1421 } 1422 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1423 // match: (Cvt32Fto64F x) 1424 // cond: 1425 // result: (LDEBR x) 1426 for { 1427 x := v.Args[0] 1428 v.reset(OpS390XLDEBR) 1429 v.AddArg(x) 1430 return true 1431 } 1432 } 1433 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1434 // match: (Cvt32to32F x) 1435 // cond: 1436 // result: (CEFBRA x) 1437 for { 1438 x := v.Args[0] 1439 v.reset(OpS390XCEFBRA) 1440 v.AddArg(x) 1441 return true 1442 } 1443 } 1444 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1445 // match: (Cvt32to64F x) 1446 // cond: 1447 // result: (CDFBRA x) 1448 for { 1449 x := v.Args[0] 1450 v.reset(OpS390XCDFBRA) 1451 v.AddArg(x) 1452 return true 1453 } 1454 } 1455 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1456 // match: (Cvt64Fto32 x) 1457 // cond: 1458 // result: (CFDBRA x) 1459 for { 1460 x := v.Args[0] 1461 v.reset(OpS390XCFDBRA) 1462 v.AddArg(x) 1463 return true 1464 } 1465 } 1466 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1467 // match: (Cvt64Fto32F x) 1468 // cond: 1469 // result: (LEDBR x) 1470 for { 1471 x := v.Args[0] 1472 v.reset(OpS390XLEDBR) 1473 v.AddArg(x) 1474 return true 1475 } 1476 } 1477 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1478 // match: (Cvt64Fto64 x) 1479 // cond: 1480 // result: (CGDBRA x) 1481 for { 1482 x := v.Args[0] 1483 v.reset(OpS390XCGDBRA) 1484 v.AddArg(x) 1485 return true 1486 } 1487 } 1488 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1489 // match: (Cvt64to32F x) 1490 // cond: 1491 // result: (CEGBRA x) 1492 for { 1493 x := v.Args[0] 1494 v.reset(OpS390XCEGBRA) 1495 v.AddArg(x) 1496 return true 1497 } 1498 } 1499 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1500 // match: (Cvt64to64F x) 1501 // cond: 1502 // result: (CDGBRA x) 1503 for { 1504 x := v.Args[0] 1505 v.reset(OpS390XCDGBRA) 1506 v.AddArg(x) 1507 return true 1508 } 1509 } 1510 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1511 b := v.Block 1512 _ = b 1513 typ := &b.Func.Config.Types 1514 _ = typ 1515 // match: (Div16 x y) 1516 // cond: 1517 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1518 for { 1519 _ = v.Args[1] 1520 x := v.Args[0] 1521 y := v.Args[1] 1522 v.reset(OpS390XDIVW) 1523 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1524 v0.AddArg(x) 1525 v.AddArg(v0) 1526 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1527 v1.AddArg(y) 1528 v.AddArg(v1) 1529 return true 1530 } 1531 } 1532 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1533 b := v.Block 1534 _ = b 1535 typ := &b.Func.Config.Types 1536 _ = typ 1537 // match: (Div16u x y) 1538 // cond: 1539 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1540 for { 1541 _ = v.Args[1] 1542 x := v.Args[0] 1543 y := v.Args[1] 1544 v.reset(OpS390XDIVWU) 1545 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1546 v0.AddArg(x) 1547 v.AddArg(v0) 1548 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1549 v1.AddArg(y) 1550 v.AddArg(v1) 1551 return true 1552 } 1553 } 1554 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1555 b := v.Block 1556 _ = b 1557 typ := &b.Func.Config.Types 1558 _ = typ 1559 // match: (Div32 x y) 1560 // cond: 1561 // result: (DIVW (MOVWreg x) y) 1562 for { 1563 _ = v.Args[1] 1564 x := v.Args[0] 1565 y := v.Args[1] 1566 v.reset(OpS390XDIVW) 1567 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 1568 v0.AddArg(x) 1569 v.AddArg(v0) 1570 v.AddArg(y) 1571 return true 1572 } 1573 } 1574 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1575 // match: (Div32F x y) 1576 // cond: 1577 // result: (FDIVS x y) 1578 for { 1579 _ = v.Args[1] 1580 x := v.Args[0] 1581 y := v.Args[1] 1582 v.reset(OpS390XFDIVS) 1583 v.AddArg(x) 1584 v.AddArg(y) 1585 return true 1586 } 1587 } 1588 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1589 b := v.Block 1590 _ = b 1591 typ := &b.Func.Config.Types 1592 _ = typ 1593 // match: (Div32u x y) 1594 // cond: 1595 // result: (DIVWU (MOVWZreg x) y) 1596 for { 1597 _ = v.Args[1] 1598 x := v.Args[0] 1599 y := v.Args[1] 1600 v.reset(OpS390XDIVWU) 1601 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 1602 v0.AddArg(x) 1603 v.AddArg(v0) 1604 v.AddArg(y) 1605 return true 1606 } 1607 } 1608 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1609 // match: (Div64 x y) 1610 // cond: 1611 // result: (DIVD x y) 1612 for { 1613 _ = v.Args[1] 1614 x := v.Args[0] 1615 y := v.Args[1] 1616 v.reset(OpS390XDIVD) 1617 v.AddArg(x) 1618 v.AddArg(y) 1619 return true 1620 } 1621 } 1622 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1623 // match: (Div64F x y) 1624 // cond: 1625 // result: (FDIV x y) 1626 for { 1627 _ = v.Args[1] 1628 x := v.Args[0] 1629 y := v.Args[1] 1630 v.reset(OpS390XFDIV) 1631 v.AddArg(x) 1632 v.AddArg(y) 1633 return true 1634 } 1635 } 1636 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1637 // match: (Div64u x y) 1638 // cond: 1639 // result: (DIVDU x y) 1640 for { 1641 _ = v.Args[1] 1642 x := v.Args[0] 1643 y := v.Args[1] 1644 v.reset(OpS390XDIVDU) 1645 v.AddArg(x) 1646 v.AddArg(y) 1647 return true 1648 } 1649 } 1650 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1651 b := v.Block 1652 _ = b 1653 typ := &b.Func.Config.Types 1654 _ = typ 1655 // match: (Div8 x y) 1656 // cond: 1657 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1658 for { 1659 _ = v.Args[1] 1660 x := v.Args[0] 1661 y := v.Args[1] 1662 v.reset(OpS390XDIVW) 1663 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1664 v0.AddArg(x) 1665 v.AddArg(v0) 1666 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1667 v1.AddArg(y) 1668 v.AddArg(v1) 1669 return true 1670 } 1671 } 1672 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1673 b := v.Block 1674 _ = b 1675 typ := &b.Func.Config.Types 1676 _ = typ 1677 // match: (Div8u x y) 1678 // cond: 1679 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1680 for { 1681 _ = v.Args[1] 1682 x := v.Args[0] 1683 y := v.Args[1] 1684 v.reset(OpS390XDIVWU) 1685 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1686 v0.AddArg(x) 1687 v.AddArg(v0) 1688 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 1689 v1.AddArg(y) 1690 v.AddArg(v1) 1691 return true 1692 } 1693 } 1694 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1695 b := v.Block 1696 _ = b 1697 typ := &b.Func.Config.Types 1698 _ = typ 1699 // match: (Eq16 x y) 1700 // cond: 1701 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1702 for { 1703 _ = v.Args[1] 1704 x := v.Args[0] 1705 y := v.Args[1] 1706 v.reset(OpS390XMOVDEQ) 1707 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1708 v0.AuxInt = 0 1709 v.AddArg(v0) 1710 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1711 v1.AuxInt = 1 1712 v.AddArg(v1) 1713 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1714 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1715 v3.AddArg(x) 1716 v2.AddArg(v3) 1717 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1718 v4.AddArg(y) 1719 v2.AddArg(v4) 1720 v.AddArg(v2) 1721 return true 1722 } 1723 } 1724 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1725 b := v.Block 1726 _ = b 1727 typ := &b.Func.Config.Types 1728 _ = typ 1729 // match: (Eq32 x y) 1730 // cond: 1731 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1732 for { 1733 _ = v.Args[1] 1734 x := v.Args[0] 1735 y := v.Args[1] 1736 v.reset(OpS390XMOVDEQ) 1737 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1738 v0.AuxInt = 0 1739 v.AddArg(v0) 1740 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1741 v1.AuxInt = 1 1742 v.AddArg(v1) 1743 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1744 v2.AddArg(x) 1745 v2.AddArg(y) 1746 v.AddArg(v2) 1747 return true 1748 } 1749 } 1750 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1751 b := v.Block 1752 _ = b 1753 typ := &b.Func.Config.Types 1754 _ = typ 1755 // match: (Eq32F x y) 1756 // cond: 1757 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1758 for { 1759 _ = v.Args[1] 1760 x := v.Args[0] 1761 y := v.Args[1] 1762 v.reset(OpS390XMOVDEQ) 1763 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1764 v0.AuxInt = 0 1765 v.AddArg(v0) 1766 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1767 v1.AuxInt = 1 1768 v.AddArg(v1) 1769 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 1770 v2.AddArg(x) 1771 v2.AddArg(y) 1772 v.AddArg(v2) 1773 return true 1774 } 1775 } 1776 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1777 b := v.Block 1778 _ = b 1779 typ := &b.Func.Config.Types 1780 _ = typ 1781 // match: (Eq64 x y) 1782 // cond: 1783 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1784 for { 1785 _ = v.Args[1] 1786 x := v.Args[0] 1787 y := v.Args[1] 1788 v.reset(OpS390XMOVDEQ) 1789 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1790 v0.AuxInt = 0 1791 v.AddArg(v0) 1792 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1793 v1.AuxInt = 1 1794 v.AddArg(v1) 1795 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1796 v2.AddArg(x) 1797 v2.AddArg(y) 1798 v.AddArg(v2) 1799 return true 1800 } 1801 } 1802 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1803 b := v.Block 1804 _ = b 1805 typ := &b.Func.Config.Types 1806 _ = typ 1807 // match: (Eq64F x y) 1808 // cond: 1809 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1810 for { 1811 _ = v.Args[1] 1812 x := v.Args[0] 1813 y := v.Args[1] 1814 v.reset(OpS390XMOVDEQ) 1815 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1816 v0.AuxInt = 0 1817 v.AddArg(v0) 1818 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1819 v1.AuxInt = 1 1820 v.AddArg(v1) 1821 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 1822 v2.AddArg(x) 1823 v2.AddArg(y) 1824 v.AddArg(v2) 1825 return true 1826 } 1827 } 1828 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1829 b := v.Block 1830 _ = b 1831 typ := &b.Func.Config.Types 1832 _ = typ 1833 // match: (Eq8 x y) 1834 // cond: 1835 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1836 for { 1837 _ = v.Args[1] 1838 x := v.Args[0] 1839 y := v.Args[1] 1840 v.reset(OpS390XMOVDEQ) 1841 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1842 v0.AuxInt = 0 1843 v.AddArg(v0) 1844 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1845 v1.AuxInt = 1 1846 v.AddArg(v1) 1847 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1848 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1849 v3.AddArg(x) 1850 v2.AddArg(v3) 1851 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1852 v4.AddArg(y) 1853 v2.AddArg(v4) 1854 v.AddArg(v2) 1855 return true 1856 } 1857 } 1858 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1859 b := v.Block 1860 _ = b 1861 typ := &b.Func.Config.Types 1862 _ = typ 1863 // match: (EqB x y) 1864 // cond: 1865 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1866 for { 1867 _ = v.Args[1] 1868 x := v.Args[0] 1869 y := v.Args[1] 1870 v.reset(OpS390XMOVDEQ) 1871 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1872 v0.AuxInt = 0 1873 v.AddArg(v0) 1874 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1875 v1.AuxInt = 1 1876 v.AddArg(v1) 1877 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1878 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1879 v3.AddArg(x) 1880 v2.AddArg(v3) 1881 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 1882 v4.AddArg(y) 1883 v2.AddArg(v4) 1884 v.AddArg(v2) 1885 return true 1886 } 1887 } 1888 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1889 b := v.Block 1890 _ = b 1891 typ := &b.Func.Config.Types 1892 _ = typ 1893 // match: (EqPtr x y) 1894 // cond: 1895 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1896 for { 1897 _ = v.Args[1] 1898 x := v.Args[0] 1899 y := v.Args[1] 1900 v.reset(OpS390XMOVDEQ) 1901 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1902 v0.AuxInt = 0 1903 v.AddArg(v0) 1904 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1905 v1.AuxInt = 1 1906 v.AddArg(v1) 1907 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1908 v2.AddArg(x) 1909 v2.AddArg(y) 1910 v.AddArg(v2) 1911 return true 1912 } 1913 } 1914 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 1915 b := v.Block 1916 _ = b 1917 typ := &b.Func.Config.Types 1918 _ = typ 1919 // match: (Geq16 x y) 1920 // cond: 1921 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1922 for { 1923 _ = v.Args[1] 1924 x := v.Args[0] 1925 y := v.Args[1] 1926 v.reset(OpS390XMOVDGE) 1927 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1928 v0.AuxInt = 0 1929 v.AddArg(v0) 1930 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1931 v1.AuxInt = 1 1932 v.AddArg(v1) 1933 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 1934 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1935 v3.AddArg(x) 1936 v2.AddArg(v3) 1937 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 1938 v4.AddArg(y) 1939 v2.AddArg(v4) 1940 v.AddArg(v2) 1941 return true 1942 } 1943 } 1944 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 1945 b := v.Block 1946 _ = b 1947 typ := &b.Func.Config.Types 1948 _ = typ 1949 // match: (Geq16U x y) 1950 // cond: 1951 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1952 for { 1953 _ = v.Args[1] 1954 x := v.Args[0] 1955 y := v.Args[1] 1956 v.reset(OpS390XMOVDGE) 1957 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1958 v0.AuxInt = 0 1959 v.AddArg(v0) 1960 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1961 v1.AuxInt = 1 1962 v.AddArg(v1) 1963 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 1964 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1965 v3.AddArg(x) 1966 v2.AddArg(v3) 1967 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 1968 v4.AddArg(y) 1969 v2.AddArg(v4) 1970 v.AddArg(v2) 1971 return true 1972 } 1973 } 1974 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 1975 b := v.Block 1976 _ = b 1977 typ := &b.Func.Config.Types 1978 _ = typ 1979 // match: (Geq32 x y) 1980 // cond: 1981 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1982 for { 1983 _ = v.Args[1] 1984 x := v.Args[0] 1985 y := v.Args[1] 1986 v.reset(OpS390XMOVDGE) 1987 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1988 v0.AuxInt = 0 1989 v.AddArg(v0) 1990 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 1991 v1.AuxInt = 1 1992 v.AddArg(v1) 1993 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 1994 v2.AddArg(x) 1995 v2.AddArg(y) 1996 v.AddArg(v2) 1997 return true 1998 } 1999 } 2000 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 2001 b := v.Block 2002 _ = b 2003 typ := &b.Func.Config.Types 2004 _ = typ 2005 // match: (Geq32F x y) 2006 // cond: 2007 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2008 for { 2009 _ = v.Args[1] 2010 x := v.Args[0] 2011 y := v.Args[1] 2012 v.reset(OpS390XMOVDGEnoinv) 2013 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2014 v0.AuxInt = 0 2015 v.AddArg(v0) 2016 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2017 v1.AuxInt = 1 2018 v.AddArg(v1) 2019 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2020 v2.AddArg(x) 2021 v2.AddArg(y) 2022 v.AddArg(v2) 2023 return true 2024 } 2025 } 2026 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 2027 b := v.Block 2028 _ = b 2029 typ := &b.Func.Config.Types 2030 _ = typ 2031 // match: (Geq32U x y) 2032 // cond: 2033 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2034 for { 2035 _ = v.Args[1] 2036 x := v.Args[0] 2037 y := v.Args[1] 2038 v.reset(OpS390XMOVDGE) 2039 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2040 v0.AuxInt = 0 2041 v.AddArg(v0) 2042 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2043 v1.AuxInt = 1 2044 v.AddArg(v1) 2045 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2046 v2.AddArg(x) 2047 v2.AddArg(y) 2048 v.AddArg(v2) 2049 return true 2050 } 2051 } 2052 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2053 b := v.Block 2054 _ = b 2055 typ := &b.Func.Config.Types 2056 _ = typ 2057 // match: (Geq64 x y) 2058 // cond: 2059 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2060 for { 2061 _ = v.Args[1] 2062 x := v.Args[0] 2063 y := v.Args[1] 2064 v.reset(OpS390XMOVDGE) 2065 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2066 v0.AuxInt = 0 2067 v.AddArg(v0) 2068 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2069 v1.AuxInt = 1 2070 v.AddArg(v1) 2071 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2072 v2.AddArg(x) 2073 v2.AddArg(y) 2074 v.AddArg(v2) 2075 return true 2076 } 2077 } 2078 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2079 b := v.Block 2080 _ = b 2081 typ := &b.Func.Config.Types 2082 _ = typ 2083 // match: (Geq64F x y) 2084 // cond: 2085 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2086 for { 2087 _ = v.Args[1] 2088 x := v.Args[0] 2089 y := v.Args[1] 2090 v.reset(OpS390XMOVDGEnoinv) 2091 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2092 v0.AuxInt = 0 2093 v.AddArg(v0) 2094 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2095 v1.AuxInt = 1 2096 v.AddArg(v1) 2097 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2098 v2.AddArg(x) 2099 v2.AddArg(y) 2100 v.AddArg(v2) 2101 return true 2102 } 2103 } 2104 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2105 b := v.Block 2106 _ = b 2107 typ := &b.Func.Config.Types 2108 _ = typ 2109 // match: (Geq64U x y) 2110 // cond: 2111 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2112 for { 2113 _ = v.Args[1] 2114 x := v.Args[0] 2115 y := v.Args[1] 2116 v.reset(OpS390XMOVDGE) 2117 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2118 v0.AuxInt = 0 2119 v.AddArg(v0) 2120 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2121 v1.AuxInt = 1 2122 v.AddArg(v1) 2123 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2124 v2.AddArg(x) 2125 v2.AddArg(y) 2126 v.AddArg(v2) 2127 return true 2128 } 2129 } 2130 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2131 b := v.Block 2132 _ = b 2133 typ := &b.Func.Config.Types 2134 _ = typ 2135 // match: (Geq8 x y) 2136 // cond: 2137 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2138 for { 2139 _ = v.Args[1] 2140 x := v.Args[0] 2141 y := v.Args[1] 2142 v.reset(OpS390XMOVDGE) 2143 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2144 v0.AuxInt = 0 2145 v.AddArg(v0) 2146 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2147 v1.AuxInt = 1 2148 v.AddArg(v1) 2149 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2150 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2151 v3.AddArg(x) 2152 v2.AddArg(v3) 2153 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2154 v4.AddArg(y) 2155 v2.AddArg(v4) 2156 v.AddArg(v2) 2157 return true 2158 } 2159 } 2160 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2161 b := v.Block 2162 _ = b 2163 typ := &b.Func.Config.Types 2164 _ = typ 2165 // match: (Geq8U x y) 2166 // cond: 2167 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2168 for { 2169 _ = v.Args[1] 2170 x := v.Args[0] 2171 y := v.Args[1] 2172 v.reset(OpS390XMOVDGE) 2173 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2174 v0.AuxInt = 0 2175 v.AddArg(v0) 2176 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2177 v1.AuxInt = 1 2178 v.AddArg(v1) 2179 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2180 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2181 v3.AddArg(x) 2182 v2.AddArg(v3) 2183 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2184 v4.AddArg(y) 2185 v2.AddArg(v4) 2186 v.AddArg(v2) 2187 return true 2188 } 2189 } 2190 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2191 // match: (GetClosurePtr) 2192 // cond: 2193 // result: (LoweredGetClosurePtr) 2194 for { 2195 v.reset(OpS390XLoweredGetClosurePtr) 2196 return true 2197 } 2198 } 2199 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2200 // match: (GetG mem) 2201 // cond: 2202 // result: (LoweredGetG mem) 2203 for { 2204 mem := v.Args[0] 2205 v.reset(OpS390XLoweredGetG) 2206 v.AddArg(mem) 2207 return true 2208 } 2209 } 2210 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2211 b := v.Block 2212 _ = b 2213 typ := &b.Func.Config.Types 2214 _ = typ 2215 // match: (Greater16 x y) 2216 // cond: 2217 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2218 for { 2219 _ = v.Args[1] 2220 x := v.Args[0] 2221 y := v.Args[1] 2222 v.reset(OpS390XMOVDGT) 2223 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2224 v0.AuxInt = 0 2225 v.AddArg(v0) 2226 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2227 v1.AuxInt = 1 2228 v.AddArg(v1) 2229 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2230 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2231 v3.AddArg(x) 2232 v2.AddArg(v3) 2233 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2234 v4.AddArg(y) 2235 v2.AddArg(v4) 2236 v.AddArg(v2) 2237 return true 2238 } 2239 } 2240 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2241 b := v.Block 2242 _ = b 2243 typ := &b.Func.Config.Types 2244 _ = typ 2245 // match: (Greater16U x y) 2246 // cond: 2247 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2248 for { 2249 _ = v.Args[1] 2250 x := v.Args[0] 2251 y := v.Args[1] 2252 v.reset(OpS390XMOVDGT) 2253 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2254 v0.AuxInt = 0 2255 v.AddArg(v0) 2256 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2257 v1.AuxInt = 1 2258 v.AddArg(v1) 2259 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2260 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2261 v3.AddArg(x) 2262 v2.AddArg(v3) 2263 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2264 v4.AddArg(y) 2265 v2.AddArg(v4) 2266 v.AddArg(v2) 2267 return true 2268 } 2269 } 2270 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2271 b := v.Block 2272 _ = b 2273 typ := &b.Func.Config.Types 2274 _ = typ 2275 // match: (Greater32 x y) 2276 // cond: 2277 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2278 for { 2279 _ = v.Args[1] 2280 x := v.Args[0] 2281 y := v.Args[1] 2282 v.reset(OpS390XMOVDGT) 2283 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2284 v0.AuxInt = 0 2285 v.AddArg(v0) 2286 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2287 v1.AuxInt = 1 2288 v.AddArg(v1) 2289 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2290 v2.AddArg(x) 2291 v2.AddArg(y) 2292 v.AddArg(v2) 2293 return true 2294 } 2295 } 2296 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2297 b := v.Block 2298 _ = b 2299 typ := &b.Func.Config.Types 2300 _ = typ 2301 // match: (Greater32F x y) 2302 // cond: 2303 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2304 for { 2305 _ = v.Args[1] 2306 x := v.Args[0] 2307 y := v.Args[1] 2308 v.reset(OpS390XMOVDGTnoinv) 2309 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2310 v0.AuxInt = 0 2311 v.AddArg(v0) 2312 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2313 v1.AuxInt = 1 2314 v.AddArg(v1) 2315 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2316 v2.AddArg(x) 2317 v2.AddArg(y) 2318 v.AddArg(v2) 2319 return true 2320 } 2321 } 2322 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2323 b := v.Block 2324 _ = b 2325 typ := &b.Func.Config.Types 2326 _ = typ 2327 // match: (Greater32U x y) 2328 // cond: 2329 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2330 for { 2331 _ = v.Args[1] 2332 x := v.Args[0] 2333 y := v.Args[1] 2334 v.reset(OpS390XMOVDGT) 2335 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2336 v0.AuxInt = 0 2337 v.AddArg(v0) 2338 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2339 v1.AuxInt = 1 2340 v.AddArg(v1) 2341 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2342 v2.AddArg(x) 2343 v2.AddArg(y) 2344 v.AddArg(v2) 2345 return true 2346 } 2347 } 2348 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2349 b := v.Block 2350 _ = b 2351 typ := &b.Func.Config.Types 2352 _ = typ 2353 // match: (Greater64 x y) 2354 // cond: 2355 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2356 for { 2357 _ = v.Args[1] 2358 x := v.Args[0] 2359 y := v.Args[1] 2360 v.reset(OpS390XMOVDGT) 2361 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2362 v0.AuxInt = 0 2363 v.AddArg(v0) 2364 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2365 v1.AuxInt = 1 2366 v.AddArg(v1) 2367 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2368 v2.AddArg(x) 2369 v2.AddArg(y) 2370 v.AddArg(v2) 2371 return true 2372 } 2373 } 2374 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2375 b := v.Block 2376 _ = b 2377 typ := &b.Func.Config.Types 2378 _ = typ 2379 // match: (Greater64F x y) 2380 // cond: 2381 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2382 for { 2383 _ = v.Args[1] 2384 x := v.Args[0] 2385 y := v.Args[1] 2386 v.reset(OpS390XMOVDGTnoinv) 2387 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2388 v0.AuxInt = 0 2389 v.AddArg(v0) 2390 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2391 v1.AuxInt = 1 2392 v.AddArg(v1) 2393 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2394 v2.AddArg(x) 2395 v2.AddArg(y) 2396 v.AddArg(v2) 2397 return true 2398 } 2399 } 2400 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2401 b := v.Block 2402 _ = b 2403 typ := &b.Func.Config.Types 2404 _ = typ 2405 // match: (Greater64U x y) 2406 // cond: 2407 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2408 for { 2409 _ = v.Args[1] 2410 x := v.Args[0] 2411 y := v.Args[1] 2412 v.reset(OpS390XMOVDGT) 2413 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2414 v0.AuxInt = 0 2415 v.AddArg(v0) 2416 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2417 v1.AuxInt = 1 2418 v.AddArg(v1) 2419 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2420 v2.AddArg(x) 2421 v2.AddArg(y) 2422 v.AddArg(v2) 2423 return true 2424 } 2425 } 2426 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2427 b := v.Block 2428 _ = b 2429 typ := &b.Func.Config.Types 2430 _ = typ 2431 // match: (Greater8 x y) 2432 // cond: 2433 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2434 for { 2435 _ = v.Args[1] 2436 x := v.Args[0] 2437 y := v.Args[1] 2438 v.reset(OpS390XMOVDGT) 2439 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2440 v0.AuxInt = 0 2441 v.AddArg(v0) 2442 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2443 v1.AuxInt = 1 2444 v.AddArg(v1) 2445 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2446 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2447 v3.AddArg(x) 2448 v2.AddArg(v3) 2449 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2450 v4.AddArg(y) 2451 v2.AddArg(v4) 2452 v.AddArg(v2) 2453 return true 2454 } 2455 } 2456 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2457 b := v.Block 2458 _ = b 2459 typ := &b.Func.Config.Types 2460 _ = typ 2461 // match: (Greater8U x y) 2462 // cond: 2463 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2464 for { 2465 _ = v.Args[1] 2466 x := v.Args[0] 2467 y := v.Args[1] 2468 v.reset(OpS390XMOVDGT) 2469 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2470 v0.AuxInt = 0 2471 v.AddArg(v0) 2472 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2473 v1.AuxInt = 1 2474 v.AddArg(v1) 2475 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2476 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2477 v3.AddArg(x) 2478 v2.AddArg(v3) 2479 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2480 v4.AddArg(y) 2481 v2.AddArg(v4) 2482 v.AddArg(v2) 2483 return true 2484 } 2485 } 2486 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2487 b := v.Block 2488 _ = b 2489 typ := &b.Func.Config.Types 2490 _ = typ 2491 // match: (Hmul32 x y) 2492 // cond: 2493 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2494 for { 2495 _ = v.Args[1] 2496 x := v.Args[0] 2497 y := v.Args[1] 2498 v.reset(OpS390XSRDconst) 2499 v.AuxInt = 32 2500 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2501 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2502 v1.AddArg(x) 2503 v0.AddArg(v1) 2504 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 2505 v2.AddArg(y) 2506 v0.AddArg(v2) 2507 v.AddArg(v0) 2508 return true 2509 } 2510 } 2511 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2512 b := v.Block 2513 _ = b 2514 typ := &b.Func.Config.Types 2515 _ = typ 2516 // match: (Hmul32u x y) 2517 // cond: 2518 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2519 for { 2520 _ = v.Args[1] 2521 x := v.Args[0] 2522 y := v.Args[1] 2523 v.reset(OpS390XSRDconst) 2524 v.AuxInt = 32 2525 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) 2526 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2527 v1.AddArg(x) 2528 v0.AddArg(v1) 2529 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 2530 v2.AddArg(y) 2531 v0.AddArg(v2) 2532 v.AddArg(v0) 2533 return true 2534 } 2535 } 2536 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2537 // match: (Hmul64 x y) 2538 // cond: 2539 // result: (MULHD x y) 2540 for { 2541 _ = v.Args[1] 2542 x := v.Args[0] 2543 y := v.Args[1] 2544 v.reset(OpS390XMULHD) 2545 v.AddArg(x) 2546 v.AddArg(y) 2547 return true 2548 } 2549 } 2550 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2551 // match: (Hmul64u x y) 2552 // cond: 2553 // result: (MULHDU x y) 2554 for { 2555 _ = v.Args[1] 2556 x := v.Args[0] 2557 y := v.Args[1] 2558 v.reset(OpS390XMULHDU) 2559 v.AddArg(x) 2560 v.AddArg(y) 2561 return true 2562 } 2563 } 2564 func rewriteValueS390X_OpITab_0(v *Value) bool { 2565 // match: (ITab (Load ptr mem)) 2566 // cond: 2567 // result: (MOVDload ptr mem) 2568 for { 2569 v_0 := v.Args[0] 2570 if v_0.Op != OpLoad { 2571 break 2572 } 2573 _ = v_0.Args[1] 2574 ptr := v_0.Args[0] 2575 mem := v_0.Args[1] 2576 v.reset(OpS390XMOVDload) 2577 v.AddArg(ptr) 2578 v.AddArg(mem) 2579 return true 2580 } 2581 return false 2582 } 2583 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2584 // match: (InterCall [argwid] entry mem) 2585 // cond: 2586 // result: (CALLinter [argwid] entry mem) 2587 for { 2588 argwid := v.AuxInt 2589 _ = v.Args[1] 2590 entry := v.Args[0] 2591 mem := v.Args[1] 2592 v.reset(OpS390XCALLinter) 2593 v.AuxInt = argwid 2594 v.AddArg(entry) 2595 v.AddArg(mem) 2596 return true 2597 } 2598 } 2599 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2600 b := v.Block 2601 _ = b 2602 typ := &b.Func.Config.Types 2603 _ = typ 2604 // match: (IsInBounds idx len) 2605 // cond: 2606 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2607 for { 2608 _ = v.Args[1] 2609 idx := v.Args[0] 2610 len := v.Args[1] 2611 v.reset(OpS390XMOVDLT) 2612 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2613 v0.AuxInt = 0 2614 v.AddArg(v0) 2615 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2616 v1.AuxInt = 1 2617 v.AddArg(v1) 2618 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2619 v2.AddArg(idx) 2620 v2.AddArg(len) 2621 v.AddArg(v2) 2622 return true 2623 } 2624 } 2625 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2626 b := v.Block 2627 _ = b 2628 typ := &b.Func.Config.Types 2629 _ = typ 2630 // match: (IsNonNil p) 2631 // cond: 2632 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2633 for { 2634 p := v.Args[0] 2635 v.reset(OpS390XMOVDNE) 2636 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2637 v0.AuxInt = 0 2638 v.AddArg(v0) 2639 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2640 v1.AuxInt = 1 2641 v.AddArg(v1) 2642 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 2643 v2.AuxInt = 0 2644 v2.AddArg(p) 2645 v.AddArg(v2) 2646 return true 2647 } 2648 } 2649 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2650 b := v.Block 2651 _ = b 2652 typ := &b.Func.Config.Types 2653 _ = typ 2654 // match: (IsSliceInBounds idx len) 2655 // cond: 2656 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2657 for { 2658 _ = v.Args[1] 2659 idx := v.Args[0] 2660 len := v.Args[1] 2661 v.reset(OpS390XMOVDLE) 2662 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2663 v0.AuxInt = 0 2664 v.AddArg(v0) 2665 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2666 v1.AuxInt = 1 2667 v.AddArg(v1) 2668 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2669 v2.AddArg(idx) 2670 v2.AddArg(len) 2671 v.AddArg(v2) 2672 return true 2673 } 2674 } 2675 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2676 b := v.Block 2677 _ = b 2678 typ := &b.Func.Config.Types 2679 _ = typ 2680 // match: (Leq16 x y) 2681 // cond: 2682 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2683 for { 2684 _ = v.Args[1] 2685 x := v.Args[0] 2686 y := v.Args[1] 2687 v.reset(OpS390XMOVDLE) 2688 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2689 v0.AuxInt = 0 2690 v.AddArg(v0) 2691 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2692 v1.AuxInt = 1 2693 v.AddArg(v1) 2694 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2695 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2696 v3.AddArg(x) 2697 v2.AddArg(v3) 2698 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2699 v4.AddArg(y) 2700 v2.AddArg(v4) 2701 v.AddArg(v2) 2702 return true 2703 } 2704 } 2705 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2706 b := v.Block 2707 _ = b 2708 typ := &b.Func.Config.Types 2709 _ = typ 2710 // match: (Leq16U x y) 2711 // cond: 2712 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2713 for { 2714 _ = v.Args[1] 2715 x := v.Args[0] 2716 y := v.Args[1] 2717 v.reset(OpS390XMOVDLE) 2718 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2719 v0.AuxInt = 0 2720 v.AddArg(v0) 2721 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2722 v1.AuxInt = 1 2723 v.AddArg(v1) 2724 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2725 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2726 v3.AddArg(x) 2727 v2.AddArg(v3) 2728 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 2729 v4.AddArg(y) 2730 v2.AddArg(v4) 2731 v.AddArg(v2) 2732 return true 2733 } 2734 } 2735 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2736 b := v.Block 2737 _ = b 2738 typ := &b.Func.Config.Types 2739 _ = typ 2740 // match: (Leq32 x y) 2741 // cond: 2742 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2743 for { 2744 _ = v.Args[1] 2745 x := v.Args[0] 2746 y := v.Args[1] 2747 v.reset(OpS390XMOVDLE) 2748 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2749 v0.AuxInt = 0 2750 v.AddArg(v0) 2751 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2752 v1.AuxInt = 1 2753 v.AddArg(v1) 2754 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 2755 v2.AddArg(x) 2756 v2.AddArg(y) 2757 v.AddArg(v2) 2758 return true 2759 } 2760 } 2761 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2762 b := v.Block 2763 _ = b 2764 typ := &b.Func.Config.Types 2765 _ = typ 2766 // match: (Leq32F x y) 2767 // cond: 2768 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2769 for { 2770 _ = v.Args[1] 2771 x := v.Args[0] 2772 y := v.Args[1] 2773 v.reset(OpS390XMOVDGEnoinv) 2774 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2775 v0.AuxInt = 0 2776 v.AddArg(v0) 2777 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2778 v1.AuxInt = 1 2779 v.AddArg(v1) 2780 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 2781 v2.AddArg(y) 2782 v2.AddArg(x) 2783 v.AddArg(v2) 2784 return true 2785 } 2786 } 2787 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2788 b := v.Block 2789 _ = b 2790 typ := &b.Func.Config.Types 2791 _ = typ 2792 // match: (Leq32U x y) 2793 // cond: 2794 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2795 for { 2796 _ = v.Args[1] 2797 x := v.Args[0] 2798 y := v.Args[1] 2799 v.reset(OpS390XMOVDLE) 2800 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2801 v0.AuxInt = 0 2802 v.AddArg(v0) 2803 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2804 v1.AuxInt = 1 2805 v.AddArg(v1) 2806 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 2807 v2.AddArg(x) 2808 v2.AddArg(y) 2809 v.AddArg(v2) 2810 return true 2811 } 2812 } 2813 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2814 b := v.Block 2815 _ = b 2816 typ := &b.Func.Config.Types 2817 _ = typ 2818 // match: (Leq64 x y) 2819 // cond: 2820 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2821 for { 2822 _ = v.Args[1] 2823 x := v.Args[0] 2824 y := v.Args[1] 2825 v.reset(OpS390XMOVDLE) 2826 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2827 v0.AuxInt = 0 2828 v.AddArg(v0) 2829 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2830 v1.AuxInt = 1 2831 v.AddArg(v1) 2832 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2833 v2.AddArg(x) 2834 v2.AddArg(y) 2835 v.AddArg(v2) 2836 return true 2837 } 2838 } 2839 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2840 b := v.Block 2841 _ = b 2842 typ := &b.Func.Config.Types 2843 _ = typ 2844 // match: (Leq64F x y) 2845 // cond: 2846 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2847 for { 2848 _ = v.Args[1] 2849 x := v.Args[0] 2850 y := v.Args[1] 2851 v.reset(OpS390XMOVDGEnoinv) 2852 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2853 v0.AuxInt = 0 2854 v.AddArg(v0) 2855 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2856 v1.AuxInt = 1 2857 v.AddArg(v1) 2858 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 2859 v2.AddArg(y) 2860 v2.AddArg(x) 2861 v.AddArg(v2) 2862 return true 2863 } 2864 } 2865 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2866 b := v.Block 2867 _ = b 2868 typ := &b.Func.Config.Types 2869 _ = typ 2870 // match: (Leq64U x y) 2871 // cond: 2872 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2873 for { 2874 _ = v.Args[1] 2875 x := v.Args[0] 2876 y := v.Args[1] 2877 v.reset(OpS390XMOVDLE) 2878 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2879 v0.AuxInt = 0 2880 v.AddArg(v0) 2881 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2882 v1.AuxInt = 1 2883 v.AddArg(v1) 2884 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2885 v2.AddArg(x) 2886 v2.AddArg(y) 2887 v.AddArg(v2) 2888 return true 2889 } 2890 } 2891 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 2892 b := v.Block 2893 _ = b 2894 typ := &b.Func.Config.Types 2895 _ = typ 2896 // match: (Leq8 x y) 2897 // cond: 2898 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2899 for { 2900 _ = v.Args[1] 2901 x := v.Args[0] 2902 y := v.Args[1] 2903 v.reset(OpS390XMOVDLE) 2904 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2905 v0.AuxInt = 0 2906 v.AddArg(v0) 2907 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2908 v1.AuxInt = 1 2909 v.AddArg(v1) 2910 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2911 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2912 v3.AddArg(x) 2913 v2.AddArg(v3) 2914 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 2915 v4.AddArg(y) 2916 v2.AddArg(v4) 2917 v.AddArg(v2) 2918 return true 2919 } 2920 } 2921 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 2922 b := v.Block 2923 _ = b 2924 typ := &b.Func.Config.Types 2925 _ = typ 2926 // match: (Leq8U x y) 2927 // cond: 2928 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2929 for { 2930 _ = v.Args[1] 2931 x := v.Args[0] 2932 y := v.Args[1] 2933 v.reset(OpS390XMOVDLE) 2934 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2935 v0.AuxInt = 0 2936 v.AddArg(v0) 2937 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2938 v1.AuxInt = 1 2939 v.AddArg(v1) 2940 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 2941 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2942 v3.AddArg(x) 2943 v2.AddArg(v3) 2944 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 2945 v4.AddArg(y) 2946 v2.AddArg(v4) 2947 v.AddArg(v2) 2948 return true 2949 } 2950 } 2951 func rewriteValueS390X_OpLess16_0(v *Value) bool { 2952 b := v.Block 2953 _ = b 2954 typ := &b.Func.Config.Types 2955 _ = typ 2956 // match: (Less16 x y) 2957 // cond: 2958 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2959 for { 2960 _ = v.Args[1] 2961 x := v.Args[0] 2962 y := v.Args[1] 2963 v.reset(OpS390XMOVDLT) 2964 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2965 v0.AuxInt = 0 2966 v.AddArg(v0) 2967 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2968 v1.AuxInt = 1 2969 v.AddArg(v1) 2970 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 2971 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2972 v3.AddArg(x) 2973 v2.AddArg(v3) 2974 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 2975 v4.AddArg(y) 2976 v2.AddArg(v4) 2977 v.AddArg(v2) 2978 return true 2979 } 2980 } 2981 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 2982 b := v.Block 2983 _ = b 2984 typ := &b.Func.Config.Types 2985 _ = typ 2986 // match: (Less16U x y) 2987 // cond: 2988 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2989 for { 2990 _ = v.Args[1] 2991 x := v.Args[0] 2992 y := v.Args[1] 2993 v.reset(OpS390XMOVDLT) 2994 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2995 v0.AuxInt = 0 2996 v.AddArg(v0) 2997 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 2998 v1.AuxInt = 1 2999 v.AddArg(v1) 3000 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3001 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3002 v3.AddArg(x) 3003 v2.AddArg(v3) 3004 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3005 v4.AddArg(y) 3006 v2.AddArg(v4) 3007 v.AddArg(v2) 3008 return true 3009 } 3010 } 3011 func rewriteValueS390X_OpLess32_0(v *Value) bool { 3012 b := v.Block 3013 _ = b 3014 typ := &b.Func.Config.Types 3015 _ = typ 3016 // match: (Less32 x y) 3017 // cond: 3018 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3019 for { 3020 _ = v.Args[1] 3021 x := v.Args[0] 3022 y := v.Args[1] 3023 v.reset(OpS390XMOVDLT) 3024 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3025 v0.AuxInt = 0 3026 v.AddArg(v0) 3027 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3028 v1.AuxInt = 1 3029 v.AddArg(v1) 3030 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 3031 v2.AddArg(x) 3032 v2.AddArg(y) 3033 v.AddArg(v2) 3034 return true 3035 } 3036 } 3037 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 3038 b := v.Block 3039 _ = b 3040 typ := &b.Func.Config.Types 3041 _ = typ 3042 // match: (Less32F x y) 3043 // cond: 3044 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3045 for { 3046 _ = v.Args[1] 3047 x := v.Args[0] 3048 y := v.Args[1] 3049 v.reset(OpS390XMOVDGTnoinv) 3050 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3051 v0.AuxInt = 0 3052 v.AddArg(v0) 3053 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3054 v1.AuxInt = 1 3055 v.AddArg(v1) 3056 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 3057 v2.AddArg(y) 3058 v2.AddArg(x) 3059 v.AddArg(v2) 3060 return true 3061 } 3062 } 3063 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 3064 b := v.Block 3065 _ = b 3066 typ := &b.Func.Config.Types 3067 _ = typ 3068 // match: (Less32U x y) 3069 // cond: 3070 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3071 for { 3072 _ = v.Args[1] 3073 x := v.Args[0] 3074 y := v.Args[1] 3075 v.reset(OpS390XMOVDLT) 3076 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3077 v0.AuxInt = 0 3078 v.AddArg(v0) 3079 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3080 v1.AuxInt = 1 3081 v.AddArg(v1) 3082 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, types.TypeFlags) 3083 v2.AddArg(x) 3084 v2.AddArg(y) 3085 v.AddArg(v2) 3086 return true 3087 } 3088 } 3089 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3090 b := v.Block 3091 _ = b 3092 typ := &b.Func.Config.Types 3093 _ = typ 3094 // match: (Less64 x y) 3095 // cond: 3096 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3097 for { 3098 _ = v.Args[1] 3099 x := v.Args[0] 3100 y := v.Args[1] 3101 v.reset(OpS390XMOVDLT) 3102 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3103 v0.AuxInt = 0 3104 v.AddArg(v0) 3105 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3106 v1.AuxInt = 1 3107 v.AddArg(v1) 3108 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3109 v2.AddArg(x) 3110 v2.AddArg(y) 3111 v.AddArg(v2) 3112 return true 3113 } 3114 } 3115 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3116 b := v.Block 3117 _ = b 3118 typ := &b.Func.Config.Types 3119 _ = typ 3120 // match: (Less64F x y) 3121 // cond: 3122 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3123 for { 3124 _ = v.Args[1] 3125 x := v.Args[0] 3126 y := v.Args[1] 3127 v.reset(OpS390XMOVDGTnoinv) 3128 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3129 v0.AuxInt = 0 3130 v.AddArg(v0) 3131 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3132 v1.AuxInt = 1 3133 v.AddArg(v1) 3134 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 3135 v2.AddArg(y) 3136 v2.AddArg(x) 3137 v.AddArg(v2) 3138 return true 3139 } 3140 } 3141 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3142 b := v.Block 3143 _ = b 3144 typ := &b.Func.Config.Types 3145 _ = typ 3146 // match: (Less64U x y) 3147 // cond: 3148 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3149 for { 3150 _ = v.Args[1] 3151 x := v.Args[0] 3152 y := v.Args[1] 3153 v.reset(OpS390XMOVDLT) 3154 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3155 v0.AuxInt = 0 3156 v.AddArg(v0) 3157 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3158 v1.AuxInt = 1 3159 v.AddArg(v1) 3160 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3161 v2.AddArg(x) 3162 v2.AddArg(y) 3163 v.AddArg(v2) 3164 return true 3165 } 3166 } 3167 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3168 b := v.Block 3169 _ = b 3170 typ := &b.Func.Config.Types 3171 _ = typ 3172 // match: (Less8 x y) 3173 // cond: 3174 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3175 for { 3176 _ = v.Args[1] 3177 x := v.Args[0] 3178 y := v.Args[1] 3179 v.reset(OpS390XMOVDLT) 3180 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3181 v0.AuxInt = 0 3182 v.AddArg(v0) 3183 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3184 v1.AuxInt = 1 3185 v.AddArg(v1) 3186 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 3187 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3188 v3.AddArg(x) 3189 v2.AddArg(v3) 3190 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3191 v4.AddArg(y) 3192 v2.AddArg(v4) 3193 v.AddArg(v2) 3194 return true 3195 } 3196 } 3197 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3198 b := v.Block 3199 _ = b 3200 typ := &b.Func.Config.Types 3201 _ = typ 3202 // match: (Less8U x y) 3203 // cond: 3204 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3205 for { 3206 _ = v.Args[1] 3207 x := v.Args[0] 3208 y := v.Args[1] 3209 v.reset(OpS390XMOVDLT) 3210 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3211 v0.AuxInt = 0 3212 v.AddArg(v0) 3213 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 3214 v1.AuxInt = 1 3215 v.AddArg(v1) 3216 v2 := b.NewValue0(v.Pos, OpS390XCMPU, types.TypeFlags) 3217 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3218 v3.AddArg(x) 3219 v2.AddArg(v3) 3220 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3221 v4.AddArg(y) 3222 v2.AddArg(v4) 3223 v.AddArg(v2) 3224 return true 3225 } 3226 } 3227 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3228 // match: (Load <t> ptr mem) 3229 // cond: (is64BitInt(t) || isPtr(t)) 3230 // result: (MOVDload ptr mem) 3231 for { 3232 t := v.Type 3233 _ = v.Args[1] 3234 ptr := v.Args[0] 3235 mem := v.Args[1] 3236 if !(is64BitInt(t) || isPtr(t)) { 3237 break 3238 } 3239 v.reset(OpS390XMOVDload) 3240 v.AddArg(ptr) 3241 v.AddArg(mem) 3242 return true 3243 } 3244 // match: (Load <t> ptr mem) 3245 // cond: is32BitInt(t) && isSigned(t) 3246 // result: (MOVWload ptr mem) 3247 for { 3248 t := v.Type 3249 _ = v.Args[1] 3250 ptr := v.Args[0] 3251 mem := v.Args[1] 3252 if !(is32BitInt(t) && isSigned(t)) { 3253 break 3254 } 3255 v.reset(OpS390XMOVWload) 3256 v.AddArg(ptr) 3257 v.AddArg(mem) 3258 return true 3259 } 3260 // match: (Load <t> ptr mem) 3261 // cond: is32BitInt(t) && !isSigned(t) 3262 // result: (MOVWZload ptr mem) 3263 for { 3264 t := v.Type 3265 _ = v.Args[1] 3266 ptr := v.Args[0] 3267 mem := v.Args[1] 3268 if !(is32BitInt(t) && !isSigned(t)) { 3269 break 3270 } 3271 v.reset(OpS390XMOVWZload) 3272 v.AddArg(ptr) 3273 v.AddArg(mem) 3274 return true 3275 } 3276 // match: (Load <t> ptr mem) 3277 // cond: is16BitInt(t) && isSigned(t) 3278 // result: (MOVHload ptr mem) 3279 for { 3280 t := v.Type 3281 _ = v.Args[1] 3282 ptr := v.Args[0] 3283 mem := v.Args[1] 3284 if !(is16BitInt(t) && isSigned(t)) { 3285 break 3286 } 3287 v.reset(OpS390XMOVHload) 3288 v.AddArg(ptr) 3289 v.AddArg(mem) 3290 return true 3291 } 3292 // match: (Load <t> ptr mem) 3293 // cond: is16BitInt(t) && !isSigned(t) 3294 // result: (MOVHZload ptr mem) 3295 for { 3296 t := v.Type 3297 _ = v.Args[1] 3298 ptr := v.Args[0] 3299 mem := v.Args[1] 3300 if !(is16BitInt(t) && !isSigned(t)) { 3301 break 3302 } 3303 v.reset(OpS390XMOVHZload) 3304 v.AddArg(ptr) 3305 v.AddArg(mem) 3306 return true 3307 } 3308 // match: (Load <t> ptr mem) 3309 // cond: is8BitInt(t) && isSigned(t) 3310 // result: (MOVBload ptr mem) 3311 for { 3312 t := v.Type 3313 _ = v.Args[1] 3314 ptr := v.Args[0] 3315 mem := v.Args[1] 3316 if !(is8BitInt(t) && isSigned(t)) { 3317 break 3318 } 3319 v.reset(OpS390XMOVBload) 3320 v.AddArg(ptr) 3321 v.AddArg(mem) 3322 return true 3323 } 3324 // match: (Load <t> ptr mem) 3325 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3326 // result: (MOVBZload ptr mem) 3327 for { 3328 t := v.Type 3329 _ = v.Args[1] 3330 ptr := v.Args[0] 3331 mem := v.Args[1] 3332 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3333 break 3334 } 3335 v.reset(OpS390XMOVBZload) 3336 v.AddArg(ptr) 3337 v.AddArg(mem) 3338 return true 3339 } 3340 // match: (Load <t> ptr mem) 3341 // cond: is32BitFloat(t) 3342 // result: (FMOVSload ptr mem) 3343 for { 3344 t := v.Type 3345 _ = v.Args[1] 3346 ptr := v.Args[0] 3347 mem := v.Args[1] 3348 if !(is32BitFloat(t)) { 3349 break 3350 } 3351 v.reset(OpS390XFMOVSload) 3352 v.AddArg(ptr) 3353 v.AddArg(mem) 3354 return true 3355 } 3356 // match: (Load <t> ptr mem) 3357 // cond: is64BitFloat(t) 3358 // result: (FMOVDload ptr mem) 3359 for { 3360 t := v.Type 3361 _ = v.Args[1] 3362 ptr := v.Args[0] 3363 mem := v.Args[1] 3364 if !(is64BitFloat(t)) { 3365 break 3366 } 3367 v.reset(OpS390XFMOVDload) 3368 v.AddArg(ptr) 3369 v.AddArg(mem) 3370 return true 3371 } 3372 return false 3373 } 3374 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3375 b := v.Block 3376 _ = b 3377 typ := &b.Func.Config.Types 3378 _ = typ 3379 // match: (Lsh16x16 <t> x y) 3380 // cond: 3381 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3382 for { 3383 t := v.Type 3384 _ = v.Args[1] 3385 x := v.Args[0] 3386 y := v.Args[1] 3387 v.reset(OpS390XANDW) 3388 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3389 v0.AddArg(x) 3390 v0.AddArg(y) 3391 v.AddArg(v0) 3392 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3393 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3394 v2.AuxInt = 31 3395 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3396 v3.AddArg(y) 3397 v2.AddArg(v3) 3398 v1.AddArg(v2) 3399 v.AddArg(v1) 3400 return true 3401 } 3402 } 3403 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3404 b := v.Block 3405 _ = b 3406 // match: (Lsh16x32 <t> x y) 3407 // cond: 3408 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3409 for { 3410 t := v.Type 3411 _ = v.Args[1] 3412 x := v.Args[0] 3413 y := v.Args[1] 3414 v.reset(OpS390XANDW) 3415 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3416 v0.AddArg(x) 3417 v0.AddArg(y) 3418 v.AddArg(v0) 3419 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3420 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3421 v2.AuxInt = 31 3422 v2.AddArg(y) 3423 v1.AddArg(v2) 3424 v.AddArg(v1) 3425 return true 3426 } 3427 } 3428 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3429 b := v.Block 3430 _ = b 3431 // match: (Lsh16x64 <t> x y) 3432 // cond: 3433 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3434 for { 3435 t := v.Type 3436 _ = v.Args[1] 3437 x := v.Args[0] 3438 y := v.Args[1] 3439 v.reset(OpS390XANDW) 3440 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3441 v0.AddArg(x) 3442 v0.AddArg(y) 3443 v.AddArg(v0) 3444 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3445 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3446 v2.AuxInt = 31 3447 v2.AddArg(y) 3448 v1.AddArg(v2) 3449 v.AddArg(v1) 3450 return true 3451 } 3452 } 3453 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3454 b := v.Block 3455 _ = b 3456 typ := &b.Func.Config.Types 3457 _ = typ 3458 // match: (Lsh16x8 <t> x y) 3459 // cond: 3460 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3461 for { 3462 t := v.Type 3463 _ = v.Args[1] 3464 x := v.Args[0] 3465 y := v.Args[1] 3466 v.reset(OpS390XANDW) 3467 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3468 v0.AddArg(x) 3469 v0.AddArg(y) 3470 v.AddArg(v0) 3471 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3472 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3473 v2.AuxInt = 31 3474 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3475 v3.AddArg(y) 3476 v2.AddArg(v3) 3477 v1.AddArg(v2) 3478 v.AddArg(v1) 3479 return true 3480 } 3481 } 3482 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3483 b := v.Block 3484 _ = b 3485 typ := &b.Func.Config.Types 3486 _ = typ 3487 // match: (Lsh32x16 <t> x y) 3488 // cond: 3489 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3490 for { 3491 t := v.Type 3492 _ = v.Args[1] 3493 x := v.Args[0] 3494 y := v.Args[1] 3495 v.reset(OpS390XANDW) 3496 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3497 v0.AddArg(x) 3498 v0.AddArg(y) 3499 v.AddArg(v0) 3500 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3501 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3502 v2.AuxInt = 31 3503 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3504 v3.AddArg(y) 3505 v2.AddArg(v3) 3506 v1.AddArg(v2) 3507 v.AddArg(v1) 3508 return true 3509 } 3510 } 3511 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3512 b := v.Block 3513 _ = b 3514 // match: (Lsh32x32 <t> x y) 3515 // cond: 3516 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3517 for { 3518 t := v.Type 3519 _ = v.Args[1] 3520 x := v.Args[0] 3521 y := v.Args[1] 3522 v.reset(OpS390XANDW) 3523 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3524 v0.AddArg(x) 3525 v0.AddArg(y) 3526 v.AddArg(v0) 3527 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3528 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3529 v2.AuxInt = 31 3530 v2.AddArg(y) 3531 v1.AddArg(v2) 3532 v.AddArg(v1) 3533 return true 3534 } 3535 } 3536 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3537 b := v.Block 3538 _ = b 3539 // match: (Lsh32x64 <t> x y) 3540 // cond: 3541 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3542 for { 3543 t := v.Type 3544 _ = v.Args[1] 3545 x := v.Args[0] 3546 y := v.Args[1] 3547 v.reset(OpS390XANDW) 3548 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3549 v0.AddArg(x) 3550 v0.AddArg(y) 3551 v.AddArg(v0) 3552 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3553 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3554 v2.AuxInt = 31 3555 v2.AddArg(y) 3556 v1.AddArg(v2) 3557 v.AddArg(v1) 3558 return true 3559 } 3560 } 3561 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3562 b := v.Block 3563 _ = b 3564 typ := &b.Func.Config.Types 3565 _ = typ 3566 // match: (Lsh32x8 <t> x y) 3567 // cond: 3568 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3569 for { 3570 t := v.Type 3571 _ = v.Args[1] 3572 x := v.Args[0] 3573 y := v.Args[1] 3574 v.reset(OpS390XANDW) 3575 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3576 v0.AddArg(x) 3577 v0.AddArg(y) 3578 v.AddArg(v0) 3579 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3580 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3581 v2.AuxInt = 31 3582 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3583 v3.AddArg(y) 3584 v2.AddArg(v3) 3585 v1.AddArg(v2) 3586 v.AddArg(v1) 3587 return true 3588 } 3589 } 3590 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3591 b := v.Block 3592 _ = b 3593 typ := &b.Func.Config.Types 3594 _ = typ 3595 // match: (Lsh64x16 <t> x y) 3596 // cond: 3597 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3598 for { 3599 t := v.Type 3600 _ = v.Args[1] 3601 x := v.Args[0] 3602 y := v.Args[1] 3603 v.reset(OpS390XAND) 3604 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3605 v0.AddArg(x) 3606 v0.AddArg(y) 3607 v.AddArg(v0) 3608 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3609 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3610 v2.AuxInt = 63 3611 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3612 v3.AddArg(y) 3613 v2.AddArg(v3) 3614 v1.AddArg(v2) 3615 v.AddArg(v1) 3616 return true 3617 } 3618 } 3619 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3620 b := v.Block 3621 _ = b 3622 // match: (Lsh64x32 <t> x y) 3623 // cond: 3624 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3625 for { 3626 t := v.Type 3627 _ = v.Args[1] 3628 x := v.Args[0] 3629 y := v.Args[1] 3630 v.reset(OpS390XAND) 3631 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3632 v0.AddArg(x) 3633 v0.AddArg(y) 3634 v.AddArg(v0) 3635 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3636 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3637 v2.AuxInt = 63 3638 v2.AddArg(y) 3639 v1.AddArg(v2) 3640 v.AddArg(v1) 3641 return true 3642 } 3643 } 3644 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3645 b := v.Block 3646 _ = b 3647 // match: (Lsh64x64 <t> x y) 3648 // cond: 3649 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3650 for { 3651 t := v.Type 3652 _ = v.Args[1] 3653 x := v.Args[0] 3654 y := v.Args[1] 3655 v.reset(OpS390XAND) 3656 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3657 v0.AddArg(x) 3658 v0.AddArg(y) 3659 v.AddArg(v0) 3660 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3661 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3662 v2.AuxInt = 63 3663 v2.AddArg(y) 3664 v1.AddArg(v2) 3665 v.AddArg(v1) 3666 return true 3667 } 3668 } 3669 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 3670 b := v.Block 3671 _ = b 3672 typ := &b.Func.Config.Types 3673 _ = typ 3674 // match: (Lsh64x8 <t> x y) 3675 // cond: 3676 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3677 for { 3678 t := v.Type 3679 _ = v.Args[1] 3680 x := v.Args[0] 3681 y := v.Args[1] 3682 v.reset(OpS390XAND) 3683 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3684 v0.AddArg(x) 3685 v0.AddArg(y) 3686 v.AddArg(v0) 3687 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3688 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3689 v2.AuxInt = 63 3690 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3691 v3.AddArg(y) 3692 v2.AddArg(v3) 3693 v1.AddArg(v2) 3694 v.AddArg(v1) 3695 return true 3696 } 3697 } 3698 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 3699 b := v.Block 3700 _ = b 3701 typ := &b.Func.Config.Types 3702 _ = typ 3703 // match: (Lsh8x16 <t> x y) 3704 // cond: 3705 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3706 for { 3707 t := v.Type 3708 _ = v.Args[1] 3709 x := v.Args[0] 3710 y := v.Args[1] 3711 v.reset(OpS390XANDW) 3712 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3713 v0.AddArg(x) 3714 v0.AddArg(y) 3715 v.AddArg(v0) 3716 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3717 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3718 v2.AuxInt = 31 3719 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3720 v3.AddArg(y) 3721 v2.AddArg(v3) 3722 v1.AddArg(v2) 3723 v.AddArg(v1) 3724 return true 3725 } 3726 } 3727 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 3728 b := v.Block 3729 _ = b 3730 // match: (Lsh8x32 <t> x y) 3731 // cond: 3732 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3733 for { 3734 t := v.Type 3735 _ = v.Args[1] 3736 x := v.Args[0] 3737 y := v.Args[1] 3738 v.reset(OpS390XANDW) 3739 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3740 v0.AddArg(x) 3741 v0.AddArg(y) 3742 v.AddArg(v0) 3743 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3744 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3745 v2.AuxInt = 31 3746 v2.AddArg(y) 3747 v1.AddArg(v2) 3748 v.AddArg(v1) 3749 return true 3750 } 3751 } 3752 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 3753 b := v.Block 3754 _ = b 3755 // match: (Lsh8x64 <t> x y) 3756 // cond: 3757 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3758 for { 3759 t := v.Type 3760 _ = v.Args[1] 3761 x := v.Args[0] 3762 y := v.Args[1] 3763 v.reset(OpS390XANDW) 3764 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3765 v0.AddArg(x) 3766 v0.AddArg(y) 3767 v.AddArg(v0) 3768 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3769 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 3770 v2.AuxInt = 31 3771 v2.AddArg(y) 3772 v1.AddArg(v2) 3773 v.AddArg(v1) 3774 return true 3775 } 3776 } 3777 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 3778 b := v.Block 3779 _ = b 3780 typ := &b.Func.Config.Types 3781 _ = typ 3782 // match: (Lsh8x8 <t> x y) 3783 // cond: 3784 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3785 for { 3786 t := v.Type 3787 _ = v.Args[1] 3788 x := v.Args[0] 3789 y := v.Args[1] 3790 v.reset(OpS390XANDW) 3791 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3792 v0.AddArg(x) 3793 v0.AddArg(y) 3794 v.AddArg(v0) 3795 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3796 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 3797 v2.AuxInt = 31 3798 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3799 v3.AddArg(y) 3800 v2.AddArg(v3) 3801 v1.AddArg(v2) 3802 v.AddArg(v1) 3803 return true 3804 } 3805 } 3806 func rewriteValueS390X_OpMod16_0(v *Value) bool { 3807 b := v.Block 3808 _ = b 3809 typ := &b.Func.Config.Types 3810 _ = typ 3811 // match: (Mod16 x y) 3812 // cond: 3813 // result: (MODW (MOVHreg x) (MOVHreg y)) 3814 for { 3815 _ = v.Args[1] 3816 x := v.Args[0] 3817 y := v.Args[1] 3818 v.reset(OpS390XMODW) 3819 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3820 v0.AddArg(x) 3821 v.AddArg(v0) 3822 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 3823 v1.AddArg(y) 3824 v.AddArg(v1) 3825 return true 3826 } 3827 } 3828 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 3829 b := v.Block 3830 _ = b 3831 typ := &b.Func.Config.Types 3832 _ = typ 3833 // match: (Mod16u x y) 3834 // cond: 3835 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3836 for { 3837 _ = v.Args[1] 3838 x := v.Args[0] 3839 y := v.Args[1] 3840 v.reset(OpS390XMODWU) 3841 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3842 v0.AddArg(x) 3843 v.AddArg(v0) 3844 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 3845 v1.AddArg(y) 3846 v.AddArg(v1) 3847 return true 3848 } 3849 } 3850 func rewriteValueS390X_OpMod32_0(v *Value) bool { 3851 b := v.Block 3852 _ = b 3853 typ := &b.Func.Config.Types 3854 _ = typ 3855 // match: (Mod32 x y) 3856 // cond: 3857 // result: (MODW (MOVWreg x) y) 3858 for { 3859 _ = v.Args[1] 3860 x := v.Args[0] 3861 y := v.Args[1] 3862 v.reset(OpS390XMODW) 3863 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) 3864 v0.AddArg(x) 3865 v.AddArg(v0) 3866 v.AddArg(y) 3867 return true 3868 } 3869 } 3870 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 3871 b := v.Block 3872 _ = b 3873 typ := &b.Func.Config.Types 3874 _ = typ 3875 // match: (Mod32u x y) 3876 // cond: 3877 // result: (MODWU (MOVWZreg x) y) 3878 for { 3879 _ = v.Args[1] 3880 x := v.Args[0] 3881 y := v.Args[1] 3882 v.reset(OpS390XMODWU) 3883 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 3884 v0.AddArg(x) 3885 v.AddArg(v0) 3886 v.AddArg(y) 3887 return true 3888 } 3889 } 3890 func rewriteValueS390X_OpMod64_0(v *Value) bool { 3891 // match: (Mod64 x y) 3892 // cond: 3893 // result: (MODD x y) 3894 for { 3895 _ = v.Args[1] 3896 x := v.Args[0] 3897 y := v.Args[1] 3898 v.reset(OpS390XMODD) 3899 v.AddArg(x) 3900 v.AddArg(y) 3901 return true 3902 } 3903 } 3904 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 3905 // match: (Mod64u x y) 3906 // cond: 3907 // result: (MODDU x y) 3908 for { 3909 _ = v.Args[1] 3910 x := v.Args[0] 3911 y := v.Args[1] 3912 v.reset(OpS390XMODDU) 3913 v.AddArg(x) 3914 v.AddArg(y) 3915 return true 3916 } 3917 } 3918 func rewriteValueS390X_OpMod8_0(v *Value) bool { 3919 b := v.Block 3920 _ = b 3921 typ := &b.Func.Config.Types 3922 _ = typ 3923 // match: (Mod8 x y) 3924 // cond: 3925 // result: (MODW (MOVBreg x) (MOVBreg y)) 3926 for { 3927 _ = v.Args[1] 3928 x := v.Args[0] 3929 y := v.Args[1] 3930 v.reset(OpS390XMODW) 3931 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3932 v0.AddArg(x) 3933 v.AddArg(v0) 3934 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 3935 v1.AddArg(y) 3936 v.AddArg(v1) 3937 return true 3938 } 3939 } 3940 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 3941 b := v.Block 3942 _ = b 3943 typ := &b.Func.Config.Types 3944 _ = typ 3945 // match: (Mod8u x y) 3946 // cond: 3947 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3948 for { 3949 _ = v.Args[1] 3950 x := v.Args[0] 3951 y := v.Args[1] 3952 v.reset(OpS390XMODWU) 3953 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3954 v0.AddArg(x) 3955 v.AddArg(v0) 3956 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 3957 v1.AddArg(y) 3958 v.AddArg(v1) 3959 return true 3960 } 3961 } 3962 func rewriteValueS390X_OpMove_0(v *Value) bool { 3963 b := v.Block 3964 _ = b 3965 typ := &b.Func.Config.Types 3966 _ = typ 3967 // match: (Move [0] _ _ mem) 3968 // cond: 3969 // result: mem 3970 for { 3971 if v.AuxInt != 0 { 3972 break 3973 } 3974 _ = v.Args[2] 3975 mem := v.Args[2] 3976 v.reset(OpCopy) 3977 v.Type = mem.Type 3978 v.AddArg(mem) 3979 return true 3980 } 3981 // match: (Move [1] dst src mem) 3982 // cond: 3983 // result: (MOVBstore dst (MOVBZload src mem) mem) 3984 for { 3985 if v.AuxInt != 1 { 3986 break 3987 } 3988 _ = v.Args[2] 3989 dst := v.Args[0] 3990 src := v.Args[1] 3991 mem := v.Args[2] 3992 v.reset(OpS390XMOVBstore) 3993 v.AddArg(dst) 3994 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 3995 v0.AddArg(src) 3996 v0.AddArg(mem) 3997 v.AddArg(v0) 3998 v.AddArg(mem) 3999 return true 4000 } 4001 // match: (Move [2] dst src mem) 4002 // cond: 4003 // result: (MOVHstore dst (MOVHZload src mem) mem) 4004 for { 4005 if v.AuxInt != 2 { 4006 break 4007 } 4008 _ = v.Args[2] 4009 dst := v.Args[0] 4010 src := v.Args[1] 4011 mem := v.Args[2] 4012 v.reset(OpS390XMOVHstore) 4013 v.AddArg(dst) 4014 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4015 v0.AddArg(src) 4016 v0.AddArg(mem) 4017 v.AddArg(v0) 4018 v.AddArg(mem) 4019 return true 4020 } 4021 // match: (Move [4] dst src mem) 4022 // cond: 4023 // result: (MOVWstore dst (MOVWZload src mem) mem) 4024 for { 4025 if v.AuxInt != 4 { 4026 break 4027 } 4028 _ = v.Args[2] 4029 dst := v.Args[0] 4030 src := v.Args[1] 4031 mem := v.Args[2] 4032 v.reset(OpS390XMOVWstore) 4033 v.AddArg(dst) 4034 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4035 v0.AddArg(src) 4036 v0.AddArg(mem) 4037 v.AddArg(v0) 4038 v.AddArg(mem) 4039 return true 4040 } 4041 // match: (Move [8] dst src mem) 4042 // cond: 4043 // result: (MOVDstore dst (MOVDload src mem) mem) 4044 for { 4045 if v.AuxInt != 8 { 4046 break 4047 } 4048 _ = v.Args[2] 4049 dst := v.Args[0] 4050 src := v.Args[1] 4051 mem := v.Args[2] 4052 v.reset(OpS390XMOVDstore) 4053 v.AddArg(dst) 4054 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4055 v0.AddArg(src) 4056 v0.AddArg(mem) 4057 v.AddArg(v0) 4058 v.AddArg(mem) 4059 return true 4060 } 4061 // match: (Move [16] dst src mem) 4062 // cond: 4063 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4064 for { 4065 if v.AuxInt != 16 { 4066 break 4067 } 4068 _ = v.Args[2] 4069 dst := v.Args[0] 4070 src := v.Args[1] 4071 mem := v.Args[2] 4072 v.reset(OpS390XMOVDstore) 4073 v.AuxInt = 8 4074 v.AddArg(dst) 4075 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4076 v0.AuxInt = 8 4077 v0.AddArg(src) 4078 v0.AddArg(mem) 4079 v.AddArg(v0) 4080 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4081 v1.AddArg(dst) 4082 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4083 v2.AddArg(src) 4084 v2.AddArg(mem) 4085 v1.AddArg(v2) 4086 v1.AddArg(mem) 4087 v.AddArg(v1) 4088 return true 4089 } 4090 // match: (Move [24] dst src mem) 4091 // cond: 4092 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4093 for { 4094 if v.AuxInt != 24 { 4095 break 4096 } 4097 _ = v.Args[2] 4098 dst := v.Args[0] 4099 src := v.Args[1] 4100 mem := v.Args[2] 4101 v.reset(OpS390XMOVDstore) 4102 v.AuxInt = 16 4103 v.AddArg(dst) 4104 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4105 v0.AuxInt = 16 4106 v0.AddArg(src) 4107 v0.AddArg(mem) 4108 v.AddArg(v0) 4109 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4110 v1.AuxInt = 8 4111 v1.AddArg(dst) 4112 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4113 v2.AuxInt = 8 4114 v2.AddArg(src) 4115 v2.AddArg(mem) 4116 v1.AddArg(v2) 4117 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, types.TypeMem) 4118 v3.AddArg(dst) 4119 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 4120 v4.AddArg(src) 4121 v4.AddArg(mem) 4122 v3.AddArg(v4) 4123 v3.AddArg(mem) 4124 v1.AddArg(v3) 4125 v.AddArg(v1) 4126 return true 4127 } 4128 // match: (Move [3] dst src mem) 4129 // cond: 4130 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4131 for { 4132 if v.AuxInt != 3 { 4133 break 4134 } 4135 _ = v.Args[2] 4136 dst := v.Args[0] 4137 src := v.Args[1] 4138 mem := v.Args[2] 4139 v.reset(OpS390XMOVBstore) 4140 v.AuxInt = 2 4141 v.AddArg(dst) 4142 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4143 v0.AuxInt = 2 4144 v0.AddArg(src) 4145 v0.AddArg(mem) 4146 v.AddArg(v0) 4147 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4148 v1.AddArg(dst) 4149 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4150 v2.AddArg(src) 4151 v2.AddArg(mem) 4152 v1.AddArg(v2) 4153 v1.AddArg(mem) 4154 v.AddArg(v1) 4155 return true 4156 } 4157 // match: (Move [5] dst src mem) 4158 // cond: 4159 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4160 for { 4161 if v.AuxInt != 5 { 4162 break 4163 } 4164 _ = v.Args[2] 4165 dst := v.Args[0] 4166 src := v.Args[1] 4167 mem := v.Args[2] 4168 v.reset(OpS390XMOVBstore) 4169 v.AuxInt = 4 4170 v.AddArg(dst) 4171 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4172 v0.AuxInt = 4 4173 v0.AddArg(src) 4174 v0.AddArg(mem) 4175 v.AddArg(v0) 4176 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4177 v1.AddArg(dst) 4178 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4179 v2.AddArg(src) 4180 v2.AddArg(mem) 4181 v1.AddArg(v2) 4182 v1.AddArg(mem) 4183 v.AddArg(v1) 4184 return true 4185 } 4186 // match: (Move [6] dst src mem) 4187 // cond: 4188 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4189 for { 4190 if v.AuxInt != 6 { 4191 break 4192 } 4193 _ = v.Args[2] 4194 dst := v.Args[0] 4195 src := v.Args[1] 4196 mem := v.Args[2] 4197 v.reset(OpS390XMOVHstore) 4198 v.AuxInt = 4 4199 v.AddArg(dst) 4200 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4201 v0.AuxInt = 4 4202 v0.AddArg(src) 4203 v0.AddArg(mem) 4204 v.AddArg(v0) 4205 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4206 v1.AddArg(dst) 4207 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4208 v2.AddArg(src) 4209 v2.AddArg(mem) 4210 v1.AddArg(v2) 4211 v1.AddArg(mem) 4212 v.AddArg(v1) 4213 return true 4214 } 4215 return false 4216 } 4217 func rewriteValueS390X_OpMove_10(v *Value) bool { 4218 b := v.Block 4219 _ = b 4220 typ := &b.Func.Config.Types 4221 _ = typ 4222 // match: (Move [7] dst src mem) 4223 // cond: 4224 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4225 for { 4226 if v.AuxInt != 7 { 4227 break 4228 } 4229 _ = v.Args[2] 4230 dst := v.Args[0] 4231 src := v.Args[1] 4232 mem := v.Args[2] 4233 v.reset(OpS390XMOVBstore) 4234 v.AuxInt = 6 4235 v.AddArg(dst) 4236 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) 4237 v0.AuxInt = 6 4238 v0.AddArg(src) 4239 v0.AddArg(mem) 4240 v.AddArg(v0) 4241 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, types.TypeMem) 4242 v1.AuxInt = 4 4243 v1.AddArg(dst) 4244 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 4245 v2.AuxInt = 4 4246 v2.AddArg(src) 4247 v2.AddArg(mem) 4248 v1.AddArg(v2) 4249 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, types.TypeMem) 4250 v3.AddArg(dst) 4251 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 4252 v4.AddArg(src) 4253 v4.AddArg(mem) 4254 v3.AddArg(v4) 4255 v3.AddArg(mem) 4256 v1.AddArg(v3) 4257 v.AddArg(v1) 4258 return true 4259 } 4260 // match: (Move [s] dst src mem) 4261 // cond: s > 0 && s <= 256 4262 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4263 for { 4264 s := v.AuxInt 4265 _ = v.Args[2] 4266 dst := v.Args[0] 4267 src := v.Args[1] 4268 mem := v.Args[2] 4269 if !(s > 0 && s <= 256) { 4270 break 4271 } 4272 v.reset(OpS390XMVC) 4273 v.AuxInt = makeValAndOff(s, 0) 4274 v.AddArg(dst) 4275 v.AddArg(src) 4276 v.AddArg(mem) 4277 return true 4278 } 4279 // match: (Move [s] dst src mem) 4280 // cond: s > 256 && s <= 512 4281 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4282 for { 4283 s := v.AuxInt 4284 _ = v.Args[2] 4285 dst := v.Args[0] 4286 src := v.Args[1] 4287 mem := v.Args[2] 4288 if !(s > 256 && s <= 512) { 4289 break 4290 } 4291 v.reset(OpS390XMVC) 4292 v.AuxInt = makeValAndOff(s-256, 256) 4293 v.AddArg(dst) 4294 v.AddArg(src) 4295 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4296 v0.AuxInt = makeValAndOff(256, 0) 4297 v0.AddArg(dst) 4298 v0.AddArg(src) 4299 v0.AddArg(mem) 4300 v.AddArg(v0) 4301 return true 4302 } 4303 // match: (Move [s] dst src mem) 4304 // cond: s > 512 && s <= 768 4305 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4306 for { 4307 s := v.AuxInt 4308 _ = v.Args[2] 4309 dst := v.Args[0] 4310 src := v.Args[1] 4311 mem := v.Args[2] 4312 if !(s > 512 && s <= 768) { 4313 break 4314 } 4315 v.reset(OpS390XMVC) 4316 v.AuxInt = makeValAndOff(s-512, 512) 4317 v.AddArg(dst) 4318 v.AddArg(src) 4319 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4320 v0.AuxInt = makeValAndOff(256, 256) 4321 v0.AddArg(dst) 4322 v0.AddArg(src) 4323 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4324 v1.AuxInt = makeValAndOff(256, 0) 4325 v1.AddArg(dst) 4326 v1.AddArg(src) 4327 v1.AddArg(mem) 4328 v0.AddArg(v1) 4329 v.AddArg(v0) 4330 return true 4331 } 4332 // match: (Move [s] dst src mem) 4333 // cond: s > 768 && s <= 1024 4334 // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) 4335 for { 4336 s := v.AuxInt 4337 _ = v.Args[2] 4338 dst := v.Args[0] 4339 src := v.Args[1] 4340 mem := v.Args[2] 4341 if !(s > 768 && s <= 1024) { 4342 break 4343 } 4344 v.reset(OpS390XMVC) 4345 v.AuxInt = makeValAndOff(s-768, 768) 4346 v.AddArg(dst) 4347 v.AddArg(src) 4348 v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4349 v0.AuxInt = makeValAndOff(256, 512) 4350 v0.AddArg(dst) 4351 v0.AddArg(src) 4352 v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4353 v1.AuxInt = makeValAndOff(256, 256) 4354 v1.AddArg(dst) 4355 v1.AddArg(src) 4356 v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) 4357 v2.AuxInt = makeValAndOff(256, 0) 4358 v2.AddArg(dst) 4359 v2.AddArg(src) 4360 v2.AddArg(mem) 4361 v1.AddArg(v2) 4362 v0.AddArg(v1) 4363 v.AddArg(v0) 4364 return true 4365 } 4366 // match: (Move [s] dst src mem) 4367 // cond: s > 1024 4368 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4369 for { 4370 s := v.AuxInt 4371 _ = v.Args[2] 4372 dst := v.Args[0] 4373 src := v.Args[1] 4374 mem := v.Args[2] 4375 if !(s > 1024) { 4376 break 4377 } 4378 v.reset(OpS390XLoweredMove) 4379 v.AuxInt = s % 256 4380 v.AddArg(dst) 4381 v.AddArg(src) 4382 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4383 v0.AuxInt = (s / 256) * 256 4384 v0.AddArg(src) 4385 v.AddArg(v0) 4386 v.AddArg(mem) 4387 return true 4388 } 4389 return false 4390 } 4391 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4392 // match: (Mul16 x y) 4393 // cond: 4394 // result: (MULLW x y) 4395 for { 4396 _ = v.Args[1] 4397 x := v.Args[0] 4398 y := v.Args[1] 4399 v.reset(OpS390XMULLW) 4400 v.AddArg(x) 4401 v.AddArg(y) 4402 return true 4403 } 4404 } 4405 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4406 // match: (Mul32 x y) 4407 // cond: 4408 // result: (MULLW x y) 4409 for { 4410 _ = v.Args[1] 4411 x := v.Args[0] 4412 y := v.Args[1] 4413 v.reset(OpS390XMULLW) 4414 v.AddArg(x) 4415 v.AddArg(y) 4416 return true 4417 } 4418 } 4419 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4420 // match: (Mul32F x y) 4421 // cond: 4422 // result: (FMULS x y) 4423 for { 4424 _ = v.Args[1] 4425 x := v.Args[0] 4426 y := v.Args[1] 4427 v.reset(OpS390XFMULS) 4428 v.AddArg(x) 4429 v.AddArg(y) 4430 return true 4431 } 4432 } 4433 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4434 // match: (Mul64 x y) 4435 // cond: 4436 // result: (MULLD x y) 4437 for { 4438 _ = v.Args[1] 4439 x := v.Args[0] 4440 y := v.Args[1] 4441 v.reset(OpS390XMULLD) 4442 v.AddArg(x) 4443 v.AddArg(y) 4444 return true 4445 } 4446 } 4447 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4448 // match: (Mul64F x y) 4449 // cond: 4450 // result: (FMUL x y) 4451 for { 4452 _ = v.Args[1] 4453 x := v.Args[0] 4454 y := v.Args[1] 4455 v.reset(OpS390XFMUL) 4456 v.AddArg(x) 4457 v.AddArg(y) 4458 return true 4459 } 4460 } 4461 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4462 // match: (Mul8 x y) 4463 // cond: 4464 // result: (MULLW x y) 4465 for { 4466 _ = v.Args[1] 4467 x := v.Args[0] 4468 y := v.Args[1] 4469 v.reset(OpS390XMULLW) 4470 v.AddArg(x) 4471 v.AddArg(y) 4472 return true 4473 } 4474 } 4475 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4476 b := v.Block 4477 _ = b 4478 typ := &b.Func.Config.Types 4479 _ = typ 4480 // match: (Neg16 x) 4481 // cond: 4482 // result: (NEGW (MOVHreg x)) 4483 for { 4484 x := v.Args[0] 4485 v.reset(OpS390XNEGW) 4486 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4487 v0.AddArg(x) 4488 v.AddArg(v0) 4489 return true 4490 } 4491 } 4492 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4493 // match: (Neg32 x) 4494 // cond: 4495 // result: (NEGW x) 4496 for { 4497 x := v.Args[0] 4498 v.reset(OpS390XNEGW) 4499 v.AddArg(x) 4500 return true 4501 } 4502 } 4503 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4504 // match: (Neg32F x) 4505 // cond: 4506 // result: (FNEGS x) 4507 for { 4508 x := v.Args[0] 4509 v.reset(OpS390XFNEGS) 4510 v.AddArg(x) 4511 return true 4512 } 4513 } 4514 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4515 // match: (Neg64 x) 4516 // cond: 4517 // result: (NEG x) 4518 for { 4519 x := v.Args[0] 4520 v.reset(OpS390XNEG) 4521 v.AddArg(x) 4522 return true 4523 } 4524 } 4525 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4526 // match: (Neg64F x) 4527 // cond: 4528 // result: (FNEG x) 4529 for { 4530 x := v.Args[0] 4531 v.reset(OpS390XFNEG) 4532 v.AddArg(x) 4533 return true 4534 } 4535 } 4536 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4537 b := v.Block 4538 _ = b 4539 typ := &b.Func.Config.Types 4540 _ = typ 4541 // match: (Neg8 x) 4542 // cond: 4543 // result: (NEGW (MOVBreg x)) 4544 for { 4545 x := v.Args[0] 4546 v.reset(OpS390XNEGW) 4547 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4548 v0.AddArg(x) 4549 v.AddArg(v0) 4550 return true 4551 } 4552 } 4553 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4554 b := v.Block 4555 _ = b 4556 typ := &b.Func.Config.Types 4557 _ = typ 4558 // match: (Neq16 x y) 4559 // cond: 4560 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4561 for { 4562 _ = v.Args[1] 4563 x := v.Args[0] 4564 y := v.Args[1] 4565 v.reset(OpS390XMOVDNE) 4566 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4567 v0.AuxInt = 0 4568 v.AddArg(v0) 4569 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4570 v1.AuxInt = 1 4571 v.AddArg(v1) 4572 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4573 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4574 v3.AddArg(x) 4575 v2.AddArg(v3) 4576 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 4577 v4.AddArg(y) 4578 v2.AddArg(v4) 4579 v.AddArg(v2) 4580 return true 4581 } 4582 } 4583 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 4584 b := v.Block 4585 _ = b 4586 typ := &b.Func.Config.Types 4587 _ = typ 4588 // match: (Neq32 x y) 4589 // cond: 4590 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4591 for { 4592 _ = v.Args[1] 4593 x := v.Args[0] 4594 y := v.Args[1] 4595 v.reset(OpS390XMOVDNE) 4596 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4597 v0.AuxInt = 0 4598 v.AddArg(v0) 4599 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4600 v1.AuxInt = 1 4601 v.AddArg(v1) 4602 v2 := b.NewValue0(v.Pos, OpS390XCMPW, types.TypeFlags) 4603 v2.AddArg(x) 4604 v2.AddArg(y) 4605 v.AddArg(v2) 4606 return true 4607 } 4608 } 4609 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 4610 b := v.Block 4611 _ = b 4612 typ := &b.Func.Config.Types 4613 _ = typ 4614 // match: (Neq32F x y) 4615 // cond: 4616 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4617 for { 4618 _ = v.Args[1] 4619 x := v.Args[0] 4620 y := v.Args[1] 4621 v.reset(OpS390XMOVDNE) 4622 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4623 v0.AuxInt = 0 4624 v.AddArg(v0) 4625 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4626 v1.AuxInt = 1 4627 v.AddArg(v1) 4628 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, types.TypeFlags) 4629 v2.AddArg(x) 4630 v2.AddArg(y) 4631 v.AddArg(v2) 4632 return true 4633 } 4634 } 4635 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 4636 b := v.Block 4637 _ = b 4638 typ := &b.Func.Config.Types 4639 _ = typ 4640 // match: (Neq64 x y) 4641 // cond: 4642 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4643 for { 4644 _ = v.Args[1] 4645 x := v.Args[0] 4646 y := v.Args[1] 4647 v.reset(OpS390XMOVDNE) 4648 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4649 v0.AuxInt = 0 4650 v.AddArg(v0) 4651 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4652 v1.AuxInt = 1 4653 v.AddArg(v1) 4654 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4655 v2.AddArg(x) 4656 v2.AddArg(y) 4657 v.AddArg(v2) 4658 return true 4659 } 4660 } 4661 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 4662 b := v.Block 4663 _ = b 4664 typ := &b.Func.Config.Types 4665 _ = typ 4666 // match: (Neq64F x y) 4667 // cond: 4668 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4669 for { 4670 _ = v.Args[1] 4671 x := v.Args[0] 4672 y := v.Args[1] 4673 v.reset(OpS390XMOVDNE) 4674 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4675 v0.AuxInt = 0 4676 v.AddArg(v0) 4677 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4678 v1.AuxInt = 1 4679 v.AddArg(v1) 4680 v2 := b.NewValue0(v.Pos, OpS390XFCMP, types.TypeFlags) 4681 v2.AddArg(x) 4682 v2.AddArg(y) 4683 v.AddArg(v2) 4684 return true 4685 } 4686 } 4687 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 4688 b := v.Block 4689 _ = b 4690 typ := &b.Func.Config.Types 4691 _ = typ 4692 // match: (Neq8 x y) 4693 // cond: 4694 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4695 for { 4696 _ = v.Args[1] 4697 x := v.Args[0] 4698 y := v.Args[1] 4699 v.reset(OpS390XMOVDNE) 4700 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4701 v0.AuxInt = 0 4702 v.AddArg(v0) 4703 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4704 v1.AuxInt = 1 4705 v.AddArg(v1) 4706 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4707 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4708 v3.AddArg(x) 4709 v2.AddArg(v3) 4710 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4711 v4.AddArg(y) 4712 v2.AddArg(v4) 4713 v.AddArg(v2) 4714 return true 4715 } 4716 } 4717 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 4718 b := v.Block 4719 _ = b 4720 typ := &b.Func.Config.Types 4721 _ = typ 4722 // match: (NeqB x y) 4723 // cond: 4724 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4725 for { 4726 _ = v.Args[1] 4727 x := v.Args[0] 4728 y := v.Args[1] 4729 v.reset(OpS390XMOVDNE) 4730 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4731 v0.AuxInt = 0 4732 v.AddArg(v0) 4733 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4734 v1.AuxInt = 1 4735 v.AddArg(v1) 4736 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4737 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4738 v3.AddArg(x) 4739 v2.AddArg(v3) 4740 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 4741 v4.AddArg(y) 4742 v2.AddArg(v4) 4743 v.AddArg(v2) 4744 return true 4745 } 4746 } 4747 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 4748 b := v.Block 4749 _ = b 4750 typ := &b.Func.Config.Types 4751 _ = typ 4752 // match: (NeqPtr x y) 4753 // cond: 4754 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4755 for { 4756 _ = v.Args[1] 4757 x := v.Args[0] 4758 y := v.Args[1] 4759 v.reset(OpS390XMOVDNE) 4760 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4761 v0.AuxInt = 0 4762 v.AddArg(v0) 4763 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4764 v1.AuxInt = 1 4765 v.AddArg(v1) 4766 v2 := b.NewValue0(v.Pos, OpS390XCMP, types.TypeFlags) 4767 v2.AddArg(x) 4768 v2.AddArg(y) 4769 v.AddArg(v2) 4770 return true 4771 } 4772 } 4773 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 4774 // match: (NilCheck ptr mem) 4775 // cond: 4776 // result: (LoweredNilCheck ptr mem) 4777 for { 4778 _ = v.Args[1] 4779 ptr := v.Args[0] 4780 mem := v.Args[1] 4781 v.reset(OpS390XLoweredNilCheck) 4782 v.AddArg(ptr) 4783 v.AddArg(mem) 4784 return true 4785 } 4786 } 4787 func rewriteValueS390X_OpNot_0(v *Value) bool { 4788 // match: (Not x) 4789 // cond: 4790 // result: (XORWconst [1] x) 4791 for { 4792 x := v.Args[0] 4793 v.reset(OpS390XXORWconst) 4794 v.AuxInt = 1 4795 v.AddArg(x) 4796 return true 4797 } 4798 } 4799 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 4800 b := v.Block 4801 _ = b 4802 typ := &b.Func.Config.Types 4803 _ = typ 4804 // match: (OffPtr [off] ptr:(SP)) 4805 // cond: 4806 // result: (MOVDaddr [off] ptr) 4807 for { 4808 off := v.AuxInt 4809 ptr := v.Args[0] 4810 if ptr.Op != OpSP { 4811 break 4812 } 4813 v.reset(OpS390XMOVDaddr) 4814 v.AuxInt = off 4815 v.AddArg(ptr) 4816 return true 4817 } 4818 // match: (OffPtr [off] ptr) 4819 // cond: is32Bit(off) 4820 // result: (ADDconst [off] ptr) 4821 for { 4822 off := v.AuxInt 4823 ptr := v.Args[0] 4824 if !(is32Bit(off)) { 4825 break 4826 } 4827 v.reset(OpS390XADDconst) 4828 v.AuxInt = off 4829 v.AddArg(ptr) 4830 return true 4831 } 4832 // match: (OffPtr [off] ptr) 4833 // cond: 4834 // result: (ADD (MOVDconst [off]) ptr) 4835 for { 4836 off := v.AuxInt 4837 ptr := v.Args[0] 4838 v.reset(OpS390XADD) 4839 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 4840 v0.AuxInt = off 4841 v.AddArg(v0) 4842 v.AddArg(ptr) 4843 return true 4844 } 4845 } 4846 func rewriteValueS390X_OpOr16_0(v *Value) bool { 4847 // match: (Or16 x y) 4848 // cond: 4849 // result: (ORW x y) 4850 for { 4851 _ = v.Args[1] 4852 x := v.Args[0] 4853 y := v.Args[1] 4854 v.reset(OpS390XORW) 4855 v.AddArg(x) 4856 v.AddArg(y) 4857 return true 4858 } 4859 } 4860 func rewriteValueS390X_OpOr32_0(v *Value) bool { 4861 // match: (Or32 x y) 4862 // cond: 4863 // result: (ORW x y) 4864 for { 4865 _ = v.Args[1] 4866 x := v.Args[0] 4867 y := v.Args[1] 4868 v.reset(OpS390XORW) 4869 v.AddArg(x) 4870 v.AddArg(y) 4871 return true 4872 } 4873 } 4874 func rewriteValueS390X_OpOr64_0(v *Value) bool { 4875 // match: (Or64 x y) 4876 // cond: 4877 // result: (OR x y) 4878 for { 4879 _ = v.Args[1] 4880 x := v.Args[0] 4881 y := v.Args[1] 4882 v.reset(OpS390XOR) 4883 v.AddArg(x) 4884 v.AddArg(y) 4885 return true 4886 } 4887 } 4888 func rewriteValueS390X_OpOr8_0(v *Value) bool { 4889 // match: (Or8 x y) 4890 // cond: 4891 // result: (ORW x y) 4892 for { 4893 _ = v.Args[1] 4894 x := v.Args[0] 4895 y := v.Args[1] 4896 v.reset(OpS390XORW) 4897 v.AddArg(x) 4898 v.AddArg(y) 4899 return true 4900 } 4901 } 4902 func rewriteValueS390X_OpOrB_0(v *Value) bool { 4903 // match: (OrB x y) 4904 // cond: 4905 // result: (ORW x y) 4906 for { 4907 _ = v.Args[1] 4908 x := v.Args[0] 4909 y := v.Args[1] 4910 v.reset(OpS390XORW) 4911 v.AddArg(x) 4912 v.AddArg(y) 4913 return true 4914 } 4915 } 4916 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 4917 // match: (Round32F x) 4918 // cond: 4919 // result: (LoweredRound32F x) 4920 for { 4921 x := v.Args[0] 4922 v.reset(OpS390XLoweredRound32F) 4923 v.AddArg(x) 4924 return true 4925 } 4926 } 4927 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 4928 // match: (Round64F x) 4929 // cond: 4930 // result: (LoweredRound64F x) 4931 for { 4932 x := v.Args[0] 4933 v.reset(OpS390XLoweredRound64F) 4934 v.AddArg(x) 4935 return true 4936 } 4937 } 4938 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 4939 b := v.Block 4940 _ = b 4941 typ := &b.Func.Config.Types 4942 _ = typ 4943 // match: (Rsh16Ux16 <t> x y) 4944 // cond: 4945 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 4946 for { 4947 t := v.Type 4948 _ = v.Args[1] 4949 x := v.Args[0] 4950 y := v.Args[1] 4951 v.reset(OpS390XANDW) 4952 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4953 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4954 v1.AddArg(x) 4955 v0.AddArg(v1) 4956 v0.AddArg(y) 4957 v.AddArg(v0) 4958 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4959 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4960 v3.AuxInt = 15 4961 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4962 v4.AddArg(y) 4963 v3.AddArg(v4) 4964 v2.AddArg(v3) 4965 v.AddArg(v2) 4966 return true 4967 } 4968 } 4969 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 4970 b := v.Block 4971 _ = b 4972 typ := &b.Func.Config.Types 4973 _ = typ 4974 // match: (Rsh16Ux32 <t> x y) 4975 // cond: 4976 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 4977 for { 4978 t := v.Type 4979 _ = v.Args[1] 4980 x := v.Args[0] 4981 y := v.Args[1] 4982 v.reset(OpS390XANDW) 4983 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4984 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 4985 v1.AddArg(x) 4986 v0.AddArg(v1) 4987 v0.AddArg(y) 4988 v.AddArg(v0) 4989 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4990 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 4991 v3.AuxInt = 15 4992 v3.AddArg(y) 4993 v2.AddArg(v3) 4994 v.AddArg(v2) 4995 return true 4996 } 4997 } 4998 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 4999 b := v.Block 5000 _ = b 5001 typ := &b.Func.Config.Types 5002 _ = typ 5003 // match: (Rsh16Ux64 <t> x y) 5004 // cond: 5005 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 5006 for { 5007 t := v.Type 5008 _ = v.Args[1] 5009 x := v.Args[0] 5010 y := v.Args[1] 5011 v.reset(OpS390XANDW) 5012 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5013 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5014 v1.AddArg(x) 5015 v0.AddArg(v1) 5016 v0.AddArg(y) 5017 v.AddArg(v0) 5018 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5019 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5020 v3.AuxInt = 15 5021 v3.AddArg(y) 5022 v2.AddArg(v3) 5023 v.AddArg(v2) 5024 return true 5025 } 5026 } 5027 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 5028 b := v.Block 5029 _ = b 5030 typ := &b.Func.Config.Types 5031 _ = typ 5032 // match: (Rsh16Ux8 <t> x y) 5033 // cond: 5034 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 5035 for { 5036 t := v.Type 5037 _ = v.Args[1] 5038 x := v.Args[0] 5039 y := v.Args[1] 5040 v.reset(OpS390XANDW) 5041 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5042 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5043 v1.AddArg(x) 5044 v0.AddArg(v1) 5045 v0.AddArg(y) 5046 v.AddArg(v0) 5047 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5048 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5049 v3.AuxInt = 15 5050 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5051 v4.AddArg(y) 5052 v3.AddArg(v4) 5053 v2.AddArg(v3) 5054 v.AddArg(v2) 5055 return true 5056 } 5057 } 5058 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 5059 b := v.Block 5060 _ = b 5061 typ := &b.Func.Config.Types 5062 _ = typ 5063 // match: (Rsh16x16 <t> x y) 5064 // cond: 5065 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 5066 for { 5067 t := v.Type 5068 _ = v.Args[1] 5069 x := v.Args[0] 5070 y := v.Args[1] 5071 v.reset(OpS390XSRAW) 5072 v.Type = t 5073 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5074 v0.AddArg(x) 5075 v.AddArg(v0) 5076 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5077 v1.AddArg(y) 5078 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5079 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5080 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5081 v4.AuxInt = 15 5082 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5083 v5.AddArg(y) 5084 v4.AddArg(v5) 5085 v3.AddArg(v4) 5086 v2.AddArg(v3) 5087 v1.AddArg(v2) 5088 v.AddArg(v1) 5089 return true 5090 } 5091 } 5092 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 5093 b := v.Block 5094 _ = b 5095 typ := &b.Func.Config.Types 5096 _ = typ 5097 // match: (Rsh16x32 <t> x y) 5098 // cond: 5099 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 5100 for { 5101 t := v.Type 5102 _ = v.Args[1] 5103 x := v.Args[0] 5104 y := v.Args[1] 5105 v.reset(OpS390XSRAW) 5106 v.Type = t 5107 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5108 v0.AddArg(x) 5109 v.AddArg(v0) 5110 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5111 v1.AddArg(y) 5112 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5113 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5114 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5115 v4.AuxInt = 15 5116 v4.AddArg(y) 5117 v3.AddArg(v4) 5118 v2.AddArg(v3) 5119 v1.AddArg(v2) 5120 v.AddArg(v1) 5121 return true 5122 } 5123 } 5124 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 5125 b := v.Block 5126 _ = b 5127 typ := &b.Func.Config.Types 5128 _ = typ 5129 // match: (Rsh16x64 <t> x y) 5130 // cond: 5131 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 5132 for { 5133 t := v.Type 5134 _ = v.Args[1] 5135 x := v.Args[0] 5136 y := v.Args[1] 5137 v.reset(OpS390XSRAW) 5138 v.Type = t 5139 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5140 v0.AddArg(x) 5141 v.AddArg(v0) 5142 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5143 v1.AddArg(y) 5144 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5145 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5146 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5147 v4.AuxInt = 15 5148 v4.AddArg(y) 5149 v3.AddArg(v4) 5150 v2.AddArg(v3) 5151 v1.AddArg(v2) 5152 v.AddArg(v1) 5153 return true 5154 } 5155 } 5156 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 5157 b := v.Block 5158 _ = b 5159 typ := &b.Func.Config.Types 5160 _ = typ 5161 // match: (Rsh16x8 <t> x y) 5162 // cond: 5163 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 5164 for { 5165 t := v.Type 5166 _ = v.Args[1] 5167 x := v.Args[0] 5168 y := v.Args[1] 5169 v.reset(OpS390XSRAW) 5170 v.Type = t 5171 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) 5172 v0.AddArg(x) 5173 v.AddArg(v0) 5174 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5175 v1.AddArg(y) 5176 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5177 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5178 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5179 v4.AuxInt = 15 5180 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5181 v5.AddArg(y) 5182 v4.AddArg(v5) 5183 v3.AddArg(v4) 5184 v2.AddArg(v3) 5185 v1.AddArg(v2) 5186 v.AddArg(v1) 5187 return true 5188 } 5189 } 5190 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5191 b := v.Block 5192 _ = b 5193 typ := &b.Func.Config.Types 5194 _ = typ 5195 // match: (Rsh32Ux16 <t> x y) 5196 // cond: 5197 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5198 for { 5199 t := v.Type 5200 _ = v.Args[1] 5201 x := v.Args[0] 5202 y := v.Args[1] 5203 v.reset(OpS390XANDW) 5204 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5205 v0.AddArg(x) 5206 v0.AddArg(y) 5207 v.AddArg(v0) 5208 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5209 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5210 v2.AuxInt = 31 5211 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5212 v3.AddArg(y) 5213 v2.AddArg(v3) 5214 v1.AddArg(v2) 5215 v.AddArg(v1) 5216 return true 5217 } 5218 } 5219 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5220 b := v.Block 5221 _ = b 5222 // match: (Rsh32Ux32 <t> x y) 5223 // cond: 5224 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5225 for { 5226 t := v.Type 5227 _ = v.Args[1] 5228 x := v.Args[0] 5229 y := v.Args[1] 5230 v.reset(OpS390XANDW) 5231 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5232 v0.AddArg(x) 5233 v0.AddArg(y) 5234 v.AddArg(v0) 5235 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5236 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5237 v2.AuxInt = 31 5238 v2.AddArg(y) 5239 v1.AddArg(v2) 5240 v.AddArg(v1) 5241 return true 5242 } 5243 } 5244 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5245 b := v.Block 5246 _ = b 5247 // match: (Rsh32Ux64 <t> x y) 5248 // cond: 5249 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5250 for { 5251 t := v.Type 5252 _ = v.Args[1] 5253 x := v.Args[0] 5254 y := v.Args[1] 5255 v.reset(OpS390XANDW) 5256 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5257 v0.AddArg(x) 5258 v0.AddArg(y) 5259 v.AddArg(v0) 5260 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5261 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5262 v2.AuxInt = 31 5263 v2.AddArg(y) 5264 v1.AddArg(v2) 5265 v.AddArg(v1) 5266 return true 5267 } 5268 } 5269 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 5270 b := v.Block 5271 _ = b 5272 typ := &b.Func.Config.Types 5273 _ = typ 5274 // match: (Rsh32Ux8 <t> x y) 5275 // cond: 5276 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5277 for { 5278 t := v.Type 5279 _ = v.Args[1] 5280 x := v.Args[0] 5281 y := v.Args[1] 5282 v.reset(OpS390XANDW) 5283 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5284 v0.AddArg(x) 5285 v0.AddArg(y) 5286 v.AddArg(v0) 5287 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5288 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5289 v2.AuxInt = 31 5290 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5291 v3.AddArg(y) 5292 v2.AddArg(v3) 5293 v1.AddArg(v2) 5294 v.AddArg(v1) 5295 return true 5296 } 5297 } 5298 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 5299 b := v.Block 5300 _ = b 5301 typ := &b.Func.Config.Types 5302 _ = typ 5303 // match: (Rsh32x16 <t> x y) 5304 // cond: 5305 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5306 for { 5307 t := v.Type 5308 _ = v.Args[1] 5309 x := v.Args[0] 5310 y := v.Args[1] 5311 v.reset(OpS390XSRAW) 5312 v.Type = t 5313 v.AddArg(x) 5314 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5315 v0.AddArg(y) 5316 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5317 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5318 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5319 v3.AuxInt = 31 5320 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5321 v4.AddArg(y) 5322 v3.AddArg(v4) 5323 v2.AddArg(v3) 5324 v1.AddArg(v2) 5325 v0.AddArg(v1) 5326 v.AddArg(v0) 5327 return true 5328 } 5329 } 5330 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 5331 b := v.Block 5332 _ = b 5333 // match: (Rsh32x32 <t> x y) 5334 // cond: 5335 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5336 for { 5337 t := v.Type 5338 _ = v.Args[1] 5339 x := v.Args[0] 5340 y := v.Args[1] 5341 v.reset(OpS390XSRAW) 5342 v.Type = t 5343 v.AddArg(x) 5344 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5345 v0.AddArg(y) 5346 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5347 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5348 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5349 v3.AuxInt = 31 5350 v3.AddArg(y) 5351 v2.AddArg(v3) 5352 v1.AddArg(v2) 5353 v0.AddArg(v1) 5354 v.AddArg(v0) 5355 return true 5356 } 5357 } 5358 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 5359 b := v.Block 5360 _ = b 5361 // match: (Rsh32x64 <t> x y) 5362 // cond: 5363 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5364 for { 5365 t := v.Type 5366 _ = v.Args[1] 5367 x := v.Args[0] 5368 y := v.Args[1] 5369 v.reset(OpS390XSRAW) 5370 v.Type = t 5371 v.AddArg(x) 5372 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5373 v0.AddArg(y) 5374 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5375 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5376 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5377 v3.AuxInt = 31 5378 v3.AddArg(y) 5379 v2.AddArg(v3) 5380 v1.AddArg(v2) 5381 v0.AddArg(v1) 5382 v.AddArg(v0) 5383 return true 5384 } 5385 } 5386 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 5387 b := v.Block 5388 _ = b 5389 typ := &b.Func.Config.Types 5390 _ = typ 5391 // match: (Rsh32x8 <t> x y) 5392 // cond: 5393 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5394 for { 5395 t := v.Type 5396 _ = v.Args[1] 5397 x := v.Args[0] 5398 y := v.Args[1] 5399 v.reset(OpS390XSRAW) 5400 v.Type = t 5401 v.AddArg(x) 5402 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5403 v0.AddArg(y) 5404 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5405 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5406 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5407 v3.AuxInt = 31 5408 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5409 v4.AddArg(y) 5410 v3.AddArg(v4) 5411 v2.AddArg(v3) 5412 v1.AddArg(v2) 5413 v0.AddArg(v1) 5414 v.AddArg(v0) 5415 return true 5416 } 5417 } 5418 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 5419 b := v.Block 5420 _ = b 5421 typ := &b.Func.Config.Types 5422 _ = typ 5423 // match: (Rsh64Ux16 <t> x y) 5424 // cond: 5425 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5426 for { 5427 t := v.Type 5428 _ = v.Args[1] 5429 x := v.Args[0] 5430 y := v.Args[1] 5431 v.reset(OpS390XAND) 5432 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5433 v0.AddArg(x) 5434 v0.AddArg(y) 5435 v.AddArg(v0) 5436 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5437 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5438 v2.AuxInt = 63 5439 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5440 v3.AddArg(y) 5441 v2.AddArg(v3) 5442 v1.AddArg(v2) 5443 v.AddArg(v1) 5444 return true 5445 } 5446 } 5447 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 5448 b := v.Block 5449 _ = b 5450 // match: (Rsh64Ux32 <t> x y) 5451 // cond: 5452 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5453 for { 5454 t := v.Type 5455 _ = v.Args[1] 5456 x := v.Args[0] 5457 y := v.Args[1] 5458 v.reset(OpS390XAND) 5459 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5460 v0.AddArg(x) 5461 v0.AddArg(y) 5462 v.AddArg(v0) 5463 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5464 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5465 v2.AuxInt = 63 5466 v2.AddArg(y) 5467 v1.AddArg(v2) 5468 v.AddArg(v1) 5469 return true 5470 } 5471 } 5472 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 5473 b := v.Block 5474 _ = b 5475 // match: (Rsh64Ux64 <t> x y) 5476 // cond: 5477 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5478 for { 5479 t := v.Type 5480 _ = v.Args[1] 5481 x := v.Args[0] 5482 y := v.Args[1] 5483 v.reset(OpS390XAND) 5484 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5485 v0.AddArg(x) 5486 v0.AddArg(y) 5487 v.AddArg(v0) 5488 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5489 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5490 v2.AuxInt = 63 5491 v2.AddArg(y) 5492 v1.AddArg(v2) 5493 v.AddArg(v1) 5494 return true 5495 } 5496 } 5497 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 5498 b := v.Block 5499 _ = b 5500 typ := &b.Func.Config.Types 5501 _ = typ 5502 // match: (Rsh64Ux8 <t> x y) 5503 // cond: 5504 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5505 for { 5506 t := v.Type 5507 _ = v.Args[1] 5508 x := v.Args[0] 5509 y := v.Args[1] 5510 v.reset(OpS390XAND) 5511 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5512 v0.AddArg(x) 5513 v0.AddArg(y) 5514 v.AddArg(v0) 5515 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5516 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5517 v2.AuxInt = 63 5518 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5519 v3.AddArg(y) 5520 v2.AddArg(v3) 5521 v1.AddArg(v2) 5522 v.AddArg(v1) 5523 return true 5524 } 5525 } 5526 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 5527 b := v.Block 5528 _ = b 5529 typ := &b.Func.Config.Types 5530 _ = typ 5531 // match: (Rsh64x16 <t> x y) 5532 // cond: 5533 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5534 for { 5535 t := v.Type 5536 _ = v.Args[1] 5537 x := v.Args[0] 5538 y := v.Args[1] 5539 v.reset(OpS390XSRAD) 5540 v.Type = t 5541 v.AddArg(x) 5542 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5543 v0.AddArg(y) 5544 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5545 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5546 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5547 v3.AuxInt = 63 5548 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5549 v4.AddArg(y) 5550 v3.AddArg(v4) 5551 v2.AddArg(v3) 5552 v1.AddArg(v2) 5553 v0.AddArg(v1) 5554 v.AddArg(v0) 5555 return true 5556 } 5557 } 5558 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 5559 b := v.Block 5560 _ = b 5561 // match: (Rsh64x32 <t> x y) 5562 // cond: 5563 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5564 for { 5565 t := v.Type 5566 _ = v.Args[1] 5567 x := v.Args[0] 5568 y := v.Args[1] 5569 v.reset(OpS390XSRAD) 5570 v.Type = t 5571 v.AddArg(x) 5572 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5573 v0.AddArg(y) 5574 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5575 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5576 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5577 v3.AuxInt = 63 5578 v3.AddArg(y) 5579 v2.AddArg(v3) 5580 v1.AddArg(v2) 5581 v0.AddArg(v1) 5582 v.AddArg(v0) 5583 return true 5584 } 5585 } 5586 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 5587 b := v.Block 5588 _ = b 5589 // match: (Rsh64x64 <t> x y) 5590 // cond: 5591 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5592 for { 5593 t := v.Type 5594 _ = v.Args[1] 5595 x := v.Args[0] 5596 y := v.Args[1] 5597 v.reset(OpS390XSRAD) 5598 v.Type = t 5599 v.AddArg(x) 5600 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5601 v0.AddArg(y) 5602 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5603 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5604 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5605 v3.AuxInt = 63 5606 v3.AddArg(y) 5607 v2.AddArg(v3) 5608 v1.AddArg(v2) 5609 v0.AddArg(v1) 5610 v.AddArg(v0) 5611 return true 5612 } 5613 } 5614 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 5615 b := v.Block 5616 _ = b 5617 typ := &b.Func.Config.Types 5618 _ = typ 5619 // match: (Rsh64x8 <t> x y) 5620 // cond: 5621 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5622 for { 5623 t := v.Type 5624 _ = v.Args[1] 5625 x := v.Args[0] 5626 y := v.Args[1] 5627 v.reset(OpS390XSRAD) 5628 v.Type = t 5629 v.AddArg(x) 5630 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5631 v0.AddArg(y) 5632 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5633 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5634 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5635 v3.AuxInt = 63 5636 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5637 v4.AddArg(y) 5638 v3.AddArg(v4) 5639 v2.AddArg(v3) 5640 v1.AddArg(v2) 5641 v0.AddArg(v1) 5642 v.AddArg(v0) 5643 return true 5644 } 5645 } 5646 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 5647 b := v.Block 5648 _ = b 5649 typ := &b.Func.Config.Types 5650 _ = typ 5651 // match: (Rsh8Ux16 <t> x y) 5652 // cond: 5653 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5654 for { 5655 t := v.Type 5656 _ = v.Args[1] 5657 x := v.Args[0] 5658 y := v.Args[1] 5659 v.reset(OpS390XANDW) 5660 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5661 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5662 v1.AddArg(x) 5663 v0.AddArg(v1) 5664 v0.AddArg(y) 5665 v.AddArg(v0) 5666 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5667 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5668 v3.AuxInt = 7 5669 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5670 v4.AddArg(y) 5671 v3.AddArg(v4) 5672 v2.AddArg(v3) 5673 v.AddArg(v2) 5674 return true 5675 } 5676 } 5677 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 5678 b := v.Block 5679 _ = b 5680 typ := &b.Func.Config.Types 5681 _ = typ 5682 // match: (Rsh8Ux32 <t> x y) 5683 // cond: 5684 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5685 for { 5686 t := v.Type 5687 _ = v.Args[1] 5688 x := v.Args[0] 5689 y := v.Args[1] 5690 v.reset(OpS390XANDW) 5691 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5692 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5693 v1.AddArg(x) 5694 v0.AddArg(v1) 5695 v0.AddArg(y) 5696 v.AddArg(v0) 5697 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5698 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5699 v3.AuxInt = 7 5700 v3.AddArg(y) 5701 v2.AddArg(v3) 5702 v.AddArg(v2) 5703 return true 5704 } 5705 } 5706 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 5707 b := v.Block 5708 _ = b 5709 typ := &b.Func.Config.Types 5710 _ = typ 5711 // match: (Rsh8Ux64 <t> x y) 5712 // cond: 5713 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5714 for { 5715 t := v.Type 5716 _ = v.Args[1] 5717 x := v.Args[0] 5718 y := v.Args[1] 5719 v.reset(OpS390XANDW) 5720 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5721 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5722 v1.AddArg(x) 5723 v0.AddArg(v1) 5724 v0.AddArg(y) 5725 v.AddArg(v0) 5726 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5727 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5728 v3.AuxInt = 7 5729 v3.AddArg(y) 5730 v2.AddArg(v3) 5731 v.AddArg(v2) 5732 return true 5733 } 5734 } 5735 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 5736 b := v.Block 5737 _ = b 5738 typ := &b.Func.Config.Types 5739 _ = typ 5740 // match: (Rsh8Ux8 <t> x y) 5741 // cond: 5742 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5743 for { 5744 t := v.Type 5745 _ = v.Args[1] 5746 x := v.Args[0] 5747 y := v.Args[1] 5748 v.reset(OpS390XANDW) 5749 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5750 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5751 v1.AddArg(x) 5752 v0.AddArg(v1) 5753 v0.AddArg(y) 5754 v.AddArg(v0) 5755 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5756 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5757 v3.AuxInt = 7 5758 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5759 v4.AddArg(y) 5760 v3.AddArg(v4) 5761 v2.AddArg(v3) 5762 v.AddArg(v2) 5763 return true 5764 } 5765 } 5766 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 5767 b := v.Block 5768 _ = b 5769 typ := &b.Func.Config.Types 5770 _ = typ 5771 // match: (Rsh8x16 <t> x y) 5772 // cond: 5773 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5774 for { 5775 t := v.Type 5776 _ = v.Args[1] 5777 x := v.Args[0] 5778 y := v.Args[1] 5779 v.reset(OpS390XSRAW) 5780 v.Type = t 5781 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5782 v0.AddArg(x) 5783 v.AddArg(v0) 5784 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5785 v1.AddArg(y) 5786 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5787 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5788 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5789 v4.AuxInt = 7 5790 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 5791 v5.AddArg(y) 5792 v4.AddArg(v5) 5793 v3.AddArg(v4) 5794 v2.AddArg(v3) 5795 v1.AddArg(v2) 5796 v.AddArg(v1) 5797 return true 5798 } 5799 } 5800 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 5801 b := v.Block 5802 _ = b 5803 typ := &b.Func.Config.Types 5804 _ = typ 5805 // match: (Rsh8x32 <t> x y) 5806 // cond: 5807 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5808 for { 5809 t := v.Type 5810 _ = v.Args[1] 5811 x := v.Args[0] 5812 y := v.Args[1] 5813 v.reset(OpS390XSRAW) 5814 v.Type = t 5815 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5816 v0.AddArg(x) 5817 v.AddArg(v0) 5818 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5819 v1.AddArg(y) 5820 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5821 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5822 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5823 v4.AuxInt = 7 5824 v4.AddArg(y) 5825 v3.AddArg(v4) 5826 v2.AddArg(v3) 5827 v1.AddArg(v2) 5828 v.AddArg(v1) 5829 return true 5830 } 5831 } 5832 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 5833 b := v.Block 5834 _ = b 5835 typ := &b.Func.Config.Types 5836 _ = typ 5837 // match: (Rsh8x64 <t> x y) 5838 // cond: 5839 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5840 for { 5841 t := v.Type 5842 _ = v.Args[1] 5843 x := v.Args[0] 5844 y := v.Args[1] 5845 v.reset(OpS390XSRAW) 5846 v.Type = t 5847 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5848 v0.AddArg(x) 5849 v.AddArg(v0) 5850 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5851 v1.AddArg(y) 5852 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5853 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5854 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 5855 v4.AuxInt = 7 5856 v4.AddArg(y) 5857 v3.AddArg(v4) 5858 v2.AddArg(v3) 5859 v1.AddArg(v2) 5860 v.AddArg(v1) 5861 return true 5862 } 5863 } 5864 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 5865 b := v.Block 5866 _ = b 5867 typ := &b.Func.Config.Types 5868 _ = typ 5869 // match: (Rsh8x8 <t> x y) 5870 // cond: 5871 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5872 for { 5873 t := v.Type 5874 _ = v.Args[1] 5875 x := v.Args[0] 5876 y := v.Args[1] 5877 v.reset(OpS390XSRAW) 5878 v.Type = t 5879 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) 5880 v0.AddArg(x) 5881 v.AddArg(v0) 5882 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5883 v1.AddArg(y) 5884 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5885 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5886 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 5887 v4.AuxInt = 7 5888 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) 5889 v5.AddArg(y) 5890 v4.AddArg(v5) 5891 v3.AddArg(v4) 5892 v2.AddArg(v3) 5893 v1.AddArg(v2) 5894 v.AddArg(v1) 5895 return true 5896 } 5897 } 5898 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 5899 // match: (ADD x (MOVDconst [c])) 5900 // cond: is32Bit(c) 5901 // result: (ADDconst [c] x) 5902 for { 5903 _ = v.Args[1] 5904 x := v.Args[0] 5905 v_1 := v.Args[1] 5906 if v_1.Op != OpS390XMOVDconst { 5907 break 5908 } 5909 c := v_1.AuxInt 5910 if !(is32Bit(c)) { 5911 break 5912 } 5913 v.reset(OpS390XADDconst) 5914 v.AuxInt = c 5915 v.AddArg(x) 5916 return true 5917 } 5918 // match: (ADD (MOVDconst [c]) x) 5919 // cond: is32Bit(c) 5920 // result: (ADDconst [c] x) 5921 for { 5922 _ = v.Args[1] 5923 v_0 := v.Args[0] 5924 if v_0.Op != OpS390XMOVDconst { 5925 break 5926 } 5927 c := v_0.AuxInt 5928 x := v.Args[1] 5929 if !(is32Bit(c)) { 5930 break 5931 } 5932 v.reset(OpS390XADDconst) 5933 v.AuxInt = c 5934 v.AddArg(x) 5935 return true 5936 } 5937 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 5938 // cond: d == 64-c 5939 // result: (RLLGconst [c] x) 5940 for { 5941 _ = v.Args[1] 5942 v_0 := v.Args[0] 5943 if v_0.Op != OpS390XSLDconst { 5944 break 5945 } 5946 c := v_0.AuxInt 5947 x := v_0.Args[0] 5948 v_1 := v.Args[1] 5949 if v_1.Op != OpS390XSRDconst { 5950 break 5951 } 5952 d := v_1.AuxInt 5953 if x != v_1.Args[0] { 5954 break 5955 } 5956 if !(d == 64-c) { 5957 break 5958 } 5959 v.reset(OpS390XRLLGconst) 5960 v.AuxInt = c 5961 v.AddArg(x) 5962 return true 5963 } 5964 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 5965 // cond: d == 64-c 5966 // result: (RLLGconst [c] x) 5967 for { 5968 _ = v.Args[1] 5969 v_0 := v.Args[0] 5970 if v_0.Op != OpS390XSRDconst { 5971 break 5972 } 5973 d := v_0.AuxInt 5974 x := v_0.Args[0] 5975 v_1 := v.Args[1] 5976 if v_1.Op != OpS390XSLDconst { 5977 break 5978 } 5979 c := v_1.AuxInt 5980 if x != v_1.Args[0] { 5981 break 5982 } 5983 if !(d == 64-c) { 5984 break 5985 } 5986 v.reset(OpS390XRLLGconst) 5987 v.AuxInt = c 5988 v.AddArg(x) 5989 return true 5990 } 5991 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 5992 // cond: ptr.Op != OpSB && idx.Op != OpSB 5993 // result: (MOVDaddridx [c] {s} ptr idx) 5994 for { 5995 _ = v.Args[1] 5996 idx := v.Args[0] 5997 v_1 := v.Args[1] 5998 if v_1.Op != OpS390XMOVDaddr { 5999 break 6000 } 6001 c := v_1.AuxInt 6002 s := v_1.Aux 6003 ptr := v_1.Args[0] 6004 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6005 break 6006 } 6007 v.reset(OpS390XMOVDaddridx) 6008 v.AuxInt = c 6009 v.Aux = s 6010 v.AddArg(ptr) 6011 v.AddArg(idx) 6012 return true 6013 } 6014 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 6015 // cond: ptr.Op != OpSB && idx.Op != OpSB 6016 // result: (MOVDaddridx [c] {s} ptr idx) 6017 for { 6018 _ = v.Args[1] 6019 v_0 := v.Args[0] 6020 if v_0.Op != OpS390XMOVDaddr { 6021 break 6022 } 6023 c := v_0.AuxInt 6024 s := v_0.Aux 6025 ptr := v_0.Args[0] 6026 idx := v.Args[1] 6027 if !(ptr.Op != OpSB && idx.Op != OpSB) { 6028 break 6029 } 6030 v.reset(OpS390XMOVDaddridx) 6031 v.AuxInt = c 6032 v.Aux = s 6033 v.AddArg(ptr) 6034 v.AddArg(idx) 6035 return true 6036 } 6037 // match: (ADD x (NEG y)) 6038 // cond: 6039 // result: (SUB x y) 6040 for { 6041 _ = v.Args[1] 6042 x := v.Args[0] 6043 v_1 := v.Args[1] 6044 if v_1.Op != OpS390XNEG { 6045 break 6046 } 6047 y := v_1.Args[0] 6048 v.reset(OpS390XSUB) 6049 v.AddArg(x) 6050 v.AddArg(y) 6051 return true 6052 } 6053 // match: (ADD (NEG y) x) 6054 // cond: 6055 // result: (SUB x y) 6056 for { 6057 _ = v.Args[1] 6058 v_0 := v.Args[0] 6059 if v_0.Op != OpS390XNEG { 6060 break 6061 } 6062 y := v_0.Args[0] 6063 x := v.Args[1] 6064 v.reset(OpS390XSUB) 6065 v.AddArg(x) 6066 v.AddArg(y) 6067 return true 6068 } 6069 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6070 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6071 // result: (ADDload <t> [off] {sym} x ptr mem) 6072 for { 6073 t := v.Type 6074 _ = v.Args[1] 6075 x := v.Args[0] 6076 g := v.Args[1] 6077 if g.Op != OpS390XMOVDload { 6078 break 6079 } 6080 off := g.AuxInt 6081 sym := g.Aux 6082 _ = g.Args[1] 6083 ptr := g.Args[0] 6084 mem := g.Args[1] 6085 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6086 break 6087 } 6088 v.reset(OpS390XADDload) 6089 v.Type = t 6090 v.AuxInt = off 6091 v.Aux = sym 6092 v.AddArg(x) 6093 v.AddArg(ptr) 6094 v.AddArg(mem) 6095 return true 6096 } 6097 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6098 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6099 // result: (ADDload <t> [off] {sym} x ptr mem) 6100 for { 6101 t := v.Type 6102 _ = v.Args[1] 6103 g := v.Args[0] 6104 if g.Op != OpS390XMOVDload { 6105 break 6106 } 6107 off := g.AuxInt 6108 sym := g.Aux 6109 _ = g.Args[1] 6110 ptr := g.Args[0] 6111 mem := g.Args[1] 6112 x := v.Args[1] 6113 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6114 break 6115 } 6116 v.reset(OpS390XADDload) 6117 v.Type = t 6118 v.AuxInt = off 6119 v.Aux = sym 6120 v.AddArg(x) 6121 v.AddArg(ptr) 6122 v.AddArg(mem) 6123 return true 6124 } 6125 return false 6126 } 6127 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 6128 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 6129 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6130 // result: (ADDload <t> [off] {sym} x ptr mem) 6131 for { 6132 t := v.Type 6133 _ = v.Args[1] 6134 g := v.Args[0] 6135 if g.Op != OpS390XMOVDload { 6136 break 6137 } 6138 off := g.AuxInt 6139 sym := g.Aux 6140 _ = g.Args[1] 6141 ptr := g.Args[0] 6142 mem := g.Args[1] 6143 x := v.Args[1] 6144 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6145 break 6146 } 6147 v.reset(OpS390XADDload) 6148 v.Type = t 6149 v.AuxInt = off 6150 v.Aux = sym 6151 v.AddArg(x) 6152 v.AddArg(ptr) 6153 v.AddArg(mem) 6154 return true 6155 } 6156 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 6157 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6158 // result: (ADDload <t> [off] {sym} x ptr mem) 6159 for { 6160 t := v.Type 6161 _ = v.Args[1] 6162 x := v.Args[0] 6163 g := v.Args[1] 6164 if g.Op != OpS390XMOVDload { 6165 break 6166 } 6167 off := g.AuxInt 6168 sym := g.Aux 6169 _ = g.Args[1] 6170 ptr := g.Args[0] 6171 mem := g.Args[1] 6172 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6173 break 6174 } 6175 v.reset(OpS390XADDload) 6176 v.Type = t 6177 v.AuxInt = off 6178 v.Aux = sym 6179 v.AddArg(x) 6180 v.AddArg(ptr) 6181 v.AddArg(mem) 6182 return true 6183 } 6184 return false 6185 } 6186 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 6187 // match: (ADDW x (MOVDconst [c])) 6188 // cond: 6189 // result: (ADDWconst [c] x) 6190 for { 6191 _ = v.Args[1] 6192 x := v.Args[0] 6193 v_1 := v.Args[1] 6194 if v_1.Op != OpS390XMOVDconst { 6195 break 6196 } 6197 c := v_1.AuxInt 6198 v.reset(OpS390XADDWconst) 6199 v.AuxInt = c 6200 v.AddArg(x) 6201 return true 6202 } 6203 // match: (ADDW (MOVDconst [c]) x) 6204 // cond: 6205 // result: (ADDWconst [c] x) 6206 for { 6207 _ = v.Args[1] 6208 v_0 := v.Args[0] 6209 if v_0.Op != OpS390XMOVDconst { 6210 break 6211 } 6212 c := v_0.AuxInt 6213 x := v.Args[1] 6214 v.reset(OpS390XADDWconst) 6215 v.AuxInt = c 6216 v.AddArg(x) 6217 return true 6218 } 6219 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 6220 // cond: d == 32-c 6221 // result: (RLLconst [c] x) 6222 for { 6223 _ = v.Args[1] 6224 v_0 := v.Args[0] 6225 if v_0.Op != OpS390XSLWconst { 6226 break 6227 } 6228 c := v_0.AuxInt 6229 x := v_0.Args[0] 6230 v_1 := v.Args[1] 6231 if v_1.Op != OpS390XSRWconst { 6232 break 6233 } 6234 d := v_1.AuxInt 6235 if x != v_1.Args[0] { 6236 break 6237 } 6238 if !(d == 32-c) { 6239 break 6240 } 6241 v.reset(OpS390XRLLconst) 6242 v.AuxInt = c 6243 v.AddArg(x) 6244 return true 6245 } 6246 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6247 // cond: d == 32-c 6248 // result: (RLLconst [c] x) 6249 for { 6250 _ = v.Args[1] 6251 v_0 := v.Args[0] 6252 if v_0.Op != OpS390XSRWconst { 6253 break 6254 } 6255 d := v_0.AuxInt 6256 x := v_0.Args[0] 6257 v_1 := v.Args[1] 6258 if v_1.Op != OpS390XSLWconst { 6259 break 6260 } 6261 c := v_1.AuxInt 6262 if x != v_1.Args[0] { 6263 break 6264 } 6265 if !(d == 32-c) { 6266 break 6267 } 6268 v.reset(OpS390XRLLconst) 6269 v.AuxInt = c 6270 v.AddArg(x) 6271 return true 6272 } 6273 // match: (ADDW x (NEGW y)) 6274 // cond: 6275 // result: (SUBW x y) 6276 for { 6277 _ = v.Args[1] 6278 x := v.Args[0] 6279 v_1 := v.Args[1] 6280 if v_1.Op != OpS390XNEGW { 6281 break 6282 } 6283 y := v_1.Args[0] 6284 v.reset(OpS390XSUBW) 6285 v.AddArg(x) 6286 v.AddArg(y) 6287 return true 6288 } 6289 // match: (ADDW (NEGW y) x) 6290 // cond: 6291 // result: (SUBW x y) 6292 for { 6293 _ = v.Args[1] 6294 v_0 := v.Args[0] 6295 if v_0.Op != OpS390XNEGW { 6296 break 6297 } 6298 y := v_0.Args[0] 6299 x := v.Args[1] 6300 v.reset(OpS390XSUBW) 6301 v.AddArg(x) 6302 v.AddArg(y) 6303 return true 6304 } 6305 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6306 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6307 // result: (ADDWload <t> [off] {sym} x ptr mem) 6308 for { 6309 t := v.Type 6310 _ = v.Args[1] 6311 x := v.Args[0] 6312 g := v.Args[1] 6313 if g.Op != OpS390XMOVWload { 6314 break 6315 } 6316 off := g.AuxInt 6317 sym := g.Aux 6318 _ = g.Args[1] 6319 ptr := g.Args[0] 6320 mem := g.Args[1] 6321 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6322 break 6323 } 6324 v.reset(OpS390XADDWload) 6325 v.Type = t 6326 v.AuxInt = off 6327 v.Aux = sym 6328 v.AddArg(x) 6329 v.AddArg(ptr) 6330 v.AddArg(mem) 6331 return true 6332 } 6333 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6334 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6335 // result: (ADDWload <t> [off] {sym} x ptr mem) 6336 for { 6337 t := v.Type 6338 _ = v.Args[1] 6339 g := v.Args[0] 6340 if g.Op != OpS390XMOVWload { 6341 break 6342 } 6343 off := g.AuxInt 6344 sym := g.Aux 6345 _ = g.Args[1] 6346 ptr := g.Args[0] 6347 mem := g.Args[1] 6348 x := v.Args[1] 6349 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6350 break 6351 } 6352 v.reset(OpS390XADDWload) 6353 v.Type = t 6354 v.AuxInt = off 6355 v.Aux = sym 6356 v.AddArg(x) 6357 v.AddArg(ptr) 6358 v.AddArg(mem) 6359 return true 6360 } 6361 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6362 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6363 // result: (ADDWload <t> [off] {sym} x ptr mem) 6364 for { 6365 t := v.Type 6366 _ = v.Args[1] 6367 g := v.Args[0] 6368 if g.Op != OpS390XMOVWload { 6369 break 6370 } 6371 off := g.AuxInt 6372 sym := g.Aux 6373 _ = g.Args[1] 6374 ptr := g.Args[0] 6375 mem := g.Args[1] 6376 x := v.Args[1] 6377 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6378 break 6379 } 6380 v.reset(OpS390XADDWload) 6381 v.Type = t 6382 v.AuxInt = off 6383 v.Aux = sym 6384 v.AddArg(x) 6385 v.AddArg(ptr) 6386 v.AddArg(mem) 6387 return true 6388 } 6389 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6390 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6391 // result: (ADDWload <t> [off] {sym} x ptr mem) 6392 for { 6393 t := v.Type 6394 _ = v.Args[1] 6395 x := v.Args[0] 6396 g := v.Args[1] 6397 if g.Op != OpS390XMOVWload { 6398 break 6399 } 6400 off := g.AuxInt 6401 sym := g.Aux 6402 _ = g.Args[1] 6403 ptr := g.Args[0] 6404 mem := g.Args[1] 6405 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6406 break 6407 } 6408 v.reset(OpS390XADDWload) 6409 v.Type = t 6410 v.AuxInt = off 6411 v.Aux = sym 6412 v.AddArg(x) 6413 v.AddArg(ptr) 6414 v.AddArg(mem) 6415 return true 6416 } 6417 return false 6418 } 6419 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 6420 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6421 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6422 // result: (ADDWload <t> [off] {sym} x ptr mem) 6423 for { 6424 t := v.Type 6425 _ = v.Args[1] 6426 x := v.Args[0] 6427 g := v.Args[1] 6428 if g.Op != OpS390XMOVWZload { 6429 break 6430 } 6431 off := g.AuxInt 6432 sym := g.Aux 6433 _ = g.Args[1] 6434 ptr := g.Args[0] 6435 mem := g.Args[1] 6436 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6437 break 6438 } 6439 v.reset(OpS390XADDWload) 6440 v.Type = t 6441 v.AuxInt = off 6442 v.Aux = sym 6443 v.AddArg(x) 6444 v.AddArg(ptr) 6445 v.AddArg(mem) 6446 return true 6447 } 6448 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6449 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6450 // result: (ADDWload <t> [off] {sym} x ptr mem) 6451 for { 6452 t := v.Type 6453 _ = v.Args[1] 6454 g := v.Args[0] 6455 if g.Op != OpS390XMOVWZload { 6456 break 6457 } 6458 off := g.AuxInt 6459 sym := g.Aux 6460 _ = g.Args[1] 6461 ptr := g.Args[0] 6462 mem := g.Args[1] 6463 x := v.Args[1] 6464 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6465 break 6466 } 6467 v.reset(OpS390XADDWload) 6468 v.Type = t 6469 v.AuxInt = off 6470 v.Aux = sym 6471 v.AddArg(x) 6472 v.AddArg(ptr) 6473 v.AddArg(mem) 6474 return true 6475 } 6476 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6477 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6478 // result: (ADDWload <t> [off] {sym} x ptr mem) 6479 for { 6480 t := v.Type 6481 _ = v.Args[1] 6482 g := v.Args[0] 6483 if g.Op != OpS390XMOVWZload { 6484 break 6485 } 6486 off := g.AuxInt 6487 sym := g.Aux 6488 _ = g.Args[1] 6489 ptr := g.Args[0] 6490 mem := g.Args[1] 6491 x := v.Args[1] 6492 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6493 break 6494 } 6495 v.reset(OpS390XADDWload) 6496 v.Type = t 6497 v.AuxInt = off 6498 v.Aux = sym 6499 v.AddArg(x) 6500 v.AddArg(ptr) 6501 v.AddArg(mem) 6502 return true 6503 } 6504 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6505 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6506 // result: (ADDWload <t> [off] {sym} x ptr mem) 6507 for { 6508 t := v.Type 6509 _ = v.Args[1] 6510 x := v.Args[0] 6511 g := v.Args[1] 6512 if g.Op != OpS390XMOVWZload { 6513 break 6514 } 6515 off := g.AuxInt 6516 sym := g.Aux 6517 _ = g.Args[1] 6518 ptr := g.Args[0] 6519 mem := g.Args[1] 6520 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6521 break 6522 } 6523 v.reset(OpS390XADDWload) 6524 v.Type = t 6525 v.AuxInt = off 6526 v.Aux = sym 6527 v.AddArg(x) 6528 v.AddArg(ptr) 6529 v.AddArg(mem) 6530 return true 6531 } 6532 return false 6533 } 6534 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 6535 // match: (ADDWconst [c] x) 6536 // cond: int32(c)==0 6537 // result: x 6538 for { 6539 c := v.AuxInt 6540 x := v.Args[0] 6541 if !(int32(c) == 0) { 6542 break 6543 } 6544 v.reset(OpCopy) 6545 v.Type = x.Type 6546 v.AddArg(x) 6547 return true 6548 } 6549 // match: (ADDWconst [c] (MOVDconst [d])) 6550 // cond: 6551 // result: (MOVDconst [int64(int32(c+d))]) 6552 for { 6553 c := v.AuxInt 6554 v_0 := v.Args[0] 6555 if v_0.Op != OpS390XMOVDconst { 6556 break 6557 } 6558 d := v_0.AuxInt 6559 v.reset(OpS390XMOVDconst) 6560 v.AuxInt = int64(int32(c + d)) 6561 return true 6562 } 6563 // match: (ADDWconst [c] (ADDWconst [d] x)) 6564 // cond: 6565 // result: (ADDWconst [int64(int32(c+d))] x) 6566 for { 6567 c := v.AuxInt 6568 v_0 := v.Args[0] 6569 if v_0.Op != OpS390XADDWconst { 6570 break 6571 } 6572 d := v_0.AuxInt 6573 x := v_0.Args[0] 6574 v.reset(OpS390XADDWconst) 6575 v.AuxInt = int64(int32(c + d)) 6576 v.AddArg(x) 6577 return true 6578 } 6579 return false 6580 } 6581 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 6582 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6583 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6584 // result: (MOVDaddr [c+d] {s} x) 6585 for { 6586 c := v.AuxInt 6587 v_0 := v.Args[0] 6588 if v_0.Op != OpS390XMOVDaddr { 6589 break 6590 } 6591 d := v_0.AuxInt 6592 s := v_0.Aux 6593 x := v_0.Args[0] 6594 if x.Op != OpSB { 6595 break 6596 } 6597 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6598 break 6599 } 6600 v.reset(OpS390XMOVDaddr) 6601 v.AuxInt = c + d 6602 v.Aux = s 6603 v.AddArg(x) 6604 return true 6605 } 6606 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6607 // cond: x.Op != OpSB && is20Bit(c+d) 6608 // result: (MOVDaddr [c+d] {s} x) 6609 for { 6610 c := v.AuxInt 6611 v_0 := v.Args[0] 6612 if v_0.Op != OpS390XMOVDaddr { 6613 break 6614 } 6615 d := v_0.AuxInt 6616 s := v_0.Aux 6617 x := v_0.Args[0] 6618 if !(x.Op != OpSB && is20Bit(c+d)) { 6619 break 6620 } 6621 v.reset(OpS390XMOVDaddr) 6622 v.AuxInt = c + d 6623 v.Aux = s 6624 v.AddArg(x) 6625 return true 6626 } 6627 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6628 // cond: is20Bit(c+d) 6629 // result: (MOVDaddridx [c+d] {s} x y) 6630 for { 6631 c := v.AuxInt 6632 v_0 := v.Args[0] 6633 if v_0.Op != OpS390XMOVDaddridx { 6634 break 6635 } 6636 d := v_0.AuxInt 6637 s := v_0.Aux 6638 _ = v_0.Args[1] 6639 x := v_0.Args[0] 6640 y := v_0.Args[1] 6641 if !(is20Bit(c + d)) { 6642 break 6643 } 6644 v.reset(OpS390XMOVDaddridx) 6645 v.AuxInt = c + d 6646 v.Aux = s 6647 v.AddArg(x) 6648 v.AddArg(y) 6649 return true 6650 } 6651 // match: (ADDconst [0] x) 6652 // cond: 6653 // result: x 6654 for { 6655 if v.AuxInt != 0 { 6656 break 6657 } 6658 x := v.Args[0] 6659 v.reset(OpCopy) 6660 v.Type = x.Type 6661 v.AddArg(x) 6662 return true 6663 } 6664 // match: (ADDconst [c] (MOVDconst [d])) 6665 // cond: 6666 // result: (MOVDconst [c+d]) 6667 for { 6668 c := v.AuxInt 6669 v_0 := v.Args[0] 6670 if v_0.Op != OpS390XMOVDconst { 6671 break 6672 } 6673 d := v_0.AuxInt 6674 v.reset(OpS390XMOVDconst) 6675 v.AuxInt = c + d 6676 return true 6677 } 6678 // match: (ADDconst [c] (ADDconst [d] x)) 6679 // cond: is32Bit(c+d) 6680 // result: (ADDconst [c+d] x) 6681 for { 6682 c := v.AuxInt 6683 v_0 := v.Args[0] 6684 if v_0.Op != OpS390XADDconst { 6685 break 6686 } 6687 d := v_0.AuxInt 6688 x := v_0.Args[0] 6689 if !(is32Bit(c + d)) { 6690 break 6691 } 6692 v.reset(OpS390XADDconst) 6693 v.AuxInt = c + d 6694 v.AddArg(x) 6695 return true 6696 } 6697 return false 6698 } 6699 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 6700 // match: (AND x (MOVDconst [c])) 6701 // cond: is32Bit(c) && c < 0 6702 // result: (ANDconst [c] x) 6703 for { 6704 _ = v.Args[1] 6705 x := v.Args[0] 6706 v_1 := v.Args[1] 6707 if v_1.Op != OpS390XMOVDconst { 6708 break 6709 } 6710 c := v_1.AuxInt 6711 if !(is32Bit(c) && c < 0) { 6712 break 6713 } 6714 v.reset(OpS390XANDconst) 6715 v.AuxInt = c 6716 v.AddArg(x) 6717 return true 6718 } 6719 // match: (AND (MOVDconst [c]) x) 6720 // cond: is32Bit(c) && c < 0 6721 // result: (ANDconst [c] x) 6722 for { 6723 _ = v.Args[1] 6724 v_0 := v.Args[0] 6725 if v_0.Op != OpS390XMOVDconst { 6726 break 6727 } 6728 c := v_0.AuxInt 6729 x := v.Args[1] 6730 if !(is32Bit(c) && c < 0) { 6731 break 6732 } 6733 v.reset(OpS390XANDconst) 6734 v.AuxInt = c 6735 v.AddArg(x) 6736 return true 6737 } 6738 // match: (AND x (MOVDconst [0xFF])) 6739 // cond: 6740 // result: (MOVBZreg x) 6741 for { 6742 _ = v.Args[1] 6743 x := v.Args[0] 6744 v_1 := v.Args[1] 6745 if v_1.Op != OpS390XMOVDconst { 6746 break 6747 } 6748 if v_1.AuxInt != 0xFF { 6749 break 6750 } 6751 v.reset(OpS390XMOVBZreg) 6752 v.AddArg(x) 6753 return true 6754 } 6755 // match: (AND (MOVDconst [0xFF]) x) 6756 // cond: 6757 // result: (MOVBZreg x) 6758 for { 6759 _ = v.Args[1] 6760 v_0 := v.Args[0] 6761 if v_0.Op != OpS390XMOVDconst { 6762 break 6763 } 6764 if v_0.AuxInt != 0xFF { 6765 break 6766 } 6767 x := v.Args[1] 6768 v.reset(OpS390XMOVBZreg) 6769 v.AddArg(x) 6770 return true 6771 } 6772 // match: (AND x (MOVDconst [0xFFFF])) 6773 // cond: 6774 // result: (MOVHZreg x) 6775 for { 6776 _ = v.Args[1] 6777 x := v.Args[0] 6778 v_1 := v.Args[1] 6779 if v_1.Op != OpS390XMOVDconst { 6780 break 6781 } 6782 if v_1.AuxInt != 0xFFFF { 6783 break 6784 } 6785 v.reset(OpS390XMOVHZreg) 6786 v.AddArg(x) 6787 return true 6788 } 6789 // match: (AND (MOVDconst [0xFFFF]) x) 6790 // cond: 6791 // result: (MOVHZreg x) 6792 for { 6793 _ = v.Args[1] 6794 v_0 := v.Args[0] 6795 if v_0.Op != OpS390XMOVDconst { 6796 break 6797 } 6798 if v_0.AuxInt != 0xFFFF { 6799 break 6800 } 6801 x := v.Args[1] 6802 v.reset(OpS390XMOVHZreg) 6803 v.AddArg(x) 6804 return true 6805 } 6806 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6807 // cond: 6808 // result: (MOVWZreg x) 6809 for { 6810 _ = v.Args[1] 6811 x := v.Args[0] 6812 v_1 := v.Args[1] 6813 if v_1.Op != OpS390XMOVDconst { 6814 break 6815 } 6816 if v_1.AuxInt != 0xFFFFFFFF { 6817 break 6818 } 6819 v.reset(OpS390XMOVWZreg) 6820 v.AddArg(x) 6821 return true 6822 } 6823 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6824 // cond: 6825 // result: (MOVWZreg x) 6826 for { 6827 _ = v.Args[1] 6828 v_0 := v.Args[0] 6829 if v_0.Op != OpS390XMOVDconst { 6830 break 6831 } 6832 if v_0.AuxInt != 0xFFFFFFFF { 6833 break 6834 } 6835 x := v.Args[1] 6836 v.reset(OpS390XMOVWZreg) 6837 v.AddArg(x) 6838 return true 6839 } 6840 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6841 // cond: 6842 // result: (MOVDconst [c&d]) 6843 for { 6844 _ = v.Args[1] 6845 v_0 := v.Args[0] 6846 if v_0.Op != OpS390XMOVDconst { 6847 break 6848 } 6849 c := v_0.AuxInt 6850 v_1 := v.Args[1] 6851 if v_1.Op != OpS390XMOVDconst { 6852 break 6853 } 6854 d := v_1.AuxInt 6855 v.reset(OpS390XMOVDconst) 6856 v.AuxInt = c & d 6857 return true 6858 } 6859 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 6860 // cond: 6861 // result: (MOVDconst [c&d]) 6862 for { 6863 _ = v.Args[1] 6864 v_0 := v.Args[0] 6865 if v_0.Op != OpS390XMOVDconst { 6866 break 6867 } 6868 d := v_0.AuxInt 6869 v_1 := v.Args[1] 6870 if v_1.Op != OpS390XMOVDconst { 6871 break 6872 } 6873 c := v_1.AuxInt 6874 v.reset(OpS390XMOVDconst) 6875 v.AuxInt = c & d 6876 return true 6877 } 6878 return false 6879 } 6880 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 6881 // match: (AND x x) 6882 // cond: 6883 // result: x 6884 for { 6885 _ = v.Args[1] 6886 x := v.Args[0] 6887 if x != v.Args[1] { 6888 break 6889 } 6890 v.reset(OpCopy) 6891 v.Type = x.Type 6892 v.AddArg(x) 6893 return true 6894 } 6895 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6896 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6897 // result: (ANDload <t> [off] {sym} x ptr mem) 6898 for { 6899 t := v.Type 6900 _ = v.Args[1] 6901 x := v.Args[0] 6902 g := v.Args[1] 6903 if g.Op != OpS390XMOVDload { 6904 break 6905 } 6906 off := g.AuxInt 6907 sym := g.Aux 6908 _ = g.Args[1] 6909 ptr := g.Args[0] 6910 mem := g.Args[1] 6911 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6912 break 6913 } 6914 v.reset(OpS390XANDload) 6915 v.Type = t 6916 v.AuxInt = off 6917 v.Aux = sym 6918 v.AddArg(x) 6919 v.AddArg(ptr) 6920 v.AddArg(mem) 6921 return true 6922 } 6923 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6924 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6925 // result: (ANDload <t> [off] {sym} x ptr mem) 6926 for { 6927 t := v.Type 6928 _ = v.Args[1] 6929 g := v.Args[0] 6930 if g.Op != OpS390XMOVDload { 6931 break 6932 } 6933 off := g.AuxInt 6934 sym := g.Aux 6935 _ = g.Args[1] 6936 ptr := g.Args[0] 6937 mem := g.Args[1] 6938 x := v.Args[1] 6939 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6940 break 6941 } 6942 v.reset(OpS390XANDload) 6943 v.Type = t 6944 v.AuxInt = off 6945 v.Aux = sym 6946 v.AddArg(x) 6947 v.AddArg(ptr) 6948 v.AddArg(mem) 6949 return true 6950 } 6951 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6952 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6953 // result: (ANDload <t> [off] {sym} x ptr mem) 6954 for { 6955 t := v.Type 6956 _ = v.Args[1] 6957 g := v.Args[0] 6958 if g.Op != OpS390XMOVDload { 6959 break 6960 } 6961 off := g.AuxInt 6962 sym := g.Aux 6963 _ = g.Args[1] 6964 ptr := g.Args[0] 6965 mem := g.Args[1] 6966 x := v.Args[1] 6967 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6968 break 6969 } 6970 v.reset(OpS390XANDload) 6971 v.Type = t 6972 v.AuxInt = off 6973 v.Aux = sym 6974 v.AddArg(x) 6975 v.AddArg(ptr) 6976 v.AddArg(mem) 6977 return true 6978 } 6979 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6980 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6981 // result: (ANDload <t> [off] {sym} x ptr mem) 6982 for { 6983 t := v.Type 6984 _ = v.Args[1] 6985 x := v.Args[0] 6986 g := v.Args[1] 6987 if g.Op != OpS390XMOVDload { 6988 break 6989 } 6990 off := g.AuxInt 6991 sym := g.Aux 6992 _ = g.Args[1] 6993 ptr := g.Args[0] 6994 mem := g.Args[1] 6995 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6996 break 6997 } 6998 v.reset(OpS390XANDload) 6999 v.Type = t 7000 v.AuxInt = off 7001 v.Aux = sym 7002 v.AddArg(x) 7003 v.AddArg(ptr) 7004 v.AddArg(mem) 7005 return true 7006 } 7007 return false 7008 } 7009 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 7010 // match: (ANDW x (MOVDconst [c])) 7011 // cond: 7012 // result: (ANDWconst [c] x) 7013 for { 7014 _ = v.Args[1] 7015 x := v.Args[0] 7016 v_1 := v.Args[1] 7017 if v_1.Op != OpS390XMOVDconst { 7018 break 7019 } 7020 c := v_1.AuxInt 7021 v.reset(OpS390XANDWconst) 7022 v.AuxInt = c 7023 v.AddArg(x) 7024 return true 7025 } 7026 // match: (ANDW (MOVDconst [c]) x) 7027 // cond: 7028 // result: (ANDWconst [c] x) 7029 for { 7030 _ = v.Args[1] 7031 v_0 := v.Args[0] 7032 if v_0.Op != OpS390XMOVDconst { 7033 break 7034 } 7035 c := v_0.AuxInt 7036 x := v.Args[1] 7037 v.reset(OpS390XANDWconst) 7038 v.AuxInt = c 7039 v.AddArg(x) 7040 return true 7041 } 7042 // match: (ANDW x x) 7043 // cond: 7044 // result: x 7045 for { 7046 _ = v.Args[1] 7047 x := v.Args[0] 7048 if x != v.Args[1] { 7049 break 7050 } 7051 v.reset(OpCopy) 7052 v.Type = x.Type 7053 v.AddArg(x) 7054 return true 7055 } 7056 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7057 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7058 // result: (ANDWload <t> [off] {sym} x ptr mem) 7059 for { 7060 t := v.Type 7061 _ = v.Args[1] 7062 x := v.Args[0] 7063 g := v.Args[1] 7064 if g.Op != OpS390XMOVWload { 7065 break 7066 } 7067 off := g.AuxInt 7068 sym := g.Aux 7069 _ = g.Args[1] 7070 ptr := g.Args[0] 7071 mem := g.Args[1] 7072 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7073 break 7074 } 7075 v.reset(OpS390XANDWload) 7076 v.Type = t 7077 v.AuxInt = off 7078 v.Aux = sym 7079 v.AddArg(x) 7080 v.AddArg(ptr) 7081 v.AddArg(mem) 7082 return true 7083 } 7084 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7085 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7086 // result: (ANDWload <t> [off] {sym} x ptr mem) 7087 for { 7088 t := v.Type 7089 _ = v.Args[1] 7090 g := v.Args[0] 7091 if g.Op != OpS390XMOVWload { 7092 break 7093 } 7094 off := g.AuxInt 7095 sym := g.Aux 7096 _ = g.Args[1] 7097 ptr := g.Args[0] 7098 mem := g.Args[1] 7099 x := v.Args[1] 7100 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7101 break 7102 } 7103 v.reset(OpS390XANDWload) 7104 v.Type = t 7105 v.AuxInt = off 7106 v.Aux = sym 7107 v.AddArg(x) 7108 v.AddArg(ptr) 7109 v.AddArg(mem) 7110 return true 7111 } 7112 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 7113 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7114 // result: (ANDWload <t> [off] {sym} x ptr mem) 7115 for { 7116 t := v.Type 7117 _ = v.Args[1] 7118 g := v.Args[0] 7119 if g.Op != OpS390XMOVWload { 7120 break 7121 } 7122 off := g.AuxInt 7123 sym := g.Aux 7124 _ = g.Args[1] 7125 ptr := g.Args[0] 7126 mem := g.Args[1] 7127 x := v.Args[1] 7128 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7129 break 7130 } 7131 v.reset(OpS390XANDWload) 7132 v.Type = t 7133 v.AuxInt = off 7134 v.Aux = sym 7135 v.AddArg(x) 7136 v.AddArg(ptr) 7137 v.AddArg(mem) 7138 return true 7139 } 7140 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 7141 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7142 // result: (ANDWload <t> [off] {sym} x ptr mem) 7143 for { 7144 t := v.Type 7145 _ = v.Args[1] 7146 x := v.Args[0] 7147 g := v.Args[1] 7148 if g.Op != OpS390XMOVWload { 7149 break 7150 } 7151 off := g.AuxInt 7152 sym := g.Aux 7153 _ = g.Args[1] 7154 ptr := g.Args[0] 7155 mem := g.Args[1] 7156 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7157 break 7158 } 7159 v.reset(OpS390XANDWload) 7160 v.Type = t 7161 v.AuxInt = off 7162 v.Aux = sym 7163 v.AddArg(x) 7164 v.AddArg(ptr) 7165 v.AddArg(mem) 7166 return true 7167 } 7168 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7169 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7170 // result: (ANDWload <t> [off] {sym} x ptr mem) 7171 for { 7172 t := v.Type 7173 _ = v.Args[1] 7174 x := v.Args[0] 7175 g := v.Args[1] 7176 if g.Op != OpS390XMOVWZload { 7177 break 7178 } 7179 off := g.AuxInt 7180 sym := g.Aux 7181 _ = g.Args[1] 7182 ptr := g.Args[0] 7183 mem := g.Args[1] 7184 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7185 break 7186 } 7187 v.reset(OpS390XANDWload) 7188 v.Type = t 7189 v.AuxInt = off 7190 v.Aux = sym 7191 v.AddArg(x) 7192 v.AddArg(ptr) 7193 v.AddArg(mem) 7194 return true 7195 } 7196 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7197 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7198 // result: (ANDWload <t> [off] {sym} x ptr mem) 7199 for { 7200 t := v.Type 7201 _ = v.Args[1] 7202 g := v.Args[0] 7203 if g.Op != OpS390XMOVWZload { 7204 break 7205 } 7206 off := g.AuxInt 7207 sym := g.Aux 7208 _ = g.Args[1] 7209 ptr := g.Args[0] 7210 mem := g.Args[1] 7211 x := v.Args[1] 7212 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7213 break 7214 } 7215 v.reset(OpS390XANDWload) 7216 v.Type = t 7217 v.AuxInt = off 7218 v.Aux = sym 7219 v.AddArg(x) 7220 v.AddArg(ptr) 7221 v.AddArg(mem) 7222 return true 7223 } 7224 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 7225 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7226 // result: (ANDWload <t> [off] {sym} x ptr mem) 7227 for { 7228 t := v.Type 7229 _ = v.Args[1] 7230 g := v.Args[0] 7231 if g.Op != OpS390XMOVWZload { 7232 break 7233 } 7234 off := g.AuxInt 7235 sym := g.Aux 7236 _ = g.Args[1] 7237 ptr := g.Args[0] 7238 mem := g.Args[1] 7239 x := v.Args[1] 7240 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7241 break 7242 } 7243 v.reset(OpS390XANDWload) 7244 v.Type = t 7245 v.AuxInt = off 7246 v.Aux = sym 7247 v.AddArg(x) 7248 v.AddArg(ptr) 7249 v.AddArg(mem) 7250 return true 7251 } 7252 return false 7253 } 7254 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 7255 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 7256 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 7257 // result: (ANDWload <t> [off] {sym} x ptr mem) 7258 for { 7259 t := v.Type 7260 _ = v.Args[1] 7261 x := v.Args[0] 7262 g := v.Args[1] 7263 if g.Op != OpS390XMOVWZload { 7264 break 7265 } 7266 off := g.AuxInt 7267 sym := g.Aux 7268 _ = g.Args[1] 7269 ptr := g.Args[0] 7270 mem := g.Args[1] 7271 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 7272 break 7273 } 7274 v.reset(OpS390XANDWload) 7275 v.Type = t 7276 v.AuxInt = off 7277 v.Aux = sym 7278 v.AddArg(x) 7279 v.AddArg(ptr) 7280 v.AddArg(mem) 7281 return true 7282 } 7283 return false 7284 } 7285 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 7286 // match: (ANDWconst [c] (ANDWconst [d] x)) 7287 // cond: 7288 // result: (ANDWconst [c & d] x) 7289 for { 7290 c := v.AuxInt 7291 v_0 := v.Args[0] 7292 if v_0.Op != OpS390XANDWconst { 7293 break 7294 } 7295 d := v_0.AuxInt 7296 x := v_0.Args[0] 7297 v.reset(OpS390XANDWconst) 7298 v.AuxInt = c & d 7299 v.AddArg(x) 7300 return true 7301 } 7302 // match: (ANDWconst [0xFF] x) 7303 // cond: 7304 // result: (MOVBZreg x) 7305 for { 7306 if v.AuxInt != 0xFF { 7307 break 7308 } 7309 x := v.Args[0] 7310 v.reset(OpS390XMOVBZreg) 7311 v.AddArg(x) 7312 return true 7313 } 7314 // match: (ANDWconst [0xFFFF] x) 7315 // cond: 7316 // result: (MOVHZreg x) 7317 for { 7318 if v.AuxInt != 0xFFFF { 7319 break 7320 } 7321 x := v.Args[0] 7322 v.reset(OpS390XMOVHZreg) 7323 v.AddArg(x) 7324 return true 7325 } 7326 // match: (ANDWconst [c] _) 7327 // cond: int32(c)==0 7328 // result: (MOVDconst [0]) 7329 for { 7330 c := v.AuxInt 7331 if !(int32(c) == 0) { 7332 break 7333 } 7334 v.reset(OpS390XMOVDconst) 7335 v.AuxInt = 0 7336 return true 7337 } 7338 // match: (ANDWconst [c] x) 7339 // cond: int32(c)==-1 7340 // result: x 7341 for { 7342 c := v.AuxInt 7343 x := v.Args[0] 7344 if !(int32(c) == -1) { 7345 break 7346 } 7347 v.reset(OpCopy) 7348 v.Type = x.Type 7349 v.AddArg(x) 7350 return true 7351 } 7352 // match: (ANDWconst [c] (MOVDconst [d])) 7353 // cond: 7354 // result: (MOVDconst [c&d]) 7355 for { 7356 c := v.AuxInt 7357 v_0 := v.Args[0] 7358 if v_0.Op != OpS390XMOVDconst { 7359 break 7360 } 7361 d := v_0.AuxInt 7362 v.reset(OpS390XMOVDconst) 7363 v.AuxInt = c & d 7364 return true 7365 } 7366 return false 7367 } 7368 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 7369 // match: (ANDconst [c] (ANDconst [d] x)) 7370 // cond: 7371 // result: (ANDconst [c & d] x) 7372 for { 7373 c := v.AuxInt 7374 v_0 := v.Args[0] 7375 if v_0.Op != OpS390XANDconst { 7376 break 7377 } 7378 d := v_0.AuxInt 7379 x := v_0.Args[0] 7380 v.reset(OpS390XANDconst) 7381 v.AuxInt = c & d 7382 v.AddArg(x) 7383 return true 7384 } 7385 // match: (ANDconst [0] _) 7386 // cond: 7387 // result: (MOVDconst [0]) 7388 for { 7389 if v.AuxInt != 0 { 7390 break 7391 } 7392 v.reset(OpS390XMOVDconst) 7393 v.AuxInt = 0 7394 return true 7395 } 7396 // match: (ANDconst [-1] x) 7397 // cond: 7398 // result: x 7399 for { 7400 if v.AuxInt != -1 { 7401 break 7402 } 7403 x := v.Args[0] 7404 v.reset(OpCopy) 7405 v.Type = x.Type 7406 v.AddArg(x) 7407 return true 7408 } 7409 // match: (ANDconst [c] (MOVDconst [d])) 7410 // cond: 7411 // result: (MOVDconst [c&d]) 7412 for { 7413 c := v.AuxInt 7414 v_0 := v.Args[0] 7415 if v_0.Op != OpS390XMOVDconst { 7416 break 7417 } 7418 d := v_0.AuxInt 7419 v.reset(OpS390XMOVDconst) 7420 v.AuxInt = c & d 7421 return true 7422 } 7423 return false 7424 } 7425 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 7426 b := v.Block 7427 _ = b 7428 // match: (CMP x (MOVDconst [c])) 7429 // cond: is32Bit(c) 7430 // result: (CMPconst x [c]) 7431 for { 7432 _ = v.Args[1] 7433 x := v.Args[0] 7434 v_1 := v.Args[1] 7435 if v_1.Op != OpS390XMOVDconst { 7436 break 7437 } 7438 c := v_1.AuxInt 7439 if !(is32Bit(c)) { 7440 break 7441 } 7442 v.reset(OpS390XCMPconst) 7443 v.AuxInt = c 7444 v.AddArg(x) 7445 return true 7446 } 7447 // match: (CMP (MOVDconst [c]) x) 7448 // cond: is32Bit(c) 7449 // result: (InvertFlags (CMPconst x [c])) 7450 for { 7451 _ = v.Args[1] 7452 v_0 := v.Args[0] 7453 if v_0.Op != OpS390XMOVDconst { 7454 break 7455 } 7456 c := v_0.AuxInt 7457 x := v.Args[1] 7458 if !(is32Bit(c)) { 7459 break 7460 } 7461 v.reset(OpS390XInvertFlags) 7462 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) 7463 v0.AuxInt = c 7464 v0.AddArg(x) 7465 v.AddArg(v0) 7466 return true 7467 } 7468 return false 7469 } 7470 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 7471 b := v.Block 7472 _ = b 7473 // match: (CMPU x (MOVDconst [c])) 7474 // cond: isU32Bit(c) 7475 // result: (CMPUconst x [int64(uint32(c))]) 7476 for { 7477 _ = v.Args[1] 7478 x := v.Args[0] 7479 v_1 := v.Args[1] 7480 if v_1.Op != OpS390XMOVDconst { 7481 break 7482 } 7483 c := v_1.AuxInt 7484 if !(isU32Bit(c)) { 7485 break 7486 } 7487 v.reset(OpS390XCMPUconst) 7488 v.AuxInt = int64(uint32(c)) 7489 v.AddArg(x) 7490 return true 7491 } 7492 // match: (CMPU (MOVDconst [c]) x) 7493 // cond: isU32Bit(c) 7494 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 7495 for { 7496 _ = v.Args[1] 7497 v_0 := v.Args[0] 7498 if v_0.Op != OpS390XMOVDconst { 7499 break 7500 } 7501 c := v_0.AuxInt 7502 x := v.Args[1] 7503 if !(isU32Bit(c)) { 7504 break 7505 } 7506 v.reset(OpS390XInvertFlags) 7507 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) 7508 v0.AuxInt = int64(uint32(c)) 7509 v0.AddArg(x) 7510 v.AddArg(v0) 7511 return true 7512 } 7513 return false 7514 } 7515 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 7516 // match: (CMPUconst (MOVDconst [x]) [y]) 7517 // cond: uint64(x)==uint64(y) 7518 // result: (FlagEQ) 7519 for { 7520 y := v.AuxInt 7521 v_0 := v.Args[0] 7522 if v_0.Op != OpS390XMOVDconst { 7523 break 7524 } 7525 x := v_0.AuxInt 7526 if !(uint64(x) == uint64(y)) { 7527 break 7528 } 7529 v.reset(OpS390XFlagEQ) 7530 return true 7531 } 7532 // match: (CMPUconst (MOVDconst [x]) [y]) 7533 // cond: uint64(x)<uint64(y) 7534 // result: (FlagLT) 7535 for { 7536 y := v.AuxInt 7537 v_0 := v.Args[0] 7538 if v_0.Op != OpS390XMOVDconst { 7539 break 7540 } 7541 x := v_0.AuxInt 7542 if !(uint64(x) < uint64(y)) { 7543 break 7544 } 7545 v.reset(OpS390XFlagLT) 7546 return true 7547 } 7548 // match: (CMPUconst (MOVDconst [x]) [y]) 7549 // cond: uint64(x)>uint64(y) 7550 // result: (FlagGT) 7551 for { 7552 y := v.AuxInt 7553 v_0 := v.Args[0] 7554 if v_0.Op != OpS390XMOVDconst { 7555 break 7556 } 7557 x := v_0.AuxInt 7558 if !(uint64(x) > uint64(y)) { 7559 break 7560 } 7561 v.reset(OpS390XFlagGT) 7562 return true 7563 } 7564 return false 7565 } 7566 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 7567 b := v.Block 7568 _ = b 7569 // match: (CMPW x (MOVDconst [c])) 7570 // cond: 7571 // result: (CMPWconst x [c]) 7572 for { 7573 _ = v.Args[1] 7574 x := v.Args[0] 7575 v_1 := v.Args[1] 7576 if v_1.Op != OpS390XMOVDconst { 7577 break 7578 } 7579 c := v_1.AuxInt 7580 v.reset(OpS390XCMPWconst) 7581 v.AuxInt = c 7582 v.AddArg(x) 7583 return true 7584 } 7585 // match: (CMPW (MOVDconst [c]) x) 7586 // cond: 7587 // result: (InvertFlags (CMPWconst x [c])) 7588 for { 7589 _ = v.Args[1] 7590 v_0 := v.Args[0] 7591 if v_0.Op != OpS390XMOVDconst { 7592 break 7593 } 7594 c := v_0.AuxInt 7595 x := v.Args[1] 7596 v.reset(OpS390XInvertFlags) 7597 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 7598 v0.AuxInt = c 7599 v0.AddArg(x) 7600 v.AddArg(v0) 7601 return true 7602 } 7603 return false 7604 } 7605 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 7606 b := v.Block 7607 _ = b 7608 // match: (CMPWU x (MOVDconst [c])) 7609 // cond: 7610 // result: (CMPWUconst x [int64(uint32(c))]) 7611 for { 7612 _ = v.Args[1] 7613 x := v.Args[0] 7614 v_1 := v.Args[1] 7615 if v_1.Op != OpS390XMOVDconst { 7616 break 7617 } 7618 c := v_1.AuxInt 7619 v.reset(OpS390XCMPWUconst) 7620 v.AuxInt = int64(uint32(c)) 7621 v.AddArg(x) 7622 return true 7623 } 7624 // match: (CMPWU (MOVDconst [c]) x) 7625 // cond: 7626 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 7627 for { 7628 _ = v.Args[1] 7629 v_0 := v.Args[0] 7630 if v_0.Op != OpS390XMOVDconst { 7631 break 7632 } 7633 c := v_0.AuxInt 7634 x := v.Args[1] 7635 v.reset(OpS390XInvertFlags) 7636 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) 7637 v0.AuxInt = int64(uint32(c)) 7638 v0.AddArg(x) 7639 v.AddArg(v0) 7640 return true 7641 } 7642 return false 7643 } 7644 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 7645 // match: (CMPWUconst (MOVDconst [x]) [y]) 7646 // cond: uint32(x)==uint32(y) 7647 // result: (FlagEQ) 7648 for { 7649 y := v.AuxInt 7650 v_0 := v.Args[0] 7651 if v_0.Op != OpS390XMOVDconst { 7652 break 7653 } 7654 x := v_0.AuxInt 7655 if !(uint32(x) == uint32(y)) { 7656 break 7657 } 7658 v.reset(OpS390XFlagEQ) 7659 return true 7660 } 7661 // match: (CMPWUconst (MOVDconst [x]) [y]) 7662 // cond: uint32(x)<uint32(y) 7663 // result: (FlagLT) 7664 for { 7665 y := v.AuxInt 7666 v_0 := v.Args[0] 7667 if v_0.Op != OpS390XMOVDconst { 7668 break 7669 } 7670 x := v_0.AuxInt 7671 if !(uint32(x) < uint32(y)) { 7672 break 7673 } 7674 v.reset(OpS390XFlagLT) 7675 return true 7676 } 7677 // match: (CMPWUconst (MOVDconst [x]) [y]) 7678 // cond: uint32(x)>uint32(y) 7679 // result: (FlagGT) 7680 for { 7681 y := v.AuxInt 7682 v_0 := v.Args[0] 7683 if v_0.Op != OpS390XMOVDconst { 7684 break 7685 } 7686 x := v_0.AuxInt 7687 if !(uint32(x) > uint32(y)) { 7688 break 7689 } 7690 v.reset(OpS390XFlagGT) 7691 return true 7692 } 7693 return false 7694 } 7695 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 7696 // match: (CMPWconst (MOVDconst [x]) [y]) 7697 // cond: int32(x)==int32(y) 7698 // result: (FlagEQ) 7699 for { 7700 y := v.AuxInt 7701 v_0 := v.Args[0] 7702 if v_0.Op != OpS390XMOVDconst { 7703 break 7704 } 7705 x := v_0.AuxInt 7706 if !(int32(x) == int32(y)) { 7707 break 7708 } 7709 v.reset(OpS390XFlagEQ) 7710 return true 7711 } 7712 // match: (CMPWconst (MOVDconst [x]) [y]) 7713 // cond: int32(x)<int32(y) 7714 // result: (FlagLT) 7715 for { 7716 y := v.AuxInt 7717 v_0 := v.Args[0] 7718 if v_0.Op != OpS390XMOVDconst { 7719 break 7720 } 7721 x := v_0.AuxInt 7722 if !(int32(x) < int32(y)) { 7723 break 7724 } 7725 v.reset(OpS390XFlagLT) 7726 return true 7727 } 7728 // match: (CMPWconst (MOVDconst [x]) [y]) 7729 // cond: int32(x)>int32(y) 7730 // result: (FlagGT) 7731 for { 7732 y := v.AuxInt 7733 v_0 := v.Args[0] 7734 if v_0.Op != OpS390XMOVDconst { 7735 break 7736 } 7737 x := v_0.AuxInt 7738 if !(int32(x) > int32(y)) { 7739 break 7740 } 7741 v.reset(OpS390XFlagGT) 7742 return true 7743 } 7744 // match: (CMPWconst (SRWconst _ [c]) [n]) 7745 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7746 // result: (FlagLT) 7747 for { 7748 n := v.AuxInt 7749 v_0 := v.Args[0] 7750 if v_0.Op != OpS390XSRWconst { 7751 break 7752 } 7753 c := v_0.AuxInt 7754 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7755 break 7756 } 7757 v.reset(OpS390XFlagLT) 7758 return true 7759 } 7760 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7761 // cond: 0 <= int32(m) && int32(m) < int32(n) 7762 // result: (FlagLT) 7763 for { 7764 n := v.AuxInt 7765 v_0 := v.Args[0] 7766 if v_0.Op != OpS390XANDWconst { 7767 break 7768 } 7769 m := v_0.AuxInt 7770 if !(0 <= int32(m) && int32(m) < int32(n)) { 7771 break 7772 } 7773 v.reset(OpS390XFlagLT) 7774 return true 7775 } 7776 return false 7777 } 7778 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 7779 // match: (CMPconst (MOVDconst [x]) [y]) 7780 // cond: x==y 7781 // result: (FlagEQ) 7782 for { 7783 y := v.AuxInt 7784 v_0 := v.Args[0] 7785 if v_0.Op != OpS390XMOVDconst { 7786 break 7787 } 7788 x := v_0.AuxInt 7789 if !(x == y) { 7790 break 7791 } 7792 v.reset(OpS390XFlagEQ) 7793 return true 7794 } 7795 // match: (CMPconst (MOVDconst [x]) [y]) 7796 // cond: x<y 7797 // result: (FlagLT) 7798 for { 7799 y := v.AuxInt 7800 v_0 := v.Args[0] 7801 if v_0.Op != OpS390XMOVDconst { 7802 break 7803 } 7804 x := v_0.AuxInt 7805 if !(x < y) { 7806 break 7807 } 7808 v.reset(OpS390XFlagLT) 7809 return true 7810 } 7811 // match: (CMPconst (MOVDconst [x]) [y]) 7812 // cond: x>y 7813 // result: (FlagGT) 7814 for { 7815 y := v.AuxInt 7816 v_0 := v.Args[0] 7817 if v_0.Op != OpS390XMOVDconst { 7818 break 7819 } 7820 x := v_0.AuxInt 7821 if !(x > y) { 7822 break 7823 } 7824 v.reset(OpS390XFlagGT) 7825 return true 7826 } 7827 // match: (CMPconst (MOVBZreg _) [c]) 7828 // cond: 0xFF < c 7829 // result: (FlagLT) 7830 for { 7831 c := v.AuxInt 7832 v_0 := v.Args[0] 7833 if v_0.Op != OpS390XMOVBZreg { 7834 break 7835 } 7836 if !(0xFF < c) { 7837 break 7838 } 7839 v.reset(OpS390XFlagLT) 7840 return true 7841 } 7842 // match: (CMPconst (MOVHZreg _) [c]) 7843 // cond: 0xFFFF < c 7844 // result: (FlagLT) 7845 for { 7846 c := v.AuxInt 7847 v_0 := v.Args[0] 7848 if v_0.Op != OpS390XMOVHZreg { 7849 break 7850 } 7851 if !(0xFFFF < c) { 7852 break 7853 } 7854 v.reset(OpS390XFlagLT) 7855 return true 7856 } 7857 // match: (CMPconst (MOVWZreg _) [c]) 7858 // cond: 0xFFFFFFFF < c 7859 // result: (FlagLT) 7860 for { 7861 c := v.AuxInt 7862 v_0 := v.Args[0] 7863 if v_0.Op != OpS390XMOVWZreg { 7864 break 7865 } 7866 if !(0xFFFFFFFF < c) { 7867 break 7868 } 7869 v.reset(OpS390XFlagLT) 7870 return true 7871 } 7872 // match: (CMPconst (SRDconst _ [c]) [n]) 7873 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7874 // result: (FlagLT) 7875 for { 7876 n := v.AuxInt 7877 v_0 := v.Args[0] 7878 if v_0.Op != OpS390XSRDconst { 7879 break 7880 } 7881 c := v_0.AuxInt 7882 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7883 break 7884 } 7885 v.reset(OpS390XFlagLT) 7886 return true 7887 } 7888 // match: (CMPconst (ANDconst _ [m]) [n]) 7889 // cond: 0 <= m && m < n 7890 // result: (FlagLT) 7891 for { 7892 n := v.AuxInt 7893 v_0 := v.Args[0] 7894 if v_0.Op != OpS390XANDconst { 7895 break 7896 } 7897 m := v_0.AuxInt 7898 if !(0 <= m && m < n) { 7899 break 7900 } 7901 v.reset(OpS390XFlagLT) 7902 return true 7903 } 7904 return false 7905 } 7906 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 7907 // match: (FADD (FMUL y z) x) 7908 // cond: 7909 // result: (FMADD x y z) 7910 for { 7911 _ = v.Args[1] 7912 v_0 := v.Args[0] 7913 if v_0.Op != OpS390XFMUL { 7914 break 7915 } 7916 _ = v_0.Args[1] 7917 y := v_0.Args[0] 7918 z := v_0.Args[1] 7919 x := v.Args[1] 7920 v.reset(OpS390XFMADD) 7921 v.AddArg(x) 7922 v.AddArg(y) 7923 v.AddArg(z) 7924 return true 7925 } 7926 // match: (FADD x (FMUL y z)) 7927 // cond: 7928 // result: (FMADD x y z) 7929 for { 7930 _ = v.Args[1] 7931 x := v.Args[0] 7932 v_1 := v.Args[1] 7933 if v_1.Op != OpS390XFMUL { 7934 break 7935 } 7936 _ = v_1.Args[1] 7937 y := v_1.Args[0] 7938 z := v_1.Args[1] 7939 v.reset(OpS390XFMADD) 7940 v.AddArg(x) 7941 v.AddArg(y) 7942 v.AddArg(z) 7943 return true 7944 } 7945 return false 7946 } 7947 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 7948 // match: (FADDS (FMULS y z) x) 7949 // cond: 7950 // result: (FMADDS x y z) 7951 for { 7952 _ = v.Args[1] 7953 v_0 := v.Args[0] 7954 if v_0.Op != OpS390XFMULS { 7955 break 7956 } 7957 _ = v_0.Args[1] 7958 y := v_0.Args[0] 7959 z := v_0.Args[1] 7960 x := v.Args[1] 7961 v.reset(OpS390XFMADDS) 7962 v.AddArg(x) 7963 v.AddArg(y) 7964 v.AddArg(z) 7965 return true 7966 } 7967 // match: (FADDS x (FMULS y z)) 7968 // cond: 7969 // result: (FMADDS x y z) 7970 for { 7971 _ = v.Args[1] 7972 x := v.Args[0] 7973 v_1 := v.Args[1] 7974 if v_1.Op != OpS390XFMULS { 7975 break 7976 } 7977 _ = v_1.Args[1] 7978 y := v_1.Args[0] 7979 z := v_1.Args[1] 7980 v.reset(OpS390XFMADDS) 7981 v.AddArg(x) 7982 v.AddArg(y) 7983 v.AddArg(z) 7984 return true 7985 } 7986 return false 7987 } 7988 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 7989 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7990 // cond: is20Bit(off1+off2) 7991 // result: (FMOVDload [off1+off2] {sym} ptr mem) 7992 for { 7993 off1 := v.AuxInt 7994 sym := v.Aux 7995 _ = v.Args[1] 7996 v_0 := v.Args[0] 7997 if v_0.Op != OpS390XADDconst { 7998 break 7999 } 8000 off2 := v_0.AuxInt 8001 ptr := v_0.Args[0] 8002 mem := v.Args[1] 8003 if !(is20Bit(off1 + off2)) { 8004 break 8005 } 8006 v.reset(OpS390XFMOVDload) 8007 v.AuxInt = off1 + off2 8008 v.Aux = sym 8009 v.AddArg(ptr) 8010 v.AddArg(mem) 8011 return true 8012 } 8013 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8014 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8015 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8016 for { 8017 off1 := v.AuxInt 8018 sym1 := v.Aux 8019 _ = v.Args[1] 8020 v_0 := v.Args[0] 8021 if v_0.Op != OpS390XMOVDaddr { 8022 break 8023 } 8024 off2 := v_0.AuxInt 8025 sym2 := v_0.Aux 8026 base := v_0.Args[0] 8027 mem := v.Args[1] 8028 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8029 break 8030 } 8031 v.reset(OpS390XFMOVDload) 8032 v.AuxInt = off1 + off2 8033 v.Aux = mergeSym(sym1, sym2) 8034 v.AddArg(base) 8035 v.AddArg(mem) 8036 return true 8037 } 8038 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8039 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8040 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8041 for { 8042 off1 := v.AuxInt 8043 sym1 := v.Aux 8044 _ = v.Args[1] 8045 v_0 := v.Args[0] 8046 if v_0.Op != OpS390XMOVDaddridx { 8047 break 8048 } 8049 off2 := v_0.AuxInt 8050 sym2 := v_0.Aux 8051 _ = v_0.Args[1] 8052 ptr := v_0.Args[0] 8053 idx := v_0.Args[1] 8054 mem := v.Args[1] 8055 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8056 break 8057 } 8058 v.reset(OpS390XFMOVDloadidx) 8059 v.AuxInt = off1 + off2 8060 v.Aux = mergeSym(sym1, sym2) 8061 v.AddArg(ptr) 8062 v.AddArg(idx) 8063 v.AddArg(mem) 8064 return true 8065 } 8066 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 8067 // cond: ptr.Op != OpSB 8068 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 8069 for { 8070 off := v.AuxInt 8071 sym := v.Aux 8072 _ = v.Args[1] 8073 v_0 := v.Args[0] 8074 if v_0.Op != OpS390XADD { 8075 break 8076 } 8077 _ = v_0.Args[1] 8078 ptr := v_0.Args[0] 8079 idx := v_0.Args[1] 8080 mem := v.Args[1] 8081 if !(ptr.Op != OpSB) { 8082 break 8083 } 8084 v.reset(OpS390XFMOVDloadidx) 8085 v.AuxInt = off 8086 v.Aux = sym 8087 v.AddArg(ptr) 8088 v.AddArg(idx) 8089 v.AddArg(mem) 8090 return true 8091 } 8092 return false 8093 } 8094 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 8095 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8096 // cond: 8097 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8098 for { 8099 c := v.AuxInt 8100 sym := v.Aux 8101 _ = v.Args[2] 8102 v_0 := v.Args[0] 8103 if v_0.Op != OpS390XADDconst { 8104 break 8105 } 8106 d := v_0.AuxInt 8107 ptr := v_0.Args[0] 8108 idx := v.Args[1] 8109 mem := v.Args[2] 8110 v.reset(OpS390XFMOVDloadidx) 8111 v.AuxInt = c + d 8112 v.Aux = sym 8113 v.AddArg(ptr) 8114 v.AddArg(idx) 8115 v.AddArg(mem) 8116 return true 8117 } 8118 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8119 // cond: 8120 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 8121 for { 8122 c := v.AuxInt 8123 sym := v.Aux 8124 _ = v.Args[2] 8125 ptr := v.Args[0] 8126 v_1 := v.Args[1] 8127 if v_1.Op != OpS390XADDconst { 8128 break 8129 } 8130 d := v_1.AuxInt 8131 idx := v_1.Args[0] 8132 mem := v.Args[2] 8133 v.reset(OpS390XFMOVDloadidx) 8134 v.AuxInt = c + d 8135 v.Aux = sym 8136 v.AddArg(ptr) 8137 v.AddArg(idx) 8138 v.AddArg(mem) 8139 return true 8140 } 8141 return false 8142 } 8143 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 8144 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8145 // cond: is20Bit(off1+off2) 8146 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 8147 for { 8148 off1 := v.AuxInt 8149 sym := v.Aux 8150 _ = v.Args[2] 8151 v_0 := v.Args[0] 8152 if v_0.Op != OpS390XADDconst { 8153 break 8154 } 8155 off2 := v_0.AuxInt 8156 ptr := v_0.Args[0] 8157 val := v.Args[1] 8158 mem := v.Args[2] 8159 if !(is20Bit(off1 + off2)) { 8160 break 8161 } 8162 v.reset(OpS390XFMOVDstore) 8163 v.AuxInt = off1 + off2 8164 v.Aux = sym 8165 v.AddArg(ptr) 8166 v.AddArg(val) 8167 v.AddArg(mem) 8168 return true 8169 } 8170 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8171 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8172 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8173 for { 8174 off1 := v.AuxInt 8175 sym1 := v.Aux 8176 _ = v.Args[2] 8177 v_0 := v.Args[0] 8178 if v_0.Op != OpS390XMOVDaddr { 8179 break 8180 } 8181 off2 := v_0.AuxInt 8182 sym2 := v_0.Aux 8183 base := v_0.Args[0] 8184 val := v.Args[1] 8185 mem := v.Args[2] 8186 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8187 break 8188 } 8189 v.reset(OpS390XFMOVDstore) 8190 v.AuxInt = off1 + off2 8191 v.Aux = mergeSym(sym1, sym2) 8192 v.AddArg(base) 8193 v.AddArg(val) 8194 v.AddArg(mem) 8195 return true 8196 } 8197 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8198 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8199 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8200 for { 8201 off1 := v.AuxInt 8202 sym1 := v.Aux 8203 _ = v.Args[2] 8204 v_0 := v.Args[0] 8205 if v_0.Op != OpS390XMOVDaddridx { 8206 break 8207 } 8208 off2 := v_0.AuxInt 8209 sym2 := v_0.Aux 8210 _ = v_0.Args[1] 8211 ptr := v_0.Args[0] 8212 idx := v_0.Args[1] 8213 val := v.Args[1] 8214 mem := v.Args[2] 8215 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8216 break 8217 } 8218 v.reset(OpS390XFMOVDstoreidx) 8219 v.AuxInt = off1 + off2 8220 v.Aux = mergeSym(sym1, sym2) 8221 v.AddArg(ptr) 8222 v.AddArg(idx) 8223 v.AddArg(val) 8224 v.AddArg(mem) 8225 return true 8226 } 8227 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 8228 // cond: ptr.Op != OpSB 8229 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 8230 for { 8231 off := v.AuxInt 8232 sym := v.Aux 8233 _ = v.Args[2] 8234 v_0 := v.Args[0] 8235 if v_0.Op != OpS390XADD { 8236 break 8237 } 8238 _ = v_0.Args[1] 8239 ptr := v_0.Args[0] 8240 idx := v_0.Args[1] 8241 val := v.Args[1] 8242 mem := v.Args[2] 8243 if !(ptr.Op != OpSB) { 8244 break 8245 } 8246 v.reset(OpS390XFMOVDstoreidx) 8247 v.AuxInt = off 8248 v.Aux = sym 8249 v.AddArg(ptr) 8250 v.AddArg(idx) 8251 v.AddArg(val) 8252 v.AddArg(mem) 8253 return true 8254 } 8255 return false 8256 } 8257 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 8258 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8259 // cond: 8260 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8261 for { 8262 c := v.AuxInt 8263 sym := v.Aux 8264 _ = v.Args[3] 8265 v_0 := v.Args[0] 8266 if v_0.Op != OpS390XADDconst { 8267 break 8268 } 8269 d := v_0.AuxInt 8270 ptr := v_0.Args[0] 8271 idx := v.Args[1] 8272 val := v.Args[2] 8273 mem := v.Args[3] 8274 v.reset(OpS390XFMOVDstoreidx) 8275 v.AuxInt = c + d 8276 v.Aux = sym 8277 v.AddArg(ptr) 8278 v.AddArg(idx) 8279 v.AddArg(val) 8280 v.AddArg(mem) 8281 return true 8282 } 8283 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8284 // cond: 8285 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 8286 for { 8287 c := v.AuxInt 8288 sym := v.Aux 8289 _ = v.Args[3] 8290 ptr := v.Args[0] 8291 v_1 := v.Args[1] 8292 if v_1.Op != OpS390XADDconst { 8293 break 8294 } 8295 d := v_1.AuxInt 8296 idx := v_1.Args[0] 8297 val := v.Args[2] 8298 mem := v.Args[3] 8299 v.reset(OpS390XFMOVDstoreidx) 8300 v.AuxInt = c + d 8301 v.Aux = sym 8302 v.AddArg(ptr) 8303 v.AddArg(idx) 8304 v.AddArg(val) 8305 v.AddArg(mem) 8306 return true 8307 } 8308 return false 8309 } 8310 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 8311 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 8312 // cond: is20Bit(off1+off2) 8313 // result: (FMOVSload [off1+off2] {sym} ptr mem) 8314 for { 8315 off1 := v.AuxInt 8316 sym := v.Aux 8317 _ = v.Args[1] 8318 v_0 := v.Args[0] 8319 if v_0.Op != OpS390XADDconst { 8320 break 8321 } 8322 off2 := v_0.AuxInt 8323 ptr := v_0.Args[0] 8324 mem := v.Args[1] 8325 if !(is20Bit(off1 + off2)) { 8326 break 8327 } 8328 v.reset(OpS390XFMOVSload) 8329 v.AuxInt = off1 + off2 8330 v.Aux = sym 8331 v.AddArg(ptr) 8332 v.AddArg(mem) 8333 return true 8334 } 8335 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8336 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8337 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8338 for { 8339 off1 := v.AuxInt 8340 sym1 := v.Aux 8341 _ = v.Args[1] 8342 v_0 := v.Args[0] 8343 if v_0.Op != OpS390XMOVDaddr { 8344 break 8345 } 8346 off2 := v_0.AuxInt 8347 sym2 := v_0.Aux 8348 base := v_0.Args[0] 8349 mem := v.Args[1] 8350 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8351 break 8352 } 8353 v.reset(OpS390XFMOVSload) 8354 v.AuxInt = off1 + off2 8355 v.Aux = mergeSym(sym1, sym2) 8356 v.AddArg(base) 8357 v.AddArg(mem) 8358 return true 8359 } 8360 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8361 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8362 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8363 for { 8364 off1 := v.AuxInt 8365 sym1 := v.Aux 8366 _ = v.Args[1] 8367 v_0 := v.Args[0] 8368 if v_0.Op != OpS390XMOVDaddridx { 8369 break 8370 } 8371 off2 := v_0.AuxInt 8372 sym2 := v_0.Aux 8373 _ = v_0.Args[1] 8374 ptr := v_0.Args[0] 8375 idx := v_0.Args[1] 8376 mem := v.Args[1] 8377 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8378 break 8379 } 8380 v.reset(OpS390XFMOVSloadidx) 8381 v.AuxInt = off1 + off2 8382 v.Aux = mergeSym(sym1, sym2) 8383 v.AddArg(ptr) 8384 v.AddArg(idx) 8385 v.AddArg(mem) 8386 return true 8387 } 8388 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8389 // cond: ptr.Op != OpSB 8390 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8391 for { 8392 off := v.AuxInt 8393 sym := v.Aux 8394 _ = v.Args[1] 8395 v_0 := v.Args[0] 8396 if v_0.Op != OpS390XADD { 8397 break 8398 } 8399 _ = v_0.Args[1] 8400 ptr := v_0.Args[0] 8401 idx := v_0.Args[1] 8402 mem := v.Args[1] 8403 if !(ptr.Op != OpSB) { 8404 break 8405 } 8406 v.reset(OpS390XFMOVSloadidx) 8407 v.AuxInt = off 8408 v.Aux = sym 8409 v.AddArg(ptr) 8410 v.AddArg(idx) 8411 v.AddArg(mem) 8412 return true 8413 } 8414 return false 8415 } 8416 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 8417 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8418 // cond: 8419 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8420 for { 8421 c := v.AuxInt 8422 sym := v.Aux 8423 _ = v.Args[2] 8424 v_0 := v.Args[0] 8425 if v_0.Op != OpS390XADDconst { 8426 break 8427 } 8428 d := v_0.AuxInt 8429 ptr := v_0.Args[0] 8430 idx := v.Args[1] 8431 mem := v.Args[2] 8432 v.reset(OpS390XFMOVSloadidx) 8433 v.AuxInt = c + d 8434 v.Aux = sym 8435 v.AddArg(ptr) 8436 v.AddArg(idx) 8437 v.AddArg(mem) 8438 return true 8439 } 8440 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8441 // cond: 8442 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8443 for { 8444 c := v.AuxInt 8445 sym := v.Aux 8446 _ = v.Args[2] 8447 ptr := v.Args[0] 8448 v_1 := v.Args[1] 8449 if v_1.Op != OpS390XADDconst { 8450 break 8451 } 8452 d := v_1.AuxInt 8453 idx := v_1.Args[0] 8454 mem := v.Args[2] 8455 v.reset(OpS390XFMOVSloadidx) 8456 v.AuxInt = c + d 8457 v.Aux = sym 8458 v.AddArg(ptr) 8459 v.AddArg(idx) 8460 v.AddArg(mem) 8461 return true 8462 } 8463 return false 8464 } 8465 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 8466 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8467 // cond: is20Bit(off1+off2) 8468 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 8469 for { 8470 off1 := v.AuxInt 8471 sym := v.Aux 8472 _ = v.Args[2] 8473 v_0 := v.Args[0] 8474 if v_0.Op != OpS390XADDconst { 8475 break 8476 } 8477 off2 := v_0.AuxInt 8478 ptr := v_0.Args[0] 8479 val := v.Args[1] 8480 mem := v.Args[2] 8481 if !(is20Bit(off1 + off2)) { 8482 break 8483 } 8484 v.reset(OpS390XFMOVSstore) 8485 v.AuxInt = off1 + off2 8486 v.Aux = sym 8487 v.AddArg(ptr) 8488 v.AddArg(val) 8489 v.AddArg(mem) 8490 return true 8491 } 8492 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8493 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8494 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8495 for { 8496 off1 := v.AuxInt 8497 sym1 := v.Aux 8498 _ = v.Args[2] 8499 v_0 := v.Args[0] 8500 if v_0.Op != OpS390XMOVDaddr { 8501 break 8502 } 8503 off2 := v_0.AuxInt 8504 sym2 := v_0.Aux 8505 base := v_0.Args[0] 8506 val := v.Args[1] 8507 mem := v.Args[2] 8508 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8509 break 8510 } 8511 v.reset(OpS390XFMOVSstore) 8512 v.AuxInt = off1 + off2 8513 v.Aux = mergeSym(sym1, sym2) 8514 v.AddArg(base) 8515 v.AddArg(val) 8516 v.AddArg(mem) 8517 return true 8518 } 8519 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8520 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8521 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8522 for { 8523 off1 := v.AuxInt 8524 sym1 := v.Aux 8525 _ = v.Args[2] 8526 v_0 := v.Args[0] 8527 if v_0.Op != OpS390XMOVDaddridx { 8528 break 8529 } 8530 off2 := v_0.AuxInt 8531 sym2 := v_0.Aux 8532 _ = v_0.Args[1] 8533 ptr := v_0.Args[0] 8534 idx := v_0.Args[1] 8535 val := v.Args[1] 8536 mem := v.Args[2] 8537 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8538 break 8539 } 8540 v.reset(OpS390XFMOVSstoreidx) 8541 v.AuxInt = off1 + off2 8542 v.Aux = mergeSym(sym1, sym2) 8543 v.AddArg(ptr) 8544 v.AddArg(idx) 8545 v.AddArg(val) 8546 v.AddArg(mem) 8547 return true 8548 } 8549 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 8550 // cond: ptr.Op != OpSB 8551 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 8552 for { 8553 off := v.AuxInt 8554 sym := v.Aux 8555 _ = v.Args[2] 8556 v_0 := v.Args[0] 8557 if v_0.Op != OpS390XADD { 8558 break 8559 } 8560 _ = v_0.Args[1] 8561 ptr := v_0.Args[0] 8562 idx := v_0.Args[1] 8563 val := v.Args[1] 8564 mem := v.Args[2] 8565 if !(ptr.Op != OpSB) { 8566 break 8567 } 8568 v.reset(OpS390XFMOVSstoreidx) 8569 v.AuxInt = off 8570 v.Aux = sym 8571 v.AddArg(ptr) 8572 v.AddArg(idx) 8573 v.AddArg(val) 8574 v.AddArg(mem) 8575 return true 8576 } 8577 return false 8578 } 8579 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 8580 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8581 // cond: 8582 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8583 for { 8584 c := v.AuxInt 8585 sym := v.Aux 8586 _ = v.Args[3] 8587 v_0 := v.Args[0] 8588 if v_0.Op != OpS390XADDconst { 8589 break 8590 } 8591 d := v_0.AuxInt 8592 ptr := v_0.Args[0] 8593 idx := v.Args[1] 8594 val := v.Args[2] 8595 mem := v.Args[3] 8596 v.reset(OpS390XFMOVSstoreidx) 8597 v.AuxInt = c + d 8598 v.Aux = sym 8599 v.AddArg(ptr) 8600 v.AddArg(idx) 8601 v.AddArg(val) 8602 v.AddArg(mem) 8603 return true 8604 } 8605 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8606 // cond: 8607 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8608 for { 8609 c := v.AuxInt 8610 sym := v.Aux 8611 _ = v.Args[3] 8612 ptr := v.Args[0] 8613 v_1 := v.Args[1] 8614 if v_1.Op != OpS390XADDconst { 8615 break 8616 } 8617 d := v_1.AuxInt 8618 idx := v_1.Args[0] 8619 val := v.Args[2] 8620 mem := v.Args[3] 8621 v.reset(OpS390XFMOVSstoreidx) 8622 v.AuxInt = c + d 8623 v.Aux = sym 8624 v.AddArg(ptr) 8625 v.AddArg(idx) 8626 v.AddArg(val) 8627 v.AddArg(mem) 8628 return true 8629 } 8630 return false 8631 } 8632 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 8633 // match: (FSUB (FMUL y z) x) 8634 // cond: 8635 // result: (FMSUB x y z) 8636 for { 8637 _ = v.Args[1] 8638 v_0 := v.Args[0] 8639 if v_0.Op != OpS390XFMUL { 8640 break 8641 } 8642 _ = v_0.Args[1] 8643 y := v_0.Args[0] 8644 z := v_0.Args[1] 8645 x := v.Args[1] 8646 v.reset(OpS390XFMSUB) 8647 v.AddArg(x) 8648 v.AddArg(y) 8649 v.AddArg(z) 8650 return true 8651 } 8652 return false 8653 } 8654 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 8655 // match: (FSUBS (FMULS y z) x) 8656 // cond: 8657 // result: (FMSUBS x y z) 8658 for { 8659 _ = v.Args[1] 8660 v_0 := v.Args[0] 8661 if v_0.Op != OpS390XFMULS { 8662 break 8663 } 8664 _ = v_0.Args[1] 8665 y := v_0.Args[0] 8666 z := v_0.Args[1] 8667 x := v.Args[1] 8668 v.reset(OpS390XFMSUBS) 8669 v.AddArg(x) 8670 v.AddArg(y) 8671 v.AddArg(z) 8672 return true 8673 } 8674 return false 8675 } 8676 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 8677 // match: (LoweredRound32F x:(FMOVSconst)) 8678 // cond: 8679 // result: x 8680 for { 8681 x := v.Args[0] 8682 if x.Op != OpS390XFMOVSconst { 8683 break 8684 } 8685 v.reset(OpCopy) 8686 v.Type = x.Type 8687 v.AddArg(x) 8688 return true 8689 } 8690 return false 8691 } 8692 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 8693 // match: (LoweredRound64F x:(FMOVDconst)) 8694 // cond: 8695 // result: x 8696 for { 8697 x := v.Args[0] 8698 if x.Op != OpS390XFMOVDconst { 8699 break 8700 } 8701 v.reset(OpCopy) 8702 v.Type = x.Type 8703 v.AddArg(x) 8704 return true 8705 } 8706 return false 8707 } 8708 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 8709 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 8710 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8711 // result: (MOVBZreg x) 8712 for { 8713 off := v.AuxInt 8714 sym := v.Aux 8715 _ = v.Args[1] 8716 ptr := v.Args[0] 8717 v_1 := v.Args[1] 8718 if v_1.Op != OpS390XMOVBstore { 8719 break 8720 } 8721 off2 := v_1.AuxInt 8722 sym2 := v_1.Aux 8723 _ = v_1.Args[2] 8724 ptr2 := v_1.Args[0] 8725 x := v_1.Args[1] 8726 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8727 break 8728 } 8729 v.reset(OpS390XMOVBZreg) 8730 v.AddArg(x) 8731 return true 8732 } 8733 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 8734 // cond: is20Bit(off1+off2) 8735 // result: (MOVBZload [off1+off2] {sym} ptr mem) 8736 for { 8737 off1 := v.AuxInt 8738 sym := v.Aux 8739 _ = v.Args[1] 8740 v_0 := v.Args[0] 8741 if v_0.Op != OpS390XADDconst { 8742 break 8743 } 8744 off2 := v_0.AuxInt 8745 ptr := v_0.Args[0] 8746 mem := v.Args[1] 8747 if !(is20Bit(off1 + off2)) { 8748 break 8749 } 8750 v.reset(OpS390XMOVBZload) 8751 v.AuxInt = off1 + off2 8752 v.Aux = sym 8753 v.AddArg(ptr) 8754 v.AddArg(mem) 8755 return true 8756 } 8757 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8758 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8759 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8760 for { 8761 off1 := v.AuxInt 8762 sym1 := v.Aux 8763 _ = v.Args[1] 8764 v_0 := v.Args[0] 8765 if v_0.Op != OpS390XMOVDaddr { 8766 break 8767 } 8768 off2 := v_0.AuxInt 8769 sym2 := v_0.Aux 8770 base := v_0.Args[0] 8771 mem := v.Args[1] 8772 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8773 break 8774 } 8775 v.reset(OpS390XMOVBZload) 8776 v.AuxInt = off1 + off2 8777 v.Aux = mergeSym(sym1, sym2) 8778 v.AddArg(base) 8779 v.AddArg(mem) 8780 return true 8781 } 8782 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8783 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8784 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8785 for { 8786 off1 := v.AuxInt 8787 sym1 := v.Aux 8788 _ = v.Args[1] 8789 v_0 := v.Args[0] 8790 if v_0.Op != OpS390XMOVDaddridx { 8791 break 8792 } 8793 off2 := v_0.AuxInt 8794 sym2 := v_0.Aux 8795 _ = v_0.Args[1] 8796 ptr := v_0.Args[0] 8797 idx := v_0.Args[1] 8798 mem := v.Args[1] 8799 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8800 break 8801 } 8802 v.reset(OpS390XMOVBZloadidx) 8803 v.AuxInt = off1 + off2 8804 v.Aux = mergeSym(sym1, sym2) 8805 v.AddArg(ptr) 8806 v.AddArg(idx) 8807 v.AddArg(mem) 8808 return true 8809 } 8810 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 8811 // cond: ptr.Op != OpSB 8812 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 8813 for { 8814 off := v.AuxInt 8815 sym := v.Aux 8816 _ = v.Args[1] 8817 v_0 := v.Args[0] 8818 if v_0.Op != OpS390XADD { 8819 break 8820 } 8821 _ = v_0.Args[1] 8822 ptr := v_0.Args[0] 8823 idx := v_0.Args[1] 8824 mem := v.Args[1] 8825 if !(ptr.Op != OpSB) { 8826 break 8827 } 8828 v.reset(OpS390XMOVBZloadidx) 8829 v.AuxInt = off 8830 v.Aux = sym 8831 v.AddArg(ptr) 8832 v.AddArg(idx) 8833 v.AddArg(mem) 8834 return true 8835 } 8836 return false 8837 } 8838 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 8839 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8840 // cond: 8841 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8842 for { 8843 c := v.AuxInt 8844 sym := v.Aux 8845 _ = v.Args[2] 8846 v_0 := v.Args[0] 8847 if v_0.Op != OpS390XADDconst { 8848 break 8849 } 8850 d := v_0.AuxInt 8851 ptr := v_0.Args[0] 8852 idx := v.Args[1] 8853 mem := v.Args[2] 8854 v.reset(OpS390XMOVBZloadidx) 8855 v.AuxInt = c + d 8856 v.Aux = sym 8857 v.AddArg(ptr) 8858 v.AddArg(idx) 8859 v.AddArg(mem) 8860 return true 8861 } 8862 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 8863 // cond: 8864 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8865 for { 8866 c := v.AuxInt 8867 sym := v.Aux 8868 _ = v.Args[2] 8869 idx := v.Args[0] 8870 v_1 := v.Args[1] 8871 if v_1.Op != OpS390XADDconst { 8872 break 8873 } 8874 d := v_1.AuxInt 8875 ptr := v_1.Args[0] 8876 mem := v.Args[2] 8877 v.reset(OpS390XMOVBZloadidx) 8878 v.AuxInt = c + d 8879 v.Aux = sym 8880 v.AddArg(ptr) 8881 v.AddArg(idx) 8882 v.AddArg(mem) 8883 return true 8884 } 8885 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8886 // cond: 8887 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8888 for { 8889 c := v.AuxInt 8890 sym := v.Aux 8891 _ = v.Args[2] 8892 ptr := v.Args[0] 8893 v_1 := v.Args[1] 8894 if v_1.Op != OpS390XADDconst { 8895 break 8896 } 8897 d := v_1.AuxInt 8898 idx := v_1.Args[0] 8899 mem := v.Args[2] 8900 v.reset(OpS390XMOVBZloadidx) 8901 v.AuxInt = c + d 8902 v.Aux = sym 8903 v.AddArg(ptr) 8904 v.AddArg(idx) 8905 v.AddArg(mem) 8906 return true 8907 } 8908 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 8909 // cond: 8910 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8911 for { 8912 c := v.AuxInt 8913 sym := v.Aux 8914 _ = v.Args[2] 8915 v_0 := v.Args[0] 8916 if v_0.Op != OpS390XADDconst { 8917 break 8918 } 8919 d := v_0.AuxInt 8920 idx := v_0.Args[0] 8921 ptr := v.Args[1] 8922 mem := v.Args[2] 8923 v.reset(OpS390XMOVBZloadidx) 8924 v.AuxInt = c + d 8925 v.Aux = sym 8926 v.AddArg(ptr) 8927 v.AddArg(idx) 8928 v.AddArg(mem) 8929 return true 8930 } 8931 return false 8932 } 8933 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 8934 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8935 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8936 // result: (MOVDreg x) 8937 for { 8938 x := v.Args[0] 8939 if x.Op != OpS390XMOVDLT { 8940 break 8941 } 8942 _ = x.Args[2] 8943 x_0 := x.Args[0] 8944 if x_0.Op != OpS390XMOVDconst { 8945 break 8946 } 8947 c := x_0.AuxInt 8948 x_1 := x.Args[1] 8949 if x_1.Op != OpS390XMOVDconst { 8950 break 8951 } 8952 d := x_1.AuxInt 8953 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8954 break 8955 } 8956 v.reset(OpS390XMOVDreg) 8957 v.AddArg(x) 8958 return true 8959 } 8960 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 8961 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8962 // result: (MOVDreg x) 8963 for { 8964 x := v.Args[0] 8965 if x.Op != OpS390XMOVDLE { 8966 break 8967 } 8968 _ = x.Args[2] 8969 x_0 := x.Args[0] 8970 if x_0.Op != OpS390XMOVDconst { 8971 break 8972 } 8973 c := x_0.AuxInt 8974 x_1 := x.Args[1] 8975 if x_1.Op != OpS390XMOVDconst { 8976 break 8977 } 8978 d := x_1.AuxInt 8979 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8980 break 8981 } 8982 v.reset(OpS390XMOVDreg) 8983 v.AddArg(x) 8984 return true 8985 } 8986 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 8987 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8988 // result: (MOVDreg x) 8989 for { 8990 x := v.Args[0] 8991 if x.Op != OpS390XMOVDGT { 8992 break 8993 } 8994 _ = x.Args[2] 8995 x_0 := x.Args[0] 8996 if x_0.Op != OpS390XMOVDconst { 8997 break 8998 } 8999 c := x_0.AuxInt 9000 x_1 := x.Args[1] 9001 if x_1.Op != OpS390XMOVDconst { 9002 break 9003 } 9004 d := x_1.AuxInt 9005 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9006 break 9007 } 9008 v.reset(OpS390XMOVDreg) 9009 v.AddArg(x) 9010 return true 9011 } 9012 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 9013 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9014 // result: (MOVDreg x) 9015 for { 9016 x := v.Args[0] 9017 if x.Op != OpS390XMOVDGE { 9018 break 9019 } 9020 _ = x.Args[2] 9021 x_0 := x.Args[0] 9022 if x_0.Op != OpS390XMOVDconst { 9023 break 9024 } 9025 c := x_0.AuxInt 9026 x_1 := x.Args[1] 9027 if x_1.Op != OpS390XMOVDconst { 9028 break 9029 } 9030 d := x_1.AuxInt 9031 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9032 break 9033 } 9034 v.reset(OpS390XMOVDreg) 9035 v.AddArg(x) 9036 return true 9037 } 9038 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 9039 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9040 // result: (MOVDreg x) 9041 for { 9042 x := v.Args[0] 9043 if x.Op != OpS390XMOVDEQ { 9044 break 9045 } 9046 _ = x.Args[2] 9047 x_0 := x.Args[0] 9048 if x_0.Op != OpS390XMOVDconst { 9049 break 9050 } 9051 c := x_0.AuxInt 9052 x_1 := x.Args[1] 9053 if x_1.Op != OpS390XMOVDconst { 9054 break 9055 } 9056 d := x_1.AuxInt 9057 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9058 break 9059 } 9060 v.reset(OpS390XMOVDreg) 9061 v.AddArg(x) 9062 return true 9063 } 9064 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 9065 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9066 // result: (MOVDreg x) 9067 for { 9068 x := v.Args[0] 9069 if x.Op != OpS390XMOVDNE { 9070 break 9071 } 9072 _ = x.Args[2] 9073 x_0 := x.Args[0] 9074 if x_0.Op != OpS390XMOVDconst { 9075 break 9076 } 9077 c := x_0.AuxInt 9078 x_1 := x.Args[1] 9079 if x_1.Op != OpS390XMOVDconst { 9080 break 9081 } 9082 d := x_1.AuxInt 9083 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9084 break 9085 } 9086 v.reset(OpS390XMOVDreg) 9087 v.AddArg(x) 9088 return true 9089 } 9090 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9091 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9092 // result: (MOVDreg x) 9093 for { 9094 x := v.Args[0] 9095 if x.Op != OpS390XMOVDGTnoinv { 9096 break 9097 } 9098 _ = x.Args[2] 9099 x_0 := x.Args[0] 9100 if x_0.Op != OpS390XMOVDconst { 9101 break 9102 } 9103 c := x_0.AuxInt 9104 x_1 := x.Args[1] 9105 if x_1.Op != OpS390XMOVDconst { 9106 break 9107 } 9108 d := x_1.AuxInt 9109 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9110 break 9111 } 9112 v.reset(OpS390XMOVDreg) 9113 v.AddArg(x) 9114 return true 9115 } 9116 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 9117 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 9118 // result: (MOVDreg x) 9119 for { 9120 x := v.Args[0] 9121 if x.Op != OpS390XMOVDGEnoinv { 9122 break 9123 } 9124 _ = x.Args[2] 9125 x_0 := x.Args[0] 9126 if x_0.Op != OpS390XMOVDconst { 9127 break 9128 } 9129 c := x_0.AuxInt 9130 x_1 := x.Args[1] 9131 if x_1.Op != OpS390XMOVDconst { 9132 break 9133 } 9134 d := x_1.AuxInt 9135 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 9136 break 9137 } 9138 v.reset(OpS390XMOVDreg) 9139 v.AddArg(x) 9140 return true 9141 } 9142 // match: (MOVBZreg x:(MOVBZload _ _)) 9143 // cond: 9144 // result: (MOVDreg x) 9145 for { 9146 x := v.Args[0] 9147 if x.Op != OpS390XMOVBZload { 9148 break 9149 } 9150 _ = x.Args[1] 9151 v.reset(OpS390XMOVDreg) 9152 v.AddArg(x) 9153 return true 9154 } 9155 // match: (MOVBZreg x:(Arg <t>)) 9156 // cond: is8BitInt(t) && !isSigned(t) 9157 // result: (MOVDreg x) 9158 for { 9159 x := v.Args[0] 9160 if x.Op != OpArg { 9161 break 9162 } 9163 t := x.Type 9164 if !(is8BitInt(t) && !isSigned(t)) { 9165 break 9166 } 9167 v.reset(OpS390XMOVDreg) 9168 v.AddArg(x) 9169 return true 9170 } 9171 return false 9172 } 9173 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 9174 b := v.Block 9175 _ = b 9176 // match: (MOVBZreg x:(MOVBZreg _)) 9177 // cond: 9178 // result: (MOVDreg x) 9179 for { 9180 x := v.Args[0] 9181 if x.Op != OpS390XMOVBZreg { 9182 break 9183 } 9184 v.reset(OpS390XMOVDreg) 9185 v.AddArg(x) 9186 return true 9187 } 9188 // match: (MOVBZreg (MOVDconst [c])) 9189 // cond: 9190 // result: (MOVDconst [int64(uint8(c))]) 9191 for { 9192 v_0 := v.Args[0] 9193 if v_0.Op != OpS390XMOVDconst { 9194 break 9195 } 9196 c := v_0.AuxInt 9197 v.reset(OpS390XMOVDconst) 9198 v.AuxInt = int64(uint8(c)) 9199 return true 9200 } 9201 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 9202 // cond: x.Uses == 1 && clobber(x) 9203 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 9204 for { 9205 x := v.Args[0] 9206 if x.Op != OpS390XMOVBZload { 9207 break 9208 } 9209 off := x.AuxInt 9210 sym := x.Aux 9211 _ = x.Args[1] 9212 ptr := x.Args[0] 9213 mem := x.Args[1] 9214 if !(x.Uses == 1 && clobber(x)) { 9215 break 9216 } 9217 b = x.Block 9218 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 9219 v.reset(OpCopy) 9220 v.AddArg(v0) 9221 v0.AuxInt = off 9222 v0.Aux = sym 9223 v0.AddArg(ptr) 9224 v0.AddArg(mem) 9225 return true 9226 } 9227 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 9228 // cond: x.Uses == 1 && clobber(x) 9229 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 9230 for { 9231 x := v.Args[0] 9232 if x.Op != OpS390XMOVBZloadidx { 9233 break 9234 } 9235 off := x.AuxInt 9236 sym := x.Aux 9237 _ = x.Args[2] 9238 ptr := x.Args[0] 9239 idx := x.Args[1] 9240 mem := x.Args[2] 9241 if !(x.Uses == 1 && clobber(x)) { 9242 break 9243 } 9244 b = x.Block 9245 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 9246 v.reset(OpCopy) 9247 v.AddArg(v0) 9248 v0.AuxInt = off 9249 v0.Aux = sym 9250 v0.AddArg(ptr) 9251 v0.AddArg(idx) 9252 v0.AddArg(mem) 9253 return true 9254 } 9255 return false 9256 } 9257 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 9258 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 9259 // cond: is20Bit(off1+off2) 9260 // result: (MOVBload [off1+off2] {sym} ptr mem) 9261 for { 9262 off1 := v.AuxInt 9263 sym := v.Aux 9264 _ = v.Args[1] 9265 v_0 := v.Args[0] 9266 if v_0.Op != OpS390XADDconst { 9267 break 9268 } 9269 off2 := v_0.AuxInt 9270 ptr := v_0.Args[0] 9271 mem := v.Args[1] 9272 if !(is20Bit(off1 + off2)) { 9273 break 9274 } 9275 v.reset(OpS390XMOVBload) 9276 v.AuxInt = off1 + off2 9277 v.Aux = sym 9278 v.AddArg(ptr) 9279 v.AddArg(mem) 9280 return true 9281 } 9282 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 9283 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9284 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 9285 for { 9286 off1 := v.AuxInt 9287 sym1 := v.Aux 9288 _ = v.Args[1] 9289 v_0 := v.Args[0] 9290 if v_0.Op != OpS390XMOVDaddr { 9291 break 9292 } 9293 off2 := v_0.AuxInt 9294 sym2 := v_0.Aux 9295 base := v_0.Args[0] 9296 mem := v.Args[1] 9297 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9298 break 9299 } 9300 v.reset(OpS390XMOVBload) 9301 v.AuxInt = off1 + off2 9302 v.Aux = mergeSym(sym1, sym2) 9303 v.AddArg(base) 9304 v.AddArg(mem) 9305 return true 9306 } 9307 return false 9308 } 9309 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 9310 b := v.Block 9311 _ = b 9312 // match: (MOVBreg x:(MOVBload _ _)) 9313 // cond: 9314 // result: (MOVDreg x) 9315 for { 9316 x := v.Args[0] 9317 if x.Op != OpS390XMOVBload { 9318 break 9319 } 9320 _ = x.Args[1] 9321 v.reset(OpS390XMOVDreg) 9322 v.AddArg(x) 9323 return true 9324 } 9325 // match: (MOVBreg x:(Arg <t>)) 9326 // cond: is8BitInt(t) && isSigned(t) 9327 // result: (MOVDreg x) 9328 for { 9329 x := v.Args[0] 9330 if x.Op != OpArg { 9331 break 9332 } 9333 t := x.Type 9334 if !(is8BitInt(t) && isSigned(t)) { 9335 break 9336 } 9337 v.reset(OpS390XMOVDreg) 9338 v.AddArg(x) 9339 return true 9340 } 9341 // match: (MOVBreg x:(MOVBreg _)) 9342 // cond: 9343 // result: (MOVDreg x) 9344 for { 9345 x := v.Args[0] 9346 if x.Op != OpS390XMOVBreg { 9347 break 9348 } 9349 v.reset(OpS390XMOVDreg) 9350 v.AddArg(x) 9351 return true 9352 } 9353 // match: (MOVBreg (MOVDconst [c])) 9354 // cond: 9355 // result: (MOVDconst [int64(int8(c))]) 9356 for { 9357 v_0 := v.Args[0] 9358 if v_0.Op != OpS390XMOVDconst { 9359 break 9360 } 9361 c := v_0.AuxInt 9362 v.reset(OpS390XMOVDconst) 9363 v.AuxInt = int64(int8(c)) 9364 return true 9365 } 9366 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 9367 // cond: x.Uses == 1 && clobber(x) 9368 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 9369 for { 9370 x := v.Args[0] 9371 if x.Op != OpS390XMOVBZload { 9372 break 9373 } 9374 off := x.AuxInt 9375 sym := x.Aux 9376 _ = x.Args[1] 9377 ptr := x.Args[0] 9378 mem := x.Args[1] 9379 if !(x.Uses == 1 && clobber(x)) { 9380 break 9381 } 9382 b = x.Block 9383 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 9384 v.reset(OpCopy) 9385 v.AddArg(v0) 9386 v0.AuxInt = off 9387 v0.Aux = sym 9388 v0.AddArg(ptr) 9389 v0.AddArg(mem) 9390 return true 9391 } 9392 return false 9393 } 9394 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 9395 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 9396 // cond: 9397 // result: (MOVBstore [off] {sym} ptr x mem) 9398 for { 9399 off := v.AuxInt 9400 sym := v.Aux 9401 _ = v.Args[2] 9402 ptr := v.Args[0] 9403 v_1 := v.Args[1] 9404 if v_1.Op != OpS390XMOVBreg { 9405 break 9406 } 9407 x := v_1.Args[0] 9408 mem := v.Args[2] 9409 v.reset(OpS390XMOVBstore) 9410 v.AuxInt = off 9411 v.Aux = sym 9412 v.AddArg(ptr) 9413 v.AddArg(x) 9414 v.AddArg(mem) 9415 return true 9416 } 9417 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 9418 // cond: 9419 // result: (MOVBstore [off] {sym} ptr x mem) 9420 for { 9421 off := v.AuxInt 9422 sym := v.Aux 9423 _ = v.Args[2] 9424 ptr := v.Args[0] 9425 v_1 := v.Args[1] 9426 if v_1.Op != OpS390XMOVBZreg { 9427 break 9428 } 9429 x := v_1.Args[0] 9430 mem := v.Args[2] 9431 v.reset(OpS390XMOVBstore) 9432 v.AuxInt = off 9433 v.Aux = sym 9434 v.AddArg(ptr) 9435 v.AddArg(x) 9436 v.AddArg(mem) 9437 return true 9438 } 9439 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9440 // cond: is20Bit(off1+off2) 9441 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 9442 for { 9443 off1 := v.AuxInt 9444 sym := v.Aux 9445 _ = v.Args[2] 9446 v_0 := v.Args[0] 9447 if v_0.Op != OpS390XADDconst { 9448 break 9449 } 9450 off2 := v_0.AuxInt 9451 ptr := v_0.Args[0] 9452 val := v.Args[1] 9453 mem := v.Args[2] 9454 if !(is20Bit(off1 + off2)) { 9455 break 9456 } 9457 v.reset(OpS390XMOVBstore) 9458 v.AuxInt = off1 + off2 9459 v.Aux = sym 9460 v.AddArg(ptr) 9461 v.AddArg(val) 9462 v.AddArg(mem) 9463 return true 9464 } 9465 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 9466 // cond: is20Bit(off) && ptr.Op != OpSB 9467 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 9468 for { 9469 off := v.AuxInt 9470 sym := v.Aux 9471 _ = v.Args[2] 9472 ptr := v.Args[0] 9473 v_1 := v.Args[1] 9474 if v_1.Op != OpS390XMOVDconst { 9475 break 9476 } 9477 c := v_1.AuxInt 9478 mem := v.Args[2] 9479 if !(is20Bit(off) && ptr.Op != OpSB) { 9480 break 9481 } 9482 v.reset(OpS390XMOVBstoreconst) 9483 v.AuxInt = makeValAndOff(int64(int8(c)), off) 9484 v.Aux = sym 9485 v.AddArg(ptr) 9486 v.AddArg(mem) 9487 return true 9488 } 9489 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9490 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9491 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9492 for { 9493 off1 := v.AuxInt 9494 sym1 := v.Aux 9495 _ = v.Args[2] 9496 v_0 := v.Args[0] 9497 if v_0.Op != OpS390XMOVDaddr { 9498 break 9499 } 9500 off2 := v_0.AuxInt 9501 sym2 := v_0.Aux 9502 base := v_0.Args[0] 9503 val := v.Args[1] 9504 mem := v.Args[2] 9505 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9506 break 9507 } 9508 v.reset(OpS390XMOVBstore) 9509 v.AuxInt = off1 + off2 9510 v.Aux = mergeSym(sym1, sym2) 9511 v.AddArg(base) 9512 v.AddArg(val) 9513 v.AddArg(mem) 9514 return true 9515 } 9516 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9517 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9518 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9519 for { 9520 off1 := v.AuxInt 9521 sym1 := v.Aux 9522 _ = v.Args[2] 9523 v_0 := v.Args[0] 9524 if v_0.Op != OpS390XMOVDaddridx { 9525 break 9526 } 9527 off2 := v_0.AuxInt 9528 sym2 := v_0.Aux 9529 _ = v_0.Args[1] 9530 ptr := v_0.Args[0] 9531 idx := v_0.Args[1] 9532 val := v.Args[1] 9533 mem := v.Args[2] 9534 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9535 break 9536 } 9537 v.reset(OpS390XMOVBstoreidx) 9538 v.AuxInt = off1 + off2 9539 v.Aux = mergeSym(sym1, sym2) 9540 v.AddArg(ptr) 9541 v.AddArg(idx) 9542 v.AddArg(val) 9543 v.AddArg(mem) 9544 return true 9545 } 9546 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 9547 // cond: ptr.Op != OpSB 9548 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 9549 for { 9550 off := v.AuxInt 9551 sym := v.Aux 9552 _ = v.Args[2] 9553 v_0 := v.Args[0] 9554 if v_0.Op != OpS390XADD { 9555 break 9556 } 9557 _ = v_0.Args[1] 9558 ptr := v_0.Args[0] 9559 idx := v_0.Args[1] 9560 val := v.Args[1] 9561 mem := v.Args[2] 9562 if !(ptr.Op != OpSB) { 9563 break 9564 } 9565 v.reset(OpS390XMOVBstoreidx) 9566 v.AuxInt = off 9567 v.Aux = sym 9568 v.AddArg(ptr) 9569 v.AddArg(idx) 9570 v.AddArg(val) 9571 v.AddArg(mem) 9572 return true 9573 } 9574 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 9575 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9576 // result: (MOVHstore [i-1] {s} p w mem) 9577 for { 9578 i := v.AuxInt 9579 s := v.Aux 9580 _ = v.Args[2] 9581 p := v.Args[0] 9582 w := v.Args[1] 9583 x := v.Args[2] 9584 if x.Op != OpS390XMOVBstore { 9585 break 9586 } 9587 if x.AuxInt != i-1 { 9588 break 9589 } 9590 if x.Aux != s { 9591 break 9592 } 9593 _ = x.Args[2] 9594 if p != x.Args[0] { 9595 break 9596 } 9597 x_1 := x.Args[1] 9598 if x_1.Op != OpS390XSRDconst { 9599 break 9600 } 9601 if x_1.AuxInt != 8 { 9602 break 9603 } 9604 if w != x_1.Args[0] { 9605 break 9606 } 9607 mem := x.Args[2] 9608 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9609 break 9610 } 9611 v.reset(OpS390XMOVHstore) 9612 v.AuxInt = i - 1 9613 v.Aux = s 9614 v.AddArg(p) 9615 v.AddArg(w) 9616 v.AddArg(mem) 9617 return true 9618 } 9619 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 9620 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9621 // result: (MOVHstore [i-1] {s} p w0 mem) 9622 for { 9623 i := v.AuxInt 9624 s := v.Aux 9625 _ = v.Args[2] 9626 p := v.Args[0] 9627 w0 := v.Args[1] 9628 if w0.Op != OpS390XSRDconst { 9629 break 9630 } 9631 j := w0.AuxInt 9632 w := w0.Args[0] 9633 x := v.Args[2] 9634 if x.Op != OpS390XMOVBstore { 9635 break 9636 } 9637 if x.AuxInt != i-1 { 9638 break 9639 } 9640 if x.Aux != s { 9641 break 9642 } 9643 _ = x.Args[2] 9644 if p != x.Args[0] { 9645 break 9646 } 9647 x_1 := x.Args[1] 9648 if x_1.Op != OpS390XSRDconst { 9649 break 9650 } 9651 if x_1.AuxInt != j+8 { 9652 break 9653 } 9654 if w != x_1.Args[0] { 9655 break 9656 } 9657 mem := x.Args[2] 9658 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9659 break 9660 } 9661 v.reset(OpS390XMOVHstore) 9662 v.AuxInt = i - 1 9663 v.Aux = s 9664 v.AddArg(p) 9665 v.AddArg(w0) 9666 v.AddArg(mem) 9667 return true 9668 } 9669 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 9670 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9671 // result: (MOVHstore [i-1] {s} p w mem) 9672 for { 9673 i := v.AuxInt 9674 s := v.Aux 9675 _ = v.Args[2] 9676 p := v.Args[0] 9677 w := v.Args[1] 9678 x := v.Args[2] 9679 if x.Op != OpS390XMOVBstore { 9680 break 9681 } 9682 if x.AuxInt != i-1 { 9683 break 9684 } 9685 if x.Aux != s { 9686 break 9687 } 9688 _ = x.Args[2] 9689 if p != x.Args[0] { 9690 break 9691 } 9692 x_1 := x.Args[1] 9693 if x_1.Op != OpS390XSRWconst { 9694 break 9695 } 9696 if x_1.AuxInt != 8 { 9697 break 9698 } 9699 if w != x_1.Args[0] { 9700 break 9701 } 9702 mem := x.Args[2] 9703 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9704 break 9705 } 9706 v.reset(OpS390XMOVHstore) 9707 v.AuxInt = i - 1 9708 v.Aux = s 9709 v.AddArg(p) 9710 v.AddArg(w) 9711 v.AddArg(mem) 9712 return true 9713 } 9714 return false 9715 } 9716 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 9717 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 9718 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9719 // result: (MOVHstore [i-1] {s} p w0 mem) 9720 for { 9721 i := v.AuxInt 9722 s := v.Aux 9723 _ = v.Args[2] 9724 p := v.Args[0] 9725 w0 := v.Args[1] 9726 if w0.Op != OpS390XSRWconst { 9727 break 9728 } 9729 j := w0.AuxInt 9730 w := w0.Args[0] 9731 x := v.Args[2] 9732 if x.Op != OpS390XMOVBstore { 9733 break 9734 } 9735 if x.AuxInt != i-1 { 9736 break 9737 } 9738 if x.Aux != s { 9739 break 9740 } 9741 _ = x.Args[2] 9742 if p != x.Args[0] { 9743 break 9744 } 9745 x_1 := x.Args[1] 9746 if x_1.Op != OpS390XSRWconst { 9747 break 9748 } 9749 if x_1.AuxInt != j+8 { 9750 break 9751 } 9752 if w != x_1.Args[0] { 9753 break 9754 } 9755 mem := x.Args[2] 9756 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9757 break 9758 } 9759 v.reset(OpS390XMOVHstore) 9760 v.AuxInt = i - 1 9761 v.Aux = s 9762 v.AddArg(p) 9763 v.AddArg(w0) 9764 v.AddArg(mem) 9765 return true 9766 } 9767 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9768 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9769 // result: (MOVHBRstore [i-1] {s} p w mem) 9770 for { 9771 i := v.AuxInt 9772 s := v.Aux 9773 _ = v.Args[2] 9774 p := v.Args[0] 9775 v_1 := v.Args[1] 9776 if v_1.Op != OpS390XSRDconst { 9777 break 9778 } 9779 if v_1.AuxInt != 8 { 9780 break 9781 } 9782 w := v_1.Args[0] 9783 x := v.Args[2] 9784 if x.Op != OpS390XMOVBstore { 9785 break 9786 } 9787 if x.AuxInt != i-1 { 9788 break 9789 } 9790 if x.Aux != s { 9791 break 9792 } 9793 _ = x.Args[2] 9794 if p != x.Args[0] { 9795 break 9796 } 9797 if w != x.Args[1] { 9798 break 9799 } 9800 mem := x.Args[2] 9801 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9802 break 9803 } 9804 v.reset(OpS390XMOVHBRstore) 9805 v.AuxInt = i - 1 9806 v.Aux = s 9807 v.AddArg(p) 9808 v.AddArg(w) 9809 v.AddArg(mem) 9810 return true 9811 } 9812 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 9813 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9814 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9815 for { 9816 i := v.AuxInt 9817 s := v.Aux 9818 _ = v.Args[2] 9819 p := v.Args[0] 9820 v_1 := v.Args[1] 9821 if v_1.Op != OpS390XSRDconst { 9822 break 9823 } 9824 j := v_1.AuxInt 9825 w := v_1.Args[0] 9826 x := v.Args[2] 9827 if x.Op != OpS390XMOVBstore { 9828 break 9829 } 9830 if x.AuxInt != i-1 { 9831 break 9832 } 9833 if x.Aux != s { 9834 break 9835 } 9836 _ = x.Args[2] 9837 if p != x.Args[0] { 9838 break 9839 } 9840 w0 := x.Args[1] 9841 if w0.Op != OpS390XSRDconst { 9842 break 9843 } 9844 if w0.AuxInt != j-8 { 9845 break 9846 } 9847 if w != w0.Args[0] { 9848 break 9849 } 9850 mem := x.Args[2] 9851 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9852 break 9853 } 9854 v.reset(OpS390XMOVHBRstore) 9855 v.AuxInt = i - 1 9856 v.Aux = s 9857 v.AddArg(p) 9858 v.AddArg(w0) 9859 v.AddArg(mem) 9860 return true 9861 } 9862 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9863 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9864 // result: (MOVHBRstore [i-1] {s} p w mem) 9865 for { 9866 i := v.AuxInt 9867 s := v.Aux 9868 _ = v.Args[2] 9869 p := v.Args[0] 9870 v_1 := v.Args[1] 9871 if v_1.Op != OpS390XSRWconst { 9872 break 9873 } 9874 if v_1.AuxInt != 8 { 9875 break 9876 } 9877 w := v_1.Args[0] 9878 x := v.Args[2] 9879 if x.Op != OpS390XMOVBstore { 9880 break 9881 } 9882 if x.AuxInt != i-1 { 9883 break 9884 } 9885 if x.Aux != s { 9886 break 9887 } 9888 _ = x.Args[2] 9889 if p != x.Args[0] { 9890 break 9891 } 9892 if w != x.Args[1] { 9893 break 9894 } 9895 mem := x.Args[2] 9896 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9897 break 9898 } 9899 v.reset(OpS390XMOVHBRstore) 9900 v.AuxInt = i - 1 9901 v.Aux = s 9902 v.AddArg(p) 9903 v.AddArg(w) 9904 v.AddArg(mem) 9905 return true 9906 } 9907 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 9908 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9909 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9910 for { 9911 i := v.AuxInt 9912 s := v.Aux 9913 _ = v.Args[2] 9914 p := v.Args[0] 9915 v_1 := v.Args[1] 9916 if v_1.Op != OpS390XSRWconst { 9917 break 9918 } 9919 j := v_1.AuxInt 9920 w := v_1.Args[0] 9921 x := v.Args[2] 9922 if x.Op != OpS390XMOVBstore { 9923 break 9924 } 9925 if x.AuxInt != i-1 { 9926 break 9927 } 9928 if x.Aux != s { 9929 break 9930 } 9931 _ = x.Args[2] 9932 if p != x.Args[0] { 9933 break 9934 } 9935 w0 := x.Args[1] 9936 if w0.Op != OpS390XSRWconst { 9937 break 9938 } 9939 if w0.AuxInt != j-8 { 9940 break 9941 } 9942 if w != w0.Args[0] { 9943 break 9944 } 9945 mem := x.Args[2] 9946 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9947 break 9948 } 9949 v.reset(OpS390XMOVHBRstore) 9950 v.AuxInt = i - 1 9951 v.Aux = s 9952 v.AddArg(p) 9953 v.AddArg(w0) 9954 v.AddArg(mem) 9955 return true 9956 } 9957 return false 9958 } 9959 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 9960 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 9961 // cond: is20Bit(ValAndOff(sc).Off()+off) 9962 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 9963 for { 9964 sc := v.AuxInt 9965 s := v.Aux 9966 _ = v.Args[1] 9967 v_0 := v.Args[0] 9968 if v_0.Op != OpS390XADDconst { 9969 break 9970 } 9971 off := v_0.AuxInt 9972 ptr := v_0.Args[0] 9973 mem := v.Args[1] 9974 if !(is20Bit(ValAndOff(sc).Off() + off)) { 9975 break 9976 } 9977 v.reset(OpS390XMOVBstoreconst) 9978 v.AuxInt = ValAndOff(sc).add(off) 9979 v.Aux = s 9980 v.AddArg(ptr) 9981 v.AddArg(mem) 9982 return true 9983 } 9984 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 9985 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 9986 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 9987 for { 9988 sc := v.AuxInt 9989 sym1 := v.Aux 9990 _ = v.Args[1] 9991 v_0 := v.Args[0] 9992 if v_0.Op != OpS390XMOVDaddr { 9993 break 9994 } 9995 off := v_0.AuxInt 9996 sym2 := v_0.Aux 9997 ptr := v_0.Args[0] 9998 mem := v.Args[1] 9999 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 10000 break 10001 } 10002 v.reset(OpS390XMOVBstoreconst) 10003 v.AuxInt = ValAndOff(sc).add(off) 10004 v.Aux = mergeSym(sym1, sym2) 10005 v.AddArg(ptr) 10006 v.AddArg(mem) 10007 return true 10008 } 10009 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 10010 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 10011 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 10012 for { 10013 c := v.AuxInt 10014 s := v.Aux 10015 _ = v.Args[1] 10016 p := v.Args[0] 10017 x := v.Args[1] 10018 if x.Op != OpS390XMOVBstoreconst { 10019 break 10020 } 10021 a := x.AuxInt 10022 if x.Aux != s { 10023 break 10024 } 10025 _ = x.Args[1] 10026 if p != x.Args[0] { 10027 break 10028 } 10029 mem := x.Args[1] 10030 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 10031 break 10032 } 10033 v.reset(OpS390XMOVHstoreconst) 10034 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 10035 v.Aux = s 10036 v.AddArg(p) 10037 v.AddArg(mem) 10038 return true 10039 } 10040 return false 10041 } 10042 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 10043 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10044 // cond: 10045 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10046 for { 10047 c := v.AuxInt 10048 sym := v.Aux 10049 _ = v.Args[3] 10050 v_0 := v.Args[0] 10051 if v_0.Op != OpS390XADDconst { 10052 break 10053 } 10054 d := v_0.AuxInt 10055 ptr := v_0.Args[0] 10056 idx := v.Args[1] 10057 val := v.Args[2] 10058 mem := v.Args[3] 10059 v.reset(OpS390XMOVBstoreidx) 10060 v.AuxInt = c + d 10061 v.Aux = sym 10062 v.AddArg(ptr) 10063 v.AddArg(idx) 10064 v.AddArg(val) 10065 v.AddArg(mem) 10066 return true 10067 } 10068 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 10069 // cond: 10070 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10071 for { 10072 c := v.AuxInt 10073 sym := v.Aux 10074 _ = v.Args[3] 10075 idx := v.Args[0] 10076 v_1 := v.Args[1] 10077 if v_1.Op != OpS390XADDconst { 10078 break 10079 } 10080 d := v_1.AuxInt 10081 ptr := v_1.Args[0] 10082 val := v.Args[2] 10083 mem := v.Args[3] 10084 v.reset(OpS390XMOVBstoreidx) 10085 v.AuxInt = c + d 10086 v.Aux = sym 10087 v.AddArg(ptr) 10088 v.AddArg(idx) 10089 v.AddArg(val) 10090 v.AddArg(mem) 10091 return true 10092 } 10093 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10094 // cond: 10095 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10096 for { 10097 c := v.AuxInt 10098 sym := v.Aux 10099 _ = v.Args[3] 10100 ptr := v.Args[0] 10101 v_1 := v.Args[1] 10102 if v_1.Op != OpS390XADDconst { 10103 break 10104 } 10105 d := v_1.AuxInt 10106 idx := v_1.Args[0] 10107 val := v.Args[2] 10108 mem := v.Args[3] 10109 v.reset(OpS390XMOVBstoreidx) 10110 v.AuxInt = c + d 10111 v.Aux = sym 10112 v.AddArg(ptr) 10113 v.AddArg(idx) 10114 v.AddArg(val) 10115 v.AddArg(mem) 10116 return true 10117 } 10118 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 10119 // cond: 10120 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 10121 for { 10122 c := v.AuxInt 10123 sym := v.Aux 10124 _ = v.Args[3] 10125 v_0 := v.Args[0] 10126 if v_0.Op != OpS390XADDconst { 10127 break 10128 } 10129 d := v_0.AuxInt 10130 idx := v_0.Args[0] 10131 ptr := v.Args[1] 10132 val := v.Args[2] 10133 mem := v.Args[3] 10134 v.reset(OpS390XMOVBstoreidx) 10135 v.AuxInt = c + d 10136 v.Aux = sym 10137 v.AddArg(ptr) 10138 v.AddArg(idx) 10139 v.AddArg(val) 10140 v.AddArg(mem) 10141 return true 10142 } 10143 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10144 // cond: x.Uses == 1 && clobber(x) 10145 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10146 for { 10147 i := v.AuxInt 10148 s := v.Aux 10149 _ = v.Args[3] 10150 p := v.Args[0] 10151 idx := v.Args[1] 10152 w := v.Args[2] 10153 x := v.Args[3] 10154 if x.Op != OpS390XMOVBstoreidx { 10155 break 10156 } 10157 if x.AuxInt != i-1 { 10158 break 10159 } 10160 if x.Aux != s { 10161 break 10162 } 10163 _ = x.Args[3] 10164 if p != x.Args[0] { 10165 break 10166 } 10167 if idx != x.Args[1] { 10168 break 10169 } 10170 x_2 := x.Args[2] 10171 if x_2.Op != OpS390XSRDconst { 10172 break 10173 } 10174 if x_2.AuxInt != 8 { 10175 break 10176 } 10177 if w != x_2.Args[0] { 10178 break 10179 } 10180 mem := x.Args[3] 10181 if !(x.Uses == 1 && clobber(x)) { 10182 break 10183 } 10184 v.reset(OpS390XMOVHstoreidx) 10185 v.AuxInt = i - 1 10186 v.Aux = s 10187 v.AddArg(p) 10188 v.AddArg(idx) 10189 v.AddArg(w) 10190 v.AddArg(mem) 10191 return true 10192 } 10193 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10194 // cond: x.Uses == 1 && clobber(x) 10195 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10196 for { 10197 i := v.AuxInt 10198 s := v.Aux 10199 _ = v.Args[3] 10200 p := v.Args[0] 10201 idx := v.Args[1] 10202 w := v.Args[2] 10203 x := v.Args[3] 10204 if x.Op != OpS390XMOVBstoreidx { 10205 break 10206 } 10207 if x.AuxInt != i-1 { 10208 break 10209 } 10210 if x.Aux != s { 10211 break 10212 } 10213 _ = x.Args[3] 10214 if idx != x.Args[0] { 10215 break 10216 } 10217 if p != x.Args[1] { 10218 break 10219 } 10220 x_2 := x.Args[2] 10221 if x_2.Op != OpS390XSRDconst { 10222 break 10223 } 10224 if x_2.AuxInt != 8 { 10225 break 10226 } 10227 if w != x_2.Args[0] { 10228 break 10229 } 10230 mem := x.Args[3] 10231 if !(x.Uses == 1 && clobber(x)) { 10232 break 10233 } 10234 v.reset(OpS390XMOVHstoreidx) 10235 v.AuxInt = i - 1 10236 v.Aux = s 10237 v.AddArg(p) 10238 v.AddArg(idx) 10239 v.AddArg(w) 10240 v.AddArg(mem) 10241 return true 10242 } 10243 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 10244 // cond: x.Uses == 1 && clobber(x) 10245 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10246 for { 10247 i := v.AuxInt 10248 s := v.Aux 10249 _ = v.Args[3] 10250 idx := v.Args[0] 10251 p := v.Args[1] 10252 w := v.Args[2] 10253 x := v.Args[3] 10254 if x.Op != OpS390XMOVBstoreidx { 10255 break 10256 } 10257 if x.AuxInt != i-1 { 10258 break 10259 } 10260 if x.Aux != s { 10261 break 10262 } 10263 _ = x.Args[3] 10264 if p != x.Args[0] { 10265 break 10266 } 10267 if idx != x.Args[1] { 10268 break 10269 } 10270 x_2 := x.Args[2] 10271 if x_2.Op != OpS390XSRDconst { 10272 break 10273 } 10274 if x_2.AuxInt != 8 { 10275 break 10276 } 10277 if w != x_2.Args[0] { 10278 break 10279 } 10280 mem := x.Args[3] 10281 if !(x.Uses == 1 && clobber(x)) { 10282 break 10283 } 10284 v.reset(OpS390XMOVHstoreidx) 10285 v.AuxInt = i - 1 10286 v.Aux = s 10287 v.AddArg(p) 10288 v.AddArg(idx) 10289 v.AddArg(w) 10290 v.AddArg(mem) 10291 return true 10292 } 10293 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 10294 // cond: x.Uses == 1 && clobber(x) 10295 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10296 for { 10297 i := v.AuxInt 10298 s := v.Aux 10299 _ = v.Args[3] 10300 idx := v.Args[0] 10301 p := v.Args[1] 10302 w := v.Args[2] 10303 x := v.Args[3] 10304 if x.Op != OpS390XMOVBstoreidx { 10305 break 10306 } 10307 if x.AuxInt != i-1 { 10308 break 10309 } 10310 if x.Aux != s { 10311 break 10312 } 10313 _ = x.Args[3] 10314 if idx != x.Args[0] { 10315 break 10316 } 10317 if p != x.Args[1] { 10318 break 10319 } 10320 x_2 := x.Args[2] 10321 if x_2.Op != OpS390XSRDconst { 10322 break 10323 } 10324 if x_2.AuxInt != 8 { 10325 break 10326 } 10327 if w != x_2.Args[0] { 10328 break 10329 } 10330 mem := x.Args[3] 10331 if !(x.Uses == 1 && clobber(x)) { 10332 break 10333 } 10334 v.reset(OpS390XMOVHstoreidx) 10335 v.AuxInt = i - 1 10336 v.Aux = s 10337 v.AddArg(p) 10338 v.AddArg(idx) 10339 v.AddArg(w) 10340 v.AddArg(mem) 10341 return true 10342 } 10343 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10344 // cond: x.Uses == 1 && clobber(x) 10345 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10346 for { 10347 i := v.AuxInt 10348 s := v.Aux 10349 _ = v.Args[3] 10350 p := v.Args[0] 10351 idx := v.Args[1] 10352 w0 := v.Args[2] 10353 if w0.Op != OpS390XSRDconst { 10354 break 10355 } 10356 j := w0.AuxInt 10357 w := w0.Args[0] 10358 x := v.Args[3] 10359 if x.Op != OpS390XMOVBstoreidx { 10360 break 10361 } 10362 if x.AuxInt != i-1 { 10363 break 10364 } 10365 if x.Aux != s { 10366 break 10367 } 10368 _ = x.Args[3] 10369 if p != x.Args[0] { 10370 break 10371 } 10372 if idx != x.Args[1] { 10373 break 10374 } 10375 x_2 := x.Args[2] 10376 if x_2.Op != OpS390XSRDconst { 10377 break 10378 } 10379 if x_2.AuxInt != j+8 { 10380 break 10381 } 10382 if w != x_2.Args[0] { 10383 break 10384 } 10385 mem := x.Args[3] 10386 if !(x.Uses == 1 && clobber(x)) { 10387 break 10388 } 10389 v.reset(OpS390XMOVHstoreidx) 10390 v.AuxInt = i - 1 10391 v.Aux = s 10392 v.AddArg(p) 10393 v.AddArg(idx) 10394 v.AddArg(w0) 10395 v.AddArg(mem) 10396 return true 10397 } 10398 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10399 // cond: x.Uses == 1 && clobber(x) 10400 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10401 for { 10402 i := v.AuxInt 10403 s := v.Aux 10404 _ = v.Args[3] 10405 p := v.Args[0] 10406 idx := v.Args[1] 10407 w0 := v.Args[2] 10408 if w0.Op != OpS390XSRDconst { 10409 break 10410 } 10411 j := w0.AuxInt 10412 w := w0.Args[0] 10413 x := v.Args[3] 10414 if x.Op != OpS390XMOVBstoreidx { 10415 break 10416 } 10417 if x.AuxInt != i-1 { 10418 break 10419 } 10420 if x.Aux != s { 10421 break 10422 } 10423 _ = x.Args[3] 10424 if idx != x.Args[0] { 10425 break 10426 } 10427 if p != x.Args[1] { 10428 break 10429 } 10430 x_2 := x.Args[2] 10431 if x_2.Op != OpS390XSRDconst { 10432 break 10433 } 10434 if x_2.AuxInt != j+8 { 10435 break 10436 } 10437 if w != x_2.Args[0] { 10438 break 10439 } 10440 mem := x.Args[3] 10441 if !(x.Uses == 1 && clobber(x)) { 10442 break 10443 } 10444 v.reset(OpS390XMOVHstoreidx) 10445 v.AuxInt = i - 1 10446 v.Aux = s 10447 v.AddArg(p) 10448 v.AddArg(idx) 10449 v.AddArg(w0) 10450 v.AddArg(mem) 10451 return true 10452 } 10453 return false 10454 } 10455 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 10456 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10457 // cond: x.Uses == 1 && clobber(x) 10458 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10459 for { 10460 i := v.AuxInt 10461 s := v.Aux 10462 _ = v.Args[3] 10463 idx := v.Args[0] 10464 p := v.Args[1] 10465 w0 := v.Args[2] 10466 if w0.Op != OpS390XSRDconst { 10467 break 10468 } 10469 j := w0.AuxInt 10470 w := w0.Args[0] 10471 x := v.Args[3] 10472 if x.Op != OpS390XMOVBstoreidx { 10473 break 10474 } 10475 if x.AuxInt != i-1 { 10476 break 10477 } 10478 if x.Aux != s { 10479 break 10480 } 10481 _ = x.Args[3] 10482 if p != x.Args[0] { 10483 break 10484 } 10485 if idx != x.Args[1] { 10486 break 10487 } 10488 x_2 := x.Args[2] 10489 if x_2.Op != OpS390XSRDconst { 10490 break 10491 } 10492 if x_2.AuxInt != j+8 { 10493 break 10494 } 10495 if w != x_2.Args[0] { 10496 break 10497 } 10498 mem := x.Args[3] 10499 if !(x.Uses == 1 && clobber(x)) { 10500 break 10501 } 10502 v.reset(OpS390XMOVHstoreidx) 10503 v.AuxInt = i - 1 10504 v.Aux = s 10505 v.AddArg(p) 10506 v.AddArg(idx) 10507 v.AddArg(w0) 10508 v.AddArg(mem) 10509 return true 10510 } 10511 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10512 // cond: x.Uses == 1 && clobber(x) 10513 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10514 for { 10515 i := v.AuxInt 10516 s := v.Aux 10517 _ = v.Args[3] 10518 idx := v.Args[0] 10519 p := v.Args[1] 10520 w0 := v.Args[2] 10521 if w0.Op != OpS390XSRDconst { 10522 break 10523 } 10524 j := w0.AuxInt 10525 w := w0.Args[0] 10526 x := v.Args[3] 10527 if x.Op != OpS390XMOVBstoreidx { 10528 break 10529 } 10530 if x.AuxInt != i-1 { 10531 break 10532 } 10533 if x.Aux != s { 10534 break 10535 } 10536 _ = x.Args[3] 10537 if idx != x.Args[0] { 10538 break 10539 } 10540 if p != x.Args[1] { 10541 break 10542 } 10543 x_2 := x.Args[2] 10544 if x_2.Op != OpS390XSRDconst { 10545 break 10546 } 10547 if x_2.AuxInt != j+8 { 10548 break 10549 } 10550 if w != x_2.Args[0] { 10551 break 10552 } 10553 mem := x.Args[3] 10554 if !(x.Uses == 1 && clobber(x)) { 10555 break 10556 } 10557 v.reset(OpS390XMOVHstoreidx) 10558 v.AuxInt = i - 1 10559 v.Aux = s 10560 v.AddArg(p) 10561 v.AddArg(idx) 10562 v.AddArg(w0) 10563 v.AddArg(mem) 10564 return true 10565 } 10566 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10567 // cond: x.Uses == 1 && clobber(x) 10568 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10569 for { 10570 i := v.AuxInt 10571 s := v.Aux 10572 _ = v.Args[3] 10573 p := v.Args[0] 10574 idx := v.Args[1] 10575 w := v.Args[2] 10576 x := v.Args[3] 10577 if x.Op != OpS390XMOVBstoreidx { 10578 break 10579 } 10580 if x.AuxInt != i-1 { 10581 break 10582 } 10583 if x.Aux != s { 10584 break 10585 } 10586 _ = x.Args[3] 10587 if p != x.Args[0] { 10588 break 10589 } 10590 if idx != x.Args[1] { 10591 break 10592 } 10593 x_2 := x.Args[2] 10594 if x_2.Op != OpS390XSRWconst { 10595 break 10596 } 10597 if x_2.AuxInt != 8 { 10598 break 10599 } 10600 if w != x_2.Args[0] { 10601 break 10602 } 10603 mem := x.Args[3] 10604 if !(x.Uses == 1 && clobber(x)) { 10605 break 10606 } 10607 v.reset(OpS390XMOVHstoreidx) 10608 v.AuxInt = i - 1 10609 v.Aux = s 10610 v.AddArg(p) 10611 v.AddArg(idx) 10612 v.AddArg(w) 10613 v.AddArg(mem) 10614 return true 10615 } 10616 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10617 // cond: x.Uses == 1 && clobber(x) 10618 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10619 for { 10620 i := v.AuxInt 10621 s := v.Aux 10622 _ = v.Args[3] 10623 p := v.Args[0] 10624 idx := v.Args[1] 10625 w := v.Args[2] 10626 x := v.Args[3] 10627 if x.Op != OpS390XMOVBstoreidx { 10628 break 10629 } 10630 if x.AuxInt != i-1 { 10631 break 10632 } 10633 if x.Aux != s { 10634 break 10635 } 10636 _ = x.Args[3] 10637 if idx != x.Args[0] { 10638 break 10639 } 10640 if p != x.Args[1] { 10641 break 10642 } 10643 x_2 := x.Args[2] 10644 if x_2.Op != OpS390XSRWconst { 10645 break 10646 } 10647 if x_2.AuxInt != 8 { 10648 break 10649 } 10650 if w != x_2.Args[0] { 10651 break 10652 } 10653 mem := x.Args[3] 10654 if !(x.Uses == 1 && clobber(x)) { 10655 break 10656 } 10657 v.reset(OpS390XMOVHstoreidx) 10658 v.AuxInt = i - 1 10659 v.Aux = s 10660 v.AddArg(p) 10661 v.AddArg(idx) 10662 v.AddArg(w) 10663 v.AddArg(mem) 10664 return true 10665 } 10666 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10667 // cond: x.Uses == 1 && clobber(x) 10668 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10669 for { 10670 i := v.AuxInt 10671 s := v.Aux 10672 _ = v.Args[3] 10673 idx := v.Args[0] 10674 p := v.Args[1] 10675 w := v.Args[2] 10676 x := v.Args[3] 10677 if x.Op != OpS390XMOVBstoreidx { 10678 break 10679 } 10680 if x.AuxInt != i-1 { 10681 break 10682 } 10683 if x.Aux != s { 10684 break 10685 } 10686 _ = x.Args[3] 10687 if p != x.Args[0] { 10688 break 10689 } 10690 if idx != x.Args[1] { 10691 break 10692 } 10693 x_2 := x.Args[2] 10694 if x_2.Op != OpS390XSRWconst { 10695 break 10696 } 10697 if x_2.AuxInt != 8 { 10698 break 10699 } 10700 if w != x_2.Args[0] { 10701 break 10702 } 10703 mem := x.Args[3] 10704 if !(x.Uses == 1 && clobber(x)) { 10705 break 10706 } 10707 v.reset(OpS390XMOVHstoreidx) 10708 v.AuxInt = i - 1 10709 v.Aux = s 10710 v.AddArg(p) 10711 v.AddArg(idx) 10712 v.AddArg(w) 10713 v.AddArg(mem) 10714 return true 10715 } 10716 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10717 // cond: x.Uses == 1 && clobber(x) 10718 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10719 for { 10720 i := v.AuxInt 10721 s := v.Aux 10722 _ = v.Args[3] 10723 idx := v.Args[0] 10724 p := v.Args[1] 10725 w := v.Args[2] 10726 x := v.Args[3] 10727 if x.Op != OpS390XMOVBstoreidx { 10728 break 10729 } 10730 if x.AuxInt != i-1 { 10731 break 10732 } 10733 if x.Aux != s { 10734 break 10735 } 10736 _ = x.Args[3] 10737 if idx != x.Args[0] { 10738 break 10739 } 10740 if p != x.Args[1] { 10741 break 10742 } 10743 x_2 := x.Args[2] 10744 if x_2.Op != OpS390XSRWconst { 10745 break 10746 } 10747 if x_2.AuxInt != 8 { 10748 break 10749 } 10750 if w != x_2.Args[0] { 10751 break 10752 } 10753 mem := x.Args[3] 10754 if !(x.Uses == 1 && clobber(x)) { 10755 break 10756 } 10757 v.reset(OpS390XMOVHstoreidx) 10758 v.AuxInt = i - 1 10759 v.Aux = s 10760 v.AddArg(p) 10761 v.AddArg(idx) 10762 v.AddArg(w) 10763 v.AddArg(mem) 10764 return true 10765 } 10766 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10767 // cond: x.Uses == 1 && clobber(x) 10768 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10769 for { 10770 i := v.AuxInt 10771 s := v.Aux 10772 _ = v.Args[3] 10773 p := v.Args[0] 10774 idx := v.Args[1] 10775 w0 := v.Args[2] 10776 if w0.Op != OpS390XSRWconst { 10777 break 10778 } 10779 j := w0.AuxInt 10780 w := w0.Args[0] 10781 x := v.Args[3] 10782 if x.Op != OpS390XMOVBstoreidx { 10783 break 10784 } 10785 if x.AuxInt != i-1 { 10786 break 10787 } 10788 if x.Aux != s { 10789 break 10790 } 10791 _ = x.Args[3] 10792 if p != x.Args[0] { 10793 break 10794 } 10795 if idx != x.Args[1] { 10796 break 10797 } 10798 x_2 := x.Args[2] 10799 if x_2.Op != OpS390XSRWconst { 10800 break 10801 } 10802 if x_2.AuxInt != j+8 { 10803 break 10804 } 10805 if w != x_2.Args[0] { 10806 break 10807 } 10808 mem := x.Args[3] 10809 if !(x.Uses == 1 && clobber(x)) { 10810 break 10811 } 10812 v.reset(OpS390XMOVHstoreidx) 10813 v.AuxInt = i - 1 10814 v.Aux = s 10815 v.AddArg(p) 10816 v.AddArg(idx) 10817 v.AddArg(w0) 10818 v.AddArg(mem) 10819 return true 10820 } 10821 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10822 // cond: x.Uses == 1 && clobber(x) 10823 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10824 for { 10825 i := v.AuxInt 10826 s := v.Aux 10827 _ = v.Args[3] 10828 p := v.Args[0] 10829 idx := v.Args[1] 10830 w0 := v.Args[2] 10831 if w0.Op != OpS390XSRWconst { 10832 break 10833 } 10834 j := w0.AuxInt 10835 w := w0.Args[0] 10836 x := v.Args[3] 10837 if x.Op != OpS390XMOVBstoreidx { 10838 break 10839 } 10840 if x.AuxInt != i-1 { 10841 break 10842 } 10843 if x.Aux != s { 10844 break 10845 } 10846 _ = x.Args[3] 10847 if idx != x.Args[0] { 10848 break 10849 } 10850 if p != x.Args[1] { 10851 break 10852 } 10853 x_2 := x.Args[2] 10854 if x_2.Op != OpS390XSRWconst { 10855 break 10856 } 10857 if x_2.AuxInt != j+8 { 10858 break 10859 } 10860 if w != x_2.Args[0] { 10861 break 10862 } 10863 mem := x.Args[3] 10864 if !(x.Uses == 1 && clobber(x)) { 10865 break 10866 } 10867 v.reset(OpS390XMOVHstoreidx) 10868 v.AuxInt = i - 1 10869 v.Aux = s 10870 v.AddArg(p) 10871 v.AddArg(idx) 10872 v.AddArg(w0) 10873 v.AddArg(mem) 10874 return true 10875 } 10876 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10877 // cond: x.Uses == 1 && clobber(x) 10878 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10879 for { 10880 i := v.AuxInt 10881 s := v.Aux 10882 _ = v.Args[3] 10883 idx := v.Args[0] 10884 p := v.Args[1] 10885 w0 := v.Args[2] 10886 if w0.Op != OpS390XSRWconst { 10887 break 10888 } 10889 j := w0.AuxInt 10890 w := w0.Args[0] 10891 x := v.Args[3] 10892 if x.Op != OpS390XMOVBstoreidx { 10893 break 10894 } 10895 if x.AuxInt != i-1 { 10896 break 10897 } 10898 if x.Aux != s { 10899 break 10900 } 10901 _ = x.Args[3] 10902 if p != x.Args[0] { 10903 break 10904 } 10905 if idx != x.Args[1] { 10906 break 10907 } 10908 x_2 := x.Args[2] 10909 if x_2.Op != OpS390XSRWconst { 10910 break 10911 } 10912 if x_2.AuxInt != j+8 { 10913 break 10914 } 10915 if w != x_2.Args[0] { 10916 break 10917 } 10918 mem := x.Args[3] 10919 if !(x.Uses == 1 && clobber(x)) { 10920 break 10921 } 10922 v.reset(OpS390XMOVHstoreidx) 10923 v.AuxInt = i - 1 10924 v.Aux = s 10925 v.AddArg(p) 10926 v.AddArg(idx) 10927 v.AddArg(w0) 10928 v.AddArg(mem) 10929 return true 10930 } 10931 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10932 // cond: x.Uses == 1 && clobber(x) 10933 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10934 for { 10935 i := v.AuxInt 10936 s := v.Aux 10937 _ = v.Args[3] 10938 idx := v.Args[0] 10939 p := v.Args[1] 10940 w0 := v.Args[2] 10941 if w0.Op != OpS390XSRWconst { 10942 break 10943 } 10944 j := w0.AuxInt 10945 w := w0.Args[0] 10946 x := v.Args[3] 10947 if x.Op != OpS390XMOVBstoreidx { 10948 break 10949 } 10950 if x.AuxInt != i-1 { 10951 break 10952 } 10953 if x.Aux != s { 10954 break 10955 } 10956 _ = x.Args[3] 10957 if idx != x.Args[0] { 10958 break 10959 } 10960 if p != x.Args[1] { 10961 break 10962 } 10963 x_2 := x.Args[2] 10964 if x_2.Op != OpS390XSRWconst { 10965 break 10966 } 10967 if x_2.AuxInt != j+8 { 10968 break 10969 } 10970 if w != x_2.Args[0] { 10971 break 10972 } 10973 mem := x.Args[3] 10974 if !(x.Uses == 1 && clobber(x)) { 10975 break 10976 } 10977 v.reset(OpS390XMOVHstoreidx) 10978 v.AuxInt = i - 1 10979 v.Aux = s 10980 v.AddArg(p) 10981 v.AddArg(idx) 10982 v.AddArg(w0) 10983 v.AddArg(mem) 10984 return true 10985 } 10986 return false 10987 } 10988 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 10989 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10990 // cond: x.Uses == 1 && clobber(x) 10991 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10992 for { 10993 i := v.AuxInt 10994 s := v.Aux 10995 _ = v.Args[3] 10996 p := v.Args[0] 10997 idx := v.Args[1] 10998 v_2 := v.Args[2] 10999 if v_2.Op != OpS390XSRDconst { 11000 break 11001 } 11002 if v_2.AuxInt != 8 { 11003 break 11004 } 11005 w := v_2.Args[0] 11006 x := v.Args[3] 11007 if x.Op != OpS390XMOVBstoreidx { 11008 break 11009 } 11010 if x.AuxInt != i-1 { 11011 break 11012 } 11013 if x.Aux != s { 11014 break 11015 } 11016 _ = x.Args[3] 11017 if p != x.Args[0] { 11018 break 11019 } 11020 if idx != x.Args[1] { 11021 break 11022 } 11023 if w != x.Args[2] { 11024 break 11025 } 11026 mem := x.Args[3] 11027 if !(x.Uses == 1 && clobber(x)) { 11028 break 11029 } 11030 v.reset(OpS390XMOVHBRstoreidx) 11031 v.AuxInt = i - 1 11032 v.Aux = s 11033 v.AddArg(p) 11034 v.AddArg(idx) 11035 v.AddArg(w) 11036 v.AddArg(mem) 11037 return true 11038 } 11039 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11040 // cond: x.Uses == 1 && clobber(x) 11041 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11042 for { 11043 i := v.AuxInt 11044 s := v.Aux 11045 _ = v.Args[3] 11046 p := v.Args[0] 11047 idx := v.Args[1] 11048 v_2 := v.Args[2] 11049 if v_2.Op != OpS390XSRDconst { 11050 break 11051 } 11052 if v_2.AuxInt != 8 { 11053 break 11054 } 11055 w := v_2.Args[0] 11056 x := v.Args[3] 11057 if x.Op != OpS390XMOVBstoreidx { 11058 break 11059 } 11060 if x.AuxInt != i-1 { 11061 break 11062 } 11063 if x.Aux != s { 11064 break 11065 } 11066 _ = x.Args[3] 11067 if idx != x.Args[0] { 11068 break 11069 } 11070 if p != x.Args[1] { 11071 break 11072 } 11073 if w != x.Args[2] { 11074 break 11075 } 11076 mem := x.Args[3] 11077 if !(x.Uses == 1 && clobber(x)) { 11078 break 11079 } 11080 v.reset(OpS390XMOVHBRstoreidx) 11081 v.AuxInt = i - 1 11082 v.Aux = s 11083 v.AddArg(p) 11084 v.AddArg(idx) 11085 v.AddArg(w) 11086 v.AddArg(mem) 11087 return true 11088 } 11089 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11090 // cond: x.Uses == 1 && clobber(x) 11091 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11092 for { 11093 i := v.AuxInt 11094 s := v.Aux 11095 _ = v.Args[3] 11096 idx := v.Args[0] 11097 p := v.Args[1] 11098 v_2 := v.Args[2] 11099 if v_2.Op != OpS390XSRDconst { 11100 break 11101 } 11102 if v_2.AuxInt != 8 { 11103 break 11104 } 11105 w := v_2.Args[0] 11106 x := v.Args[3] 11107 if x.Op != OpS390XMOVBstoreidx { 11108 break 11109 } 11110 if x.AuxInt != i-1 { 11111 break 11112 } 11113 if x.Aux != s { 11114 break 11115 } 11116 _ = x.Args[3] 11117 if p != x.Args[0] { 11118 break 11119 } 11120 if idx != x.Args[1] { 11121 break 11122 } 11123 if w != x.Args[2] { 11124 break 11125 } 11126 mem := x.Args[3] 11127 if !(x.Uses == 1 && clobber(x)) { 11128 break 11129 } 11130 v.reset(OpS390XMOVHBRstoreidx) 11131 v.AuxInt = i - 1 11132 v.Aux = s 11133 v.AddArg(p) 11134 v.AddArg(idx) 11135 v.AddArg(w) 11136 v.AddArg(mem) 11137 return true 11138 } 11139 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11140 // cond: x.Uses == 1 && clobber(x) 11141 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11142 for { 11143 i := v.AuxInt 11144 s := v.Aux 11145 _ = v.Args[3] 11146 idx := v.Args[0] 11147 p := v.Args[1] 11148 v_2 := v.Args[2] 11149 if v_2.Op != OpS390XSRDconst { 11150 break 11151 } 11152 if v_2.AuxInt != 8 { 11153 break 11154 } 11155 w := v_2.Args[0] 11156 x := v.Args[3] 11157 if x.Op != OpS390XMOVBstoreidx { 11158 break 11159 } 11160 if x.AuxInt != i-1 { 11161 break 11162 } 11163 if x.Aux != s { 11164 break 11165 } 11166 _ = x.Args[3] 11167 if idx != x.Args[0] { 11168 break 11169 } 11170 if p != x.Args[1] { 11171 break 11172 } 11173 if w != x.Args[2] { 11174 break 11175 } 11176 mem := x.Args[3] 11177 if !(x.Uses == 1 && clobber(x)) { 11178 break 11179 } 11180 v.reset(OpS390XMOVHBRstoreidx) 11181 v.AuxInt = i - 1 11182 v.Aux = s 11183 v.AddArg(p) 11184 v.AddArg(idx) 11185 v.AddArg(w) 11186 v.AddArg(mem) 11187 return true 11188 } 11189 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 11190 // cond: x.Uses == 1 && clobber(x) 11191 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11192 for { 11193 i := v.AuxInt 11194 s := v.Aux 11195 _ = v.Args[3] 11196 p := v.Args[0] 11197 idx := v.Args[1] 11198 v_2 := v.Args[2] 11199 if v_2.Op != OpS390XSRDconst { 11200 break 11201 } 11202 j := v_2.AuxInt 11203 w := v_2.Args[0] 11204 x := v.Args[3] 11205 if x.Op != OpS390XMOVBstoreidx { 11206 break 11207 } 11208 if x.AuxInt != i-1 { 11209 break 11210 } 11211 if x.Aux != s { 11212 break 11213 } 11214 _ = x.Args[3] 11215 if p != x.Args[0] { 11216 break 11217 } 11218 if idx != x.Args[1] { 11219 break 11220 } 11221 w0 := x.Args[2] 11222 if w0.Op != OpS390XSRDconst { 11223 break 11224 } 11225 if w0.AuxInt != j-8 { 11226 break 11227 } 11228 if w != w0.Args[0] { 11229 break 11230 } 11231 mem := x.Args[3] 11232 if !(x.Uses == 1 && clobber(x)) { 11233 break 11234 } 11235 v.reset(OpS390XMOVHBRstoreidx) 11236 v.AuxInt = i - 1 11237 v.Aux = s 11238 v.AddArg(p) 11239 v.AddArg(idx) 11240 v.AddArg(w0) 11241 v.AddArg(mem) 11242 return true 11243 } 11244 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 11245 // cond: x.Uses == 1 && clobber(x) 11246 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11247 for { 11248 i := v.AuxInt 11249 s := v.Aux 11250 _ = v.Args[3] 11251 p := v.Args[0] 11252 idx := v.Args[1] 11253 v_2 := v.Args[2] 11254 if v_2.Op != OpS390XSRDconst { 11255 break 11256 } 11257 j := v_2.AuxInt 11258 w := v_2.Args[0] 11259 x := v.Args[3] 11260 if x.Op != OpS390XMOVBstoreidx { 11261 break 11262 } 11263 if x.AuxInt != i-1 { 11264 break 11265 } 11266 if x.Aux != s { 11267 break 11268 } 11269 _ = x.Args[3] 11270 if idx != x.Args[0] { 11271 break 11272 } 11273 if p != x.Args[1] { 11274 break 11275 } 11276 w0 := x.Args[2] 11277 if w0.Op != OpS390XSRDconst { 11278 break 11279 } 11280 if w0.AuxInt != j-8 { 11281 break 11282 } 11283 if w != w0.Args[0] { 11284 break 11285 } 11286 mem := x.Args[3] 11287 if !(x.Uses == 1 && clobber(x)) { 11288 break 11289 } 11290 v.reset(OpS390XMOVHBRstoreidx) 11291 v.AuxInt = i - 1 11292 v.Aux = s 11293 v.AddArg(p) 11294 v.AddArg(idx) 11295 v.AddArg(w0) 11296 v.AddArg(mem) 11297 return true 11298 } 11299 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 11300 // cond: x.Uses == 1 && clobber(x) 11301 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11302 for { 11303 i := v.AuxInt 11304 s := v.Aux 11305 _ = v.Args[3] 11306 idx := v.Args[0] 11307 p := v.Args[1] 11308 v_2 := v.Args[2] 11309 if v_2.Op != OpS390XSRDconst { 11310 break 11311 } 11312 j := v_2.AuxInt 11313 w := v_2.Args[0] 11314 x := v.Args[3] 11315 if x.Op != OpS390XMOVBstoreidx { 11316 break 11317 } 11318 if x.AuxInt != i-1 { 11319 break 11320 } 11321 if x.Aux != s { 11322 break 11323 } 11324 _ = x.Args[3] 11325 if p != x.Args[0] { 11326 break 11327 } 11328 if idx != x.Args[1] { 11329 break 11330 } 11331 w0 := x.Args[2] 11332 if w0.Op != OpS390XSRDconst { 11333 break 11334 } 11335 if w0.AuxInt != j-8 { 11336 break 11337 } 11338 if w != w0.Args[0] { 11339 break 11340 } 11341 mem := x.Args[3] 11342 if !(x.Uses == 1 && clobber(x)) { 11343 break 11344 } 11345 v.reset(OpS390XMOVHBRstoreidx) 11346 v.AuxInt = i - 1 11347 v.Aux = s 11348 v.AddArg(p) 11349 v.AddArg(idx) 11350 v.AddArg(w0) 11351 v.AddArg(mem) 11352 return true 11353 } 11354 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 11355 // cond: x.Uses == 1 && clobber(x) 11356 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11357 for { 11358 i := v.AuxInt 11359 s := v.Aux 11360 _ = v.Args[3] 11361 idx := v.Args[0] 11362 p := v.Args[1] 11363 v_2 := v.Args[2] 11364 if v_2.Op != OpS390XSRDconst { 11365 break 11366 } 11367 j := v_2.AuxInt 11368 w := v_2.Args[0] 11369 x := v.Args[3] 11370 if x.Op != OpS390XMOVBstoreidx { 11371 break 11372 } 11373 if x.AuxInt != i-1 { 11374 break 11375 } 11376 if x.Aux != s { 11377 break 11378 } 11379 _ = x.Args[3] 11380 if idx != x.Args[0] { 11381 break 11382 } 11383 if p != x.Args[1] { 11384 break 11385 } 11386 w0 := x.Args[2] 11387 if w0.Op != OpS390XSRDconst { 11388 break 11389 } 11390 if w0.AuxInt != j-8 { 11391 break 11392 } 11393 if w != w0.Args[0] { 11394 break 11395 } 11396 mem := x.Args[3] 11397 if !(x.Uses == 1 && clobber(x)) { 11398 break 11399 } 11400 v.reset(OpS390XMOVHBRstoreidx) 11401 v.AuxInt = i - 1 11402 v.Aux = s 11403 v.AddArg(p) 11404 v.AddArg(idx) 11405 v.AddArg(w0) 11406 v.AddArg(mem) 11407 return true 11408 } 11409 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11410 // cond: x.Uses == 1 && clobber(x) 11411 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11412 for { 11413 i := v.AuxInt 11414 s := v.Aux 11415 _ = v.Args[3] 11416 p := v.Args[0] 11417 idx := v.Args[1] 11418 v_2 := v.Args[2] 11419 if v_2.Op != OpS390XSRWconst { 11420 break 11421 } 11422 if v_2.AuxInt != 8 { 11423 break 11424 } 11425 w := v_2.Args[0] 11426 x := v.Args[3] 11427 if x.Op != OpS390XMOVBstoreidx { 11428 break 11429 } 11430 if x.AuxInt != i-1 { 11431 break 11432 } 11433 if x.Aux != s { 11434 break 11435 } 11436 _ = x.Args[3] 11437 if p != x.Args[0] { 11438 break 11439 } 11440 if idx != x.Args[1] { 11441 break 11442 } 11443 if w != x.Args[2] { 11444 break 11445 } 11446 mem := x.Args[3] 11447 if !(x.Uses == 1 && clobber(x)) { 11448 break 11449 } 11450 v.reset(OpS390XMOVHBRstoreidx) 11451 v.AuxInt = i - 1 11452 v.Aux = s 11453 v.AddArg(p) 11454 v.AddArg(idx) 11455 v.AddArg(w) 11456 v.AddArg(mem) 11457 return true 11458 } 11459 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11460 // cond: x.Uses == 1 && clobber(x) 11461 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11462 for { 11463 i := v.AuxInt 11464 s := v.Aux 11465 _ = v.Args[3] 11466 p := v.Args[0] 11467 idx := v.Args[1] 11468 v_2 := v.Args[2] 11469 if v_2.Op != OpS390XSRWconst { 11470 break 11471 } 11472 if v_2.AuxInt != 8 { 11473 break 11474 } 11475 w := v_2.Args[0] 11476 x := v.Args[3] 11477 if x.Op != OpS390XMOVBstoreidx { 11478 break 11479 } 11480 if x.AuxInt != i-1 { 11481 break 11482 } 11483 if x.Aux != s { 11484 break 11485 } 11486 _ = x.Args[3] 11487 if idx != x.Args[0] { 11488 break 11489 } 11490 if p != x.Args[1] { 11491 break 11492 } 11493 if w != x.Args[2] { 11494 break 11495 } 11496 mem := x.Args[3] 11497 if !(x.Uses == 1 && clobber(x)) { 11498 break 11499 } 11500 v.reset(OpS390XMOVHBRstoreidx) 11501 v.AuxInt = i - 1 11502 v.Aux = s 11503 v.AddArg(p) 11504 v.AddArg(idx) 11505 v.AddArg(w) 11506 v.AddArg(mem) 11507 return true 11508 } 11509 return false 11510 } 11511 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 11512 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11513 // cond: x.Uses == 1 && clobber(x) 11514 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11515 for { 11516 i := v.AuxInt 11517 s := v.Aux 11518 _ = v.Args[3] 11519 idx := v.Args[0] 11520 p := v.Args[1] 11521 v_2 := v.Args[2] 11522 if v_2.Op != OpS390XSRWconst { 11523 break 11524 } 11525 if v_2.AuxInt != 8 { 11526 break 11527 } 11528 w := v_2.Args[0] 11529 x := v.Args[3] 11530 if x.Op != OpS390XMOVBstoreidx { 11531 break 11532 } 11533 if x.AuxInt != i-1 { 11534 break 11535 } 11536 if x.Aux != s { 11537 break 11538 } 11539 _ = x.Args[3] 11540 if p != x.Args[0] { 11541 break 11542 } 11543 if idx != x.Args[1] { 11544 break 11545 } 11546 if w != x.Args[2] { 11547 break 11548 } 11549 mem := x.Args[3] 11550 if !(x.Uses == 1 && clobber(x)) { 11551 break 11552 } 11553 v.reset(OpS390XMOVHBRstoreidx) 11554 v.AuxInt = i - 1 11555 v.Aux = s 11556 v.AddArg(p) 11557 v.AddArg(idx) 11558 v.AddArg(w) 11559 v.AddArg(mem) 11560 return true 11561 } 11562 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11563 // cond: x.Uses == 1 && clobber(x) 11564 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11565 for { 11566 i := v.AuxInt 11567 s := v.Aux 11568 _ = v.Args[3] 11569 idx := v.Args[0] 11570 p := v.Args[1] 11571 v_2 := v.Args[2] 11572 if v_2.Op != OpS390XSRWconst { 11573 break 11574 } 11575 if v_2.AuxInt != 8 { 11576 break 11577 } 11578 w := v_2.Args[0] 11579 x := v.Args[3] 11580 if x.Op != OpS390XMOVBstoreidx { 11581 break 11582 } 11583 if x.AuxInt != i-1 { 11584 break 11585 } 11586 if x.Aux != s { 11587 break 11588 } 11589 _ = x.Args[3] 11590 if idx != x.Args[0] { 11591 break 11592 } 11593 if p != x.Args[1] { 11594 break 11595 } 11596 if w != x.Args[2] { 11597 break 11598 } 11599 mem := x.Args[3] 11600 if !(x.Uses == 1 && clobber(x)) { 11601 break 11602 } 11603 v.reset(OpS390XMOVHBRstoreidx) 11604 v.AuxInt = i - 1 11605 v.Aux = s 11606 v.AddArg(p) 11607 v.AddArg(idx) 11608 v.AddArg(w) 11609 v.AddArg(mem) 11610 return true 11611 } 11612 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11613 // cond: x.Uses == 1 && clobber(x) 11614 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11615 for { 11616 i := v.AuxInt 11617 s := v.Aux 11618 _ = v.Args[3] 11619 p := v.Args[0] 11620 idx := v.Args[1] 11621 v_2 := v.Args[2] 11622 if v_2.Op != OpS390XSRWconst { 11623 break 11624 } 11625 j := v_2.AuxInt 11626 w := v_2.Args[0] 11627 x := v.Args[3] 11628 if x.Op != OpS390XMOVBstoreidx { 11629 break 11630 } 11631 if x.AuxInt != i-1 { 11632 break 11633 } 11634 if x.Aux != s { 11635 break 11636 } 11637 _ = x.Args[3] 11638 if p != x.Args[0] { 11639 break 11640 } 11641 if idx != x.Args[1] { 11642 break 11643 } 11644 w0 := x.Args[2] 11645 if w0.Op != OpS390XSRWconst { 11646 break 11647 } 11648 if w0.AuxInt != j-8 { 11649 break 11650 } 11651 if w != w0.Args[0] { 11652 break 11653 } 11654 mem := x.Args[3] 11655 if !(x.Uses == 1 && clobber(x)) { 11656 break 11657 } 11658 v.reset(OpS390XMOVHBRstoreidx) 11659 v.AuxInt = i - 1 11660 v.Aux = s 11661 v.AddArg(p) 11662 v.AddArg(idx) 11663 v.AddArg(w0) 11664 v.AddArg(mem) 11665 return true 11666 } 11667 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11668 // cond: x.Uses == 1 && clobber(x) 11669 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11670 for { 11671 i := v.AuxInt 11672 s := v.Aux 11673 _ = v.Args[3] 11674 p := v.Args[0] 11675 idx := v.Args[1] 11676 v_2 := v.Args[2] 11677 if v_2.Op != OpS390XSRWconst { 11678 break 11679 } 11680 j := v_2.AuxInt 11681 w := v_2.Args[0] 11682 x := v.Args[3] 11683 if x.Op != OpS390XMOVBstoreidx { 11684 break 11685 } 11686 if x.AuxInt != i-1 { 11687 break 11688 } 11689 if x.Aux != s { 11690 break 11691 } 11692 _ = x.Args[3] 11693 if idx != x.Args[0] { 11694 break 11695 } 11696 if p != x.Args[1] { 11697 break 11698 } 11699 w0 := x.Args[2] 11700 if w0.Op != OpS390XSRWconst { 11701 break 11702 } 11703 if w0.AuxInt != j-8 { 11704 break 11705 } 11706 if w != w0.Args[0] { 11707 break 11708 } 11709 mem := x.Args[3] 11710 if !(x.Uses == 1 && clobber(x)) { 11711 break 11712 } 11713 v.reset(OpS390XMOVHBRstoreidx) 11714 v.AuxInt = i - 1 11715 v.Aux = s 11716 v.AddArg(p) 11717 v.AddArg(idx) 11718 v.AddArg(w0) 11719 v.AddArg(mem) 11720 return true 11721 } 11722 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11723 // cond: x.Uses == 1 && clobber(x) 11724 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11725 for { 11726 i := v.AuxInt 11727 s := v.Aux 11728 _ = v.Args[3] 11729 idx := v.Args[0] 11730 p := v.Args[1] 11731 v_2 := v.Args[2] 11732 if v_2.Op != OpS390XSRWconst { 11733 break 11734 } 11735 j := v_2.AuxInt 11736 w := v_2.Args[0] 11737 x := v.Args[3] 11738 if x.Op != OpS390XMOVBstoreidx { 11739 break 11740 } 11741 if x.AuxInt != i-1 { 11742 break 11743 } 11744 if x.Aux != s { 11745 break 11746 } 11747 _ = x.Args[3] 11748 if p != x.Args[0] { 11749 break 11750 } 11751 if idx != x.Args[1] { 11752 break 11753 } 11754 w0 := x.Args[2] 11755 if w0.Op != OpS390XSRWconst { 11756 break 11757 } 11758 if w0.AuxInt != j-8 { 11759 break 11760 } 11761 if w != w0.Args[0] { 11762 break 11763 } 11764 mem := x.Args[3] 11765 if !(x.Uses == 1 && clobber(x)) { 11766 break 11767 } 11768 v.reset(OpS390XMOVHBRstoreidx) 11769 v.AuxInt = i - 1 11770 v.Aux = s 11771 v.AddArg(p) 11772 v.AddArg(idx) 11773 v.AddArg(w0) 11774 v.AddArg(mem) 11775 return true 11776 } 11777 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11778 // cond: x.Uses == 1 && clobber(x) 11779 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11780 for { 11781 i := v.AuxInt 11782 s := v.Aux 11783 _ = v.Args[3] 11784 idx := v.Args[0] 11785 p := v.Args[1] 11786 v_2 := v.Args[2] 11787 if v_2.Op != OpS390XSRWconst { 11788 break 11789 } 11790 j := v_2.AuxInt 11791 w := v_2.Args[0] 11792 x := v.Args[3] 11793 if x.Op != OpS390XMOVBstoreidx { 11794 break 11795 } 11796 if x.AuxInt != i-1 { 11797 break 11798 } 11799 if x.Aux != s { 11800 break 11801 } 11802 _ = x.Args[3] 11803 if idx != x.Args[0] { 11804 break 11805 } 11806 if p != x.Args[1] { 11807 break 11808 } 11809 w0 := x.Args[2] 11810 if w0.Op != OpS390XSRWconst { 11811 break 11812 } 11813 if w0.AuxInt != j-8 { 11814 break 11815 } 11816 if w != w0.Args[0] { 11817 break 11818 } 11819 mem := x.Args[3] 11820 if !(x.Uses == 1 && clobber(x)) { 11821 break 11822 } 11823 v.reset(OpS390XMOVHBRstoreidx) 11824 v.AuxInt = i - 1 11825 v.Aux = s 11826 v.AddArg(p) 11827 v.AddArg(idx) 11828 v.AddArg(w0) 11829 v.AddArg(mem) 11830 return true 11831 } 11832 return false 11833 } 11834 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 11835 // match: (MOVDEQ x y (InvertFlags cmp)) 11836 // cond: 11837 // result: (MOVDEQ x y cmp) 11838 for { 11839 _ = v.Args[2] 11840 x := v.Args[0] 11841 y := v.Args[1] 11842 v_2 := v.Args[2] 11843 if v_2.Op != OpS390XInvertFlags { 11844 break 11845 } 11846 cmp := v_2.Args[0] 11847 v.reset(OpS390XMOVDEQ) 11848 v.AddArg(x) 11849 v.AddArg(y) 11850 v.AddArg(cmp) 11851 return true 11852 } 11853 // match: (MOVDEQ _ x (FlagEQ)) 11854 // cond: 11855 // result: x 11856 for { 11857 _ = v.Args[2] 11858 x := v.Args[1] 11859 v_2 := v.Args[2] 11860 if v_2.Op != OpS390XFlagEQ { 11861 break 11862 } 11863 v.reset(OpCopy) 11864 v.Type = x.Type 11865 v.AddArg(x) 11866 return true 11867 } 11868 // match: (MOVDEQ y _ (FlagLT)) 11869 // cond: 11870 // result: y 11871 for { 11872 _ = v.Args[2] 11873 y := v.Args[0] 11874 v_2 := v.Args[2] 11875 if v_2.Op != OpS390XFlagLT { 11876 break 11877 } 11878 v.reset(OpCopy) 11879 v.Type = y.Type 11880 v.AddArg(y) 11881 return true 11882 } 11883 // match: (MOVDEQ y _ (FlagGT)) 11884 // cond: 11885 // result: y 11886 for { 11887 _ = v.Args[2] 11888 y := v.Args[0] 11889 v_2 := v.Args[2] 11890 if v_2.Op != OpS390XFlagGT { 11891 break 11892 } 11893 v.reset(OpCopy) 11894 v.Type = y.Type 11895 v.AddArg(y) 11896 return true 11897 } 11898 return false 11899 } 11900 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 11901 // match: (MOVDGE x y (InvertFlags cmp)) 11902 // cond: 11903 // result: (MOVDLE x y cmp) 11904 for { 11905 _ = v.Args[2] 11906 x := v.Args[0] 11907 y := v.Args[1] 11908 v_2 := v.Args[2] 11909 if v_2.Op != OpS390XInvertFlags { 11910 break 11911 } 11912 cmp := v_2.Args[0] 11913 v.reset(OpS390XMOVDLE) 11914 v.AddArg(x) 11915 v.AddArg(y) 11916 v.AddArg(cmp) 11917 return true 11918 } 11919 // match: (MOVDGE _ x (FlagEQ)) 11920 // cond: 11921 // result: x 11922 for { 11923 _ = v.Args[2] 11924 x := v.Args[1] 11925 v_2 := v.Args[2] 11926 if v_2.Op != OpS390XFlagEQ { 11927 break 11928 } 11929 v.reset(OpCopy) 11930 v.Type = x.Type 11931 v.AddArg(x) 11932 return true 11933 } 11934 // match: (MOVDGE y _ (FlagLT)) 11935 // cond: 11936 // result: y 11937 for { 11938 _ = v.Args[2] 11939 y := v.Args[0] 11940 v_2 := v.Args[2] 11941 if v_2.Op != OpS390XFlagLT { 11942 break 11943 } 11944 v.reset(OpCopy) 11945 v.Type = y.Type 11946 v.AddArg(y) 11947 return true 11948 } 11949 // match: (MOVDGE _ x (FlagGT)) 11950 // cond: 11951 // result: x 11952 for { 11953 _ = v.Args[2] 11954 x := v.Args[1] 11955 v_2 := v.Args[2] 11956 if v_2.Op != OpS390XFlagGT { 11957 break 11958 } 11959 v.reset(OpCopy) 11960 v.Type = x.Type 11961 v.AddArg(x) 11962 return true 11963 } 11964 return false 11965 } 11966 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 11967 // match: (MOVDGT x y (InvertFlags cmp)) 11968 // cond: 11969 // result: (MOVDLT x y cmp) 11970 for { 11971 _ = v.Args[2] 11972 x := v.Args[0] 11973 y := v.Args[1] 11974 v_2 := v.Args[2] 11975 if v_2.Op != OpS390XInvertFlags { 11976 break 11977 } 11978 cmp := v_2.Args[0] 11979 v.reset(OpS390XMOVDLT) 11980 v.AddArg(x) 11981 v.AddArg(y) 11982 v.AddArg(cmp) 11983 return true 11984 } 11985 // match: (MOVDGT y _ (FlagEQ)) 11986 // cond: 11987 // result: y 11988 for { 11989 _ = v.Args[2] 11990 y := v.Args[0] 11991 v_2 := v.Args[2] 11992 if v_2.Op != OpS390XFlagEQ { 11993 break 11994 } 11995 v.reset(OpCopy) 11996 v.Type = y.Type 11997 v.AddArg(y) 11998 return true 11999 } 12000 // match: (MOVDGT y _ (FlagLT)) 12001 // cond: 12002 // result: y 12003 for { 12004 _ = v.Args[2] 12005 y := v.Args[0] 12006 v_2 := v.Args[2] 12007 if v_2.Op != OpS390XFlagLT { 12008 break 12009 } 12010 v.reset(OpCopy) 12011 v.Type = y.Type 12012 v.AddArg(y) 12013 return true 12014 } 12015 // match: (MOVDGT _ x (FlagGT)) 12016 // cond: 12017 // result: x 12018 for { 12019 _ = v.Args[2] 12020 x := v.Args[1] 12021 v_2 := v.Args[2] 12022 if v_2.Op != OpS390XFlagGT { 12023 break 12024 } 12025 v.reset(OpCopy) 12026 v.Type = x.Type 12027 v.AddArg(x) 12028 return true 12029 } 12030 return false 12031 } 12032 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 12033 // match: (MOVDLE x y (InvertFlags cmp)) 12034 // cond: 12035 // result: (MOVDGE x y cmp) 12036 for { 12037 _ = v.Args[2] 12038 x := v.Args[0] 12039 y := v.Args[1] 12040 v_2 := v.Args[2] 12041 if v_2.Op != OpS390XInvertFlags { 12042 break 12043 } 12044 cmp := v_2.Args[0] 12045 v.reset(OpS390XMOVDGE) 12046 v.AddArg(x) 12047 v.AddArg(y) 12048 v.AddArg(cmp) 12049 return true 12050 } 12051 // match: (MOVDLE _ x (FlagEQ)) 12052 // cond: 12053 // result: x 12054 for { 12055 _ = v.Args[2] 12056 x := v.Args[1] 12057 v_2 := v.Args[2] 12058 if v_2.Op != OpS390XFlagEQ { 12059 break 12060 } 12061 v.reset(OpCopy) 12062 v.Type = x.Type 12063 v.AddArg(x) 12064 return true 12065 } 12066 // match: (MOVDLE _ x (FlagLT)) 12067 // cond: 12068 // result: x 12069 for { 12070 _ = v.Args[2] 12071 x := v.Args[1] 12072 v_2 := v.Args[2] 12073 if v_2.Op != OpS390XFlagLT { 12074 break 12075 } 12076 v.reset(OpCopy) 12077 v.Type = x.Type 12078 v.AddArg(x) 12079 return true 12080 } 12081 // match: (MOVDLE y _ (FlagGT)) 12082 // cond: 12083 // result: y 12084 for { 12085 _ = v.Args[2] 12086 y := v.Args[0] 12087 v_2 := v.Args[2] 12088 if v_2.Op != OpS390XFlagGT { 12089 break 12090 } 12091 v.reset(OpCopy) 12092 v.Type = y.Type 12093 v.AddArg(y) 12094 return true 12095 } 12096 return false 12097 } 12098 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 12099 // match: (MOVDLT x y (InvertFlags cmp)) 12100 // cond: 12101 // result: (MOVDGT x y cmp) 12102 for { 12103 _ = v.Args[2] 12104 x := v.Args[0] 12105 y := v.Args[1] 12106 v_2 := v.Args[2] 12107 if v_2.Op != OpS390XInvertFlags { 12108 break 12109 } 12110 cmp := v_2.Args[0] 12111 v.reset(OpS390XMOVDGT) 12112 v.AddArg(x) 12113 v.AddArg(y) 12114 v.AddArg(cmp) 12115 return true 12116 } 12117 // match: (MOVDLT y _ (FlagEQ)) 12118 // cond: 12119 // result: y 12120 for { 12121 _ = v.Args[2] 12122 y := v.Args[0] 12123 v_2 := v.Args[2] 12124 if v_2.Op != OpS390XFlagEQ { 12125 break 12126 } 12127 v.reset(OpCopy) 12128 v.Type = y.Type 12129 v.AddArg(y) 12130 return true 12131 } 12132 // match: (MOVDLT _ x (FlagLT)) 12133 // cond: 12134 // result: x 12135 for { 12136 _ = v.Args[2] 12137 x := v.Args[1] 12138 v_2 := v.Args[2] 12139 if v_2.Op != OpS390XFlagLT { 12140 break 12141 } 12142 v.reset(OpCopy) 12143 v.Type = x.Type 12144 v.AddArg(x) 12145 return true 12146 } 12147 // match: (MOVDLT y _ (FlagGT)) 12148 // cond: 12149 // result: y 12150 for { 12151 _ = v.Args[2] 12152 y := v.Args[0] 12153 v_2 := v.Args[2] 12154 if v_2.Op != OpS390XFlagGT { 12155 break 12156 } 12157 v.reset(OpCopy) 12158 v.Type = y.Type 12159 v.AddArg(y) 12160 return true 12161 } 12162 return false 12163 } 12164 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 12165 // match: (MOVDNE x y (InvertFlags cmp)) 12166 // cond: 12167 // result: (MOVDNE x y cmp) 12168 for { 12169 _ = v.Args[2] 12170 x := v.Args[0] 12171 y := v.Args[1] 12172 v_2 := v.Args[2] 12173 if v_2.Op != OpS390XInvertFlags { 12174 break 12175 } 12176 cmp := v_2.Args[0] 12177 v.reset(OpS390XMOVDNE) 12178 v.AddArg(x) 12179 v.AddArg(y) 12180 v.AddArg(cmp) 12181 return true 12182 } 12183 // match: (MOVDNE y _ (FlagEQ)) 12184 // cond: 12185 // result: y 12186 for { 12187 _ = v.Args[2] 12188 y := v.Args[0] 12189 v_2 := v.Args[2] 12190 if v_2.Op != OpS390XFlagEQ { 12191 break 12192 } 12193 v.reset(OpCopy) 12194 v.Type = y.Type 12195 v.AddArg(y) 12196 return true 12197 } 12198 // match: (MOVDNE _ x (FlagLT)) 12199 // cond: 12200 // result: x 12201 for { 12202 _ = v.Args[2] 12203 x := v.Args[1] 12204 v_2 := v.Args[2] 12205 if v_2.Op != OpS390XFlagLT { 12206 break 12207 } 12208 v.reset(OpCopy) 12209 v.Type = x.Type 12210 v.AddArg(x) 12211 return true 12212 } 12213 // match: (MOVDNE _ x (FlagGT)) 12214 // cond: 12215 // result: x 12216 for { 12217 _ = v.Args[2] 12218 x := v.Args[1] 12219 v_2 := v.Args[2] 12220 if v_2.Op != OpS390XFlagGT { 12221 break 12222 } 12223 v.reset(OpCopy) 12224 v.Type = x.Type 12225 v.AddArg(x) 12226 return true 12227 } 12228 return false 12229 } 12230 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 12231 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 12232 // cond: is20Bit(c+d) && x.Op != OpSB 12233 // result: (MOVDaddridx [c+d] {s} x y) 12234 for { 12235 c := v.AuxInt 12236 s := v.Aux 12237 _ = v.Args[1] 12238 v_0 := v.Args[0] 12239 if v_0.Op != OpS390XADDconst { 12240 break 12241 } 12242 d := v_0.AuxInt 12243 x := v_0.Args[0] 12244 y := v.Args[1] 12245 if !(is20Bit(c+d) && x.Op != OpSB) { 12246 break 12247 } 12248 v.reset(OpS390XMOVDaddridx) 12249 v.AuxInt = c + d 12250 v.Aux = s 12251 v.AddArg(x) 12252 v.AddArg(y) 12253 return true 12254 } 12255 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 12256 // cond: is20Bit(c+d) && y.Op != OpSB 12257 // result: (MOVDaddridx [c+d] {s} x y) 12258 for { 12259 c := v.AuxInt 12260 s := v.Aux 12261 _ = v.Args[1] 12262 x := v.Args[0] 12263 v_1 := v.Args[1] 12264 if v_1.Op != OpS390XADDconst { 12265 break 12266 } 12267 d := v_1.AuxInt 12268 y := v_1.Args[0] 12269 if !(is20Bit(c+d) && y.Op != OpSB) { 12270 break 12271 } 12272 v.reset(OpS390XMOVDaddridx) 12273 v.AuxInt = c + d 12274 v.Aux = s 12275 v.AddArg(x) 12276 v.AddArg(y) 12277 return true 12278 } 12279 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 12280 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 12281 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12282 for { 12283 off1 := v.AuxInt 12284 sym1 := v.Aux 12285 _ = v.Args[1] 12286 v_0 := v.Args[0] 12287 if v_0.Op != OpS390XMOVDaddr { 12288 break 12289 } 12290 off2 := v_0.AuxInt 12291 sym2 := v_0.Aux 12292 x := v_0.Args[0] 12293 y := v.Args[1] 12294 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 12295 break 12296 } 12297 v.reset(OpS390XMOVDaddridx) 12298 v.AuxInt = off1 + off2 12299 v.Aux = mergeSym(sym1, sym2) 12300 v.AddArg(x) 12301 v.AddArg(y) 12302 return true 12303 } 12304 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 12305 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 12306 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 12307 for { 12308 off1 := v.AuxInt 12309 sym1 := v.Aux 12310 _ = v.Args[1] 12311 x := v.Args[0] 12312 v_1 := v.Args[1] 12313 if v_1.Op != OpS390XMOVDaddr { 12314 break 12315 } 12316 off2 := v_1.AuxInt 12317 sym2 := v_1.Aux 12318 y := v_1.Args[0] 12319 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 12320 break 12321 } 12322 v.reset(OpS390XMOVDaddridx) 12323 v.AuxInt = off1 + off2 12324 v.Aux = mergeSym(sym1, sym2) 12325 v.AddArg(x) 12326 v.AddArg(y) 12327 return true 12328 } 12329 return false 12330 } 12331 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 12332 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 12333 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 12334 // result: (MOVDreg x) 12335 for { 12336 off := v.AuxInt 12337 sym := v.Aux 12338 _ = v.Args[1] 12339 ptr := v.Args[0] 12340 v_1 := v.Args[1] 12341 if v_1.Op != OpS390XMOVDstore { 12342 break 12343 } 12344 off2 := v_1.AuxInt 12345 sym2 := v_1.Aux 12346 _ = v_1.Args[2] 12347 ptr2 := v_1.Args[0] 12348 x := v_1.Args[1] 12349 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 12350 break 12351 } 12352 v.reset(OpS390XMOVDreg) 12353 v.AddArg(x) 12354 return true 12355 } 12356 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 12357 // cond: is20Bit(off1+off2) 12358 // result: (MOVDload [off1+off2] {sym} ptr mem) 12359 for { 12360 off1 := v.AuxInt 12361 sym := v.Aux 12362 _ = v.Args[1] 12363 v_0 := v.Args[0] 12364 if v_0.Op != OpS390XADDconst { 12365 break 12366 } 12367 off2 := v_0.AuxInt 12368 ptr := v_0.Args[0] 12369 mem := v.Args[1] 12370 if !(is20Bit(off1 + off2)) { 12371 break 12372 } 12373 v.reset(OpS390XMOVDload) 12374 v.AuxInt = off1 + off2 12375 v.Aux = sym 12376 v.AddArg(ptr) 12377 v.AddArg(mem) 12378 return true 12379 } 12380 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 12381 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12382 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 12383 for { 12384 off1 := v.AuxInt 12385 sym1 := v.Aux 12386 _ = v.Args[1] 12387 v_0 := v.Args[0] 12388 if v_0.Op != OpS390XMOVDaddr { 12389 break 12390 } 12391 off2 := v_0.AuxInt 12392 sym2 := v_0.Aux 12393 base := v_0.Args[0] 12394 mem := v.Args[1] 12395 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12396 break 12397 } 12398 v.reset(OpS390XMOVDload) 12399 v.AuxInt = off1 + off2 12400 v.Aux = mergeSym(sym1, sym2) 12401 v.AddArg(base) 12402 v.AddArg(mem) 12403 return true 12404 } 12405 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 12406 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12407 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 12408 for { 12409 off1 := v.AuxInt 12410 sym1 := v.Aux 12411 _ = v.Args[1] 12412 v_0 := v.Args[0] 12413 if v_0.Op != OpS390XMOVDaddridx { 12414 break 12415 } 12416 off2 := v_0.AuxInt 12417 sym2 := v_0.Aux 12418 _ = v_0.Args[1] 12419 ptr := v_0.Args[0] 12420 idx := v_0.Args[1] 12421 mem := v.Args[1] 12422 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12423 break 12424 } 12425 v.reset(OpS390XMOVDloadidx) 12426 v.AuxInt = off1 + off2 12427 v.Aux = mergeSym(sym1, sym2) 12428 v.AddArg(ptr) 12429 v.AddArg(idx) 12430 v.AddArg(mem) 12431 return true 12432 } 12433 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 12434 // cond: ptr.Op != OpSB 12435 // result: (MOVDloadidx [off] {sym} ptr idx mem) 12436 for { 12437 off := v.AuxInt 12438 sym := v.Aux 12439 _ = v.Args[1] 12440 v_0 := v.Args[0] 12441 if v_0.Op != OpS390XADD { 12442 break 12443 } 12444 _ = v_0.Args[1] 12445 ptr := v_0.Args[0] 12446 idx := v_0.Args[1] 12447 mem := v.Args[1] 12448 if !(ptr.Op != OpSB) { 12449 break 12450 } 12451 v.reset(OpS390XMOVDloadidx) 12452 v.AuxInt = off 12453 v.Aux = sym 12454 v.AddArg(ptr) 12455 v.AddArg(idx) 12456 v.AddArg(mem) 12457 return true 12458 } 12459 return false 12460 } 12461 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 12462 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 12463 // cond: 12464 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12465 for { 12466 c := v.AuxInt 12467 sym := v.Aux 12468 _ = v.Args[2] 12469 v_0 := v.Args[0] 12470 if v_0.Op != OpS390XADDconst { 12471 break 12472 } 12473 d := v_0.AuxInt 12474 ptr := v_0.Args[0] 12475 idx := v.Args[1] 12476 mem := v.Args[2] 12477 v.reset(OpS390XMOVDloadidx) 12478 v.AuxInt = c + d 12479 v.Aux = sym 12480 v.AddArg(ptr) 12481 v.AddArg(idx) 12482 v.AddArg(mem) 12483 return true 12484 } 12485 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 12486 // cond: 12487 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12488 for { 12489 c := v.AuxInt 12490 sym := v.Aux 12491 _ = v.Args[2] 12492 idx := v.Args[0] 12493 v_1 := v.Args[1] 12494 if v_1.Op != OpS390XADDconst { 12495 break 12496 } 12497 d := v_1.AuxInt 12498 ptr := v_1.Args[0] 12499 mem := v.Args[2] 12500 v.reset(OpS390XMOVDloadidx) 12501 v.AuxInt = c + d 12502 v.Aux = sym 12503 v.AddArg(ptr) 12504 v.AddArg(idx) 12505 v.AddArg(mem) 12506 return true 12507 } 12508 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 12509 // cond: 12510 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12511 for { 12512 c := v.AuxInt 12513 sym := v.Aux 12514 _ = v.Args[2] 12515 ptr := v.Args[0] 12516 v_1 := v.Args[1] 12517 if v_1.Op != OpS390XADDconst { 12518 break 12519 } 12520 d := v_1.AuxInt 12521 idx := v_1.Args[0] 12522 mem := v.Args[2] 12523 v.reset(OpS390XMOVDloadidx) 12524 v.AuxInt = c + d 12525 v.Aux = sym 12526 v.AddArg(ptr) 12527 v.AddArg(idx) 12528 v.AddArg(mem) 12529 return true 12530 } 12531 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 12532 // cond: 12533 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12534 for { 12535 c := v.AuxInt 12536 sym := v.Aux 12537 _ = v.Args[2] 12538 v_0 := v.Args[0] 12539 if v_0.Op != OpS390XADDconst { 12540 break 12541 } 12542 d := v_0.AuxInt 12543 idx := v_0.Args[0] 12544 ptr := v.Args[1] 12545 mem := v.Args[2] 12546 v.reset(OpS390XMOVDloadidx) 12547 v.AuxInt = c + d 12548 v.Aux = sym 12549 v.AddArg(ptr) 12550 v.AddArg(idx) 12551 v.AddArg(mem) 12552 return true 12553 } 12554 return false 12555 } 12556 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 12557 b := v.Block 12558 _ = b 12559 // match: (MOVDnop <t> x) 12560 // cond: t.Compare(x.Type) == types.CMPeq 12561 // result: x 12562 for { 12563 t := v.Type 12564 x := v.Args[0] 12565 if !(t.Compare(x.Type) == types.CMPeq) { 12566 break 12567 } 12568 v.reset(OpCopy) 12569 v.Type = x.Type 12570 v.AddArg(x) 12571 return true 12572 } 12573 // match: (MOVDnop (MOVDconst [c])) 12574 // cond: 12575 // result: (MOVDconst [c]) 12576 for { 12577 v_0 := v.Args[0] 12578 if v_0.Op != OpS390XMOVDconst { 12579 break 12580 } 12581 c := v_0.AuxInt 12582 v.reset(OpS390XMOVDconst) 12583 v.AuxInt = c 12584 return true 12585 } 12586 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 12587 // cond: x.Uses == 1 && clobber(x) 12588 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12589 for { 12590 t := v.Type 12591 x := v.Args[0] 12592 if x.Op != OpS390XMOVBZload { 12593 break 12594 } 12595 off := x.AuxInt 12596 sym := x.Aux 12597 _ = x.Args[1] 12598 ptr := x.Args[0] 12599 mem := x.Args[1] 12600 if !(x.Uses == 1 && clobber(x)) { 12601 break 12602 } 12603 b = x.Block 12604 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12605 v.reset(OpCopy) 12606 v.AddArg(v0) 12607 v0.AuxInt = off 12608 v0.Aux = sym 12609 v0.AddArg(ptr) 12610 v0.AddArg(mem) 12611 return true 12612 } 12613 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 12614 // cond: x.Uses == 1 && clobber(x) 12615 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12616 for { 12617 t := v.Type 12618 x := v.Args[0] 12619 if x.Op != OpS390XMOVBload { 12620 break 12621 } 12622 off := x.AuxInt 12623 sym := x.Aux 12624 _ = x.Args[1] 12625 ptr := x.Args[0] 12626 mem := x.Args[1] 12627 if !(x.Uses == 1 && clobber(x)) { 12628 break 12629 } 12630 b = x.Block 12631 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12632 v.reset(OpCopy) 12633 v.AddArg(v0) 12634 v0.AuxInt = off 12635 v0.Aux = sym 12636 v0.AddArg(ptr) 12637 v0.AddArg(mem) 12638 return true 12639 } 12640 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 12641 // cond: x.Uses == 1 && clobber(x) 12642 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12643 for { 12644 t := v.Type 12645 x := v.Args[0] 12646 if x.Op != OpS390XMOVHZload { 12647 break 12648 } 12649 off := x.AuxInt 12650 sym := x.Aux 12651 _ = x.Args[1] 12652 ptr := x.Args[0] 12653 mem := x.Args[1] 12654 if !(x.Uses == 1 && clobber(x)) { 12655 break 12656 } 12657 b = x.Block 12658 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12659 v.reset(OpCopy) 12660 v.AddArg(v0) 12661 v0.AuxInt = off 12662 v0.Aux = sym 12663 v0.AddArg(ptr) 12664 v0.AddArg(mem) 12665 return true 12666 } 12667 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 12668 // cond: x.Uses == 1 && clobber(x) 12669 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12670 for { 12671 t := v.Type 12672 x := v.Args[0] 12673 if x.Op != OpS390XMOVHload { 12674 break 12675 } 12676 off := x.AuxInt 12677 sym := x.Aux 12678 _ = x.Args[1] 12679 ptr := x.Args[0] 12680 mem := x.Args[1] 12681 if !(x.Uses == 1 && clobber(x)) { 12682 break 12683 } 12684 b = x.Block 12685 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12686 v.reset(OpCopy) 12687 v.AddArg(v0) 12688 v0.AuxInt = off 12689 v0.Aux = sym 12690 v0.AddArg(ptr) 12691 v0.AddArg(mem) 12692 return true 12693 } 12694 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 12695 // cond: x.Uses == 1 && clobber(x) 12696 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12697 for { 12698 t := v.Type 12699 x := v.Args[0] 12700 if x.Op != OpS390XMOVWZload { 12701 break 12702 } 12703 off := x.AuxInt 12704 sym := x.Aux 12705 _ = x.Args[1] 12706 ptr := x.Args[0] 12707 mem := x.Args[1] 12708 if !(x.Uses == 1 && clobber(x)) { 12709 break 12710 } 12711 b = x.Block 12712 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12713 v.reset(OpCopy) 12714 v.AddArg(v0) 12715 v0.AuxInt = off 12716 v0.Aux = sym 12717 v0.AddArg(ptr) 12718 v0.AddArg(mem) 12719 return true 12720 } 12721 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 12722 // cond: x.Uses == 1 && clobber(x) 12723 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12724 for { 12725 t := v.Type 12726 x := v.Args[0] 12727 if x.Op != OpS390XMOVWload { 12728 break 12729 } 12730 off := x.AuxInt 12731 sym := x.Aux 12732 _ = x.Args[1] 12733 ptr := x.Args[0] 12734 mem := x.Args[1] 12735 if !(x.Uses == 1 && clobber(x)) { 12736 break 12737 } 12738 b = x.Block 12739 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12740 v.reset(OpCopy) 12741 v.AddArg(v0) 12742 v0.AuxInt = off 12743 v0.Aux = sym 12744 v0.AddArg(ptr) 12745 v0.AddArg(mem) 12746 return true 12747 } 12748 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 12749 // cond: x.Uses == 1 && clobber(x) 12750 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12751 for { 12752 t := v.Type 12753 x := v.Args[0] 12754 if x.Op != OpS390XMOVDload { 12755 break 12756 } 12757 off := x.AuxInt 12758 sym := x.Aux 12759 _ = x.Args[1] 12760 ptr := x.Args[0] 12761 mem := x.Args[1] 12762 if !(x.Uses == 1 && clobber(x)) { 12763 break 12764 } 12765 b = x.Block 12766 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12767 v.reset(OpCopy) 12768 v.AddArg(v0) 12769 v0.AuxInt = off 12770 v0.Aux = sym 12771 v0.AddArg(ptr) 12772 v0.AddArg(mem) 12773 return true 12774 } 12775 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12776 // cond: x.Uses == 1 && clobber(x) 12777 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12778 for { 12779 t := v.Type 12780 x := v.Args[0] 12781 if x.Op != OpS390XMOVBZloadidx { 12782 break 12783 } 12784 off := x.AuxInt 12785 sym := x.Aux 12786 _ = x.Args[2] 12787 ptr := x.Args[0] 12788 idx := x.Args[1] 12789 mem := x.Args[2] 12790 if !(x.Uses == 1 && clobber(x)) { 12791 break 12792 } 12793 b = x.Block 12794 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12795 v.reset(OpCopy) 12796 v.AddArg(v0) 12797 v0.AuxInt = off 12798 v0.Aux = sym 12799 v0.AddArg(ptr) 12800 v0.AddArg(idx) 12801 v0.AddArg(mem) 12802 return true 12803 } 12804 return false 12805 } 12806 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 12807 b := v.Block 12808 _ = b 12809 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12810 // cond: x.Uses == 1 && clobber(x) 12811 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12812 for { 12813 t := v.Type 12814 x := v.Args[0] 12815 if x.Op != OpS390XMOVHZloadidx { 12816 break 12817 } 12818 off := x.AuxInt 12819 sym := x.Aux 12820 _ = x.Args[2] 12821 ptr := x.Args[0] 12822 idx := x.Args[1] 12823 mem := x.Args[2] 12824 if !(x.Uses == 1 && clobber(x)) { 12825 break 12826 } 12827 b = x.Block 12828 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12829 v.reset(OpCopy) 12830 v.AddArg(v0) 12831 v0.AuxInt = off 12832 v0.Aux = sym 12833 v0.AddArg(ptr) 12834 v0.AddArg(idx) 12835 v0.AddArg(mem) 12836 return true 12837 } 12838 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12839 // cond: x.Uses == 1 && clobber(x) 12840 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12841 for { 12842 t := v.Type 12843 x := v.Args[0] 12844 if x.Op != OpS390XMOVWZloadidx { 12845 break 12846 } 12847 off := x.AuxInt 12848 sym := x.Aux 12849 _ = x.Args[2] 12850 ptr := x.Args[0] 12851 idx := x.Args[1] 12852 mem := x.Args[2] 12853 if !(x.Uses == 1 && clobber(x)) { 12854 break 12855 } 12856 b = x.Block 12857 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12858 v.reset(OpCopy) 12859 v.AddArg(v0) 12860 v0.AuxInt = off 12861 v0.Aux = sym 12862 v0.AddArg(ptr) 12863 v0.AddArg(idx) 12864 v0.AddArg(mem) 12865 return true 12866 } 12867 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12868 // cond: x.Uses == 1 && clobber(x) 12869 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12870 for { 12871 t := v.Type 12872 x := v.Args[0] 12873 if x.Op != OpS390XMOVDloadidx { 12874 break 12875 } 12876 off := x.AuxInt 12877 sym := x.Aux 12878 _ = x.Args[2] 12879 ptr := x.Args[0] 12880 idx := x.Args[1] 12881 mem := x.Args[2] 12882 if !(x.Uses == 1 && clobber(x)) { 12883 break 12884 } 12885 b = x.Block 12886 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12887 v.reset(OpCopy) 12888 v.AddArg(v0) 12889 v0.AuxInt = off 12890 v0.Aux = sym 12891 v0.AddArg(ptr) 12892 v0.AddArg(idx) 12893 v0.AddArg(mem) 12894 return true 12895 } 12896 return false 12897 } 12898 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 12899 b := v.Block 12900 _ = b 12901 // match: (MOVDreg <t> x) 12902 // cond: t.Compare(x.Type) == types.CMPeq 12903 // result: x 12904 for { 12905 t := v.Type 12906 x := v.Args[0] 12907 if !(t.Compare(x.Type) == types.CMPeq) { 12908 break 12909 } 12910 v.reset(OpCopy) 12911 v.Type = x.Type 12912 v.AddArg(x) 12913 return true 12914 } 12915 // match: (MOVDreg (MOVDconst [c])) 12916 // cond: 12917 // result: (MOVDconst [c]) 12918 for { 12919 v_0 := v.Args[0] 12920 if v_0.Op != OpS390XMOVDconst { 12921 break 12922 } 12923 c := v_0.AuxInt 12924 v.reset(OpS390XMOVDconst) 12925 v.AuxInt = c 12926 return true 12927 } 12928 // match: (MOVDreg x) 12929 // cond: x.Uses == 1 12930 // result: (MOVDnop x) 12931 for { 12932 x := v.Args[0] 12933 if !(x.Uses == 1) { 12934 break 12935 } 12936 v.reset(OpS390XMOVDnop) 12937 v.AddArg(x) 12938 return true 12939 } 12940 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 12941 // cond: x.Uses == 1 && clobber(x) 12942 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12943 for { 12944 t := v.Type 12945 x := v.Args[0] 12946 if x.Op != OpS390XMOVBZload { 12947 break 12948 } 12949 off := x.AuxInt 12950 sym := x.Aux 12951 _ = x.Args[1] 12952 ptr := x.Args[0] 12953 mem := x.Args[1] 12954 if !(x.Uses == 1 && clobber(x)) { 12955 break 12956 } 12957 b = x.Block 12958 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12959 v.reset(OpCopy) 12960 v.AddArg(v0) 12961 v0.AuxInt = off 12962 v0.Aux = sym 12963 v0.AddArg(ptr) 12964 v0.AddArg(mem) 12965 return true 12966 } 12967 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 12968 // cond: x.Uses == 1 && clobber(x) 12969 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12970 for { 12971 t := v.Type 12972 x := v.Args[0] 12973 if x.Op != OpS390XMOVBload { 12974 break 12975 } 12976 off := x.AuxInt 12977 sym := x.Aux 12978 _ = x.Args[1] 12979 ptr := x.Args[0] 12980 mem := x.Args[1] 12981 if !(x.Uses == 1 && clobber(x)) { 12982 break 12983 } 12984 b = x.Block 12985 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12986 v.reset(OpCopy) 12987 v.AddArg(v0) 12988 v0.AuxInt = off 12989 v0.Aux = sym 12990 v0.AddArg(ptr) 12991 v0.AddArg(mem) 12992 return true 12993 } 12994 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 12995 // cond: x.Uses == 1 && clobber(x) 12996 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12997 for { 12998 t := v.Type 12999 x := v.Args[0] 13000 if x.Op != OpS390XMOVHZload { 13001 break 13002 } 13003 off := x.AuxInt 13004 sym := x.Aux 13005 _ = x.Args[1] 13006 ptr := x.Args[0] 13007 mem := x.Args[1] 13008 if !(x.Uses == 1 && clobber(x)) { 13009 break 13010 } 13011 b = x.Block 13012 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 13013 v.reset(OpCopy) 13014 v.AddArg(v0) 13015 v0.AuxInt = off 13016 v0.Aux = sym 13017 v0.AddArg(ptr) 13018 v0.AddArg(mem) 13019 return true 13020 } 13021 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 13022 // cond: x.Uses == 1 && clobber(x) 13023 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 13024 for { 13025 t := v.Type 13026 x := v.Args[0] 13027 if x.Op != OpS390XMOVHload { 13028 break 13029 } 13030 off := x.AuxInt 13031 sym := x.Aux 13032 _ = x.Args[1] 13033 ptr := x.Args[0] 13034 mem := x.Args[1] 13035 if !(x.Uses == 1 && clobber(x)) { 13036 break 13037 } 13038 b = x.Block 13039 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 13040 v.reset(OpCopy) 13041 v.AddArg(v0) 13042 v0.AuxInt = off 13043 v0.Aux = sym 13044 v0.AddArg(ptr) 13045 v0.AddArg(mem) 13046 return true 13047 } 13048 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 13049 // cond: x.Uses == 1 && clobber(x) 13050 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 13051 for { 13052 t := v.Type 13053 x := v.Args[0] 13054 if x.Op != OpS390XMOVWZload { 13055 break 13056 } 13057 off := x.AuxInt 13058 sym := x.Aux 13059 _ = x.Args[1] 13060 ptr := x.Args[0] 13061 mem := x.Args[1] 13062 if !(x.Uses == 1 && clobber(x)) { 13063 break 13064 } 13065 b = x.Block 13066 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 13067 v.reset(OpCopy) 13068 v.AddArg(v0) 13069 v0.AuxInt = off 13070 v0.Aux = sym 13071 v0.AddArg(ptr) 13072 v0.AddArg(mem) 13073 return true 13074 } 13075 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 13076 // cond: x.Uses == 1 && clobber(x) 13077 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 13078 for { 13079 t := v.Type 13080 x := v.Args[0] 13081 if x.Op != OpS390XMOVWload { 13082 break 13083 } 13084 off := x.AuxInt 13085 sym := x.Aux 13086 _ = x.Args[1] 13087 ptr := x.Args[0] 13088 mem := x.Args[1] 13089 if !(x.Uses == 1 && clobber(x)) { 13090 break 13091 } 13092 b = x.Block 13093 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 13094 v.reset(OpCopy) 13095 v.AddArg(v0) 13096 v0.AuxInt = off 13097 v0.Aux = sym 13098 v0.AddArg(ptr) 13099 v0.AddArg(mem) 13100 return true 13101 } 13102 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 13103 // cond: x.Uses == 1 && clobber(x) 13104 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 13105 for { 13106 t := v.Type 13107 x := v.Args[0] 13108 if x.Op != OpS390XMOVDload { 13109 break 13110 } 13111 off := x.AuxInt 13112 sym := x.Aux 13113 _ = x.Args[1] 13114 ptr := x.Args[0] 13115 mem := x.Args[1] 13116 if !(x.Uses == 1 && clobber(x)) { 13117 break 13118 } 13119 b = x.Block 13120 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 13121 v.reset(OpCopy) 13122 v.AddArg(v0) 13123 v0.AuxInt = off 13124 v0.Aux = sym 13125 v0.AddArg(ptr) 13126 v0.AddArg(mem) 13127 return true 13128 } 13129 return false 13130 } 13131 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 13132 b := v.Block 13133 _ = b 13134 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 13135 // cond: x.Uses == 1 && clobber(x) 13136 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 13137 for { 13138 t := v.Type 13139 x := v.Args[0] 13140 if x.Op != OpS390XMOVBZloadidx { 13141 break 13142 } 13143 off := x.AuxInt 13144 sym := x.Aux 13145 _ = x.Args[2] 13146 ptr := x.Args[0] 13147 idx := x.Args[1] 13148 mem := x.Args[2] 13149 if !(x.Uses == 1 && clobber(x)) { 13150 break 13151 } 13152 b = x.Block 13153 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 13154 v.reset(OpCopy) 13155 v.AddArg(v0) 13156 v0.AuxInt = off 13157 v0.Aux = sym 13158 v0.AddArg(ptr) 13159 v0.AddArg(idx) 13160 v0.AddArg(mem) 13161 return true 13162 } 13163 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 13164 // cond: x.Uses == 1 && clobber(x) 13165 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 13166 for { 13167 t := v.Type 13168 x := v.Args[0] 13169 if x.Op != OpS390XMOVHZloadidx { 13170 break 13171 } 13172 off := x.AuxInt 13173 sym := x.Aux 13174 _ = x.Args[2] 13175 ptr := x.Args[0] 13176 idx := x.Args[1] 13177 mem := x.Args[2] 13178 if !(x.Uses == 1 && clobber(x)) { 13179 break 13180 } 13181 b = x.Block 13182 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 13183 v.reset(OpCopy) 13184 v.AddArg(v0) 13185 v0.AuxInt = off 13186 v0.Aux = sym 13187 v0.AddArg(ptr) 13188 v0.AddArg(idx) 13189 v0.AddArg(mem) 13190 return true 13191 } 13192 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 13193 // cond: x.Uses == 1 && clobber(x) 13194 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 13195 for { 13196 t := v.Type 13197 x := v.Args[0] 13198 if x.Op != OpS390XMOVWZloadidx { 13199 break 13200 } 13201 off := x.AuxInt 13202 sym := x.Aux 13203 _ = x.Args[2] 13204 ptr := x.Args[0] 13205 idx := x.Args[1] 13206 mem := x.Args[2] 13207 if !(x.Uses == 1 && clobber(x)) { 13208 break 13209 } 13210 b = x.Block 13211 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 13212 v.reset(OpCopy) 13213 v.AddArg(v0) 13214 v0.AuxInt = off 13215 v0.Aux = sym 13216 v0.AddArg(ptr) 13217 v0.AddArg(idx) 13218 v0.AddArg(mem) 13219 return true 13220 } 13221 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 13222 // cond: x.Uses == 1 && clobber(x) 13223 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 13224 for { 13225 t := v.Type 13226 x := v.Args[0] 13227 if x.Op != OpS390XMOVDloadidx { 13228 break 13229 } 13230 off := x.AuxInt 13231 sym := x.Aux 13232 _ = x.Args[2] 13233 ptr := x.Args[0] 13234 idx := x.Args[1] 13235 mem := x.Args[2] 13236 if !(x.Uses == 1 && clobber(x)) { 13237 break 13238 } 13239 b = x.Block 13240 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 13241 v.reset(OpCopy) 13242 v.AddArg(v0) 13243 v0.AuxInt = off 13244 v0.Aux = sym 13245 v0.AddArg(ptr) 13246 v0.AddArg(idx) 13247 v0.AddArg(mem) 13248 return true 13249 } 13250 return false 13251 } 13252 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 13253 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 13254 // cond: is20Bit(off1+off2) 13255 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 13256 for { 13257 off1 := v.AuxInt 13258 sym := v.Aux 13259 _ = v.Args[2] 13260 v_0 := v.Args[0] 13261 if v_0.Op != OpS390XADDconst { 13262 break 13263 } 13264 off2 := v_0.AuxInt 13265 ptr := v_0.Args[0] 13266 val := v.Args[1] 13267 mem := v.Args[2] 13268 if !(is20Bit(off1 + off2)) { 13269 break 13270 } 13271 v.reset(OpS390XMOVDstore) 13272 v.AuxInt = off1 + off2 13273 v.Aux = sym 13274 v.AddArg(ptr) 13275 v.AddArg(val) 13276 v.AddArg(mem) 13277 return true 13278 } 13279 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 13280 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 13281 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 13282 for { 13283 off := v.AuxInt 13284 sym := v.Aux 13285 _ = v.Args[2] 13286 ptr := v.Args[0] 13287 v_1 := v.Args[1] 13288 if v_1.Op != OpS390XMOVDconst { 13289 break 13290 } 13291 c := v_1.AuxInt 13292 mem := v.Args[2] 13293 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 13294 break 13295 } 13296 v.reset(OpS390XMOVDstoreconst) 13297 v.AuxInt = makeValAndOff(c, off) 13298 v.Aux = sym 13299 v.AddArg(ptr) 13300 v.AddArg(mem) 13301 return true 13302 } 13303 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 13304 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13305 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 13306 for { 13307 off1 := v.AuxInt 13308 sym1 := v.Aux 13309 _ = v.Args[2] 13310 v_0 := v.Args[0] 13311 if v_0.Op != OpS390XMOVDaddr { 13312 break 13313 } 13314 off2 := v_0.AuxInt 13315 sym2 := v_0.Aux 13316 base := v_0.Args[0] 13317 val := v.Args[1] 13318 mem := v.Args[2] 13319 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13320 break 13321 } 13322 v.reset(OpS390XMOVDstore) 13323 v.AuxInt = off1 + off2 13324 v.Aux = mergeSym(sym1, sym2) 13325 v.AddArg(base) 13326 v.AddArg(val) 13327 v.AddArg(mem) 13328 return true 13329 } 13330 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 13331 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13332 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 13333 for { 13334 off1 := v.AuxInt 13335 sym1 := v.Aux 13336 _ = v.Args[2] 13337 v_0 := v.Args[0] 13338 if v_0.Op != OpS390XMOVDaddridx { 13339 break 13340 } 13341 off2 := v_0.AuxInt 13342 sym2 := v_0.Aux 13343 _ = v_0.Args[1] 13344 ptr := v_0.Args[0] 13345 idx := v_0.Args[1] 13346 val := v.Args[1] 13347 mem := v.Args[2] 13348 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13349 break 13350 } 13351 v.reset(OpS390XMOVDstoreidx) 13352 v.AuxInt = off1 + off2 13353 v.Aux = mergeSym(sym1, sym2) 13354 v.AddArg(ptr) 13355 v.AddArg(idx) 13356 v.AddArg(val) 13357 v.AddArg(mem) 13358 return true 13359 } 13360 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 13361 // cond: ptr.Op != OpSB 13362 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 13363 for { 13364 off := v.AuxInt 13365 sym := v.Aux 13366 _ = v.Args[2] 13367 v_0 := v.Args[0] 13368 if v_0.Op != OpS390XADD { 13369 break 13370 } 13371 _ = v_0.Args[1] 13372 ptr := v_0.Args[0] 13373 idx := v_0.Args[1] 13374 val := v.Args[1] 13375 mem := v.Args[2] 13376 if !(ptr.Op != OpSB) { 13377 break 13378 } 13379 v.reset(OpS390XMOVDstoreidx) 13380 v.AuxInt = off 13381 v.Aux = sym 13382 v.AddArg(ptr) 13383 v.AddArg(idx) 13384 v.AddArg(val) 13385 v.AddArg(mem) 13386 return true 13387 } 13388 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 13389 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 13390 // result: (STMG2 [i-8] {s} p w0 w1 mem) 13391 for { 13392 i := v.AuxInt 13393 s := v.Aux 13394 _ = v.Args[2] 13395 p := v.Args[0] 13396 w1 := v.Args[1] 13397 x := v.Args[2] 13398 if x.Op != OpS390XMOVDstore { 13399 break 13400 } 13401 if x.AuxInt != i-8 { 13402 break 13403 } 13404 if x.Aux != s { 13405 break 13406 } 13407 _ = x.Args[2] 13408 if p != x.Args[0] { 13409 break 13410 } 13411 w0 := x.Args[1] 13412 mem := x.Args[2] 13413 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 13414 break 13415 } 13416 v.reset(OpS390XSTMG2) 13417 v.AuxInt = i - 8 13418 v.Aux = s 13419 v.AddArg(p) 13420 v.AddArg(w0) 13421 v.AddArg(w1) 13422 v.AddArg(mem) 13423 return true 13424 } 13425 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 13426 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 13427 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 13428 for { 13429 i := v.AuxInt 13430 s := v.Aux 13431 _ = v.Args[2] 13432 p := v.Args[0] 13433 w2 := v.Args[1] 13434 x := v.Args[2] 13435 if x.Op != OpS390XSTMG2 { 13436 break 13437 } 13438 if x.AuxInt != i-16 { 13439 break 13440 } 13441 if x.Aux != s { 13442 break 13443 } 13444 _ = x.Args[3] 13445 if p != x.Args[0] { 13446 break 13447 } 13448 w0 := x.Args[1] 13449 w1 := x.Args[2] 13450 mem := x.Args[3] 13451 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 13452 break 13453 } 13454 v.reset(OpS390XSTMG3) 13455 v.AuxInt = i - 16 13456 v.Aux = s 13457 v.AddArg(p) 13458 v.AddArg(w0) 13459 v.AddArg(w1) 13460 v.AddArg(w2) 13461 v.AddArg(mem) 13462 return true 13463 } 13464 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 13465 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 13466 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 13467 for { 13468 i := v.AuxInt 13469 s := v.Aux 13470 _ = v.Args[2] 13471 p := v.Args[0] 13472 w3 := v.Args[1] 13473 x := v.Args[2] 13474 if x.Op != OpS390XSTMG3 { 13475 break 13476 } 13477 if x.AuxInt != i-24 { 13478 break 13479 } 13480 if x.Aux != s { 13481 break 13482 } 13483 _ = x.Args[4] 13484 if p != x.Args[0] { 13485 break 13486 } 13487 w0 := x.Args[1] 13488 w1 := x.Args[2] 13489 w2 := x.Args[3] 13490 mem := x.Args[4] 13491 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 13492 break 13493 } 13494 v.reset(OpS390XSTMG4) 13495 v.AuxInt = i - 24 13496 v.Aux = s 13497 v.AddArg(p) 13498 v.AddArg(w0) 13499 v.AddArg(w1) 13500 v.AddArg(w2) 13501 v.AddArg(w3) 13502 v.AddArg(mem) 13503 return true 13504 } 13505 return false 13506 } 13507 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 13508 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 13509 // cond: isU12Bit(ValAndOff(sc).Off()+off) 13510 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 13511 for { 13512 sc := v.AuxInt 13513 s := v.Aux 13514 _ = v.Args[1] 13515 v_0 := v.Args[0] 13516 if v_0.Op != OpS390XADDconst { 13517 break 13518 } 13519 off := v_0.AuxInt 13520 ptr := v_0.Args[0] 13521 mem := v.Args[1] 13522 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 13523 break 13524 } 13525 v.reset(OpS390XMOVDstoreconst) 13526 v.AuxInt = ValAndOff(sc).add(off) 13527 v.Aux = s 13528 v.AddArg(ptr) 13529 v.AddArg(mem) 13530 return true 13531 } 13532 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 13533 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 13534 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 13535 for { 13536 sc := v.AuxInt 13537 sym1 := v.Aux 13538 _ = v.Args[1] 13539 v_0 := v.Args[0] 13540 if v_0.Op != OpS390XMOVDaddr { 13541 break 13542 } 13543 off := v_0.AuxInt 13544 sym2 := v_0.Aux 13545 ptr := v_0.Args[0] 13546 mem := v.Args[1] 13547 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 13548 break 13549 } 13550 v.reset(OpS390XMOVDstoreconst) 13551 v.AuxInt = ValAndOff(sc).add(off) 13552 v.Aux = mergeSym(sym1, sym2) 13553 v.AddArg(ptr) 13554 v.AddArg(mem) 13555 return true 13556 } 13557 return false 13558 } 13559 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 13560 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 13561 // cond: 13562 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13563 for { 13564 c := v.AuxInt 13565 sym := v.Aux 13566 _ = v.Args[3] 13567 v_0 := v.Args[0] 13568 if v_0.Op != OpS390XADDconst { 13569 break 13570 } 13571 d := v_0.AuxInt 13572 ptr := v_0.Args[0] 13573 idx := v.Args[1] 13574 val := v.Args[2] 13575 mem := v.Args[3] 13576 v.reset(OpS390XMOVDstoreidx) 13577 v.AuxInt = c + d 13578 v.Aux = sym 13579 v.AddArg(ptr) 13580 v.AddArg(idx) 13581 v.AddArg(val) 13582 v.AddArg(mem) 13583 return true 13584 } 13585 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 13586 // cond: 13587 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13588 for { 13589 c := v.AuxInt 13590 sym := v.Aux 13591 _ = v.Args[3] 13592 idx := v.Args[0] 13593 v_1 := v.Args[1] 13594 if v_1.Op != OpS390XADDconst { 13595 break 13596 } 13597 d := v_1.AuxInt 13598 ptr := v_1.Args[0] 13599 val := v.Args[2] 13600 mem := v.Args[3] 13601 v.reset(OpS390XMOVDstoreidx) 13602 v.AuxInt = c + d 13603 v.Aux = sym 13604 v.AddArg(ptr) 13605 v.AddArg(idx) 13606 v.AddArg(val) 13607 v.AddArg(mem) 13608 return true 13609 } 13610 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13611 // cond: 13612 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13613 for { 13614 c := v.AuxInt 13615 sym := v.Aux 13616 _ = v.Args[3] 13617 ptr := v.Args[0] 13618 v_1 := v.Args[1] 13619 if v_1.Op != OpS390XADDconst { 13620 break 13621 } 13622 d := v_1.AuxInt 13623 idx := v_1.Args[0] 13624 val := v.Args[2] 13625 mem := v.Args[3] 13626 v.reset(OpS390XMOVDstoreidx) 13627 v.AuxInt = c + d 13628 v.Aux = sym 13629 v.AddArg(ptr) 13630 v.AddArg(idx) 13631 v.AddArg(val) 13632 v.AddArg(mem) 13633 return true 13634 } 13635 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 13636 // cond: 13637 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13638 for { 13639 c := v.AuxInt 13640 sym := v.Aux 13641 _ = v.Args[3] 13642 v_0 := v.Args[0] 13643 if v_0.Op != OpS390XADDconst { 13644 break 13645 } 13646 d := v_0.AuxInt 13647 idx := v_0.Args[0] 13648 ptr := v.Args[1] 13649 val := v.Args[2] 13650 mem := v.Args[3] 13651 v.reset(OpS390XMOVDstoreidx) 13652 v.AuxInt = c + d 13653 v.Aux = sym 13654 v.AddArg(ptr) 13655 v.AddArg(idx) 13656 v.AddArg(val) 13657 v.AddArg(mem) 13658 return true 13659 } 13660 return false 13661 } 13662 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 13663 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13664 // cond: x.Uses == 1 && clobber(x) 13665 // result: (MOVWBRstore [i-2] {s} p w mem) 13666 for { 13667 i := v.AuxInt 13668 s := v.Aux 13669 _ = v.Args[2] 13670 p := v.Args[0] 13671 v_1 := v.Args[1] 13672 if v_1.Op != OpS390XSRDconst { 13673 break 13674 } 13675 if v_1.AuxInt != 16 { 13676 break 13677 } 13678 w := v_1.Args[0] 13679 x := v.Args[2] 13680 if x.Op != OpS390XMOVHBRstore { 13681 break 13682 } 13683 if x.AuxInt != i-2 { 13684 break 13685 } 13686 if x.Aux != s { 13687 break 13688 } 13689 _ = x.Args[2] 13690 if p != x.Args[0] { 13691 break 13692 } 13693 if w != x.Args[1] { 13694 break 13695 } 13696 mem := x.Args[2] 13697 if !(x.Uses == 1 && clobber(x)) { 13698 break 13699 } 13700 v.reset(OpS390XMOVWBRstore) 13701 v.AuxInt = i - 2 13702 v.Aux = s 13703 v.AddArg(p) 13704 v.AddArg(w) 13705 v.AddArg(mem) 13706 return true 13707 } 13708 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 13709 // cond: x.Uses == 1 && clobber(x) 13710 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13711 for { 13712 i := v.AuxInt 13713 s := v.Aux 13714 _ = v.Args[2] 13715 p := v.Args[0] 13716 v_1 := v.Args[1] 13717 if v_1.Op != OpS390XSRDconst { 13718 break 13719 } 13720 j := v_1.AuxInt 13721 w := v_1.Args[0] 13722 x := v.Args[2] 13723 if x.Op != OpS390XMOVHBRstore { 13724 break 13725 } 13726 if x.AuxInt != i-2 { 13727 break 13728 } 13729 if x.Aux != s { 13730 break 13731 } 13732 _ = x.Args[2] 13733 if p != x.Args[0] { 13734 break 13735 } 13736 w0 := x.Args[1] 13737 if w0.Op != OpS390XSRDconst { 13738 break 13739 } 13740 if w0.AuxInt != j-16 { 13741 break 13742 } 13743 if w != w0.Args[0] { 13744 break 13745 } 13746 mem := x.Args[2] 13747 if !(x.Uses == 1 && clobber(x)) { 13748 break 13749 } 13750 v.reset(OpS390XMOVWBRstore) 13751 v.AuxInt = i - 2 13752 v.Aux = s 13753 v.AddArg(p) 13754 v.AddArg(w0) 13755 v.AddArg(mem) 13756 return true 13757 } 13758 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13759 // cond: x.Uses == 1 && clobber(x) 13760 // result: (MOVWBRstore [i-2] {s} p w mem) 13761 for { 13762 i := v.AuxInt 13763 s := v.Aux 13764 _ = v.Args[2] 13765 p := v.Args[0] 13766 v_1 := v.Args[1] 13767 if v_1.Op != OpS390XSRWconst { 13768 break 13769 } 13770 if v_1.AuxInt != 16 { 13771 break 13772 } 13773 w := v_1.Args[0] 13774 x := v.Args[2] 13775 if x.Op != OpS390XMOVHBRstore { 13776 break 13777 } 13778 if x.AuxInt != i-2 { 13779 break 13780 } 13781 if x.Aux != s { 13782 break 13783 } 13784 _ = x.Args[2] 13785 if p != x.Args[0] { 13786 break 13787 } 13788 if w != x.Args[1] { 13789 break 13790 } 13791 mem := x.Args[2] 13792 if !(x.Uses == 1 && clobber(x)) { 13793 break 13794 } 13795 v.reset(OpS390XMOVWBRstore) 13796 v.AuxInt = i - 2 13797 v.Aux = s 13798 v.AddArg(p) 13799 v.AddArg(w) 13800 v.AddArg(mem) 13801 return true 13802 } 13803 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 13804 // cond: x.Uses == 1 && clobber(x) 13805 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13806 for { 13807 i := v.AuxInt 13808 s := v.Aux 13809 _ = v.Args[2] 13810 p := v.Args[0] 13811 v_1 := v.Args[1] 13812 if v_1.Op != OpS390XSRWconst { 13813 break 13814 } 13815 j := v_1.AuxInt 13816 w := v_1.Args[0] 13817 x := v.Args[2] 13818 if x.Op != OpS390XMOVHBRstore { 13819 break 13820 } 13821 if x.AuxInt != i-2 { 13822 break 13823 } 13824 if x.Aux != s { 13825 break 13826 } 13827 _ = x.Args[2] 13828 if p != x.Args[0] { 13829 break 13830 } 13831 w0 := x.Args[1] 13832 if w0.Op != OpS390XSRWconst { 13833 break 13834 } 13835 if w0.AuxInt != j-16 { 13836 break 13837 } 13838 if w != w0.Args[0] { 13839 break 13840 } 13841 mem := x.Args[2] 13842 if !(x.Uses == 1 && clobber(x)) { 13843 break 13844 } 13845 v.reset(OpS390XMOVWBRstore) 13846 v.AuxInt = i - 2 13847 v.Aux = s 13848 v.AddArg(p) 13849 v.AddArg(w0) 13850 v.AddArg(mem) 13851 return true 13852 } 13853 return false 13854 } 13855 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 13856 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13857 // cond: x.Uses == 1 && clobber(x) 13858 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13859 for { 13860 i := v.AuxInt 13861 s := v.Aux 13862 _ = v.Args[3] 13863 p := v.Args[0] 13864 idx := v.Args[1] 13865 v_2 := v.Args[2] 13866 if v_2.Op != OpS390XSRDconst { 13867 break 13868 } 13869 if v_2.AuxInt != 16 { 13870 break 13871 } 13872 w := v_2.Args[0] 13873 x := v.Args[3] 13874 if x.Op != OpS390XMOVHBRstoreidx { 13875 break 13876 } 13877 if x.AuxInt != i-2 { 13878 break 13879 } 13880 if x.Aux != s { 13881 break 13882 } 13883 _ = x.Args[3] 13884 if p != x.Args[0] { 13885 break 13886 } 13887 if idx != x.Args[1] { 13888 break 13889 } 13890 if w != x.Args[2] { 13891 break 13892 } 13893 mem := x.Args[3] 13894 if !(x.Uses == 1 && clobber(x)) { 13895 break 13896 } 13897 v.reset(OpS390XMOVWBRstoreidx) 13898 v.AuxInt = i - 2 13899 v.Aux = s 13900 v.AddArg(p) 13901 v.AddArg(idx) 13902 v.AddArg(w) 13903 v.AddArg(mem) 13904 return true 13905 } 13906 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13907 // cond: x.Uses == 1 && clobber(x) 13908 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13909 for { 13910 i := v.AuxInt 13911 s := v.Aux 13912 _ = v.Args[3] 13913 p := v.Args[0] 13914 idx := v.Args[1] 13915 v_2 := v.Args[2] 13916 if v_2.Op != OpS390XSRDconst { 13917 break 13918 } 13919 if v_2.AuxInt != 16 { 13920 break 13921 } 13922 w := v_2.Args[0] 13923 x := v.Args[3] 13924 if x.Op != OpS390XMOVHBRstoreidx { 13925 break 13926 } 13927 if x.AuxInt != i-2 { 13928 break 13929 } 13930 if x.Aux != s { 13931 break 13932 } 13933 _ = x.Args[3] 13934 if idx != x.Args[0] { 13935 break 13936 } 13937 if p != x.Args[1] { 13938 break 13939 } 13940 if w != x.Args[2] { 13941 break 13942 } 13943 mem := x.Args[3] 13944 if !(x.Uses == 1 && clobber(x)) { 13945 break 13946 } 13947 v.reset(OpS390XMOVWBRstoreidx) 13948 v.AuxInt = i - 2 13949 v.Aux = s 13950 v.AddArg(p) 13951 v.AddArg(idx) 13952 v.AddArg(w) 13953 v.AddArg(mem) 13954 return true 13955 } 13956 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13957 // cond: x.Uses == 1 && clobber(x) 13958 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13959 for { 13960 i := v.AuxInt 13961 s := v.Aux 13962 _ = v.Args[3] 13963 idx := v.Args[0] 13964 p := v.Args[1] 13965 v_2 := v.Args[2] 13966 if v_2.Op != OpS390XSRDconst { 13967 break 13968 } 13969 if v_2.AuxInt != 16 { 13970 break 13971 } 13972 w := v_2.Args[0] 13973 x := v.Args[3] 13974 if x.Op != OpS390XMOVHBRstoreidx { 13975 break 13976 } 13977 if x.AuxInt != i-2 { 13978 break 13979 } 13980 if x.Aux != s { 13981 break 13982 } 13983 _ = x.Args[3] 13984 if p != x.Args[0] { 13985 break 13986 } 13987 if idx != x.Args[1] { 13988 break 13989 } 13990 if w != x.Args[2] { 13991 break 13992 } 13993 mem := x.Args[3] 13994 if !(x.Uses == 1 && clobber(x)) { 13995 break 13996 } 13997 v.reset(OpS390XMOVWBRstoreidx) 13998 v.AuxInt = i - 2 13999 v.Aux = s 14000 v.AddArg(p) 14001 v.AddArg(idx) 14002 v.AddArg(w) 14003 v.AddArg(mem) 14004 return true 14005 } 14006 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14007 // cond: x.Uses == 1 && clobber(x) 14008 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14009 for { 14010 i := v.AuxInt 14011 s := v.Aux 14012 _ = v.Args[3] 14013 idx := v.Args[0] 14014 p := v.Args[1] 14015 v_2 := v.Args[2] 14016 if v_2.Op != OpS390XSRDconst { 14017 break 14018 } 14019 if v_2.AuxInt != 16 { 14020 break 14021 } 14022 w := v_2.Args[0] 14023 x := v.Args[3] 14024 if x.Op != OpS390XMOVHBRstoreidx { 14025 break 14026 } 14027 if x.AuxInt != i-2 { 14028 break 14029 } 14030 if x.Aux != s { 14031 break 14032 } 14033 _ = x.Args[3] 14034 if idx != x.Args[0] { 14035 break 14036 } 14037 if p != x.Args[1] { 14038 break 14039 } 14040 if w != x.Args[2] { 14041 break 14042 } 14043 mem := x.Args[3] 14044 if !(x.Uses == 1 && clobber(x)) { 14045 break 14046 } 14047 v.reset(OpS390XMOVWBRstoreidx) 14048 v.AuxInt = i - 2 14049 v.Aux = s 14050 v.AddArg(p) 14051 v.AddArg(idx) 14052 v.AddArg(w) 14053 v.AddArg(mem) 14054 return true 14055 } 14056 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 14057 // cond: x.Uses == 1 && clobber(x) 14058 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14059 for { 14060 i := v.AuxInt 14061 s := v.Aux 14062 _ = v.Args[3] 14063 p := v.Args[0] 14064 idx := v.Args[1] 14065 v_2 := v.Args[2] 14066 if v_2.Op != OpS390XSRDconst { 14067 break 14068 } 14069 j := v_2.AuxInt 14070 w := v_2.Args[0] 14071 x := v.Args[3] 14072 if x.Op != OpS390XMOVHBRstoreidx { 14073 break 14074 } 14075 if x.AuxInt != i-2 { 14076 break 14077 } 14078 if x.Aux != s { 14079 break 14080 } 14081 _ = x.Args[3] 14082 if p != x.Args[0] { 14083 break 14084 } 14085 if idx != x.Args[1] { 14086 break 14087 } 14088 w0 := x.Args[2] 14089 if w0.Op != OpS390XSRDconst { 14090 break 14091 } 14092 if w0.AuxInt != j-16 { 14093 break 14094 } 14095 if w != w0.Args[0] { 14096 break 14097 } 14098 mem := x.Args[3] 14099 if !(x.Uses == 1 && clobber(x)) { 14100 break 14101 } 14102 v.reset(OpS390XMOVWBRstoreidx) 14103 v.AuxInt = i - 2 14104 v.Aux = s 14105 v.AddArg(p) 14106 v.AddArg(idx) 14107 v.AddArg(w0) 14108 v.AddArg(mem) 14109 return true 14110 } 14111 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 14112 // cond: x.Uses == 1 && clobber(x) 14113 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14114 for { 14115 i := v.AuxInt 14116 s := v.Aux 14117 _ = v.Args[3] 14118 p := v.Args[0] 14119 idx := v.Args[1] 14120 v_2 := v.Args[2] 14121 if v_2.Op != OpS390XSRDconst { 14122 break 14123 } 14124 j := v_2.AuxInt 14125 w := v_2.Args[0] 14126 x := v.Args[3] 14127 if x.Op != OpS390XMOVHBRstoreidx { 14128 break 14129 } 14130 if x.AuxInt != i-2 { 14131 break 14132 } 14133 if x.Aux != s { 14134 break 14135 } 14136 _ = x.Args[3] 14137 if idx != x.Args[0] { 14138 break 14139 } 14140 if p != x.Args[1] { 14141 break 14142 } 14143 w0 := x.Args[2] 14144 if w0.Op != OpS390XSRDconst { 14145 break 14146 } 14147 if w0.AuxInt != j-16 { 14148 break 14149 } 14150 if w != w0.Args[0] { 14151 break 14152 } 14153 mem := x.Args[3] 14154 if !(x.Uses == 1 && clobber(x)) { 14155 break 14156 } 14157 v.reset(OpS390XMOVWBRstoreidx) 14158 v.AuxInt = i - 2 14159 v.Aux = s 14160 v.AddArg(p) 14161 v.AddArg(idx) 14162 v.AddArg(w0) 14163 v.AddArg(mem) 14164 return true 14165 } 14166 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 14167 // cond: x.Uses == 1 && clobber(x) 14168 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14169 for { 14170 i := v.AuxInt 14171 s := v.Aux 14172 _ = v.Args[3] 14173 idx := v.Args[0] 14174 p := v.Args[1] 14175 v_2 := v.Args[2] 14176 if v_2.Op != OpS390XSRDconst { 14177 break 14178 } 14179 j := v_2.AuxInt 14180 w := v_2.Args[0] 14181 x := v.Args[3] 14182 if x.Op != OpS390XMOVHBRstoreidx { 14183 break 14184 } 14185 if x.AuxInt != i-2 { 14186 break 14187 } 14188 if x.Aux != s { 14189 break 14190 } 14191 _ = x.Args[3] 14192 if p != x.Args[0] { 14193 break 14194 } 14195 if idx != x.Args[1] { 14196 break 14197 } 14198 w0 := x.Args[2] 14199 if w0.Op != OpS390XSRDconst { 14200 break 14201 } 14202 if w0.AuxInt != j-16 { 14203 break 14204 } 14205 if w != w0.Args[0] { 14206 break 14207 } 14208 mem := x.Args[3] 14209 if !(x.Uses == 1 && clobber(x)) { 14210 break 14211 } 14212 v.reset(OpS390XMOVWBRstoreidx) 14213 v.AuxInt = i - 2 14214 v.Aux = s 14215 v.AddArg(p) 14216 v.AddArg(idx) 14217 v.AddArg(w0) 14218 v.AddArg(mem) 14219 return true 14220 } 14221 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 14222 // cond: x.Uses == 1 && clobber(x) 14223 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14224 for { 14225 i := v.AuxInt 14226 s := v.Aux 14227 _ = v.Args[3] 14228 idx := v.Args[0] 14229 p := v.Args[1] 14230 v_2 := v.Args[2] 14231 if v_2.Op != OpS390XSRDconst { 14232 break 14233 } 14234 j := v_2.AuxInt 14235 w := v_2.Args[0] 14236 x := v.Args[3] 14237 if x.Op != OpS390XMOVHBRstoreidx { 14238 break 14239 } 14240 if x.AuxInt != i-2 { 14241 break 14242 } 14243 if x.Aux != s { 14244 break 14245 } 14246 _ = x.Args[3] 14247 if idx != x.Args[0] { 14248 break 14249 } 14250 if p != x.Args[1] { 14251 break 14252 } 14253 w0 := x.Args[2] 14254 if w0.Op != OpS390XSRDconst { 14255 break 14256 } 14257 if w0.AuxInt != j-16 { 14258 break 14259 } 14260 if w != w0.Args[0] { 14261 break 14262 } 14263 mem := x.Args[3] 14264 if !(x.Uses == 1 && clobber(x)) { 14265 break 14266 } 14267 v.reset(OpS390XMOVWBRstoreidx) 14268 v.AuxInt = i - 2 14269 v.Aux = s 14270 v.AddArg(p) 14271 v.AddArg(idx) 14272 v.AddArg(w0) 14273 v.AddArg(mem) 14274 return true 14275 } 14276 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14277 // cond: x.Uses == 1 && clobber(x) 14278 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14279 for { 14280 i := v.AuxInt 14281 s := v.Aux 14282 _ = v.Args[3] 14283 p := v.Args[0] 14284 idx := v.Args[1] 14285 v_2 := v.Args[2] 14286 if v_2.Op != OpS390XSRWconst { 14287 break 14288 } 14289 if v_2.AuxInt != 16 { 14290 break 14291 } 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 p != x.Args[0] { 14305 break 14306 } 14307 if idx != x.Args[1] { 14308 break 14309 } 14310 if w != x.Args[2] { 14311 break 14312 } 14313 mem := x.Args[3] 14314 if !(x.Uses == 1 && clobber(x)) { 14315 break 14316 } 14317 v.reset(OpS390XMOVWBRstoreidx) 14318 v.AuxInt = i - 2 14319 v.Aux = s 14320 v.AddArg(p) 14321 v.AddArg(idx) 14322 v.AddArg(w) 14323 v.AddArg(mem) 14324 return true 14325 } 14326 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14327 // cond: x.Uses == 1 && clobber(x) 14328 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14329 for { 14330 i := v.AuxInt 14331 s := v.Aux 14332 _ = v.Args[3] 14333 p := v.Args[0] 14334 idx := v.Args[1] 14335 v_2 := v.Args[2] 14336 if v_2.Op != OpS390XSRWconst { 14337 break 14338 } 14339 if v_2.AuxInt != 16 { 14340 break 14341 } 14342 w := v_2.Args[0] 14343 x := v.Args[3] 14344 if x.Op != OpS390XMOVHBRstoreidx { 14345 break 14346 } 14347 if x.AuxInt != i-2 { 14348 break 14349 } 14350 if x.Aux != s { 14351 break 14352 } 14353 _ = x.Args[3] 14354 if idx != x.Args[0] { 14355 break 14356 } 14357 if p != x.Args[1] { 14358 break 14359 } 14360 if w != x.Args[2] { 14361 break 14362 } 14363 mem := x.Args[3] 14364 if !(x.Uses == 1 && clobber(x)) { 14365 break 14366 } 14367 v.reset(OpS390XMOVWBRstoreidx) 14368 v.AuxInt = i - 2 14369 v.Aux = s 14370 v.AddArg(p) 14371 v.AddArg(idx) 14372 v.AddArg(w) 14373 v.AddArg(mem) 14374 return true 14375 } 14376 return false 14377 } 14378 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 14379 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 14380 // cond: x.Uses == 1 && clobber(x) 14381 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14382 for { 14383 i := v.AuxInt 14384 s := v.Aux 14385 _ = v.Args[3] 14386 idx := v.Args[0] 14387 p := v.Args[1] 14388 v_2 := v.Args[2] 14389 if v_2.Op != OpS390XSRWconst { 14390 break 14391 } 14392 if v_2.AuxInt != 16 { 14393 break 14394 } 14395 w := v_2.Args[0] 14396 x := v.Args[3] 14397 if x.Op != OpS390XMOVHBRstoreidx { 14398 break 14399 } 14400 if x.AuxInt != i-2 { 14401 break 14402 } 14403 if x.Aux != s { 14404 break 14405 } 14406 _ = x.Args[3] 14407 if p != x.Args[0] { 14408 break 14409 } 14410 if idx != x.Args[1] { 14411 break 14412 } 14413 if w != x.Args[2] { 14414 break 14415 } 14416 mem := x.Args[3] 14417 if !(x.Uses == 1 && clobber(x)) { 14418 break 14419 } 14420 v.reset(OpS390XMOVWBRstoreidx) 14421 v.AuxInt = i - 2 14422 v.Aux = s 14423 v.AddArg(p) 14424 v.AddArg(idx) 14425 v.AddArg(w) 14426 v.AddArg(mem) 14427 return true 14428 } 14429 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 14430 // cond: x.Uses == 1 && clobber(x) 14431 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 14432 for { 14433 i := v.AuxInt 14434 s := v.Aux 14435 _ = v.Args[3] 14436 idx := v.Args[0] 14437 p := v.Args[1] 14438 v_2 := v.Args[2] 14439 if v_2.Op != OpS390XSRWconst { 14440 break 14441 } 14442 if v_2.AuxInt != 16 { 14443 break 14444 } 14445 w := v_2.Args[0] 14446 x := v.Args[3] 14447 if x.Op != OpS390XMOVHBRstoreidx { 14448 break 14449 } 14450 if x.AuxInt != i-2 { 14451 break 14452 } 14453 if x.Aux != s { 14454 break 14455 } 14456 _ = x.Args[3] 14457 if idx != x.Args[0] { 14458 break 14459 } 14460 if p != x.Args[1] { 14461 break 14462 } 14463 if w != x.Args[2] { 14464 break 14465 } 14466 mem := x.Args[3] 14467 if !(x.Uses == 1 && clobber(x)) { 14468 break 14469 } 14470 v.reset(OpS390XMOVWBRstoreidx) 14471 v.AuxInt = i - 2 14472 v.Aux = s 14473 v.AddArg(p) 14474 v.AddArg(idx) 14475 v.AddArg(w) 14476 v.AddArg(mem) 14477 return true 14478 } 14479 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 14480 // cond: x.Uses == 1 && clobber(x) 14481 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14482 for { 14483 i := v.AuxInt 14484 s := v.Aux 14485 _ = v.Args[3] 14486 p := v.Args[0] 14487 idx := v.Args[1] 14488 v_2 := v.Args[2] 14489 if v_2.Op != OpS390XSRWconst { 14490 break 14491 } 14492 j := v_2.AuxInt 14493 w := v_2.Args[0] 14494 x := v.Args[3] 14495 if x.Op != OpS390XMOVHBRstoreidx { 14496 break 14497 } 14498 if x.AuxInt != i-2 { 14499 break 14500 } 14501 if x.Aux != s { 14502 break 14503 } 14504 _ = x.Args[3] 14505 if p != x.Args[0] { 14506 break 14507 } 14508 if idx != x.Args[1] { 14509 break 14510 } 14511 w0 := x.Args[2] 14512 if w0.Op != OpS390XSRWconst { 14513 break 14514 } 14515 if w0.AuxInt != j-16 { 14516 break 14517 } 14518 if w != w0.Args[0] { 14519 break 14520 } 14521 mem := x.Args[3] 14522 if !(x.Uses == 1 && clobber(x)) { 14523 break 14524 } 14525 v.reset(OpS390XMOVWBRstoreidx) 14526 v.AuxInt = i - 2 14527 v.Aux = s 14528 v.AddArg(p) 14529 v.AddArg(idx) 14530 v.AddArg(w0) 14531 v.AddArg(mem) 14532 return true 14533 } 14534 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14535 // cond: x.Uses == 1 && clobber(x) 14536 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14537 for { 14538 i := v.AuxInt 14539 s := v.Aux 14540 _ = v.Args[3] 14541 p := v.Args[0] 14542 idx := v.Args[1] 14543 v_2 := v.Args[2] 14544 if v_2.Op != OpS390XSRWconst { 14545 break 14546 } 14547 j := v_2.AuxInt 14548 w := v_2.Args[0] 14549 x := v.Args[3] 14550 if x.Op != OpS390XMOVHBRstoreidx { 14551 break 14552 } 14553 if x.AuxInt != i-2 { 14554 break 14555 } 14556 if x.Aux != s { 14557 break 14558 } 14559 _ = x.Args[3] 14560 if idx != x.Args[0] { 14561 break 14562 } 14563 if p != x.Args[1] { 14564 break 14565 } 14566 w0 := x.Args[2] 14567 if w0.Op != OpS390XSRWconst { 14568 break 14569 } 14570 if w0.AuxInt != j-16 { 14571 break 14572 } 14573 if w != w0.Args[0] { 14574 break 14575 } 14576 mem := x.Args[3] 14577 if !(x.Uses == 1 && clobber(x)) { 14578 break 14579 } 14580 v.reset(OpS390XMOVWBRstoreidx) 14581 v.AuxInt = i - 2 14582 v.Aux = s 14583 v.AddArg(p) 14584 v.AddArg(idx) 14585 v.AddArg(w0) 14586 v.AddArg(mem) 14587 return true 14588 } 14589 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 14590 // cond: x.Uses == 1 && clobber(x) 14591 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14592 for { 14593 i := v.AuxInt 14594 s := v.Aux 14595 _ = v.Args[3] 14596 idx := v.Args[0] 14597 p := v.Args[1] 14598 v_2 := v.Args[2] 14599 if v_2.Op != OpS390XSRWconst { 14600 break 14601 } 14602 j := v_2.AuxInt 14603 w := v_2.Args[0] 14604 x := v.Args[3] 14605 if x.Op != OpS390XMOVHBRstoreidx { 14606 break 14607 } 14608 if x.AuxInt != i-2 { 14609 break 14610 } 14611 if x.Aux != s { 14612 break 14613 } 14614 _ = x.Args[3] 14615 if p != x.Args[0] { 14616 break 14617 } 14618 if idx != x.Args[1] { 14619 break 14620 } 14621 w0 := x.Args[2] 14622 if w0.Op != OpS390XSRWconst { 14623 break 14624 } 14625 if w0.AuxInt != j-16 { 14626 break 14627 } 14628 if w != w0.Args[0] { 14629 break 14630 } 14631 mem := x.Args[3] 14632 if !(x.Uses == 1 && clobber(x)) { 14633 break 14634 } 14635 v.reset(OpS390XMOVWBRstoreidx) 14636 v.AuxInt = i - 2 14637 v.Aux = s 14638 v.AddArg(p) 14639 v.AddArg(idx) 14640 v.AddArg(w0) 14641 v.AddArg(mem) 14642 return true 14643 } 14644 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14645 // cond: x.Uses == 1 && clobber(x) 14646 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14647 for { 14648 i := v.AuxInt 14649 s := v.Aux 14650 _ = v.Args[3] 14651 idx := v.Args[0] 14652 p := v.Args[1] 14653 v_2 := v.Args[2] 14654 if v_2.Op != OpS390XSRWconst { 14655 break 14656 } 14657 j := v_2.AuxInt 14658 w := v_2.Args[0] 14659 x := v.Args[3] 14660 if x.Op != OpS390XMOVHBRstoreidx { 14661 break 14662 } 14663 if x.AuxInt != i-2 { 14664 break 14665 } 14666 if x.Aux != s { 14667 break 14668 } 14669 _ = x.Args[3] 14670 if idx != x.Args[0] { 14671 break 14672 } 14673 if p != x.Args[1] { 14674 break 14675 } 14676 w0 := x.Args[2] 14677 if w0.Op != OpS390XSRWconst { 14678 break 14679 } 14680 if w0.AuxInt != j-16 { 14681 break 14682 } 14683 if w != w0.Args[0] { 14684 break 14685 } 14686 mem := x.Args[3] 14687 if !(x.Uses == 1 && clobber(x)) { 14688 break 14689 } 14690 v.reset(OpS390XMOVWBRstoreidx) 14691 v.AuxInt = i - 2 14692 v.Aux = s 14693 v.AddArg(p) 14694 v.AddArg(idx) 14695 v.AddArg(w0) 14696 v.AddArg(mem) 14697 return true 14698 } 14699 return false 14700 } 14701 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 14702 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 14703 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 14704 // result: (MOVHZreg x) 14705 for { 14706 off := v.AuxInt 14707 sym := v.Aux 14708 _ = v.Args[1] 14709 ptr := v.Args[0] 14710 v_1 := v.Args[1] 14711 if v_1.Op != OpS390XMOVHstore { 14712 break 14713 } 14714 off2 := v_1.AuxInt 14715 sym2 := v_1.Aux 14716 _ = v_1.Args[2] 14717 ptr2 := v_1.Args[0] 14718 x := v_1.Args[1] 14719 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 14720 break 14721 } 14722 v.reset(OpS390XMOVHZreg) 14723 v.AddArg(x) 14724 return true 14725 } 14726 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 14727 // cond: is20Bit(off1+off2) 14728 // result: (MOVHZload [off1+off2] {sym} ptr mem) 14729 for { 14730 off1 := v.AuxInt 14731 sym := v.Aux 14732 _ = v.Args[1] 14733 v_0 := v.Args[0] 14734 if v_0.Op != OpS390XADDconst { 14735 break 14736 } 14737 off2 := v_0.AuxInt 14738 ptr := v_0.Args[0] 14739 mem := v.Args[1] 14740 if !(is20Bit(off1 + off2)) { 14741 break 14742 } 14743 v.reset(OpS390XMOVHZload) 14744 v.AuxInt = off1 + off2 14745 v.Aux = sym 14746 v.AddArg(ptr) 14747 v.AddArg(mem) 14748 return true 14749 } 14750 // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 14751 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14752 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14753 for { 14754 off1 := v.AuxInt 14755 sym1 := v.Aux 14756 _ = v.Args[1] 14757 v_0 := v.Args[0] 14758 if v_0.Op != OpS390XMOVDaddr { 14759 break 14760 } 14761 off2 := v_0.AuxInt 14762 sym2 := v_0.Aux 14763 base := v_0.Args[0] 14764 mem := v.Args[1] 14765 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14766 break 14767 } 14768 v.reset(OpS390XMOVHZload) 14769 v.AuxInt = off1 + off2 14770 v.Aux = mergeSym(sym1, sym2) 14771 v.AddArg(base) 14772 v.AddArg(mem) 14773 return true 14774 } 14775 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 14776 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14777 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 14778 for { 14779 off1 := v.AuxInt 14780 sym1 := v.Aux 14781 _ = v.Args[1] 14782 v_0 := v.Args[0] 14783 if v_0.Op != OpS390XMOVDaddridx { 14784 break 14785 } 14786 off2 := v_0.AuxInt 14787 sym2 := v_0.Aux 14788 _ = v_0.Args[1] 14789 ptr := v_0.Args[0] 14790 idx := v_0.Args[1] 14791 mem := v.Args[1] 14792 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14793 break 14794 } 14795 v.reset(OpS390XMOVHZloadidx) 14796 v.AuxInt = off1 + off2 14797 v.Aux = mergeSym(sym1, sym2) 14798 v.AddArg(ptr) 14799 v.AddArg(idx) 14800 v.AddArg(mem) 14801 return true 14802 } 14803 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 14804 // cond: ptr.Op != OpSB 14805 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 14806 for { 14807 off := v.AuxInt 14808 sym := v.Aux 14809 _ = v.Args[1] 14810 v_0 := v.Args[0] 14811 if v_0.Op != OpS390XADD { 14812 break 14813 } 14814 _ = v_0.Args[1] 14815 ptr := v_0.Args[0] 14816 idx := v_0.Args[1] 14817 mem := v.Args[1] 14818 if !(ptr.Op != OpSB) { 14819 break 14820 } 14821 v.reset(OpS390XMOVHZloadidx) 14822 v.AuxInt = off 14823 v.Aux = sym 14824 v.AddArg(ptr) 14825 v.AddArg(idx) 14826 v.AddArg(mem) 14827 return true 14828 } 14829 return false 14830 } 14831 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 14832 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 14833 // cond: 14834 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14835 for { 14836 c := v.AuxInt 14837 sym := v.Aux 14838 _ = v.Args[2] 14839 v_0 := v.Args[0] 14840 if v_0.Op != OpS390XADDconst { 14841 break 14842 } 14843 d := v_0.AuxInt 14844 ptr := v_0.Args[0] 14845 idx := v.Args[1] 14846 mem := v.Args[2] 14847 v.reset(OpS390XMOVHZloadidx) 14848 v.AuxInt = c + d 14849 v.Aux = sym 14850 v.AddArg(ptr) 14851 v.AddArg(idx) 14852 v.AddArg(mem) 14853 return true 14854 } 14855 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 14856 // cond: 14857 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14858 for { 14859 c := v.AuxInt 14860 sym := v.Aux 14861 _ = v.Args[2] 14862 idx := v.Args[0] 14863 v_1 := v.Args[1] 14864 if v_1.Op != OpS390XADDconst { 14865 break 14866 } 14867 d := v_1.AuxInt 14868 ptr := v_1.Args[0] 14869 mem := v.Args[2] 14870 v.reset(OpS390XMOVHZloadidx) 14871 v.AuxInt = c + d 14872 v.Aux = sym 14873 v.AddArg(ptr) 14874 v.AddArg(idx) 14875 v.AddArg(mem) 14876 return true 14877 } 14878 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 14879 // cond: 14880 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14881 for { 14882 c := v.AuxInt 14883 sym := v.Aux 14884 _ = v.Args[2] 14885 ptr := v.Args[0] 14886 v_1 := v.Args[1] 14887 if v_1.Op != OpS390XADDconst { 14888 break 14889 } 14890 d := v_1.AuxInt 14891 idx := v_1.Args[0] 14892 mem := v.Args[2] 14893 v.reset(OpS390XMOVHZloadidx) 14894 v.AuxInt = c + d 14895 v.Aux = sym 14896 v.AddArg(ptr) 14897 v.AddArg(idx) 14898 v.AddArg(mem) 14899 return true 14900 } 14901 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 14902 // cond: 14903 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14904 for { 14905 c := v.AuxInt 14906 sym := v.Aux 14907 _ = v.Args[2] 14908 v_0 := v.Args[0] 14909 if v_0.Op != OpS390XADDconst { 14910 break 14911 } 14912 d := v_0.AuxInt 14913 idx := v_0.Args[0] 14914 ptr := v.Args[1] 14915 mem := v.Args[2] 14916 v.reset(OpS390XMOVHZloadidx) 14917 v.AuxInt = c + d 14918 v.Aux = sym 14919 v.AddArg(ptr) 14920 v.AddArg(idx) 14921 v.AddArg(mem) 14922 return true 14923 } 14924 return false 14925 } 14926 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 14927 b := v.Block 14928 _ = b 14929 // match: (MOVHZreg x:(MOVBZload _ _)) 14930 // cond: 14931 // result: (MOVDreg x) 14932 for { 14933 x := v.Args[0] 14934 if x.Op != OpS390XMOVBZload { 14935 break 14936 } 14937 _ = x.Args[1] 14938 v.reset(OpS390XMOVDreg) 14939 v.AddArg(x) 14940 return true 14941 } 14942 // match: (MOVHZreg x:(MOVHZload _ _)) 14943 // cond: 14944 // result: (MOVDreg x) 14945 for { 14946 x := v.Args[0] 14947 if x.Op != OpS390XMOVHZload { 14948 break 14949 } 14950 _ = x.Args[1] 14951 v.reset(OpS390XMOVDreg) 14952 v.AddArg(x) 14953 return true 14954 } 14955 // match: (MOVHZreg x:(Arg <t>)) 14956 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 14957 // result: (MOVDreg x) 14958 for { 14959 x := v.Args[0] 14960 if x.Op != OpArg { 14961 break 14962 } 14963 t := x.Type 14964 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 14965 break 14966 } 14967 v.reset(OpS390XMOVDreg) 14968 v.AddArg(x) 14969 return true 14970 } 14971 // match: (MOVHZreg x:(MOVBZreg _)) 14972 // cond: 14973 // result: (MOVDreg x) 14974 for { 14975 x := v.Args[0] 14976 if x.Op != OpS390XMOVBZreg { 14977 break 14978 } 14979 v.reset(OpS390XMOVDreg) 14980 v.AddArg(x) 14981 return true 14982 } 14983 // match: (MOVHZreg x:(MOVHZreg _)) 14984 // cond: 14985 // result: (MOVDreg x) 14986 for { 14987 x := v.Args[0] 14988 if x.Op != OpS390XMOVHZreg { 14989 break 14990 } 14991 v.reset(OpS390XMOVDreg) 14992 v.AddArg(x) 14993 return true 14994 } 14995 // match: (MOVHZreg (MOVDconst [c])) 14996 // cond: 14997 // result: (MOVDconst [int64(uint16(c))]) 14998 for { 14999 v_0 := v.Args[0] 15000 if v_0.Op != OpS390XMOVDconst { 15001 break 15002 } 15003 c := v_0.AuxInt 15004 v.reset(OpS390XMOVDconst) 15005 v.AuxInt = int64(uint16(c)) 15006 return true 15007 } 15008 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 15009 // cond: x.Uses == 1 && clobber(x) 15010 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 15011 for { 15012 x := v.Args[0] 15013 if x.Op != OpS390XMOVHZload { 15014 break 15015 } 15016 off := x.AuxInt 15017 sym := x.Aux 15018 _ = x.Args[1] 15019 ptr := x.Args[0] 15020 mem := x.Args[1] 15021 if !(x.Uses == 1 && clobber(x)) { 15022 break 15023 } 15024 b = x.Block 15025 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 15026 v.reset(OpCopy) 15027 v.AddArg(v0) 15028 v0.AuxInt = off 15029 v0.Aux = sym 15030 v0.AddArg(ptr) 15031 v0.AddArg(mem) 15032 return true 15033 } 15034 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 15035 // cond: x.Uses == 1 && clobber(x) 15036 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 15037 for { 15038 x := v.Args[0] 15039 if x.Op != OpS390XMOVHZloadidx { 15040 break 15041 } 15042 off := x.AuxInt 15043 sym := x.Aux 15044 _ = x.Args[2] 15045 ptr := x.Args[0] 15046 idx := x.Args[1] 15047 mem := x.Args[2] 15048 if !(x.Uses == 1 && clobber(x)) { 15049 break 15050 } 15051 b = x.Block 15052 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 15053 v.reset(OpCopy) 15054 v.AddArg(v0) 15055 v0.AuxInt = off 15056 v0.Aux = sym 15057 v0.AddArg(ptr) 15058 v0.AddArg(idx) 15059 v0.AddArg(mem) 15060 return true 15061 } 15062 return false 15063 } 15064 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 15065 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 15066 // cond: is20Bit(off1+off2) 15067 // result: (MOVHload [off1+off2] {sym} ptr mem) 15068 for { 15069 off1 := v.AuxInt 15070 sym := v.Aux 15071 _ = v.Args[1] 15072 v_0 := v.Args[0] 15073 if v_0.Op != OpS390XADDconst { 15074 break 15075 } 15076 off2 := v_0.AuxInt 15077 ptr := v_0.Args[0] 15078 mem := v.Args[1] 15079 if !(is20Bit(off1 + off2)) { 15080 break 15081 } 15082 v.reset(OpS390XMOVHload) 15083 v.AuxInt = off1 + off2 15084 v.Aux = sym 15085 v.AddArg(ptr) 15086 v.AddArg(mem) 15087 return true 15088 } 15089 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 15090 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15091 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 15092 for { 15093 off1 := v.AuxInt 15094 sym1 := v.Aux 15095 _ = v.Args[1] 15096 v_0 := v.Args[0] 15097 if v_0.Op != OpS390XMOVDaddr { 15098 break 15099 } 15100 off2 := v_0.AuxInt 15101 sym2 := v_0.Aux 15102 base := v_0.Args[0] 15103 mem := v.Args[1] 15104 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15105 break 15106 } 15107 v.reset(OpS390XMOVHload) 15108 v.AuxInt = off1 + off2 15109 v.Aux = mergeSym(sym1, sym2) 15110 v.AddArg(base) 15111 v.AddArg(mem) 15112 return true 15113 } 15114 return false 15115 } 15116 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 15117 b := v.Block 15118 _ = b 15119 // match: (MOVHreg x:(MOVBload _ _)) 15120 // cond: 15121 // result: (MOVDreg x) 15122 for { 15123 x := v.Args[0] 15124 if x.Op != OpS390XMOVBload { 15125 break 15126 } 15127 _ = x.Args[1] 15128 v.reset(OpS390XMOVDreg) 15129 v.AddArg(x) 15130 return true 15131 } 15132 // match: (MOVHreg x:(MOVBZload _ _)) 15133 // cond: 15134 // result: (MOVDreg x) 15135 for { 15136 x := v.Args[0] 15137 if x.Op != OpS390XMOVBZload { 15138 break 15139 } 15140 _ = x.Args[1] 15141 v.reset(OpS390XMOVDreg) 15142 v.AddArg(x) 15143 return true 15144 } 15145 // match: (MOVHreg x:(MOVHload _ _)) 15146 // cond: 15147 // result: (MOVDreg x) 15148 for { 15149 x := v.Args[0] 15150 if x.Op != OpS390XMOVHload { 15151 break 15152 } 15153 _ = x.Args[1] 15154 v.reset(OpS390XMOVDreg) 15155 v.AddArg(x) 15156 return true 15157 } 15158 // match: (MOVHreg x:(Arg <t>)) 15159 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 15160 // result: (MOVDreg x) 15161 for { 15162 x := v.Args[0] 15163 if x.Op != OpArg { 15164 break 15165 } 15166 t := x.Type 15167 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 15168 break 15169 } 15170 v.reset(OpS390XMOVDreg) 15171 v.AddArg(x) 15172 return true 15173 } 15174 // match: (MOVHreg x:(MOVBreg _)) 15175 // cond: 15176 // result: (MOVDreg x) 15177 for { 15178 x := v.Args[0] 15179 if x.Op != OpS390XMOVBreg { 15180 break 15181 } 15182 v.reset(OpS390XMOVDreg) 15183 v.AddArg(x) 15184 return true 15185 } 15186 // match: (MOVHreg x:(MOVBZreg _)) 15187 // cond: 15188 // result: (MOVDreg x) 15189 for { 15190 x := v.Args[0] 15191 if x.Op != OpS390XMOVBZreg { 15192 break 15193 } 15194 v.reset(OpS390XMOVDreg) 15195 v.AddArg(x) 15196 return true 15197 } 15198 // match: (MOVHreg x:(MOVHreg _)) 15199 // cond: 15200 // result: (MOVDreg x) 15201 for { 15202 x := v.Args[0] 15203 if x.Op != OpS390XMOVHreg { 15204 break 15205 } 15206 v.reset(OpS390XMOVDreg) 15207 v.AddArg(x) 15208 return true 15209 } 15210 // match: (MOVHreg (MOVDconst [c])) 15211 // cond: 15212 // result: (MOVDconst [int64(int16(c))]) 15213 for { 15214 v_0 := v.Args[0] 15215 if v_0.Op != OpS390XMOVDconst { 15216 break 15217 } 15218 c := v_0.AuxInt 15219 v.reset(OpS390XMOVDconst) 15220 v.AuxInt = int64(int16(c)) 15221 return true 15222 } 15223 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 15224 // cond: x.Uses == 1 && clobber(x) 15225 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 15226 for { 15227 x := v.Args[0] 15228 if x.Op != OpS390XMOVHZload { 15229 break 15230 } 15231 off := x.AuxInt 15232 sym := x.Aux 15233 _ = x.Args[1] 15234 ptr := x.Args[0] 15235 mem := x.Args[1] 15236 if !(x.Uses == 1 && clobber(x)) { 15237 break 15238 } 15239 b = x.Block 15240 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 15241 v.reset(OpCopy) 15242 v.AddArg(v0) 15243 v0.AuxInt = off 15244 v0.Aux = sym 15245 v0.AddArg(ptr) 15246 v0.AddArg(mem) 15247 return true 15248 } 15249 return false 15250 } 15251 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 15252 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 15253 // cond: 15254 // result: (MOVHstore [off] {sym} ptr x mem) 15255 for { 15256 off := v.AuxInt 15257 sym := v.Aux 15258 _ = v.Args[2] 15259 ptr := v.Args[0] 15260 v_1 := v.Args[1] 15261 if v_1.Op != OpS390XMOVHreg { 15262 break 15263 } 15264 x := v_1.Args[0] 15265 mem := v.Args[2] 15266 v.reset(OpS390XMOVHstore) 15267 v.AuxInt = off 15268 v.Aux = sym 15269 v.AddArg(ptr) 15270 v.AddArg(x) 15271 v.AddArg(mem) 15272 return true 15273 } 15274 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 15275 // cond: 15276 // result: (MOVHstore [off] {sym} ptr x mem) 15277 for { 15278 off := v.AuxInt 15279 sym := v.Aux 15280 _ = v.Args[2] 15281 ptr := v.Args[0] 15282 v_1 := v.Args[1] 15283 if v_1.Op != OpS390XMOVHZreg { 15284 break 15285 } 15286 x := v_1.Args[0] 15287 mem := v.Args[2] 15288 v.reset(OpS390XMOVHstore) 15289 v.AuxInt = off 15290 v.Aux = sym 15291 v.AddArg(ptr) 15292 v.AddArg(x) 15293 v.AddArg(mem) 15294 return true 15295 } 15296 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 15297 // cond: is20Bit(off1+off2) 15298 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 15299 for { 15300 off1 := v.AuxInt 15301 sym := v.Aux 15302 _ = v.Args[2] 15303 v_0 := v.Args[0] 15304 if v_0.Op != OpS390XADDconst { 15305 break 15306 } 15307 off2 := v_0.AuxInt 15308 ptr := v_0.Args[0] 15309 val := v.Args[1] 15310 mem := v.Args[2] 15311 if !(is20Bit(off1 + off2)) { 15312 break 15313 } 15314 v.reset(OpS390XMOVHstore) 15315 v.AuxInt = off1 + off2 15316 v.Aux = sym 15317 v.AddArg(ptr) 15318 v.AddArg(val) 15319 v.AddArg(mem) 15320 return true 15321 } 15322 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 15323 // cond: isU12Bit(off) && ptr.Op != OpSB 15324 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 15325 for { 15326 off := v.AuxInt 15327 sym := v.Aux 15328 _ = v.Args[2] 15329 ptr := v.Args[0] 15330 v_1 := v.Args[1] 15331 if v_1.Op != OpS390XMOVDconst { 15332 break 15333 } 15334 c := v_1.AuxInt 15335 mem := v.Args[2] 15336 if !(isU12Bit(off) && ptr.Op != OpSB) { 15337 break 15338 } 15339 v.reset(OpS390XMOVHstoreconst) 15340 v.AuxInt = makeValAndOff(int64(int16(c)), off) 15341 v.Aux = sym 15342 v.AddArg(ptr) 15343 v.AddArg(mem) 15344 return true 15345 } 15346 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 15347 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15348 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 15349 for { 15350 off1 := v.AuxInt 15351 sym1 := v.Aux 15352 _ = v.Args[2] 15353 v_0 := v.Args[0] 15354 if v_0.Op != OpS390XMOVDaddr { 15355 break 15356 } 15357 off2 := v_0.AuxInt 15358 sym2 := v_0.Aux 15359 base := v_0.Args[0] 15360 val := v.Args[1] 15361 mem := v.Args[2] 15362 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15363 break 15364 } 15365 v.reset(OpS390XMOVHstore) 15366 v.AuxInt = off1 + off2 15367 v.Aux = mergeSym(sym1, sym2) 15368 v.AddArg(base) 15369 v.AddArg(val) 15370 v.AddArg(mem) 15371 return true 15372 } 15373 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 15374 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 15375 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 15376 for { 15377 off1 := v.AuxInt 15378 sym1 := v.Aux 15379 _ = v.Args[2] 15380 v_0 := v.Args[0] 15381 if v_0.Op != OpS390XMOVDaddridx { 15382 break 15383 } 15384 off2 := v_0.AuxInt 15385 sym2 := v_0.Aux 15386 _ = v_0.Args[1] 15387 ptr := v_0.Args[0] 15388 idx := v_0.Args[1] 15389 val := v.Args[1] 15390 mem := v.Args[2] 15391 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 15392 break 15393 } 15394 v.reset(OpS390XMOVHstoreidx) 15395 v.AuxInt = off1 + off2 15396 v.Aux = mergeSym(sym1, sym2) 15397 v.AddArg(ptr) 15398 v.AddArg(idx) 15399 v.AddArg(val) 15400 v.AddArg(mem) 15401 return true 15402 } 15403 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 15404 // cond: ptr.Op != OpSB 15405 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 15406 for { 15407 off := v.AuxInt 15408 sym := v.Aux 15409 _ = v.Args[2] 15410 v_0 := v.Args[0] 15411 if v_0.Op != OpS390XADD { 15412 break 15413 } 15414 _ = v_0.Args[1] 15415 ptr := v_0.Args[0] 15416 idx := v_0.Args[1] 15417 val := v.Args[1] 15418 mem := v.Args[2] 15419 if !(ptr.Op != OpSB) { 15420 break 15421 } 15422 v.reset(OpS390XMOVHstoreidx) 15423 v.AuxInt = off 15424 v.Aux = sym 15425 v.AddArg(ptr) 15426 v.AddArg(idx) 15427 v.AddArg(val) 15428 v.AddArg(mem) 15429 return true 15430 } 15431 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 15432 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15433 // result: (MOVWstore [i-2] {s} p w mem) 15434 for { 15435 i := v.AuxInt 15436 s := v.Aux 15437 _ = v.Args[2] 15438 p := v.Args[0] 15439 w := v.Args[1] 15440 x := v.Args[2] 15441 if x.Op != OpS390XMOVHstore { 15442 break 15443 } 15444 if x.AuxInt != i-2 { 15445 break 15446 } 15447 if x.Aux != s { 15448 break 15449 } 15450 _ = x.Args[2] 15451 if p != x.Args[0] { 15452 break 15453 } 15454 x_1 := x.Args[1] 15455 if x_1.Op != OpS390XSRDconst { 15456 break 15457 } 15458 if x_1.AuxInt != 16 { 15459 break 15460 } 15461 if w != x_1.Args[0] { 15462 break 15463 } 15464 mem := x.Args[2] 15465 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15466 break 15467 } 15468 v.reset(OpS390XMOVWstore) 15469 v.AuxInt = i - 2 15470 v.Aux = s 15471 v.AddArg(p) 15472 v.AddArg(w) 15473 v.AddArg(mem) 15474 return true 15475 } 15476 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 15477 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15478 // result: (MOVWstore [i-2] {s} p w0 mem) 15479 for { 15480 i := v.AuxInt 15481 s := v.Aux 15482 _ = v.Args[2] 15483 p := v.Args[0] 15484 w0 := v.Args[1] 15485 if w0.Op != OpS390XSRDconst { 15486 break 15487 } 15488 j := w0.AuxInt 15489 w := w0.Args[0] 15490 x := v.Args[2] 15491 if x.Op != OpS390XMOVHstore { 15492 break 15493 } 15494 if x.AuxInt != i-2 { 15495 break 15496 } 15497 if x.Aux != s { 15498 break 15499 } 15500 _ = x.Args[2] 15501 if p != x.Args[0] { 15502 break 15503 } 15504 x_1 := x.Args[1] 15505 if x_1.Op != OpS390XSRDconst { 15506 break 15507 } 15508 if x_1.AuxInt != j+16 { 15509 break 15510 } 15511 if w != x_1.Args[0] { 15512 break 15513 } 15514 mem := x.Args[2] 15515 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15516 break 15517 } 15518 v.reset(OpS390XMOVWstore) 15519 v.AuxInt = i - 2 15520 v.Aux = s 15521 v.AddArg(p) 15522 v.AddArg(w0) 15523 v.AddArg(mem) 15524 return true 15525 } 15526 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 15527 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15528 // result: (MOVWstore [i-2] {s} p w mem) 15529 for { 15530 i := v.AuxInt 15531 s := v.Aux 15532 _ = v.Args[2] 15533 p := v.Args[0] 15534 w := v.Args[1] 15535 x := v.Args[2] 15536 if x.Op != OpS390XMOVHstore { 15537 break 15538 } 15539 if x.AuxInt != i-2 { 15540 break 15541 } 15542 if x.Aux != s { 15543 break 15544 } 15545 _ = x.Args[2] 15546 if p != x.Args[0] { 15547 break 15548 } 15549 x_1 := x.Args[1] 15550 if x_1.Op != OpS390XSRWconst { 15551 break 15552 } 15553 if x_1.AuxInt != 16 { 15554 break 15555 } 15556 if w != x_1.Args[0] { 15557 break 15558 } 15559 mem := x.Args[2] 15560 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15561 break 15562 } 15563 v.reset(OpS390XMOVWstore) 15564 v.AuxInt = i - 2 15565 v.Aux = s 15566 v.AddArg(p) 15567 v.AddArg(w) 15568 v.AddArg(mem) 15569 return true 15570 } 15571 return false 15572 } 15573 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 15574 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 15575 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 15576 // result: (MOVWstore [i-2] {s} p w0 mem) 15577 for { 15578 i := v.AuxInt 15579 s := v.Aux 15580 _ = v.Args[2] 15581 p := v.Args[0] 15582 w0 := v.Args[1] 15583 if w0.Op != OpS390XSRWconst { 15584 break 15585 } 15586 j := w0.AuxInt 15587 w := w0.Args[0] 15588 x := v.Args[2] 15589 if x.Op != OpS390XMOVHstore { 15590 break 15591 } 15592 if x.AuxInt != i-2 { 15593 break 15594 } 15595 if x.Aux != s { 15596 break 15597 } 15598 _ = x.Args[2] 15599 if p != x.Args[0] { 15600 break 15601 } 15602 x_1 := x.Args[1] 15603 if x_1.Op != OpS390XSRWconst { 15604 break 15605 } 15606 if x_1.AuxInt != j+16 { 15607 break 15608 } 15609 if w != x_1.Args[0] { 15610 break 15611 } 15612 mem := x.Args[2] 15613 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15614 break 15615 } 15616 v.reset(OpS390XMOVWstore) 15617 v.AuxInt = i - 2 15618 v.Aux = s 15619 v.AddArg(p) 15620 v.AddArg(w0) 15621 v.AddArg(mem) 15622 return true 15623 } 15624 return false 15625 } 15626 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 15627 b := v.Block 15628 _ = b 15629 typ := &b.Func.Config.Types 15630 _ = typ 15631 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 15632 // cond: isU12Bit(ValAndOff(sc).Off()+off) 15633 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 15634 for { 15635 sc := v.AuxInt 15636 s := v.Aux 15637 _ = v.Args[1] 15638 v_0 := v.Args[0] 15639 if v_0.Op != OpS390XADDconst { 15640 break 15641 } 15642 off := v_0.AuxInt 15643 ptr := v_0.Args[0] 15644 mem := v.Args[1] 15645 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 15646 break 15647 } 15648 v.reset(OpS390XMOVHstoreconst) 15649 v.AuxInt = ValAndOff(sc).add(off) 15650 v.Aux = s 15651 v.AddArg(ptr) 15652 v.AddArg(mem) 15653 return true 15654 } 15655 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 15656 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 15657 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 15658 for { 15659 sc := v.AuxInt 15660 sym1 := v.Aux 15661 _ = v.Args[1] 15662 v_0 := v.Args[0] 15663 if v_0.Op != OpS390XMOVDaddr { 15664 break 15665 } 15666 off := v_0.AuxInt 15667 sym2 := v_0.Aux 15668 ptr := v_0.Args[0] 15669 mem := v.Args[1] 15670 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 15671 break 15672 } 15673 v.reset(OpS390XMOVHstoreconst) 15674 v.AuxInt = ValAndOff(sc).add(off) 15675 v.Aux = mergeSym(sym1, sym2) 15676 v.AddArg(ptr) 15677 v.AddArg(mem) 15678 return true 15679 } 15680 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 15681 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 15682 // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) 15683 for { 15684 c := v.AuxInt 15685 s := v.Aux 15686 _ = v.Args[1] 15687 p := v.Args[0] 15688 x := v.Args[1] 15689 if x.Op != OpS390XMOVHstoreconst { 15690 break 15691 } 15692 a := x.AuxInt 15693 if x.Aux != s { 15694 break 15695 } 15696 _ = x.Args[1] 15697 if p != x.Args[0] { 15698 break 15699 } 15700 mem := x.Args[1] 15701 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 15702 break 15703 } 15704 v.reset(OpS390XMOVWstore) 15705 v.AuxInt = ValAndOff(a).Off() 15706 v.Aux = s 15707 v.AddArg(p) 15708 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 15709 v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) 15710 v.AddArg(v0) 15711 v.AddArg(mem) 15712 return true 15713 } 15714 return false 15715 } 15716 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 15717 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 15718 // cond: 15719 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15720 for { 15721 c := v.AuxInt 15722 sym := v.Aux 15723 _ = v.Args[3] 15724 v_0 := v.Args[0] 15725 if v_0.Op != OpS390XADDconst { 15726 break 15727 } 15728 d := v_0.AuxInt 15729 ptr := v_0.Args[0] 15730 idx := v.Args[1] 15731 val := v.Args[2] 15732 mem := v.Args[3] 15733 v.reset(OpS390XMOVHstoreidx) 15734 v.AuxInt = c + d 15735 v.Aux = sym 15736 v.AddArg(ptr) 15737 v.AddArg(idx) 15738 v.AddArg(val) 15739 v.AddArg(mem) 15740 return true 15741 } 15742 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 15743 // cond: 15744 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15745 for { 15746 c := v.AuxInt 15747 sym := v.Aux 15748 _ = v.Args[3] 15749 idx := v.Args[0] 15750 v_1 := v.Args[1] 15751 if v_1.Op != OpS390XADDconst { 15752 break 15753 } 15754 d := v_1.AuxInt 15755 ptr := v_1.Args[0] 15756 val := v.Args[2] 15757 mem := v.Args[3] 15758 v.reset(OpS390XMOVHstoreidx) 15759 v.AuxInt = c + d 15760 v.Aux = sym 15761 v.AddArg(ptr) 15762 v.AddArg(idx) 15763 v.AddArg(val) 15764 v.AddArg(mem) 15765 return true 15766 } 15767 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 15768 // cond: 15769 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15770 for { 15771 c := v.AuxInt 15772 sym := v.Aux 15773 _ = v.Args[3] 15774 ptr := v.Args[0] 15775 v_1 := v.Args[1] 15776 if v_1.Op != OpS390XADDconst { 15777 break 15778 } 15779 d := v_1.AuxInt 15780 idx := v_1.Args[0] 15781 val := v.Args[2] 15782 mem := v.Args[3] 15783 v.reset(OpS390XMOVHstoreidx) 15784 v.AuxInt = c + d 15785 v.Aux = sym 15786 v.AddArg(ptr) 15787 v.AddArg(idx) 15788 v.AddArg(val) 15789 v.AddArg(mem) 15790 return true 15791 } 15792 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15793 // cond: 15794 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15795 for { 15796 c := v.AuxInt 15797 sym := v.Aux 15798 _ = v.Args[3] 15799 v_0 := v.Args[0] 15800 if v_0.Op != OpS390XADDconst { 15801 break 15802 } 15803 d := v_0.AuxInt 15804 idx := v_0.Args[0] 15805 ptr := v.Args[1] 15806 val := v.Args[2] 15807 mem := v.Args[3] 15808 v.reset(OpS390XMOVHstoreidx) 15809 v.AuxInt = c + d 15810 v.Aux = sym 15811 v.AddArg(ptr) 15812 v.AddArg(idx) 15813 v.AddArg(val) 15814 v.AddArg(mem) 15815 return true 15816 } 15817 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15818 // cond: x.Uses == 1 && clobber(x) 15819 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15820 for { 15821 i := v.AuxInt 15822 s := v.Aux 15823 _ = v.Args[3] 15824 p := v.Args[0] 15825 idx := v.Args[1] 15826 w := v.Args[2] 15827 x := v.Args[3] 15828 if x.Op != OpS390XMOVHstoreidx { 15829 break 15830 } 15831 if x.AuxInt != i-2 { 15832 break 15833 } 15834 if x.Aux != s { 15835 break 15836 } 15837 _ = x.Args[3] 15838 if p != x.Args[0] { 15839 break 15840 } 15841 if idx != x.Args[1] { 15842 break 15843 } 15844 x_2 := x.Args[2] 15845 if x_2.Op != OpS390XSRDconst { 15846 break 15847 } 15848 if x_2.AuxInt != 16 { 15849 break 15850 } 15851 if w != x_2.Args[0] { 15852 break 15853 } 15854 mem := x.Args[3] 15855 if !(x.Uses == 1 && clobber(x)) { 15856 break 15857 } 15858 v.reset(OpS390XMOVWstoreidx) 15859 v.AuxInt = i - 2 15860 v.Aux = s 15861 v.AddArg(p) 15862 v.AddArg(idx) 15863 v.AddArg(w) 15864 v.AddArg(mem) 15865 return true 15866 } 15867 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15868 // cond: x.Uses == 1 && clobber(x) 15869 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15870 for { 15871 i := v.AuxInt 15872 s := v.Aux 15873 _ = v.Args[3] 15874 p := v.Args[0] 15875 idx := v.Args[1] 15876 w := v.Args[2] 15877 x := v.Args[3] 15878 if x.Op != OpS390XMOVHstoreidx { 15879 break 15880 } 15881 if x.AuxInt != i-2 { 15882 break 15883 } 15884 if x.Aux != s { 15885 break 15886 } 15887 _ = x.Args[3] 15888 if idx != x.Args[0] { 15889 break 15890 } 15891 if p != x.Args[1] { 15892 break 15893 } 15894 x_2 := x.Args[2] 15895 if x_2.Op != OpS390XSRDconst { 15896 break 15897 } 15898 if x_2.AuxInt != 16 { 15899 break 15900 } 15901 if w != x_2.Args[0] { 15902 break 15903 } 15904 mem := x.Args[3] 15905 if !(x.Uses == 1 && clobber(x)) { 15906 break 15907 } 15908 v.reset(OpS390XMOVWstoreidx) 15909 v.AuxInt = i - 2 15910 v.Aux = s 15911 v.AddArg(p) 15912 v.AddArg(idx) 15913 v.AddArg(w) 15914 v.AddArg(mem) 15915 return true 15916 } 15917 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15918 // cond: x.Uses == 1 && clobber(x) 15919 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15920 for { 15921 i := v.AuxInt 15922 s := v.Aux 15923 _ = v.Args[3] 15924 idx := v.Args[0] 15925 p := v.Args[1] 15926 w := v.Args[2] 15927 x := v.Args[3] 15928 if x.Op != OpS390XMOVHstoreidx { 15929 break 15930 } 15931 if x.AuxInt != i-2 { 15932 break 15933 } 15934 if x.Aux != s { 15935 break 15936 } 15937 _ = x.Args[3] 15938 if p != x.Args[0] { 15939 break 15940 } 15941 if idx != x.Args[1] { 15942 break 15943 } 15944 x_2 := x.Args[2] 15945 if x_2.Op != OpS390XSRDconst { 15946 break 15947 } 15948 if x_2.AuxInt != 16 { 15949 break 15950 } 15951 if w != x_2.Args[0] { 15952 break 15953 } 15954 mem := x.Args[3] 15955 if !(x.Uses == 1 && clobber(x)) { 15956 break 15957 } 15958 v.reset(OpS390XMOVWstoreidx) 15959 v.AuxInt = i - 2 15960 v.Aux = s 15961 v.AddArg(p) 15962 v.AddArg(idx) 15963 v.AddArg(w) 15964 v.AddArg(mem) 15965 return true 15966 } 15967 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15968 // cond: x.Uses == 1 && clobber(x) 15969 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15970 for { 15971 i := v.AuxInt 15972 s := v.Aux 15973 _ = v.Args[3] 15974 idx := v.Args[0] 15975 p := v.Args[1] 15976 w := v.Args[2] 15977 x := v.Args[3] 15978 if x.Op != OpS390XMOVHstoreidx { 15979 break 15980 } 15981 if x.AuxInt != i-2 { 15982 break 15983 } 15984 if x.Aux != s { 15985 break 15986 } 15987 _ = x.Args[3] 15988 if idx != x.Args[0] { 15989 break 15990 } 15991 if p != x.Args[1] { 15992 break 15993 } 15994 x_2 := x.Args[2] 15995 if x_2.Op != OpS390XSRDconst { 15996 break 15997 } 15998 if x_2.AuxInt != 16 { 15999 break 16000 } 16001 if w != x_2.Args[0] { 16002 break 16003 } 16004 mem := x.Args[3] 16005 if !(x.Uses == 1 && clobber(x)) { 16006 break 16007 } 16008 v.reset(OpS390XMOVWstoreidx) 16009 v.AuxInt = i - 2 16010 v.Aux = s 16011 v.AddArg(p) 16012 v.AddArg(idx) 16013 v.AddArg(w) 16014 v.AddArg(mem) 16015 return true 16016 } 16017 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 16018 // cond: x.Uses == 1 && clobber(x) 16019 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16020 for { 16021 i := v.AuxInt 16022 s := v.Aux 16023 _ = v.Args[3] 16024 p := v.Args[0] 16025 idx := v.Args[1] 16026 w0 := v.Args[2] 16027 if w0.Op != OpS390XSRDconst { 16028 break 16029 } 16030 j := w0.AuxInt 16031 w := w0.Args[0] 16032 x := v.Args[3] 16033 if x.Op != OpS390XMOVHstoreidx { 16034 break 16035 } 16036 if x.AuxInt != i-2 { 16037 break 16038 } 16039 if x.Aux != s { 16040 break 16041 } 16042 _ = x.Args[3] 16043 if p != x.Args[0] { 16044 break 16045 } 16046 if idx != x.Args[1] { 16047 break 16048 } 16049 x_2 := x.Args[2] 16050 if x_2.Op != OpS390XSRDconst { 16051 break 16052 } 16053 if x_2.AuxInt != j+16 { 16054 break 16055 } 16056 if w != x_2.Args[0] { 16057 break 16058 } 16059 mem := x.Args[3] 16060 if !(x.Uses == 1 && clobber(x)) { 16061 break 16062 } 16063 v.reset(OpS390XMOVWstoreidx) 16064 v.AuxInt = i - 2 16065 v.Aux = s 16066 v.AddArg(p) 16067 v.AddArg(idx) 16068 v.AddArg(w0) 16069 v.AddArg(mem) 16070 return true 16071 } 16072 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16073 // cond: x.Uses == 1 && clobber(x) 16074 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16075 for { 16076 i := v.AuxInt 16077 s := v.Aux 16078 _ = v.Args[3] 16079 p := v.Args[0] 16080 idx := v.Args[1] 16081 w0 := v.Args[2] 16082 if w0.Op != OpS390XSRDconst { 16083 break 16084 } 16085 j := w0.AuxInt 16086 w := w0.Args[0] 16087 x := v.Args[3] 16088 if x.Op != OpS390XMOVHstoreidx { 16089 break 16090 } 16091 if x.AuxInt != i-2 { 16092 break 16093 } 16094 if x.Aux != s { 16095 break 16096 } 16097 _ = x.Args[3] 16098 if idx != x.Args[0] { 16099 break 16100 } 16101 if p != x.Args[1] { 16102 break 16103 } 16104 x_2 := x.Args[2] 16105 if x_2.Op != OpS390XSRDconst { 16106 break 16107 } 16108 if x_2.AuxInt != j+16 { 16109 break 16110 } 16111 if w != x_2.Args[0] { 16112 break 16113 } 16114 mem := x.Args[3] 16115 if !(x.Uses == 1 && clobber(x)) { 16116 break 16117 } 16118 v.reset(OpS390XMOVWstoreidx) 16119 v.AuxInt = i - 2 16120 v.Aux = s 16121 v.AddArg(p) 16122 v.AddArg(idx) 16123 v.AddArg(w0) 16124 v.AddArg(mem) 16125 return true 16126 } 16127 return false 16128 } 16129 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 16130 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 16131 // cond: x.Uses == 1 && clobber(x) 16132 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16133 for { 16134 i := v.AuxInt 16135 s := v.Aux 16136 _ = v.Args[3] 16137 idx := v.Args[0] 16138 p := v.Args[1] 16139 w0 := v.Args[2] 16140 if w0.Op != OpS390XSRDconst { 16141 break 16142 } 16143 j := w0.AuxInt 16144 w := w0.Args[0] 16145 x := v.Args[3] 16146 if x.Op != OpS390XMOVHstoreidx { 16147 break 16148 } 16149 if x.AuxInt != i-2 { 16150 break 16151 } 16152 if x.Aux != s { 16153 break 16154 } 16155 _ = x.Args[3] 16156 if p != x.Args[0] { 16157 break 16158 } 16159 if idx != x.Args[1] { 16160 break 16161 } 16162 x_2 := x.Args[2] 16163 if x_2.Op != OpS390XSRDconst { 16164 break 16165 } 16166 if x_2.AuxInt != j+16 { 16167 break 16168 } 16169 if w != x_2.Args[0] { 16170 break 16171 } 16172 mem := x.Args[3] 16173 if !(x.Uses == 1 && clobber(x)) { 16174 break 16175 } 16176 v.reset(OpS390XMOVWstoreidx) 16177 v.AuxInt = i - 2 16178 v.Aux = s 16179 v.AddArg(p) 16180 v.AddArg(idx) 16181 v.AddArg(w0) 16182 v.AddArg(mem) 16183 return true 16184 } 16185 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 16186 // cond: x.Uses == 1 && clobber(x) 16187 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16188 for { 16189 i := v.AuxInt 16190 s := v.Aux 16191 _ = v.Args[3] 16192 idx := v.Args[0] 16193 p := v.Args[1] 16194 w0 := v.Args[2] 16195 if w0.Op != OpS390XSRDconst { 16196 break 16197 } 16198 j := w0.AuxInt 16199 w := w0.Args[0] 16200 x := v.Args[3] 16201 if x.Op != OpS390XMOVHstoreidx { 16202 break 16203 } 16204 if x.AuxInt != i-2 { 16205 break 16206 } 16207 if x.Aux != s { 16208 break 16209 } 16210 _ = x.Args[3] 16211 if idx != x.Args[0] { 16212 break 16213 } 16214 if p != x.Args[1] { 16215 break 16216 } 16217 x_2 := x.Args[2] 16218 if x_2.Op != OpS390XSRDconst { 16219 break 16220 } 16221 if x_2.AuxInt != j+16 { 16222 break 16223 } 16224 if w != x_2.Args[0] { 16225 break 16226 } 16227 mem := x.Args[3] 16228 if !(x.Uses == 1 && clobber(x)) { 16229 break 16230 } 16231 v.reset(OpS390XMOVWstoreidx) 16232 v.AuxInt = i - 2 16233 v.Aux = s 16234 v.AddArg(p) 16235 v.AddArg(idx) 16236 v.AddArg(w0) 16237 v.AddArg(mem) 16238 return true 16239 } 16240 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16241 // cond: x.Uses == 1 && clobber(x) 16242 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16243 for { 16244 i := v.AuxInt 16245 s := v.Aux 16246 _ = v.Args[3] 16247 p := v.Args[0] 16248 idx := v.Args[1] 16249 w := v.Args[2] 16250 x := v.Args[3] 16251 if x.Op != OpS390XMOVHstoreidx { 16252 break 16253 } 16254 if x.AuxInt != i-2 { 16255 break 16256 } 16257 if x.Aux != s { 16258 break 16259 } 16260 _ = x.Args[3] 16261 if p != x.Args[0] { 16262 break 16263 } 16264 if idx != x.Args[1] { 16265 break 16266 } 16267 x_2 := x.Args[2] 16268 if x_2.Op != OpS390XSRWconst { 16269 break 16270 } 16271 if x_2.AuxInt != 16 { 16272 break 16273 } 16274 if w != x_2.Args[0] { 16275 break 16276 } 16277 mem := x.Args[3] 16278 if !(x.Uses == 1 && clobber(x)) { 16279 break 16280 } 16281 v.reset(OpS390XMOVWstoreidx) 16282 v.AuxInt = i - 2 16283 v.Aux = s 16284 v.AddArg(p) 16285 v.AddArg(idx) 16286 v.AddArg(w) 16287 v.AddArg(mem) 16288 return true 16289 } 16290 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16291 // cond: x.Uses == 1 && clobber(x) 16292 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16293 for { 16294 i := v.AuxInt 16295 s := v.Aux 16296 _ = v.Args[3] 16297 p := v.Args[0] 16298 idx := v.Args[1] 16299 w := v.Args[2] 16300 x := v.Args[3] 16301 if x.Op != OpS390XMOVHstoreidx { 16302 break 16303 } 16304 if x.AuxInt != i-2 { 16305 break 16306 } 16307 if x.Aux != s { 16308 break 16309 } 16310 _ = x.Args[3] 16311 if idx != x.Args[0] { 16312 break 16313 } 16314 if p != x.Args[1] { 16315 break 16316 } 16317 x_2 := x.Args[2] 16318 if x_2.Op != OpS390XSRWconst { 16319 break 16320 } 16321 if x_2.AuxInt != 16 { 16322 break 16323 } 16324 if w != x_2.Args[0] { 16325 break 16326 } 16327 mem := x.Args[3] 16328 if !(x.Uses == 1 && clobber(x)) { 16329 break 16330 } 16331 v.reset(OpS390XMOVWstoreidx) 16332 v.AuxInt = i - 2 16333 v.Aux = s 16334 v.AddArg(p) 16335 v.AddArg(idx) 16336 v.AddArg(w) 16337 v.AddArg(mem) 16338 return true 16339 } 16340 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 16341 // cond: x.Uses == 1 && clobber(x) 16342 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16343 for { 16344 i := v.AuxInt 16345 s := v.Aux 16346 _ = v.Args[3] 16347 idx := v.Args[0] 16348 p := v.Args[1] 16349 w := v.Args[2] 16350 x := v.Args[3] 16351 if x.Op != OpS390XMOVHstoreidx { 16352 break 16353 } 16354 if x.AuxInt != i-2 { 16355 break 16356 } 16357 if x.Aux != s { 16358 break 16359 } 16360 _ = x.Args[3] 16361 if p != x.Args[0] { 16362 break 16363 } 16364 if idx != x.Args[1] { 16365 break 16366 } 16367 x_2 := x.Args[2] 16368 if x_2.Op != OpS390XSRWconst { 16369 break 16370 } 16371 if x_2.AuxInt != 16 { 16372 break 16373 } 16374 if w != x_2.Args[0] { 16375 break 16376 } 16377 mem := x.Args[3] 16378 if !(x.Uses == 1 && clobber(x)) { 16379 break 16380 } 16381 v.reset(OpS390XMOVWstoreidx) 16382 v.AuxInt = i - 2 16383 v.Aux = s 16384 v.AddArg(p) 16385 v.AddArg(idx) 16386 v.AddArg(w) 16387 v.AddArg(mem) 16388 return true 16389 } 16390 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 16391 // cond: x.Uses == 1 && clobber(x) 16392 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 16393 for { 16394 i := v.AuxInt 16395 s := v.Aux 16396 _ = v.Args[3] 16397 idx := v.Args[0] 16398 p := v.Args[1] 16399 w := v.Args[2] 16400 x := v.Args[3] 16401 if x.Op != OpS390XMOVHstoreidx { 16402 break 16403 } 16404 if x.AuxInt != i-2 { 16405 break 16406 } 16407 if x.Aux != s { 16408 break 16409 } 16410 _ = x.Args[3] 16411 if idx != x.Args[0] { 16412 break 16413 } 16414 if p != x.Args[1] { 16415 break 16416 } 16417 x_2 := x.Args[2] 16418 if x_2.Op != OpS390XSRWconst { 16419 break 16420 } 16421 if x_2.AuxInt != 16 { 16422 break 16423 } 16424 if w != x_2.Args[0] { 16425 break 16426 } 16427 mem := x.Args[3] 16428 if !(x.Uses == 1 && clobber(x)) { 16429 break 16430 } 16431 v.reset(OpS390XMOVWstoreidx) 16432 v.AuxInt = i - 2 16433 v.Aux = s 16434 v.AddArg(p) 16435 v.AddArg(idx) 16436 v.AddArg(w) 16437 v.AddArg(mem) 16438 return true 16439 } 16440 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 16441 // cond: x.Uses == 1 && clobber(x) 16442 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16443 for { 16444 i := v.AuxInt 16445 s := v.Aux 16446 _ = v.Args[3] 16447 p := v.Args[0] 16448 idx := v.Args[1] 16449 w0 := v.Args[2] 16450 if w0.Op != OpS390XSRWconst { 16451 break 16452 } 16453 j := w0.AuxInt 16454 w := w0.Args[0] 16455 x := v.Args[3] 16456 if x.Op != OpS390XMOVHstoreidx { 16457 break 16458 } 16459 if x.AuxInt != i-2 { 16460 break 16461 } 16462 if x.Aux != s { 16463 break 16464 } 16465 _ = x.Args[3] 16466 if p != x.Args[0] { 16467 break 16468 } 16469 if idx != x.Args[1] { 16470 break 16471 } 16472 x_2 := x.Args[2] 16473 if x_2.Op != OpS390XSRWconst { 16474 break 16475 } 16476 if x_2.AuxInt != j+16 { 16477 break 16478 } 16479 if w != x_2.Args[0] { 16480 break 16481 } 16482 mem := x.Args[3] 16483 if !(x.Uses == 1 && clobber(x)) { 16484 break 16485 } 16486 v.reset(OpS390XMOVWstoreidx) 16487 v.AuxInt = i - 2 16488 v.Aux = s 16489 v.AddArg(p) 16490 v.AddArg(idx) 16491 v.AddArg(w0) 16492 v.AddArg(mem) 16493 return true 16494 } 16495 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 16496 // cond: x.Uses == 1 && clobber(x) 16497 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16498 for { 16499 i := v.AuxInt 16500 s := v.Aux 16501 _ = v.Args[3] 16502 p := v.Args[0] 16503 idx := v.Args[1] 16504 w0 := v.Args[2] 16505 if w0.Op != OpS390XSRWconst { 16506 break 16507 } 16508 j := w0.AuxInt 16509 w := w0.Args[0] 16510 x := v.Args[3] 16511 if x.Op != OpS390XMOVHstoreidx { 16512 break 16513 } 16514 if x.AuxInt != i-2 { 16515 break 16516 } 16517 if x.Aux != s { 16518 break 16519 } 16520 _ = x.Args[3] 16521 if idx != x.Args[0] { 16522 break 16523 } 16524 if p != x.Args[1] { 16525 break 16526 } 16527 x_2 := x.Args[2] 16528 if x_2.Op != OpS390XSRWconst { 16529 break 16530 } 16531 if x_2.AuxInt != j+16 { 16532 break 16533 } 16534 if w != x_2.Args[0] { 16535 break 16536 } 16537 mem := x.Args[3] 16538 if !(x.Uses == 1 && clobber(x)) { 16539 break 16540 } 16541 v.reset(OpS390XMOVWstoreidx) 16542 v.AuxInt = i - 2 16543 v.Aux = s 16544 v.AddArg(p) 16545 v.AddArg(idx) 16546 v.AddArg(w0) 16547 v.AddArg(mem) 16548 return true 16549 } 16550 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 16551 // cond: x.Uses == 1 && clobber(x) 16552 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16553 for { 16554 i := v.AuxInt 16555 s := v.Aux 16556 _ = v.Args[3] 16557 idx := v.Args[0] 16558 p := v.Args[1] 16559 w0 := v.Args[2] 16560 if w0.Op != OpS390XSRWconst { 16561 break 16562 } 16563 j := w0.AuxInt 16564 w := w0.Args[0] 16565 x := v.Args[3] 16566 if x.Op != OpS390XMOVHstoreidx { 16567 break 16568 } 16569 if x.AuxInt != i-2 { 16570 break 16571 } 16572 if x.Aux != s { 16573 break 16574 } 16575 _ = x.Args[3] 16576 if p != x.Args[0] { 16577 break 16578 } 16579 if idx != x.Args[1] { 16580 break 16581 } 16582 x_2 := x.Args[2] 16583 if x_2.Op != OpS390XSRWconst { 16584 break 16585 } 16586 if x_2.AuxInt != j+16 { 16587 break 16588 } 16589 if w != x_2.Args[0] { 16590 break 16591 } 16592 mem := x.Args[3] 16593 if !(x.Uses == 1 && clobber(x)) { 16594 break 16595 } 16596 v.reset(OpS390XMOVWstoreidx) 16597 v.AuxInt = i - 2 16598 v.Aux = s 16599 v.AddArg(p) 16600 v.AddArg(idx) 16601 v.AddArg(w0) 16602 v.AddArg(mem) 16603 return true 16604 } 16605 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 16606 // cond: x.Uses == 1 && clobber(x) 16607 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 16608 for { 16609 i := v.AuxInt 16610 s := v.Aux 16611 _ = v.Args[3] 16612 idx := v.Args[0] 16613 p := v.Args[1] 16614 w0 := v.Args[2] 16615 if w0.Op != OpS390XSRWconst { 16616 break 16617 } 16618 j := w0.AuxInt 16619 w := w0.Args[0] 16620 x := v.Args[3] 16621 if x.Op != OpS390XMOVHstoreidx { 16622 break 16623 } 16624 if x.AuxInt != i-2 { 16625 break 16626 } 16627 if x.Aux != s { 16628 break 16629 } 16630 _ = x.Args[3] 16631 if idx != x.Args[0] { 16632 break 16633 } 16634 if p != x.Args[1] { 16635 break 16636 } 16637 x_2 := x.Args[2] 16638 if x_2.Op != OpS390XSRWconst { 16639 break 16640 } 16641 if x_2.AuxInt != j+16 { 16642 break 16643 } 16644 if w != x_2.Args[0] { 16645 break 16646 } 16647 mem := x.Args[3] 16648 if !(x.Uses == 1 && clobber(x)) { 16649 break 16650 } 16651 v.reset(OpS390XMOVWstoreidx) 16652 v.AuxInt = i - 2 16653 v.Aux = s 16654 v.AddArg(p) 16655 v.AddArg(idx) 16656 v.AddArg(w0) 16657 v.AddArg(mem) 16658 return true 16659 } 16660 return false 16661 } 16662 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 16663 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 16664 // cond: x.Uses == 1 && clobber(x) 16665 // result: (MOVDBRstore [i-4] {s} p w mem) 16666 for { 16667 i := v.AuxInt 16668 s := v.Aux 16669 _ = v.Args[2] 16670 p := v.Args[0] 16671 v_1 := v.Args[1] 16672 if v_1.Op != OpS390XSRDconst { 16673 break 16674 } 16675 if v_1.AuxInt != 32 { 16676 break 16677 } 16678 w := v_1.Args[0] 16679 x := v.Args[2] 16680 if x.Op != OpS390XMOVWBRstore { 16681 break 16682 } 16683 if x.AuxInt != i-4 { 16684 break 16685 } 16686 if x.Aux != s { 16687 break 16688 } 16689 _ = x.Args[2] 16690 if p != x.Args[0] { 16691 break 16692 } 16693 if w != x.Args[1] { 16694 break 16695 } 16696 mem := x.Args[2] 16697 if !(x.Uses == 1 && clobber(x)) { 16698 break 16699 } 16700 v.reset(OpS390XMOVDBRstore) 16701 v.AuxInt = i - 4 16702 v.Aux = s 16703 v.AddArg(p) 16704 v.AddArg(w) 16705 v.AddArg(mem) 16706 return true 16707 } 16708 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 16709 // cond: x.Uses == 1 && clobber(x) 16710 // result: (MOVDBRstore [i-4] {s} p w0 mem) 16711 for { 16712 i := v.AuxInt 16713 s := v.Aux 16714 _ = v.Args[2] 16715 p := v.Args[0] 16716 v_1 := v.Args[1] 16717 if v_1.Op != OpS390XSRDconst { 16718 break 16719 } 16720 j := v_1.AuxInt 16721 w := v_1.Args[0] 16722 x := v.Args[2] 16723 if x.Op != OpS390XMOVWBRstore { 16724 break 16725 } 16726 if x.AuxInt != i-4 { 16727 break 16728 } 16729 if x.Aux != s { 16730 break 16731 } 16732 _ = x.Args[2] 16733 if p != x.Args[0] { 16734 break 16735 } 16736 w0 := x.Args[1] 16737 if w0.Op != OpS390XSRDconst { 16738 break 16739 } 16740 if w0.AuxInt != j-32 { 16741 break 16742 } 16743 if w != w0.Args[0] { 16744 break 16745 } 16746 mem := x.Args[2] 16747 if !(x.Uses == 1 && clobber(x)) { 16748 break 16749 } 16750 v.reset(OpS390XMOVDBRstore) 16751 v.AuxInt = i - 4 16752 v.Aux = s 16753 v.AddArg(p) 16754 v.AddArg(w0) 16755 v.AddArg(mem) 16756 return true 16757 } 16758 return false 16759 } 16760 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 16761 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16762 // cond: x.Uses == 1 && clobber(x) 16763 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16764 for { 16765 i := v.AuxInt 16766 s := v.Aux 16767 _ = v.Args[3] 16768 p := v.Args[0] 16769 idx := v.Args[1] 16770 v_2 := v.Args[2] 16771 if v_2.Op != OpS390XSRDconst { 16772 break 16773 } 16774 if v_2.AuxInt != 32 { 16775 break 16776 } 16777 w := v_2.Args[0] 16778 x := v.Args[3] 16779 if x.Op != OpS390XMOVWBRstoreidx { 16780 break 16781 } 16782 if x.AuxInt != i-4 { 16783 break 16784 } 16785 if x.Aux != s { 16786 break 16787 } 16788 _ = x.Args[3] 16789 if p != x.Args[0] { 16790 break 16791 } 16792 if idx != x.Args[1] { 16793 break 16794 } 16795 if w != x.Args[2] { 16796 break 16797 } 16798 mem := x.Args[3] 16799 if !(x.Uses == 1 && clobber(x)) { 16800 break 16801 } 16802 v.reset(OpS390XMOVDBRstoreidx) 16803 v.AuxInt = i - 4 16804 v.Aux = s 16805 v.AddArg(p) 16806 v.AddArg(idx) 16807 v.AddArg(w) 16808 v.AddArg(mem) 16809 return true 16810 } 16811 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16812 // cond: x.Uses == 1 && clobber(x) 16813 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16814 for { 16815 i := v.AuxInt 16816 s := v.Aux 16817 _ = v.Args[3] 16818 p := v.Args[0] 16819 idx := v.Args[1] 16820 v_2 := v.Args[2] 16821 if v_2.Op != OpS390XSRDconst { 16822 break 16823 } 16824 if v_2.AuxInt != 32 { 16825 break 16826 } 16827 w := v_2.Args[0] 16828 x := v.Args[3] 16829 if x.Op != OpS390XMOVWBRstoreidx { 16830 break 16831 } 16832 if x.AuxInt != i-4 { 16833 break 16834 } 16835 if x.Aux != s { 16836 break 16837 } 16838 _ = x.Args[3] 16839 if idx != x.Args[0] { 16840 break 16841 } 16842 if p != x.Args[1] { 16843 break 16844 } 16845 if w != x.Args[2] { 16846 break 16847 } 16848 mem := x.Args[3] 16849 if !(x.Uses == 1 && clobber(x)) { 16850 break 16851 } 16852 v.reset(OpS390XMOVDBRstoreidx) 16853 v.AuxInt = i - 4 16854 v.Aux = s 16855 v.AddArg(p) 16856 v.AddArg(idx) 16857 v.AddArg(w) 16858 v.AddArg(mem) 16859 return true 16860 } 16861 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16862 // cond: x.Uses == 1 && clobber(x) 16863 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16864 for { 16865 i := v.AuxInt 16866 s := v.Aux 16867 _ = v.Args[3] 16868 idx := v.Args[0] 16869 p := v.Args[1] 16870 v_2 := v.Args[2] 16871 if v_2.Op != OpS390XSRDconst { 16872 break 16873 } 16874 if v_2.AuxInt != 32 { 16875 break 16876 } 16877 w := v_2.Args[0] 16878 x := v.Args[3] 16879 if x.Op != OpS390XMOVWBRstoreidx { 16880 break 16881 } 16882 if x.AuxInt != i-4 { 16883 break 16884 } 16885 if x.Aux != s { 16886 break 16887 } 16888 _ = x.Args[3] 16889 if p != x.Args[0] { 16890 break 16891 } 16892 if idx != x.Args[1] { 16893 break 16894 } 16895 if w != x.Args[2] { 16896 break 16897 } 16898 mem := x.Args[3] 16899 if !(x.Uses == 1 && clobber(x)) { 16900 break 16901 } 16902 v.reset(OpS390XMOVDBRstoreidx) 16903 v.AuxInt = i - 4 16904 v.Aux = s 16905 v.AddArg(p) 16906 v.AddArg(idx) 16907 v.AddArg(w) 16908 v.AddArg(mem) 16909 return true 16910 } 16911 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16912 // cond: x.Uses == 1 && clobber(x) 16913 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16914 for { 16915 i := v.AuxInt 16916 s := v.Aux 16917 _ = v.Args[3] 16918 idx := v.Args[0] 16919 p := v.Args[1] 16920 v_2 := v.Args[2] 16921 if v_2.Op != OpS390XSRDconst { 16922 break 16923 } 16924 if v_2.AuxInt != 32 { 16925 break 16926 } 16927 w := v_2.Args[0] 16928 x := v.Args[3] 16929 if x.Op != OpS390XMOVWBRstoreidx { 16930 break 16931 } 16932 if x.AuxInt != i-4 { 16933 break 16934 } 16935 if x.Aux != s { 16936 break 16937 } 16938 _ = x.Args[3] 16939 if idx != x.Args[0] { 16940 break 16941 } 16942 if p != x.Args[1] { 16943 break 16944 } 16945 if w != x.Args[2] { 16946 break 16947 } 16948 mem := x.Args[3] 16949 if !(x.Uses == 1 && clobber(x)) { 16950 break 16951 } 16952 v.reset(OpS390XMOVDBRstoreidx) 16953 v.AuxInt = i - 4 16954 v.Aux = s 16955 v.AddArg(p) 16956 v.AddArg(idx) 16957 v.AddArg(w) 16958 v.AddArg(mem) 16959 return true 16960 } 16961 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16962 // cond: x.Uses == 1 && clobber(x) 16963 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16964 for { 16965 i := v.AuxInt 16966 s := v.Aux 16967 _ = v.Args[3] 16968 p := v.Args[0] 16969 idx := v.Args[1] 16970 v_2 := v.Args[2] 16971 if v_2.Op != OpS390XSRDconst { 16972 break 16973 } 16974 j := v_2.AuxInt 16975 w := v_2.Args[0] 16976 x := v.Args[3] 16977 if x.Op != OpS390XMOVWBRstoreidx { 16978 break 16979 } 16980 if x.AuxInt != i-4 { 16981 break 16982 } 16983 if x.Aux != s { 16984 break 16985 } 16986 _ = x.Args[3] 16987 if p != x.Args[0] { 16988 break 16989 } 16990 if idx != x.Args[1] { 16991 break 16992 } 16993 w0 := x.Args[2] 16994 if w0.Op != OpS390XSRDconst { 16995 break 16996 } 16997 if w0.AuxInt != j-32 { 16998 break 16999 } 17000 if w != w0.Args[0] { 17001 break 17002 } 17003 mem := x.Args[3] 17004 if !(x.Uses == 1 && clobber(x)) { 17005 break 17006 } 17007 v.reset(OpS390XMOVDBRstoreidx) 17008 v.AuxInt = i - 4 17009 v.Aux = s 17010 v.AddArg(p) 17011 v.AddArg(idx) 17012 v.AddArg(w0) 17013 v.AddArg(mem) 17014 return true 17015 } 17016 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 17017 // cond: x.Uses == 1 && clobber(x) 17018 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17019 for { 17020 i := v.AuxInt 17021 s := v.Aux 17022 _ = v.Args[3] 17023 p := v.Args[0] 17024 idx := v.Args[1] 17025 v_2 := v.Args[2] 17026 if v_2.Op != OpS390XSRDconst { 17027 break 17028 } 17029 j := v_2.AuxInt 17030 w := v_2.Args[0] 17031 x := v.Args[3] 17032 if x.Op != OpS390XMOVWBRstoreidx { 17033 break 17034 } 17035 if x.AuxInt != i-4 { 17036 break 17037 } 17038 if x.Aux != s { 17039 break 17040 } 17041 _ = x.Args[3] 17042 if idx != x.Args[0] { 17043 break 17044 } 17045 if p != x.Args[1] { 17046 break 17047 } 17048 w0 := x.Args[2] 17049 if w0.Op != OpS390XSRDconst { 17050 break 17051 } 17052 if w0.AuxInt != j-32 { 17053 break 17054 } 17055 if w != w0.Args[0] { 17056 break 17057 } 17058 mem := x.Args[3] 17059 if !(x.Uses == 1 && clobber(x)) { 17060 break 17061 } 17062 v.reset(OpS390XMOVDBRstoreidx) 17063 v.AuxInt = i - 4 17064 v.Aux = s 17065 v.AddArg(p) 17066 v.AddArg(idx) 17067 v.AddArg(w0) 17068 v.AddArg(mem) 17069 return true 17070 } 17071 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 17072 // cond: x.Uses == 1 && clobber(x) 17073 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17074 for { 17075 i := v.AuxInt 17076 s := v.Aux 17077 _ = v.Args[3] 17078 idx := v.Args[0] 17079 p := v.Args[1] 17080 v_2 := v.Args[2] 17081 if v_2.Op != OpS390XSRDconst { 17082 break 17083 } 17084 j := v_2.AuxInt 17085 w := v_2.Args[0] 17086 x := v.Args[3] 17087 if x.Op != OpS390XMOVWBRstoreidx { 17088 break 17089 } 17090 if x.AuxInt != i-4 { 17091 break 17092 } 17093 if x.Aux != s { 17094 break 17095 } 17096 _ = x.Args[3] 17097 if p != x.Args[0] { 17098 break 17099 } 17100 if idx != x.Args[1] { 17101 break 17102 } 17103 w0 := x.Args[2] 17104 if w0.Op != OpS390XSRDconst { 17105 break 17106 } 17107 if w0.AuxInt != j-32 { 17108 break 17109 } 17110 if w != w0.Args[0] { 17111 break 17112 } 17113 mem := x.Args[3] 17114 if !(x.Uses == 1 && clobber(x)) { 17115 break 17116 } 17117 v.reset(OpS390XMOVDBRstoreidx) 17118 v.AuxInt = i - 4 17119 v.Aux = s 17120 v.AddArg(p) 17121 v.AddArg(idx) 17122 v.AddArg(w0) 17123 v.AddArg(mem) 17124 return true 17125 } 17126 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 17127 // cond: x.Uses == 1 && clobber(x) 17128 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 17129 for { 17130 i := v.AuxInt 17131 s := v.Aux 17132 _ = v.Args[3] 17133 idx := v.Args[0] 17134 p := v.Args[1] 17135 v_2 := v.Args[2] 17136 if v_2.Op != OpS390XSRDconst { 17137 break 17138 } 17139 j := v_2.AuxInt 17140 w := v_2.Args[0] 17141 x := v.Args[3] 17142 if x.Op != OpS390XMOVWBRstoreidx { 17143 break 17144 } 17145 if x.AuxInt != i-4 { 17146 break 17147 } 17148 if x.Aux != s { 17149 break 17150 } 17151 _ = x.Args[3] 17152 if idx != x.Args[0] { 17153 break 17154 } 17155 if p != x.Args[1] { 17156 break 17157 } 17158 w0 := x.Args[2] 17159 if w0.Op != OpS390XSRDconst { 17160 break 17161 } 17162 if w0.AuxInt != j-32 { 17163 break 17164 } 17165 if w != w0.Args[0] { 17166 break 17167 } 17168 mem := x.Args[3] 17169 if !(x.Uses == 1 && clobber(x)) { 17170 break 17171 } 17172 v.reset(OpS390XMOVDBRstoreidx) 17173 v.AuxInt = i - 4 17174 v.Aux = s 17175 v.AddArg(p) 17176 v.AddArg(idx) 17177 v.AddArg(w0) 17178 v.AddArg(mem) 17179 return true 17180 } 17181 return false 17182 } 17183 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 17184 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 17185 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 17186 // result: (MOVWZreg x) 17187 for { 17188 off := v.AuxInt 17189 sym := v.Aux 17190 _ = v.Args[1] 17191 ptr := v.Args[0] 17192 v_1 := v.Args[1] 17193 if v_1.Op != OpS390XMOVWstore { 17194 break 17195 } 17196 off2 := v_1.AuxInt 17197 sym2 := v_1.Aux 17198 _ = v_1.Args[2] 17199 ptr2 := v_1.Args[0] 17200 x := v_1.Args[1] 17201 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 17202 break 17203 } 17204 v.reset(OpS390XMOVWZreg) 17205 v.AddArg(x) 17206 return true 17207 } 17208 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 17209 // cond: is20Bit(off1+off2) 17210 // result: (MOVWZload [off1+off2] {sym} ptr mem) 17211 for { 17212 off1 := v.AuxInt 17213 sym := v.Aux 17214 _ = v.Args[1] 17215 v_0 := v.Args[0] 17216 if v_0.Op != OpS390XADDconst { 17217 break 17218 } 17219 off2 := v_0.AuxInt 17220 ptr := v_0.Args[0] 17221 mem := v.Args[1] 17222 if !(is20Bit(off1 + off2)) { 17223 break 17224 } 17225 v.reset(OpS390XMOVWZload) 17226 v.AuxInt = off1 + off2 17227 v.Aux = sym 17228 v.AddArg(ptr) 17229 v.AddArg(mem) 17230 return true 17231 } 17232 // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 17233 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17234 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17235 for { 17236 off1 := v.AuxInt 17237 sym1 := v.Aux 17238 _ = v.Args[1] 17239 v_0 := v.Args[0] 17240 if v_0.Op != OpS390XMOVDaddr { 17241 break 17242 } 17243 off2 := v_0.AuxInt 17244 sym2 := v_0.Aux 17245 base := v_0.Args[0] 17246 mem := v.Args[1] 17247 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17248 break 17249 } 17250 v.reset(OpS390XMOVWZload) 17251 v.AuxInt = off1 + off2 17252 v.Aux = mergeSym(sym1, sym2) 17253 v.AddArg(base) 17254 v.AddArg(mem) 17255 return true 17256 } 17257 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 17258 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17259 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 17260 for { 17261 off1 := v.AuxInt 17262 sym1 := v.Aux 17263 _ = v.Args[1] 17264 v_0 := v.Args[0] 17265 if v_0.Op != OpS390XMOVDaddridx { 17266 break 17267 } 17268 off2 := v_0.AuxInt 17269 sym2 := v_0.Aux 17270 _ = v_0.Args[1] 17271 ptr := v_0.Args[0] 17272 idx := v_0.Args[1] 17273 mem := v.Args[1] 17274 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17275 break 17276 } 17277 v.reset(OpS390XMOVWZloadidx) 17278 v.AuxInt = off1 + off2 17279 v.Aux = mergeSym(sym1, sym2) 17280 v.AddArg(ptr) 17281 v.AddArg(idx) 17282 v.AddArg(mem) 17283 return true 17284 } 17285 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 17286 // cond: ptr.Op != OpSB 17287 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 17288 for { 17289 off := v.AuxInt 17290 sym := v.Aux 17291 _ = v.Args[1] 17292 v_0 := v.Args[0] 17293 if v_0.Op != OpS390XADD { 17294 break 17295 } 17296 _ = v_0.Args[1] 17297 ptr := v_0.Args[0] 17298 idx := v_0.Args[1] 17299 mem := v.Args[1] 17300 if !(ptr.Op != OpSB) { 17301 break 17302 } 17303 v.reset(OpS390XMOVWZloadidx) 17304 v.AuxInt = off 17305 v.Aux = sym 17306 v.AddArg(ptr) 17307 v.AddArg(idx) 17308 v.AddArg(mem) 17309 return true 17310 } 17311 return false 17312 } 17313 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 17314 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 17315 // cond: 17316 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17317 for { 17318 c := v.AuxInt 17319 sym := v.Aux 17320 _ = v.Args[2] 17321 v_0 := v.Args[0] 17322 if v_0.Op != OpS390XADDconst { 17323 break 17324 } 17325 d := v_0.AuxInt 17326 ptr := v_0.Args[0] 17327 idx := v.Args[1] 17328 mem := v.Args[2] 17329 v.reset(OpS390XMOVWZloadidx) 17330 v.AuxInt = c + d 17331 v.Aux = sym 17332 v.AddArg(ptr) 17333 v.AddArg(idx) 17334 v.AddArg(mem) 17335 return true 17336 } 17337 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 17338 // cond: 17339 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17340 for { 17341 c := v.AuxInt 17342 sym := v.Aux 17343 _ = v.Args[2] 17344 idx := v.Args[0] 17345 v_1 := v.Args[1] 17346 if v_1.Op != OpS390XADDconst { 17347 break 17348 } 17349 d := v_1.AuxInt 17350 ptr := v_1.Args[0] 17351 mem := v.Args[2] 17352 v.reset(OpS390XMOVWZloadidx) 17353 v.AuxInt = c + d 17354 v.Aux = sym 17355 v.AddArg(ptr) 17356 v.AddArg(idx) 17357 v.AddArg(mem) 17358 return true 17359 } 17360 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 17361 // cond: 17362 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17363 for { 17364 c := v.AuxInt 17365 sym := v.Aux 17366 _ = v.Args[2] 17367 ptr := v.Args[0] 17368 v_1 := v.Args[1] 17369 if v_1.Op != OpS390XADDconst { 17370 break 17371 } 17372 d := v_1.AuxInt 17373 idx := v_1.Args[0] 17374 mem := v.Args[2] 17375 v.reset(OpS390XMOVWZloadidx) 17376 v.AuxInt = c + d 17377 v.Aux = sym 17378 v.AddArg(ptr) 17379 v.AddArg(idx) 17380 v.AddArg(mem) 17381 return true 17382 } 17383 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 17384 // cond: 17385 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 17386 for { 17387 c := v.AuxInt 17388 sym := v.Aux 17389 _ = v.Args[2] 17390 v_0 := v.Args[0] 17391 if v_0.Op != OpS390XADDconst { 17392 break 17393 } 17394 d := v_0.AuxInt 17395 idx := v_0.Args[0] 17396 ptr := v.Args[1] 17397 mem := v.Args[2] 17398 v.reset(OpS390XMOVWZloadidx) 17399 v.AuxInt = c + d 17400 v.Aux = sym 17401 v.AddArg(ptr) 17402 v.AddArg(idx) 17403 v.AddArg(mem) 17404 return true 17405 } 17406 return false 17407 } 17408 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 17409 b := v.Block 17410 _ = b 17411 // match: (MOVWZreg x:(MOVBZload _ _)) 17412 // cond: 17413 // result: (MOVDreg x) 17414 for { 17415 x := v.Args[0] 17416 if x.Op != OpS390XMOVBZload { 17417 break 17418 } 17419 _ = x.Args[1] 17420 v.reset(OpS390XMOVDreg) 17421 v.AddArg(x) 17422 return true 17423 } 17424 // match: (MOVWZreg x:(MOVHZload _ _)) 17425 // cond: 17426 // result: (MOVDreg x) 17427 for { 17428 x := v.Args[0] 17429 if x.Op != OpS390XMOVHZload { 17430 break 17431 } 17432 _ = x.Args[1] 17433 v.reset(OpS390XMOVDreg) 17434 v.AddArg(x) 17435 return true 17436 } 17437 // match: (MOVWZreg x:(MOVWZload _ _)) 17438 // cond: 17439 // result: (MOVDreg x) 17440 for { 17441 x := v.Args[0] 17442 if x.Op != OpS390XMOVWZload { 17443 break 17444 } 17445 _ = x.Args[1] 17446 v.reset(OpS390XMOVDreg) 17447 v.AddArg(x) 17448 return true 17449 } 17450 // match: (MOVWZreg x:(Arg <t>)) 17451 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 17452 // result: (MOVDreg x) 17453 for { 17454 x := v.Args[0] 17455 if x.Op != OpArg { 17456 break 17457 } 17458 t := x.Type 17459 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 17460 break 17461 } 17462 v.reset(OpS390XMOVDreg) 17463 v.AddArg(x) 17464 return true 17465 } 17466 // match: (MOVWZreg x:(MOVBZreg _)) 17467 // cond: 17468 // result: (MOVDreg x) 17469 for { 17470 x := v.Args[0] 17471 if x.Op != OpS390XMOVBZreg { 17472 break 17473 } 17474 v.reset(OpS390XMOVDreg) 17475 v.AddArg(x) 17476 return true 17477 } 17478 // match: (MOVWZreg x:(MOVHZreg _)) 17479 // cond: 17480 // result: (MOVDreg x) 17481 for { 17482 x := v.Args[0] 17483 if x.Op != OpS390XMOVHZreg { 17484 break 17485 } 17486 v.reset(OpS390XMOVDreg) 17487 v.AddArg(x) 17488 return true 17489 } 17490 // match: (MOVWZreg x:(MOVWZreg _)) 17491 // cond: 17492 // result: (MOVDreg x) 17493 for { 17494 x := v.Args[0] 17495 if x.Op != OpS390XMOVWZreg { 17496 break 17497 } 17498 v.reset(OpS390XMOVDreg) 17499 v.AddArg(x) 17500 return true 17501 } 17502 // match: (MOVWZreg (MOVDconst [c])) 17503 // cond: 17504 // result: (MOVDconst [int64(uint32(c))]) 17505 for { 17506 v_0 := v.Args[0] 17507 if v_0.Op != OpS390XMOVDconst { 17508 break 17509 } 17510 c := v_0.AuxInt 17511 v.reset(OpS390XMOVDconst) 17512 v.AuxInt = int64(uint32(c)) 17513 return true 17514 } 17515 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 17516 // cond: x.Uses == 1 && clobber(x) 17517 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 17518 for { 17519 x := v.Args[0] 17520 if x.Op != OpS390XMOVWZload { 17521 break 17522 } 17523 off := x.AuxInt 17524 sym := x.Aux 17525 _ = x.Args[1] 17526 ptr := x.Args[0] 17527 mem := x.Args[1] 17528 if !(x.Uses == 1 && clobber(x)) { 17529 break 17530 } 17531 b = x.Block 17532 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 17533 v.reset(OpCopy) 17534 v.AddArg(v0) 17535 v0.AuxInt = off 17536 v0.Aux = sym 17537 v0.AddArg(ptr) 17538 v0.AddArg(mem) 17539 return true 17540 } 17541 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 17542 // cond: x.Uses == 1 && clobber(x) 17543 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 17544 for { 17545 x := v.Args[0] 17546 if x.Op != OpS390XMOVWZloadidx { 17547 break 17548 } 17549 off := x.AuxInt 17550 sym := x.Aux 17551 _ = x.Args[2] 17552 ptr := x.Args[0] 17553 idx := x.Args[1] 17554 mem := x.Args[2] 17555 if !(x.Uses == 1 && clobber(x)) { 17556 break 17557 } 17558 b = x.Block 17559 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 17560 v.reset(OpCopy) 17561 v.AddArg(v0) 17562 v0.AuxInt = off 17563 v0.Aux = sym 17564 v0.AddArg(ptr) 17565 v0.AddArg(idx) 17566 v0.AddArg(mem) 17567 return true 17568 } 17569 return false 17570 } 17571 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 17572 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 17573 // cond: is20Bit(off1+off2) 17574 // result: (MOVWload [off1+off2] {sym} ptr mem) 17575 for { 17576 off1 := v.AuxInt 17577 sym := v.Aux 17578 _ = v.Args[1] 17579 v_0 := v.Args[0] 17580 if v_0.Op != OpS390XADDconst { 17581 break 17582 } 17583 off2 := v_0.AuxInt 17584 ptr := v_0.Args[0] 17585 mem := v.Args[1] 17586 if !(is20Bit(off1 + off2)) { 17587 break 17588 } 17589 v.reset(OpS390XMOVWload) 17590 v.AuxInt = off1 + off2 17591 v.Aux = sym 17592 v.AddArg(ptr) 17593 v.AddArg(mem) 17594 return true 17595 } 17596 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 17597 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17598 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 17599 for { 17600 off1 := v.AuxInt 17601 sym1 := v.Aux 17602 _ = v.Args[1] 17603 v_0 := v.Args[0] 17604 if v_0.Op != OpS390XMOVDaddr { 17605 break 17606 } 17607 off2 := v_0.AuxInt 17608 sym2 := v_0.Aux 17609 base := v_0.Args[0] 17610 mem := v.Args[1] 17611 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17612 break 17613 } 17614 v.reset(OpS390XMOVWload) 17615 v.AuxInt = off1 + off2 17616 v.Aux = mergeSym(sym1, sym2) 17617 v.AddArg(base) 17618 v.AddArg(mem) 17619 return true 17620 } 17621 return false 17622 } 17623 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 17624 // match: (MOVWreg x:(MOVBload _ _)) 17625 // cond: 17626 // result: (MOVDreg x) 17627 for { 17628 x := v.Args[0] 17629 if x.Op != OpS390XMOVBload { 17630 break 17631 } 17632 _ = x.Args[1] 17633 v.reset(OpS390XMOVDreg) 17634 v.AddArg(x) 17635 return true 17636 } 17637 // match: (MOVWreg x:(MOVBZload _ _)) 17638 // cond: 17639 // result: (MOVDreg x) 17640 for { 17641 x := v.Args[0] 17642 if x.Op != OpS390XMOVBZload { 17643 break 17644 } 17645 _ = x.Args[1] 17646 v.reset(OpS390XMOVDreg) 17647 v.AddArg(x) 17648 return true 17649 } 17650 // match: (MOVWreg x:(MOVHload _ _)) 17651 // cond: 17652 // result: (MOVDreg x) 17653 for { 17654 x := v.Args[0] 17655 if x.Op != OpS390XMOVHload { 17656 break 17657 } 17658 _ = x.Args[1] 17659 v.reset(OpS390XMOVDreg) 17660 v.AddArg(x) 17661 return true 17662 } 17663 // match: (MOVWreg x:(MOVHZload _ _)) 17664 // cond: 17665 // result: (MOVDreg x) 17666 for { 17667 x := v.Args[0] 17668 if x.Op != OpS390XMOVHZload { 17669 break 17670 } 17671 _ = x.Args[1] 17672 v.reset(OpS390XMOVDreg) 17673 v.AddArg(x) 17674 return true 17675 } 17676 // match: (MOVWreg x:(MOVWload _ _)) 17677 // cond: 17678 // result: (MOVDreg x) 17679 for { 17680 x := v.Args[0] 17681 if x.Op != OpS390XMOVWload { 17682 break 17683 } 17684 _ = x.Args[1] 17685 v.reset(OpS390XMOVDreg) 17686 v.AddArg(x) 17687 return true 17688 } 17689 // match: (MOVWreg x:(Arg <t>)) 17690 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 17691 // result: (MOVDreg x) 17692 for { 17693 x := v.Args[0] 17694 if x.Op != OpArg { 17695 break 17696 } 17697 t := x.Type 17698 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 17699 break 17700 } 17701 v.reset(OpS390XMOVDreg) 17702 v.AddArg(x) 17703 return true 17704 } 17705 // match: (MOVWreg x:(MOVBreg _)) 17706 // cond: 17707 // result: (MOVDreg x) 17708 for { 17709 x := v.Args[0] 17710 if x.Op != OpS390XMOVBreg { 17711 break 17712 } 17713 v.reset(OpS390XMOVDreg) 17714 v.AddArg(x) 17715 return true 17716 } 17717 // match: (MOVWreg x:(MOVBZreg _)) 17718 // cond: 17719 // result: (MOVDreg x) 17720 for { 17721 x := v.Args[0] 17722 if x.Op != OpS390XMOVBZreg { 17723 break 17724 } 17725 v.reset(OpS390XMOVDreg) 17726 v.AddArg(x) 17727 return true 17728 } 17729 // match: (MOVWreg x:(MOVHreg _)) 17730 // cond: 17731 // result: (MOVDreg x) 17732 for { 17733 x := v.Args[0] 17734 if x.Op != OpS390XMOVHreg { 17735 break 17736 } 17737 v.reset(OpS390XMOVDreg) 17738 v.AddArg(x) 17739 return true 17740 } 17741 // match: (MOVWreg x:(MOVHreg _)) 17742 // cond: 17743 // result: (MOVDreg x) 17744 for { 17745 x := v.Args[0] 17746 if x.Op != OpS390XMOVHreg { 17747 break 17748 } 17749 v.reset(OpS390XMOVDreg) 17750 v.AddArg(x) 17751 return true 17752 } 17753 return false 17754 } 17755 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 17756 b := v.Block 17757 _ = b 17758 // match: (MOVWreg x:(MOVWreg _)) 17759 // cond: 17760 // result: (MOVDreg x) 17761 for { 17762 x := v.Args[0] 17763 if x.Op != OpS390XMOVWreg { 17764 break 17765 } 17766 v.reset(OpS390XMOVDreg) 17767 v.AddArg(x) 17768 return true 17769 } 17770 // match: (MOVWreg (MOVDconst [c])) 17771 // cond: 17772 // result: (MOVDconst [int64(int32(c))]) 17773 for { 17774 v_0 := v.Args[0] 17775 if v_0.Op != OpS390XMOVDconst { 17776 break 17777 } 17778 c := v_0.AuxInt 17779 v.reset(OpS390XMOVDconst) 17780 v.AuxInt = int64(int32(c)) 17781 return true 17782 } 17783 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 17784 // cond: x.Uses == 1 && clobber(x) 17785 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 17786 for { 17787 x := v.Args[0] 17788 if x.Op != OpS390XMOVWZload { 17789 break 17790 } 17791 off := x.AuxInt 17792 sym := x.Aux 17793 _ = x.Args[1] 17794 ptr := x.Args[0] 17795 mem := x.Args[1] 17796 if !(x.Uses == 1 && clobber(x)) { 17797 break 17798 } 17799 b = x.Block 17800 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 17801 v.reset(OpCopy) 17802 v.AddArg(v0) 17803 v0.AuxInt = off 17804 v0.Aux = sym 17805 v0.AddArg(ptr) 17806 v0.AddArg(mem) 17807 return true 17808 } 17809 return false 17810 } 17811 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 17812 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 17813 // cond: 17814 // result: (MOVWstore [off] {sym} ptr x mem) 17815 for { 17816 off := v.AuxInt 17817 sym := v.Aux 17818 _ = v.Args[2] 17819 ptr := v.Args[0] 17820 v_1 := v.Args[1] 17821 if v_1.Op != OpS390XMOVWreg { 17822 break 17823 } 17824 x := v_1.Args[0] 17825 mem := v.Args[2] 17826 v.reset(OpS390XMOVWstore) 17827 v.AuxInt = off 17828 v.Aux = sym 17829 v.AddArg(ptr) 17830 v.AddArg(x) 17831 v.AddArg(mem) 17832 return true 17833 } 17834 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 17835 // cond: 17836 // result: (MOVWstore [off] {sym} ptr x mem) 17837 for { 17838 off := v.AuxInt 17839 sym := v.Aux 17840 _ = v.Args[2] 17841 ptr := v.Args[0] 17842 v_1 := v.Args[1] 17843 if v_1.Op != OpS390XMOVWZreg { 17844 break 17845 } 17846 x := v_1.Args[0] 17847 mem := v.Args[2] 17848 v.reset(OpS390XMOVWstore) 17849 v.AuxInt = off 17850 v.Aux = sym 17851 v.AddArg(ptr) 17852 v.AddArg(x) 17853 v.AddArg(mem) 17854 return true 17855 } 17856 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17857 // cond: is20Bit(off1+off2) 17858 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 17859 for { 17860 off1 := v.AuxInt 17861 sym := v.Aux 17862 _ = v.Args[2] 17863 v_0 := v.Args[0] 17864 if v_0.Op != OpS390XADDconst { 17865 break 17866 } 17867 off2 := v_0.AuxInt 17868 ptr := v_0.Args[0] 17869 val := v.Args[1] 17870 mem := v.Args[2] 17871 if !(is20Bit(off1 + off2)) { 17872 break 17873 } 17874 v.reset(OpS390XMOVWstore) 17875 v.AuxInt = off1 + off2 17876 v.Aux = sym 17877 v.AddArg(ptr) 17878 v.AddArg(val) 17879 v.AddArg(mem) 17880 return true 17881 } 17882 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 17883 // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB 17884 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 17885 for { 17886 off := v.AuxInt 17887 sym := v.Aux 17888 _ = v.Args[2] 17889 ptr := v.Args[0] 17890 v_1 := v.Args[1] 17891 if v_1.Op != OpS390XMOVDconst { 17892 break 17893 } 17894 c := v_1.AuxInt 17895 mem := v.Args[2] 17896 if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { 17897 break 17898 } 17899 v.reset(OpS390XMOVWstoreconst) 17900 v.AuxInt = makeValAndOff(int64(int32(c)), off) 17901 v.Aux = sym 17902 v.AddArg(ptr) 17903 v.AddArg(mem) 17904 return true 17905 } 17906 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 17907 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17908 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17909 for { 17910 off1 := v.AuxInt 17911 sym1 := v.Aux 17912 _ = v.Args[2] 17913 v_0 := v.Args[0] 17914 if v_0.Op != OpS390XMOVDaddr { 17915 break 17916 } 17917 off2 := v_0.AuxInt 17918 sym2 := v_0.Aux 17919 base := v_0.Args[0] 17920 val := v.Args[1] 17921 mem := v.Args[2] 17922 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17923 break 17924 } 17925 v.reset(OpS390XMOVWstore) 17926 v.AuxInt = off1 + off2 17927 v.Aux = mergeSym(sym1, sym2) 17928 v.AddArg(base) 17929 v.AddArg(val) 17930 v.AddArg(mem) 17931 return true 17932 } 17933 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17934 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17935 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17936 for { 17937 off1 := v.AuxInt 17938 sym1 := v.Aux 17939 _ = v.Args[2] 17940 v_0 := v.Args[0] 17941 if v_0.Op != OpS390XMOVDaddridx { 17942 break 17943 } 17944 off2 := v_0.AuxInt 17945 sym2 := v_0.Aux 17946 _ = v_0.Args[1] 17947 ptr := v_0.Args[0] 17948 idx := v_0.Args[1] 17949 val := v.Args[1] 17950 mem := v.Args[2] 17951 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17952 break 17953 } 17954 v.reset(OpS390XMOVWstoreidx) 17955 v.AuxInt = off1 + off2 17956 v.Aux = mergeSym(sym1, sym2) 17957 v.AddArg(ptr) 17958 v.AddArg(idx) 17959 v.AddArg(val) 17960 v.AddArg(mem) 17961 return true 17962 } 17963 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 17964 // cond: ptr.Op != OpSB 17965 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 17966 for { 17967 off := v.AuxInt 17968 sym := v.Aux 17969 _ = v.Args[2] 17970 v_0 := v.Args[0] 17971 if v_0.Op != OpS390XADD { 17972 break 17973 } 17974 _ = v_0.Args[1] 17975 ptr := v_0.Args[0] 17976 idx := v_0.Args[1] 17977 val := v.Args[1] 17978 mem := v.Args[2] 17979 if !(ptr.Op != OpSB) { 17980 break 17981 } 17982 v.reset(OpS390XMOVWstoreidx) 17983 v.AuxInt = off 17984 v.Aux = sym 17985 v.AddArg(ptr) 17986 v.AddArg(idx) 17987 v.AddArg(val) 17988 v.AddArg(mem) 17989 return true 17990 } 17991 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 17992 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17993 // result: (MOVDstore [i-4] {s} p w mem) 17994 for { 17995 i := v.AuxInt 17996 s := v.Aux 17997 _ = v.Args[2] 17998 p := v.Args[0] 17999 v_1 := v.Args[1] 18000 if v_1.Op != OpS390XSRDconst { 18001 break 18002 } 18003 if v_1.AuxInt != 32 { 18004 break 18005 } 18006 w := v_1.Args[0] 18007 x := v.Args[2] 18008 if x.Op != OpS390XMOVWstore { 18009 break 18010 } 18011 if x.AuxInt != i-4 { 18012 break 18013 } 18014 if x.Aux != s { 18015 break 18016 } 18017 _ = x.Args[2] 18018 if p != x.Args[0] { 18019 break 18020 } 18021 if w != x.Args[1] { 18022 break 18023 } 18024 mem := x.Args[2] 18025 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18026 break 18027 } 18028 v.reset(OpS390XMOVDstore) 18029 v.AuxInt = i - 4 18030 v.Aux = s 18031 v.AddArg(p) 18032 v.AddArg(w) 18033 v.AddArg(mem) 18034 return true 18035 } 18036 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 18037 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 18038 // result: (MOVDstore [i-4] {s} p w0 mem) 18039 for { 18040 i := v.AuxInt 18041 s := v.Aux 18042 _ = v.Args[2] 18043 p := v.Args[0] 18044 w0 := v.Args[1] 18045 if w0.Op != OpS390XSRDconst { 18046 break 18047 } 18048 j := w0.AuxInt 18049 w := w0.Args[0] 18050 x := v.Args[2] 18051 if x.Op != OpS390XMOVWstore { 18052 break 18053 } 18054 if x.AuxInt != i-4 { 18055 break 18056 } 18057 if x.Aux != s { 18058 break 18059 } 18060 _ = x.Args[2] 18061 if p != x.Args[0] { 18062 break 18063 } 18064 x_1 := x.Args[1] 18065 if x_1.Op != OpS390XSRDconst { 18066 break 18067 } 18068 if x_1.AuxInt != j+32 { 18069 break 18070 } 18071 if w != x_1.Args[0] { 18072 break 18073 } 18074 mem := x.Args[2] 18075 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 18076 break 18077 } 18078 v.reset(OpS390XMOVDstore) 18079 v.AuxInt = i - 4 18080 v.Aux = s 18081 v.AddArg(p) 18082 v.AddArg(w0) 18083 v.AddArg(mem) 18084 return true 18085 } 18086 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 18087 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 18088 // result: (STM2 [i-4] {s} p w0 w1 mem) 18089 for { 18090 i := v.AuxInt 18091 s := v.Aux 18092 _ = v.Args[2] 18093 p := v.Args[0] 18094 w1 := v.Args[1] 18095 x := v.Args[2] 18096 if x.Op != OpS390XMOVWstore { 18097 break 18098 } 18099 if x.AuxInt != i-4 { 18100 break 18101 } 18102 if x.Aux != s { 18103 break 18104 } 18105 _ = x.Args[2] 18106 if p != x.Args[0] { 18107 break 18108 } 18109 w0 := x.Args[1] 18110 mem := x.Args[2] 18111 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 18112 break 18113 } 18114 v.reset(OpS390XSTM2) 18115 v.AuxInt = i - 4 18116 v.Aux = s 18117 v.AddArg(p) 18118 v.AddArg(w0) 18119 v.AddArg(w1) 18120 v.AddArg(mem) 18121 return true 18122 } 18123 return false 18124 } 18125 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 18126 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 18127 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 18128 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 18129 for { 18130 i := v.AuxInt 18131 s := v.Aux 18132 _ = v.Args[2] 18133 p := v.Args[0] 18134 w2 := v.Args[1] 18135 x := v.Args[2] 18136 if x.Op != OpS390XSTM2 { 18137 break 18138 } 18139 if x.AuxInt != i-8 { 18140 break 18141 } 18142 if x.Aux != s { 18143 break 18144 } 18145 _ = x.Args[3] 18146 if p != x.Args[0] { 18147 break 18148 } 18149 w0 := x.Args[1] 18150 w1 := x.Args[2] 18151 mem := x.Args[3] 18152 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 18153 break 18154 } 18155 v.reset(OpS390XSTM3) 18156 v.AuxInt = i - 8 18157 v.Aux = s 18158 v.AddArg(p) 18159 v.AddArg(w0) 18160 v.AddArg(w1) 18161 v.AddArg(w2) 18162 v.AddArg(mem) 18163 return true 18164 } 18165 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 18166 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 18167 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 18168 for { 18169 i := v.AuxInt 18170 s := v.Aux 18171 _ = v.Args[2] 18172 p := v.Args[0] 18173 w3 := v.Args[1] 18174 x := v.Args[2] 18175 if x.Op != OpS390XSTM3 { 18176 break 18177 } 18178 if x.AuxInt != i-12 { 18179 break 18180 } 18181 if x.Aux != s { 18182 break 18183 } 18184 _ = x.Args[4] 18185 if p != x.Args[0] { 18186 break 18187 } 18188 w0 := x.Args[1] 18189 w1 := x.Args[2] 18190 w2 := x.Args[3] 18191 mem := x.Args[4] 18192 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 18193 break 18194 } 18195 v.reset(OpS390XSTM4) 18196 v.AuxInt = i - 12 18197 v.Aux = s 18198 v.AddArg(p) 18199 v.AddArg(w0) 18200 v.AddArg(w1) 18201 v.AddArg(w2) 18202 v.AddArg(w3) 18203 v.AddArg(mem) 18204 return true 18205 } 18206 return false 18207 } 18208 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 18209 b := v.Block 18210 _ = b 18211 typ := &b.Func.Config.Types 18212 _ = typ 18213 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 18214 // cond: isU12Bit(ValAndOff(sc).Off()+off) 18215 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 18216 for { 18217 sc := v.AuxInt 18218 s := v.Aux 18219 _ = v.Args[1] 18220 v_0 := v.Args[0] 18221 if v_0.Op != OpS390XADDconst { 18222 break 18223 } 18224 off := v_0.AuxInt 18225 ptr := v_0.Args[0] 18226 mem := v.Args[1] 18227 if !(isU12Bit(ValAndOff(sc).Off() + off)) { 18228 break 18229 } 18230 v.reset(OpS390XMOVWstoreconst) 18231 v.AuxInt = ValAndOff(sc).add(off) 18232 v.Aux = s 18233 v.AddArg(ptr) 18234 v.AddArg(mem) 18235 return true 18236 } 18237 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 18238 // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 18239 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 18240 for { 18241 sc := v.AuxInt 18242 sym1 := v.Aux 18243 _ = v.Args[1] 18244 v_0 := v.Args[0] 18245 if v_0.Op != OpS390XMOVDaddr { 18246 break 18247 } 18248 off := v_0.AuxInt 18249 sym2 := v_0.Aux 18250 ptr := v_0.Args[0] 18251 mem := v.Args[1] 18252 if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 18253 break 18254 } 18255 v.reset(OpS390XMOVWstoreconst) 18256 v.AuxInt = ValAndOff(sc).add(off) 18257 v.Aux = mergeSym(sym1, sym2) 18258 v.AddArg(ptr) 18259 v.AddArg(mem) 18260 return true 18261 } 18262 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 18263 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 18264 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 18265 for { 18266 c := v.AuxInt 18267 s := v.Aux 18268 _ = v.Args[1] 18269 p := v.Args[0] 18270 x := v.Args[1] 18271 if x.Op != OpS390XMOVWstoreconst { 18272 break 18273 } 18274 a := x.AuxInt 18275 if x.Aux != s { 18276 break 18277 } 18278 _ = x.Args[1] 18279 if p != x.Args[0] { 18280 break 18281 } 18282 mem := x.Args[1] 18283 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 18284 break 18285 } 18286 v.reset(OpS390XMOVDstore) 18287 v.AuxInt = ValAndOff(a).Off() 18288 v.Aux = s 18289 v.AddArg(p) 18290 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 18291 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 18292 v.AddArg(v0) 18293 v.AddArg(mem) 18294 return true 18295 } 18296 return false 18297 } 18298 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 18299 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 18300 // cond: 18301 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18302 for { 18303 c := v.AuxInt 18304 sym := v.Aux 18305 _ = v.Args[3] 18306 v_0 := v.Args[0] 18307 if v_0.Op != OpS390XADDconst { 18308 break 18309 } 18310 d := v_0.AuxInt 18311 ptr := v_0.Args[0] 18312 idx := v.Args[1] 18313 val := v.Args[2] 18314 mem := v.Args[3] 18315 v.reset(OpS390XMOVWstoreidx) 18316 v.AuxInt = c + d 18317 v.Aux = sym 18318 v.AddArg(ptr) 18319 v.AddArg(idx) 18320 v.AddArg(val) 18321 v.AddArg(mem) 18322 return true 18323 } 18324 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 18325 // cond: 18326 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18327 for { 18328 c := v.AuxInt 18329 sym := v.Aux 18330 _ = v.Args[3] 18331 idx := v.Args[0] 18332 v_1 := v.Args[1] 18333 if v_1.Op != OpS390XADDconst { 18334 break 18335 } 18336 d := v_1.AuxInt 18337 ptr := v_1.Args[0] 18338 val := v.Args[2] 18339 mem := v.Args[3] 18340 v.reset(OpS390XMOVWstoreidx) 18341 v.AuxInt = c + d 18342 v.Aux = sym 18343 v.AddArg(ptr) 18344 v.AddArg(idx) 18345 v.AddArg(val) 18346 v.AddArg(mem) 18347 return true 18348 } 18349 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 18350 // cond: 18351 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18352 for { 18353 c := v.AuxInt 18354 sym := v.Aux 18355 _ = v.Args[3] 18356 ptr := v.Args[0] 18357 v_1 := v.Args[1] 18358 if v_1.Op != OpS390XADDconst { 18359 break 18360 } 18361 d := v_1.AuxInt 18362 idx := v_1.Args[0] 18363 val := v.Args[2] 18364 mem := v.Args[3] 18365 v.reset(OpS390XMOVWstoreidx) 18366 v.AuxInt = c + d 18367 v.Aux = sym 18368 v.AddArg(ptr) 18369 v.AddArg(idx) 18370 v.AddArg(val) 18371 v.AddArg(mem) 18372 return true 18373 } 18374 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 18375 // cond: 18376 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 18377 for { 18378 c := v.AuxInt 18379 sym := v.Aux 18380 _ = v.Args[3] 18381 v_0 := v.Args[0] 18382 if v_0.Op != OpS390XADDconst { 18383 break 18384 } 18385 d := v_0.AuxInt 18386 idx := v_0.Args[0] 18387 ptr := v.Args[1] 18388 val := v.Args[2] 18389 mem := v.Args[3] 18390 v.reset(OpS390XMOVWstoreidx) 18391 v.AuxInt = c + d 18392 v.Aux = sym 18393 v.AddArg(ptr) 18394 v.AddArg(idx) 18395 v.AddArg(val) 18396 v.AddArg(mem) 18397 return true 18398 } 18399 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18400 // cond: x.Uses == 1 && clobber(x) 18401 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18402 for { 18403 i := v.AuxInt 18404 s := v.Aux 18405 _ = v.Args[3] 18406 p := v.Args[0] 18407 idx := v.Args[1] 18408 w := v.Args[2] 18409 x := v.Args[3] 18410 if x.Op != OpS390XMOVWstoreidx { 18411 break 18412 } 18413 if x.AuxInt != i-4 { 18414 break 18415 } 18416 if x.Aux != s { 18417 break 18418 } 18419 _ = x.Args[3] 18420 if p != x.Args[0] { 18421 break 18422 } 18423 if idx != x.Args[1] { 18424 break 18425 } 18426 x_2 := x.Args[2] 18427 if x_2.Op != OpS390XSRDconst { 18428 break 18429 } 18430 if x_2.AuxInt != 32 { 18431 break 18432 } 18433 if w != x_2.Args[0] { 18434 break 18435 } 18436 mem := x.Args[3] 18437 if !(x.Uses == 1 && clobber(x)) { 18438 break 18439 } 18440 v.reset(OpS390XMOVDstoreidx) 18441 v.AuxInt = i - 4 18442 v.Aux = s 18443 v.AddArg(p) 18444 v.AddArg(idx) 18445 v.AddArg(w) 18446 v.AddArg(mem) 18447 return true 18448 } 18449 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18450 // cond: x.Uses == 1 && clobber(x) 18451 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18452 for { 18453 i := v.AuxInt 18454 s := v.Aux 18455 _ = v.Args[3] 18456 p := v.Args[0] 18457 idx := v.Args[1] 18458 w := v.Args[2] 18459 x := v.Args[3] 18460 if x.Op != OpS390XMOVWstoreidx { 18461 break 18462 } 18463 if x.AuxInt != i-4 { 18464 break 18465 } 18466 if x.Aux != s { 18467 break 18468 } 18469 _ = x.Args[3] 18470 if idx != x.Args[0] { 18471 break 18472 } 18473 if p != x.Args[1] { 18474 break 18475 } 18476 x_2 := x.Args[2] 18477 if x_2.Op != OpS390XSRDconst { 18478 break 18479 } 18480 if x_2.AuxInt != 32 { 18481 break 18482 } 18483 if w != x_2.Args[0] { 18484 break 18485 } 18486 mem := x.Args[3] 18487 if !(x.Uses == 1 && clobber(x)) { 18488 break 18489 } 18490 v.reset(OpS390XMOVDstoreidx) 18491 v.AuxInt = i - 4 18492 v.Aux = s 18493 v.AddArg(p) 18494 v.AddArg(idx) 18495 v.AddArg(w) 18496 v.AddArg(mem) 18497 return true 18498 } 18499 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 18500 // cond: x.Uses == 1 && clobber(x) 18501 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18502 for { 18503 i := v.AuxInt 18504 s := v.Aux 18505 _ = v.Args[3] 18506 idx := v.Args[0] 18507 p := v.Args[1] 18508 w := v.Args[2] 18509 x := v.Args[3] 18510 if x.Op != OpS390XMOVWstoreidx { 18511 break 18512 } 18513 if x.AuxInt != i-4 { 18514 break 18515 } 18516 if x.Aux != s { 18517 break 18518 } 18519 _ = x.Args[3] 18520 if p != x.Args[0] { 18521 break 18522 } 18523 if idx != x.Args[1] { 18524 break 18525 } 18526 x_2 := x.Args[2] 18527 if x_2.Op != OpS390XSRDconst { 18528 break 18529 } 18530 if x_2.AuxInt != 32 { 18531 break 18532 } 18533 if w != x_2.Args[0] { 18534 break 18535 } 18536 mem := x.Args[3] 18537 if !(x.Uses == 1 && clobber(x)) { 18538 break 18539 } 18540 v.reset(OpS390XMOVDstoreidx) 18541 v.AuxInt = i - 4 18542 v.Aux = s 18543 v.AddArg(p) 18544 v.AddArg(idx) 18545 v.AddArg(w) 18546 v.AddArg(mem) 18547 return true 18548 } 18549 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 18550 // cond: x.Uses == 1 && clobber(x) 18551 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 18552 for { 18553 i := v.AuxInt 18554 s := v.Aux 18555 _ = v.Args[3] 18556 idx := v.Args[0] 18557 p := v.Args[1] 18558 w := v.Args[2] 18559 x := v.Args[3] 18560 if x.Op != OpS390XMOVWstoreidx { 18561 break 18562 } 18563 if x.AuxInt != i-4 { 18564 break 18565 } 18566 if x.Aux != s { 18567 break 18568 } 18569 _ = x.Args[3] 18570 if idx != x.Args[0] { 18571 break 18572 } 18573 if p != x.Args[1] { 18574 break 18575 } 18576 x_2 := x.Args[2] 18577 if x_2.Op != OpS390XSRDconst { 18578 break 18579 } 18580 if x_2.AuxInt != 32 { 18581 break 18582 } 18583 if w != x_2.Args[0] { 18584 break 18585 } 18586 mem := x.Args[3] 18587 if !(x.Uses == 1 && clobber(x)) { 18588 break 18589 } 18590 v.reset(OpS390XMOVDstoreidx) 18591 v.AuxInt = i - 4 18592 v.Aux = s 18593 v.AddArg(p) 18594 v.AddArg(idx) 18595 v.AddArg(w) 18596 v.AddArg(mem) 18597 return true 18598 } 18599 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 18600 // cond: x.Uses == 1 && clobber(x) 18601 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18602 for { 18603 i := v.AuxInt 18604 s := v.Aux 18605 _ = v.Args[3] 18606 p := v.Args[0] 18607 idx := v.Args[1] 18608 w0 := v.Args[2] 18609 if w0.Op != OpS390XSRDconst { 18610 break 18611 } 18612 j := w0.AuxInt 18613 w := w0.Args[0] 18614 x := v.Args[3] 18615 if x.Op != OpS390XMOVWstoreidx { 18616 break 18617 } 18618 if x.AuxInt != i-4 { 18619 break 18620 } 18621 if x.Aux != s { 18622 break 18623 } 18624 _ = x.Args[3] 18625 if p != x.Args[0] { 18626 break 18627 } 18628 if idx != x.Args[1] { 18629 break 18630 } 18631 x_2 := x.Args[2] 18632 if x_2.Op != OpS390XSRDconst { 18633 break 18634 } 18635 if x_2.AuxInt != j+32 { 18636 break 18637 } 18638 if w != x_2.Args[0] { 18639 break 18640 } 18641 mem := x.Args[3] 18642 if !(x.Uses == 1 && clobber(x)) { 18643 break 18644 } 18645 v.reset(OpS390XMOVDstoreidx) 18646 v.AuxInt = i - 4 18647 v.Aux = s 18648 v.AddArg(p) 18649 v.AddArg(idx) 18650 v.AddArg(w0) 18651 v.AddArg(mem) 18652 return true 18653 } 18654 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18655 // cond: x.Uses == 1 && clobber(x) 18656 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18657 for { 18658 i := v.AuxInt 18659 s := v.Aux 18660 _ = v.Args[3] 18661 p := v.Args[0] 18662 idx := v.Args[1] 18663 w0 := v.Args[2] 18664 if w0.Op != OpS390XSRDconst { 18665 break 18666 } 18667 j := w0.AuxInt 18668 w := w0.Args[0] 18669 x := v.Args[3] 18670 if x.Op != OpS390XMOVWstoreidx { 18671 break 18672 } 18673 if x.AuxInt != i-4 { 18674 break 18675 } 18676 if x.Aux != s { 18677 break 18678 } 18679 _ = x.Args[3] 18680 if idx != x.Args[0] { 18681 break 18682 } 18683 if p != x.Args[1] { 18684 break 18685 } 18686 x_2 := x.Args[2] 18687 if x_2.Op != OpS390XSRDconst { 18688 break 18689 } 18690 if x_2.AuxInt != j+32 { 18691 break 18692 } 18693 if w != x_2.Args[0] { 18694 break 18695 } 18696 mem := x.Args[3] 18697 if !(x.Uses == 1 && clobber(x)) { 18698 break 18699 } 18700 v.reset(OpS390XMOVDstoreidx) 18701 v.AuxInt = i - 4 18702 v.Aux = s 18703 v.AddArg(p) 18704 v.AddArg(idx) 18705 v.AddArg(w0) 18706 v.AddArg(mem) 18707 return true 18708 } 18709 return false 18710 } 18711 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 18712 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 18713 // cond: x.Uses == 1 && clobber(x) 18714 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18715 for { 18716 i := v.AuxInt 18717 s := v.Aux 18718 _ = v.Args[3] 18719 idx := v.Args[0] 18720 p := v.Args[1] 18721 w0 := v.Args[2] 18722 if w0.Op != OpS390XSRDconst { 18723 break 18724 } 18725 j := w0.AuxInt 18726 w := w0.Args[0] 18727 x := v.Args[3] 18728 if x.Op != OpS390XMOVWstoreidx { 18729 break 18730 } 18731 if x.AuxInt != i-4 { 18732 break 18733 } 18734 if x.Aux != s { 18735 break 18736 } 18737 _ = x.Args[3] 18738 if p != x.Args[0] { 18739 break 18740 } 18741 if idx != x.Args[1] { 18742 break 18743 } 18744 x_2 := x.Args[2] 18745 if x_2.Op != OpS390XSRDconst { 18746 break 18747 } 18748 if x_2.AuxInt != j+32 { 18749 break 18750 } 18751 if w != x_2.Args[0] { 18752 break 18753 } 18754 mem := x.Args[3] 18755 if !(x.Uses == 1 && clobber(x)) { 18756 break 18757 } 18758 v.reset(OpS390XMOVDstoreidx) 18759 v.AuxInt = i - 4 18760 v.Aux = s 18761 v.AddArg(p) 18762 v.AddArg(idx) 18763 v.AddArg(w0) 18764 v.AddArg(mem) 18765 return true 18766 } 18767 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18768 // cond: x.Uses == 1 && clobber(x) 18769 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18770 for { 18771 i := v.AuxInt 18772 s := v.Aux 18773 _ = v.Args[3] 18774 idx := v.Args[0] 18775 p := v.Args[1] 18776 w0 := v.Args[2] 18777 if w0.Op != OpS390XSRDconst { 18778 break 18779 } 18780 j := w0.AuxInt 18781 w := w0.Args[0] 18782 x := v.Args[3] 18783 if x.Op != OpS390XMOVWstoreidx { 18784 break 18785 } 18786 if x.AuxInt != i-4 { 18787 break 18788 } 18789 if x.Aux != s { 18790 break 18791 } 18792 _ = x.Args[3] 18793 if idx != x.Args[0] { 18794 break 18795 } 18796 if p != x.Args[1] { 18797 break 18798 } 18799 x_2 := x.Args[2] 18800 if x_2.Op != OpS390XSRDconst { 18801 break 18802 } 18803 if x_2.AuxInt != j+32 { 18804 break 18805 } 18806 if w != x_2.Args[0] { 18807 break 18808 } 18809 mem := x.Args[3] 18810 if !(x.Uses == 1 && clobber(x)) { 18811 break 18812 } 18813 v.reset(OpS390XMOVDstoreidx) 18814 v.AuxInt = i - 4 18815 v.Aux = s 18816 v.AddArg(p) 18817 v.AddArg(idx) 18818 v.AddArg(w0) 18819 v.AddArg(mem) 18820 return true 18821 } 18822 return false 18823 } 18824 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 18825 // match: (MULLD x (MOVDconst [c])) 18826 // cond: is32Bit(c) 18827 // result: (MULLDconst [c] x) 18828 for { 18829 _ = v.Args[1] 18830 x := v.Args[0] 18831 v_1 := v.Args[1] 18832 if v_1.Op != OpS390XMOVDconst { 18833 break 18834 } 18835 c := v_1.AuxInt 18836 if !(is32Bit(c)) { 18837 break 18838 } 18839 v.reset(OpS390XMULLDconst) 18840 v.AuxInt = c 18841 v.AddArg(x) 18842 return true 18843 } 18844 // match: (MULLD (MOVDconst [c]) x) 18845 // cond: is32Bit(c) 18846 // result: (MULLDconst [c] x) 18847 for { 18848 _ = v.Args[1] 18849 v_0 := v.Args[0] 18850 if v_0.Op != OpS390XMOVDconst { 18851 break 18852 } 18853 c := v_0.AuxInt 18854 x := v.Args[1] 18855 if !(is32Bit(c)) { 18856 break 18857 } 18858 v.reset(OpS390XMULLDconst) 18859 v.AuxInt = c 18860 v.AddArg(x) 18861 return true 18862 } 18863 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18864 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18865 // result: (MULLDload <t> [off] {sym} x ptr mem) 18866 for { 18867 t := v.Type 18868 _ = v.Args[1] 18869 x := v.Args[0] 18870 g := v.Args[1] 18871 if g.Op != OpS390XMOVDload { 18872 break 18873 } 18874 off := g.AuxInt 18875 sym := g.Aux 18876 _ = g.Args[1] 18877 ptr := g.Args[0] 18878 mem := g.Args[1] 18879 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18880 break 18881 } 18882 v.reset(OpS390XMULLDload) 18883 v.Type = t 18884 v.AuxInt = off 18885 v.Aux = sym 18886 v.AddArg(x) 18887 v.AddArg(ptr) 18888 v.AddArg(mem) 18889 return true 18890 } 18891 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18892 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18893 // result: (MULLDload <t> [off] {sym} x ptr mem) 18894 for { 18895 t := v.Type 18896 _ = v.Args[1] 18897 g := v.Args[0] 18898 if g.Op != OpS390XMOVDload { 18899 break 18900 } 18901 off := g.AuxInt 18902 sym := g.Aux 18903 _ = g.Args[1] 18904 ptr := g.Args[0] 18905 mem := g.Args[1] 18906 x := v.Args[1] 18907 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18908 break 18909 } 18910 v.reset(OpS390XMULLDload) 18911 v.Type = t 18912 v.AuxInt = off 18913 v.Aux = sym 18914 v.AddArg(x) 18915 v.AddArg(ptr) 18916 v.AddArg(mem) 18917 return true 18918 } 18919 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18920 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18921 // result: (MULLDload <t> [off] {sym} x ptr mem) 18922 for { 18923 t := v.Type 18924 _ = v.Args[1] 18925 g := v.Args[0] 18926 if g.Op != OpS390XMOVDload { 18927 break 18928 } 18929 off := g.AuxInt 18930 sym := g.Aux 18931 _ = g.Args[1] 18932 ptr := g.Args[0] 18933 mem := g.Args[1] 18934 x := v.Args[1] 18935 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18936 break 18937 } 18938 v.reset(OpS390XMULLDload) 18939 v.Type = t 18940 v.AuxInt = off 18941 v.Aux = sym 18942 v.AddArg(x) 18943 v.AddArg(ptr) 18944 v.AddArg(mem) 18945 return true 18946 } 18947 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18948 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18949 // result: (MULLDload <t> [off] {sym} x ptr mem) 18950 for { 18951 t := v.Type 18952 _ = v.Args[1] 18953 x := v.Args[0] 18954 g := v.Args[1] 18955 if g.Op != OpS390XMOVDload { 18956 break 18957 } 18958 off := g.AuxInt 18959 sym := g.Aux 18960 _ = g.Args[1] 18961 ptr := g.Args[0] 18962 mem := g.Args[1] 18963 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18964 break 18965 } 18966 v.reset(OpS390XMULLDload) 18967 v.Type = t 18968 v.AuxInt = off 18969 v.Aux = sym 18970 v.AddArg(x) 18971 v.AddArg(ptr) 18972 v.AddArg(mem) 18973 return true 18974 } 18975 return false 18976 } 18977 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 18978 b := v.Block 18979 _ = b 18980 // match: (MULLDconst [-1] x) 18981 // cond: 18982 // result: (NEG x) 18983 for { 18984 if v.AuxInt != -1 { 18985 break 18986 } 18987 x := v.Args[0] 18988 v.reset(OpS390XNEG) 18989 v.AddArg(x) 18990 return true 18991 } 18992 // match: (MULLDconst [0] _) 18993 // cond: 18994 // result: (MOVDconst [0]) 18995 for { 18996 if v.AuxInt != 0 { 18997 break 18998 } 18999 v.reset(OpS390XMOVDconst) 19000 v.AuxInt = 0 19001 return true 19002 } 19003 // match: (MULLDconst [1] x) 19004 // cond: 19005 // result: x 19006 for { 19007 if v.AuxInt != 1 { 19008 break 19009 } 19010 x := v.Args[0] 19011 v.reset(OpCopy) 19012 v.Type = x.Type 19013 v.AddArg(x) 19014 return true 19015 } 19016 // match: (MULLDconst [c] x) 19017 // cond: isPowerOfTwo(c) 19018 // result: (SLDconst [log2(c)] x) 19019 for { 19020 c := v.AuxInt 19021 x := v.Args[0] 19022 if !(isPowerOfTwo(c)) { 19023 break 19024 } 19025 v.reset(OpS390XSLDconst) 19026 v.AuxInt = log2(c) 19027 v.AddArg(x) 19028 return true 19029 } 19030 // match: (MULLDconst [c] x) 19031 // cond: isPowerOfTwo(c+1) && c >= 15 19032 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 19033 for { 19034 c := v.AuxInt 19035 x := v.Args[0] 19036 if !(isPowerOfTwo(c+1) && c >= 15) { 19037 break 19038 } 19039 v.reset(OpS390XSUB) 19040 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19041 v0.AuxInt = log2(c + 1) 19042 v0.AddArg(x) 19043 v.AddArg(v0) 19044 v.AddArg(x) 19045 return true 19046 } 19047 // match: (MULLDconst [c] x) 19048 // cond: isPowerOfTwo(c-1) && c >= 17 19049 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 19050 for { 19051 c := v.AuxInt 19052 x := v.Args[0] 19053 if !(isPowerOfTwo(c-1) && c >= 17) { 19054 break 19055 } 19056 v.reset(OpS390XADD) 19057 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19058 v0.AuxInt = log2(c - 1) 19059 v0.AddArg(x) 19060 v.AddArg(v0) 19061 v.AddArg(x) 19062 return true 19063 } 19064 // match: (MULLDconst [c] (MOVDconst [d])) 19065 // cond: 19066 // result: (MOVDconst [c*d]) 19067 for { 19068 c := v.AuxInt 19069 v_0 := v.Args[0] 19070 if v_0.Op != OpS390XMOVDconst { 19071 break 19072 } 19073 d := v_0.AuxInt 19074 v.reset(OpS390XMOVDconst) 19075 v.AuxInt = c * d 19076 return true 19077 } 19078 return false 19079 } 19080 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 19081 // match: (MULLW x (MOVDconst [c])) 19082 // cond: 19083 // result: (MULLWconst [c] x) 19084 for { 19085 _ = v.Args[1] 19086 x := v.Args[0] 19087 v_1 := v.Args[1] 19088 if v_1.Op != OpS390XMOVDconst { 19089 break 19090 } 19091 c := v_1.AuxInt 19092 v.reset(OpS390XMULLWconst) 19093 v.AuxInt = c 19094 v.AddArg(x) 19095 return true 19096 } 19097 // match: (MULLW (MOVDconst [c]) x) 19098 // cond: 19099 // result: (MULLWconst [c] x) 19100 for { 19101 _ = v.Args[1] 19102 v_0 := v.Args[0] 19103 if v_0.Op != OpS390XMOVDconst { 19104 break 19105 } 19106 c := v_0.AuxInt 19107 x := v.Args[1] 19108 v.reset(OpS390XMULLWconst) 19109 v.AuxInt = c 19110 v.AddArg(x) 19111 return true 19112 } 19113 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19114 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19115 // result: (MULLWload <t> [off] {sym} x ptr mem) 19116 for { 19117 t := v.Type 19118 _ = v.Args[1] 19119 x := v.Args[0] 19120 g := v.Args[1] 19121 if g.Op != OpS390XMOVWload { 19122 break 19123 } 19124 off := g.AuxInt 19125 sym := g.Aux 19126 _ = g.Args[1] 19127 ptr := g.Args[0] 19128 mem := g.Args[1] 19129 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19130 break 19131 } 19132 v.reset(OpS390XMULLWload) 19133 v.Type = t 19134 v.AuxInt = off 19135 v.Aux = sym 19136 v.AddArg(x) 19137 v.AddArg(ptr) 19138 v.AddArg(mem) 19139 return true 19140 } 19141 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19142 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19143 // result: (MULLWload <t> [off] {sym} x ptr mem) 19144 for { 19145 t := v.Type 19146 _ = v.Args[1] 19147 g := v.Args[0] 19148 if g.Op != OpS390XMOVWload { 19149 break 19150 } 19151 off := g.AuxInt 19152 sym := g.Aux 19153 _ = g.Args[1] 19154 ptr := g.Args[0] 19155 mem := g.Args[1] 19156 x := v.Args[1] 19157 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19158 break 19159 } 19160 v.reset(OpS390XMULLWload) 19161 v.Type = t 19162 v.AuxInt = off 19163 v.Aux = sym 19164 v.AddArg(x) 19165 v.AddArg(ptr) 19166 v.AddArg(mem) 19167 return true 19168 } 19169 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 19170 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19171 // result: (MULLWload <t> [off] {sym} x ptr mem) 19172 for { 19173 t := v.Type 19174 _ = v.Args[1] 19175 g := v.Args[0] 19176 if g.Op != OpS390XMOVWload { 19177 break 19178 } 19179 off := g.AuxInt 19180 sym := g.Aux 19181 _ = g.Args[1] 19182 ptr := g.Args[0] 19183 mem := g.Args[1] 19184 x := v.Args[1] 19185 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19186 break 19187 } 19188 v.reset(OpS390XMULLWload) 19189 v.Type = t 19190 v.AuxInt = off 19191 v.Aux = sym 19192 v.AddArg(x) 19193 v.AddArg(ptr) 19194 v.AddArg(mem) 19195 return true 19196 } 19197 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 19198 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19199 // result: (MULLWload <t> [off] {sym} x ptr mem) 19200 for { 19201 t := v.Type 19202 _ = v.Args[1] 19203 x := v.Args[0] 19204 g := v.Args[1] 19205 if g.Op != OpS390XMOVWload { 19206 break 19207 } 19208 off := g.AuxInt 19209 sym := g.Aux 19210 _ = g.Args[1] 19211 ptr := g.Args[0] 19212 mem := g.Args[1] 19213 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19214 break 19215 } 19216 v.reset(OpS390XMULLWload) 19217 v.Type = t 19218 v.AuxInt = off 19219 v.Aux = sym 19220 v.AddArg(x) 19221 v.AddArg(ptr) 19222 v.AddArg(mem) 19223 return true 19224 } 19225 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19226 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19227 // result: (MULLWload <t> [off] {sym} x ptr mem) 19228 for { 19229 t := v.Type 19230 _ = v.Args[1] 19231 x := v.Args[0] 19232 g := v.Args[1] 19233 if g.Op != OpS390XMOVWZload { 19234 break 19235 } 19236 off := g.AuxInt 19237 sym := g.Aux 19238 _ = g.Args[1] 19239 ptr := g.Args[0] 19240 mem := g.Args[1] 19241 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19242 break 19243 } 19244 v.reset(OpS390XMULLWload) 19245 v.Type = t 19246 v.AuxInt = off 19247 v.Aux = sym 19248 v.AddArg(x) 19249 v.AddArg(ptr) 19250 v.AddArg(mem) 19251 return true 19252 } 19253 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19254 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19255 // result: (MULLWload <t> [off] {sym} x ptr mem) 19256 for { 19257 t := v.Type 19258 _ = v.Args[1] 19259 g := v.Args[0] 19260 if g.Op != OpS390XMOVWZload { 19261 break 19262 } 19263 off := g.AuxInt 19264 sym := g.Aux 19265 _ = g.Args[1] 19266 ptr := g.Args[0] 19267 mem := g.Args[1] 19268 x := v.Args[1] 19269 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19270 break 19271 } 19272 v.reset(OpS390XMULLWload) 19273 v.Type = t 19274 v.AuxInt = off 19275 v.Aux = sym 19276 v.AddArg(x) 19277 v.AddArg(ptr) 19278 v.AddArg(mem) 19279 return true 19280 } 19281 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 19282 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19283 // result: (MULLWload <t> [off] {sym} x ptr mem) 19284 for { 19285 t := v.Type 19286 _ = v.Args[1] 19287 g := v.Args[0] 19288 if g.Op != OpS390XMOVWZload { 19289 break 19290 } 19291 off := g.AuxInt 19292 sym := g.Aux 19293 _ = g.Args[1] 19294 ptr := g.Args[0] 19295 mem := g.Args[1] 19296 x := v.Args[1] 19297 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19298 break 19299 } 19300 v.reset(OpS390XMULLWload) 19301 v.Type = t 19302 v.AuxInt = off 19303 v.Aux = sym 19304 v.AddArg(x) 19305 v.AddArg(ptr) 19306 v.AddArg(mem) 19307 return true 19308 } 19309 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 19310 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19311 // result: (MULLWload <t> [off] {sym} x ptr mem) 19312 for { 19313 t := v.Type 19314 _ = v.Args[1] 19315 x := v.Args[0] 19316 g := v.Args[1] 19317 if g.Op != OpS390XMOVWZload { 19318 break 19319 } 19320 off := g.AuxInt 19321 sym := g.Aux 19322 _ = g.Args[1] 19323 ptr := g.Args[0] 19324 mem := g.Args[1] 19325 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19326 break 19327 } 19328 v.reset(OpS390XMULLWload) 19329 v.Type = t 19330 v.AuxInt = off 19331 v.Aux = sym 19332 v.AddArg(x) 19333 v.AddArg(ptr) 19334 v.AddArg(mem) 19335 return true 19336 } 19337 return false 19338 } 19339 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 19340 b := v.Block 19341 _ = b 19342 // match: (MULLWconst [-1] x) 19343 // cond: 19344 // result: (NEGW x) 19345 for { 19346 if v.AuxInt != -1 { 19347 break 19348 } 19349 x := v.Args[0] 19350 v.reset(OpS390XNEGW) 19351 v.AddArg(x) 19352 return true 19353 } 19354 // match: (MULLWconst [0] _) 19355 // cond: 19356 // result: (MOVDconst [0]) 19357 for { 19358 if v.AuxInt != 0 { 19359 break 19360 } 19361 v.reset(OpS390XMOVDconst) 19362 v.AuxInt = 0 19363 return true 19364 } 19365 // match: (MULLWconst [1] x) 19366 // cond: 19367 // result: x 19368 for { 19369 if v.AuxInt != 1 { 19370 break 19371 } 19372 x := v.Args[0] 19373 v.reset(OpCopy) 19374 v.Type = x.Type 19375 v.AddArg(x) 19376 return true 19377 } 19378 // match: (MULLWconst [c] x) 19379 // cond: isPowerOfTwo(c) 19380 // result: (SLWconst [log2(c)] x) 19381 for { 19382 c := v.AuxInt 19383 x := v.Args[0] 19384 if !(isPowerOfTwo(c)) { 19385 break 19386 } 19387 v.reset(OpS390XSLWconst) 19388 v.AuxInt = log2(c) 19389 v.AddArg(x) 19390 return true 19391 } 19392 // match: (MULLWconst [c] x) 19393 // cond: isPowerOfTwo(c+1) && c >= 15 19394 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 19395 for { 19396 c := v.AuxInt 19397 x := v.Args[0] 19398 if !(isPowerOfTwo(c+1) && c >= 15) { 19399 break 19400 } 19401 v.reset(OpS390XSUBW) 19402 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19403 v0.AuxInt = log2(c + 1) 19404 v0.AddArg(x) 19405 v.AddArg(v0) 19406 v.AddArg(x) 19407 return true 19408 } 19409 // match: (MULLWconst [c] x) 19410 // cond: isPowerOfTwo(c-1) && c >= 17 19411 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 19412 for { 19413 c := v.AuxInt 19414 x := v.Args[0] 19415 if !(isPowerOfTwo(c-1) && c >= 17) { 19416 break 19417 } 19418 v.reset(OpS390XADDW) 19419 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 19420 v0.AuxInt = log2(c - 1) 19421 v0.AddArg(x) 19422 v.AddArg(v0) 19423 v.AddArg(x) 19424 return true 19425 } 19426 // match: (MULLWconst [c] (MOVDconst [d])) 19427 // cond: 19428 // result: (MOVDconst [int64(int32(c*d))]) 19429 for { 19430 c := v.AuxInt 19431 v_0 := v.Args[0] 19432 if v_0.Op != OpS390XMOVDconst { 19433 break 19434 } 19435 d := v_0.AuxInt 19436 v.reset(OpS390XMOVDconst) 19437 v.AuxInt = int64(int32(c * d)) 19438 return true 19439 } 19440 return false 19441 } 19442 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 19443 // match: (NEG (MOVDconst [c])) 19444 // cond: 19445 // result: (MOVDconst [-c]) 19446 for { 19447 v_0 := v.Args[0] 19448 if v_0.Op != OpS390XMOVDconst { 19449 break 19450 } 19451 c := v_0.AuxInt 19452 v.reset(OpS390XMOVDconst) 19453 v.AuxInt = -c 19454 return true 19455 } 19456 // match: (NEG (ADDconst [c] (NEG x))) 19457 // cond: c != -(1<<31) 19458 // result: (ADDconst [-c] x) 19459 for { 19460 v_0 := v.Args[0] 19461 if v_0.Op != OpS390XADDconst { 19462 break 19463 } 19464 c := v_0.AuxInt 19465 v_0_0 := v_0.Args[0] 19466 if v_0_0.Op != OpS390XNEG { 19467 break 19468 } 19469 x := v_0_0.Args[0] 19470 if !(c != -(1 << 31)) { 19471 break 19472 } 19473 v.reset(OpS390XADDconst) 19474 v.AuxInt = -c 19475 v.AddArg(x) 19476 return true 19477 } 19478 return false 19479 } 19480 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 19481 // match: (NEGW (MOVDconst [c])) 19482 // cond: 19483 // result: (MOVDconst [int64(int32(-c))]) 19484 for { 19485 v_0 := v.Args[0] 19486 if v_0.Op != OpS390XMOVDconst { 19487 break 19488 } 19489 c := v_0.AuxInt 19490 v.reset(OpS390XMOVDconst) 19491 v.AuxInt = int64(int32(-c)) 19492 return true 19493 } 19494 return false 19495 } 19496 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 19497 b := v.Block 19498 _ = b 19499 typ := &b.Func.Config.Types 19500 _ = typ 19501 // match: (NOT x) 19502 // cond: true 19503 // result: (XOR (MOVDconst [-1]) x) 19504 for { 19505 x := v.Args[0] 19506 if !(true) { 19507 break 19508 } 19509 v.reset(OpS390XXOR) 19510 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) 19511 v0.AuxInt = -1 19512 v.AddArg(v0) 19513 v.AddArg(x) 19514 return true 19515 } 19516 return false 19517 } 19518 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 19519 // match: (NOTW x) 19520 // cond: true 19521 // result: (XORWconst [-1] x) 19522 for { 19523 x := v.Args[0] 19524 if !(true) { 19525 break 19526 } 19527 v.reset(OpS390XXORWconst) 19528 v.AuxInt = -1 19529 v.AddArg(x) 19530 return true 19531 } 19532 return false 19533 } 19534 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 19535 // match: (OR x (MOVDconst [c])) 19536 // cond: isU32Bit(c) 19537 // result: (ORconst [c] x) 19538 for { 19539 _ = v.Args[1] 19540 x := v.Args[0] 19541 v_1 := v.Args[1] 19542 if v_1.Op != OpS390XMOVDconst { 19543 break 19544 } 19545 c := v_1.AuxInt 19546 if !(isU32Bit(c)) { 19547 break 19548 } 19549 v.reset(OpS390XORconst) 19550 v.AuxInt = c 19551 v.AddArg(x) 19552 return true 19553 } 19554 // match: (OR (MOVDconst [c]) x) 19555 // cond: isU32Bit(c) 19556 // result: (ORconst [c] x) 19557 for { 19558 _ = v.Args[1] 19559 v_0 := v.Args[0] 19560 if v_0.Op != OpS390XMOVDconst { 19561 break 19562 } 19563 c := v_0.AuxInt 19564 x := v.Args[1] 19565 if !(isU32Bit(c)) { 19566 break 19567 } 19568 v.reset(OpS390XORconst) 19569 v.AuxInt = c 19570 v.AddArg(x) 19571 return true 19572 } 19573 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 19574 // cond: d == 64-c 19575 // result: (RLLGconst [c] x) 19576 for { 19577 _ = v.Args[1] 19578 v_0 := v.Args[0] 19579 if v_0.Op != OpS390XSLDconst { 19580 break 19581 } 19582 c := v_0.AuxInt 19583 x := v_0.Args[0] 19584 v_1 := v.Args[1] 19585 if v_1.Op != OpS390XSRDconst { 19586 break 19587 } 19588 d := v_1.AuxInt 19589 if x != v_1.Args[0] { 19590 break 19591 } 19592 if !(d == 64-c) { 19593 break 19594 } 19595 v.reset(OpS390XRLLGconst) 19596 v.AuxInt = c 19597 v.AddArg(x) 19598 return true 19599 } 19600 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 19601 // cond: d == 64-c 19602 // result: (RLLGconst [c] x) 19603 for { 19604 _ = v.Args[1] 19605 v_0 := v.Args[0] 19606 if v_0.Op != OpS390XSRDconst { 19607 break 19608 } 19609 d := v_0.AuxInt 19610 x := v_0.Args[0] 19611 v_1 := v.Args[1] 19612 if v_1.Op != OpS390XSLDconst { 19613 break 19614 } 19615 c := v_1.AuxInt 19616 if x != v_1.Args[0] { 19617 break 19618 } 19619 if !(d == 64-c) { 19620 break 19621 } 19622 v.reset(OpS390XRLLGconst) 19623 v.AuxInt = c 19624 v.AddArg(x) 19625 return true 19626 } 19627 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 19628 // cond: 19629 // result: (MOVDconst [c|d]) 19630 for { 19631 _ = v.Args[1] 19632 v_0 := v.Args[0] 19633 if v_0.Op != OpS390XMOVDconst { 19634 break 19635 } 19636 c := v_0.AuxInt 19637 v_1 := v.Args[1] 19638 if v_1.Op != OpS390XMOVDconst { 19639 break 19640 } 19641 d := v_1.AuxInt 19642 v.reset(OpS390XMOVDconst) 19643 v.AuxInt = c | d 19644 return true 19645 } 19646 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 19647 // cond: 19648 // result: (MOVDconst [c|d]) 19649 for { 19650 _ = v.Args[1] 19651 v_0 := v.Args[0] 19652 if v_0.Op != OpS390XMOVDconst { 19653 break 19654 } 19655 d := v_0.AuxInt 19656 v_1 := v.Args[1] 19657 if v_1.Op != OpS390XMOVDconst { 19658 break 19659 } 19660 c := v_1.AuxInt 19661 v.reset(OpS390XMOVDconst) 19662 v.AuxInt = c | d 19663 return true 19664 } 19665 // match: (OR x x) 19666 // cond: 19667 // result: x 19668 for { 19669 _ = v.Args[1] 19670 x := v.Args[0] 19671 if x != v.Args[1] { 19672 break 19673 } 19674 v.reset(OpCopy) 19675 v.Type = x.Type 19676 v.AddArg(x) 19677 return true 19678 } 19679 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 19680 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19681 // result: (ORload <t> [off] {sym} x ptr mem) 19682 for { 19683 t := v.Type 19684 _ = v.Args[1] 19685 x := v.Args[0] 19686 g := v.Args[1] 19687 if g.Op != OpS390XMOVDload { 19688 break 19689 } 19690 off := g.AuxInt 19691 sym := g.Aux 19692 _ = g.Args[1] 19693 ptr := g.Args[0] 19694 mem := g.Args[1] 19695 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19696 break 19697 } 19698 v.reset(OpS390XORload) 19699 v.Type = t 19700 v.AuxInt = off 19701 v.Aux = sym 19702 v.AddArg(x) 19703 v.AddArg(ptr) 19704 v.AddArg(mem) 19705 return true 19706 } 19707 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19708 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19709 // result: (ORload <t> [off] {sym} x ptr mem) 19710 for { 19711 t := v.Type 19712 _ = v.Args[1] 19713 g := v.Args[0] 19714 if g.Op != OpS390XMOVDload { 19715 break 19716 } 19717 off := g.AuxInt 19718 sym := g.Aux 19719 _ = g.Args[1] 19720 ptr := g.Args[0] 19721 mem := g.Args[1] 19722 x := v.Args[1] 19723 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19724 break 19725 } 19726 v.reset(OpS390XORload) 19727 v.Type = t 19728 v.AuxInt = off 19729 v.Aux = sym 19730 v.AddArg(x) 19731 v.AddArg(ptr) 19732 v.AddArg(mem) 19733 return true 19734 } 19735 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 19736 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 19737 // result: (ORload <t> [off] {sym} x ptr mem) 19738 for { 19739 t := v.Type 19740 _ = v.Args[1] 19741 g := v.Args[0] 19742 if g.Op != OpS390XMOVDload { 19743 break 19744 } 19745 off := g.AuxInt 19746 sym := g.Aux 19747 _ = g.Args[1] 19748 ptr := g.Args[0] 19749 mem := g.Args[1] 19750 x := v.Args[1] 19751 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19752 break 19753 } 19754 v.reset(OpS390XORload) 19755 v.Type = t 19756 v.AuxInt = off 19757 v.Aux = sym 19758 v.AddArg(x) 19759 v.AddArg(ptr) 19760 v.AddArg(mem) 19761 return true 19762 } 19763 return false 19764 } 19765 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 19766 b := v.Block 19767 _ = b 19768 typ := &b.Func.Config.Types 19769 _ = typ 19770 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 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 x := v.Args[0] 19777 g := v.Args[1] 19778 if g.Op != OpS390XMOVDload { 19779 break 19780 } 19781 off := g.AuxInt 19782 sym := g.Aux 19783 _ = g.Args[1] 19784 ptr := g.Args[0] 19785 mem := g.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 x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 19799 // 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) 19800 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19801 for { 19802 _ = v.Args[1] 19803 x1 := v.Args[0] 19804 if x1.Op != OpS390XMOVBZload { 19805 break 19806 } 19807 i1 := x1.AuxInt 19808 s := x1.Aux 19809 _ = x1.Args[1] 19810 p := x1.Args[0] 19811 mem := x1.Args[1] 19812 sh := v.Args[1] 19813 if sh.Op != OpS390XSLDconst { 19814 break 19815 } 19816 if sh.AuxInt != 8 { 19817 break 19818 } 19819 x0 := sh.Args[0] 19820 if x0.Op != OpS390XMOVBZload { 19821 break 19822 } 19823 i0 := x0.AuxInt 19824 if x0.Aux != s { 19825 break 19826 } 19827 _ = x0.Args[1] 19828 if p != x0.Args[0] { 19829 break 19830 } 19831 if mem != x0.Args[1] { 19832 break 19833 } 19834 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)) { 19835 break 19836 } 19837 b = mergePoint(b, x0, x1) 19838 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19839 v.reset(OpCopy) 19840 v.AddArg(v0) 19841 v0.AuxInt = i0 19842 v0.Aux = s 19843 v0.AddArg(p) 19844 v0.AddArg(mem) 19845 return true 19846 } 19847 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 19848 // 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) 19849 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19850 for { 19851 _ = v.Args[1] 19852 sh := v.Args[0] 19853 if sh.Op != OpS390XSLDconst { 19854 break 19855 } 19856 if sh.AuxInt != 8 { 19857 break 19858 } 19859 x0 := sh.Args[0] 19860 if x0.Op != OpS390XMOVBZload { 19861 break 19862 } 19863 i0 := x0.AuxInt 19864 s := x0.Aux 19865 _ = x0.Args[1] 19866 p := x0.Args[0] 19867 mem := x0.Args[1] 19868 x1 := v.Args[1] 19869 if x1.Op != OpS390XMOVBZload { 19870 break 19871 } 19872 i1 := x1.AuxInt 19873 if x1.Aux != s { 19874 break 19875 } 19876 _ = x1.Args[1] 19877 if p != x1.Args[0] { 19878 break 19879 } 19880 if mem != x1.Args[1] { 19881 break 19882 } 19883 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)) { 19884 break 19885 } 19886 b = mergePoint(b, x0, x1) 19887 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 19888 v.reset(OpCopy) 19889 v.AddArg(v0) 19890 v0.AuxInt = i0 19891 v0.Aux = s 19892 v0.AddArg(p) 19893 v0.AddArg(mem) 19894 return true 19895 } 19896 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 19897 // 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) 19898 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19899 for { 19900 _ = v.Args[1] 19901 x1 := v.Args[0] 19902 if x1.Op != OpS390XMOVHZload { 19903 break 19904 } 19905 i1 := x1.AuxInt 19906 s := x1.Aux 19907 _ = x1.Args[1] 19908 p := x1.Args[0] 19909 mem := x1.Args[1] 19910 sh := v.Args[1] 19911 if sh.Op != OpS390XSLDconst { 19912 break 19913 } 19914 if sh.AuxInt != 16 { 19915 break 19916 } 19917 x0 := sh.Args[0] 19918 if x0.Op != OpS390XMOVHZload { 19919 break 19920 } 19921 i0 := x0.AuxInt 19922 if x0.Aux != s { 19923 break 19924 } 19925 _ = x0.Args[1] 19926 if p != x0.Args[0] { 19927 break 19928 } 19929 if mem != x0.Args[1] { 19930 break 19931 } 19932 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)) { 19933 break 19934 } 19935 b = mergePoint(b, x0, x1) 19936 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 19937 v.reset(OpCopy) 19938 v.AddArg(v0) 19939 v0.AuxInt = i0 19940 v0.Aux = s 19941 v0.AddArg(p) 19942 v0.AddArg(mem) 19943 return true 19944 } 19945 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 19946 // 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) 19947 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19948 for { 19949 _ = v.Args[1] 19950 sh := v.Args[0] 19951 if sh.Op != OpS390XSLDconst { 19952 break 19953 } 19954 if sh.AuxInt != 16 { 19955 break 19956 } 19957 x0 := sh.Args[0] 19958 if x0.Op != OpS390XMOVHZload { 19959 break 19960 } 19961 i0 := x0.AuxInt 19962 s := x0.Aux 19963 _ = x0.Args[1] 19964 p := x0.Args[0] 19965 mem := x0.Args[1] 19966 x1 := v.Args[1] 19967 if x1.Op != OpS390XMOVHZload { 19968 break 19969 } 19970 i1 := x1.AuxInt 19971 if x1.Aux != s { 19972 break 19973 } 19974 _ = x1.Args[1] 19975 if p != x1.Args[0] { 19976 break 19977 } 19978 if mem != x1.Args[1] { 19979 break 19980 } 19981 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)) { 19982 break 19983 } 19984 b = mergePoint(b, x0, x1) 19985 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 19986 v.reset(OpCopy) 19987 v.AddArg(v0) 19988 v0.AuxInt = i0 19989 v0.Aux = s 19990 v0.AddArg(p) 19991 v0.AddArg(mem) 19992 return true 19993 } 19994 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 19995 // 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) 19996 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 19997 for { 19998 _ = v.Args[1] 19999 x1 := v.Args[0] 20000 if x1.Op != OpS390XMOVWZload { 20001 break 20002 } 20003 i1 := x1.AuxInt 20004 s := x1.Aux 20005 _ = x1.Args[1] 20006 p := x1.Args[0] 20007 mem := x1.Args[1] 20008 sh := v.Args[1] 20009 if sh.Op != OpS390XSLDconst { 20010 break 20011 } 20012 if sh.AuxInt != 32 { 20013 break 20014 } 20015 x0 := sh.Args[0] 20016 if x0.Op != OpS390XMOVWZload { 20017 break 20018 } 20019 i0 := x0.AuxInt 20020 if x0.Aux != s { 20021 break 20022 } 20023 _ = x0.Args[1] 20024 if p != x0.Args[0] { 20025 break 20026 } 20027 if mem != x0.Args[1] { 20028 break 20029 } 20030 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)) { 20031 break 20032 } 20033 b = mergePoint(b, x0, x1) 20034 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20035 v.reset(OpCopy) 20036 v.AddArg(v0) 20037 v0.AuxInt = i0 20038 v0.Aux = s 20039 v0.AddArg(p) 20040 v0.AddArg(mem) 20041 return true 20042 } 20043 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 20044 // 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) 20045 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 20046 for { 20047 _ = v.Args[1] 20048 sh := v.Args[0] 20049 if sh.Op != OpS390XSLDconst { 20050 break 20051 } 20052 if sh.AuxInt != 32 { 20053 break 20054 } 20055 x0 := sh.Args[0] 20056 if x0.Op != OpS390XMOVWZload { 20057 break 20058 } 20059 i0 := x0.AuxInt 20060 s := x0.Aux 20061 _ = x0.Args[1] 20062 p := x0.Args[0] 20063 mem := x0.Args[1] 20064 x1 := v.Args[1] 20065 if x1.Op != OpS390XMOVWZload { 20066 break 20067 } 20068 i1 := x1.AuxInt 20069 if x1.Aux != s { 20070 break 20071 } 20072 _ = x1.Args[1] 20073 if p != x1.Args[0] { 20074 break 20075 } 20076 if mem != x1.Args[1] { 20077 break 20078 } 20079 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)) { 20080 break 20081 } 20082 b = mergePoint(b, x0, x1) 20083 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) 20084 v.reset(OpCopy) 20085 v.AddArg(v0) 20086 v0.AuxInt = i0 20087 v0.Aux = s 20088 v0.AddArg(p) 20089 v0.AddArg(mem) 20090 return true 20091 } 20092 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 20093 // 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) 20094 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20095 for { 20096 _ = v.Args[1] 20097 s0 := v.Args[0] 20098 if s0.Op != OpS390XSLDconst { 20099 break 20100 } 20101 j0 := s0.AuxInt 20102 x0 := s0.Args[0] 20103 if x0.Op != OpS390XMOVBZload { 20104 break 20105 } 20106 i0 := x0.AuxInt 20107 s := x0.Aux 20108 _ = x0.Args[1] 20109 p := x0.Args[0] 20110 mem := x0.Args[1] 20111 or := v.Args[1] 20112 if or.Op != OpS390XOR { 20113 break 20114 } 20115 _ = or.Args[1] 20116 s1 := or.Args[0] 20117 if s1.Op != OpS390XSLDconst { 20118 break 20119 } 20120 j1 := s1.AuxInt 20121 x1 := s1.Args[0] 20122 if x1.Op != OpS390XMOVBZload { 20123 break 20124 } 20125 i1 := x1.AuxInt 20126 if x1.Aux != s { 20127 break 20128 } 20129 _ = x1.Args[1] 20130 if p != x1.Args[0] { 20131 break 20132 } 20133 if mem != x1.Args[1] { 20134 break 20135 } 20136 y := or.Args[1] 20137 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)) { 20138 break 20139 } 20140 b = mergePoint(b, x0, x1) 20141 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20142 v.reset(OpCopy) 20143 v.AddArg(v0) 20144 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20145 v1.AuxInt = j1 20146 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20147 v2.AuxInt = i0 20148 v2.Aux = s 20149 v2.AddArg(p) 20150 v2.AddArg(mem) 20151 v1.AddArg(v2) 20152 v0.AddArg(v1) 20153 v0.AddArg(y) 20154 return true 20155 } 20156 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 20157 // 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) 20158 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20159 for { 20160 _ = v.Args[1] 20161 s0 := v.Args[0] 20162 if s0.Op != OpS390XSLDconst { 20163 break 20164 } 20165 j0 := s0.AuxInt 20166 x0 := s0.Args[0] 20167 if x0.Op != OpS390XMOVBZload { 20168 break 20169 } 20170 i0 := x0.AuxInt 20171 s := x0.Aux 20172 _ = x0.Args[1] 20173 p := x0.Args[0] 20174 mem := x0.Args[1] 20175 or := v.Args[1] 20176 if or.Op != OpS390XOR { 20177 break 20178 } 20179 _ = or.Args[1] 20180 y := or.Args[0] 20181 s1 := or.Args[1] 20182 if s1.Op != OpS390XSLDconst { 20183 break 20184 } 20185 j1 := s1.AuxInt 20186 x1 := s1.Args[0] 20187 if x1.Op != OpS390XMOVBZload { 20188 break 20189 } 20190 i1 := x1.AuxInt 20191 if x1.Aux != s { 20192 break 20193 } 20194 _ = x1.Args[1] 20195 if p != x1.Args[0] { 20196 break 20197 } 20198 if mem != x1.Args[1] { 20199 break 20200 } 20201 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)) { 20202 break 20203 } 20204 b = mergePoint(b, x0, x1) 20205 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20206 v.reset(OpCopy) 20207 v.AddArg(v0) 20208 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20209 v1.AuxInt = j1 20210 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20211 v2.AuxInt = i0 20212 v2.Aux = s 20213 v2.AddArg(p) 20214 v2.AddArg(mem) 20215 v1.AddArg(v2) 20216 v0.AddArg(v1) 20217 v0.AddArg(y) 20218 return true 20219 } 20220 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20221 // 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) 20222 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20223 for { 20224 _ = v.Args[1] 20225 or := v.Args[0] 20226 if or.Op != OpS390XOR { 20227 break 20228 } 20229 _ = or.Args[1] 20230 s1 := or.Args[0] 20231 if s1.Op != OpS390XSLDconst { 20232 break 20233 } 20234 j1 := s1.AuxInt 20235 x1 := s1.Args[0] 20236 if x1.Op != OpS390XMOVBZload { 20237 break 20238 } 20239 i1 := x1.AuxInt 20240 s := x1.Aux 20241 _ = x1.Args[1] 20242 p := x1.Args[0] 20243 mem := x1.Args[1] 20244 y := or.Args[1] 20245 s0 := v.Args[1] 20246 if s0.Op != OpS390XSLDconst { 20247 break 20248 } 20249 j0 := s0.AuxInt 20250 x0 := s0.Args[0] 20251 if x0.Op != OpS390XMOVBZload { 20252 break 20253 } 20254 i0 := x0.AuxInt 20255 if x0.Aux != s { 20256 break 20257 } 20258 _ = x0.Args[1] 20259 if p != x0.Args[0] { 20260 break 20261 } 20262 if mem != x0.Args[1] { 20263 break 20264 } 20265 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)) { 20266 break 20267 } 20268 b = mergePoint(b, x0, x1) 20269 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20270 v.reset(OpCopy) 20271 v.AddArg(v0) 20272 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20273 v1.AuxInt = j1 20274 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20275 v2.AuxInt = i0 20276 v2.Aux = s 20277 v2.AddArg(p) 20278 v2.AddArg(mem) 20279 v1.AddArg(v2) 20280 v0.AddArg(v1) 20281 v0.AddArg(y) 20282 return true 20283 } 20284 return false 20285 } 20286 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 20287 b := v.Block 20288 _ = b 20289 typ := &b.Func.Config.Types 20290 _ = typ 20291 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 20292 // 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) 20293 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 20294 for { 20295 _ = v.Args[1] 20296 or := v.Args[0] 20297 if or.Op != OpS390XOR { 20298 break 20299 } 20300 _ = or.Args[1] 20301 y := or.Args[0] 20302 s1 := or.Args[1] 20303 if s1.Op != OpS390XSLDconst { 20304 break 20305 } 20306 j1 := s1.AuxInt 20307 x1 := s1.Args[0] 20308 if x1.Op != OpS390XMOVBZload { 20309 break 20310 } 20311 i1 := x1.AuxInt 20312 s := x1.Aux 20313 _ = x1.Args[1] 20314 p := x1.Args[0] 20315 mem := x1.Args[1] 20316 s0 := v.Args[1] 20317 if s0.Op != OpS390XSLDconst { 20318 break 20319 } 20320 j0 := s0.AuxInt 20321 x0 := s0.Args[0] 20322 if x0.Op != OpS390XMOVBZload { 20323 break 20324 } 20325 i0 := x0.AuxInt 20326 if x0.Aux != s { 20327 break 20328 } 20329 _ = x0.Args[1] 20330 if p != x0.Args[0] { 20331 break 20332 } 20333 if mem != x0.Args[1] { 20334 break 20335 } 20336 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)) { 20337 break 20338 } 20339 b = mergePoint(b, x0, x1) 20340 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20341 v.reset(OpCopy) 20342 v.AddArg(v0) 20343 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20344 v1.AuxInt = j1 20345 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 20346 v2.AuxInt = i0 20347 v2.Aux = s 20348 v2.AddArg(p) 20349 v2.AddArg(mem) 20350 v1.AddArg(v2) 20351 v0.AddArg(v1) 20352 v0.AddArg(y) 20353 return true 20354 } 20355 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 20356 // 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) 20357 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20358 for { 20359 _ = v.Args[1] 20360 s0 := v.Args[0] 20361 if s0.Op != OpS390XSLDconst { 20362 break 20363 } 20364 j0 := s0.AuxInt 20365 x0 := s0.Args[0] 20366 if x0.Op != OpS390XMOVHZload { 20367 break 20368 } 20369 i0 := x0.AuxInt 20370 s := x0.Aux 20371 _ = x0.Args[1] 20372 p := x0.Args[0] 20373 mem := x0.Args[1] 20374 or := v.Args[1] 20375 if or.Op != OpS390XOR { 20376 break 20377 } 20378 _ = or.Args[1] 20379 s1 := or.Args[0] 20380 if s1.Op != OpS390XSLDconst { 20381 break 20382 } 20383 j1 := s1.AuxInt 20384 x1 := s1.Args[0] 20385 if x1.Op != OpS390XMOVHZload { 20386 break 20387 } 20388 i1 := x1.AuxInt 20389 if x1.Aux != s { 20390 break 20391 } 20392 _ = x1.Args[1] 20393 if p != x1.Args[0] { 20394 break 20395 } 20396 if mem != x1.Args[1] { 20397 break 20398 } 20399 y := or.Args[1] 20400 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)) { 20401 break 20402 } 20403 b = mergePoint(b, x0, x1) 20404 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20405 v.reset(OpCopy) 20406 v.AddArg(v0) 20407 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20408 v1.AuxInt = j1 20409 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20410 v2.AuxInt = i0 20411 v2.Aux = s 20412 v2.AddArg(p) 20413 v2.AddArg(mem) 20414 v1.AddArg(v2) 20415 v0.AddArg(v1) 20416 v0.AddArg(y) 20417 return true 20418 } 20419 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 20420 // 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) 20421 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20422 for { 20423 _ = v.Args[1] 20424 s0 := v.Args[0] 20425 if s0.Op != OpS390XSLDconst { 20426 break 20427 } 20428 j0 := s0.AuxInt 20429 x0 := s0.Args[0] 20430 if x0.Op != OpS390XMOVHZload { 20431 break 20432 } 20433 i0 := x0.AuxInt 20434 s := x0.Aux 20435 _ = x0.Args[1] 20436 p := x0.Args[0] 20437 mem := x0.Args[1] 20438 or := v.Args[1] 20439 if or.Op != OpS390XOR { 20440 break 20441 } 20442 _ = or.Args[1] 20443 y := or.Args[0] 20444 s1 := or.Args[1] 20445 if s1.Op != OpS390XSLDconst { 20446 break 20447 } 20448 j1 := s1.AuxInt 20449 x1 := s1.Args[0] 20450 if x1.Op != OpS390XMOVHZload { 20451 break 20452 } 20453 i1 := x1.AuxInt 20454 if x1.Aux != s { 20455 break 20456 } 20457 _ = x1.Args[1] 20458 if p != x1.Args[0] { 20459 break 20460 } 20461 if mem != x1.Args[1] { 20462 break 20463 } 20464 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)) { 20465 break 20466 } 20467 b = mergePoint(b, x0, x1) 20468 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20469 v.reset(OpCopy) 20470 v.AddArg(v0) 20471 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20472 v1.AuxInt = j1 20473 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20474 v2.AuxInt = i0 20475 v2.Aux = s 20476 v2.AddArg(p) 20477 v2.AddArg(mem) 20478 v1.AddArg(v2) 20479 v0.AddArg(v1) 20480 v0.AddArg(y) 20481 return true 20482 } 20483 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20484 // 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) 20485 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20486 for { 20487 _ = v.Args[1] 20488 or := v.Args[0] 20489 if or.Op != OpS390XOR { 20490 break 20491 } 20492 _ = or.Args[1] 20493 s1 := or.Args[0] 20494 if s1.Op != OpS390XSLDconst { 20495 break 20496 } 20497 j1 := s1.AuxInt 20498 x1 := s1.Args[0] 20499 if x1.Op != OpS390XMOVHZload { 20500 break 20501 } 20502 i1 := x1.AuxInt 20503 s := x1.Aux 20504 _ = x1.Args[1] 20505 p := x1.Args[0] 20506 mem := x1.Args[1] 20507 y := or.Args[1] 20508 s0 := v.Args[1] 20509 if s0.Op != OpS390XSLDconst { 20510 break 20511 } 20512 j0 := s0.AuxInt 20513 x0 := s0.Args[0] 20514 if x0.Op != OpS390XMOVHZload { 20515 break 20516 } 20517 i0 := x0.AuxInt 20518 if x0.Aux != s { 20519 break 20520 } 20521 _ = x0.Args[1] 20522 if p != x0.Args[0] { 20523 break 20524 } 20525 if mem != x0.Args[1] { 20526 break 20527 } 20528 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)) { 20529 break 20530 } 20531 b = mergePoint(b, x0, x1) 20532 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20533 v.reset(OpCopy) 20534 v.AddArg(v0) 20535 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20536 v1.AuxInt = j1 20537 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20538 v2.AuxInt = i0 20539 v2.Aux = s 20540 v2.AddArg(p) 20541 v2.AddArg(mem) 20542 v1.AddArg(v2) 20543 v0.AddArg(v1) 20544 v0.AddArg(y) 20545 return true 20546 } 20547 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 20548 // 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) 20549 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 20550 for { 20551 _ = v.Args[1] 20552 or := v.Args[0] 20553 if or.Op != OpS390XOR { 20554 break 20555 } 20556 _ = or.Args[1] 20557 y := or.Args[0] 20558 s1 := or.Args[1] 20559 if s1.Op != OpS390XSLDconst { 20560 break 20561 } 20562 j1 := s1.AuxInt 20563 x1 := s1.Args[0] 20564 if x1.Op != OpS390XMOVHZload { 20565 break 20566 } 20567 i1 := x1.AuxInt 20568 s := x1.Aux 20569 _ = x1.Args[1] 20570 p := x1.Args[0] 20571 mem := x1.Args[1] 20572 s0 := v.Args[1] 20573 if s0.Op != OpS390XSLDconst { 20574 break 20575 } 20576 j0 := s0.AuxInt 20577 x0 := s0.Args[0] 20578 if x0.Op != OpS390XMOVHZload { 20579 break 20580 } 20581 i0 := x0.AuxInt 20582 if x0.Aux != s { 20583 break 20584 } 20585 _ = x0.Args[1] 20586 if p != x0.Args[0] { 20587 break 20588 } 20589 if mem != x0.Args[1] { 20590 break 20591 } 20592 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)) { 20593 break 20594 } 20595 b = mergePoint(b, x0, x1) 20596 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 20597 v.reset(OpCopy) 20598 v.AddArg(v0) 20599 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 20600 v1.AuxInt = j1 20601 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 20602 v2.AuxInt = i0 20603 v2.Aux = s 20604 v2.AddArg(p) 20605 v2.AddArg(mem) 20606 v1.AddArg(v2) 20607 v0.AddArg(v1) 20608 v0.AddArg(y) 20609 return true 20610 } 20611 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20612 // 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) 20613 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20614 for { 20615 _ = v.Args[1] 20616 x1 := v.Args[0] 20617 if x1.Op != OpS390XMOVBZloadidx { 20618 break 20619 } 20620 i1 := x1.AuxInt 20621 s := x1.Aux 20622 _ = x1.Args[2] 20623 p := x1.Args[0] 20624 idx := x1.Args[1] 20625 mem := x1.Args[2] 20626 sh := v.Args[1] 20627 if sh.Op != OpS390XSLDconst { 20628 break 20629 } 20630 if sh.AuxInt != 8 { 20631 break 20632 } 20633 x0 := sh.Args[0] 20634 if x0.Op != OpS390XMOVBZloadidx { 20635 break 20636 } 20637 i0 := x0.AuxInt 20638 if x0.Aux != s { 20639 break 20640 } 20641 _ = x0.Args[2] 20642 if p != x0.Args[0] { 20643 break 20644 } 20645 if idx != x0.Args[1] { 20646 break 20647 } 20648 if mem != x0.Args[2] { 20649 break 20650 } 20651 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)) { 20652 break 20653 } 20654 b = mergePoint(b, x0, x1) 20655 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20656 v.reset(OpCopy) 20657 v.AddArg(v0) 20658 v0.AuxInt = i0 20659 v0.Aux = s 20660 v0.AddArg(p) 20661 v0.AddArg(idx) 20662 v0.AddArg(mem) 20663 return true 20664 } 20665 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 20666 // 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) 20667 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20668 for { 20669 _ = v.Args[1] 20670 x1 := v.Args[0] 20671 if x1.Op != OpS390XMOVBZloadidx { 20672 break 20673 } 20674 i1 := x1.AuxInt 20675 s := x1.Aux 20676 _ = x1.Args[2] 20677 idx := x1.Args[0] 20678 p := x1.Args[1] 20679 mem := x1.Args[2] 20680 sh := v.Args[1] 20681 if sh.Op != OpS390XSLDconst { 20682 break 20683 } 20684 if sh.AuxInt != 8 { 20685 break 20686 } 20687 x0 := sh.Args[0] 20688 if x0.Op != OpS390XMOVBZloadidx { 20689 break 20690 } 20691 i0 := x0.AuxInt 20692 if x0.Aux != s { 20693 break 20694 } 20695 _ = x0.Args[2] 20696 if p != x0.Args[0] { 20697 break 20698 } 20699 if idx != x0.Args[1] { 20700 break 20701 } 20702 if mem != x0.Args[2] { 20703 break 20704 } 20705 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)) { 20706 break 20707 } 20708 b = mergePoint(b, x0, x1) 20709 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20710 v.reset(OpCopy) 20711 v.AddArg(v0) 20712 v0.AuxInt = i0 20713 v0.Aux = s 20714 v0.AddArg(p) 20715 v0.AddArg(idx) 20716 v0.AddArg(mem) 20717 return true 20718 } 20719 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20720 // 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) 20721 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20722 for { 20723 _ = v.Args[1] 20724 x1 := v.Args[0] 20725 if x1.Op != OpS390XMOVBZloadidx { 20726 break 20727 } 20728 i1 := x1.AuxInt 20729 s := x1.Aux 20730 _ = x1.Args[2] 20731 p := x1.Args[0] 20732 idx := x1.Args[1] 20733 mem := x1.Args[2] 20734 sh := v.Args[1] 20735 if sh.Op != OpS390XSLDconst { 20736 break 20737 } 20738 if sh.AuxInt != 8 { 20739 break 20740 } 20741 x0 := sh.Args[0] 20742 if x0.Op != OpS390XMOVBZloadidx { 20743 break 20744 } 20745 i0 := x0.AuxInt 20746 if x0.Aux != s { 20747 break 20748 } 20749 _ = x0.Args[2] 20750 if idx != x0.Args[0] { 20751 break 20752 } 20753 if p != x0.Args[1] { 20754 break 20755 } 20756 if mem != x0.Args[2] { 20757 break 20758 } 20759 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)) { 20760 break 20761 } 20762 b = mergePoint(b, x0, x1) 20763 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20764 v.reset(OpCopy) 20765 v.AddArg(v0) 20766 v0.AuxInt = i0 20767 v0.Aux = s 20768 v0.AddArg(p) 20769 v0.AddArg(idx) 20770 v0.AddArg(mem) 20771 return true 20772 } 20773 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 20774 // 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) 20775 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20776 for { 20777 _ = v.Args[1] 20778 x1 := v.Args[0] 20779 if x1.Op != OpS390XMOVBZloadidx { 20780 break 20781 } 20782 i1 := x1.AuxInt 20783 s := x1.Aux 20784 _ = x1.Args[2] 20785 idx := x1.Args[0] 20786 p := x1.Args[1] 20787 mem := x1.Args[2] 20788 sh := v.Args[1] 20789 if sh.Op != OpS390XSLDconst { 20790 break 20791 } 20792 if sh.AuxInt != 8 { 20793 break 20794 } 20795 x0 := sh.Args[0] 20796 if x0.Op != OpS390XMOVBZloadidx { 20797 break 20798 } 20799 i0 := x0.AuxInt 20800 if x0.Aux != s { 20801 break 20802 } 20803 _ = x0.Args[2] 20804 if idx != x0.Args[0] { 20805 break 20806 } 20807 if p != x0.Args[1] { 20808 break 20809 } 20810 if mem != x0.Args[2] { 20811 break 20812 } 20813 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)) { 20814 break 20815 } 20816 b = mergePoint(b, x0, x1) 20817 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20818 v.reset(OpCopy) 20819 v.AddArg(v0) 20820 v0.AuxInt = i0 20821 v0.Aux = s 20822 v0.AddArg(p) 20823 v0.AddArg(idx) 20824 v0.AddArg(mem) 20825 return true 20826 } 20827 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20828 // 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) 20829 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20830 for { 20831 _ = v.Args[1] 20832 sh := v.Args[0] 20833 if sh.Op != OpS390XSLDconst { 20834 break 20835 } 20836 if sh.AuxInt != 8 { 20837 break 20838 } 20839 x0 := sh.Args[0] 20840 if x0.Op != OpS390XMOVBZloadidx { 20841 break 20842 } 20843 i0 := x0.AuxInt 20844 s := x0.Aux 20845 _ = x0.Args[2] 20846 p := x0.Args[0] 20847 idx := x0.Args[1] 20848 mem := x0.Args[2] 20849 x1 := v.Args[1] 20850 if x1.Op != OpS390XMOVBZloadidx { 20851 break 20852 } 20853 i1 := x1.AuxInt 20854 if x1.Aux != s { 20855 break 20856 } 20857 _ = x1.Args[2] 20858 if p != x1.Args[0] { 20859 break 20860 } 20861 if idx != x1.Args[1] { 20862 break 20863 } 20864 if mem != x1.Args[2] { 20865 break 20866 } 20867 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)) { 20868 break 20869 } 20870 b = mergePoint(b, x0, x1) 20871 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20872 v.reset(OpCopy) 20873 v.AddArg(v0) 20874 v0.AuxInt = i0 20875 v0.Aux = s 20876 v0.AddArg(p) 20877 v0.AddArg(idx) 20878 v0.AddArg(mem) 20879 return true 20880 } 20881 return false 20882 } 20883 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 20884 b := v.Block 20885 _ = b 20886 typ := &b.Func.Config.Types 20887 _ = typ 20888 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20889 // 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) 20890 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20891 for { 20892 _ = v.Args[1] 20893 sh := v.Args[0] 20894 if sh.Op != OpS390XSLDconst { 20895 break 20896 } 20897 if sh.AuxInt != 8 { 20898 break 20899 } 20900 x0 := sh.Args[0] 20901 if x0.Op != OpS390XMOVBZloadidx { 20902 break 20903 } 20904 i0 := x0.AuxInt 20905 s := x0.Aux 20906 _ = x0.Args[2] 20907 idx := x0.Args[0] 20908 p := x0.Args[1] 20909 mem := x0.Args[2] 20910 x1 := v.Args[1] 20911 if x1.Op != OpS390XMOVBZloadidx { 20912 break 20913 } 20914 i1 := x1.AuxInt 20915 if x1.Aux != s { 20916 break 20917 } 20918 _ = x1.Args[2] 20919 if p != x1.Args[0] { 20920 break 20921 } 20922 if idx != x1.Args[1] { 20923 break 20924 } 20925 if mem != x1.Args[2] { 20926 break 20927 } 20928 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)) { 20929 break 20930 } 20931 b = mergePoint(b, x0, x1) 20932 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20933 v.reset(OpCopy) 20934 v.AddArg(v0) 20935 v0.AuxInt = i0 20936 v0.Aux = s 20937 v0.AddArg(p) 20938 v0.AddArg(idx) 20939 v0.AddArg(mem) 20940 return true 20941 } 20942 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20943 // 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) 20944 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20945 for { 20946 _ = v.Args[1] 20947 sh := v.Args[0] 20948 if sh.Op != OpS390XSLDconst { 20949 break 20950 } 20951 if sh.AuxInt != 8 { 20952 break 20953 } 20954 x0 := sh.Args[0] 20955 if x0.Op != OpS390XMOVBZloadidx { 20956 break 20957 } 20958 i0 := x0.AuxInt 20959 s := x0.Aux 20960 _ = x0.Args[2] 20961 p := x0.Args[0] 20962 idx := x0.Args[1] 20963 mem := x0.Args[2] 20964 x1 := v.Args[1] 20965 if x1.Op != OpS390XMOVBZloadidx { 20966 break 20967 } 20968 i1 := x1.AuxInt 20969 if x1.Aux != s { 20970 break 20971 } 20972 _ = x1.Args[2] 20973 if idx != x1.Args[0] { 20974 break 20975 } 20976 if p != x1.Args[1] { 20977 break 20978 } 20979 if mem != x1.Args[2] { 20980 break 20981 } 20982 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)) { 20983 break 20984 } 20985 b = mergePoint(b, x0, x1) 20986 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 20987 v.reset(OpCopy) 20988 v.AddArg(v0) 20989 v0.AuxInt = i0 20990 v0.Aux = s 20991 v0.AddArg(p) 20992 v0.AddArg(idx) 20993 v0.AddArg(mem) 20994 return true 20995 } 20996 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20997 // 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) 20998 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20999 for { 21000 _ = v.Args[1] 21001 sh := v.Args[0] 21002 if sh.Op != OpS390XSLDconst { 21003 break 21004 } 21005 if sh.AuxInt != 8 { 21006 break 21007 } 21008 x0 := sh.Args[0] 21009 if x0.Op != OpS390XMOVBZloadidx { 21010 break 21011 } 21012 i0 := x0.AuxInt 21013 s := x0.Aux 21014 _ = x0.Args[2] 21015 idx := x0.Args[0] 21016 p := x0.Args[1] 21017 mem := x0.Args[2] 21018 x1 := v.Args[1] 21019 if x1.Op != OpS390XMOVBZloadidx { 21020 break 21021 } 21022 i1 := x1.AuxInt 21023 if x1.Aux != s { 21024 break 21025 } 21026 _ = x1.Args[2] 21027 if idx != x1.Args[0] { 21028 break 21029 } 21030 if p != x1.Args[1] { 21031 break 21032 } 21033 if mem != x1.Args[2] { 21034 break 21035 } 21036 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)) { 21037 break 21038 } 21039 b = mergePoint(b, x0, x1) 21040 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21041 v.reset(OpCopy) 21042 v.AddArg(v0) 21043 v0.AuxInt = i0 21044 v0.Aux = s 21045 v0.AddArg(p) 21046 v0.AddArg(idx) 21047 v0.AddArg(mem) 21048 return true 21049 } 21050 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21051 // 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) 21052 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21053 for { 21054 _ = v.Args[1] 21055 x1 := v.Args[0] 21056 if x1.Op != OpS390XMOVHZloadidx { 21057 break 21058 } 21059 i1 := x1.AuxInt 21060 s := x1.Aux 21061 _ = x1.Args[2] 21062 p := x1.Args[0] 21063 idx := x1.Args[1] 21064 mem := x1.Args[2] 21065 sh := v.Args[1] 21066 if sh.Op != OpS390XSLDconst { 21067 break 21068 } 21069 if sh.AuxInt != 16 { 21070 break 21071 } 21072 x0 := sh.Args[0] 21073 if x0.Op != OpS390XMOVHZloadidx { 21074 break 21075 } 21076 i0 := x0.AuxInt 21077 if x0.Aux != s { 21078 break 21079 } 21080 _ = x0.Args[2] 21081 if p != x0.Args[0] { 21082 break 21083 } 21084 if idx != x0.Args[1] { 21085 break 21086 } 21087 if mem != x0.Args[2] { 21088 break 21089 } 21090 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)) { 21091 break 21092 } 21093 b = mergePoint(b, x0, x1) 21094 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21095 v.reset(OpCopy) 21096 v.AddArg(v0) 21097 v0.AuxInt = i0 21098 v0.Aux = s 21099 v0.AddArg(p) 21100 v0.AddArg(idx) 21101 v0.AddArg(mem) 21102 return true 21103 } 21104 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 21105 // 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) 21106 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21107 for { 21108 _ = v.Args[1] 21109 x1 := v.Args[0] 21110 if x1.Op != OpS390XMOVHZloadidx { 21111 break 21112 } 21113 i1 := x1.AuxInt 21114 s := x1.Aux 21115 _ = x1.Args[2] 21116 idx := x1.Args[0] 21117 p := x1.Args[1] 21118 mem := x1.Args[2] 21119 sh := v.Args[1] 21120 if sh.Op != OpS390XSLDconst { 21121 break 21122 } 21123 if sh.AuxInt != 16 { 21124 break 21125 } 21126 x0 := sh.Args[0] 21127 if x0.Op != OpS390XMOVHZloadidx { 21128 break 21129 } 21130 i0 := x0.AuxInt 21131 if x0.Aux != s { 21132 break 21133 } 21134 _ = x0.Args[2] 21135 if p != x0.Args[0] { 21136 break 21137 } 21138 if idx != x0.Args[1] { 21139 break 21140 } 21141 if mem != x0.Args[2] { 21142 break 21143 } 21144 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)) { 21145 break 21146 } 21147 b = mergePoint(b, x0, x1) 21148 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21149 v.reset(OpCopy) 21150 v.AddArg(v0) 21151 v0.AuxInt = i0 21152 v0.Aux = s 21153 v0.AddArg(p) 21154 v0.AddArg(idx) 21155 v0.AddArg(mem) 21156 return true 21157 } 21158 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21159 // 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) 21160 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21161 for { 21162 _ = v.Args[1] 21163 x1 := v.Args[0] 21164 if x1.Op != OpS390XMOVHZloadidx { 21165 break 21166 } 21167 i1 := x1.AuxInt 21168 s := x1.Aux 21169 _ = x1.Args[2] 21170 p := x1.Args[0] 21171 idx := x1.Args[1] 21172 mem := x1.Args[2] 21173 sh := v.Args[1] 21174 if sh.Op != OpS390XSLDconst { 21175 break 21176 } 21177 if sh.AuxInt != 16 { 21178 break 21179 } 21180 x0 := sh.Args[0] 21181 if x0.Op != OpS390XMOVHZloadidx { 21182 break 21183 } 21184 i0 := x0.AuxInt 21185 if x0.Aux != s { 21186 break 21187 } 21188 _ = x0.Args[2] 21189 if idx != x0.Args[0] { 21190 break 21191 } 21192 if p != x0.Args[1] { 21193 break 21194 } 21195 if mem != x0.Args[2] { 21196 break 21197 } 21198 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)) { 21199 break 21200 } 21201 b = mergePoint(b, x0, x1) 21202 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21203 v.reset(OpCopy) 21204 v.AddArg(v0) 21205 v0.AuxInt = i0 21206 v0.Aux = s 21207 v0.AddArg(p) 21208 v0.AddArg(idx) 21209 v0.AddArg(mem) 21210 return true 21211 } 21212 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 21213 // 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) 21214 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21215 for { 21216 _ = v.Args[1] 21217 x1 := v.Args[0] 21218 if x1.Op != OpS390XMOVHZloadidx { 21219 break 21220 } 21221 i1 := x1.AuxInt 21222 s := x1.Aux 21223 _ = x1.Args[2] 21224 idx := x1.Args[0] 21225 p := x1.Args[1] 21226 mem := x1.Args[2] 21227 sh := v.Args[1] 21228 if sh.Op != OpS390XSLDconst { 21229 break 21230 } 21231 if sh.AuxInt != 16 { 21232 break 21233 } 21234 x0 := sh.Args[0] 21235 if x0.Op != OpS390XMOVHZloadidx { 21236 break 21237 } 21238 i0 := x0.AuxInt 21239 if x0.Aux != s { 21240 break 21241 } 21242 _ = x0.Args[2] 21243 if idx != x0.Args[0] { 21244 break 21245 } 21246 if p != x0.Args[1] { 21247 break 21248 } 21249 if mem != x0.Args[2] { 21250 break 21251 } 21252 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)) { 21253 break 21254 } 21255 b = mergePoint(b, x0, x1) 21256 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21257 v.reset(OpCopy) 21258 v.AddArg(v0) 21259 v0.AuxInt = i0 21260 v0.Aux = s 21261 v0.AddArg(p) 21262 v0.AddArg(idx) 21263 v0.AddArg(mem) 21264 return true 21265 } 21266 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21267 // 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) 21268 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21269 for { 21270 _ = v.Args[1] 21271 sh := v.Args[0] 21272 if sh.Op != OpS390XSLDconst { 21273 break 21274 } 21275 if sh.AuxInt != 16 { 21276 break 21277 } 21278 x0 := sh.Args[0] 21279 if x0.Op != OpS390XMOVHZloadidx { 21280 break 21281 } 21282 i0 := x0.AuxInt 21283 s := x0.Aux 21284 _ = x0.Args[2] 21285 p := x0.Args[0] 21286 idx := x0.Args[1] 21287 mem := x0.Args[2] 21288 x1 := v.Args[1] 21289 if x1.Op != OpS390XMOVHZloadidx { 21290 break 21291 } 21292 i1 := x1.AuxInt 21293 if x1.Aux != s { 21294 break 21295 } 21296 _ = x1.Args[2] 21297 if p != x1.Args[0] { 21298 break 21299 } 21300 if idx != x1.Args[1] { 21301 break 21302 } 21303 if mem != x1.Args[2] { 21304 break 21305 } 21306 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)) { 21307 break 21308 } 21309 b = mergePoint(b, x0, x1) 21310 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21311 v.reset(OpCopy) 21312 v.AddArg(v0) 21313 v0.AuxInt = i0 21314 v0.Aux = s 21315 v0.AddArg(p) 21316 v0.AddArg(idx) 21317 v0.AddArg(mem) 21318 return true 21319 } 21320 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 21321 // 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) 21322 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21323 for { 21324 _ = v.Args[1] 21325 sh := v.Args[0] 21326 if sh.Op != OpS390XSLDconst { 21327 break 21328 } 21329 if sh.AuxInt != 16 { 21330 break 21331 } 21332 x0 := sh.Args[0] 21333 if x0.Op != OpS390XMOVHZloadidx { 21334 break 21335 } 21336 i0 := x0.AuxInt 21337 s := x0.Aux 21338 _ = x0.Args[2] 21339 idx := x0.Args[0] 21340 p := x0.Args[1] 21341 mem := x0.Args[2] 21342 x1 := v.Args[1] 21343 if x1.Op != OpS390XMOVHZloadidx { 21344 break 21345 } 21346 i1 := x1.AuxInt 21347 if x1.Aux != s { 21348 break 21349 } 21350 _ = x1.Args[2] 21351 if p != x1.Args[0] { 21352 break 21353 } 21354 if idx != x1.Args[1] { 21355 break 21356 } 21357 if mem != x1.Args[2] { 21358 break 21359 } 21360 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)) { 21361 break 21362 } 21363 b = mergePoint(b, x0, x1) 21364 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21365 v.reset(OpCopy) 21366 v.AddArg(v0) 21367 v0.AuxInt = i0 21368 v0.Aux = s 21369 v0.AddArg(p) 21370 v0.AddArg(idx) 21371 v0.AddArg(mem) 21372 return true 21373 } 21374 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21375 // 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) 21376 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21377 for { 21378 _ = v.Args[1] 21379 sh := v.Args[0] 21380 if sh.Op != OpS390XSLDconst { 21381 break 21382 } 21383 if sh.AuxInt != 16 { 21384 break 21385 } 21386 x0 := sh.Args[0] 21387 if x0.Op != OpS390XMOVHZloadidx { 21388 break 21389 } 21390 i0 := x0.AuxInt 21391 s := x0.Aux 21392 _ = x0.Args[2] 21393 p := x0.Args[0] 21394 idx := x0.Args[1] 21395 mem := x0.Args[2] 21396 x1 := v.Args[1] 21397 if x1.Op != OpS390XMOVHZloadidx { 21398 break 21399 } 21400 i1 := x1.AuxInt 21401 if x1.Aux != s { 21402 break 21403 } 21404 _ = x1.Args[2] 21405 if idx != x1.Args[0] { 21406 break 21407 } 21408 if p != x1.Args[1] { 21409 break 21410 } 21411 if mem != x1.Args[2] { 21412 break 21413 } 21414 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)) { 21415 break 21416 } 21417 b = mergePoint(b, x0, x1) 21418 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21419 v.reset(OpCopy) 21420 v.AddArg(v0) 21421 v0.AuxInt = i0 21422 v0.Aux = s 21423 v0.AddArg(p) 21424 v0.AddArg(idx) 21425 v0.AddArg(mem) 21426 return true 21427 } 21428 return false 21429 } 21430 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 21431 b := v.Block 21432 _ = b 21433 typ := &b.Func.Config.Types 21434 _ = typ 21435 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 21436 // 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) 21437 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 21438 for { 21439 _ = v.Args[1] 21440 sh := v.Args[0] 21441 if sh.Op != OpS390XSLDconst { 21442 break 21443 } 21444 if sh.AuxInt != 16 { 21445 break 21446 } 21447 x0 := sh.Args[0] 21448 if x0.Op != OpS390XMOVHZloadidx { 21449 break 21450 } 21451 i0 := x0.AuxInt 21452 s := x0.Aux 21453 _ = x0.Args[2] 21454 idx := x0.Args[0] 21455 p := x0.Args[1] 21456 mem := x0.Args[2] 21457 x1 := v.Args[1] 21458 if x1.Op != OpS390XMOVHZloadidx { 21459 break 21460 } 21461 i1 := x1.AuxInt 21462 if x1.Aux != s { 21463 break 21464 } 21465 _ = x1.Args[2] 21466 if idx != x1.Args[0] { 21467 break 21468 } 21469 if p != x1.Args[1] { 21470 break 21471 } 21472 if mem != x1.Args[2] { 21473 break 21474 } 21475 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)) { 21476 break 21477 } 21478 b = mergePoint(b, x0, x1) 21479 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 21480 v.reset(OpCopy) 21481 v.AddArg(v0) 21482 v0.AuxInt = i0 21483 v0.Aux = s 21484 v0.AddArg(p) 21485 v0.AddArg(idx) 21486 v0.AddArg(mem) 21487 return true 21488 } 21489 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21490 // 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) 21491 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21492 for { 21493 _ = v.Args[1] 21494 x1 := v.Args[0] 21495 if x1.Op != OpS390XMOVWZloadidx { 21496 break 21497 } 21498 i1 := x1.AuxInt 21499 s := x1.Aux 21500 _ = x1.Args[2] 21501 p := x1.Args[0] 21502 idx := x1.Args[1] 21503 mem := x1.Args[2] 21504 sh := v.Args[1] 21505 if sh.Op != OpS390XSLDconst { 21506 break 21507 } 21508 if sh.AuxInt != 32 { 21509 break 21510 } 21511 x0 := sh.Args[0] 21512 if x0.Op != OpS390XMOVWZloadidx { 21513 break 21514 } 21515 i0 := x0.AuxInt 21516 if x0.Aux != s { 21517 break 21518 } 21519 _ = x0.Args[2] 21520 if p != x0.Args[0] { 21521 break 21522 } 21523 if idx != x0.Args[1] { 21524 break 21525 } 21526 if mem != x0.Args[2] { 21527 break 21528 } 21529 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)) { 21530 break 21531 } 21532 b = mergePoint(b, x0, x1) 21533 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21534 v.reset(OpCopy) 21535 v.AddArg(v0) 21536 v0.AuxInt = i0 21537 v0.Aux = s 21538 v0.AddArg(p) 21539 v0.AddArg(idx) 21540 v0.AddArg(mem) 21541 return true 21542 } 21543 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 21544 // 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) 21545 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21546 for { 21547 _ = v.Args[1] 21548 x1 := v.Args[0] 21549 if x1.Op != OpS390XMOVWZloadidx { 21550 break 21551 } 21552 i1 := x1.AuxInt 21553 s := x1.Aux 21554 _ = x1.Args[2] 21555 idx := x1.Args[0] 21556 p := x1.Args[1] 21557 mem := x1.Args[2] 21558 sh := v.Args[1] 21559 if sh.Op != OpS390XSLDconst { 21560 break 21561 } 21562 if sh.AuxInt != 32 { 21563 break 21564 } 21565 x0 := sh.Args[0] 21566 if x0.Op != OpS390XMOVWZloadidx { 21567 break 21568 } 21569 i0 := x0.AuxInt 21570 if x0.Aux != s { 21571 break 21572 } 21573 _ = x0.Args[2] 21574 if p != x0.Args[0] { 21575 break 21576 } 21577 if idx != x0.Args[1] { 21578 break 21579 } 21580 if mem != x0.Args[2] { 21581 break 21582 } 21583 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)) { 21584 break 21585 } 21586 b = mergePoint(b, x0, x1) 21587 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21588 v.reset(OpCopy) 21589 v.AddArg(v0) 21590 v0.AuxInt = i0 21591 v0.Aux = s 21592 v0.AddArg(p) 21593 v0.AddArg(idx) 21594 v0.AddArg(mem) 21595 return true 21596 } 21597 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21598 // 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) 21599 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21600 for { 21601 _ = v.Args[1] 21602 x1 := v.Args[0] 21603 if x1.Op != OpS390XMOVWZloadidx { 21604 break 21605 } 21606 i1 := x1.AuxInt 21607 s := x1.Aux 21608 _ = x1.Args[2] 21609 p := x1.Args[0] 21610 idx := x1.Args[1] 21611 mem := x1.Args[2] 21612 sh := v.Args[1] 21613 if sh.Op != OpS390XSLDconst { 21614 break 21615 } 21616 if sh.AuxInt != 32 { 21617 break 21618 } 21619 x0 := sh.Args[0] 21620 if x0.Op != OpS390XMOVWZloadidx { 21621 break 21622 } 21623 i0 := x0.AuxInt 21624 if x0.Aux != s { 21625 break 21626 } 21627 _ = x0.Args[2] 21628 if idx != x0.Args[0] { 21629 break 21630 } 21631 if p != x0.Args[1] { 21632 break 21633 } 21634 if mem != x0.Args[2] { 21635 break 21636 } 21637 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)) { 21638 break 21639 } 21640 b = mergePoint(b, x0, x1) 21641 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21642 v.reset(OpCopy) 21643 v.AddArg(v0) 21644 v0.AuxInt = i0 21645 v0.Aux = s 21646 v0.AddArg(p) 21647 v0.AddArg(idx) 21648 v0.AddArg(mem) 21649 return true 21650 } 21651 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 21652 // 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) 21653 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21654 for { 21655 _ = v.Args[1] 21656 x1 := v.Args[0] 21657 if x1.Op != OpS390XMOVWZloadidx { 21658 break 21659 } 21660 i1 := x1.AuxInt 21661 s := x1.Aux 21662 _ = x1.Args[2] 21663 idx := x1.Args[0] 21664 p := x1.Args[1] 21665 mem := x1.Args[2] 21666 sh := v.Args[1] 21667 if sh.Op != OpS390XSLDconst { 21668 break 21669 } 21670 if sh.AuxInt != 32 { 21671 break 21672 } 21673 x0 := sh.Args[0] 21674 if x0.Op != OpS390XMOVWZloadidx { 21675 break 21676 } 21677 i0 := x0.AuxInt 21678 if x0.Aux != s { 21679 break 21680 } 21681 _ = x0.Args[2] 21682 if idx != x0.Args[0] { 21683 break 21684 } 21685 if p != x0.Args[1] { 21686 break 21687 } 21688 if mem != x0.Args[2] { 21689 break 21690 } 21691 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)) { 21692 break 21693 } 21694 b = mergePoint(b, x0, x1) 21695 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21696 v.reset(OpCopy) 21697 v.AddArg(v0) 21698 v0.AuxInt = i0 21699 v0.Aux = s 21700 v0.AddArg(p) 21701 v0.AddArg(idx) 21702 v0.AddArg(mem) 21703 return true 21704 } 21705 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21706 // 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) 21707 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21708 for { 21709 _ = v.Args[1] 21710 sh := v.Args[0] 21711 if sh.Op != OpS390XSLDconst { 21712 break 21713 } 21714 if sh.AuxInt != 32 { 21715 break 21716 } 21717 x0 := sh.Args[0] 21718 if x0.Op != OpS390XMOVWZloadidx { 21719 break 21720 } 21721 i0 := x0.AuxInt 21722 s := x0.Aux 21723 _ = x0.Args[2] 21724 p := x0.Args[0] 21725 idx := x0.Args[1] 21726 mem := x0.Args[2] 21727 x1 := v.Args[1] 21728 if x1.Op != OpS390XMOVWZloadidx { 21729 break 21730 } 21731 i1 := x1.AuxInt 21732 if x1.Aux != s { 21733 break 21734 } 21735 _ = x1.Args[2] 21736 if p != x1.Args[0] { 21737 break 21738 } 21739 if idx != x1.Args[1] { 21740 break 21741 } 21742 if mem != x1.Args[2] { 21743 break 21744 } 21745 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)) { 21746 break 21747 } 21748 b = mergePoint(b, x0, x1) 21749 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21750 v.reset(OpCopy) 21751 v.AddArg(v0) 21752 v0.AuxInt = i0 21753 v0.Aux = s 21754 v0.AddArg(p) 21755 v0.AddArg(idx) 21756 v0.AddArg(mem) 21757 return true 21758 } 21759 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 21760 // 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) 21761 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21762 for { 21763 _ = v.Args[1] 21764 sh := v.Args[0] 21765 if sh.Op != OpS390XSLDconst { 21766 break 21767 } 21768 if sh.AuxInt != 32 { 21769 break 21770 } 21771 x0 := sh.Args[0] 21772 if x0.Op != OpS390XMOVWZloadidx { 21773 break 21774 } 21775 i0 := x0.AuxInt 21776 s := x0.Aux 21777 _ = x0.Args[2] 21778 idx := x0.Args[0] 21779 p := x0.Args[1] 21780 mem := x0.Args[2] 21781 x1 := v.Args[1] 21782 if x1.Op != OpS390XMOVWZloadidx { 21783 break 21784 } 21785 i1 := x1.AuxInt 21786 if x1.Aux != s { 21787 break 21788 } 21789 _ = x1.Args[2] 21790 if p != x1.Args[0] { 21791 break 21792 } 21793 if idx != x1.Args[1] { 21794 break 21795 } 21796 if mem != x1.Args[2] { 21797 break 21798 } 21799 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)) { 21800 break 21801 } 21802 b = mergePoint(b, x0, x1) 21803 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21804 v.reset(OpCopy) 21805 v.AddArg(v0) 21806 v0.AuxInt = i0 21807 v0.Aux = s 21808 v0.AddArg(p) 21809 v0.AddArg(idx) 21810 v0.AddArg(mem) 21811 return true 21812 } 21813 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21814 // 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) 21815 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21816 for { 21817 _ = v.Args[1] 21818 sh := v.Args[0] 21819 if sh.Op != OpS390XSLDconst { 21820 break 21821 } 21822 if sh.AuxInt != 32 { 21823 break 21824 } 21825 x0 := sh.Args[0] 21826 if x0.Op != OpS390XMOVWZloadidx { 21827 break 21828 } 21829 i0 := x0.AuxInt 21830 s := x0.Aux 21831 _ = x0.Args[2] 21832 p := x0.Args[0] 21833 idx := x0.Args[1] 21834 mem := x0.Args[2] 21835 x1 := v.Args[1] 21836 if x1.Op != OpS390XMOVWZloadidx { 21837 break 21838 } 21839 i1 := x1.AuxInt 21840 if x1.Aux != s { 21841 break 21842 } 21843 _ = x1.Args[2] 21844 if idx != x1.Args[0] { 21845 break 21846 } 21847 if p != x1.Args[1] { 21848 break 21849 } 21850 if mem != x1.Args[2] { 21851 break 21852 } 21853 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)) { 21854 break 21855 } 21856 b = mergePoint(b, x0, x1) 21857 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21858 v.reset(OpCopy) 21859 v.AddArg(v0) 21860 v0.AuxInt = i0 21861 v0.Aux = s 21862 v0.AddArg(p) 21863 v0.AddArg(idx) 21864 v0.AddArg(mem) 21865 return true 21866 } 21867 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 21868 // 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) 21869 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 21870 for { 21871 _ = v.Args[1] 21872 sh := v.Args[0] 21873 if sh.Op != OpS390XSLDconst { 21874 break 21875 } 21876 if sh.AuxInt != 32 { 21877 break 21878 } 21879 x0 := sh.Args[0] 21880 if x0.Op != OpS390XMOVWZloadidx { 21881 break 21882 } 21883 i0 := x0.AuxInt 21884 s := x0.Aux 21885 _ = x0.Args[2] 21886 idx := x0.Args[0] 21887 p := x0.Args[1] 21888 mem := x0.Args[2] 21889 x1 := v.Args[1] 21890 if x1.Op != OpS390XMOVWZloadidx { 21891 break 21892 } 21893 i1 := x1.AuxInt 21894 if x1.Aux != s { 21895 break 21896 } 21897 _ = x1.Args[2] 21898 if idx != x1.Args[0] { 21899 break 21900 } 21901 if p != x1.Args[1] { 21902 break 21903 } 21904 if mem != x1.Args[2] { 21905 break 21906 } 21907 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)) { 21908 break 21909 } 21910 b = mergePoint(b, x0, x1) 21911 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) 21912 v.reset(OpCopy) 21913 v.AddArg(v0) 21914 v0.AuxInt = i0 21915 v0.Aux = s 21916 v0.AddArg(p) 21917 v0.AddArg(idx) 21918 v0.AddArg(mem) 21919 return true 21920 } 21921 // 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)) 21922 // 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) 21923 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21924 for { 21925 _ = v.Args[1] 21926 s0 := v.Args[0] 21927 if s0.Op != OpS390XSLDconst { 21928 break 21929 } 21930 j0 := s0.AuxInt 21931 x0 := s0.Args[0] 21932 if x0.Op != OpS390XMOVBZloadidx { 21933 break 21934 } 21935 i0 := x0.AuxInt 21936 s := x0.Aux 21937 _ = x0.Args[2] 21938 p := x0.Args[0] 21939 idx := x0.Args[1] 21940 mem := x0.Args[2] 21941 or := v.Args[1] 21942 if or.Op != OpS390XOR { 21943 break 21944 } 21945 _ = or.Args[1] 21946 s1 := or.Args[0] 21947 if s1.Op != OpS390XSLDconst { 21948 break 21949 } 21950 j1 := s1.AuxInt 21951 x1 := s1.Args[0] 21952 if x1.Op != OpS390XMOVBZloadidx { 21953 break 21954 } 21955 i1 := x1.AuxInt 21956 if x1.Aux != s { 21957 break 21958 } 21959 _ = x1.Args[2] 21960 if p != x1.Args[0] { 21961 break 21962 } 21963 if idx != x1.Args[1] { 21964 break 21965 } 21966 if mem != x1.Args[2] { 21967 break 21968 } 21969 y := or.Args[1] 21970 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)) { 21971 break 21972 } 21973 b = mergePoint(b, x0, x1) 21974 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21975 v.reset(OpCopy) 21976 v.AddArg(v0) 21977 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21978 v1.AuxInt = j1 21979 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 21980 v2.AuxInt = i0 21981 v2.Aux = s 21982 v2.AddArg(p) 21983 v2.AddArg(idx) 21984 v2.AddArg(mem) 21985 v1.AddArg(v2) 21986 v0.AddArg(v1) 21987 v0.AddArg(y) 21988 return true 21989 } 21990 return false 21991 } 21992 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 21993 b := v.Block 21994 _ = b 21995 typ := &b.Func.Config.Types 21996 _ = typ 21997 // 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)) 21998 // 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) 21999 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22000 for { 22001 _ = v.Args[1] 22002 s0 := v.Args[0] 22003 if s0.Op != OpS390XSLDconst { 22004 break 22005 } 22006 j0 := s0.AuxInt 22007 x0 := s0.Args[0] 22008 if x0.Op != OpS390XMOVBZloadidx { 22009 break 22010 } 22011 i0 := x0.AuxInt 22012 s := x0.Aux 22013 _ = x0.Args[2] 22014 idx := x0.Args[0] 22015 p := x0.Args[1] 22016 mem := x0.Args[2] 22017 or := v.Args[1] 22018 if or.Op != OpS390XOR { 22019 break 22020 } 22021 _ = or.Args[1] 22022 s1 := or.Args[0] 22023 if s1.Op != OpS390XSLDconst { 22024 break 22025 } 22026 j1 := s1.AuxInt 22027 x1 := s1.Args[0] 22028 if x1.Op != OpS390XMOVBZloadidx { 22029 break 22030 } 22031 i1 := x1.AuxInt 22032 if x1.Aux != s { 22033 break 22034 } 22035 _ = x1.Args[2] 22036 if p != x1.Args[0] { 22037 break 22038 } 22039 if idx != x1.Args[1] { 22040 break 22041 } 22042 if mem != x1.Args[2] { 22043 break 22044 } 22045 y := or.Args[1] 22046 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)) { 22047 break 22048 } 22049 b = mergePoint(b, x0, x1) 22050 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22051 v.reset(OpCopy) 22052 v.AddArg(v0) 22053 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22054 v1.AuxInt = j1 22055 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22056 v2.AuxInt = i0 22057 v2.Aux = s 22058 v2.AddArg(p) 22059 v2.AddArg(idx) 22060 v2.AddArg(mem) 22061 v1.AddArg(v2) 22062 v0.AddArg(v1) 22063 v0.AddArg(y) 22064 return true 22065 } 22066 // 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)) 22067 // 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) 22068 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22069 for { 22070 _ = v.Args[1] 22071 s0 := v.Args[0] 22072 if s0.Op != OpS390XSLDconst { 22073 break 22074 } 22075 j0 := s0.AuxInt 22076 x0 := s0.Args[0] 22077 if x0.Op != OpS390XMOVBZloadidx { 22078 break 22079 } 22080 i0 := x0.AuxInt 22081 s := x0.Aux 22082 _ = x0.Args[2] 22083 p := x0.Args[0] 22084 idx := x0.Args[1] 22085 mem := x0.Args[2] 22086 or := v.Args[1] 22087 if or.Op != OpS390XOR { 22088 break 22089 } 22090 _ = or.Args[1] 22091 s1 := or.Args[0] 22092 if s1.Op != OpS390XSLDconst { 22093 break 22094 } 22095 j1 := s1.AuxInt 22096 x1 := s1.Args[0] 22097 if x1.Op != OpS390XMOVBZloadidx { 22098 break 22099 } 22100 i1 := x1.AuxInt 22101 if x1.Aux != s { 22102 break 22103 } 22104 _ = x1.Args[2] 22105 if idx != x1.Args[0] { 22106 break 22107 } 22108 if p != x1.Args[1] { 22109 break 22110 } 22111 if mem != x1.Args[2] { 22112 break 22113 } 22114 y := or.Args[1] 22115 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)) { 22116 break 22117 } 22118 b = mergePoint(b, x0, x1) 22119 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22120 v.reset(OpCopy) 22121 v.AddArg(v0) 22122 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22123 v1.AuxInt = j1 22124 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22125 v2.AuxInt = i0 22126 v2.Aux = s 22127 v2.AddArg(p) 22128 v2.AddArg(idx) 22129 v2.AddArg(mem) 22130 v1.AddArg(v2) 22131 v0.AddArg(v1) 22132 v0.AddArg(y) 22133 return true 22134 } 22135 // 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)) 22136 // 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) 22137 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22138 for { 22139 _ = v.Args[1] 22140 s0 := v.Args[0] 22141 if s0.Op != OpS390XSLDconst { 22142 break 22143 } 22144 j0 := s0.AuxInt 22145 x0 := s0.Args[0] 22146 if x0.Op != OpS390XMOVBZloadidx { 22147 break 22148 } 22149 i0 := x0.AuxInt 22150 s := x0.Aux 22151 _ = x0.Args[2] 22152 idx := x0.Args[0] 22153 p := x0.Args[1] 22154 mem := x0.Args[2] 22155 or := v.Args[1] 22156 if or.Op != OpS390XOR { 22157 break 22158 } 22159 _ = or.Args[1] 22160 s1 := or.Args[0] 22161 if s1.Op != OpS390XSLDconst { 22162 break 22163 } 22164 j1 := s1.AuxInt 22165 x1 := s1.Args[0] 22166 if x1.Op != OpS390XMOVBZloadidx { 22167 break 22168 } 22169 i1 := x1.AuxInt 22170 if x1.Aux != s { 22171 break 22172 } 22173 _ = x1.Args[2] 22174 if idx != x1.Args[0] { 22175 break 22176 } 22177 if p != x1.Args[1] { 22178 break 22179 } 22180 if mem != x1.Args[2] { 22181 break 22182 } 22183 y := or.Args[1] 22184 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)) { 22185 break 22186 } 22187 b = mergePoint(b, x0, x1) 22188 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22189 v.reset(OpCopy) 22190 v.AddArg(v0) 22191 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22192 v1.AuxInt = j1 22193 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22194 v2.AuxInt = i0 22195 v2.Aux = s 22196 v2.AddArg(p) 22197 v2.AddArg(idx) 22198 v2.AddArg(mem) 22199 v1.AddArg(v2) 22200 v0.AddArg(v1) 22201 v0.AddArg(y) 22202 return true 22203 } 22204 // 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)))) 22205 // 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) 22206 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22207 for { 22208 _ = v.Args[1] 22209 s0 := v.Args[0] 22210 if s0.Op != OpS390XSLDconst { 22211 break 22212 } 22213 j0 := s0.AuxInt 22214 x0 := s0.Args[0] 22215 if x0.Op != OpS390XMOVBZloadidx { 22216 break 22217 } 22218 i0 := x0.AuxInt 22219 s := x0.Aux 22220 _ = x0.Args[2] 22221 p := x0.Args[0] 22222 idx := x0.Args[1] 22223 mem := x0.Args[2] 22224 or := v.Args[1] 22225 if or.Op != OpS390XOR { 22226 break 22227 } 22228 _ = or.Args[1] 22229 y := or.Args[0] 22230 s1 := or.Args[1] 22231 if s1.Op != OpS390XSLDconst { 22232 break 22233 } 22234 j1 := s1.AuxInt 22235 x1 := s1.Args[0] 22236 if x1.Op != OpS390XMOVBZloadidx { 22237 break 22238 } 22239 i1 := x1.AuxInt 22240 if x1.Aux != s { 22241 break 22242 } 22243 _ = x1.Args[2] 22244 if p != x1.Args[0] { 22245 break 22246 } 22247 if idx != x1.Args[1] { 22248 break 22249 } 22250 if mem != x1.Args[2] { 22251 break 22252 } 22253 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)) { 22254 break 22255 } 22256 b = mergePoint(b, x0, x1) 22257 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22258 v.reset(OpCopy) 22259 v.AddArg(v0) 22260 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22261 v1.AuxInt = j1 22262 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22263 v2.AuxInt = i0 22264 v2.Aux = s 22265 v2.AddArg(p) 22266 v2.AddArg(idx) 22267 v2.AddArg(mem) 22268 v1.AddArg(v2) 22269 v0.AddArg(v1) 22270 v0.AddArg(y) 22271 return true 22272 } 22273 // 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)))) 22274 // 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) 22275 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22276 for { 22277 _ = v.Args[1] 22278 s0 := v.Args[0] 22279 if s0.Op != OpS390XSLDconst { 22280 break 22281 } 22282 j0 := s0.AuxInt 22283 x0 := s0.Args[0] 22284 if x0.Op != OpS390XMOVBZloadidx { 22285 break 22286 } 22287 i0 := x0.AuxInt 22288 s := x0.Aux 22289 _ = x0.Args[2] 22290 idx := x0.Args[0] 22291 p := x0.Args[1] 22292 mem := x0.Args[2] 22293 or := v.Args[1] 22294 if or.Op != OpS390XOR { 22295 break 22296 } 22297 _ = or.Args[1] 22298 y := or.Args[0] 22299 s1 := or.Args[1] 22300 if s1.Op != OpS390XSLDconst { 22301 break 22302 } 22303 j1 := s1.AuxInt 22304 x1 := s1.Args[0] 22305 if x1.Op != OpS390XMOVBZloadidx { 22306 break 22307 } 22308 i1 := x1.AuxInt 22309 if x1.Aux != s { 22310 break 22311 } 22312 _ = x1.Args[2] 22313 if p != x1.Args[0] { 22314 break 22315 } 22316 if idx != x1.Args[1] { 22317 break 22318 } 22319 if mem != x1.Args[2] { 22320 break 22321 } 22322 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)) { 22323 break 22324 } 22325 b = mergePoint(b, x0, x1) 22326 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22327 v.reset(OpCopy) 22328 v.AddArg(v0) 22329 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22330 v1.AuxInt = j1 22331 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22332 v2.AuxInt = i0 22333 v2.Aux = s 22334 v2.AddArg(p) 22335 v2.AddArg(idx) 22336 v2.AddArg(mem) 22337 v1.AddArg(v2) 22338 v0.AddArg(v1) 22339 v0.AddArg(y) 22340 return true 22341 } 22342 // 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)))) 22343 // 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) 22344 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22345 for { 22346 _ = v.Args[1] 22347 s0 := v.Args[0] 22348 if s0.Op != OpS390XSLDconst { 22349 break 22350 } 22351 j0 := s0.AuxInt 22352 x0 := s0.Args[0] 22353 if x0.Op != OpS390XMOVBZloadidx { 22354 break 22355 } 22356 i0 := x0.AuxInt 22357 s := x0.Aux 22358 _ = x0.Args[2] 22359 p := x0.Args[0] 22360 idx := x0.Args[1] 22361 mem := x0.Args[2] 22362 or := v.Args[1] 22363 if or.Op != OpS390XOR { 22364 break 22365 } 22366 _ = or.Args[1] 22367 y := or.Args[0] 22368 s1 := or.Args[1] 22369 if s1.Op != OpS390XSLDconst { 22370 break 22371 } 22372 j1 := s1.AuxInt 22373 x1 := s1.Args[0] 22374 if x1.Op != OpS390XMOVBZloadidx { 22375 break 22376 } 22377 i1 := x1.AuxInt 22378 if x1.Aux != s { 22379 break 22380 } 22381 _ = x1.Args[2] 22382 if idx != x1.Args[0] { 22383 break 22384 } 22385 if p != x1.Args[1] { 22386 break 22387 } 22388 if mem != x1.Args[2] { 22389 break 22390 } 22391 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)) { 22392 break 22393 } 22394 b = mergePoint(b, x0, x1) 22395 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22396 v.reset(OpCopy) 22397 v.AddArg(v0) 22398 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22399 v1.AuxInt = j1 22400 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22401 v2.AuxInt = i0 22402 v2.Aux = s 22403 v2.AddArg(p) 22404 v2.AddArg(idx) 22405 v2.AddArg(mem) 22406 v1.AddArg(v2) 22407 v0.AddArg(v1) 22408 v0.AddArg(y) 22409 return true 22410 } 22411 // 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)))) 22412 // 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) 22413 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22414 for { 22415 _ = v.Args[1] 22416 s0 := v.Args[0] 22417 if s0.Op != OpS390XSLDconst { 22418 break 22419 } 22420 j0 := s0.AuxInt 22421 x0 := s0.Args[0] 22422 if x0.Op != OpS390XMOVBZloadidx { 22423 break 22424 } 22425 i0 := x0.AuxInt 22426 s := x0.Aux 22427 _ = x0.Args[2] 22428 idx := x0.Args[0] 22429 p := x0.Args[1] 22430 mem := x0.Args[2] 22431 or := v.Args[1] 22432 if or.Op != OpS390XOR { 22433 break 22434 } 22435 _ = or.Args[1] 22436 y := or.Args[0] 22437 s1 := or.Args[1] 22438 if s1.Op != OpS390XSLDconst { 22439 break 22440 } 22441 j1 := s1.AuxInt 22442 x1 := s1.Args[0] 22443 if x1.Op != OpS390XMOVBZloadidx { 22444 break 22445 } 22446 i1 := x1.AuxInt 22447 if x1.Aux != s { 22448 break 22449 } 22450 _ = x1.Args[2] 22451 if idx != x1.Args[0] { 22452 break 22453 } 22454 if p != x1.Args[1] { 22455 break 22456 } 22457 if mem != x1.Args[2] { 22458 break 22459 } 22460 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)) { 22461 break 22462 } 22463 b = mergePoint(b, x0, x1) 22464 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22465 v.reset(OpCopy) 22466 v.AddArg(v0) 22467 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22468 v1.AuxInt = j1 22469 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22470 v2.AuxInt = i0 22471 v2.Aux = s 22472 v2.AddArg(p) 22473 v2.AddArg(idx) 22474 v2.AddArg(mem) 22475 v1.AddArg(v2) 22476 v0.AddArg(v1) 22477 v0.AddArg(y) 22478 return true 22479 } 22480 // 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))) 22481 // 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) 22482 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22483 for { 22484 _ = v.Args[1] 22485 or := v.Args[0] 22486 if or.Op != OpS390XOR { 22487 break 22488 } 22489 _ = or.Args[1] 22490 s1 := or.Args[0] 22491 if s1.Op != OpS390XSLDconst { 22492 break 22493 } 22494 j1 := s1.AuxInt 22495 x1 := s1.Args[0] 22496 if x1.Op != OpS390XMOVBZloadidx { 22497 break 22498 } 22499 i1 := x1.AuxInt 22500 s := x1.Aux 22501 _ = x1.Args[2] 22502 p := x1.Args[0] 22503 idx := x1.Args[1] 22504 mem := x1.Args[2] 22505 y := or.Args[1] 22506 s0 := v.Args[1] 22507 if s0.Op != OpS390XSLDconst { 22508 break 22509 } 22510 j0 := s0.AuxInt 22511 x0 := s0.Args[0] 22512 if x0.Op != OpS390XMOVBZloadidx { 22513 break 22514 } 22515 i0 := x0.AuxInt 22516 if x0.Aux != s { 22517 break 22518 } 22519 _ = x0.Args[2] 22520 if p != x0.Args[0] { 22521 break 22522 } 22523 if idx != x0.Args[1] { 22524 break 22525 } 22526 if mem != x0.Args[2] { 22527 break 22528 } 22529 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)) { 22530 break 22531 } 22532 b = mergePoint(b, x0, x1) 22533 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22534 v.reset(OpCopy) 22535 v.AddArg(v0) 22536 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22537 v1.AuxInt = j1 22538 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22539 v2.AuxInt = i0 22540 v2.Aux = s 22541 v2.AddArg(p) 22542 v2.AddArg(idx) 22543 v2.AddArg(mem) 22544 v1.AddArg(v2) 22545 v0.AddArg(v1) 22546 v0.AddArg(y) 22547 return true 22548 } 22549 // 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))) 22550 // 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) 22551 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22552 for { 22553 _ = v.Args[1] 22554 or := v.Args[0] 22555 if or.Op != OpS390XOR { 22556 break 22557 } 22558 _ = or.Args[1] 22559 s1 := or.Args[0] 22560 if s1.Op != OpS390XSLDconst { 22561 break 22562 } 22563 j1 := s1.AuxInt 22564 x1 := s1.Args[0] 22565 if x1.Op != OpS390XMOVBZloadidx { 22566 break 22567 } 22568 i1 := x1.AuxInt 22569 s := x1.Aux 22570 _ = x1.Args[2] 22571 idx := x1.Args[0] 22572 p := x1.Args[1] 22573 mem := x1.Args[2] 22574 y := or.Args[1] 22575 s0 := v.Args[1] 22576 if s0.Op != OpS390XSLDconst { 22577 break 22578 } 22579 j0 := s0.AuxInt 22580 x0 := s0.Args[0] 22581 if x0.Op != OpS390XMOVBZloadidx { 22582 break 22583 } 22584 i0 := x0.AuxInt 22585 if x0.Aux != s { 22586 break 22587 } 22588 _ = x0.Args[2] 22589 if p != x0.Args[0] { 22590 break 22591 } 22592 if idx != x0.Args[1] { 22593 break 22594 } 22595 if mem != x0.Args[2] { 22596 break 22597 } 22598 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)) { 22599 break 22600 } 22601 b = mergePoint(b, x0, x1) 22602 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22603 v.reset(OpCopy) 22604 v.AddArg(v0) 22605 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22606 v1.AuxInt = j1 22607 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22608 v2.AuxInt = i0 22609 v2.Aux = s 22610 v2.AddArg(p) 22611 v2.AddArg(idx) 22612 v2.AddArg(mem) 22613 v1.AddArg(v2) 22614 v0.AddArg(v1) 22615 v0.AddArg(y) 22616 return true 22617 } 22618 // 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))) 22619 // 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) 22620 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22621 for { 22622 _ = v.Args[1] 22623 or := v.Args[0] 22624 if or.Op != OpS390XOR { 22625 break 22626 } 22627 _ = or.Args[1] 22628 y := or.Args[0] 22629 s1 := or.Args[1] 22630 if s1.Op != OpS390XSLDconst { 22631 break 22632 } 22633 j1 := s1.AuxInt 22634 x1 := s1.Args[0] 22635 if x1.Op != OpS390XMOVBZloadidx { 22636 break 22637 } 22638 i1 := x1.AuxInt 22639 s := x1.Aux 22640 _ = x1.Args[2] 22641 p := x1.Args[0] 22642 idx := x1.Args[1] 22643 mem := x1.Args[2] 22644 s0 := v.Args[1] 22645 if s0.Op != OpS390XSLDconst { 22646 break 22647 } 22648 j0 := s0.AuxInt 22649 x0 := s0.Args[0] 22650 if x0.Op != OpS390XMOVBZloadidx { 22651 break 22652 } 22653 i0 := x0.AuxInt 22654 if x0.Aux != s { 22655 break 22656 } 22657 _ = x0.Args[2] 22658 if p != x0.Args[0] { 22659 break 22660 } 22661 if idx != x0.Args[1] { 22662 break 22663 } 22664 if mem != x0.Args[2] { 22665 break 22666 } 22667 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)) { 22668 break 22669 } 22670 b = mergePoint(b, x0, x1) 22671 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22672 v.reset(OpCopy) 22673 v.AddArg(v0) 22674 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22675 v1.AuxInt = j1 22676 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22677 v2.AuxInt = i0 22678 v2.Aux = s 22679 v2.AddArg(p) 22680 v2.AddArg(idx) 22681 v2.AddArg(mem) 22682 v1.AddArg(v2) 22683 v0.AddArg(v1) 22684 v0.AddArg(y) 22685 return true 22686 } 22687 return false 22688 } 22689 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 22690 b := v.Block 22691 _ = b 22692 typ := &b.Func.Config.Types 22693 _ = typ 22694 // 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))) 22695 // 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) 22696 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22697 for { 22698 _ = v.Args[1] 22699 or := v.Args[0] 22700 if or.Op != OpS390XOR { 22701 break 22702 } 22703 _ = or.Args[1] 22704 y := or.Args[0] 22705 s1 := or.Args[1] 22706 if s1.Op != OpS390XSLDconst { 22707 break 22708 } 22709 j1 := s1.AuxInt 22710 x1 := s1.Args[0] 22711 if x1.Op != OpS390XMOVBZloadidx { 22712 break 22713 } 22714 i1 := x1.AuxInt 22715 s := x1.Aux 22716 _ = x1.Args[2] 22717 idx := x1.Args[0] 22718 p := x1.Args[1] 22719 mem := x1.Args[2] 22720 s0 := v.Args[1] 22721 if s0.Op != OpS390XSLDconst { 22722 break 22723 } 22724 j0 := s0.AuxInt 22725 x0 := s0.Args[0] 22726 if x0.Op != OpS390XMOVBZloadidx { 22727 break 22728 } 22729 i0 := x0.AuxInt 22730 if x0.Aux != s { 22731 break 22732 } 22733 _ = x0.Args[2] 22734 if p != x0.Args[0] { 22735 break 22736 } 22737 if idx != x0.Args[1] { 22738 break 22739 } 22740 if mem != x0.Args[2] { 22741 break 22742 } 22743 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22744 break 22745 } 22746 b = mergePoint(b, x0, x1) 22747 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22748 v.reset(OpCopy) 22749 v.AddArg(v0) 22750 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22751 v1.AuxInt = j1 22752 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22753 v2.AuxInt = i0 22754 v2.Aux = s 22755 v2.AddArg(p) 22756 v2.AddArg(idx) 22757 v2.AddArg(mem) 22758 v1.AddArg(v2) 22759 v0.AddArg(v1) 22760 v0.AddArg(y) 22761 return true 22762 } 22763 // 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))) 22764 // 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) 22765 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22766 for { 22767 _ = v.Args[1] 22768 or := v.Args[0] 22769 if or.Op != OpS390XOR { 22770 break 22771 } 22772 _ = or.Args[1] 22773 s1 := or.Args[0] 22774 if s1.Op != OpS390XSLDconst { 22775 break 22776 } 22777 j1 := s1.AuxInt 22778 x1 := s1.Args[0] 22779 if x1.Op != OpS390XMOVBZloadidx { 22780 break 22781 } 22782 i1 := x1.AuxInt 22783 s := x1.Aux 22784 _ = x1.Args[2] 22785 p := x1.Args[0] 22786 idx := x1.Args[1] 22787 mem := x1.Args[2] 22788 y := or.Args[1] 22789 s0 := v.Args[1] 22790 if s0.Op != OpS390XSLDconst { 22791 break 22792 } 22793 j0 := s0.AuxInt 22794 x0 := s0.Args[0] 22795 if x0.Op != OpS390XMOVBZloadidx { 22796 break 22797 } 22798 i0 := x0.AuxInt 22799 if x0.Aux != s { 22800 break 22801 } 22802 _ = x0.Args[2] 22803 if idx != x0.Args[0] { 22804 break 22805 } 22806 if p != x0.Args[1] { 22807 break 22808 } 22809 if mem != x0.Args[2] { 22810 break 22811 } 22812 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)) { 22813 break 22814 } 22815 b = mergePoint(b, x0, x1) 22816 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22817 v.reset(OpCopy) 22818 v.AddArg(v0) 22819 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22820 v1.AuxInt = j1 22821 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22822 v2.AuxInt = i0 22823 v2.Aux = s 22824 v2.AddArg(p) 22825 v2.AddArg(idx) 22826 v2.AddArg(mem) 22827 v1.AddArg(v2) 22828 v0.AddArg(v1) 22829 v0.AddArg(y) 22830 return true 22831 } 22832 // 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))) 22833 // 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) 22834 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22835 for { 22836 _ = v.Args[1] 22837 or := v.Args[0] 22838 if or.Op != OpS390XOR { 22839 break 22840 } 22841 _ = or.Args[1] 22842 s1 := or.Args[0] 22843 if s1.Op != OpS390XSLDconst { 22844 break 22845 } 22846 j1 := s1.AuxInt 22847 x1 := s1.Args[0] 22848 if x1.Op != OpS390XMOVBZloadidx { 22849 break 22850 } 22851 i1 := x1.AuxInt 22852 s := x1.Aux 22853 _ = x1.Args[2] 22854 idx := x1.Args[0] 22855 p := x1.Args[1] 22856 mem := x1.Args[2] 22857 y := or.Args[1] 22858 s0 := v.Args[1] 22859 if s0.Op != OpS390XSLDconst { 22860 break 22861 } 22862 j0 := s0.AuxInt 22863 x0 := s0.Args[0] 22864 if x0.Op != OpS390XMOVBZloadidx { 22865 break 22866 } 22867 i0 := x0.AuxInt 22868 if x0.Aux != s { 22869 break 22870 } 22871 _ = x0.Args[2] 22872 if idx != x0.Args[0] { 22873 break 22874 } 22875 if p != x0.Args[1] { 22876 break 22877 } 22878 if mem != x0.Args[2] { 22879 break 22880 } 22881 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)) { 22882 break 22883 } 22884 b = mergePoint(b, x0, x1) 22885 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22886 v.reset(OpCopy) 22887 v.AddArg(v0) 22888 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22889 v1.AuxInt = j1 22890 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22891 v2.AuxInt = i0 22892 v2.Aux = s 22893 v2.AddArg(p) 22894 v2.AddArg(idx) 22895 v2.AddArg(mem) 22896 v1.AddArg(v2) 22897 v0.AddArg(v1) 22898 v0.AddArg(y) 22899 return true 22900 } 22901 // 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))) 22902 // 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) 22903 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22904 for { 22905 _ = v.Args[1] 22906 or := v.Args[0] 22907 if or.Op != OpS390XOR { 22908 break 22909 } 22910 _ = or.Args[1] 22911 y := or.Args[0] 22912 s1 := or.Args[1] 22913 if s1.Op != OpS390XSLDconst { 22914 break 22915 } 22916 j1 := s1.AuxInt 22917 x1 := s1.Args[0] 22918 if x1.Op != OpS390XMOVBZloadidx { 22919 break 22920 } 22921 i1 := x1.AuxInt 22922 s := x1.Aux 22923 _ = x1.Args[2] 22924 p := x1.Args[0] 22925 idx := x1.Args[1] 22926 mem := x1.Args[2] 22927 s0 := v.Args[1] 22928 if s0.Op != OpS390XSLDconst { 22929 break 22930 } 22931 j0 := s0.AuxInt 22932 x0 := s0.Args[0] 22933 if x0.Op != OpS390XMOVBZloadidx { 22934 break 22935 } 22936 i0 := x0.AuxInt 22937 if x0.Aux != s { 22938 break 22939 } 22940 _ = x0.Args[2] 22941 if idx != x0.Args[0] { 22942 break 22943 } 22944 if p != x0.Args[1] { 22945 break 22946 } 22947 if mem != x0.Args[2] { 22948 break 22949 } 22950 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)) { 22951 break 22952 } 22953 b = mergePoint(b, x0, x1) 22954 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22955 v.reset(OpCopy) 22956 v.AddArg(v0) 22957 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22958 v1.AuxInt = j1 22959 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 22960 v2.AuxInt = i0 22961 v2.Aux = s 22962 v2.AddArg(p) 22963 v2.AddArg(idx) 22964 v2.AddArg(mem) 22965 v1.AddArg(v2) 22966 v0.AddArg(v1) 22967 v0.AddArg(y) 22968 return true 22969 } 22970 // 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))) 22971 // 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) 22972 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22973 for { 22974 _ = v.Args[1] 22975 or := v.Args[0] 22976 if or.Op != OpS390XOR { 22977 break 22978 } 22979 _ = or.Args[1] 22980 y := or.Args[0] 22981 s1 := or.Args[1] 22982 if s1.Op != OpS390XSLDconst { 22983 break 22984 } 22985 j1 := s1.AuxInt 22986 x1 := s1.Args[0] 22987 if x1.Op != OpS390XMOVBZloadidx { 22988 break 22989 } 22990 i1 := x1.AuxInt 22991 s := x1.Aux 22992 _ = x1.Args[2] 22993 idx := x1.Args[0] 22994 p := x1.Args[1] 22995 mem := x1.Args[2] 22996 s0 := v.Args[1] 22997 if s0.Op != OpS390XSLDconst { 22998 break 22999 } 23000 j0 := s0.AuxInt 23001 x0 := s0.Args[0] 23002 if x0.Op != OpS390XMOVBZloadidx { 23003 break 23004 } 23005 i0 := x0.AuxInt 23006 if x0.Aux != s { 23007 break 23008 } 23009 _ = x0.Args[2] 23010 if idx != x0.Args[0] { 23011 break 23012 } 23013 if p != x0.Args[1] { 23014 break 23015 } 23016 if mem != x0.Args[2] { 23017 break 23018 } 23019 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)) { 23020 break 23021 } 23022 b = mergePoint(b, x0, x1) 23023 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23024 v.reset(OpCopy) 23025 v.AddArg(v0) 23026 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23027 v1.AuxInt = j1 23028 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 23029 v2.AuxInt = i0 23030 v2.Aux = s 23031 v2.AddArg(p) 23032 v2.AddArg(idx) 23033 v2.AddArg(mem) 23034 v1.AddArg(v2) 23035 v0.AddArg(v1) 23036 v0.AddArg(y) 23037 return true 23038 } 23039 // 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)) 23040 // 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) 23041 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23042 for { 23043 _ = v.Args[1] 23044 s0 := v.Args[0] 23045 if s0.Op != OpS390XSLDconst { 23046 break 23047 } 23048 j0 := s0.AuxInt 23049 x0 := s0.Args[0] 23050 if x0.Op != OpS390XMOVHZloadidx { 23051 break 23052 } 23053 i0 := x0.AuxInt 23054 s := x0.Aux 23055 _ = x0.Args[2] 23056 p := x0.Args[0] 23057 idx := x0.Args[1] 23058 mem := x0.Args[2] 23059 or := v.Args[1] 23060 if or.Op != OpS390XOR { 23061 break 23062 } 23063 _ = or.Args[1] 23064 s1 := or.Args[0] 23065 if s1.Op != OpS390XSLDconst { 23066 break 23067 } 23068 j1 := s1.AuxInt 23069 x1 := s1.Args[0] 23070 if x1.Op != OpS390XMOVHZloadidx { 23071 break 23072 } 23073 i1 := x1.AuxInt 23074 if x1.Aux != s { 23075 break 23076 } 23077 _ = x1.Args[2] 23078 if p != x1.Args[0] { 23079 break 23080 } 23081 if idx != x1.Args[1] { 23082 break 23083 } 23084 if mem != x1.Args[2] { 23085 break 23086 } 23087 y := or.Args[1] 23088 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)) { 23089 break 23090 } 23091 b = mergePoint(b, x0, x1) 23092 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23093 v.reset(OpCopy) 23094 v.AddArg(v0) 23095 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23096 v1.AuxInt = j1 23097 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23098 v2.AuxInt = i0 23099 v2.Aux = s 23100 v2.AddArg(p) 23101 v2.AddArg(idx) 23102 v2.AddArg(mem) 23103 v1.AddArg(v2) 23104 v0.AddArg(v1) 23105 v0.AddArg(y) 23106 return true 23107 } 23108 // 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)) 23109 // 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) 23110 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23111 for { 23112 _ = v.Args[1] 23113 s0 := v.Args[0] 23114 if s0.Op != OpS390XSLDconst { 23115 break 23116 } 23117 j0 := s0.AuxInt 23118 x0 := s0.Args[0] 23119 if x0.Op != OpS390XMOVHZloadidx { 23120 break 23121 } 23122 i0 := x0.AuxInt 23123 s := x0.Aux 23124 _ = x0.Args[2] 23125 idx := x0.Args[0] 23126 p := x0.Args[1] 23127 mem := x0.Args[2] 23128 or := v.Args[1] 23129 if or.Op != OpS390XOR { 23130 break 23131 } 23132 _ = or.Args[1] 23133 s1 := or.Args[0] 23134 if s1.Op != OpS390XSLDconst { 23135 break 23136 } 23137 j1 := s1.AuxInt 23138 x1 := s1.Args[0] 23139 if x1.Op != OpS390XMOVHZloadidx { 23140 break 23141 } 23142 i1 := x1.AuxInt 23143 if x1.Aux != s { 23144 break 23145 } 23146 _ = x1.Args[2] 23147 if p != x1.Args[0] { 23148 break 23149 } 23150 if idx != x1.Args[1] { 23151 break 23152 } 23153 if mem != x1.Args[2] { 23154 break 23155 } 23156 y := or.Args[1] 23157 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)) { 23158 break 23159 } 23160 b = mergePoint(b, x0, x1) 23161 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23162 v.reset(OpCopy) 23163 v.AddArg(v0) 23164 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23165 v1.AuxInt = j1 23166 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23167 v2.AuxInt = i0 23168 v2.Aux = s 23169 v2.AddArg(p) 23170 v2.AddArg(idx) 23171 v2.AddArg(mem) 23172 v1.AddArg(v2) 23173 v0.AddArg(v1) 23174 v0.AddArg(y) 23175 return true 23176 } 23177 // 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)) 23178 // 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) 23179 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23180 for { 23181 _ = v.Args[1] 23182 s0 := v.Args[0] 23183 if s0.Op != OpS390XSLDconst { 23184 break 23185 } 23186 j0 := s0.AuxInt 23187 x0 := s0.Args[0] 23188 if x0.Op != OpS390XMOVHZloadidx { 23189 break 23190 } 23191 i0 := x0.AuxInt 23192 s := x0.Aux 23193 _ = x0.Args[2] 23194 p := x0.Args[0] 23195 idx := x0.Args[1] 23196 mem := x0.Args[2] 23197 or := v.Args[1] 23198 if or.Op != OpS390XOR { 23199 break 23200 } 23201 _ = or.Args[1] 23202 s1 := or.Args[0] 23203 if s1.Op != OpS390XSLDconst { 23204 break 23205 } 23206 j1 := s1.AuxInt 23207 x1 := s1.Args[0] 23208 if x1.Op != OpS390XMOVHZloadidx { 23209 break 23210 } 23211 i1 := x1.AuxInt 23212 if x1.Aux != s { 23213 break 23214 } 23215 _ = x1.Args[2] 23216 if idx != x1.Args[0] { 23217 break 23218 } 23219 if p != x1.Args[1] { 23220 break 23221 } 23222 if mem != x1.Args[2] { 23223 break 23224 } 23225 y := or.Args[1] 23226 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)) { 23227 break 23228 } 23229 b = mergePoint(b, x0, x1) 23230 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23231 v.reset(OpCopy) 23232 v.AddArg(v0) 23233 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23234 v1.AuxInt = j1 23235 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23236 v2.AuxInt = i0 23237 v2.Aux = s 23238 v2.AddArg(p) 23239 v2.AddArg(idx) 23240 v2.AddArg(mem) 23241 v1.AddArg(v2) 23242 v0.AddArg(v1) 23243 v0.AddArg(y) 23244 return true 23245 } 23246 // 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)) 23247 // 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) 23248 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23249 for { 23250 _ = v.Args[1] 23251 s0 := v.Args[0] 23252 if s0.Op != OpS390XSLDconst { 23253 break 23254 } 23255 j0 := s0.AuxInt 23256 x0 := s0.Args[0] 23257 if x0.Op != OpS390XMOVHZloadidx { 23258 break 23259 } 23260 i0 := x0.AuxInt 23261 s := x0.Aux 23262 _ = x0.Args[2] 23263 idx := x0.Args[0] 23264 p := x0.Args[1] 23265 mem := x0.Args[2] 23266 or := v.Args[1] 23267 if or.Op != OpS390XOR { 23268 break 23269 } 23270 _ = or.Args[1] 23271 s1 := or.Args[0] 23272 if s1.Op != OpS390XSLDconst { 23273 break 23274 } 23275 j1 := s1.AuxInt 23276 x1 := s1.Args[0] 23277 if x1.Op != OpS390XMOVHZloadidx { 23278 break 23279 } 23280 i1 := x1.AuxInt 23281 if x1.Aux != s { 23282 break 23283 } 23284 _ = x1.Args[2] 23285 if idx != x1.Args[0] { 23286 break 23287 } 23288 if p != x1.Args[1] { 23289 break 23290 } 23291 if mem != x1.Args[2] { 23292 break 23293 } 23294 y := or.Args[1] 23295 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)) { 23296 break 23297 } 23298 b = mergePoint(b, x0, x1) 23299 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23300 v.reset(OpCopy) 23301 v.AddArg(v0) 23302 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23303 v1.AuxInt = j1 23304 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23305 v2.AuxInt = i0 23306 v2.Aux = s 23307 v2.AddArg(p) 23308 v2.AddArg(idx) 23309 v2.AddArg(mem) 23310 v1.AddArg(v2) 23311 v0.AddArg(v1) 23312 v0.AddArg(y) 23313 return true 23314 } 23315 // 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)))) 23316 // 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) 23317 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23318 for { 23319 _ = v.Args[1] 23320 s0 := v.Args[0] 23321 if s0.Op != OpS390XSLDconst { 23322 break 23323 } 23324 j0 := s0.AuxInt 23325 x0 := s0.Args[0] 23326 if x0.Op != OpS390XMOVHZloadidx { 23327 break 23328 } 23329 i0 := x0.AuxInt 23330 s := x0.Aux 23331 _ = x0.Args[2] 23332 p := x0.Args[0] 23333 idx := x0.Args[1] 23334 mem := x0.Args[2] 23335 or := v.Args[1] 23336 if or.Op != OpS390XOR { 23337 break 23338 } 23339 _ = or.Args[1] 23340 y := or.Args[0] 23341 s1 := or.Args[1] 23342 if s1.Op != OpS390XSLDconst { 23343 break 23344 } 23345 j1 := s1.AuxInt 23346 x1 := s1.Args[0] 23347 if x1.Op != OpS390XMOVHZloadidx { 23348 break 23349 } 23350 i1 := x1.AuxInt 23351 if x1.Aux != s { 23352 break 23353 } 23354 _ = x1.Args[2] 23355 if p != x1.Args[0] { 23356 break 23357 } 23358 if idx != x1.Args[1] { 23359 break 23360 } 23361 if mem != x1.Args[2] { 23362 break 23363 } 23364 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)) { 23365 break 23366 } 23367 b = mergePoint(b, x0, x1) 23368 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23369 v.reset(OpCopy) 23370 v.AddArg(v0) 23371 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23372 v1.AuxInt = j1 23373 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23374 v2.AuxInt = i0 23375 v2.Aux = s 23376 v2.AddArg(p) 23377 v2.AddArg(idx) 23378 v2.AddArg(mem) 23379 v1.AddArg(v2) 23380 v0.AddArg(v1) 23381 v0.AddArg(y) 23382 return true 23383 } 23384 return false 23385 } 23386 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 23387 b := v.Block 23388 _ = b 23389 typ := &b.Func.Config.Types 23390 _ = typ 23391 // 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)))) 23392 // 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) 23393 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23394 for { 23395 _ = v.Args[1] 23396 s0 := v.Args[0] 23397 if s0.Op != OpS390XSLDconst { 23398 break 23399 } 23400 j0 := s0.AuxInt 23401 x0 := s0.Args[0] 23402 if x0.Op != OpS390XMOVHZloadidx { 23403 break 23404 } 23405 i0 := x0.AuxInt 23406 s := x0.Aux 23407 _ = x0.Args[2] 23408 idx := x0.Args[0] 23409 p := x0.Args[1] 23410 mem := x0.Args[2] 23411 or := v.Args[1] 23412 if or.Op != OpS390XOR { 23413 break 23414 } 23415 _ = or.Args[1] 23416 y := or.Args[0] 23417 s1 := or.Args[1] 23418 if s1.Op != OpS390XSLDconst { 23419 break 23420 } 23421 j1 := s1.AuxInt 23422 x1 := s1.Args[0] 23423 if x1.Op != OpS390XMOVHZloadidx { 23424 break 23425 } 23426 i1 := x1.AuxInt 23427 if x1.Aux != s { 23428 break 23429 } 23430 _ = x1.Args[2] 23431 if p != x1.Args[0] { 23432 break 23433 } 23434 if idx != x1.Args[1] { 23435 break 23436 } 23437 if mem != x1.Args[2] { 23438 break 23439 } 23440 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)) { 23441 break 23442 } 23443 b = mergePoint(b, x0, x1) 23444 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23445 v.reset(OpCopy) 23446 v.AddArg(v0) 23447 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23448 v1.AuxInt = j1 23449 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23450 v2.AuxInt = i0 23451 v2.Aux = s 23452 v2.AddArg(p) 23453 v2.AddArg(idx) 23454 v2.AddArg(mem) 23455 v1.AddArg(v2) 23456 v0.AddArg(v1) 23457 v0.AddArg(y) 23458 return true 23459 } 23460 // 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)))) 23461 // 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) 23462 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23463 for { 23464 _ = v.Args[1] 23465 s0 := v.Args[0] 23466 if s0.Op != OpS390XSLDconst { 23467 break 23468 } 23469 j0 := s0.AuxInt 23470 x0 := s0.Args[0] 23471 if x0.Op != OpS390XMOVHZloadidx { 23472 break 23473 } 23474 i0 := x0.AuxInt 23475 s := x0.Aux 23476 _ = x0.Args[2] 23477 p := x0.Args[0] 23478 idx := x0.Args[1] 23479 mem := x0.Args[2] 23480 or := v.Args[1] 23481 if or.Op != OpS390XOR { 23482 break 23483 } 23484 _ = or.Args[1] 23485 y := or.Args[0] 23486 s1 := or.Args[1] 23487 if s1.Op != OpS390XSLDconst { 23488 break 23489 } 23490 j1 := s1.AuxInt 23491 x1 := s1.Args[0] 23492 if x1.Op != OpS390XMOVHZloadidx { 23493 break 23494 } 23495 i1 := x1.AuxInt 23496 if x1.Aux != s { 23497 break 23498 } 23499 _ = x1.Args[2] 23500 if idx != x1.Args[0] { 23501 break 23502 } 23503 if p != x1.Args[1] { 23504 break 23505 } 23506 if mem != x1.Args[2] { 23507 break 23508 } 23509 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)) { 23510 break 23511 } 23512 b = mergePoint(b, x0, x1) 23513 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23514 v.reset(OpCopy) 23515 v.AddArg(v0) 23516 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23517 v1.AuxInt = j1 23518 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23519 v2.AuxInt = i0 23520 v2.Aux = s 23521 v2.AddArg(p) 23522 v2.AddArg(idx) 23523 v2.AddArg(mem) 23524 v1.AddArg(v2) 23525 v0.AddArg(v1) 23526 v0.AddArg(y) 23527 return true 23528 } 23529 // 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)))) 23530 // 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) 23531 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23532 for { 23533 _ = v.Args[1] 23534 s0 := v.Args[0] 23535 if s0.Op != OpS390XSLDconst { 23536 break 23537 } 23538 j0 := s0.AuxInt 23539 x0 := s0.Args[0] 23540 if x0.Op != OpS390XMOVHZloadidx { 23541 break 23542 } 23543 i0 := x0.AuxInt 23544 s := x0.Aux 23545 _ = x0.Args[2] 23546 idx := x0.Args[0] 23547 p := x0.Args[1] 23548 mem := x0.Args[2] 23549 or := v.Args[1] 23550 if or.Op != OpS390XOR { 23551 break 23552 } 23553 _ = or.Args[1] 23554 y := or.Args[0] 23555 s1 := or.Args[1] 23556 if s1.Op != OpS390XSLDconst { 23557 break 23558 } 23559 j1 := s1.AuxInt 23560 x1 := s1.Args[0] 23561 if x1.Op != OpS390XMOVHZloadidx { 23562 break 23563 } 23564 i1 := x1.AuxInt 23565 if x1.Aux != s { 23566 break 23567 } 23568 _ = x1.Args[2] 23569 if idx != x1.Args[0] { 23570 break 23571 } 23572 if p != x1.Args[1] { 23573 break 23574 } 23575 if mem != x1.Args[2] { 23576 break 23577 } 23578 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)) { 23579 break 23580 } 23581 b = mergePoint(b, x0, x1) 23582 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23583 v.reset(OpCopy) 23584 v.AddArg(v0) 23585 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23586 v1.AuxInt = j1 23587 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23588 v2.AuxInt = i0 23589 v2.Aux = s 23590 v2.AddArg(p) 23591 v2.AddArg(idx) 23592 v2.AddArg(mem) 23593 v1.AddArg(v2) 23594 v0.AddArg(v1) 23595 v0.AddArg(y) 23596 return true 23597 } 23598 // 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))) 23599 // 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) 23600 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23601 for { 23602 _ = v.Args[1] 23603 or := v.Args[0] 23604 if or.Op != OpS390XOR { 23605 break 23606 } 23607 _ = or.Args[1] 23608 s1 := or.Args[0] 23609 if s1.Op != OpS390XSLDconst { 23610 break 23611 } 23612 j1 := s1.AuxInt 23613 x1 := s1.Args[0] 23614 if x1.Op != OpS390XMOVHZloadidx { 23615 break 23616 } 23617 i1 := x1.AuxInt 23618 s := x1.Aux 23619 _ = x1.Args[2] 23620 p := x1.Args[0] 23621 idx := x1.Args[1] 23622 mem := x1.Args[2] 23623 y := or.Args[1] 23624 s0 := v.Args[1] 23625 if s0.Op != OpS390XSLDconst { 23626 break 23627 } 23628 j0 := s0.AuxInt 23629 x0 := s0.Args[0] 23630 if x0.Op != OpS390XMOVHZloadidx { 23631 break 23632 } 23633 i0 := x0.AuxInt 23634 if x0.Aux != s { 23635 break 23636 } 23637 _ = x0.Args[2] 23638 if p != x0.Args[0] { 23639 break 23640 } 23641 if idx != x0.Args[1] { 23642 break 23643 } 23644 if mem != x0.Args[2] { 23645 break 23646 } 23647 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)) { 23648 break 23649 } 23650 b = mergePoint(b, x0, x1) 23651 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23652 v.reset(OpCopy) 23653 v.AddArg(v0) 23654 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23655 v1.AuxInt = j1 23656 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23657 v2.AuxInt = i0 23658 v2.Aux = s 23659 v2.AddArg(p) 23660 v2.AddArg(idx) 23661 v2.AddArg(mem) 23662 v1.AddArg(v2) 23663 v0.AddArg(v1) 23664 v0.AddArg(y) 23665 return true 23666 } 23667 // 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))) 23668 // 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) 23669 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23670 for { 23671 _ = v.Args[1] 23672 or := v.Args[0] 23673 if or.Op != OpS390XOR { 23674 break 23675 } 23676 _ = or.Args[1] 23677 s1 := or.Args[0] 23678 if s1.Op != OpS390XSLDconst { 23679 break 23680 } 23681 j1 := s1.AuxInt 23682 x1 := s1.Args[0] 23683 if x1.Op != OpS390XMOVHZloadidx { 23684 break 23685 } 23686 i1 := x1.AuxInt 23687 s := x1.Aux 23688 _ = x1.Args[2] 23689 idx := x1.Args[0] 23690 p := x1.Args[1] 23691 mem := x1.Args[2] 23692 y := or.Args[1] 23693 s0 := v.Args[1] 23694 if s0.Op != OpS390XSLDconst { 23695 break 23696 } 23697 j0 := s0.AuxInt 23698 x0 := s0.Args[0] 23699 if x0.Op != OpS390XMOVHZloadidx { 23700 break 23701 } 23702 i0 := x0.AuxInt 23703 if x0.Aux != s { 23704 break 23705 } 23706 _ = x0.Args[2] 23707 if p != x0.Args[0] { 23708 break 23709 } 23710 if idx != x0.Args[1] { 23711 break 23712 } 23713 if mem != x0.Args[2] { 23714 break 23715 } 23716 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)) { 23717 break 23718 } 23719 b = mergePoint(b, x0, x1) 23720 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23721 v.reset(OpCopy) 23722 v.AddArg(v0) 23723 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23724 v1.AuxInt = j1 23725 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23726 v2.AuxInt = i0 23727 v2.Aux = s 23728 v2.AddArg(p) 23729 v2.AddArg(idx) 23730 v2.AddArg(mem) 23731 v1.AddArg(v2) 23732 v0.AddArg(v1) 23733 v0.AddArg(y) 23734 return true 23735 } 23736 // 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))) 23737 // 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) 23738 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23739 for { 23740 _ = v.Args[1] 23741 or := v.Args[0] 23742 if or.Op != OpS390XOR { 23743 break 23744 } 23745 _ = or.Args[1] 23746 y := or.Args[0] 23747 s1 := or.Args[1] 23748 if s1.Op != OpS390XSLDconst { 23749 break 23750 } 23751 j1 := s1.AuxInt 23752 x1 := s1.Args[0] 23753 if x1.Op != OpS390XMOVHZloadidx { 23754 break 23755 } 23756 i1 := x1.AuxInt 23757 s := x1.Aux 23758 _ = x1.Args[2] 23759 p := x1.Args[0] 23760 idx := x1.Args[1] 23761 mem := x1.Args[2] 23762 s0 := v.Args[1] 23763 if s0.Op != OpS390XSLDconst { 23764 break 23765 } 23766 j0 := s0.AuxInt 23767 x0 := s0.Args[0] 23768 if x0.Op != OpS390XMOVHZloadidx { 23769 break 23770 } 23771 i0 := x0.AuxInt 23772 if x0.Aux != s { 23773 break 23774 } 23775 _ = x0.Args[2] 23776 if p != x0.Args[0] { 23777 break 23778 } 23779 if idx != x0.Args[1] { 23780 break 23781 } 23782 if mem != x0.Args[2] { 23783 break 23784 } 23785 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)) { 23786 break 23787 } 23788 b = mergePoint(b, x0, x1) 23789 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23790 v.reset(OpCopy) 23791 v.AddArg(v0) 23792 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23793 v1.AuxInt = j1 23794 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23795 v2.AuxInt = i0 23796 v2.Aux = s 23797 v2.AddArg(p) 23798 v2.AddArg(idx) 23799 v2.AddArg(mem) 23800 v1.AddArg(v2) 23801 v0.AddArg(v1) 23802 v0.AddArg(y) 23803 return true 23804 } 23805 // 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))) 23806 // 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) 23807 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23808 for { 23809 _ = v.Args[1] 23810 or := v.Args[0] 23811 if or.Op != OpS390XOR { 23812 break 23813 } 23814 _ = or.Args[1] 23815 y := or.Args[0] 23816 s1 := or.Args[1] 23817 if s1.Op != OpS390XSLDconst { 23818 break 23819 } 23820 j1 := s1.AuxInt 23821 x1 := s1.Args[0] 23822 if x1.Op != OpS390XMOVHZloadidx { 23823 break 23824 } 23825 i1 := x1.AuxInt 23826 s := x1.Aux 23827 _ = x1.Args[2] 23828 idx := x1.Args[0] 23829 p := x1.Args[1] 23830 mem := x1.Args[2] 23831 s0 := v.Args[1] 23832 if s0.Op != OpS390XSLDconst { 23833 break 23834 } 23835 j0 := s0.AuxInt 23836 x0 := s0.Args[0] 23837 if x0.Op != OpS390XMOVHZloadidx { 23838 break 23839 } 23840 i0 := x0.AuxInt 23841 if x0.Aux != s { 23842 break 23843 } 23844 _ = x0.Args[2] 23845 if p != x0.Args[0] { 23846 break 23847 } 23848 if idx != x0.Args[1] { 23849 break 23850 } 23851 if mem != x0.Args[2] { 23852 break 23853 } 23854 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)) { 23855 break 23856 } 23857 b = mergePoint(b, x0, x1) 23858 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23859 v.reset(OpCopy) 23860 v.AddArg(v0) 23861 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23862 v1.AuxInt = j1 23863 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23864 v2.AuxInt = i0 23865 v2.Aux = s 23866 v2.AddArg(p) 23867 v2.AddArg(idx) 23868 v2.AddArg(mem) 23869 v1.AddArg(v2) 23870 v0.AddArg(v1) 23871 v0.AddArg(y) 23872 return true 23873 } 23874 // 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))) 23875 // 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) 23876 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23877 for { 23878 _ = v.Args[1] 23879 or := v.Args[0] 23880 if or.Op != OpS390XOR { 23881 break 23882 } 23883 _ = or.Args[1] 23884 s1 := or.Args[0] 23885 if s1.Op != OpS390XSLDconst { 23886 break 23887 } 23888 j1 := s1.AuxInt 23889 x1 := s1.Args[0] 23890 if x1.Op != OpS390XMOVHZloadidx { 23891 break 23892 } 23893 i1 := x1.AuxInt 23894 s := x1.Aux 23895 _ = x1.Args[2] 23896 p := x1.Args[0] 23897 idx := x1.Args[1] 23898 mem := x1.Args[2] 23899 y := or.Args[1] 23900 s0 := v.Args[1] 23901 if s0.Op != OpS390XSLDconst { 23902 break 23903 } 23904 j0 := s0.AuxInt 23905 x0 := s0.Args[0] 23906 if x0.Op != OpS390XMOVHZloadidx { 23907 break 23908 } 23909 i0 := x0.AuxInt 23910 if x0.Aux != s { 23911 break 23912 } 23913 _ = x0.Args[2] 23914 if idx != x0.Args[0] { 23915 break 23916 } 23917 if p != x0.Args[1] { 23918 break 23919 } 23920 if mem != x0.Args[2] { 23921 break 23922 } 23923 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)) { 23924 break 23925 } 23926 b = mergePoint(b, x0, x1) 23927 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23928 v.reset(OpCopy) 23929 v.AddArg(v0) 23930 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23931 v1.AuxInt = j1 23932 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 23933 v2.AuxInt = i0 23934 v2.Aux = s 23935 v2.AddArg(p) 23936 v2.AddArg(idx) 23937 v2.AddArg(mem) 23938 v1.AddArg(v2) 23939 v0.AddArg(v1) 23940 v0.AddArg(y) 23941 return true 23942 } 23943 // 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))) 23944 // 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) 23945 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23946 for { 23947 _ = v.Args[1] 23948 or := v.Args[0] 23949 if or.Op != OpS390XOR { 23950 break 23951 } 23952 _ = or.Args[1] 23953 s1 := or.Args[0] 23954 if s1.Op != OpS390XSLDconst { 23955 break 23956 } 23957 j1 := s1.AuxInt 23958 x1 := s1.Args[0] 23959 if x1.Op != OpS390XMOVHZloadidx { 23960 break 23961 } 23962 i1 := x1.AuxInt 23963 s := x1.Aux 23964 _ = x1.Args[2] 23965 idx := x1.Args[0] 23966 p := x1.Args[1] 23967 mem := x1.Args[2] 23968 y := or.Args[1] 23969 s0 := v.Args[1] 23970 if s0.Op != OpS390XSLDconst { 23971 break 23972 } 23973 j0 := s0.AuxInt 23974 x0 := s0.Args[0] 23975 if x0.Op != OpS390XMOVHZloadidx { 23976 break 23977 } 23978 i0 := x0.AuxInt 23979 if x0.Aux != s { 23980 break 23981 } 23982 _ = x0.Args[2] 23983 if idx != x0.Args[0] { 23984 break 23985 } 23986 if p != x0.Args[1] { 23987 break 23988 } 23989 if mem != x0.Args[2] { 23990 break 23991 } 23992 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)) { 23993 break 23994 } 23995 b = mergePoint(b, x0, x1) 23996 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23997 v.reset(OpCopy) 23998 v.AddArg(v0) 23999 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24000 v1.AuxInt = j1 24001 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24002 v2.AuxInt = i0 24003 v2.Aux = s 24004 v2.AddArg(p) 24005 v2.AddArg(idx) 24006 v2.AddArg(mem) 24007 v1.AddArg(v2) 24008 v0.AddArg(v1) 24009 v0.AddArg(y) 24010 return true 24011 } 24012 // 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))) 24013 // 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) 24014 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24015 for { 24016 _ = v.Args[1] 24017 or := v.Args[0] 24018 if or.Op != OpS390XOR { 24019 break 24020 } 24021 _ = or.Args[1] 24022 y := or.Args[0] 24023 s1 := or.Args[1] 24024 if s1.Op != OpS390XSLDconst { 24025 break 24026 } 24027 j1 := s1.AuxInt 24028 x1 := s1.Args[0] 24029 if x1.Op != OpS390XMOVHZloadidx { 24030 break 24031 } 24032 i1 := x1.AuxInt 24033 s := x1.Aux 24034 _ = x1.Args[2] 24035 p := x1.Args[0] 24036 idx := x1.Args[1] 24037 mem := x1.Args[2] 24038 s0 := v.Args[1] 24039 if s0.Op != OpS390XSLDconst { 24040 break 24041 } 24042 j0 := s0.AuxInt 24043 x0 := s0.Args[0] 24044 if x0.Op != OpS390XMOVHZloadidx { 24045 break 24046 } 24047 i0 := x0.AuxInt 24048 if x0.Aux != s { 24049 break 24050 } 24051 _ = x0.Args[2] 24052 if idx != x0.Args[0] { 24053 break 24054 } 24055 if p != x0.Args[1] { 24056 break 24057 } 24058 if mem != x0.Args[2] { 24059 break 24060 } 24061 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)) { 24062 break 24063 } 24064 b = mergePoint(b, x0, x1) 24065 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24066 v.reset(OpCopy) 24067 v.AddArg(v0) 24068 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24069 v1.AuxInt = j1 24070 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24071 v2.AuxInt = i0 24072 v2.Aux = s 24073 v2.AddArg(p) 24074 v2.AddArg(idx) 24075 v2.AddArg(mem) 24076 v1.AddArg(v2) 24077 v0.AddArg(v1) 24078 v0.AddArg(y) 24079 return true 24080 } 24081 return false 24082 } 24083 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 24084 b := v.Block 24085 _ = b 24086 typ := &b.Func.Config.Types 24087 _ = typ 24088 // 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))) 24089 // 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) 24090 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 24091 for { 24092 _ = v.Args[1] 24093 or := v.Args[0] 24094 if or.Op != OpS390XOR { 24095 break 24096 } 24097 _ = or.Args[1] 24098 y := or.Args[0] 24099 s1 := or.Args[1] 24100 if s1.Op != OpS390XSLDconst { 24101 break 24102 } 24103 j1 := s1.AuxInt 24104 x1 := s1.Args[0] 24105 if x1.Op != OpS390XMOVHZloadidx { 24106 break 24107 } 24108 i1 := x1.AuxInt 24109 s := x1.Aux 24110 _ = x1.Args[2] 24111 idx := x1.Args[0] 24112 p := x1.Args[1] 24113 mem := x1.Args[2] 24114 s0 := v.Args[1] 24115 if s0.Op != OpS390XSLDconst { 24116 break 24117 } 24118 j0 := s0.AuxInt 24119 x0 := s0.Args[0] 24120 if x0.Op != OpS390XMOVHZloadidx { 24121 break 24122 } 24123 i0 := x0.AuxInt 24124 if x0.Aux != s { 24125 break 24126 } 24127 _ = x0.Args[2] 24128 if idx != x0.Args[0] { 24129 break 24130 } 24131 if p != x0.Args[1] { 24132 break 24133 } 24134 if mem != x0.Args[2] { 24135 break 24136 } 24137 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)) { 24138 break 24139 } 24140 b = mergePoint(b, x0, x1) 24141 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24142 v.reset(OpCopy) 24143 v.AddArg(v0) 24144 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24145 v1.AuxInt = j1 24146 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 24147 v2.AuxInt = i0 24148 v2.Aux = s 24149 v2.AddArg(p) 24150 v2.AddArg(idx) 24151 v2.AddArg(mem) 24152 v1.AddArg(v2) 24153 v0.AddArg(v1) 24154 v0.AddArg(y) 24155 return true 24156 } 24157 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 24158 // 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) 24159 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24160 for { 24161 _ = v.Args[1] 24162 x0 := v.Args[0] 24163 if x0.Op != OpS390XMOVBZload { 24164 break 24165 } 24166 i0 := x0.AuxInt 24167 s := x0.Aux 24168 _ = x0.Args[1] 24169 p := x0.Args[0] 24170 mem := x0.Args[1] 24171 sh := v.Args[1] 24172 if sh.Op != OpS390XSLDconst { 24173 break 24174 } 24175 if sh.AuxInt != 8 { 24176 break 24177 } 24178 x1 := sh.Args[0] 24179 if x1.Op != OpS390XMOVBZload { 24180 break 24181 } 24182 i1 := x1.AuxInt 24183 if x1.Aux != s { 24184 break 24185 } 24186 _ = x1.Args[1] 24187 if p != x1.Args[0] { 24188 break 24189 } 24190 if mem != x1.Args[1] { 24191 break 24192 } 24193 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)) { 24194 break 24195 } 24196 b = mergePoint(b, x0, x1) 24197 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24198 v.reset(OpCopy) 24199 v.AddArg(v0) 24200 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24201 v1.AuxInt = i0 24202 v1.Aux = s 24203 v1.AddArg(p) 24204 v1.AddArg(mem) 24205 v0.AddArg(v1) 24206 return true 24207 } 24208 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 24209 // 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) 24210 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 24211 for { 24212 _ = v.Args[1] 24213 sh := v.Args[0] 24214 if sh.Op != OpS390XSLDconst { 24215 break 24216 } 24217 if sh.AuxInt != 8 { 24218 break 24219 } 24220 x1 := sh.Args[0] 24221 if x1.Op != OpS390XMOVBZload { 24222 break 24223 } 24224 i1 := x1.AuxInt 24225 s := x1.Aux 24226 _ = x1.Args[1] 24227 p := x1.Args[0] 24228 mem := x1.Args[1] 24229 x0 := v.Args[1] 24230 if x0.Op != OpS390XMOVBZload { 24231 break 24232 } 24233 i0 := x0.AuxInt 24234 if x0.Aux != s { 24235 break 24236 } 24237 _ = x0.Args[1] 24238 if p != x0.Args[0] { 24239 break 24240 } 24241 if mem != x0.Args[1] { 24242 break 24243 } 24244 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)) { 24245 break 24246 } 24247 b = mergePoint(b, x0, x1) 24248 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24249 v.reset(OpCopy) 24250 v.AddArg(v0) 24251 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24252 v1.AuxInt = i0 24253 v1.Aux = s 24254 v1.AddArg(p) 24255 v1.AddArg(mem) 24256 v0.AddArg(v1) 24257 return true 24258 } 24259 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 24260 // 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) 24261 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24262 for { 24263 _ = v.Args[1] 24264 r0 := v.Args[0] 24265 if r0.Op != OpS390XMOVHZreg { 24266 break 24267 } 24268 x0 := r0.Args[0] 24269 if x0.Op != OpS390XMOVHBRload { 24270 break 24271 } 24272 i0 := x0.AuxInt 24273 s := x0.Aux 24274 _ = x0.Args[1] 24275 p := x0.Args[0] 24276 mem := x0.Args[1] 24277 sh := v.Args[1] 24278 if sh.Op != OpS390XSLDconst { 24279 break 24280 } 24281 if sh.AuxInt != 16 { 24282 break 24283 } 24284 r1 := sh.Args[0] 24285 if r1.Op != OpS390XMOVHZreg { 24286 break 24287 } 24288 x1 := r1.Args[0] 24289 if x1.Op != OpS390XMOVHBRload { 24290 break 24291 } 24292 i1 := x1.AuxInt 24293 if x1.Aux != s { 24294 break 24295 } 24296 _ = x1.Args[1] 24297 if p != x1.Args[0] { 24298 break 24299 } 24300 if mem != x1.Args[1] { 24301 break 24302 } 24303 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)) { 24304 break 24305 } 24306 b = mergePoint(b, x0, x1) 24307 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24308 v.reset(OpCopy) 24309 v.AddArg(v0) 24310 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24311 v1.AuxInt = i0 24312 v1.Aux = s 24313 v1.AddArg(p) 24314 v1.AddArg(mem) 24315 v0.AddArg(v1) 24316 return true 24317 } 24318 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 24319 // 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) 24320 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 24321 for { 24322 _ = v.Args[1] 24323 sh := v.Args[0] 24324 if sh.Op != OpS390XSLDconst { 24325 break 24326 } 24327 if sh.AuxInt != 16 { 24328 break 24329 } 24330 r1 := sh.Args[0] 24331 if r1.Op != OpS390XMOVHZreg { 24332 break 24333 } 24334 x1 := r1.Args[0] 24335 if x1.Op != OpS390XMOVHBRload { 24336 break 24337 } 24338 i1 := x1.AuxInt 24339 s := x1.Aux 24340 _ = x1.Args[1] 24341 p := x1.Args[0] 24342 mem := x1.Args[1] 24343 r0 := v.Args[1] 24344 if r0.Op != OpS390XMOVHZreg { 24345 break 24346 } 24347 x0 := r0.Args[0] 24348 if x0.Op != OpS390XMOVHBRload { 24349 break 24350 } 24351 i0 := x0.AuxInt 24352 if x0.Aux != s { 24353 break 24354 } 24355 _ = x0.Args[1] 24356 if p != x0.Args[0] { 24357 break 24358 } 24359 if mem != x0.Args[1] { 24360 break 24361 } 24362 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)) { 24363 break 24364 } 24365 b = mergePoint(b, x0, x1) 24366 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24367 v.reset(OpCopy) 24368 v.AddArg(v0) 24369 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24370 v1.AuxInt = i0 24371 v1.Aux = s 24372 v1.AddArg(p) 24373 v1.AddArg(mem) 24374 v0.AddArg(v1) 24375 return true 24376 } 24377 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 24378 // 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) 24379 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24380 for { 24381 _ = v.Args[1] 24382 r0 := v.Args[0] 24383 if r0.Op != OpS390XMOVWZreg { 24384 break 24385 } 24386 x0 := r0.Args[0] 24387 if x0.Op != OpS390XMOVWBRload { 24388 break 24389 } 24390 i0 := x0.AuxInt 24391 s := x0.Aux 24392 _ = x0.Args[1] 24393 p := x0.Args[0] 24394 mem := x0.Args[1] 24395 sh := v.Args[1] 24396 if sh.Op != OpS390XSLDconst { 24397 break 24398 } 24399 if sh.AuxInt != 32 { 24400 break 24401 } 24402 r1 := sh.Args[0] 24403 if r1.Op != OpS390XMOVWZreg { 24404 break 24405 } 24406 x1 := r1.Args[0] 24407 if x1.Op != OpS390XMOVWBRload { 24408 break 24409 } 24410 i1 := x1.AuxInt 24411 if x1.Aux != s { 24412 break 24413 } 24414 _ = x1.Args[1] 24415 if p != x1.Args[0] { 24416 break 24417 } 24418 if mem != x1.Args[1] { 24419 break 24420 } 24421 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)) { 24422 break 24423 } 24424 b = mergePoint(b, x0, x1) 24425 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24426 v.reset(OpCopy) 24427 v.AddArg(v0) 24428 v0.AuxInt = i0 24429 v0.Aux = s 24430 v0.AddArg(p) 24431 v0.AddArg(mem) 24432 return true 24433 } 24434 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 24435 // 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) 24436 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 24437 for { 24438 _ = v.Args[1] 24439 sh := v.Args[0] 24440 if sh.Op != OpS390XSLDconst { 24441 break 24442 } 24443 if sh.AuxInt != 32 { 24444 break 24445 } 24446 r1 := sh.Args[0] 24447 if r1.Op != OpS390XMOVWZreg { 24448 break 24449 } 24450 x1 := r1.Args[0] 24451 if x1.Op != OpS390XMOVWBRload { 24452 break 24453 } 24454 i1 := x1.AuxInt 24455 s := x1.Aux 24456 _ = x1.Args[1] 24457 p := x1.Args[0] 24458 mem := x1.Args[1] 24459 r0 := v.Args[1] 24460 if r0.Op != OpS390XMOVWZreg { 24461 break 24462 } 24463 x0 := r0.Args[0] 24464 if x0.Op != OpS390XMOVWBRload { 24465 break 24466 } 24467 i0 := x0.AuxInt 24468 if x0.Aux != s { 24469 break 24470 } 24471 _ = x0.Args[1] 24472 if p != x0.Args[0] { 24473 break 24474 } 24475 if mem != x0.Args[1] { 24476 break 24477 } 24478 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)) { 24479 break 24480 } 24481 b = mergePoint(b, x0, x1) 24482 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, typ.UInt64) 24483 v.reset(OpCopy) 24484 v.AddArg(v0) 24485 v0.AuxInt = i0 24486 v0.Aux = s 24487 v0.AddArg(p) 24488 v0.AddArg(mem) 24489 return true 24490 } 24491 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 24492 // 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) 24493 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24494 for { 24495 _ = v.Args[1] 24496 s1 := v.Args[0] 24497 if s1.Op != OpS390XSLDconst { 24498 break 24499 } 24500 j1 := s1.AuxInt 24501 x1 := s1.Args[0] 24502 if x1.Op != OpS390XMOVBZload { 24503 break 24504 } 24505 i1 := x1.AuxInt 24506 s := x1.Aux 24507 _ = x1.Args[1] 24508 p := x1.Args[0] 24509 mem := x1.Args[1] 24510 or := v.Args[1] 24511 if or.Op != OpS390XOR { 24512 break 24513 } 24514 _ = or.Args[1] 24515 s0 := or.Args[0] 24516 if s0.Op != OpS390XSLDconst { 24517 break 24518 } 24519 j0 := s0.AuxInt 24520 x0 := s0.Args[0] 24521 if x0.Op != OpS390XMOVBZload { 24522 break 24523 } 24524 i0 := x0.AuxInt 24525 if x0.Aux != s { 24526 break 24527 } 24528 _ = x0.Args[1] 24529 if p != x0.Args[0] { 24530 break 24531 } 24532 if mem != x0.Args[1] { 24533 break 24534 } 24535 y := or.Args[1] 24536 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)) { 24537 break 24538 } 24539 b = mergePoint(b, x0, x1) 24540 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24541 v.reset(OpCopy) 24542 v.AddArg(v0) 24543 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24544 v1.AuxInt = j0 24545 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24546 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24547 v3.AuxInt = i0 24548 v3.Aux = s 24549 v3.AddArg(p) 24550 v3.AddArg(mem) 24551 v2.AddArg(v3) 24552 v1.AddArg(v2) 24553 v0.AddArg(v1) 24554 v0.AddArg(y) 24555 return true 24556 } 24557 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 24558 // 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) 24559 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24560 for { 24561 _ = v.Args[1] 24562 s1 := v.Args[0] 24563 if s1.Op != OpS390XSLDconst { 24564 break 24565 } 24566 j1 := s1.AuxInt 24567 x1 := s1.Args[0] 24568 if x1.Op != OpS390XMOVBZload { 24569 break 24570 } 24571 i1 := x1.AuxInt 24572 s := x1.Aux 24573 _ = x1.Args[1] 24574 p := x1.Args[0] 24575 mem := x1.Args[1] 24576 or := v.Args[1] 24577 if or.Op != OpS390XOR { 24578 break 24579 } 24580 _ = or.Args[1] 24581 y := or.Args[0] 24582 s0 := or.Args[1] 24583 if s0.Op != OpS390XSLDconst { 24584 break 24585 } 24586 j0 := s0.AuxInt 24587 x0 := s0.Args[0] 24588 if x0.Op != OpS390XMOVBZload { 24589 break 24590 } 24591 i0 := x0.AuxInt 24592 if x0.Aux != s { 24593 break 24594 } 24595 _ = x0.Args[1] 24596 if p != x0.Args[0] { 24597 break 24598 } 24599 if mem != x0.Args[1] { 24600 break 24601 } 24602 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)) { 24603 break 24604 } 24605 b = mergePoint(b, x0, x1) 24606 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24607 v.reset(OpCopy) 24608 v.AddArg(v0) 24609 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24610 v1.AuxInt = j0 24611 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24612 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24613 v3.AuxInt = i0 24614 v3.Aux = s 24615 v3.AddArg(p) 24616 v3.AddArg(mem) 24617 v2.AddArg(v3) 24618 v1.AddArg(v2) 24619 v0.AddArg(v1) 24620 v0.AddArg(y) 24621 return true 24622 } 24623 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24624 // 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) 24625 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24626 for { 24627 _ = v.Args[1] 24628 or := v.Args[0] 24629 if or.Op != OpS390XOR { 24630 break 24631 } 24632 _ = or.Args[1] 24633 s0 := or.Args[0] 24634 if s0.Op != OpS390XSLDconst { 24635 break 24636 } 24637 j0 := s0.AuxInt 24638 x0 := s0.Args[0] 24639 if x0.Op != OpS390XMOVBZload { 24640 break 24641 } 24642 i0 := x0.AuxInt 24643 s := x0.Aux 24644 _ = x0.Args[1] 24645 p := x0.Args[0] 24646 mem := x0.Args[1] 24647 y := or.Args[1] 24648 s1 := v.Args[1] 24649 if s1.Op != OpS390XSLDconst { 24650 break 24651 } 24652 j1 := s1.AuxInt 24653 x1 := s1.Args[0] 24654 if x1.Op != OpS390XMOVBZload { 24655 break 24656 } 24657 i1 := x1.AuxInt 24658 if x1.Aux != s { 24659 break 24660 } 24661 _ = x1.Args[1] 24662 if p != x1.Args[0] { 24663 break 24664 } 24665 if mem != x1.Args[1] { 24666 break 24667 } 24668 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)) { 24669 break 24670 } 24671 b = mergePoint(b, x0, x1) 24672 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24673 v.reset(OpCopy) 24674 v.AddArg(v0) 24675 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24676 v1.AuxInt = j0 24677 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24678 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24679 v3.AuxInt = i0 24680 v3.Aux = s 24681 v3.AddArg(p) 24682 v3.AddArg(mem) 24683 v2.AddArg(v3) 24684 v1.AddArg(v2) 24685 v0.AddArg(v1) 24686 v0.AddArg(y) 24687 return true 24688 } 24689 return false 24690 } 24691 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 24692 b := v.Block 24693 _ = b 24694 typ := &b.Func.Config.Types 24695 _ = typ 24696 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 24697 // 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) 24698 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 24699 for { 24700 _ = v.Args[1] 24701 or := v.Args[0] 24702 if or.Op != OpS390XOR { 24703 break 24704 } 24705 _ = or.Args[1] 24706 y := or.Args[0] 24707 s0 := or.Args[1] 24708 if s0.Op != OpS390XSLDconst { 24709 break 24710 } 24711 j0 := s0.AuxInt 24712 x0 := s0.Args[0] 24713 if x0.Op != OpS390XMOVBZload { 24714 break 24715 } 24716 i0 := x0.AuxInt 24717 s := x0.Aux 24718 _ = x0.Args[1] 24719 p := x0.Args[0] 24720 mem := x0.Args[1] 24721 s1 := v.Args[1] 24722 if s1.Op != OpS390XSLDconst { 24723 break 24724 } 24725 j1 := s1.AuxInt 24726 x1 := s1.Args[0] 24727 if x1.Op != OpS390XMOVBZload { 24728 break 24729 } 24730 i1 := x1.AuxInt 24731 if x1.Aux != s { 24732 break 24733 } 24734 _ = x1.Args[1] 24735 if p != x1.Args[0] { 24736 break 24737 } 24738 if mem != x1.Args[1] { 24739 break 24740 } 24741 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)) { 24742 break 24743 } 24744 b = mergePoint(b, x0, x1) 24745 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24746 v.reset(OpCopy) 24747 v.AddArg(v0) 24748 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24749 v1.AuxInt = j0 24750 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 24751 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 24752 v3.AuxInt = i0 24753 v3.Aux = s 24754 v3.AddArg(p) 24755 v3.AddArg(mem) 24756 v2.AddArg(v3) 24757 v1.AddArg(v2) 24758 v0.AddArg(v1) 24759 v0.AddArg(y) 24760 return true 24761 } 24762 // 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)) 24763 // 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) 24764 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24765 for { 24766 _ = v.Args[1] 24767 s1 := v.Args[0] 24768 if s1.Op != OpS390XSLDconst { 24769 break 24770 } 24771 j1 := s1.AuxInt 24772 r1 := s1.Args[0] 24773 if r1.Op != OpS390XMOVHZreg { 24774 break 24775 } 24776 x1 := r1.Args[0] 24777 if x1.Op != OpS390XMOVHBRload { 24778 break 24779 } 24780 i1 := x1.AuxInt 24781 s := x1.Aux 24782 _ = x1.Args[1] 24783 p := x1.Args[0] 24784 mem := x1.Args[1] 24785 or := v.Args[1] 24786 if or.Op != OpS390XOR { 24787 break 24788 } 24789 _ = or.Args[1] 24790 s0 := or.Args[0] 24791 if s0.Op != OpS390XSLDconst { 24792 break 24793 } 24794 j0 := s0.AuxInt 24795 r0 := s0.Args[0] 24796 if r0.Op != OpS390XMOVHZreg { 24797 break 24798 } 24799 x0 := r0.Args[0] 24800 if x0.Op != OpS390XMOVHBRload { 24801 break 24802 } 24803 i0 := x0.AuxInt 24804 if x0.Aux != s { 24805 break 24806 } 24807 _ = x0.Args[1] 24808 if p != x0.Args[0] { 24809 break 24810 } 24811 if mem != x0.Args[1] { 24812 break 24813 } 24814 y := or.Args[1] 24815 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)) { 24816 break 24817 } 24818 b = mergePoint(b, x0, x1) 24819 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24820 v.reset(OpCopy) 24821 v.AddArg(v0) 24822 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24823 v1.AuxInt = j0 24824 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24825 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24826 v3.AuxInt = i0 24827 v3.Aux = s 24828 v3.AddArg(p) 24829 v3.AddArg(mem) 24830 v2.AddArg(v3) 24831 v1.AddArg(v2) 24832 v0.AddArg(v1) 24833 v0.AddArg(y) 24834 return true 24835 } 24836 // 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))))) 24837 // 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) 24838 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24839 for { 24840 _ = v.Args[1] 24841 s1 := v.Args[0] 24842 if s1.Op != OpS390XSLDconst { 24843 break 24844 } 24845 j1 := s1.AuxInt 24846 r1 := s1.Args[0] 24847 if r1.Op != OpS390XMOVHZreg { 24848 break 24849 } 24850 x1 := r1.Args[0] 24851 if x1.Op != OpS390XMOVHBRload { 24852 break 24853 } 24854 i1 := x1.AuxInt 24855 s := x1.Aux 24856 _ = x1.Args[1] 24857 p := x1.Args[0] 24858 mem := x1.Args[1] 24859 or := v.Args[1] 24860 if or.Op != OpS390XOR { 24861 break 24862 } 24863 _ = or.Args[1] 24864 y := or.Args[0] 24865 s0 := or.Args[1] 24866 if s0.Op != OpS390XSLDconst { 24867 break 24868 } 24869 j0 := s0.AuxInt 24870 r0 := s0.Args[0] 24871 if r0.Op != OpS390XMOVHZreg { 24872 break 24873 } 24874 x0 := r0.Args[0] 24875 if x0.Op != OpS390XMOVHBRload { 24876 break 24877 } 24878 i0 := x0.AuxInt 24879 if x0.Aux != s { 24880 break 24881 } 24882 _ = x0.Args[1] 24883 if p != x0.Args[0] { 24884 break 24885 } 24886 if mem != x0.Args[1] { 24887 break 24888 } 24889 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)) { 24890 break 24891 } 24892 b = mergePoint(b, x0, x1) 24893 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24894 v.reset(OpCopy) 24895 v.AddArg(v0) 24896 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24897 v1.AuxInt = j0 24898 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24899 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24900 v3.AuxInt = i0 24901 v3.Aux = s 24902 v3.AddArg(p) 24903 v3.AddArg(mem) 24904 v2.AddArg(v3) 24905 v1.AddArg(v2) 24906 v0.AddArg(v1) 24907 v0.AddArg(y) 24908 return true 24909 } 24910 // 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)))) 24911 // 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) 24912 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24913 for { 24914 _ = v.Args[1] 24915 or := v.Args[0] 24916 if or.Op != OpS390XOR { 24917 break 24918 } 24919 _ = or.Args[1] 24920 s0 := or.Args[0] 24921 if s0.Op != OpS390XSLDconst { 24922 break 24923 } 24924 j0 := s0.AuxInt 24925 r0 := s0.Args[0] 24926 if r0.Op != OpS390XMOVHZreg { 24927 break 24928 } 24929 x0 := r0.Args[0] 24930 if x0.Op != OpS390XMOVHBRload { 24931 break 24932 } 24933 i0 := x0.AuxInt 24934 s := x0.Aux 24935 _ = x0.Args[1] 24936 p := x0.Args[0] 24937 mem := x0.Args[1] 24938 y := or.Args[1] 24939 s1 := v.Args[1] 24940 if s1.Op != OpS390XSLDconst { 24941 break 24942 } 24943 j1 := s1.AuxInt 24944 r1 := s1.Args[0] 24945 if r1.Op != OpS390XMOVHZreg { 24946 break 24947 } 24948 x1 := r1.Args[0] 24949 if x1.Op != OpS390XMOVHBRload { 24950 break 24951 } 24952 i1 := x1.AuxInt 24953 if x1.Aux != s { 24954 break 24955 } 24956 _ = x1.Args[1] 24957 if p != x1.Args[0] { 24958 break 24959 } 24960 if mem != x1.Args[1] { 24961 break 24962 } 24963 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)) { 24964 break 24965 } 24966 b = mergePoint(b, x0, x1) 24967 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 24968 v.reset(OpCopy) 24969 v.AddArg(v0) 24970 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 24971 v1.AuxInt = j0 24972 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 24973 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 24974 v3.AuxInt = i0 24975 v3.Aux = s 24976 v3.AddArg(p) 24977 v3.AddArg(mem) 24978 v2.AddArg(v3) 24979 v1.AddArg(v2) 24980 v0.AddArg(v1) 24981 v0.AddArg(y) 24982 return true 24983 } 24984 // 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)))) 24985 // 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) 24986 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 24987 for { 24988 _ = v.Args[1] 24989 or := v.Args[0] 24990 if or.Op != OpS390XOR { 24991 break 24992 } 24993 _ = or.Args[1] 24994 y := or.Args[0] 24995 s0 := or.Args[1] 24996 if s0.Op != OpS390XSLDconst { 24997 break 24998 } 24999 j0 := s0.AuxInt 25000 r0 := s0.Args[0] 25001 if r0.Op != OpS390XMOVHZreg { 25002 break 25003 } 25004 x0 := r0.Args[0] 25005 if x0.Op != OpS390XMOVHBRload { 25006 break 25007 } 25008 i0 := x0.AuxInt 25009 s := x0.Aux 25010 _ = x0.Args[1] 25011 p := x0.Args[0] 25012 mem := x0.Args[1] 25013 s1 := v.Args[1] 25014 if s1.Op != OpS390XSLDconst { 25015 break 25016 } 25017 j1 := s1.AuxInt 25018 r1 := s1.Args[0] 25019 if r1.Op != OpS390XMOVHZreg { 25020 break 25021 } 25022 x1 := r1.Args[0] 25023 if x1.Op != OpS390XMOVHBRload { 25024 break 25025 } 25026 i1 := x1.AuxInt 25027 if x1.Aux != s { 25028 break 25029 } 25030 _ = x1.Args[1] 25031 if p != x1.Args[0] { 25032 break 25033 } 25034 if mem != x1.Args[1] { 25035 break 25036 } 25037 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)) { 25038 break 25039 } 25040 b = mergePoint(b, x0, x1) 25041 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25042 v.reset(OpCopy) 25043 v.AddArg(v0) 25044 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25045 v1.AuxInt = j0 25046 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25047 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 25048 v3.AuxInt = i0 25049 v3.Aux = s 25050 v3.AddArg(p) 25051 v3.AddArg(mem) 25052 v2.AddArg(v3) 25053 v1.AddArg(v2) 25054 v0.AddArg(v1) 25055 v0.AddArg(y) 25056 return true 25057 } 25058 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25059 // 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) 25060 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25061 for { 25062 _ = v.Args[1] 25063 x0 := v.Args[0] 25064 if x0.Op != OpS390XMOVBZloadidx { 25065 break 25066 } 25067 i0 := x0.AuxInt 25068 s := x0.Aux 25069 _ = x0.Args[2] 25070 p := x0.Args[0] 25071 idx := x0.Args[1] 25072 mem := x0.Args[2] 25073 sh := v.Args[1] 25074 if sh.Op != OpS390XSLDconst { 25075 break 25076 } 25077 if sh.AuxInt != 8 { 25078 break 25079 } 25080 x1 := sh.Args[0] 25081 if x1.Op != OpS390XMOVBZloadidx { 25082 break 25083 } 25084 i1 := x1.AuxInt 25085 if x1.Aux != s { 25086 break 25087 } 25088 _ = x1.Args[2] 25089 if p != x1.Args[0] { 25090 break 25091 } 25092 if idx != x1.Args[1] { 25093 break 25094 } 25095 if mem != x1.Args[2] { 25096 break 25097 } 25098 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)) { 25099 break 25100 } 25101 b = mergePoint(b, x0, x1) 25102 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25103 v.reset(OpCopy) 25104 v.AddArg(v0) 25105 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25106 v1.AuxInt = i0 25107 v1.Aux = s 25108 v1.AddArg(p) 25109 v1.AddArg(idx) 25110 v1.AddArg(mem) 25111 v0.AddArg(v1) 25112 return true 25113 } 25114 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25115 // 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) 25116 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25117 for { 25118 _ = v.Args[1] 25119 x0 := v.Args[0] 25120 if x0.Op != OpS390XMOVBZloadidx { 25121 break 25122 } 25123 i0 := x0.AuxInt 25124 s := x0.Aux 25125 _ = x0.Args[2] 25126 idx := x0.Args[0] 25127 p := x0.Args[1] 25128 mem := x0.Args[2] 25129 sh := v.Args[1] 25130 if sh.Op != OpS390XSLDconst { 25131 break 25132 } 25133 if sh.AuxInt != 8 { 25134 break 25135 } 25136 x1 := sh.Args[0] 25137 if x1.Op != OpS390XMOVBZloadidx { 25138 break 25139 } 25140 i1 := x1.AuxInt 25141 if x1.Aux != s { 25142 break 25143 } 25144 _ = x1.Args[2] 25145 if p != x1.Args[0] { 25146 break 25147 } 25148 if idx != x1.Args[1] { 25149 break 25150 } 25151 if mem != x1.Args[2] { 25152 break 25153 } 25154 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)) { 25155 break 25156 } 25157 b = mergePoint(b, x0, x1) 25158 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25159 v.reset(OpCopy) 25160 v.AddArg(v0) 25161 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25162 v1.AuxInt = i0 25163 v1.Aux = s 25164 v1.AddArg(p) 25165 v1.AddArg(idx) 25166 v1.AddArg(mem) 25167 v0.AddArg(v1) 25168 return true 25169 } 25170 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25171 // 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) 25172 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25173 for { 25174 _ = v.Args[1] 25175 x0 := v.Args[0] 25176 if x0.Op != OpS390XMOVBZloadidx { 25177 break 25178 } 25179 i0 := x0.AuxInt 25180 s := x0.Aux 25181 _ = x0.Args[2] 25182 p := x0.Args[0] 25183 idx := x0.Args[1] 25184 mem := x0.Args[2] 25185 sh := v.Args[1] 25186 if sh.Op != OpS390XSLDconst { 25187 break 25188 } 25189 if sh.AuxInt != 8 { 25190 break 25191 } 25192 x1 := sh.Args[0] 25193 if x1.Op != OpS390XMOVBZloadidx { 25194 break 25195 } 25196 i1 := x1.AuxInt 25197 if x1.Aux != s { 25198 break 25199 } 25200 _ = x1.Args[2] 25201 if idx != x1.Args[0] { 25202 break 25203 } 25204 if p != x1.Args[1] { 25205 break 25206 } 25207 if mem != x1.Args[2] { 25208 break 25209 } 25210 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)) { 25211 break 25212 } 25213 b = mergePoint(b, x0, x1) 25214 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25215 v.reset(OpCopy) 25216 v.AddArg(v0) 25217 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25218 v1.AuxInt = i0 25219 v1.Aux = s 25220 v1.AddArg(p) 25221 v1.AddArg(idx) 25222 v1.AddArg(mem) 25223 v0.AddArg(v1) 25224 return true 25225 } 25226 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 25227 // 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) 25228 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25229 for { 25230 _ = v.Args[1] 25231 x0 := v.Args[0] 25232 if x0.Op != OpS390XMOVBZloadidx { 25233 break 25234 } 25235 i0 := x0.AuxInt 25236 s := x0.Aux 25237 _ = x0.Args[2] 25238 idx := x0.Args[0] 25239 p := x0.Args[1] 25240 mem := x0.Args[2] 25241 sh := v.Args[1] 25242 if sh.Op != OpS390XSLDconst { 25243 break 25244 } 25245 if sh.AuxInt != 8 { 25246 break 25247 } 25248 x1 := sh.Args[0] 25249 if x1.Op != OpS390XMOVBZloadidx { 25250 break 25251 } 25252 i1 := x1.AuxInt 25253 if x1.Aux != s { 25254 break 25255 } 25256 _ = x1.Args[2] 25257 if idx != x1.Args[0] { 25258 break 25259 } 25260 if p != x1.Args[1] { 25261 break 25262 } 25263 if mem != x1.Args[2] { 25264 break 25265 } 25266 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)) { 25267 break 25268 } 25269 b = mergePoint(b, x0, x1) 25270 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25271 v.reset(OpCopy) 25272 v.AddArg(v0) 25273 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25274 v1.AuxInt = i0 25275 v1.Aux = s 25276 v1.AddArg(p) 25277 v1.AddArg(idx) 25278 v1.AddArg(mem) 25279 v0.AddArg(v1) 25280 return true 25281 } 25282 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 25283 // 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) 25284 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25285 for { 25286 _ = v.Args[1] 25287 sh := v.Args[0] 25288 if sh.Op != OpS390XSLDconst { 25289 break 25290 } 25291 if sh.AuxInt != 8 { 25292 break 25293 } 25294 x1 := sh.Args[0] 25295 if x1.Op != OpS390XMOVBZloadidx { 25296 break 25297 } 25298 i1 := x1.AuxInt 25299 s := x1.Aux 25300 _ = x1.Args[2] 25301 p := x1.Args[0] 25302 idx := x1.Args[1] 25303 mem := x1.Args[2] 25304 x0 := v.Args[1] 25305 if x0.Op != OpS390XMOVBZloadidx { 25306 break 25307 } 25308 i0 := x0.AuxInt 25309 if x0.Aux != s { 25310 break 25311 } 25312 _ = x0.Args[2] 25313 if p != x0.Args[0] { 25314 break 25315 } 25316 if idx != x0.Args[1] { 25317 break 25318 } 25319 if mem != x0.Args[2] { 25320 break 25321 } 25322 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)) { 25323 break 25324 } 25325 b = mergePoint(b, x0, x1) 25326 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25327 v.reset(OpCopy) 25328 v.AddArg(v0) 25329 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25330 v1.AuxInt = i0 25331 v1.Aux = s 25332 v1.AddArg(p) 25333 v1.AddArg(idx) 25334 v1.AddArg(mem) 25335 v0.AddArg(v1) 25336 return true 25337 } 25338 return false 25339 } 25340 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 25341 b := v.Block 25342 _ = b 25343 typ := &b.Func.Config.Types 25344 _ = typ 25345 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p 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 idx := x1.Args[0] 25365 p := 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 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25402 // 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) 25403 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25404 for { 25405 _ = v.Args[1] 25406 sh := v.Args[0] 25407 if sh.Op != OpS390XSLDconst { 25408 break 25409 } 25410 if sh.AuxInt != 8 { 25411 break 25412 } 25413 x1 := sh.Args[0] 25414 if x1.Op != OpS390XMOVBZloadidx { 25415 break 25416 } 25417 i1 := x1.AuxInt 25418 s := x1.Aux 25419 _ = x1.Args[2] 25420 p := x1.Args[0] 25421 idx := x1.Args[1] 25422 mem := x1.Args[2] 25423 x0 := v.Args[1] 25424 if x0.Op != OpS390XMOVBZloadidx { 25425 break 25426 } 25427 i0 := x0.AuxInt 25428 if x0.Aux != s { 25429 break 25430 } 25431 _ = x0.Args[2] 25432 if idx != x0.Args[0] { 25433 break 25434 } 25435 if p != x0.Args[1] { 25436 break 25437 } 25438 if mem != x0.Args[2] { 25439 break 25440 } 25441 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)) { 25442 break 25443 } 25444 b = mergePoint(b, x0, x1) 25445 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25446 v.reset(OpCopy) 25447 v.AddArg(v0) 25448 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25449 v1.AuxInt = i0 25450 v1.Aux = s 25451 v1.AddArg(p) 25452 v1.AddArg(idx) 25453 v1.AddArg(mem) 25454 v0.AddArg(v1) 25455 return true 25456 } 25457 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 25458 // 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) 25459 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 25460 for { 25461 _ = v.Args[1] 25462 sh := v.Args[0] 25463 if sh.Op != OpS390XSLDconst { 25464 break 25465 } 25466 if sh.AuxInt != 8 { 25467 break 25468 } 25469 x1 := sh.Args[0] 25470 if x1.Op != OpS390XMOVBZloadidx { 25471 break 25472 } 25473 i1 := x1.AuxInt 25474 s := x1.Aux 25475 _ = x1.Args[2] 25476 idx := x1.Args[0] 25477 p := x1.Args[1] 25478 mem := x1.Args[2] 25479 x0 := v.Args[1] 25480 if x0.Op != OpS390XMOVBZloadidx { 25481 break 25482 } 25483 i0 := x0.AuxInt 25484 if x0.Aux != s { 25485 break 25486 } 25487 _ = x0.Args[2] 25488 if idx != x0.Args[0] { 25489 break 25490 } 25491 if p != x0.Args[1] { 25492 break 25493 } 25494 if mem != x0.Args[2] { 25495 break 25496 } 25497 if !(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)) { 25498 break 25499 } 25500 b = mergePoint(b, x0, x1) 25501 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 25502 v.reset(OpCopy) 25503 v.AddArg(v0) 25504 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 25505 v1.AuxInt = i0 25506 v1.Aux = s 25507 v1.AddArg(p) 25508 v1.AddArg(idx) 25509 v1.AddArg(mem) 25510 v0.AddArg(v1) 25511 return true 25512 } 25513 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25514 // 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) 25515 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25516 for { 25517 _ = v.Args[1] 25518 r0 := v.Args[0] 25519 if r0.Op != OpS390XMOVHZreg { 25520 break 25521 } 25522 x0 := r0.Args[0] 25523 if x0.Op != OpS390XMOVHBRloadidx { 25524 break 25525 } 25526 i0 := x0.AuxInt 25527 s := x0.Aux 25528 _ = x0.Args[2] 25529 p := x0.Args[0] 25530 idx := x0.Args[1] 25531 mem := x0.Args[2] 25532 sh := v.Args[1] 25533 if sh.Op != OpS390XSLDconst { 25534 break 25535 } 25536 if sh.AuxInt != 16 { 25537 break 25538 } 25539 r1 := sh.Args[0] 25540 if r1.Op != OpS390XMOVHZreg { 25541 break 25542 } 25543 x1 := r1.Args[0] 25544 if x1.Op != OpS390XMOVHBRloadidx { 25545 break 25546 } 25547 i1 := x1.AuxInt 25548 if x1.Aux != s { 25549 break 25550 } 25551 _ = x1.Args[2] 25552 if p != x1.Args[0] { 25553 break 25554 } 25555 if idx != x1.Args[1] { 25556 break 25557 } 25558 if mem != x1.Args[2] { 25559 break 25560 } 25561 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)) { 25562 break 25563 } 25564 b = mergePoint(b, x0, x1) 25565 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25566 v.reset(OpCopy) 25567 v.AddArg(v0) 25568 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25569 v1.AuxInt = i0 25570 v1.Aux = s 25571 v1.AddArg(p) 25572 v1.AddArg(idx) 25573 v1.AddArg(mem) 25574 v0.AddArg(v1) 25575 return true 25576 } 25577 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 25578 // 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) 25579 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25580 for { 25581 _ = v.Args[1] 25582 r0 := v.Args[0] 25583 if r0.Op != OpS390XMOVHZreg { 25584 break 25585 } 25586 x0 := r0.Args[0] 25587 if x0.Op != OpS390XMOVHBRloadidx { 25588 break 25589 } 25590 i0 := x0.AuxInt 25591 s := x0.Aux 25592 _ = x0.Args[2] 25593 idx := x0.Args[0] 25594 p := x0.Args[1] 25595 mem := x0.Args[2] 25596 sh := v.Args[1] 25597 if sh.Op != OpS390XSLDconst { 25598 break 25599 } 25600 if sh.AuxInt != 16 { 25601 break 25602 } 25603 r1 := sh.Args[0] 25604 if r1.Op != OpS390XMOVHZreg { 25605 break 25606 } 25607 x1 := r1.Args[0] 25608 if x1.Op != OpS390XMOVHBRloadidx { 25609 break 25610 } 25611 i1 := x1.AuxInt 25612 if x1.Aux != s { 25613 break 25614 } 25615 _ = x1.Args[2] 25616 if p != x1.Args[0] { 25617 break 25618 } 25619 if idx != x1.Args[1] { 25620 break 25621 } 25622 if mem != x1.Args[2] { 25623 break 25624 } 25625 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)) { 25626 break 25627 } 25628 b = mergePoint(b, x0, x1) 25629 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25630 v.reset(OpCopy) 25631 v.AddArg(v0) 25632 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25633 v1.AuxInt = i0 25634 v1.Aux = s 25635 v1.AddArg(p) 25636 v1.AddArg(idx) 25637 v1.AddArg(mem) 25638 v0.AddArg(v1) 25639 return true 25640 } 25641 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25642 // 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) 25643 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25644 for { 25645 _ = v.Args[1] 25646 r0 := v.Args[0] 25647 if r0.Op != OpS390XMOVHZreg { 25648 break 25649 } 25650 x0 := r0.Args[0] 25651 if x0.Op != OpS390XMOVHBRloadidx { 25652 break 25653 } 25654 i0 := x0.AuxInt 25655 s := x0.Aux 25656 _ = x0.Args[2] 25657 p := x0.Args[0] 25658 idx := x0.Args[1] 25659 mem := x0.Args[2] 25660 sh := v.Args[1] 25661 if sh.Op != OpS390XSLDconst { 25662 break 25663 } 25664 if sh.AuxInt != 16 { 25665 break 25666 } 25667 r1 := sh.Args[0] 25668 if r1.Op != OpS390XMOVHZreg { 25669 break 25670 } 25671 x1 := r1.Args[0] 25672 if x1.Op != OpS390XMOVHBRloadidx { 25673 break 25674 } 25675 i1 := x1.AuxInt 25676 if x1.Aux != s { 25677 break 25678 } 25679 _ = x1.Args[2] 25680 if idx != x1.Args[0] { 25681 break 25682 } 25683 if p != x1.Args[1] { 25684 break 25685 } 25686 if mem != x1.Args[2] { 25687 break 25688 } 25689 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)) { 25690 break 25691 } 25692 b = mergePoint(b, x0, x1) 25693 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25694 v.reset(OpCopy) 25695 v.AddArg(v0) 25696 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25697 v1.AuxInt = i0 25698 v1.Aux = s 25699 v1.AddArg(p) 25700 v1.AddArg(idx) 25701 v1.AddArg(mem) 25702 v0.AddArg(v1) 25703 return true 25704 } 25705 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 25706 // 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) 25707 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25708 for { 25709 _ = v.Args[1] 25710 r0 := v.Args[0] 25711 if r0.Op != OpS390XMOVHZreg { 25712 break 25713 } 25714 x0 := r0.Args[0] 25715 if x0.Op != OpS390XMOVHBRloadidx { 25716 break 25717 } 25718 i0 := x0.AuxInt 25719 s := x0.Aux 25720 _ = x0.Args[2] 25721 idx := x0.Args[0] 25722 p := x0.Args[1] 25723 mem := x0.Args[2] 25724 sh := v.Args[1] 25725 if sh.Op != OpS390XSLDconst { 25726 break 25727 } 25728 if sh.AuxInt != 16 { 25729 break 25730 } 25731 r1 := sh.Args[0] 25732 if r1.Op != OpS390XMOVHZreg { 25733 break 25734 } 25735 x1 := r1.Args[0] 25736 if x1.Op != OpS390XMOVHBRloadidx { 25737 break 25738 } 25739 i1 := x1.AuxInt 25740 if x1.Aux != s { 25741 break 25742 } 25743 _ = x1.Args[2] 25744 if idx != x1.Args[0] { 25745 break 25746 } 25747 if p != x1.Args[1] { 25748 break 25749 } 25750 if mem != x1.Args[2] { 25751 break 25752 } 25753 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)) { 25754 break 25755 } 25756 b = mergePoint(b, x0, x1) 25757 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25758 v.reset(OpCopy) 25759 v.AddArg(v0) 25760 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25761 v1.AuxInt = i0 25762 v1.Aux = s 25763 v1.AddArg(p) 25764 v1.AddArg(idx) 25765 v1.AddArg(mem) 25766 v0.AddArg(v1) 25767 return true 25768 } 25769 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25770 // 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) 25771 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25772 for { 25773 _ = v.Args[1] 25774 sh := v.Args[0] 25775 if sh.Op != OpS390XSLDconst { 25776 break 25777 } 25778 if sh.AuxInt != 16 { 25779 break 25780 } 25781 r1 := sh.Args[0] 25782 if r1.Op != OpS390XMOVHZreg { 25783 break 25784 } 25785 x1 := r1.Args[0] 25786 if x1.Op != OpS390XMOVHBRloadidx { 25787 break 25788 } 25789 i1 := x1.AuxInt 25790 s := x1.Aux 25791 _ = x1.Args[2] 25792 p := x1.Args[0] 25793 idx := x1.Args[1] 25794 mem := x1.Args[2] 25795 r0 := v.Args[1] 25796 if r0.Op != OpS390XMOVHZreg { 25797 break 25798 } 25799 x0 := r0.Args[0] 25800 if x0.Op != OpS390XMOVHBRloadidx { 25801 break 25802 } 25803 i0 := x0.AuxInt 25804 if x0.Aux != s { 25805 break 25806 } 25807 _ = x0.Args[2] 25808 if p != x0.Args[0] { 25809 break 25810 } 25811 if idx != x0.Args[1] { 25812 break 25813 } 25814 if mem != x0.Args[2] { 25815 break 25816 } 25817 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)) { 25818 break 25819 } 25820 b = mergePoint(b, x0, x1) 25821 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25822 v.reset(OpCopy) 25823 v.AddArg(v0) 25824 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25825 v1.AuxInt = i0 25826 v1.Aux = s 25827 v1.AddArg(p) 25828 v1.AddArg(idx) 25829 v1.AddArg(mem) 25830 v0.AddArg(v1) 25831 return true 25832 } 25833 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 25834 // 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) 25835 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25836 for { 25837 _ = v.Args[1] 25838 sh := v.Args[0] 25839 if sh.Op != OpS390XSLDconst { 25840 break 25841 } 25842 if sh.AuxInt != 16 { 25843 break 25844 } 25845 r1 := sh.Args[0] 25846 if r1.Op != OpS390XMOVHZreg { 25847 break 25848 } 25849 x1 := r1.Args[0] 25850 if x1.Op != OpS390XMOVHBRloadidx { 25851 break 25852 } 25853 i1 := x1.AuxInt 25854 s := x1.Aux 25855 _ = x1.Args[2] 25856 idx := x1.Args[0] 25857 p := x1.Args[1] 25858 mem := x1.Args[2] 25859 r0 := v.Args[1] 25860 if r0.Op != OpS390XMOVHZreg { 25861 break 25862 } 25863 x0 := r0.Args[0] 25864 if x0.Op != OpS390XMOVHBRloadidx { 25865 break 25866 } 25867 i0 := x0.AuxInt 25868 if x0.Aux != s { 25869 break 25870 } 25871 _ = x0.Args[2] 25872 if p != x0.Args[0] { 25873 break 25874 } 25875 if idx != x0.Args[1] { 25876 break 25877 } 25878 if mem != x0.Args[2] { 25879 break 25880 } 25881 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)) { 25882 break 25883 } 25884 b = mergePoint(b, x0, x1) 25885 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25886 v.reset(OpCopy) 25887 v.AddArg(v0) 25888 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25889 v1.AuxInt = i0 25890 v1.Aux = s 25891 v1.AddArg(p) 25892 v1.AddArg(idx) 25893 v1.AddArg(mem) 25894 v0.AddArg(v1) 25895 return true 25896 } 25897 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 25898 // 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) 25899 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25900 for { 25901 _ = v.Args[1] 25902 sh := v.Args[0] 25903 if sh.Op != OpS390XSLDconst { 25904 break 25905 } 25906 if sh.AuxInt != 16 { 25907 break 25908 } 25909 r1 := sh.Args[0] 25910 if r1.Op != OpS390XMOVHZreg { 25911 break 25912 } 25913 x1 := r1.Args[0] 25914 if x1.Op != OpS390XMOVHBRloadidx { 25915 break 25916 } 25917 i1 := x1.AuxInt 25918 s := x1.Aux 25919 _ = x1.Args[2] 25920 p := x1.Args[0] 25921 idx := x1.Args[1] 25922 mem := x1.Args[2] 25923 r0 := v.Args[1] 25924 if r0.Op != OpS390XMOVHZreg { 25925 break 25926 } 25927 x0 := r0.Args[0] 25928 if x0.Op != OpS390XMOVHBRloadidx { 25929 break 25930 } 25931 i0 := x0.AuxInt 25932 if x0.Aux != s { 25933 break 25934 } 25935 _ = x0.Args[2] 25936 if idx != x0.Args[0] { 25937 break 25938 } 25939 if p != x0.Args[1] { 25940 break 25941 } 25942 if mem != x0.Args[2] { 25943 break 25944 } 25945 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)) { 25946 break 25947 } 25948 b = mergePoint(b, x0, x1) 25949 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 25950 v.reset(OpCopy) 25951 v.AddArg(v0) 25952 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 25953 v1.AuxInt = i0 25954 v1.Aux = s 25955 v1.AddArg(p) 25956 v1.AddArg(idx) 25957 v1.AddArg(mem) 25958 v0.AddArg(v1) 25959 return true 25960 } 25961 return false 25962 } 25963 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 25964 b := v.Block 25965 _ = b 25966 typ := &b.Func.Config.Types 25967 _ = typ 25968 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 25969 // 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) 25970 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 25971 for { 25972 _ = v.Args[1] 25973 sh := v.Args[0] 25974 if sh.Op != OpS390XSLDconst { 25975 break 25976 } 25977 if sh.AuxInt != 16 { 25978 break 25979 } 25980 r1 := sh.Args[0] 25981 if r1.Op != OpS390XMOVHZreg { 25982 break 25983 } 25984 x1 := r1.Args[0] 25985 if x1.Op != OpS390XMOVHBRloadidx { 25986 break 25987 } 25988 i1 := x1.AuxInt 25989 s := x1.Aux 25990 _ = x1.Args[2] 25991 idx := x1.Args[0] 25992 p := x1.Args[1] 25993 mem := x1.Args[2] 25994 r0 := v.Args[1] 25995 if r0.Op != OpS390XMOVHZreg { 25996 break 25997 } 25998 x0 := r0.Args[0] 25999 if x0.Op != OpS390XMOVHBRloadidx { 26000 break 26001 } 26002 i0 := x0.AuxInt 26003 if x0.Aux != s { 26004 break 26005 } 26006 _ = x0.Args[2] 26007 if idx != x0.Args[0] { 26008 break 26009 } 26010 if p != x0.Args[1] { 26011 break 26012 } 26013 if mem != x0.Args[2] { 26014 break 26015 } 26016 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)) { 26017 break 26018 } 26019 b = mergePoint(b, x0, x1) 26020 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 26021 v.reset(OpCopy) 26022 v.AddArg(v0) 26023 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 26024 v1.AuxInt = i0 26025 v1.Aux = s 26026 v1.AddArg(p) 26027 v1.AddArg(idx) 26028 v1.AddArg(mem) 26029 v0.AddArg(v1) 26030 return true 26031 } 26032 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26033 // 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) 26034 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26035 for { 26036 _ = v.Args[1] 26037 r0 := v.Args[0] 26038 if r0.Op != OpS390XMOVWZreg { 26039 break 26040 } 26041 x0 := r0.Args[0] 26042 if x0.Op != OpS390XMOVWBRloadidx { 26043 break 26044 } 26045 i0 := x0.AuxInt 26046 s := x0.Aux 26047 _ = x0.Args[2] 26048 p := x0.Args[0] 26049 idx := x0.Args[1] 26050 mem := x0.Args[2] 26051 sh := v.Args[1] 26052 if sh.Op != OpS390XSLDconst { 26053 break 26054 } 26055 if sh.AuxInt != 32 { 26056 break 26057 } 26058 r1 := sh.Args[0] 26059 if r1.Op != OpS390XMOVWZreg { 26060 break 26061 } 26062 x1 := r1.Args[0] 26063 if x1.Op != OpS390XMOVWBRloadidx { 26064 break 26065 } 26066 i1 := x1.AuxInt 26067 if x1.Aux != s { 26068 break 26069 } 26070 _ = x1.Args[2] 26071 if p != x1.Args[0] { 26072 break 26073 } 26074 if idx != x1.Args[1] { 26075 break 26076 } 26077 if mem != x1.Args[2] { 26078 break 26079 } 26080 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)) { 26081 break 26082 } 26083 b = mergePoint(b, x0, x1) 26084 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26085 v.reset(OpCopy) 26086 v.AddArg(v0) 26087 v0.AuxInt = i0 26088 v0.Aux = s 26089 v0.AddArg(p) 26090 v0.AddArg(idx) 26091 v0.AddArg(mem) 26092 return true 26093 } 26094 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 26095 // 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) 26096 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26097 for { 26098 _ = v.Args[1] 26099 r0 := v.Args[0] 26100 if r0.Op != OpS390XMOVWZreg { 26101 break 26102 } 26103 x0 := r0.Args[0] 26104 if x0.Op != OpS390XMOVWBRloadidx { 26105 break 26106 } 26107 i0 := x0.AuxInt 26108 s := x0.Aux 26109 _ = x0.Args[2] 26110 idx := x0.Args[0] 26111 p := x0.Args[1] 26112 mem := x0.Args[2] 26113 sh := v.Args[1] 26114 if sh.Op != OpS390XSLDconst { 26115 break 26116 } 26117 if sh.AuxInt != 32 { 26118 break 26119 } 26120 r1 := sh.Args[0] 26121 if r1.Op != OpS390XMOVWZreg { 26122 break 26123 } 26124 x1 := r1.Args[0] 26125 if x1.Op != OpS390XMOVWBRloadidx { 26126 break 26127 } 26128 i1 := x1.AuxInt 26129 if x1.Aux != s { 26130 break 26131 } 26132 _ = x1.Args[2] 26133 if p != x1.Args[0] { 26134 break 26135 } 26136 if idx != x1.Args[1] { 26137 break 26138 } 26139 if mem != x1.Args[2] { 26140 break 26141 } 26142 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)) { 26143 break 26144 } 26145 b = mergePoint(b, x0, x1) 26146 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26147 v.reset(OpCopy) 26148 v.AddArg(v0) 26149 v0.AuxInt = i0 26150 v0.Aux = s 26151 v0.AddArg(p) 26152 v0.AddArg(idx) 26153 v0.AddArg(mem) 26154 return true 26155 } 26156 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26157 // 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) 26158 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26159 for { 26160 _ = v.Args[1] 26161 r0 := v.Args[0] 26162 if r0.Op != OpS390XMOVWZreg { 26163 break 26164 } 26165 x0 := r0.Args[0] 26166 if x0.Op != OpS390XMOVWBRloadidx { 26167 break 26168 } 26169 i0 := x0.AuxInt 26170 s := x0.Aux 26171 _ = x0.Args[2] 26172 p := x0.Args[0] 26173 idx := x0.Args[1] 26174 mem := x0.Args[2] 26175 sh := v.Args[1] 26176 if sh.Op != OpS390XSLDconst { 26177 break 26178 } 26179 if sh.AuxInt != 32 { 26180 break 26181 } 26182 r1 := sh.Args[0] 26183 if r1.Op != OpS390XMOVWZreg { 26184 break 26185 } 26186 x1 := r1.Args[0] 26187 if x1.Op != OpS390XMOVWBRloadidx { 26188 break 26189 } 26190 i1 := x1.AuxInt 26191 if x1.Aux != s { 26192 break 26193 } 26194 _ = x1.Args[2] 26195 if idx != x1.Args[0] { 26196 break 26197 } 26198 if p != x1.Args[1] { 26199 break 26200 } 26201 if mem != x1.Args[2] { 26202 break 26203 } 26204 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)) { 26205 break 26206 } 26207 b = mergePoint(b, x0, x1) 26208 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26209 v.reset(OpCopy) 26210 v.AddArg(v0) 26211 v0.AuxInt = i0 26212 v0.Aux = s 26213 v0.AddArg(p) 26214 v0.AddArg(idx) 26215 v0.AddArg(mem) 26216 return true 26217 } 26218 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 26219 // 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) 26220 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26221 for { 26222 _ = v.Args[1] 26223 r0 := v.Args[0] 26224 if r0.Op != OpS390XMOVWZreg { 26225 break 26226 } 26227 x0 := r0.Args[0] 26228 if x0.Op != OpS390XMOVWBRloadidx { 26229 break 26230 } 26231 i0 := x0.AuxInt 26232 s := x0.Aux 26233 _ = x0.Args[2] 26234 idx := x0.Args[0] 26235 p := x0.Args[1] 26236 mem := x0.Args[2] 26237 sh := v.Args[1] 26238 if sh.Op != OpS390XSLDconst { 26239 break 26240 } 26241 if sh.AuxInt != 32 { 26242 break 26243 } 26244 r1 := sh.Args[0] 26245 if r1.Op != OpS390XMOVWZreg { 26246 break 26247 } 26248 x1 := r1.Args[0] 26249 if x1.Op != OpS390XMOVWBRloadidx { 26250 break 26251 } 26252 i1 := x1.AuxInt 26253 if x1.Aux != s { 26254 break 26255 } 26256 _ = x1.Args[2] 26257 if idx != x1.Args[0] { 26258 break 26259 } 26260 if p != x1.Args[1] { 26261 break 26262 } 26263 if mem != x1.Args[2] { 26264 break 26265 } 26266 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)) { 26267 break 26268 } 26269 b = mergePoint(b, x0, x1) 26270 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26271 v.reset(OpCopy) 26272 v.AddArg(v0) 26273 v0.AuxInt = i0 26274 v0.Aux = s 26275 v0.AddArg(p) 26276 v0.AddArg(idx) 26277 v0.AddArg(mem) 26278 return true 26279 } 26280 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26281 // 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) 26282 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26283 for { 26284 _ = v.Args[1] 26285 sh := v.Args[0] 26286 if sh.Op != OpS390XSLDconst { 26287 break 26288 } 26289 if sh.AuxInt != 32 { 26290 break 26291 } 26292 r1 := sh.Args[0] 26293 if r1.Op != OpS390XMOVWZreg { 26294 break 26295 } 26296 x1 := r1.Args[0] 26297 if x1.Op != OpS390XMOVWBRloadidx { 26298 break 26299 } 26300 i1 := x1.AuxInt 26301 s := x1.Aux 26302 _ = x1.Args[2] 26303 p := x1.Args[0] 26304 idx := x1.Args[1] 26305 mem := x1.Args[2] 26306 r0 := v.Args[1] 26307 if r0.Op != OpS390XMOVWZreg { 26308 break 26309 } 26310 x0 := r0.Args[0] 26311 if x0.Op != OpS390XMOVWBRloadidx { 26312 break 26313 } 26314 i0 := x0.AuxInt 26315 if x0.Aux != s { 26316 break 26317 } 26318 _ = x0.Args[2] 26319 if p != x0.Args[0] { 26320 break 26321 } 26322 if idx != x0.Args[1] { 26323 break 26324 } 26325 if mem != x0.Args[2] { 26326 break 26327 } 26328 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)) { 26329 break 26330 } 26331 b = mergePoint(b, x0, x1) 26332 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26333 v.reset(OpCopy) 26334 v.AddArg(v0) 26335 v0.AuxInt = i0 26336 v0.Aux = s 26337 v0.AddArg(p) 26338 v0.AddArg(idx) 26339 v0.AddArg(mem) 26340 return true 26341 } 26342 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 26343 // 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) 26344 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26345 for { 26346 _ = v.Args[1] 26347 sh := v.Args[0] 26348 if sh.Op != OpS390XSLDconst { 26349 break 26350 } 26351 if sh.AuxInt != 32 { 26352 break 26353 } 26354 r1 := sh.Args[0] 26355 if r1.Op != OpS390XMOVWZreg { 26356 break 26357 } 26358 x1 := r1.Args[0] 26359 if x1.Op != OpS390XMOVWBRloadidx { 26360 break 26361 } 26362 i1 := x1.AuxInt 26363 s := x1.Aux 26364 _ = x1.Args[2] 26365 idx := x1.Args[0] 26366 p := x1.Args[1] 26367 mem := x1.Args[2] 26368 r0 := v.Args[1] 26369 if r0.Op != OpS390XMOVWZreg { 26370 break 26371 } 26372 x0 := r0.Args[0] 26373 if x0.Op != OpS390XMOVWBRloadidx { 26374 break 26375 } 26376 i0 := x0.AuxInt 26377 if x0.Aux != s { 26378 break 26379 } 26380 _ = x0.Args[2] 26381 if p != x0.Args[0] { 26382 break 26383 } 26384 if idx != x0.Args[1] { 26385 break 26386 } 26387 if mem != x0.Args[2] { 26388 break 26389 } 26390 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)) { 26391 break 26392 } 26393 b = mergePoint(b, x0, x1) 26394 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26395 v.reset(OpCopy) 26396 v.AddArg(v0) 26397 v0.AuxInt = i0 26398 v0.Aux = s 26399 v0.AddArg(p) 26400 v0.AddArg(idx) 26401 v0.AddArg(mem) 26402 return true 26403 } 26404 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26405 // 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) 26406 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26407 for { 26408 _ = v.Args[1] 26409 sh := v.Args[0] 26410 if sh.Op != OpS390XSLDconst { 26411 break 26412 } 26413 if sh.AuxInt != 32 { 26414 break 26415 } 26416 r1 := sh.Args[0] 26417 if r1.Op != OpS390XMOVWZreg { 26418 break 26419 } 26420 x1 := r1.Args[0] 26421 if x1.Op != OpS390XMOVWBRloadidx { 26422 break 26423 } 26424 i1 := x1.AuxInt 26425 s := x1.Aux 26426 _ = x1.Args[2] 26427 p := x1.Args[0] 26428 idx := x1.Args[1] 26429 mem := x1.Args[2] 26430 r0 := v.Args[1] 26431 if r0.Op != OpS390XMOVWZreg { 26432 break 26433 } 26434 x0 := r0.Args[0] 26435 if x0.Op != OpS390XMOVWBRloadidx { 26436 break 26437 } 26438 i0 := x0.AuxInt 26439 if x0.Aux != s { 26440 break 26441 } 26442 _ = x0.Args[2] 26443 if idx != x0.Args[0] { 26444 break 26445 } 26446 if p != x0.Args[1] { 26447 break 26448 } 26449 if mem != x0.Args[2] { 26450 break 26451 } 26452 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)) { 26453 break 26454 } 26455 b = mergePoint(b, x0, x1) 26456 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26457 v.reset(OpCopy) 26458 v.AddArg(v0) 26459 v0.AuxInt = i0 26460 v0.Aux = s 26461 v0.AddArg(p) 26462 v0.AddArg(idx) 26463 v0.AddArg(mem) 26464 return true 26465 } 26466 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 26467 // 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) 26468 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 26469 for { 26470 _ = v.Args[1] 26471 sh := v.Args[0] 26472 if sh.Op != OpS390XSLDconst { 26473 break 26474 } 26475 if sh.AuxInt != 32 { 26476 break 26477 } 26478 r1 := sh.Args[0] 26479 if r1.Op != OpS390XMOVWZreg { 26480 break 26481 } 26482 x1 := r1.Args[0] 26483 if x1.Op != OpS390XMOVWBRloadidx { 26484 break 26485 } 26486 i1 := x1.AuxInt 26487 s := x1.Aux 26488 _ = x1.Args[2] 26489 idx := x1.Args[0] 26490 p := x1.Args[1] 26491 mem := x1.Args[2] 26492 r0 := v.Args[1] 26493 if r0.Op != OpS390XMOVWZreg { 26494 break 26495 } 26496 x0 := r0.Args[0] 26497 if x0.Op != OpS390XMOVWBRloadidx { 26498 break 26499 } 26500 i0 := x0.AuxInt 26501 if x0.Aux != s { 26502 break 26503 } 26504 _ = x0.Args[2] 26505 if idx != x0.Args[0] { 26506 break 26507 } 26508 if p != x0.Args[1] { 26509 break 26510 } 26511 if mem != x0.Args[2] { 26512 break 26513 } 26514 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)) { 26515 break 26516 } 26517 b = mergePoint(b, x0, x1) 26518 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) 26519 v.reset(OpCopy) 26520 v.AddArg(v0) 26521 v0.AuxInt = i0 26522 v0.Aux = s 26523 v0.AddArg(p) 26524 v0.AddArg(idx) 26525 v0.AddArg(mem) 26526 return true 26527 } 26528 // 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)) 26529 // 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) 26530 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26531 for { 26532 _ = v.Args[1] 26533 s1 := v.Args[0] 26534 if s1.Op != OpS390XSLDconst { 26535 break 26536 } 26537 j1 := s1.AuxInt 26538 x1 := s1.Args[0] 26539 if x1.Op != OpS390XMOVBZloadidx { 26540 break 26541 } 26542 i1 := x1.AuxInt 26543 s := x1.Aux 26544 _ = x1.Args[2] 26545 p := x1.Args[0] 26546 idx := x1.Args[1] 26547 mem := x1.Args[2] 26548 or := v.Args[1] 26549 if or.Op != OpS390XOR { 26550 break 26551 } 26552 _ = or.Args[1] 26553 s0 := or.Args[0] 26554 if s0.Op != OpS390XSLDconst { 26555 break 26556 } 26557 j0 := s0.AuxInt 26558 x0 := s0.Args[0] 26559 if x0.Op != OpS390XMOVBZloadidx { 26560 break 26561 } 26562 i0 := x0.AuxInt 26563 if x0.Aux != s { 26564 break 26565 } 26566 _ = x0.Args[2] 26567 if p != x0.Args[0] { 26568 break 26569 } 26570 if idx != x0.Args[1] { 26571 break 26572 } 26573 if mem != x0.Args[2] { 26574 break 26575 } 26576 y := or.Args[1] 26577 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)) { 26578 break 26579 } 26580 b = mergePoint(b, x0, x1) 26581 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26582 v.reset(OpCopy) 26583 v.AddArg(v0) 26584 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26585 v1.AuxInt = j0 26586 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26587 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26588 v3.AuxInt = i0 26589 v3.Aux = s 26590 v3.AddArg(p) 26591 v3.AddArg(idx) 26592 v3.AddArg(mem) 26593 v2.AddArg(v3) 26594 v1.AddArg(v2) 26595 v0.AddArg(v1) 26596 v0.AddArg(y) 26597 return true 26598 } 26599 return false 26600 } 26601 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 26602 b := v.Block 26603 _ = b 26604 typ := &b.Func.Config.Types 26605 _ = typ 26606 // 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)) 26607 // 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) 26608 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26609 for { 26610 _ = v.Args[1] 26611 s1 := v.Args[0] 26612 if s1.Op != OpS390XSLDconst { 26613 break 26614 } 26615 j1 := s1.AuxInt 26616 x1 := s1.Args[0] 26617 if x1.Op != OpS390XMOVBZloadidx { 26618 break 26619 } 26620 i1 := x1.AuxInt 26621 s := x1.Aux 26622 _ = x1.Args[2] 26623 idx := x1.Args[0] 26624 p := x1.Args[1] 26625 mem := x1.Args[2] 26626 or := v.Args[1] 26627 if or.Op != OpS390XOR { 26628 break 26629 } 26630 _ = or.Args[1] 26631 s0 := or.Args[0] 26632 if s0.Op != OpS390XSLDconst { 26633 break 26634 } 26635 j0 := s0.AuxInt 26636 x0 := s0.Args[0] 26637 if x0.Op != OpS390XMOVBZloadidx { 26638 break 26639 } 26640 i0 := x0.AuxInt 26641 if x0.Aux != s { 26642 break 26643 } 26644 _ = x0.Args[2] 26645 if p != x0.Args[0] { 26646 break 26647 } 26648 if idx != x0.Args[1] { 26649 break 26650 } 26651 if mem != x0.Args[2] { 26652 break 26653 } 26654 y := or.Args[1] 26655 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)) { 26656 break 26657 } 26658 b = mergePoint(b, x0, x1) 26659 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26660 v.reset(OpCopy) 26661 v.AddArg(v0) 26662 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26663 v1.AuxInt = j0 26664 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26665 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26666 v3.AuxInt = i0 26667 v3.Aux = s 26668 v3.AddArg(p) 26669 v3.AddArg(idx) 26670 v3.AddArg(mem) 26671 v2.AddArg(v3) 26672 v1.AddArg(v2) 26673 v0.AddArg(v1) 26674 v0.AddArg(y) 26675 return true 26676 } 26677 // 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)) 26678 // 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) 26679 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26680 for { 26681 _ = v.Args[1] 26682 s1 := v.Args[0] 26683 if s1.Op != OpS390XSLDconst { 26684 break 26685 } 26686 j1 := s1.AuxInt 26687 x1 := s1.Args[0] 26688 if x1.Op != OpS390XMOVBZloadidx { 26689 break 26690 } 26691 i1 := x1.AuxInt 26692 s := x1.Aux 26693 _ = x1.Args[2] 26694 p := x1.Args[0] 26695 idx := x1.Args[1] 26696 mem := x1.Args[2] 26697 or := v.Args[1] 26698 if or.Op != OpS390XOR { 26699 break 26700 } 26701 _ = or.Args[1] 26702 s0 := or.Args[0] 26703 if s0.Op != OpS390XSLDconst { 26704 break 26705 } 26706 j0 := s0.AuxInt 26707 x0 := s0.Args[0] 26708 if x0.Op != OpS390XMOVBZloadidx { 26709 break 26710 } 26711 i0 := x0.AuxInt 26712 if x0.Aux != s { 26713 break 26714 } 26715 _ = x0.Args[2] 26716 if idx != x0.Args[0] { 26717 break 26718 } 26719 if p != x0.Args[1] { 26720 break 26721 } 26722 if mem != x0.Args[2] { 26723 break 26724 } 26725 y := or.Args[1] 26726 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)) { 26727 break 26728 } 26729 b = mergePoint(b, x0, x1) 26730 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26731 v.reset(OpCopy) 26732 v.AddArg(v0) 26733 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26734 v1.AuxInt = j0 26735 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26736 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26737 v3.AuxInt = i0 26738 v3.Aux = s 26739 v3.AddArg(p) 26740 v3.AddArg(idx) 26741 v3.AddArg(mem) 26742 v2.AddArg(v3) 26743 v1.AddArg(v2) 26744 v0.AddArg(v1) 26745 v0.AddArg(y) 26746 return true 26747 } 26748 // 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)) 26749 // 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) 26750 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26751 for { 26752 _ = v.Args[1] 26753 s1 := v.Args[0] 26754 if s1.Op != OpS390XSLDconst { 26755 break 26756 } 26757 j1 := s1.AuxInt 26758 x1 := s1.Args[0] 26759 if x1.Op != OpS390XMOVBZloadidx { 26760 break 26761 } 26762 i1 := x1.AuxInt 26763 s := x1.Aux 26764 _ = x1.Args[2] 26765 idx := x1.Args[0] 26766 p := x1.Args[1] 26767 mem := x1.Args[2] 26768 or := v.Args[1] 26769 if or.Op != OpS390XOR { 26770 break 26771 } 26772 _ = or.Args[1] 26773 s0 := or.Args[0] 26774 if s0.Op != OpS390XSLDconst { 26775 break 26776 } 26777 j0 := s0.AuxInt 26778 x0 := s0.Args[0] 26779 if x0.Op != OpS390XMOVBZloadidx { 26780 break 26781 } 26782 i0 := x0.AuxInt 26783 if x0.Aux != s { 26784 break 26785 } 26786 _ = x0.Args[2] 26787 if idx != x0.Args[0] { 26788 break 26789 } 26790 if p != x0.Args[1] { 26791 break 26792 } 26793 if mem != x0.Args[2] { 26794 break 26795 } 26796 y := or.Args[1] 26797 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)) { 26798 break 26799 } 26800 b = mergePoint(b, x0, x1) 26801 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26802 v.reset(OpCopy) 26803 v.AddArg(v0) 26804 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26805 v1.AuxInt = j0 26806 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26807 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26808 v3.AuxInt = i0 26809 v3.Aux = s 26810 v3.AddArg(p) 26811 v3.AddArg(idx) 26812 v3.AddArg(mem) 26813 v2.AddArg(v3) 26814 v1.AddArg(v2) 26815 v0.AddArg(v1) 26816 v0.AddArg(y) 26817 return true 26818 } 26819 // 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)))) 26820 // 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) 26821 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26822 for { 26823 _ = v.Args[1] 26824 s1 := v.Args[0] 26825 if s1.Op != OpS390XSLDconst { 26826 break 26827 } 26828 j1 := s1.AuxInt 26829 x1 := s1.Args[0] 26830 if x1.Op != OpS390XMOVBZloadidx { 26831 break 26832 } 26833 i1 := x1.AuxInt 26834 s := x1.Aux 26835 _ = x1.Args[2] 26836 p := x1.Args[0] 26837 idx := x1.Args[1] 26838 mem := x1.Args[2] 26839 or := v.Args[1] 26840 if or.Op != OpS390XOR { 26841 break 26842 } 26843 _ = or.Args[1] 26844 y := or.Args[0] 26845 s0 := or.Args[1] 26846 if s0.Op != OpS390XSLDconst { 26847 break 26848 } 26849 j0 := s0.AuxInt 26850 x0 := s0.Args[0] 26851 if x0.Op != OpS390XMOVBZloadidx { 26852 break 26853 } 26854 i0 := x0.AuxInt 26855 if x0.Aux != s { 26856 break 26857 } 26858 _ = x0.Args[2] 26859 if p != x0.Args[0] { 26860 break 26861 } 26862 if idx != x0.Args[1] { 26863 break 26864 } 26865 if mem != x0.Args[2] { 26866 break 26867 } 26868 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)) { 26869 break 26870 } 26871 b = mergePoint(b, x0, x1) 26872 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26873 v.reset(OpCopy) 26874 v.AddArg(v0) 26875 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26876 v1.AuxInt = j0 26877 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26878 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26879 v3.AuxInt = i0 26880 v3.Aux = s 26881 v3.AddArg(p) 26882 v3.AddArg(idx) 26883 v3.AddArg(mem) 26884 v2.AddArg(v3) 26885 v1.AddArg(v2) 26886 v0.AddArg(v1) 26887 v0.AddArg(y) 26888 return true 26889 } 26890 // 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)))) 26891 // 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) 26892 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26893 for { 26894 _ = v.Args[1] 26895 s1 := v.Args[0] 26896 if s1.Op != OpS390XSLDconst { 26897 break 26898 } 26899 j1 := s1.AuxInt 26900 x1 := s1.Args[0] 26901 if x1.Op != OpS390XMOVBZloadidx { 26902 break 26903 } 26904 i1 := x1.AuxInt 26905 s := x1.Aux 26906 _ = x1.Args[2] 26907 idx := x1.Args[0] 26908 p := x1.Args[1] 26909 mem := x1.Args[2] 26910 or := v.Args[1] 26911 if or.Op != OpS390XOR { 26912 break 26913 } 26914 _ = or.Args[1] 26915 y := or.Args[0] 26916 s0 := or.Args[1] 26917 if s0.Op != OpS390XSLDconst { 26918 break 26919 } 26920 j0 := s0.AuxInt 26921 x0 := s0.Args[0] 26922 if x0.Op != OpS390XMOVBZloadidx { 26923 break 26924 } 26925 i0 := x0.AuxInt 26926 if x0.Aux != s { 26927 break 26928 } 26929 _ = x0.Args[2] 26930 if p != x0.Args[0] { 26931 break 26932 } 26933 if idx != x0.Args[1] { 26934 break 26935 } 26936 if mem != x0.Args[2] { 26937 break 26938 } 26939 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)) { 26940 break 26941 } 26942 b = mergePoint(b, x0, x1) 26943 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26944 v.reset(OpCopy) 26945 v.AddArg(v0) 26946 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26947 v1.AuxInt = j0 26948 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 26949 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 26950 v3.AuxInt = i0 26951 v3.Aux = s 26952 v3.AddArg(p) 26953 v3.AddArg(idx) 26954 v3.AddArg(mem) 26955 v2.AddArg(v3) 26956 v1.AddArg(v2) 26957 v0.AddArg(v1) 26958 v0.AddArg(y) 26959 return true 26960 } 26961 // 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)))) 26962 // 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) 26963 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26964 for { 26965 _ = v.Args[1] 26966 s1 := v.Args[0] 26967 if s1.Op != OpS390XSLDconst { 26968 break 26969 } 26970 j1 := s1.AuxInt 26971 x1 := s1.Args[0] 26972 if x1.Op != OpS390XMOVBZloadidx { 26973 break 26974 } 26975 i1 := x1.AuxInt 26976 s := x1.Aux 26977 _ = x1.Args[2] 26978 p := x1.Args[0] 26979 idx := x1.Args[1] 26980 mem := x1.Args[2] 26981 or := v.Args[1] 26982 if or.Op != OpS390XOR { 26983 break 26984 } 26985 _ = or.Args[1] 26986 y := or.Args[0] 26987 s0 := or.Args[1] 26988 if s0.Op != OpS390XSLDconst { 26989 break 26990 } 26991 j0 := s0.AuxInt 26992 x0 := s0.Args[0] 26993 if x0.Op != OpS390XMOVBZloadidx { 26994 break 26995 } 26996 i0 := x0.AuxInt 26997 if x0.Aux != s { 26998 break 26999 } 27000 _ = x0.Args[2] 27001 if idx != x0.Args[0] { 27002 break 27003 } 27004 if p != x0.Args[1] { 27005 break 27006 } 27007 if mem != x0.Args[2] { 27008 break 27009 } 27010 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)) { 27011 break 27012 } 27013 b = mergePoint(b, x0, x1) 27014 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27015 v.reset(OpCopy) 27016 v.AddArg(v0) 27017 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27018 v1.AuxInt = j0 27019 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27020 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27021 v3.AuxInt = i0 27022 v3.Aux = s 27023 v3.AddArg(p) 27024 v3.AddArg(idx) 27025 v3.AddArg(mem) 27026 v2.AddArg(v3) 27027 v1.AddArg(v2) 27028 v0.AddArg(v1) 27029 v0.AddArg(y) 27030 return true 27031 } 27032 // 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)))) 27033 // 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) 27034 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27035 for { 27036 _ = v.Args[1] 27037 s1 := v.Args[0] 27038 if s1.Op != OpS390XSLDconst { 27039 break 27040 } 27041 j1 := s1.AuxInt 27042 x1 := s1.Args[0] 27043 if x1.Op != OpS390XMOVBZloadidx { 27044 break 27045 } 27046 i1 := x1.AuxInt 27047 s := x1.Aux 27048 _ = x1.Args[2] 27049 idx := x1.Args[0] 27050 p := x1.Args[1] 27051 mem := x1.Args[2] 27052 or := v.Args[1] 27053 if or.Op != OpS390XOR { 27054 break 27055 } 27056 _ = or.Args[1] 27057 y := or.Args[0] 27058 s0 := or.Args[1] 27059 if s0.Op != OpS390XSLDconst { 27060 break 27061 } 27062 j0 := s0.AuxInt 27063 x0 := s0.Args[0] 27064 if x0.Op != OpS390XMOVBZloadidx { 27065 break 27066 } 27067 i0 := x0.AuxInt 27068 if x0.Aux != s { 27069 break 27070 } 27071 _ = x0.Args[2] 27072 if idx != x0.Args[0] { 27073 break 27074 } 27075 if p != x0.Args[1] { 27076 break 27077 } 27078 if mem != x0.Args[2] { 27079 break 27080 } 27081 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)) { 27082 break 27083 } 27084 b = mergePoint(b, x0, x1) 27085 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27086 v.reset(OpCopy) 27087 v.AddArg(v0) 27088 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27089 v1.AuxInt = j0 27090 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27091 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27092 v3.AuxInt = i0 27093 v3.Aux = s 27094 v3.AddArg(p) 27095 v3.AddArg(idx) 27096 v3.AddArg(mem) 27097 v2.AddArg(v3) 27098 v1.AddArg(v2) 27099 v0.AddArg(v1) 27100 v0.AddArg(y) 27101 return true 27102 } 27103 // 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))) 27104 // 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) 27105 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27106 for { 27107 _ = v.Args[1] 27108 or := v.Args[0] 27109 if or.Op != OpS390XOR { 27110 break 27111 } 27112 _ = or.Args[1] 27113 s0 := or.Args[0] 27114 if s0.Op != OpS390XSLDconst { 27115 break 27116 } 27117 j0 := s0.AuxInt 27118 x0 := s0.Args[0] 27119 if x0.Op != OpS390XMOVBZloadidx { 27120 break 27121 } 27122 i0 := x0.AuxInt 27123 s := x0.Aux 27124 _ = x0.Args[2] 27125 p := x0.Args[0] 27126 idx := x0.Args[1] 27127 mem := x0.Args[2] 27128 y := or.Args[1] 27129 s1 := v.Args[1] 27130 if s1.Op != OpS390XSLDconst { 27131 break 27132 } 27133 j1 := s1.AuxInt 27134 x1 := s1.Args[0] 27135 if x1.Op != OpS390XMOVBZloadidx { 27136 break 27137 } 27138 i1 := x1.AuxInt 27139 if x1.Aux != s { 27140 break 27141 } 27142 _ = x1.Args[2] 27143 if p != x1.Args[0] { 27144 break 27145 } 27146 if idx != x1.Args[1] { 27147 break 27148 } 27149 if mem != x1.Args[2] { 27150 break 27151 } 27152 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)) { 27153 break 27154 } 27155 b = mergePoint(b, x0, x1) 27156 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27157 v.reset(OpCopy) 27158 v.AddArg(v0) 27159 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27160 v1.AuxInt = j0 27161 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27162 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27163 v3.AuxInt = i0 27164 v3.Aux = s 27165 v3.AddArg(p) 27166 v3.AddArg(idx) 27167 v3.AddArg(mem) 27168 v2.AddArg(v3) 27169 v1.AddArg(v2) 27170 v0.AddArg(v1) 27171 v0.AddArg(y) 27172 return true 27173 } 27174 // 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))) 27175 // 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) 27176 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27177 for { 27178 _ = v.Args[1] 27179 or := v.Args[0] 27180 if or.Op != OpS390XOR { 27181 break 27182 } 27183 _ = or.Args[1] 27184 s0 := or.Args[0] 27185 if s0.Op != OpS390XSLDconst { 27186 break 27187 } 27188 j0 := s0.AuxInt 27189 x0 := s0.Args[0] 27190 if x0.Op != OpS390XMOVBZloadidx { 27191 break 27192 } 27193 i0 := x0.AuxInt 27194 s := x0.Aux 27195 _ = x0.Args[2] 27196 idx := x0.Args[0] 27197 p := x0.Args[1] 27198 mem := x0.Args[2] 27199 y := or.Args[1] 27200 s1 := v.Args[1] 27201 if s1.Op != OpS390XSLDconst { 27202 break 27203 } 27204 j1 := s1.AuxInt 27205 x1 := s1.Args[0] 27206 if x1.Op != OpS390XMOVBZloadidx { 27207 break 27208 } 27209 i1 := x1.AuxInt 27210 if x1.Aux != s { 27211 break 27212 } 27213 _ = x1.Args[2] 27214 if p != x1.Args[0] { 27215 break 27216 } 27217 if idx != x1.Args[1] { 27218 break 27219 } 27220 if mem != x1.Args[2] { 27221 break 27222 } 27223 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)) { 27224 break 27225 } 27226 b = mergePoint(b, x0, x1) 27227 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27228 v.reset(OpCopy) 27229 v.AddArg(v0) 27230 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27231 v1.AuxInt = j0 27232 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27233 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27234 v3.AuxInt = i0 27235 v3.Aux = s 27236 v3.AddArg(p) 27237 v3.AddArg(idx) 27238 v3.AddArg(mem) 27239 v2.AddArg(v3) 27240 v1.AddArg(v2) 27241 v0.AddArg(v1) 27242 v0.AddArg(y) 27243 return true 27244 } 27245 // 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))) 27246 // 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) 27247 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27248 for { 27249 _ = v.Args[1] 27250 or := v.Args[0] 27251 if or.Op != OpS390XOR { 27252 break 27253 } 27254 _ = or.Args[1] 27255 y := or.Args[0] 27256 s0 := or.Args[1] 27257 if s0.Op != OpS390XSLDconst { 27258 break 27259 } 27260 j0 := s0.AuxInt 27261 x0 := s0.Args[0] 27262 if x0.Op != OpS390XMOVBZloadidx { 27263 break 27264 } 27265 i0 := x0.AuxInt 27266 s := x0.Aux 27267 _ = x0.Args[2] 27268 p := x0.Args[0] 27269 idx := x0.Args[1] 27270 mem := x0.Args[2] 27271 s1 := v.Args[1] 27272 if s1.Op != OpS390XSLDconst { 27273 break 27274 } 27275 j1 := s1.AuxInt 27276 x1 := s1.Args[0] 27277 if x1.Op != OpS390XMOVBZloadidx { 27278 break 27279 } 27280 i1 := x1.AuxInt 27281 if x1.Aux != s { 27282 break 27283 } 27284 _ = x1.Args[2] 27285 if p != x1.Args[0] { 27286 break 27287 } 27288 if idx != x1.Args[1] { 27289 break 27290 } 27291 if mem != x1.Args[2] { 27292 break 27293 } 27294 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)) { 27295 break 27296 } 27297 b = mergePoint(b, x0, x1) 27298 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27299 v.reset(OpCopy) 27300 v.AddArg(v0) 27301 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27302 v1.AuxInt = j0 27303 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27304 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27305 v3.AuxInt = i0 27306 v3.Aux = s 27307 v3.AddArg(p) 27308 v3.AddArg(idx) 27309 v3.AddArg(mem) 27310 v2.AddArg(v3) 27311 v1.AddArg(v2) 27312 v0.AddArg(v1) 27313 v0.AddArg(y) 27314 return true 27315 } 27316 return false 27317 } 27318 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 27319 b := v.Block 27320 _ = b 27321 typ := &b.Func.Config.Types 27322 _ = typ 27323 // 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))) 27324 // 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) 27325 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27326 for { 27327 _ = v.Args[1] 27328 or := v.Args[0] 27329 if or.Op != OpS390XOR { 27330 break 27331 } 27332 _ = or.Args[1] 27333 y := or.Args[0] 27334 s0 := or.Args[1] 27335 if s0.Op != OpS390XSLDconst { 27336 break 27337 } 27338 j0 := s0.AuxInt 27339 x0 := s0.Args[0] 27340 if x0.Op != OpS390XMOVBZloadidx { 27341 break 27342 } 27343 i0 := x0.AuxInt 27344 s := x0.Aux 27345 _ = x0.Args[2] 27346 idx := x0.Args[0] 27347 p := x0.Args[1] 27348 mem := x0.Args[2] 27349 s1 := v.Args[1] 27350 if s1.Op != OpS390XSLDconst { 27351 break 27352 } 27353 j1 := s1.AuxInt 27354 x1 := s1.Args[0] 27355 if x1.Op != OpS390XMOVBZloadidx { 27356 break 27357 } 27358 i1 := x1.AuxInt 27359 if x1.Aux != s { 27360 break 27361 } 27362 _ = x1.Args[2] 27363 if p != x1.Args[0] { 27364 break 27365 } 27366 if idx != x1.Args[1] { 27367 break 27368 } 27369 if mem != x1.Args[2] { 27370 break 27371 } 27372 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)) { 27373 break 27374 } 27375 b = mergePoint(b, x0, x1) 27376 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27377 v.reset(OpCopy) 27378 v.AddArg(v0) 27379 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27380 v1.AuxInt = j0 27381 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27382 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27383 v3.AuxInt = i0 27384 v3.Aux = s 27385 v3.AddArg(p) 27386 v3.AddArg(idx) 27387 v3.AddArg(mem) 27388 v2.AddArg(v3) 27389 v1.AddArg(v2) 27390 v0.AddArg(v1) 27391 v0.AddArg(y) 27392 return true 27393 } 27394 // 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))) 27395 // 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) 27396 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27397 for { 27398 _ = v.Args[1] 27399 or := v.Args[0] 27400 if or.Op != OpS390XOR { 27401 break 27402 } 27403 _ = or.Args[1] 27404 s0 := or.Args[0] 27405 if s0.Op != OpS390XSLDconst { 27406 break 27407 } 27408 j0 := s0.AuxInt 27409 x0 := s0.Args[0] 27410 if x0.Op != OpS390XMOVBZloadidx { 27411 break 27412 } 27413 i0 := x0.AuxInt 27414 s := x0.Aux 27415 _ = x0.Args[2] 27416 p := x0.Args[0] 27417 idx := x0.Args[1] 27418 mem := x0.Args[2] 27419 y := or.Args[1] 27420 s1 := v.Args[1] 27421 if s1.Op != OpS390XSLDconst { 27422 break 27423 } 27424 j1 := s1.AuxInt 27425 x1 := s1.Args[0] 27426 if x1.Op != OpS390XMOVBZloadidx { 27427 break 27428 } 27429 i1 := x1.AuxInt 27430 if x1.Aux != s { 27431 break 27432 } 27433 _ = x1.Args[2] 27434 if idx != x1.Args[0] { 27435 break 27436 } 27437 if p != x1.Args[1] { 27438 break 27439 } 27440 if mem != x1.Args[2] { 27441 break 27442 } 27443 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)) { 27444 break 27445 } 27446 b = mergePoint(b, x0, x1) 27447 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27448 v.reset(OpCopy) 27449 v.AddArg(v0) 27450 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27451 v1.AuxInt = j0 27452 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27453 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27454 v3.AuxInt = i0 27455 v3.Aux = s 27456 v3.AddArg(p) 27457 v3.AddArg(idx) 27458 v3.AddArg(mem) 27459 v2.AddArg(v3) 27460 v1.AddArg(v2) 27461 v0.AddArg(v1) 27462 v0.AddArg(y) 27463 return true 27464 } 27465 // 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))) 27466 // 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) 27467 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27468 for { 27469 _ = v.Args[1] 27470 or := v.Args[0] 27471 if or.Op != OpS390XOR { 27472 break 27473 } 27474 _ = or.Args[1] 27475 s0 := or.Args[0] 27476 if s0.Op != OpS390XSLDconst { 27477 break 27478 } 27479 j0 := s0.AuxInt 27480 x0 := s0.Args[0] 27481 if x0.Op != OpS390XMOVBZloadidx { 27482 break 27483 } 27484 i0 := x0.AuxInt 27485 s := x0.Aux 27486 _ = x0.Args[2] 27487 idx := x0.Args[0] 27488 p := x0.Args[1] 27489 mem := x0.Args[2] 27490 y := or.Args[1] 27491 s1 := v.Args[1] 27492 if s1.Op != OpS390XSLDconst { 27493 break 27494 } 27495 j1 := s1.AuxInt 27496 x1 := s1.Args[0] 27497 if x1.Op != OpS390XMOVBZloadidx { 27498 break 27499 } 27500 i1 := x1.AuxInt 27501 if x1.Aux != s { 27502 break 27503 } 27504 _ = x1.Args[2] 27505 if idx != x1.Args[0] { 27506 break 27507 } 27508 if p != x1.Args[1] { 27509 break 27510 } 27511 if mem != x1.Args[2] { 27512 break 27513 } 27514 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)) { 27515 break 27516 } 27517 b = mergePoint(b, x0, x1) 27518 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27519 v.reset(OpCopy) 27520 v.AddArg(v0) 27521 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27522 v1.AuxInt = j0 27523 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27524 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27525 v3.AuxInt = i0 27526 v3.Aux = s 27527 v3.AddArg(p) 27528 v3.AddArg(idx) 27529 v3.AddArg(mem) 27530 v2.AddArg(v3) 27531 v1.AddArg(v2) 27532 v0.AddArg(v1) 27533 v0.AddArg(y) 27534 return true 27535 } 27536 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 27537 // 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) 27538 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27539 for { 27540 _ = v.Args[1] 27541 or := v.Args[0] 27542 if or.Op != OpS390XOR { 27543 break 27544 } 27545 _ = or.Args[1] 27546 y := or.Args[0] 27547 s0 := or.Args[1] 27548 if s0.Op != OpS390XSLDconst { 27549 break 27550 } 27551 j0 := s0.AuxInt 27552 x0 := s0.Args[0] 27553 if x0.Op != OpS390XMOVBZloadidx { 27554 break 27555 } 27556 i0 := x0.AuxInt 27557 s := x0.Aux 27558 _ = x0.Args[2] 27559 p := x0.Args[0] 27560 idx := x0.Args[1] 27561 mem := x0.Args[2] 27562 s1 := v.Args[1] 27563 if s1.Op != OpS390XSLDconst { 27564 break 27565 } 27566 j1 := s1.AuxInt 27567 x1 := s1.Args[0] 27568 if x1.Op != OpS390XMOVBZloadidx { 27569 break 27570 } 27571 i1 := x1.AuxInt 27572 if x1.Aux != s { 27573 break 27574 } 27575 _ = x1.Args[2] 27576 if idx != x1.Args[0] { 27577 break 27578 } 27579 if p != x1.Args[1] { 27580 break 27581 } 27582 if mem != x1.Args[2] { 27583 break 27584 } 27585 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)) { 27586 break 27587 } 27588 b = mergePoint(b, x0, x1) 27589 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27590 v.reset(OpCopy) 27591 v.AddArg(v0) 27592 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27593 v1.AuxInt = j0 27594 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27595 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27596 v3.AuxInt = i0 27597 v3.Aux = s 27598 v3.AddArg(p) 27599 v3.AddArg(idx) 27600 v3.AddArg(mem) 27601 v2.AddArg(v3) 27602 v1.AddArg(v2) 27603 v0.AddArg(v1) 27604 v0.AddArg(y) 27605 return true 27606 } 27607 // 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))) 27608 // 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) 27609 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 27610 for { 27611 _ = v.Args[1] 27612 or := v.Args[0] 27613 if or.Op != OpS390XOR { 27614 break 27615 } 27616 _ = or.Args[1] 27617 y := or.Args[0] 27618 s0 := or.Args[1] 27619 if s0.Op != OpS390XSLDconst { 27620 break 27621 } 27622 j0 := s0.AuxInt 27623 x0 := s0.Args[0] 27624 if x0.Op != OpS390XMOVBZloadidx { 27625 break 27626 } 27627 i0 := x0.AuxInt 27628 s := x0.Aux 27629 _ = x0.Args[2] 27630 idx := x0.Args[0] 27631 p := x0.Args[1] 27632 mem := x0.Args[2] 27633 s1 := v.Args[1] 27634 if s1.Op != OpS390XSLDconst { 27635 break 27636 } 27637 j1 := s1.AuxInt 27638 x1 := s1.Args[0] 27639 if x1.Op != OpS390XMOVBZloadidx { 27640 break 27641 } 27642 i1 := x1.AuxInt 27643 if x1.Aux != s { 27644 break 27645 } 27646 _ = x1.Args[2] 27647 if idx != x1.Args[0] { 27648 break 27649 } 27650 if p != x1.Args[1] { 27651 break 27652 } 27653 if mem != x1.Args[2] { 27654 break 27655 } 27656 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)) { 27657 break 27658 } 27659 b = mergePoint(b, x0, x1) 27660 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27661 v.reset(OpCopy) 27662 v.AddArg(v0) 27663 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27664 v1.AuxInt = j0 27665 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 27666 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 27667 v3.AuxInt = i0 27668 v3.Aux = s 27669 v3.AddArg(p) 27670 v3.AddArg(idx) 27671 v3.AddArg(mem) 27672 v2.AddArg(v3) 27673 v1.AddArg(v2) 27674 v0.AddArg(v1) 27675 v0.AddArg(y) 27676 return true 27677 } 27678 // 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)) 27679 // 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) 27680 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27681 for { 27682 _ = v.Args[1] 27683 s1 := v.Args[0] 27684 if s1.Op != OpS390XSLDconst { 27685 break 27686 } 27687 j1 := s1.AuxInt 27688 r1 := s1.Args[0] 27689 if r1.Op != OpS390XMOVHZreg { 27690 break 27691 } 27692 x1 := r1.Args[0] 27693 if x1.Op != OpS390XMOVHBRloadidx { 27694 break 27695 } 27696 i1 := x1.AuxInt 27697 s := x1.Aux 27698 _ = x1.Args[2] 27699 p := x1.Args[0] 27700 idx := x1.Args[1] 27701 mem := x1.Args[2] 27702 or := v.Args[1] 27703 if or.Op != OpS390XOR { 27704 break 27705 } 27706 _ = or.Args[1] 27707 s0 := or.Args[0] 27708 if s0.Op != OpS390XSLDconst { 27709 break 27710 } 27711 j0 := s0.AuxInt 27712 r0 := s0.Args[0] 27713 if r0.Op != OpS390XMOVHZreg { 27714 break 27715 } 27716 x0 := r0.Args[0] 27717 if x0.Op != OpS390XMOVHBRloadidx { 27718 break 27719 } 27720 i0 := x0.AuxInt 27721 if x0.Aux != s { 27722 break 27723 } 27724 _ = x0.Args[2] 27725 if p != x0.Args[0] { 27726 break 27727 } 27728 if idx != x0.Args[1] { 27729 break 27730 } 27731 if mem != x0.Args[2] { 27732 break 27733 } 27734 y := or.Args[1] 27735 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)) { 27736 break 27737 } 27738 b = mergePoint(b, x0, x1) 27739 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27740 v.reset(OpCopy) 27741 v.AddArg(v0) 27742 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27743 v1.AuxInt = j0 27744 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27745 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27746 v3.AuxInt = i0 27747 v3.Aux = s 27748 v3.AddArg(p) 27749 v3.AddArg(idx) 27750 v3.AddArg(mem) 27751 v2.AddArg(v3) 27752 v1.AddArg(v2) 27753 v0.AddArg(v1) 27754 v0.AddArg(y) 27755 return true 27756 } 27757 // 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)) 27758 // 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) 27759 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27760 for { 27761 _ = v.Args[1] 27762 s1 := v.Args[0] 27763 if s1.Op != OpS390XSLDconst { 27764 break 27765 } 27766 j1 := s1.AuxInt 27767 r1 := s1.Args[0] 27768 if r1.Op != OpS390XMOVHZreg { 27769 break 27770 } 27771 x1 := r1.Args[0] 27772 if x1.Op != OpS390XMOVHBRloadidx { 27773 break 27774 } 27775 i1 := x1.AuxInt 27776 s := x1.Aux 27777 _ = x1.Args[2] 27778 idx := x1.Args[0] 27779 p := x1.Args[1] 27780 mem := x1.Args[2] 27781 or := v.Args[1] 27782 if or.Op != OpS390XOR { 27783 break 27784 } 27785 _ = or.Args[1] 27786 s0 := or.Args[0] 27787 if s0.Op != OpS390XSLDconst { 27788 break 27789 } 27790 j0 := s0.AuxInt 27791 r0 := s0.Args[0] 27792 if r0.Op != OpS390XMOVHZreg { 27793 break 27794 } 27795 x0 := r0.Args[0] 27796 if x0.Op != OpS390XMOVHBRloadidx { 27797 break 27798 } 27799 i0 := x0.AuxInt 27800 if x0.Aux != s { 27801 break 27802 } 27803 _ = x0.Args[2] 27804 if p != x0.Args[0] { 27805 break 27806 } 27807 if idx != x0.Args[1] { 27808 break 27809 } 27810 if mem != x0.Args[2] { 27811 break 27812 } 27813 y := or.Args[1] 27814 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)) { 27815 break 27816 } 27817 b = mergePoint(b, x0, x1) 27818 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27819 v.reset(OpCopy) 27820 v.AddArg(v0) 27821 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27822 v1.AuxInt = j0 27823 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27824 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27825 v3.AuxInt = i0 27826 v3.Aux = s 27827 v3.AddArg(p) 27828 v3.AddArg(idx) 27829 v3.AddArg(mem) 27830 v2.AddArg(v3) 27831 v1.AddArg(v2) 27832 v0.AddArg(v1) 27833 v0.AddArg(y) 27834 return true 27835 } 27836 // 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)) 27837 // 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) 27838 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27839 for { 27840 _ = v.Args[1] 27841 s1 := v.Args[0] 27842 if s1.Op != OpS390XSLDconst { 27843 break 27844 } 27845 j1 := s1.AuxInt 27846 r1 := s1.Args[0] 27847 if r1.Op != OpS390XMOVHZreg { 27848 break 27849 } 27850 x1 := r1.Args[0] 27851 if x1.Op != OpS390XMOVHBRloadidx { 27852 break 27853 } 27854 i1 := x1.AuxInt 27855 s := x1.Aux 27856 _ = x1.Args[2] 27857 p := x1.Args[0] 27858 idx := x1.Args[1] 27859 mem := x1.Args[2] 27860 or := v.Args[1] 27861 if or.Op != OpS390XOR { 27862 break 27863 } 27864 _ = or.Args[1] 27865 s0 := or.Args[0] 27866 if s0.Op != OpS390XSLDconst { 27867 break 27868 } 27869 j0 := s0.AuxInt 27870 r0 := s0.Args[0] 27871 if r0.Op != OpS390XMOVHZreg { 27872 break 27873 } 27874 x0 := r0.Args[0] 27875 if x0.Op != OpS390XMOVHBRloadidx { 27876 break 27877 } 27878 i0 := x0.AuxInt 27879 if x0.Aux != s { 27880 break 27881 } 27882 _ = x0.Args[2] 27883 if idx != x0.Args[0] { 27884 break 27885 } 27886 if p != x0.Args[1] { 27887 break 27888 } 27889 if mem != x0.Args[2] { 27890 break 27891 } 27892 y := or.Args[1] 27893 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)) { 27894 break 27895 } 27896 b = mergePoint(b, x0, x1) 27897 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27898 v.reset(OpCopy) 27899 v.AddArg(v0) 27900 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27901 v1.AuxInt = j0 27902 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27903 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27904 v3.AuxInt = i0 27905 v3.Aux = s 27906 v3.AddArg(p) 27907 v3.AddArg(idx) 27908 v3.AddArg(mem) 27909 v2.AddArg(v3) 27910 v1.AddArg(v2) 27911 v0.AddArg(v1) 27912 v0.AddArg(y) 27913 return true 27914 } 27915 // 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)) 27916 // 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) 27917 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27918 for { 27919 _ = v.Args[1] 27920 s1 := v.Args[0] 27921 if s1.Op != OpS390XSLDconst { 27922 break 27923 } 27924 j1 := s1.AuxInt 27925 r1 := s1.Args[0] 27926 if r1.Op != OpS390XMOVHZreg { 27927 break 27928 } 27929 x1 := r1.Args[0] 27930 if x1.Op != OpS390XMOVHBRloadidx { 27931 break 27932 } 27933 i1 := x1.AuxInt 27934 s := x1.Aux 27935 _ = x1.Args[2] 27936 idx := x1.Args[0] 27937 p := x1.Args[1] 27938 mem := x1.Args[2] 27939 or := v.Args[1] 27940 if or.Op != OpS390XOR { 27941 break 27942 } 27943 _ = or.Args[1] 27944 s0 := or.Args[0] 27945 if s0.Op != OpS390XSLDconst { 27946 break 27947 } 27948 j0 := s0.AuxInt 27949 r0 := s0.Args[0] 27950 if r0.Op != OpS390XMOVHZreg { 27951 break 27952 } 27953 x0 := r0.Args[0] 27954 if x0.Op != OpS390XMOVHBRloadidx { 27955 break 27956 } 27957 i0 := x0.AuxInt 27958 if x0.Aux != s { 27959 break 27960 } 27961 _ = x0.Args[2] 27962 if idx != x0.Args[0] { 27963 break 27964 } 27965 if p != x0.Args[1] { 27966 break 27967 } 27968 if mem != x0.Args[2] { 27969 break 27970 } 27971 y := or.Args[1] 27972 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)) { 27973 break 27974 } 27975 b = mergePoint(b, x0, x1) 27976 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27977 v.reset(OpCopy) 27978 v.AddArg(v0) 27979 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27980 v1.AuxInt = j0 27981 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 27982 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 27983 v3.AuxInt = i0 27984 v3.Aux = s 27985 v3.AddArg(p) 27986 v3.AddArg(idx) 27987 v3.AddArg(mem) 27988 v2.AddArg(v3) 27989 v1.AddArg(v2) 27990 v0.AddArg(v1) 27991 v0.AddArg(y) 27992 return true 27993 } 27994 // 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))))) 27995 // 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) 27996 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27997 for { 27998 _ = v.Args[1] 27999 s1 := v.Args[0] 28000 if s1.Op != OpS390XSLDconst { 28001 break 28002 } 28003 j1 := s1.AuxInt 28004 r1 := s1.Args[0] 28005 if r1.Op != OpS390XMOVHZreg { 28006 break 28007 } 28008 x1 := r1.Args[0] 28009 if x1.Op != OpS390XMOVHBRloadidx { 28010 break 28011 } 28012 i1 := x1.AuxInt 28013 s := x1.Aux 28014 _ = x1.Args[2] 28015 p := x1.Args[0] 28016 idx := x1.Args[1] 28017 mem := x1.Args[2] 28018 or := v.Args[1] 28019 if or.Op != OpS390XOR { 28020 break 28021 } 28022 _ = or.Args[1] 28023 y := or.Args[0] 28024 s0 := or.Args[1] 28025 if s0.Op != OpS390XSLDconst { 28026 break 28027 } 28028 j0 := s0.AuxInt 28029 r0 := s0.Args[0] 28030 if r0.Op != OpS390XMOVHZreg { 28031 break 28032 } 28033 x0 := r0.Args[0] 28034 if x0.Op != OpS390XMOVHBRloadidx { 28035 break 28036 } 28037 i0 := x0.AuxInt 28038 if x0.Aux != s { 28039 break 28040 } 28041 _ = x0.Args[2] 28042 if p != x0.Args[0] { 28043 break 28044 } 28045 if idx != x0.Args[1] { 28046 break 28047 } 28048 if mem != x0.Args[2] { 28049 break 28050 } 28051 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)) { 28052 break 28053 } 28054 b = mergePoint(b, x0, x1) 28055 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28056 v.reset(OpCopy) 28057 v.AddArg(v0) 28058 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28059 v1.AuxInt = j0 28060 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28061 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28062 v3.AuxInt = i0 28063 v3.Aux = s 28064 v3.AddArg(p) 28065 v3.AddArg(idx) 28066 v3.AddArg(mem) 28067 v2.AddArg(v3) 28068 v1.AddArg(v2) 28069 v0.AddArg(v1) 28070 v0.AddArg(y) 28071 return true 28072 } 28073 return false 28074 } 28075 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 28076 b := v.Block 28077 _ = b 28078 typ := &b.Func.Config.Types 28079 _ = typ 28080 // 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))))) 28081 // 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) 28082 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28083 for { 28084 _ = v.Args[1] 28085 s1 := v.Args[0] 28086 if s1.Op != OpS390XSLDconst { 28087 break 28088 } 28089 j1 := s1.AuxInt 28090 r1 := s1.Args[0] 28091 if r1.Op != OpS390XMOVHZreg { 28092 break 28093 } 28094 x1 := r1.Args[0] 28095 if x1.Op != OpS390XMOVHBRloadidx { 28096 break 28097 } 28098 i1 := x1.AuxInt 28099 s := x1.Aux 28100 _ = x1.Args[2] 28101 idx := x1.Args[0] 28102 p := x1.Args[1] 28103 mem := x1.Args[2] 28104 or := v.Args[1] 28105 if or.Op != OpS390XOR { 28106 break 28107 } 28108 _ = or.Args[1] 28109 y := or.Args[0] 28110 s0 := or.Args[1] 28111 if s0.Op != OpS390XSLDconst { 28112 break 28113 } 28114 j0 := s0.AuxInt 28115 r0 := s0.Args[0] 28116 if r0.Op != OpS390XMOVHZreg { 28117 break 28118 } 28119 x0 := r0.Args[0] 28120 if x0.Op != OpS390XMOVHBRloadidx { 28121 break 28122 } 28123 i0 := x0.AuxInt 28124 if x0.Aux != s { 28125 break 28126 } 28127 _ = x0.Args[2] 28128 if p != x0.Args[0] { 28129 break 28130 } 28131 if idx != x0.Args[1] { 28132 break 28133 } 28134 if mem != x0.Args[2] { 28135 break 28136 } 28137 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)) { 28138 break 28139 } 28140 b = mergePoint(b, x0, x1) 28141 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28142 v.reset(OpCopy) 28143 v.AddArg(v0) 28144 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28145 v1.AuxInt = j0 28146 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28147 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28148 v3.AuxInt = i0 28149 v3.Aux = s 28150 v3.AddArg(p) 28151 v3.AddArg(idx) 28152 v3.AddArg(mem) 28153 v2.AddArg(v3) 28154 v1.AddArg(v2) 28155 v0.AddArg(v1) 28156 v0.AddArg(y) 28157 return true 28158 } 28159 // 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))))) 28160 // 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) 28161 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28162 for { 28163 _ = v.Args[1] 28164 s1 := v.Args[0] 28165 if s1.Op != OpS390XSLDconst { 28166 break 28167 } 28168 j1 := s1.AuxInt 28169 r1 := s1.Args[0] 28170 if r1.Op != OpS390XMOVHZreg { 28171 break 28172 } 28173 x1 := r1.Args[0] 28174 if x1.Op != OpS390XMOVHBRloadidx { 28175 break 28176 } 28177 i1 := x1.AuxInt 28178 s := x1.Aux 28179 _ = x1.Args[2] 28180 p := x1.Args[0] 28181 idx := x1.Args[1] 28182 mem := x1.Args[2] 28183 or := v.Args[1] 28184 if or.Op != OpS390XOR { 28185 break 28186 } 28187 _ = or.Args[1] 28188 y := or.Args[0] 28189 s0 := or.Args[1] 28190 if s0.Op != OpS390XSLDconst { 28191 break 28192 } 28193 j0 := s0.AuxInt 28194 r0 := s0.Args[0] 28195 if r0.Op != OpS390XMOVHZreg { 28196 break 28197 } 28198 x0 := r0.Args[0] 28199 if x0.Op != OpS390XMOVHBRloadidx { 28200 break 28201 } 28202 i0 := x0.AuxInt 28203 if x0.Aux != s { 28204 break 28205 } 28206 _ = x0.Args[2] 28207 if idx != x0.Args[0] { 28208 break 28209 } 28210 if p != x0.Args[1] { 28211 break 28212 } 28213 if mem != x0.Args[2] { 28214 break 28215 } 28216 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)) { 28217 break 28218 } 28219 b = mergePoint(b, x0, x1) 28220 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28221 v.reset(OpCopy) 28222 v.AddArg(v0) 28223 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28224 v1.AuxInt = j0 28225 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28226 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28227 v3.AuxInt = i0 28228 v3.Aux = s 28229 v3.AddArg(p) 28230 v3.AddArg(idx) 28231 v3.AddArg(mem) 28232 v2.AddArg(v3) 28233 v1.AddArg(v2) 28234 v0.AddArg(v1) 28235 v0.AddArg(y) 28236 return true 28237 } 28238 // 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))))) 28239 // 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) 28240 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28241 for { 28242 _ = v.Args[1] 28243 s1 := v.Args[0] 28244 if s1.Op != OpS390XSLDconst { 28245 break 28246 } 28247 j1 := s1.AuxInt 28248 r1 := s1.Args[0] 28249 if r1.Op != OpS390XMOVHZreg { 28250 break 28251 } 28252 x1 := r1.Args[0] 28253 if x1.Op != OpS390XMOVHBRloadidx { 28254 break 28255 } 28256 i1 := x1.AuxInt 28257 s := x1.Aux 28258 _ = x1.Args[2] 28259 idx := x1.Args[0] 28260 p := x1.Args[1] 28261 mem := x1.Args[2] 28262 or := v.Args[1] 28263 if or.Op != OpS390XOR { 28264 break 28265 } 28266 _ = or.Args[1] 28267 y := or.Args[0] 28268 s0 := or.Args[1] 28269 if s0.Op != OpS390XSLDconst { 28270 break 28271 } 28272 j0 := s0.AuxInt 28273 r0 := s0.Args[0] 28274 if r0.Op != OpS390XMOVHZreg { 28275 break 28276 } 28277 x0 := r0.Args[0] 28278 if x0.Op != OpS390XMOVHBRloadidx { 28279 break 28280 } 28281 i0 := x0.AuxInt 28282 if x0.Aux != s { 28283 break 28284 } 28285 _ = x0.Args[2] 28286 if idx != x0.Args[0] { 28287 break 28288 } 28289 if p != x0.Args[1] { 28290 break 28291 } 28292 if mem != x0.Args[2] { 28293 break 28294 } 28295 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)) { 28296 break 28297 } 28298 b = mergePoint(b, x0, x1) 28299 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28300 v.reset(OpCopy) 28301 v.AddArg(v0) 28302 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28303 v1.AuxInt = j0 28304 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28305 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28306 v3.AuxInt = i0 28307 v3.Aux = s 28308 v3.AddArg(p) 28309 v3.AddArg(idx) 28310 v3.AddArg(mem) 28311 v2.AddArg(v3) 28312 v1.AddArg(v2) 28313 v0.AddArg(v1) 28314 v0.AddArg(y) 28315 return true 28316 } 28317 // 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)))) 28318 // 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) 28319 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28320 for { 28321 _ = v.Args[1] 28322 or := v.Args[0] 28323 if or.Op != OpS390XOR { 28324 break 28325 } 28326 _ = or.Args[1] 28327 s0 := or.Args[0] 28328 if s0.Op != OpS390XSLDconst { 28329 break 28330 } 28331 j0 := s0.AuxInt 28332 r0 := s0.Args[0] 28333 if r0.Op != OpS390XMOVHZreg { 28334 break 28335 } 28336 x0 := r0.Args[0] 28337 if x0.Op != OpS390XMOVHBRloadidx { 28338 break 28339 } 28340 i0 := x0.AuxInt 28341 s := x0.Aux 28342 _ = x0.Args[2] 28343 p := x0.Args[0] 28344 idx := x0.Args[1] 28345 mem := x0.Args[2] 28346 y := or.Args[1] 28347 s1 := v.Args[1] 28348 if s1.Op != OpS390XSLDconst { 28349 break 28350 } 28351 j1 := s1.AuxInt 28352 r1 := s1.Args[0] 28353 if r1.Op != OpS390XMOVHZreg { 28354 break 28355 } 28356 x1 := r1.Args[0] 28357 if x1.Op != OpS390XMOVHBRloadidx { 28358 break 28359 } 28360 i1 := x1.AuxInt 28361 if x1.Aux != s { 28362 break 28363 } 28364 _ = x1.Args[2] 28365 if p != x1.Args[0] { 28366 break 28367 } 28368 if idx != x1.Args[1] { 28369 break 28370 } 28371 if mem != x1.Args[2] { 28372 break 28373 } 28374 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)) { 28375 break 28376 } 28377 b = mergePoint(b, x0, x1) 28378 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28379 v.reset(OpCopy) 28380 v.AddArg(v0) 28381 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28382 v1.AuxInt = j0 28383 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28384 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28385 v3.AuxInt = i0 28386 v3.Aux = s 28387 v3.AddArg(p) 28388 v3.AddArg(idx) 28389 v3.AddArg(mem) 28390 v2.AddArg(v3) 28391 v1.AddArg(v2) 28392 v0.AddArg(v1) 28393 v0.AddArg(y) 28394 return true 28395 } 28396 // 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)))) 28397 // 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) 28398 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28399 for { 28400 _ = v.Args[1] 28401 or := v.Args[0] 28402 if or.Op != OpS390XOR { 28403 break 28404 } 28405 _ = or.Args[1] 28406 s0 := or.Args[0] 28407 if s0.Op != OpS390XSLDconst { 28408 break 28409 } 28410 j0 := s0.AuxInt 28411 r0 := s0.Args[0] 28412 if r0.Op != OpS390XMOVHZreg { 28413 break 28414 } 28415 x0 := r0.Args[0] 28416 if x0.Op != OpS390XMOVHBRloadidx { 28417 break 28418 } 28419 i0 := x0.AuxInt 28420 s := x0.Aux 28421 _ = x0.Args[2] 28422 idx := x0.Args[0] 28423 p := x0.Args[1] 28424 mem := x0.Args[2] 28425 y := or.Args[1] 28426 s1 := v.Args[1] 28427 if s1.Op != OpS390XSLDconst { 28428 break 28429 } 28430 j1 := s1.AuxInt 28431 r1 := s1.Args[0] 28432 if r1.Op != OpS390XMOVHZreg { 28433 break 28434 } 28435 x1 := r1.Args[0] 28436 if x1.Op != OpS390XMOVHBRloadidx { 28437 break 28438 } 28439 i1 := x1.AuxInt 28440 if x1.Aux != s { 28441 break 28442 } 28443 _ = x1.Args[2] 28444 if p != x1.Args[0] { 28445 break 28446 } 28447 if idx != x1.Args[1] { 28448 break 28449 } 28450 if mem != x1.Args[2] { 28451 break 28452 } 28453 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)) { 28454 break 28455 } 28456 b = mergePoint(b, x0, x1) 28457 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28458 v.reset(OpCopy) 28459 v.AddArg(v0) 28460 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28461 v1.AuxInt = j0 28462 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28463 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28464 v3.AuxInt = i0 28465 v3.Aux = s 28466 v3.AddArg(p) 28467 v3.AddArg(idx) 28468 v3.AddArg(mem) 28469 v2.AddArg(v3) 28470 v1.AddArg(v2) 28471 v0.AddArg(v1) 28472 v0.AddArg(y) 28473 return true 28474 } 28475 // 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)))) 28476 // 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) 28477 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28478 for { 28479 _ = v.Args[1] 28480 or := v.Args[0] 28481 if or.Op != OpS390XOR { 28482 break 28483 } 28484 _ = or.Args[1] 28485 y := or.Args[0] 28486 s0 := or.Args[1] 28487 if s0.Op != OpS390XSLDconst { 28488 break 28489 } 28490 j0 := s0.AuxInt 28491 r0 := s0.Args[0] 28492 if r0.Op != OpS390XMOVHZreg { 28493 break 28494 } 28495 x0 := r0.Args[0] 28496 if x0.Op != OpS390XMOVHBRloadidx { 28497 break 28498 } 28499 i0 := x0.AuxInt 28500 s := x0.Aux 28501 _ = x0.Args[2] 28502 p := x0.Args[0] 28503 idx := x0.Args[1] 28504 mem := x0.Args[2] 28505 s1 := v.Args[1] 28506 if s1.Op != OpS390XSLDconst { 28507 break 28508 } 28509 j1 := s1.AuxInt 28510 r1 := s1.Args[0] 28511 if r1.Op != OpS390XMOVHZreg { 28512 break 28513 } 28514 x1 := r1.Args[0] 28515 if x1.Op != OpS390XMOVHBRloadidx { 28516 break 28517 } 28518 i1 := x1.AuxInt 28519 if x1.Aux != s { 28520 break 28521 } 28522 _ = x1.Args[2] 28523 if p != x1.Args[0] { 28524 break 28525 } 28526 if idx != x1.Args[1] { 28527 break 28528 } 28529 if mem != x1.Args[2] { 28530 break 28531 } 28532 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)) { 28533 break 28534 } 28535 b = mergePoint(b, x0, x1) 28536 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28537 v.reset(OpCopy) 28538 v.AddArg(v0) 28539 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28540 v1.AuxInt = j0 28541 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28542 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28543 v3.AuxInt = i0 28544 v3.Aux = s 28545 v3.AddArg(p) 28546 v3.AddArg(idx) 28547 v3.AddArg(mem) 28548 v2.AddArg(v3) 28549 v1.AddArg(v2) 28550 v0.AddArg(v1) 28551 v0.AddArg(y) 28552 return true 28553 } 28554 // 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)))) 28555 // 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) 28556 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28557 for { 28558 _ = v.Args[1] 28559 or := v.Args[0] 28560 if or.Op != OpS390XOR { 28561 break 28562 } 28563 _ = or.Args[1] 28564 y := or.Args[0] 28565 s0 := or.Args[1] 28566 if s0.Op != OpS390XSLDconst { 28567 break 28568 } 28569 j0 := s0.AuxInt 28570 r0 := s0.Args[0] 28571 if r0.Op != OpS390XMOVHZreg { 28572 break 28573 } 28574 x0 := r0.Args[0] 28575 if x0.Op != OpS390XMOVHBRloadidx { 28576 break 28577 } 28578 i0 := x0.AuxInt 28579 s := x0.Aux 28580 _ = x0.Args[2] 28581 idx := x0.Args[0] 28582 p := x0.Args[1] 28583 mem := x0.Args[2] 28584 s1 := v.Args[1] 28585 if s1.Op != OpS390XSLDconst { 28586 break 28587 } 28588 j1 := s1.AuxInt 28589 r1 := s1.Args[0] 28590 if r1.Op != OpS390XMOVHZreg { 28591 break 28592 } 28593 x1 := r1.Args[0] 28594 if x1.Op != OpS390XMOVHBRloadidx { 28595 break 28596 } 28597 i1 := x1.AuxInt 28598 if x1.Aux != s { 28599 break 28600 } 28601 _ = x1.Args[2] 28602 if p != x1.Args[0] { 28603 break 28604 } 28605 if idx != x1.Args[1] { 28606 break 28607 } 28608 if mem != x1.Args[2] { 28609 break 28610 } 28611 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)) { 28612 break 28613 } 28614 b = mergePoint(b, x0, x1) 28615 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28616 v.reset(OpCopy) 28617 v.AddArg(v0) 28618 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28619 v1.AuxInt = j0 28620 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28621 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28622 v3.AuxInt = i0 28623 v3.Aux = s 28624 v3.AddArg(p) 28625 v3.AddArg(idx) 28626 v3.AddArg(mem) 28627 v2.AddArg(v3) 28628 v1.AddArg(v2) 28629 v0.AddArg(v1) 28630 v0.AddArg(y) 28631 return true 28632 } 28633 // 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)))) 28634 // 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) 28635 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28636 for { 28637 _ = v.Args[1] 28638 or := v.Args[0] 28639 if or.Op != OpS390XOR { 28640 break 28641 } 28642 _ = or.Args[1] 28643 s0 := or.Args[0] 28644 if s0.Op != OpS390XSLDconst { 28645 break 28646 } 28647 j0 := s0.AuxInt 28648 r0 := s0.Args[0] 28649 if r0.Op != OpS390XMOVHZreg { 28650 break 28651 } 28652 x0 := r0.Args[0] 28653 if x0.Op != OpS390XMOVHBRloadidx { 28654 break 28655 } 28656 i0 := x0.AuxInt 28657 s := x0.Aux 28658 _ = x0.Args[2] 28659 p := x0.Args[0] 28660 idx := x0.Args[1] 28661 mem := x0.Args[2] 28662 y := or.Args[1] 28663 s1 := v.Args[1] 28664 if s1.Op != OpS390XSLDconst { 28665 break 28666 } 28667 j1 := s1.AuxInt 28668 r1 := s1.Args[0] 28669 if r1.Op != OpS390XMOVHZreg { 28670 break 28671 } 28672 x1 := r1.Args[0] 28673 if x1.Op != OpS390XMOVHBRloadidx { 28674 break 28675 } 28676 i1 := x1.AuxInt 28677 if x1.Aux != s { 28678 break 28679 } 28680 _ = x1.Args[2] 28681 if idx != x1.Args[0] { 28682 break 28683 } 28684 if p != x1.Args[1] { 28685 break 28686 } 28687 if mem != x1.Args[2] { 28688 break 28689 } 28690 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)) { 28691 break 28692 } 28693 b = mergePoint(b, x0, x1) 28694 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28695 v.reset(OpCopy) 28696 v.AddArg(v0) 28697 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28698 v1.AuxInt = j0 28699 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28700 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28701 v3.AuxInt = i0 28702 v3.Aux = s 28703 v3.AddArg(p) 28704 v3.AddArg(idx) 28705 v3.AddArg(mem) 28706 v2.AddArg(v3) 28707 v1.AddArg(v2) 28708 v0.AddArg(v1) 28709 v0.AddArg(y) 28710 return true 28711 } 28712 // 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)))) 28713 // 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) 28714 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28715 for { 28716 _ = v.Args[1] 28717 or := v.Args[0] 28718 if or.Op != OpS390XOR { 28719 break 28720 } 28721 _ = or.Args[1] 28722 s0 := or.Args[0] 28723 if s0.Op != OpS390XSLDconst { 28724 break 28725 } 28726 j0 := s0.AuxInt 28727 r0 := s0.Args[0] 28728 if r0.Op != OpS390XMOVHZreg { 28729 break 28730 } 28731 x0 := r0.Args[0] 28732 if x0.Op != OpS390XMOVHBRloadidx { 28733 break 28734 } 28735 i0 := x0.AuxInt 28736 s := x0.Aux 28737 _ = x0.Args[2] 28738 idx := x0.Args[0] 28739 p := x0.Args[1] 28740 mem := x0.Args[2] 28741 y := or.Args[1] 28742 s1 := v.Args[1] 28743 if s1.Op != OpS390XSLDconst { 28744 break 28745 } 28746 j1 := s1.AuxInt 28747 r1 := s1.Args[0] 28748 if r1.Op != OpS390XMOVHZreg { 28749 break 28750 } 28751 x1 := r1.Args[0] 28752 if x1.Op != OpS390XMOVHBRloadidx { 28753 break 28754 } 28755 i1 := x1.AuxInt 28756 if x1.Aux != s { 28757 break 28758 } 28759 _ = x1.Args[2] 28760 if idx != x1.Args[0] { 28761 break 28762 } 28763 if p != x1.Args[1] { 28764 break 28765 } 28766 if mem != x1.Args[2] { 28767 break 28768 } 28769 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)) { 28770 break 28771 } 28772 b = mergePoint(b, x0, x1) 28773 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28774 v.reset(OpCopy) 28775 v.AddArg(v0) 28776 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28777 v1.AuxInt = j0 28778 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28779 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28780 v3.AuxInt = i0 28781 v3.Aux = s 28782 v3.AddArg(p) 28783 v3.AddArg(idx) 28784 v3.AddArg(mem) 28785 v2.AddArg(v3) 28786 v1.AddArg(v2) 28787 v0.AddArg(v1) 28788 v0.AddArg(y) 28789 return true 28790 } 28791 // 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)))) 28792 // 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) 28793 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28794 for { 28795 _ = v.Args[1] 28796 or := v.Args[0] 28797 if or.Op != OpS390XOR { 28798 break 28799 } 28800 _ = or.Args[1] 28801 y := or.Args[0] 28802 s0 := or.Args[1] 28803 if s0.Op != OpS390XSLDconst { 28804 break 28805 } 28806 j0 := s0.AuxInt 28807 r0 := s0.Args[0] 28808 if r0.Op != OpS390XMOVHZreg { 28809 break 28810 } 28811 x0 := r0.Args[0] 28812 if x0.Op != OpS390XMOVHBRloadidx { 28813 break 28814 } 28815 i0 := x0.AuxInt 28816 s := x0.Aux 28817 _ = x0.Args[2] 28818 p := x0.Args[0] 28819 idx := x0.Args[1] 28820 mem := x0.Args[2] 28821 s1 := v.Args[1] 28822 if s1.Op != OpS390XSLDconst { 28823 break 28824 } 28825 j1 := s1.AuxInt 28826 r1 := s1.Args[0] 28827 if r1.Op != OpS390XMOVHZreg { 28828 break 28829 } 28830 x1 := r1.Args[0] 28831 if x1.Op != OpS390XMOVHBRloadidx { 28832 break 28833 } 28834 i1 := x1.AuxInt 28835 if x1.Aux != s { 28836 break 28837 } 28838 _ = x1.Args[2] 28839 if idx != x1.Args[0] { 28840 break 28841 } 28842 if p != x1.Args[1] { 28843 break 28844 } 28845 if mem != x1.Args[2] { 28846 break 28847 } 28848 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)) { 28849 break 28850 } 28851 b = mergePoint(b, x0, x1) 28852 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28853 v.reset(OpCopy) 28854 v.AddArg(v0) 28855 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28856 v1.AuxInt = j0 28857 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28858 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28859 v3.AuxInt = i0 28860 v3.Aux = s 28861 v3.AddArg(p) 28862 v3.AddArg(idx) 28863 v3.AddArg(mem) 28864 v2.AddArg(v3) 28865 v1.AddArg(v2) 28866 v0.AddArg(v1) 28867 v0.AddArg(y) 28868 return true 28869 } 28870 return false 28871 } 28872 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 28873 b := v.Block 28874 _ = b 28875 typ := &b.Func.Config.Types 28876 _ = typ 28877 // 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)))) 28878 // 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) 28879 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 28880 for { 28881 _ = v.Args[1] 28882 or := v.Args[0] 28883 if or.Op != OpS390XOR { 28884 break 28885 } 28886 _ = or.Args[1] 28887 y := or.Args[0] 28888 s0 := or.Args[1] 28889 if s0.Op != OpS390XSLDconst { 28890 break 28891 } 28892 j0 := s0.AuxInt 28893 r0 := s0.Args[0] 28894 if r0.Op != OpS390XMOVHZreg { 28895 break 28896 } 28897 x0 := r0.Args[0] 28898 if x0.Op != OpS390XMOVHBRloadidx { 28899 break 28900 } 28901 i0 := x0.AuxInt 28902 s := x0.Aux 28903 _ = x0.Args[2] 28904 idx := x0.Args[0] 28905 p := x0.Args[1] 28906 mem := x0.Args[2] 28907 s1 := v.Args[1] 28908 if s1.Op != OpS390XSLDconst { 28909 break 28910 } 28911 j1 := s1.AuxInt 28912 r1 := s1.Args[0] 28913 if r1.Op != OpS390XMOVHZreg { 28914 break 28915 } 28916 x1 := r1.Args[0] 28917 if x1.Op != OpS390XMOVHBRloadidx { 28918 break 28919 } 28920 i1 := x1.AuxInt 28921 if x1.Aux != s { 28922 break 28923 } 28924 _ = x1.Args[2] 28925 if idx != x1.Args[0] { 28926 break 28927 } 28928 if p != x1.Args[1] { 28929 break 28930 } 28931 if mem != x1.Args[2] { 28932 break 28933 } 28934 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)) { 28935 break 28936 } 28937 b = mergePoint(b, x0, x1) 28938 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 28939 v.reset(OpCopy) 28940 v.AddArg(v0) 28941 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 28942 v1.AuxInt = j0 28943 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) 28944 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 28945 v3.AuxInt = i0 28946 v3.Aux = s 28947 v3.AddArg(p) 28948 v3.AddArg(idx) 28949 v3.AddArg(mem) 28950 v2.AddArg(v3) 28951 v1.AddArg(v2) 28952 v0.AddArg(v1) 28953 v0.AddArg(y) 28954 return true 28955 } 28956 return false 28957 } 28958 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 28959 // match: (ORW x (MOVDconst [c])) 28960 // cond: 28961 // result: (ORWconst [c] x) 28962 for { 28963 _ = v.Args[1] 28964 x := v.Args[0] 28965 v_1 := v.Args[1] 28966 if v_1.Op != OpS390XMOVDconst { 28967 break 28968 } 28969 c := v_1.AuxInt 28970 v.reset(OpS390XORWconst) 28971 v.AuxInt = c 28972 v.AddArg(x) 28973 return true 28974 } 28975 // match: (ORW (MOVDconst [c]) x) 28976 // cond: 28977 // result: (ORWconst [c] x) 28978 for { 28979 _ = v.Args[1] 28980 v_0 := v.Args[0] 28981 if v_0.Op != OpS390XMOVDconst { 28982 break 28983 } 28984 c := v_0.AuxInt 28985 x := v.Args[1] 28986 v.reset(OpS390XORWconst) 28987 v.AuxInt = c 28988 v.AddArg(x) 28989 return true 28990 } 28991 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 28992 // cond: d == 32-c 28993 // result: (RLLconst [c] x) 28994 for { 28995 _ = v.Args[1] 28996 v_0 := v.Args[0] 28997 if v_0.Op != OpS390XSLWconst { 28998 break 28999 } 29000 c := v_0.AuxInt 29001 x := v_0.Args[0] 29002 v_1 := v.Args[1] 29003 if v_1.Op != OpS390XSRWconst { 29004 break 29005 } 29006 d := v_1.AuxInt 29007 if x != v_1.Args[0] { 29008 break 29009 } 29010 if !(d == 32-c) { 29011 break 29012 } 29013 v.reset(OpS390XRLLconst) 29014 v.AuxInt = c 29015 v.AddArg(x) 29016 return true 29017 } 29018 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 29019 // cond: d == 32-c 29020 // result: (RLLconst [c] x) 29021 for { 29022 _ = v.Args[1] 29023 v_0 := v.Args[0] 29024 if v_0.Op != OpS390XSRWconst { 29025 break 29026 } 29027 d := v_0.AuxInt 29028 x := v_0.Args[0] 29029 v_1 := v.Args[1] 29030 if v_1.Op != OpS390XSLWconst { 29031 break 29032 } 29033 c := v_1.AuxInt 29034 if x != v_1.Args[0] { 29035 break 29036 } 29037 if !(d == 32-c) { 29038 break 29039 } 29040 v.reset(OpS390XRLLconst) 29041 v.AuxInt = c 29042 v.AddArg(x) 29043 return true 29044 } 29045 // match: (ORW x x) 29046 // cond: 29047 // result: x 29048 for { 29049 _ = v.Args[1] 29050 x := v.Args[0] 29051 if x != v.Args[1] { 29052 break 29053 } 29054 v.reset(OpCopy) 29055 v.Type = x.Type 29056 v.AddArg(x) 29057 return true 29058 } 29059 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29060 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29061 // result: (ORWload <t> [off] {sym} x ptr mem) 29062 for { 29063 t := v.Type 29064 _ = v.Args[1] 29065 x := v.Args[0] 29066 g := v.Args[1] 29067 if g.Op != OpS390XMOVWload { 29068 break 29069 } 29070 off := g.AuxInt 29071 sym := g.Aux 29072 _ = g.Args[1] 29073 ptr := g.Args[0] 29074 mem := g.Args[1] 29075 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29076 break 29077 } 29078 v.reset(OpS390XORWload) 29079 v.Type = t 29080 v.AuxInt = off 29081 v.Aux = sym 29082 v.AddArg(x) 29083 v.AddArg(ptr) 29084 v.AddArg(mem) 29085 return true 29086 } 29087 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29088 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29089 // result: (ORWload <t> [off] {sym} x ptr mem) 29090 for { 29091 t := v.Type 29092 _ = v.Args[1] 29093 g := v.Args[0] 29094 if g.Op != OpS390XMOVWload { 29095 break 29096 } 29097 off := g.AuxInt 29098 sym := g.Aux 29099 _ = g.Args[1] 29100 ptr := g.Args[0] 29101 mem := g.Args[1] 29102 x := v.Args[1] 29103 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29104 break 29105 } 29106 v.reset(OpS390XORWload) 29107 v.Type = t 29108 v.AuxInt = off 29109 v.Aux = sym 29110 v.AddArg(x) 29111 v.AddArg(ptr) 29112 v.AddArg(mem) 29113 return true 29114 } 29115 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 29116 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29117 // result: (ORWload <t> [off] {sym} x ptr mem) 29118 for { 29119 t := v.Type 29120 _ = v.Args[1] 29121 g := v.Args[0] 29122 if g.Op != OpS390XMOVWload { 29123 break 29124 } 29125 off := g.AuxInt 29126 sym := g.Aux 29127 _ = g.Args[1] 29128 ptr := g.Args[0] 29129 mem := g.Args[1] 29130 x := v.Args[1] 29131 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29132 break 29133 } 29134 v.reset(OpS390XORWload) 29135 v.Type = t 29136 v.AuxInt = off 29137 v.Aux = sym 29138 v.AddArg(x) 29139 v.AddArg(ptr) 29140 v.AddArg(mem) 29141 return true 29142 } 29143 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 29144 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29145 // result: (ORWload <t> [off] {sym} x ptr mem) 29146 for { 29147 t := v.Type 29148 _ = v.Args[1] 29149 x := v.Args[0] 29150 g := v.Args[1] 29151 if g.Op != OpS390XMOVWload { 29152 break 29153 } 29154 off := g.AuxInt 29155 sym := g.Aux 29156 _ = g.Args[1] 29157 ptr := g.Args[0] 29158 mem := g.Args[1] 29159 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29160 break 29161 } 29162 v.reset(OpS390XORWload) 29163 v.Type = t 29164 v.AuxInt = off 29165 v.Aux = sym 29166 v.AddArg(x) 29167 v.AddArg(ptr) 29168 v.AddArg(mem) 29169 return true 29170 } 29171 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29172 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29173 // result: (ORWload <t> [off] {sym} x ptr mem) 29174 for { 29175 t := v.Type 29176 _ = v.Args[1] 29177 x := v.Args[0] 29178 g := v.Args[1] 29179 if g.Op != OpS390XMOVWZload { 29180 break 29181 } 29182 off := g.AuxInt 29183 sym := g.Aux 29184 _ = g.Args[1] 29185 ptr := g.Args[0] 29186 mem := g.Args[1] 29187 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29188 break 29189 } 29190 v.reset(OpS390XORWload) 29191 v.Type = t 29192 v.AuxInt = off 29193 v.Aux = sym 29194 v.AddArg(x) 29195 v.AddArg(ptr) 29196 v.AddArg(mem) 29197 return true 29198 } 29199 return false 29200 } 29201 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 29202 b := v.Block 29203 _ = b 29204 typ := &b.Func.Config.Types 29205 _ = typ 29206 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 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 g := v.Args[0] 29213 if g.Op != OpS390XMOVWZload { 29214 break 29215 } 29216 off := g.AuxInt 29217 sym := g.Aux 29218 _ = g.Args[1] 29219 ptr := g.Args[0] 29220 mem := g.Args[1] 29221 x := v.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> g:(MOVWZload [off] {sym} ptr mem) x) 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 g := v.Args[0] 29241 if g.Op != OpS390XMOVWZload { 29242 break 29243 } 29244 off := g.AuxInt 29245 sym := g.Aux 29246 _ = g.Args[1] 29247 ptr := g.Args[0] 29248 mem := g.Args[1] 29249 x := v.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 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 29263 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 29264 // result: (ORWload <t> [off] {sym} x ptr mem) 29265 for { 29266 t := v.Type 29267 _ = v.Args[1] 29268 x := v.Args[0] 29269 g := v.Args[1] 29270 if g.Op != OpS390XMOVWZload { 29271 break 29272 } 29273 off := g.AuxInt 29274 sym := g.Aux 29275 _ = g.Args[1] 29276 ptr := g.Args[0] 29277 mem := g.Args[1] 29278 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 29279 break 29280 } 29281 v.reset(OpS390XORWload) 29282 v.Type = t 29283 v.AuxInt = off 29284 v.Aux = sym 29285 v.AddArg(x) 29286 v.AddArg(ptr) 29287 v.AddArg(mem) 29288 return true 29289 } 29290 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 29291 // 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) 29292 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29293 for { 29294 _ = v.Args[1] 29295 x1 := v.Args[0] 29296 if x1.Op != OpS390XMOVBZload { 29297 break 29298 } 29299 i1 := x1.AuxInt 29300 s := x1.Aux 29301 _ = x1.Args[1] 29302 p := x1.Args[0] 29303 mem := x1.Args[1] 29304 sh := v.Args[1] 29305 if sh.Op != OpS390XSLWconst { 29306 break 29307 } 29308 if sh.AuxInt != 8 { 29309 break 29310 } 29311 x0 := sh.Args[0] 29312 if x0.Op != OpS390XMOVBZload { 29313 break 29314 } 29315 i0 := x0.AuxInt 29316 if x0.Aux != s { 29317 break 29318 } 29319 _ = x0.Args[1] 29320 if p != x0.Args[0] { 29321 break 29322 } 29323 if mem != x0.Args[1] { 29324 break 29325 } 29326 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)) { 29327 break 29328 } 29329 b = mergePoint(b, x0, x1) 29330 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29331 v.reset(OpCopy) 29332 v.AddArg(v0) 29333 v0.AuxInt = i0 29334 v0.Aux = s 29335 v0.AddArg(p) 29336 v0.AddArg(mem) 29337 return true 29338 } 29339 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 29340 // 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) 29341 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 29342 for { 29343 _ = v.Args[1] 29344 sh := v.Args[0] 29345 if sh.Op != OpS390XSLWconst { 29346 break 29347 } 29348 if sh.AuxInt != 8 { 29349 break 29350 } 29351 x0 := sh.Args[0] 29352 if x0.Op != OpS390XMOVBZload { 29353 break 29354 } 29355 i0 := x0.AuxInt 29356 s := x0.Aux 29357 _ = x0.Args[1] 29358 p := x0.Args[0] 29359 mem := x0.Args[1] 29360 x1 := v.Args[1] 29361 if x1.Op != OpS390XMOVBZload { 29362 break 29363 } 29364 i1 := x1.AuxInt 29365 if x1.Aux != s { 29366 break 29367 } 29368 _ = x1.Args[1] 29369 if p != x1.Args[0] { 29370 break 29371 } 29372 if mem != x1.Args[1] { 29373 break 29374 } 29375 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)) { 29376 break 29377 } 29378 b = mergePoint(b, x0, x1) 29379 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29380 v.reset(OpCopy) 29381 v.AddArg(v0) 29382 v0.AuxInt = i0 29383 v0.Aux = s 29384 v0.AddArg(p) 29385 v0.AddArg(mem) 29386 return true 29387 } 29388 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 29389 // 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) 29390 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29391 for { 29392 _ = v.Args[1] 29393 x1 := v.Args[0] 29394 if x1.Op != OpS390XMOVHZload { 29395 break 29396 } 29397 i1 := x1.AuxInt 29398 s := x1.Aux 29399 _ = x1.Args[1] 29400 p := x1.Args[0] 29401 mem := x1.Args[1] 29402 sh := v.Args[1] 29403 if sh.Op != OpS390XSLWconst { 29404 break 29405 } 29406 if sh.AuxInt != 16 { 29407 break 29408 } 29409 x0 := sh.Args[0] 29410 if x0.Op != OpS390XMOVHZload { 29411 break 29412 } 29413 i0 := x0.AuxInt 29414 if x0.Aux != s { 29415 break 29416 } 29417 _ = x0.Args[1] 29418 if p != x0.Args[0] { 29419 break 29420 } 29421 if mem != x0.Args[1] { 29422 break 29423 } 29424 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)) { 29425 break 29426 } 29427 b = mergePoint(b, x0, x1) 29428 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29429 v.reset(OpCopy) 29430 v.AddArg(v0) 29431 v0.AuxInt = i0 29432 v0.Aux = s 29433 v0.AddArg(p) 29434 v0.AddArg(mem) 29435 return true 29436 } 29437 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 29438 // 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) 29439 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 29440 for { 29441 _ = v.Args[1] 29442 sh := v.Args[0] 29443 if sh.Op != OpS390XSLWconst { 29444 break 29445 } 29446 if sh.AuxInt != 16 { 29447 break 29448 } 29449 x0 := sh.Args[0] 29450 if x0.Op != OpS390XMOVHZload { 29451 break 29452 } 29453 i0 := x0.AuxInt 29454 s := x0.Aux 29455 _ = x0.Args[1] 29456 p := x0.Args[0] 29457 mem := x0.Args[1] 29458 x1 := v.Args[1] 29459 if x1.Op != OpS390XMOVHZload { 29460 break 29461 } 29462 i1 := x1.AuxInt 29463 if x1.Aux != s { 29464 break 29465 } 29466 _ = x1.Args[1] 29467 if p != x1.Args[0] { 29468 break 29469 } 29470 if mem != x1.Args[1] { 29471 break 29472 } 29473 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)) { 29474 break 29475 } 29476 b = mergePoint(b, x0, x1) 29477 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) 29478 v.reset(OpCopy) 29479 v.AddArg(v0) 29480 v0.AuxInt = i0 29481 v0.Aux = s 29482 v0.AddArg(p) 29483 v0.AddArg(mem) 29484 return true 29485 } 29486 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 29487 // 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) 29488 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29489 for { 29490 _ = v.Args[1] 29491 s0 := v.Args[0] 29492 if s0.Op != OpS390XSLWconst { 29493 break 29494 } 29495 j0 := s0.AuxInt 29496 x0 := s0.Args[0] 29497 if x0.Op != OpS390XMOVBZload { 29498 break 29499 } 29500 i0 := x0.AuxInt 29501 s := x0.Aux 29502 _ = x0.Args[1] 29503 p := x0.Args[0] 29504 mem := x0.Args[1] 29505 or := v.Args[1] 29506 if or.Op != OpS390XORW { 29507 break 29508 } 29509 _ = or.Args[1] 29510 s1 := or.Args[0] 29511 if s1.Op != OpS390XSLWconst { 29512 break 29513 } 29514 j1 := s1.AuxInt 29515 x1 := s1.Args[0] 29516 if x1.Op != OpS390XMOVBZload { 29517 break 29518 } 29519 i1 := x1.AuxInt 29520 if x1.Aux != s { 29521 break 29522 } 29523 _ = x1.Args[1] 29524 if p != x1.Args[0] { 29525 break 29526 } 29527 if mem != x1.Args[1] { 29528 break 29529 } 29530 y := or.Args[1] 29531 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)) { 29532 break 29533 } 29534 b = mergePoint(b, x0, x1) 29535 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29536 v.reset(OpCopy) 29537 v.AddArg(v0) 29538 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29539 v1.AuxInt = j1 29540 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29541 v2.AuxInt = i0 29542 v2.Aux = s 29543 v2.AddArg(p) 29544 v2.AddArg(mem) 29545 v1.AddArg(v2) 29546 v0.AddArg(v1) 29547 v0.AddArg(y) 29548 return true 29549 } 29550 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 29551 // 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) 29552 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29553 for { 29554 _ = v.Args[1] 29555 s0 := v.Args[0] 29556 if s0.Op != OpS390XSLWconst { 29557 break 29558 } 29559 j0 := s0.AuxInt 29560 x0 := s0.Args[0] 29561 if x0.Op != OpS390XMOVBZload { 29562 break 29563 } 29564 i0 := x0.AuxInt 29565 s := x0.Aux 29566 _ = x0.Args[1] 29567 p := x0.Args[0] 29568 mem := x0.Args[1] 29569 or := v.Args[1] 29570 if or.Op != OpS390XORW { 29571 break 29572 } 29573 _ = or.Args[1] 29574 y := or.Args[0] 29575 s1 := or.Args[1] 29576 if s1.Op != OpS390XSLWconst { 29577 break 29578 } 29579 j1 := s1.AuxInt 29580 x1 := s1.Args[0] 29581 if x1.Op != OpS390XMOVBZload { 29582 break 29583 } 29584 i1 := x1.AuxInt 29585 if x1.Aux != s { 29586 break 29587 } 29588 _ = x1.Args[1] 29589 if p != x1.Args[0] { 29590 break 29591 } 29592 if mem != x1.Args[1] { 29593 break 29594 } 29595 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)) { 29596 break 29597 } 29598 b = mergePoint(b, x0, x1) 29599 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29600 v.reset(OpCopy) 29601 v.AddArg(v0) 29602 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29603 v1.AuxInt = j1 29604 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29605 v2.AuxInt = i0 29606 v2.Aux = s 29607 v2.AddArg(p) 29608 v2.AddArg(mem) 29609 v1.AddArg(v2) 29610 v0.AddArg(v1) 29611 v0.AddArg(y) 29612 return true 29613 } 29614 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29615 // 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) 29616 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29617 for { 29618 _ = v.Args[1] 29619 or := v.Args[0] 29620 if or.Op != OpS390XORW { 29621 break 29622 } 29623 _ = or.Args[1] 29624 s1 := or.Args[0] 29625 if s1.Op != OpS390XSLWconst { 29626 break 29627 } 29628 j1 := s1.AuxInt 29629 x1 := s1.Args[0] 29630 if x1.Op != OpS390XMOVBZload { 29631 break 29632 } 29633 i1 := x1.AuxInt 29634 s := x1.Aux 29635 _ = x1.Args[1] 29636 p := x1.Args[0] 29637 mem := x1.Args[1] 29638 y := or.Args[1] 29639 s0 := v.Args[1] 29640 if s0.Op != OpS390XSLWconst { 29641 break 29642 } 29643 j0 := s0.AuxInt 29644 x0 := s0.Args[0] 29645 if x0.Op != OpS390XMOVBZload { 29646 break 29647 } 29648 i0 := x0.AuxInt 29649 if x0.Aux != s { 29650 break 29651 } 29652 _ = x0.Args[1] 29653 if p != x0.Args[0] { 29654 break 29655 } 29656 if mem != x0.Args[1] { 29657 break 29658 } 29659 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)) { 29660 break 29661 } 29662 b = mergePoint(b, x0, x1) 29663 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29664 v.reset(OpCopy) 29665 v.AddArg(v0) 29666 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29667 v1.AuxInt = j1 29668 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29669 v2.AuxInt = i0 29670 v2.Aux = s 29671 v2.AddArg(p) 29672 v2.AddArg(mem) 29673 v1.AddArg(v2) 29674 v0.AddArg(v1) 29675 v0.AddArg(y) 29676 return true 29677 } 29678 return false 29679 } 29680 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 29681 b := v.Block 29682 _ = b 29683 typ := &b.Func.Config.Types 29684 _ = typ 29685 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 29686 // 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) 29687 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 29688 for { 29689 _ = v.Args[1] 29690 or := v.Args[0] 29691 if or.Op != OpS390XORW { 29692 break 29693 } 29694 _ = or.Args[1] 29695 y := or.Args[0] 29696 s1 := or.Args[1] 29697 if s1.Op != OpS390XSLWconst { 29698 break 29699 } 29700 j1 := s1.AuxInt 29701 x1 := s1.Args[0] 29702 if x1.Op != OpS390XMOVBZload { 29703 break 29704 } 29705 i1 := x1.AuxInt 29706 s := x1.Aux 29707 _ = x1.Args[1] 29708 p := x1.Args[0] 29709 mem := x1.Args[1] 29710 s0 := v.Args[1] 29711 if s0.Op != OpS390XSLWconst { 29712 break 29713 } 29714 j0 := s0.AuxInt 29715 x0 := s0.Args[0] 29716 if x0.Op != OpS390XMOVBZload { 29717 break 29718 } 29719 i0 := x0.AuxInt 29720 if x0.Aux != s { 29721 break 29722 } 29723 _ = x0.Args[1] 29724 if p != x0.Args[0] { 29725 break 29726 } 29727 if mem != x0.Args[1] { 29728 break 29729 } 29730 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)) { 29731 break 29732 } 29733 b = mergePoint(b, x0, x1) 29734 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29735 v.reset(OpCopy) 29736 v.AddArg(v0) 29737 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29738 v1.AuxInt = j1 29739 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) 29740 v2.AuxInt = i0 29741 v2.Aux = s 29742 v2.AddArg(p) 29743 v2.AddArg(mem) 29744 v1.AddArg(v2) 29745 v0.AddArg(v1) 29746 v0.AddArg(y) 29747 return true 29748 } 29749 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29750 // 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) 29751 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29752 for { 29753 _ = v.Args[1] 29754 x1 := v.Args[0] 29755 if x1.Op != OpS390XMOVBZloadidx { 29756 break 29757 } 29758 i1 := x1.AuxInt 29759 s := x1.Aux 29760 _ = x1.Args[2] 29761 p := x1.Args[0] 29762 idx := x1.Args[1] 29763 mem := x1.Args[2] 29764 sh := v.Args[1] 29765 if sh.Op != OpS390XSLWconst { 29766 break 29767 } 29768 if sh.AuxInt != 8 { 29769 break 29770 } 29771 x0 := sh.Args[0] 29772 if x0.Op != OpS390XMOVBZloadidx { 29773 break 29774 } 29775 i0 := x0.AuxInt 29776 if x0.Aux != s { 29777 break 29778 } 29779 _ = x0.Args[2] 29780 if p != x0.Args[0] { 29781 break 29782 } 29783 if idx != x0.Args[1] { 29784 break 29785 } 29786 if mem != x0.Args[2] { 29787 break 29788 } 29789 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)) { 29790 break 29791 } 29792 b = mergePoint(b, x0, x1) 29793 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29794 v.reset(OpCopy) 29795 v.AddArg(v0) 29796 v0.AuxInt = i0 29797 v0.Aux = s 29798 v0.AddArg(p) 29799 v0.AddArg(idx) 29800 v0.AddArg(mem) 29801 return true 29802 } 29803 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29804 // 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) 29805 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29806 for { 29807 _ = v.Args[1] 29808 x1 := v.Args[0] 29809 if x1.Op != OpS390XMOVBZloadidx { 29810 break 29811 } 29812 i1 := x1.AuxInt 29813 s := x1.Aux 29814 _ = x1.Args[2] 29815 idx := x1.Args[0] 29816 p := x1.Args[1] 29817 mem := x1.Args[2] 29818 sh := v.Args[1] 29819 if sh.Op != OpS390XSLWconst { 29820 break 29821 } 29822 if sh.AuxInt != 8 { 29823 break 29824 } 29825 x0 := sh.Args[0] 29826 if x0.Op != OpS390XMOVBZloadidx { 29827 break 29828 } 29829 i0 := x0.AuxInt 29830 if x0.Aux != s { 29831 break 29832 } 29833 _ = x0.Args[2] 29834 if p != x0.Args[0] { 29835 break 29836 } 29837 if idx != x0.Args[1] { 29838 break 29839 } 29840 if mem != x0.Args[2] { 29841 break 29842 } 29843 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)) { 29844 break 29845 } 29846 b = mergePoint(b, x0, x1) 29847 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29848 v.reset(OpCopy) 29849 v.AddArg(v0) 29850 v0.AuxInt = i0 29851 v0.Aux = s 29852 v0.AddArg(p) 29853 v0.AddArg(idx) 29854 v0.AddArg(mem) 29855 return true 29856 } 29857 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29858 // 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) 29859 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29860 for { 29861 _ = v.Args[1] 29862 x1 := v.Args[0] 29863 if x1.Op != OpS390XMOVBZloadidx { 29864 break 29865 } 29866 i1 := x1.AuxInt 29867 s := x1.Aux 29868 _ = x1.Args[2] 29869 p := x1.Args[0] 29870 idx := x1.Args[1] 29871 mem := x1.Args[2] 29872 sh := v.Args[1] 29873 if sh.Op != OpS390XSLWconst { 29874 break 29875 } 29876 if sh.AuxInt != 8 { 29877 break 29878 } 29879 x0 := sh.Args[0] 29880 if x0.Op != OpS390XMOVBZloadidx { 29881 break 29882 } 29883 i0 := x0.AuxInt 29884 if x0.Aux != s { 29885 break 29886 } 29887 _ = x0.Args[2] 29888 if idx != x0.Args[0] { 29889 break 29890 } 29891 if p != x0.Args[1] { 29892 break 29893 } 29894 if mem != x0.Args[2] { 29895 break 29896 } 29897 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)) { 29898 break 29899 } 29900 b = mergePoint(b, x0, x1) 29901 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29902 v.reset(OpCopy) 29903 v.AddArg(v0) 29904 v0.AuxInt = i0 29905 v0.Aux = s 29906 v0.AddArg(p) 29907 v0.AddArg(idx) 29908 v0.AddArg(mem) 29909 return true 29910 } 29911 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 29912 // 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) 29913 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29914 for { 29915 _ = v.Args[1] 29916 x1 := v.Args[0] 29917 if x1.Op != OpS390XMOVBZloadidx { 29918 break 29919 } 29920 i1 := x1.AuxInt 29921 s := x1.Aux 29922 _ = x1.Args[2] 29923 idx := x1.Args[0] 29924 p := x1.Args[1] 29925 mem := x1.Args[2] 29926 sh := v.Args[1] 29927 if sh.Op != OpS390XSLWconst { 29928 break 29929 } 29930 if sh.AuxInt != 8 { 29931 break 29932 } 29933 x0 := sh.Args[0] 29934 if x0.Op != OpS390XMOVBZloadidx { 29935 break 29936 } 29937 i0 := x0.AuxInt 29938 if x0.Aux != s { 29939 break 29940 } 29941 _ = x0.Args[2] 29942 if idx != x0.Args[0] { 29943 break 29944 } 29945 if p != x0.Args[1] { 29946 break 29947 } 29948 if mem != x0.Args[2] { 29949 break 29950 } 29951 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)) { 29952 break 29953 } 29954 b = mergePoint(b, x0, x1) 29955 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 29956 v.reset(OpCopy) 29957 v.AddArg(v0) 29958 v0.AuxInt = i0 29959 v0.Aux = s 29960 v0.AddArg(p) 29961 v0.AddArg(idx) 29962 v0.AddArg(mem) 29963 return true 29964 } 29965 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 29966 // 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) 29967 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 29968 for { 29969 _ = v.Args[1] 29970 sh := v.Args[0] 29971 if sh.Op != OpS390XSLWconst { 29972 break 29973 } 29974 if sh.AuxInt != 8 { 29975 break 29976 } 29977 x0 := sh.Args[0] 29978 if x0.Op != OpS390XMOVBZloadidx { 29979 break 29980 } 29981 i0 := x0.AuxInt 29982 s := x0.Aux 29983 _ = x0.Args[2] 29984 p := x0.Args[0] 29985 idx := x0.Args[1] 29986 mem := x0.Args[2] 29987 x1 := v.Args[1] 29988 if x1.Op != OpS390XMOVBZloadidx { 29989 break 29990 } 29991 i1 := x1.AuxInt 29992 if x1.Aux != s { 29993 break 29994 } 29995 _ = x1.Args[2] 29996 if p != x1.Args[0] { 29997 break 29998 } 29999 if idx != x1.Args[1] { 30000 break 30001 } 30002 if mem != x1.Args[2] { 30003 break 30004 } 30005 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)) { 30006 break 30007 } 30008 b = mergePoint(b, x0, x1) 30009 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30010 v.reset(OpCopy) 30011 v.AddArg(v0) 30012 v0.AuxInt = i0 30013 v0.Aux = s 30014 v0.AddArg(p) 30015 v0.AddArg(idx) 30016 v0.AddArg(mem) 30017 return true 30018 } 30019 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 30020 // 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) 30021 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30022 for { 30023 _ = v.Args[1] 30024 sh := v.Args[0] 30025 if sh.Op != OpS390XSLWconst { 30026 break 30027 } 30028 if sh.AuxInt != 8 { 30029 break 30030 } 30031 x0 := sh.Args[0] 30032 if x0.Op != OpS390XMOVBZloadidx { 30033 break 30034 } 30035 i0 := x0.AuxInt 30036 s := x0.Aux 30037 _ = x0.Args[2] 30038 idx := x0.Args[0] 30039 p := x0.Args[1] 30040 mem := x0.Args[2] 30041 x1 := v.Args[1] 30042 if x1.Op != OpS390XMOVBZloadidx { 30043 break 30044 } 30045 i1 := x1.AuxInt 30046 if x1.Aux != s { 30047 break 30048 } 30049 _ = x1.Args[2] 30050 if p != x1.Args[0] { 30051 break 30052 } 30053 if idx != x1.Args[1] { 30054 break 30055 } 30056 if mem != x1.Args[2] { 30057 break 30058 } 30059 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)) { 30060 break 30061 } 30062 b = mergePoint(b, x0, x1) 30063 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30064 v.reset(OpCopy) 30065 v.AddArg(v0) 30066 v0.AuxInt = i0 30067 v0.Aux = s 30068 v0.AddArg(p) 30069 v0.AddArg(idx) 30070 v0.AddArg(mem) 30071 return true 30072 } 30073 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30074 // 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) 30075 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30076 for { 30077 _ = v.Args[1] 30078 sh := v.Args[0] 30079 if sh.Op != OpS390XSLWconst { 30080 break 30081 } 30082 if sh.AuxInt != 8 { 30083 break 30084 } 30085 x0 := sh.Args[0] 30086 if x0.Op != OpS390XMOVBZloadidx { 30087 break 30088 } 30089 i0 := x0.AuxInt 30090 s := x0.Aux 30091 _ = x0.Args[2] 30092 p := x0.Args[0] 30093 idx := x0.Args[1] 30094 mem := x0.Args[2] 30095 x1 := v.Args[1] 30096 if x1.Op != OpS390XMOVBZloadidx { 30097 break 30098 } 30099 i1 := x1.AuxInt 30100 if x1.Aux != s { 30101 break 30102 } 30103 _ = x1.Args[2] 30104 if idx != x1.Args[0] { 30105 break 30106 } 30107 if p != x1.Args[1] { 30108 break 30109 } 30110 if mem != x1.Args[2] { 30111 break 30112 } 30113 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)) { 30114 break 30115 } 30116 b = mergePoint(b, x0, x1) 30117 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30118 v.reset(OpCopy) 30119 v.AddArg(v0) 30120 v0.AuxInt = i0 30121 v0.Aux = s 30122 v0.AddArg(p) 30123 v0.AddArg(idx) 30124 v0.AddArg(mem) 30125 return true 30126 } 30127 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 30128 // 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) 30129 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 30130 for { 30131 _ = v.Args[1] 30132 sh := v.Args[0] 30133 if sh.Op != OpS390XSLWconst { 30134 break 30135 } 30136 if sh.AuxInt != 8 { 30137 break 30138 } 30139 x0 := sh.Args[0] 30140 if x0.Op != OpS390XMOVBZloadidx { 30141 break 30142 } 30143 i0 := x0.AuxInt 30144 s := x0.Aux 30145 _ = x0.Args[2] 30146 idx := x0.Args[0] 30147 p := x0.Args[1] 30148 mem := x0.Args[2] 30149 x1 := v.Args[1] 30150 if x1.Op != OpS390XMOVBZloadidx { 30151 break 30152 } 30153 i1 := x1.AuxInt 30154 if x1.Aux != s { 30155 break 30156 } 30157 _ = x1.Args[2] 30158 if idx != x1.Args[0] { 30159 break 30160 } 30161 if p != x1.Args[1] { 30162 break 30163 } 30164 if mem != x1.Args[2] { 30165 break 30166 } 30167 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)) { 30168 break 30169 } 30170 b = mergePoint(b, x0, x1) 30171 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30172 v.reset(OpCopy) 30173 v.AddArg(v0) 30174 v0.AuxInt = i0 30175 v0.Aux = s 30176 v0.AddArg(p) 30177 v0.AddArg(idx) 30178 v0.AddArg(mem) 30179 return true 30180 } 30181 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30182 // 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) 30183 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30184 for { 30185 _ = v.Args[1] 30186 x1 := v.Args[0] 30187 if x1.Op != OpS390XMOVHZloadidx { 30188 break 30189 } 30190 i1 := x1.AuxInt 30191 s := x1.Aux 30192 _ = x1.Args[2] 30193 p := x1.Args[0] 30194 idx := x1.Args[1] 30195 mem := x1.Args[2] 30196 sh := v.Args[1] 30197 if sh.Op != OpS390XSLWconst { 30198 break 30199 } 30200 if sh.AuxInt != 16 { 30201 break 30202 } 30203 x0 := sh.Args[0] 30204 if x0.Op != OpS390XMOVHZloadidx { 30205 break 30206 } 30207 i0 := x0.AuxInt 30208 if x0.Aux != s { 30209 break 30210 } 30211 _ = x0.Args[2] 30212 if p != x0.Args[0] { 30213 break 30214 } 30215 if idx != x0.Args[1] { 30216 break 30217 } 30218 if mem != x0.Args[2] { 30219 break 30220 } 30221 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)) { 30222 break 30223 } 30224 b = mergePoint(b, x0, x1) 30225 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30226 v.reset(OpCopy) 30227 v.AddArg(v0) 30228 v0.AuxInt = i0 30229 v0.Aux = s 30230 v0.AddArg(p) 30231 v0.AddArg(idx) 30232 v0.AddArg(mem) 30233 return true 30234 } 30235 return false 30236 } 30237 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 30238 b := v.Block 30239 _ = b 30240 typ := &b.Func.Config.Types 30241 _ = typ 30242 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 30243 // 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) 30244 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30245 for { 30246 _ = v.Args[1] 30247 x1 := v.Args[0] 30248 if x1.Op != OpS390XMOVHZloadidx { 30249 break 30250 } 30251 i1 := x1.AuxInt 30252 s := x1.Aux 30253 _ = x1.Args[2] 30254 idx := x1.Args[0] 30255 p := x1.Args[1] 30256 mem := x1.Args[2] 30257 sh := v.Args[1] 30258 if sh.Op != OpS390XSLWconst { 30259 break 30260 } 30261 if sh.AuxInt != 16 { 30262 break 30263 } 30264 x0 := sh.Args[0] 30265 if x0.Op != OpS390XMOVHZloadidx { 30266 break 30267 } 30268 i0 := x0.AuxInt 30269 if x0.Aux != s { 30270 break 30271 } 30272 _ = x0.Args[2] 30273 if p != x0.Args[0] { 30274 break 30275 } 30276 if idx != x0.Args[1] { 30277 break 30278 } 30279 if mem != x0.Args[2] { 30280 break 30281 } 30282 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)) { 30283 break 30284 } 30285 b = mergePoint(b, x0, x1) 30286 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30287 v.reset(OpCopy) 30288 v.AddArg(v0) 30289 v0.AuxInt = i0 30290 v0.Aux = s 30291 v0.AddArg(p) 30292 v0.AddArg(idx) 30293 v0.AddArg(mem) 30294 return true 30295 } 30296 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30297 // 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) 30298 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30299 for { 30300 _ = v.Args[1] 30301 x1 := v.Args[0] 30302 if x1.Op != OpS390XMOVHZloadidx { 30303 break 30304 } 30305 i1 := x1.AuxInt 30306 s := x1.Aux 30307 _ = x1.Args[2] 30308 p := x1.Args[0] 30309 idx := x1.Args[1] 30310 mem := x1.Args[2] 30311 sh := v.Args[1] 30312 if sh.Op != OpS390XSLWconst { 30313 break 30314 } 30315 if sh.AuxInt != 16 { 30316 break 30317 } 30318 x0 := sh.Args[0] 30319 if x0.Op != OpS390XMOVHZloadidx { 30320 break 30321 } 30322 i0 := x0.AuxInt 30323 if x0.Aux != s { 30324 break 30325 } 30326 _ = x0.Args[2] 30327 if idx != x0.Args[0] { 30328 break 30329 } 30330 if p != x0.Args[1] { 30331 break 30332 } 30333 if mem != x0.Args[2] { 30334 break 30335 } 30336 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)) { 30337 break 30338 } 30339 b = mergePoint(b, x0, x1) 30340 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30341 v.reset(OpCopy) 30342 v.AddArg(v0) 30343 v0.AuxInt = i0 30344 v0.Aux = s 30345 v0.AddArg(p) 30346 v0.AddArg(idx) 30347 v0.AddArg(mem) 30348 return true 30349 } 30350 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 30351 // 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) 30352 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30353 for { 30354 _ = v.Args[1] 30355 x1 := v.Args[0] 30356 if x1.Op != OpS390XMOVHZloadidx { 30357 break 30358 } 30359 i1 := x1.AuxInt 30360 s := x1.Aux 30361 _ = x1.Args[2] 30362 idx := x1.Args[0] 30363 p := x1.Args[1] 30364 mem := x1.Args[2] 30365 sh := v.Args[1] 30366 if sh.Op != OpS390XSLWconst { 30367 break 30368 } 30369 if sh.AuxInt != 16 { 30370 break 30371 } 30372 x0 := sh.Args[0] 30373 if x0.Op != OpS390XMOVHZloadidx { 30374 break 30375 } 30376 i0 := x0.AuxInt 30377 if x0.Aux != s { 30378 break 30379 } 30380 _ = x0.Args[2] 30381 if idx != x0.Args[0] { 30382 break 30383 } 30384 if p != x0.Args[1] { 30385 break 30386 } 30387 if mem != x0.Args[2] { 30388 break 30389 } 30390 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)) { 30391 break 30392 } 30393 b = mergePoint(b, x0, x1) 30394 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30395 v.reset(OpCopy) 30396 v.AddArg(v0) 30397 v0.AuxInt = i0 30398 v0.Aux = s 30399 v0.AddArg(p) 30400 v0.AddArg(idx) 30401 v0.AddArg(mem) 30402 return true 30403 } 30404 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30405 // 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) 30406 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30407 for { 30408 _ = v.Args[1] 30409 sh := v.Args[0] 30410 if sh.Op != OpS390XSLWconst { 30411 break 30412 } 30413 if sh.AuxInt != 16 { 30414 break 30415 } 30416 x0 := sh.Args[0] 30417 if x0.Op != OpS390XMOVHZloadidx { 30418 break 30419 } 30420 i0 := x0.AuxInt 30421 s := x0.Aux 30422 _ = x0.Args[2] 30423 p := x0.Args[0] 30424 idx := x0.Args[1] 30425 mem := x0.Args[2] 30426 x1 := v.Args[1] 30427 if x1.Op != OpS390XMOVHZloadidx { 30428 break 30429 } 30430 i1 := x1.AuxInt 30431 if x1.Aux != s { 30432 break 30433 } 30434 _ = x1.Args[2] 30435 if p != x1.Args[0] { 30436 break 30437 } 30438 if idx != x1.Args[1] { 30439 break 30440 } 30441 if mem != x1.Args[2] { 30442 break 30443 } 30444 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)) { 30445 break 30446 } 30447 b = mergePoint(b, x0, x1) 30448 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30449 v.reset(OpCopy) 30450 v.AddArg(v0) 30451 v0.AuxInt = i0 30452 v0.Aux = s 30453 v0.AddArg(p) 30454 v0.AddArg(idx) 30455 v0.AddArg(mem) 30456 return true 30457 } 30458 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 30459 // 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) 30460 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30461 for { 30462 _ = v.Args[1] 30463 sh := v.Args[0] 30464 if sh.Op != OpS390XSLWconst { 30465 break 30466 } 30467 if sh.AuxInt != 16 { 30468 break 30469 } 30470 x0 := sh.Args[0] 30471 if x0.Op != OpS390XMOVHZloadidx { 30472 break 30473 } 30474 i0 := x0.AuxInt 30475 s := x0.Aux 30476 _ = x0.Args[2] 30477 idx := x0.Args[0] 30478 p := x0.Args[1] 30479 mem := x0.Args[2] 30480 x1 := v.Args[1] 30481 if x1.Op != OpS390XMOVHZloadidx { 30482 break 30483 } 30484 i1 := x1.AuxInt 30485 if x1.Aux != s { 30486 break 30487 } 30488 _ = x1.Args[2] 30489 if p != x1.Args[0] { 30490 break 30491 } 30492 if idx != x1.Args[1] { 30493 break 30494 } 30495 if mem != x1.Args[2] { 30496 break 30497 } 30498 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)) { 30499 break 30500 } 30501 b = mergePoint(b, x0, x1) 30502 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30503 v.reset(OpCopy) 30504 v.AddArg(v0) 30505 v0.AuxInt = i0 30506 v0.Aux = s 30507 v0.AddArg(p) 30508 v0.AddArg(idx) 30509 v0.AddArg(mem) 30510 return true 30511 } 30512 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30513 // 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) 30514 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30515 for { 30516 _ = v.Args[1] 30517 sh := v.Args[0] 30518 if sh.Op != OpS390XSLWconst { 30519 break 30520 } 30521 if sh.AuxInt != 16 { 30522 break 30523 } 30524 x0 := sh.Args[0] 30525 if x0.Op != OpS390XMOVHZloadidx { 30526 break 30527 } 30528 i0 := x0.AuxInt 30529 s := x0.Aux 30530 _ = x0.Args[2] 30531 p := x0.Args[0] 30532 idx := x0.Args[1] 30533 mem := x0.Args[2] 30534 x1 := v.Args[1] 30535 if x1.Op != OpS390XMOVHZloadidx { 30536 break 30537 } 30538 i1 := x1.AuxInt 30539 if x1.Aux != s { 30540 break 30541 } 30542 _ = x1.Args[2] 30543 if idx != x1.Args[0] { 30544 break 30545 } 30546 if p != x1.Args[1] { 30547 break 30548 } 30549 if mem != x1.Args[2] { 30550 break 30551 } 30552 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)) { 30553 break 30554 } 30555 b = mergePoint(b, x0, x1) 30556 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30557 v.reset(OpCopy) 30558 v.AddArg(v0) 30559 v0.AuxInt = i0 30560 v0.Aux = s 30561 v0.AddArg(p) 30562 v0.AddArg(idx) 30563 v0.AddArg(mem) 30564 return true 30565 } 30566 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 30567 // 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) 30568 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 30569 for { 30570 _ = v.Args[1] 30571 sh := v.Args[0] 30572 if sh.Op != OpS390XSLWconst { 30573 break 30574 } 30575 if sh.AuxInt != 16 { 30576 break 30577 } 30578 x0 := sh.Args[0] 30579 if x0.Op != OpS390XMOVHZloadidx { 30580 break 30581 } 30582 i0 := x0.AuxInt 30583 s := x0.Aux 30584 _ = x0.Args[2] 30585 idx := x0.Args[0] 30586 p := x0.Args[1] 30587 mem := x0.Args[2] 30588 x1 := v.Args[1] 30589 if x1.Op != OpS390XMOVHZloadidx { 30590 break 30591 } 30592 i1 := x1.AuxInt 30593 if x1.Aux != s { 30594 break 30595 } 30596 _ = x1.Args[2] 30597 if idx != x1.Args[0] { 30598 break 30599 } 30600 if p != x1.Args[1] { 30601 break 30602 } 30603 if mem != x1.Args[2] { 30604 break 30605 } 30606 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)) { 30607 break 30608 } 30609 b = mergePoint(b, x0, x1) 30610 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) 30611 v.reset(OpCopy) 30612 v.AddArg(v0) 30613 v0.AuxInt = i0 30614 v0.Aux = s 30615 v0.AddArg(p) 30616 v0.AddArg(idx) 30617 v0.AddArg(mem) 30618 return true 30619 } 30620 // 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)) 30621 // 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) 30622 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30623 for { 30624 _ = v.Args[1] 30625 s0 := v.Args[0] 30626 if s0.Op != OpS390XSLWconst { 30627 break 30628 } 30629 j0 := s0.AuxInt 30630 x0 := s0.Args[0] 30631 if x0.Op != OpS390XMOVBZloadidx { 30632 break 30633 } 30634 i0 := x0.AuxInt 30635 s := x0.Aux 30636 _ = x0.Args[2] 30637 p := x0.Args[0] 30638 idx := x0.Args[1] 30639 mem := x0.Args[2] 30640 or := v.Args[1] 30641 if or.Op != OpS390XORW { 30642 break 30643 } 30644 _ = or.Args[1] 30645 s1 := or.Args[0] 30646 if s1.Op != OpS390XSLWconst { 30647 break 30648 } 30649 j1 := s1.AuxInt 30650 x1 := s1.Args[0] 30651 if x1.Op != OpS390XMOVBZloadidx { 30652 break 30653 } 30654 i1 := x1.AuxInt 30655 if x1.Aux != s { 30656 break 30657 } 30658 _ = x1.Args[2] 30659 if p != x1.Args[0] { 30660 break 30661 } 30662 if idx != x1.Args[1] { 30663 break 30664 } 30665 if mem != x1.Args[2] { 30666 break 30667 } 30668 y := or.Args[1] 30669 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)) { 30670 break 30671 } 30672 b = mergePoint(b, x0, x1) 30673 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30674 v.reset(OpCopy) 30675 v.AddArg(v0) 30676 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30677 v1.AuxInt = j1 30678 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30679 v2.AuxInt = i0 30680 v2.Aux = s 30681 v2.AddArg(p) 30682 v2.AddArg(idx) 30683 v2.AddArg(mem) 30684 v1.AddArg(v2) 30685 v0.AddArg(v1) 30686 v0.AddArg(y) 30687 return true 30688 } 30689 // 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)) 30690 // 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) 30691 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30692 for { 30693 _ = v.Args[1] 30694 s0 := v.Args[0] 30695 if s0.Op != OpS390XSLWconst { 30696 break 30697 } 30698 j0 := s0.AuxInt 30699 x0 := s0.Args[0] 30700 if x0.Op != OpS390XMOVBZloadidx { 30701 break 30702 } 30703 i0 := x0.AuxInt 30704 s := x0.Aux 30705 _ = x0.Args[2] 30706 idx := x0.Args[0] 30707 p := x0.Args[1] 30708 mem := x0.Args[2] 30709 or := v.Args[1] 30710 if or.Op != OpS390XORW { 30711 break 30712 } 30713 _ = or.Args[1] 30714 s1 := or.Args[0] 30715 if s1.Op != OpS390XSLWconst { 30716 break 30717 } 30718 j1 := s1.AuxInt 30719 x1 := s1.Args[0] 30720 if x1.Op != OpS390XMOVBZloadidx { 30721 break 30722 } 30723 i1 := x1.AuxInt 30724 if x1.Aux != s { 30725 break 30726 } 30727 _ = x1.Args[2] 30728 if p != x1.Args[0] { 30729 break 30730 } 30731 if idx != x1.Args[1] { 30732 break 30733 } 30734 if mem != x1.Args[2] { 30735 break 30736 } 30737 y := or.Args[1] 30738 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)) { 30739 break 30740 } 30741 b = mergePoint(b, x0, x1) 30742 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30743 v.reset(OpCopy) 30744 v.AddArg(v0) 30745 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30746 v1.AuxInt = j1 30747 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30748 v2.AuxInt = i0 30749 v2.Aux = s 30750 v2.AddArg(p) 30751 v2.AddArg(idx) 30752 v2.AddArg(mem) 30753 v1.AddArg(v2) 30754 v0.AddArg(v1) 30755 v0.AddArg(y) 30756 return true 30757 } 30758 // 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)) 30759 // 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) 30760 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30761 for { 30762 _ = v.Args[1] 30763 s0 := v.Args[0] 30764 if s0.Op != OpS390XSLWconst { 30765 break 30766 } 30767 j0 := s0.AuxInt 30768 x0 := s0.Args[0] 30769 if x0.Op != OpS390XMOVBZloadidx { 30770 break 30771 } 30772 i0 := x0.AuxInt 30773 s := x0.Aux 30774 _ = x0.Args[2] 30775 p := x0.Args[0] 30776 idx := x0.Args[1] 30777 mem := x0.Args[2] 30778 or := v.Args[1] 30779 if or.Op != OpS390XORW { 30780 break 30781 } 30782 _ = or.Args[1] 30783 s1 := or.Args[0] 30784 if s1.Op != OpS390XSLWconst { 30785 break 30786 } 30787 j1 := s1.AuxInt 30788 x1 := s1.Args[0] 30789 if x1.Op != OpS390XMOVBZloadidx { 30790 break 30791 } 30792 i1 := x1.AuxInt 30793 if x1.Aux != s { 30794 break 30795 } 30796 _ = x1.Args[2] 30797 if idx != x1.Args[0] { 30798 break 30799 } 30800 if p != x1.Args[1] { 30801 break 30802 } 30803 if mem != x1.Args[2] { 30804 break 30805 } 30806 y := or.Args[1] 30807 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)) { 30808 break 30809 } 30810 b = mergePoint(b, x0, x1) 30811 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30812 v.reset(OpCopy) 30813 v.AddArg(v0) 30814 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30815 v1.AuxInt = j1 30816 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30817 v2.AuxInt = i0 30818 v2.Aux = s 30819 v2.AddArg(p) 30820 v2.AddArg(idx) 30821 v2.AddArg(mem) 30822 v1.AddArg(v2) 30823 v0.AddArg(v1) 30824 v0.AddArg(y) 30825 return true 30826 } 30827 return false 30828 } 30829 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 30830 b := v.Block 30831 _ = b 30832 typ := &b.Func.Config.Types 30833 _ = typ 30834 // 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)) 30835 // 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) 30836 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30837 for { 30838 _ = v.Args[1] 30839 s0 := v.Args[0] 30840 if s0.Op != OpS390XSLWconst { 30841 break 30842 } 30843 j0 := s0.AuxInt 30844 x0 := s0.Args[0] 30845 if x0.Op != OpS390XMOVBZloadidx { 30846 break 30847 } 30848 i0 := x0.AuxInt 30849 s := x0.Aux 30850 _ = x0.Args[2] 30851 idx := x0.Args[0] 30852 p := x0.Args[1] 30853 mem := x0.Args[2] 30854 or := v.Args[1] 30855 if or.Op != OpS390XORW { 30856 break 30857 } 30858 _ = or.Args[1] 30859 s1 := or.Args[0] 30860 if s1.Op != OpS390XSLWconst { 30861 break 30862 } 30863 j1 := s1.AuxInt 30864 x1 := s1.Args[0] 30865 if x1.Op != OpS390XMOVBZloadidx { 30866 break 30867 } 30868 i1 := x1.AuxInt 30869 if x1.Aux != s { 30870 break 30871 } 30872 _ = x1.Args[2] 30873 if idx != x1.Args[0] { 30874 break 30875 } 30876 if p != x1.Args[1] { 30877 break 30878 } 30879 if mem != x1.Args[2] { 30880 break 30881 } 30882 y := or.Args[1] 30883 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)) { 30884 break 30885 } 30886 b = mergePoint(b, x0, x1) 30887 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30888 v.reset(OpCopy) 30889 v.AddArg(v0) 30890 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30891 v1.AuxInt = j1 30892 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30893 v2.AuxInt = i0 30894 v2.Aux = s 30895 v2.AddArg(p) 30896 v2.AddArg(idx) 30897 v2.AddArg(mem) 30898 v1.AddArg(v2) 30899 v0.AddArg(v1) 30900 v0.AddArg(y) 30901 return true 30902 } 30903 // 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)))) 30904 // 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) 30905 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30906 for { 30907 _ = v.Args[1] 30908 s0 := v.Args[0] 30909 if s0.Op != OpS390XSLWconst { 30910 break 30911 } 30912 j0 := s0.AuxInt 30913 x0 := s0.Args[0] 30914 if x0.Op != OpS390XMOVBZloadidx { 30915 break 30916 } 30917 i0 := x0.AuxInt 30918 s := x0.Aux 30919 _ = x0.Args[2] 30920 p := x0.Args[0] 30921 idx := x0.Args[1] 30922 mem := x0.Args[2] 30923 or := v.Args[1] 30924 if or.Op != OpS390XORW { 30925 break 30926 } 30927 _ = or.Args[1] 30928 y := or.Args[0] 30929 s1 := or.Args[1] 30930 if s1.Op != OpS390XSLWconst { 30931 break 30932 } 30933 j1 := s1.AuxInt 30934 x1 := s1.Args[0] 30935 if x1.Op != OpS390XMOVBZloadidx { 30936 break 30937 } 30938 i1 := x1.AuxInt 30939 if x1.Aux != s { 30940 break 30941 } 30942 _ = x1.Args[2] 30943 if p != x1.Args[0] { 30944 break 30945 } 30946 if idx != x1.Args[1] { 30947 break 30948 } 30949 if mem != x1.Args[2] { 30950 break 30951 } 30952 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)) { 30953 break 30954 } 30955 b = mergePoint(b, x0, x1) 30956 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30957 v.reset(OpCopy) 30958 v.AddArg(v0) 30959 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30960 v1.AuxInt = j1 30961 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 30962 v2.AuxInt = i0 30963 v2.Aux = s 30964 v2.AddArg(p) 30965 v2.AddArg(idx) 30966 v2.AddArg(mem) 30967 v1.AddArg(v2) 30968 v0.AddArg(v1) 30969 v0.AddArg(y) 30970 return true 30971 } 30972 // 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)))) 30973 // 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) 30974 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30975 for { 30976 _ = v.Args[1] 30977 s0 := v.Args[0] 30978 if s0.Op != OpS390XSLWconst { 30979 break 30980 } 30981 j0 := s0.AuxInt 30982 x0 := s0.Args[0] 30983 if x0.Op != OpS390XMOVBZloadidx { 30984 break 30985 } 30986 i0 := x0.AuxInt 30987 s := x0.Aux 30988 _ = x0.Args[2] 30989 idx := x0.Args[0] 30990 p := x0.Args[1] 30991 mem := x0.Args[2] 30992 or := v.Args[1] 30993 if or.Op != OpS390XORW { 30994 break 30995 } 30996 _ = or.Args[1] 30997 y := or.Args[0] 30998 s1 := or.Args[1] 30999 if s1.Op != OpS390XSLWconst { 31000 break 31001 } 31002 j1 := s1.AuxInt 31003 x1 := s1.Args[0] 31004 if x1.Op != OpS390XMOVBZloadidx { 31005 break 31006 } 31007 i1 := x1.AuxInt 31008 if x1.Aux != s { 31009 break 31010 } 31011 _ = x1.Args[2] 31012 if p != x1.Args[0] { 31013 break 31014 } 31015 if idx != x1.Args[1] { 31016 break 31017 } 31018 if mem != x1.Args[2] { 31019 break 31020 } 31021 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)) { 31022 break 31023 } 31024 b = mergePoint(b, x0, x1) 31025 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31026 v.reset(OpCopy) 31027 v.AddArg(v0) 31028 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31029 v1.AuxInt = j1 31030 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31031 v2.AuxInt = i0 31032 v2.Aux = s 31033 v2.AddArg(p) 31034 v2.AddArg(idx) 31035 v2.AddArg(mem) 31036 v1.AddArg(v2) 31037 v0.AddArg(v1) 31038 v0.AddArg(y) 31039 return true 31040 } 31041 // 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)))) 31042 // 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) 31043 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31044 for { 31045 _ = v.Args[1] 31046 s0 := v.Args[0] 31047 if s0.Op != OpS390XSLWconst { 31048 break 31049 } 31050 j0 := s0.AuxInt 31051 x0 := s0.Args[0] 31052 if x0.Op != OpS390XMOVBZloadidx { 31053 break 31054 } 31055 i0 := x0.AuxInt 31056 s := x0.Aux 31057 _ = x0.Args[2] 31058 p := x0.Args[0] 31059 idx := x0.Args[1] 31060 mem := x0.Args[2] 31061 or := v.Args[1] 31062 if or.Op != OpS390XORW { 31063 break 31064 } 31065 _ = or.Args[1] 31066 y := or.Args[0] 31067 s1 := or.Args[1] 31068 if s1.Op != OpS390XSLWconst { 31069 break 31070 } 31071 j1 := s1.AuxInt 31072 x1 := s1.Args[0] 31073 if x1.Op != OpS390XMOVBZloadidx { 31074 break 31075 } 31076 i1 := x1.AuxInt 31077 if x1.Aux != s { 31078 break 31079 } 31080 _ = x1.Args[2] 31081 if idx != x1.Args[0] { 31082 break 31083 } 31084 if p != x1.Args[1] { 31085 break 31086 } 31087 if mem != x1.Args[2] { 31088 break 31089 } 31090 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)) { 31091 break 31092 } 31093 b = mergePoint(b, x0, x1) 31094 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31095 v.reset(OpCopy) 31096 v.AddArg(v0) 31097 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31098 v1.AuxInt = j1 31099 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31100 v2.AuxInt = i0 31101 v2.Aux = s 31102 v2.AddArg(p) 31103 v2.AddArg(idx) 31104 v2.AddArg(mem) 31105 v1.AddArg(v2) 31106 v0.AddArg(v1) 31107 v0.AddArg(y) 31108 return true 31109 } 31110 // 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)))) 31111 // 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) 31112 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31113 for { 31114 _ = v.Args[1] 31115 s0 := v.Args[0] 31116 if s0.Op != OpS390XSLWconst { 31117 break 31118 } 31119 j0 := s0.AuxInt 31120 x0 := s0.Args[0] 31121 if x0.Op != OpS390XMOVBZloadidx { 31122 break 31123 } 31124 i0 := x0.AuxInt 31125 s := x0.Aux 31126 _ = x0.Args[2] 31127 idx := x0.Args[0] 31128 p := x0.Args[1] 31129 mem := x0.Args[2] 31130 or := v.Args[1] 31131 if or.Op != OpS390XORW { 31132 break 31133 } 31134 _ = or.Args[1] 31135 y := or.Args[0] 31136 s1 := or.Args[1] 31137 if s1.Op != OpS390XSLWconst { 31138 break 31139 } 31140 j1 := s1.AuxInt 31141 x1 := s1.Args[0] 31142 if x1.Op != OpS390XMOVBZloadidx { 31143 break 31144 } 31145 i1 := x1.AuxInt 31146 if x1.Aux != s { 31147 break 31148 } 31149 _ = x1.Args[2] 31150 if idx != x1.Args[0] { 31151 break 31152 } 31153 if p != x1.Args[1] { 31154 break 31155 } 31156 if mem != x1.Args[2] { 31157 break 31158 } 31159 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)) { 31160 break 31161 } 31162 b = mergePoint(b, x0, x1) 31163 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31164 v.reset(OpCopy) 31165 v.AddArg(v0) 31166 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31167 v1.AuxInt = j1 31168 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31169 v2.AuxInt = i0 31170 v2.Aux = s 31171 v2.AddArg(p) 31172 v2.AddArg(idx) 31173 v2.AddArg(mem) 31174 v1.AddArg(v2) 31175 v0.AddArg(v1) 31176 v0.AddArg(y) 31177 return true 31178 } 31179 // 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))) 31180 // 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) 31181 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31182 for { 31183 _ = v.Args[1] 31184 or := v.Args[0] 31185 if or.Op != OpS390XORW { 31186 break 31187 } 31188 _ = or.Args[1] 31189 s1 := or.Args[0] 31190 if s1.Op != OpS390XSLWconst { 31191 break 31192 } 31193 j1 := s1.AuxInt 31194 x1 := s1.Args[0] 31195 if x1.Op != OpS390XMOVBZloadidx { 31196 break 31197 } 31198 i1 := x1.AuxInt 31199 s := x1.Aux 31200 _ = x1.Args[2] 31201 p := x1.Args[0] 31202 idx := x1.Args[1] 31203 mem := x1.Args[2] 31204 y := or.Args[1] 31205 s0 := v.Args[1] 31206 if s0.Op != OpS390XSLWconst { 31207 break 31208 } 31209 j0 := s0.AuxInt 31210 x0 := s0.Args[0] 31211 if x0.Op != OpS390XMOVBZloadidx { 31212 break 31213 } 31214 i0 := x0.AuxInt 31215 if x0.Aux != s { 31216 break 31217 } 31218 _ = x0.Args[2] 31219 if p != x0.Args[0] { 31220 break 31221 } 31222 if idx != x0.Args[1] { 31223 break 31224 } 31225 if mem != x0.Args[2] { 31226 break 31227 } 31228 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)) { 31229 break 31230 } 31231 b = mergePoint(b, x0, x1) 31232 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31233 v.reset(OpCopy) 31234 v.AddArg(v0) 31235 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31236 v1.AuxInt = j1 31237 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31238 v2.AuxInt = i0 31239 v2.Aux = s 31240 v2.AddArg(p) 31241 v2.AddArg(idx) 31242 v2.AddArg(mem) 31243 v1.AddArg(v2) 31244 v0.AddArg(v1) 31245 v0.AddArg(y) 31246 return true 31247 } 31248 // 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))) 31249 // 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) 31250 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31251 for { 31252 _ = v.Args[1] 31253 or := v.Args[0] 31254 if or.Op != OpS390XORW { 31255 break 31256 } 31257 _ = or.Args[1] 31258 s1 := or.Args[0] 31259 if s1.Op != OpS390XSLWconst { 31260 break 31261 } 31262 j1 := s1.AuxInt 31263 x1 := s1.Args[0] 31264 if x1.Op != OpS390XMOVBZloadidx { 31265 break 31266 } 31267 i1 := x1.AuxInt 31268 s := x1.Aux 31269 _ = x1.Args[2] 31270 idx := x1.Args[0] 31271 p := x1.Args[1] 31272 mem := x1.Args[2] 31273 y := or.Args[1] 31274 s0 := v.Args[1] 31275 if s0.Op != OpS390XSLWconst { 31276 break 31277 } 31278 j0 := s0.AuxInt 31279 x0 := s0.Args[0] 31280 if x0.Op != OpS390XMOVBZloadidx { 31281 break 31282 } 31283 i0 := x0.AuxInt 31284 if x0.Aux != s { 31285 break 31286 } 31287 _ = x0.Args[2] 31288 if p != x0.Args[0] { 31289 break 31290 } 31291 if idx != x0.Args[1] { 31292 break 31293 } 31294 if mem != x0.Args[2] { 31295 break 31296 } 31297 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)) { 31298 break 31299 } 31300 b = mergePoint(b, x0, x1) 31301 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31302 v.reset(OpCopy) 31303 v.AddArg(v0) 31304 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31305 v1.AuxInt = j1 31306 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31307 v2.AuxInt = i0 31308 v2.Aux = s 31309 v2.AddArg(p) 31310 v2.AddArg(idx) 31311 v2.AddArg(mem) 31312 v1.AddArg(v2) 31313 v0.AddArg(v1) 31314 v0.AddArg(y) 31315 return true 31316 } 31317 // 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))) 31318 // 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) 31319 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31320 for { 31321 _ = v.Args[1] 31322 or := v.Args[0] 31323 if or.Op != OpS390XORW { 31324 break 31325 } 31326 _ = or.Args[1] 31327 y := or.Args[0] 31328 s1 := or.Args[1] 31329 if s1.Op != OpS390XSLWconst { 31330 break 31331 } 31332 j1 := s1.AuxInt 31333 x1 := s1.Args[0] 31334 if x1.Op != OpS390XMOVBZloadidx { 31335 break 31336 } 31337 i1 := x1.AuxInt 31338 s := x1.Aux 31339 _ = x1.Args[2] 31340 p := x1.Args[0] 31341 idx := x1.Args[1] 31342 mem := x1.Args[2] 31343 s0 := v.Args[1] 31344 if s0.Op != OpS390XSLWconst { 31345 break 31346 } 31347 j0 := s0.AuxInt 31348 x0 := s0.Args[0] 31349 if x0.Op != OpS390XMOVBZloadidx { 31350 break 31351 } 31352 i0 := x0.AuxInt 31353 if x0.Aux != s { 31354 break 31355 } 31356 _ = x0.Args[2] 31357 if p != x0.Args[0] { 31358 break 31359 } 31360 if idx != x0.Args[1] { 31361 break 31362 } 31363 if mem != x0.Args[2] { 31364 break 31365 } 31366 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)) { 31367 break 31368 } 31369 b = mergePoint(b, x0, x1) 31370 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31371 v.reset(OpCopy) 31372 v.AddArg(v0) 31373 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31374 v1.AuxInt = j1 31375 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31376 v2.AuxInt = i0 31377 v2.Aux = s 31378 v2.AddArg(p) 31379 v2.AddArg(idx) 31380 v2.AddArg(mem) 31381 v1.AddArg(v2) 31382 v0.AddArg(v1) 31383 v0.AddArg(y) 31384 return true 31385 } 31386 // 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))) 31387 // 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) 31388 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31389 for { 31390 _ = v.Args[1] 31391 or := v.Args[0] 31392 if or.Op != OpS390XORW { 31393 break 31394 } 31395 _ = or.Args[1] 31396 y := or.Args[0] 31397 s1 := or.Args[1] 31398 if s1.Op != OpS390XSLWconst { 31399 break 31400 } 31401 j1 := s1.AuxInt 31402 x1 := s1.Args[0] 31403 if x1.Op != OpS390XMOVBZloadidx { 31404 break 31405 } 31406 i1 := x1.AuxInt 31407 s := x1.Aux 31408 _ = x1.Args[2] 31409 idx := x1.Args[0] 31410 p := x1.Args[1] 31411 mem := x1.Args[2] 31412 s0 := v.Args[1] 31413 if s0.Op != OpS390XSLWconst { 31414 break 31415 } 31416 j0 := s0.AuxInt 31417 x0 := s0.Args[0] 31418 if x0.Op != OpS390XMOVBZloadidx { 31419 break 31420 } 31421 i0 := x0.AuxInt 31422 if x0.Aux != s { 31423 break 31424 } 31425 _ = x0.Args[2] 31426 if p != x0.Args[0] { 31427 break 31428 } 31429 if idx != x0.Args[1] { 31430 break 31431 } 31432 if mem != x0.Args[2] { 31433 break 31434 } 31435 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)) { 31436 break 31437 } 31438 b = mergePoint(b, x0, x1) 31439 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31440 v.reset(OpCopy) 31441 v.AddArg(v0) 31442 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31443 v1.AuxInt = j1 31444 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31445 v2.AuxInt = i0 31446 v2.Aux = s 31447 v2.AddArg(p) 31448 v2.AddArg(idx) 31449 v2.AddArg(mem) 31450 v1.AddArg(v2) 31451 v0.AddArg(v1) 31452 v0.AddArg(y) 31453 return true 31454 } 31455 // 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))) 31456 // 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) 31457 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31458 for { 31459 _ = v.Args[1] 31460 or := v.Args[0] 31461 if or.Op != OpS390XORW { 31462 break 31463 } 31464 _ = or.Args[1] 31465 s1 := or.Args[0] 31466 if s1.Op != OpS390XSLWconst { 31467 break 31468 } 31469 j1 := s1.AuxInt 31470 x1 := s1.Args[0] 31471 if x1.Op != OpS390XMOVBZloadidx { 31472 break 31473 } 31474 i1 := x1.AuxInt 31475 s := x1.Aux 31476 _ = x1.Args[2] 31477 p := x1.Args[0] 31478 idx := x1.Args[1] 31479 mem := x1.Args[2] 31480 y := or.Args[1] 31481 s0 := v.Args[1] 31482 if s0.Op != OpS390XSLWconst { 31483 break 31484 } 31485 j0 := s0.AuxInt 31486 x0 := s0.Args[0] 31487 if x0.Op != OpS390XMOVBZloadidx { 31488 break 31489 } 31490 i0 := x0.AuxInt 31491 if x0.Aux != s { 31492 break 31493 } 31494 _ = x0.Args[2] 31495 if idx != x0.Args[0] { 31496 break 31497 } 31498 if p != x0.Args[1] { 31499 break 31500 } 31501 if mem != x0.Args[2] { 31502 break 31503 } 31504 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)) { 31505 break 31506 } 31507 b = mergePoint(b, x0, x1) 31508 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31509 v.reset(OpCopy) 31510 v.AddArg(v0) 31511 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31512 v1.AuxInt = j1 31513 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31514 v2.AuxInt = i0 31515 v2.Aux = s 31516 v2.AddArg(p) 31517 v2.AddArg(idx) 31518 v2.AddArg(mem) 31519 v1.AddArg(v2) 31520 v0.AddArg(v1) 31521 v0.AddArg(y) 31522 return true 31523 } 31524 return false 31525 } 31526 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 31527 b := v.Block 31528 _ = b 31529 typ := &b.Func.Config.Types 31530 _ = typ 31531 // 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))) 31532 // 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) 31533 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31534 for { 31535 _ = v.Args[1] 31536 or := v.Args[0] 31537 if or.Op != OpS390XORW { 31538 break 31539 } 31540 _ = or.Args[1] 31541 s1 := or.Args[0] 31542 if s1.Op != OpS390XSLWconst { 31543 break 31544 } 31545 j1 := s1.AuxInt 31546 x1 := s1.Args[0] 31547 if x1.Op != OpS390XMOVBZloadidx { 31548 break 31549 } 31550 i1 := x1.AuxInt 31551 s := x1.Aux 31552 _ = x1.Args[2] 31553 idx := x1.Args[0] 31554 p := x1.Args[1] 31555 mem := x1.Args[2] 31556 y := or.Args[1] 31557 s0 := v.Args[1] 31558 if s0.Op != OpS390XSLWconst { 31559 break 31560 } 31561 j0 := s0.AuxInt 31562 x0 := s0.Args[0] 31563 if x0.Op != OpS390XMOVBZloadidx { 31564 break 31565 } 31566 i0 := x0.AuxInt 31567 if x0.Aux != s { 31568 break 31569 } 31570 _ = x0.Args[2] 31571 if idx != x0.Args[0] { 31572 break 31573 } 31574 if p != x0.Args[1] { 31575 break 31576 } 31577 if mem != x0.Args[2] { 31578 break 31579 } 31580 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)) { 31581 break 31582 } 31583 b = mergePoint(b, x0, x1) 31584 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31585 v.reset(OpCopy) 31586 v.AddArg(v0) 31587 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31588 v1.AuxInt = j1 31589 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31590 v2.AuxInt = i0 31591 v2.Aux = s 31592 v2.AddArg(p) 31593 v2.AddArg(idx) 31594 v2.AddArg(mem) 31595 v1.AddArg(v2) 31596 v0.AddArg(v1) 31597 v0.AddArg(y) 31598 return true 31599 } 31600 // 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))) 31601 // 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) 31602 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31603 for { 31604 _ = v.Args[1] 31605 or := v.Args[0] 31606 if or.Op != OpS390XORW { 31607 break 31608 } 31609 _ = or.Args[1] 31610 y := or.Args[0] 31611 s1 := or.Args[1] 31612 if s1.Op != OpS390XSLWconst { 31613 break 31614 } 31615 j1 := s1.AuxInt 31616 x1 := s1.Args[0] 31617 if x1.Op != OpS390XMOVBZloadidx { 31618 break 31619 } 31620 i1 := x1.AuxInt 31621 s := x1.Aux 31622 _ = x1.Args[2] 31623 p := x1.Args[0] 31624 idx := x1.Args[1] 31625 mem := x1.Args[2] 31626 s0 := v.Args[1] 31627 if s0.Op != OpS390XSLWconst { 31628 break 31629 } 31630 j0 := s0.AuxInt 31631 x0 := s0.Args[0] 31632 if x0.Op != OpS390XMOVBZloadidx { 31633 break 31634 } 31635 i0 := x0.AuxInt 31636 if x0.Aux != s { 31637 break 31638 } 31639 _ = x0.Args[2] 31640 if idx != x0.Args[0] { 31641 break 31642 } 31643 if p != x0.Args[1] { 31644 break 31645 } 31646 if mem != x0.Args[2] { 31647 break 31648 } 31649 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)) { 31650 break 31651 } 31652 b = mergePoint(b, x0, x1) 31653 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31654 v.reset(OpCopy) 31655 v.AddArg(v0) 31656 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31657 v1.AuxInt = j1 31658 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31659 v2.AuxInt = i0 31660 v2.Aux = s 31661 v2.AddArg(p) 31662 v2.AddArg(idx) 31663 v2.AddArg(mem) 31664 v1.AddArg(v2) 31665 v0.AddArg(v1) 31666 v0.AddArg(y) 31667 return true 31668 } 31669 // 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))) 31670 // 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) 31671 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 31672 for { 31673 _ = v.Args[1] 31674 or := v.Args[0] 31675 if or.Op != OpS390XORW { 31676 break 31677 } 31678 _ = or.Args[1] 31679 y := or.Args[0] 31680 s1 := or.Args[1] 31681 if s1.Op != OpS390XSLWconst { 31682 break 31683 } 31684 j1 := s1.AuxInt 31685 x1 := s1.Args[0] 31686 if x1.Op != OpS390XMOVBZloadidx { 31687 break 31688 } 31689 i1 := x1.AuxInt 31690 s := x1.Aux 31691 _ = x1.Args[2] 31692 idx := x1.Args[0] 31693 p := x1.Args[1] 31694 mem := x1.Args[2] 31695 s0 := v.Args[1] 31696 if s0.Op != OpS390XSLWconst { 31697 break 31698 } 31699 j0 := s0.AuxInt 31700 x0 := s0.Args[0] 31701 if x0.Op != OpS390XMOVBZloadidx { 31702 break 31703 } 31704 i0 := x0.AuxInt 31705 if x0.Aux != s { 31706 break 31707 } 31708 _ = x0.Args[2] 31709 if idx != x0.Args[0] { 31710 break 31711 } 31712 if p != x0.Args[1] { 31713 break 31714 } 31715 if mem != x0.Args[2] { 31716 break 31717 } 31718 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)) { 31719 break 31720 } 31721 b = mergePoint(b, x0, x1) 31722 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31723 v.reset(OpCopy) 31724 v.AddArg(v0) 31725 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31726 v1.AuxInt = j1 31727 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) 31728 v2.AuxInt = i0 31729 v2.Aux = s 31730 v2.AddArg(p) 31731 v2.AddArg(idx) 31732 v2.AddArg(mem) 31733 v1.AddArg(v2) 31734 v0.AddArg(v1) 31735 v0.AddArg(y) 31736 return true 31737 } 31738 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 31739 // 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) 31740 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31741 for { 31742 _ = v.Args[1] 31743 x0 := v.Args[0] 31744 if x0.Op != OpS390XMOVBZload { 31745 break 31746 } 31747 i0 := x0.AuxInt 31748 s := x0.Aux 31749 _ = x0.Args[1] 31750 p := x0.Args[0] 31751 mem := x0.Args[1] 31752 sh := v.Args[1] 31753 if sh.Op != OpS390XSLWconst { 31754 break 31755 } 31756 if sh.AuxInt != 8 { 31757 break 31758 } 31759 x1 := sh.Args[0] 31760 if x1.Op != OpS390XMOVBZload { 31761 break 31762 } 31763 i1 := x1.AuxInt 31764 if x1.Aux != s { 31765 break 31766 } 31767 _ = x1.Args[1] 31768 if p != x1.Args[0] { 31769 break 31770 } 31771 if mem != x1.Args[1] { 31772 break 31773 } 31774 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)) { 31775 break 31776 } 31777 b = mergePoint(b, x0, x1) 31778 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31779 v.reset(OpCopy) 31780 v.AddArg(v0) 31781 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31782 v1.AuxInt = i0 31783 v1.Aux = s 31784 v1.AddArg(p) 31785 v1.AddArg(mem) 31786 v0.AddArg(v1) 31787 return true 31788 } 31789 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 31790 // 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) 31791 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 31792 for { 31793 _ = v.Args[1] 31794 sh := v.Args[0] 31795 if sh.Op != OpS390XSLWconst { 31796 break 31797 } 31798 if sh.AuxInt != 8 { 31799 break 31800 } 31801 x1 := sh.Args[0] 31802 if x1.Op != OpS390XMOVBZload { 31803 break 31804 } 31805 i1 := x1.AuxInt 31806 s := x1.Aux 31807 _ = x1.Args[1] 31808 p := x1.Args[0] 31809 mem := x1.Args[1] 31810 x0 := v.Args[1] 31811 if x0.Op != OpS390XMOVBZload { 31812 break 31813 } 31814 i0 := x0.AuxInt 31815 if x0.Aux != s { 31816 break 31817 } 31818 _ = x0.Args[1] 31819 if p != x0.Args[0] { 31820 break 31821 } 31822 if mem != x0.Args[1] { 31823 break 31824 } 31825 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)) { 31826 break 31827 } 31828 b = mergePoint(b, x0, x1) 31829 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 31830 v.reset(OpCopy) 31831 v.AddArg(v0) 31832 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 31833 v1.AuxInt = i0 31834 v1.Aux = s 31835 v1.AddArg(p) 31836 v1.AddArg(mem) 31837 v0.AddArg(v1) 31838 return true 31839 } 31840 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 31841 // 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) 31842 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31843 for { 31844 _ = v.Args[1] 31845 r0 := v.Args[0] 31846 if r0.Op != OpS390XMOVHZreg { 31847 break 31848 } 31849 x0 := r0.Args[0] 31850 if x0.Op != OpS390XMOVHBRload { 31851 break 31852 } 31853 i0 := x0.AuxInt 31854 s := x0.Aux 31855 _ = x0.Args[1] 31856 p := x0.Args[0] 31857 mem := x0.Args[1] 31858 sh := v.Args[1] 31859 if sh.Op != OpS390XSLWconst { 31860 break 31861 } 31862 if sh.AuxInt != 16 { 31863 break 31864 } 31865 r1 := sh.Args[0] 31866 if r1.Op != OpS390XMOVHZreg { 31867 break 31868 } 31869 x1 := r1.Args[0] 31870 if x1.Op != OpS390XMOVHBRload { 31871 break 31872 } 31873 i1 := x1.AuxInt 31874 if x1.Aux != s { 31875 break 31876 } 31877 _ = x1.Args[1] 31878 if p != x1.Args[0] { 31879 break 31880 } 31881 if mem != x1.Args[1] { 31882 break 31883 } 31884 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)) { 31885 break 31886 } 31887 b = mergePoint(b, x0, x1) 31888 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 31889 v.reset(OpCopy) 31890 v.AddArg(v0) 31891 v0.AuxInt = i0 31892 v0.Aux = s 31893 v0.AddArg(p) 31894 v0.AddArg(mem) 31895 return true 31896 } 31897 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 31898 // 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) 31899 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 31900 for { 31901 _ = v.Args[1] 31902 sh := v.Args[0] 31903 if sh.Op != OpS390XSLWconst { 31904 break 31905 } 31906 if sh.AuxInt != 16 { 31907 break 31908 } 31909 r1 := sh.Args[0] 31910 if r1.Op != OpS390XMOVHZreg { 31911 break 31912 } 31913 x1 := r1.Args[0] 31914 if x1.Op != OpS390XMOVHBRload { 31915 break 31916 } 31917 i1 := x1.AuxInt 31918 s := x1.Aux 31919 _ = x1.Args[1] 31920 p := x1.Args[0] 31921 mem := x1.Args[1] 31922 r0 := v.Args[1] 31923 if r0.Op != OpS390XMOVHZreg { 31924 break 31925 } 31926 x0 := r0.Args[0] 31927 if x0.Op != OpS390XMOVHBRload { 31928 break 31929 } 31930 i0 := x0.AuxInt 31931 if x0.Aux != s { 31932 break 31933 } 31934 _ = x0.Args[1] 31935 if p != x0.Args[0] { 31936 break 31937 } 31938 if mem != x0.Args[1] { 31939 break 31940 } 31941 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)) { 31942 break 31943 } 31944 b = mergePoint(b, x0, x1) 31945 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, typ.UInt32) 31946 v.reset(OpCopy) 31947 v.AddArg(v0) 31948 v0.AuxInt = i0 31949 v0.Aux = s 31950 v0.AddArg(p) 31951 v0.AddArg(mem) 31952 return true 31953 } 31954 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 31955 // 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) 31956 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 31957 for { 31958 _ = v.Args[1] 31959 s1 := v.Args[0] 31960 if s1.Op != OpS390XSLWconst { 31961 break 31962 } 31963 j1 := s1.AuxInt 31964 x1 := s1.Args[0] 31965 if x1.Op != OpS390XMOVBZload { 31966 break 31967 } 31968 i1 := x1.AuxInt 31969 s := x1.Aux 31970 _ = x1.Args[1] 31971 p := x1.Args[0] 31972 mem := x1.Args[1] 31973 or := v.Args[1] 31974 if or.Op != OpS390XORW { 31975 break 31976 } 31977 _ = or.Args[1] 31978 s0 := or.Args[0] 31979 if s0.Op != OpS390XSLWconst { 31980 break 31981 } 31982 j0 := s0.AuxInt 31983 x0 := s0.Args[0] 31984 if x0.Op != OpS390XMOVBZload { 31985 break 31986 } 31987 i0 := x0.AuxInt 31988 if x0.Aux != s { 31989 break 31990 } 31991 _ = x0.Args[1] 31992 if p != x0.Args[0] { 31993 break 31994 } 31995 if mem != x0.Args[1] { 31996 break 31997 } 31998 y := or.Args[1] 31999 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)) { 32000 break 32001 } 32002 b = mergePoint(b, x0, x1) 32003 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32004 v.reset(OpCopy) 32005 v.AddArg(v0) 32006 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32007 v1.AuxInt = j0 32008 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32009 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32010 v3.AuxInt = i0 32011 v3.Aux = s 32012 v3.AddArg(p) 32013 v3.AddArg(mem) 32014 v2.AddArg(v3) 32015 v1.AddArg(v2) 32016 v0.AddArg(v1) 32017 v0.AddArg(y) 32018 return true 32019 } 32020 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 32021 // 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) 32022 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32023 for { 32024 _ = v.Args[1] 32025 s1 := v.Args[0] 32026 if s1.Op != OpS390XSLWconst { 32027 break 32028 } 32029 j1 := s1.AuxInt 32030 x1 := s1.Args[0] 32031 if x1.Op != OpS390XMOVBZload { 32032 break 32033 } 32034 i1 := x1.AuxInt 32035 s := x1.Aux 32036 _ = x1.Args[1] 32037 p := x1.Args[0] 32038 mem := x1.Args[1] 32039 or := v.Args[1] 32040 if or.Op != OpS390XORW { 32041 break 32042 } 32043 _ = or.Args[1] 32044 y := or.Args[0] 32045 s0 := or.Args[1] 32046 if s0.Op != OpS390XSLWconst { 32047 break 32048 } 32049 j0 := s0.AuxInt 32050 x0 := s0.Args[0] 32051 if x0.Op != OpS390XMOVBZload { 32052 break 32053 } 32054 i0 := x0.AuxInt 32055 if x0.Aux != s { 32056 break 32057 } 32058 _ = x0.Args[1] 32059 if p != x0.Args[0] { 32060 break 32061 } 32062 if mem != x0.Args[1] { 32063 break 32064 } 32065 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)) { 32066 break 32067 } 32068 b = mergePoint(b, x0, x1) 32069 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32070 v.reset(OpCopy) 32071 v.AddArg(v0) 32072 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32073 v1.AuxInt = j0 32074 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32075 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32076 v3.AuxInt = i0 32077 v3.Aux = s 32078 v3.AddArg(p) 32079 v3.AddArg(mem) 32080 v2.AddArg(v3) 32081 v1.AddArg(v2) 32082 v0.AddArg(v1) 32083 v0.AddArg(y) 32084 return true 32085 } 32086 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32087 // 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) 32088 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32089 for { 32090 _ = v.Args[1] 32091 or := v.Args[0] 32092 if or.Op != OpS390XORW { 32093 break 32094 } 32095 _ = or.Args[1] 32096 s0 := or.Args[0] 32097 if s0.Op != OpS390XSLWconst { 32098 break 32099 } 32100 j0 := s0.AuxInt 32101 x0 := s0.Args[0] 32102 if x0.Op != OpS390XMOVBZload { 32103 break 32104 } 32105 i0 := x0.AuxInt 32106 s := x0.Aux 32107 _ = x0.Args[1] 32108 p := x0.Args[0] 32109 mem := x0.Args[1] 32110 y := or.Args[1] 32111 s1 := v.Args[1] 32112 if s1.Op != OpS390XSLWconst { 32113 break 32114 } 32115 j1 := s1.AuxInt 32116 x1 := s1.Args[0] 32117 if x1.Op != OpS390XMOVBZload { 32118 break 32119 } 32120 i1 := x1.AuxInt 32121 if x1.Aux != s { 32122 break 32123 } 32124 _ = x1.Args[1] 32125 if p != x1.Args[0] { 32126 break 32127 } 32128 if mem != x1.Args[1] { 32129 break 32130 } 32131 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)) { 32132 break 32133 } 32134 b = mergePoint(b, x0, x1) 32135 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32136 v.reset(OpCopy) 32137 v.AddArg(v0) 32138 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32139 v1.AuxInt = j0 32140 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32141 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32142 v3.AuxInt = i0 32143 v3.Aux = s 32144 v3.AddArg(p) 32145 v3.AddArg(mem) 32146 v2.AddArg(v3) 32147 v1.AddArg(v2) 32148 v0.AddArg(v1) 32149 v0.AddArg(y) 32150 return true 32151 } 32152 return false 32153 } 32154 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 32155 b := v.Block 32156 _ = b 32157 typ := &b.Func.Config.Types 32158 _ = typ 32159 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 32160 // 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) 32161 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 32162 for { 32163 _ = v.Args[1] 32164 or := v.Args[0] 32165 if or.Op != OpS390XORW { 32166 break 32167 } 32168 _ = or.Args[1] 32169 y := or.Args[0] 32170 s0 := or.Args[1] 32171 if s0.Op != OpS390XSLWconst { 32172 break 32173 } 32174 j0 := s0.AuxInt 32175 x0 := s0.Args[0] 32176 if x0.Op != OpS390XMOVBZload { 32177 break 32178 } 32179 i0 := x0.AuxInt 32180 s := x0.Aux 32181 _ = x0.Args[1] 32182 p := x0.Args[0] 32183 mem := x0.Args[1] 32184 s1 := v.Args[1] 32185 if s1.Op != OpS390XSLWconst { 32186 break 32187 } 32188 j1 := s1.AuxInt 32189 x1 := s1.Args[0] 32190 if x1.Op != OpS390XMOVBZload { 32191 break 32192 } 32193 i1 := x1.AuxInt 32194 if x1.Aux != s { 32195 break 32196 } 32197 _ = x1.Args[1] 32198 if p != x1.Args[0] { 32199 break 32200 } 32201 if mem != x1.Args[1] { 32202 break 32203 } 32204 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)) { 32205 break 32206 } 32207 b = mergePoint(b, x0, x1) 32208 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32209 v.reset(OpCopy) 32210 v.AddArg(v0) 32211 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32212 v1.AuxInt = j0 32213 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32214 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, typ.UInt16) 32215 v3.AuxInt = i0 32216 v3.Aux = s 32217 v3.AddArg(p) 32218 v3.AddArg(mem) 32219 v2.AddArg(v3) 32220 v1.AddArg(v2) 32221 v0.AddArg(v1) 32222 v0.AddArg(y) 32223 return true 32224 } 32225 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32226 // 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) 32227 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32228 for { 32229 _ = v.Args[1] 32230 x0 := v.Args[0] 32231 if x0.Op != OpS390XMOVBZloadidx { 32232 break 32233 } 32234 i0 := x0.AuxInt 32235 s := x0.Aux 32236 _ = x0.Args[2] 32237 p := x0.Args[0] 32238 idx := x0.Args[1] 32239 mem := x0.Args[2] 32240 sh := v.Args[1] 32241 if sh.Op != OpS390XSLWconst { 32242 break 32243 } 32244 if sh.AuxInt != 8 { 32245 break 32246 } 32247 x1 := sh.Args[0] 32248 if x1.Op != OpS390XMOVBZloadidx { 32249 break 32250 } 32251 i1 := x1.AuxInt 32252 if x1.Aux != s { 32253 break 32254 } 32255 _ = x1.Args[2] 32256 if p != x1.Args[0] { 32257 break 32258 } 32259 if idx != x1.Args[1] { 32260 break 32261 } 32262 if mem != x1.Args[2] { 32263 break 32264 } 32265 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)) { 32266 break 32267 } 32268 b = mergePoint(b, x0, x1) 32269 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32270 v.reset(OpCopy) 32271 v.AddArg(v0) 32272 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32273 v1.AuxInt = i0 32274 v1.Aux = s 32275 v1.AddArg(p) 32276 v1.AddArg(idx) 32277 v1.AddArg(mem) 32278 v0.AddArg(v1) 32279 return true 32280 } 32281 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32282 // 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) 32283 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32284 for { 32285 _ = v.Args[1] 32286 x0 := v.Args[0] 32287 if x0.Op != OpS390XMOVBZloadidx { 32288 break 32289 } 32290 i0 := x0.AuxInt 32291 s := x0.Aux 32292 _ = x0.Args[2] 32293 idx := x0.Args[0] 32294 p := x0.Args[1] 32295 mem := x0.Args[2] 32296 sh := v.Args[1] 32297 if sh.Op != OpS390XSLWconst { 32298 break 32299 } 32300 if sh.AuxInt != 8 { 32301 break 32302 } 32303 x1 := sh.Args[0] 32304 if x1.Op != OpS390XMOVBZloadidx { 32305 break 32306 } 32307 i1 := x1.AuxInt 32308 if x1.Aux != s { 32309 break 32310 } 32311 _ = x1.Args[2] 32312 if p != x1.Args[0] { 32313 break 32314 } 32315 if idx != x1.Args[1] { 32316 break 32317 } 32318 if mem != x1.Args[2] { 32319 break 32320 } 32321 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)) { 32322 break 32323 } 32324 b = mergePoint(b, x0, x1) 32325 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32326 v.reset(OpCopy) 32327 v.AddArg(v0) 32328 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32329 v1.AuxInt = i0 32330 v1.Aux = s 32331 v1.AddArg(p) 32332 v1.AddArg(idx) 32333 v1.AddArg(mem) 32334 v0.AddArg(v1) 32335 return true 32336 } 32337 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32338 // 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) 32339 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32340 for { 32341 _ = v.Args[1] 32342 x0 := v.Args[0] 32343 if x0.Op != OpS390XMOVBZloadidx { 32344 break 32345 } 32346 i0 := x0.AuxInt 32347 s := x0.Aux 32348 _ = x0.Args[2] 32349 p := x0.Args[0] 32350 idx := x0.Args[1] 32351 mem := x0.Args[2] 32352 sh := v.Args[1] 32353 if sh.Op != OpS390XSLWconst { 32354 break 32355 } 32356 if sh.AuxInt != 8 { 32357 break 32358 } 32359 x1 := sh.Args[0] 32360 if x1.Op != OpS390XMOVBZloadidx { 32361 break 32362 } 32363 i1 := x1.AuxInt 32364 if x1.Aux != s { 32365 break 32366 } 32367 _ = x1.Args[2] 32368 if idx != x1.Args[0] { 32369 break 32370 } 32371 if p != x1.Args[1] { 32372 break 32373 } 32374 if mem != x1.Args[2] { 32375 break 32376 } 32377 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)) { 32378 break 32379 } 32380 b = mergePoint(b, x0, x1) 32381 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32382 v.reset(OpCopy) 32383 v.AddArg(v0) 32384 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32385 v1.AuxInt = i0 32386 v1.Aux = s 32387 v1.AddArg(p) 32388 v1.AddArg(idx) 32389 v1.AddArg(mem) 32390 v0.AddArg(v1) 32391 return true 32392 } 32393 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32394 // 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) 32395 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32396 for { 32397 _ = v.Args[1] 32398 x0 := v.Args[0] 32399 if x0.Op != OpS390XMOVBZloadidx { 32400 break 32401 } 32402 i0 := x0.AuxInt 32403 s := x0.Aux 32404 _ = x0.Args[2] 32405 idx := x0.Args[0] 32406 p := x0.Args[1] 32407 mem := x0.Args[2] 32408 sh := v.Args[1] 32409 if sh.Op != OpS390XSLWconst { 32410 break 32411 } 32412 if sh.AuxInt != 8 { 32413 break 32414 } 32415 x1 := sh.Args[0] 32416 if x1.Op != OpS390XMOVBZloadidx { 32417 break 32418 } 32419 i1 := x1.AuxInt 32420 if x1.Aux != s { 32421 break 32422 } 32423 _ = x1.Args[2] 32424 if idx != x1.Args[0] { 32425 break 32426 } 32427 if p != x1.Args[1] { 32428 break 32429 } 32430 if mem != x1.Args[2] { 32431 break 32432 } 32433 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)) { 32434 break 32435 } 32436 b = mergePoint(b, x0, x1) 32437 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32438 v.reset(OpCopy) 32439 v.AddArg(v0) 32440 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32441 v1.AuxInt = i0 32442 v1.Aux = s 32443 v1.AddArg(p) 32444 v1.AddArg(idx) 32445 v1.AddArg(mem) 32446 v0.AddArg(v1) 32447 return true 32448 } 32449 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32450 // 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) 32451 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32452 for { 32453 _ = v.Args[1] 32454 sh := v.Args[0] 32455 if sh.Op != OpS390XSLWconst { 32456 break 32457 } 32458 if sh.AuxInt != 8 { 32459 break 32460 } 32461 x1 := sh.Args[0] 32462 if x1.Op != OpS390XMOVBZloadidx { 32463 break 32464 } 32465 i1 := x1.AuxInt 32466 s := x1.Aux 32467 _ = x1.Args[2] 32468 p := x1.Args[0] 32469 idx := x1.Args[1] 32470 mem := x1.Args[2] 32471 x0 := v.Args[1] 32472 if x0.Op != OpS390XMOVBZloadidx { 32473 break 32474 } 32475 i0 := x0.AuxInt 32476 if x0.Aux != s { 32477 break 32478 } 32479 _ = x0.Args[2] 32480 if p != x0.Args[0] { 32481 break 32482 } 32483 if idx != x0.Args[1] { 32484 break 32485 } 32486 if mem != x0.Args[2] { 32487 break 32488 } 32489 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)) { 32490 break 32491 } 32492 b = mergePoint(b, x0, x1) 32493 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32494 v.reset(OpCopy) 32495 v.AddArg(v0) 32496 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32497 v1.AuxInt = i0 32498 v1.Aux = s 32499 v1.AddArg(p) 32500 v1.AddArg(idx) 32501 v1.AddArg(mem) 32502 v0.AddArg(v1) 32503 return true 32504 } 32505 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 32506 // 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) 32507 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32508 for { 32509 _ = v.Args[1] 32510 sh := v.Args[0] 32511 if sh.Op != OpS390XSLWconst { 32512 break 32513 } 32514 if sh.AuxInt != 8 { 32515 break 32516 } 32517 x1 := sh.Args[0] 32518 if x1.Op != OpS390XMOVBZloadidx { 32519 break 32520 } 32521 i1 := x1.AuxInt 32522 s := x1.Aux 32523 _ = x1.Args[2] 32524 idx := x1.Args[0] 32525 p := x1.Args[1] 32526 mem := x1.Args[2] 32527 x0 := v.Args[1] 32528 if x0.Op != OpS390XMOVBZloadidx { 32529 break 32530 } 32531 i0 := x0.AuxInt 32532 if x0.Aux != s { 32533 break 32534 } 32535 _ = x0.Args[2] 32536 if p != x0.Args[0] { 32537 break 32538 } 32539 if idx != x0.Args[1] { 32540 break 32541 } 32542 if mem != x0.Args[2] { 32543 break 32544 } 32545 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)) { 32546 break 32547 } 32548 b = mergePoint(b, x0, x1) 32549 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32550 v.reset(OpCopy) 32551 v.AddArg(v0) 32552 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32553 v1.AuxInt = i0 32554 v1.Aux = s 32555 v1.AddArg(p) 32556 v1.AddArg(idx) 32557 v1.AddArg(mem) 32558 v0.AddArg(v1) 32559 return true 32560 } 32561 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32562 // 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) 32563 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32564 for { 32565 _ = v.Args[1] 32566 sh := v.Args[0] 32567 if sh.Op != OpS390XSLWconst { 32568 break 32569 } 32570 if sh.AuxInt != 8 { 32571 break 32572 } 32573 x1 := sh.Args[0] 32574 if x1.Op != OpS390XMOVBZloadidx { 32575 break 32576 } 32577 i1 := x1.AuxInt 32578 s := x1.Aux 32579 _ = x1.Args[2] 32580 p := x1.Args[0] 32581 idx := x1.Args[1] 32582 mem := x1.Args[2] 32583 x0 := v.Args[1] 32584 if x0.Op != OpS390XMOVBZloadidx { 32585 break 32586 } 32587 i0 := x0.AuxInt 32588 if x0.Aux != s { 32589 break 32590 } 32591 _ = x0.Args[2] 32592 if idx != x0.Args[0] { 32593 break 32594 } 32595 if p != x0.Args[1] { 32596 break 32597 } 32598 if mem != x0.Args[2] { 32599 break 32600 } 32601 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)) { 32602 break 32603 } 32604 b = mergePoint(b, x0, x1) 32605 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32606 v.reset(OpCopy) 32607 v.AddArg(v0) 32608 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32609 v1.AuxInt = i0 32610 v1.Aux = s 32611 v1.AddArg(p) 32612 v1.AddArg(idx) 32613 v1.AddArg(mem) 32614 v0.AddArg(v1) 32615 return true 32616 } 32617 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 32618 // 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) 32619 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 32620 for { 32621 _ = v.Args[1] 32622 sh := v.Args[0] 32623 if sh.Op != OpS390XSLWconst { 32624 break 32625 } 32626 if sh.AuxInt != 8 { 32627 break 32628 } 32629 x1 := sh.Args[0] 32630 if x1.Op != OpS390XMOVBZloadidx { 32631 break 32632 } 32633 i1 := x1.AuxInt 32634 s := x1.Aux 32635 _ = x1.Args[2] 32636 idx := x1.Args[0] 32637 p := x1.Args[1] 32638 mem := x1.Args[2] 32639 x0 := v.Args[1] 32640 if x0.Op != OpS390XMOVBZloadidx { 32641 break 32642 } 32643 i0 := x0.AuxInt 32644 if x0.Aux != s { 32645 break 32646 } 32647 _ = x0.Args[2] 32648 if idx != x0.Args[0] { 32649 break 32650 } 32651 if p != x0.Args[1] { 32652 break 32653 } 32654 if mem != x0.Args[2] { 32655 break 32656 } 32657 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)) { 32658 break 32659 } 32660 b = mergePoint(b, x0, x1) 32661 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 32662 v.reset(OpCopy) 32663 v.AddArg(v0) 32664 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 32665 v1.AuxInt = i0 32666 v1.Aux = s 32667 v1.AddArg(p) 32668 v1.AddArg(idx) 32669 v1.AddArg(mem) 32670 v0.AddArg(v1) 32671 return true 32672 } 32673 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32674 // 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) 32675 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32676 for { 32677 _ = v.Args[1] 32678 r0 := v.Args[0] 32679 if r0.Op != OpS390XMOVHZreg { 32680 break 32681 } 32682 x0 := r0.Args[0] 32683 if x0.Op != OpS390XMOVHBRloadidx { 32684 break 32685 } 32686 i0 := x0.AuxInt 32687 s := x0.Aux 32688 _ = x0.Args[2] 32689 p := x0.Args[0] 32690 idx := x0.Args[1] 32691 mem := x0.Args[2] 32692 sh := v.Args[1] 32693 if sh.Op != OpS390XSLWconst { 32694 break 32695 } 32696 if sh.AuxInt != 16 { 32697 break 32698 } 32699 r1 := sh.Args[0] 32700 if r1.Op != OpS390XMOVHZreg { 32701 break 32702 } 32703 x1 := r1.Args[0] 32704 if x1.Op != OpS390XMOVHBRloadidx { 32705 break 32706 } 32707 i1 := x1.AuxInt 32708 if x1.Aux != s { 32709 break 32710 } 32711 _ = x1.Args[2] 32712 if p != x1.Args[0] { 32713 break 32714 } 32715 if idx != x1.Args[1] { 32716 break 32717 } 32718 if mem != x1.Args[2] { 32719 break 32720 } 32721 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)) { 32722 break 32723 } 32724 b = mergePoint(b, x0, x1) 32725 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32726 v.reset(OpCopy) 32727 v.AddArg(v0) 32728 v0.AuxInt = i0 32729 v0.Aux = s 32730 v0.AddArg(p) 32731 v0.AddArg(idx) 32732 v0.AddArg(mem) 32733 return true 32734 } 32735 return false 32736 } 32737 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 32738 b := v.Block 32739 _ = b 32740 typ := &b.Func.Config.Types 32741 _ = typ 32742 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 32743 // 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) 32744 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32745 for { 32746 _ = v.Args[1] 32747 r0 := v.Args[0] 32748 if r0.Op != OpS390XMOVHZreg { 32749 break 32750 } 32751 x0 := r0.Args[0] 32752 if x0.Op != OpS390XMOVHBRloadidx { 32753 break 32754 } 32755 i0 := x0.AuxInt 32756 s := x0.Aux 32757 _ = x0.Args[2] 32758 idx := x0.Args[0] 32759 p := x0.Args[1] 32760 mem := x0.Args[2] 32761 sh := v.Args[1] 32762 if sh.Op != OpS390XSLWconst { 32763 break 32764 } 32765 if sh.AuxInt != 16 { 32766 break 32767 } 32768 r1 := sh.Args[0] 32769 if r1.Op != OpS390XMOVHZreg { 32770 break 32771 } 32772 x1 := r1.Args[0] 32773 if x1.Op != OpS390XMOVHBRloadidx { 32774 break 32775 } 32776 i1 := x1.AuxInt 32777 if x1.Aux != s { 32778 break 32779 } 32780 _ = x1.Args[2] 32781 if p != x1.Args[0] { 32782 break 32783 } 32784 if idx != x1.Args[1] { 32785 break 32786 } 32787 if mem != x1.Args[2] { 32788 break 32789 } 32790 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)) { 32791 break 32792 } 32793 b = mergePoint(b, x0, x1) 32794 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32795 v.reset(OpCopy) 32796 v.AddArg(v0) 32797 v0.AuxInt = i0 32798 v0.Aux = s 32799 v0.AddArg(p) 32800 v0.AddArg(idx) 32801 v0.AddArg(mem) 32802 return true 32803 } 32804 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32805 // 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) 32806 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32807 for { 32808 _ = v.Args[1] 32809 r0 := v.Args[0] 32810 if r0.Op != OpS390XMOVHZreg { 32811 break 32812 } 32813 x0 := r0.Args[0] 32814 if x0.Op != OpS390XMOVHBRloadidx { 32815 break 32816 } 32817 i0 := x0.AuxInt 32818 s := x0.Aux 32819 _ = x0.Args[2] 32820 p := x0.Args[0] 32821 idx := x0.Args[1] 32822 mem := x0.Args[2] 32823 sh := v.Args[1] 32824 if sh.Op != OpS390XSLWconst { 32825 break 32826 } 32827 if sh.AuxInt != 16 { 32828 break 32829 } 32830 r1 := sh.Args[0] 32831 if r1.Op != OpS390XMOVHZreg { 32832 break 32833 } 32834 x1 := r1.Args[0] 32835 if x1.Op != OpS390XMOVHBRloadidx { 32836 break 32837 } 32838 i1 := x1.AuxInt 32839 if x1.Aux != s { 32840 break 32841 } 32842 _ = x1.Args[2] 32843 if idx != x1.Args[0] { 32844 break 32845 } 32846 if p != x1.Args[1] { 32847 break 32848 } 32849 if mem != x1.Args[2] { 32850 break 32851 } 32852 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)) { 32853 break 32854 } 32855 b = mergePoint(b, x0, x1) 32856 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32857 v.reset(OpCopy) 32858 v.AddArg(v0) 32859 v0.AuxInt = i0 32860 v0.Aux = s 32861 v0.AddArg(p) 32862 v0.AddArg(idx) 32863 v0.AddArg(mem) 32864 return true 32865 } 32866 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 32867 // 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) 32868 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32869 for { 32870 _ = v.Args[1] 32871 r0 := v.Args[0] 32872 if r0.Op != OpS390XMOVHZreg { 32873 break 32874 } 32875 x0 := r0.Args[0] 32876 if x0.Op != OpS390XMOVHBRloadidx { 32877 break 32878 } 32879 i0 := x0.AuxInt 32880 s := x0.Aux 32881 _ = x0.Args[2] 32882 idx := x0.Args[0] 32883 p := x0.Args[1] 32884 mem := x0.Args[2] 32885 sh := v.Args[1] 32886 if sh.Op != OpS390XSLWconst { 32887 break 32888 } 32889 if sh.AuxInt != 16 { 32890 break 32891 } 32892 r1 := sh.Args[0] 32893 if r1.Op != OpS390XMOVHZreg { 32894 break 32895 } 32896 x1 := r1.Args[0] 32897 if x1.Op != OpS390XMOVHBRloadidx { 32898 break 32899 } 32900 i1 := x1.AuxInt 32901 if x1.Aux != s { 32902 break 32903 } 32904 _ = x1.Args[2] 32905 if idx != x1.Args[0] { 32906 break 32907 } 32908 if p != x1.Args[1] { 32909 break 32910 } 32911 if mem != x1.Args[2] { 32912 break 32913 } 32914 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)) { 32915 break 32916 } 32917 b = mergePoint(b, x0, x1) 32918 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32919 v.reset(OpCopy) 32920 v.AddArg(v0) 32921 v0.AuxInt = i0 32922 v0.Aux = s 32923 v0.AddArg(p) 32924 v0.AddArg(idx) 32925 v0.AddArg(mem) 32926 return true 32927 } 32928 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 32929 // 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) 32930 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32931 for { 32932 _ = v.Args[1] 32933 sh := v.Args[0] 32934 if sh.Op != OpS390XSLWconst { 32935 break 32936 } 32937 if sh.AuxInt != 16 { 32938 break 32939 } 32940 r1 := sh.Args[0] 32941 if r1.Op != OpS390XMOVHZreg { 32942 break 32943 } 32944 x1 := r1.Args[0] 32945 if x1.Op != OpS390XMOVHBRloadidx { 32946 break 32947 } 32948 i1 := x1.AuxInt 32949 s := x1.Aux 32950 _ = x1.Args[2] 32951 p := x1.Args[0] 32952 idx := x1.Args[1] 32953 mem := x1.Args[2] 32954 r0 := v.Args[1] 32955 if r0.Op != OpS390XMOVHZreg { 32956 break 32957 } 32958 x0 := r0.Args[0] 32959 if x0.Op != OpS390XMOVHBRloadidx { 32960 break 32961 } 32962 i0 := x0.AuxInt 32963 if x0.Aux != s { 32964 break 32965 } 32966 _ = x0.Args[2] 32967 if p != x0.Args[0] { 32968 break 32969 } 32970 if idx != x0.Args[1] { 32971 break 32972 } 32973 if mem != x0.Args[2] { 32974 break 32975 } 32976 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)) { 32977 break 32978 } 32979 b = mergePoint(b, x0, x1) 32980 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 32981 v.reset(OpCopy) 32982 v.AddArg(v0) 32983 v0.AuxInt = i0 32984 v0.Aux = s 32985 v0.AddArg(p) 32986 v0.AddArg(idx) 32987 v0.AddArg(mem) 32988 return true 32989 } 32990 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 32991 // 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) 32992 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 32993 for { 32994 _ = v.Args[1] 32995 sh := v.Args[0] 32996 if sh.Op != OpS390XSLWconst { 32997 break 32998 } 32999 if sh.AuxInt != 16 { 33000 break 33001 } 33002 r1 := sh.Args[0] 33003 if r1.Op != OpS390XMOVHZreg { 33004 break 33005 } 33006 x1 := r1.Args[0] 33007 if x1.Op != OpS390XMOVHBRloadidx { 33008 break 33009 } 33010 i1 := x1.AuxInt 33011 s := x1.Aux 33012 _ = x1.Args[2] 33013 idx := x1.Args[0] 33014 p := x1.Args[1] 33015 mem := x1.Args[2] 33016 r0 := v.Args[1] 33017 if r0.Op != OpS390XMOVHZreg { 33018 break 33019 } 33020 x0 := r0.Args[0] 33021 if x0.Op != OpS390XMOVHBRloadidx { 33022 break 33023 } 33024 i0 := x0.AuxInt 33025 if x0.Aux != s { 33026 break 33027 } 33028 _ = x0.Args[2] 33029 if p != x0.Args[0] { 33030 break 33031 } 33032 if idx != x0.Args[1] { 33033 break 33034 } 33035 if mem != x0.Args[2] { 33036 break 33037 } 33038 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)) { 33039 break 33040 } 33041 b = mergePoint(b, x0, x1) 33042 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33043 v.reset(OpCopy) 33044 v.AddArg(v0) 33045 v0.AuxInt = i0 33046 v0.Aux = s 33047 v0.AddArg(p) 33048 v0.AddArg(idx) 33049 v0.AddArg(mem) 33050 return true 33051 } 33052 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33053 // 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) 33054 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33055 for { 33056 _ = v.Args[1] 33057 sh := v.Args[0] 33058 if sh.Op != OpS390XSLWconst { 33059 break 33060 } 33061 if sh.AuxInt != 16 { 33062 break 33063 } 33064 r1 := sh.Args[0] 33065 if r1.Op != OpS390XMOVHZreg { 33066 break 33067 } 33068 x1 := r1.Args[0] 33069 if x1.Op != OpS390XMOVHBRloadidx { 33070 break 33071 } 33072 i1 := x1.AuxInt 33073 s := x1.Aux 33074 _ = x1.Args[2] 33075 p := x1.Args[0] 33076 idx := x1.Args[1] 33077 mem := x1.Args[2] 33078 r0 := v.Args[1] 33079 if r0.Op != OpS390XMOVHZreg { 33080 break 33081 } 33082 x0 := r0.Args[0] 33083 if x0.Op != OpS390XMOVHBRloadidx { 33084 break 33085 } 33086 i0 := x0.AuxInt 33087 if x0.Aux != s { 33088 break 33089 } 33090 _ = x0.Args[2] 33091 if idx != x0.Args[0] { 33092 break 33093 } 33094 if p != x0.Args[1] { 33095 break 33096 } 33097 if mem != x0.Args[2] { 33098 break 33099 } 33100 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)) { 33101 break 33102 } 33103 b = mergePoint(b, x0, x1) 33104 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33105 v.reset(OpCopy) 33106 v.AddArg(v0) 33107 v0.AuxInt = i0 33108 v0.Aux = s 33109 v0.AddArg(p) 33110 v0.AddArg(idx) 33111 v0.AddArg(mem) 33112 return true 33113 } 33114 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 33115 // 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) 33116 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 33117 for { 33118 _ = v.Args[1] 33119 sh := v.Args[0] 33120 if sh.Op != OpS390XSLWconst { 33121 break 33122 } 33123 if sh.AuxInt != 16 { 33124 break 33125 } 33126 r1 := sh.Args[0] 33127 if r1.Op != OpS390XMOVHZreg { 33128 break 33129 } 33130 x1 := r1.Args[0] 33131 if x1.Op != OpS390XMOVHBRloadidx { 33132 break 33133 } 33134 i1 := x1.AuxInt 33135 s := x1.Aux 33136 _ = x1.Args[2] 33137 idx := x1.Args[0] 33138 p := x1.Args[1] 33139 mem := x1.Args[2] 33140 r0 := v.Args[1] 33141 if r0.Op != OpS390XMOVHZreg { 33142 break 33143 } 33144 x0 := r0.Args[0] 33145 if x0.Op != OpS390XMOVHBRloadidx { 33146 break 33147 } 33148 i0 := x0.AuxInt 33149 if x0.Aux != s { 33150 break 33151 } 33152 _ = x0.Args[2] 33153 if idx != x0.Args[0] { 33154 break 33155 } 33156 if p != x0.Args[1] { 33157 break 33158 } 33159 if mem != x0.Args[2] { 33160 break 33161 } 33162 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)) { 33163 break 33164 } 33165 b = mergePoint(b, x0, x1) 33166 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) 33167 v.reset(OpCopy) 33168 v.AddArg(v0) 33169 v0.AuxInt = i0 33170 v0.Aux = s 33171 v0.AddArg(p) 33172 v0.AddArg(idx) 33173 v0.AddArg(mem) 33174 return true 33175 } 33176 // 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)) 33177 // 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) 33178 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33179 for { 33180 _ = v.Args[1] 33181 s1 := v.Args[0] 33182 if s1.Op != OpS390XSLWconst { 33183 break 33184 } 33185 j1 := s1.AuxInt 33186 x1 := s1.Args[0] 33187 if x1.Op != OpS390XMOVBZloadidx { 33188 break 33189 } 33190 i1 := x1.AuxInt 33191 s := x1.Aux 33192 _ = x1.Args[2] 33193 p := x1.Args[0] 33194 idx := x1.Args[1] 33195 mem := x1.Args[2] 33196 or := v.Args[1] 33197 if or.Op != OpS390XORW { 33198 break 33199 } 33200 _ = or.Args[1] 33201 s0 := or.Args[0] 33202 if s0.Op != OpS390XSLWconst { 33203 break 33204 } 33205 j0 := s0.AuxInt 33206 x0 := s0.Args[0] 33207 if x0.Op != OpS390XMOVBZloadidx { 33208 break 33209 } 33210 i0 := x0.AuxInt 33211 if x0.Aux != s { 33212 break 33213 } 33214 _ = x0.Args[2] 33215 if p != x0.Args[0] { 33216 break 33217 } 33218 if idx != x0.Args[1] { 33219 break 33220 } 33221 if mem != x0.Args[2] { 33222 break 33223 } 33224 y := or.Args[1] 33225 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)) { 33226 break 33227 } 33228 b = mergePoint(b, x0, x1) 33229 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33230 v.reset(OpCopy) 33231 v.AddArg(v0) 33232 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33233 v1.AuxInt = j0 33234 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33235 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33236 v3.AuxInt = i0 33237 v3.Aux = s 33238 v3.AddArg(p) 33239 v3.AddArg(idx) 33240 v3.AddArg(mem) 33241 v2.AddArg(v3) 33242 v1.AddArg(v2) 33243 v0.AddArg(v1) 33244 v0.AddArg(y) 33245 return true 33246 } 33247 // 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)) 33248 // 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) 33249 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33250 for { 33251 _ = v.Args[1] 33252 s1 := v.Args[0] 33253 if s1.Op != OpS390XSLWconst { 33254 break 33255 } 33256 j1 := s1.AuxInt 33257 x1 := s1.Args[0] 33258 if x1.Op != OpS390XMOVBZloadidx { 33259 break 33260 } 33261 i1 := x1.AuxInt 33262 s := x1.Aux 33263 _ = x1.Args[2] 33264 idx := x1.Args[0] 33265 p := x1.Args[1] 33266 mem := x1.Args[2] 33267 or := v.Args[1] 33268 if or.Op != OpS390XORW { 33269 break 33270 } 33271 _ = or.Args[1] 33272 s0 := or.Args[0] 33273 if s0.Op != OpS390XSLWconst { 33274 break 33275 } 33276 j0 := s0.AuxInt 33277 x0 := s0.Args[0] 33278 if x0.Op != OpS390XMOVBZloadidx { 33279 break 33280 } 33281 i0 := x0.AuxInt 33282 if x0.Aux != s { 33283 break 33284 } 33285 _ = x0.Args[2] 33286 if p != x0.Args[0] { 33287 break 33288 } 33289 if idx != x0.Args[1] { 33290 break 33291 } 33292 if mem != x0.Args[2] { 33293 break 33294 } 33295 y := or.Args[1] 33296 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)) { 33297 break 33298 } 33299 b = mergePoint(b, x0, x1) 33300 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33301 v.reset(OpCopy) 33302 v.AddArg(v0) 33303 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33304 v1.AuxInt = j0 33305 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33306 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33307 v3.AuxInt = i0 33308 v3.Aux = s 33309 v3.AddArg(p) 33310 v3.AddArg(idx) 33311 v3.AddArg(mem) 33312 v2.AddArg(v3) 33313 v1.AddArg(v2) 33314 v0.AddArg(v1) 33315 v0.AddArg(y) 33316 return true 33317 } 33318 // 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)) 33319 // 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) 33320 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33321 for { 33322 _ = v.Args[1] 33323 s1 := v.Args[0] 33324 if s1.Op != OpS390XSLWconst { 33325 break 33326 } 33327 j1 := s1.AuxInt 33328 x1 := s1.Args[0] 33329 if x1.Op != OpS390XMOVBZloadidx { 33330 break 33331 } 33332 i1 := x1.AuxInt 33333 s := x1.Aux 33334 _ = x1.Args[2] 33335 p := x1.Args[0] 33336 idx := x1.Args[1] 33337 mem := x1.Args[2] 33338 or := v.Args[1] 33339 if or.Op != OpS390XORW { 33340 break 33341 } 33342 _ = or.Args[1] 33343 s0 := or.Args[0] 33344 if s0.Op != OpS390XSLWconst { 33345 break 33346 } 33347 j0 := s0.AuxInt 33348 x0 := s0.Args[0] 33349 if x0.Op != OpS390XMOVBZloadidx { 33350 break 33351 } 33352 i0 := x0.AuxInt 33353 if x0.Aux != s { 33354 break 33355 } 33356 _ = x0.Args[2] 33357 if idx != x0.Args[0] { 33358 break 33359 } 33360 if p != x0.Args[1] { 33361 break 33362 } 33363 if mem != x0.Args[2] { 33364 break 33365 } 33366 y := or.Args[1] 33367 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)) { 33368 break 33369 } 33370 b = mergePoint(b, x0, x1) 33371 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33372 v.reset(OpCopy) 33373 v.AddArg(v0) 33374 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33375 v1.AuxInt = j0 33376 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33377 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33378 v3.AuxInt = i0 33379 v3.Aux = s 33380 v3.AddArg(p) 33381 v3.AddArg(idx) 33382 v3.AddArg(mem) 33383 v2.AddArg(v3) 33384 v1.AddArg(v2) 33385 v0.AddArg(v1) 33386 v0.AddArg(y) 33387 return true 33388 } 33389 return false 33390 } 33391 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 33392 b := v.Block 33393 _ = b 33394 typ := &b.Func.Config.Types 33395 _ = typ 33396 // 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)) 33397 // 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) 33398 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33399 for { 33400 _ = v.Args[1] 33401 s1 := v.Args[0] 33402 if s1.Op != OpS390XSLWconst { 33403 break 33404 } 33405 j1 := s1.AuxInt 33406 x1 := s1.Args[0] 33407 if x1.Op != OpS390XMOVBZloadidx { 33408 break 33409 } 33410 i1 := x1.AuxInt 33411 s := x1.Aux 33412 _ = x1.Args[2] 33413 idx := x1.Args[0] 33414 p := x1.Args[1] 33415 mem := x1.Args[2] 33416 or := v.Args[1] 33417 if or.Op != OpS390XORW { 33418 break 33419 } 33420 _ = or.Args[1] 33421 s0 := or.Args[0] 33422 if s0.Op != OpS390XSLWconst { 33423 break 33424 } 33425 j0 := s0.AuxInt 33426 x0 := s0.Args[0] 33427 if x0.Op != OpS390XMOVBZloadidx { 33428 break 33429 } 33430 i0 := x0.AuxInt 33431 if x0.Aux != s { 33432 break 33433 } 33434 _ = x0.Args[2] 33435 if idx != x0.Args[0] { 33436 break 33437 } 33438 if p != x0.Args[1] { 33439 break 33440 } 33441 if mem != x0.Args[2] { 33442 break 33443 } 33444 y := or.Args[1] 33445 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)) { 33446 break 33447 } 33448 b = mergePoint(b, x0, x1) 33449 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33450 v.reset(OpCopy) 33451 v.AddArg(v0) 33452 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33453 v1.AuxInt = j0 33454 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33455 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33456 v3.AuxInt = i0 33457 v3.Aux = s 33458 v3.AddArg(p) 33459 v3.AddArg(idx) 33460 v3.AddArg(mem) 33461 v2.AddArg(v3) 33462 v1.AddArg(v2) 33463 v0.AddArg(v1) 33464 v0.AddArg(y) 33465 return true 33466 } 33467 // 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)))) 33468 // 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) 33469 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33470 for { 33471 _ = v.Args[1] 33472 s1 := v.Args[0] 33473 if s1.Op != OpS390XSLWconst { 33474 break 33475 } 33476 j1 := s1.AuxInt 33477 x1 := s1.Args[0] 33478 if x1.Op != OpS390XMOVBZloadidx { 33479 break 33480 } 33481 i1 := x1.AuxInt 33482 s := x1.Aux 33483 _ = x1.Args[2] 33484 p := x1.Args[0] 33485 idx := x1.Args[1] 33486 mem := x1.Args[2] 33487 or := v.Args[1] 33488 if or.Op != OpS390XORW { 33489 break 33490 } 33491 _ = or.Args[1] 33492 y := or.Args[0] 33493 s0 := or.Args[1] 33494 if s0.Op != OpS390XSLWconst { 33495 break 33496 } 33497 j0 := s0.AuxInt 33498 x0 := s0.Args[0] 33499 if x0.Op != OpS390XMOVBZloadidx { 33500 break 33501 } 33502 i0 := x0.AuxInt 33503 if x0.Aux != s { 33504 break 33505 } 33506 _ = x0.Args[2] 33507 if p != x0.Args[0] { 33508 break 33509 } 33510 if idx != x0.Args[1] { 33511 break 33512 } 33513 if mem != x0.Args[2] { 33514 break 33515 } 33516 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)) { 33517 break 33518 } 33519 b = mergePoint(b, x0, x1) 33520 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33521 v.reset(OpCopy) 33522 v.AddArg(v0) 33523 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33524 v1.AuxInt = j0 33525 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33526 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33527 v3.AuxInt = i0 33528 v3.Aux = s 33529 v3.AddArg(p) 33530 v3.AddArg(idx) 33531 v3.AddArg(mem) 33532 v2.AddArg(v3) 33533 v1.AddArg(v2) 33534 v0.AddArg(v1) 33535 v0.AddArg(y) 33536 return true 33537 } 33538 // 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)))) 33539 // 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) 33540 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33541 for { 33542 _ = v.Args[1] 33543 s1 := v.Args[0] 33544 if s1.Op != OpS390XSLWconst { 33545 break 33546 } 33547 j1 := s1.AuxInt 33548 x1 := s1.Args[0] 33549 if x1.Op != OpS390XMOVBZloadidx { 33550 break 33551 } 33552 i1 := x1.AuxInt 33553 s := x1.Aux 33554 _ = x1.Args[2] 33555 idx := x1.Args[0] 33556 p := x1.Args[1] 33557 mem := x1.Args[2] 33558 or := v.Args[1] 33559 if or.Op != OpS390XORW { 33560 break 33561 } 33562 _ = or.Args[1] 33563 y := or.Args[0] 33564 s0 := or.Args[1] 33565 if s0.Op != OpS390XSLWconst { 33566 break 33567 } 33568 j0 := s0.AuxInt 33569 x0 := s0.Args[0] 33570 if x0.Op != OpS390XMOVBZloadidx { 33571 break 33572 } 33573 i0 := x0.AuxInt 33574 if x0.Aux != s { 33575 break 33576 } 33577 _ = x0.Args[2] 33578 if p != x0.Args[0] { 33579 break 33580 } 33581 if idx != x0.Args[1] { 33582 break 33583 } 33584 if mem != x0.Args[2] { 33585 break 33586 } 33587 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)) { 33588 break 33589 } 33590 b = mergePoint(b, x0, x1) 33591 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33592 v.reset(OpCopy) 33593 v.AddArg(v0) 33594 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33595 v1.AuxInt = j0 33596 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33597 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33598 v3.AuxInt = i0 33599 v3.Aux = s 33600 v3.AddArg(p) 33601 v3.AddArg(idx) 33602 v3.AddArg(mem) 33603 v2.AddArg(v3) 33604 v1.AddArg(v2) 33605 v0.AddArg(v1) 33606 v0.AddArg(y) 33607 return true 33608 } 33609 // 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)))) 33610 // 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) 33611 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33612 for { 33613 _ = v.Args[1] 33614 s1 := v.Args[0] 33615 if s1.Op != OpS390XSLWconst { 33616 break 33617 } 33618 j1 := s1.AuxInt 33619 x1 := s1.Args[0] 33620 if x1.Op != OpS390XMOVBZloadidx { 33621 break 33622 } 33623 i1 := x1.AuxInt 33624 s := x1.Aux 33625 _ = x1.Args[2] 33626 p := x1.Args[0] 33627 idx := x1.Args[1] 33628 mem := x1.Args[2] 33629 or := v.Args[1] 33630 if or.Op != OpS390XORW { 33631 break 33632 } 33633 _ = or.Args[1] 33634 y := or.Args[0] 33635 s0 := or.Args[1] 33636 if s0.Op != OpS390XSLWconst { 33637 break 33638 } 33639 j0 := s0.AuxInt 33640 x0 := s0.Args[0] 33641 if x0.Op != OpS390XMOVBZloadidx { 33642 break 33643 } 33644 i0 := x0.AuxInt 33645 if x0.Aux != s { 33646 break 33647 } 33648 _ = x0.Args[2] 33649 if idx != x0.Args[0] { 33650 break 33651 } 33652 if p != x0.Args[1] { 33653 break 33654 } 33655 if mem != x0.Args[2] { 33656 break 33657 } 33658 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)) { 33659 break 33660 } 33661 b = mergePoint(b, x0, x1) 33662 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33663 v.reset(OpCopy) 33664 v.AddArg(v0) 33665 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33666 v1.AuxInt = j0 33667 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33668 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33669 v3.AuxInt = i0 33670 v3.Aux = s 33671 v3.AddArg(p) 33672 v3.AddArg(idx) 33673 v3.AddArg(mem) 33674 v2.AddArg(v3) 33675 v1.AddArg(v2) 33676 v0.AddArg(v1) 33677 v0.AddArg(y) 33678 return true 33679 } 33680 // 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)))) 33681 // 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) 33682 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33683 for { 33684 _ = v.Args[1] 33685 s1 := v.Args[0] 33686 if s1.Op != OpS390XSLWconst { 33687 break 33688 } 33689 j1 := s1.AuxInt 33690 x1 := s1.Args[0] 33691 if x1.Op != OpS390XMOVBZloadidx { 33692 break 33693 } 33694 i1 := x1.AuxInt 33695 s := x1.Aux 33696 _ = x1.Args[2] 33697 idx := x1.Args[0] 33698 p := x1.Args[1] 33699 mem := x1.Args[2] 33700 or := v.Args[1] 33701 if or.Op != OpS390XORW { 33702 break 33703 } 33704 _ = or.Args[1] 33705 y := or.Args[0] 33706 s0 := or.Args[1] 33707 if s0.Op != OpS390XSLWconst { 33708 break 33709 } 33710 j0 := s0.AuxInt 33711 x0 := s0.Args[0] 33712 if x0.Op != OpS390XMOVBZloadidx { 33713 break 33714 } 33715 i0 := x0.AuxInt 33716 if x0.Aux != s { 33717 break 33718 } 33719 _ = x0.Args[2] 33720 if idx != x0.Args[0] { 33721 break 33722 } 33723 if p != x0.Args[1] { 33724 break 33725 } 33726 if mem != x0.Args[2] { 33727 break 33728 } 33729 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)) { 33730 break 33731 } 33732 b = mergePoint(b, x0, x1) 33733 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33734 v.reset(OpCopy) 33735 v.AddArg(v0) 33736 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33737 v1.AuxInt = j0 33738 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33739 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33740 v3.AuxInt = i0 33741 v3.Aux = s 33742 v3.AddArg(p) 33743 v3.AddArg(idx) 33744 v3.AddArg(mem) 33745 v2.AddArg(v3) 33746 v1.AddArg(v2) 33747 v0.AddArg(v1) 33748 v0.AddArg(y) 33749 return true 33750 } 33751 // 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))) 33752 // 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) 33753 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33754 for { 33755 _ = v.Args[1] 33756 or := v.Args[0] 33757 if or.Op != OpS390XORW { 33758 break 33759 } 33760 _ = or.Args[1] 33761 s0 := or.Args[0] 33762 if s0.Op != OpS390XSLWconst { 33763 break 33764 } 33765 j0 := s0.AuxInt 33766 x0 := s0.Args[0] 33767 if x0.Op != OpS390XMOVBZloadidx { 33768 break 33769 } 33770 i0 := x0.AuxInt 33771 s := x0.Aux 33772 _ = x0.Args[2] 33773 p := x0.Args[0] 33774 idx := x0.Args[1] 33775 mem := x0.Args[2] 33776 y := or.Args[1] 33777 s1 := v.Args[1] 33778 if s1.Op != OpS390XSLWconst { 33779 break 33780 } 33781 j1 := s1.AuxInt 33782 x1 := s1.Args[0] 33783 if x1.Op != OpS390XMOVBZloadidx { 33784 break 33785 } 33786 i1 := x1.AuxInt 33787 if x1.Aux != s { 33788 break 33789 } 33790 _ = x1.Args[2] 33791 if p != x1.Args[0] { 33792 break 33793 } 33794 if idx != x1.Args[1] { 33795 break 33796 } 33797 if mem != x1.Args[2] { 33798 break 33799 } 33800 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)) { 33801 break 33802 } 33803 b = mergePoint(b, x0, x1) 33804 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33805 v.reset(OpCopy) 33806 v.AddArg(v0) 33807 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33808 v1.AuxInt = j0 33809 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33810 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33811 v3.AuxInt = i0 33812 v3.Aux = s 33813 v3.AddArg(p) 33814 v3.AddArg(idx) 33815 v3.AddArg(mem) 33816 v2.AddArg(v3) 33817 v1.AddArg(v2) 33818 v0.AddArg(v1) 33819 v0.AddArg(y) 33820 return true 33821 } 33822 // 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))) 33823 // 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) 33824 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33825 for { 33826 _ = v.Args[1] 33827 or := v.Args[0] 33828 if or.Op != OpS390XORW { 33829 break 33830 } 33831 _ = or.Args[1] 33832 s0 := or.Args[0] 33833 if s0.Op != OpS390XSLWconst { 33834 break 33835 } 33836 j0 := s0.AuxInt 33837 x0 := s0.Args[0] 33838 if x0.Op != OpS390XMOVBZloadidx { 33839 break 33840 } 33841 i0 := x0.AuxInt 33842 s := x0.Aux 33843 _ = x0.Args[2] 33844 idx := x0.Args[0] 33845 p := x0.Args[1] 33846 mem := x0.Args[2] 33847 y := or.Args[1] 33848 s1 := v.Args[1] 33849 if s1.Op != OpS390XSLWconst { 33850 break 33851 } 33852 j1 := s1.AuxInt 33853 x1 := s1.Args[0] 33854 if x1.Op != OpS390XMOVBZloadidx { 33855 break 33856 } 33857 i1 := x1.AuxInt 33858 if x1.Aux != s { 33859 break 33860 } 33861 _ = x1.Args[2] 33862 if p != x1.Args[0] { 33863 break 33864 } 33865 if idx != x1.Args[1] { 33866 break 33867 } 33868 if mem != x1.Args[2] { 33869 break 33870 } 33871 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)) { 33872 break 33873 } 33874 b = mergePoint(b, x0, x1) 33875 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33876 v.reset(OpCopy) 33877 v.AddArg(v0) 33878 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33879 v1.AuxInt = j0 33880 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33881 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33882 v3.AuxInt = i0 33883 v3.Aux = s 33884 v3.AddArg(p) 33885 v3.AddArg(idx) 33886 v3.AddArg(mem) 33887 v2.AddArg(v3) 33888 v1.AddArg(v2) 33889 v0.AddArg(v1) 33890 v0.AddArg(y) 33891 return true 33892 } 33893 // 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))) 33894 // 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) 33895 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33896 for { 33897 _ = v.Args[1] 33898 or := v.Args[0] 33899 if or.Op != OpS390XORW { 33900 break 33901 } 33902 _ = or.Args[1] 33903 y := or.Args[0] 33904 s0 := or.Args[1] 33905 if s0.Op != OpS390XSLWconst { 33906 break 33907 } 33908 j0 := s0.AuxInt 33909 x0 := s0.Args[0] 33910 if x0.Op != OpS390XMOVBZloadidx { 33911 break 33912 } 33913 i0 := x0.AuxInt 33914 s := x0.Aux 33915 _ = x0.Args[2] 33916 p := x0.Args[0] 33917 idx := x0.Args[1] 33918 mem := x0.Args[2] 33919 s1 := v.Args[1] 33920 if s1.Op != OpS390XSLWconst { 33921 break 33922 } 33923 j1 := s1.AuxInt 33924 x1 := s1.Args[0] 33925 if x1.Op != OpS390XMOVBZloadidx { 33926 break 33927 } 33928 i1 := x1.AuxInt 33929 if x1.Aux != s { 33930 break 33931 } 33932 _ = x1.Args[2] 33933 if p != x1.Args[0] { 33934 break 33935 } 33936 if idx != x1.Args[1] { 33937 break 33938 } 33939 if mem != x1.Args[2] { 33940 break 33941 } 33942 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)) { 33943 break 33944 } 33945 b = mergePoint(b, x0, x1) 33946 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 33947 v.reset(OpCopy) 33948 v.AddArg(v0) 33949 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 33950 v1.AuxInt = j0 33951 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 33952 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 33953 v3.AuxInt = i0 33954 v3.Aux = s 33955 v3.AddArg(p) 33956 v3.AddArg(idx) 33957 v3.AddArg(mem) 33958 v2.AddArg(v3) 33959 v1.AddArg(v2) 33960 v0.AddArg(v1) 33961 v0.AddArg(y) 33962 return true 33963 } 33964 // 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))) 33965 // 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) 33966 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 33967 for { 33968 _ = v.Args[1] 33969 or := v.Args[0] 33970 if or.Op != OpS390XORW { 33971 break 33972 } 33973 _ = or.Args[1] 33974 y := or.Args[0] 33975 s0 := or.Args[1] 33976 if s0.Op != OpS390XSLWconst { 33977 break 33978 } 33979 j0 := s0.AuxInt 33980 x0 := s0.Args[0] 33981 if x0.Op != OpS390XMOVBZloadidx { 33982 break 33983 } 33984 i0 := x0.AuxInt 33985 s := x0.Aux 33986 _ = x0.Args[2] 33987 idx := x0.Args[0] 33988 p := x0.Args[1] 33989 mem := x0.Args[2] 33990 s1 := v.Args[1] 33991 if s1.Op != OpS390XSLWconst { 33992 break 33993 } 33994 j1 := s1.AuxInt 33995 x1 := s1.Args[0] 33996 if x1.Op != OpS390XMOVBZloadidx { 33997 break 33998 } 33999 i1 := x1.AuxInt 34000 if x1.Aux != s { 34001 break 34002 } 34003 _ = x1.Args[2] 34004 if p != x1.Args[0] { 34005 break 34006 } 34007 if idx != x1.Args[1] { 34008 break 34009 } 34010 if mem != x1.Args[2] { 34011 break 34012 } 34013 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)) { 34014 break 34015 } 34016 b = mergePoint(b, x0, x1) 34017 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34018 v.reset(OpCopy) 34019 v.AddArg(v0) 34020 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34021 v1.AuxInt = j0 34022 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34023 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34024 v3.AuxInt = i0 34025 v3.Aux = s 34026 v3.AddArg(p) 34027 v3.AddArg(idx) 34028 v3.AddArg(mem) 34029 v2.AddArg(v3) 34030 v1.AddArg(v2) 34031 v0.AddArg(v1) 34032 v0.AddArg(y) 34033 return true 34034 } 34035 // 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))) 34036 // 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) 34037 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34038 for { 34039 _ = v.Args[1] 34040 or := v.Args[0] 34041 if or.Op != OpS390XORW { 34042 break 34043 } 34044 _ = or.Args[1] 34045 s0 := or.Args[0] 34046 if s0.Op != OpS390XSLWconst { 34047 break 34048 } 34049 j0 := s0.AuxInt 34050 x0 := s0.Args[0] 34051 if x0.Op != OpS390XMOVBZloadidx { 34052 break 34053 } 34054 i0 := x0.AuxInt 34055 s := x0.Aux 34056 _ = x0.Args[2] 34057 p := x0.Args[0] 34058 idx := x0.Args[1] 34059 mem := x0.Args[2] 34060 y := or.Args[1] 34061 s1 := v.Args[1] 34062 if s1.Op != OpS390XSLWconst { 34063 break 34064 } 34065 j1 := s1.AuxInt 34066 x1 := s1.Args[0] 34067 if x1.Op != OpS390XMOVBZloadidx { 34068 break 34069 } 34070 i1 := x1.AuxInt 34071 if x1.Aux != s { 34072 break 34073 } 34074 _ = x1.Args[2] 34075 if idx != x1.Args[0] { 34076 break 34077 } 34078 if p != x1.Args[1] { 34079 break 34080 } 34081 if mem != x1.Args[2] { 34082 break 34083 } 34084 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)) { 34085 break 34086 } 34087 b = mergePoint(b, x0, x1) 34088 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34089 v.reset(OpCopy) 34090 v.AddArg(v0) 34091 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34092 v1.AuxInt = j0 34093 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34094 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34095 v3.AuxInt = i0 34096 v3.Aux = s 34097 v3.AddArg(p) 34098 v3.AddArg(idx) 34099 v3.AddArg(mem) 34100 v2.AddArg(v3) 34101 v1.AddArg(v2) 34102 v0.AddArg(v1) 34103 v0.AddArg(y) 34104 return true 34105 } 34106 return false 34107 } 34108 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 34109 b := v.Block 34110 _ = b 34111 typ := &b.Func.Config.Types 34112 _ = typ 34113 // 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))) 34114 // 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) 34115 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34116 for { 34117 _ = v.Args[1] 34118 or := v.Args[0] 34119 if or.Op != OpS390XORW { 34120 break 34121 } 34122 _ = or.Args[1] 34123 s0 := or.Args[0] 34124 if s0.Op != OpS390XSLWconst { 34125 break 34126 } 34127 j0 := s0.AuxInt 34128 x0 := s0.Args[0] 34129 if x0.Op != OpS390XMOVBZloadidx { 34130 break 34131 } 34132 i0 := x0.AuxInt 34133 s := x0.Aux 34134 _ = x0.Args[2] 34135 idx := x0.Args[0] 34136 p := x0.Args[1] 34137 mem := x0.Args[2] 34138 y := or.Args[1] 34139 s1 := v.Args[1] 34140 if s1.Op != OpS390XSLWconst { 34141 break 34142 } 34143 j1 := s1.AuxInt 34144 x1 := s1.Args[0] 34145 if x1.Op != OpS390XMOVBZloadidx { 34146 break 34147 } 34148 i1 := x1.AuxInt 34149 if x1.Aux != s { 34150 break 34151 } 34152 _ = x1.Args[2] 34153 if idx != x1.Args[0] { 34154 break 34155 } 34156 if p != x1.Args[1] { 34157 break 34158 } 34159 if mem != x1.Args[2] { 34160 break 34161 } 34162 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)) { 34163 break 34164 } 34165 b = mergePoint(b, x0, x1) 34166 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34167 v.reset(OpCopy) 34168 v.AddArg(v0) 34169 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34170 v1.AuxInt = j0 34171 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34172 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34173 v3.AuxInt = i0 34174 v3.Aux = s 34175 v3.AddArg(p) 34176 v3.AddArg(idx) 34177 v3.AddArg(mem) 34178 v2.AddArg(v3) 34179 v1.AddArg(v2) 34180 v0.AddArg(v1) 34181 v0.AddArg(y) 34182 return true 34183 } 34184 // 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))) 34185 // 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) 34186 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34187 for { 34188 _ = v.Args[1] 34189 or := v.Args[0] 34190 if or.Op != OpS390XORW { 34191 break 34192 } 34193 _ = or.Args[1] 34194 y := or.Args[0] 34195 s0 := or.Args[1] 34196 if s0.Op != OpS390XSLWconst { 34197 break 34198 } 34199 j0 := s0.AuxInt 34200 x0 := s0.Args[0] 34201 if x0.Op != OpS390XMOVBZloadidx { 34202 break 34203 } 34204 i0 := x0.AuxInt 34205 s := x0.Aux 34206 _ = x0.Args[2] 34207 p := x0.Args[0] 34208 idx := x0.Args[1] 34209 mem := x0.Args[2] 34210 s1 := v.Args[1] 34211 if s1.Op != OpS390XSLWconst { 34212 break 34213 } 34214 j1 := s1.AuxInt 34215 x1 := s1.Args[0] 34216 if x1.Op != OpS390XMOVBZloadidx { 34217 break 34218 } 34219 i1 := x1.AuxInt 34220 if x1.Aux != s { 34221 break 34222 } 34223 _ = x1.Args[2] 34224 if idx != x1.Args[0] { 34225 break 34226 } 34227 if p != x1.Args[1] { 34228 break 34229 } 34230 if mem != x1.Args[2] { 34231 break 34232 } 34233 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)) { 34234 break 34235 } 34236 b = mergePoint(b, x0, x1) 34237 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34238 v.reset(OpCopy) 34239 v.AddArg(v0) 34240 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34241 v1.AuxInt = j0 34242 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34243 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34244 v3.AuxInt = i0 34245 v3.Aux = s 34246 v3.AddArg(p) 34247 v3.AddArg(idx) 34248 v3.AddArg(mem) 34249 v2.AddArg(v3) 34250 v1.AddArg(v2) 34251 v0.AddArg(v1) 34252 v0.AddArg(y) 34253 return true 34254 } 34255 // 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))) 34256 // 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) 34257 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 34258 for { 34259 _ = v.Args[1] 34260 or := v.Args[0] 34261 if or.Op != OpS390XORW { 34262 break 34263 } 34264 _ = or.Args[1] 34265 y := or.Args[0] 34266 s0 := or.Args[1] 34267 if s0.Op != OpS390XSLWconst { 34268 break 34269 } 34270 j0 := s0.AuxInt 34271 x0 := s0.Args[0] 34272 if x0.Op != OpS390XMOVBZloadidx { 34273 break 34274 } 34275 i0 := x0.AuxInt 34276 s := x0.Aux 34277 _ = x0.Args[2] 34278 idx := x0.Args[0] 34279 p := x0.Args[1] 34280 mem := x0.Args[2] 34281 s1 := v.Args[1] 34282 if s1.Op != OpS390XSLWconst { 34283 break 34284 } 34285 j1 := s1.AuxInt 34286 x1 := s1.Args[0] 34287 if x1.Op != OpS390XMOVBZloadidx { 34288 break 34289 } 34290 i1 := x1.AuxInt 34291 if x1.Aux != s { 34292 break 34293 } 34294 _ = x1.Args[2] 34295 if idx != x1.Args[0] { 34296 break 34297 } 34298 if p != x1.Args[1] { 34299 break 34300 } 34301 if mem != x1.Args[2] { 34302 break 34303 } 34304 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)) { 34305 break 34306 } 34307 b = mergePoint(b, x0, x1) 34308 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 34309 v.reset(OpCopy) 34310 v.AddArg(v0) 34311 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 34312 v1.AuxInt = j0 34313 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) 34314 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) 34315 v3.AuxInt = i0 34316 v3.Aux = s 34317 v3.AddArg(p) 34318 v3.AddArg(idx) 34319 v3.AddArg(mem) 34320 v2.AddArg(v3) 34321 v1.AddArg(v2) 34322 v0.AddArg(v1) 34323 v0.AddArg(y) 34324 return true 34325 } 34326 return false 34327 } 34328 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 34329 // match: (ORWconst [c] x) 34330 // cond: int32(c)==0 34331 // result: x 34332 for { 34333 c := v.AuxInt 34334 x := v.Args[0] 34335 if !(int32(c) == 0) { 34336 break 34337 } 34338 v.reset(OpCopy) 34339 v.Type = x.Type 34340 v.AddArg(x) 34341 return true 34342 } 34343 // match: (ORWconst [c] _) 34344 // cond: int32(c)==-1 34345 // result: (MOVDconst [-1]) 34346 for { 34347 c := v.AuxInt 34348 if !(int32(c) == -1) { 34349 break 34350 } 34351 v.reset(OpS390XMOVDconst) 34352 v.AuxInt = -1 34353 return true 34354 } 34355 // match: (ORWconst [c] (MOVDconst [d])) 34356 // cond: 34357 // result: (MOVDconst [c|d]) 34358 for { 34359 c := v.AuxInt 34360 v_0 := v.Args[0] 34361 if v_0.Op != OpS390XMOVDconst { 34362 break 34363 } 34364 d := v_0.AuxInt 34365 v.reset(OpS390XMOVDconst) 34366 v.AuxInt = c | d 34367 return true 34368 } 34369 return false 34370 } 34371 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 34372 // match: (ORconst [0] x) 34373 // cond: 34374 // result: x 34375 for { 34376 if v.AuxInt != 0 { 34377 break 34378 } 34379 x := v.Args[0] 34380 v.reset(OpCopy) 34381 v.Type = x.Type 34382 v.AddArg(x) 34383 return true 34384 } 34385 // match: (ORconst [-1] _) 34386 // cond: 34387 // result: (MOVDconst [-1]) 34388 for { 34389 if v.AuxInt != -1 { 34390 break 34391 } 34392 v.reset(OpS390XMOVDconst) 34393 v.AuxInt = -1 34394 return true 34395 } 34396 // match: (ORconst [c] (MOVDconst [d])) 34397 // cond: 34398 // result: (MOVDconst [c|d]) 34399 for { 34400 c := v.AuxInt 34401 v_0 := v.Args[0] 34402 if v_0.Op != OpS390XMOVDconst { 34403 break 34404 } 34405 d := v_0.AuxInt 34406 v.reset(OpS390XMOVDconst) 34407 v.AuxInt = c | d 34408 return true 34409 } 34410 return false 34411 } 34412 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 34413 // match: (SLD x (MOVDconst [c])) 34414 // cond: 34415 // result: (SLDconst [c&63] x) 34416 for { 34417 _ = v.Args[1] 34418 x := v.Args[0] 34419 v_1 := v.Args[1] 34420 if v_1.Op != OpS390XMOVDconst { 34421 break 34422 } 34423 c := v_1.AuxInt 34424 v.reset(OpS390XSLDconst) 34425 v.AuxInt = c & 63 34426 v.AddArg(x) 34427 return true 34428 } 34429 // match: (SLD x (ANDconst [63] y)) 34430 // cond: 34431 // result: (SLD x y) 34432 for { 34433 _ = v.Args[1] 34434 x := v.Args[0] 34435 v_1 := v.Args[1] 34436 if v_1.Op != OpS390XANDconst { 34437 break 34438 } 34439 if v_1.AuxInt != 63 { 34440 break 34441 } 34442 y := v_1.Args[0] 34443 v.reset(OpS390XSLD) 34444 v.AddArg(x) 34445 v.AddArg(y) 34446 return true 34447 } 34448 return false 34449 } 34450 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 34451 // match: (SLW x (MOVDconst [c])) 34452 // cond: 34453 // result: (SLWconst [c&63] x) 34454 for { 34455 _ = v.Args[1] 34456 x := v.Args[0] 34457 v_1 := v.Args[1] 34458 if v_1.Op != OpS390XMOVDconst { 34459 break 34460 } 34461 c := v_1.AuxInt 34462 v.reset(OpS390XSLWconst) 34463 v.AuxInt = c & 63 34464 v.AddArg(x) 34465 return true 34466 } 34467 // match: (SLW x (ANDWconst [63] y)) 34468 // cond: 34469 // result: (SLW x y) 34470 for { 34471 _ = v.Args[1] 34472 x := v.Args[0] 34473 v_1 := v.Args[1] 34474 if v_1.Op != OpS390XANDWconst { 34475 break 34476 } 34477 if v_1.AuxInt != 63 { 34478 break 34479 } 34480 y := v_1.Args[0] 34481 v.reset(OpS390XSLW) 34482 v.AddArg(x) 34483 v.AddArg(y) 34484 return true 34485 } 34486 return false 34487 } 34488 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 34489 // match: (SRAD x (MOVDconst [c])) 34490 // cond: 34491 // result: (SRADconst [c&63] x) 34492 for { 34493 _ = v.Args[1] 34494 x := v.Args[0] 34495 v_1 := v.Args[1] 34496 if v_1.Op != OpS390XMOVDconst { 34497 break 34498 } 34499 c := v_1.AuxInt 34500 v.reset(OpS390XSRADconst) 34501 v.AuxInt = c & 63 34502 v.AddArg(x) 34503 return true 34504 } 34505 // match: (SRAD x (ANDconst [63] y)) 34506 // cond: 34507 // result: (SRAD x y) 34508 for { 34509 _ = v.Args[1] 34510 x := v.Args[0] 34511 v_1 := v.Args[1] 34512 if v_1.Op != OpS390XANDconst { 34513 break 34514 } 34515 if v_1.AuxInt != 63 { 34516 break 34517 } 34518 y := v_1.Args[0] 34519 v.reset(OpS390XSRAD) 34520 v.AddArg(x) 34521 v.AddArg(y) 34522 return true 34523 } 34524 return false 34525 } 34526 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 34527 // match: (SRADconst [c] (MOVDconst [d])) 34528 // cond: 34529 // result: (MOVDconst [d>>uint64(c)]) 34530 for { 34531 c := v.AuxInt 34532 v_0 := v.Args[0] 34533 if v_0.Op != OpS390XMOVDconst { 34534 break 34535 } 34536 d := v_0.AuxInt 34537 v.reset(OpS390XMOVDconst) 34538 v.AuxInt = d >> uint64(c) 34539 return true 34540 } 34541 return false 34542 } 34543 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 34544 // match: (SRAW x (MOVDconst [c])) 34545 // cond: 34546 // result: (SRAWconst [c&63] x) 34547 for { 34548 _ = v.Args[1] 34549 x := v.Args[0] 34550 v_1 := v.Args[1] 34551 if v_1.Op != OpS390XMOVDconst { 34552 break 34553 } 34554 c := v_1.AuxInt 34555 v.reset(OpS390XSRAWconst) 34556 v.AuxInt = c & 63 34557 v.AddArg(x) 34558 return true 34559 } 34560 // match: (SRAW x (ANDWconst [63] y)) 34561 // cond: 34562 // result: (SRAW x y) 34563 for { 34564 _ = v.Args[1] 34565 x := v.Args[0] 34566 v_1 := v.Args[1] 34567 if v_1.Op != OpS390XANDWconst { 34568 break 34569 } 34570 if v_1.AuxInt != 63 { 34571 break 34572 } 34573 y := v_1.Args[0] 34574 v.reset(OpS390XSRAW) 34575 v.AddArg(x) 34576 v.AddArg(y) 34577 return true 34578 } 34579 return false 34580 } 34581 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 34582 // match: (SRAWconst [c] (MOVDconst [d])) 34583 // cond: 34584 // result: (MOVDconst [d>>uint64(c)]) 34585 for { 34586 c := v.AuxInt 34587 v_0 := v.Args[0] 34588 if v_0.Op != OpS390XMOVDconst { 34589 break 34590 } 34591 d := v_0.AuxInt 34592 v.reset(OpS390XMOVDconst) 34593 v.AuxInt = d >> uint64(c) 34594 return true 34595 } 34596 return false 34597 } 34598 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 34599 // match: (SRD x (MOVDconst [c])) 34600 // cond: 34601 // result: (SRDconst [c&63] x) 34602 for { 34603 _ = v.Args[1] 34604 x := v.Args[0] 34605 v_1 := v.Args[1] 34606 if v_1.Op != OpS390XMOVDconst { 34607 break 34608 } 34609 c := v_1.AuxInt 34610 v.reset(OpS390XSRDconst) 34611 v.AuxInt = c & 63 34612 v.AddArg(x) 34613 return true 34614 } 34615 // match: (SRD x (ANDconst [63] y)) 34616 // cond: 34617 // result: (SRD x y) 34618 for { 34619 _ = v.Args[1] 34620 x := v.Args[0] 34621 v_1 := v.Args[1] 34622 if v_1.Op != OpS390XANDconst { 34623 break 34624 } 34625 if v_1.AuxInt != 63 { 34626 break 34627 } 34628 y := v_1.Args[0] 34629 v.reset(OpS390XSRD) 34630 v.AddArg(x) 34631 v.AddArg(y) 34632 return true 34633 } 34634 return false 34635 } 34636 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 34637 // match: (SRW x (MOVDconst [c])) 34638 // cond: 34639 // result: (SRWconst [c&63] x) 34640 for { 34641 _ = v.Args[1] 34642 x := v.Args[0] 34643 v_1 := v.Args[1] 34644 if v_1.Op != OpS390XMOVDconst { 34645 break 34646 } 34647 c := v_1.AuxInt 34648 v.reset(OpS390XSRWconst) 34649 v.AuxInt = c & 63 34650 v.AddArg(x) 34651 return true 34652 } 34653 // match: (SRW x (ANDWconst [63] y)) 34654 // cond: 34655 // result: (SRW x y) 34656 for { 34657 _ = v.Args[1] 34658 x := v.Args[0] 34659 v_1 := v.Args[1] 34660 if v_1.Op != OpS390XANDWconst { 34661 break 34662 } 34663 if v_1.AuxInt != 63 { 34664 break 34665 } 34666 y := v_1.Args[0] 34667 v.reset(OpS390XSRW) 34668 v.AddArg(x) 34669 v.AddArg(y) 34670 return true 34671 } 34672 return false 34673 } 34674 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 34675 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 34676 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 34677 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 34678 for { 34679 i := v.AuxInt 34680 s := v.Aux 34681 _ = v.Args[3] 34682 p := v.Args[0] 34683 w2 := v.Args[1] 34684 w3 := v.Args[2] 34685 x := v.Args[3] 34686 if x.Op != OpS390XSTM2 { 34687 break 34688 } 34689 if x.AuxInt != i-8 { 34690 break 34691 } 34692 if x.Aux != s { 34693 break 34694 } 34695 _ = x.Args[3] 34696 if p != x.Args[0] { 34697 break 34698 } 34699 w0 := x.Args[1] 34700 w1 := x.Args[2] 34701 mem := x.Args[3] 34702 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 34703 break 34704 } 34705 v.reset(OpS390XSTM4) 34706 v.AuxInt = i - 8 34707 v.Aux = s 34708 v.AddArg(p) 34709 v.AddArg(w0) 34710 v.AddArg(w1) 34711 v.AddArg(w2) 34712 v.AddArg(w3) 34713 v.AddArg(mem) 34714 return true 34715 } 34716 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 34717 // cond: 34718 // result: (MOVDstore [i] {s} p x mem) 34719 for { 34720 i := v.AuxInt 34721 s := v.Aux 34722 _ = v.Args[3] 34723 p := v.Args[0] 34724 v_1 := v.Args[1] 34725 if v_1.Op != OpS390XSRDconst { 34726 break 34727 } 34728 if v_1.AuxInt != 32 { 34729 break 34730 } 34731 x := v_1.Args[0] 34732 if x != v.Args[2] { 34733 break 34734 } 34735 mem := v.Args[3] 34736 v.reset(OpS390XMOVDstore) 34737 v.AuxInt = i 34738 v.Aux = s 34739 v.AddArg(p) 34740 v.AddArg(x) 34741 v.AddArg(mem) 34742 return true 34743 } 34744 return false 34745 } 34746 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 34747 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 34748 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 34749 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 34750 for { 34751 i := v.AuxInt 34752 s := v.Aux 34753 _ = v.Args[3] 34754 p := v.Args[0] 34755 w2 := v.Args[1] 34756 w3 := v.Args[2] 34757 x := v.Args[3] 34758 if x.Op != OpS390XSTMG2 { 34759 break 34760 } 34761 if x.AuxInt != i-16 { 34762 break 34763 } 34764 if x.Aux != s { 34765 break 34766 } 34767 _ = x.Args[3] 34768 if p != x.Args[0] { 34769 break 34770 } 34771 w0 := x.Args[1] 34772 w1 := x.Args[2] 34773 mem := x.Args[3] 34774 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 34775 break 34776 } 34777 v.reset(OpS390XSTMG4) 34778 v.AuxInt = i - 16 34779 v.Aux = s 34780 v.AddArg(p) 34781 v.AddArg(w0) 34782 v.AddArg(w1) 34783 v.AddArg(w2) 34784 v.AddArg(w3) 34785 v.AddArg(mem) 34786 return true 34787 } 34788 return false 34789 } 34790 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 34791 b := v.Block 34792 _ = b 34793 // match: (SUB x (MOVDconst [c])) 34794 // cond: is32Bit(c) 34795 // result: (SUBconst x [c]) 34796 for { 34797 _ = v.Args[1] 34798 x := v.Args[0] 34799 v_1 := v.Args[1] 34800 if v_1.Op != OpS390XMOVDconst { 34801 break 34802 } 34803 c := v_1.AuxInt 34804 if !(is32Bit(c)) { 34805 break 34806 } 34807 v.reset(OpS390XSUBconst) 34808 v.AuxInt = c 34809 v.AddArg(x) 34810 return true 34811 } 34812 // match: (SUB (MOVDconst [c]) x) 34813 // cond: is32Bit(c) 34814 // result: (NEG (SUBconst <v.Type> x [c])) 34815 for { 34816 _ = v.Args[1] 34817 v_0 := v.Args[0] 34818 if v_0.Op != OpS390XMOVDconst { 34819 break 34820 } 34821 c := v_0.AuxInt 34822 x := v.Args[1] 34823 if !(is32Bit(c)) { 34824 break 34825 } 34826 v.reset(OpS390XNEG) 34827 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 34828 v0.AuxInt = c 34829 v0.AddArg(x) 34830 v.AddArg(v0) 34831 return true 34832 } 34833 // match: (SUB x x) 34834 // cond: 34835 // result: (MOVDconst [0]) 34836 for { 34837 _ = v.Args[1] 34838 x := v.Args[0] 34839 if x != v.Args[1] { 34840 break 34841 } 34842 v.reset(OpS390XMOVDconst) 34843 v.AuxInt = 0 34844 return true 34845 } 34846 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 34847 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34848 // result: (SUBload <t> [off] {sym} x ptr mem) 34849 for { 34850 t := v.Type 34851 _ = v.Args[1] 34852 x := v.Args[0] 34853 g := v.Args[1] 34854 if g.Op != OpS390XMOVDload { 34855 break 34856 } 34857 off := g.AuxInt 34858 sym := g.Aux 34859 _ = g.Args[1] 34860 ptr := g.Args[0] 34861 mem := g.Args[1] 34862 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34863 break 34864 } 34865 v.reset(OpS390XSUBload) 34866 v.Type = t 34867 v.AuxInt = off 34868 v.Aux = sym 34869 v.AddArg(x) 34870 v.AddArg(ptr) 34871 v.AddArg(mem) 34872 return true 34873 } 34874 return false 34875 } 34876 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool { 34877 // match: (SUBEWcarrymask (FlagEQ)) 34878 // cond: 34879 // result: (MOVDconst [-1]) 34880 for { 34881 v_0 := v.Args[0] 34882 if v_0.Op != OpS390XFlagEQ { 34883 break 34884 } 34885 v.reset(OpS390XMOVDconst) 34886 v.AuxInt = -1 34887 return true 34888 } 34889 // match: (SUBEWcarrymask (FlagLT)) 34890 // cond: 34891 // result: (MOVDconst [-1]) 34892 for { 34893 v_0 := v.Args[0] 34894 if v_0.Op != OpS390XFlagLT { 34895 break 34896 } 34897 v.reset(OpS390XMOVDconst) 34898 v.AuxInt = -1 34899 return true 34900 } 34901 // match: (SUBEWcarrymask (FlagGT)) 34902 // cond: 34903 // result: (MOVDconst [0]) 34904 for { 34905 v_0 := v.Args[0] 34906 if v_0.Op != OpS390XFlagGT { 34907 break 34908 } 34909 v.reset(OpS390XMOVDconst) 34910 v.AuxInt = 0 34911 return true 34912 } 34913 return false 34914 } 34915 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool { 34916 // match: (SUBEcarrymask (FlagEQ)) 34917 // cond: 34918 // result: (MOVDconst [-1]) 34919 for { 34920 v_0 := v.Args[0] 34921 if v_0.Op != OpS390XFlagEQ { 34922 break 34923 } 34924 v.reset(OpS390XMOVDconst) 34925 v.AuxInt = -1 34926 return true 34927 } 34928 // match: (SUBEcarrymask (FlagLT)) 34929 // cond: 34930 // result: (MOVDconst [-1]) 34931 for { 34932 v_0 := v.Args[0] 34933 if v_0.Op != OpS390XFlagLT { 34934 break 34935 } 34936 v.reset(OpS390XMOVDconst) 34937 v.AuxInt = -1 34938 return true 34939 } 34940 // match: (SUBEcarrymask (FlagGT)) 34941 // cond: 34942 // result: (MOVDconst [0]) 34943 for { 34944 v_0 := v.Args[0] 34945 if v_0.Op != OpS390XFlagGT { 34946 break 34947 } 34948 v.reset(OpS390XMOVDconst) 34949 v.AuxInt = 0 34950 return true 34951 } 34952 return false 34953 } 34954 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 34955 b := v.Block 34956 _ = b 34957 // match: (SUBW x (MOVDconst [c])) 34958 // cond: 34959 // result: (SUBWconst x [c]) 34960 for { 34961 _ = v.Args[1] 34962 x := v.Args[0] 34963 v_1 := v.Args[1] 34964 if v_1.Op != OpS390XMOVDconst { 34965 break 34966 } 34967 c := v_1.AuxInt 34968 v.reset(OpS390XSUBWconst) 34969 v.AuxInt = c 34970 v.AddArg(x) 34971 return true 34972 } 34973 // match: (SUBW (MOVDconst [c]) x) 34974 // cond: 34975 // result: (NEGW (SUBWconst <v.Type> x [c])) 34976 for { 34977 _ = v.Args[1] 34978 v_0 := v.Args[0] 34979 if v_0.Op != OpS390XMOVDconst { 34980 break 34981 } 34982 c := v_0.AuxInt 34983 x := v.Args[1] 34984 v.reset(OpS390XNEGW) 34985 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 34986 v0.AuxInt = c 34987 v0.AddArg(x) 34988 v.AddArg(v0) 34989 return true 34990 } 34991 // match: (SUBW x x) 34992 // cond: 34993 // result: (MOVDconst [0]) 34994 for { 34995 _ = v.Args[1] 34996 x := v.Args[0] 34997 if x != v.Args[1] { 34998 break 34999 } 35000 v.reset(OpS390XMOVDconst) 35001 v.AuxInt = 0 35002 return true 35003 } 35004 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 35005 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35006 // result: (SUBWload <t> [off] {sym} x ptr mem) 35007 for { 35008 t := v.Type 35009 _ = v.Args[1] 35010 x := v.Args[0] 35011 g := v.Args[1] 35012 if g.Op != OpS390XMOVWload { 35013 break 35014 } 35015 off := g.AuxInt 35016 sym := g.Aux 35017 _ = g.Args[1] 35018 ptr := g.Args[0] 35019 mem := g.Args[1] 35020 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35021 break 35022 } 35023 v.reset(OpS390XSUBWload) 35024 v.Type = t 35025 v.AuxInt = off 35026 v.Aux = sym 35027 v.AddArg(x) 35028 v.AddArg(ptr) 35029 v.AddArg(mem) 35030 return true 35031 } 35032 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35033 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35034 // result: (SUBWload <t> [off] {sym} x ptr mem) 35035 for { 35036 t := v.Type 35037 _ = v.Args[1] 35038 x := v.Args[0] 35039 g := v.Args[1] 35040 if g.Op != OpS390XMOVWZload { 35041 break 35042 } 35043 off := g.AuxInt 35044 sym := g.Aux 35045 _ = g.Args[1] 35046 ptr := g.Args[0] 35047 mem := g.Args[1] 35048 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35049 break 35050 } 35051 v.reset(OpS390XSUBWload) 35052 v.Type = t 35053 v.AuxInt = off 35054 v.Aux = sym 35055 v.AddArg(x) 35056 v.AddArg(ptr) 35057 v.AddArg(mem) 35058 return true 35059 } 35060 return false 35061 } 35062 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 35063 // match: (SUBWconst [c] x) 35064 // cond: int32(c) == 0 35065 // result: x 35066 for { 35067 c := v.AuxInt 35068 x := v.Args[0] 35069 if !(int32(c) == 0) { 35070 break 35071 } 35072 v.reset(OpCopy) 35073 v.Type = x.Type 35074 v.AddArg(x) 35075 return true 35076 } 35077 // match: (SUBWconst [c] x) 35078 // cond: 35079 // result: (ADDWconst [int64(int32(-c))] x) 35080 for { 35081 c := v.AuxInt 35082 x := v.Args[0] 35083 v.reset(OpS390XADDWconst) 35084 v.AuxInt = int64(int32(-c)) 35085 v.AddArg(x) 35086 return true 35087 } 35088 } 35089 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 35090 // match: (SUBconst [0] x) 35091 // cond: 35092 // result: x 35093 for { 35094 if v.AuxInt != 0 { 35095 break 35096 } 35097 x := v.Args[0] 35098 v.reset(OpCopy) 35099 v.Type = x.Type 35100 v.AddArg(x) 35101 return true 35102 } 35103 // match: (SUBconst [c] x) 35104 // cond: c != -(1<<31) 35105 // result: (ADDconst [-c] x) 35106 for { 35107 c := v.AuxInt 35108 x := v.Args[0] 35109 if !(c != -(1 << 31)) { 35110 break 35111 } 35112 v.reset(OpS390XADDconst) 35113 v.AuxInt = -c 35114 v.AddArg(x) 35115 return true 35116 } 35117 // match: (SUBconst (MOVDconst [d]) [c]) 35118 // cond: 35119 // result: (MOVDconst [d-c]) 35120 for { 35121 c := v.AuxInt 35122 v_0 := v.Args[0] 35123 if v_0.Op != OpS390XMOVDconst { 35124 break 35125 } 35126 d := v_0.AuxInt 35127 v.reset(OpS390XMOVDconst) 35128 v.AuxInt = d - c 35129 return true 35130 } 35131 // match: (SUBconst (SUBconst x [d]) [c]) 35132 // cond: is32Bit(-c-d) 35133 // result: (ADDconst [-c-d] x) 35134 for { 35135 c := v.AuxInt 35136 v_0 := v.Args[0] 35137 if v_0.Op != OpS390XSUBconst { 35138 break 35139 } 35140 d := v_0.AuxInt 35141 x := v_0.Args[0] 35142 if !(is32Bit(-c - d)) { 35143 break 35144 } 35145 v.reset(OpS390XADDconst) 35146 v.AuxInt = -c - d 35147 v.AddArg(x) 35148 return true 35149 } 35150 return false 35151 } 35152 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 35153 // match: (XOR x (MOVDconst [c])) 35154 // cond: isU32Bit(c) 35155 // result: (XORconst [c] x) 35156 for { 35157 _ = v.Args[1] 35158 x := v.Args[0] 35159 v_1 := v.Args[1] 35160 if v_1.Op != OpS390XMOVDconst { 35161 break 35162 } 35163 c := v_1.AuxInt 35164 if !(isU32Bit(c)) { 35165 break 35166 } 35167 v.reset(OpS390XXORconst) 35168 v.AuxInt = c 35169 v.AddArg(x) 35170 return true 35171 } 35172 // match: (XOR (MOVDconst [c]) x) 35173 // cond: isU32Bit(c) 35174 // result: (XORconst [c] x) 35175 for { 35176 _ = v.Args[1] 35177 v_0 := v.Args[0] 35178 if v_0.Op != OpS390XMOVDconst { 35179 break 35180 } 35181 c := v_0.AuxInt 35182 x := v.Args[1] 35183 if !(isU32Bit(c)) { 35184 break 35185 } 35186 v.reset(OpS390XXORconst) 35187 v.AuxInt = c 35188 v.AddArg(x) 35189 return true 35190 } 35191 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 35192 // cond: d == 64-c 35193 // result: (RLLGconst [c] x) 35194 for { 35195 _ = v.Args[1] 35196 v_0 := v.Args[0] 35197 if v_0.Op != OpS390XSLDconst { 35198 break 35199 } 35200 c := v_0.AuxInt 35201 x := v_0.Args[0] 35202 v_1 := v.Args[1] 35203 if v_1.Op != OpS390XSRDconst { 35204 break 35205 } 35206 d := v_1.AuxInt 35207 if x != v_1.Args[0] { 35208 break 35209 } 35210 if !(d == 64-c) { 35211 break 35212 } 35213 v.reset(OpS390XRLLGconst) 35214 v.AuxInt = c 35215 v.AddArg(x) 35216 return true 35217 } 35218 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 35219 // cond: d == 64-c 35220 // result: (RLLGconst [c] x) 35221 for { 35222 _ = v.Args[1] 35223 v_0 := v.Args[0] 35224 if v_0.Op != OpS390XSRDconst { 35225 break 35226 } 35227 d := v_0.AuxInt 35228 x := v_0.Args[0] 35229 v_1 := v.Args[1] 35230 if v_1.Op != OpS390XSLDconst { 35231 break 35232 } 35233 c := v_1.AuxInt 35234 if x != v_1.Args[0] { 35235 break 35236 } 35237 if !(d == 64-c) { 35238 break 35239 } 35240 v.reset(OpS390XRLLGconst) 35241 v.AuxInt = c 35242 v.AddArg(x) 35243 return true 35244 } 35245 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 35246 // cond: 35247 // result: (MOVDconst [c^d]) 35248 for { 35249 _ = v.Args[1] 35250 v_0 := v.Args[0] 35251 if v_0.Op != OpS390XMOVDconst { 35252 break 35253 } 35254 c := v_0.AuxInt 35255 v_1 := v.Args[1] 35256 if v_1.Op != OpS390XMOVDconst { 35257 break 35258 } 35259 d := v_1.AuxInt 35260 v.reset(OpS390XMOVDconst) 35261 v.AuxInt = c ^ d 35262 return true 35263 } 35264 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 35265 // cond: 35266 // result: (MOVDconst [c^d]) 35267 for { 35268 _ = v.Args[1] 35269 v_0 := v.Args[0] 35270 if v_0.Op != OpS390XMOVDconst { 35271 break 35272 } 35273 d := v_0.AuxInt 35274 v_1 := v.Args[1] 35275 if v_1.Op != OpS390XMOVDconst { 35276 break 35277 } 35278 c := v_1.AuxInt 35279 v.reset(OpS390XMOVDconst) 35280 v.AuxInt = c ^ d 35281 return true 35282 } 35283 // match: (XOR x x) 35284 // cond: 35285 // result: (MOVDconst [0]) 35286 for { 35287 _ = v.Args[1] 35288 x := v.Args[0] 35289 if x != v.Args[1] { 35290 break 35291 } 35292 v.reset(OpS390XMOVDconst) 35293 v.AuxInt = 0 35294 return true 35295 } 35296 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35297 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35298 // result: (XORload <t> [off] {sym} x ptr mem) 35299 for { 35300 t := v.Type 35301 _ = v.Args[1] 35302 x := v.Args[0] 35303 g := v.Args[1] 35304 if g.Op != OpS390XMOVDload { 35305 break 35306 } 35307 off := g.AuxInt 35308 sym := g.Aux 35309 _ = g.Args[1] 35310 ptr := g.Args[0] 35311 mem := g.Args[1] 35312 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35313 break 35314 } 35315 v.reset(OpS390XXORload) 35316 v.Type = t 35317 v.AuxInt = off 35318 v.Aux = sym 35319 v.AddArg(x) 35320 v.AddArg(ptr) 35321 v.AddArg(mem) 35322 return true 35323 } 35324 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35325 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35326 // result: (XORload <t> [off] {sym} x ptr mem) 35327 for { 35328 t := v.Type 35329 _ = v.Args[1] 35330 g := v.Args[0] 35331 if g.Op != OpS390XMOVDload { 35332 break 35333 } 35334 off := g.AuxInt 35335 sym := g.Aux 35336 _ = g.Args[1] 35337 ptr := g.Args[0] 35338 mem := g.Args[1] 35339 x := v.Args[1] 35340 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35341 break 35342 } 35343 v.reset(OpS390XXORload) 35344 v.Type = t 35345 v.AuxInt = off 35346 v.Aux = sym 35347 v.AddArg(x) 35348 v.AddArg(ptr) 35349 v.AddArg(mem) 35350 return true 35351 } 35352 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 35353 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35354 // result: (XORload <t> [off] {sym} x ptr mem) 35355 for { 35356 t := v.Type 35357 _ = v.Args[1] 35358 g := v.Args[0] 35359 if g.Op != OpS390XMOVDload { 35360 break 35361 } 35362 off := g.AuxInt 35363 sym := g.Aux 35364 _ = g.Args[1] 35365 ptr := g.Args[0] 35366 mem := g.Args[1] 35367 x := v.Args[1] 35368 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35369 break 35370 } 35371 v.reset(OpS390XXORload) 35372 v.Type = t 35373 v.AuxInt = off 35374 v.Aux = sym 35375 v.AddArg(x) 35376 v.AddArg(ptr) 35377 v.AddArg(mem) 35378 return true 35379 } 35380 return false 35381 } 35382 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 35383 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 35384 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35385 // result: (XORload <t> [off] {sym} x ptr mem) 35386 for { 35387 t := v.Type 35388 _ = v.Args[1] 35389 x := v.Args[0] 35390 g := v.Args[1] 35391 if g.Op != OpS390XMOVDload { 35392 break 35393 } 35394 off := g.AuxInt 35395 sym := g.Aux 35396 _ = g.Args[1] 35397 ptr := g.Args[0] 35398 mem := g.Args[1] 35399 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35400 break 35401 } 35402 v.reset(OpS390XXORload) 35403 v.Type = t 35404 v.AuxInt = off 35405 v.Aux = sym 35406 v.AddArg(x) 35407 v.AddArg(ptr) 35408 v.AddArg(mem) 35409 return true 35410 } 35411 return false 35412 } 35413 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 35414 // match: (XORW x (MOVDconst [c])) 35415 // cond: 35416 // result: (XORWconst [c] x) 35417 for { 35418 _ = v.Args[1] 35419 x := v.Args[0] 35420 v_1 := v.Args[1] 35421 if v_1.Op != OpS390XMOVDconst { 35422 break 35423 } 35424 c := v_1.AuxInt 35425 v.reset(OpS390XXORWconst) 35426 v.AuxInt = c 35427 v.AddArg(x) 35428 return true 35429 } 35430 // match: (XORW (MOVDconst [c]) x) 35431 // cond: 35432 // result: (XORWconst [c] x) 35433 for { 35434 _ = v.Args[1] 35435 v_0 := v.Args[0] 35436 if v_0.Op != OpS390XMOVDconst { 35437 break 35438 } 35439 c := v_0.AuxInt 35440 x := v.Args[1] 35441 v.reset(OpS390XXORWconst) 35442 v.AuxInt = c 35443 v.AddArg(x) 35444 return true 35445 } 35446 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 35447 // cond: d == 32-c 35448 // result: (RLLconst [c] x) 35449 for { 35450 _ = v.Args[1] 35451 v_0 := v.Args[0] 35452 if v_0.Op != OpS390XSLWconst { 35453 break 35454 } 35455 c := v_0.AuxInt 35456 x := v_0.Args[0] 35457 v_1 := v.Args[1] 35458 if v_1.Op != OpS390XSRWconst { 35459 break 35460 } 35461 d := v_1.AuxInt 35462 if x != v_1.Args[0] { 35463 break 35464 } 35465 if !(d == 32-c) { 35466 break 35467 } 35468 v.reset(OpS390XRLLconst) 35469 v.AuxInt = c 35470 v.AddArg(x) 35471 return true 35472 } 35473 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 35474 // cond: d == 32-c 35475 // result: (RLLconst [c] x) 35476 for { 35477 _ = v.Args[1] 35478 v_0 := v.Args[0] 35479 if v_0.Op != OpS390XSRWconst { 35480 break 35481 } 35482 d := v_0.AuxInt 35483 x := v_0.Args[0] 35484 v_1 := v.Args[1] 35485 if v_1.Op != OpS390XSLWconst { 35486 break 35487 } 35488 c := v_1.AuxInt 35489 if x != v_1.Args[0] { 35490 break 35491 } 35492 if !(d == 32-c) { 35493 break 35494 } 35495 v.reset(OpS390XRLLconst) 35496 v.AuxInt = c 35497 v.AddArg(x) 35498 return true 35499 } 35500 // match: (XORW x x) 35501 // cond: 35502 // result: (MOVDconst [0]) 35503 for { 35504 _ = v.Args[1] 35505 x := v.Args[0] 35506 if x != v.Args[1] { 35507 break 35508 } 35509 v.reset(OpS390XMOVDconst) 35510 v.AuxInt = 0 35511 return true 35512 } 35513 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35514 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35515 // result: (XORWload <t> [off] {sym} x ptr mem) 35516 for { 35517 t := v.Type 35518 _ = v.Args[1] 35519 x := v.Args[0] 35520 g := v.Args[1] 35521 if g.Op != OpS390XMOVWload { 35522 break 35523 } 35524 off := g.AuxInt 35525 sym := g.Aux 35526 _ = g.Args[1] 35527 ptr := g.Args[0] 35528 mem := g.Args[1] 35529 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35530 break 35531 } 35532 v.reset(OpS390XXORWload) 35533 v.Type = t 35534 v.AuxInt = off 35535 v.Aux = sym 35536 v.AddArg(x) 35537 v.AddArg(ptr) 35538 v.AddArg(mem) 35539 return true 35540 } 35541 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35542 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35543 // result: (XORWload <t> [off] {sym} x ptr mem) 35544 for { 35545 t := v.Type 35546 _ = v.Args[1] 35547 g := v.Args[0] 35548 if g.Op != OpS390XMOVWload { 35549 break 35550 } 35551 off := g.AuxInt 35552 sym := g.Aux 35553 _ = g.Args[1] 35554 ptr := g.Args[0] 35555 mem := g.Args[1] 35556 x := v.Args[1] 35557 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35558 break 35559 } 35560 v.reset(OpS390XXORWload) 35561 v.Type = t 35562 v.AuxInt = off 35563 v.Aux = sym 35564 v.AddArg(x) 35565 v.AddArg(ptr) 35566 v.AddArg(mem) 35567 return true 35568 } 35569 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 35570 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35571 // result: (XORWload <t> [off] {sym} x ptr mem) 35572 for { 35573 t := v.Type 35574 _ = v.Args[1] 35575 g := v.Args[0] 35576 if g.Op != OpS390XMOVWload { 35577 break 35578 } 35579 off := g.AuxInt 35580 sym := g.Aux 35581 _ = g.Args[1] 35582 ptr := g.Args[0] 35583 mem := g.Args[1] 35584 x := v.Args[1] 35585 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35586 break 35587 } 35588 v.reset(OpS390XXORWload) 35589 v.Type = t 35590 v.AuxInt = off 35591 v.Aux = sym 35592 v.AddArg(x) 35593 v.AddArg(ptr) 35594 v.AddArg(mem) 35595 return true 35596 } 35597 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 35598 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35599 // result: (XORWload <t> [off] {sym} x ptr mem) 35600 for { 35601 t := v.Type 35602 _ = v.Args[1] 35603 x := v.Args[0] 35604 g := v.Args[1] 35605 if g.Op != OpS390XMOVWload { 35606 break 35607 } 35608 off := g.AuxInt 35609 sym := g.Aux 35610 _ = g.Args[1] 35611 ptr := g.Args[0] 35612 mem := g.Args[1] 35613 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35614 break 35615 } 35616 v.reset(OpS390XXORWload) 35617 v.Type = t 35618 v.AuxInt = off 35619 v.Aux = sym 35620 v.AddArg(x) 35621 v.AddArg(ptr) 35622 v.AddArg(mem) 35623 return true 35624 } 35625 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35626 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35627 // result: (XORWload <t> [off] {sym} x ptr mem) 35628 for { 35629 t := v.Type 35630 _ = v.Args[1] 35631 x := v.Args[0] 35632 g := v.Args[1] 35633 if g.Op != OpS390XMOVWZload { 35634 break 35635 } 35636 off := g.AuxInt 35637 sym := g.Aux 35638 _ = g.Args[1] 35639 ptr := g.Args[0] 35640 mem := g.Args[1] 35641 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35642 break 35643 } 35644 v.reset(OpS390XXORWload) 35645 v.Type = t 35646 v.AuxInt = off 35647 v.Aux = sym 35648 v.AddArg(x) 35649 v.AddArg(ptr) 35650 v.AddArg(mem) 35651 return true 35652 } 35653 return false 35654 } 35655 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 35656 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35657 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35658 // result: (XORWload <t> [off] {sym} x ptr mem) 35659 for { 35660 t := v.Type 35661 _ = v.Args[1] 35662 g := v.Args[0] 35663 if g.Op != OpS390XMOVWZload { 35664 break 35665 } 35666 off := g.AuxInt 35667 sym := g.Aux 35668 _ = g.Args[1] 35669 ptr := g.Args[0] 35670 mem := g.Args[1] 35671 x := v.Args[1] 35672 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35673 break 35674 } 35675 v.reset(OpS390XXORWload) 35676 v.Type = t 35677 v.AuxInt = off 35678 v.Aux = sym 35679 v.AddArg(x) 35680 v.AddArg(ptr) 35681 v.AddArg(mem) 35682 return true 35683 } 35684 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 35685 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35686 // result: (XORWload <t> [off] {sym} x ptr mem) 35687 for { 35688 t := v.Type 35689 _ = v.Args[1] 35690 g := v.Args[0] 35691 if g.Op != OpS390XMOVWZload { 35692 break 35693 } 35694 off := g.AuxInt 35695 sym := g.Aux 35696 _ = g.Args[1] 35697 ptr := g.Args[0] 35698 mem := g.Args[1] 35699 x := v.Args[1] 35700 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35701 break 35702 } 35703 v.reset(OpS390XXORWload) 35704 v.Type = t 35705 v.AuxInt = off 35706 v.Aux = sym 35707 v.AddArg(x) 35708 v.AddArg(ptr) 35709 v.AddArg(mem) 35710 return true 35711 } 35712 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 35713 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 35714 // result: (XORWload <t> [off] {sym} x ptr mem) 35715 for { 35716 t := v.Type 35717 _ = v.Args[1] 35718 x := v.Args[0] 35719 g := v.Args[1] 35720 if g.Op != OpS390XMOVWZload { 35721 break 35722 } 35723 off := g.AuxInt 35724 sym := g.Aux 35725 _ = g.Args[1] 35726 ptr := g.Args[0] 35727 mem := g.Args[1] 35728 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 35729 break 35730 } 35731 v.reset(OpS390XXORWload) 35732 v.Type = t 35733 v.AuxInt = off 35734 v.Aux = sym 35735 v.AddArg(x) 35736 v.AddArg(ptr) 35737 v.AddArg(mem) 35738 return true 35739 } 35740 return false 35741 } 35742 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 35743 // match: (XORWconst [c] x) 35744 // cond: int32(c)==0 35745 // result: x 35746 for { 35747 c := v.AuxInt 35748 x := v.Args[0] 35749 if !(int32(c) == 0) { 35750 break 35751 } 35752 v.reset(OpCopy) 35753 v.Type = x.Type 35754 v.AddArg(x) 35755 return true 35756 } 35757 // match: (XORWconst [c] (MOVDconst [d])) 35758 // cond: 35759 // result: (MOVDconst [c^d]) 35760 for { 35761 c := v.AuxInt 35762 v_0 := v.Args[0] 35763 if v_0.Op != OpS390XMOVDconst { 35764 break 35765 } 35766 d := v_0.AuxInt 35767 v.reset(OpS390XMOVDconst) 35768 v.AuxInt = c ^ d 35769 return true 35770 } 35771 return false 35772 } 35773 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 35774 // match: (XORconst [0] x) 35775 // cond: 35776 // result: x 35777 for { 35778 if v.AuxInt != 0 { 35779 break 35780 } 35781 x := v.Args[0] 35782 v.reset(OpCopy) 35783 v.Type = x.Type 35784 v.AddArg(x) 35785 return true 35786 } 35787 // match: (XORconst [c] (MOVDconst [d])) 35788 // cond: 35789 // result: (MOVDconst [c^d]) 35790 for { 35791 c := v.AuxInt 35792 v_0 := v.Args[0] 35793 if v_0.Op != OpS390XMOVDconst { 35794 break 35795 } 35796 d := v_0.AuxInt 35797 v.reset(OpS390XMOVDconst) 35798 v.AuxInt = c ^ d 35799 return true 35800 } 35801 return false 35802 } 35803 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 35804 b := v.Block 35805 _ = b 35806 // match: (Select0 <t> (AddTupleFirst32 val tuple)) 35807 // cond: 35808 // result: (ADDW val (Select0 <t> tuple)) 35809 for { 35810 t := v.Type 35811 v_0 := v.Args[0] 35812 if v_0.Op != OpS390XAddTupleFirst32 { 35813 break 35814 } 35815 _ = v_0.Args[1] 35816 val := v_0.Args[0] 35817 tuple := v_0.Args[1] 35818 v.reset(OpS390XADDW) 35819 v.AddArg(val) 35820 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35821 v0.AddArg(tuple) 35822 v.AddArg(v0) 35823 return true 35824 } 35825 // match: (Select0 <t> (AddTupleFirst64 val tuple)) 35826 // cond: 35827 // result: (ADD val (Select0 <t> tuple)) 35828 for { 35829 t := v.Type 35830 v_0 := v.Args[0] 35831 if v_0.Op != OpS390XAddTupleFirst64 { 35832 break 35833 } 35834 _ = v_0.Args[1] 35835 val := v_0.Args[0] 35836 tuple := v_0.Args[1] 35837 v.reset(OpS390XADD) 35838 v.AddArg(val) 35839 v0 := b.NewValue0(v.Pos, OpSelect0, t) 35840 v0.AddArg(tuple) 35841 v.AddArg(v0) 35842 return true 35843 } 35844 return false 35845 } 35846 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 35847 // match: (Select1 (AddTupleFirst32 _ tuple)) 35848 // cond: 35849 // result: (Select1 tuple) 35850 for { 35851 v_0 := v.Args[0] 35852 if v_0.Op != OpS390XAddTupleFirst32 { 35853 break 35854 } 35855 _ = v_0.Args[1] 35856 tuple := v_0.Args[1] 35857 v.reset(OpSelect1) 35858 v.AddArg(tuple) 35859 return true 35860 } 35861 // match: (Select1 (AddTupleFirst64 _ tuple)) 35862 // cond: 35863 // result: (Select1 tuple) 35864 for { 35865 v_0 := v.Args[0] 35866 if v_0.Op != OpS390XAddTupleFirst64 { 35867 break 35868 } 35869 _ = v_0.Args[1] 35870 tuple := v_0.Args[1] 35871 v.reset(OpSelect1) 35872 v.AddArg(tuple) 35873 return true 35874 } 35875 return false 35876 } 35877 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 35878 // match: (SignExt16to32 x) 35879 // cond: 35880 // result: (MOVHreg x) 35881 for { 35882 x := v.Args[0] 35883 v.reset(OpS390XMOVHreg) 35884 v.AddArg(x) 35885 return true 35886 } 35887 } 35888 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 35889 // match: (SignExt16to64 x) 35890 // cond: 35891 // result: (MOVHreg x) 35892 for { 35893 x := v.Args[0] 35894 v.reset(OpS390XMOVHreg) 35895 v.AddArg(x) 35896 return true 35897 } 35898 } 35899 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 35900 // match: (SignExt32to64 x) 35901 // cond: 35902 // result: (MOVWreg x) 35903 for { 35904 x := v.Args[0] 35905 v.reset(OpS390XMOVWreg) 35906 v.AddArg(x) 35907 return true 35908 } 35909 } 35910 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 35911 // match: (SignExt8to16 x) 35912 // cond: 35913 // result: (MOVBreg x) 35914 for { 35915 x := v.Args[0] 35916 v.reset(OpS390XMOVBreg) 35917 v.AddArg(x) 35918 return true 35919 } 35920 } 35921 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 35922 // match: (SignExt8to32 x) 35923 // cond: 35924 // result: (MOVBreg x) 35925 for { 35926 x := v.Args[0] 35927 v.reset(OpS390XMOVBreg) 35928 v.AddArg(x) 35929 return true 35930 } 35931 } 35932 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 35933 // match: (SignExt8to64 x) 35934 // cond: 35935 // result: (MOVBreg x) 35936 for { 35937 x := v.Args[0] 35938 v.reset(OpS390XMOVBreg) 35939 v.AddArg(x) 35940 return true 35941 } 35942 } 35943 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 35944 b := v.Block 35945 _ = b 35946 // match: (Slicemask <t> x) 35947 // cond: 35948 // result: (SRADconst (NEG <t> x) [63]) 35949 for { 35950 t := v.Type 35951 x := v.Args[0] 35952 v.reset(OpS390XSRADconst) 35953 v.AuxInt = 63 35954 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 35955 v0.AddArg(x) 35956 v.AddArg(v0) 35957 return true 35958 } 35959 } 35960 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 35961 // match: (Sqrt x) 35962 // cond: 35963 // result: (FSQRT x) 35964 for { 35965 x := v.Args[0] 35966 v.reset(OpS390XFSQRT) 35967 v.AddArg(x) 35968 return true 35969 } 35970 } 35971 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 35972 // match: (StaticCall [argwid] {target} mem) 35973 // cond: 35974 // result: (CALLstatic [argwid] {target} mem) 35975 for { 35976 argwid := v.AuxInt 35977 target := v.Aux 35978 mem := v.Args[0] 35979 v.reset(OpS390XCALLstatic) 35980 v.AuxInt = argwid 35981 v.Aux = target 35982 v.AddArg(mem) 35983 return true 35984 } 35985 } 35986 func rewriteValueS390X_OpStore_0(v *Value) bool { 35987 // match: (Store {t} ptr val mem) 35988 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 35989 // result: (FMOVDstore ptr val mem) 35990 for { 35991 t := v.Aux 35992 _ = v.Args[2] 35993 ptr := v.Args[0] 35994 val := v.Args[1] 35995 mem := v.Args[2] 35996 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 35997 break 35998 } 35999 v.reset(OpS390XFMOVDstore) 36000 v.AddArg(ptr) 36001 v.AddArg(val) 36002 v.AddArg(mem) 36003 return true 36004 } 36005 // match: (Store {t} ptr val mem) 36006 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 36007 // result: (FMOVSstore ptr val mem) 36008 for { 36009 t := v.Aux 36010 _ = v.Args[2] 36011 ptr := v.Args[0] 36012 val := v.Args[1] 36013 mem := v.Args[2] 36014 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 36015 break 36016 } 36017 v.reset(OpS390XFMOVSstore) 36018 v.AddArg(ptr) 36019 v.AddArg(val) 36020 v.AddArg(mem) 36021 return true 36022 } 36023 // match: (Store {t} ptr val mem) 36024 // cond: t.(*types.Type).Size() == 8 36025 // result: (MOVDstore ptr val mem) 36026 for { 36027 t := v.Aux 36028 _ = v.Args[2] 36029 ptr := v.Args[0] 36030 val := v.Args[1] 36031 mem := v.Args[2] 36032 if !(t.(*types.Type).Size() == 8) { 36033 break 36034 } 36035 v.reset(OpS390XMOVDstore) 36036 v.AddArg(ptr) 36037 v.AddArg(val) 36038 v.AddArg(mem) 36039 return true 36040 } 36041 // match: (Store {t} ptr val mem) 36042 // cond: t.(*types.Type).Size() == 4 36043 // result: (MOVWstore ptr val mem) 36044 for { 36045 t := v.Aux 36046 _ = v.Args[2] 36047 ptr := v.Args[0] 36048 val := v.Args[1] 36049 mem := v.Args[2] 36050 if !(t.(*types.Type).Size() == 4) { 36051 break 36052 } 36053 v.reset(OpS390XMOVWstore) 36054 v.AddArg(ptr) 36055 v.AddArg(val) 36056 v.AddArg(mem) 36057 return true 36058 } 36059 // match: (Store {t} ptr val mem) 36060 // cond: t.(*types.Type).Size() == 2 36061 // result: (MOVHstore ptr val mem) 36062 for { 36063 t := v.Aux 36064 _ = v.Args[2] 36065 ptr := v.Args[0] 36066 val := v.Args[1] 36067 mem := v.Args[2] 36068 if !(t.(*types.Type).Size() == 2) { 36069 break 36070 } 36071 v.reset(OpS390XMOVHstore) 36072 v.AddArg(ptr) 36073 v.AddArg(val) 36074 v.AddArg(mem) 36075 return true 36076 } 36077 // match: (Store {t} ptr val mem) 36078 // cond: t.(*types.Type).Size() == 1 36079 // result: (MOVBstore ptr val mem) 36080 for { 36081 t := v.Aux 36082 _ = v.Args[2] 36083 ptr := v.Args[0] 36084 val := v.Args[1] 36085 mem := v.Args[2] 36086 if !(t.(*types.Type).Size() == 1) { 36087 break 36088 } 36089 v.reset(OpS390XMOVBstore) 36090 v.AddArg(ptr) 36091 v.AddArg(val) 36092 v.AddArg(mem) 36093 return true 36094 } 36095 return false 36096 } 36097 func rewriteValueS390X_OpSub16_0(v *Value) bool { 36098 // match: (Sub16 x y) 36099 // cond: 36100 // result: (SUBW x y) 36101 for { 36102 _ = v.Args[1] 36103 x := v.Args[0] 36104 y := v.Args[1] 36105 v.reset(OpS390XSUBW) 36106 v.AddArg(x) 36107 v.AddArg(y) 36108 return true 36109 } 36110 } 36111 func rewriteValueS390X_OpSub32_0(v *Value) bool { 36112 // match: (Sub32 x y) 36113 // cond: 36114 // result: (SUBW x y) 36115 for { 36116 _ = v.Args[1] 36117 x := v.Args[0] 36118 y := v.Args[1] 36119 v.reset(OpS390XSUBW) 36120 v.AddArg(x) 36121 v.AddArg(y) 36122 return true 36123 } 36124 } 36125 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 36126 // match: (Sub32F x y) 36127 // cond: 36128 // result: (FSUBS x y) 36129 for { 36130 _ = v.Args[1] 36131 x := v.Args[0] 36132 y := v.Args[1] 36133 v.reset(OpS390XFSUBS) 36134 v.AddArg(x) 36135 v.AddArg(y) 36136 return true 36137 } 36138 } 36139 func rewriteValueS390X_OpSub64_0(v *Value) bool { 36140 // match: (Sub64 x y) 36141 // cond: 36142 // result: (SUB x y) 36143 for { 36144 _ = v.Args[1] 36145 x := v.Args[0] 36146 y := v.Args[1] 36147 v.reset(OpS390XSUB) 36148 v.AddArg(x) 36149 v.AddArg(y) 36150 return true 36151 } 36152 } 36153 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 36154 // match: (Sub64F x y) 36155 // cond: 36156 // result: (FSUB x y) 36157 for { 36158 _ = v.Args[1] 36159 x := v.Args[0] 36160 y := v.Args[1] 36161 v.reset(OpS390XFSUB) 36162 v.AddArg(x) 36163 v.AddArg(y) 36164 return true 36165 } 36166 } 36167 func rewriteValueS390X_OpSub8_0(v *Value) bool { 36168 // match: (Sub8 x y) 36169 // cond: 36170 // result: (SUBW x y) 36171 for { 36172 _ = v.Args[1] 36173 x := v.Args[0] 36174 y := v.Args[1] 36175 v.reset(OpS390XSUBW) 36176 v.AddArg(x) 36177 v.AddArg(y) 36178 return true 36179 } 36180 } 36181 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 36182 // match: (SubPtr x y) 36183 // cond: 36184 // result: (SUB x y) 36185 for { 36186 _ = v.Args[1] 36187 x := v.Args[0] 36188 y := v.Args[1] 36189 v.reset(OpS390XSUB) 36190 v.AddArg(x) 36191 v.AddArg(y) 36192 return true 36193 } 36194 } 36195 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 36196 // match: (Trunc16to8 x) 36197 // cond: 36198 // result: x 36199 for { 36200 x := v.Args[0] 36201 v.reset(OpCopy) 36202 v.Type = x.Type 36203 v.AddArg(x) 36204 return true 36205 } 36206 } 36207 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 36208 // match: (Trunc32to16 x) 36209 // cond: 36210 // result: x 36211 for { 36212 x := v.Args[0] 36213 v.reset(OpCopy) 36214 v.Type = x.Type 36215 v.AddArg(x) 36216 return true 36217 } 36218 } 36219 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 36220 // match: (Trunc32to8 x) 36221 // cond: 36222 // result: x 36223 for { 36224 x := v.Args[0] 36225 v.reset(OpCopy) 36226 v.Type = x.Type 36227 v.AddArg(x) 36228 return true 36229 } 36230 } 36231 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 36232 // match: (Trunc64to16 x) 36233 // cond: 36234 // result: x 36235 for { 36236 x := v.Args[0] 36237 v.reset(OpCopy) 36238 v.Type = x.Type 36239 v.AddArg(x) 36240 return true 36241 } 36242 } 36243 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 36244 // match: (Trunc64to32 x) 36245 // cond: 36246 // result: x 36247 for { 36248 x := v.Args[0] 36249 v.reset(OpCopy) 36250 v.Type = x.Type 36251 v.AddArg(x) 36252 return true 36253 } 36254 } 36255 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 36256 // match: (Trunc64to8 x) 36257 // cond: 36258 // result: x 36259 for { 36260 x := v.Args[0] 36261 v.reset(OpCopy) 36262 v.Type = x.Type 36263 v.AddArg(x) 36264 return true 36265 } 36266 } 36267 func rewriteValueS390X_OpXor16_0(v *Value) bool { 36268 // match: (Xor16 x y) 36269 // cond: 36270 // result: (XORW x y) 36271 for { 36272 _ = v.Args[1] 36273 x := v.Args[0] 36274 y := v.Args[1] 36275 v.reset(OpS390XXORW) 36276 v.AddArg(x) 36277 v.AddArg(y) 36278 return true 36279 } 36280 } 36281 func rewriteValueS390X_OpXor32_0(v *Value) bool { 36282 // match: (Xor32 x y) 36283 // cond: 36284 // result: (XORW x y) 36285 for { 36286 _ = v.Args[1] 36287 x := v.Args[0] 36288 y := v.Args[1] 36289 v.reset(OpS390XXORW) 36290 v.AddArg(x) 36291 v.AddArg(y) 36292 return true 36293 } 36294 } 36295 func rewriteValueS390X_OpXor64_0(v *Value) bool { 36296 // match: (Xor64 x y) 36297 // cond: 36298 // result: (XOR x y) 36299 for { 36300 _ = v.Args[1] 36301 x := v.Args[0] 36302 y := v.Args[1] 36303 v.reset(OpS390XXOR) 36304 v.AddArg(x) 36305 v.AddArg(y) 36306 return true 36307 } 36308 } 36309 func rewriteValueS390X_OpXor8_0(v *Value) bool { 36310 // match: (Xor8 x y) 36311 // cond: 36312 // result: (XORW x y) 36313 for { 36314 _ = v.Args[1] 36315 x := v.Args[0] 36316 y := v.Args[1] 36317 v.reset(OpS390XXORW) 36318 v.AddArg(x) 36319 v.AddArg(y) 36320 return true 36321 } 36322 } 36323 func rewriteValueS390X_OpZero_0(v *Value) bool { 36324 b := v.Block 36325 _ = b 36326 // match: (Zero [0] _ mem) 36327 // cond: 36328 // result: mem 36329 for { 36330 if v.AuxInt != 0 { 36331 break 36332 } 36333 _ = v.Args[1] 36334 mem := v.Args[1] 36335 v.reset(OpCopy) 36336 v.Type = mem.Type 36337 v.AddArg(mem) 36338 return true 36339 } 36340 // match: (Zero [1] destptr mem) 36341 // cond: 36342 // result: (MOVBstoreconst [0] destptr mem) 36343 for { 36344 if v.AuxInt != 1 { 36345 break 36346 } 36347 _ = v.Args[1] 36348 destptr := v.Args[0] 36349 mem := v.Args[1] 36350 v.reset(OpS390XMOVBstoreconst) 36351 v.AuxInt = 0 36352 v.AddArg(destptr) 36353 v.AddArg(mem) 36354 return true 36355 } 36356 // match: (Zero [2] destptr mem) 36357 // cond: 36358 // result: (MOVHstoreconst [0] destptr mem) 36359 for { 36360 if v.AuxInt != 2 { 36361 break 36362 } 36363 _ = v.Args[1] 36364 destptr := v.Args[0] 36365 mem := v.Args[1] 36366 v.reset(OpS390XMOVHstoreconst) 36367 v.AuxInt = 0 36368 v.AddArg(destptr) 36369 v.AddArg(mem) 36370 return true 36371 } 36372 // match: (Zero [4] destptr mem) 36373 // cond: 36374 // result: (MOVWstoreconst [0] destptr mem) 36375 for { 36376 if v.AuxInt != 4 { 36377 break 36378 } 36379 _ = v.Args[1] 36380 destptr := v.Args[0] 36381 mem := v.Args[1] 36382 v.reset(OpS390XMOVWstoreconst) 36383 v.AuxInt = 0 36384 v.AddArg(destptr) 36385 v.AddArg(mem) 36386 return true 36387 } 36388 // match: (Zero [8] destptr mem) 36389 // cond: 36390 // result: (MOVDstoreconst [0] destptr mem) 36391 for { 36392 if v.AuxInt != 8 { 36393 break 36394 } 36395 _ = v.Args[1] 36396 destptr := v.Args[0] 36397 mem := v.Args[1] 36398 v.reset(OpS390XMOVDstoreconst) 36399 v.AuxInt = 0 36400 v.AddArg(destptr) 36401 v.AddArg(mem) 36402 return true 36403 } 36404 // match: (Zero [3] destptr mem) 36405 // cond: 36406 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 36407 for { 36408 if v.AuxInt != 3 { 36409 break 36410 } 36411 _ = v.Args[1] 36412 destptr := v.Args[0] 36413 mem := v.Args[1] 36414 v.reset(OpS390XMOVBstoreconst) 36415 v.AuxInt = makeValAndOff(0, 2) 36416 v.AddArg(destptr) 36417 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, types.TypeMem) 36418 v0.AuxInt = 0 36419 v0.AddArg(destptr) 36420 v0.AddArg(mem) 36421 v.AddArg(v0) 36422 return true 36423 } 36424 // match: (Zero [5] destptr mem) 36425 // cond: 36426 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36427 for { 36428 if v.AuxInt != 5 { 36429 break 36430 } 36431 _ = v.Args[1] 36432 destptr := v.Args[0] 36433 mem := v.Args[1] 36434 v.reset(OpS390XMOVBstoreconst) 36435 v.AuxInt = makeValAndOff(0, 4) 36436 v.AddArg(destptr) 36437 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36438 v0.AuxInt = 0 36439 v0.AddArg(destptr) 36440 v0.AddArg(mem) 36441 v.AddArg(v0) 36442 return true 36443 } 36444 // match: (Zero [6] destptr mem) 36445 // cond: 36446 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 36447 for { 36448 if v.AuxInt != 6 { 36449 break 36450 } 36451 _ = v.Args[1] 36452 destptr := v.Args[0] 36453 mem := v.Args[1] 36454 v.reset(OpS390XMOVHstoreconst) 36455 v.AuxInt = makeValAndOff(0, 4) 36456 v.AddArg(destptr) 36457 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36458 v0.AuxInt = 0 36459 v0.AddArg(destptr) 36460 v0.AddArg(mem) 36461 v.AddArg(v0) 36462 return true 36463 } 36464 // match: (Zero [7] destptr mem) 36465 // cond: 36466 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 36467 for { 36468 if v.AuxInt != 7 { 36469 break 36470 } 36471 _ = v.Args[1] 36472 destptr := v.Args[0] 36473 mem := v.Args[1] 36474 v.reset(OpS390XMOVWstoreconst) 36475 v.AuxInt = makeValAndOff(0, 3) 36476 v.AddArg(destptr) 36477 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, types.TypeMem) 36478 v0.AuxInt = 0 36479 v0.AddArg(destptr) 36480 v0.AddArg(mem) 36481 v.AddArg(v0) 36482 return true 36483 } 36484 // match: (Zero [s] destptr mem) 36485 // cond: s > 0 && s <= 1024 36486 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 36487 for { 36488 s := v.AuxInt 36489 _ = v.Args[1] 36490 destptr := v.Args[0] 36491 mem := v.Args[1] 36492 if !(s > 0 && s <= 1024) { 36493 break 36494 } 36495 v.reset(OpS390XCLEAR) 36496 v.AuxInt = makeValAndOff(s, 0) 36497 v.AddArg(destptr) 36498 v.AddArg(mem) 36499 return true 36500 } 36501 return false 36502 } 36503 func rewriteValueS390X_OpZero_10(v *Value) bool { 36504 b := v.Block 36505 _ = b 36506 // match: (Zero [s] destptr mem) 36507 // cond: s > 1024 36508 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 36509 for { 36510 s := v.AuxInt 36511 _ = v.Args[1] 36512 destptr := v.Args[0] 36513 mem := v.Args[1] 36514 if !(s > 1024) { 36515 break 36516 } 36517 v.reset(OpS390XLoweredZero) 36518 v.AuxInt = s % 256 36519 v.AddArg(destptr) 36520 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 36521 v0.AuxInt = (s / 256) * 256 36522 v0.AddArg(destptr) 36523 v.AddArg(v0) 36524 v.AddArg(mem) 36525 return true 36526 } 36527 return false 36528 } 36529 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 36530 // match: (ZeroExt16to32 x) 36531 // cond: 36532 // result: (MOVHZreg x) 36533 for { 36534 x := v.Args[0] 36535 v.reset(OpS390XMOVHZreg) 36536 v.AddArg(x) 36537 return true 36538 } 36539 } 36540 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 36541 // match: (ZeroExt16to64 x) 36542 // cond: 36543 // result: (MOVHZreg x) 36544 for { 36545 x := v.Args[0] 36546 v.reset(OpS390XMOVHZreg) 36547 v.AddArg(x) 36548 return true 36549 } 36550 } 36551 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 36552 // match: (ZeroExt32to64 x) 36553 // cond: 36554 // result: (MOVWZreg x) 36555 for { 36556 x := v.Args[0] 36557 v.reset(OpS390XMOVWZreg) 36558 v.AddArg(x) 36559 return true 36560 } 36561 } 36562 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 36563 // match: (ZeroExt8to16 x) 36564 // cond: 36565 // result: (MOVBZreg x) 36566 for { 36567 x := v.Args[0] 36568 v.reset(OpS390XMOVBZreg) 36569 v.AddArg(x) 36570 return true 36571 } 36572 } 36573 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 36574 // match: (ZeroExt8to32 x) 36575 // cond: 36576 // result: (MOVBZreg x) 36577 for { 36578 x := v.Args[0] 36579 v.reset(OpS390XMOVBZreg) 36580 v.AddArg(x) 36581 return true 36582 } 36583 } 36584 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 36585 // match: (ZeroExt8to64 x) 36586 // cond: 36587 // result: (MOVBZreg x) 36588 for { 36589 x := v.Args[0] 36590 v.reset(OpS390XMOVBZreg) 36591 v.AddArg(x) 36592 return true 36593 } 36594 } 36595 func rewriteBlockS390X(b *Block) bool { 36596 config := b.Func.Config 36597 _ = config 36598 fe := b.Func.fe 36599 _ = fe 36600 typ := &config.Types 36601 _ = typ 36602 switch b.Kind { 36603 case BlockS390XEQ: 36604 // match: (EQ (InvertFlags cmp) yes no) 36605 // cond: 36606 // result: (EQ cmp yes no) 36607 for { 36608 v := b.Control 36609 if v.Op != OpS390XInvertFlags { 36610 break 36611 } 36612 cmp := v.Args[0] 36613 b.Kind = BlockS390XEQ 36614 b.SetControl(cmp) 36615 return true 36616 } 36617 // match: (EQ (FlagEQ) yes no) 36618 // cond: 36619 // result: (First nil yes no) 36620 for { 36621 v := b.Control 36622 if v.Op != OpS390XFlagEQ { 36623 break 36624 } 36625 b.Kind = BlockFirst 36626 b.SetControl(nil) 36627 return true 36628 } 36629 // match: (EQ (FlagLT) yes no) 36630 // cond: 36631 // result: (First nil no yes) 36632 for { 36633 v := b.Control 36634 if v.Op != OpS390XFlagLT { 36635 break 36636 } 36637 b.Kind = BlockFirst 36638 b.SetControl(nil) 36639 b.swapSuccessors() 36640 return true 36641 } 36642 // match: (EQ (FlagGT) yes no) 36643 // cond: 36644 // result: (First nil no yes) 36645 for { 36646 v := b.Control 36647 if v.Op != OpS390XFlagGT { 36648 break 36649 } 36650 b.Kind = BlockFirst 36651 b.SetControl(nil) 36652 b.swapSuccessors() 36653 return true 36654 } 36655 case BlockS390XGE: 36656 // match: (GE (InvertFlags cmp) yes no) 36657 // cond: 36658 // result: (LE cmp yes no) 36659 for { 36660 v := b.Control 36661 if v.Op != OpS390XInvertFlags { 36662 break 36663 } 36664 cmp := v.Args[0] 36665 b.Kind = BlockS390XLE 36666 b.SetControl(cmp) 36667 return true 36668 } 36669 // match: (GE (FlagEQ) yes no) 36670 // cond: 36671 // result: (First nil yes no) 36672 for { 36673 v := b.Control 36674 if v.Op != OpS390XFlagEQ { 36675 break 36676 } 36677 b.Kind = BlockFirst 36678 b.SetControl(nil) 36679 return true 36680 } 36681 // match: (GE (FlagLT) yes no) 36682 // cond: 36683 // result: (First nil no yes) 36684 for { 36685 v := b.Control 36686 if v.Op != OpS390XFlagLT { 36687 break 36688 } 36689 b.Kind = BlockFirst 36690 b.SetControl(nil) 36691 b.swapSuccessors() 36692 return true 36693 } 36694 // match: (GE (FlagGT) yes no) 36695 // cond: 36696 // result: (First nil yes no) 36697 for { 36698 v := b.Control 36699 if v.Op != OpS390XFlagGT { 36700 break 36701 } 36702 b.Kind = BlockFirst 36703 b.SetControl(nil) 36704 return true 36705 } 36706 case BlockS390XGT: 36707 // match: (GT (InvertFlags cmp) yes no) 36708 // cond: 36709 // result: (LT cmp yes no) 36710 for { 36711 v := b.Control 36712 if v.Op != OpS390XInvertFlags { 36713 break 36714 } 36715 cmp := v.Args[0] 36716 b.Kind = BlockS390XLT 36717 b.SetControl(cmp) 36718 return true 36719 } 36720 // match: (GT (FlagEQ) yes no) 36721 // cond: 36722 // result: (First nil no yes) 36723 for { 36724 v := b.Control 36725 if v.Op != OpS390XFlagEQ { 36726 break 36727 } 36728 b.Kind = BlockFirst 36729 b.SetControl(nil) 36730 b.swapSuccessors() 36731 return true 36732 } 36733 // match: (GT (FlagLT) yes no) 36734 // cond: 36735 // result: (First nil no yes) 36736 for { 36737 v := b.Control 36738 if v.Op != OpS390XFlagLT { 36739 break 36740 } 36741 b.Kind = BlockFirst 36742 b.SetControl(nil) 36743 b.swapSuccessors() 36744 return true 36745 } 36746 // match: (GT (FlagGT) yes no) 36747 // cond: 36748 // result: (First nil yes no) 36749 for { 36750 v := b.Control 36751 if v.Op != OpS390XFlagGT { 36752 break 36753 } 36754 b.Kind = BlockFirst 36755 b.SetControl(nil) 36756 return true 36757 } 36758 case BlockIf: 36759 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36760 // cond: 36761 // result: (LT cmp yes no) 36762 for { 36763 v := b.Control 36764 if v.Op != OpS390XMOVDLT { 36765 break 36766 } 36767 _ = v.Args[2] 36768 v_0 := v.Args[0] 36769 if v_0.Op != OpS390XMOVDconst { 36770 break 36771 } 36772 if v_0.AuxInt != 0 { 36773 break 36774 } 36775 v_1 := v.Args[1] 36776 if v_1.Op != OpS390XMOVDconst { 36777 break 36778 } 36779 if v_1.AuxInt != 1 { 36780 break 36781 } 36782 cmp := v.Args[2] 36783 b.Kind = BlockS390XLT 36784 b.SetControl(cmp) 36785 return true 36786 } 36787 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36788 // cond: 36789 // result: (LE cmp yes no) 36790 for { 36791 v := b.Control 36792 if v.Op != OpS390XMOVDLE { 36793 break 36794 } 36795 _ = v.Args[2] 36796 v_0 := v.Args[0] 36797 if v_0.Op != OpS390XMOVDconst { 36798 break 36799 } 36800 if v_0.AuxInt != 0 { 36801 break 36802 } 36803 v_1 := v.Args[1] 36804 if v_1.Op != OpS390XMOVDconst { 36805 break 36806 } 36807 if v_1.AuxInt != 1 { 36808 break 36809 } 36810 cmp := v.Args[2] 36811 b.Kind = BlockS390XLE 36812 b.SetControl(cmp) 36813 return true 36814 } 36815 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36816 // cond: 36817 // result: (GT cmp yes no) 36818 for { 36819 v := b.Control 36820 if v.Op != OpS390XMOVDGT { 36821 break 36822 } 36823 _ = v.Args[2] 36824 v_0 := v.Args[0] 36825 if v_0.Op != OpS390XMOVDconst { 36826 break 36827 } 36828 if v_0.AuxInt != 0 { 36829 break 36830 } 36831 v_1 := v.Args[1] 36832 if v_1.Op != OpS390XMOVDconst { 36833 break 36834 } 36835 if v_1.AuxInt != 1 { 36836 break 36837 } 36838 cmp := v.Args[2] 36839 b.Kind = BlockS390XGT 36840 b.SetControl(cmp) 36841 return true 36842 } 36843 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36844 // cond: 36845 // result: (GE cmp yes no) 36846 for { 36847 v := b.Control 36848 if v.Op != OpS390XMOVDGE { 36849 break 36850 } 36851 _ = v.Args[2] 36852 v_0 := v.Args[0] 36853 if v_0.Op != OpS390XMOVDconst { 36854 break 36855 } 36856 if v_0.AuxInt != 0 { 36857 break 36858 } 36859 v_1 := v.Args[1] 36860 if v_1.Op != OpS390XMOVDconst { 36861 break 36862 } 36863 if v_1.AuxInt != 1 { 36864 break 36865 } 36866 cmp := v.Args[2] 36867 b.Kind = BlockS390XGE 36868 b.SetControl(cmp) 36869 return true 36870 } 36871 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36872 // cond: 36873 // result: (EQ cmp yes no) 36874 for { 36875 v := b.Control 36876 if v.Op != OpS390XMOVDEQ { 36877 break 36878 } 36879 _ = v.Args[2] 36880 v_0 := v.Args[0] 36881 if v_0.Op != OpS390XMOVDconst { 36882 break 36883 } 36884 if v_0.AuxInt != 0 { 36885 break 36886 } 36887 v_1 := v.Args[1] 36888 if v_1.Op != OpS390XMOVDconst { 36889 break 36890 } 36891 if v_1.AuxInt != 1 { 36892 break 36893 } 36894 cmp := v.Args[2] 36895 b.Kind = BlockS390XEQ 36896 b.SetControl(cmp) 36897 return true 36898 } 36899 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36900 // cond: 36901 // result: (NE cmp yes no) 36902 for { 36903 v := b.Control 36904 if v.Op != OpS390XMOVDNE { 36905 break 36906 } 36907 _ = v.Args[2] 36908 v_0 := v.Args[0] 36909 if v_0.Op != OpS390XMOVDconst { 36910 break 36911 } 36912 if v_0.AuxInt != 0 { 36913 break 36914 } 36915 v_1 := v.Args[1] 36916 if v_1.Op != OpS390XMOVDconst { 36917 break 36918 } 36919 if v_1.AuxInt != 1 { 36920 break 36921 } 36922 cmp := v.Args[2] 36923 b.Kind = BlockS390XNE 36924 b.SetControl(cmp) 36925 return true 36926 } 36927 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36928 // cond: 36929 // result: (GTF cmp yes no) 36930 for { 36931 v := b.Control 36932 if v.Op != OpS390XMOVDGTnoinv { 36933 break 36934 } 36935 _ = v.Args[2] 36936 v_0 := v.Args[0] 36937 if v_0.Op != OpS390XMOVDconst { 36938 break 36939 } 36940 if v_0.AuxInt != 0 { 36941 break 36942 } 36943 v_1 := v.Args[1] 36944 if v_1.Op != OpS390XMOVDconst { 36945 break 36946 } 36947 if v_1.AuxInt != 1 { 36948 break 36949 } 36950 cmp := v.Args[2] 36951 b.Kind = BlockS390XGTF 36952 b.SetControl(cmp) 36953 return true 36954 } 36955 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 36956 // cond: 36957 // result: (GEF cmp yes no) 36958 for { 36959 v := b.Control 36960 if v.Op != OpS390XMOVDGEnoinv { 36961 break 36962 } 36963 _ = v.Args[2] 36964 v_0 := v.Args[0] 36965 if v_0.Op != OpS390XMOVDconst { 36966 break 36967 } 36968 if v_0.AuxInt != 0 { 36969 break 36970 } 36971 v_1 := v.Args[1] 36972 if v_1.Op != OpS390XMOVDconst { 36973 break 36974 } 36975 if v_1.AuxInt != 1 { 36976 break 36977 } 36978 cmp := v.Args[2] 36979 b.Kind = BlockS390XGEF 36980 b.SetControl(cmp) 36981 return true 36982 } 36983 // match: (If cond yes no) 36984 // cond: 36985 // result: (NE (CMPWconst [0] (MOVBZreg <typ.Bool> cond)) yes no) 36986 for { 36987 v := b.Control 36988 _ = v 36989 cond := b.Control 36990 b.Kind = BlockS390XNE 36991 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) 36992 v0.AuxInt = 0 36993 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.Bool) 36994 v1.AddArg(cond) 36995 v0.AddArg(v1) 36996 b.SetControl(v0) 36997 return true 36998 } 36999 case BlockS390XLE: 37000 // match: (LE (InvertFlags cmp) yes no) 37001 // cond: 37002 // result: (GE cmp yes no) 37003 for { 37004 v := b.Control 37005 if v.Op != OpS390XInvertFlags { 37006 break 37007 } 37008 cmp := v.Args[0] 37009 b.Kind = BlockS390XGE 37010 b.SetControl(cmp) 37011 return true 37012 } 37013 // match: (LE (FlagEQ) yes no) 37014 // cond: 37015 // result: (First nil yes no) 37016 for { 37017 v := b.Control 37018 if v.Op != OpS390XFlagEQ { 37019 break 37020 } 37021 b.Kind = BlockFirst 37022 b.SetControl(nil) 37023 return true 37024 } 37025 // match: (LE (FlagLT) yes no) 37026 // cond: 37027 // result: (First nil yes no) 37028 for { 37029 v := b.Control 37030 if v.Op != OpS390XFlagLT { 37031 break 37032 } 37033 b.Kind = BlockFirst 37034 b.SetControl(nil) 37035 return true 37036 } 37037 // match: (LE (FlagGT) yes no) 37038 // cond: 37039 // result: (First nil no yes) 37040 for { 37041 v := b.Control 37042 if v.Op != OpS390XFlagGT { 37043 break 37044 } 37045 b.Kind = BlockFirst 37046 b.SetControl(nil) 37047 b.swapSuccessors() 37048 return true 37049 } 37050 case BlockS390XLT: 37051 // match: (LT (InvertFlags cmp) yes no) 37052 // cond: 37053 // result: (GT cmp yes no) 37054 for { 37055 v := b.Control 37056 if v.Op != OpS390XInvertFlags { 37057 break 37058 } 37059 cmp := v.Args[0] 37060 b.Kind = BlockS390XGT 37061 b.SetControl(cmp) 37062 return true 37063 } 37064 // match: (LT (FlagEQ) yes no) 37065 // cond: 37066 // result: (First nil no yes) 37067 for { 37068 v := b.Control 37069 if v.Op != OpS390XFlagEQ { 37070 break 37071 } 37072 b.Kind = BlockFirst 37073 b.SetControl(nil) 37074 b.swapSuccessors() 37075 return true 37076 } 37077 // match: (LT (FlagLT) yes no) 37078 // cond: 37079 // result: (First nil yes no) 37080 for { 37081 v := b.Control 37082 if v.Op != OpS390XFlagLT { 37083 break 37084 } 37085 b.Kind = BlockFirst 37086 b.SetControl(nil) 37087 return true 37088 } 37089 // match: (LT (FlagGT) yes no) 37090 // cond: 37091 // result: (First nil no yes) 37092 for { 37093 v := b.Control 37094 if v.Op != OpS390XFlagGT { 37095 break 37096 } 37097 b.Kind = BlockFirst 37098 b.SetControl(nil) 37099 b.swapSuccessors() 37100 return true 37101 } 37102 case BlockS390XNE: 37103 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37104 // cond: 37105 // result: (LT cmp yes no) 37106 for { 37107 v := b.Control 37108 if v.Op != OpS390XCMPWconst { 37109 break 37110 } 37111 if v.AuxInt != 0 { 37112 break 37113 } 37114 v_0 := v.Args[0] 37115 if v_0.Op != OpS390XMOVDLT { 37116 break 37117 } 37118 _ = v_0.Args[2] 37119 v_0_0 := v_0.Args[0] 37120 if v_0_0.Op != OpS390XMOVDconst { 37121 break 37122 } 37123 if v_0_0.AuxInt != 0 { 37124 break 37125 } 37126 v_0_1 := v_0.Args[1] 37127 if v_0_1.Op != OpS390XMOVDconst { 37128 break 37129 } 37130 if v_0_1.AuxInt != 1 { 37131 break 37132 } 37133 cmp := v_0.Args[2] 37134 b.Kind = BlockS390XLT 37135 b.SetControl(cmp) 37136 return true 37137 } 37138 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37139 // cond: 37140 // result: (LE cmp yes no) 37141 for { 37142 v := b.Control 37143 if v.Op != OpS390XCMPWconst { 37144 break 37145 } 37146 if v.AuxInt != 0 { 37147 break 37148 } 37149 v_0 := v.Args[0] 37150 if v_0.Op != OpS390XMOVDLE { 37151 break 37152 } 37153 _ = v_0.Args[2] 37154 v_0_0 := v_0.Args[0] 37155 if v_0_0.Op != OpS390XMOVDconst { 37156 break 37157 } 37158 if v_0_0.AuxInt != 0 { 37159 break 37160 } 37161 v_0_1 := v_0.Args[1] 37162 if v_0_1.Op != OpS390XMOVDconst { 37163 break 37164 } 37165 if v_0_1.AuxInt != 1 { 37166 break 37167 } 37168 cmp := v_0.Args[2] 37169 b.Kind = BlockS390XLE 37170 b.SetControl(cmp) 37171 return true 37172 } 37173 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37174 // cond: 37175 // result: (GT cmp yes no) 37176 for { 37177 v := b.Control 37178 if v.Op != OpS390XCMPWconst { 37179 break 37180 } 37181 if v.AuxInt != 0 { 37182 break 37183 } 37184 v_0 := v.Args[0] 37185 if v_0.Op != OpS390XMOVDGT { 37186 break 37187 } 37188 _ = v_0.Args[2] 37189 v_0_0 := v_0.Args[0] 37190 if v_0_0.Op != OpS390XMOVDconst { 37191 break 37192 } 37193 if v_0_0.AuxInt != 0 { 37194 break 37195 } 37196 v_0_1 := v_0.Args[1] 37197 if v_0_1.Op != OpS390XMOVDconst { 37198 break 37199 } 37200 if v_0_1.AuxInt != 1 { 37201 break 37202 } 37203 cmp := v_0.Args[2] 37204 b.Kind = BlockS390XGT 37205 b.SetControl(cmp) 37206 return true 37207 } 37208 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37209 // cond: 37210 // result: (GE cmp yes no) 37211 for { 37212 v := b.Control 37213 if v.Op != OpS390XCMPWconst { 37214 break 37215 } 37216 if v.AuxInt != 0 { 37217 break 37218 } 37219 v_0 := v.Args[0] 37220 if v_0.Op != OpS390XMOVDGE { 37221 break 37222 } 37223 _ = v_0.Args[2] 37224 v_0_0 := v_0.Args[0] 37225 if v_0_0.Op != OpS390XMOVDconst { 37226 break 37227 } 37228 if v_0_0.AuxInt != 0 { 37229 break 37230 } 37231 v_0_1 := v_0.Args[1] 37232 if v_0_1.Op != OpS390XMOVDconst { 37233 break 37234 } 37235 if v_0_1.AuxInt != 1 { 37236 break 37237 } 37238 cmp := v_0.Args[2] 37239 b.Kind = BlockS390XGE 37240 b.SetControl(cmp) 37241 return true 37242 } 37243 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37244 // cond: 37245 // result: (EQ 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 != OpS390XMOVDEQ { 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 = BlockS390XEQ 37275 b.SetControl(cmp) 37276 return true 37277 } 37278 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37279 // cond: 37280 // result: (NE cmp yes no) 37281 for { 37282 v := b.Control 37283 if v.Op != OpS390XCMPWconst { 37284 break 37285 } 37286 if v.AuxInt != 0 { 37287 break 37288 } 37289 v_0 := v.Args[0] 37290 if v_0.Op != OpS390XMOVDNE { 37291 break 37292 } 37293 _ = v_0.Args[2] 37294 v_0_0 := v_0.Args[0] 37295 if v_0_0.Op != OpS390XMOVDconst { 37296 break 37297 } 37298 if v_0_0.AuxInt != 0 { 37299 break 37300 } 37301 v_0_1 := v_0.Args[1] 37302 if v_0_1.Op != OpS390XMOVDconst { 37303 break 37304 } 37305 if v_0_1.AuxInt != 1 { 37306 break 37307 } 37308 cmp := v_0.Args[2] 37309 b.Kind = BlockS390XNE 37310 b.SetControl(cmp) 37311 return true 37312 } 37313 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37314 // cond: 37315 // result: (GTF cmp yes no) 37316 for { 37317 v := b.Control 37318 if v.Op != OpS390XCMPWconst { 37319 break 37320 } 37321 if v.AuxInt != 0 { 37322 break 37323 } 37324 v_0 := v.Args[0] 37325 if v_0.Op != OpS390XMOVDGTnoinv { 37326 break 37327 } 37328 _ = v_0.Args[2] 37329 v_0_0 := v_0.Args[0] 37330 if v_0_0.Op != OpS390XMOVDconst { 37331 break 37332 } 37333 if v_0_0.AuxInt != 0 { 37334 break 37335 } 37336 v_0_1 := v_0.Args[1] 37337 if v_0_1.Op != OpS390XMOVDconst { 37338 break 37339 } 37340 if v_0_1.AuxInt != 1 { 37341 break 37342 } 37343 cmp := v_0.Args[2] 37344 b.Kind = BlockS390XGTF 37345 b.SetControl(cmp) 37346 return true 37347 } 37348 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 37349 // cond: 37350 // result: (GEF cmp yes no) 37351 for { 37352 v := b.Control 37353 if v.Op != OpS390XCMPWconst { 37354 break 37355 } 37356 if v.AuxInt != 0 { 37357 break 37358 } 37359 v_0 := v.Args[0] 37360 if v_0.Op != OpS390XMOVDGEnoinv { 37361 break 37362 } 37363 _ = v_0.Args[2] 37364 v_0_0 := v_0.Args[0] 37365 if v_0_0.Op != OpS390XMOVDconst { 37366 break 37367 } 37368 if v_0_0.AuxInt != 0 { 37369 break 37370 } 37371 v_0_1 := v_0.Args[1] 37372 if v_0_1.Op != OpS390XMOVDconst { 37373 break 37374 } 37375 if v_0_1.AuxInt != 1 { 37376 break 37377 } 37378 cmp := v_0.Args[2] 37379 b.Kind = BlockS390XGEF 37380 b.SetControl(cmp) 37381 return true 37382 } 37383 // match: (NE (InvertFlags cmp) yes no) 37384 // cond: 37385 // result: (NE cmp yes no) 37386 for { 37387 v := b.Control 37388 if v.Op != OpS390XInvertFlags { 37389 break 37390 } 37391 cmp := v.Args[0] 37392 b.Kind = BlockS390XNE 37393 b.SetControl(cmp) 37394 return true 37395 } 37396 // match: (NE (FlagEQ) yes no) 37397 // cond: 37398 // result: (First nil no yes) 37399 for { 37400 v := b.Control 37401 if v.Op != OpS390XFlagEQ { 37402 break 37403 } 37404 b.Kind = BlockFirst 37405 b.SetControl(nil) 37406 b.swapSuccessors() 37407 return true 37408 } 37409 // match: (NE (FlagLT) yes no) 37410 // cond: 37411 // result: (First nil yes no) 37412 for { 37413 v := b.Control 37414 if v.Op != OpS390XFlagLT { 37415 break 37416 } 37417 b.Kind = BlockFirst 37418 b.SetControl(nil) 37419 return true 37420 } 37421 // match: (NE (FlagGT) yes no) 37422 // cond: 37423 // result: (First nil yes no) 37424 for { 37425 v := b.Control 37426 if v.Op != OpS390XFlagGT { 37427 break 37428 } 37429 b.Kind = BlockFirst 37430 b.SetControl(nil) 37431 return true 37432 } 37433 } 37434 return false 37435 }