github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/cmd/compile/internal/ssa/rewriteARM64.go (about) 1 // Code generated from gen/ARM64.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 9 var _ = math.MinInt8 // in case not otherwise used 10 var _ = obj.ANOP // in case not otherwise used 11 func rewriteValueARM64(v *Value) bool { 12 switch v.Op { 13 case OpARM64ADD: 14 return rewriteValueARM64_OpARM64ADD(v) 15 case OpARM64ADDconst: 16 return rewriteValueARM64_OpARM64ADDconst(v) 17 case OpARM64ADDshiftLL: 18 return rewriteValueARM64_OpARM64ADDshiftLL(v) 19 case OpARM64ADDshiftRA: 20 return rewriteValueARM64_OpARM64ADDshiftRA(v) 21 case OpARM64ADDshiftRL: 22 return rewriteValueARM64_OpARM64ADDshiftRL(v) 23 case OpARM64AND: 24 return rewriteValueARM64_OpARM64AND(v) 25 case OpARM64ANDconst: 26 return rewriteValueARM64_OpARM64ANDconst(v) 27 case OpARM64ANDshiftLL: 28 return rewriteValueARM64_OpARM64ANDshiftLL(v) 29 case OpARM64ANDshiftRA: 30 return rewriteValueARM64_OpARM64ANDshiftRA(v) 31 case OpARM64ANDshiftRL: 32 return rewriteValueARM64_OpARM64ANDshiftRL(v) 33 case OpARM64BIC: 34 return rewriteValueARM64_OpARM64BIC(v) 35 case OpARM64BICconst: 36 return rewriteValueARM64_OpARM64BICconst(v) 37 case OpARM64BICshiftLL: 38 return rewriteValueARM64_OpARM64BICshiftLL(v) 39 case OpARM64BICshiftRA: 40 return rewriteValueARM64_OpARM64BICshiftRA(v) 41 case OpARM64BICshiftRL: 42 return rewriteValueARM64_OpARM64BICshiftRL(v) 43 case OpARM64CMP: 44 return rewriteValueARM64_OpARM64CMP(v) 45 case OpARM64CMPW: 46 return rewriteValueARM64_OpARM64CMPW(v) 47 case OpARM64CMPWconst: 48 return rewriteValueARM64_OpARM64CMPWconst(v) 49 case OpARM64CMPconst: 50 return rewriteValueARM64_OpARM64CMPconst(v) 51 case OpARM64CMPshiftLL: 52 return rewriteValueARM64_OpARM64CMPshiftLL(v) 53 case OpARM64CMPshiftRA: 54 return rewriteValueARM64_OpARM64CMPshiftRA(v) 55 case OpARM64CMPshiftRL: 56 return rewriteValueARM64_OpARM64CMPshiftRL(v) 57 case OpARM64CSELULT: 58 return rewriteValueARM64_OpARM64CSELULT(v) 59 case OpARM64CSELULT0: 60 return rewriteValueARM64_OpARM64CSELULT0(v) 61 case OpARM64DIV: 62 return rewriteValueARM64_OpARM64DIV(v) 63 case OpARM64DIVW: 64 return rewriteValueARM64_OpARM64DIVW(v) 65 case OpARM64Equal: 66 return rewriteValueARM64_OpARM64Equal(v) 67 case OpARM64FMOVDload: 68 return rewriteValueARM64_OpARM64FMOVDload(v) 69 case OpARM64FMOVDstore: 70 return rewriteValueARM64_OpARM64FMOVDstore(v) 71 case OpARM64FMOVSload: 72 return rewriteValueARM64_OpARM64FMOVSload(v) 73 case OpARM64FMOVSstore: 74 return rewriteValueARM64_OpARM64FMOVSstore(v) 75 case OpARM64GreaterEqual: 76 return rewriteValueARM64_OpARM64GreaterEqual(v) 77 case OpARM64GreaterEqualU: 78 return rewriteValueARM64_OpARM64GreaterEqualU(v) 79 case OpARM64GreaterThan: 80 return rewriteValueARM64_OpARM64GreaterThan(v) 81 case OpARM64GreaterThanU: 82 return rewriteValueARM64_OpARM64GreaterThanU(v) 83 case OpARM64LessEqual: 84 return rewriteValueARM64_OpARM64LessEqual(v) 85 case OpARM64LessEqualU: 86 return rewriteValueARM64_OpARM64LessEqualU(v) 87 case OpARM64LessThan: 88 return rewriteValueARM64_OpARM64LessThan(v) 89 case OpARM64LessThanU: 90 return rewriteValueARM64_OpARM64LessThanU(v) 91 case OpARM64MOD: 92 return rewriteValueARM64_OpARM64MOD(v) 93 case OpARM64MODW: 94 return rewriteValueARM64_OpARM64MODW(v) 95 case OpARM64MOVBUload: 96 return rewriteValueARM64_OpARM64MOVBUload(v) 97 case OpARM64MOVBUreg: 98 return rewriteValueARM64_OpARM64MOVBUreg(v) 99 case OpARM64MOVBload: 100 return rewriteValueARM64_OpARM64MOVBload(v) 101 case OpARM64MOVBreg: 102 return rewriteValueARM64_OpARM64MOVBreg(v) 103 case OpARM64MOVBstore: 104 return rewriteValueARM64_OpARM64MOVBstore(v) 105 case OpARM64MOVBstorezero: 106 return rewriteValueARM64_OpARM64MOVBstorezero(v) 107 case OpARM64MOVDload: 108 return rewriteValueARM64_OpARM64MOVDload(v) 109 case OpARM64MOVDreg: 110 return rewriteValueARM64_OpARM64MOVDreg(v) 111 case OpARM64MOVDstore: 112 return rewriteValueARM64_OpARM64MOVDstore(v) 113 case OpARM64MOVDstorezero: 114 return rewriteValueARM64_OpARM64MOVDstorezero(v) 115 case OpARM64MOVHUload: 116 return rewriteValueARM64_OpARM64MOVHUload(v) 117 case OpARM64MOVHUreg: 118 return rewriteValueARM64_OpARM64MOVHUreg(v) 119 case OpARM64MOVHload: 120 return rewriteValueARM64_OpARM64MOVHload(v) 121 case OpARM64MOVHreg: 122 return rewriteValueARM64_OpARM64MOVHreg(v) 123 case OpARM64MOVHstore: 124 return rewriteValueARM64_OpARM64MOVHstore(v) 125 case OpARM64MOVHstorezero: 126 return rewriteValueARM64_OpARM64MOVHstorezero(v) 127 case OpARM64MOVWUload: 128 return rewriteValueARM64_OpARM64MOVWUload(v) 129 case OpARM64MOVWUreg: 130 return rewriteValueARM64_OpARM64MOVWUreg(v) 131 case OpARM64MOVWload: 132 return rewriteValueARM64_OpARM64MOVWload(v) 133 case OpARM64MOVWreg: 134 return rewriteValueARM64_OpARM64MOVWreg(v) 135 case OpARM64MOVWstore: 136 return rewriteValueARM64_OpARM64MOVWstore(v) 137 case OpARM64MOVWstorezero: 138 return rewriteValueARM64_OpARM64MOVWstorezero(v) 139 case OpARM64MUL: 140 return rewriteValueARM64_OpARM64MUL(v) 141 case OpARM64MULW: 142 return rewriteValueARM64_OpARM64MULW(v) 143 case OpARM64MVN: 144 return rewriteValueARM64_OpARM64MVN(v) 145 case OpARM64NEG: 146 return rewriteValueARM64_OpARM64NEG(v) 147 case OpARM64NotEqual: 148 return rewriteValueARM64_OpARM64NotEqual(v) 149 case OpARM64OR: 150 return rewriteValueARM64_OpARM64OR(v) 151 case OpARM64ORconst: 152 return rewriteValueARM64_OpARM64ORconst(v) 153 case OpARM64ORshiftLL: 154 return rewriteValueARM64_OpARM64ORshiftLL(v) 155 case OpARM64ORshiftRA: 156 return rewriteValueARM64_OpARM64ORshiftRA(v) 157 case OpARM64ORshiftRL: 158 return rewriteValueARM64_OpARM64ORshiftRL(v) 159 case OpARM64SLL: 160 return rewriteValueARM64_OpARM64SLL(v) 161 case OpARM64SLLconst: 162 return rewriteValueARM64_OpARM64SLLconst(v) 163 case OpARM64SRA: 164 return rewriteValueARM64_OpARM64SRA(v) 165 case OpARM64SRAconst: 166 return rewriteValueARM64_OpARM64SRAconst(v) 167 case OpARM64SRL: 168 return rewriteValueARM64_OpARM64SRL(v) 169 case OpARM64SRLconst: 170 return rewriteValueARM64_OpARM64SRLconst(v) 171 case OpARM64SUB: 172 return rewriteValueARM64_OpARM64SUB(v) 173 case OpARM64SUBconst: 174 return rewriteValueARM64_OpARM64SUBconst(v) 175 case OpARM64SUBshiftLL: 176 return rewriteValueARM64_OpARM64SUBshiftLL(v) 177 case OpARM64SUBshiftRA: 178 return rewriteValueARM64_OpARM64SUBshiftRA(v) 179 case OpARM64SUBshiftRL: 180 return rewriteValueARM64_OpARM64SUBshiftRL(v) 181 case OpARM64UDIV: 182 return rewriteValueARM64_OpARM64UDIV(v) 183 case OpARM64UDIVW: 184 return rewriteValueARM64_OpARM64UDIVW(v) 185 case OpARM64UMOD: 186 return rewriteValueARM64_OpARM64UMOD(v) 187 case OpARM64UMODW: 188 return rewriteValueARM64_OpARM64UMODW(v) 189 case OpARM64XOR: 190 return rewriteValueARM64_OpARM64XOR(v) 191 case OpARM64XORconst: 192 return rewriteValueARM64_OpARM64XORconst(v) 193 case OpARM64XORshiftLL: 194 return rewriteValueARM64_OpARM64XORshiftLL(v) 195 case OpARM64XORshiftRA: 196 return rewriteValueARM64_OpARM64XORshiftRA(v) 197 case OpARM64XORshiftRL: 198 return rewriteValueARM64_OpARM64XORshiftRL(v) 199 case OpAdd16: 200 return rewriteValueARM64_OpAdd16(v) 201 case OpAdd32: 202 return rewriteValueARM64_OpAdd32(v) 203 case OpAdd32F: 204 return rewriteValueARM64_OpAdd32F(v) 205 case OpAdd64: 206 return rewriteValueARM64_OpAdd64(v) 207 case OpAdd64F: 208 return rewriteValueARM64_OpAdd64F(v) 209 case OpAdd8: 210 return rewriteValueARM64_OpAdd8(v) 211 case OpAddPtr: 212 return rewriteValueARM64_OpAddPtr(v) 213 case OpAddr: 214 return rewriteValueARM64_OpAddr(v) 215 case OpAnd16: 216 return rewriteValueARM64_OpAnd16(v) 217 case OpAnd32: 218 return rewriteValueARM64_OpAnd32(v) 219 case OpAnd64: 220 return rewriteValueARM64_OpAnd64(v) 221 case OpAnd8: 222 return rewriteValueARM64_OpAnd8(v) 223 case OpAndB: 224 return rewriteValueARM64_OpAndB(v) 225 case OpAtomicAdd32: 226 return rewriteValueARM64_OpAtomicAdd32(v) 227 case OpAtomicAdd64: 228 return rewriteValueARM64_OpAtomicAdd64(v) 229 case OpAtomicAnd8: 230 return rewriteValueARM64_OpAtomicAnd8(v) 231 case OpAtomicCompareAndSwap32: 232 return rewriteValueARM64_OpAtomicCompareAndSwap32(v) 233 case OpAtomicCompareAndSwap64: 234 return rewriteValueARM64_OpAtomicCompareAndSwap64(v) 235 case OpAtomicExchange32: 236 return rewriteValueARM64_OpAtomicExchange32(v) 237 case OpAtomicExchange64: 238 return rewriteValueARM64_OpAtomicExchange64(v) 239 case OpAtomicLoad32: 240 return rewriteValueARM64_OpAtomicLoad32(v) 241 case OpAtomicLoad64: 242 return rewriteValueARM64_OpAtomicLoad64(v) 243 case OpAtomicLoadPtr: 244 return rewriteValueARM64_OpAtomicLoadPtr(v) 245 case OpAtomicOr8: 246 return rewriteValueARM64_OpAtomicOr8(v) 247 case OpAtomicStore32: 248 return rewriteValueARM64_OpAtomicStore32(v) 249 case OpAtomicStore64: 250 return rewriteValueARM64_OpAtomicStore64(v) 251 case OpAtomicStorePtrNoWB: 252 return rewriteValueARM64_OpAtomicStorePtrNoWB(v) 253 case OpAvg64u: 254 return rewriteValueARM64_OpAvg64u(v) 255 case OpBitLen64: 256 return rewriteValueARM64_OpBitLen64(v) 257 case OpBitRev16: 258 return rewriteValueARM64_OpBitRev16(v) 259 case OpBitRev32: 260 return rewriteValueARM64_OpBitRev32(v) 261 case OpBitRev64: 262 return rewriteValueARM64_OpBitRev64(v) 263 case OpBitRev8: 264 return rewriteValueARM64_OpBitRev8(v) 265 case OpBswap32: 266 return rewriteValueARM64_OpBswap32(v) 267 case OpBswap64: 268 return rewriteValueARM64_OpBswap64(v) 269 case OpClosureCall: 270 return rewriteValueARM64_OpClosureCall(v) 271 case OpCom16: 272 return rewriteValueARM64_OpCom16(v) 273 case OpCom32: 274 return rewriteValueARM64_OpCom32(v) 275 case OpCom64: 276 return rewriteValueARM64_OpCom64(v) 277 case OpCom8: 278 return rewriteValueARM64_OpCom8(v) 279 case OpConst16: 280 return rewriteValueARM64_OpConst16(v) 281 case OpConst32: 282 return rewriteValueARM64_OpConst32(v) 283 case OpConst32F: 284 return rewriteValueARM64_OpConst32F(v) 285 case OpConst64: 286 return rewriteValueARM64_OpConst64(v) 287 case OpConst64F: 288 return rewriteValueARM64_OpConst64F(v) 289 case OpConst8: 290 return rewriteValueARM64_OpConst8(v) 291 case OpConstBool: 292 return rewriteValueARM64_OpConstBool(v) 293 case OpConstNil: 294 return rewriteValueARM64_OpConstNil(v) 295 case OpConvert: 296 return rewriteValueARM64_OpConvert(v) 297 case OpCtz32: 298 return rewriteValueARM64_OpCtz32(v) 299 case OpCtz64: 300 return rewriteValueARM64_OpCtz64(v) 301 case OpCvt32Fto32: 302 return rewriteValueARM64_OpCvt32Fto32(v) 303 case OpCvt32Fto32U: 304 return rewriteValueARM64_OpCvt32Fto32U(v) 305 case OpCvt32Fto64: 306 return rewriteValueARM64_OpCvt32Fto64(v) 307 case OpCvt32Fto64F: 308 return rewriteValueARM64_OpCvt32Fto64F(v) 309 case OpCvt32Fto64U: 310 return rewriteValueARM64_OpCvt32Fto64U(v) 311 case OpCvt32Uto32F: 312 return rewriteValueARM64_OpCvt32Uto32F(v) 313 case OpCvt32Uto64F: 314 return rewriteValueARM64_OpCvt32Uto64F(v) 315 case OpCvt32to32F: 316 return rewriteValueARM64_OpCvt32to32F(v) 317 case OpCvt32to64F: 318 return rewriteValueARM64_OpCvt32to64F(v) 319 case OpCvt64Fto32: 320 return rewriteValueARM64_OpCvt64Fto32(v) 321 case OpCvt64Fto32F: 322 return rewriteValueARM64_OpCvt64Fto32F(v) 323 case OpCvt64Fto32U: 324 return rewriteValueARM64_OpCvt64Fto32U(v) 325 case OpCvt64Fto64: 326 return rewriteValueARM64_OpCvt64Fto64(v) 327 case OpCvt64Fto64U: 328 return rewriteValueARM64_OpCvt64Fto64U(v) 329 case OpCvt64Uto32F: 330 return rewriteValueARM64_OpCvt64Uto32F(v) 331 case OpCvt64Uto64F: 332 return rewriteValueARM64_OpCvt64Uto64F(v) 333 case OpCvt64to32F: 334 return rewriteValueARM64_OpCvt64to32F(v) 335 case OpCvt64to64F: 336 return rewriteValueARM64_OpCvt64to64F(v) 337 case OpDiv16: 338 return rewriteValueARM64_OpDiv16(v) 339 case OpDiv16u: 340 return rewriteValueARM64_OpDiv16u(v) 341 case OpDiv32: 342 return rewriteValueARM64_OpDiv32(v) 343 case OpDiv32F: 344 return rewriteValueARM64_OpDiv32F(v) 345 case OpDiv32u: 346 return rewriteValueARM64_OpDiv32u(v) 347 case OpDiv64: 348 return rewriteValueARM64_OpDiv64(v) 349 case OpDiv64F: 350 return rewriteValueARM64_OpDiv64F(v) 351 case OpDiv64u: 352 return rewriteValueARM64_OpDiv64u(v) 353 case OpDiv8: 354 return rewriteValueARM64_OpDiv8(v) 355 case OpDiv8u: 356 return rewriteValueARM64_OpDiv8u(v) 357 case OpEq16: 358 return rewriteValueARM64_OpEq16(v) 359 case OpEq32: 360 return rewriteValueARM64_OpEq32(v) 361 case OpEq32F: 362 return rewriteValueARM64_OpEq32F(v) 363 case OpEq64: 364 return rewriteValueARM64_OpEq64(v) 365 case OpEq64F: 366 return rewriteValueARM64_OpEq64F(v) 367 case OpEq8: 368 return rewriteValueARM64_OpEq8(v) 369 case OpEqB: 370 return rewriteValueARM64_OpEqB(v) 371 case OpEqPtr: 372 return rewriteValueARM64_OpEqPtr(v) 373 case OpGeq16: 374 return rewriteValueARM64_OpGeq16(v) 375 case OpGeq16U: 376 return rewriteValueARM64_OpGeq16U(v) 377 case OpGeq32: 378 return rewriteValueARM64_OpGeq32(v) 379 case OpGeq32F: 380 return rewriteValueARM64_OpGeq32F(v) 381 case OpGeq32U: 382 return rewriteValueARM64_OpGeq32U(v) 383 case OpGeq64: 384 return rewriteValueARM64_OpGeq64(v) 385 case OpGeq64F: 386 return rewriteValueARM64_OpGeq64F(v) 387 case OpGeq64U: 388 return rewriteValueARM64_OpGeq64U(v) 389 case OpGeq8: 390 return rewriteValueARM64_OpGeq8(v) 391 case OpGeq8U: 392 return rewriteValueARM64_OpGeq8U(v) 393 case OpGetClosurePtr: 394 return rewriteValueARM64_OpGetClosurePtr(v) 395 case OpGreater16: 396 return rewriteValueARM64_OpGreater16(v) 397 case OpGreater16U: 398 return rewriteValueARM64_OpGreater16U(v) 399 case OpGreater32: 400 return rewriteValueARM64_OpGreater32(v) 401 case OpGreater32F: 402 return rewriteValueARM64_OpGreater32F(v) 403 case OpGreater32U: 404 return rewriteValueARM64_OpGreater32U(v) 405 case OpGreater64: 406 return rewriteValueARM64_OpGreater64(v) 407 case OpGreater64F: 408 return rewriteValueARM64_OpGreater64F(v) 409 case OpGreater64U: 410 return rewriteValueARM64_OpGreater64U(v) 411 case OpGreater8: 412 return rewriteValueARM64_OpGreater8(v) 413 case OpGreater8U: 414 return rewriteValueARM64_OpGreater8U(v) 415 case OpHmul32: 416 return rewriteValueARM64_OpHmul32(v) 417 case OpHmul32u: 418 return rewriteValueARM64_OpHmul32u(v) 419 case OpHmul64: 420 return rewriteValueARM64_OpHmul64(v) 421 case OpHmul64u: 422 return rewriteValueARM64_OpHmul64u(v) 423 case OpInterCall: 424 return rewriteValueARM64_OpInterCall(v) 425 case OpIsInBounds: 426 return rewriteValueARM64_OpIsInBounds(v) 427 case OpIsNonNil: 428 return rewriteValueARM64_OpIsNonNil(v) 429 case OpIsSliceInBounds: 430 return rewriteValueARM64_OpIsSliceInBounds(v) 431 case OpLeq16: 432 return rewriteValueARM64_OpLeq16(v) 433 case OpLeq16U: 434 return rewriteValueARM64_OpLeq16U(v) 435 case OpLeq32: 436 return rewriteValueARM64_OpLeq32(v) 437 case OpLeq32F: 438 return rewriteValueARM64_OpLeq32F(v) 439 case OpLeq32U: 440 return rewriteValueARM64_OpLeq32U(v) 441 case OpLeq64: 442 return rewriteValueARM64_OpLeq64(v) 443 case OpLeq64F: 444 return rewriteValueARM64_OpLeq64F(v) 445 case OpLeq64U: 446 return rewriteValueARM64_OpLeq64U(v) 447 case OpLeq8: 448 return rewriteValueARM64_OpLeq8(v) 449 case OpLeq8U: 450 return rewriteValueARM64_OpLeq8U(v) 451 case OpLess16: 452 return rewriteValueARM64_OpLess16(v) 453 case OpLess16U: 454 return rewriteValueARM64_OpLess16U(v) 455 case OpLess32: 456 return rewriteValueARM64_OpLess32(v) 457 case OpLess32F: 458 return rewriteValueARM64_OpLess32F(v) 459 case OpLess32U: 460 return rewriteValueARM64_OpLess32U(v) 461 case OpLess64: 462 return rewriteValueARM64_OpLess64(v) 463 case OpLess64F: 464 return rewriteValueARM64_OpLess64F(v) 465 case OpLess64U: 466 return rewriteValueARM64_OpLess64U(v) 467 case OpLess8: 468 return rewriteValueARM64_OpLess8(v) 469 case OpLess8U: 470 return rewriteValueARM64_OpLess8U(v) 471 case OpLoad: 472 return rewriteValueARM64_OpLoad(v) 473 case OpLsh16x16: 474 return rewriteValueARM64_OpLsh16x16(v) 475 case OpLsh16x32: 476 return rewriteValueARM64_OpLsh16x32(v) 477 case OpLsh16x64: 478 return rewriteValueARM64_OpLsh16x64(v) 479 case OpLsh16x8: 480 return rewriteValueARM64_OpLsh16x8(v) 481 case OpLsh32x16: 482 return rewriteValueARM64_OpLsh32x16(v) 483 case OpLsh32x32: 484 return rewriteValueARM64_OpLsh32x32(v) 485 case OpLsh32x64: 486 return rewriteValueARM64_OpLsh32x64(v) 487 case OpLsh32x8: 488 return rewriteValueARM64_OpLsh32x8(v) 489 case OpLsh64x16: 490 return rewriteValueARM64_OpLsh64x16(v) 491 case OpLsh64x32: 492 return rewriteValueARM64_OpLsh64x32(v) 493 case OpLsh64x64: 494 return rewriteValueARM64_OpLsh64x64(v) 495 case OpLsh64x8: 496 return rewriteValueARM64_OpLsh64x8(v) 497 case OpLsh8x16: 498 return rewriteValueARM64_OpLsh8x16(v) 499 case OpLsh8x32: 500 return rewriteValueARM64_OpLsh8x32(v) 501 case OpLsh8x64: 502 return rewriteValueARM64_OpLsh8x64(v) 503 case OpLsh8x8: 504 return rewriteValueARM64_OpLsh8x8(v) 505 case OpMod16: 506 return rewriteValueARM64_OpMod16(v) 507 case OpMod16u: 508 return rewriteValueARM64_OpMod16u(v) 509 case OpMod32: 510 return rewriteValueARM64_OpMod32(v) 511 case OpMod32u: 512 return rewriteValueARM64_OpMod32u(v) 513 case OpMod64: 514 return rewriteValueARM64_OpMod64(v) 515 case OpMod64u: 516 return rewriteValueARM64_OpMod64u(v) 517 case OpMod8: 518 return rewriteValueARM64_OpMod8(v) 519 case OpMod8u: 520 return rewriteValueARM64_OpMod8u(v) 521 case OpMove: 522 return rewriteValueARM64_OpMove(v) 523 case OpMul16: 524 return rewriteValueARM64_OpMul16(v) 525 case OpMul32: 526 return rewriteValueARM64_OpMul32(v) 527 case OpMul32F: 528 return rewriteValueARM64_OpMul32F(v) 529 case OpMul64: 530 return rewriteValueARM64_OpMul64(v) 531 case OpMul64F: 532 return rewriteValueARM64_OpMul64F(v) 533 case OpMul8: 534 return rewriteValueARM64_OpMul8(v) 535 case OpNeg16: 536 return rewriteValueARM64_OpNeg16(v) 537 case OpNeg32: 538 return rewriteValueARM64_OpNeg32(v) 539 case OpNeg32F: 540 return rewriteValueARM64_OpNeg32F(v) 541 case OpNeg64: 542 return rewriteValueARM64_OpNeg64(v) 543 case OpNeg64F: 544 return rewriteValueARM64_OpNeg64F(v) 545 case OpNeg8: 546 return rewriteValueARM64_OpNeg8(v) 547 case OpNeq16: 548 return rewriteValueARM64_OpNeq16(v) 549 case OpNeq32: 550 return rewriteValueARM64_OpNeq32(v) 551 case OpNeq32F: 552 return rewriteValueARM64_OpNeq32F(v) 553 case OpNeq64: 554 return rewriteValueARM64_OpNeq64(v) 555 case OpNeq64F: 556 return rewriteValueARM64_OpNeq64F(v) 557 case OpNeq8: 558 return rewriteValueARM64_OpNeq8(v) 559 case OpNeqB: 560 return rewriteValueARM64_OpNeqB(v) 561 case OpNeqPtr: 562 return rewriteValueARM64_OpNeqPtr(v) 563 case OpNilCheck: 564 return rewriteValueARM64_OpNilCheck(v) 565 case OpNot: 566 return rewriteValueARM64_OpNot(v) 567 case OpOffPtr: 568 return rewriteValueARM64_OpOffPtr(v) 569 case OpOr16: 570 return rewriteValueARM64_OpOr16(v) 571 case OpOr32: 572 return rewriteValueARM64_OpOr32(v) 573 case OpOr64: 574 return rewriteValueARM64_OpOr64(v) 575 case OpOr8: 576 return rewriteValueARM64_OpOr8(v) 577 case OpOrB: 578 return rewriteValueARM64_OpOrB(v) 579 case OpRound32F: 580 return rewriteValueARM64_OpRound32F(v) 581 case OpRound64F: 582 return rewriteValueARM64_OpRound64F(v) 583 case OpRsh16Ux16: 584 return rewriteValueARM64_OpRsh16Ux16(v) 585 case OpRsh16Ux32: 586 return rewriteValueARM64_OpRsh16Ux32(v) 587 case OpRsh16Ux64: 588 return rewriteValueARM64_OpRsh16Ux64(v) 589 case OpRsh16Ux8: 590 return rewriteValueARM64_OpRsh16Ux8(v) 591 case OpRsh16x16: 592 return rewriteValueARM64_OpRsh16x16(v) 593 case OpRsh16x32: 594 return rewriteValueARM64_OpRsh16x32(v) 595 case OpRsh16x64: 596 return rewriteValueARM64_OpRsh16x64(v) 597 case OpRsh16x8: 598 return rewriteValueARM64_OpRsh16x8(v) 599 case OpRsh32Ux16: 600 return rewriteValueARM64_OpRsh32Ux16(v) 601 case OpRsh32Ux32: 602 return rewriteValueARM64_OpRsh32Ux32(v) 603 case OpRsh32Ux64: 604 return rewriteValueARM64_OpRsh32Ux64(v) 605 case OpRsh32Ux8: 606 return rewriteValueARM64_OpRsh32Ux8(v) 607 case OpRsh32x16: 608 return rewriteValueARM64_OpRsh32x16(v) 609 case OpRsh32x32: 610 return rewriteValueARM64_OpRsh32x32(v) 611 case OpRsh32x64: 612 return rewriteValueARM64_OpRsh32x64(v) 613 case OpRsh32x8: 614 return rewriteValueARM64_OpRsh32x8(v) 615 case OpRsh64Ux16: 616 return rewriteValueARM64_OpRsh64Ux16(v) 617 case OpRsh64Ux32: 618 return rewriteValueARM64_OpRsh64Ux32(v) 619 case OpRsh64Ux64: 620 return rewriteValueARM64_OpRsh64Ux64(v) 621 case OpRsh64Ux8: 622 return rewriteValueARM64_OpRsh64Ux8(v) 623 case OpRsh64x16: 624 return rewriteValueARM64_OpRsh64x16(v) 625 case OpRsh64x32: 626 return rewriteValueARM64_OpRsh64x32(v) 627 case OpRsh64x64: 628 return rewriteValueARM64_OpRsh64x64(v) 629 case OpRsh64x8: 630 return rewriteValueARM64_OpRsh64x8(v) 631 case OpRsh8Ux16: 632 return rewriteValueARM64_OpRsh8Ux16(v) 633 case OpRsh8Ux32: 634 return rewriteValueARM64_OpRsh8Ux32(v) 635 case OpRsh8Ux64: 636 return rewriteValueARM64_OpRsh8Ux64(v) 637 case OpRsh8Ux8: 638 return rewriteValueARM64_OpRsh8Ux8(v) 639 case OpRsh8x16: 640 return rewriteValueARM64_OpRsh8x16(v) 641 case OpRsh8x32: 642 return rewriteValueARM64_OpRsh8x32(v) 643 case OpRsh8x64: 644 return rewriteValueARM64_OpRsh8x64(v) 645 case OpRsh8x8: 646 return rewriteValueARM64_OpRsh8x8(v) 647 case OpSignExt16to32: 648 return rewriteValueARM64_OpSignExt16to32(v) 649 case OpSignExt16to64: 650 return rewriteValueARM64_OpSignExt16to64(v) 651 case OpSignExt32to64: 652 return rewriteValueARM64_OpSignExt32to64(v) 653 case OpSignExt8to16: 654 return rewriteValueARM64_OpSignExt8to16(v) 655 case OpSignExt8to32: 656 return rewriteValueARM64_OpSignExt8to32(v) 657 case OpSignExt8to64: 658 return rewriteValueARM64_OpSignExt8to64(v) 659 case OpSlicemask: 660 return rewriteValueARM64_OpSlicemask(v) 661 case OpSqrt: 662 return rewriteValueARM64_OpSqrt(v) 663 case OpStaticCall: 664 return rewriteValueARM64_OpStaticCall(v) 665 case OpStore: 666 return rewriteValueARM64_OpStore(v) 667 case OpSub16: 668 return rewriteValueARM64_OpSub16(v) 669 case OpSub32: 670 return rewriteValueARM64_OpSub32(v) 671 case OpSub32F: 672 return rewriteValueARM64_OpSub32F(v) 673 case OpSub64: 674 return rewriteValueARM64_OpSub64(v) 675 case OpSub64F: 676 return rewriteValueARM64_OpSub64F(v) 677 case OpSub8: 678 return rewriteValueARM64_OpSub8(v) 679 case OpSubPtr: 680 return rewriteValueARM64_OpSubPtr(v) 681 case OpTrunc16to8: 682 return rewriteValueARM64_OpTrunc16to8(v) 683 case OpTrunc32to16: 684 return rewriteValueARM64_OpTrunc32to16(v) 685 case OpTrunc32to8: 686 return rewriteValueARM64_OpTrunc32to8(v) 687 case OpTrunc64to16: 688 return rewriteValueARM64_OpTrunc64to16(v) 689 case OpTrunc64to32: 690 return rewriteValueARM64_OpTrunc64to32(v) 691 case OpTrunc64to8: 692 return rewriteValueARM64_OpTrunc64to8(v) 693 case OpXor16: 694 return rewriteValueARM64_OpXor16(v) 695 case OpXor32: 696 return rewriteValueARM64_OpXor32(v) 697 case OpXor64: 698 return rewriteValueARM64_OpXor64(v) 699 case OpXor8: 700 return rewriteValueARM64_OpXor8(v) 701 case OpZero: 702 return rewriteValueARM64_OpZero(v) 703 case OpZeroExt16to32: 704 return rewriteValueARM64_OpZeroExt16to32(v) 705 case OpZeroExt16to64: 706 return rewriteValueARM64_OpZeroExt16to64(v) 707 case OpZeroExt32to64: 708 return rewriteValueARM64_OpZeroExt32to64(v) 709 case OpZeroExt8to16: 710 return rewriteValueARM64_OpZeroExt8to16(v) 711 case OpZeroExt8to32: 712 return rewriteValueARM64_OpZeroExt8to32(v) 713 case OpZeroExt8to64: 714 return rewriteValueARM64_OpZeroExt8to64(v) 715 } 716 return false 717 } 718 func rewriteValueARM64_OpARM64ADD(v *Value) bool { 719 // match: (ADD x (MOVDconst [c])) 720 // cond: 721 // result: (ADDconst [c] x) 722 for { 723 x := v.Args[0] 724 v_1 := v.Args[1] 725 if v_1.Op != OpARM64MOVDconst { 726 break 727 } 728 c := v_1.AuxInt 729 v.reset(OpARM64ADDconst) 730 v.AuxInt = c 731 v.AddArg(x) 732 return true 733 } 734 // match: (ADD (MOVDconst [c]) x) 735 // cond: 736 // result: (ADDconst [c] x) 737 for { 738 v_0 := v.Args[0] 739 if v_0.Op != OpARM64MOVDconst { 740 break 741 } 742 c := v_0.AuxInt 743 x := v.Args[1] 744 v.reset(OpARM64ADDconst) 745 v.AuxInt = c 746 v.AddArg(x) 747 return true 748 } 749 // match: (ADD x (NEG y)) 750 // cond: 751 // result: (SUB x y) 752 for { 753 x := v.Args[0] 754 v_1 := v.Args[1] 755 if v_1.Op != OpARM64NEG { 756 break 757 } 758 y := v_1.Args[0] 759 v.reset(OpARM64SUB) 760 v.AddArg(x) 761 v.AddArg(y) 762 return true 763 } 764 // match: (ADD (NEG y) x) 765 // cond: 766 // result: (SUB x y) 767 for { 768 v_0 := v.Args[0] 769 if v_0.Op != OpARM64NEG { 770 break 771 } 772 y := v_0.Args[0] 773 x := v.Args[1] 774 v.reset(OpARM64SUB) 775 v.AddArg(x) 776 v.AddArg(y) 777 return true 778 } 779 // match: (ADD x (SLLconst [c] y)) 780 // cond: 781 // result: (ADDshiftLL x y [c]) 782 for { 783 x := v.Args[0] 784 v_1 := v.Args[1] 785 if v_1.Op != OpARM64SLLconst { 786 break 787 } 788 c := v_1.AuxInt 789 y := v_1.Args[0] 790 v.reset(OpARM64ADDshiftLL) 791 v.AuxInt = c 792 v.AddArg(x) 793 v.AddArg(y) 794 return true 795 } 796 // match: (ADD (SLLconst [c] y) x) 797 // cond: 798 // result: (ADDshiftLL x y [c]) 799 for { 800 v_0 := v.Args[0] 801 if v_0.Op != OpARM64SLLconst { 802 break 803 } 804 c := v_0.AuxInt 805 y := v_0.Args[0] 806 x := v.Args[1] 807 v.reset(OpARM64ADDshiftLL) 808 v.AuxInt = c 809 v.AddArg(x) 810 v.AddArg(y) 811 return true 812 } 813 // match: (ADD x (SRLconst [c] y)) 814 // cond: 815 // result: (ADDshiftRL x y [c]) 816 for { 817 x := v.Args[0] 818 v_1 := v.Args[1] 819 if v_1.Op != OpARM64SRLconst { 820 break 821 } 822 c := v_1.AuxInt 823 y := v_1.Args[0] 824 v.reset(OpARM64ADDshiftRL) 825 v.AuxInt = c 826 v.AddArg(x) 827 v.AddArg(y) 828 return true 829 } 830 // match: (ADD (SRLconst [c] y) x) 831 // cond: 832 // result: (ADDshiftRL x y [c]) 833 for { 834 v_0 := v.Args[0] 835 if v_0.Op != OpARM64SRLconst { 836 break 837 } 838 c := v_0.AuxInt 839 y := v_0.Args[0] 840 x := v.Args[1] 841 v.reset(OpARM64ADDshiftRL) 842 v.AuxInt = c 843 v.AddArg(x) 844 v.AddArg(y) 845 return true 846 } 847 // match: (ADD x (SRAconst [c] y)) 848 // cond: 849 // result: (ADDshiftRA x y [c]) 850 for { 851 x := v.Args[0] 852 v_1 := v.Args[1] 853 if v_1.Op != OpARM64SRAconst { 854 break 855 } 856 c := v_1.AuxInt 857 y := v_1.Args[0] 858 v.reset(OpARM64ADDshiftRA) 859 v.AuxInt = c 860 v.AddArg(x) 861 v.AddArg(y) 862 return true 863 } 864 // match: (ADD (SRAconst [c] y) x) 865 // cond: 866 // result: (ADDshiftRA x y [c]) 867 for { 868 v_0 := v.Args[0] 869 if v_0.Op != OpARM64SRAconst { 870 break 871 } 872 c := v_0.AuxInt 873 y := v_0.Args[0] 874 x := v.Args[1] 875 v.reset(OpARM64ADDshiftRA) 876 v.AuxInt = c 877 v.AddArg(x) 878 v.AddArg(y) 879 return true 880 } 881 return false 882 } 883 func rewriteValueARM64_OpARM64ADDconst(v *Value) bool { 884 // match: (ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) 885 // cond: 886 // result: (MOVDaddr [off1+off2] {sym} ptr) 887 for { 888 off1 := v.AuxInt 889 v_0 := v.Args[0] 890 if v_0.Op != OpARM64MOVDaddr { 891 break 892 } 893 off2 := v_0.AuxInt 894 sym := v_0.Aux 895 ptr := v_0.Args[0] 896 v.reset(OpARM64MOVDaddr) 897 v.AuxInt = off1 + off2 898 v.Aux = sym 899 v.AddArg(ptr) 900 return true 901 } 902 // match: (ADDconst [0] x) 903 // cond: 904 // result: x 905 for { 906 if v.AuxInt != 0 { 907 break 908 } 909 x := v.Args[0] 910 v.reset(OpCopy) 911 v.Type = x.Type 912 v.AddArg(x) 913 return true 914 } 915 // match: (ADDconst [c] (MOVDconst [d])) 916 // cond: 917 // result: (MOVDconst [c+d]) 918 for { 919 c := v.AuxInt 920 v_0 := v.Args[0] 921 if v_0.Op != OpARM64MOVDconst { 922 break 923 } 924 d := v_0.AuxInt 925 v.reset(OpARM64MOVDconst) 926 v.AuxInt = c + d 927 return true 928 } 929 // match: (ADDconst [c] (ADDconst [d] x)) 930 // cond: 931 // result: (ADDconst [c+d] x) 932 for { 933 c := v.AuxInt 934 v_0 := v.Args[0] 935 if v_0.Op != OpARM64ADDconst { 936 break 937 } 938 d := v_0.AuxInt 939 x := v_0.Args[0] 940 v.reset(OpARM64ADDconst) 941 v.AuxInt = c + d 942 v.AddArg(x) 943 return true 944 } 945 // match: (ADDconst [c] (SUBconst [d] x)) 946 // cond: 947 // result: (ADDconst [c-d] x) 948 for { 949 c := v.AuxInt 950 v_0 := v.Args[0] 951 if v_0.Op != OpARM64SUBconst { 952 break 953 } 954 d := v_0.AuxInt 955 x := v_0.Args[0] 956 v.reset(OpARM64ADDconst) 957 v.AuxInt = c - d 958 v.AddArg(x) 959 return true 960 } 961 return false 962 } 963 func rewriteValueARM64_OpARM64ADDshiftLL(v *Value) bool { 964 b := v.Block 965 _ = b 966 // match: (ADDshiftLL (MOVDconst [c]) x [d]) 967 // cond: 968 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 969 for { 970 d := v.AuxInt 971 v_0 := v.Args[0] 972 if v_0.Op != OpARM64MOVDconst { 973 break 974 } 975 c := v_0.AuxInt 976 x := v.Args[1] 977 v.reset(OpARM64ADDconst) 978 v.AuxInt = c 979 v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) 980 v0.AuxInt = d 981 v0.AddArg(x) 982 v.AddArg(v0) 983 return true 984 } 985 // match: (ADDshiftLL x (MOVDconst [c]) [d]) 986 // cond: 987 // result: (ADDconst x [int64(uint64(c)<<uint64(d))]) 988 for { 989 d := v.AuxInt 990 x := v.Args[0] 991 v_1 := v.Args[1] 992 if v_1.Op != OpARM64MOVDconst { 993 break 994 } 995 c := v_1.AuxInt 996 v.reset(OpARM64ADDconst) 997 v.AuxInt = int64(uint64(c) << uint64(d)) 998 v.AddArg(x) 999 return true 1000 } 1001 // match: (ADDshiftLL [c] (SRLconst x [64-c]) x) 1002 // cond: 1003 // result: (RORconst [64-c] x) 1004 for { 1005 c := v.AuxInt 1006 v_0 := v.Args[0] 1007 if v_0.Op != OpARM64SRLconst { 1008 break 1009 } 1010 if v_0.AuxInt != 64-c { 1011 break 1012 } 1013 x := v_0.Args[0] 1014 if x != v.Args[1] { 1015 break 1016 } 1017 v.reset(OpARM64RORconst) 1018 v.AuxInt = 64 - c 1019 v.AddArg(x) 1020 return true 1021 } 1022 // match: (ADDshiftLL <t> [c] (SRLconst (MOVWUreg x) [32-c]) x) 1023 // cond: c < 32 && t.Size() == 4 1024 // result: (RORWconst [32-c] x) 1025 for { 1026 t := v.Type 1027 c := v.AuxInt 1028 v_0 := v.Args[0] 1029 if v_0.Op != OpARM64SRLconst { 1030 break 1031 } 1032 if v_0.AuxInt != 32-c { 1033 break 1034 } 1035 v_0_0 := v_0.Args[0] 1036 if v_0_0.Op != OpARM64MOVWUreg { 1037 break 1038 } 1039 x := v_0_0.Args[0] 1040 if x != v.Args[1] { 1041 break 1042 } 1043 if !(c < 32 && t.Size() == 4) { 1044 break 1045 } 1046 v.reset(OpARM64RORWconst) 1047 v.AuxInt = 32 - c 1048 v.AddArg(x) 1049 return true 1050 } 1051 return false 1052 } 1053 func rewriteValueARM64_OpARM64ADDshiftRA(v *Value) bool { 1054 b := v.Block 1055 _ = b 1056 // match: (ADDshiftRA (MOVDconst [c]) x [d]) 1057 // cond: 1058 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 1059 for { 1060 d := v.AuxInt 1061 v_0 := v.Args[0] 1062 if v_0.Op != OpARM64MOVDconst { 1063 break 1064 } 1065 c := v_0.AuxInt 1066 x := v.Args[1] 1067 v.reset(OpARM64ADDconst) 1068 v.AuxInt = c 1069 v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) 1070 v0.AuxInt = d 1071 v0.AddArg(x) 1072 v.AddArg(v0) 1073 return true 1074 } 1075 // match: (ADDshiftRA x (MOVDconst [c]) [d]) 1076 // cond: 1077 // result: (ADDconst x [int64(int64(c)>>uint64(d))]) 1078 for { 1079 d := v.AuxInt 1080 x := v.Args[0] 1081 v_1 := v.Args[1] 1082 if v_1.Op != OpARM64MOVDconst { 1083 break 1084 } 1085 c := v_1.AuxInt 1086 v.reset(OpARM64ADDconst) 1087 v.AuxInt = int64(int64(c) >> uint64(d)) 1088 v.AddArg(x) 1089 return true 1090 } 1091 return false 1092 } 1093 func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { 1094 b := v.Block 1095 _ = b 1096 // match: (ADDshiftRL (MOVDconst [c]) x [d]) 1097 // cond: 1098 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 1099 for { 1100 d := v.AuxInt 1101 v_0 := v.Args[0] 1102 if v_0.Op != OpARM64MOVDconst { 1103 break 1104 } 1105 c := v_0.AuxInt 1106 x := v.Args[1] 1107 v.reset(OpARM64ADDconst) 1108 v.AuxInt = c 1109 v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) 1110 v0.AuxInt = d 1111 v0.AddArg(x) 1112 v.AddArg(v0) 1113 return true 1114 } 1115 // match: (ADDshiftRL x (MOVDconst [c]) [d]) 1116 // cond: 1117 // result: (ADDconst x [int64(uint64(c)>>uint64(d))]) 1118 for { 1119 d := v.AuxInt 1120 x := v.Args[0] 1121 v_1 := v.Args[1] 1122 if v_1.Op != OpARM64MOVDconst { 1123 break 1124 } 1125 c := v_1.AuxInt 1126 v.reset(OpARM64ADDconst) 1127 v.AuxInt = int64(uint64(c) >> uint64(d)) 1128 v.AddArg(x) 1129 return true 1130 } 1131 // match: (ADDshiftRL [c] (SLLconst x [64-c]) x) 1132 // cond: 1133 // result: (RORconst [ c] x) 1134 for { 1135 c := v.AuxInt 1136 v_0 := v.Args[0] 1137 if v_0.Op != OpARM64SLLconst { 1138 break 1139 } 1140 if v_0.AuxInt != 64-c { 1141 break 1142 } 1143 x := v_0.Args[0] 1144 if x != v.Args[1] { 1145 break 1146 } 1147 v.reset(OpARM64RORconst) 1148 v.AuxInt = c 1149 v.AddArg(x) 1150 return true 1151 } 1152 // match: (ADDshiftRL <t> [c] (SLLconst x [32-c]) (MOVWUreg x)) 1153 // cond: c < 32 && t.Size() == 4 1154 // result: (RORWconst [ c] x) 1155 for { 1156 t := v.Type 1157 c := v.AuxInt 1158 v_0 := v.Args[0] 1159 if v_0.Op != OpARM64SLLconst { 1160 break 1161 } 1162 if v_0.AuxInt != 32-c { 1163 break 1164 } 1165 x := v_0.Args[0] 1166 v_1 := v.Args[1] 1167 if v_1.Op != OpARM64MOVWUreg { 1168 break 1169 } 1170 if x != v_1.Args[0] { 1171 break 1172 } 1173 if !(c < 32 && t.Size() == 4) { 1174 break 1175 } 1176 v.reset(OpARM64RORWconst) 1177 v.AuxInt = c 1178 v.AddArg(x) 1179 return true 1180 } 1181 return false 1182 } 1183 func rewriteValueARM64_OpARM64AND(v *Value) bool { 1184 // match: (AND x (MOVDconst [c])) 1185 // cond: 1186 // result: (ANDconst [c] x) 1187 for { 1188 x := v.Args[0] 1189 v_1 := v.Args[1] 1190 if v_1.Op != OpARM64MOVDconst { 1191 break 1192 } 1193 c := v_1.AuxInt 1194 v.reset(OpARM64ANDconst) 1195 v.AuxInt = c 1196 v.AddArg(x) 1197 return true 1198 } 1199 // match: (AND (MOVDconst [c]) x) 1200 // cond: 1201 // result: (ANDconst [c] x) 1202 for { 1203 v_0 := v.Args[0] 1204 if v_0.Op != OpARM64MOVDconst { 1205 break 1206 } 1207 c := v_0.AuxInt 1208 x := v.Args[1] 1209 v.reset(OpARM64ANDconst) 1210 v.AuxInt = c 1211 v.AddArg(x) 1212 return true 1213 } 1214 // match: (AND x x) 1215 // cond: 1216 // result: x 1217 for { 1218 x := v.Args[0] 1219 if x != v.Args[1] { 1220 break 1221 } 1222 v.reset(OpCopy) 1223 v.Type = x.Type 1224 v.AddArg(x) 1225 return true 1226 } 1227 // match: (AND x (MVN y)) 1228 // cond: 1229 // result: (BIC x y) 1230 for { 1231 x := v.Args[0] 1232 v_1 := v.Args[1] 1233 if v_1.Op != OpARM64MVN { 1234 break 1235 } 1236 y := v_1.Args[0] 1237 v.reset(OpARM64BIC) 1238 v.AddArg(x) 1239 v.AddArg(y) 1240 return true 1241 } 1242 // match: (AND (MVN y) x) 1243 // cond: 1244 // result: (BIC x y) 1245 for { 1246 v_0 := v.Args[0] 1247 if v_0.Op != OpARM64MVN { 1248 break 1249 } 1250 y := v_0.Args[0] 1251 x := v.Args[1] 1252 v.reset(OpARM64BIC) 1253 v.AddArg(x) 1254 v.AddArg(y) 1255 return true 1256 } 1257 // match: (AND x (SLLconst [c] y)) 1258 // cond: 1259 // result: (ANDshiftLL x y [c]) 1260 for { 1261 x := v.Args[0] 1262 v_1 := v.Args[1] 1263 if v_1.Op != OpARM64SLLconst { 1264 break 1265 } 1266 c := v_1.AuxInt 1267 y := v_1.Args[0] 1268 v.reset(OpARM64ANDshiftLL) 1269 v.AuxInt = c 1270 v.AddArg(x) 1271 v.AddArg(y) 1272 return true 1273 } 1274 // match: (AND (SLLconst [c] y) x) 1275 // cond: 1276 // result: (ANDshiftLL x y [c]) 1277 for { 1278 v_0 := v.Args[0] 1279 if v_0.Op != OpARM64SLLconst { 1280 break 1281 } 1282 c := v_0.AuxInt 1283 y := v_0.Args[0] 1284 x := v.Args[1] 1285 v.reset(OpARM64ANDshiftLL) 1286 v.AuxInt = c 1287 v.AddArg(x) 1288 v.AddArg(y) 1289 return true 1290 } 1291 // match: (AND x (SRLconst [c] y)) 1292 // cond: 1293 // result: (ANDshiftRL x y [c]) 1294 for { 1295 x := v.Args[0] 1296 v_1 := v.Args[1] 1297 if v_1.Op != OpARM64SRLconst { 1298 break 1299 } 1300 c := v_1.AuxInt 1301 y := v_1.Args[0] 1302 v.reset(OpARM64ANDshiftRL) 1303 v.AuxInt = c 1304 v.AddArg(x) 1305 v.AddArg(y) 1306 return true 1307 } 1308 // match: (AND (SRLconst [c] y) x) 1309 // cond: 1310 // result: (ANDshiftRL x y [c]) 1311 for { 1312 v_0 := v.Args[0] 1313 if v_0.Op != OpARM64SRLconst { 1314 break 1315 } 1316 c := v_0.AuxInt 1317 y := v_0.Args[0] 1318 x := v.Args[1] 1319 v.reset(OpARM64ANDshiftRL) 1320 v.AuxInt = c 1321 v.AddArg(x) 1322 v.AddArg(y) 1323 return true 1324 } 1325 // match: (AND x (SRAconst [c] y)) 1326 // cond: 1327 // result: (ANDshiftRA x y [c]) 1328 for { 1329 x := v.Args[0] 1330 v_1 := v.Args[1] 1331 if v_1.Op != OpARM64SRAconst { 1332 break 1333 } 1334 c := v_1.AuxInt 1335 y := v_1.Args[0] 1336 v.reset(OpARM64ANDshiftRA) 1337 v.AuxInt = c 1338 v.AddArg(x) 1339 v.AddArg(y) 1340 return true 1341 } 1342 // match: (AND (SRAconst [c] y) x) 1343 // cond: 1344 // result: (ANDshiftRA x y [c]) 1345 for { 1346 v_0 := v.Args[0] 1347 if v_0.Op != OpARM64SRAconst { 1348 break 1349 } 1350 c := v_0.AuxInt 1351 y := v_0.Args[0] 1352 x := v.Args[1] 1353 v.reset(OpARM64ANDshiftRA) 1354 v.AuxInt = c 1355 v.AddArg(x) 1356 v.AddArg(y) 1357 return true 1358 } 1359 return false 1360 } 1361 func rewriteValueARM64_OpARM64ANDconst(v *Value) bool { 1362 // match: (ANDconst [0] _) 1363 // cond: 1364 // result: (MOVDconst [0]) 1365 for { 1366 if v.AuxInt != 0 { 1367 break 1368 } 1369 v.reset(OpARM64MOVDconst) 1370 v.AuxInt = 0 1371 return true 1372 } 1373 // match: (ANDconst [-1] x) 1374 // cond: 1375 // result: x 1376 for { 1377 if v.AuxInt != -1 { 1378 break 1379 } 1380 x := v.Args[0] 1381 v.reset(OpCopy) 1382 v.Type = x.Type 1383 v.AddArg(x) 1384 return true 1385 } 1386 // match: (ANDconst [c] (MOVDconst [d])) 1387 // cond: 1388 // result: (MOVDconst [c&d]) 1389 for { 1390 c := v.AuxInt 1391 v_0 := v.Args[0] 1392 if v_0.Op != OpARM64MOVDconst { 1393 break 1394 } 1395 d := v_0.AuxInt 1396 v.reset(OpARM64MOVDconst) 1397 v.AuxInt = c & d 1398 return true 1399 } 1400 // match: (ANDconst [c] (ANDconst [d] x)) 1401 // cond: 1402 // result: (ANDconst [c&d] x) 1403 for { 1404 c := v.AuxInt 1405 v_0 := v.Args[0] 1406 if v_0.Op != OpARM64ANDconst { 1407 break 1408 } 1409 d := v_0.AuxInt 1410 x := v_0.Args[0] 1411 v.reset(OpARM64ANDconst) 1412 v.AuxInt = c & d 1413 v.AddArg(x) 1414 return true 1415 } 1416 return false 1417 } 1418 func rewriteValueARM64_OpARM64ANDshiftLL(v *Value) bool { 1419 b := v.Block 1420 _ = b 1421 // match: (ANDshiftLL (MOVDconst [c]) x [d]) 1422 // cond: 1423 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 1424 for { 1425 d := v.AuxInt 1426 v_0 := v.Args[0] 1427 if v_0.Op != OpARM64MOVDconst { 1428 break 1429 } 1430 c := v_0.AuxInt 1431 x := v.Args[1] 1432 v.reset(OpARM64ANDconst) 1433 v.AuxInt = c 1434 v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) 1435 v0.AuxInt = d 1436 v0.AddArg(x) 1437 v.AddArg(v0) 1438 return true 1439 } 1440 // match: (ANDshiftLL x (MOVDconst [c]) [d]) 1441 // cond: 1442 // result: (ANDconst x [int64(uint64(c)<<uint64(d))]) 1443 for { 1444 d := v.AuxInt 1445 x := v.Args[0] 1446 v_1 := v.Args[1] 1447 if v_1.Op != OpARM64MOVDconst { 1448 break 1449 } 1450 c := v_1.AuxInt 1451 v.reset(OpARM64ANDconst) 1452 v.AuxInt = int64(uint64(c) << uint64(d)) 1453 v.AddArg(x) 1454 return true 1455 } 1456 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 1457 // cond: c==d 1458 // result: y 1459 for { 1460 d := v.AuxInt 1461 x := v.Args[0] 1462 y := v.Args[1] 1463 if y.Op != OpARM64SLLconst { 1464 break 1465 } 1466 c := y.AuxInt 1467 if x != y.Args[0] { 1468 break 1469 } 1470 if !(c == d) { 1471 break 1472 } 1473 v.reset(OpCopy) 1474 v.Type = y.Type 1475 v.AddArg(y) 1476 return true 1477 } 1478 return false 1479 } 1480 func rewriteValueARM64_OpARM64ANDshiftRA(v *Value) bool { 1481 b := v.Block 1482 _ = b 1483 // match: (ANDshiftRA (MOVDconst [c]) x [d]) 1484 // cond: 1485 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 1486 for { 1487 d := v.AuxInt 1488 v_0 := v.Args[0] 1489 if v_0.Op != OpARM64MOVDconst { 1490 break 1491 } 1492 c := v_0.AuxInt 1493 x := v.Args[1] 1494 v.reset(OpARM64ANDconst) 1495 v.AuxInt = c 1496 v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) 1497 v0.AuxInt = d 1498 v0.AddArg(x) 1499 v.AddArg(v0) 1500 return true 1501 } 1502 // match: (ANDshiftRA x (MOVDconst [c]) [d]) 1503 // cond: 1504 // result: (ANDconst x [int64(int64(c)>>uint64(d))]) 1505 for { 1506 d := v.AuxInt 1507 x := v.Args[0] 1508 v_1 := v.Args[1] 1509 if v_1.Op != OpARM64MOVDconst { 1510 break 1511 } 1512 c := v_1.AuxInt 1513 v.reset(OpARM64ANDconst) 1514 v.AuxInt = int64(int64(c) >> uint64(d)) 1515 v.AddArg(x) 1516 return true 1517 } 1518 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 1519 // cond: c==d 1520 // result: y 1521 for { 1522 d := v.AuxInt 1523 x := v.Args[0] 1524 y := v.Args[1] 1525 if y.Op != OpARM64SRAconst { 1526 break 1527 } 1528 c := y.AuxInt 1529 if x != y.Args[0] { 1530 break 1531 } 1532 if !(c == d) { 1533 break 1534 } 1535 v.reset(OpCopy) 1536 v.Type = y.Type 1537 v.AddArg(y) 1538 return true 1539 } 1540 return false 1541 } 1542 func rewriteValueARM64_OpARM64ANDshiftRL(v *Value) bool { 1543 b := v.Block 1544 _ = b 1545 // match: (ANDshiftRL (MOVDconst [c]) x [d]) 1546 // cond: 1547 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 1548 for { 1549 d := v.AuxInt 1550 v_0 := v.Args[0] 1551 if v_0.Op != OpARM64MOVDconst { 1552 break 1553 } 1554 c := v_0.AuxInt 1555 x := v.Args[1] 1556 v.reset(OpARM64ANDconst) 1557 v.AuxInt = c 1558 v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) 1559 v0.AuxInt = d 1560 v0.AddArg(x) 1561 v.AddArg(v0) 1562 return true 1563 } 1564 // match: (ANDshiftRL x (MOVDconst [c]) [d]) 1565 // cond: 1566 // result: (ANDconst x [int64(uint64(c)>>uint64(d))]) 1567 for { 1568 d := v.AuxInt 1569 x := v.Args[0] 1570 v_1 := v.Args[1] 1571 if v_1.Op != OpARM64MOVDconst { 1572 break 1573 } 1574 c := v_1.AuxInt 1575 v.reset(OpARM64ANDconst) 1576 v.AuxInt = int64(uint64(c) >> uint64(d)) 1577 v.AddArg(x) 1578 return true 1579 } 1580 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 1581 // cond: c==d 1582 // result: y 1583 for { 1584 d := v.AuxInt 1585 x := v.Args[0] 1586 y := v.Args[1] 1587 if y.Op != OpARM64SRLconst { 1588 break 1589 } 1590 c := y.AuxInt 1591 if x != y.Args[0] { 1592 break 1593 } 1594 if !(c == d) { 1595 break 1596 } 1597 v.reset(OpCopy) 1598 v.Type = y.Type 1599 v.AddArg(y) 1600 return true 1601 } 1602 return false 1603 } 1604 func rewriteValueARM64_OpARM64BIC(v *Value) bool { 1605 // match: (BIC x (MOVDconst [c])) 1606 // cond: 1607 // result: (BICconst [c] x) 1608 for { 1609 x := v.Args[0] 1610 v_1 := v.Args[1] 1611 if v_1.Op != OpARM64MOVDconst { 1612 break 1613 } 1614 c := v_1.AuxInt 1615 v.reset(OpARM64BICconst) 1616 v.AuxInt = c 1617 v.AddArg(x) 1618 return true 1619 } 1620 // match: (BIC x x) 1621 // cond: 1622 // result: (MOVDconst [0]) 1623 for { 1624 x := v.Args[0] 1625 if x != v.Args[1] { 1626 break 1627 } 1628 v.reset(OpARM64MOVDconst) 1629 v.AuxInt = 0 1630 return true 1631 } 1632 // match: (BIC x (SLLconst [c] y)) 1633 // cond: 1634 // result: (BICshiftLL x y [c]) 1635 for { 1636 x := v.Args[0] 1637 v_1 := v.Args[1] 1638 if v_1.Op != OpARM64SLLconst { 1639 break 1640 } 1641 c := v_1.AuxInt 1642 y := v_1.Args[0] 1643 v.reset(OpARM64BICshiftLL) 1644 v.AuxInt = c 1645 v.AddArg(x) 1646 v.AddArg(y) 1647 return true 1648 } 1649 // match: (BIC x (SRLconst [c] y)) 1650 // cond: 1651 // result: (BICshiftRL x y [c]) 1652 for { 1653 x := v.Args[0] 1654 v_1 := v.Args[1] 1655 if v_1.Op != OpARM64SRLconst { 1656 break 1657 } 1658 c := v_1.AuxInt 1659 y := v_1.Args[0] 1660 v.reset(OpARM64BICshiftRL) 1661 v.AuxInt = c 1662 v.AddArg(x) 1663 v.AddArg(y) 1664 return true 1665 } 1666 // match: (BIC x (SRAconst [c] y)) 1667 // cond: 1668 // result: (BICshiftRA x y [c]) 1669 for { 1670 x := v.Args[0] 1671 v_1 := v.Args[1] 1672 if v_1.Op != OpARM64SRAconst { 1673 break 1674 } 1675 c := v_1.AuxInt 1676 y := v_1.Args[0] 1677 v.reset(OpARM64BICshiftRA) 1678 v.AuxInt = c 1679 v.AddArg(x) 1680 v.AddArg(y) 1681 return true 1682 } 1683 return false 1684 } 1685 func rewriteValueARM64_OpARM64BICconst(v *Value) bool { 1686 // match: (BICconst [0] x) 1687 // cond: 1688 // result: x 1689 for { 1690 if v.AuxInt != 0 { 1691 break 1692 } 1693 x := v.Args[0] 1694 v.reset(OpCopy) 1695 v.Type = x.Type 1696 v.AddArg(x) 1697 return true 1698 } 1699 // match: (BICconst [-1] _) 1700 // cond: 1701 // result: (MOVDconst [0]) 1702 for { 1703 if v.AuxInt != -1 { 1704 break 1705 } 1706 v.reset(OpARM64MOVDconst) 1707 v.AuxInt = 0 1708 return true 1709 } 1710 // match: (BICconst [c] (MOVDconst [d])) 1711 // cond: 1712 // result: (MOVDconst [d&^c]) 1713 for { 1714 c := v.AuxInt 1715 v_0 := v.Args[0] 1716 if v_0.Op != OpARM64MOVDconst { 1717 break 1718 } 1719 d := v_0.AuxInt 1720 v.reset(OpARM64MOVDconst) 1721 v.AuxInt = d &^ c 1722 return true 1723 } 1724 return false 1725 } 1726 func rewriteValueARM64_OpARM64BICshiftLL(v *Value) bool { 1727 // match: (BICshiftLL x (MOVDconst [c]) [d]) 1728 // cond: 1729 // result: (BICconst x [int64(uint64(c)<<uint64(d))]) 1730 for { 1731 d := v.AuxInt 1732 x := v.Args[0] 1733 v_1 := v.Args[1] 1734 if v_1.Op != OpARM64MOVDconst { 1735 break 1736 } 1737 c := v_1.AuxInt 1738 v.reset(OpARM64BICconst) 1739 v.AuxInt = int64(uint64(c) << uint64(d)) 1740 v.AddArg(x) 1741 return true 1742 } 1743 // match: (BICshiftLL x (SLLconst x [c]) [d]) 1744 // cond: c==d 1745 // result: (MOVDconst [0]) 1746 for { 1747 d := v.AuxInt 1748 x := v.Args[0] 1749 v_1 := v.Args[1] 1750 if v_1.Op != OpARM64SLLconst { 1751 break 1752 } 1753 c := v_1.AuxInt 1754 if x != v_1.Args[0] { 1755 break 1756 } 1757 if !(c == d) { 1758 break 1759 } 1760 v.reset(OpARM64MOVDconst) 1761 v.AuxInt = 0 1762 return true 1763 } 1764 return false 1765 } 1766 func rewriteValueARM64_OpARM64BICshiftRA(v *Value) bool { 1767 // match: (BICshiftRA x (MOVDconst [c]) [d]) 1768 // cond: 1769 // result: (BICconst x [int64(int64(c)>>uint64(d))]) 1770 for { 1771 d := v.AuxInt 1772 x := v.Args[0] 1773 v_1 := v.Args[1] 1774 if v_1.Op != OpARM64MOVDconst { 1775 break 1776 } 1777 c := v_1.AuxInt 1778 v.reset(OpARM64BICconst) 1779 v.AuxInt = int64(int64(c) >> uint64(d)) 1780 v.AddArg(x) 1781 return true 1782 } 1783 // match: (BICshiftRA x (SRAconst x [c]) [d]) 1784 // cond: c==d 1785 // result: (MOVDconst [0]) 1786 for { 1787 d := v.AuxInt 1788 x := v.Args[0] 1789 v_1 := v.Args[1] 1790 if v_1.Op != OpARM64SRAconst { 1791 break 1792 } 1793 c := v_1.AuxInt 1794 if x != v_1.Args[0] { 1795 break 1796 } 1797 if !(c == d) { 1798 break 1799 } 1800 v.reset(OpARM64MOVDconst) 1801 v.AuxInt = 0 1802 return true 1803 } 1804 return false 1805 } 1806 func rewriteValueARM64_OpARM64BICshiftRL(v *Value) bool { 1807 // match: (BICshiftRL x (MOVDconst [c]) [d]) 1808 // cond: 1809 // result: (BICconst x [int64(uint64(c)>>uint64(d))]) 1810 for { 1811 d := v.AuxInt 1812 x := v.Args[0] 1813 v_1 := v.Args[1] 1814 if v_1.Op != OpARM64MOVDconst { 1815 break 1816 } 1817 c := v_1.AuxInt 1818 v.reset(OpARM64BICconst) 1819 v.AuxInt = int64(uint64(c) >> uint64(d)) 1820 v.AddArg(x) 1821 return true 1822 } 1823 // match: (BICshiftRL x (SRLconst x [c]) [d]) 1824 // cond: c==d 1825 // result: (MOVDconst [0]) 1826 for { 1827 d := v.AuxInt 1828 x := v.Args[0] 1829 v_1 := v.Args[1] 1830 if v_1.Op != OpARM64SRLconst { 1831 break 1832 } 1833 c := v_1.AuxInt 1834 if x != v_1.Args[0] { 1835 break 1836 } 1837 if !(c == d) { 1838 break 1839 } 1840 v.reset(OpARM64MOVDconst) 1841 v.AuxInt = 0 1842 return true 1843 } 1844 return false 1845 } 1846 func rewriteValueARM64_OpARM64CMP(v *Value) bool { 1847 b := v.Block 1848 _ = b 1849 // match: (CMP x (MOVDconst [c])) 1850 // cond: 1851 // result: (CMPconst [c] x) 1852 for { 1853 x := v.Args[0] 1854 v_1 := v.Args[1] 1855 if v_1.Op != OpARM64MOVDconst { 1856 break 1857 } 1858 c := v_1.AuxInt 1859 v.reset(OpARM64CMPconst) 1860 v.AuxInt = c 1861 v.AddArg(x) 1862 return true 1863 } 1864 // match: (CMP (MOVDconst [c]) x) 1865 // cond: 1866 // result: (InvertFlags (CMPconst [c] x)) 1867 for { 1868 v_0 := v.Args[0] 1869 if v_0.Op != OpARM64MOVDconst { 1870 break 1871 } 1872 c := v_0.AuxInt 1873 x := v.Args[1] 1874 v.reset(OpARM64InvertFlags) 1875 v0 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 1876 v0.AuxInt = c 1877 v0.AddArg(x) 1878 v.AddArg(v0) 1879 return true 1880 } 1881 // match: (CMP x (SLLconst [c] y)) 1882 // cond: 1883 // result: (CMPshiftLL x y [c]) 1884 for { 1885 x := v.Args[0] 1886 v_1 := v.Args[1] 1887 if v_1.Op != OpARM64SLLconst { 1888 break 1889 } 1890 c := v_1.AuxInt 1891 y := v_1.Args[0] 1892 v.reset(OpARM64CMPshiftLL) 1893 v.AuxInt = c 1894 v.AddArg(x) 1895 v.AddArg(y) 1896 return true 1897 } 1898 // match: (CMP (SLLconst [c] y) x) 1899 // cond: 1900 // result: (InvertFlags (CMPshiftLL x y [c])) 1901 for { 1902 v_0 := v.Args[0] 1903 if v_0.Op != OpARM64SLLconst { 1904 break 1905 } 1906 c := v_0.AuxInt 1907 y := v_0.Args[0] 1908 x := v.Args[1] 1909 v.reset(OpARM64InvertFlags) 1910 v0 := b.NewValue0(v.Pos, OpARM64CMPshiftLL, TypeFlags) 1911 v0.AuxInt = c 1912 v0.AddArg(x) 1913 v0.AddArg(y) 1914 v.AddArg(v0) 1915 return true 1916 } 1917 // match: (CMP x (SRLconst [c] y)) 1918 // cond: 1919 // result: (CMPshiftRL x y [c]) 1920 for { 1921 x := v.Args[0] 1922 v_1 := v.Args[1] 1923 if v_1.Op != OpARM64SRLconst { 1924 break 1925 } 1926 c := v_1.AuxInt 1927 y := v_1.Args[0] 1928 v.reset(OpARM64CMPshiftRL) 1929 v.AuxInt = c 1930 v.AddArg(x) 1931 v.AddArg(y) 1932 return true 1933 } 1934 // match: (CMP (SRLconst [c] y) x) 1935 // cond: 1936 // result: (InvertFlags (CMPshiftRL x y [c])) 1937 for { 1938 v_0 := v.Args[0] 1939 if v_0.Op != OpARM64SRLconst { 1940 break 1941 } 1942 c := v_0.AuxInt 1943 y := v_0.Args[0] 1944 x := v.Args[1] 1945 v.reset(OpARM64InvertFlags) 1946 v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRL, TypeFlags) 1947 v0.AuxInt = c 1948 v0.AddArg(x) 1949 v0.AddArg(y) 1950 v.AddArg(v0) 1951 return true 1952 } 1953 // match: (CMP x (SRAconst [c] y)) 1954 // cond: 1955 // result: (CMPshiftRA x y [c]) 1956 for { 1957 x := v.Args[0] 1958 v_1 := v.Args[1] 1959 if v_1.Op != OpARM64SRAconst { 1960 break 1961 } 1962 c := v_1.AuxInt 1963 y := v_1.Args[0] 1964 v.reset(OpARM64CMPshiftRA) 1965 v.AuxInt = c 1966 v.AddArg(x) 1967 v.AddArg(y) 1968 return true 1969 } 1970 // match: (CMP (SRAconst [c] y) x) 1971 // cond: 1972 // result: (InvertFlags (CMPshiftRA x y [c])) 1973 for { 1974 v_0 := v.Args[0] 1975 if v_0.Op != OpARM64SRAconst { 1976 break 1977 } 1978 c := v_0.AuxInt 1979 y := v_0.Args[0] 1980 x := v.Args[1] 1981 v.reset(OpARM64InvertFlags) 1982 v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRA, TypeFlags) 1983 v0.AuxInt = c 1984 v0.AddArg(x) 1985 v0.AddArg(y) 1986 v.AddArg(v0) 1987 return true 1988 } 1989 return false 1990 } 1991 func rewriteValueARM64_OpARM64CMPW(v *Value) bool { 1992 b := v.Block 1993 _ = b 1994 // match: (CMPW x (MOVDconst [c])) 1995 // cond: 1996 // result: (CMPWconst [int64(int32(c))] x) 1997 for { 1998 x := v.Args[0] 1999 v_1 := v.Args[1] 2000 if v_1.Op != OpARM64MOVDconst { 2001 break 2002 } 2003 c := v_1.AuxInt 2004 v.reset(OpARM64CMPWconst) 2005 v.AuxInt = int64(int32(c)) 2006 v.AddArg(x) 2007 return true 2008 } 2009 // match: (CMPW (MOVDconst [c]) x) 2010 // cond: 2011 // result: (InvertFlags (CMPWconst [int64(int32(c))] x)) 2012 for { 2013 v_0 := v.Args[0] 2014 if v_0.Op != OpARM64MOVDconst { 2015 break 2016 } 2017 c := v_0.AuxInt 2018 x := v.Args[1] 2019 v.reset(OpARM64InvertFlags) 2020 v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, TypeFlags) 2021 v0.AuxInt = int64(int32(c)) 2022 v0.AddArg(x) 2023 v.AddArg(v0) 2024 return true 2025 } 2026 return false 2027 } 2028 func rewriteValueARM64_OpARM64CMPWconst(v *Value) bool { 2029 // match: (CMPWconst (MOVDconst [x]) [y]) 2030 // cond: int32(x)==int32(y) 2031 // result: (FlagEQ) 2032 for { 2033 y := v.AuxInt 2034 v_0 := v.Args[0] 2035 if v_0.Op != OpARM64MOVDconst { 2036 break 2037 } 2038 x := v_0.AuxInt 2039 if !(int32(x) == int32(y)) { 2040 break 2041 } 2042 v.reset(OpARM64FlagEQ) 2043 return true 2044 } 2045 // match: (CMPWconst (MOVDconst [x]) [y]) 2046 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 2047 // result: (FlagLT_ULT) 2048 for { 2049 y := v.AuxInt 2050 v_0 := v.Args[0] 2051 if v_0.Op != OpARM64MOVDconst { 2052 break 2053 } 2054 x := v_0.AuxInt 2055 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 2056 break 2057 } 2058 v.reset(OpARM64FlagLT_ULT) 2059 return true 2060 } 2061 // match: (CMPWconst (MOVDconst [x]) [y]) 2062 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 2063 // result: (FlagLT_UGT) 2064 for { 2065 y := v.AuxInt 2066 v_0 := v.Args[0] 2067 if v_0.Op != OpARM64MOVDconst { 2068 break 2069 } 2070 x := v_0.AuxInt 2071 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 2072 break 2073 } 2074 v.reset(OpARM64FlagLT_UGT) 2075 return true 2076 } 2077 // match: (CMPWconst (MOVDconst [x]) [y]) 2078 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 2079 // result: (FlagGT_ULT) 2080 for { 2081 y := v.AuxInt 2082 v_0 := v.Args[0] 2083 if v_0.Op != OpARM64MOVDconst { 2084 break 2085 } 2086 x := v_0.AuxInt 2087 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 2088 break 2089 } 2090 v.reset(OpARM64FlagGT_ULT) 2091 return true 2092 } 2093 // match: (CMPWconst (MOVDconst [x]) [y]) 2094 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 2095 // result: (FlagGT_UGT) 2096 for { 2097 y := v.AuxInt 2098 v_0 := v.Args[0] 2099 if v_0.Op != OpARM64MOVDconst { 2100 break 2101 } 2102 x := v_0.AuxInt 2103 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 2104 break 2105 } 2106 v.reset(OpARM64FlagGT_UGT) 2107 return true 2108 } 2109 // match: (CMPWconst (MOVBUreg _) [c]) 2110 // cond: 0xff < int32(c) 2111 // result: (FlagLT_ULT) 2112 for { 2113 c := v.AuxInt 2114 v_0 := v.Args[0] 2115 if v_0.Op != OpARM64MOVBUreg { 2116 break 2117 } 2118 if !(0xff < int32(c)) { 2119 break 2120 } 2121 v.reset(OpARM64FlagLT_ULT) 2122 return true 2123 } 2124 // match: (CMPWconst (MOVHUreg _) [c]) 2125 // cond: 0xffff < int32(c) 2126 // result: (FlagLT_ULT) 2127 for { 2128 c := v.AuxInt 2129 v_0 := v.Args[0] 2130 if v_0.Op != OpARM64MOVHUreg { 2131 break 2132 } 2133 if !(0xffff < int32(c)) { 2134 break 2135 } 2136 v.reset(OpARM64FlagLT_ULT) 2137 return true 2138 } 2139 return false 2140 } 2141 func rewriteValueARM64_OpARM64CMPconst(v *Value) bool { 2142 // match: (CMPconst (MOVDconst [x]) [y]) 2143 // cond: x==y 2144 // result: (FlagEQ) 2145 for { 2146 y := v.AuxInt 2147 v_0 := v.Args[0] 2148 if v_0.Op != OpARM64MOVDconst { 2149 break 2150 } 2151 x := v_0.AuxInt 2152 if !(x == y) { 2153 break 2154 } 2155 v.reset(OpARM64FlagEQ) 2156 return true 2157 } 2158 // match: (CMPconst (MOVDconst [x]) [y]) 2159 // cond: int64(x)<int64(y) && uint64(x)<uint64(y) 2160 // result: (FlagLT_ULT) 2161 for { 2162 y := v.AuxInt 2163 v_0 := v.Args[0] 2164 if v_0.Op != OpARM64MOVDconst { 2165 break 2166 } 2167 x := v_0.AuxInt 2168 if !(int64(x) < int64(y) && uint64(x) < uint64(y)) { 2169 break 2170 } 2171 v.reset(OpARM64FlagLT_ULT) 2172 return true 2173 } 2174 // match: (CMPconst (MOVDconst [x]) [y]) 2175 // cond: int64(x)<int64(y) && uint64(x)>uint64(y) 2176 // result: (FlagLT_UGT) 2177 for { 2178 y := v.AuxInt 2179 v_0 := v.Args[0] 2180 if v_0.Op != OpARM64MOVDconst { 2181 break 2182 } 2183 x := v_0.AuxInt 2184 if !(int64(x) < int64(y) && uint64(x) > uint64(y)) { 2185 break 2186 } 2187 v.reset(OpARM64FlagLT_UGT) 2188 return true 2189 } 2190 // match: (CMPconst (MOVDconst [x]) [y]) 2191 // cond: int64(x)>int64(y) && uint64(x)<uint64(y) 2192 // result: (FlagGT_ULT) 2193 for { 2194 y := v.AuxInt 2195 v_0 := v.Args[0] 2196 if v_0.Op != OpARM64MOVDconst { 2197 break 2198 } 2199 x := v_0.AuxInt 2200 if !(int64(x) > int64(y) && uint64(x) < uint64(y)) { 2201 break 2202 } 2203 v.reset(OpARM64FlagGT_ULT) 2204 return true 2205 } 2206 // match: (CMPconst (MOVDconst [x]) [y]) 2207 // cond: int64(x)>int64(y) && uint64(x)>uint64(y) 2208 // result: (FlagGT_UGT) 2209 for { 2210 y := v.AuxInt 2211 v_0 := v.Args[0] 2212 if v_0.Op != OpARM64MOVDconst { 2213 break 2214 } 2215 x := v_0.AuxInt 2216 if !(int64(x) > int64(y) && uint64(x) > uint64(y)) { 2217 break 2218 } 2219 v.reset(OpARM64FlagGT_UGT) 2220 return true 2221 } 2222 // match: (CMPconst (MOVBUreg _) [c]) 2223 // cond: 0xff < c 2224 // result: (FlagLT_ULT) 2225 for { 2226 c := v.AuxInt 2227 v_0 := v.Args[0] 2228 if v_0.Op != OpARM64MOVBUreg { 2229 break 2230 } 2231 if !(0xff < c) { 2232 break 2233 } 2234 v.reset(OpARM64FlagLT_ULT) 2235 return true 2236 } 2237 // match: (CMPconst (MOVHUreg _) [c]) 2238 // cond: 0xffff < c 2239 // result: (FlagLT_ULT) 2240 for { 2241 c := v.AuxInt 2242 v_0 := v.Args[0] 2243 if v_0.Op != OpARM64MOVHUreg { 2244 break 2245 } 2246 if !(0xffff < c) { 2247 break 2248 } 2249 v.reset(OpARM64FlagLT_ULT) 2250 return true 2251 } 2252 // match: (CMPconst (MOVWUreg _) [c]) 2253 // cond: 0xffffffff < c 2254 // result: (FlagLT_ULT) 2255 for { 2256 c := v.AuxInt 2257 v_0 := v.Args[0] 2258 if v_0.Op != OpARM64MOVWUreg { 2259 break 2260 } 2261 if !(0xffffffff < c) { 2262 break 2263 } 2264 v.reset(OpARM64FlagLT_ULT) 2265 return true 2266 } 2267 // match: (CMPconst (ANDconst _ [m]) [n]) 2268 // cond: 0 <= m && m < n 2269 // result: (FlagLT_ULT) 2270 for { 2271 n := v.AuxInt 2272 v_0 := v.Args[0] 2273 if v_0.Op != OpARM64ANDconst { 2274 break 2275 } 2276 m := v_0.AuxInt 2277 if !(0 <= m && m < n) { 2278 break 2279 } 2280 v.reset(OpARM64FlagLT_ULT) 2281 return true 2282 } 2283 // match: (CMPconst (SRLconst _ [c]) [n]) 2284 // cond: 0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n) 2285 // result: (FlagLT_ULT) 2286 for { 2287 n := v.AuxInt 2288 v_0 := v.Args[0] 2289 if v_0.Op != OpARM64SRLconst { 2290 break 2291 } 2292 c := v_0.AuxInt 2293 if !(0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n)) { 2294 break 2295 } 2296 v.reset(OpARM64FlagLT_ULT) 2297 return true 2298 } 2299 return false 2300 } 2301 func rewriteValueARM64_OpARM64CMPshiftLL(v *Value) bool { 2302 b := v.Block 2303 _ = b 2304 // match: (CMPshiftLL (MOVDconst [c]) x [d]) 2305 // cond: 2306 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 2307 for { 2308 d := v.AuxInt 2309 v_0 := v.Args[0] 2310 if v_0.Op != OpARM64MOVDconst { 2311 break 2312 } 2313 c := v_0.AuxInt 2314 x := v.Args[1] 2315 v.reset(OpARM64InvertFlags) 2316 v0 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 2317 v0.AuxInt = c 2318 v1 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) 2319 v1.AuxInt = d 2320 v1.AddArg(x) 2321 v0.AddArg(v1) 2322 v.AddArg(v0) 2323 return true 2324 } 2325 // match: (CMPshiftLL x (MOVDconst [c]) [d]) 2326 // cond: 2327 // result: (CMPconst x [int64(uint64(c)<<uint64(d))]) 2328 for { 2329 d := v.AuxInt 2330 x := v.Args[0] 2331 v_1 := v.Args[1] 2332 if v_1.Op != OpARM64MOVDconst { 2333 break 2334 } 2335 c := v_1.AuxInt 2336 v.reset(OpARM64CMPconst) 2337 v.AuxInt = int64(uint64(c) << uint64(d)) 2338 v.AddArg(x) 2339 return true 2340 } 2341 return false 2342 } 2343 func rewriteValueARM64_OpARM64CMPshiftRA(v *Value) bool { 2344 b := v.Block 2345 _ = b 2346 // match: (CMPshiftRA (MOVDconst [c]) x [d]) 2347 // cond: 2348 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 2349 for { 2350 d := v.AuxInt 2351 v_0 := v.Args[0] 2352 if v_0.Op != OpARM64MOVDconst { 2353 break 2354 } 2355 c := v_0.AuxInt 2356 x := v.Args[1] 2357 v.reset(OpARM64InvertFlags) 2358 v0 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 2359 v0.AuxInt = c 2360 v1 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) 2361 v1.AuxInt = d 2362 v1.AddArg(x) 2363 v0.AddArg(v1) 2364 v.AddArg(v0) 2365 return true 2366 } 2367 // match: (CMPshiftRA x (MOVDconst [c]) [d]) 2368 // cond: 2369 // result: (CMPconst x [int64(int64(c)>>uint64(d))]) 2370 for { 2371 d := v.AuxInt 2372 x := v.Args[0] 2373 v_1 := v.Args[1] 2374 if v_1.Op != OpARM64MOVDconst { 2375 break 2376 } 2377 c := v_1.AuxInt 2378 v.reset(OpARM64CMPconst) 2379 v.AuxInt = int64(int64(c) >> uint64(d)) 2380 v.AddArg(x) 2381 return true 2382 } 2383 return false 2384 } 2385 func rewriteValueARM64_OpARM64CMPshiftRL(v *Value) bool { 2386 b := v.Block 2387 _ = b 2388 // match: (CMPshiftRL (MOVDconst [c]) x [d]) 2389 // cond: 2390 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 2391 for { 2392 d := v.AuxInt 2393 v_0 := v.Args[0] 2394 if v_0.Op != OpARM64MOVDconst { 2395 break 2396 } 2397 c := v_0.AuxInt 2398 x := v.Args[1] 2399 v.reset(OpARM64InvertFlags) 2400 v0 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 2401 v0.AuxInt = c 2402 v1 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) 2403 v1.AuxInt = d 2404 v1.AddArg(x) 2405 v0.AddArg(v1) 2406 v.AddArg(v0) 2407 return true 2408 } 2409 // match: (CMPshiftRL x (MOVDconst [c]) [d]) 2410 // cond: 2411 // result: (CMPconst x [int64(uint64(c)>>uint64(d))]) 2412 for { 2413 d := v.AuxInt 2414 x := v.Args[0] 2415 v_1 := v.Args[1] 2416 if v_1.Op != OpARM64MOVDconst { 2417 break 2418 } 2419 c := v_1.AuxInt 2420 v.reset(OpARM64CMPconst) 2421 v.AuxInt = int64(uint64(c) >> uint64(d)) 2422 v.AddArg(x) 2423 return true 2424 } 2425 return false 2426 } 2427 func rewriteValueARM64_OpARM64CSELULT(v *Value) bool { 2428 // match: (CSELULT x (MOVDconst [0]) flag) 2429 // cond: 2430 // result: (CSELULT0 x flag) 2431 for { 2432 x := v.Args[0] 2433 v_1 := v.Args[1] 2434 if v_1.Op != OpARM64MOVDconst { 2435 break 2436 } 2437 if v_1.AuxInt != 0 { 2438 break 2439 } 2440 flag := v.Args[2] 2441 v.reset(OpARM64CSELULT0) 2442 v.AddArg(x) 2443 v.AddArg(flag) 2444 return true 2445 } 2446 // match: (CSELULT _ y (FlagEQ)) 2447 // cond: 2448 // result: y 2449 for { 2450 y := v.Args[1] 2451 v_2 := v.Args[2] 2452 if v_2.Op != OpARM64FlagEQ { 2453 break 2454 } 2455 v.reset(OpCopy) 2456 v.Type = y.Type 2457 v.AddArg(y) 2458 return true 2459 } 2460 // match: (CSELULT x _ (FlagLT_ULT)) 2461 // cond: 2462 // result: x 2463 for { 2464 x := v.Args[0] 2465 v_2 := v.Args[2] 2466 if v_2.Op != OpARM64FlagLT_ULT { 2467 break 2468 } 2469 v.reset(OpCopy) 2470 v.Type = x.Type 2471 v.AddArg(x) 2472 return true 2473 } 2474 // match: (CSELULT _ y (FlagLT_UGT)) 2475 // cond: 2476 // result: y 2477 for { 2478 y := v.Args[1] 2479 v_2 := v.Args[2] 2480 if v_2.Op != OpARM64FlagLT_UGT { 2481 break 2482 } 2483 v.reset(OpCopy) 2484 v.Type = y.Type 2485 v.AddArg(y) 2486 return true 2487 } 2488 // match: (CSELULT x _ (FlagGT_ULT)) 2489 // cond: 2490 // result: x 2491 for { 2492 x := v.Args[0] 2493 v_2 := v.Args[2] 2494 if v_2.Op != OpARM64FlagGT_ULT { 2495 break 2496 } 2497 v.reset(OpCopy) 2498 v.Type = x.Type 2499 v.AddArg(x) 2500 return true 2501 } 2502 // match: (CSELULT _ y (FlagGT_UGT)) 2503 // cond: 2504 // result: y 2505 for { 2506 y := v.Args[1] 2507 v_2 := v.Args[2] 2508 if v_2.Op != OpARM64FlagGT_UGT { 2509 break 2510 } 2511 v.reset(OpCopy) 2512 v.Type = y.Type 2513 v.AddArg(y) 2514 return true 2515 } 2516 return false 2517 } 2518 func rewriteValueARM64_OpARM64CSELULT0(v *Value) bool { 2519 // match: (CSELULT0 _ (FlagEQ)) 2520 // cond: 2521 // result: (MOVDconst [0]) 2522 for { 2523 v_1 := v.Args[1] 2524 if v_1.Op != OpARM64FlagEQ { 2525 break 2526 } 2527 v.reset(OpARM64MOVDconst) 2528 v.AuxInt = 0 2529 return true 2530 } 2531 // match: (CSELULT0 x (FlagLT_ULT)) 2532 // cond: 2533 // result: x 2534 for { 2535 x := v.Args[0] 2536 v_1 := v.Args[1] 2537 if v_1.Op != OpARM64FlagLT_ULT { 2538 break 2539 } 2540 v.reset(OpCopy) 2541 v.Type = x.Type 2542 v.AddArg(x) 2543 return true 2544 } 2545 // match: (CSELULT0 _ (FlagLT_UGT)) 2546 // cond: 2547 // result: (MOVDconst [0]) 2548 for { 2549 v_1 := v.Args[1] 2550 if v_1.Op != OpARM64FlagLT_UGT { 2551 break 2552 } 2553 v.reset(OpARM64MOVDconst) 2554 v.AuxInt = 0 2555 return true 2556 } 2557 // match: (CSELULT0 x (FlagGT_ULT)) 2558 // cond: 2559 // result: x 2560 for { 2561 x := v.Args[0] 2562 v_1 := v.Args[1] 2563 if v_1.Op != OpARM64FlagGT_ULT { 2564 break 2565 } 2566 v.reset(OpCopy) 2567 v.Type = x.Type 2568 v.AddArg(x) 2569 return true 2570 } 2571 // match: (CSELULT0 _ (FlagGT_UGT)) 2572 // cond: 2573 // result: (MOVDconst [0]) 2574 for { 2575 v_1 := v.Args[1] 2576 if v_1.Op != OpARM64FlagGT_UGT { 2577 break 2578 } 2579 v.reset(OpARM64MOVDconst) 2580 v.AuxInt = 0 2581 return true 2582 } 2583 return false 2584 } 2585 func rewriteValueARM64_OpARM64DIV(v *Value) bool { 2586 // match: (DIV (MOVDconst [c]) (MOVDconst [d])) 2587 // cond: 2588 // result: (MOVDconst [int64(c)/int64(d)]) 2589 for { 2590 v_0 := v.Args[0] 2591 if v_0.Op != OpARM64MOVDconst { 2592 break 2593 } 2594 c := v_0.AuxInt 2595 v_1 := v.Args[1] 2596 if v_1.Op != OpARM64MOVDconst { 2597 break 2598 } 2599 d := v_1.AuxInt 2600 v.reset(OpARM64MOVDconst) 2601 v.AuxInt = int64(c) / int64(d) 2602 return true 2603 } 2604 return false 2605 } 2606 func rewriteValueARM64_OpARM64DIVW(v *Value) bool { 2607 // match: (DIVW (MOVDconst [c]) (MOVDconst [d])) 2608 // cond: 2609 // result: (MOVDconst [int64(int32(c)/int32(d))]) 2610 for { 2611 v_0 := v.Args[0] 2612 if v_0.Op != OpARM64MOVDconst { 2613 break 2614 } 2615 c := v_0.AuxInt 2616 v_1 := v.Args[1] 2617 if v_1.Op != OpARM64MOVDconst { 2618 break 2619 } 2620 d := v_1.AuxInt 2621 v.reset(OpARM64MOVDconst) 2622 v.AuxInt = int64(int32(c) / int32(d)) 2623 return true 2624 } 2625 return false 2626 } 2627 func rewriteValueARM64_OpARM64Equal(v *Value) bool { 2628 // match: (Equal (FlagEQ)) 2629 // cond: 2630 // result: (MOVDconst [1]) 2631 for { 2632 v_0 := v.Args[0] 2633 if v_0.Op != OpARM64FlagEQ { 2634 break 2635 } 2636 v.reset(OpARM64MOVDconst) 2637 v.AuxInt = 1 2638 return true 2639 } 2640 // match: (Equal (FlagLT_ULT)) 2641 // cond: 2642 // result: (MOVDconst [0]) 2643 for { 2644 v_0 := v.Args[0] 2645 if v_0.Op != OpARM64FlagLT_ULT { 2646 break 2647 } 2648 v.reset(OpARM64MOVDconst) 2649 v.AuxInt = 0 2650 return true 2651 } 2652 // match: (Equal (FlagLT_UGT)) 2653 // cond: 2654 // result: (MOVDconst [0]) 2655 for { 2656 v_0 := v.Args[0] 2657 if v_0.Op != OpARM64FlagLT_UGT { 2658 break 2659 } 2660 v.reset(OpARM64MOVDconst) 2661 v.AuxInt = 0 2662 return true 2663 } 2664 // match: (Equal (FlagGT_ULT)) 2665 // cond: 2666 // result: (MOVDconst [0]) 2667 for { 2668 v_0 := v.Args[0] 2669 if v_0.Op != OpARM64FlagGT_ULT { 2670 break 2671 } 2672 v.reset(OpARM64MOVDconst) 2673 v.AuxInt = 0 2674 return true 2675 } 2676 // match: (Equal (FlagGT_UGT)) 2677 // cond: 2678 // result: (MOVDconst [0]) 2679 for { 2680 v_0 := v.Args[0] 2681 if v_0.Op != OpARM64FlagGT_UGT { 2682 break 2683 } 2684 v.reset(OpARM64MOVDconst) 2685 v.AuxInt = 0 2686 return true 2687 } 2688 // match: (Equal (InvertFlags x)) 2689 // cond: 2690 // result: (Equal x) 2691 for { 2692 v_0 := v.Args[0] 2693 if v_0.Op != OpARM64InvertFlags { 2694 break 2695 } 2696 x := v_0.Args[0] 2697 v.reset(OpARM64Equal) 2698 v.AddArg(x) 2699 return true 2700 } 2701 return false 2702 } 2703 func rewriteValueARM64_OpARM64FMOVDload(v *Value) bool { 2704 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 2705 // cond: fitsARM64Offset(off1+off2, 8, sym) 2706 // result: (FMOVDload [off1+off2] {sym} ptr mem) 2707 for { 2708 off1 := v.AuxInt 2709 sym := v.Aux 2710 v_0 := v.Args[0] 2711 if v_0.Op != OpARM64ADDconst { 2712 break 2713 } 2714 off2 := v_0.AuxInt 2715 ptr := v_0.Args[0] 2716 mem := v.Args[1] 2717 if !(fitsARM64Offset(off1+off2, 8, sym)) { 2718 break 2719 } 2720 v.reset(OpARM64FMOVDload) 2721 v.AuxInt = off1 + off2 2722 v.Aux = sym 2723 v.AddArg(ptr) 2724 v.AddArg(mem) 2725 return true 2726 } 2727 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 2728 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2)) 2729 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 2730 for { 2731 off1 := v.AuxInt 2732 sym1 := v.Aux 2733 v_0 := v.Args[0] 2734 if v_0.Op != OpARM64MOVDaddr { 2735 break 2736 } 2737 off2 := v_0.AuxInt 2738 sym2 := v_0.Aux 2739 ptr := v_0.Args[0] 2740 mem := v.Args[1] 2741 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2))) { 2742 break 2743 } 2744 v.reset(OpARM64FMOVDload) 2745 v.AuxInt = off1 + off2 2746 v.Aux = mergeSym(sym1, sym2) 2747 v.AddArg(ptr) 2748 v.AddArg(mem) 2749 return true 2750 } 2751 return false 2752 } 2753 func rewriteValueARM64_OpARM64FMOVDstore(v *Value) bool { 2754 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 2755 // cond: fitsARM64Offset(off1+off2, 8, sym) 2756 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 2757 for { 2758 off1 := v.AuxInt 2759 sym := v.Aux 2760 v_0 := v.Args[0] 2761 if v_0.Op != OpARM64ADDconst { 2762 break 2763 } 2764 off2 := v_0.AuxInt 2765 ptr := v_0.Args[0] 2766 val := v.Args[1] 2767 mem := v.Args[2] 2768 if !(fitsARM64Offset(off1+off2, 8, sym)) { 2769 break 2770 } 2771 v.reset(OpARM64FMOVDstore) 2772 v.AuxInt = off1 + off2 2773 v.Aux = sym 2774 v.AddArg(ptr) 2775 v.AddArg(val) 2776 v.AddArg(mem) 2777 return true 2778 } 2779 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 2780 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2)) 2781 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 2782 for { 2783 off1 := v.AuxInt 2784 sym1 := v.Aux 2785 v_0 := v.Args[0] 2786 if v_0.Op != OpARM64MOVDaddr { 2787 break 2788 } 2789 off2 := v_0.AuxInt 2790 sym2 := v_0.Aux 2791 ptr := v_0.Args[0] 2792 val := v.Args[1] 2793 mem := v.Args[2] 2794 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2))) { 2795 break 2796 } 2797 v.reset(OpARM64FMOVDstore) 2798 v.AuxInt = off1 + off2 2799 v.Aux = mergeSym(sym1, sym2) 2800 v.AddArg(ptr) 2801 v.AddArg(val) 2802 v.AddArg(mem) 2803 return true 2804 } 2805 return false 2806 } 2807 func rewriteValueARM64_OpARM64FMOVSload(v *Value) bool { 2808 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 2809 // cond: fitsARM64Offset(off1+off2, 4, sym) 2810 // result: (FMOVSload [off1+off2] {sym} ptr mem) 2811 for { 2812 off1 := v.AuxInt 2813 sym := v.Aux 2814 v_0 := v.Args[0] 2815 if v_0.Op != OpARM64ADDconst { 2816 break 2817 } 2818 off2 := v_0.AuxInt 2819 ptr := v_0.Args[0] 2820 mem := v.Args[1] 2821 if !(fitsARM64Offset(off1+off2, 4, sym)) { 2822 break 2823 } 2824 v.reset(OpARM64FMOVSload) 2825 v.AuxInt = off1 + off2 2826 v.Aux = sym 2827 v.AddArg(ptr) 2828 v.AddArg(mem) 2829 return true 2830 } 2831 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 2832 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 2833 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 2834 for { 2835 off1 := v.AuxInt 2836 sym1 := v.Aux 2837 v_0 := v.Args[0] 2838 if v_0.Op != OpARM64MOVDaddr { 2839 break 2840 } 2841 off2 := v_0.AuxInt 2842 sym2 := v_0.Aux 2843 ptr := v_0.Args[0] 2844 mem := v.Args[1] 2845 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 2846 break 2847 } 2848 v.reset(OpARM64FMOVSload) 2849 v.AuxInt = off1 + off2 2850 v.Aux = mergeSym(sym1, sym2) 2851 v.AddArg(ptr) 2852 v.AddArg(mem) 2853 return true 2854 } 2855 return false 2856 } 2857 func rewriteValueARM64_OpARM64FMOVSstore(v *Value) bool { 2858 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 2859 // cond: fitsARM64Offset(off1+off2, 4, sym) 2860 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 2861 for { 2862 off1 := v.AuxInt 2863 sym := v.Aux 2864 v_0 := v.Args[0] 2865 if v_0.Op != OpARM64ADDconst { 2866 break 2867 } 2868 off2 := v_0.AuxInt 2869 ptr := v_0.Args[0] 2870 val := v.Args[1] 2871 mem := v.Args[2] 2872 if !(fitsARM64Offset(off1+off2, 4, sym)) { 2873 break 2874 } 2875 v.reset(OpARM64FMOVSstore) 2876 v.AuxInt = off1 + off2 2877 v.Aux = sym 2878 v.AddArg(ptr) 2879 v.AddArg(val) 2880 v.AddArg(mem) 2881 return true 2882 } 2883 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 2884 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 2885 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 2886 for { 2887 off1 := v.AuxInt 2888 sym1 := v.Aux 2889 v_0 := v.Args[0] 2890 if v_0.Op != OpARM64MOVDaddr { 2891 break 2892 } 2893 off2 := v_0.AuxInt 2894 sym2 := v_0.Aux 2895 ptr := v_0.Args[0] 2896 val := v.Args[1] 2897 mem := v.Args[2] 2898 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 2899 break 2900 } 2901 v.reset(OpARM64FMOVSstore) 2902 v.AuxInt = off1 + off2 2903 v.Aux = mergeSym(sym1, sym2) 2904 v.AddArg(ptr) 2905 v.AddArg(val) 2906 v.AddArg(mem) 2907 return true 2908 } 2909 return false 2910 } 2911 func rewriteValueARM64_OpARM64GreaterEqual(v *Value) bool { 2912 // match: (GreaterEqual (FlagEQ)) 2913 // cond: 2914 // result: (MOVDconst [1]) 2915 for { 2916 v_0 := v.Args[0] 2917 if v_0.Op != OpARM64FlagEQ { 2918 break 2919 } 2920 v.reset(OpARM64MOVDconst) 2921 v.AuxInt = 1 2922 return true 2923 } 2924 // match: (GreaterEqual (FlagLT_ULT)) 2925 // cond: 2926 // result: (MOVDconst [0]) 2927 for { 2928 v_0 := v.Args[0] 2929 if v_0.Op != OpARM64FlagLT_ULT { 2930 break 2931 } 2932 v.reset(OpARM64MOVDconst) 2933 v.AuxInt = 0 2934 return true 2935 } 2936 // match: (GreaterEqual (FlagLT_UGT)) 2937 // cond: 2938 // result: (MOVDconst [0]) 2939 for { 2940 v_0 := v.Args[0] 2941 if v_0.Op != OpARM64FlagLT_UGT { 2942 break 2943 } 2944 v.reset(OpARM64MOVDconst) 2945 v.AuxInt = 0 2946 return true 2947 } 2948 // match: (GreaterEqual (FlagGT_ULT)) 2949 // cond: 2950 // result: (MOVDconst [1]) 2951 for { 2952 v_0 := v.Args[0] 2953 if v_0.Op != OpARM64FlagGT_ULT { 2954 break 2955 } 2956 v.reset(OpARM64MOVDconst) 2957 v.AuxInt = 1 2958 return true 2959 } 2960 // match: (GreaterEqual (FlagGT_UGT)) 2961 // cond: 2962 // result: (MOVDconst [1]) 2963 for { 2964 v_0 := v.Args[0] 2965 if v_0.Op != OpARM64FlagGT_UGT { 2966 break 2967 } 2968 v.reset(OpARM64MOVDconst) 2969 v.AuxInt = 1 2970 return true 2971 } 2972 // match: (GreaterEqual (InvertFlags x)) 2973 // cond: 2974 // result: (LessEqual x) 2975 for { 2976 v_0 := v.Args[0] 2977 if v_0.Op != OpARM64InvertFlags { 2978 break 2979 } 2980 x := v_0.Args[0] 2981 v.reset(OpARM64LessEqual) 2982 v.AddArg(x) 2983 return true 2984 } 2985 return false 2986 } 2987 func rewriteValueARM64_OpARM64GreaterEqualU(v *Value) bool { 2988 // match: (GreaterEqualU (FlagEQ)) 2989 // cond: 2990 // result: (MOVDconst [1]) 2991 for { 2992 v_0 := v.Args[0] 2993 if v_0.Op != OpARM64FlagEQ { 2994 break 2995 } 2996 v.reset(OpARM64MOVDconst) 2997 v.AuxInt = 1 2998 return true 2999 } 3000 // match: (GreaterEqualU (FlagLT_ULT)) 3001 // cond: 3002 // result: (MOVDconst [0]) 3003 for { 3004 v_0 := v.Args[0] 3005 if v_0.Op != OpARM64FlagLT_ULT { 3006 break 3007 } 3008 v.reset(OpARM64MOVDconst) 3009 v.AuxInt = 0 3010 return true 3011 } 3012 // match: (GreaterEqualU (FlagLT_UGT)) 3013 // cond: 3014 // result: (MOVDconst [1]) 3015 for { 3016 v_0 := v.Args[0] 3017 if v_0.Op != OpARM64FlagLT_UGT { 3018 break 3019 } 3020 v.reset(OpARM64MOVDconst) 3021 v.AuxInt = 1 3022 return true 3023 } 3024 // match: (GreaterEqualU (FlagGT_ULT)) 3025 // cond: 3026 // result: (MOVDconst [0]) 3027 for { 3028 v_0 := v.Args[0] 3029 if v_0.Op != OpARM64FlagGT_ULT { 3030 break 3031 } 3032 v.reset(OpARM64MOVDconst) 3033 v.AuxInt = 0 3034 return true 3035 } 3036 // match: (GreaterEqualU (FlagGT_UGT)) 3037 // cond: 3038 // result: (MOVDconst [1]) 3039 for { 3040 v_0 := v.Args[0] 3041 if v_0.Op != OpARM64FlagGT_UGT { 3042 break 3043 } 3044 v.reset(OpARM64MOVDconst) 3045 v.AuxInt = 1 3046 return true 3047 } 3048 // match: (GreaterEqualU (InvertFlags x)) 3049 // cond: 3050 // result: (LessEqualU x) 3051 for { 3052 v_0 := v.Args[0] 3053 if v_0.Op != OpARM64InvertFlags { 3054 break 3055 } 3056 x := v_0.Args[0] 3057 v.reset(OpARM64LessEqualU) 3058 v.AddArg(x) 3059 return true 3060 } 3061 return false 3062 } 3063 func rewriteValueARM64_OpARM64GreaterThan(v *Value) bool { 3064 // match: (GreaterThan (FlagEQ)) 3065 // cond: 3066 // result: (MOVDconst [0]) 3067 for { 3068 v_0 := v.Args[0] 3069 if v_0.Op != OpARM64FlagEQ { 3070 break 3071 } 3072 v.reset(OpARM64MOVDconst) 3073 v.AuxInt = 0 3074 return true 3075 } 3076 // match: (GreaterThan (FlagLT_ULT)) 3077 // cond: 3078 // result: (MOVDconst [0]) 3079 for { 3080 v_0 := v.Args[0] 3081 if v_0.Op != OpARM64FlagLT_ULT { 3082 break 3083 } 3084 v.reset(OpARM64MOVDconst) 3085 v.AuxInt = 0 3086 return true 3087 } 3088 // match: (GreaterThan (FlagLT_UGT)) 3089 // cond: 3090 // result: (MOVDconst [0]) 3091 for { 3092 v_0 := v.Args[0] 3093 if v_0.Op != OpARM64FlagLT_UGT { 3094 break 3095 } 3096 v.reset(OpARM64MOVDconst) 3097 v.AuxInt = 0 3098 return true 3099 } 3100 // match: (GreaterThan (FlagGT_ULT)) 3101 // cond: 3102 // result: (MOVDconst [1]) 3103 for { 3104 v_0 := v.Args[0] 3105 if v_0.Op != OpARM64FlagGT_ULT { 3106 break 3107 } 3108 v.reset(OpARM64MOVDconst) 3109 v.AuxInt = 1 3110 return true 3111 } 3112 // match: (GreaterThan (FlagGT_UGT)) 3113 // cond: 3114 // result: (MOVDconst [1]) 3115 for { 3116 v_0 := v.Args[0] 3117 if v_0.Op != OpARM64FlagGT_UGT { 3118 break 3119 } 3120 v.reset(OpARM64MOVDconst) 3121 v.AuxInt = 1 3122 return true 3123 } 3124 // match: (GreaterThan (InvertFlags x)) 3125 // cond: 3126 // result: (LessThan x) 3127 for { 3128 v_0 := v.Args[0] 3129 if v_0.Op != OpARM64InvertFlags { 3130 break 3131 } 3132 x := v_0.Args[0] 3133 v.reset(OpARM64LessThan) 3134 v.AddArg(x) 3135 return true 3136 } 3137 return false 3138 } 3139 func rewriteValueARM64_OpARM64GreaterThanU(v *Value) bool { 3140 // match: (GreaterThanU (FlagEQ)) 3141 // cond: 3142 // result: (MOVDconst [0]) 3143 for { 3144 v_0 := v.Args[0] 3145 if v_0.Op != OpARM64FlagEQ { 3146 break 3147 } 3148 v.reset(OpARM64MOVDconst) 3149 v.AuxInt = 0 3150 return true 3151 } 3152 // match: (GreaterThanU (FlagLT_ULT)) 3153 // cond: 3154 // result: (MOVDconst [0]) 3155 for { 3156 v_0 := v.Args[0] 3157 if v_0.Op != OpARM64FlagLT_ULT { 3158 break 3159 } 3160 v.reset(OpARM64MOVDconst) 3161 v.AuxInt = 0 3162 return true 3163 } 3164 // match: (GreaterThanU (FlagLT_UGT)) 3165 // cond: 3166 // result: (MOVDconst [1]) 3167 for { 3168 v_0 := v.Args[0] 3169 if v_0.Op != OpARM64FlagLT_UGT { 3170 break 3171 } 3172 v.reset(OpARM64MOVDconst) 3173 v.AuxInt = 1 3174 return true 3175 } 3176 // match: (GreaterThanU (FlagGT_ULT)) 3177 // cond: 3178 // result: (MOVDconst [0]) 3179 for { 3180 v_0 := v.Args[0] 3181 if v_0.Op != OpARM64FlagGT_ULT { 3182 break 3183 } 3184 v.reset(OpARM64MOVDconst) 3185 v.AuxInt = 0 3186 return true 3187 } 3188 // match: (GreaterThanU (FlagGT_UGT)) 3189 // cond: 3190 // result: (MOVDconst [1]) 3191 for { 3192 v_0 := v.Args[0] 3193 if v_0.Op != OpARM64FlagGT_UGT { 3194 break 3195 } 3196 v.reset(OpARM64MOVDconst) 3197 v.AuxInt = 1 3198 return true 3199 } 3200 // match: (GreaterThanU (InvertFlags x)) 3201 // cond: 3202 // result: (LessThanU x) 3203 for { 3204 v_0 := v.Args[0] 3205 if v_0.Op != OpARM64InvertFlags { 3206 break 3207 } 3208 x := v_0.Args[0] 3209 v.reset(OpARM64LessThanU) 3210 v.AddArg(x) 3211 return true 3212 } 3213 return false 3214 } 3215 func rewriteValueARM64_OpARM64LessEqual(v *Value) bool { 3216 // match: (LessEqual (FlagEQ)) 3217 // cond: 3218 // result: (MOVDconst [1]) 3219 for { 3220 v_0 := v.Args[0] 3221 if v_0.Op != OpARM64FlagEQ { 3222 break 3223 } 3224 v.reset(OpARM64MOVDconst) 3225 v.AuxInt = 1 3226 return true 3227 } 3228 // match: (LessEqual (FlagLT_ULT)) 3229 // cond: 3230 // result: (MOVDconst [1]) 3231 for { 3232 v_0 := v.Args[0] 3233 if v_0.Op != OpARM64FlagLT_ULT { 3234 break 3235 } 3236 v.reset(OpARM64MOVDconst) 3237 v.AuxInt = 1 3238 return true 3239 } 3240 // match: (LessEqual (FlagLT_UGT)) 3241 // cond: 3242 // result: (MOVDconst [1]) 3243 for { 3244 v_0 := v.Args[0] 3245 if v_0.Op != OpARM64FlagLT_UGT { 3246 break 3247 } 3248 v.reset(OpARM64MOVDconst) 3249 v.AuxInt = 1 3250 return true 3251 } 3252 // match: (LessEqual (FlagGT_ULT)) 3253 // cond: 3254 // result: (MOVDconst [0]) 3255 for { 3256 v_0 := v.Args[0] 3257 if v_0.Op != OpARM64FlagGT_ULT { 3258 break 3259 } 3260 v.reset(OpARM64MOVDconst) 3261 v.AuxInt = 0 3262 return true 3263 } 3264 // match: (LessEqual (FlagGT_UGT)) 3265 // cond: 3266 // result: (MOVDconst [0]) 3267 for { 3268 v_0 := v.Args[0] 3269 if v_0.Op != OpARM64FlagGT_UGT { 3270 break 3271 } 3272 v.reset(OpARM64MOVDconst) 3273 v.AuxInt = 0 3274 return true 3275 } 3276 // match: (LessEqual (InvertFlags x)) 3277 // cond: 3278 // result: (GreaterEqual x) 3279 for { 3280 v_0 := v.Args[0] 3281 if v_0.Op != OpARM64InvertFlags { 3282 break 3283 } 3284 x := v_0.Args[0] 3285 v.reset(OpARM64GreaterEqual) 3286 v.AddArg(x) 3287 return true 3288 } 3289 return false 3290 } 3291 func rewriteValueARM64_OpARM64LessEqualU(v *Value) bool { 3292 // match: (LessEqualU (FlagEQ)) 3293 // cond: 3294 // result: (MOVDconst [1]) 3295 for { 3296 v_0 := v.Args[0] 3297 if v_0.Op != OpARM64FlagEQ { 3298 break 3299 } 3300 v.reset(OpARM64MOVDconst) 3301 v.AuxInt = 1 3302 return true 3303 } 3304 // match: (LessEqualU (FlagLT_ULT)) 3305 // cond: 3306 // result: (MOVDconst [1]) 3307 for { 3308 v_0 := v.Args[0] 3309 if v_0.Op != OpARM64FlagLT_ULT { 3310 break 3311 } 3312 v.reset(OpARM64MOVDconst) 3313 v.AuxInt = 1 3314 return true 3315 } 3316 // match: (LessEqualU (FlagLT_UGT)) 3317 // cond: 3318 // result: (MOVDconst [0]) 3319 for { 3320 v_0 := v.Args[0] 3321 if v_0.Op != OpARM64FlagLT_UGT { 3322 break 3323 } 3324 v.reset(OpARM64MOVDconst) 3325 v.AuxInt = 0 3326 return true 3327 } 3328 // match: (LessEqualU (FlagGT_ULT)) 3329 // cond: 3330 // result: (MOVDconst [1]) 3331 for { 3332 v_0 := v.Args[0] 3333 if v_0.Op != OpARM64FlagGT_ULT { 3334 break 3335 } 3336 v.reset(OpARM64MOVDconst) 3337 v.AuxInt = 1 3338 return true 3339 } 3340 // match: (LessEqualU (FlagGT_UGT)) 3341 // cond: 3342 // result: (MOVDconst [0]) 3343 for { 3344 v_0 := v.Args[0] 3345 if v_0.Op != OpARM64FlagGT_UGT { 3346 break 3347 } 3348 v.reset(OpARM64MOVDconst) 3349 v.AuxInt = 0 3350 return true 3351 } 3352 // match: (LessEqualU (InvertFlags x)) 3353 // cond: 3354 // result: (GreaterEqualU x) 3355 for { 3356 v_0 := v.Args[0] 3357 if v_0.Op != OpARM64InvertFlags { 3358 break 3359 } 3360 x := v_0.Args[0] 3361 v.reset(OpARM64GreaterEqualU) 3362 v.AddArg(x) 3363 return true 3364 } 3365 return false 3366 } 3367 func rewriteValueARM64_OpARM64LessThan(v *Value) bool { 3368 // match: (LessThan (FlagEQ)) 3369 // cond: 3370 // result: (MOVDconst [0]) 3371 for { 3372 v_0 := v.Args[0] 3373 if v_0.Op != OpARM64FlagEQ { 3374 break 3375 } 3376 v.reset(OpARM64MOVDconst) 3377 v.AuxInt = 0 3378 return true 3379 } 3380 // match: (LessThan (FlagLT_ULT)) 3381 // cond: 3382 // result: (MOVDconst [1]) 3383 for { 3384 v_0 := v.Args[0] 3385 if v_0.Op != OpARM64FlagLT_ULT { 3386 break 3387 } 3388 v.reset(OpARM64MOVDconst) 3389 v.AuxInt = 1 3390 return true 3391 } 3392 // match: (LessThan (FlagLT_UGT)) 3393 // cond: 3394 // result: (MOVDconst [1]) 3395 for { 3396 v_0 := v.Args[0] 3397 if v_0.Op != OpARM64FlagLT_UGT { 3398 break 3399 } 3400 v.reset(OpARM64MOVDconst) 3401 v.AuxInt = 1 3402 return true 3403 } 3404 // match: (LessThan (FlagGT_ULT)) 3405 // cond: 3406 // result: (MOVDconst [0]) 3407 for { 3408 v_0 := v.Args[0] 3409 if v_0.Op != OpARM64FlagGT_ULT { 3410 break 3411 } 3412 v.reset(OpARM64MOVDconst) 3413 v.AuxInt = 0 3414 return true 3415 } 3416 // match: (LessThan (FlagGT_UGT)) 3417 // cond: 3418 // result: (MOVDconst [0]) 3419 for { 3420 v_0 := v.Args[0] 3421 if v_0.Op != OpARM64FlagGT_UGT { 3422 break 3423 } 3424 v.reset(OpARM64MOVDconst) 3425 v.AuxInt = 0 3426 return true 3427 } 3428 // match: (LessThan (InvertFlags x)) 3429 // cond: 3430 // result: (GreaterThan x) 3431 for { 3432 v_0 := v.Args[0] 3433 if v_0.Op != OpARM64InvertFlags { 3434 break 3435 } 3436 x := v_0.Args[0] 3437 v.reset(OpARM64GreaterThan) 3438 v.AddArg(x) 3439 return true 3440 } 3441 return false 3442 } 3443 func rewriteValueARM64_OpARM64LessThanU(v *Value) bool { 3444 // match: (LessThanU (FlagEQ)) 3445 // cond: 3446 // result: (MOVDconst [0]) 3447 for { 3448 v_0 := v.Args[0] 3449 if v_0.Op != OpARM64FlagEQ { 3450 break 3451 } 3452 v.reset(OpARM64MOVDconst) 3453 v.AuxInt = 0 3454 return true 3455 } 3456 // match: (LessThanU (FlagLT_ULT)) 3457 // cond: 3458 // result: (MOVDconst [1]) 3459 for { 3460 v_0 := v.Args[0] 3461 if v_0.Op != OpARM64FlagLT_ULT { 3462 break 3463 } 3464 v.reset(OpARM64MOVDconst) 3465 v.AuxInt = 1 3466 return true 3467 } 3468 // match: (LessThanU (FlagLT_UGT)) 3469 // cond: 3470 // result: (MOVDconst [0]) 3471 for { 3472 v_0 := v.Args[0] 3473 if v_0.Op != OpARM64FlagLT_UGT { 3474 break 3475 } 3476 v.reset(OpARM64MOVDconst) 3477 v.AuxInt = 0 3478 return true 3479 } 3480 // match: (LessThanU (FlagGT_ULT)) 3481 // cond: 3482 // result: (MOVDconst [1]) 3483 for { 3484 v_0 := v.Args[0] 3485 if v_0.Op != OpARM64FlagGT_ULT { 3486 break 3487 } 3488 v.reset(OpARM64MOVDconst) 3489 v.AuxInt = 1 3490 return true 3491 } 3492 // match: (LessThanU (FlagGT_UGT)) 3493 // cond: 3494 // result: (MOVDconst [0]) 3495 for { 3496 v_0 := v.Args[0] 3497 if v_0.Op != OpARM64FlagGT_UGT { 3498 break 3499 } 3500 v.reset(OpARM64MOVDconst) 3501 v.AuxInt = 0 3502 return true 3503 } 3504 // match: (LessThanU (InvertFlags x)) 3505 // cond: 3506 // result: (GreaterThanU x) 3507 for { 3508 v_0 := v.Args[0] 3509 if v_0.Op != OpARM64InvertFlags { 3510 break 3511 } 3512 x := v_0.Args[0] 3513 v.reset(OpARM64GreaterThanU) 3514 v.AddArg(x) 3515 return true 3516 } 3517 return false 3518 } 3519 func rewriteValueARM64_OpARM64MOD(v *Value) bool { 3520 // match: (MOD (MOVDconst [c]) (MOVDconst [d])) 3521 // cond: 3522 // result: (MOVDconst [int64(c)%int64(d)]) 3523 for { 3524 v_0 := v.Args[0] 3525 if v_0.Op != OpARM64MOVDconst { 3526 break 3527 } 3528 c := v_0.AuxInt 3529 v_1 := v.Args[1] 3530 if v_1.Op != OpARM64MOVDconst { 3531 break 3532 } 3533 d := v_1.AuxInt 3534 v.reset(OpARM64MOVDconst) 3535 v.AuxInt = int64(c) % int64(d) 3536 return true 3537 } 3538 return false 3539 } 3540 func rewriteValueARM64_OpARM64MODW(v *Value) bool { 3541 // match: (MODW (MOVDconst [c]) (MOVDconst [d])) 3542 // cond: 3543 // result: (MOVDconst [int64(int32(c)%int32(d))]) 3544 for { 3545 v_0 := v.Args[0] 3546 if v_0.Op != OpARM64MOVDconst { 3547 break 3548 } 3549 c := v_0.AuxInt 3550 v_1 := v.Args[1] 3551 if v_1.Op != OpARM64MOVDconst { 3552 break 3553 } 3554 d := v_1.AuxInt 3555 v.reset(OpARM64MOVDconst) 3556 v.AuxInt = int64(int32(c) % int32(d)) 3557 return true 3558 } 3559 return false 3560 } 3561 func rewriteValueARM64_OpARM64MOVBUload(v *Value) bool { 3562 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 3563 // cond: fitsARM64Offset(off1+off2, 1, sym) 3564 // result: (MOVBUload [off1+off2] {sym} ptr mem) 3565 for { 3566 off1 := v.AuxInt 3567 sym := v.Aux 3568 v_0 := v.Args[0] 3569 if v_0.Op != OpARM64ADDconst { 3570 break 3571 } 3572 off2 := v_0.AuxInt 3573 ptr := v_0.Args[0] 3574 mem := v.Args[1] 3575 if !(fitsARM64Offset(off1+off2, 1, sym)) { 3576 break 3577 } 3578 v.reset(OpARM64MOVBUload) 3579 v.AuxInt = off1 + off2 3580 v.Aux = sym 3581 v.AddArg(ptr) 3582 v.AddArg(mem) 3583 return true 3584 } 3585 // match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3586 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2)) 3587 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3588 for { 3589 off1 := v.AuxInt 3590 sym1 := v.Aux 3591 v_0 := v.Args[0] 3592 if v_0.Op != OpARM64MOVDaddr { 3593 break 3594 } 3595 off2 := v_0.AuxInt 3596 sym2 := v_0.Aux 3597 ptr := v_0.Args[0] 3598 mem := v.Args[1] 3599 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2))) { 3600 break 3601 } 3602 v.reset(OpARM64MOVBUload) 3603 v.AuxInt = off1 + off2 3604 v.Aux = mergeSym(sym1, sym2) 3605 v.AddArg(ptr) 3606 v.AddArg(mem) 3607 return true 3608 } 3609 // match: (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3610 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3611 // result: (MOVDconst [0]) 3612 for { 3613 off := v.AuxInt 3614 sym := v.Aux 3615 ptr := v.Args[0] 3616 v_1 := v.Args[1] 3617 if v_1.Op != OpARM64MOVBstorezero { 3618 break 3619 } 3620 off2 := v_1.AuxInt 3621 sym2 := v_1.Aux 3622 ptr2 := v_1.Args[0] 3623 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3624 break 3625 } 3626 v.reset(OpARM64MOVDconst) 3627 v.AuxInt = 0 3628 return true 3629 } 3630 return false 3631 } 3632 func rewriteValueARM64_OpARM64MOVBUreg(v *Value) bool { 3633 // match: (MOVBUreg x:(MOVBUload _ _)) 3634 // cond: 3635 // result: (MOVDreg x) 3636 for { 3637 x := v.Args[0] 3638 if x.Op != OpARM64MOVBUload { 3639 break 3640 } 3641 v.reset(OpARM64MOVDreg) 3642 v.AddArg(x) 3643 return true 3644 } 3645 // match: (MOVBUreg x:(MOVBUreg _)) 3646 // cond: 3647 // result: (MOVDreg x) 3648 for { 3649 x := v.Args[0] 3650 if x.Op != OpARM64MOVBUreg { 3651 break 3652 } 3653 v.reset(OpARM64MOVDreg) 3654 v.AddArg(x) 3655 return true 3656 } 3657 // match: (MOVBUreg (MOVDconst [c])) 3658 // cond: 3659 // result: (MOVDconst [int64(uint8(c))]) 3660 for { 3661 v_0 := v.Args[0] 3662 if v_0.Op != OpARM64MOVDconst { 3663 break 3664 } 3665 c := v_0.AuxInt 3666 v.reset(OpARM64MOVDconst) 3667 v.AuxInt = int64(uint8(c)) 3668 return true 3669 } 3670 return false 3671 } 3672 func rewriteValueARM64_OpARM64MOVBload(v *Value) bool { 3673 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 3674 // cond: fitsARM64Offset(off1+off2, 1, sym) 3675 // result: (MOVBload [off1+off2] {sym} ptr mem) 3676 for { 3677 off1 := v.AuxInt 3678 sym := v.Aux 3679 v_0 := v.Args[0] 3680 if v_0.Op != OpARM64ADDconst { 3681 break 3682 } 3683 off2 := v_0.AuxInt 3684 ptr := v_0.Args[0] 3685 mem := v.Args[1] 3686 if !(fitsARM64Offset(off1+off2, 1, sym)) { 3687 break 3688 } 3689 v.reset(OpARM64MOVBload) 3690 v.AuxInt = off1 + off2 3691 v.Aux = sym 3692 v.AddArg(ptr) 3693 v.AddArg(mem) 3694 return true 3695 } 3696 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3697 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2)) 3698 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3699 for { 3700 off1 := v.AuxInt 3701 sym1 := v.Aux 3702 v_0 := v.Args[0] 3703 if v_0.Op != OpARM64MOVDaddr { 3704 break 3705 } 3706 off2 := v_0.AuxInt 3707 sym2 := v_0.Aux 3708 ptr := v_0.Args[0] 3709 mem := v.Args[1] 3710 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2))) { 3711 break 3712 } 3713 v.reset(OpARM64MOVBload) 3714 v.AuxInt = off1 + off2 3715 v.Aux = mergeSym(sym1, sym2) 3716 v.AddArg(ptr) 3717 v.AddArg(mem) 3718 return true 3719 } 3720 // match: (MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3721 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3722 // result: (MOVDconst [0]) 3723 for { 3724 off := v.AuxInt 3725 sym := v.Aux 3726 ptr := v.Args[0] 3727 v_1 := v.Args[1] 3728 if v_1.Op != OpARM64MOVBstorezero { 3729 break 3730 } 3731 off2 := v_1.AuxInt 3732 sym2 := v_1.Aux 3733 ptr2 := v_1.Args[0] 3734 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3735 break 3736 } 3737 v.reset(OpARM64MOVDconst) 3738 v.AuxInt = 0 3739 return true 3740 } 3741 return false 3742 } 3743 func rewriteValueARM64_OpARM64MOVBreg(v *Value) bool { 3744 // match: (MOVBreg x:(MOVBload _ _)) 3745 // cond: 3746 // result: (MOVDreg x) 3747 for { 3748 x := v.Args[0] 3749 if x.Op != OpARM64MOVBload { 3750 break 3751 } 3752 v.reset(OpARM64MOVDreg) 3753 v.AddArg(x) 3754 return true 3755 } 3756 // match: (MOVBreg x:(MOVBreg _)) 3757 // cond: 3758 // result: (MOVDreg x) 3759 for { 3760 x := v.Args[0] 3761 if x.Op != OpARM64MOVBreg { 3762 break 3763 } 3764 v.reset(OpARM64MOVDreg) 3765 v.AddArg(x) 3766 return true 3767 } 3768 // match: (MOVBreg (MOVDconst [c])) 3769 // cond: 3770 // result: (MOVDconst [int64(int8(c))]) 3771 for { 3772 v_0 := v.Args[0] 3773 if v_0.Op != OpARM64MOVDconst { 3774 break 3775 } 3776 c := v_0.AuxInt 3777 v.reset(OpARM64MOVDconst) 3778 v.AuxInt = int64(int8(c)) 3779 return true 3780 } 3781 return false 3782 } 3783 func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 3784 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 3785 // cond: fitsARM64Offset(off1+off2, 1, sym) 3786 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3787 for { 3788 off1 := v.AuxInt 3789 sym := v.Aux 3790 v_0 := v.Args[0] 3791 if v_0.Op != OpARM64ADDconst { 3792 break 3793 } 3794 off2 := v_0.AuxInt 3795 ptr := v_0.Args[0] 3796 val := v.Args[1] 3797 mem := v.Args[2] 3798 if !(fitsARM64Offset(off1+off2, 1, sym)) { 3799 break 3800 } 3801 v.reset(OpARM64MOVBstore) 3802 v.AuxInt = off1 + off2 3803 v.Aux = sym 3804 v.AddArg(ptr) 3805 v.AddArg(val) 3806 v.AddArg(mem) 3807 return true 3808 } 3809 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 3810 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2)) 3811 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 3812 for { 3813 off1 := v.AuxInt 3814 sym1 := v.Aux 3815 v_0 := v.Args[0] 3816 if v_0.Op != OpARM64MOVDaddr { 3817 break 3818 } 3819 off2 := v_0.AuxInt 3820 sym2 := v_0.Aux 3821 ptr := v_0.Args[0] 3822 val := v.Args[1] 3823 mem := v.Args[2] 3824 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2))) { 3825 break 3826 } 3827 v.reset(OpARM64MOVBstore) 3828 v.AuxInt = off1 + off2 3829 v.Aux = mergeSym(sym1, sym2) 3830 v.AddArg(ptr) 3831 v.AddArg(val) 3832 v.AddArg(mem) 3833 return true 3834 } 3835 // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) 3836 // cond: 3837 // result: (MOVBstorezero [off] {sym} ptr mem) 3838 for { 3839 off := v.AuxInt 3840 sym := v.Aux 3841 ptr := v.Args[0] 3842 v_1 := v.Args[1] 3843 if v_1.Op != OpARM64MOVDconst { 3844 break 3845 } 3846 if v_1.AuxInt != 0 { 3847 break 3848 } 3849 mem := v.Args[2] 3850 v.reset(OpARM64MOVBstorezero) 3851 v.AuxInt = off 3852 v.Aux = sym 3853 v.AddArg(ptr) 3854 v.AddArg(mem) 3855 return true 3856 } 3857 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 3858 // cond: 3859 // result: (MOVBstore [off] {sym} ptr x mem) 3860 for { 3861 off := v.AuxInt 3862 sym := v.Aux 3863 ptr := v.Args[0] 3864 v_1 := v.Args[1] 3865 if v_1.Op != OpARM64MOVBreg { 3866 break 3867 } 3868 x := v_1.Args[0] 3869 mem := v.Args[2] 3870 v.reset(OpARM64MOVBstore) 3871 v.AuxInt = off 3872 v.Aux = sym 3873 v.AddArg(ptr) 3874 v.AddArg(x) 3875 v.AddArg(mem) 3876 return true 3877 } 3878 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 3879 // cond: 3880 // result: (MOVBstore [off] {sym} ptr x mem) 3881 for { 3882 off := v.AuxInt 3883 sym := v.Aux 3884 ptr := v.Args[0] 3885 v_1 := v.Args[1] 3886 if v_1.Op != OpARM64MOVBUreg { 3887 break 3888 } 3889 x := v_1.Args[0] 3890 mem := v.Args[2] 3891 v.reset(OpARM64MOVBstore) 3892 v.AuxInt = off 3893 v.Aux = sym 3894 v.AddArg(ptr) 3895 v.AddArg(x) 3896 v.AddArg(mem) 3897 return true 3898 } 3899 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 3900 // cond: 3901 // result: (MOVBstore [off] {sym} ptr x mem) 3902 for { 3903 off := v.AuxInt 3904 sym := v.Aux 3905 ptr := v.Args[0] 3906 v_1 := v.Args[1] 3907 if v_1.Op != OpARM64MOVHreg { 3908 break 3909 } 3910 x := v_1.Args[0] 3911 mem := v.Args[2] 3912 v.reset(OpARM64MOVBstore) 3913 v.AuxInt = off 3914 v.Aux = sym 3915 v.AddArg(ptr) 3916 v.AddArg(x) 3917 v.AddArg(mem) 3918 return true 3919 } 3920 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 3921 // cond: 3922 // result: (MOVBstore [off] {sym} ptr x mem) 3923 for { 3924 off := v.AuxInt 3925 sym := v.Aux 3926 ptr := v.Args[0] 3927 v_1 := v.Args[1] 3928 if v_1.Op != OpARM64MOVHUreg { 3929 break 3930 } 3931 x := v_1.Args[0] 3932 mem := v.Args[2] 3933 v.reset(OpARM64MOVBstore) 3934 v.AuxInt = off 3935 v.Aux = sym 3936 v.AddArg(ptr) 3937 v.AddArg(x) 3938 v.AddArg(mem) 3939 return true 3940 } 3941 // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) 3942 // cond: 3943 // result: (MOVBstore [off] {sym} ptr x mem) 3944 for { 3945 off := v.AuxInt 3946 sym := v.Aux 3947 ptr := v.Args[0] 3948 v_1 := v.Args[1] 3949 if v_1.Op != OpARM64MOVWreg { 3950 break 3951 } 3952 x := v_1.Args[0] 3953 mem := v.Args[2] 3954 v.reset(OpARM64MOVBstore) 3955 v.AuxInt = off 3956 v.Aux = sym 3957 v.AddArg(ptr) 3958 v.AddArg(x) 3959 v.AddArg(mem) 3960 return true 3961 } 3962 // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) 3963 // cond: 3964 // result: (MOVBstore [off] {sym} ptr x mem) 3965 for { 3966 off := v.AuxInt 3967 sym := v.Aux 3968 ptr := v.Args[0] 3969 v_1 := v.Args[1] 3970 if v_1.Op != OpARM64MOVWUreg { 3971 break 3972 } 3973 x := v_1.Args[0] 3974 mem := v.Args[2] 3975 v.reset(OpARM64MOVBstore) 3976 v.AuxInt = off 3977 v.Aux = sym 3978 v.AddArg(ptr) 3979 v.AddArg(x) 3980 v.AddArg(mem) 3981 return true 3982 } 3983 return false 3984 } 3985 func rewriteValueARM64_OpARM64MOVBstorezero(v *Value) bool { 3986 // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 3987 // cond: fitsARM64Offset(off1+off2, 1, sym) 3988 // result: (MOVBstorezero [off1+off2] {sym} ptr mem) 3989 for { 3990 off1 := v.AuxInt 3991 sym := v.Aux 3992 v_0 := v.Args[0] 3993 if v_0.Op != OpARM64ADDconst { 3994 break 3995 } 3996 off2 := v_0.AuxInt 3997 ptr := v_0.Args[0] 3998 mem := v.Args[1] 3999 if !(fitsARM64Offset(off1+off2, 1, sym)) { 4000 break 4001 } 4002 v.reset(OpARM64MOVBstorezero) 4003 v.AuxInt = off1 + off2 4004 v.Aux = sym 4005 v.AddArg(ptr) 4006 v.AddArg(mem) 4007 return true 4008 } 4009 // match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4010 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2)) 4011 // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4012 for { 4013 off1 := v.AuxInt 4014 sym1 := v.Aux 4015 v_0 := v.Args[0] 4016 if v_0.Op != OpARM64MOVDaddr { 4017 break 4018 } 4019 off2 := v_0.AuxInt 4020 sym2 := v_0.Aux 4021 ptr := v_0.Args[0] 4022 mem := v.Args[1] 4023 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 1, mergeSym(sym1, sym2))) { 4024 break 4025 } 4026 v.reset(OpARM64MOVBstorezero) 4027 v.AuxInt = off1 + off2 4028 v.Aux = mergeSym(sym1, sym2) 4029 v.AddArg(ptr) 4030 v.AddArg(mem) 4031 return true 4032 } 4033 return false 4034 } 4035 func rewriteValueARM64_OpARM64MOVDload(v *Value) bool { 4036 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 4037 // cond: fitsARM64Offset(off1+off2, 8, sym) 4038 // result: (MOVDload [off1+off2] {sym} ptr mem) 4039 for { 4040 off1 := v.AuxInt 4041 sym := v.Aux 4042 v_0 := v.Args[0] 4043 if v_0.Op != OpARM64ADDconst { 4044 break 4045 } 4046 off2 := v_0.AuxInt 4047 ptr := v_0.Args[0] 4048 mem := v.Args[1] 4049 if !(fitsARM64Offset(off1+off2, 8, sym)) { 4050 break 4051 } 4052 v.reset(OpARM64MOVDload) 4053 v.AuxInt = off1 + off2 4054 v.Aux = sym 4055 v.AddArg(ptr) 4056 v.AddArg(mem) 4057 return true 4058 } 4059 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4060 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2)) 4061 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4062 for { 4063 off1 := v.AuxInt 4064 sym1 := v.Aux 4065 v_0 := v.Args[0] 4066 if v_0.Op != OpARM64MOVDaddr { 4067 break 4068 } 4069 off2 := v_0.AuxInt 4070 sym2 := v_0.Aux 4071 ptr := v_0.Args[0] 4072 mem := v.Args[1] 4073 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2))) { 4074 break 4075 } 4076 v.reset(OpARM64MOVDload) 4077 v.AuxInt = off1 + off2 4078 v.Aux = mergeSym(sym1, sym2) 4079 v.AddArg(ptr) 4080 v.AddArg(mem) 4081 return true 4082 } 4083 // match: (MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) 4084 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4085 // result: (MOVDconst [0]) 4086 for { 4087 off := v.AuxInt 4088 sym := v.Aux 4089 ptr := v.Args[0] 4090 v_1 := v.Args[1] 4091 if v_1.Op != OpARM64MOVDstorezero { 4092 break 4093 } 4094 off2 := v_1.AuxInt 4095 sym2 := v_1.Aux 4096 ptr2 := v_1.Args[0] 4097 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4098 break 4099 } 4100 v.reset(OpARM64MOVDconst) 4101 v.AuxInt = 0 4102 return true 4103 } 4104 return false 4105 } 4106 func rewriteValueARM64_OpARM64MOVDreg(v *Value) bool { 4107 // match: (MOVDreg x) 4108 // cond: x.Uses == 1 4109 // result: (MOVDnop x) 4110 for { 4111 x := v.Args[0] 4112 if !(x.Uses == 1) { 4113 break 4114 } 4115 v.reset(OpARM64MOVDnop) 4116 v.AddArg(x) 4117 return true 4118 } 4119 // match: (MOVDreg (MOVDconst [c])) 4120 // cond: 4121 // result: (MOVDconst [c]) 4122 for { 4123 v_0 := v.Args[0] 4124 if v_0.Op != OpARM64MOVDconst { 4125 break 4126 } 4127 c := v_0.AuxInt 4128 v.reset(OpARM64MOVDconst) 4129 v.AuxInt = c 4130 return true 4131 } 4132 return false 4133 } 4134 func rewriteValueARM64_OpARM64MOVDstore(v *Value) bool { 4135 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4136 // cond: fitsARM64Offset(off1+off2, 8, sym) 4137 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 4138 for { 4139 off1 := v.AuxInt 4140 sym := v.Aux 4141 v_0 := v.Args[0] 4142 if v_0.Op != OpARM64ADDconst { 4143 break 4144 } 4145 off2 := v_0.AuxInt 4146 ptr := v_0.Args[0] 4147 val := v.Args[1] 4148 mem := v.Args[2] 4149 if !(fitsARM64Offset(off1+off2, 8, sym)) { 4150 break 4151 } 4152 v.reset(OpARM64MOVDstore) 4153 v.AuxInt = off1 + off2 4154 v.Aux = sym 4155 v.AddArg(ptr) 4156 v.AddArg(val) 4157 v.AddArg(mem) 4158 return true 4159 } 4160 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4161 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2)) 4162 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4163 for { 4164 off1 := v.AuxInt 4165 sym1 := v.Aux 4166 v_0 := v.Args[0] 4167 if v_0.Op != OpARM64MOVDaddr { 4168 break 4169 } 4170 off2 := v_0.AuxInt 4171 sym2 := v_0.Aux 4172 ptr := v_0.Args[0] 4173 val := v.Args[1] 4174 mem := v.Args[2] 4175 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2))) { 4176 break 4177 } 4178 v.reset(OpARM64MOVDstore) 4179 v.AuxInt = off1 + off2 4180 v.Aux = mergeSym(sym1, sym2) 4181 v.AddArg(ptr) 4182 v.AddArg(val) 4183 v.AddArg(mem) 4184 return true 4185 } 4186 // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) 4187 // cond: 4188 // result: (MOVDstorezero [off] {sym} ptr mem) 4189 for { 4190 off := v.AuxInt 4191 sym := v.Aux 4192 ptr := v.Args[0] 4193 v_1 := v.Args[1] 4194 if v_1.Op != OpARM64MOVDconst { 4195 break 4196 } 4197 if v_1.AuxInt != 0 { 4198 break 4199 } 4200 mem := v.Args[2] 4201 v.reset(OpARM64MOVDstorezero) 4202 v.AuxInt = off 4203 v.Aux = sym 4204 v.AddArg(ptr) 4205 v.AddArg(mem) 4206 return true 4207 } 4208 return false 4209 } 4210 func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { 4211 // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4212 // cond: fitsARM64Offset(off1+off2, 8, sym) 4213 // result: (MOVDstorezero [off1+off2] {sym} ptr mem) 4214 for { 4215 off1 := v.AuxInt 4216 sym := v.Aux 4217 v_0 := v.Args[0] 4218 if v_0.Op != OpARM64ADDconst { 4219 break 4220 } 4221 off2 := v_0.AuxInt 4222 ptr := v_0.Args[0] 4223 mem := v.Args[1] 4224 if !(fitsARM64Offset(off1+off2, 8, sym)) { 4225 break 4226 } 4227 v.reset(OpARM64MOVDstorezero) 4228 v.AuxInt = off1 + off2 4229 v.Aux = sym 4230 v.AddArg(ptr) 4231 v.AddArg(mem) 4232 return true 4233 } 4234 // match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4235 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2)) 4236 // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4237 for { 4238 off1 := v.AuxInt 4239 sym1 := v.Aux 4240 v_0 := v.Args[0] 4241 if v_0.Op != OpARM64MOVDaddr { 4242 break 4243 } 4244 off2 := v_0.AuxInt 4245 sym2 := v_0.Aux 4246 ptr := v_0.Args[0] 4247 mem := v.Args[1] 4248 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 8, mergeSym(sym1, sym2))) { 4249 break 4250 } 4251 v.reset(OpARM64MOVDstorezero) 4252 v.AuxInt = off1 + off2 4253 v.Aux = mergeSym(sym1, sym2) 4254 v.AddArg(ptr) 4255 v.AddArg(mem) 4256 return true 4257 } 4258 return false 4259 } 4260 func rewriteValueARM64_OpARM64MOVHUload(v *Value) bool { 4261 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 4262 // cond: fitsARM64Offset(off1+off2, 2, sym) 4263 // result: (MOVHUload [off1+off2] {sym} ptr mem) 4264 for { 4265 off1 := v.AuxInt 4266 sym := v.Aux 4267 v_0 := v.Args[0] 4268 if v_0.Op != OpARM64ADDconst { 4269 break 4270 } 4271 off2 := v_0.AuxInt 4272 ptr := v_0.Args[0] 4273 mem := v.Args[1] 4274 if !(fitsARM64Offset(off1+off2, 2, sym)) { 4275 break 4276 } 4277 v.reset(OpARM64MOVHUload) 4278 v.AuxInt = off1 + off2 4279 v.Aux = sym 4280 v.AddArg(ptr) 4281 v.AddArg(mem) 4282 return true 4283 } 4284 // match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4285 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2)) 4286 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4287 for { 4288 off1 := v.AuxInt 4289 sym1 := v.Aux 4290 v_0 := v.Args[0] 4291 if v_0.Op != OpARM64MOVDaddr { 4292 break 4293 } 4294 off2 := v_0.AuxInt 4295 sym2 := v_0.Aux 4296 ptr := v_0.Args[0] 4297 mem := v.Args[1] 4298 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2))) { 4299 break 4300 } 4301 v.reset(OpARM64MOVHUload) 4302 v.AuxInt = off1 + off2 4303 v.Aux = mergeSym(sym1, sym2) 4304 v.AddArg(ptr) 4305 v.AddArg(mem) 4306 return true 4307 } 4308 // match: (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4309 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4310 // result: (MOVDconst [0]) 4311 for { 4312 off := v.AuxInt 4313 sym := v.Aux 4314 ptr := v.Args[0] 4315 v_1 := v.Args[1] 4316 if v_1.Op != OpARM64MOVHstorezero { 4317 break 4318 } 4319 off2 := v_1.AuxInt 4320 sym2 := v_1.Aux 4321 ptr2 := v_1.Args[0] 4322 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4323 break 4324 } 4325 v.reset(OpARM64MOVDconst) 4326 v.AuxInt = 0 4327 return true 4328 } 4329 return false 4330 } 4331 func rewriteValueARM64_OpARM64MOVHUreg(v *Value) bool { 4332 // match: (MOVHUreg x:(MOVBUload _ _)) 4333 // cond: 4334 // result: (MOVDreg x) 4335 for { 4336 x := v.Args[0] 4337 if x.Op != OpARM64MOVBUload { 4338 break 4339 } 4340 v.reset(OpARM64MOVDreg) 4341 v.AddArg(x) 4342 return true 4343 } 4344 // match: (MOVHUreg x:(MOVHUload _ _)) 4345 // cond: 4346 // result: (MOVDreg x) 4347 for { 4348 x := v.Args[0] 4349 if x.Op != OpARM64MOVHUload { 4350 break 4351 } 4352 v.reset(OpARM64MOVDreg) 4353 v.AddArg(x) 4354 return true 4355 } 4356 // match: (MOVHUreg x:(MOVBUreg _)) 4357 // cond: 4358 // result: (MOVDreg x) 4359 for { 4360 x := v.Args[0] 4361 if x.Op != OpARM64MOVBUreg { 4362 break 4363 } 4364 v.reset(OpARM64MOVDreg) 4365 v.AddArg(x) 4366 return true 4367 } 4368 // match: (MOVHUreg x:(MOVHUreg _)) 4369 // cond: 4370 // result: (MOVDreg x) 4371 for { 4372 x := v.Args[0] 4373 if x.Op != OpARM64MOVHUreg { 4374 break 4375 } 4376 v.reset(OpARM64MOVDreg) 4377 v.AddArg(x) 4378 return true 4379 } 4380 // match: (MOVHUreg (MOVDconst [c])) 4381 // cond: 4382 // result: (MOVDconst [int64(uint16(c))]) 4383 for { 4384 v_0 := v.Args[0] 4385 if v_0.Op != OpARM64MOVDconst { 4386 break 4387 } 4388 c := v_0.AuxInt 4389 v.reset(OpARM64MOVDconst) 4390 v.AuxInt = int64(uint16(c)) 4391 return true 4392 } 4393 return false 4394 } 4395 func rewriteValueARM64_OpARM64MOVHload(v *Value) bool { 4396 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 4397 // cond: fitsARM64Offset(off1+off2, 2, sym) 4398 // result: (MOVHload [off1+off2] {sym} ptr mem) 4399 for { 4400 off1 := v.AuxInt 4401 sym := v.Aux 4402 v_0 := v.Args[0] 4403 if v_0.Op != OpARM64ADDconst { 4404 break 4405 } 4406 off2 := v_0.AuxInt 4407 ptr := v_0.Args[0] 4408 mem := v.Args[1] 4409 if !(fitsARM64Offset(off1+off2, 2, sym)) { 4410 break 4411 } 4412 v.reset(OpARM64MOVHload) 4413 v.AuxInt = off1 + off2 4414 v.Aux = sym 4415 v.AddArg(ptr) 4416 v.AddArg(mem) 4417 return true 4418 } 4419 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4420 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2)) 4421 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4422 for { 4423 off1 := v.AuxInt 4424 sym1 := v.Aux 4425 v_0 := v.Args[0] 4426 if v_0.Op != OpARM64MOVDaddr { 4427 break 4428 } 4429 off2 := v_0.AuxInt 4430 sym2 := v_0.Aux 4431 ptr := v_0.Args[0] 4432 mem := v.Args[1] 4433 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2))) { 4434 break 4435 } 4436 v.reset(OpARM64MOVHload) 4437 v.AuxInt = off1 + off2 4438 v.Aux = mergeSym(sym1, sym2) 4439 v.AddArg(ptr) 4440 v.AddArg(mem) 4441 return true 4442 } 4443 // match: (MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4444 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4445 // result: (MOVDconst [0]) 4446 for { 4447 off := v.AuxInt 4448 sym := v.Aux 4449 ptr := v.Args[0] 4450 v_1 := v.Args[1] 4451 if v_1.Op != OpARM64MOVHstorezero { 4452 break 4453 } 4454 off2 := v_1.AuxInt 4455 sym2 := v_1.Aux 4456 ptr2 := v_1.Args[0] 4457 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4458 break 4459 } 4460 v.reset(OpARM64MOVDconst) 4461 v.AuxInt = 0 4462 return true 4463 } 4464 return false 4465 } 4466 func rewriteValueARM64_OpARM64MOVHreg(v *Value) bool { 4467 // match: (MOVHreg x:(MOVBload _ _)) 4468 // cond: 4469 // result: (MOVDreg x) 4470 for { 4471 x := v.Args[0] 4472 if x.Op != OpARM64MOVBload { 4473 break 4474 } 4475 v.reset(OpARM64MOVDreg) 4476 v.AddArg(x) 4477 return true 4478 } 4479 // match: (MOVHreg x:(MOVBUload _ _)) 4480 // cond: 4481 // result: (MOVDreg x) 4482 for { 4483 x := v.Args[0] 4484 if x.Op != OpARM64MOVBUload { 4485 break 4486 } 4487 v.reset(OpARM64MOVDreg) 4488 v.AddArg(x) 4489 return true 4490 } 4491 // match: (MOVHreg x:(MOVHload _ _)) 4492 // cond: 4493 // result: (MOVDreg x) 4494 for { 4495 x := v.Args[0] 4496 if x.Op != OpARM64MOVHload { 4497 break 4498 } 4499 v.reset(OpARM64MOVDreg) 4500 v.AddArg(x) 4501 return true 4502 } 4503 // match: (MOVHreg x:(MOVBreg _)) 4504 // cond: 4505 // result: (MOVDreg x) 4506 for { 4507 x := v.Args[0] 4508 if x.Op != OpARM64MOVBreg { 4509 break 4510 } 4511 v.reset(OpARM64MOVDreg) 4512 v.AddArg(x) 4513 return true 4514 } 4515 // match: (MOVHreg x:(MOVBUreg _)) 4516 // cond: 4517 // result: (MOVDreg x) 4518 for { 4519 x := v.Args[0] 4520 if x.Op != OpARM64MOVBUreg { 4521 break 4522 } 4523 v.reset(OpARM64MOVDreg) 4524 v.AddArg(x) 4525 return true 4526 } 4527 // match: (MOVHreg x:(MOVHreg _)) 4528 // cond: 4529 // result: (MOVDreg x) 4530 for { 4531 x := v.Args[0] 4532 if x.Op != OpARM64MOVHreg { 4533 break 4534 } 4535 v.reset(OpARM64MOVDreg) 4536 v.AddArg(x) 4537 return true 4538 } 4539 // match: (MOVHreg (MOVDconst [c])) 4540 // cond: 4541 // result: (MOVDconst [int64(int16(c))]) 4542 for { 4543 v_0 := v.Args[0] 4544 if v_0.Op != OpARM64MOVDconst { 4545 break 4546 } 4547 c := v_0.AuxInt 4548 v.reset(OpARM64MOVDconst) 4549 v.AuxInt = int64(int16(c)) 4550 return true 4551 } 4552 return false 4553 } 4554 func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { 4555 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4556 // cond: fitsARM64Offset(off1+off2, 2, sym) 4557 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 4558 for { 4559 off1 := v.AuxInt 4560 sym := v.Aux 4561 v_0 := v.Args[0] 4562 if v_0.Op != OpARM64ADDconst { 4563 break 4564 } 4565 off2 := v_0.AuxInt 4566 ptr := v_0.Args[0] 4567 val := v.Args[1] 4568 mem := v.Args[2] 4569 if !(fitsARM64Offset(off1+off2, 2, sym)) { 4570 break 4571 } 4572 v.reset(OpARM64MOVHstore) 4573 v.AuxInt = off1 + off2 4574 v.Aux = sym 4575 v.AddArg(ptr) 4576 v.AddArg(val) 4577 v.AddArg(mem) 4578 return true 4579 } 4580 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4581 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2)) 4582 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4583 for { 4584 off1 := v.AuxInt 4585 sym1 := v.Aux 4586 v_0 := v.Args[0] 4587 if v_0.Op != OpARM64MOVDaddr { 4588 break 4589 } 4590 off2 := v_0.AuxInt 4591 sym2 := v_0.Aux 4592 ptr := v_0.Args[0] 4593 val := v.Args[1] 4594 mem := v.Args[2] 4595 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2))) { 4596 break 4597 } 4598 v.reset(OpARM64MOVHstore) 4599 v.AuxInt = off1 + off2 4600 v.Aux = mergeSym(sym1, sym2) 4601 v.AddArg(ptr) 4602 v.AddArg(val) 4603 v.AddArg(mem) 4604 return true 4605 } 4606 // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) 4607 // cond: 4608 // result: (MOVHstorezero [off] {sym} ptr mem) 4609 for { 4610 off := v.AuxInt 4611 sym := v.Aux 4612 ptr := v.Args[0] 4613 v_1 := v.Args[1] 4614 if v_1.Op != OpARM64MOVDconst { 4615 break 4616 } 4617 if v_1.AuxInt != 0 { 4618 break 4619 } 4620 mem := v.Args[2] 4621 v.reset(OpARM64MOVHstorezero) 4622 v.AuxInt = off 4623 v.Aux = sym 4624 v.AddArg(ptr) 4625 v.AddArg(mem) 4626 return true 4627 } 4628 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 4629 // cond: 4630 // result: (MOVHstore [off] {sym} ptr x mem) 4631 for { 4632 off := v.AuxInt 4633 sym := v.Aux 4634 ptr := v.Args[0] 4635 v_1 := v.Args[1] 4636 if v_1.Op != OpARM64MOVHreg { 4637 break 4638 } 4639 x := v_1.Args[0] 4640 mem := v.Args[2] 4641 v.reset(OpARM64MOVHstore) 4642 v.AuxInt = off 4643 v.Aux = sym 4644 v.AddArg(ptr) 4645 v.AddArg(x) 4646 v.AddArg(mem) 4647 return true 4648 } 4649 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 4650 // cond: 4651 // result: (MOVHstore [off] {sym} ptr x mem) 4652 for { 4653 off := v.AuxInt 4654 sym := v.Aux 4655 ptr := v.Args[0] 4656 v_1 := v.Args[1] 4657 if v_1.Op != OpARM64MOVHUreg { 4658 break 4659 } 4660 x := v_1.Args[0] 4661 mem := v.Args[2] 4662 v.reset(OpARM64MOVHstore) 4663 v.AuxInt = off 4664 v.Aux = sym 4665 v.AddArg(ptr) 4666 v.AddArg(x) 4667 v.AddArg(mem) 4668 return true 4669 } 4670 // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) 4671 // cond: 4672 // result: (MOVHstore [off] {sym} ptr x mem) 4673 for { 4674 off := v.AuxInt 4675 sym := v.Aux 4676 ptr := v.Args[0] 4677 v_1 := v.Args[1] 4678 if v_1.Op != OpARM64MOVWreg { 4679 break 4680 } 4681 x := v_1.Args[0] 4682 mem := v.Args[2] 4683 v.reset(OpARM64MOVHstore) 4684 v.AuxInt = off 4685 v.Aux = sym 4686 v.AddArg(ptr) 4687 v.AddArg(x) 4688 v.AddArg(mem) 4689 return true 4690 } 4691 // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) 4692 // cond: 4693 // result: (MOVHstore [off] {sym} ptr x mem) 4694 for { 4695 off := v.AuxInt 4696 sym := v.Aux 4697 ptr := v.Args[0] 4698 v_1 := v.Args[1] 4699 if v_1.Op != OpARM64MOVWUreg { 4700 break 4701 } 4702 x := v_1.Args[0] 4703 mem := v.Args[2] 4704 v.reset(OpARM64MOVHstore) 4705 v.AuxInt = off 4706 v.Aux = sym 4707 v.AddArg(ptr) 4708 v.AddArg(x) 4709 v.AddArg(mem) 4710 return true 4711 } 4712 return false 4713 } 4714 func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { 4715 // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4716 // cond: fitsARM64Offset(off1+off2, 2, sym) 4717 // result: (MOVHstorezero [off1+off2] {sym} ptr mem) 4718 for { 4719 off1 := v.AuxInt 4720 sym := v.Aux 4721 v_0 := v.Args[0] 4722 if v_0.Op != OpARM64ADDconst { 4723 break 4724 } 4725 off2 := v_0.AuxInt 4726 ptr := v_0.Args[0] 4727 mem := v.Args[1] 4728 if !(fitsARM64Offset(off1+off2, 2, sym)) { 4729 break 4730 } 4731 v.reset(OpARM64MOVHstorezero) 4732 v.AuxInt = off1 + off2 4733 v.Aux = sym 4734 v.AddArg(ptr) 4735 v.AddArg(mem) 4736 return true 4737 } 4738 // match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4739 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2)) 4740 // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4741 for { 4742 off1 := v.AuxInt 4743 sym1 := v.Aux 4744 v_0 := v.Args[0] 4745 if v_0.Op != OpARM64MOVDaddr { 4746 break 4747 } 4748 off2 := v_0.AuxInt 4749 sym2 := v_0.Aux 4750 ptr := v_0.Args[0] 4751 mem := v.Args[1] 4752 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 2, mergeSym(sym1, sym2))) { 4753 break 4754 } 4755 v.reset(OpARM64MOVHstorezero) 4756 v.AuxInt = off1 + off2 4757 v.Aux = mergeSym(sym1, sym2) 4758 v.AddArg(ptr) 4759 v.AddArg(mem) 4760 return true 4761 } 4762 return false 4763 } 4764 func rewriteValueARM64_OpARM64MOVWUload(v *Value) bool { 4765 // match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) 4766 // cond: fitsARM64Offset(off1+off2, 4, sym) 4767 // result: (MOVWUload [off1+off2] {sym} ptr mem) 4768 for { 4769 off1 := v.AuxInt 4770 sym := v.Aux 4771 v_0 := v.Args[0] 4772 if v_0.Op != OpARM64ADDconst { 4773 break 4774 } 4775 off2 := v_0.AuxInt 4776 ptr := v_0.Args[0] 4777 mem := v.Args[1] 4778 if !(fitsARM64Offset(off1+off2, 4, sym)) { 4779 break 4780 } 4781 v.reset(OpARM64MOVWUload) 4782 v.AuxInt = off1 + off2 4783 v.Aux = sym 4784 v.AddArg(ptr) 4785 v.AddArg(mem) 4786 return true 4787 } 4788 // match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4789 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 4790 // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4791 for { 4792 off1 := v.AuxInt 4793 sym1 := v.Aux 4794 v_0 := v.Args[0] 4795 if v_0.Op != OpARM64MOVDaddr { 4796 break 4797 } 4798 off2 := v_0.AuxInt 4799 sym2 := v_0.Aux 4800 ptr := v_0.Args[0] 4801 mem := v.Args[1] 4802 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 4803 break 4804 } 4805 v.reset(OpARM64MOVWUload) 4806 v.AuxInt = off1 + off2 4807 v.Aux = mergeSym(sym1, sym2) 4808 v.AddArg(ptr) 4809 v.AddArg(mem) 4810 return true 4811 } 4812 // match: (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4813 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4814 // result: (MOVDconst [0]) 4815 for { 4816 off := v.AuxInt 4817 sym := v.Aux 4818 ptr := v.Args[0] 4819 v_1 := v.Args[1] 4820 if v_1.Op != OpARM64MOVWstorezero { 4821 break 4822 } 4823 off2 := v_1.AuxInt 4824 sym2 := v_1.Aux 4825 ptr2 := v_1.Args[0] 4826 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4827 break 4828 } 4829 v.reset(OpARM64MOVDconst) 4830 v.AuxInt = 0 4831 return true 4832 } 4833 return false 4834 } 4835 func rewriteValueARM64_OpARM64MOVWUreg(v *Value) bool { 4836 // match: (MOVWUreg x:(MOVBUload _ _)) 4837 // cond: 4838 // result: (MOVDreg x) 4839 for { 4840 x := v.Args[0] 4841 if x.Op != OpARM64MOVBUload { 4842 break 4843 } 4844 v.reset(OpARM64MOVDreg) 4845 v.AddArg(x) 4846 return true 4847 } 4848 // match: (MOVWUreg x:(MOVHUload _ _)) 4849 // cond: 4850 // result: (MOVDreg x) 4851 for { 4852 x := v.Args[0] 4853 if x.Op != OpARM64MOVHUload { 4854 break 4855 } 4856 v.reset(OpARM64MOVDreg) 4857 v.AddArg(x) 4858 return true 4859 } 4860 // match: (MOVWUreg x:(MOVWUload _ _)) 4861 // cond: 4862 // result: (MOVDreg x) 4863 for { 4864 x := v.Args[0] 4865 if x.Op != OpARM64MOVWUload { 4866 break 4867 } 4868 v.reset(OpARM64MOVDreg) 4869 v.AddArg(x) 4870 return true 4871 } 4872 // match: (MOVWUreg x:(MOVBUreg _)) 4873 // cond: 4874 // result: (MOVDreg x) 4875 for { 4876 x := v.Args[0] 4877 if x.Op != OpARM64MOVBUreg { 4878 break 4879 } 4880 v.reset(OpARM64MOVDreg) 4881 v.AddArg(x) 4882 return true 4883 } 4884 // match: (MOVWUreg x:(MOVHUreg _)) 4885 // cond: 4886 // result: (MOVDreg x) 4887 for { 4888 x := v.Args[0] 4889 if x.Op != OpARM64MOVHUreg { 4890 break 4891 } 4892 v.reset(OpARM64MOVDreg) 4893 v.AddArg(x) 4894 return true 4895 } 4896 // match: (MOVWUreg x:(MOVWUreg _)) 4897 // cond: 4898 // result: (MOVDreg x) 4899 for { 4900 x := v.Args[0] 4901 if x.Op != OpARM64MOVWUreg { 4902 break 4903 } 4904 v.reset(OpARM64MOVDreg) 4905 v.AddArg(x) 4906 return true 4907 } 4908 // match: (MOVWUreg (MOVDconst [c])) 4909 // cond: 4910 // result: (MOVDconst [int64(uint32(c))]) 4911 for { 4912 v_0 := v.Args[0] 4913 if v_0.Op != OpARM64MOVDconst { 4914 break 4915 } 4916 c := v_0.AuxInt 4917 v.reset(OpARM64MOVDconst) 4918 v.AuxInt = int64(uint32(c)) 4919 return true 4920 } 4921 return false 4922 } 4923 func rewriteValueARM64_OpARM64MOVWload(v *Value) bool { 4924 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 4925 // cond: fitsARM64Offset(off1+off2, 4, sym) 4926 // result: (MOVWload [off1+off2] {sym} ptr mem) 4927 for { 4928 off1 := v.AuxInt 4929 sym := v.Aux 4930 v_0 := v.Args[0] 4931 if v_0.Op != OpARM64ADDconst { 4932 break 4933 } 4934 off2 := v_0.AuxInt 4935 ptr := v_0.Args[0] 4936 mem := v.Args[1] 4937 if !(fitsARM64Offset(off1+off2, 4, sym)) { 4938 break 4939 } 4940 v.reset(OpARM64MOVWload) 4941 v.AuxInt = off1 + off2 4942 v.Aux = sym 4943 v.AddArg(ptr) 4944 v.AddArg(mem) 4945 return true 4946 } 4947 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4948 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 4949 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4950 for { 4951 off1 := v.AuxInt 4952 sym1 := v.Aux 4953 v_0 := v.Args[0] 4954 if v_0.Op != OpARM64MOVDaddr { 4955 break 4956 } 4957 off2 := v_0.AuxInt 4958 sym2 := v_0.Aux 4959 ptr := v_0.Args[0] 4960 mem := v.Args[1] 4961 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 4962 break 4963 } 4964 v.reset(OpARM64MOVWload) 4965 v.AuxInt = off1 + off2 4966 v.Aux = mergeSym(sym1, sym2) 4967 v.AddArg(ptr) 4968 v.AddArg(mem) 4969 return true 4970 } 4971 // match: (MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4972 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4973 // result: (MOVDconst [0]) 4974 for { 4975 off := v.AuxInt 4976 sym := v.Aux 4977 ptr := v.Args[0] 4978 v_1 := v.Args[1] 4979 if v_1.Op != OpARM64MOVWstorezero { 4980 break 4981 } 4982 off2 := v_1.AuxInt 4983 sym2 := v_1.Aux 4984 ptr2 := v_1.Args[0] 4985 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4986 break 4987 } 4988 v.reset(OpARM64MOVDconst) 4989 v.AuxInt = 0 4990 return true 4991 } 4992 return false 4993 } 4994 func rewriteValueARM64_OpARM64MOVWreg(v *Value) bool { 4995 // match: (MOVWreg x:(MOVBload _ _)) 4996 // cond: 4997 // result: (MOVDreg x) 4998 for { 4999 x := v.Args[0] 5000 if x.Op != OpARM64MOVBload { 5001 break 5002 } 5003 v.reset(OpARM64MOVDreg) 5004 v.AddArg(x) 5005 return true 5006 } 5007 // match: (MOVWreg x:(MOVBUload _ _)) 5008 // cond: 5009 // result: (MOVDreg x) 5010 for { 5011 x := v.Args[0] 5012 if x.Op != OpARM64MOVBUload { 5013 break 5014 } 5015 v.reset(OpARM64MOVDreg) 5016 v.AddArg(x) 5017 return true 5018 } 5019 // match: (MOVWreg x:(MOVHload _ _)) 5020 // cond: 5021 // result: (MOVDreg x) 5022 for { 5023 x := v.Args[0] 5024 if x.Op != OpARM64MOVHload { 5025 break 5026 } 5027 v.reset(OpARM64MOVDreg) 5028 v.AddArg(x) 5029 return true 5030 } 5031 // match: (MOVWreg x:(MOVHUload _ _)) 5032 // cond: 5033 // result: (MOVDreg x) 5034 for { 5035 x := v.Args[0] 5036 if x.Op != OpARM64MOVHUload { 5037 break 5038 } 5039 v.reset(OpARM64MOVDreg) 5040 v.AddArg(x) 5041 return true 5042 } 5043 // match: (MOVWreg x:(MOVWload _ _)) 5044 // cond: 5045 // result: (MOVDreg x) 5046 for { 5047 x := v.Args[0] 5048 if x.Op != OpARM64MOVWload { 5049 break 5050 } 5051 v.reset(OpARM64MOVDreg) 5052 v.AddArg(x) 5053 return true 5054 } 5055 // match: (MOVWreg x:(MOVBreg _)) 5056 // cond: 5057 // result: (MOVDreg x) 5058 for { 5059 x := v.Args[0] 5060 if x.Op != OpARM64MOVBreg { 5061 break 5062 } 5063 v.reset(OpARM64MOVDreg) 5064 v.AddArg(x) 5065 return true 5066 } 5067 // match: (MOVWreg x:(MOVBUreg _)) 5068 // cond: 5069 // result: (MOVDreg x) 5070 for { 5071 x := v.Args[0] 5072 if x.Op != OpARM64MOVBUreg { 5073 break 5074 } 5075 v.reset(OpARM64MOVDreg) 5076 v.AddArg(x) 5077 return true 5078 } 5079 // match: (MOVWreg x:(MOVHreg _)) 5080 // cond: 5081 // result: (MOVDreg x) 5082 for { 5083 x := v.Args[0] 5084 if x.Op != OpARM64MOVHreg { 5085 break 5086 } 5087 v.reset(OpARM64MOVDreg) 5088 v.AddArg(x) 5089 return true 5090 } 5091 // match: (MOVWreg x:(MOVHreg _)) 5092 // cond: 5093 // result: (MOVDreg x) 5094 for { 5095 x := v.Args[0] 5096 if x.Op != OpARM64MOVHreg { 5097 break 5098 } 5099 v.reset(OpARM64MOVDreg) 5100 v.AddArg(x) 5101 return true 5102 } 5103 // match: (MOVWreg x:(MOVWreg _)) 5104 // cond: 5105 // result: (MOVDreg x) 5106 for { 5107 x := v.Args[0] 5108 if x.Op != OpARM64MOVWreg { 5109 break 5110 } 5111 v.reset(OpARM64MOVDreg) 5112 v.AddArg(x) 5113 return true 5114 } 5115 // match: (MOVWreg (MOVDconst [c])) 5116 // cond: 5117 // result: (MOVDconst [int64(int32(c))]) 5118 for { 5119 v_0 := v.Args[0] 5120 if v_0.Op != OpARM64MOVDconst { 5121 break 5122 } 5123 c := v_0.AuxInt 5124 v.reset(OpARM64MOVDconst) 5125 v.AuxInt = int64(int32(c)) 5126 return true 5127 } 5128 return false 5129 } 5130 func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { 5131 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5132 // cond: fitsARM64Offset(off1+off2, 4, sym) 5133 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 5134 for { 5135 off1 := v.AuxInt 5136 sym := v.Aux 5137 v_0 := v.Args[0] 5138 if v_0.Op != OpARM64ADDconst { 5139 break 5140 } 5141 off2 := v_0.AuxInt 5142 ptr := v_0.Args[0] 5143 val := v.Args[1] 5144 mem := v.Args[2] 5145 if !(fitsARM64Offset(off1+off2, 4, sym)) { 5146 break 5147 } 5148 v.reset(OpARM64MOVWstore) 5149 v.AuxInt = off1 + off2 5150 v.Aux = sym 5151 v.AddArg(ptr) 5152 v.AddArg(val) 5153 v.AddArg(mem) 5154 return true 5155 } 5156 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 5157 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 5158 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5159 for { 5160 off1 := v.AuxInt 5161 sym1 := v.Aux 5162 v_0 := v.Args[0] 5163 if v_0.Op != OpARM64MOVDaddr { 5164 break 5165 } 5166 off2 := v_0.AuxInt 5167 sym2 := v_0.Aux 5168 ptr := v_0.Args[0] 5169 val := v.Args[1] 5170 mem := v.Args[2] 5171 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 5172 break 5173 } 5174 v.reset(OpARM64MOVWstore) 5175 v.AuxInt = off1 + off2 5176 v.Aux = mergeSym(sym1, sym2) 5177 v.AddArg(ptr) 5178 v.AddArg(val) 5179 v.AddArg(mem) 5180 return true 5181 } 5182 // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) 5183 // cond: 5184 // result: (MOVWstorezero [off] {sym} ptr mem) 5185 for { 5186 off := v.AuxInt 5187 sym := v.Aux 5188 ptr := v.Args[0] 5189 v_1 := v.Args[1] 5190 if v_1.Op != OpARM64MOVDconst { 5191 break 5192 } 5193 if v_1.AuxInt != 0 { 5194 break 5195 } 5196 mem := v.Args[2] 5197 v.reset(OpARM64MOVWstorezero) 5198 v.AuxInt = off 5199 v.Aux = sym 5200 v.AddArg(ptr) 5201 v.AddArg(mem) 5202 return true 5203 } 5204 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 5205 // cond: 5206 // result: (MOVWstore [off] {sym} ptr x mem) 5207 for { 5208 off := v.AuxInt 5209 sym := v.Aux 5210 ptr := v.Args[0] 5211 v_1 := v.Args[1] 5212 if v_1.Op != OpARM64MOVWreg { 5213 break 5214 } 5215 x := v_1.Args[0] 5216 mem := v.Args[2] 5217 v.reset(OpARM64MOVWstore) 5218 v.AuxInt = off 5219 v.Aux = sym 5220 v.AddArg(ptr) 5221 v.AddArg(x) 5222 v.AddArg(mem) 5223 return true 5224 } 5225 // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) 5226 // cond: 5227 // result: (MOVWstore [off] {sym} ptr x mem) 5228 for { 5229 off := v.AuxInt 5230 sym := v.Aux 5231 ptr := v.Args[0] 5232 v_1 := v.Args[1] 5233 if v_1.Op != OpARM64MOVWUreg { 5234 break 5235 } 5236 x := v_1.Args[0] 5237 mem := v.Args[2] 5238 v.reset(OpARM64MOVWstore) 5239 v.AuxInt = off 5240 v.Aux = sym 5241 v.AddArg(ptr) 5242 v.AddArg(x) 5243 v.AddArg(mem) 5244 return true 5245 } 5246 return false 5247 } 5248 func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { 5249 // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 5250 // cond: fitsARM64Offset(off1+off2, 4, sym) 5251 // result: (MOVWstorezero [off1+off2] {sym} ptr mem) 5252 for { 5253 off1 := v.AuxInt 5254 sym := v.Aux 5255 v_0 := v.Args[0] 5256 if v_0.Op != OpARM64ADDconst { 5257 break 5258 } 5259 off2 := v_0.AuxInt 5260 ptr := v_0.Args[0] 5261 mem := v.Args[1] 5262 if !(fitsARM64Offset(off1+off2, 4, sym)) { 5263 break 5264 } 5265 v.reset(OpARM64MOVWstorezero) 5266 v.AuxInt = off1 + off2 5267 v.Aux = sym 5268 v.AddArg(ptr) 5269 v.AddArg(mem) 5270 return true 5271 } 5272 // match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 5273 // cond: canMergeSym(sym1,sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2)) 5274 // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5275 for { 5276 off1 := v.AuxInt 5277 sym1 := v.Aux 5278 v_0 := v.Args[0] 5279 if v_0.Op != OpARM64MOVDaddr { 5280 break 5281 } 5282 off2 := v_0.AuxInt 5283 sym2 := v_0.Aux 5284 ptr := v_0.Args[0] 5285 mem := v.Args[1] 5286 if !(canMergeSym(sym1, sym2) && fitsARM64Offset(off1+off2, 4, mergeSym(sym1, sym2))) { 5287 break 5288 } 5289 v.reset(OpARM64MOVWstorezero) 5290 v.AuxInt = off1 + off2 5291 v.Aux = mergeSym(sym1, sym2) 5292 v.AddArg(ptr) 5293 v.AddArg(mem) 5294 return true 5295 } 5296 return false 5297 } 5298 func rewriteValueARM64_OpARM64MUL(v *Value) bool { 5299 b := v.Block 5300 _ = b 5301 // match: (MUL x (MOVDconst [-1])) 5302 // cond: 5303 // result: (NEG x) 5304 for { 5305 x := v.Args[0] 5306 v_1 := v.Args[1] 5307 if v_1.Op != OpARM64MOVDconst { 5308 break 5309 } 5310 if v_1.AuxInt != -1 { 5311 break 5312 } 5313 v.reset(OpARM64NEG) 5314 v.AddArg(x) 5315 return true 5316 } 5317 // match: (MUL (MOVDconst [-1]) x) 5318 // cond: 5319 // result: (NEG x) 5320 for { 5321 v_0 := v.Args[0] 5322 if v_0.Op != OpARM64MOVDconst { 5323 break 5324 } 5325 if v_0.AuxInt != -1 { 5326 break 5327 } 5328 x := v.Args[1] 5329 v.reset(OpARM64NEG) 5330 v.AddArg(x) 5331 return true 5332 } 5333 // match: (MUL _ (MOVDconst [0])) 5334 // cond: 5335 // result: (MOVDconst [0]) 5336 for { 5337 v_1 := v.Args[1] 5338 if v_1.Op != OpARM64MOVDconst { 5339 break 5340 } 5341 if v_1.AuxInt != 0 { 5342 break 5343 } 5344 v.reset(OpARM64MOVDconst) 5345 v.AuxInt = 0 5346 return true 5347 } 5348 // match: (MUL (MOVDconst [0]) _) 5349 // cond: 5350 // result: (MOVDconst [0]) 5351 for { 5352 v_0 := v.Args[0] 5353 if v_0.Op != OpARM64MOVDconst { 5354 break 5355 } 5356 if v_0.AuxInt != 0 { 5357 break 5358 } 5359 v.reset(OpARM64MOVDconst) 5360 v.AuxInt = 0 5361 return true 5362 } 5363 // match: (MUL x (MOVDconst [1])) 5364 // cond: 5365 // result: x 5366 for { 5367 x := v.Args[0] 5368 v_1 := v.Args[1] 5369 if v_1.Op != OpARM64MOVDconst { 5370 break 5371 } 5372 if v_1.AuxInt != 1 { 5373 break 5374 } 5375 v.reset(OpCopy) 5376 v.Type = x.Type 5377 v.AddArg(x) 5378 return true 5379 } 5380 // match: (MUL (MOVDconst [1]) x) 5381 // cond: 5382 // result: x 5383 for { 5384 v_0 := v.Args[0] 5385 if v_0.Op != OpARM64MOVDconst { 5386 break 5387 } 5388 if v_0.AuxInt != 1 { 5389 break 5390 } 5391 x := v.Args[1] 5392 v.reset(OpCopy) 5393 v.Type = x.Type 5394 v.AddArg(x) 5395 return true 5396 } 5397 // match: (MUL x (MOVDconst [c])) 5398 // cond: isPowerOfTwo(c) 5399 // result: (SLLconst [log2(c)] x) 5400 for { 5401 x := v.Args[0] 5402 v_1 := v.Args[1] 5403 if v_1.Op != OpARM64MOVDconst { 5404 break 5405 } 5406 c := v_1.AuxInt 5407 if !(isPowerOfTwo(c)) { 5408 break 5409 } 5410 v.reset(OpARM64SLLconst) 5411 v.AuxInt = log2(c) 5412 v.AddArg(x) 5413 return true 5414 } 5415 // match: (MUL (MOVDconst [c]) x) 5416 // cond: isPowerOfTwo(c) 5417 // result: (SLLconst [log2(c)] x) 5418 for { 5419 v_0 := v.Args[0] 5420 if v_0.Op != OpARM64MOVDconst { 5421 break 5422 } 5423 c := v_0.AuxInt 5424 x := v.Args[1] 5425 if !(isPowerOfTwo(c)) { 5426 break 5427 } 5428 v.reset(OpARM64SLLconst) 5429 v.AuxInt = log2(c) 5430 v.AddArg(x) 5431 return true 5432 } 5433 // match: (MUL x (MOVDconst [c])) 5434 // cond: isPowerOfTwo(c-1) && c >= 3 5435 // result: (ADDshiftLL x x [log2(c-1)]) 5436 for { 5437 x := v.Args[0] 5438 v_1 := v.Args[1] 5439 if v_1.Op != OpARM64MOVDconst { 5440 break 5441 } 5442 c := v_1.AuxInt 5443 if !(isPowerOfTwo(c-1) && c >= 3) { 5444 break 5445 } 5446 v.reset(OpARM64ADDshiftLL) 5447 v.AuxInt = log2(c - 1) 5448 v.AddArg(x) 5449 v.AddArg(x) 5450 return true 5451 } 5452 // match: (MUL (MOVDconst [c]) x) 5453 // cond: isPowerOfTwo(c-1) && c >= 3 5454 // result: (ADDshiftLL x x [log2(c-1)]) 5455 for { 5456 v_0 := v.Args[0] 5457 if v_0.Op != OpARM64MOVDconst { 5458 break 5459 } 5460 c := v_0.AuxInt 5461 x := v.Args[1] 5462 if !(isPowerOfTwo(c-1) && c >= 3) { 5463 break 5464 } 5465 v.reset(OpARM64ADDshiftLL) 5466 v.AuxInt = log2(c - 1) 5467 v.AddArg(x) 5468 v.AddArg(x) 5469 return true 5470 } 5471 // match: (MUL x (MOVDconst [c])) 5472 // cond: isPowerOfTwo(c+1) && c >= 7 5473 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5474 for { 5475 x := v.Args[0] 5476 v_1 := v.Args[1] 5477 if v_1.Op != OpARM64MOVDconst { 5478 break 5479 } 5480 c := v_1.AuxInt 5481 if !(isPowerOfTwo(c+1) && c >= 7) { 5482 break 5483 } 5484 v.reset(OpARM64ADDshiftLL) 5485 v.AuxInt = log2(c + 1) 5486 v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5487 v0.AddArg(x) 5488 v.AddArg(v0) 5489 v.AddArg(x) 5490 return true 5491 } 5492 // match: (MUL (MOVDconst [c]) x) 5493 // cond: isPowerOfTwo(c+1) && c >= 7 5494 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5495 for { 5496 v_0 := v.Args[0] 5497 if v_0.Op != OpARM64MOVDconst { 5498 break 5499 } 5500 c := v_0.AuxInt 5501 x := v.Args[1] 5502 if !(isPowerOfTwo(c+1) && c >= 7) { 5503 break 5504 } 5505 v.reset(OpARM64ADDshiftLL) 5506 v.AuxInt = log2(c + 1) 5507 v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5508 v0.AddArg(x) 5509 v.AddArg(v0) 5510 v.AddArg(x) 5511 return true 5512 } 5513 // match: (MUL x (MOVDconst [c])) 5514 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5515 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5516 for { 5517 x := v.Args[0] 5518 v_1 := v.Args[1] 5519 if v_1.Op != OpARM64MOVDconst { 5520 break 5521 } 5522 c := v_1.AuxInt 5523 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5524 break 5525 } 5526 v.reset(OpARM64SLLconst) 5527 v.AuxInt = log2(c / 3) 5528 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5529 v0.AuxInt = 1 5530 v0.AddArg(x) 5531 v0.AddArg(x) 5532 v.AddArg(v0) 5533 return true 5534 } 5535 // match: (MUL (MOVDconst [c]) x) 5536 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5537 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5538 for { 5539 v_0 := v.Args[0] 5540 if v_0.Op != OpARM64MOVDconst { 5541 break 5542 } 5543 c := v_0.AuxInt 5544 x := v.Args[1] 5545 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5546 break 5547 } 5548 v.reset(OpARM64SLLconst) 5549 v.AuxInt = log2(c / 3) 5550 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5551 v0.AuxInt = 1 5552 v0.AddArg(x) 5553 v0.AddArg(x) 5554 v.AddArg(v0) 5555 return true 5556 } 5557 // match: (MUL x (MOVDconst [c])) 5558 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5559 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5560 for { 5561 x := v.Args[0] 5562 v_1 := v.Args[1] 5563 if v_1.Op != OpARM64MOVDconst { 5564 break 5565 } 5566 c := v_1.AuxInt 5567 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5568 break 5569 } 5570 v.reset(OpARM64SLLconst) 5571 v.AuxInt = log2(c / 5) 5572 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5573 v0.AuxInt = 2 5574 v0.AddArg(x) 5575 v0.AddArg(x) 5576 v.AddArg(v0) 5577 return true 5578 } 5579 // match: (MUL (MOVDconst [c]) x) 5580 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5581 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5582 for { 5583 v_0 := v.Args[0] 5584 if v_0.Op != OpARM64MOVDconst { 5585 break 5586 } 5587 c := v_0.AuxInt 5588 x := v.Args[1] 5589 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5590 break 5591 } 5592 v.reset(OpARM64SLLconst) 5593 v.AuxInt = log2(c / 5) 5594 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5595 v0.AuxInt = 2 5596 v0.AddArg(x) 5597 v0.AddArg(x) 5598 v.AddArg(v0) 5599 return true 5600 } 5601 // match: (MUL x (MOVDconst [c])) 5602 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5603 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5604 for { 5605 x := v.Args[0] 5606 v_1 := v.Args[1] 5607 if v_1.Op != OpARM64MOVDconst { 5608 break 5609 } 5610 c := v_1.AuxInt 5611 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5612 break 5613 } 5614 v.reset(OpARM64SLLconst) 5615 v.AuxInt = log2(c / 7) 5616 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5617 v0.AuxInt = 3 5618 v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5619 v1.AddArg(x) 5620 v0.AddArg(v1) 5621 v0.AddArg(x) 5622 v.AddArg(v0) 5623 return true 5624 } 5625 // match: (MUL (MOVDconst [c]) x) 5626 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5627 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5628 for { 5629 v_0 := v.Args[0] 5630 if v_0.Op != OpARM64MOVDconst { 5631 break 5632 } 5633 c := v_0.AuxInt 5634 x := v.Args[1] 5635 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5636 break 5637 } 5638 v.reset(OpARM64SLLconst) 5639 v.AuxInt = log2(c / 7) 5640 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5641 v0.AuxInt = 3 5642 v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5643 v1.AddArg(x) 5644 v0.AddArg(v1) 5645 v0.AddArg(x) 5646 v.AddArg(v0) 5647 return true 5648 } 5649 // match: (MUL x (MOVDconst [c])) 5650 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5651 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5652 for { 5653 x := v.Args[0] 5654 v_1 := v.Args[1] 5655 if v_1.Op != OpARM64MOVDconst { 5656 break 5657 } 5658 c := v_1.AuxInt 5659 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5660 break 5661 } 5662 v.reset(OpARM64SLLconst) 5663 v.AuxInt = log2(c / 9) 5664 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5665 v0.AuxInt = 3 5666 v0.AddArg(x) 5667 v0.AddArg(x) 5668 v.AddArg(v0) 5669 return true 5670 } 5671 // match: (MUL (MOVDconst [c]) x) 5672 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5673 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5674 for { 5675 v_0 := v.Args[0] 5676 if v_0.Op != OpARM64MOVDconst { 5677 break 5678 } 5679 c := v_0.AuxInt 5680 x := v.Args[1] 5681 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5682 break 5683 } 5684 v.reset(OpARM64SLLconst) 5685 v.AuxInt = log2(c / 9) 5686 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5687 v0.AuxInt = 3 5688 v0.AddArg(x) 5689 v0.AddArg(x) 5690 v.AddArg(v0) 5691 return true 5692 } 5693 // match: (MUL (MOVDconst [c]) (MOVDconst [d])) 5694 // cond: 5695 // result: (MOVDconst [c*d]) 5696 for { 5697 v_0 := v.Args[0] 5698 if v_0.Op != OpARM64MOVDconst { 5699 break 5700 } 5701 c := v_0.AuxInt 5702 v_1 := v.Args[1] 5703 if v_1.Op != OpARM64MOVDconst { 5704 break 5705 } 5706 d := v_1.AuxInt 5707 v.reset(OpARM64MOVDconst) 5708 v.AuxInt = c * d 5709 return true 5710 } 5711 // match: (MUL (MOVDconst [d]) (MOVDconst [c])) 5712 // cond: 5713 // result: (MOVDconst [c*d]) 5714 for { 5715 v_0 := v.Args[0] 5716 if v_0.Op != OpARM64MOVDconst { 5717 break 5718 } 5719 d := v_0.AuxInt 5720 v_1 := v.Args[1] 5721 if v_1.Op != OpARM64MOVDconst { 5722 break 5723 } 5724 c := v_1.AuxInt 5725 v.reset(OpARM64MOVDconst) 5726 v.AuxInt = c * d 5727 return true 5728 } 5729 return false 5730 } 5731 func rewriteValueARM64_OpARM64MULW(v *Value) bool { 5732 b := v.Block 5733 _ = b 5734 // match: (MULW x (MOVDconst [c])) 5735 // cond: int32(c)==-1 5736 // result: (NEG x) 5737 for { 5738 x := v.Args[0] 5739 v_1 := v.Args[1] 5740 if v_1.Op != OpARM64MOVDconst { 5741 break 5742 } 5743 c := v_1.AuxInt 5744 if !(int32(c) == -1) { 5745 break 5746 } 5747 v.reset(OpARM64NEG) 5748 v.AddArg(x) 5749 return true 5750 } 5751 // match: (MULW (MOVDconst [c]) x) 5752 // cond: int32(c)==-1 5753 // result: (NEG x) 5754 for { 5755 v_0 := v.Args[0] 5756 if v_0.Op != OpARM64MOVDconst { 5757 break 5758 } 5759 c := v_0.AuxInt 5760 x := v.Args[1] 5761 if !(int32(c) == -1) { 5762 break 5763 } 5764 v.reset(OpARM64NEG) 5765 v.AddArg(x) 5766 return true 5767 } 5768 // match: (MULW _ (MOVDconst [c])) 5769 // cond: int32(c)==0 5770 // result: (MOVDconst [0]) 5771 for { 5772 v_1 := v.Args[1] 5773 if v_1.Op != OpARM64MOVDconst { 5774 break 5775 } 5776 c := v_1.AuxInt 5777 if !(int32(c) == 0) { 5778 break 5779 } 5780 v.reset(OpARM64MOVDconst) 5781 v.AuxInt = 0 5782 return true 5783 } 5784 // match: (MULW (MOVDconst [c]) _) 5785 // cond: int32(c)==0 5786 // result: (MOVDconst [0]) 5787 for { 5788 v_0 := v.Args[0] 5789 if v_0.Op != OpARM64MOVDconst { 5790 break 5791 } 5792 c := v_0.AuxInt 5793 if !(int32(c) == 0) { 5794 break 5795 } 5796 v.reset(OpARM64MOVDconst) 5797 v.AuxInt = 0 5798 return true 5799 } 5800 // match: (MULW x (MOVDconst [c])) 5801 // cond: int32(c)==1 5802 // result: x 5803 for { 5804 x := v.Args[0] 5805 v_1 := v.Args[1] 5806 if v_1.Op != OpARM64MOVDconst { 5807 break 5808 } 5809 c := v_1.AuxInt 5810 if !(int32(c) == 1) { 5811 break 5812 } 5813 v.reset(OpCopy) 5814 v.Type = x.Type 5815 v.AddArg(x) 5816 return true 5817 } 5818 // match: (MULW (MOVDconst [c]) x) 5819 // cond: int32(c)==1 5820 // result: x 5821 for { 5822 v_0 := v.Args[0] 5823 if v_0.Op != OpARM64MOVDconst { 5824 break 5825 } 5826 c := v_0.AuxInt 5827 x := v.Args[1] 5828 if !(int32(c) == 1) { 5829 break 5830 } 5831 v.reset(OpCopy) 5832 v.Type = x.Type 5833 v.AddArg(x) 5834 return true 5835 } 5836 // match: (MULW x (MOVDconst [c])) 5837 // cond: isPowerOfTwo(c) 5838 // result: (SLLconst [log2(c)] x) 5839 for { 5840 x := v.Args[0] 5841 v_1 := v.Args[1] 5842 if v_1.Op != OpARM64MOVDconst { 5843 break 5844 } 5845 c := v_1.AuxInt 5846 if !(isPowerOfTwo(c)) { 5847 break 5848 } 5849 v.reset(OpARM64SLLconst) 5850 v.AuxInt = log2(c) 5851 v.AddArg(x) 5852 return true 5853 } 5854 // match: (MULW (MOVDconst [c]) x) 5855 // cond: isPowerOfTwo(c) 5856 // result: (SLLconst [log2(c)] x) 5857 for { 5858 v_0 := v.Args[0] 5859 if v_0.Op != OpARM64MOVDconst { 5860 break 5861 } 5862 c := v_0.AuxInt 5863 x := v.Args[1] 5864 if !(isPowerOfTwo(c)) { 5865 break 5866 } 5867 v.reset(OpARM64SLLconst) 5868 v.AuxInt = log2(c) 5869 v.AddArg(x) 5870 return true 5871 } 5872 // match: (MULW x (MOVDconst [c])) 5873 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5874 // result: (ADDshiftLL x x [log2(c-1)]) 5875 for { 5876 x := v.Args[0] 5877 v_1 := v.Args[1] 5878 if v_1.Op != OpARM64MOVDconst { 5879 break 5880 } 5881 c := v_1.AuxInt 5882 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 5883 break 5884 } 5885 v.reset(OpARM64ADDshiftLL) 5886 v.AuxInt = log2(c - 1) 5887 v.AddArg(x) 5888 v.AddArg(x) 5889 return true 5890 } 5891 // match: (MULW (MOVDconst [c]) x) 5892 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5893 // result: (ADDshiftLL x x [log2(c-1)]) 5894 for { 5895 v_0 := v.Args[0] 5896 if v_0.Op != OpARM64MOVDconst { 5897 break 5898 } 5899 c := v_0.AuxInt 5900 x := v.Args[1] 5901 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 5902 break 5903 } 5904 v.reset(OpARM64ADDshiftLL) 5905 v.AuxInt = log2(c - 1) 5906 v.AddArg(x) 5907 v.AddArg(x) 5908 return true 5909 } 5910 // match: (MULW x (MOVDconst [c])) 5911 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 5912 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5913 for { 5914 x := v.Args[0] 5915 v_1 := v.Args[1] 5916 if v_1.Op != OpARM64MOVDconst { 5917 break 5918 } 5919 c := v_1.AuxInt 5920 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 5921 break 5922 } 5923 v.reset(OpARM64ADDshiftLL) 5924 v.AuxInt = log2(c + 1) 5925 v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5926 v0.AddArg(x) 5927 v.AddArg(v0) 5928 v.AddArg(x) 5929 return true 5930 } 5931 // match: (MULW (MOVDconst [c]) x) 5932 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 5933 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5934 for { 5935 v_0 := v.Args[0] 5936 if v_0.Op != OpARM64MOVDconst { 5937 break 5938 } 5939 c := v_0.AuxInt 5940 x := v.Args[1] 5941 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 5942 break 5943 } 5944 v.reset(OpARM64ADDshiftLL) 5945 v.AuxInt = log2(c + 1) 5946 v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 5947 v0.AddArg(x) 5948 v.AddArg(v0) 5949 v.AddArg(x) 5950 return true 5951 } 5952 // match: (MULW x (MOVDconst [c])) 5953 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 5954 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5955 for { 5956 x := v.Args[0] 5957 v_1 := v.Args[1] 5958 if v_1.Op != OpARM64MOVDconst { 5959 break 5960 } 5961 c := v_1.AuxInt 5962 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 5963 break 5964 } 5965 v.reset(OpARM64SLLconst) 5966 v.AuxInt = log2(c / 3) 5967 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5968 v0.AuxInt = 1 5969 v0.AddArg(x) 5970 v0.AddArg(x) 5971 v.AddArg(v0) 5972 return true 5973 } 5974 // match: (MULW (MOVDconst [c]) x) 5975 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 5976 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5977 for { 5978 v_0 := v.Args[0] 5979 if v_0.Op != OpARM64MOVDconst { 5980 break 5981 } 5982 c := v_0.AuxInt 5983 x := v.Args[1] 5984 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 5985 break 5986 } 5987 v.reset(OpARM64SLLconst) 5988 v.AuxInt = log2(c / 3) 5989 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 5990 v0.AuxInt = 1 5991 v0.AddArg(x) 5992 v0.AddArg(x) 5993 v.AddArg(v0) 5994 return true 5995 } 5996 // match: (MULW x (MOVDconst [c])) 5997 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 5998 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5999 for { 6000 x := v.Args[0] 6001 v_1 := v.Args[1] 6002 if v_1.Op != OpARM64MOVDconst { 6003 break 6004 } 6005 c := v_1.AuxInt 6006 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 6007 break 6008 } 6009 v.reset(OpARM64SLLconst) 6010 v.AuxInt = log2(c / 5) 6011 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6012 v0.AuxInt = 2 6013 v0.AddArg(x) 6014 v0.AddArg(x) 6015 v.AddArg(v0) 6016 return true 6017 } 6018 // match: (MULW (MOVDconst [c]) x) 6019 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 6020 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 6021 for { 6022 v_0 := v.Args[0] 6023 if v_0.Op != OpARM64MOVDconst { 6024 break 6025 } 6026 c := v_0.AuxInt 6027 x := v.Args[1] 6028 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 6029 break 6030 } 6031 v.reset(OpARM64SLLconst) 6032 v.AuxInt = log2(c / 5) 6033 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6034 v0.AuxInt = 2 6035 v0.AddArg(x) 6036 v0.AddArg(x) 6037 v.AddArg(v0) 6038 return true 6039 } 6040 // match: (MULW x (MOVDconst [c])) 6041 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 6042 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 6043 for { 6044 x := v.Args[0] 6045 v_1 := v.Args[1] 6046 if v_1.Op != OpARM64MOVDconst { 6047 break 6048 } 6049 c := v_1.AuxInt 6050 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 6051 break 6052 } 6053 v.reset(OpARM64SLLconst) 6054 v.AuxInt = log2(c / 7) 6055 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6056 v0.AuxInt = 3 6057 v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 6058 v1.AddArg(x) 6059 v0.AddArg(v1) 6060 v0.AddArg(x) 6061 v.AddArg(v0) 6062 return true 6063 } 6064 // match: (MULW (MOVDconst [c]) x) 6065 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 6066 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 6067 for { 6068 v_0 := v.Args[0] 6069 if v_0.Op != OpARM64MOVDconst { 6070 break 6071 } 6072 c := v_0.AuxInt 6073 x := v.Args[1] 6074 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 6075 break 6076 } 6077 v.reset(OpARM64SLLconst) 6078 v.AuxInt = log2(c / 7) 6079 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6080 v0.AuxInt = 3 6081 v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) 6082 v1.AddArg(x) 6083 v0.AddArg(v1) 6084 v0.AddArg(x) 6085 v.AddArg(v0) 6086 return true 6087 } 6088 // match: (MULW x (MOVDconst [c])) 6089 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 6090 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 6091 for { 6092 x := v.Args[0] 6093 v_1 := v.Args[1] 6094 if v_1.Op != OpARM64MOVDconst { 6095 break 6096 } 6097 c := v_1.AuxInt 6098 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 6099 break 6100 } 6101 v.reset(OpARM64SLLconst) 6102 v.AuxInt = log2(c / 9) 6103 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6104 v0.AuxInt = 3 6105 v0.AddArg(x) 6106 v0.AddArg(x) 6107 v.AddArg(v0) 6108 return true 6109 } 6110 // match: (MULW (MOVDconst [c]) x) 6111 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 6112 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 6113 for { 6114 v_0 := v.Args[0] 6115 if v_0.Op != OpARM64MOVDconst { 6116 break 6117 } 6118 c := v_0.AuxInt 6119 x := v.Args[1] 6120 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 6121 break 6122 } 6123 v.reset(OpARM64SLLconst) 6124 v.AuxInt = log2(c / 9) 6125 v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) 6126 v0.AuxInt = 3 6127 v0.AddArg(x) 6128 v0.AddArg(x) 6129 v.AddArg(v0) 6130 return true 6131 } 6132 // match: (MULW (MOVDconst [c]) (MOVDconst [d])) 6133 // cond: 6134 // result: (MOVDconst [int64(int32(c)*int32(d))]) 6135 for { 6136 v_0 := v.Args[0] 6137 if v_0.Op != OpARM64MOVDconst { 6138 break 6139 } 6140 c := v_0.AuxInt 6141 v_1 := v.Args[1] 6142 if v_1.Op != OpARM64MOVDconst { 6143 break 6144 } 6145 d := v_1.AuxInt 6146 v.reset(OpARM64MOVDconst) 6147 v.AuxInt = int64(int32(c) * int32(d)) 6148 return true 6149 } 6150 // match: (MULW (MOVDconst [d]) (MOVDconst [c])) 6151 // cond: 6152 // result: (MOVDconst [int64(int32(c)*int32(d))]) 6153 for { 6154 v_0 := v.Args[0] 6155 if v_0.Op != OpARM64MOVDconst { 6156 break 6157 } 6158 d := v_0.AuxInt 6159 v_1 := v.Args[1] 6160 if v_1.Op != OpARM64MOVDconst { 6161 break 6162 } 6163 c := v_1.AuxInt 6164 v.reset(OpARM64MOVDconst) 6165 v.AuxInt = int64(int32(c) * int32(d)) 6166 return true 6167 } 6168 return false 6169 } 6170 func rewriteValueARM64_OpARM64MVN(v *Value) bool { 6171 // match: (MVN (MOVDconst [c])) 6172 // cond: 6173 // result: (MOVDconst [^c]) 6174 for { 6175 v_0 := v.Args[0] 6176 if v_0.Op != OpARM64MOVDconst { 6177 break 6178 } 6179 c := v_0.AuxInt 6180 v.reset(OpARM64MOVDconst) 6181 v.AuxInt = ^c 6182 return true 6183 } 6184 return false 6185 } 6186 func rewriteValueARM64_OpARM64NEG(v *Value) bool { 6187 // match: (NEG (MOVDconst [c])) 6188 // cond: 6189 // result: (MOVDconst [-c]) 6190 for { 6191 v_0 := v.Args[0] 6192 if v_0.Op != OpARM64MOVDconst { 6193 break 6194 } 6195 c := v_0.AuxInt 6196 v.reset(OpARM64MOVDconst) 6197 v.AuxInt = -c 6198 return true 6199 } 6200 return false 6201 } 6202 func rewriteValueARM64_OpARM64NotEqual(v *Value) bool { 6203 // match: (NotEqual (FlagEQ)) 6204 // cond: 6205 // result: (MOVDconst [0]) 6206 for { 6207 v_0 := v.Args[0] 6208 if v_0.Op != OpARM64FlagEQ { 6209 break 6210 } 6211 v.reset(OpARM64MOVDconst) 6212 v.AuxInt = 0 6213 return true 6214 } 6215 // match: (NotEqual (FlagLT_ULT)) 6216 // cond: 6217 // result: (MOVDconst [1]) 6218 for { 6219 v_0 := v.Args[0] 6220 if v_0.Op != OpARM64FlagLT_ULT { 6221 break 6222 } 6223 v.reset(OpARM64MOVDconst) 6224 v.AuxInt = 1 6225 return true 6226 } 6227 // match: (NotEqual (FlagLT_UGT)) 6228 // cond: 6229 // result: (MOVDconst [1]) 6230 for { 6231 v_0 := v.Args[0] 6232 if v_0.Op != OpARM64FlagLT_UGT { 6233 break 6234 } 6235 v.reset(OpARM64MOVDconst) 6236 v.AuxInt = 1 6237 return true 6238 } 6239 // match: (NotEqual (FlagGT_ULT)) 6240 // cond: 6241 // result: (MOVDconst [1]) 6242 for { 6243 v_0 := v.Args[0] 6244 if v_0.Op != OpARM64FlagGT_ULT { 6245 break 6246 } 6247 v.reset(OpARM64MOVDconst) 6248 v.AuxInt = 1 6249 return true 6250 } 6251 // match: (NotEqual (FlagGT_UGT)) 6252 // cond: 6253 // result: (MOVDconst [1]) 6254 for { 6255 v_0 := v.Args[0] 6256 if v_0.Op != OpARM64FlagGT_UGT { 6257 break 6258 } 6259 v.reset(OpARM64MOVDconst) 6260 v.AuxInt = 1 6261 return true 6262 } 6263 // match: (NotEqual (InvertFlags x)) 6264 // cond: 6265 // result: (NotEqual x) 6266 for { 6267 v_0 := v.Args[0] 6268 if v_0.Op != OpARM64InvertFlags { 6269 break 6270 } 6271 x := v_0.Args[0] 6272 v.reset(OpARM64NotEqual) 6273 v.AddArg(x) 6274 return true 6275 } 6276 return false 6277 } 6278 func rewriteValueARM64_OpARM64OR(v *Value) bool { 6279 b := v.Block 6280 _ = b 6281 // match: (OR x (MOVDconst [c])) 6282 // cond: 6283 // result: (ORconst [c] x) 6284 for { 6285 x := v.Args[0] 6286 v_1 := v.Args[1] 6287 if v_1.Op != OpARM64MOVDconst { 6288 break 6289 } 6290 c := v_1.AuxInt 6291 v.reset(OpARM64ORconst) 6292 v.AuxInt = c 6293 v.AddArg(x) 6294 return true 6295 } 6296 // match: (OR (MOVDconst [c]) x) 6297 // cond: 6298 // result: (ORconst [c] x) 6299 for { 6300 v_0 := v.Args[0] 6301 if v_0.Op != OpARM64MOVDconst { 6302 break 6303 } 6304 c := v_0.AuxInt 6305 x := v.Args[1] 6306 v.reset(OpARM64ORconst) 6307 v.AuxInt = c 6308 v.AddArg(x) 6309 return true 6310 } 6311 // match: (OR x x) 6312 // cond: 6313 // result: x 6314 for { 6315 x := v.Args[0] 6316 if x != v.Args[1] { 6317 break 6318 } 6319 v.reset(OpCopy) 6320 v.Type = x.Type 6321 v.AddArg(x) 6322 return true 6323 } 6324 // match: (OR x (SLLconst [c] y)) 6325 // cond: 6326 // result: (ORshiftLL x y [c]) 6327 for { 6328 x := v.Args[0] 6329 v_1 := v.Args[1] 6330 if v_1.Op != OpARM64SLLconst { 6331 break 6332 } 6333 c := v_1.AuxInt 6334 y := v_1.Args[0] 6335 v.reset(OpARM64ORshiftLL) 6336 v.AuxInt = c 6337 v.AddArg(x) 6338 v.AddArg(y) 6339 return true 6340 } 6341 // match: (OR (SLLconst [c] y) x) 6342 // cond: 6343 // result: (ORshiftLL x y [c]) 6344 for { 6345 v_0 := v.Args[0] 6346 if v_0.Op != OpARM64SLLconst { 6347 break 6348 } 6349 c := v_0.AuxInt 6350 y := v_0.Args[0] 6351 x := v.Args[1] 6352 v.reset(OpARM64ORshiftLL) 6353 v.AuxInt = c 6354 v.AddArg(x) 6355 v.AddArg(y) 6356 return true 6357 } 6358 // match: (OR x (SRLconst [c] y)) 6359 // cond: 6360 // result: (ORshiftRL x y [c]) 6361 for { 6362 x := v.Args[0] 6363 v_1 := v.Args[1] 6364 if v_1.Op != OpARM64SRLconst { 6365 break 6366 } 6367 c := v_1.AuxInt 6368 y := v_1.Args[0] 6369 v.reset(OpARM64ORshiftRL) 6370 v.AuxInt = c 6371 v.AddArg(x) 6372 v.AddArg(y) 6373 return true 6374 } 6375 // match: (OR (SRLconst [c] y) x) 6376 // cond: 6377 // result: (ORshiftRL x y [c]) 6378 for { 6379 v_0 := v.Args[0] 6380 if v_0.Op != OpARM64SRLconst { 6381 break 6382 } 6383 c := v_0.AuxInt 6384 y := v_0.Args[0] 6385 x := v.Args[1] 6386 v.reset(OpARM64ORshiftRL) 6387 v.AuxInt = c 6388 v.AddArg(x) 6389 v.AddArg(y) 6390 return true 6391 } 6392 // match: (OR x (SRAconst [c] y)) 6393 // cond: 6394 // result: (ORshiftRA x y [c]) 6395 for { 6396 x := v.Args[0] 6397 v_1 := v.Args[1] 6398 if v_1.Op != OpARM64SRAconst { 6399 break 6400 } 6401 c := v_1.AuxInt 6402 y := v_1.Args[0] 6403 v.reset(OpARM64ORshiftRA) 6404 v.AuxInt = c 6405 v.AddArg(x) 6406 v.AddArg(y) 6407 return true 6408 } 6409 // match: (OR (SRAconst [c] y) x) 6410 // cond: 6411 // result: (ORshiftRA x y [c]) 6412 for { 6413 v_0 := v.Args[0] 6414 if v_0.Op != OpARM64SRAconst { 6415 break 6416 } 6417 c := v_0.AuxInt 6418 y := v_0.Args[0] 6419 x := v.Args[1] 6420 v.reset(OpARM64ORshiftRA) 6421 v.AuxInt = c 6422 v.AddArg(x) 6423 v.AddArg(y) 6424 return true 6425 } 6426 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem))) 6427 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) 6428 // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem) 6429 for { 6430 t := v.Type 6431 o0 := v.Args[0] 6432 if o0.Op != OpARM64ORshiftLL { 6433 break 6434 } 6435 if o0.AuxInt != 8 { 6436 break 6437 } 6438 o1 := o0.Args[0] 6439 if o1.Op != OpARM64ORshiftLL { 6440 break 6441 } 6442 if o1.AuxInt != 16 { 6443 break 6444 } 6445 s0 := o1.Args[0] 6446 if s0.Op != OpARM64SLLconst { 6447 break 6448 } 6449 if s0.AuxInt != 24 { 6450 break 6451 } 6452 y0 := s0.Args[0] 6453 if y0.Op != OpARM64MOVDnop { 6454 break 6455 } 6456 x0 := y0.Args[0] 6457 if x0.Op != OpARM64MOVBUload { 6458 break 6459 } 6460 i3 := x0.AuxInt 6461 s := x0.Aux 6462 p := x0.Args[0] 6463 mem := x0.Args[1] 6464 y1 := o1.Args[1] 6465 if y1.Op != OpARM64MOVDnop { 6466 break 6467 } 6468 x1 := y1.Args[0] 6469 if x1.Op != OpARM64MOVBUload { 6470 break 6471 } 6472 i2 := x1.AuxInt 6473 if x1.Aux != s { 6474 break 6475 } 6476 if p != x1.Args[0] { 6477 break 6478 } 6479 if mem != x1.Args[1] { 6480 break 6481 } 6482 y2 := o0.Args[1] 6483 if y2.Op != OpARM64MOVDnop { 6484 break 6485 } 6486 x2 := y2.Args[0] 6487 if x2.Op != OpARM64MOVBUload { 6488 break 6489 } 6490 i1 := x2.AuxInt 6491 if x2.Aux != s { 6492 break 6493 } 6494 if p != x2.Args[0] { 6495 break 6496 } 6497 if mem != x2.Args[1] { 6498 break 6499 } 6500 y3 := v.Args[1] 6501 if y3.Op != OpARM64MOVDnop { 6502 break 6503 } 6504 x3 := y3.Args[0] 6505 if x3.Op != OpARM64MOVBUload { 6506 break 6507 } 6508 i0 := x3.AuxInt 6509 if x3.Aux != s { 6510 break 6511 } 6512 if p != x3.Args[0] { 6513 break 6514 } 6515 if mem != x3.Args[1] { 6516 break 6517 } 6518 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { 6519 break 6520 } 6521 b = mergePoint(b, x0, x1, x2, x3) 6522 v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 6523 v.reset(OpCopy) 6524 v.AddArg(v0) 6525 v0.Aux = s 6526 v1 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 6527 v1.AuxInt = i0 6528 v1.AddArg(p) 6529 v0.AddArg(v1) 6530 v0.AddArg(mem) 6531 return true 6532 } 6533 // match: (OR <t> y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem)))) 6534 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) 6535 // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem) 6536 for { 6537 t := v.Type 6538 y3 := v.Args[0] 6539 if y3.Op != OpARM64MOVDnop { 6540 break 6541 } 6542 x3 := y3.Args[0] 6543 if x3.Op != OpARM64MOVBUload { 6544 break 6545 } 6546 i0 := x3.AuxInt 6547 s := x3.Aux 6548 p := x3.Args[0] 6549 mem := x3.Args[1] 6550 o0 := v.Args[1] 6551 if o0.Op != OpARM64ORshiftLL { 6552 break 6553 } 6554 if o0.AuxInt != 8 { 6555 break 6556 } 6557 o1 := o0.Args[0] 6558 if o1.Op != OpARM64ORshiftLL { 6559 break 6560 } 6561 if o1.AuxInt != 16 { 6562 break 6563 } 6564 s0 := o1.Args[0] 6565 if s0.Op != OpARM64SLLconst { 6566 break 6567 } 6568 if s0.AuxInt != 24 { 6569 break 6570 } 6571 y0 := s0.Args[0] 6572 if y0.Op != OpARM64MOVDnop { 6573 break 6574 } 6575 x0 := y0.Args[0] 6576 if x0.Op != OpARM64MOVBUload { 6577 break 6578 } 6579 i3 := x0.AuxInt 6580 if x0.Aux != s { 6581 break 6582 } 6583 if p != x0.Args[0] { 6584 break 6585 } 6586 if mem != x0.Args[1] { 6587 break 6588 } 6589 y1 := o1.Args[1] 6590 if y1.Op != OpARM64MOVDnop { 6591 break 6592 } 6593 x1 := y1.Args[0] 6594 if x1.Op != OpARM64MOVBUload { 6595 break 6596 } 6597 i2 := x1.AuxInt 6598 if x1.Aux != s { 6599 break 6600 } 6601 if p != x1.Args[0] { 6602 break 6603 } 6604 if mem != x1.Args[1] { 6605 break 6606 } 6607 y2 := o0.Args[1] 6608 if y2.Op != OpARM64MOVDnop { 6609 break 6610 } 6611 x2 := y2.Args[0] 6612 if x2.Op != OpARM64MOVBUload { 6613 break 6614 } 6615 i1 := x2.AuxInt 6616 if x2.Aux != s { 6617 break 6618 } 6619 if p != x2.Args[0] { 6620 break 6621 } 6622 if mem != x2.Args[1] { 6623 break 6624 } 6625 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { 6626 break 6627 } 6628 b = mergePoint(b, x0, x1, x2, x3) 6629 v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 6630 v.reset(OpCopy) 6631 v.AddArg(v0) 6632 v0.Aux = s 6633 v1 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 6634 v1.AuxInt = i0 6635 v1.AddArg(p) 6636 v0.AddArg(v1) 6637 v0.AddArg(mem) 6638 return true 6639 } 6640 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem))) 6641 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) 6642 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 6643 for { 6644 t := v.Type 6645 o0 := v.Args[0] 6646 if o0.Op != OpARM64ORshiftLL { 6647 break 6648 } 6649 if o0.AuxInt != 8 { 6650 break 6651 } 6652 o1 := o0.Args[0] 6653 if o1.Op != OpARM64ORshiftLL { 6654 break 6655 } 6656 if o1.AuxInt != 16 { 6657 break 6658 } 6659 o2 := o1.Args[0] 6660 if o2.Op != OpARM64ORshiftLL { 6661 break 6662 } 6663 if o2.AuxInt != 24 { 6664 break 6665 } 6666 o3 := o2.Args[0] 6667 if o3.Op != OpARM64ORshiftLL { 6668 break 6669 } 6670 if o3.AuxInt != 32 { 6671 break 6672 } 6673 o4 := o3.Args[0] 6674 if o4.Op != OpARM64ORshiftLL { 6675 break 6676 } 6677 if o4.AuxInt != 40 { 6678 break 6679 } 6680 o5 := o4.Args[0] 6681 if o5.Op != OpARM64ORshiftLL { 6682 break 6683 } 6684 if o5.AuxInt != 48 { 6685 break 6686 } 6687 s0 := o5.Args[0] 6688 if s0.Op != OpARM64SLLconst { 6689 break 6690 } 6691 if s0.AuxInt != 56 { 6692 break 6693 } 6694 y0 := s0.Args[0] 6695 if y0.Op != OpARM64MOVDnop { 6696 break 6697 } 6698 x0 := y0.Args[0] 6699 if x0.Op != OpARM64MOVBUload { 6700 break 6701 } 6702 i7 := x0.AuxInt 6703 s := x0.Aux 6704 p := x0.Args[0] 6705 mem := x0.Args[1] 6706 y1 := o5.Args[1] 6707 if y1.Op != OpARM64MOVDnop { 6708 break 6709 } 6710 x1 := y1.Args[0] 6711 if x1.Op != OpARM64MOVBUload { 6712 break 6713 } 6714 i6 := x1.AuxInt 6715 if x1.Aux != s { 6716 break 6717 } 6718 if p != x1.Args[0] { 6719 break 6720 } 6721 if mem != x1.Args[1] { 6722 break 6723 } 6724 y2 := o4.Args[1] 6725 if y2.Op != OpARM64MOVDnop { 6726 break 6727 } 6728 x2 := y2.Args[0] 6729 if x2.Op != OpARM64MOVBUload { 6730 break 6731 } 6732 i5 := x2.AuxInt 6733 if x2.Aux != s { 6734 break 6735 } 6736 if p != x2.Args[0] { 6737 break 6738 } 6739 if mem != x2.Args[1] { 6740 break 6741 } 6742 y3 := o3.Args[1] 6743 if y3.Op != OpARM64MOVDnop { 6744 break 6745 } 6746 x3 := y3.Args[0] 6747 if x3.Op != OpARM64MOVBUload { 6748 break 6749 } 6750 i4 := x3.AuxInt 6751 if x3.Aux != s { 6752 break 6753 } 6754 if p != x3.Args[0] { 6755 break 6756 } 6757 if mem != x3.Args[1] { 6758 break 6759 } 6760 y4 := o2.Args[1] 6761 if y4.Op != OpARM64MOVDnop { 6762 break 6763 } 6764 x4 := y4.Args[0] 6765 if x4.Op != OpARM64MOVBUload { 6766 break 6767 } 6768 i3 := x4.AuxInt 6769 if x4.Aux != s { 6770 break 6771 } 6772 if p != x4.Args[0] { 6773 break 6774 } 6775 if mem != x4.Args[1] { 6776 break 6777 } 6778 y5 := o1.Args[1] 6779 if y5.Op != OpARM64MOVDnop { 6780 break 6781 } 6782 x5 := y5.Args[0] 6783 if x5.Op != OpARM64MOVBUload { 6784 break 6785 } 6786 i2 := x5.AuxInt 6787 if x5.Aux != s { 6788 break 6789 } 6790 if p != x5.Args[0] { 6791 break 6792 } 6793 if mem != x5.Args[1] { 6794 break 6795 } 6796 y6 := o0.Args[1] 6797 if y6.Op != OpARM64MOVDnop { 6798 break 6799 } 6800 x6 := y6.Args[0] 6801 if x6.Op != OpARM64MOVBUload { 6802 break 6803 } 6804 i1 := x6.AuxInt 6805 if x6.Aux != s { 6806 break 6807 } 6808 if p != x6.Args[0] { 6809 break 6810 } 6811 if mem != x6.Args[1] { 6812 break 6813 } 6814 y7 := v.Args[1] 6815 if y7.Op != OpARM64MOVDnop { 6816 break 6817 } 6818 x7 := y7.Args[0] 6819 if x7.Op != OpARM64MOVBUload { 6820 break 6821 } 6822 i0 := x7.AuxInt 6823 if x7.Aux != s { 6824 break 6825 } 6826 if p != x7.Args[0] { 6827 break 6828 } 6829 if mem != x7.Args[1] { 6830 break 6831 } 6832 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { 6833 break 6834 } 6835 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 6836 v0 := b.NewValue0(v.Pos, OpARM64REV, t) 6837 v.reset(OpCopy) 6838 v.AddArg(v0) 6839 v1 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 6840 v1.Aux = s 6841 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 6842 v2.AuxInt = i0 6843 v2.AddArg(p) 6844 v1.AddArg(v2) 6845 v1.AddArg(mem) 6846 v0.AddArg(v1) 6847 return true 6848 } 6849 // match: (OR <t> y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem)))) 6850 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) 6851 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 6852 for { 6853 t := v.Type 6854 y7 := v.Args[0] 6855 if y7.Op != OpARM64MOVDnop { 6856 break 6857 } 6858 x7 := y7.Args[0] 6859 if x7.Op != OpARM64MOVBUload { 6860 break 6861 } 6862 i0 := x7.AuxInt 6863 s := x7.Aux 6864 p := x7.Args[0] 6865 mem := x7.Args[1] 6866 o0 := v.Args[1] 6867 if o0.Op != OpARM64ORshiftLL { 6868 break 6869 } 6870 if o0.AuxInt != 8 { 6871 break 6872 } 6873 o1 := o0.Args[0] 6874 if o1.Op != OpARM64ORshiftLL { 6875 break 6876 } 6877 if o1.AuxInt != 16 { 6878 break 6879 } 6880 o2 := o1.Args[0] 6881 if o2.Op != OpARM64ORshiftLL { 6882 break 6883 } 6884 if o2.AuxInt != 24 { 6885 break 6886 } 6887 o3 := o2.Args[0] 6888 if o3.Op != OpARM64ORshiftLL { 6889 break 6890 } 6891 if o3.AuxInt != 32 { 6892 break 6893 } 6894 o4 := o3.Args[0] 6895 if o4.Op != OpARM64ORshiftLL { 6896 break 6897 } 6898 if o4.AuxInt != 40 { 6899 break 6900 } 6901 o5 := o4.Args[0] 6902 if o5.Op != OpARM64ORshiftLL { 6903 break 6904 } 6905 if o5.AuxInt != 48 { 6906 break 6907 } 6908 s0 := o5.Args[0] 6909 if s0.Op != OpARM64SLLconst { 6910 break 6911 } 6912 if s0.AuxInt != 56 { 6913 break 6914 } 6915 y0 := s0.Args[0] 6916 if y0.Op != OpARM64MOVDnop { 6917 break 6918 } 6919 x0 := y0.Args[0] 6920 if x0.Op != OpARM64MOVBUload { 6921 break 6922 } 6923 i7 := x0.AuxInt 6924 if x0.Aux != s { 6925 break 6926 } 6927 if p != x0.Args[0] { 6928 break 6929 } 6930 if mem != x0.Args[1] { 6931 break 6932 } 6933 y1 := o5.Args[1] 6934 if y1.Op != OpARM64MOVDnop { 6935 break 6936 } 6937 x1 := y1.Args[0] 6938 if x1.Op != OpARM64MOVBUload { 6939 break 6940 } 6941 i6 := x1.AuxInt 6942 if x1.Aux != s { 6943 break 6944 } 6945 if p != x1.Args[0] { 6946 break 6947 } 6948 if mem != x1.Args[1] { 6949 break 6950 } 6951 y2 := o4.Args[1] 6952 if y2.Op != OpARM64MOVDnop { 6953 break 6954 } 6955 x2 := y2.Args[0] 6956 if x2.Op != OpARM64MOVBUload { 6957 break 6958 } 6959 i5 := x2.AuxInt 6960 if x2.Aux != s { 6961 break 6962 } 6963 if p != x2.Args[0] { 6964 break 6965 } 6966 if mem != x2.Args[1] { 6967 break 6968 } 6969 y3 := o3.Args[1] 6970 if y3.Op != OpARM64MOVDnop { 6971 break 6972 } 6973 x3 := y3.Args[0] 6974 if x3.Op != OpARM64MOVBUload { 6975 break 6976 } 6977 i4 := x3.AuxInt 6978 if x3.Aux != s { 6979 break 6980 } 6981 if p != x3.Args[0] { 6982 break 6983 } 6984 if mem != x3.Args[1] { 6985 break 6986 } 6987 y4 := o2.Args[1] 6988 if y4.Op != OpARM64MOVDnop { 6989 break 6990 } 6991 x4 := y4.Args[0] 6992 if x4.Op != OpARM64MOVBUload { 6993 break 6994 } 6995 i3 := x4.AuxInt 6996 if x4.Aux != s { 6997 break 6998 } 6999 if p != x4.Args[0] { 7000 break 7001 } 7002 if mem != x4.Args[1] { 7003 break 7004 } 7005 y5 := o1.Args[1] 7006 if y5.Op != OpARM64MOVDnop { 7007 break 7008 } 7009 x5 := y5.Args[0] 7010 if x5.Op != OpARM64MOVBUload { 7011 break 7012 } 7013 i2 := x5.AuxInt 7014 if x5.Aux != s { 7015 break 7016 } 7017 if p != x5.Args[0] { 7018 break 7019 } 7020 if mem != x5.Args[1] { 7021 break 7022 } 7023 y6 := o0.Args[1] 7024 if y6.Op != OpARM64MOVDnop { 7025 break 7026 } 7027 x6 := y6.Args[0] 7028 if x6.Op != OpARM64MOVBUload { 7029 break 7030 } 7031 i1 := x6.AuxInt 7032 if x6.Aux != s { 7033 break 7034 } 7035 if p != x6.Args[0] { 7036 break 7037 } 7038 if mem != x6.Args[1] { 7039 break 7040 } 7041 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { 7042 break 7043 } 7044 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 7045 v0 := b.NewValue0(v.Pos, OpARM64REV, t) 7046 v.reset(OpCopy) 7047 v.AddArg(v0) 7048 v1 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 7049 v1.Aux = s 7050 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7051 v2.AuxInt = i0 7052 v2.AddArg(p) 7053 v1.AddArg(v2) 7054 v1.AddArg(mem) 7055 v0.AddArg(v1) 7056 return true 7057 } 7058 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) 7059 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) 7060 // result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 7061 for { 7062 t := v.Type 7063 o0 := v.Args[0] 7064 if o0.Op != OpARM64ORshiftLL { 7065 break 7066 } 7067 if o0.AuxInt != 8 { 7068 break 7069 } 7070 o1 := o0.Args[0] 7071 if o1.Op != OpARM64ORshiftLL { 7072 break 7073 } 7074 if o1.AuxInt != 16 { 7075 break 7076 } 7077 s0 := o1.Args[0] 7078 if s0.Op != OpARM64SLLconst { 7079 break 7080 } 7081 if s0.AuxInt != 24 { 7082 break 7083 } 7084 y0 := s0.Args[0] 7085 if y0.Op != OpARM64MOVDnop { 7086 break 7087 } 7088 x0 := y0.Args[0] 7089 if x0.Op != OpARM64MOVBUload { 7090 break 7091 } 7092 i0 := x0.AuxInt 7093 s := x0.Aux 7094 p := x0.Args[0] 7095 mem := x0.Args[1] 7096 y1 := o1.Args[1] 7097 if y1.Op != OpARM64MOVDnop { 7098 break 7099 } 7100 x1 := y1.Args[0] 7101 if x1.Op != OpARM64MOVBUload { 7102 break 7103 } 7104 i1 := x1.AuxInt 7105 if x1.Aux != s { 7106 break 7107 } 7108 if p != x1.Args[0] { 7109 break 7110 } 7111 if mem != x1.Args[1] { 7112 break 7113 } 7114 y2 := o0.Args[1] 7115 if y2.Op != OpARM64MOVDnop { 7116 break 7117 } 7118 x2 := y2.Args[0] 7119 if x2.Op != OpARM64MOVBUload { 7120 break 7121 } 7122 i2 := x2.AuxInt 7123 if x2.Aux != s { 7124 break 7125 } 7126 if p != x2.Args[0] { 7127 break 7128 } 7129 if mem != x2.Args[1] { 7130 break 7131 } 7132 y3 := v.Args[1] 7133 if y3.Op != OpARM64MOVDnop { 7134 break 7135 } 7136 x3 := y3.Args[0] 7137 if x3.Op != OpARM64MOVBUload { 7138 break 7139 } 7140 i3 := x3.AuxInt 7141 if x3.Aux != s { 7142 break 7143 } 7144 if p != x3.Args[0] { 7145 break 7146 } 7147 if mem != x3.Args[1] { 7148 break 7149 } 7150 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { 7151 break 7152 } 7153 b = mergePoint(b, x0, x1, x2, x3) 7154 v0 := b.NewValue0(v.Pos, OpARM64REVW, t) 7155 v.reset(OpCopy) 7156 v.AddArg(v0) 7157 v1 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 7158 v1.Aux = s 7159 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7160 v2.AuxInt = i0 7161 v2.AddArg(p) 7162 v1.AddArg(v2) 7163 v1.AddArg(mem) 7164 v0.AddArg(v1) 7165 return true 7166 } 7167 // match: (OR <t> y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem)))) 7168 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) 7169 // result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 7170 for { 7171 t := v.Type 7172 y3 := v.Args[0] 7173 if y3.Op != OpARM64MOVDnop { 7174 break 7175 } 7176 x3 := y3.Args[0] 7177 if x3.Op != OpARM64MOVBUload { 7178 break 7179 } 7180 i3 := x3.AuxInt 7181 s := x3.Aux 7182 p := x3.Args[0] 7183 mem := x3.Args[1] 7184 o0 := v.Args[1] 7185 if o0.Op != OpARM64ORshiftLL { 7186 break 7187 } 7188 if o0.AuxInt != 8 { 7189 break 7190 } 7191 o1 := o0.Args[0] 7192 if o1.Op != OpARM64ORshiftLL { 7193 break 7194 } 7195 if o1.AuxInt != 16 { 7196 break 7197 } 7198 s0 := o1.Args[0] 7199 if s0.Op != OpARM64SLLconst { 7200 break 7201 } 7202 if s0.AuxInt != 24 { 7203 break 7204 } 7205 y0 := s0.Args[0] 7206 if y0.Op != OpARM64MOVDnop { 7207 break 7208 } 7209 x0 := y0.Args[0] 7210 if x0.Op != OpARM64MOVBUload { 7211 break 7212 } 7213 i0 := x0.AuxInt 7214 if x0.Aux != s { 7215 break 7216 } 7217 if p != x0.Args[0] { 7218 break 7219 } 7220 if mem != x0.Args[1] { 7221 break 7222 } 7223 y1 := o1.Args[1] 7224 if y1.Op != OpARM64MOVDnop { 7225 break 7226 } 7227 x1 := y1.Args[0] 7228 if x1.Op != OpARM64MOVBUload { 7229 break 7230 } 7231 i1 := x1.AuxInt 7232 if x1.Aux != s { 7233 break 7234 } 7235 if p != x1.Args[0] { 7236 break 7237 } 7238 if mem != x1.Args[1] { 7239 break 7240 } 7241 y2 := o0.Args[1] 7242 if y2.Op != OpARM64MOVDnop { 7243 break 7244 } 7245 x2 := y2.Args[0] 7246 if x2.Op != OpARM64MOVBUload { 7247 break 7248 } 7249 i2 := x2.AuxInt 7250 if x2.Aux != s { 7251 break 7252 } 7253 if p != x2.Args[0] { 7254 break 7255 } 7256 if mem != x2.Args[1] { 7257 break 7258 } 7259 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { 7260 break 7261 } 7262 b = mergePoint(b, x0, x1, x2, x3) 7263 v0 := b.NewValue0(v.Pos, OpARM64REVW, t) 7264 v.reset(OpCopy) 7265 v.AddArg(v0) 7266 v1 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 7267 v1.Aux = s 7268 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7269 v2.AuxInt = i0 7270 v2.AddArg(p) 7271 v1.AddArg(v2) 7272 v1.AddArg(mem) 7273 v0.AddArg(v1) 7274 return true 7275 } 7276 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem))) 7277 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) 7278 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 7279 for { 7280 t := v.Type 7281 o0 := v.Args[0] 7282 if o0.Op != OpARM64ORshiftLL { 7283 break 7284 } 7285 if o0.AuxInt != 8 { 7286 break 7287 } 7288 o1 := o0.Args[0] 7289 if o1.Op != OpARM64ORshiftLL { 7290 break 7291 } 7292 if o1.AuxInt != 16 { 7293 break 7294 } 7295 o2 := o1.Args[0] 7296 if o2.Op != OpARM64ORshiftLL { 7297 break 7298 } 7299 if o2.AuxInt != 24 { 7300 break 7301 } 7302 o3 := o2.Args[0] 7303 if o3.Op != OpARM64ORshiftLL { 7304 break 7305 } 7306 if o3.AuxInt != 32 { 7307 break 7308 } 7309 o4 := o3.Args[0] 7310 if o4.Op != OpARM64ORshiftLL { 7311 break 7312 } 7313 if o4.AuxInt != 40 { 7314 break 7315 } 7316 o5 := o4.Args[0] 7317 if o5.Op != OpARM64ORshiftLL { 7318 break 7319 } 7320 if o5.AuxInt != 48 { 7321 break 7322 } 7323 s0 := o5.Args[0] 7324 if s0.Op != OpARM64SLLconst { 7325 break 7326 } 7327 if s0.AuxInt != 56 { 7328 break 7329 } 7330 y0 := s0.Args[0] 7331 if y0.Op != OpARM64MOVDnop { 7332 break 7333 } 7334 x0 := y0.Args[0] 7335 if x0.Op != OpARM64MOVBUload { 7336 break 7337 } 7338 i0 := x0.AuxInt 7339 s := x0.Aux 7340 p := x0.Args[0] 7341 mem := x0.Args[1] 7342 y1 := o5.Args[1] 7343 if y1.Op != OpARM64MOVDnop { 7344 break 7345 } 7346 x1 := y1.Args[0] 7347 if x1.Op != OpARM64MOVBUload { 7348 break 7349 } 7350 i1 := x1.AuxInt 7351 if x1.Aux != s { 7352 break 7353 } 7354 if p != x1.Args[0] { 7355 break 7356 } 7357 if mem != x1.Args[1] { 7358 break 7359 } 7360 y2 := o4.Args[1] 7361 if y2.Op != OpARM64MOVDnop { 7362 break 7363 } 7364 x2 := y2.Args[0] 7365 if x2.Op != OpARM64MOVBUload { 7366 break 7367 } 7368 i2 := x2.AuxInt 7369 if x2.Aux != s { 7370 break 7371 } 7372 if p != x2.Args[0] { 7373 break 7374 } 7375 if mem != x2.Args[1] { 7376 break 7377 } 7378 y3 := o3.Args[1] 7379 if y3.Op != OpARM64MOVDnop { 7380 break 7381 } 7382 x3 := y3.Args[0] 7383 if x3.Op != OpARM64MOVBUload { 7384 break 7385 } 7386 i3 := x3.AuxInt 7387 if x3.Aux != s { 7388 break 7389 } 7390 if p != x3.Args[0] { 7391 break 7392 } 7393 if mem != x3.Args[1] { 7394 break 7395 } 7396 y4 := o2.Args[1] 7397 if y4.Op != OpARM64MOVDnop { 7398 break 7399 } 7400 x4 := y4.Args[0] 7401 if x4.Op != OpARM64MOVBUload { 7402 break 7403 } 7404 i4 := x4.AuxInt 7405 if x4.Aux != s { 7406 break 7407 } 7408 if p != x4.Args[0] { 7409 break 7410 } 7411 if mem != x4.Args[1] { 7412 break 7413 } 7414 y5 := o1.Args[1] 7415 if y5.Op != OpARM64MOVDnop { 7416 break 7417 } 7418 x5 := y5.Args[0] 7419 if x5.Op != OpARM64MOVBUload { 7420 break 7421 } 7422 i5 := x5.AuxInt 7423 if x5.Aux != s { 7424 break 7425 } 7426 if p != x5.Args[0] { 7427 break 7428 } 7429 if mem != x5.Args[1] { 7430 break 7431 } 7432 y6 := o0.Args[1] 7433 if y6.Op != OpARM64MOVDnop { 7434 break 7435 } 7436 x6 := y6.Args[0] 7437 if x6.Op != OpARM64MOVBUload { 7438 break 7439 } 7440 i6 := x6.AuxInt 7441 if x6.Aux != s { 7442 break 7443 } 7444 if p != x6.Args[0] { 7445 break 7446 } 7447 if mem != x6.Args[1] { 7448 break 7449 } 7450 y7 := v.Args[1] 7451 if y7.Op != OpARM64MOVDnop { 7452 break 7453 } 7454 x7 := y7.Args[0] 7455 if x7.Op != OpARM64MOVBUload { 7456 break 7457 } 7458 i7 := x7.AuxInt 7459 if x7.Aux != s { 7460 break 7461 } 7462 if p != x7.Args[0] { 7463 break 7464 } 7465 if mem != x7.Args[1] { 7466 break 7467 } 7468 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { 7469 break 7470 } 7471 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 7472 v0 := b.NewValue0(v.Pos, OpARM64REV, t) 7473 v.reset(OpCopy) 7474 v.AddArg(v0) 7475 v1 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 7476 v1.Aux = s 7477 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7478 v2.AuxInt = i0 7479 v2.AddArg(p) 7480 v1.AddArg(v2) 7481 v1.AddArg(mem) 7482 v0.AddArg(v1) 7483 return true 7484 } 7485 // match: (OR <t> y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem)))) 7486 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) 7487 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 7488 for { 7489 t := v.Type 7490 y7 := v.Args[0] 7491 if y7.Op != OpARM64MOVDnop { 7492 break 7493 } 7494 x7 := y7.Args[0] 7495 if x7.Op != OpARM64MOVBUload { 7496 break 7497 } 7498 i7 := x7.AuxInt 7499 s := x7.Aux 7500 p := x7.Args[0] 7501 mem := x7.Args[1] 7502 o0 := v.Args[1] 7503 if o0.Op != OpARM64ORshiftLL { 7504 break 7505 } 7506 if o0.AuxInt != 8 { 7507 break 7508 } 7509 o1 := o0.Args[0] 7510 if o1.Op != OpARM64ORshiftLL { 7511 break 7512 } 7513 if o1.AuxInt != 16 { 7514 break 7515 } 7516 o2 := o1.Args[0] 7517 if o2.Op != OpARM64ORshiftLL { 7518 break 7519 } 7520 if o2.AuxInt != 24 { 7521 break 7522 } 7523 o3 := o2.Args[0] 7524 if o3.Op != OpARM64ORshiftLL { 7525 break 7526 } 7527 if o3.AuxInt != 32 { 7528 break 7529 } 7530 o4 := o3.Args[0] 7531 if o4.Op != OpARM64ORshiftLL { 7532 break 7533 } 7534 if o4.AuxInt != 40 { 7535 break 7536 } 7537 o5 := o4.Args[0] 7538 if o5.Op != OpARM64ORshiftLL { 7539 break 7540 } 7541 if o5.AuxInt != 48 { 7542 break 7543 } 7544 s0 := o5.Args[0] 7545 if s0.Op != OpARM64SLLconst { 7546 break 7547 } 7548 if s0.AuxInt != 56 { 7549 break 7550 } 7551 y0 := s0.Args[0] 7552 if y0.Op != OpARM64MOVDnop { 7553 break 7554 } 7555 x0 := y0.Args[0] 7556 if x0.Op != OpARM64MOVBUload { 7557 break 7558 } 7559 i0 := x0.AuxInt 7560 if x0.Aux != s { 7561 break 7562 } 7563 if p != x0.Args[0] { 7564 break 7565 } 7566 if mem != x0.Args[1] { 7567 break 7568 } 7569 y1 := o5.Args[1] 7570 if y1.Op != OpARM64MOVDnop { 7571 break 7572 } 7573 x1 := y1.Args[0] 7574 if x1.Op != OpARM64MOVBUload { 7575 break 7576 } 7577 i1 := x1.AuxInt 7578 if x1.Aux != s { 7579 break 7580 } 7581 if p != x1.Args[0] { 7582 break 7583 } 7584 if mem != x1.Args[1] { 7585 break 7586 } 7587 y2 := o4.Args[1] 7588 if y2.Op != OpARM64MOVDnop { 7589 break 7590 } 7591 x2 := y2.Args[0] 7592 if x2.Op != OpARM64MOVBUload { 7593 break 7594 } 7595 i2 := x2.AuxInt 7596 if x2.Aux != s { 7597 break 7598 } 7599 if p != x2.Args[0] { 7600 break 7601 } 7602 if mem != x2.Args[1] { 7603 break 7604 } 7605 y3 := o3.Args[1] 7606 if y3.Op != OpARM64MOVDnop { 7607 break 7608 } 7609 x3 := y3.Args[0] 7610 if x3.Op != OpARM64MOVBUload { 7611 break 7612 } 7613 i3 := x3.AuxInt 7614 if x3.Aux != s { 7615 break 7616 } 7617 if p != x3.Args[0] { 7618 break 7619 } 7620 if mem != x3.Args[1] { 7621 break 7622 } 7623 y4 := o2.Args[1] 7624 if y4.Op != OpARM64MOVDnop { 7625 break 7626 } 7627 x4 := y4.Args[0] 7628 if x4.Op != OpARM64MOVBUload { 7629 break 7630 } 7631 i4 := x4.AuxInt 7632 if x4.Aux != s { 7633 break 7634 } 7635 if p != x4.Args[0] { 7636 break 7637 } 7638 if mem != x4.Args[1] { 7639 break 7640 } 7641 y5 := o1.Args[1] 7642 if y5.Op != OpARM64MOVDnop { 7643 break 7644 } 7645 x5 := y5.Args[0] 7646 if x5.Op != OpARM64MOVBUload { 7647 break 7648 } 7649 i5 := x5.AuxInt 7650 if x5.Aux != s { 7651 break 7652 } 7653 if p != x5.Args[0] { 7654 break 7655 } 7656 if mem != x5.Args[1] { 7657 break 7658 } 7659 y6 := o0.Args[1] 7660 if y6.Op != OpARM64MOVDnop { 7661 break 7662 } 7663 x6 := y6.Args[0] 7664 if x6.Op != OpARM64MOVBUload { 7665 break 7666 } 7667 i6 := x6.AuxInt 7668 if x6.Aux != s { 7669 break 7670 } 7671 if p != x6.Args[0] { 7672 break 7673 } 7674 if mem != x6.Args[1] { 7675 break 7676 } 7677 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { 7678 break 7679 } 7680 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 7681 v0 := b.NewValue0(v.Pos, OpARM64REV, t) 7682 v.reset(OpCopy) 7683 v.AddArg(v0) 7684 v1 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 7685 v1.Aux = s 7686 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7687 v2.AuxInt = i0 7688 v2.AddArg(p) 7689 v1.AddArg(v2) 7690 v1.AddArg(mem) 7691 v0.AddArg(v1) 7692 return true 7693 } 7694 return false 7695 } 7696 func rewriteValueARM64_OpARM64ORconst(v *Value) bool { 7697 // match: (ORconst [0] x) 7698 // cond: 7699 // result: x 7700 for { 7701 if v.AuxInt != 0 { 7702 break 7703 } 7704 x := v.Args[0] 7705 v.reset(OpCopy) 7706 v.Type = x.Type 7707 v.AddArg(x) 7708 return true 7709 } 7710 // match: (ORconst [-1] _) 7711 // cond: 7712 // result: (MOVDconst [-1]) 7713 for { 7714 if v.AuxInt != -1 { 7715 break 7716 } 7717 v.reset(OpARM64MOVDconst) 7718 v.AuxInt = -1 7719 return true 7720 } 7721 // match: (ORconst [c] (MOVDconst [d])) 7722 // cond: 7723 // result: (MOVDconst [c|d]) 7724 for { 7725 c := v.AuxInt 7726 v_0 := v.Args[0] 7727 if v_0.Op != OpARM64MOVDconst { 7728 break 7729 } 7730 d := v_0.AuxInt 7731 v.reset(OpARM64MOVDconst) 7732 v.AuxInt = c | d 7733 return true 7734 } 7735 // match: (ORconst [c] (ORconst [d] x)) 7736 // cond: 7737 // result: (ORconst [c|d] x) 7738 for { 7739 c := v.AuxInt 7740 v_0 := v.Args[0] 7741 if v_0.Op != OpARM64ORconst { 7742 break 7743 } 7744 d := v_0.AuxInt 7745 x := v_0.Args[0] 7746 v.reset(OpARM64ORconst) 7747 v.AuxInt = c | d 7748 v.AddArg(x) 7749 return true 7750 } 7751 return false 7752 } 7753 func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { 7754 b := v.Block 7755 _ = b 7756 // match: (ORshiftLL (MOVDconst [c]) x [d]) 7757 // cond: 7758 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 7759 for { 7760 d := v.AuxInt 7761 v_0 := v.Args[0] 7762 if v_0.Op != OpARM64MOVDconst { 7763 break 7764 } 7765 c := v_0.AuxInt 7766 x := v.Args[1] 7767 v.reset(OpARM64ORconst) 7768 v.AuxInt = c 7769 v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) 7770 v0.AuxInt = d 7771 v0.AddArg(x) 7772 v.AddArg(v0) 7773 return true 7774 } 7775 // match: (ORshiftLL x (MOVDconst [c]) [d]) 7776 // cond: 7777 // result: (ORconst x [int64(uint64(c)<<uint64(d))]) 7778 for { 7779 d := v.AuxInt 7780 x := v.Args[0] 7781 v_1 := v.Args[1] 7782 if v_1.Op != OpARM64MOVDconst { 7783 break 7784 } 7785 c := v_1.AuxInt 7786 v.reset(OpARM64ORconst) 7787 v.AuxInt = int64(uint64(c) << uint64(d)) 7788 v.AddArg(x) 7789 return true 7790 } 7791 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 7792 // cond: c==d 7793 // result: y 7794 for { 7795 d := v.AuxInt 7796 x := v.Args[0] 7797 y := v.Args[1] 7798 if y.Op != OpARM64SLLconst { 7799 break 7800 } 7801 c := y.AuxInt 7802 if x != y.Args[0] { 7803 break 7804 } 7805 if !(c == d) { 7806 break 7807 } 7808 v.reset(OpCopy) 7809 v.Type = y.Type 7810 v.AddArg(y) 7811 return true 7812 } 7813 // match: (ORshiftLL [c] (SRLconst x [64-c]) x) 7814 // cond: 7815 // result: (RORconst [64-c] x) 7816 for { 7817 c := v.AuxInt 7818 v_0 := v.Args[0] 7819 if v_0.Op != OpARM64SRLconst { 7820 break 7821 } 7822 if v_0.AuxInt != 64-c { 7823 break 7824 } 7825 x := v_0.Args[0] 7826 if x != v.Args[1] { 7827 break 7828 } 7829 v.reset(OpARM64RORconst) 7830 v.AuxInt = 64 - c 7831 v.AddArg(x) 7832 return true 7833 } 7834 // match: (ORshiftLL <t> [c] (SRLconst (MOVWUreg x) [32-c]) x) 7835 // cond: c < 32 && t.Size() == 4 7836 // result: (RORWconst [32-c] x) 7837 for { 7838 t := v.Type 7839 c := v.AuxInt 7840 v_0 := v.Args[0] 7841 if v_0.Op != OpARM64SRLconst { 7842 break 7843 } 7844 if v_0.AuxInt != 32-c { 7845 break 7846 } 7847 v_0_0 := v_0.Args[0] 7848 if v_0_0.Op != OpARM64MOVWUreg { 7849 break 7850 } 7851 x := v_0_0.Args[0] 7852 if x != v.Args[1] { 7853 break 7854 } 7855 if !(c < 32 && t.Size() == 4) { 7856 break 7857 } 7858 v.reset(OpARM64RORWconst) 7859 v.AuxInt = 32 - c 7860 v.AddArg(x) 7861 return true 7862 } 7863 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) 7864 // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) 7865 // result: @mergePoint(b,x0,x1) (MOVHUload <t> {s} (OffPtr <p.Type> [i0] p) mem) 7866 for { 7867 t := v.Type 7868 if v.AuxInt != 8 { 7869 break 7870 } 7871 y0 := v.Args[0] 7872 if y0.Op != OpARM64MOVDnop { 7873 break 7874 } 7875 x0 := y0.Args[0] 7876 if x0.Op != OpARM64MOVBUload { 7877 break 7878 } 7879 i0 := x0.AuxInt 7880 s := x0.Aux 7881 p := x0.Args[0] 7882 mem := x0.Args[1] 7883 y1 := v.Args[1] 7884 if y1.Op != OpARM64MOVDnop { 7885 break 7886 } 7887 x1 := y1.Args[0] 7888 if x1.Op != OpARM64MOVBUload { 7889 break 7890 } 7891 i1 := x1.AuxInt 7892 if x1.Aux != s { 7893 break 7894 } 7895 if p != x1.Args[0] { 7896 break 7897 } 7898 if mem != x1.Args[1] { 7899 break 7900 } 7901 if !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { 7902 break 7903 } 7904 b = mergePoint(b, x0, x1) 7905 v0 := b.NewValue0(v.Pos, OpARM64MOVHUload, t) 7906 v.reset(OpCopy) 7907 v.AddArg(v0) 7908 v0.Aux = s 7909 v1 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7910 v1.AuxInt = i0 7911 v1.AddArg(p) 7912 v0.AddArg(v1) 7913 v0.AddArg(mem) 7914 return true 7915 } 7916 // match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i3] {s} p mem))) 7917 // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) 7918 // result: @mergePoint(b,x0,x1,x2) (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem) 7919 for { 7920 t := v.Type 7921 if v.AuxInt != 24 { 7922 break 7923 } 7924 o0 := v.Args[0] 7925 if o0.Op != OpARM64ORshiftLL { 7926 break 7927 } 7928 if o0.AuxInt != 16 { 7929 break 7930 } 7931 x0 := o0.Args[0] 7932 if x0.Op != OpARM64MOVHUload { 7933 break 7934 } 7935 i0 := x0.AuxInt 7936 s := x0.Aux 7937 p := x0.Args[0] 7938 mem := x0.Args[1] 7939 y1 := o0.Args[1] 7940 if y1.Op != OpARM64MOVDnop { 7941 break 7942 } 7943 x1 := y1.Args[0] 7944 if x1.Op != OpARM64MOVBUload { 7945 break 7946 } 7947 i2 := x1.AuxInt 7948 if x1.Aux != s { 7949 break 7950 } 7951 if p != x1.Args[0] { 7952 break 7953 } 7954 if mem != x1.Args[1] { 7955 break 7956 } 7957 y2 := v.Args[1] 7958 if y2.Op != OpARM64MOVDnop { 7959 break 7960 } 7961 x2 := y2.Args[0] 7962 if x2.Op != OpARM64MOVBUload { 7963 break 7964 } 7965 i3 := x2.AuxInt 7966 if x2.Aux != s { 7967 break 7968 } 7969 if p != x2.Args[0] { 7970 break 7971 } 7972 if mem != x2.Args[1] { 7973 break 7974 } 7975 if !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { 7976 break 7977 } 7978 b = mergePoint(b, x0, x1, x2) 7979 v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 7980 v.reset(OpCopy) 7981 v.AddArg(v0) 7982 v0.Aux = s 7983 v1 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 7984 v1.AuxInt = i0 7985 v1.AddArg(p) 7986 v0.AddArg(v1) 7987 v0.AddArg(mem) 7988 return true 7989 } 7990 // match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i7] {s} p mem))) 7991 // cond: i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) 7992 // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem) 7993 for { 7994 t := v.Type 7995 if v.AuxInt != 56 { 7996 break 7997 } 7998 o0 := v.Args[0] 7999 if o0.Op != OpARM64ORshiftLL { 8000 break 8001 } 8002 if o0.AuxInt != 48 { 8003 break 8004 } 8005 o1 := o0.Args[0] 8006 if o1.Op != OpARM64ORshiftLL { 8007 break 8008 } 8009 if o1.AuxInt != 40 { 8010 break 8011 } 8012 o2 := o1.Args[0] 8013 if o2.Op != OpARM64ORshiftLL { 8014 break 8015 } 8016 if o2.AuxInt != 32 { 8017 break 8018 } 8019 x0 := o2.Args[0] 8020 if x0.Op != OpARM64MOVWUload { 8021 break 8022 } 8023 i0 := x0.AuxInt 8024 s := x0.Aux 8025 p := x0.Args[0] 8026 mem := x0.Args[1] 8027 y1 := o2.Args[1] 8028 if y1.Op != OpARM64MOVDnop { 8029 break 8030 } 8031 x1 := y1.Args[0] 8032 if x1.Op != OpARM64MOVBUload { 8033 break 8034 } 8035 i4 := x1.AuxInt 8036 if x1.Aux != s { 8037 break 8038 } 8039 if p != x1.Args[0] { 8040 break 8041 } 8042 if mem != x1.Args[1] { 8043 break 8044 } 8045 y2 := o1.Args[1] 8046 if y2.Op != OpARM64MOVDnop { 8047 break 8048 } 8049 x2 := y2.Args[0] 8050 if x2.Op != OpARM64MOVBUload { 8051 break 8052 } 8053 i5 := x2.AuxInt 8054 if x2.Aux != s { 8055 break 8056 } 8057 if p != x2.Args[0] { 8058 break 8059 } 8060 if mem != x2.Args[1] { 8061 break 8062 } 8063 y3 := o0.Args[1] 8064 if y3.Op != OpARM64MOVDnop { 8065 break 8066 } 8067 x3 := y3.Args[0] 8068 if x3.Op != OpARM64MOVBUload { 8069 break 8070 } 8071 i6 := x3.AuxInt 8072 if x3.Aux != s { 8073 break 8074 } 8075 if p != x3.Args[0] { 8076 break 8077 } 8078 if mem != x3.Args[1] { 8079 break 8080 } 8081 y4 := v.Args[1] 8082 if y4.Op != OpARM64MOVDnop { 8083 break 8084 } 8085 x4 := y4.Args[0] 8086 if x4.Op != OpARM64MOVBUload { 8087 break 8088 } 8089 i7 := x4.AuxInt 8090 if x4.Aux != s { 8091 break 8092 } 8093 if p != x4.Args[0] { 8094 break 8095 } 8096 if mem != x4.Args[1] { 8097 break 8098 } 8099 if !(i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { 8100 break 8101 } 8102 b = mergePoint(b, x0, x1, x2, x3, x4) 8103 v0 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 8104 v.reset(OpCopy) 8105 v.AddArg(v0) 8106 v0.Aux = s 8107 v1 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 8108 v1.AuxInt = i0 8109 v1.AddArg(p) 8110 v0.AddArg(v1) 8111 v0.AddArg(mem) 8112 return true 8113 } 8114 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) 8115 // cond: i1 == i0+1 && fitsARM64Offset(i0, 2, s) && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) 8116 // result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUload <t> [i0] {s} p mem)) 8117 for { 8118 t := v.Type 8119 if v.AuxInt != 8 { 8120 break 8121 } 8122 y0 := v.Args[0] 8123 if y0.Op != OpARM64MOVDnop { 8124 break 8125 } 8126 x0 := y0.Args[0] 8127 if x0.Op != OpARM64MOVBUload { 8128 break 8129 } 8130 i1 := x0.AuxInt 8131 s := x0.Aux 8132 p := x0.Args[0] 8133 mem := x0.Args[1] 8134 y1 := v.Args[1] 8135 if y1.Op != OpARM64MOVDnop { 8136 break 8137 } 8138 x1 := y1.Args[0] 8139 if x1.Op != OpARM64MOVBUload { 8140 break 8141 } 8142 i0 := x1.AuxInt 8143 if x1.Aux != s { 8144 break 8145 } 8146 if p != x1.Args[0] { 8147 break 8148 } 8149 if mem != x1.Args[1] { 8150 break 8151 } 8152 if !(i1 == i0+1 && fitsARM64Offset(i0, 2, s) && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { 8153 break 8154 } 8155 b = mergePoint(b, x0, x1) 8156 v0 := b.NewValue0(v.Pos, OpARM64REV16W, t) 8157 v.reset(OpCopy) 8158 v.AddArg(v0) 8159 v1 := b.NewValue0(v.Pos, OpARM64MOVHUload, t) 8160 v1.AuxInt = i0 8161 v1.Aux = s 8162 v1.AddArg(p) 8163 v1.AddArg(mem) 8164 v0.AddArg(v1) 8165 return true 8166 } 8167 // match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i0] {s} p mem))) 8168 // cond: i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) 8169 // result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 8170 for { 8171 t := v.Type 8172 if v.AuxInt != 24 { 8173 break 8174 } 8175 o0 := v.Args[0] 8176 if o0.Op != OpARM64ORshiftLL { 8177 break 8178 } 8179 if o0.AuxInt != 16 { 8180 break 8181 } 8182 y0 := o0.Args[0] 8183 if y0.Op != OpARM64REV16W { 8184 break 8185 } 8186 x0 := y0.Args[0] 8187 if x0.Op != OpARM64MOVHUload { 8188 break 8189 } 8190 i2 := x0.AuxInt 8191 s := x0.Aux 8192 p := x0.Args[0] 8193 mem := x0.Args[1] 8194 y1 := o0.Args[1] 8195 if y1.Op != OpARM64MOVDnop { 8196 break 8197 } 8198 x1 := y1.Args[0] 8199 if x1.Op != OpARM64MOVBUload { 8200 break 8201 } 8202 i1 := x1.AuxInt 8203 if x1.Aux != s { 8204 break 8205 } 8206 if p != x1.Args[0] { 8207 break 8208 } 8209 if mem != x1.Args[1] { 8210 break 8211 } 8212 y2 := v.Args[1] 8213 if y2.Op != OpARM64MOVDnop { 8214 break 8215 } 8216 x2 := y2.Args[0] 8217 if x2.Op != OpARM64MOVBUload { 8218 break 8219 } 8220 i0 := x2.AuxInt 8221 if x2.Aux != s { 8222 break 8223 } 8224 if p != x2.Args[0] { 8225 break 8226 } 8227 if mem != x2.Args[1] { 8228 break 8229 } 8230 if !(i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { 8231 break 8232 } 8233 b = mergePoint(b, x0, x1, x2) 8234 v0 := b.NewValue0(v.Pos, OpARM64REVW, t) 8235 v.reset(OpCopy) 8236 v.AddArg(v0) 8237 v1 := b.NewValue0(v.Pos, OpARM64MOVWUload, t) 8238 v1.Aux = s 8239 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 8240 v2.AuxInt = i0 8241 v2.AddArg(p) 8242 v1.AddArg(v2) 8243 v1.AddArg(mem) 8244 v0.AddArg(v1) 8245 return true 8246 } 8247 // match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [i4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i1] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i0] {s} p mem))) 8248 // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) 8249 // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i0] p) mem)) 8250 for { 8251 t := v.Type 8252 if v.AuxInt != 56 { 8253 break 8254 } 8255 o0 := v.Args[0] 8256 if o0.Op != OpARM64ORshiftLL { 8257 break 8258 } 8259 if o0.AuxInt != 48 { 8260 break 8261 } 8262 o1 := o0.Args[0] 8263 if o1.Op != OpARM64ORshiftLL { 8264 break 8265 } 8266 if o1.AuxInt != 40 { 8267 break 8268 } 8269 o2 := o1.Args[0] 8270 if o2.Op != OpARM64ORshiftLL { 8271 break 8272 } 8273 if o2.AuxInt != 32 { 8274 break 8275 } 8276 y0 := o2.Args[0] 8277 if y0.Op != OpARM64REVW { 8278 break 8279 } 8280 x0 := y0.Args[0] 8281 if x0.Op != OpARM64MOVWUload { 8282 break 8283 } 8284 i4 := x0.AuxInt 8285 s := x0.Aux 8286 p := x0.Args[0] 8287 mem := x0.Args[1] 8288 y1 := o2.Args[1] 8289 if y1.Op != OpARM64MOVDnop { 8290 break 8291 } 8292 x1 := y1.Args[0] 8293 if x1.Op != OpARM64MOVBUload { 8294 break 8295 } 8296 i3 := x1.AuxInt 8297 if x1.Aux != s { 8298 break 8299 } 8300 if p != x1.Args[0] { 8301 break 8302 } 8303 if mem != x1.Args[1] { 8304 break 8305 } 8306 y2 := o1.Args[1] 8307 if y2.Op != OpARM64MOVDnop { 8308 break 8309 } 8310 x2 := y2.Args[0] 8311 if x2.Op != OpARM64MOVBUload { 8312 break 8313 } 8314 i2 := x2.AuxInt 8315 if x2.Aux != s { 8316 break 8317 } 8318 if p != x2.Args[0] { 8319 break 8320 } 8321 if mem != x2.Args[1] { 8322 break 8323 } 8324 y3 := o0.Args[1] 8325 if y3.Op != OpARM64MOVDnop { 8326 break 8327 } 8328 x3 := y3.Args[0] 8329 if x3.Op != OpARM64MOVBUload { 8330 break 8331 } 8332 i1 := x3.AuxInt 8333 if x3.Aux != s { 8334 break 8335 } 8336 if p != x3.Args[0] { 8337 break 8338 } 8339 if mem != x3.Args[1] { 8340 break 8341 } 8342 y4 := v.Args[1] 8343 if y4.Op != OpARM64MOVDnop { 8344 break 8345 } 8346 x4 := y4.Args[0] 8347 if x4.Op != OpARM64MOVBUload { 8348 break 8349 } 8350 i0 := x4.AuxInt 8351 if x4.Aux != s { 8352 break 8353 } 8354 if p != x4.Args[0] { 8355 break 8356 } 8357 if mem != x4.Args[1] { 8358 break 8359 } 8360 if !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { 8361 break 8362 } 8363 b = mergePoint(b, x0, x1, x2, x3, x4) 8364 v0 := b.NewValue0(v.Pos, OpARM64REV, t) 8365 v.reset(OpCopy) 8366 v.AddArg(v0) 8367 v1 := b.NewValue0(v.Pos, OpARM64MOVDload, t) 8368 v1.Aux = s 8369 v2 := b.NewValue0(v.Pos, OpOffPtr, p.Type) 8370 v2.AuxInt = i0 8371 v2.AddArg(p) 8372 v1.AddArg(v2) 8373 v1.AddArg(mem) 8374 v0.AddArg(v1) 8375 return true 8376 } 8377 return false 8378 } 8379 func rewriteValueARM64_OpARM64ORshiftRA(v *Value) bool { 8380 b := v.Block 8381 _ = b 8382 // match: (ORshiftRA (MOVDconst [c]) x [d]) 8383 // cond: 8384 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8385 for { 8386 d := v.AuxInt 8387 v_0 := v.Args[0] 8388 if v_0.Op != OpARM64MOVDconst { 8389 break 8390 } 8391 c := v_0.AuxInt 8392 x := v.Args[1] 8393 v.reset(OpARM64ORconst) 8394 v.AuxInt = c 8395 v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) 8396 v0.AuxInt = d 8397 v0.AddArg(x) 8398 v.AddArg(v0) 8399 return true 8400 } 8401 // match: (ORshiftRA x (MOVDconst [c]) [d]) 8402 // cond: 8403 // result: (ORconst x [int64(int64(c)>>uint64(d))]) 8404 for { 8405 d := v.AuxInt 8406 x := v.Args[0] 8407 v_1 := v.Args[1] 8408 if v_1.Op != OpARM64MOVDconst { 8409 break 8410 } 8411 c := v_1.AuxInt 8412 v.reset(OpARM64ORconst) 8413 v.AuxInt = int64(int64(c) >> uint64(d)) 8414 v.AddArg(x) 8415 return true 8416 } 8417 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 8418 // cond: c==d 8419 // result: y 8420 for { 8421 d := v.AuxInt 8422 x := v.Args[0] 8423 y := v.Args[1] 8424 if y.Op != OpARM64SRAconst { 8425 break 8426 } 8427 c := y.AuxInt 8428 if x != y.Args[0] { 8429 break 8430 } 8431 if !(c == d) { 8432 break 8433 } 8434 v.reset(OpCopy) 8435 v.Type = y.Type 8436 v.AddArg(y) 8437 return true 8438 } 8439 return false 8440 } 8441 func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { 8442 b := v.Block 8443 _ = b 8444 // match: (ORshiftRL (MOVDconst [c]) x [d]) 8445 // cond: 8446 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8447 for { 8448 d := v.AuxInt 8449 v_0 := v.Args[0] 8450 if v_0.Op != OpARM64MOVDconst { 8451 break 8452 } 8453 c := v_0.AuxInt 8454 x := v.Args[1] 8455 v.reset(OpARM64ORconst) 8456 v.AuxInt = c 8457 v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) 8458 v0.AuxInt = d 8459 v0.AddArg(x) 8460 v.AddArg(v0) 8461 return true 8462 } 8463 // match: (ORshiftRL x (MOVDconst [c]) [d]) 8464 // cond: 8465 // result: (ORconst x [int64(uint64(c)>>uint64(d))]) 8466 for { 8467 d := v.AuxInt 8468 x := v.Args[0] 8469 v_1 := v.Args[1] 8470 if v_1.Op != OpARM64MOVDconst { 8471 break 8472 } 8473 c := v_1.AuxInt 8474 v.reset(OpARM64ORconst) 8475 v.AuxInt = int64(uint64(c) >> uint64(d)) 8476 v.AddArg(x) 8477 return true 8478 } 8479 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 8480 // cond: c==d 8481 // result: y 8482 for { 8483 d := v.AuxInt 8484 x := v.Args[0] 8485 y := v.Args[1] 8486 if y.Op != OpARM64SRLconst { 8487 break 8488 } 8489 c := y.AuxInt 8490 if x != y.Args[0] { 8491 break 8492 } 8493 if !(c == d) { 8494 break 8495 } 8496 v.reset(OpCopy) 8497 v.Type = y.Type 8498 v.AddArg(y) 8499 return true 8500 } 8501 // match: (ORshiftRL [c] (SLLconst x [64-c]) x) 8502 // cond: 8503 // result: (RORconst [ c] x) 8504 for { 8505 c := v.AuxInt 8506 v_0 := v.Args[0] 8507 if v_0.Op != OpARM64SLLconst { 8508 break 8509 } 8510 if v_0.AuxInt != 64-c { 8511 break 8512 } 8513 x := v_0.Args[0] 8514 if x != v.Args[1] { 8515 break 8516 } 8517 v.reset(OpARM64RORconst) 8518 v.AuxInt = c 8519 v.AddArg(x) 8520 return true 8521 } 8522 // match: (ORshiftRL <t> [c] (SLLconst x [32-c]) (MOVWUreg x)) 8523 // cond: c < 32 && t.Size() == 4 8524 // result: (RORWconst [ c] x) 8525 for { 8526 t := v.Type 8527 c := v.AuxInt 8528 v_0 := v.Args[0] 8529 if v_0.Op != OpARM64SLLconst { 8530 break 8531 } 8532 if v_0.AuxInt != 32-c { 8533 break 8534 } 8535 x := v_0.Args[0] 8536 v_1 := v.Args[1] 8537 if v_1.Op != OpARM64MOVWUreg { 8538 break 8539 } 8540 if x != v_1.Args[0] { 8541 break 8542 } 8543 if !(c < 32 && t.Size() == 4) { 8544 break 8545 } 8546 v.reset(OpARM64RORWconst) 8547 v.AuxInt = c 8548 v.AddArg(x) 8549 return true 8550 } 8551 return false 8552 } 8553 func rewriteValueARM64_OpARM64SLL(v *Value) bool { 8554 // match: (SLL x (MOVDconst [c])) 8555 // cond: 8556 // result: (SLLconst x [c&63]) 8557 for { 8558 x := v.Args[0] 8559 v_1 := v.Args[1] 8560 if v_1.Op != OpARM64MOVDconst { 8561 break 8562 } 8563 c := v_1.AuxInt 8564 v.reset(OpARM64SLLconst) 8565 v.AuxInt = c & 63 8566 v.AddArg(x) 8567 return true 8568 } 8569 return false 8570 } 8571 func rewriteValueARM64_OpARM64SLLconst(v *Value) bool { 8572 // match: (SLLconst [c] (MOVDconst [d])) 8573 // cond: 8574 // result: (MOVDconst [int64(d)<<uint64(c)]) 8575 for { 8576 c := v.AuxInt 8577 v_0 := v.Args[0] 8578 if v_0.Op != OpARM64MOVDconst { 8579 break 8580 } 8581 d := v_0.AuxInt 8582 v.reset(OpARM64MOVDconst) 8583 v.AuxInt = int64(d) << uint64(c) 8584 return true 8585 } 8586 // match: (SLLconst [c] (SRLconst [c] x)) 8587 // cond: 0 < c && c < 64 8588 // result: (ANDconst [^(1<<uint(c)-1)] x) 8589 for { 8590 c := v.AuxInt 8591 v_0 := v.Args[0] 8592 if v_0.Op != OpARM64SRLconst { 8593 break 8594 } 8595 if v_0.AuxInt != c { 8596 break 8597 } 8598 x := v_0.Args[0] 8599 if !(0 < c && c < 64) { 8600 break 8601 } 8602 v.reset(OpARM64ANDconst) 8603 v.AuxInt = ^(1<<uint(c) - 1) 8604 v.AddArg(x) 8605 return true 8606 } 8607 return false 8608 } 8609 func rewriteValueARM64_OpARM64SRA(v *Value) bool { 8610 // match: (SRA x (MOVDconst [c])) 8611 // cond: 8612 // result: (SRAconst x [c&63]) 8613 for { 8614 x := v.Args[0] 8615 v_1 := v.Args[1] 8616 if v_1.Op != OpARM64MOVDconst { 8617 break 8618 } 8619 c := v_1.AuxInt 8620 v.reset(OpARM64SRAconst) 8621 v.AuxInt = c & 63 8622 v.AddArg(x) 8623 return true 8624 } 8625 return false 8626 } 8627 func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { 8628 // match: (SRAconst [c] (MOVDconst [d])) 8629 // cond: 8630 // result: (MOVDconst [int64(d)>>uint64(c)]) 8631 for { 8632 c := v.AuxInt 8633 v_0 := v.Args[0] 8634 if v_0.Op != OpARM64MOVDconst { 8635 break 8636 } 8637 d := v_0.AuxInt 8638 v.reset(OpARM64MOVDconst) 8639 v.AuxInt = int64(d) >> uint64(c) 8640 return true 8641 } 8642 return false 8643 } 8644 func rewriteValueARM64_OpARM64SRL(v *Value) bool { 8645 // match: (SRL x (MOVDconst [c])) 8646 // cond: 8647 // result: (SRLconst x [c&63]) 8648 for { 8649 x := v.Args[0] 8650 v_1 := v.Args[1] 8651 if v_1.Op != OpARM64MOVDconst { 8652 break 8653 } 8654 c := v_1.AuxInt 8655 v.reset(OpARM64SRLconst) 8656 v.AuxInt = c & 63 8657 v.AddArg(x) 8658 return true 8659 } 8660 return false 8661 } 8662 func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { 8663 // match: (SRLconst [c] (MOVDconst [d])) 8664 // cond: 8665 // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) 8666 for { 8667 c := v.AuxInt 8668 v_0 := v.Args[0] 8669 if v_0.Op != OpARM64MOVDconst { 8670 break 8671 } 8672 d := v_0.AuxInt 8673 v.reset(OpARM64MOVDconst) 8674 v.AuxInt = int64(uint64(d) >> uint64(c)) 8675 return true 8676 } 8677 // match: (SRLconst [c] (SLLconst [c] x)) 8678 // cond: 0 < c && c < 64 8679 // result: (ANDconst [1<<uint(64-c)-1] x) 8680 for { 8681 c := v.AuxInt 8682 v_0 := v.Args[0] 8683 if v_0.Op != OpARM64SLLconst { 8684 break 8685 } 8686 if v_0.AuxInt != c { 8687 break 8688 } 8689 x := v_0.Args[0] 8690 if !(0 < c && c < 64) { 8691 break 8692 } 8693 v.reset(OpARM64ANDconst) 8694 v.AuxInt = 1<<uint(64-c) - 1 8695 v.AddArg(x) 8696 return true 8697 } 8698 return false 8699 } 8700 func rewriteValueARM64_OpARM64SUB(v *Value) bool { 8701 b := v.Block 8702 _ = b 8703 // match: (SUB x (MOVDconst [c])) 8704 // cond: 8705 // result: (SUBconst [c] x) 8706 for { 8707 x := v.Args[0] 8708 v_1 := v.Args[1] 8709 if v_1.Op != OpARM64MOVDconst { 8710 break 8711 } 8712 c := v_1.AuxInt 8713 v.reset(OpARM64SUBconst) 8714 v.AuxInt = c 8715 v.AddArg(x) 8716 return true 8717 } 8718 // match: (SUB x x) 8719 // cond: 8720 // result: (MOVDconst [0]) 8721 for { 8722 x := v.Args[0] 8723 if x != v.Args[1] { 8724 break 8725 } 8726 v.reset(OpARM64MOVDconst) 8727 v.AuxInt = 0 8728 return true 8729 } 8730 // match: (SUB x (SUB y z)) 8731 // cond: 8732 // result: (SUB (ADD <v.Type> x z) y) 8733 for { 8734 x := v.Args[0] 8735 v_1 := v.Args[1] 8736 if v_1.Op != OpARM64SUB { 8737 break 8738 } 8739 y := v_1.Args[0] 8740 z := v_1.Args[1] 8741 v.reset(OpARM64SUB) 8742 v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type) 8743 v0.AddArg(x) 8744 v0.AddArg(z) 8745 v.AddArg(v0) 8746 v.AddArg(y) 8747 return true 8748 } 8749 // match: (SUB (SUB x y) z) 8750 // cond: 8751 // result: (SUB x (ADD <y.Type> y z)) 8752 for { 8753 v_0 := v.Args[0] 8754 if v_0.Op != OpARM64SUB { 8755 break 8756 } 8757 x := v_0.Args[0] 8758 y := v_0.Args[1] 8759 z := v.Args[1] 8760 v.reset(OpARM64SUB) 8761 v.AddArg(x) 8762 v0 := b.NewValue0(v.Pos, OpARM64ADD, y.Type) 8763 v0.AddArg(y) 8764 v0.AddArg(z) 8765 v.AddArg(v0) 8766 return true 8767 } 8768 // match: (SUB x (SLLconst [c] y)) 8769 // cond: 8770 // result: (SUBshiftLL x y [c]) 8771 for { 8772 x := v.Args[0] 8773 v_1 := v.Args[1] 8774 if v_1.Op != OpARM64SLLconst { 8775 break 8776 } 8777 c := v_1.AuxInt 8778 y := v_1.Args[0] 8779 v.reset(OpARM64SUBshiftLL) 8780 v.AuxInt = c 8781 v.AddArg(x) 8782 v.AddArg(y) 8783 return true 8784 } 8785 // match: (SUB x (SRLconst [c] y)) 8786 // cond: 8787 // result: (SUBshiftRL x y [c]) 8788 for { 8789 x := v.Args[0] 8790 v_1 := v.Args[1] 8791 if v_1.Op != OpARM64SRLconst { 8792 break 8793 } 8794 c := v_1.AuxInt 8795 y := v_1.Args[0] 8796 v.reset(OpARM64SUBshiftRL) 8797 v.AuxInt = c 8798 v.AddArg(x) 8799 v.AddArg(y) 8800 return true 8801 } 8802 // match: (SUB x (SRAconst [c] y)) 8803 // cond: 8804 // result: (SUBshiftRA x y [c]) 8805 for { 8806 x := v.Args[0] 8807 v_1 := v.Args[1] 8808 if v_1.Op != OpARM64SRAconst { 8809 break 8810 } 8811 c := v_1.AuxInt 8812 y := v_1.Args[0] 8813 v.reset(OpARM64SUBshiftRA) 8814 v.AuxInt = c 8815 v.AddArg(x) 8816 v.AddArg(y) 8817 return true 8818 } 8819 return false 8820 } 8821 func rewriteValueARM64_OpARM64SUBconst(v *Value) bool { 8822 // match: (SUBconst [0] x) 8823 // cond: 8824 // result: x 8825 for { 8826 if v.AuxInt != 0 { 8827 break 8828 } 8829 x := v.Args[0] 8830 v.reset(OpCopy) 8831 v.Type = x.Type 8832 v.AddArg(x) 8833 return true 8834 } 8835 // match: (SUBconst [c] (MOVDconst [d])) 8836 // cond: 8837 // result: (MOVDconst [d-c]) 8838 for { 8839 c := v.AuxInt 8840 v_0 := v.Args[0] 8841 if v_0.Op != OpARM64MOVDconst { 8842 break 8843 } 8844 d := v_0.AuxInt 8845 v.reset(OpARM64MOVDconst) 8846 v.AuxInt = d - c 8847 return true 8848 } 8849 // match: (SUBconst [c] (SUBconst [d] x)) 8850 // cond: 8851 // result: (ADDconst [-c-d] x) 8852 for { 8853 c := v.AuxInt 8854 v_0 := v.Args[0] 8855 if v_0.Op != OpARM64SUBconst { 8856 break 8857 } 8858 d := v_0.AuxInt 8859 x := v_0.Args[0] 8860 v.reset(OpARM64ADDconst) 8861 v.AuxInt = -c - d 8862 v.AddArg(x) 8863 return true 8864 } 8865 // match: (SUBconst [c] (ADDconst [d] x)) 8866 // cond: 8867 // result: (ADDconst [-c+d] x) 8868 for { 8869 c := v.AuxInt 8870 v_0 := v.Args[0] 8871 if v_0.Op != OpARM64ADDconst { 8872 break 8873 } 8874 d := v_0.AuxInt 8875 x := v_0.Args[0] 8876 v.reset(OpARM64ADDconst) 8877 v.AuxInt = -c + d 8878 v.AddArg(x) 8879 return true 8880 } 8881 return false 8882 } 8883 func rewriteValueARM64_OpARM64SUBshiftLL(v *Value) bool { 8884 // match: (SUBshiftLL x (MOVDconst [c]) [d]) 8885 // cond: 8886 // result: (SUBconst x [int64(uint64(c)<<uint64(d))]) 8887 for { 8888 d := v.AuxInt 8889 x := v.Args[0] 8890 v_1 := v.Args[1] 8891 if v_1.Op != OpARM64MOVDconst { 8892 break 8893 } 8894 c := v_1.AuxInt 8895 v.reset(OpARM64SUBconst) 8896 v.AuxInt = int64(uint64(c) << uint64(d)) 8897 v.AddArg(x) 8898 return true 8899 } 8900 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 8901 // cond: c==d 8902 // result: (MOVDconst [0]) 8903 for { 8904 d := v.AuxInt 8905 x := v.Args[0] 8906 v_1 := v.Args[1] 8907 if v_1.Op != OpARM64SLLconst { 8908 break 8909 } 8910 c := v_1.AuxInt 8911 if x != v_1.Args[0] { 8912 break 8913 } 8914 if !(c == d) { 8915 break 8916 } 8917 v.reset(OpARM64MOVDconst) 8918 v.AuxInt = 0 8919 return true 8920 } 8921 return false 8922 } 8923 func rewriteValueARM64_OpARM64SUBshiftRA(v *Value) bool { 8924 // match: (SUBshiftRA x (MOVDconst [c]) [d]) 8925 // cond: 8926 // result: (SUBconst x [int64(int64(c)>>uint64(d))]) 8927 for { 8928 d := v.AuxInt 8929 x := v.Args[0] 8930 v_1 := v.Args[1] 8931 if v_1.Op != OpARM64MOVDconst { 8932 break 8933 } 8934 c := v_1.AuxInt 8935 v.reset(OpARM64SUBconst) 8936 v.AuxInt = int64(int64(c) >> uint64(d)) 8937 v.AddArg(x) 8938 return true 8939 } 8940 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 8941 // cond: c==d 8942 // result: (MOVDconst [0]) 8943 for { 8944 d := v.AuxInt 8945 x := v.Args[0] 8946 v_1 := v.Args[1] 8947 if v_1.Op != OpARM64SRAconst { 8948 break 8949 } 8950 c := v_1.AuxInt 8951 if x != v_1.Args[0] { 8952 break 8953 } 8954 if !(c == d) { 8955 break 8956 } 8957 v.reset(OpARM64MOVDconst) 8958 v.AuxInt = 0 8959 return true 8960 } 8961 return false 8962 } 8963 func rewriteValueARM64_OpARM64SUBshiftRL(v *Value) bool { 8964 // match: (SUBshiftRL x (MOVDconst [c]) [d]) 8965 // cond: 8966 // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) 8967 for { 8968 d := v.AuxInt 8969 x := v.Args[0] 8970 v_1 := v.Args[1] 8971 if v_1.Op != OpARM64MOVDconst { 8972 break 8973 } 8974 c := v_1.AuxInt 8975 v.reset(OpARM64SUBconst) 8976 v.AuxInt = int64(uint64(c) >> uint64(d)) 8977 v.AddArg(x) 8978 return true 8979 } 8980 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 8981 // cond: c==d 8982 // result: (MOVDconst [0]) 8983 for { 8984 d := v.AuxInt 8985 x := v.Args[0] 8986 v_1 := v.Args[1] 8987 if v_1.Op != OpARM64SRLconst { 8988 break 8989 } 8990 c := v_1.AuxInt 8991 if x != v_1.Args[0] { 8992 break 8993 } 8994 if !(c == d) { 8995 break 8996 } 8997 v.reset(OpARM64MOVDconst) 8998 v.AuxInt = 0 8999 return true 9000 } 9001 return false 9002 } 9003 func rewriteValueARM64_OpARM64UDIV(v *Value) bool { 9004 // match: (UDIV x (MOVDconst [1])) 9005 // cond: 9006 // result: x 9007 for { 9008 x := v.Args[0] 9009 v_1 := v.Args[1] 9010 if v_1.Op != OpARM64MOVDconst { 9011 break 9012 } 9013 if v_1.AuxInt != 1 { 9014 break 9015 } 9016 v.reset(OpCopy) 9017 v.Type = x.Type 9018 v.AddArg(x) 9019 return true 9020 } 9021 // match: (UDIV x (MOVDconst [c])) 9022 // cond: isPowerOfTwo(c) 9023 // result: (SRLconst [log2(c)] x) 9024 for { 9025 x := v.Args[0] 9026 v_1 := v.Args[1] 9027 if v_1.Op != OpARM64MOVDconst { 9028 break 9029 } 9030 c := v_1.AuxInt 9031 if !(isPowerOfTwo(c)) { 9032 break 9033 } 9034 v.reset(OpARM64SRLconst) 9035 v.AuxInt = log2(c) 9036 v.AddArg(x) 9037 return true 9038 } 9039 // match: (UDIV (MOVDconst [c]) (MOVDconst [d])) 9040 // cond: 9041 // result: (MOVDconst [int64(uint64(c)/uint64(d))]) 9042 for { 9043 v_0 := v.Args[0] 9044 if v_0.Op != OpARM64MOVDconst { 9045 break 9046 } 9047 c := v_0.AuxInt 9048 v_1 := v.Args[1] 9049 if v_1.Op != OpARM64MOVDconst { 9050 break 9051 } 9052 d := v_1.AuxInt 9053 v.reset(OpARM64MOVDconst) 9054 v.AuxInt = int64(uint64(c) / uint64(d)) 9055 return true 9056 } 9057 return false 9058 } 9059 func rewriteValueARM64_OpARM64UDIVW(v *Value) bool { 9060 // match: (UDIVW x (MOVDconst [c])) 9061 // cond: uint32(c)==1 9062 // result: x 9063 for { 9064 x := v.Args[0] 9065 v_1 := v.Args[1] 9066 if v_1.Op != OpARM64MOVDconst { 9067 break 9068 } 9069 c := v_1.AuxInt 9070 if !(uint32(c) == 1) { 9071 break 9072 } 9073 v.reset(OpCopy) 9074 v.Type = x.Type 9075 v.AddArg(x) 9076 return true 9077 } 9078 // match: (UDIVW x (MOVDconst [c])) 9079 // cond: isPowerOfTwo(c) && is32Bit(c) 9080 // result: (SRLconst [log2(c)] x) 9081 for { 9082 x := v.Args[0] 9083 v_1 := v.Args[1] 9084 if v_1.Op != OpARM64MOVDconst { 9085 break 9086 } 9087 c := v_1.AuxInt 9088 if !(isPowerOfTwo(c) && is32Bit(c)) { 9089 break 9090 } 9091 v.reset(OpARM64SRLconst) 9092 v.AuxInt = log2(c) 9093 v.AddArg(x) 9094 return true 9095 } 9096 // match: (UDIVW (MOVDconst [c]) (MOVDconst [d])) 9097 // cond: 9098 // result: (MOVDconst [int64(uint32(c)/uint32(d))]) 9099 for { 9100 v_0 := v.Args[0] 9101 if v_0.Op != OpARM64MOVDconst { 9102 break 9103 } 9104 c := v_0.AuxInt 9105 v_1 := v.Args[1] 9106 if v_1.Op != OpARM64MOVDconst { 9107 break 9108 } 9109 d := v_1.AuxInt 9110 v.reset(OpARM64MOVDconst) 9111 v.AuxInt = int64(uint32(c) / uint32(d)) 9112 return true 9113 } 9114 return false 9115 } 9116 func rewriteValueARM64_OpARM64UMOD(v *Value) bool { 9117 // match: (UMOD _ (MOVDconst [1])) 9118 // cond: 9119 // result: (MOVDconst [0]) 9120 for { 9121 v_1 := v.Args[1] 9122 if v_1.Op != OpARM64MOVDconst { 9123 break 9124 } 9125 if v_1.AuxInt != 1 { 9126 break 9127 } 9128 v.reset(OpARM64MOVDconst) 9129 v.AuxInt = 0 9130 return true 9131 } 9132 // match: (UMOD x (MOVDconst [c])) 9133 // cond: isPowerOfTwo(c) 9134 // result: (ANDconst [c-1] x) 9135 for { 9136 x := v.Args[0] 9137 v_1 := v.Args[1] 9138 if v_1.Op != OpARM64MOVDconst { 9139 break 9140 } 9141 c := v_1.AuxInt 9142 if !(isPowerOfTwo(c)) { 9143 break 9144 } 9145 v.reset(OpARM64ANDconst) 9146 v.AuxInt = c - 1 9147 v.AddArg(x) 9148 return true 9149 } 9150 // match: (UMOD (MOVDconst [c]) (MOVDconst [d])) 9151 // cond: 9152 // result: (MOVDconst [int64(uint64(c)%uint64(d))]) 9153 for { 9154 v_0 := v.Args[0] 9155 if v_0.Op != OpARM64MOVDconst { 9156 break 9157 } 9158 c := v_0.AuxInt 9159 v_1 := v.Args[1] 9160 if v_1.Op != OpARM64MOVDconst { 9161 break 9162 } 9163 d := v_1.AuxInt 9164 v.reset(OpARM64MOVDconst) 9165 v.AuxInt = int64(uint64(c) % uint64(d)) 9166 return true 9167 } 9168 return false 9169 } 9170 func rewriteValueARM64_OpARM64UMODW(v *Value) bool { 9171 // match: (UMODW _ (MOVDconst [c])) 9172 // cond: uint32(c)==1 9173 // result: (MOVDconst [0]) 9174 for { 9175 v_1 := v.Args[1] 9176 if v_1.Op != OpARM64MOVDconst { 9177 break 9178 } 9179 c := v_1.AuxInt 9180 if !(uint32(c) == 1) { 9181 break 9182 } 9183 v.reset(OpARM64MOVDconst) 9184 v.AuxInt = 0 9185 return true 9186 } 9187 // match: (UMODW x (MOVDconst [c])) 9188 // cond: isPowerOfTwo(c) && is32Bit(c) 9189 // result: (ANDconst [c-1] x) 9190 for { 9191 x := v.Args[0] 9192 v_1 := v.Args[1] 9193 if v_1.Op != OpARM64MOVDconst { 9194 break 9195 } 9196 c := v_1.AuxInt 9197 if !(isPowerOfTwo(c) && is32Bit(c)) { 9198 break 9199 } 9200 v.reset(OpARM64ANDconst) 9201 v.AuxInt = c - 1 9202 v.AddArg(x) 9203 return true 9204 } 9205 // match: (UMODW (MOVDconst [c]) (MOVDconst [d])) 9206 // cond: 9207 // result: (MOVDconst [int64(uint32(c)%uint32(d))]) 9208 for { 9209 v_0 := v.Args[0] 9210 if v_0.Op != OpARM64MOVDconst { 9211 break 9212 } 9213 c := v_0.AuxInt 9214 v_1 := v.Args[1] 9215 if v_1.Op != OpARM64MOVDconst { 9216 break 9217 } 9218 d := v_1.AuxInt 9219 v.reset(OpARM64MOVDconst) 9220 v.AuxInt = int64(uint32(c) % uint32(d)) 9221 return true 9222 } 9223 return false 9224 } 9225 func rewriteValueARM64_OpARM64XOR(v *Value) bool { 9226 // match: (XOR x (MOVDconst [c])) 9227 // cond: 9228 // result: (XORconst [c] x) 9229 for { 9230 x := v.Args[0] 9231 v_1 := v.Args[1] 9232 if v_1.Op != OpARM64MOVDconst { 9233 break 9234 } 9235 c := v_1.AuxInt 9236 v.reset(OpARM64XORconst) 9237 v.AuxInt = c 9238 v.AddArg(x) 9239 return true 9240 } 9241 // match: (XOR (MOVDconst [c]) x) 9242 // cond: 9243 // result: (XORconst [c] x) 9244 for { 9245 v_0 := v.Args[0] 9246 if v_0.Op != OpARM64MOVDconst { 9247 break 9248 } 9249 c := v_0.AuxInt 9250 x := v.Args[1] 9251 v.reset(OpARM64XORconst) 9252 v.AuxInt = c 9253 v.AddArg(x) 9254 return true 9255 } 9256 // match: (XOR x x) 9257 // cond: 9258 // result: (MOVDconst [0]) 9259 for { 9260 x := v.Args[0] 9261 if x != v.Args[1] { 9262 break 9263 } 9264 v.reset(OpARM64MOVDconst) 9265 v.AuxInt = 0 9266 return true 9267 } 9268 // match: (XOR x (SLLconst [c] y)) 9269 // cond: 9270 // result: (XORshiftLL x y [c]) 9271 for { 9272 x := v.Args[0] 9273 v_1 := v.Args[1] 9274 if v_1.Op != OpARM64SLLconst { 9275 break 9276 } 9277 c := v_1.AuxInt 9278 y := v_1.Args[0] 9279 v.reset(OpARM64XORshiftLL) 9280 v.AuxInt = c 9281 v.AddArg(x) 9282 v.AddArg(y) 9283 return true 9284 } 9285 // match: (XOR (SLLconst [c] y) x) 9286 // cond: 9287 // result: (XORshiftLL x y [c]) 9288 for { 9289 v_0 := v.Args[0] 9290 if v_0.Op != OpARM64SLLconst { 9291 break 9292 } 9293 c := v_0.AuxInt 9294 y := v_0.Args[0] 9295 x := v.Args[1] 9296 v.reset(OpARM64XORshiftLL) 9297 v.AuxInt = c 9298 v.AddArg(x) 9299 v.AddArg(y) 9300 return true 9301 } 9302 // match: (XOR x (SRLconst [c] y)) 9303 // cond: 9304 // result: (XORshiftRL x y [c]) 9305 for { 9306 x := v.Args[0] 9307 v_1 := v.Args[1] 9308 if v_1.Op != OpARM64SRLconst { 9309 break 9310 } 9311 c := v_1.AuxInt 9312 y := v_1.Args[0] 9313 v.reset(OpARM64XORshiftRL) 9314 v.AuxInt = c 9315 v.AddArg(x) 9316 v.AddArg(y) 9317 return true 9318 } 9319 // match: (XOR (SRLconst [c] y) x) 9320 // cond: 9321 // result: (XORshiftRL x y [c]) 9322 for { 9323 v_0 := v.Args[0] 9324 if v_0.Op != OpARM64SRLconst { 9325 break 9326 } 9327 c := v_0.AuxInt 9328 y := v_0.Args[0] 9329 x := v.Args[1] 9330 v.reset(OpARM64XORshiftRL) 9331 v.AuxInt = c 9332 v.AddArg(x) 9333 v.AddArg(y) 9334 return true 9335 } 9336 // match: (XOR x (SRAconst [c] y)) 9337 // cond: 9338 // result: (XORshiftRA x y [c]) 9339 for { 9340 x := v.Args[0] 9341 v_1 := v.Args[1] 9342 if v_1.Op != OpARM64SRAconst { 9343 break 9344 } 9345 c := v_1.AuxInt 9346 y := v_1.Args[0] 9347 v.reset(OpARM64XORshiftRA) 9348 v.AuxInt = c 9349 v.AddArg(x) 9350 v.AddArg(y) 9351 return true 9352 } 9353 // match: (XOR (SRAconst [c] y) x) 9354 // cond: 9355 // result: (XORshiftRA x y [c]) 9356 for { 9357 v_0 := v.Args[0] 9358 if v_0.Op != OpARM64SRAconst { 9359 break 9360 } 9361 c := v_0.AuxInt 9362 y := v_0.Args[0] 9363 x := v.Args[1] 9364 v.reset(OpARM64XORshiftRA) 9365 v.AuxInt = c 9366 v.AddArg(x) 9367 v.AddArg(y) 9368 return true 9369 } 9370 return false 9371 } 9372 func rewriteValueARM64_OpARM64XORconst(v *Value) bool { 9373 // match: (XORconst [0] x) 9374 // cond: 9375 // result: x 9376 for { 9377 if v.AuxInt != 0 { 9378 break 9379 } 9380 x := v.Args[0] 9381 v.reset(OpCopy) 9382 v.Type = x.Type 9383 v.AddArg(x) 9384 return true 9385 } 9386 // match: (XORconst [-1] x) 9387 // cond: 9388 // result: (MVN x) 9389 for { 9390 if v.AuxInt != -1 { 9391 break 9392 } 9393 x := v.Args[0] 9394 v.reset(OpARM64MVN) 9395 v.AddArg(x) 9396 return true 9397 } 9398 // match: (XORconst [c] (MOVDconst [d])) 9399 // cond: 9400 // result: (MOVDconst [c^d]) 9401 for { 9402 c := v.AuxInt 9403 v_0 := v.Args[0] 9404 if v_0.Op != OpARM64MOVDconst { 9405 break 9406 } 9407 d := v_0.AuxInt 9408 v.reset(OpARM64MOVDconst) 9409 v.AuxInt = c ^ d 9410 return true 9411 } 9412 // match: (XORconst [c] (XORconst [d] x)) 9413 // cond: 9414 // result: (XORconst [c^d] x) 9415 for { 9416 c := v.AuxInt 9417 v_0 := v.Args[0] 9418 if v_0.Op != OpARM64XORconst { 9419 break 9420 } 9421 d := v_0.AuxInt 9422 x := v_0.Args[0] 9423 v.reset(OpARM64XORconst) 9424 v.AuxInt = c ^ d 9425 v.AddArg(x) 9426 return true 9427 } 9428 return false 9429 } 9430 func rewriteValueARM64_OpARM64XORshiftLL(v *Value) bool { 9431 b := v.Block 9432 _ = b 9433 // match: (XORshiftLL (MOVDconst [c]) x [d]) 9434 // cond: 9435 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 9436 for { 9437 d := v.AuxInt 9438 v_0 := v.Args[0] 9439 if v_0.Op != OpARM64MOVDconst { 9440 break 9441 } 9442 c := v_0.AuxInt 9443 x := v.Args[1] 9444 v.reset(OpARM64XORconst) 9445 v.AuxInt = c 9446 v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) 9447 v0.AuxInt = d 9448 v0.AddArg(x) 9449 v.AddArg(v0) 9450 return true 9451 } 9452 // match: (XORshiftLL x (MOVDconst [c]) [d]) 9453 // cond: 9454 // result: (XORconst x [int64(uint64(c)<<uint64(d))]) 9455 for { 9456 d := v.AuxInt 9457 x := v.Args[0] 9458 v_1 := v.Args[1] 9459 if v_1.Op != OpARM64MOVDconst { 9460 break 9461 } 9462 c := v_1.AuxInt 9463 v.reset(OpARM64XORconst) 9464 v.AuxInt = int64(uint64(c) << uint64(d)) 9465 v.AddArg(x) 9466 return true 9467 } 9468 // match: (XORshiftLL x (SLLconst x [c]) [d]) 9469 // cond: c==d 9470 // result: (MOVDconst [0]) 9471 for { 9472 d := v.AuxInt 9473 x := v.Args[0] 9474 v_1 := v.Args[1] 9475 if v_1.Op != OpARM64SLLconst { 9476 break 9477 } 9478 c := v_1.AuxInt 9479 if x != v_1.Args[0] { 9480 break 9481 } 9482 if !(c == d) { 9483 break 9484 } 9485 v.reset(OpARM64MOVDconst) 9486 v.AuxInt = 0 9487 return true 9488 } 9489 // match: (XORshiftLL [c] (SRLconst x [64-c]) x) 9490 // cond: 9491 // result: (RORconst [64-c] x) 9492 for { 9493 c := v.AuxInt 9494 v_0 := v.Args[0] 9495 if v_0.Op != OpARM64SRLconst { 9496 break 9497 } 9498 if v_0.AuxInt != 64-c { 9499 break 9500 } 9501 x := v_0.Args[0] 9502 if x != v.Args[1] { 9503 break 9504 } 9505 v.reset(OpARM64RORconst) 9506 v.AuxInt = 64 - c 9507 v.AddArg(x) 9508 return true 9509 } 9510 // match: (XORshiftLL <t> [c] (SRLconst (MOVWUreg x) [32-c]) x) 9511 // cond: c < 32 && t.Size() == 4 9512 // result: (RORWconst [32-c] x) 9513 for { 9514 t := v.Type 9515 c := v.AuxInt 9516 v_0 := v.Args[0] 9517 if v_0.Op != OpARM64SRLconst { 9518 break 9519 } 9520 if v_0.AuxInt != 32-c { 9521 break 9522 } 9523 v_0_0 := v_0.Args[0] 9524 if v_0_0.Op != OpARM64MOVWUreg { 9525 break 9526 } 9527 x := v_0_0.Args[0] 9528 if x != v.Args[1] { 9529 break 9530 } 9531 if !(c < 32 && t.Size() == 4) { 9532 break 9533 } 9534 v.reset(OpARM64RORWconst) 9535 v.AuxInt = 32 - c 9536 v.AddArg(x) 9537 return true 9538 } 9539 return false 9540 } 9541 func rewriteValueARM64_OpARM64XORshiftRA(v *Value) bool { 9542 b := v.Block 9543 _ = b 9544 // match: (XORshiftRA (MOVDconst [c]) x [d]) 9545 // cond: 9546 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 9547 for { 9548 d := v.AuxInt 9549 v_0 := v.Args[0] 9550 if v_0.Op != OpARM64MOVDconst { 9551 break 9552 } 9553 c := v_0.AuxInt 9554 x := v.Args[1] 9555 v.reset(OpARM64XORconst) 9556 v.AuxInt = c 9557 v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) 9558 v0.AuxInt = d 9559 v0.AddArg(x) 9560 v.AddArg(v0) 9561 return true 9562 } 9563 // match: (XORshiftRA x (MOVDconst [c]) [d]) 9564 // cond: 9565 // result: (XORconst x [int64(int64(c)>>uint64(d))]) 9566 for { 9567 d := v.AuxInt 9568 x := v.Args[0] 9569 v_1 := v.Args[1] 9570 if v_1.Op != OpARM64MOVDconst { 9571 break 9572 } 9573 c := v_1.AuxInt 9574 v.reset(OpARM64XORconst) 9575 v.AuxInt = int64(int64(c) >> uint64(d)) 9576 v.AddArg(x) 9577 return true 9578 } 9579 // match: (XORshiftRA x (SRAconst x [c]) [d]) 9580 // cond: c==d 9581 // result: (MOVDconst [0]) 9582 for { 9583 d := v.AuxInt 9584 x := v.Args[0] 9585 v_1 := v.Args[1] 9586 if v_1.Op != OpARM64SRAconst { 9587 break 9588 } 9589 c := v_1.AuxInt 9590 if x != v_1.Args[0] { 9591 break 9592 } 9593 if !(c == d) { 9594 break 9595 } 9596 v.reset(OpARM64MOVDconst) 9597 v.AuxInt = 0 9598 return true 9599 } 9600 return false 9601 } 9602 func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { 9603 b := v.Block 9604 _ = b 9605 // match: (XORshiftRL (MOVDconst [c]) x [d]) 9606 // cond: 9607 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 9608 for { 9609 d := v.AuxInt 9610 v_0 := v.Args[0] 9611 if v_0.Op != OpARM64MOVDconst { 9612 break 9613 } 9614 c := v_0.AuxInt 9615 x := v.Args[1] 9616 v.reset(OpARM64XORconst) 9617 v.AuxInt = c 9618 v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) 9619 v0.AuxInt = d 9620 v0.AddArg(x) 9621 v.AddArg(v0) 9622 return true 9623 } 9624 // match: (XORshiftRL x (MOVDconst [c]) [d]) 9625 // cond: 9626 // result: (XORconst x [int64(uint64(c)>>uint64(d))]) 9627 for { 9628 d := v.AuxInt 9629 x := v.Args[0] 9630 v_1 := v.Args[1] 9631 if v_1.Op != OpARM64MOVDconst { 9632 break 9633 } 9634 c := v_1.AuxInt 9635 v.reset(OpARM64XORconst) 9636 v.AuxInt = int64(uint64(c) >> uint64(d)) 9637 v.AddArg(x) 9638 return true 9639 } 9640 // match: (XORshiftRL x (SRLconst x [c]) [d]) 9641 // cond: c==d 9642 // result: (MOVDconst [0]) 9643 for { 9644 d := v.AuxInt 9645 x := v.Args[0] 9646 v_1 := v.Args[1] 9647 if v_1.Op != OpARM64SRLconst { 9648 break 9649 } 9650 c := v_1.AuxInt 9651 if x != v_1.Args[0] { 9652 break 9653 } 9654 if !(c == d) { 9655 break 9656 } 9657 v.reset(OpARM64MOVDconst) 9658 v.AuxInt = 0 9659 return true 9660 } 9661 // match: (XORshiftRL [c] (SLLconst x [64-c]) x) 9662 // cond: 9663 // result: (RORconst [ c] x) 9664 for { 9665 c := v.AuxInt 9666 v_0 := v.Args[0] 9667 if v_0.Op != OpARM64SLLconst { 9668 break 9669 } 9670 if v_0.AuxInt != 64-c { 9671 break 9672 } 9673 x := v_0.Args[0] 9674 if x != v.Args[1] { 9675 break 9676 } 9677 v.reset(OpARM64RORconst) 9678 v.AuxInt = c 9679 v.AddArg(x) 9680 return true 9681 } 9682 // match: (XORshiftRL <t> [c] (SLLconst x [32-c]) (MOVWUreg x)) 9683 // cond: c < 32 && t.Size() == 4 9684 // result: (RORWconst [ c] x) 9685 for { 9686 t := v.Type 9687 c := v.AuxInt 9688 v_0 := v.Args[0] 9689 if v_0.Op != OpARM64SLLconst { 9690 break 9691 } 9692 if v_0.AuxInt != 32-c { 9693 break 9694 } 9695 x := v_0.Args[0] 9696 v_1 := v.Args[1] 9697 if v_1.Op != OpARM64MOVWUreg { 9698 break 9699 } 9700 if x != v_1.Args[0] { 9701 break 9702 } 9703 if !(c < 32 && t.Size() == 4) { 9704 break 9705 } 9706 v.reset(OpARM64RORWconst) 9707 v.AuxInt = c 9708 v.AddArg(x) 9709 return true 9710 } 9711 return false 9712 } 9713 func rewriteValueARM64_OpAdd16(v *Value) bool { 9714 // match: (Add16 x y) 9715 // cond: 9716 // result: (ADD x y) 9717 for { 9718 x := v.Args[0] 9719 y := v.Args[1] 9720 v.reset(OpARM64ADD) 9721 v.AddArg(x) 9722 v.AddArg(y) 9723 return true 9724 } 9725 } 9726 func rewriteValueARM64_OpAdd32(v *Value) bool { 9727 // match: (Add32 x y) 9728 // cond: 9729 // result: (ADD x y) 9730 for { 9731 x := v.Args[0] 9732 y := v.Args[1] 9733 v.reset(OpARM64ADD) 9734 v.AddArg(x) 9735 v.AddArg(y) 9736 return true 9737 } 9738 } 9739 func rewriteValueARM64_OpAdd32F(v *Value) bool { 9740 // match: (Add32F x y) 9741 // cond: 9742 // result: (FADDS x y) 9743 for { 9744 x := v.Args[0] 9745 y := v.Args[1] 9746 v.reset(OpARM64FADDS) 9747 v.AddArg(x) 9748 v.AddArg(y) 9749 return true 9750 } 9751 } 9752 func rewriteValueARM64_OpAdd64(v *Value) bool { 9753 // match: (Add64 x y) 9754 // cond: 9755 // result: (ADD x y) 9756 for { 9757 x := v.Args[0] 9758 y := v.Args[1] 9759 v.reset(OpARM64ADD) 9760 v.AddArg(x) 9761 v.AddArg(y) 9762 return true 9763 } 9764 } 9765 func rewriteValueARM64_OpAdd64F(v *Value) bool { 9766 // match: (Add64F x y) 9767 // cond: 9768 // result: (FADDD x y) 9769 for { 9770 x := v.Args[0] 9771 y := v.Args[1] 9772 v.reset(OpARM64FADDD) 9773 v.AddArg(x) 9774 v.AddArg(y) 9775 return true 9776 } 9777 } 9778 func rewriteValueARM64_OpAdd8(v *Value) bool { 9779 // match: (Add8 x y) 9780 // cond: 9781 // result: (ADD x y) 9782 for { 9783 x := v.Args[0] 9784 y := v.Args[1] 9785 v.reset(OpARM64ADD) 9786 v.AddArg(x) 9787 v.AddArg(y) 9788 return true 9789 } 9790 } 9791 func rewriteValueARM64_OpAddPtr(v *Value) bool { 9792 // match: (AddPtr x y) 9793 // cond: 9794 // result: (ADD x y) 9795 for { 9796 x := v.Args[0] 9797 y := v.Args[1] 9798 v.reset(OpARM64ADD) 9799 v.AddArg(x) 9800 v.AddArg(y) 9801 return true 9802 } 9803 } 9804 func rewriteValueARM64_OpAddr(v *Value) bool { 9805 // match: (Addr {sym} base) 9806 // cond: 9807 // result: (MOVDaddr {sym} base) 9808 for { 9809 sym := v.Aux 9810 base := v.Args[0] 9811 v.reset(OpARM64MOVDaddr) 9812 v.Aux = sym 9813 v.AddArg(base) 9814 return true 9815 } 9816 } 9817 func rewriteValueARM64_OpAnd16(v *Value) bool { 9818 // match: (And16 x y) 9819 // cond: 9820 // result: (AND x y) 9821 for { 9822 x := v.Args[0] 9823 y := v.Args[1] 9824 v.reset(OpARM64AND) 9825 v.AddArg(x) 9826 v.AddArg(y) 9827 return true 9828 } 9829 } 9830 func rewriteValueARM64_OpAnd32(v *Value) bool { 9831 // match: (And32 x y) 9832 // cond: 9833 // result: (AND x y) 9834 for { 9835 x := v.Args[0] 9836 y := v.Args[1] 9837 v.reset(OpARM64AND) 9838 v.AddArg(x) 9839 v.AddArg(y) 9840 return true 9841 } 9842 } 9843 func rewriteValueARM64_OpAnd64(v *Value) bool { 9844 // match: (And64 x y) 9845 // cond: 9846 // result: (AND x y) 9847 for { 9848 x := v.Args[0] 9849 y := v.Args[1] 9850 v.reset(OpARM64AND) 9851 v.AddArg(x) 9852 v.AddArg(y) 9853 return true 9854 } 9855 } 9856 func rewriteValueARM64_OpAnd8(v *Value) bool { 9857 // match: (And8 x y) 9858 // cond: 9859 // result: (AND x y) 9860 for { 9861 x := v.Args[0] 9862 y := v.Args[1] 9863 v.reset(OpARM64AND) 9864 v.AddArg(x) 9865 v.AddArg(y) 9866 return true 9867 } 9868 } 9869 func rewriteValueARM64_OpAndB(v *Value) bool { 9870 // match: (AndB x y) 9871 // cond: 9872 // result: (AND x y) 9873 for { 9874 x := v.Args[0] 9875 y := v.Args[1] 9876 v.reset(OpARM64AND) 9877 v.AddArg(x) 9878 v.AddArg(y) 9879 return true 9880 } 9881 } 9882 func rewriteValueARM64_OpAtomicAdd32(v *Value) bool { 9883 // match: (AtomicAdd32 ptr val mem) 9884 // cond: 9885 // result: (LoweredAtomicAdd32 ptr val mem) 9886 for { 9887 ptr := v.Args[0] 9888 val := v.Args[1] 9889 mem := v.Args[2] 9890 v.reset(OpARM64LoweredAtomicAdd32) 9891 v.AddArg(ptr) 9892 v.AddArg(val) 9893 v.AddArg(mem) 9894 return true 9895 } 9896 } 9897 func rewriteValueARM64_OpAtomicAdd64(v *Value) bool { 9898 // match: (AtomicAdd64 ptr val mem) 9899 // cond: 9900 // result: (LoweredAtomicAdd64 ptr val mem) 9901 for { 9902 ptr := v.Args[0] 9903 val := v.Args[1] 9904 mem := v.Args[2] 9905 v.reset(OpARM64LoweredAtomicAdd64) 9906 v.AddArg(ptr) 9907 v.AddArg(val) 9908 v.AddArg(mem) 9909 return true 9910 } 9911 } 9912 func rewriteValueARM64_OpAtomicAnd8(v *Value) bool { 9913 // match: (AtomicAnd8 ptr val mem) 9914 // cond: 9915 // result: (LoweredAtomicAnd8 ptr val mem) 9916 for { 9917 ptr := v.Args[0] 9918 val := v.Args[1] 9919 mem := v.Args[2] 9920 v.reset(OpARM64LoweredAtomicAnd8) 9921 v.AddArg(ptr) 9922 v.AddArg(val) 9923 v.AddArg(mem) 9924 return true 9925 } 9926 } 9927 func rewriteValueARM64_OpAtomicCompareAndSwap32(v *Value) bool { 9928 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 9929 // cond: 9930 // result: (LoweredAtomicCas32 ptr old new_ mem) 9931 for { 9932 ptr := v.Args[0] 9933 old := v.Args[1] 9934 new_ := v.Args[2] 9935 mem := v.Args[3] 9936 v.reset(OpARM64LoweredAtomicCas32) 9937 v.AddArg(ptr) 9938 v.AddArg(old) 9939 v.AddArg(new_) 9940 v.AddArg(mem) 9941 return true 9942 } 9943 } 9944 func rewriteValueARM64_OpAtomicCompareAndSwap64(v *Value) bool { 9945 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 9946 // cond: 9947 // result: (LoweredAtomicCas64 ptr old new_ mem) 9948 for { 9949 ptr := v.Args[0] 9950 old := v.Args[1] 9951 new_ := v.Args[2] 9952 mem := v.Args[3] 9953 v.reset(OpARM64LoweredAtomicCas64) 9954 v.AddArg(ptr) 9955 v.AddArg(old) 9956 v.AddArg(new_) 9957 v.AddArg(mem) 9958 return true 9959 } 9960 } 9961 func rewriteValueARM64_OpAtomicExchange32(v *Value) bool { 9962 // match: (AtomicExchange32 ptr val mem) 9963 // cond: 9964 // result: (LoweredAtomicExchange32 ptr val mem) 9965 for { 9966 ptr := v.Args[0] 9967 val := v.Args[1] 9968 mem := v.Args[2] 9969 v.reset(OpARM64LoweredAtomicExchange32) 9970 v.AddArg(ptr) 9971 v.AddArg(val) 9972 v.AddArg(mem) 9973 return true 9974 } 9975 } 9976 func rewriteValueARM64_OpAtomicExchange64(v *Value) bool { 9977 // match: (AtomicExchange64 ptr val mem) 9978 // cond: 9979 // result: (LoweredAtomicExchange64 ptr val mem) 9980 for { 9981 ptr := v.Args[0] 9982 val := v.Args[1] 9983 mem := v.Args[2] 9984 v.reset(OpARM64LoweredAtomicExchange64) 9985 v.AddArg(ptr) 9986 v.AddArg(val) 9987 v.AddArg(mem) 9988 return true 9989 } 9990 } 9991 func rewriteValueARM64_OpAtomicLoad32(v *Value) bool { 9992 // match: (AtomicLoad32 ptr mem) 9993 // cond: 9994 // result: (LDARW ptr mem) 9995 for { 9996 ptr := v.Args[0] 9997 mem := v.Args[1] 9998 v.reset(OpARM64LDARW) 9999 v.AddArg(ptr) 10000 v.AddArg(mem) 10001 return true 10002 } 10003 } 10004 func rewriteValueARM64_OpAtomicLoad64(v *Value) bool { 10005 // match: (AtomicLoad64 ptr mem) 10006 // cond: 10007 // result: (LDAR ptr mem) 10008 for { 10009 ptr := v.Args[0] 10010 mem := v.Args[1] 10011 v.reset(OpARM64LDAR) 10012 v.AddArg(ptr) 10013 v.AddArg(mem) 10014 return true 10015 } 10016 } 10017 func rewriteValueARM64_OpAtomicLoadPtr(v *Value) bool { 10018 // match: (AtomicLoadPtr ptr mem) 10019 // cond: 10020 // result: (LDAR ptr mem) 10021 for { 10022 ptr := v.Args[0] 10023 mem := v.Args[1] 10024 v.reset(OpARM64LDAR) 10025 v.AddArg(ptr) 10026 v.AddArg(mem) 10027 return true 10028 } 10029 } 10030 func rewriteValueARM64_OpAtomicOr8(v *Value) bool { 10031 // match: (AtomicOr8 ptr val mem) 10032 // cond: 10033 // result: (LoweredAtomicOr8 ptr val mem) 10034 for { 10035 ptr := v.Args[0] 10036 val := v.Args[1] 10037 mem := v.Args[2] 10038 v.reset(OpARM64LoweredAtomicOr8) 10039 v.AddArg(ptr) 10040 v.AddArg(val) 10041 v.AddArg(mem) 10042 return true 10043 } 10044 } 10045 func rewriteValueARM64_OpAtomicStore32(v *Value) bool { 10046 // match: (AtomicStore32 ptr val mem) 10047 // cond: 10048 // result: (STLRW ptr val mem) 10049 for { 10050 ptr := v.Args[0] 10051 val := v.Args[1] 10052 mem := v.Args[2] 10053 v.reset(OpARM64STLRW) 10054 v.AddArg(ptr) 10055 v.AddArg(val) 10056 v.AddArg(mem) 10057 return true 10058 } 10059 } 10060 func rewriteValueARM64_OpAtomicStore64(v *Value) bool { 10061 // match: (AtomicStore64 ptr val mem) 10062 // cond: 10063 // result: (STLR ptr val mem) 10064 for { 10065 ptr := v.Args[0] 10066 val := v.Args[1] 10067 mem := v.Args[2] 10068 v.reset(OpARM64STLR) 10069 v.AddArg(ptr) 10070 v.AddArg(val) 10071 v.AddArg(mem) 10072 return true 10073 } 10074 } 10075 func rewriteValueARM64_OpAtomicStorePtrNoWB(v *Value) bool { 10076 // match: (AtomicStorePtrNoWB ptr val mem) 10077 // cond: 10078 // result: (STLR ptr val mem) 10079 for { 10080 ptr := v.Args[0] 10081 val := v.Args[1] 10082 mem := v.Args[2] 10083 v.reset(OpARM64STLR) 10084 v.AddArg(ptr) 10085 v.AddArg(val) 10086 v.AddArg(mem) 10087 return true 10088 } 10089 } 10090 func rewriteValueARM64_OpAvg64u(v *Value) bool { 10091 b := v.Block 10092 _ = b 10093 // match: (Avg64u <t> x y) 10094 // cond: 10095 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 10096 for { 10097 t := v.Type 10098 x := v.Args[0] 10099 y := v.Args[1] 10100 v.reset(OpARM64ADD) 10101 v0 := b.NewValue0(v.Pos, OpARM64SRLconst, t) 10102 v0.AuxInt = 1 10103 v1 := b.NewValue0(v.Pos, OpARM64SUB, t) 10104 v1.AddArg(x) 10105 v1.AddArg(y) 10106 v0.AddArg(v1) 10107 v.AddArg(v0) 10108 v.AddArg(y) 10109 return true 10110 } 10111 } 10112 func rewriteValueARM64_OpBitLen64(v *Value) bool { 10113 b := v.Block 10114 _ = b 10115 types := &b.Func.Config.Types 10116 _ = types 10117 // match: (BitLen64 x) 10118 // cond: 10119 // result: (SUB (MOVDconst [64]) (CLZ <types.Int> x)) 10120 for { 10121 x := v.Args[0] 10122 v.reset(OpARM64SUB) 10123 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 10124 v0.AuxInt = 64 10125 v.AddArg(v0) 10126 v1 := b.NewValue0(v.Pos, OpARM64CLZ, types.Int) 10127 v1.AddArg(x) 10128 v.AddArg(v1) 10129 return true 10130 } 10131 } 10132 func rewriteValueARM64_OpBitRev16(v *Value) bool { 10133 b := v.Block 10134 _ = b 10135 types := &b.Func.Config.Types 10136 _ = types 10137 // match: (BitRev16 x) 10138 // cond: 10139 // result: (SRLconst [48] (RBIT <types.UInt64> x)) 10140 for { 10141 x := v.Args[0] 10142 v.reset(OpARM64SRLconst) 10143 v.AuxInt = 48 10144 v0 := b.NewValue0(v.Pos, OpARM64RBIT, types.UInt64) 10145 v0.AddArg(x) 10146 v.AddArg(v0) 10147 return true 10148 } 10149 } 10150 func rewriteValueARM64_OpBitRev32(v *Value) bool { 10151 // match: (BitRev32 x) 10152 // cond: 10153 // result: (RBITW x) 10154 for { 10155 x := v.Args[0] 10156 v.reset(OpARM64RBITW) 10157 v.AddArg(x) 10158 return true 10159 } 10160 } 10161 func rewriteValueARM64_OpBitRev64(v *Value) bool { 10162 // match: (BitRev64 x) 10163 // cond: 10164 // result: (RBIT x) 10165 for { 10166 x := v.Args[0] 10167 v.reset(OpARM64RBIT) 10168 v.AddArg(x) 10169 return true 10170 } 10171 } 10172 func rewriteValueARM64_OpBitRev8(v *Value) bool { 10173 b := v.Block 10174 _ = b 10175 types := &b.Func.Config.Types 10176 _ = types 10177 // match: (BitRev8 x) 10178 // cond: 10179 // result: (SRLconst [56] (RBIT <types.UInt64> x)) 10180 for { 10181 x := v.Args[0] 10182 v.reset(OpARM64SRLconst) 10183 v.AuxInt = 56 10184 v0 := b.NewValue0(v.Pos, OpARM64RBIT, types.UInt64) 10185 v0.AddArg(x) 10186 v.AddArg(v0) 10187 return true 10188 } 10189 } 10190 func rewriteValueARM64_OpBswap32(v *Value) bool { 10191 // match: (Bswap32 x) 10192 // cond: 10193 // result: (REVW x) 10194 for { 10195 x := v.Args[0] 10196 v.reset(OpARM64REVW) 10197 v.AddArg(x) 10198 return true 10199 } 10200 } 10201 func rewriteValueARM64_OpBswap64(v *Value) bool { 10202 // match: (Bswap64 x) 10203 // cond: 10204 // result: (REV x) 10205 for { 10206 x := v.Args[0] 10207 v.reset(OpARM64REV) 10208 v.AddArg(x) 10209 return true 10210 } 10211 } 10212 func rewriteValueARM64_OpClosureCall(v *Value) bool { 10213 // match: (ClosureCall [argwid] entry closure mem) 10214 // cond: 10215 // result: (CALLclosure [argwid] entry closure mem) 10216 for { 10217 argwid := v.AuxInt 10218 entry := v.Args[0] 10219 closure := v.Args[1] 10220 mem := v.Args[2] 10221 v.reset(OpARM64CALLclosure) 10222 v.AuxInt = argwid 10223 v.AddArg(entry) 10224 v.AddArg(closure) 10225 v.AddArg(mem) 10226 return true 10227 } 10228 } 10229 func rewriteValueARM64_OpCom16(v *Value) bool { 10230 // match: (Com16 x) 10231 // cond: 10232 // result: (MVN x) 10233 for { 10234 x := v.Args[0] 10235 v.reset(OpARM64MVN) 10236 v.AddArg(x) 10237 return true 10238 } 10239 } 10240 func rewriteValueARM64_OpCom32(v *Value) bool { 10241 // match: (Com32 x) 10242 // cond: 10243 // result: (MVN x) 10244 for { 10245 x := v.Args[0] 10246 v.reset(OpARM64MVN) 10247 v.AddArg(x) 10248 return true 10249 } 10250 } 10251 func rewriteValueARM64_OpCom64(v *Value) bool { 10252 // match: (Com64 x) 10253 // cond: 10254 // result: (MVN x) 10255 for { 10256 x := v.Args[0] 10257 v.reset(OpARM64MVN) 10258 v.AddArg(x) 10259 return true 10260 } 10261 } 10262 func rewriteValueARM64_OpCom8(v *Value) bool { 10263 // match: (Com8 x) 10264 // cond: 10265 // result: (MVN x) 10266 for { 10267 x := v.Args[0] 10268 v.reset(OpARM64MVN) 10269 v.AddArg(x) 10270 return true 10271 } 10272 } 10273 func rewriteValueARM64_OpConst16(v *Value) bool { 10274 // match: (Const16 [val]) 10275 // cond: 10276 // result: (MOVDconst [val]) 10277 for { 10278 val := v.AuxInt 10279 v.reset(OpARM64MOVDconst) 10280 v.AuxInt = val 10281 return true 10282 } 10283 } 10284 func rewriteValueARM64_OpConst32(v *Value) bool { 10285 // match: (Const32 [val]) 10286 // cond: 10287 // result: (MOVDconst [val]) 10288 for { 10289 val := v.AuxInt 10290 v.reset(OpARM64MOVDconst) 10291 v.AuxInt = val 10292 return true 10293 } 10294 } 10295 func rewriteValueARM64_OpConst32F(v *Value) bool { 10296 // match: (Const32F [val]) 10297 // cond: 10298 // result: (FMOVSconst [val]) 10299 for { 10300 val := v.AuxInt 10301 v.reset(OpARM64FMOVSconst) 10302 v.AuxInt = val 10303 return true 10304 } 10305 } 10306 func rewriteValueARM64_OpConst64(v *Value) bool { 10307 // match: (Const64 [val]) 10308 // cond: 10309 // result: (MOVDconst [val]) 10310 for { 10311 val := v.AuxInt 10312 v.reset(OpARM64MOVDconst) 10313 v.AuxInt = val 10314 return true 10315 } 10316 } 10317 func rewriteValueARM64_OpConst64F(v *Value) bool { 10318 // match: (Const64F [val]) 10319 // cond: 10320 // result: (FMOVDconst [val]) 10321 for { 10322 val := v.AuxInt 10323 v.reset(OpARM64FMOVDconst) 10324 v.AuxInt = val 10325 return true 10326 } 10327 } 10328 func rewriteValueARM64_OpConst8(v *Value) bool { 10329 // match: (Const8 [val]) 10330 // cond: 10331 // result: (MOVDconst [val]) 10332 for { 10333 val := v.AuxInt 10334 v.reset(OpARM64MOVDconst) 10335 v.AuxInt = val 10336 return true 10337 } 10338 } 10339 func rewriteValueARM64_OpConstBool(v *Value) bool { 10340 // match: (ConstBool [b]) 10341 // cond: 10342 // result: (MOVDconst [b]) 10343 for { 10344 b := v.AuxInt 10345 v.reset(OpARM64MOVDconst) 10346 v.AuxInt = b 10347 return true 10348 } 10349 } 10350 func rewriteValueARM64_OpConstNil(v *Value) bool { 10351 // match: (ConstNil) 10352 // cond: 10353 // result: (MOVDconst [0]) 10354 for { 10355 v.reset(OpARM64MOVDconst) 10356 v.AuxInt = 0 10357 return true 10358 } 10359 } 10360 func rewriteValueARM64_OpConvert(v *Value) bool { 10361 // match: (Convert x mem) 10362 // cond: 10363 // result: (MOVDconvert x mem) 10364 for { 10365 x := v.Args[0] 10366 mem := v.Args[1] 10367 v.reset(OpARM64MOVDconvert) 10368 v.AddArg(x) 10369 v.AddArg(mem) 10370 return true 10371 } 10372 } 10373 func rewriteValueARM64_OpCtz32(v *Value) bool { 10374 b := v.Block 10375 _ = b 10376 // match: (Ctz32 <t> x) 10377 // cond: 10378 // result: (CLZW (RBITW <t> x)) 10379 for { 10380 t := v.Type 10381 x := v.Args[0] 10382 v.reset(OpARM64CLZW) 10383 v0 := b.NewValue0(v.Pos, OpARM64RBITW, t) 10384 v0.AddArg(x) 10385 v.AddArg(v0) 10386 return true 10387 } 10388 } 10389 func rewriteValueARM64_OpCtz64(v *Value) bool { 10390 b := v.Block 10391 _ = b 10392 // match: (Ctz64 <t> x) 10393 // cond: 10394 // result: (CLZ (RBIT <t> x)) 10395 for { 10396 t := v.Type 10397 x := v.Args[0] 10398 v.reset(OpARM64CLZ) 10399 v0 := b.NewValue0(v.Pos, OpARM64RBIT, t) 10400 v0.AddArg(x) 10401 v.AddArg(v0) 10402 return true 10403 } 10404 } 10405 func rewriteValueARM64_OpCvt32Fto32(v *Value) bool { 10406 // match: (Cvt32Fto32 x) 10407 // cond: 10408 // result: (FCVTZSSW x) 10409 for { 10410 x := v.Args[0] 10411 v.reset(OpARM64FCVTZSSW) 10412 v.AddArg(x) 10413 return true 10414 } 10415 } 10416 func rewriteValueARM64_OpCvt32Fto32U(v *Value) bool { 10417 // match: (Cvt32Fto32U x) 10418 // cond: 10419 // result: (FCVTZUSW x) 10420 for { 10421 x := v.Args[0] 10422 v.reset(OpARM64FCVTZUSW) 10423 v.AddArg(x) 10424 return true 10425 } 10426 } 10427 func rewriteValueARM64_OpCvt32Fto64(v *Value) bool { 10428 // match: (Cvt32Fto64 x) 10429 // cond: 10430 // result: (FCVTZSS x) 10431 for { 10432 x := v.Args[0] 10433 v.reset(OpARM64FCVTZSS) 10434 v.AddArg(x) 10435 return true 10436 } 10437 } 10438 func rewriteValueARM64_OpCvt32Fto64F(v *Value) bool { 10439 // match: (Cvt32Fto64F x) 10440 // cond: 10441 // result: (FCVTSD x) 10442 for { 10443 x := v.Args[0] 10444 v.reset(OpARM64FCVTSD) 10445 v.AddArg(x) 10446 return true 10447 } 10448 } 10449 func rewriteValueARM64_OpCvt32Fto64U(v *Value) bool { 10450 // match: (Cvt32Fto64U x) 10451 // cond: 10452 // result: (FCVTZUS x) 10453 for { 10454 x := v.Args[0] 10455 v.reset(OpARM64FCVTZUS) 10456 v.AddArg(x) 10457 return true 10458 } 10459 } 10460 func rewriteValueARM64_OpCvt32Uto32F(v *Value) bool { 10461 // match: (Cvt32Uto32F x) 10462 // cond: 10463 // result: (UCVTFWS x) 10464 for { 10465 x := v.Args[0] 10466 v.reset(OpARM64UCVTFWS) 10467 v.AddArg(x) 10468 return true 10469 } 10470 } 10471 func rewriteValueARM64_OpCvt32Uto64F(v *Value) bool { 10472 // match: (Cvt32Uto64F x) 10473 // cond: 10474 // result: (UCVTFWD x) 10475 for { 10476 x := v.Args[0] 10477 v.reset(OpARM64UCVTFWD) 10478 v.AddArg(x) 10479 return true 10480 } 10481 } 10482 func rewriteValueARM64_OpCvt32to32F(v *Value) bool { 10483 // match: (Cvt32to32F x) 10484 // cond: 10485 // result: (SCVTFWS x) 10486 for { 10487 x := v.Args[0] 10488 v.reset(OpARM64SCVTFWS) 10489 v.AddArg(x) 10490 return true 10491 } 10492 } 10493 func rewriteValueARM64_OpCvt32to64F(v *Value) bool { 10494 // match: (Cvt32to64F x) 10495 // cond: 10496 // result: (SCVTFWD x) 10497 for { 10498 x := v.Args[0] 10499 v.reset(OpARM64SCVTFWD) 10500 v.AddArg(x) 10501 return true 10502 } 10503 } 10504 func rewriteValueARM64_OpCvt64Fto32(v *Value) bool { 10505 // match: (Cvt64Fto32 x) 10506 // cond: 10507 // result: (FCVTZSDW x) 10508 for { 10509 x := v.Args[0] 10510 v.reset(OpARM64FCVTZSDW) 10511 v.AddArg(x) 10512 return true 10513 } 10514 } 10515 func rewriteValueARM64_OpCvt64Fto32F(v *Value) bool { 10516 // match: (Cvt64Fto32F x) 10517 // cond: 10518 // result: (FCVTDS x) 10519 for { 10520 x := v.Args[0] 10521 v.reset(OpARM64FCVTDS) 10522 v.AddArg(x) 10523 return true 10524 } 10525 } 10526 func rewriteValueARM64_OpCvt64Fto32U(v *Value) bool { 10527 // match: (Cvt64Fto32U x) 10528 // cond: 10529 // result: (FCVTZUDW x) 10530 for { 10531 x := v.Args[0] 10532 v.reset(OpARM64FCVTZUDW) 10533 v.AddArg(x) 10534 return true 10535 } 10536 } 10537 func rewriteValueARM64_OpCvt64Fto64(v *Value) bool { 10538 // match: (Cvt64Fto64 x) 10539 // cond: 10540 // result: (FCVTZSD x) 10541 for { 10542 x := v.Args[0] 10543 v.reset(OpARM64FCVTZSD) 10544 v.AddArg(x) 10545 return true 10546 } 10547 } 10548 func rewriteValueARM64_OpCvt64Fto64U(v *Value) bool { 10549 // match: (Cvt64Fto64U x) 10550 // cond: 10551 // result: (FCVTZUD x) 10552 for { 10553 x := v.Args[0] 10554 v.reset(OpARM64FCVTZUD) 10555 v.AddArg(x) 10556 return true 10557 } 10558 } 10559 func rewriteValueARM64_OpCvt64Uto32F(v *Value) bool { 10560 // match: (Cvt64Uto32F x) 10561 // cond: 10562 // result: (UCVTFS x) 10563 for { 10564 x := v.Args[0] 10565 v.reset(OpARM64UCVTFS) 10566 v.AddArg(x) 10567 return true 10568 } 10569 } 10570 func rewriteValueARM64_OpCvt64Uto64F(v *Value) bool { 10571 // match: (Cvt64Uto64F x) 10572 // cond: 10573 // result: (UCVTFD x) 10574 for { 10575 x := v.Args[0] 10576 v.reset(OpARM64UCVTFD) 10577 v.AddArg(x) 10578 return true 10579 } 10580 } 10581 func rewriteValueARM64_OpCvt64to32F(v *Value) bool { 10582 // match: (Cvt64to32F x) 10583 // cond: 10584 // result: (SCVTFS x) 10585 for { 10586 x := v.Args[0] 10587 v.reset(OpARM64SCVTFS) 10588 v.AddArg(x) 10589 return true 10590 } 10591 } 10592 func rewriteValueARM64_OpCvt64to64F(v *Value) bool { 10593 // match: (Cvt64to64F x) 10594 // cond: 10595 // result: (SCVTFD x) 10596 for { 10597 x := v.Args[0] 10598 v.reset(OpARM64SCVTFD) 10599 v.AddArg(x) 10600 return true 10601 } 10602 } 10603 func rewriteValueARM64_OpDiv16(v *Value) bool { 10604 b := v.Block 10605 _ = b 10606 types := &b.Func.Config.Types 10607 _ = types 10608 // match: (Div16 x y) 10609 // cond: 10610 // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) 10611 for { 10612 x := v.Args[0] 10613 y := v.Args[1] 10614 v.reset(OpARM64DIVW) 10615 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 10616 v0.AddArg(x) 10617 v.AddArg(v0) 10618 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 10619 v1.AddArg(y) 10620 v.AddArg(v1) 10621 return true 10622 } 10623 } 10624 func rewriteValueARM64_OpDiv16u(v *Value) bool { 10625 b := v.Block 10626 _ = b 10627 types := &b.Func.Config.Types 10628 _ = types 10629 // match: (Div16u x y) 10630 // cond: 10631 // result: (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y)) 10632 for { 10633 x := v.Args[0] 10634 y := v.Args[1] 10635 v.reset(OpARM64UDIVW) 10636 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10637 v0.AddArg(x) 10638 v.AddArg(v0) 10639 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10640 v1.AddArg(y) 10641 v.AddArg(v1) 10642 return true 10643 } 10644 } 10645 func rewriteValueARM64_OpDiv32(v *Value) bool { 10646 // match: (Div32 x y) 10647 // cond: 10648 // result: (DIVW x y) 10649 for { 10650 x := v.Args[0] 10651 y := v.Args[1] 10652 v.reset(OpARM64DIVW) 10653 v.AddArg(x) 10654 v.AddArg(y) 10655 return true 10656 } 10657 } 10658 func rewriteValueARM64_OpDiv32F(v *Value) bool { 10659 // match: (Div32F x y) 10660 // cond: 10661 // result: (FDIVS x y) 10662 for { 10663 x := v.Args[0] 10664 y := v.Args[1] 10665 v.reset(OpARM64FDIVS) 10666 v.AddArg(x) 10667 v.AddArg(y) 10668 return true 10669 } 10670 } 10671 func rewriteValueARM64_OpDiv32u(v *Value) bool { 10672 // match: (Div32u x y) 10673 // cond: 10674 // result: (UDIVW x y) 10675 for { 10676 x := v.Args[0] 10677 y := v.Args[1] 10678 v.reset(OpARM64UDIVW) 10679 v.AddArg(x) 10680 v.AddArg(y) 10681 return true 10682 } 10683 } 10684 func rewriteValueARM64_OpDiv64(v *Value) bool { 10685 // match: (Div64 x y) 10686 // cond: 10687 // result: (DIV x y) 10688 for { 10689 x := v.Args[0] 10690 y := v.Args[1] 10691 v.reset(OpARM64DIV) 10692 v.AddArg(x) 10693 v.AddArg(y) 10694 return true 10695 } 10696 } 10697 func rewriteValueARM64_OpDiv64F(v *Value) bool { 10698 // match: (Div64F x y) 10699 // cond: 10700 // result: (FDIVD x y) 10701 for { 10702 x := v.Args[0] 10703 y := v.Args[1] 10704 v.reset(OpARM64FDIVD) 10705 v.AddArg(x) 10706 v.AddArg(y) 10707 return true 10708 } 10709 } 10710 func rewriteValueARM64_OpDiv64u(v *Value) bool { 10711 // match: (Div64u x y) 10712 // cond: 10713 // result: (UDIV x y) 10714 for { 10715 x := v.Args[0] 10716 y := v.Args[1] 10717 v.reset(OpARM64UDIV) 10718 v.AddArg(x) 10719 v.AddArg(y) 10720 return true 10721 } 10722 } 10723 func rewriteValueARM64_OpDiv8(v *Value) bool { 10724 b := v.Block 10725 _ = b 10726 types := &b.Func.Config.Types 10727 _ = types 10728 // match: (Div8 x y) 10729 // cond: 10730 // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) 10731 for { 10732 x := v.Args[0] 10733 y := v.Args[1] 10734 v.reset(OpARM64DIVW) 10735 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 10736 v0.AddArg(x) 10737 v.AddArg(v0) 10738 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 10739 v1.AddArg(y) 10740 v.AddArg(v1) 10741 return true 10742 } 10743 } 10744 func rewriteValueARM64_OpDiv8u(v *Value) bool { 10745 b := v.Block 10746 _ = b 10747 types := &b.Func.Config.Types 10748 _ = types 10749 // match: (Div8u x y) 10750 // cond: 10751 // result: (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y)) 10752 for { 10753 x := v.Args[0] 10754 y := v.Args[1] 10755 v.reset(OpARM64UDIVW) 10756 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 10757 v0.AddArg(x) 10758 v.AddArg(v0) 10759 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 10760 v1.AddArg(y) 10761 v.AddArg(v1) 10762 return true 10763 } 10764 } 10765 func rewriteValueARM64_OpEq16(v *Value) bool { 10766 b := v.Block 10767 _ = b 10768 types := &b.Func.Config.Types 10769 _ = types 10770 // match: (Eq16 x y) 10771 // cond: 10772 // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10773 for { 10774 x := v.Args[0] 10775 y := v.Args[1] 10776 v.reset(OpARM64Equal) 10777 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10778 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10779 v1.AddArg(x) 10780 v0.AddArg(v1) 10781 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10782 v2.AddArg(y) 10783 v0.AddArg(v2) 10784 v.AddArg(v0) 10785 return true 10786 } 10787 } 10788 func rewriteValueARM64_OpEq32(v *Value) bool { 10789 b := v.Block 10790 _ = b 10791 // match: (Eq32 x y) 10792 // cond: 10793 // result: (Equal (CMPW x y)) 10794 for { 10795 x := v.Args[0] 10796 y := v.Args[1] 10797 v.reset(OpARM64Equal) 10798 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10799 v0.AddArg(x) 10800 v0.AddArg(y) 10801 v.AddArg(v0) 10802 return true 10803 } 10804 } 10805 func rewriteValueARM64_OpEq32F(v *Value) bool { 10806 b := v.Block 10807 _ = b 10808 // match: (Eq32F x y) 10809 // cond: 10810 // result: (Equal (FCMPS x y)) 10811 for { 10812 x := v.Args[0] 10813 y := v.Args[1] 10814 v.reset(OpARM64Equal) 10815 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 10816 v0.AddArg(x) 10817 v0.AddArg(y) 10818 v.AddArg(v0) 10819 return true 10820 } 10821 } 10822 func rewriteValueARM64_OpEq64(v *Value) bool { 10823 b := v.Block 10824 _ = b 10825 // match: (Eq64 x y) 10826 // cond: 10827 // result: (Equal (CMP x y)) 10828 for { 10829 x := v.Args[0] 10830 y := v.Args[1] 10831 v.reset(OpARM64Equal) 10832 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 10833 v0.AddArg(x) 10834 v0.AddArg(y) 10835 v.AddArg(v0) 10836 return true 10837 } 10838 } 10839 func rewriteValueARM64_OpEq64F(v *Value) bool { 10840 b := v.Block 10841 _ = b 10842 // match: (Eq64F x y) 10843 // cond: 10844 // result: (Equal (FCMPD x y)) 10845 for { 10846 x := v.Args[0] 10847 y := v.Args[1] 10848 v.reset(OpARM64Equal) 10849 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 10850 v0.AddArg(x) 10851 v0.AddArg(y) 10852 v.AddArg(v0) 10853 return true 10854 } 10855 } 10856 func rewriteValueARM64_OpEq8(v *Value) bool { 10857 b := v.Block 10858 _ = b 10859 types := &b.Func.Config.Types 10860 _ = types 10861 // match: (Eq8 x y) 10862 // cond: 10863 // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10864 for { 10865 x := v.Args[0] 10866 y := v.Args[1] 10867 v.reset(OpARM64Equal) 10868 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10869 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 10870 v1.AddArg(x) 10871 v0.AddArg(v1) 10872 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 10873 v2.AddArg(y) 10874 v0.AddArg(v2) 10875 v.AddArg(v0) 10876 return true 10877 } 10878 } 10879 func rewriteValueARM64_OpEqB(v *Value) bool { 10880 b := v.Block 10881 _ = b 10882 types := &b.Func.Config.Types 10883 _ = types 10884 // match: (EqB x y) 10885 // cond: 10886 // result: (XOR (MOVDconst [1]) (XOR <types.Bool> x y)) 10887 for { 10888 x := v.Args[0] 10889 y := v.Args[1] 10890 v.reset(OpARM64XOR) 10891 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 10892 v0.AuxInt = 1 10893 v.AddArg(v0) 10894 v1 := b.NewValue0(v.Pos, OpARM64XOR, types.Bool) 10895 v1.AddArg(x) 10896 v1.AddArg(y) 10897 v.AddArg(v1) 10898 return true 10899 } 10900 } 10901 func rewriteValueARM64_OpEqPtr(v *Value) bool { 10902 b := v.Block 10903 _ = b 10904 // match: (EqPtr x y) 10905 // cond: 10906 // result: (Equal (CMP x y)) 10907 for { 10908 x := v.Args[0] 10909 y := v.Args[1] 10910 v.reset(OpARM64Equal) 10911 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 10912 v0.AddArg(x) 10913 v0.AddArg(y) 10914 v.AddArg(v0) 10915 return true 10916 } 10917 } 10918 func rewriteValueARM64_OpGeq16(v *Value) bool { 10919 b := v.Block 10920 _ = b 10921 types := &b.Func.Config.Types 10922 _ = types 10923 // match: (Geq16 x y) 10924 // cond: 10925 // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10926 for { 10927 x := v.Args[0] 10928 y := v.Args[1] 10929 v.reset(OpARM64GreaterEqual) 10930 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10931 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 10932 v1.AddArg(x) 10933 v0.AddArg(v1) 10934 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 10935 v2.AddArg(y) 10936 v0.AddArg(v2) 10937 v.AddArg(v0) 10938 return true 10939 } 10940 } 10941 func rewriteValueARM64_OpGeq16U(v *Value) bool { 10942 b := v.Block 10943 _ = b 10944 types := &b.Func.Config.Types 10945 _ = types 10946 // match: (Geq16U x y) 10947 // cond: 10948 // result: (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10949 for { 10950 x := v.Args[0] 10951 y := v.Args[1] 10952 v.reset(OpARM64GreaterEqualU) 10953 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10954 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10955 v1.AddArg(x) 10956 v0.AddArg(v1) 10957 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 10958 v2.AddArg(y) 10959 v0.AddArg(v2) 10960 v.AddArg(v0) 10961 return true 10962 } 10963 } 10964 func rewriteValueARM64_OpGeq32(v *Value) bool { 10965 b := v.Block 10966 _ = b 10967 // match: (Geq32 x y) 10968 // cond: 10969 // result: (GreaterEqual (CMPW x y)) 10970 for { 10971 x := v.Args[0] 10972 y := v.Args[1] 10973 v.reset(OpARM64GreaterEqual) 10974 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 10975 v0.AddArg(x) 10976 v0.AddArg(y) 10977 v.AddArg(v0) 10978 return true 10979 } 10980 } 10981 func rewriteValueARM64_OpGeq32F(v *Value) bool { 10982 b := v.Block 10983 _ = b 10984 // match: (Geq32F x y) 10985 // cond: 10986 // result: (GreaterEqual (FCMPS x y)) 10987 for { 10988 x := v.Args[0] 10989 y := v.Args[1] 10990 v.reset(OpARM64GreaterEqual) 10991 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 10992 v0.AddArg(x) 10993 v0.AddArg(y) 10994 v.AddArg(v0) 10995 return true 10996 } 10997 } 10998 func rewriteValueARM64_OpGeq32U(v *Value) bool { 10999 b := v.Block 11000 _ = b 11001 // match: (Geq32U x y) 11002 // cond: 11003 // result: (GreaterEqualU (CMPW x y)) 11004 for { 11005 x := v.Args[0] 11006 y := v.Args[1] 11007 v.reset(OpARM64GreaterEqualU) 11008 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11009 v0.AddArg(x) 11010 v0.AddArg(y) 11011 v.AddArg(v0) 11012 return true 11013 } 11014 } 11015 func rewriteValueARM64_OpGeq64(v *Value) bool { 11016 b := v.Block 11017 _ = b 11018 // match: (Geq64 x y) 11019 // cond: 11020 // result: (GreaterEqual (CMP x y)) 11021 for { 11022 x := v.Args[0] 11023 y := v.Args[1] 11024 v.reset(OpARM64GreaterEqual) 11025 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11026 v0.AddArg(x) 11027 v0.AddArg(y) 11028 v.AddArg(v0) 11029 return true 11030 } 11031 } 11032 func rewriteValueARM64_OpGeq64F(v *Value) bool { 11033 b := v.Block 11034 _ = b 11035 // match: (Geq64F x y) 11036 // cond: 11037 // result: (GreaterEqual (FCMPD x y)) 11038 for { 11039 x := v.Args[0] 11040 y := v.Args[1] 11041 v.reset(OpARM64GreaterEqual) 11042 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 11043 v0.AddArg(x) 11044 v0.AddArg(y) 11045 v.AddArg(v0) 11046 return true 11047 } 11048 } 11049 func rewriteValueARM64_OpGeq64U(v *Value) bool { 11050 b := v.Block 11051 _ = b 11052 // match: (Geq64U x y) 11053 // cond: 11054 // result: (GreaterEqualU (CMP x y)) 11055 for { 11056 x := v.Args[0] 11057 y := v.Args[1] 11058 v.reset(OpARM64GreaterEqualU) 11059 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11060 v0.AddArg(x) 11061 v0.AddArg(y) 11062 v.AddArg(v0) 11063 return true 11064 } 11065 } 11066 func rewriteValueARM64_OpGeq8(v *Value) bool { 11067 b := v.Block 11068 _ = b 11069 types := &b.Func.Config.Types 11070 _ = types 11071 // match: (Geq8 x y) 11072 // cond: 11073 // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11074 for { 11075 x := v.Args[0] 11076 y := v.Args[1] 11077 v.reset(OpARM64GreaterEqual) 11078 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11079 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11080 v1.AddArg(x) 11081 v0.AddArg(v1) 11082 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11083 v2.AddArg(y) 11084 v0.AddArg(v2) 11085 v.AddArg(v0) 11086 return true 11087 } 11088 } 11089 func rewriteValueARM64_OpGeq8U(v *Value) bool { 11090 b := v.Block 11091 _ = b 11092 types := &b.Func.Config.Types 11093 _ = types 11094 // match: (Geq8U x y) 11095 // cond: 11096 // result: (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11097 for { 11098 x := v.Args[0] 11099 y := v.Args[1] 11100 v.reset(OpARM64GreaterEqualU) 11101 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11102 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11103 v1.AddArg(x) 11104 v0.AddArg(v1) 11105 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11106 v2.AddArg(y) 11107 v0.AddArg(v2) 11108 v.AddArg(v0) 11109 return true 11110 } 11111 } 11112 func rewriteValueARM64_OpGetClosurePtr(v *Value) bool { 11113 // match: (GetClosurePtr) 11114 // cond: 11115 // result: (LoweredGetClosurePtr) 11116 for { 11117 v.reset(OpARM64LoweredGetClosurePtr) 11118 return true 11119 } 11120 } 11121 func rewriteValueARM64_OpGreater16(v *Value) bool { 11122 b := v.Block 11123 _ = b 11124 types := &b.Func.Config.Types 11125 _ = types 11126 // match: (Greater16 x y) 11127 // cond: 11128 // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 11129 for { 11130 x := v.Args[0] 11131 y := v.Args[1] 11132 v.reset(OpARM64GreaterThan) 11133 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11134 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11135 v1.AddArg(x) 11136 v0.AddArg(v1) 11137 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11138 v2.AddArg(y) 11139 v0.AddArg(v2) 11140 v.AddArg(v0) 11141 return true 11142 } 11143 } 11144 func rewriteValueARM64_OpGreater16U(v *Value) bool { 11145 b := v.Block 11146 _ = b 11147 types := &b.Func.Config.Types 11148 _ = types 11149 // match: (Greater16U x y) 11150 // cond: 11151 // result: (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 11152 for { 11153 x := v.Args[0] 11154 y := v.Args[1] 11155 v.reset(OpARM64GreaterThanU) 11156 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11157 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11158 v1.AddArg(x) 11159 v0.AddArg(v1) 11160 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11161 v2.AddArg(y) 11162 v0.AddArg(v2) 11163 v.AddArg(v0) 11164 return true 11165 } 11166 } 11167 func rewriteValueARM64_OpGreater32(v *Value) bool { 11168 b := v.Block 11169 _ = b 11170 // match: (Greater32 x y) 11171 // cond: 11172 // result: (GreaterThan (CMPW x y)) 11173 for { 11174 x := v.Args[0] 11175 y := v.Args[1] 11176 v.reset(OpARM64GreaterThan) 11177 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11178 v0.AddArg(x) 11179 v0.AddArg(y) 11180 v.AddArg(v0) 11181 return true 11182 } 11183 } 11184 func rewriteValueARM64_OpGreater32F(v *Value) bool { 11185 b := v.Block 11186 _ = b 11187 // match: (Greater32F x y) 11188 // cond: 11189 // result: (GreaterThan (FCMPS x y)) 11190 for { 11191 x := v.Args[0] 11192 y := v.Args[1] 11193 v.reset(OpARM64GreaterThan) 11194 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 11195 v0.AddArg(x) 11196 v0.AddArg(y) 11197 v.AddArg(v0) 11198 return true 11199 } 11200 } 11201 func rewriteValueARM64_OpGreater32U(v *Value) bool { 11202 b := v.Block 11203 _ = b 11204 // match: (Greater32U x y) 11205 // cond: 11206 // result: (GreaterThanU (CMPW x y)) 11207 for { 11208 x := v.Args[0] 11209 y := v.Args[1] 11210 v.reset(OpARM64GreaterThanU) 11211 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11212 v0.AddArg(x) 11213 v0.AddArg(y) 11214 v.AddArg(v0) 11215 return true 11216 } 11217 } 11218 func rewriteValueARM64_OpGreater64(v *Value) bool { 11219 b := v.Block 11220 _ = b 11221 // match: (Greater64 x y) 11222 // cond: 11223 // result: (GreaterThan (CMP x y)) 11224 for { 11225 x := v.Args[0] 11226 y := v.Args[1] 11227 v.reset(OpARM64GreaterThan) 11228 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11229 v0.AddArg(x) 11230 v0.AddArg(y) 11231 v.AddArg(v0) 11232 return true 11233 } 11234 } 11235 func rewriteValueARM64_OpGreater64F(v *Value) bool { 11236 b := v.Block 11237 _ = b 11238 // match: (Greater64F x y) 11239 // cond: 11240 // result: (GreaterThan (FCMPD x y)) 11241 for { 11242 x := v.Args[0] 11243 y := v.Args[1] 11244 v.reset(OpARM64GreaterThan) 11245 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 11246 v0.AddArg(x) 11247 v0.AddArg(y) 11248 v.AddArg(v0) 11249 return true 11250 } 11251 } 11252 func rewriteValueARM64_OpGreater64U(v *Value) bool { 11253 b := v.Block 11254 _ = b 11255 // match: (Greater64U x y) 11256 // cond: 11257 // result: (GreaterThanU (CMP x y)) 11258 for { 11259 x := v.Args[0] 11260 y := v.Args[1] 11261 v.reset(OpARM64GreaterThanU) 11262 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11263 v0.AddArg(x) 11264 v0.AddArg(y) 11265 v.AddArg(v0) 11266 return true 11267 } 11268 } 11269 func rewriteValueARM64_OpGreater8(v *Value) bool { 11270 b := v.Block 11271 _ = b 11272 types := &b.Func.Config.Types 11273 _ = types 11274 // match: (Greater8 x y) 11275 // cond: 11276 // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11277 for { 11278 x := v.Args[0] 11279 y := v.Args[1] 11280 v.reset(OpARM64GreaterThan) 11281 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11282 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11283 v1.AddArg(x) 11284 v0.AddArg(v1) 11285 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11286 v2.AddArg(y) 11287 v0.AddArg(v2) 11288 v.AddArg(v0) 11289 return true 11290 } 11291 } 11292 func rewriteValueARM64_OpGreater8U(v *Value) bool { 11293 b := v.Block 11294 _ = b 11295 types := &b.Func.Config.Types 11296 _ = types 11297 // match: (Greater8U x y) 11298 // cond: 11299 // result: (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11300 for { 11301 x := v.Args[0] 11302 y := v.Args[1] 11303 v.reset(OpARM64GreaterThanU) 11304 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11305 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11306 v1.AddArg(x) 11307 v0.AddArg(v1) 11308 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11309 v2.AddArg(y) 11310 v0.AddArg(v2) 11311 v.AddArg(v0) 11312 return true 11313 } 11314 } 11315 func rewriteValueARM64_OpHmul32(v *Value) bool { 11316 b := v.Block 11317 _ = b 11318 types := &b.Func.Config.Types 11319 _ = types 11320 // match: (Hmul32 x y) 11321 // cond: 11322 // result: (SRAconst (MULL <types.Int64> x y) [32]) 11323 for { 11324 x := v.Args[0] 11325 y := v.Args[1] 11326 v.reset(OpARM64SRAconst) 11327 v.AuxInt = 32 11328 v0 := b.NewValue0(v.Pos, OpARM64MULL, types.Int64) 11329 v0.AddArg(x) 11330 v0.AddArg(y) 11331 v.AddArg(v0) 11332 return true 11333 } 11334 } 11335 func rewriteValueARM64_OpHmul32u(v *Value) bool { 11336 b := v.Block 11337 _ = b 11338 types := &b.Func.Config.Types 11339 _ = types 11340 // match: (Hmul32u x y) 11341 // cond: 11342 // result: (SRAconst (UMULL <types.UInt64> x y) [32]) 11343 for { 11344 x := v.Args[0] 11345 y := v.Args[1] 11346 v.reset(OpARM64SRAconst) 11347 v.AuxInt = 32 11348 v0 := b.NewValue0(v.Pos, OpARM64UMULL, types.UInt64) 11349 v0.AddArg(x) 11350 v0.AddArg(y) 11351 v.AddArg(v0) 11352 return true 11353 } 11354 } 11355 func rewriteValueARM64_OpHmul64(v *Value) bool { 11356 // match: (Hmul64 x y) 11357 // cond: 11358 // result: (MULH x y) 11359 for { 11360 x := v.Args[0] 11361 y := v.Args[1] 11362 v.reset(OpARM64MULH) 11363 v.AddArg(x) 11364 v.AddArg(y) 11365 return true 11366 } 11367 } 11368 func rewriteValueARM64_OpHmul64u(v *Value) bool { 11369 // match: (Hmul64u x y) 11370 // cond: 11371 // result: (UMULH x y) 11372 for { 11373 x := v.Args[0] 11374 y := v.Args[1] 11375 v.reset(OpARM64UMULH) 11376 v.AddArg(x) 11377 v.AddArg(y) 11378 return true 11379 } 11380 } 11381 func rewriteValueARM64_OpInterCall(v *Value) bool { 11382 // match: (InterCall [argwid] entry mem) 11383 // cond: 11384 // result: (CALLinter [argwid] entry mem) 11385 for { 11386 argwid := v.AuxInt 11387 entry := v.Args[0] 11388 mem := v.Args[1] 11389 v.reset(OpARM64CALLinter) 11390 v.AuxInt = argwid 11391 v.AddArg(entry) 11392 v.AddArg(mem) 11393 return true 11394 } 11395 } 11396 func rewriteValueARM64_OpIsInBounds(v *Value) bool { 11397 b := v.Block 11398 _ = b 11399 // match: (IsInBounds idx len) 11400 // cond: 11401 // result: (LessThanU (CMP idx len)) 11402 for { 11403 idx := v.Args[0] 11404 len := v.Args[1] 11405 v.reset(OpARM64LessThanU) 11406 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11407 v0.AddArg(idx) 11408 v0.AddArg(len) 11409 v.AddArg(v0) 11410 return true 11411 } 11412 } 11413 func rewriteValueARM64_OpIsNonNil(v *Value) bool { 11414 b := v.Block 11415 _ = b 11416 // match: (IsNonNil ptr) 11417 // cond: 11418 // result: (NotEqual (CMPconst [0] ptr)) 11419 for { 11420 ptr := v.Args[0] 11421 v.reset(OpARM64NotEqual) 11422 v0 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 11423 v0.AuxInt = 0 11424 v0.AddArg(ptr) 11425 v.AddArg(v0) 11426 return true 11427 } 11428 } 11429 func rewriteValueARM64_OpIsSliceInBounds(v *Value) bool { 11430 b := v.Block 11431 _ = b 11432 // match: (IsSliceInBounds idx len) 11433 // cond: 11434 // result: (LessEqualU (CMP idx len)) 11435 for { 11436 idx := v.Args[0] 11437 len := v.Args[1] 11438 v.reset(OpARM64LessEqualU) 11439 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11440 v0.AddArg(idx) 11441 v0.AddArg(len) 11442 v.AddArg(v0) 11443 return true 11444 } 11445 } 11446 func rewriteValueARM64_OpLeq16(v *Value) bool { 11447 b := v.Block 11448 _ = b 11449 types := &b.Func.Config.Types 11450 _ = types 11451 // match: (Leq16 x y) 11452 // cond: 11453 // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 11454 for { 11455 x := v.Args[0] 11456 y := v.Args[1] 11457 v.reset(OpARM64LessEqual) 11458 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11459 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11460 v1.AddArg(x) 11461 v0.AddArg(v1) 11462 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11463 v2.AddArg(y) 11464 v0.AddArg(v2) 11465 v.AddArg(v0) 11466 return true 11467 } 11468 } 11469 func rewriteValueARM64_OpLeq16U(v *Value) bool { 11470 b := v.Block 11471 _ = b 11472 types := &b.Func.Config.Types 11473 _ = types 11474 // match: (Leq16U x y) 11475 // cond: 11476 // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 11477 for { 11478 x := v.Args[0] 11479 y := v.Args[1] 11480 v.reset(OpARM64LessEqualU) 11481 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11482 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11483 v1.AddArg(x) 11484 v0.AddArg(v1) 11485 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11486 v2.AddArg(y) 11487 v0.AddArg(v2) 11488 v.AddArg(v0) 11489 return true 11490 } 11491 } 11492 func rewriteValueARM64_OpLeq32(v *Value) bool { 11493 b := v.Block 11494 _ = b 11495 // match: (Leq32 x y) 11496 // cond: 11497 // result: (LessEqual (CMPW x y)) 11498 for { 11499 x := v.Args[0] 11500 y := v.Args[1] 11501 v.reset(OpARM64LessEqual) 11502 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11503 v0.AddArg(x) 11504 v0.AddArg(y) 11505 v.AddArg(v0) 11506 return true 11507 } 11508 } 11509 func rewriteValueARM64_OpLeq32F(v *Value) bool { 11510 b := v.Block 11511 _ = b 11512 // match: (Leq32F x y) 11513 // cond: 11514 // result: (GreaterEqual (FCMPS y x)) 11515 for { 11516 x := v.Args[0] 11517 y := v.Args[1] 11518 v.reset(OpARM64GreaterEqual) 11519 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 11520 v0.AddArg(y) 11521 v0.AddArg(x) 11522 v.AddArg(v0) 11523 return true 11524 } 11525 } 11526 func rewriteValueARM64_OpLeq32U(v *Value) bool { 11527 b := v.Block 11528 _ = b 11529 // match: (Leq32U x y) 11530 // cond: 11531 // result: (LessEqualU (CMPW x y)) 11532 for { 11533 x := v.Args[0] 11534 y := v.Args[1] 11535 v.reset(OpARM64LessEqualU) 11536 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11537 v0.AddArg(x) 11538 v0.AddArg(y) 11539 v.AddArg(v0) 11540 return true 11541 } 11542 } 11543 func rewriteValueARM64_OpLeq64(v *Value) bool { 11544 b := v.Block 11545 _ = b 11546 // match: (Leq64 x y) 11547 // cond: 11548 // result: (LessEqual (CMP x y)) 11549 for { 11550 x := v.Args[0] 11551 y := v.Args[1] 11552 v.reset(OpARM64LessEqual) 11553 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11554 v0.AddArg(x) 11555 v0.AddArg(y) 11556 v.AddArg(v0) 11557 return true 11558 } 11559 } 11560 func rewriteValueARM64_OpLeq64F(v *Value) bool { 11561 b := v.Block 11562 _ = b 11563 // match: (Leq64F x y) 11564 // cond: 11565 // result: (GreaterEqual (FCMPD y x)) 11566 for { 11567 x := v.Args[0] 11568 y := v.Args[1] 11569 v.reset(OpARM64GreaterEqual) 11570 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 11571 v0.AddArg(y) 11572 v0.AddArg(x) 11573 v.AddArg(v0) 11574 return true 11575 } 11576 } 11577 func rewriteValueARM64_OpLeq64U(v *Value) bool { 11578 b := v.Block 11579 _ = b 11580 // match: (Leq64U x y) 11581 // cond: 11582 // result: (LessEqualU (CMP x y)) 11583 for { 11584 x := v.Args[0] 11585 y := v.Args[1] 11586 v.reset(OpARM64LessEqualU) 11587 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11588 v0.AddArg(x) 11589 v0.AddArg(y) 11590 v.AddArg(v0) 11591 return true 11592 } 11593 } 11594 func rewriteValueARM64_OpLeq8(v *Value) bool { 11595 b := v.Block 11596 _ = b 11597 types := &b.Func.Config.Types 11598 _ = types 11599 // match: (Leq8 x y) 11600 // cond: 11601 // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11602 for { 11603 x := v.Args[0] 11604 y := v.Args[1] 11605 v.reset(OpARM64LessEqual) 11606 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11607 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11608 v1.AddArg(x) 11609 v0.AddArg(v1) 11610 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11611 v2.AddArg(y) 11612 v0.AddArg(v2) 11613 v.AddArg(v0) 11614 return true 11615 } 11616 } 11617 func rewriteValueARM64_OpLeq8U(v *Value) bool { 11618 b := v.Block 11619 _ = b 11620 types := &b.Func.Config.Types 11621 _ = types 11622 // match: (Leq8U x y) 11623 // cond: 11624 // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11625 for { 11626 x := v.Args[0] 11627 y := v.Args[1] 11628 v.reset(OpARM64LessEqualU) 11629 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11630 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11631 v1.AddArg(x) 11632 v0.AddArg(v1) 11633 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11634 v2.AddArg(y) 11635 v0.AddArg(v2) 11636 v.AddArg(v0) 11637 return true 11638 } 11639 } 11640 func rewriteValueARM64_OpLess16(v *Value) bool { 11641 b := v.Block 11642 _ = b 11643 types := &b.Func.Config.Types 11644 _ = types 11645 // match: (Less16 x y) 11646 // cond: 11647 // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 11648 for { 11649 x := v.Args[0] 11650 y := v.Args[1] 11651 v.reset(OpARM64LessThan) 11652 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11653 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11654 v1.AddArg(x) 11655 v0.AddArg(v1) 11656 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 11657 v2.AddArg(y) 11658 v0.AddArg(v2) 11659 v.AddArg(v0) 11660 return true 11661 } 11662 } 11663 func rewriteValueARM64_OpLess16U(v *Value) bool { 11664 b := v.Block 11665 _ = b 11666 types := &b.Func.Config.Types 11667 _ = types 11668 // match: (Less16U x y) 11669 // cond: 11670 // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 11671 for { 11672 x := v.Args[0] 11673 y := v.Args[1] 11674 v.reset(OpARM64LessThanU) 11675 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11676 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11677 v1.AddArg(x) 11678 v0.AddArg(v1) 11679 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 11680 v2.AddArg(y) 11681 v0.AddArg(v2) 11682 v.AddArg(v0) 11683 return true 11684 } 11685 } 11686 func rewriteValueARM64_OpLess32(v *Value) bool { 11687 b := v.Block 11688 _ = b 11689 // match: (Less32 x y) 11690 // cond: 11691 // result: (LessThan (CMPW x y)) 11692 for { 11693 x := v.Args[0] 11694 y := v.Args[1] 11695 v.reset(OpARM64LessThan) 11696 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11697 v0.AddArg(x) 11698 v0.AddArg(y) 11699 v.AddArg(v0) 11700 return true 11701 } 11702 } 11703 func rewriteValueARM64_OpLess32F(v *Value) bool { 11704 b := v.Block 11705 _ = b 11706 // match: (Less32F x y) 11707 // cond: 11708 // result: (GreaterThan (FCMPS y x)) 11709 for { 11710 x := v.Args[0] 11711 y := v.Args[1] 11712 v.reset(OpARM64GreaterThan) 11713 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 11714 v0.AddArg(y) 11715 v0.AddArg(x) 11716 v.AddArg(v0) 11717 return true 11718 } 11719 } 11720 func rewriteValueARM64_OpLess32U(v *Value) bool { 11721 b := v.Block 11722 _ = b 11723 // match: (Less32U x y) 11724 // cond: 11725 // result: (LessThanU (CMPW x y)) 11726 for { 11727 x := v.Args[0] 11728 y := v.Args[1] 11729 v.reset(OpARM64LessThanU) 11730 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11731 v0.AddArg(x) 11732 v0.AddArg(y) 11733 v.AddArg(v0) 11734 return true 11735 } 11736 } 11737 func rewriteValueARM64_OpLess64(v *Value) bool { 11738 b := v.Block 11739 _ = b 11740 // match: (Less64 x y) 11741 // cond: 11742 // result: (LessThan (CMP x y)) 11743 for { 11744 x := v.Args[0] 11745 y := v.Args[1] 11746 v.reset(OpARM64LessThan) 11747 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11748 v0.AddArg(x) 11749 v0.AddArg(y) 11750 v.AddArg(v0) 11751 return true 11752 } 11753 } 11754 func rewriteValueARM64_OpLess64F(v *Value) bool { 11755 b := v.Block 11756 _ = b 11757 // match: (Less64F x y) 11758 // cond: 11759 // result: (GreaterThan (FCMPD y x)) 11760 for { 11761 x := v.Args[0] 11762 y := v.Args[1] 11763 v.reset(OpARM64GreaterThan) 11764 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 11765 v0.AddArg(y) 11766 v0.AddArg(x) 11767 v.AddArg(v0) 11768 return true 11769 } 11770 } 11771 func rewriteValueARM64_OpLess64U(v *Value) bool { 11772 b := v.Block 11773 _ = b 11774 // match: (Less64U x y) 11775 // cond: 11776 // result: (LessThanU (CMP x y)) 11777 for { 11778 x := v.Args[0] 11779 y := v.Args[1] 11780 v.reset(OpARM64LessThanU) 11781 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 11782 v0.AddArg(x) 11783 v0.AddArg(y) 11784 v.AddArg(v0) 11785 return true 11786 } 11787 } 11788 func rewriteValueARM64_OpLess8(v *Value) bool { 11789 b := v.Block 11790 _ = b 11791 types := &b.Func.Config.Types 11792 _ = types 11793 // match: (Less8 x y) 11794 // cond: 11795 // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11796 for { 11797 x := v.Args[0] 11798 y := v.Args[1] 11799 v.reset(OpARM64LessThan) 11800 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11801 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11802 v1.AddArg(x) 11803 v0.AddArg(v1) 11804 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 11805 v2.AddArg(y) 11806 v0.AddArg(v2) 11807 v.AddArg(v0) 11808 return true 11809 } 11810 } 11811 func rewriteValueARM64_OpLess8U(v *Value) bool { 11812 b := v.Block 11813 _ = b 11814 types := &b.Func.Config.Types 11815 _ = types 11816 // match: (Less8U x y) 11817 // cond: 11818 // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11819 for { 11820 x := v.Args[0] 11821 y := v.Args[1] 11822 v.reset(OpARM64LessThanU) 11823 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 11824 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11825 v1.AddArg(x) 11826 v0.AddArg(v1) 11827 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 11828 v2.AddArg(y) 11829 v0.AddArg(v2) 11830 v.AddArg(v0) 11831 return true 11832 } 11833 } 11834 func rewriteValueARM64_OpLoad(v *Value) bool { 11835 // match: (Load <t> ptr mem) 11836 // cond: t.IsBoolean() 11837 // result: (MOVBUload ptr mem) 11838 for { 11839 t := v.Type 11840 ptr := v.Args[0] 11841 mem := v.Args[1] 11842 if !(t.IsBoolean()) { 11843 break 11844 } 11845 v.reset(OpARM64MOVBUload) 11846 v.AddArg(ptr) 11847 v.AddArg(mem) 11848 return true 11849 } 11850 // match: (Load <t> ptr mem) 11851 // cond: (is8BitInt(t) && isSigned(t)) 11852 // result: (MOVBload ptr mem) 11853 for { 11854 t := v.Type 11855 ptr := v.Args[0] 11856 mem := v.Args[1] 11857 if !(is8BitInt(t) && isSigned(t)) { 11858 break 11859 } 11860 v.reset(OpARM64MOVBload) 11861 v.AddArg(ptr) 11862 v.AddArg(mem) 11863 return true 11864 } 11865 // match: (Load <t> ptr mem) 11866 // cond: (is8BitInt(t) && !isSigned(t)) 11867 // result: (MOVBUload ptr mem) 11868 for { 11869 t := v.Type 11870 ptr := v.Args[0] 11871 mem := v.Args[1] 11872 if !(is8BitInt(t) && !isSigned(t)) { 11873 break 11874 } 11875 v.reset(OpARM64MOVBUload) 11876 v.AddArg(ptr) 11877 v.AddArg(mem) 11878 return true 11879 } 11880 // match: (Load <t> ptr mem) 11881 // cond: (is16BitInt(t) && isSigned(t)) 11882 // result: (MOVHload ptr mem) 11883 for { 11884 t := v.Type 11885 ptr := v.Args[0] 11886 mem := v.Args[1] 11887 if !(is16BitInt(t) && isSigned(t)) { 11888 break 11889 } 11890 v.reset(OpARM64MOVHload) 11891 v.AddArg(ptr) 11892 v.AddArg(mem) 11893 return true 11894 } 11895 // match: (Load <t> ptr mem) 11896 // cond: (is16BitInt(t) && !isSigned(t)) 11897 // result: (MOVHUload ptr mem) 11898 for { 11899 t := v.Type 11900 ptr := v.Args[0] 11901 mem := v.Args[1] 11902 if !(is16BitInt(t) && !isSigned(t)) { 11903 break 11904 } 11905 v.reset(OpARM64MOVHUload) 11906 v.AddArg(ptr) 11907 v.AddArg(mem) 11908 return true 11909 } 11910 // match: (Load <t> ptr mem) 11911 // cond: (is32BitInt(t) && isSigned(t)) 11912 // result: (MOVWload ptr mem) 11913 for { 11914 t := v.Type 11915 ptr := v.Args[0] 11916 mem := v.Args[1] 11917 if !(is32BitInt(t) && isSigned(t)) { 11918 break 11919 } 11920 v.reset(OpARM64MOVWload) 11921 v.AddArg(ptr) 11922 v.AddArg(mem) 11923 return true 11924 } 11925 // match: (Load <t> ptr mem) 11926 // cond: (is32BitInt(t) && !isSigned(t)) 11927 // result: (MOVWUload ptr mem) 11928 for { 11929 t := v.Type 11930 ptr := v.Args[0] 11931 mem := v.Args[1] 11932 if !(is32BitInt(t) && !isSigned(t)) { 11933 break 11934 } 11935 v.reset(OpARM64MOVWUload) 11936 v.AddArg(ptr) 11937 v.AddArg(mem) 11938 return true 11939 } 11940 // match: (Load <t> ptr mem) 11941 // cond: (is64BitInt(t) || isPtr(t)) 11942 // result: (MOVDload ptr mem) 11943 for { 11944 t := v.Type 11945 ptr := v.Args[0] 11946 mem := v.Args[1] 11947 if !(is64BitInt(t) || isPtr(t)) { 11948 break 11949 } 11950 v.reset(OpARM64MOVDload) 11951 v.AddArg(ptr) 11952 v.AddArg(mem) 11953 return true 11954 } 11955 // match: (Load <t> ptr mem) 11956 // cond: is32BitFloat(t) 11957 // result: (FMOVSload ptr mem) 11958 for { 11959 t := v.Type 11960 ptr := v.Args[0] 11961 mem := v.Args[1] 11962 if !(is32BitFloat(t)) { 11963 break 11964 } 11965 v.reset(OpARM64FMOVSload) 11966 v.AddArg(ptr) 11967 v.AddArg(mem) 11968 return true 11969 } 11970 // match: (Load <t> ptr mem) 11971 // cond: is64BitFloat(t) 11972 // result: (FMOVDload ptr mem) 11973 for { 11974 t := v.Type 11975 ptr := v.Args[0] 11976 mem := v.Args[1] 11977 if !(is64BitFloat(t)) { 11978 break 11979 } 11980 v.reset(OpARM64FMOVDload) 11981 v.AddArg(ptr) 11982 v.AddArg(mem) 11983 return true 11984 } 11985 return false 11986 } 11987 func rewriteValueARM64_OpLsh16x16(v *Value) bool { 11988 b := v.Block 11989 _ = b 11990 types := &b.Func.Config.Types 11991 _ = types 11992 // match: (Lsh16x16 <t> x y) 11993 // cond: 11994 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11995 for { 11996 t := v.Type 11997 x := v.Args[0] 11998 y := v.Args[1] 11999 v.reset(OpARM64CSELULT) 12000 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12001 v0.AddArg(x) 12002 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12003 v1.AddArg(y) 12004 v0.AddArg(v1) 12005 v.AddArg(v0) 12006 v2 := b.NewValue0(v.Pos, OpConst64, t) 12007 v2.AuxInt = 0 12008 v.AddArg(v2) 12009 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12010 v3.AuxInt = 64 12011 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12012 v4.AddArg(y) 12013 v3.AddArg(v4) 12014 v.AddArg(v3) 12015 return true 12016 } 12017 } 12018 func rewriteValueARM64_OpLsh16x32(v *Value) bool { 12019 b := v.Block 12020 _ = b 12021 types := &b.Func.Config.Types 12022 _ = types 12023 // match: (Lsh16x32 <t> x y) 12024 // cond: 12025 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 12026 for { 12027 t := v.Type 12028 x := v.Args[0] 12029 y := v.Args[1] 12030 v.reset(OpARM64CSELULT) 12031 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12032 v0.AddArg(x) 12033 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12034 v1.AddArg(y) 12035 v0.AddArg(v1) 12036 v.AddArg(v0) 12037 v2 := b.NewValue0(v.Pos, OpConst64, t) 12038 v2.AuxInt = 0 12039 v.AddArg(v2) 12040 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12041 v3.AuxInt = 64 12042 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12043 v4.AddArg(y) 12044 v3.AddArg(v4) 12045 v.AddArg(v3) 12046 return true 12047 } 12048 } 12049 func rewriteValueARM64_OpLsh16x64(v *Value) bool { 12050 b := v.Block 12051 _ = b 12052 // match: (Lsh16x64 x (MOVDconst [c])) 12053 // cond: uint64(c) < 16 12054 // result: (SLLconst x [c]) 12055 for { 12056 x := v.Args[0] 12057 v_1 := v.Args[1] 12058 if v_1.Op != OpARM64MOVDconst { 12059 break 12060 } 12061 c := v_1.AuxInt 12062 if !(uint64(c) < 16) { 12063 break 12064 } 12065 v.reset(OpARM64SLLconst) 12066 v.AuxInt = c 12067 v.AddArg(x) 12068 return true 12069 } 12070 // match: (Lsh16x64 _ (MOVDconst [c])) 12071 // cond: uint64(c) >= 16 12072 // result: (MOVDconst [0]) 12073 for { 12074 v_1 := v.Args[1] 12075 if v_1.Op != OpARM64MOVDconst { 12076 break 12077 } 12078 c := v_1.AuxInt 12079 if !(uint64(c) >= 16) { 12080 break 12081 } 12082 v.reset(OpARM64MOVDconst) 12083 v.AuxInt = 0 12084 return true 12085 } 12086 // match: (Lsh16x64 <t> x y) 12087 // cond: 12088 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 12089 for { 12090 t := v.Type 12091 x := v.Args[0] 12092 y := v.Args[1] 12093 v.reset(OpARM64CSELULT) 12094 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12095 v0.AddArg(x) 12096 v0.AddArg(y) 12097 v.AddArg(v0) 12098 v1 := b.NewValue0(v.Pos, OpConst64, t) 12099 v1.AuxInt = 0 12100 v.AddArg(v1) 12101 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12102 v2.AuxInt = 64 12103 v2.AddArg(y) 12104 v.AddArg(v2) 12105 return true 12106 } 12107 } 12108 func rewriteValueARM64_OpLsh16x8(v *Value) bool { 12109 b := v.Block 12110 _ = b 12111 types := &b.Func.Config.Types 12112 _ = types 12113 // match: (Lsh16x8 <t> x y) 12114 // cond: 12115 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 12116 for { 12117 t := v.Type 12118 x := v.Args[0] 12119 y := v.Args[1] 12120 v.reset(OpARM64CSELULT) 12121 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12122 v0.AddArg(x) 12123 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12124 v1.AddArg(y) 12125 v0.AddArg(v1) 12126 v.AddArg(v0) 12127 v2 := b.NewValue0(v.Pos, OpConst64, t) 12128 v2.AuxInt = 0 12129 v.AddArg(v2) 12130 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12131 v3.AuxInt = 64 12132 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12133 v4.AddArg(y) 12134 v3.AddArg(v4) 12135 v.AddArg(v3) 12136 return true 12137 } 12138 } 12139 func rewriteValueARM64_OpLsh32x16(v *Value) bool { 12140 b := v.Block 12141 _ = b 12142 types := &b.Func.Config.Types 12143 _ = types 12144 // match: (Lsh32x16 <t> x y) 12145 // cond: 12146 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 12147 for { 12148 t := v.Type 12149 x := v.Args[0] 12150 y := v.Args[1] 12151 v.reset(OpARM64CSELULT) 12152 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12153 v0.AddArg(x) 12154 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12155 v1.AddArg(y) 12156 v0.AddArg(v1) 12157 v.AddArg(v0) 12158 v2 := b.NewValue0(v.Pos, OpConst64, t) 12159 v2.AuxInt = 0 12160 v.AddArg(v2) 12161 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12162 v3.AuxInt = 64 12163 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12164 v4.AddArg(y) 12165 v3.AddArg(v4) 12166 v.AddArg(v3) 12167 return true 12168 } 12169 } 12170 func rewriteValueARM64_OpLsh32x32(v *Value) bool { 12171 b := v.Block 12172 _ = b 12173 types := &b.Func.Config.Types 12174 _ = types 12175 // match: (Lsh32x32 <t> x y) 12176 // cond: 12177 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 12178 for { 12179 t := v.Type 12180 x := v.Args[0] 12181 y := v.Args[1] 12182 v.reset(OpARM64CSELULT) 12183 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12184 v0.AddArg(x) 12185 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12186 v1.AddArg(y) 12187 v0.AddArg(v1) 12188 v.AddArg(v0) 12189 v2 := b.NewValue0(v.Pos, OpConst64, t) 12190 v2.AuxInt = 0 12191 v.AddArg(v2) 12192 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12193 v3.AuxInt = 64 12194 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12195 v4.AddArg(y) 12196 v3.AddArg(v4) 12197 v.AddArg(v3) 12198 return true 12199 } 12200 } 12201 func rewriteValueARM64_OpLsh32x64(v *Value) bool { 12202 b := v.Block 12203 _ = b 12204 // match: (Lsh32x64 x (MOVDconst [c])) 12205 // cond: uint64(c) < 32 12206 // result: (SLLconst x [c]) 12207 for { 12208 x := v.Args[0] 12209 v_1 := v.Args[1] 12210 if v_1.Op != OpARM64MOVDconst { 12211 break 12212 } 12213 c := v_1.AuxInt 12214 if !(uint64(c) < 32) { 12215 break 12216 } 12217 v.reset(OpARM64SLLconst) 12218 v.AuxInt = c 12219 v.AddArg(x) 12220 return true 12221 } 12222 // match: (Lsh32x64 _ (MOVDconst [c])) 12223 // cond: uint64(c) >= 32 12224 // result: (MOVDconst [0]) 12225 for { 12226 v_1 := v.Args[1] 12227 if v_1.Op != OpARM64MOVDconst { 12228 break 12229 } 12230 c := v_1.AuxInt 12231 if !(uint64(c) >= 32) { 12232 break 12233 } 12234 v.reset(OpARM64MOVDconst) 12235 v.AuxInt = 0 12236 return true 12237 } 12238 // match: (Lsh32x64 <t> x y) 12239 // cond: 12240 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 12241 for { 12242 t := v.Type 12243 x := v.Args[0] 12244 y := v.Args[1] 12245 v.reset(OpARM64CSELULT) 12246 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12247 v0.AddArg(x) 12248 v0.AddArg(y) 12249 v.AddArg(v0) 12250 v1 := b.NewValue0(v.Pos, OpConst64, t) 12251 v1.AuxInt = 0 12252 v.AddArg(v1) 12253 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12254 v2.AuxInt = 64 12255 v2.AddArg(y) 12256 v.AddArg(v2) 12257 return true 12258 } 12259 } 12260 func rewriteValueARM64_OpLsh32x8(v *Value) bool { 12261 b := v.Block 12262 _ = b 12263 types := &b.Func.Config.Types 12264 _ = types 12265 // match: (Lsh32x8 <t> x y) 12266 // cond: 12267 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 12268 for { 12269 t := v.Type 12270 x := v.Args[0] 12271 y := v.Args[1] 12272 v.reset(OpARM64CSELULT) 12273 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12274 v0.AddArg(x) 12275 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12276 v1.AddArg(y) 12277 v0.AddArg(v1) 12278 v.AddArg(v0) 12279 v2 := b.NewValue0(v.Pos, OpConst64, t) 12280 v2.AuxInt = 0 12281 v.AddArg(v2) 12282 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12283 v3.AuxInt = 64 12284 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12285 v4.AddArg(y) 12286 v3.AddArg(v4) 12287 v.AddArg(v3) 12288 return true 12289 } 12290 } 12291 func rewriteValueARM64_OpLsh64x16(v *Value) bool { 12292 b := v.Block 12293 _ = b 12294 types := &b.Func.Config.Types 12295 _ = types 12296 // match: (Lsh64x16 <t> x y) 12297 // cond: 12298 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 12299 for { 12300 t := v.Type 12301 x := v.Args[0] 12302 y := v.Args[1] 12303 v.reset(OpARM64CSELULT) 12304 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12305 v0.AddArg(x) 12306 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12307 v1.AddArg(y) 12308 v0.AddArg(v1) 12309 v.AddArg(v0) 12310 v2 := b.NewValue0(v.Pos, OpConst64, t) 12311 v2.AuxInt = 0 12312 v.AddArg(v2) 12313 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12314 v3.AuxInt = 64 12315 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12316 v4.AddArg(y) 12317 v3.AddArg(v4) 12318 v.AddArg(v3) 12319 return true 12320 } 12321 } 12322 func rewriteValueARM64_OpLsh64x32(v *Value) bool { 12323 b := v.Block 12324 _ = b 12325 types := &b.Func.Config.Types 12326 _ = types 12327 // match: (Lsh64x32 <t> x y) 12328 // cond: 12329 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 12330 for { 12331 t := v.Type 12332 x := v.Args[0] 12333 y := v.Args[1] 12334 v.reset(OpARM64CSELULT) 12335 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12336 v0.AddArg(x) 12337 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12338 v1.AddArg(y) 12339 v0.AddArg(v1) 12340 v.AddArg(v0) 12341 v2 := b.NewValue0(v.Pos, OpConst64, t) 12342 v2.AuxInt = 0 12343 v.AddArg(v2) 12344 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12345 v3.AuxInt = 64 12346 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12347 v4.AddArg(y) 12348 v3.AddArg(v4) 12349 v.AddArg(v3) 12350 return true 12351 } 12352 } 12353 func rewriteValueARM64_OpLsh64x64(v *Value) bool { 12354 b := v.Block 12355 _ = b 12356 // match: (Lsh64x64 x (MOVDconst [c])) 12357 // cond: uint64(c) < 64 12358 // result: (SLLconst x [c]) 12359 for { 12360 x := v.Args[0] 12361 v_1 := v.Args[1] 12362 if v_1.Op != OpARM64MOVDconst { 12363 break 12364 } 12365 c := v_1.AuxInt 12366 if !(uint64(c) < 64) { 12367 break 12368 } 12369 v.reset(OpARM64SLLconst) 12370 v.AuxInt = c 12371 v.AddArg(x) 12372 return true 12373 } 12374 // match: (Lsh64x64 _ (MOVDconst [c])) 12375 // cond: uint64(c) >= 64 12376 // result: (MOVDconst [0]) 12377 for { 12378 v_1 := v.Args[1] 12379 if v_1.Op != OpARM64MOVDconst { 12380 break 12381 } 12382 c := v_1.AuxInt 12383 if !(uint64(c) >= 64) { 12384 break 12385 } 12386 v.reset(OpARM64MOVDconst) 12387 v.AuxInt = 0 12388 return true 12389 } 12390 // match: (Lsh64x64 <t> x y) 12391 // cond: 12392 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 12393 for { 12394 t := v.Type 12395 x := v.Args[0] 12396 y := v.Args[1] 12397 v.reset(OpARM64CSELULT) 12398 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12399 v0.AddArg(x) 12400 v0.AddArg(y) 12401 v.AddArg(v0) 12402 v1 := b.NewValue0(v.Pos, OpConst64, t) 12403 v1.AuxInt = 0 12404 v.AddArg(v1) 12405 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12406 v2.AuxInt = 64 12407 v2.AddArg(y) 12408 v.AddArg(v2) 12409 return true 12410 } 12411 } 12412 func rewriteValueARM64_OpLsh64x8(v *Value) bool { 12413 b := v.Block 12414 _ = b 12415 types := &b.Func.Config.Types 12416 _ = types 12417 // match: (Lsh64x8 <t> x y) 12418 // cond: 12419 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 12420 for { 12421 t := v.Type 12422 x := v.Args[0] 12423 y := v.Args[1] 12424 v.reset(OpARM64CSELULT) 12425 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12426 v0.AddArg(x) 12427 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12428 v1.AddArg(y) 12429 v0.AddArg(v1) 12430 v.AddArg(v0) 12431 v2 := b.NewValue0(v.Pos, OpConst64, t) 12432 v2.AuxInt = 0 12433 v.AddArg(v2) 12434 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12435 v3.AuxInt = 64 12436 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12437 v4.AddArg(y) 12438 v3.AddArg(v4) 12439 v.AddArg(v3) 12440 return true 12441 } 12442 } 12443 func rewriteValueARM64_OpLsh8x16(v *Value) bool { 12444 b := v.Block 12445 _ = b 12446 types := &b.Func.Config.Types 12447 _ = types 12448 // match: (Lsh8x16 <t> x y) 12449 // cond: 12450 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 12451 for { 12452 t := v.Type 12453 x := v.Args[0] 12454 y := v.Args[1] 12455 v.reset(OpARM64CSELULT) 12456 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12457 v0.AddArg(x) 12458 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12459 v1.AddArg(y) 12460 v0.AddArg(v1) 12461 v.AddArg(v0) 12462 v2 := b.NewValue0(v.Pos, OpConst64, t) 12463 v2.AuxInt = 0 12464 v.AddArg(v2) 12465 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12466 v3.AuxInt = 64 12467 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 12468 v4.AddArg(y) 12469 v3.AddArg(v4) 12470 v.AddArg(v3) 12471 return true 12472 } 12473 } 12474 func rewriteValueARM64_OpLsh8x32(v *Value) bool { 12475 b := v.Block 12476 _ = b 12477 types := &b.Func.Config.Types 12478 _ = types 12479 // match: (Lsh8x32 <t> x y) 12480 // cond: 12481 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 12482 for { 12483 t := v.Type 12484 x := v.Args[0] 12485 y := v.Args[1] 12486 v.reset(OpARM64CSELULT) 12487 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12488 v0.AddArg(x) 12489 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12490 v1.AddArg(y) 12491 v0.AddArg(v1) 12492 v.AddArg(v0) 12493 v2 := b.NewValue0(v.Pos, OpConst64, t) 12494 v2.AuxInt = 0 12495 v.AddArg(v2) 12496 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12497 v3.AuxInt = 64 12498 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 12499 v4.AddArg(y) 12500 v3.AddArg(v4) 12501 v.AddArg(v3) 12502 return true 12503 } 12504 } 12505 func rewriteValueARM64_OpLsh8x64(v *Value) bool { 12506 b := v.Block 12507 _ = b 12508 // match: (Lsh8x64 x (MOVDconst [c])) 12509 // cond: uint64(c) < 8 12510 // result: (SLLconst x [c]) 12511 for { 12512 x := v.Args[0] 12513 v_1 := v.Args[1] 12514 if v_1.Op != OpARM64MOVDconst { 12515 break 12516 } 12517 c := v_1.AuxInt 12518 if !(uint64(c) < 8) { 12519 break 12520 } 12521 v.reset(OpARM64SLLconst) 12522 v.AuxInt = c 12523 v.AddArg(x) 12524 return true 12525 } 12526 // match: (Lsh8x64 _ (MOVDconst [c])) 12527 // cond: uint64(c) >= 8 12528 // result: (MOVDconst [0]) 12529 for { 12530 v_1 := v.Args[1] 12531 if v_1.Op != OpARM64MOVDconst { 12532 break 12533 } 12534 c := v_1.AuxInt 12535 if !(uint64(c) >= 8) { 12536 break 12537 } 12538 v.reset(OpARM64MOVDconst) 12539 v.AuxInt = 0 12540 return true 12541 } 12542 // match: (Lsh8x64 <t> x y) 12543 // cond: 12544 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 12545 for { 12546 t := v.Type 12547 x := v.Args[0] 12548 y := v.Args[1] 12549 v.reset(OpARM64CSELULT) 12550 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12551 v0.AddArg(x) 12552 v0.AddArg(y) 12553 v.AddArg(v0) 12554 v1 := b.NewValue0(v.Pos, OpConst64, t) 12555 v1.AuxInt = 0 12556 v.AddArg(v1) 12557 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12558 v2.AuxInt = 64 12559 v2.AddArg(y) 12560 v.AddArg(v2) 12561 return true 12562 } 12563 } 12564 func rewriteValueARM64_OpLsh8x8(v *Value) bool { 12565 b := v.Block 12566 _ = b 12567 types := &b.Func.Config.Types 12568 _ = types 12569 // match: (Lsh8x8 <t> x y) 12570 // cond: 12571 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 12572 for { 12573 t := v.Type 12574 x := v.Args[0] 12575 y := v.Args[1] 12576 v.reset(OpARM64CSELULT) 12577 v0 := b.NewValue0(v.Pos, OpARM64SLL, t) 12578 v0.AddArg(x) 12579 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12580 v1.AddArg(y) 12581 v0.AddArg(v1) 12582 v.AddArg(v0) 12583 v2 := b.NewValue0(v.Pos, OpConst64, t) 12584 v2.AuxInt = 0 12585 v.AddArg(v2) 12586 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 12587 v3.AuxInt = 64 12588 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 12589 v4.AddArg(y) 12590 v3.AddArg(v4) 12591 v.AddArg(v3) 12592 return true 12593 } 12594 } 12595 func rewriteValueARM64_OpMod16(v *Value) bool { 12596 b := v.Block 12597 _ = b 12598 types := &b.Func.Config.Types 12599 _ = types 12600 // match: (Mod16 x y) 12601 // cond: 12602 // result: (MODW (SignExt16to32 x) (SignExt16to32 y)) 12603 for { 12604 x := v.Args[0] 12605 y := v.Args[1] 12606 v.reset(OpARM64MODW) 12607 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 12608 v0.AddArg(x) 12609 v.AddArg(v0) 12610 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 12611 v1.AddArg(y) 12612 v.AddArg(v1) 12613 return true 12614 } 12615 } 12616 func rewriteValueARM64_OpMod16u(v *Value) bool { 12617 b := v.Block 12618 _ = b 12619 types := &b.Func.Config.Types 12620 _ = types 12621 // match: (Mod16u x y) 12622 // cond: 12623 // result: (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y)) 12624 for { 12625 x := v.Args[0] 12626 y := v.Args[1] 12627 v.reset(OpARM64UMODW) 12628 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 12629 v0.AddArg(x) 12630 v.AddArg(v0) 12631 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 12632 v1.AddArg(y) 12633 v.AddArg(v1) 12634 return true 12635 } 12636 } 12637 func rewriteValueARM64_OpMod32(v *Value) bool { 12638 // match: (Mod32 x y) 12639 // cond: 12640 // result: (MODW x y) 12641 for { 12642 x := v.Args[0] 12643 y := v.Args[1] 12644 v.reset(OpARM64MODW) 12645 v.AddArg(x) 12646 v.AddArg(y) 12647 return true 12648 } 12649 } 12650 func rewriteValueARM64_OpMod32u(v *Value) bool { 12651 // match: (Mod32u x y) 12652 // cond: 12653 // result: (UMODW x y) 12654 for { 12655 x := v.Args[0] 12656 y := v.Args[1] 12657 v.reset(OpARM64UMODW) 12658 v.AddArg(x) 12659 v.AddArg(y) 12660 return true 12661 } 12662 } 12663 func rewriteValueARM64_OpMod64(v *Value) bool { 12664 // match: (Mod64 x y) 12665 // cond: 12666 // result: (MOD x y) 12667 for { 12668 x := v.Args[0] 12669 y := v.Args[1] 12670 v.reset(OpARM64MOD) 12671 v.AddArg(x) 12672 v.AddArg(y) 12673 return true 12674 } 12675 } 12676 func rewriteValueARM64_OpMod64u(v *Value) bool { 12677 // match: (Mod64u x y) 12678 // cond: 12679 // result: (UMOD x y) 12680 for { 12681 x := v.Args[0] 12682 y := v.Args[1] 12683 v.reset(OpARM64UMOD) 12684 v.AddArg(x) 12685 v.AddArg(y) 12686 return true 12687 } 12688 } 12689 func rewriteValueARM64_OpMod8(v *Value) bool { 12690 b := v.Block 12691 _ = b 12692 types := &b.Func.Config.Types 12693 _ = types 12694 // match: (Mod8 x y) 12695 // cond: 12696 // result: (MODW (SignExt8to32 x) (SignExt8to32 y)) 12697 for { 12698 x := v.Args[0] 12699 y := v.Args[1] 12700 v.reset(OpARM64MODW) 12701 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 12702 v0.AddArg(x) 12703 v.AddArg(v0) 12704 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 12705 v1.AddArg(y) 12706 v.AddArg(v1) 12707 return true 12708 } 12709 } 12710 func rewriteValueARM64_OpMod8u(v *Value) bool { 12711 b := v.Block 12712 _ = b 12713 types := &b.Func.Config.Types 12714 _ = types 12715 // match: (Mod8u x y) 12716 // cond: 12717 // result: (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y)) 12718 for { 12719 x := v.Args[0] 12720 y := v.Args[1] 12721 v.reset(OpARM64UMODW) 12722 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 12723 v0.AddArg(x) 12724 v.AddArg(v0) 12725 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 12726 v1.AddArg(y) 12727 v.AddArg(v1) 12728 return true 12729 } 12730 } 12731 func rewriteValueARM64_OpMove(v *Value) bool { 12732 b := v.Block 12733 _ = b 12734 config := b.Func.Config 12735 _ = config 12736 types := &b.Func.Config.Types 12737 _ = types 12738 // match: (Move [0] _ _ mem) 12739 // cond: 12740 // result: mem 12741 for { 12742 if v.AuxInt != 0 { 12743 break 12744 } 12745 mem := v.Args[2] 12746 v.reset(OpCopy) 12747 v.Type = mem.Type 12748 v.AddArg(mem) 12749 return true 12750 } 12751 // match: (Move [1] dst src mem) 12752 // cond: 12753 // result: (MOVBstore dst (MOVBUload src mem) mem) 12754 for { 12755 if v.AuxInt != 1 { 12756 break 12757 } 12758 dst := v.Args[0] 12759 src := v.Args[1] 12760 mem := v.Args[2] 12761 v.reset(OpARM64MOVBstore) 12762 v.AddArg(dst) 12763 v0 := b.NewValue0(v.Pos, OpARM64MOVBUload, types.UInt8) 12764 v0.AddArg(src) 12765 v0.AddArg(mem) 12766 v.AddArg(v0) 12767 v.AddArg(mem) 12768 return true 12769 } 12770 // match: (Move [2] dst src mem) 12771 // cond: 12772 // result: (MOVHstore dst (MOVHUload src mem) mem) 12773 for { 12774 if v.AuxInt != 2 { 12775 break 12776 } 12777 dst := v.Args[0] 12778 src := v.Args[1] 12779 mem := v.Args[2] 12780 v.reset(OpARM64MOVHstore) 12781 v.AddArg(dst) 12782 v0 := b.NewValue0(v.Pos, OpARM64MOVHUload, types.UInt16) 12783 v0.AddArg(src) 12784 v0.AddArg(mem) 12785 v.AddArg(v0) 12786 v.AddArg(mem) 12787 return true 12788 } 12789 // match: (Move [4] dst src mem) 12790 // cond: 12791 // result: (MOVWstore dst (MOVWUload src mem) mem) 12792 for { 12793 if v.AuxInt != 4 { 12794 break 12795 } 12796 dst := v.Args[0] 12797 src := v.Args[1] 12798 mem := v.Args[2] 12799 v.reset(OpARM64MOVWstore) 12800 v.AddArg(dst) 12801 v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, types.UInt32) 12802 v0.AddArg(src) 12803 v0.AddArg(mem) 12804 v.AddArg(v0) 12805 v.AddArg(mem) 12806 return true 12807 } 12808 // match: (Move [8] dst src mem) 12809 // cond: 12810 // result: (MOVDstore dst (MOVDload src mem) mem) 12811 for { 12812 if v.AuxInt != 8 { 12813 break 12814 } 12815 dst := v.Args[0] 12816 src := v.Args[1] 12817 mem := v.Args[2] 12818 v.reset(OpARM64MOVDstore) 12819 v.AddArg(dst) 12820 v0 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 12821 v0.AddArg(src) 12822 v0.AddArg(mem) 12823 v.AddArg(v0) 12824 v.AddArg(mem) 12825 return true 12826 } 12827 // match: (Move [3] dst src mem) 12828 // cond: 12829 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 12830 for { 12831 if v.AuxInt != 3 { 12832 break 12833 } 12834 dst := v.Args[0] 12835 src := v.Args[1] 12836 mem := v.Args[2] 12837 v.reset(OpARM64MOVBstore) 12838 v.AuxInt = 2 12839 v.AddArg(dst) 12840 v0 := b.NewValue0(v.Pos, OpARM64MOVBUload, types.UInt8) 12841 v0.AuxInt = 2 12842 v0.AddArg(src) 12843 v0.AddArg(mem) 12844 v.AddArg(v0) 12845 v1 := b.NewValue0(v.Pos, OpARM64MOVHstore, TypeMem) 12846 v1.AddArg(dst) 12847 v2 := b.NewValue0(v.Pos, OpARM64MOVHUload, types.UInt16) 12848 v2.AddArg(src) 12849 v2.AddArg(mem) 12850 v1.AddArg(v2) 12851 v1.AddArg(mem) 12852 v.AddArg(v1) 12853 return true 12854 } 12855 // match: (Move [5] dst src mem) 12856 // cond: 12857 // result: (MOVBstore [4] dst (MOVBUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12858 for { 12859 if v.AuxInt != 5 { 12860 break 12861 } 12862 dst := v.Args[0] 12863 src := v.Args[1] 12864 mem := v.Args[2] 12865 v.reset(OpARM64MOVBstore) 12866 v.AuxInt = 4 12867 v.AddArg(dst) 12868 v0 := b.NewValue0(v.Pos, OpARM64MOVBUload, types.UInt8) 12869 v0.AuxInt = 4 12870 v0.AddArg(src) 12871 v0.AddArg(mem) 12872 v.AddArg(v0) 12873 v1 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 12874 v1.AddArg(dst) 12875 v2 := b.NewValue0(v.Pos, OpARM64MOVWUload, types.UInt32) 12876 v2.AddArg(src) 12877 v2.AddArg(mem) 12878 v1.AddArg(v2) 12879 v1.AddArg(mem) 12880 v.AddArg(v1) 12881 return true 12882 } 12883 // match: (Move [6] dst src mem) 12884 // cond: 12885 // result: (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12886 for { 12887 if v.AuxInt != 6 { 12888 break 12889 } 12890 dst := v.Args[0] 12891 src := v.Args[1] 12892 mem := v.Args[2] 12893 v.reset(OpARM64MOVHstore) 12894 v.AuxInt = 4 12895 v.AddArg(dst) 12896 v0 := b.NewValue0(v.Pos, OpARM64MOVHUload, types.UInt16) 12897 v0.AuxInt = 4 12898 v0.AddArg(src) 12899 v0.AddArg(mem) 12900 v.AddArg(v0) 12901 v1 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 12902 v1.AddArg(dst) 12903 v2 := b.NewValue0(v.Pos, OpARM64MOVWUload, types.UInt32) 12904 v2.AddArg(src) 12905 v2.AddArg(mem) 12906 v1.AddArg(v2) 12907 v1.AddArg(mem) 12908 v.AddArg(v1) 12909 return true 12910 } 12911 // match: (Move [7] dst src mem) 12912 // cond: 12913 // result: (MOVBstore [6] dst (MOVBUload [6] src mem) (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem))) 12914 for { 12915 if v.AuxInt != 7 { 12916 break 12917 } 12918 dst := v.Args[0] 12919 src := v.Args[1] 12920 mem := v.Args[2] 12921 v.reset(OpARM64MOVBstore) 12922 v.AuxInt = 6 12923 v.AddArg(dst) 12924 v0 := b.NewValue0(v.Pos, OpARM64MOVBUload, types.UInt8) 12925 v0.AuxInt = 6 12926 v0.AddArg(src) 12927 v0.AddArg(mem) 12928 v.AddArg(v0) 12929 v1 := b.NewValue0(v.Pos, OpARM64MOVHstore, TypeMem) 12930 v1.AuxInt = 4 12931 v1.AddArg(dst) 12932 v2 := b.NewValue0(v.Pos, OpARM64MOVHUload, types.UInt16) 12933 v2.AuxInt = 4 12934 v2.AddArg(src) 12935 v2.AddArg(mem) 12936 v1.AddArg(v2) 12937 v3 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 12938 v3.AddArg(dst) 12939 v4 := b.NewValue0(v.Pos, OpARM64MOVWUload, types.UInt32) 12940 v4.AddArg(src) 12941 v4.AddArg(mem) 12942 v3.AddArg(v4) 12943 v3.AddArg(mem) 12944 v1.AddArg(v3) 12945 v.AddArg(v1) 12946 return true 12947 } 12948 // match: (Move [12] dst src mem) 12949 // cond: 12950 // result: (MOVWstore [8] dst (MOVWUload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12951 for { 12952 if v.AuxInt != 12 { 12953 break 12954 } 12955 dst := v.Args[0] 12956 src := v.Args[1] 12957 mem := v.Args[2] 12958 v.reset(OpARM64MOVWstore) 12959 v.AuxInt = 8 12960 v.AddArg(dst) 12961 v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, types.UInt32) 12962 v0.AuxInt = 8 12963 v0.AddArg(src) 12964 v0.AddArg(mem) 12965 v.AddArg(v0) 12966 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 12967 v1.AddArg(dst) 12968 v2 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 12969 v2.AddArg(src) 12970 v2.AddArg(mem) 12971 v1.AddArg(v2) 12972 v1.AddArg(mem) 12973 v.AddArg(v1) 12974 return true 12975 } 12976 // match: (Move [16] dst src mem) 12977 // cond: 12978 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12979 for { 12980 if v.AuxInt != 16 { 12981 break 12982 } 12983 dst := v.Args[0] 12984 src := v.Args[1] 12985 mem := v.Args[2] 12986 v.reset(OpARM64MOVDstore) 12987 v.AuxInt = 8 12988 v.AddArg(dst) 12989 v0 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 12990 v0.AuxInt = 8 12991 v0.AddArg(src) 12992 v0.AddArg(mem) 12993 v.AddArg(v0) 12994 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 12995 v1.AddArg(dst) 12996 v2 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 12997 v2.AddArg(src) 12998 v2.AddArg(mem) 12999 v1.AddArg(v2) 13000 v1.AddArg(mem) 13001 v.AddArg(v1) 13002 return true 13003 } 13004 // match: (Move [24] dst src mem) 13005 // cond: 13006 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 13007 for { 13008 if v.AuxInt != 24 { 13009 break 13010 } 13011 dst := v.Args[0] 13012 src := v.Args[1] 13013 mem := v.Args[2] 13014 v.reset(OpARM64MOVDstore) 13015 v.AuxInt = 16 13016 v.AddArg(dst) 13017 v0 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 13018 v0.AuxInt = 16 13019 v0.AddArg(src) 13020 v0.AddArg(mem) 13021 v.AddArg(v0) 13022 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 13023 v1.AuxInt = 8 13024 v1.AddArg(dst) 13025 v2 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 13026 v2.AuxInt = 8 13027 v2.AddArg(src) 13028 v2.AddArg(mem) 13029 v1.AddArg(v2) 13030 v3 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 13031 v3.AddArg(dst) 13032 v4 := b.NewValue0(v.Pos, OpARM64MOVDload, types.UInt64) 13033 v4.AddArg(src) 13034 v4.AddArg(mem) 13035 v3.AddArg(v4) 13036 v3.AddArg(mem) 13037 v1.AddArg(v3) 13038 v.AddArg(v1) 13039 return true 13040 } 13041 // match: (Move [s] dst src mem) 13042 // cond: s%8 != 0 && s > 8 13043 // result: (Move [s%8] (OffPtr <dst.Type> dst [s-s%8]) (OffPtr <src.Type> src [s-s%8]) (Move [s-s%8] dst src mem)) 13044 for { 13045 s := v.AuxInt 13046 dst := v.Args[0] 13047 src := v.Args[1] 13048 mem := v.Args[2] 13049 if !(s%8 != 0 && s > 8) { 13050 break 13051 } 13052 v.reset(OpMove) 13053 v.AuxInt = s % 8 13054 v0 := b.NewValue0(v.Pos, OpOffPtr, dst.Type) 13055 v0.AuxInt = s - s%8 13056 v0.AddArg(dst) 13057 v.AddArg(v0) 13058 v1 := b.NewValue0(v.Pos, OpOffPtr, src.Type) 13059 v1.AuxInt = s - s%8 13060 v1.AddArg(src) 13061 v.AddArg(v1) 13062 v2 := b.NewValue0(v.Pos, OpMove, TypeMem) 13063 v2.AuxInt = s - s%8 13064 v2.AddArg(dst) 13065 v2.AddArg(src) 13066 v2.AddArg(mem) 13067 v.AddArg(v2) 13068 return true 13069 } 13070 // match: (Move [s] dst src mem) 13071 // cond: s%8 == 0 && s > 24 && s <= 8*128 && !config.noDuffDevice 13072 // result: (DUFFCOPY [8 * (128 - int64(s/8))] dst src mem) 13073 for { 13074 s := v.AuxInt 13075 dst := v.Args[0] 13076 src := v.Args[1] 13077 mem := v.Args[2] 13078 if !(s%8 == 0 && s > 24 && s <= 8*128 && !config.noDuffDevice) { 13079 break 13080 } 13081 v.reset(OpARM64DUFFCOPY) 13082 v.AuxInt = 8 * (128 - int64(s/8)) 13083 v.AddArg(dst) 13084 v.AddArg(src) 13085 v.AddArg(mem) 13086 return true 13087 } 13088 // match: (Move [s] dst src mem) 13089 // cond: s > 24 && s%8 == 0 13090 // result: (LoweredMove dst src (ADDconst <src.Type> src [s-8]) mem) 13091 for { 13092 s := v.AuxInt 13093 dst := v.Args[0] 13094 src := v.Args[1] 13095 mem := v.Args[2] 13096 if !(s > 24 && s%8 == 0) { 13097 break 13098 } 13099 v.reset(OpARM64LoweredMove) 13100 v.AddArg(dst) 13101 v.AddArg(src) 13102 v0 := b.NewValue0(v.Pos, OpARM64ADDconst, src.Type) 13103 v0.AuxInt = s - 8 13104 v0.AddArg(src) 13105 v.AddArg(v0) 13106 v.AddArg(mem) 13107 return true 13108 } 13109 return false 13110 } 13111 func rewriteValueARM64_OpMul16(v *Value) bool { 13112 // match: (Mul16 x y) 13113 // cond: 13114 // result: (MULW x y) 13115 for { 13116 x := v.Args[0] 13117 y := v.Args[1] 13118 v.reset(OpARM64MULW) 13119 v.AddArg(x) 13120 v.AddArg(y) 13121 return true 13122 } 13123 } 13124 func rewriteValueARM64_OpMul32(v *Value) bool { 13125 // match: (Mul32 x y) 13126 // cond: 13127 // result: (MULW x y) 13128 for { 13129 x := v.Args[0] 13130 y := v.Args[1] 13131 v.reset(OpARM64MULW) 13132 v.AddArg(x) 13133 v.AddArg(y) 13134 return true 13135 } 13136 } 13137 func rewriteValueARM64_OpMul32F(v *Value) bool { 13138 // match: (Mul32F x y) 13139 // cond: 13140 // result: (FMULS x y) 13141 for { 13142 x := v.Args[0] 13143 y := v.Args[1] 13144 v.reset(OpARM64FMULS) 13145 v.AddArg(x) 13146 v.AddArg(y) 13147 return true 13148 } 13149 } 13150 func rewriteValueARM64_OpMul64(v *Value) bool { 13151 // match: (Mul64 x y) 13152 // cond: 13153 // result: (MUL x y) 13154 for { 13155 x := v.Args[0] 13156 y := v.Args[1] 13157 v.reset(OpARM64MUL) 13158 v.AddArg(x) 13159 v.AddArg(y) 13160 return true 13161 } 13162 } 13163 func rewriteValueARM64_OpMul64F(v *Value) bool { 13164 // match: (Mul64F x y) 13165 // cond: 13166 // result: (FMULD x y) 13167 for { 13168 x := v.Args[0] 13169 y := v.Args[1] 13170 v.reset(OpARM64FMULD) 13171 v.AddArg(x) 13172 v.AddArg(y) 13173 return true 13174 } 13175 } 13176 func rewriteValueARM64_OpMul8(v *Value) bool { 13177 // match: (Mul8 x y) 13178 // cond: 13179 // result: (MULW x y) 13180 for { 13181 x := v.Args[0] 13182 y := v.Args[1] 13183 v.reset(OpARM64MULW) 13184 v.AddArg(x) 13185 v.AddArg(y) 13186 return true 13187 } 13188 } 13189 func rewriteValueARM64_OpNeg16(v *Value) bool { 13190 // match: (Neg16 x) 13191 // cond: 13192 // result: (NEG x) 13193 for { 13194 x := v.Args[0] 13195 v.reset(OpARM64NEG) 13196 v.AddArg(x) 13197 return true 13198 } 13199 } 13200 func rewriteValueARM64_OpNeg32(v *Value) bool { 13201 // match: (Neg32 x) 13202 // cond: 13203 // result: (NEG x) 13204 for { 13205 x := v.Args[0] 13206 v.reset(OpARM64NEG) 13207 v.AddArg(x) 13208 return true 13209 } 13210 } 13211 func rewriteValueARM64_OpNeg32F(v *Value) bool { 13212 // match: (Neg32F x) 13213 // cond: 13214 // result: (FNEGS x) 13215 for { 13216 x := v.Args[0] 13217 v.reset(OpARM64FNEGS) 13218 v.AddArg(x) 13219 return true 13220 } 13221 } 13222 func rewriteValueARM64_OpNeg64(v *Value) bool { 13223 // match: (Neg64 x) 13224 // cond: 13225 // result: (NEG x) 13226 for { 13227 x := v.Args[0] 13228 v.reset(OpARM64NEG) 13229 v.AddArg(x) 13230 return true 13231 } 13232 } 13233 func rewriteValueARM64_OpNeg64F(v *Value) bool { 13234 // match: (Neg64F x) 13235 // cond: 13236 // result: (FNEGD x) 13237 for { 13238 x := v.Args[0] 13239 v.reset(OpARM64FNEGD) 13240 v.AddArg(x) 13241 return true 13242 } 13243 } 13244 func rewriteValueARM64_OpNeg8(v *Value) bool { 13245 // match: (Neg8 x) 13246 // cond: 13247 // result: (NEG x) 13248 for { 13249 x := v.Args[0] 13250 v.reset(OpARM64NEG) 13251 v.AddArg(x) 13252 return true 13253 } 13254 } 13255 func rewriteValueARM64_OpNeq16(v *Value) bool { 13256 b := v.Block 13257 _ = b 13258 types := &b.Func.Config.Types 13259 _ = types 13260 // match: (Neq16 x y) 13261 // cond: 13262 // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 13263 for { 13264 x := v.Args[0] 13265 y := v.Args[1] 13266 v.reset(OpARM64NotEqual) 13267 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 13268 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13269 v1.AddArg(x) 13270 v0.AddArg(v1) 13271 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13272 v2.AddArg(y) 13273 v0.AddArg(v2) 13274 v.AddArg(v0) 13275 return true 13276 } 13277 } 13278 func rewriteValueARM64_OpNeq32(v *Value) bool { 13279 b := v.Block 13280 _ = b 13281 // match: (Neq32 x y) 13282 // cond: 13283 // result: (NotEqual (CMPW x y)) 13284 for { 13285 x := v.Args[0] 13286 y := v.Args[1] 13287 v.reset(OpARM64NotEqual) 13288 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 13289 v0.AddArg(x) 13290 v0.AddArg(y) 13291 v.AddArg(v0) 13292 return true 13293 } 13294 } 13295 func rewriteValueARM64_OpNeq32F(v *Value) bool { 13296 b := v.Block 13297 _ = b 13298 // match: (Neq32F x y) 13299 // cond: 13300 // result: (NotEqual (FCMPS x y)) 13301 for { 13302 x := v.Args[0] 13303 y := v.Args[1] 13304 v.reset(OpARM64NotEqual) 13305 v0 := b.NewValue0(v.Pos, OpARM64FCMPS, TypeFlags) 13306 v0.AddArg(x) 13307 v0.AddArg(y) 13308 v.AddArg(v0) 13309 return true 13310 } 13311 } 13312 func rewriteValueARM64_OpNeq64(v *Value) bool { 13313 b := v.Block 13314 _ = b 13315 // match: (Neq64 x y) 13316 // cond: 13317 // result: (NotEqual (CMP x y)) 13318 for { 13319 x := v.Args[0] 13320 y := v.Args[1] 13321 v.reset(OpARM64NotEqual) 13322 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 13323 v0.AddArg(x) 13324 v0.AddArg(y) 13325 v.AddArg(v0) 13326 return true 13327 } 13328 } 13329 func rewriteValueARM64_OpNeq64F(v *Value) bool { 13330 b := v.Block 13331 _ = b 13332 // match: (Neq64F x y) 13333 // cond: 13334 // result: (NotEqual (FCMPD x y)) 13335 for { 13336 x := v.Args[0] 13337 y := v.Args[1] 13338 v.reset(OpARM64NotEqual) 13339 v0 := b.NewValue0(v.Pos, OpARM64FCMPD, TypeFlags) 13340 v0.AddArg(x) 13341 v0.AddArg(y) 13342 v.AddArg(v0) 13343 return true 13344 } 13345 } 13346 func rewriteValueARM64_OpNeq8(v *Value) bool { 13347 b := v.Block 13348 _ = b 13349 types := &b.Func.Config.Types 13350 _ = types 13351 // match: (Neq8 x y) 13352 // cond: 13353 // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 13354 for { 13355 x := v.Args[0] 13356 y := v.Args[1] 13357 v.reset(OpARM64NotEqual) 13358 v0 := b.NewValue0(v.Pos, OpARM64CMPW, TypeFlags) 13359 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13360 v1.AddArg(x) 13361 v0.AddArg(v1) 13362 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13363 v2.AddArg(y) 13364 v0.AddArg(v2) 13365 v.AddArg(v0) 13366 return true 13367 } 13368 } 13369 func rewriteValueARM64_OpNeqB(v *Value) bool { 13370 // match: (NeqB x y) 13371 // cond: 13372 // result: (XOR x y) 13373 for { 13374 x := v.Args[0] 13375 y := v.Args[1] 13376 v.reset(OpARM64XOR) 13377 v.AddArg(x) 13378 v.AddArg(y) 13379 return true 13380 } 13381 } 13382 func rewriteValueARM64_OpNeqPtr(v *Value) bool { 13383 b := v.Block 13384 _ = b 13385 // match: (NeqPtr x y) 13386 // cond: 13387 // result: (NotEqual (CMP x y)) 13388 for { 13389 x := v.Args[0] 13390 y := v.Args[1] 13391 v.reset(OpARM64NotEqual) 13392 v0 := b.NewValue0(v.Pos, OpARM64CMP, TypeFlags) 13393 v0.AddArg(x) 13394 v0.AddArg(y) 13395 v.AddArg(v0) 13396 return true 13397 } 13398 } 13399 func rewriteValueARM64_OpNilCheck(v *Value) bool { 13400 // match: (NilCheck ptr mem) 13401 // cond: 13402 // result: (LoweredNilCheck ptr mem) 13403 for { 13404 ptr := v.Args[0] 13405 mem := v.Args[1] 13406 v.reset(OpARM64LoweredNilCheck) 13407 v.AddArg(ptr) 13408 v.AddArg(mem) 13409 return true 13410 } 13411 } 13412 func rewriteValueARM64_OpNot(v *Value) bool { 13413 b := v.Block 13414 _ = b 13415 types := &b.Func.Config.Types 13416 _ = types 13417 // match: (Not x) 13418 // cond: 13419 // result: (XOR (MOVDconst [1]) x) 13420 for { 13421 x := v.Args[0] 13422 v.reset(OpARM64XOR) 13423 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 13424 v0.AuxInt = 1 13425 v.AddArg(v0) 13426 v.AddArg(x) 13427 return true 13428 } 13429 } 13430 func rewriteValueARM64_OpOffPtr(v *Value) bool { 13431 // match: (OffPtr [off] ptr:(SP)) 13432 // cond: 13433 // result: (MOVDaddr [off] ptr) 13434 for { 13435 off := v.AuxInt 13436 ptr := v.Args[0] 13437 if ptr.Op != OpSP { 13438 break 13439 } 13440 v.reset(OpARM64MOVDaddr) 13441 v.AuxInt = off 13442 v.AddArg(ptr) 13443 return true 13444 } 13445 // match: (OffPtr [off] ptr) 13446 // cond: 13447 // result: (ADDconst [off] ptr) 13448 for { 13449 off := v.AuxInt 13450 ptr := v.Args[0] 13451 v.reset(OpARM64ADDconst) 13452 v.AuxInt = off 13453 v.AddArg(ptr) 13454 return true 13455 } 13456 } 13457 func rewriteValueARM64_OpOr16(v *Value) bool { 13458 // match: (Or16 x y) 13459 // cond: 13460 // result: (OR x y) 13461 for { 13462 x := v.Args[0] 13463 y := v.Args[1] 13464 v.reset(OpARM64OR) 13465 v.AddArg(x) 13466 v.AddArg(y) 13467 return true 13468 } 13469 } 13470 func rewriteValueARM64_OpOr32(v *Value) bool { 13471 // match: (Or32 x y) 13472 // cond: 13473 // result: (OR x y) 13474 for { 13475 x := v.Args[0] 13476 y := v.Args[1] 13477 v.reset(OpARM64OR) 13478 v.AddArg(x) 13479 v.AddArg(y) 13480 return true 13481 } 13482 } 13483 func rewriteValueARM64_OpOr64(v *Value) bool { 13484 // match: (Or64 x y) 13485 // cond: 13486 // result: (OR x y) 13487 for { 13488 x := v.Args[0] 13489 y := v.Args[1] 13490 v.reset(OpARM64OR) 13491 v.AddArg(x) 13492 v.AddArg(y) 13493 return true 13494 } 13495 } 13496 func rewriteValueARM64_OpOr8(v *Value) bool { 13497 // match: (Or8 x y) 13498 // cond: 13499 // result: (OR x y) 13500 for { 13501 x := v.Args[0] 13502 y := v.Args[1] 13503 v.reset(OpARM64OR) 13504 v.AddArg(x) 13505 v.AddArg(y) 13506 return true 13507 } 13508 } 13509 func rewriteValueARM64_OpOrB(v *Value) bool { 13510 // match: (OrB x y) 13511 // cond: 13512 // result: (OR x y) 13513 for { 13514 x := v.Args[0] 13515 y := v.Args[1] 13516 v.reset(OpARM64OR) 13517 v.AddArg(x) 13518 v.AddArg(y) 13519 return true 13520 } 13521 } 13522 func rewriteValueARM64_OpRound32F(v *Value) bool { 13523 // match: (Round32F x) 13524 // cond: 13525 // result: x 13526 for { 13527 x := v.Args[0] 13528 v.reset(OpCopy) 13529 v.Type = x.Type 13530 v.AddArg(x) 13531 return true 13532 } 13533 } 13534 func rewriteValueARM64_OpRound64F(v *Value) bool { 13535 // match: (Round64F x) 13536 // cond: 13537 // result: x 13538 for { 13539 x := v.Args[0] 13540 v.reset(OpCopy) 13541 v.Type = x.Type 13542 v.AddArg(x) 13543 return true 13544 } 13545 } 13546 func rewriteValueARM64_OpRsh16Ux16(v *Value) bool { 13547 b := v.Block 13548 _ = b 13549 types := &b.Func.Config.Types 13550 _ = types 13551 // match: (Rsh16Ux16 <t> x y) 13552 // cond: 13553 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13554 for { 13555 t := v.Type 13556 x := v.Args[0] 13557 y := v.Args[1] 13558 v.reset(OpARM64CSELULT) 13559 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13560 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13561 v1.AddArg(x) 13562 v0.AddArg(v1) 13563 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13564 v2.AddArg(y) 13565 v0.AddArg(v2) 13566 v.AddArg(v0) 13567 v3 := b.NewValue0(v.Pos, OpConst64, t) 13568 v3.AuxInt = 0 13569 v.AddArg(v3) 13570 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13571 v4.AuxInt = 64 13572 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13573 v5.AddArg(y) 13574 v4.AddArg(v5) 13575 v.AddArg(v4) 13576 return true 13577 } 13578 } 13579 func rewriteValueARM64_OpRsh16Ux32(v *Value) bool { 13580 b := v.Block 13581 _ = b 13582 types := &b.Func.Config.Types 13583 _ = types 13584 // match: (Rsh16Ux32 <t> x y) 13585 // cond: 13586 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13587 for { 13588 t := v.Type 13589 x := v.Args[0] 13590 y := v.Args[1] 13591 v.reset(OpARM64CSELULT) 13592 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13593 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13594 v1.AddArg(x) 13595 v0.AddArg(v1) 13596 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13597 v2.AddArg(y) 13598 v0.AddArg(v2) 13599 v.AddArg(v0) 13600 v3 := b.NewValue0(v.Pos, OpConst64, t) 13601 v3.AuxInt = 0 13602 v.AddArg(v3) 13603 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13604 v4.AuxInt = 64 13605 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13606 v5.AddArg(y) 13607 v4.AddArg(v5) 13608 v.AddArg(v4) 13609 return true 13610 } 13611 } 13612 func rewriteValueARM64_OpRsh16Ux64(v *Value) bool { 13613 b := v.Block 13614 _ = b 13615 types := &b.Func.Config.Types 13616 _ = types 13617 // match: (Rsh16Ux64 x (MOVDconst [c])) 13618 // cond: uint64(c) < 16 13619 // result: (SRLconst (ZeroExt16to64 x) [c]) 13620 for { 13621 x := v.Args[0] 13622 v_1 := v.Args[1] 13623 if v_1.Op != OpARM64MOVDconst { 13624 break 13625 } 13626 c := v_1.AuxInt 13627 if !(uint64(c) < 16) { 13628 break 13629 } 13630 v.reset(OpARM64SRLconst) 13631 v.AuxInt = c 13632 v0 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13633 v0.AddArg(x) 13634 v.AddArg(v0) 13635 return true 13636 } 13637 // match: (Rsh16Ux64 _ (MOVDconst [c])) 13638 // cond: uint64(c) >= 16 13639 // result: (MOVDconst [0]) 13640 for { 13641 v_1 := v.Args[1] 13642 if v_1.Op != OpARM64MOVDconst { 13643 break 13644 } 13645 c := v_1.AuxInt 13646 if !(uint64(c) >= 16) { 13647 break 13648 } 13649 v.reset(OpARM64MOVDconst) 13650 v.AuxInt = 0 13651 return true 13652 } 13653 // match: (Rsh16Ux64 <t> x y) 13654 // cond: 13655 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13656 for { 13657 t := v.Type 13658 x := v.Args[0] 13659 y := v.Args[1] 13660 v.reset(OpARM64CSELULT) 13661 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13662 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13663 v1.AddArg(x) 13664 v0.AddArg(v1) 13665 v0.AddArg(y) 13666 v.AddArg(v0) 13667 v2 := b.NewValue0(v.Pos, OpConst64, t) 13668 v2.AuxInt = 0 13669 v.AddArg(v2) 13670 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13671 v3.AuxInt = 64 13672 v3.AddArg(y) 13673 v.AddArg(v3) 13674 return true 13675 } 13676 } 13677 func rewriteValueARM64_OpRsh16Ux8(v *Value) bool { 13678 b := v.Block 13679 _ = b 13680 types := &b.Func.Config.Types 13681 _ = types 13682 // match: (Rsh16Ux8 <t> x y) 13683 // cond: 13684 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13685 for { 13686 t := v.Type 13687 x := v.Args[0] 13688 y := v.Args[1] 13689 v.reset(OpARM64CSELULT) 13690 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13691 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13692 v1.AddArg(x) 13693 v0.AddArg(v1) 13694 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 13695 v2.AddArg(y) 13696 v0.AddArg(v2) 13697 v.AddArg(v0) 13698 v3 := b.NewValue0(v.Pos, OpConst64, t) 13699 v3.AuxInt = 0 13700 v.AddArg(v3) 13701 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13702 v4.AuxInt = 64 13703 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 13704 v5.AddArg(y) 13705 v4.AddArg(v5) 13706 v.AddArg(v4) 13707 return true 13708 } 13709 } 13710 func rewriteValueARM64_OpRsh16x16(v *Value) bool { 13711 b := v.Block 13712 _ = b 13713 types := &b.Func.Config.Types 13714 _ = types 13715 // match: (Rsh16x16 x y) 13716 // cond: 13717 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13718 for { 13719 x := v.Args[0] 13720 y := v.Args[1] 13721 v.reset(OpARM64SRA) 13722 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13723 v0.AddArg(x) 13724 v.AddArg(v0) 13725 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 13726 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13727 v2.AddArg(y) 13728 v1.AddArg(v2) 13729 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 13730 v3.AuxInt = 63 13731 v1.AddArg(v3) 13732 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13733 v4.AuxInt = 64 13734 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13735 v5.AddArg(y) 13736 v4.AddArg(v5) 13737 v1.AddArg(v4) 13738 v.AddArg(v1) 13739 return true 13740 } 13741 } 13742 func rewriteValueARM64_OpRsh16x32(v *Value) bool { 13743 b := v.Block 13744 _ = b 13745 types := &b.Func.Config.Types 13746 _ = types 13747 // match: (Rsh16x32 x y) 13748 // cond: 13749 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13750 for { 13751 x := v.Args[0] 13752 y := v.Args[1] 13753 v.reset(OpARM64SRA) 13754 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13755 v0.AddArg(x) 13756 v.AddArg(v0) 13757 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 13758 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13759 v2.AddArg(y) 13760 v1.AddArg(v2) 13761 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 13762 v3.AuxInt = 63 13763 v1.AddArg(v3) 13764 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13765 v4.AuxInt = 64 13766 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13767 v5.AddArg(y) 13768 v4.AddArg(v5) 13769 v1.AddArg(v4) 13770 v.AddArg(v1) 13771 return true 13772 } 13773 } 13774 func rewriteValueARM64_OpRsh16x64(v *Value) bool { 13775 b := v.Block 13776 _ = b 13777 types := &b.Func.Config.Types 13778 _ = types 13779 // match: (Rsh16x64 x (MOVDconst [c])) 13780 // cond: uint64(c) < 16 13781 // result: (SRAconst (SignExt16to64 x) [c]) 13782 for { 13783 x := v.Args[0] 13784 v_1 := v.Args[1] 13785 if v_1.Op != OpARM64MOVDconst { 13786 break 13787 } 13788 c := v_1.AuxInt 13789 if !(uint64(c) < 16) { 13790 break 13791 } 13792 v.reset(OpARM64SRAconst) 13793 v.AuxInt = c 13794 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13795 v0.AddArg(x) 13796 v.AddArg(v0) 13797 return true 13798 } 13799 // match: (Rsh16x64 x (MOVDconst [c])) 13800 // cond: uint64(c) >= 16 13801 // result: (SRAconst (SignExt16to64 x) [63]) 13802 for { 13803 x := v.Args[0] 13804 v_1 := v.Args[1] 13805 if v_1.Op != OpARM64MOVDconst { 13806 break 13807 } 13808 c := v_1.AuxInt 13809 if !(uint64(c) >= 16) { 13810 break 13811 } 13812 v.reset(OpARM64SRAconst) 13813 v.AuxInt = 63 13814 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13815 v0.AddArg(x) 13816 v.AddArg(v0) 13817 return true 13818 } 13819 // match: (Rsh16x64 x y) 13820 // cond: 13821 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13822 for { 13823 x := v.Args[0] 13824 y := v.Args[1] 13825 v.reset(OpARM64SRA) 13826 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13827 v0.AddArg(x) 13828 v.AddArg(v0) 13829 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 13830 v1.AddArg(y) 13831 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 13832 v2.AuxInt = 63 13833 v1.AddArg(v2) 13834 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13835 v3.AuxInt = 64 13836 v3.AddArg(y) 13837 v1.AddArg(v3) 13838 v.AddArg(v1) 13839 return true 13840 } 13841 } 13842 func rewriteValueARM64_OpRsh16x8(v *Value) bool { 13843 b := v.Block 13844 _ = b 13845 types := &b.Func.Config.Types 13846 _ = types 13847 // match: (Rsh16x8 x y) 13848 // cond: 13849 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13850 for { 13851 x := v.Args[0] 13852 y := v.Args[1] 13853 v.reset(OpARM64SRA) 13854 v0 := b.NewValue0(v.Pos, OpSignExt16to64, types.Int64) 13855 v0.AddArg(x) 13856 v.AddArg(v0) 13857 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 13858 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 13859 v2.AddArg(y) 13860 v1.AddArg(v2) 13861 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 13862 v3.AuxInt = 63 13863 v1.AddArg(v3) 13864 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13865 v4.AuxInt = 64 13866 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 13867 v5.AddArg(y) 13868 v4.AddArg(v5) 13869 v1.AddArg(v4) 13870 v.AddArg(v1) 13871 return true 13872 } 13873 } 13874 func rewriteValueARM64_OpRsh32Ux16(v *Value) bool { 13875 b := v.Block 13876 _ = b 13877 types := &b.Func.Config.Types 13878 _ = types 13879 // match: (Rsh32Ux16 <t> x y) 13880 // cond: 13881 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13882 for { 13883 t := v.Type 13884 x := v.Args[0] 13885 y := v.Args[1] 13886 v.reset(OpARM64CSELULT) 13887 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13888 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13889 v1.AddArg(x) 13890 v0.AddArg(v1) 13891 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13892 v2.AddArg(y) 13893 v0.AddArg(v2) 13894 v.AddArg(v0) 13895 v3 := b.NewValue0(v.Pos, OpConst64, t) 13896 v3.AuxInt = 0 13897 v.AddArg(v3) 13898 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13899 v4.AuxInt = 64 13900 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 13901 v5.AddArg(y) 13902 v4.AddArg(v5) 13903 v.AddArg(v4) 13904 return true 13905 } 13906 } 13907 func rewriteValueARM64_OpRsh32Ux32(v *Value) bool { 13908 b := v.Block 13909 _ = b 13910 types := &b.Func.Config.Types 13911 _ = types 13912 // match: (Rsh32Ux32 <t> x y) 13913 // cond: 13914 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13915 for { 13916 t := v.Type 13917 x := v.Args[0] 13918 y := v.Args[1] 13919 v.reset(OpARM64CSELULT) 13920 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13921 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13922 v1.AddArg(x) 13923 v0.AddArg(v1) 13924 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13925 v2.AddArg(y) 13926 v0.AddArg(v2) 13927 v.AddArg(v0) 13928 v3 := b.NewValue0(v.Pos, OpConst64, t) 13929 v3.AuxInt = 0 13930 v.AddArg(v3) 13931 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13932 v4.AuxInt = 64 13933 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13934 v5.AddArg(y) 13935 v4.AddArg(v5) 13936 v.AddArg(v4) 13937 return true 13938 } 13939 } 13940 func rewriteValueARM64_OpRsh32Ux64(v *Value) bool { 13941 b := v.Block 13942 _ = b 13943 types := &b.Func.Config.Types 13944 _ = types 13945 // match: (Rsh32Ux64 x (MOVDconst [c])) 13946 // cond: uint64(c) < 32 13947 // result: (SRLconst (ZeroExt32to64 x) [c]) 13948 for { 13949 x := v.Args[0] 13950 v_1 := v.Args[1] 13951 if v_1.Op != OpARM64MOVDconst { 13952 break 13953 } 13954 c := v_1.AuxInt 13955 if !(uint64(c) < 32) { 13956 break 13957 } 13958 v.reset(OpARM64SRLconst) 13959 v.AuxInt = c 13960 v0 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13961 v0.AddArg(x) 13962 v.AddArg(v0) 13963 return true 13964 } 13965 // match: (Rsh32Ux64 _ (MOVDconst [c])) 13966 // cond: uint64(c) >= 32 13967 // result: (MOVDconst [0]) 13968 for { 13969 v_1 := v.Args[1] 13970 if v_1.Op != OpARM64MOVDconst { 13971 break 13972 } 13973 c := v_1.AuxInt 13974 if !(uint64(c) >= 32) { 13975 break 13976 } 13977 v.reset(OpARM64MOVDconst) 13978 v.AuxInt = 0 13979 return true 13980 } 13981 // match: (Rsh32Ux64 <t> x y) 13982 // cond: 13983 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13984 for { 13985 t := v.Type 13986 x := v.Args[0] 13987 y := v.Args[1] 13988 v.reset(OpARM64CSELULT) 13989 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 13990 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 13991 v1.AddArg(x) 13992 v0.AddArg(v1) 13993 v0.AddArg(y) 13994 v.AddArg(v0) 13995 v2 := b.NewValue0(v.Pos, OpConst64, t) 13996 v2.AuxInt = 0 13997 v.AddArg(v2) 13998 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 13999 v3.AuxInt = 64 14000 v3.AddArg(y) 14001 v.AddArg(v3) 14002 return true 14003 } 14004 } 14005 func rewriteValueARM64_OpRsh32Ux8(v *Value) bool { 14006 b := v.Block 14007 _ = b 14008 types := &b.Func.Config.Types 14009 _ = types 14010 // match: (Rsh32Ux8 <t> x y) 14011 // cond: 14012 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 14013 for { 14014 t := v.Type 14015 x := v.Args[0] 14016 y := v.Args[1] 14017 v.reset(OpARM64CSELULT) 14018 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14019 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14020 v1.AddArg(x) 14021 v0.AddArg(v1) 14022 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14023 v2.AddArg(y) 14024 v0.AddArg(v2) 14025 v.AddArg(v0) 14026 v3 := b.NewValue0(v.Pos, OpConst64, t) 14027 v3.AuxInt = 0 14028 v.AddArg(v3) 14029 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14030 v4.AuxInt = 64 14031 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14032 v5.AddArg(y) 14033 v4.AddArg(v5) 14034 v.AddArg(v4) 14035 return true 14036 } 14037 } 14038 func rewriteValueARM64_OpRsh32x16(v *Value) bool { 14039 b := v.Block 14040 _ = b 14041 types := &b.Func.Config.Types 14042 _ = types 14043 // match: (Rsh32x16 x y) 14044 // cond: 14045 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 14046 for { 14047 x := v.Args[0] 14048 y := v.Args[1] 14049 v.reset(OpARM64SRA) 14050 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14051 v0.AddArg(x) 14052 v.AddArg(v0) 14053 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14054 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14055 v2.AddArg(y) 14056 v1.AddArg(v2) 14057 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14058 v3.AuxInt = 63 14059 v1.AddArg(v3) 14060 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14061 v4.AuxInt = 64 14062 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14063 v5.AddArg(y) 14064 v4.AddArg(v5) 14065 v1.AddArg(v4) 14066 v.AddArg(v1) 14067 return true 14068 } 14069 } 14070 func rewriteValueARM64_OpRsh32x32(v *Value) bool { 14071 b := v.Block 14072 _ = b 14073 types := &b.Func.Config.Types 14074 _ = types 14075 // match: (Rsh32x32 x y) 14076 // cond: 14077 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 14078 for { 14079 x := v.Args[0] 14080 y := v.Args[1] 14081 v.reset(OpARM64SRA) 14082 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14083 v0.AddArg(x) 14084 v.AddArg(v0) 14085 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14086 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14087 v2.AddArg(y) 14088 v1.AddArg(v2) 14089 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14090 v3.AuxInt = 63 14091 v1.AddArg(v3) 14092 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14093 v4.AuxInt = 64 14094 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14095 v5.AddArg(y) 14096 v4.AddArg(v5) 14097 v1.AddArg(v4) 14098 v.AddArg(v1) 14099 return true 14100 } 14101 } 14102 func rewriteValueARM64_OpRsh32x64(v *Value) bool { 14103 b := v.Block 14104 _ = b 14105 types := &b.Func.Config.Types 14106 _ = types 14107 // match: (Rsh32x64 x (MOVDconst [c])) 14108 // cond: uint64(c) < 32 14109 // result: (SRAconst (SignExt32to64 x) [c]) 14110 for { 14111 x := v.Args[0] 14112 v_1 := v.Args[1] 14113 if v_1.Op != OpARM64MOVDconst { 14114 break 14115 } 14116 c := v_1.AuxInt 14117 if !(uint64(c) < 32) { 14118 break 14119 } 14120 v.reset(OpARM64SRAconst) 14121 v.AuxInt = c 14122 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14123 v0.AddArg(x) 14124 v.AddArg(v0) 14125 return true 14126 } 14127 // match: (Rsh32x64 x (MOVDconst [c])) 14128 // cond: uint64(c) >= 32 14129 // result: (SRAconst (SignExt32to64 x) [63]) 14130 for { 14131 x := v.Args[0] 14132 v_1 := v.Args[1] 14133 if v_1.Op != OpARM64MOVDconst { 14134 break 14135 } 14136 c := v_1.AuxInt 14137 if !(uint64(c) >= 32) { 14138 break 14139 } 14140 v.reset(OpARM64SRAconst) 14141 v.AuxInt = 63 14142 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14143 v0.AddArg(x) 14144 v.AddArg(v0) 14145 return true 14146 } 14147 // match: (Rsh32x64 x y) 14148 // cond: 14149 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 14150 for { 14151 x := v.Args[0] 14152 y := v.Args[1] 14153 v.reset(OpARM64SRA) 14154 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14155 v0.AddArg(x) 14156 v.AddArg(v0) 14157 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14158 v1.AddArg(y) 14159 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 14160 v2.AuxInt = 63 14161 v1.AddArg(v2) 14162 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14163 v3.AuxInt = 64 14164 v3.AddArg(y) 14165 v1.AddArg(v3) 14166 v.AddArg(v1) 14167 return true 14168 } 14169 } 14170 func rewriteValueARM64_OpRsh32x8(v *Value) bool { 14171 b := v.Block 14172 _ = b 14173 types := &b.Func.Config.Types 14174 _ = types 14175 // match: (Rsh32x8 x y) 14176 // cond: 14177 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 14178 for { 14179 x := v.Args[0] 14180 y := v.Args[1] 14181 v.reset(OpARM64SRA) 14182 v0 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 14183 v0.AddArg(x) 14184 v.AddArg(v0) 14185 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14186 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14187 v2.AddArg(y) 14188 v1.AddArg(v2) 14189 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14190 v3.AuxInt = 63 14191 v1.AddArg(v3) 14192 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14193 v4.AuxInt = 64 14194 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14195 v5.AddArg(y) 14196 v4.AddArg(v5) 14197 v1.AddArg(v4) 14198 v.AddArg(v1) 14199 return true 14200 } 14201 } 14202 func rewriteValueARM64_OpRsh64Ux16(v *Value) bool { 14203 b := v.Block 14204 _ = b 14205 types := &b.Func.Config.Types 14206 _ = types 14207 // match: (Rsh64Ux16 <t> x y) 14208 // cond: 14209 // result: (CSELULT (SRL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 14210 for { 14211 t := v.Type 14212 x := v.Args[0] 14213 y := v.Args[1] 14214 v.reset(OpARM64CSELULT) 14215 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14216 v0.AddArg(x) 14217 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14218 v1.AddArg(y) 14219 v0.AddArg(v1) 14220 v.AddArg(v0) 14221 v2 := b.NewValue0(v.Pos, OpConst64, t) 14222 v2.AuxInt = 0 14223 v.AddArg(v2) 14224 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14225 v3.AuxInt = 64 14226 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14227 v4.AddArg(y) 14228 v3.AddArg(v4) 14229 v.AddArg(v3) 14230 return true 14231 } 14232 } 14233 func rewriteValueARM64_OpRsh64Ux32(v *Value) bool { 14234 b := v.Block 14235 _ = b 14236 types := &b.Func.Config.Types 14237 _ = types 14238 // match: (Rsh64Ux32 <t> x y) 14239 // cond: 14240 // result: (CSELULT (SRL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 14241 for { 14242 t := v.Type 14243 x := v.Args[0] 14244 y := v.Args[1] 14245 v.reset(OpARM64CSELULT) 14246 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14247 v0.AddArg(x) 14248 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14249 v1.AddArg(y) 14250 v0.AddArg(v1) 14251 v.AddArg(v0) 14252 v2 := b.NewValue0(v.Pos, OpConst64, t) 14253 v2.AuxInt = 0 14254 v.AddArg(v2) 14255 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14256 v3.AuxInt = 64 14257 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14258 v4.AddArg(y) 14259 v3.AddArg(v4) 14260 v.AddArg(v3) 14261 return true 14262 } 14263 } 14264 func rewriteValueARM64_OpRsh64Ux64(v *Value) bool { 14265 b := v.Block 14266 _ = b 14267 // match: (Rsh64Ux64 x (MOVDconst [c])) 14268 // cond: uint64(c) < 64 14269 // result: (SRLconst x [c]) 14270 for { 14271 x := v.Args[0] 14272 v_1 := v.Args[1] 14273 if v_1.Op != OpARM64MOVDconst { 14274 break 14275 } 14276 c := v_1.AuxInt 14277 if !(uint64(c) < 64) { 14278 break 14279 } 14280 v.reset(OpARM64SRLconst) 14281 v.AuxInt = c 14282 v.AddArg(x) 14283 return true 14284 } 14285 // match: (Rsh64Ux64 _ (MOVDconst [c])) 14286 // cond: uint64(c) >= 64 14287 // result: (MOVDconst [0]) 14288 for { 14289 v_1 := v.Args[1] 14290 if v_1.Op != OpARM64MOVDconst { 14291 break 14292 } 14293 c := v_1.AuxInt 14294 if !(uint64(c) >= 64) { 14295 break 14296 } 14297 v.reset(OpARM64MOVDconst) 14298 v.AuxInt = 0 14299 return true 14300 } 14301 // match: (Rsh64Ux64 <t> x y) 14302 // cond: 14303 // result: (CSELULT (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 14304 for { 14305 t := v.Type 14306 x := v.Args[0] 14307 y := v.Args[1] 14308 v.reset(OpARM64CSELULT) 14309 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14310 v0.AddArg(x) 14311 v0.AddArg(y) 14312 v.AddArg(v0) 14313 v1 := b.NewValue0(v.Pos, OpConst64, t) 14314 v1.AuxInt = 0 14315 v.AddArg(v1) 14316 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14317 v2.AuxInt = 64 14318 v2.AddArg(y) 14319 v.AddArg(v2) 14320 return true 14321 } 14322 } 14323 func rewriteValueARM64_OpRsh64Ux8(v *Value) bool { 14324 b := v.Block 14325 _ = b 14326 types := &b.Func.Config.Types 14327 _ = types 14328 // match: (Rsh64Ux8 <t> x y) 14329 // cond: 14330 // result: (CSELULT (SRL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 14331 for { 14332 t := v.Type 14333 x := v.Args[0] 14334 y := v.Args[1] 14335 v.reset(OpARM64CSELULT) 14336 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14337 v0.AddArg(x) 14338 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14339 v1.AddArg(y) 14340 v0.AddArg(v1) 14341 v.AddArg(v0) 14342 v2 := b.NewValue0(v.Pos, OpConst64, t) 14343 v2.AuxInt = 0 14344 v.AddArg(v2) 14345 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14346 v3.AuxInt = 64 14347 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14348 v4.AddArg(y) 14349 v3.AddArg(v4) 14350 v.AddArg(v3) 14351 return true 14352 } 14353 } 14354 func rewriteValueARM64_OpRsh64x16(v *Value) bool { 14355 b := v.Block 14356 _ = b 14357 types := &b.Func.Config.Types 14358 _ = types 14359 // match: (Rsh64x16 x y) 14360 // cond: 14361 // result: (SRA x (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 14362 for { 14363 x := v.Args[0] 14364 y := v.Args[1] 14365 v.reset(OpARM64SRA) 14366 v.AddArg(x) 14367 v0 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14368 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14369 v1.AddArg(y) 14370 v0.AddArg(v1) 14371 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 14372 v2.AuxInt = 63 14373 v0.AddArg(v2) 14374 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14375 v3.AuxInt = 64 14376 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14377 v4.AddArg(y) 14378 v3.AddArg(v4) 14379 v0.AddArg(v3) 14380 v.AddArg(v0) 14381 return true 14382 } 14383 } 14384 func rewriteValueARM64_OpRsh64x32(v *Value) bool { 14385 b := v.Block 14386 _ = b 14387 types := &b.Func.Config.Types 14388 _ = types 14389 // match: (Rsh64x32 x y) 14390 // cond: 14391 // result: (SRA x (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 14392 for { 14393 x := v.Args[0] 14394 y := v.Args[1] 14395 v.reset(OpARM64SRA) 14396 v.AddArg(x) 14397 v0 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14398 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14399 v1.AddArg(y) 14400 v0.AddArg(v1) 14401 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 14402 v2.AuxInt = 63 14403 v0.AddArg(v2) 14404 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14405 v3.AuxInt = 64 14406 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14407 v4.AddArg(y) 14408 v3.AddArg(v4) 14409 v0.AddArg(v3) 14410 v.AddArg(v0) 14411 return true 14412 } 14413 } 14414 func rewriteValueARM64_OpRsh64x64(v *Value) bool { 14415 b := v.Block 14416 _ = b 14417 // match: (Rsh64x64 x (MOVDconst [c])) 14418 // cond: uint64(c) < 64 14419 // result: (SRAconst x [c]) 14420 for { 14421 x := v.Args[0] 14422 v_1 := v.Args[1] 14423 if v_1.Op != OpARM64MOVDconst { 14424 break 14425 } 14426 c := v_1.AuxInt 14427 if !(uint64(c) < 64) { 14428 break 14429 } 14430 v.reset(OpARM64SRAconst) 14431 v.AuxInt = c 14432 v.AddArg(x) 14433 return true 14434 } 14435 // match: (Rsh64x64 x (MOVDconst [c])) 14436 // cond: uint64(c) >= 64 14437 // result: (SRAconst x [63]) 14438 for { 14439 x := v.Args[0] 14440 v_1 := v.Args[1] 14441 if v_1.Op != OpARM64MOVDconst { 14442 break 14443 } 14444 c := v_1.AuxInt 14445 if !(uint64(c) >= 64) { 14446 break 14447 } 14448 v.reset(OpARM64SRAconst) 14449 v.AuxInt = 63 14450 v.AddArg(x) 14451 return true 14452 } 14453 // match: (Rsh64x64 x y) 14454 // cond: 14455 // result: (SRA x (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 14456 for { 14457 x := v.Args[0] 14458 y := v.Args[1] 14459 v.reset(OpARM64SRA) 14460 v.AddArg(x) 14461 v0 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14462 v0.AddArg(y) 14463 v1 := b.NewValue0(v.Pos, OpConst64, y.Type) 14464 v1.AuxInt = 63 14465 v0.AddArg(v1) 14466 v2 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14467 v2.AuxInt = 64 14468 v2.AddArg(y) 14469 v0.AddArg(v2) 14470 v.AddArg(v0) 14471 return true 14472 } 14473 } 14474 func rewriteValueARM64_OpRsh64x8(v *Value) bool { 14475 b := v.Block 14476 _ = b 14477 types := &b.Func.Config.Types 14478 _ = types 14479 // match: (Rsh64x8 x y) 14480 // cond: 14481 // result: (SRA x (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 14482 for { 14483 x := v.Args[0] 14484 y := v.Args[1] 14485 v.reset(OpARM64SRA) 14486 v.AddArg(x) 14487 v0 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14488 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14489 v1.AddArg(y) 14490 v0.AddArg(v1) 14491 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 14492 v2.AuxInt = 63 14493 v0.AddArg(v2) 14494 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14495 v3.AuxInt = 64 14496 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14497 v4.AddArg(y) 14498 v3.AddArg(v4) 14499 v0.AddArg(v3) 14500 v.AddArg(v0) 14501 return true 14502 } 14503 } 14504 func rewriteValueARM64_OpRsh8Ux16(v *Value) bool { 14505 b := v.Block 14506 _ = b 14507 types := &b.Func.Config.Types 14508 _ = types 14509 // match: (Rsh8Ux16 <t> x y) 14510 // cond: 14511 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 14512 for { 14513 t := v.Type 14514 x := v.Args[0] 14515 y := v.Args[1] 14516 v.reset(OpARM64CSELULT) 14517 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14518 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14519 v1.AddArg(x) 14520 v0.AddArg(v1) 14521 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14522 v2.AddArg(y) 14523 v0.AddArg(v2) 14524 v.AddArg(v0) 14525 v3 := b.NewValue0(v.Pos, OpConst64, t) 14526 v3.AuxInt = 0 14527 v.AddArg(v3) 14528 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14529 v4.AuxInt = 64 14530 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14531 v5.AddArg(y) 14532 v4.AddArg(v5) 14533 v.AddArg(v4) 14534 return true 14535 } 14536 } 14537 func rewriteValueARM64_OpRsh8Ux32(v *Value) bool { 14538 b := v.Block 14539 _ = b 14540 types := &b.Func.Config.Types 14541 _ = types 14542 // match: (Rsh8Ux32 <t> x y) 14543 // cond: 14544 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 14545 for { 14546 t := v.Type 14547 x := v.Args[0] 14548 y := v.Args[1] 14549 v.reset(OpARM64CSELULT) 14550 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14551 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14552 v1.AddArg(x) 14553 v0.AddArg(v1) 14554 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14555 v2.AddArg(y) 14556 v0.AddArg(v2) 14557 v.AddArg(v0) 14558 v3 := b.NewValue0(v.Pos, OpConst64, t) 14559 v3.AuxInt = 0 14560 v.AddArg(v3) 14561 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14562 v4.AuxInt = 64 14563 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14564 v5.AddArg(y) 14565 v4.AddArg(v5) 14566 v.AddArg(v4) 14567 return true 14568 } 14569 } 14570 func rewriteValueARM64_OpRsh8Ux64(v *Value) bool { 14571 b := v.Block 14572 _ = b 14573 types := &b.Func.Config.Types 14574 _ = types 14575 // match: (Rsh8Ux64 x (MOVDconst [c])) 14576 // cond: uint64(c) < 8 14577 // result: (SRLconst (ZeroExt8to64 x) [c]) 14578 for { 14579 x := v.Args[0] 14580 v_1 := v.Args[1] 14581 if v_1.Op != OpARM64MOVDconst { 14582 break 14583 } 14584 c := v_1.AuxInt 14585 if !(uint64(c) < 8) { 14586 break 14587 } 14588 v.reset(OpARM64SRLconst) 14589 v.AuxInt = c 14590 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14591 v0.AddArg(x) 14592 v.AddArg(v0) 14593 return true 14594 } 14595 // match: (Rsh8Ux64 _ (MOVDconst [c])) 14596 // cond: uint64(c) >= 8 14597 // result: (MOVDconst [0]) 14598 for { 14599 v_1 := v.Args[1] 14600 if v_1.Op != OpARM64MOVDconst { 14601 break 14602 } 14603 c := v_1.AuxInt 14604 if !(uint64(c) >= 8) { 14605 break 14606 } 14607 v.reset(OpARM64MOVDconst) 14608 v.AuxInt = 0 14609 return true 14610 } 14611 // match: (Rsh8Ux64 <t> x y) 14612 // cond: 14613 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 14614 for { 14615 t := v.Type 14616 x := v.Args[0] 14617 y := v.Args[1] 14618 v.reset(OpARM64CSELULT) 14619 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14620 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14621 v1.AddArg(x) 14622 v0.AddArg(v1) 14623 v0.AddArg(y) 14624 v.AddArg(v0) 14625 v2 := b.NewValue0(v.Pos, OpConst64, t) 14626 v2.AuxInt = 0 14627 v.AddArg(v2) 14628 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14629 v3.AuxInt = 64 14630 v3.AddArg(y) 14631 v.AddArg(v3) 14632 return true 14633 } 14634 } 14635 func rewriteValueARM64_OpRsh8Ux8(v *Value) bool { 14636 b := v.Block 14637 _ = b 14638 types := &b.Func.Config.Types 14639 _ = types 14640 // match: (Rsh8Ux8 <t> x y) 14641 // cond: 14642 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 14643 for { 14644 t := v.Type 14645 x := v.Args[0] 14646 y := v.Args[1] 14647 v.reset(OpARM64CSELULT) 14648 v0 := b.NewValue0(v.Pos, OpARM64SRL, t) 14649 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14650 v1.AddArg(x) 14651 v0.AddArg(v1) 14652 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14653 v2.AddArg(y) 14654 v0.AddArg(v2) 14655 v.AddArg(v0) 14656 v3 := b.NewValue0(v.Pos, OpConst64, t) 14657 v3.AuxInt = 0 14658 v.AddArg(v3) 14659 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14660 v4.AuxInt = 64 14661 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14662 v5.AddArg(y) 14663 v4.AddArg(v5) 14664 v.AddArg(v4) 14665 return true 14666 } 14667 } 14668 func rewriteValueARM64_OpRsh8x16(v *Value) bool { 14669 b := v.Block 14670 _ = b 14671 types := &b.Func.Config.Types 14672 _ = types 14673 // match: (Rsh8x16 x y) 14674 // cond: 14675 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 14676 for { 14677 x := v.Args[0] 14678 y := v.Args[1] 14679 v.reset(OpARM64SRA) 14680 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14681 v0.AddArg(x) 14682 v.AddArg(v0) 14683 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14684 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14685 v2.AddArg(y) 14686 v1.AddArg(v2) 14687 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14688 v3.AuxInt = 63 14689 v1.AddArg(v3) 14690 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14691 v4.AuxInt = 64 14692 v5 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 14693 v5.AddArg(y) 14694 v4.AddArg(v5) 14695 v1.AddArg(v4) 14696 v.AddArg(v1) 14697 return true 14698 } 14699 } 14700 func rewriteValueARM64_OpRsh8x32(v *Value) bool { 14701 b := v.Block 14702 _ = b 14703 types := &b.Func.Config.Types 14704 _ = types 14705 // match: (Rsh8x32 x y) 14706 // cond: 14707 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 14708 for { 14709 x := v.Args[0] 14710 y := v.Args[1] 14711 v.reset(OpARM64SRA) 14712 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14713 v0.AddArg(x) 14714 v.AddArg(v0) 14715 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14716 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14717 v2.AddArg(y) 14718 v1.AddArg(v2) 14719 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14720 v3.AuxInt = 63 14721 v1.AddArg(v3) 14722 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14723 v4.AuxInt = 64 14724 v5 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 14725 v5.AddArg(y) 14726 v4.AddArg(v5) 14727 v1.AddArg(v4) 14728 v.AddArg(v1) 14729 return true 14730 } 14731 } 14732 func rewriteValueARM64_OpRsh8x64(v *Value) bool { 14733 b := v.Block 14734 _ = b 14735 types := &b.Func.Config.Types 14736 _ = types 14737 // match: (Rsh8x64 x (MOVDconst [c])) 14738 // cond: uint64(c) < 8 14739 // result: (SRAconst (SignExt8to64 x) [c]) 14740 for { 14741 x := v.Args[0] 14742 v_1 := v.Args[1] 14743 if v_1.Op != OpARM64MOVDconst { 14744 break 14745 } 14746 c := v_1.AuxInt 14747 if !(uint64(c) < 8) { 14748 break 14749 } 14750 v.reset(OpARM64SRAconst) 14751 v.AuxInt = c 14752 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14753 v0.AddArg(x) 14754 v.AddArg(v0) 14755 return true 14756 } 14757 // match: (Rsh8x64 x (MOVDconst [c])) 14758 // cond: uint64(c) >= 8 14759 // result: (SRAconst (SignExt8to64 x) [63]) 14760 for { 14761 x := v.Args[0] 14762 v_1 := v.Args[1] 14763 if v_1.Op != OpARM64MOVDconst { 14764 break 14765 } 14766 c := v_1.AuxInt 14767 if !(uint64(c) >= 8) { 14768 break 14769 } 14770 v.reset(OpARM64SRAconst) 14771 v.AuxInt = 63 14772 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14773 v0.AddArg(x) 14774 v.AddArg(v0) 14775 return true 14776 } 14777 // match: (Rsh8x64 x y) 14778 // cond: 14779 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 14780 for { 14781 x := v.Args[0] 14782 y := v.Args[1] 14783 v.reset(OpARM64SRA) 14784 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14785 v0.AddArg(x) 14786 v.AddArg(v0) 14787 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14788 v1.AddArg(y) 14789 v2 := b.NewValue0(v.Pos, OpConst64, y.Type) 14790 v2.AuxInt = 63 14791 v1.AddArg(v2) 14792 v3 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14793 v3.AuxInt = 64 14794 v3.AddArg(y) 14795 v1.AddArg(v3) 14796 v.AddArg(v1) 14797 return true 14798 } 14799 } 14800 func rewriteValueARM64_OpRsh8x8(v *Value) bool { 14801 b := v.Block 14802 _ = b 14803 types := &b.Func.Config.Types 14804 _ = types 14805 // match: (Rsh8x8 x y) 14806 // cond: 14807 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 14808 for { 14809 x := v.Args[0] 14810 y := v.Args[1] 14811 v.reset(OpARM64SRA) 14812 v0 := b.NewValue0(v.Pos, OpSignExt8to64, types.Int64) 14813 v0.AddArg(x) 14814 v.AddArg(v0) 14815 v1 := b.NewValue0(v.Pos, OpARM64CSELULT, y.Type) 14816 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14817 v2.AddArg(y) 14818 v1.AddArg(v2) 14819 v3 := b.NewValue0(v.Pos, OpConst64, y.Type) 14820 v3.AuxInt = 63 14821 v1.AddArg(v3) 14822 v4 := b.NewValue0(v.Pos, OpARM64CMPconst, TypeFlags) 14823 v4.AuxInt = 64 14824 v5 := b.NewValue0(v.Pos, OpZeroExt8to64, types.UInt64) 14825 v5.AddArg(y) 14826 v4.AddArg(v5) 14827 v1.AddArg(v4) 14828 v.AddArg(v1) 14829 return true 14830 } 14831 } 14832 func rewriteValueARM64_OpSignExt16to32(v *Value) bool { 14833 // match: (SignExt16to32 x) 14834 // cond: 14835 // result: (MOVHreg x) 14836 for { 14837 x := v.Args[0] 14838 v.reset(OpARM64MOVHreg) 14839 v.AddArg(x) 14840 return true 14841 } 14842 } 14843 func rewriteValueARM64_OpSignExt16to64(v *Value) bool { 14844 // match: (SignExt16to64 x) 14845 // cond: 14846 // result: (MOVHreg x) 14847 for { 14848 x := v.Args[0] 14849 v.reset(OpARM64MOVHreg) 14850 v.AddArg(x) 14851 return true 14852 } 14853 } 14854 func rewriteValueARM64_OpSignExt32to64(v *Value) bool { 14855 // match: (SignExt32to64 x) 14856 // cond: 14857 // result: (MOVWreg x) 14858 for { 14859 x := v.Args[0] 14860 v.reset(OpARM64MOVWreg) 14861 v.AddArg(x) 14862 return true 14863 } 14864 } 14865 func rewriteValueARM64_OpSignExt8to16(v *Value) bool { 14866 // match: (SignExt8to16 x) 14867 // cond: 14868 // result: (MOVBreg x) 14869 for { 14870 x := v.Args[0] 14871 v.reset(OpARM64MOVBreg) 14872 v.AddArg(x) 14873 return true 14874 } 14875 } 14876 func rewriteValueARM64_OpSignExt8to32(v *Value) bool { 14877 // match: (SignExt8to32 x) 14878 // cond: 14879 // result: (MOVBreg x) 14880 for { 14881 x := v.Args[0] 14882 v.reset(OpARM64MOVBreg) 14883 v.AddArg(x) 14884 return true 14885 } 14886 } 14887 func rewriteValueARM64_OpSignExt8to64(v *Value) bool { 14888 // match: (SignExt8to64 x) 14889 // cond: 14890 // result: (MOVBreg x) 14891 for { 14892 x := v.Args[0] 14893 v.reset(OpARM64MOVBreg) 14894 v.AddArg(x) 14895 return true 14896 } 14897 } 14898 func rewriteValueARM64_OpSlicemask(v *Value) bool { 14899 b := v.Block 14900 _ = b 14901 // match: (Slicemask <t> x) 14902 // cond: 14903 // result: (SRAconst (NEG <t> x) [63]) 14904 for { 14905 t := v.Type 14906 x := v.Args[0] 14907 v.reset(OpARM64SRAconst) 14908 v.AuxInt = 63 14909 v0 := b.NewValue0(v.Pos, OpARM64NEG, t) 14910 v0.AddArg(x) 14911 v.AddArg(v0) 14912 return true 14913 } 14914 } 14915 func rewriteValueARM64_OpSqrt(v *Value) bool { 14916 // match: (Sqrt x) 14917 // cond: 14918 // result: (FSQRTD x) 14919 for { 14920 x := v.Args[0] 14921 v.reset(OpARM64FSQRTD) 14922 v.AddArg(x) 14923 return true 14924 } 14925 } 14926 func rewriteValueARM64_OpStaticCall(v *Value) bool { 14927 // match: (StaticCall [argwid] {target} mem) 14928 // cond: 14929 // result: (CALLstatic [argwid] {target} mem) 14930 for { 14931 argwid := v.AuxInt 14932 target := v.Aux 14933 mem := v.Args[0] 14934 v.reset(OpARM64CALLstatic) 14935 v.AuxInt = argwid 14936 v.Aux = target 14937 v.AddArg(mem) 14938 return true 14939 } 14940 } 14941 func rewriteValueARM64_OpStore(v *Value) bool { 14942 // match: (Store {t} ptr val mem) 14943 // cond: t.(Type).Size() == 1 14944 // result: (MOVBstore ptr val mem) 14945 for { 14946 t := v.Aux 14947 ptr := v.Args[0] 14948 val := v.Args[1] 14949 mem := v.Args[2] 14950 if !(t.(Type).Size() == 1) { 14951 break 14952 } 14953 v.reset(OpARM64MOVBstore) 14954 v.AddArg(ptr) 14955 v.AddArg(val) 14956 v.AddArg(mem) 14957 return true 14958 } 14959 // match: (Store {t} ptr val mem) 14960 // cond: t.(Type).Size() == 2 14961 // result: (MOVHstore ptr val mem) 14962 for { 14963 t := v.Aux 14964 ptr := v.Args[0] 14965 val := v.Args[1] 14966 mem := v.Args[2] 14967 if !(t.(Type).Size() == 2) { 14968 break 14969 } 14970 v.reset(OpARM64MOVHstore) 14971 v.AddArg(ptr) 14972 v.AddArg(val) 14973 v.AddArg(mem) 14974 return true 14975 } 14976 // match: (Store {t} ptr val mem) 14977 // cond: t.(Type).Size() == 4 && !is32BitFloat(val.Type) 14978 // result: (MOVWstore ptr val mem) 14979 for { 14980 t := v.Aux 14981 ptr := v.Args[0] 14982 val := v.Args[1] 14983 mem := v.Args[2] 14984 if !(t.(Type).Size() == 4 && !is32BitFloat(val.Type)) { 14985 break 14986 } 14987 v.reset(OpARM64MOVWstore) 14988 v.AddArg(ptr) 14989 v.AddArg(val) 14990 v.AddArg(mem) 14991 return true 14992 } 14993 // match: (Store {t} ptr val mem) 14994 // cond: t.(Type).Size() == 8 && !is64BitFloat(val.Type) 14995 // result: (MOVDstore ptr val mem) 14996 for { 14997 t := v.Aux 14998 ptr := v.Args[0] 14999 val := v.Args[1] 15000 mem := v.Args[2] 15001 if !(t.(Type).Size() == 8 && !is64BitFloat(val.Type)) { 15002 break 15003 } 15004 v.reset(OpARM64MOVDstore) 15005 v.AddArg(ptr) 15006 v.AddArg(val) 15007 v.AddArg(mem) 15008 return true 15009 } 15010 // match: (Store {t} ptr val mem) 15011 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 15012 // result: (FMOVSstore ptr val mem) 15013 for { 15014 t := v.Aux 15015 ptr := v.Args[0] 15016 val := v.Args[1] 15017 mem := v.Args[2] 15018 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 15019 break 15020 } 15021 v.reset(OpARM64FMOVSstore) 15022 v.AddArg(ptr) 15023 v.AddArg(val) 15024 v.AddArg(mem) 15025 return true 15026 } 15027 // match: (Store {t} ptr val mem) 15028 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 15029 // result: (FMOVDstore ptr val mem) 15030 for { 15031 t := v.Aux 15032 ptr := v.Args[0] 15033 val := v.Args[1] 15034 mem := v.Args[2] 15035 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 15036 break 15037 } 15038 v.reset(OpARM64FMOVDstore) 15039 v.AddArg(ptr) 15040 v.AddArg(val) 15041 v.AddArg(mem) 15042 return true 15043 } 15044 return false 15045 } 15046 func rewriteValueARM64_OpSub16(v *Value) bool { 15047 // match: (Sub16 x y) 15048 // cond: 15049 // result: (SUB x y) 15050 for { 15051 x := v.Args[0] 15052 y := v.Args[1] 15053 v.reset(OpARM64SUB) 15054 v.AddArg(x) 15055 v.AddArg(y) 15056 return true 15057 } 15058 } 15059 func rewriteValueARM64_OpSub32(v *Value) bool { 15060 // match: (Sub32 x y) 15061 // cond: 15062 // result: (SUB x y) 15063 for { 15064 x := v.Args[0] 15065 y := v.Args[1] 15066 v.reset(OpARM64SUB) 15067 v.AddArg(x) 15068 v.AddArg(y) 15069 return true 15070 } 15071 } 15072 func rewriteValueARM64_OpSub32F(v *Value) bool { 15073 // match: (Sub32F x y) 15074 // cond: 15075 // result: (FSUBS x y) 15076 for { 15077 x := v.Args[0] 15078 y := v.Args[1] 15079 v.reset(OpARM64FSUBS) 15080 v.AddArg(x) 15081 v.AddArg(y) 15082 return true 15083 } 15084 } 15085 func rewriteValueARM64_OpSub64(v *Value) bool { 15086 // match: (Sub64 x y) 15087 // cond: 15088 // result: (SUB x y) 15089 for { 15090 x := v.Args[0] 15091 y := v.Args[1] 15092 v.reset(OpARM64SUB) 15093 v.AddArg(x) 15094 v.AddArg(y) 15095 return true 15096 } 15097 } 15098 func rewriteValueARM64_OpSub64F(v *Value) bool { 15099 // match: (Sub64F x y) 15100 // cond: 15101 // result: (FSUBD x y) 15102 for { 15103 x := v.Args[0] 15104 y := v.Args[1] 15105 v.reset(OpARM64FSUBD) 15106 v.AddArg(x) 15107 v.AddArg(y) 15108 return true 15109 } 15110 } 15111 func rewriteValueARM64_OpSub8(v *Value) bool { 15112 // match: (Sub8 x y) 15113 // cond: 15114 // result: (SUB x y) 15115 for { 15116 x := v.Args[0] 15117 y := v.Args[1] 15118 v.reset(OpARM64SUB) 15119 v.AddArg(x) 15120 v.AddArg(y) 15121 return true 15122 } 15123 } 15124 func rewriteValueARM64_OpSubPtr(v *Value) bool { 15125 // match: (SubPtr x y) 15126 // cond: 15127 // result: (SUB x y) 15128 for { 15129 x := v.Args[0] 15130 y := v.Args[1] 15131 v.reset(OpARM64SUB) 15132 v.AddArg(x) 15133 v.AddArg(y) 15134 return true 15135 } 15136 } 15137 func rewriteValueARM64_OpTrunc16to8(v *Value) bool { 15138 // match: (Trunc16to8 x) 15139 // cond: 15140 // result: x 15141 for { 15142 x := v.Args[0] 15143 v.reset(OpCopy) 15144 v.Type = x.Type 15145 v.AddArg(x) 15146 return true 15147 } 15148 } 15149 func rewriteValueARM64_OpTrunc32to16(v *Value) bool { 15150 // match: (Trunc32to16 x) 15151 // cond: 15152 // result: x 15153 for { 15154 x := v.Args[0] 15155 v.reset(OpCopy) 15156 v.Type = x.Type 15157 v.AddArg(x) 15158 return true 15159 } 15160 } 15161 func rewriteValueARM64_OpTrunc32to8(v *Value) bool { 15162 // match: (Trunc32to8 x) 15163 // cond: 15164 // result: x 15165 for { 15166 x := v.Args[0] 15167 v.reset(OpCopy) 15168 v.Type = x.Type 15169 v.AddArg(x) 15170 return true 15171 } 15172 } 15173 func rewriteValueARM64_OpTrunc64to16(v *Value) bool { 15174 // match: (Trunc64to16 x) 15175 // cond: 15176 // result: x 15177 for { 15178 x := v.Args[0] 15179 v.reset(OpCopy) 15180 v.Type = x.Type 15181 v.AddArg(x) 15182 return true 15183 } 15184 } 15185 func rewriteValueARM64_OpTrunc64to32(v *Value) bool { 15186 // match: (Trunc64to32 x) 15187 // cond: 15188 // result: x 15189 for { 15190 x := v.Args[0] 15191 v.reset(OpCopy) 15192 v.Type = x.Type 15193 v.AddArg(x) 15194 return true 15195 } 15196 } 15197 func rewriteValueARM64_OpTrunc64to8(v *Value) bool { 15198 // match: (Trunc64to8 x) 15199 // cond: 15200 // result: x 15201 for { 15202 x := v.Args[0] 15203 v.reset(OpCopy) 15204 v.Type = x.Type 15205 v.AddArg(x) 15206 return true 15207 } 15208 } 15209 func rewriteValueARM64_OpXor16(v *Value) bool { 15210 // match: (Xor16 x y) 15211 // cond: 15212 // result: (XOR x y) 15213 for { 15214 x := v.Args[0] 15215 y := v.Args[1] 15216 v.reset(OpARM64XOR) 15217 v.AddArg(x) 15218 v.AddArg(y) 15219 return true 15220 } 15221 } 15222 func rewriteValueARM64_OpXor32(v *Value) bool { 15223 // match: (Xor32 x y) 15224 // cond: 15225 // result: (XOR x y) 15226 for { 15227 x := v.Args[0] 15228 y := v.Args[1] 15229 v.reset(OpARM64XOR) 15230 v.AddArg(x) 15231 v.AddArg(y) 15232 return true 15233 } 15234 } 15235 func rewriteValueARM64_OpXor64(v *Value) bool { 15236 // match: (Xor64 x y) 15237 // cond: 15238 // result: (XOR x y) 15239 for { 15240 x := v.Args[0] 15241 y := v.Args[1] 15242 v.reset(OpARM64XOR) 15243 v.AddArg(x) 15244 v.AddArg(y) 15245 return true 15246 } 15247 } 15248 func rewriteValueARM64_OpXor8(v *Value) bool { 15249 // match: (Xor8 x y) 15250 // cond: 15251 // result: (XOR x y) 15252 for { 15253 x := v.Args[0] 15254 y := v.Args[1] 15255 v.reset(OpARM64XOR) 15256 v.AddArg(x) 15257 v.AddArg(y) 15258 return true 15259 } 15260 } 15261 func rewriteValueARM64_OpZero(v *Value) bool { 15262 b := v.Block 15263 _ = b 15264 config := b.Func.Config 15265 _ = config 15266 types := &b.Func.Config.Types 15267 _ = types 15268 // match: (Zero [0] _ mem) 15269 // cond: 15270 // result: mem 15271 for { 15272 if v.AuxInt != 0 { 15273 break 15274 } 15275 mem := v.Args[1] 15276 v.reset(OpCopy) 15277 v.Type = mem.Type 15278 v.AddArg(mem) 15279 return true 15280 } 15281 // match: (Zero [1] ptr mem) 15282 // cond: 15283 // result: (MOVBstore ptr (MOVDconst [0]) mem) 15284 for { 15285 if v.AuxInt != 1 { 15286 break 15287 } 15288 ptr := v.Args[0] 15289 mem := v.Args[1] 15290 v.reset(OpARM64MOVBstore) 15291 v.AddArg(ptr) 15292 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15293 v0.AuxInt = 0 15294 v.AddArg(v0) 15295 v.AddArg(mem) 15296 return true 15297 } 15298 // match: (Zero [2] ptr mem) 15299 // cond: 15300 // result: (MOVHstore ptr (MOVDconst [0]) mem) 15301 for { 15302 if v.AuxInt != 2 { 15303 break 15304 } 15305 ptr := v.Args[0] 15306 mem := v.Args[1] 15307 v.reset(OpARM64MOVHstore) 15308 v.AddArg(ptr) 15309 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15310 v0.AuxInt = 0 15311 v.AddArg(v0) 15312 v.AddArg(mem) 15313 return true 15314 } 15315 // match: (Zero [4] ptr mem) 15316 // cond: 15317 // result: (MOVWstore ptr (MOVDconst [0]) mem) 15318 for { 15319 if v.AuxInt != 4 { 15320 break 15321 } 15322 ptr := v.Args[0] 15323 mem := v.Args[1] 15324 v.reset(OpARM64MOVWstore) 15325 v.AddArg(ptr) 15326 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15327 v0.AuxInt = 0 15328 v.AddArg(v0) 15329 v.AddArg(mem) 15330 return true 15331 } 15332 // match: (Zero [8] ptr mem) 15333 // cond: 15334 // result: (MOVDstore ptr (MOVDconst [0]) mem) 15335 for { 15336 if v.AuxInt != 8 { 15337 break 15338 } 15339 ptr := v.Args[0] 15340 mem := v.Args[1] 15341 v.reset(OpARM64MOVDstore) 15342 v.AddArg(ptr) 15343 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15344 v0.AuxInt = 0 15345 v.AddArg(v0) 15346 v.AddArg(mem) 15347 return true 15348 } 15349 // match: (Zero [3] ptr mem) 15350 // cond: 15351 // result: (MOVBstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem)) 15352 for { 15353 if v.AuxInt != 3 { 15354 break 15355 } 15356 ptr := v.Args[0] 15357 mem := v.Args[1] 15358 v.reset(OpARM64MOVBstore) 15359 v.AuxInt = 2 15360 v.AddArg(ptr) 15361 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15362 v0.AuxInt = 0 15363 v.AddArg(v0) 15364 v1 := b.NewValue0(v.Pos, OpARM64MOVHstore, TypeMem) 15365 v1.AddArg(ptr) 15366 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15367 v2.AuxInt = 0 15368 v1.AddArg(v2) 15369 v1.AddArg(mem) 15370 v.AddArg(v1) 15371 return true 15372 } 15373 // match: (Zero [5] ptr mem) 15374 // cond: 15375 // result: (MOVBstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 15376 for { 15377 if v.AuxInt != 5 { 15378 break 15379 } 15380 ptr := v.Args[0] 15381 mem := v.Args[1] 15382 v.reset(OpARM64MOVBstore) 15383 v.AuxInt = 4 15384 v.AddArg(ptr) 15385 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15386 v0.AuxInt = 0 15387 v.AddArg(v0) 15388 v1 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 15389 v1.AddArg(ptr) 15390 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15391 v2.AuxInt = 0 15392 v1.AddArg(v2) 15393 v1.AddArg(mem) 15394 v.AddArg(v1) 15395 return true 15396 } 15397 // match: (Zero [6] ptr mem) 15398 // cond: 15399 // result: (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 15400 for { 15401 if v.AuxInt != 6 { 15402 break 15403 } 15404 ptr := v.Args[0] 15405 mem := v.Args[1] 15406 v.reset(OpARM64MOVHstore) 15407 v.AuxInt = 4 15408 v.AddArg(ptr) 15409 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15410 v0.AuxInt = 0 15411 v.AddArg(v0) 15412 v1 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 15413 v1.AddArg(ptr) 15414 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15415 v2.AuxInt = 0 15416 v1.AddArg(v2) 15417 v1.AddArg(mem) 15418 v.AddArg(v1) 15419 return true 15420 } 15421 // match: (Zero [7] ptr mem) 15422 // cond: 15423 // result: (MOVBstore [6] ptr (MOVDconst [0]) (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem))) 15424 for { 15425 if v.AuxInt != 7 { 15426 break 15427 } 15428 ptr := v.Args[0] 15429 mem := v.Args[1] 15430 v.reset(OpARM64MOVBstore) 15431 v.AuxInt = 6 15432 v.AddArg(ptr) 15433 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15434 v0.AuxInt = 0 15435 v.AddArg(v0) 15436 v1 := b.NewValue0(v.Pos, OpARM64MOVHstore, TypeMem) 15437 v1.AuxInt = 4 15438 v1.AddArg(ptr) 15439 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15440 v2.AuxInt = 0 15441 v1.AddArg(v2) 15442 v3 := b.NewValue0(v.Pos, OpARM64MOVWstore, TypeMem) 15443 v3.AddArg(ptr) 15444 v4 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15445 v4.AuxInt = 0 15446 v3.AddArg(v4) 15447 v3.AddArg(mem) 15448 v1.AddArg(v3) 15449 v.AddArg(v1) 15450 return true 15451 } 15452 // match: (Zero [12] ptr mem) 15453 // cond: 15454 // result: (MOVWstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 15455 for { 15456 if v.AuxInt != 12 { 15457 break 15458 } 15459 ptr := v.Args[0] 15460 mem := v.Args[1] 15461 v.reset(OpARM64MOVWstore) 15462 v.AuxInt = 8 15463 v.AddArg(ptr) 15464 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15465 v0.AuxInt = 0 15466 v.AddArg(v0) 15467 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 15468 v1.AddArg(ptr) 15469 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15470 v2.AuxInt = 0 15471 v1.AddArg(v2) 15472 v1.AddArg(mem) 15473 v.AddArg(v1) 15474 return true 15475 } 15476 // match: (Zero [16] ptr mem) 15477 // cond: 15478 // result: (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 15479 for { 15480 if v.AuxInt != 16 { 15481 break 15482 } 15483 ptr := v.Args[0] 15484 mem := v.Args[1] 15485 v.reset(OpARM64MOVDstore) 15486 v.AuxInt = 8 15487 v.AddArg(ptr) 15488 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15489 v0.AuxInt = 0 15490 v.AddArg(v0) 15491 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 15492 v1.AddArg(ptr) 15493 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15494 v2.AuxInt = 0 15495 v1.AddArg(v2) 15496 v1.AddArg(mem) 15497 v.AddArg(v1) 15498 return true 15499 } 15500 // match: (Zero [24] ptr mem) 15501 // cond: 15502 // result: (MOVDstore [16] ptr (MOVDconst [0]) (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem))) 15503 for { 15504 if v.AuxInt != 24 { 15505 break 15506 } 15507 ptr := v.Args[0] 15508 mem := v.Args[1] 15509 v.reset(OpARM64MOVDstore) 15510 v.AuxInt = 16 15511 v.AddArg(ptr) 15512 v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15513 v0.AuxInt = 0 15514 v.AddArg(v0) 15515 v1 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 15516 v1.AuxInt = 8 15517 v1.AddArg(ptr) 15518 v2 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15519 v2.AuxInt = 0 15520 v1.AddArg(v2) 15521 v3 := b.NewValue0(v.Pos, OpARM64MOVDstore, TypeMem) 15522 v3.AddArg(ptr) 15523 v4 := b.NewValue0(v.Pos, OpARM64MOVDconst, types.UInt64) 15524 v4.AuxInt = 0 15525 v3.AddArg(v4) 15526 v3.AddArg(mem) 15527 v1.AddArg(v3) 15528 v.AddArg(v1) 15529 return true 15530 } 15531 // match: (Zero [s] ptr mem) 15532 // cond: s%8 != 0 && s > 8 15533 // result: (Zero [s%8] (OffPtr <ptr.Type> ptr [s-s%8]) (Zero [s-s%8] ptr mem)) 15534 for { 15535 s := v.AuxInt 15536 ptr := v.Args[0] 15537 mem := v.Args[1] 15538 if !(s%8 != 0 && s > 8) { 15539 break 15540 } 15541 v.reset(OpZero) 15542 v.AuxInt = s % 8 15543 v0 := b.NewValue0(v.Pos, OpOffPtr, ptr.Type) 15544 v0.AuxInt = s - s%8 15545 v0.AddArg(ptr) 15546 v.AddArg(v0) 15547 v1 := b.NewValue0(v.Pos, OpZero, TypeMem) 15548 v1.AuxInt = s - s%8 15549 v1.AddArg(ptr) 15550 v1.AddArg(mem) 15551 v.AddArg(v1) 15552 return true 15553 } 15554 // match: (Zero [s] ptr mem) 15555 // cond: s%8 == 0 && s > 24 && s <= 8*128 && !config.noDuffDevice 15556 // result: (DUFFZERO [4 * (128 - int64(s/8))] ptr mem) 15557 for { 15558 s := v.AuxInt 15559 ptr := v.Args[0] 15560 mem := v.Args[1] 15561 if !(s%8 == 0 && s > 24 && s <= 8*128 && !config.noDuffDevice) { 15562 break 15563 } 15564 v.reset(OpARM64DUFFZERO) 15565 v.AuxInt = 4 * (128 - int64(s/8)) 15566 v.AddArg(ptr) 15567 v.AddArg(mem) 15568 return true 15569 } 15570 // match: (Zero [s] ptr mem) 15571 // cond: s%8 == 0 && (s > 8*128 || config.noDuffDevice) 15572 // result: (LoweredZero ptr (ADDconst <ptr.Type> [s-8] ptr) mem) 15573 for { 15574 s := v.AuxInt 15575 ptr := v.Args[0] 15576 mem := v.Args[1] 15577 if !(s%8 == 0 && (s > 8*128 || config.noDuffDevice)) { 15578 break 15579 } 15580 v.reset(OpARM64LoweredZero) 15581 v.AddArg(ptr) 15582 v0 := b.NewValue0(v.Pos, OpARM64ADDconst, ptr.Type) 15583 v0.AuxInt = s - 8 15584 v0.AddArg(ptr) 15585 v.AddArg(v0) 15586 v.AddArg(mem) 15587 return true 15588 } 15589 return false 15590 } 15591 func rewriteValueARM64_OpZeroExt16to32(v *Value) bool { 15592 // match: (ZeroExt16to32 x) 15593 // cond: 15594 // result: (MOVHUreg x) 15595 for { 15596 x := v.Args[0] 15597 v.reset(OpARM64MOVHUreg) 15598 v.AddArg(x) 15599 return true 15600 } 15601 } 15602 func rewriteValueARM64_OpZeroExt16to64(v *Value) bool { 15603 // match: (ZeroExt16to64 x) 15604 // cond: 15605 // result: (MOVHUreg x) 15606 for { 15607 x := v.Args[0] 15608 v.reset(OpARM64MOVHUreg) 15609 v.AddArg(x) 15610 return true 15611 } 15612 } 15613 func rewriteValueARM64_OpZeroExt32to64(v *Value) bool { 15614 // match: (ZeroExt32to64 x) 15615 // cond: 15616 // result: (MOVWUreg x) 15617 for { 15618 x := v.Args[0] 15619 v.reset(OpARM64MOVWUreg) 15620 v.AddArg(x) 15621 return true 15622 } 15623 } 15624 func rewriteValueARM64_OpZeroExt8to16(v *Value) bool { 15625 // match: (ZeroExt8to16 x) 15626 // cond: 15627 // result: (MOVBUreg x) 15628 for { 15629 x := v.Args[0] 15630 v.reset(OpARM64MOVBUreg) 15631 v.AddArg(x) 15632 return true 15633 } 15634 } 15635 func rewriteValueARM64_OpZeroExt8to32(v *Value) bool { 15636 // match: (ZeroExt8to32 x) 15637 // cond: 15638 // result: (MOVBUreg x) 15639 for { 15640 x := v.Args[0] 15641 v.reset(OpARM64MOVBUreg) 15642 v.AddArg(x) 15643 return true 15644 } 15645 } 15646 func rewriteValueARM64_OpZeroExt8to64(v *Value) bool { 15647 // match: (ZeroExt8to64 x) 15648 // cond: 15649 // result: (MOVBUreg x) 15650 for { 15651 x := v.Args[0] 15652 v.reset(OpARM64MOVBUreg) 15653 v.AddArg(x) 15654 return true 15655 } 15656 } 15657 func rewriteBlockARM64(b *Block) bool { 15658 config := b.Func.Config 15659 _ = config 15660 fe := b.Func.fe 15661 _ = fe 15662 types := &config.Types 15663 _ = types 15664 switch b.Kind { 15665 case BlockARM64EQ: 15666 // match: (EQ (CMPconst [0] x) yes no) 15667 // cond: 15668 // result: (Z x yes no) 15669 for { 15670 v := b.Control 15671 if v.Op != OpARM64CMPconst { 15672 break 15673 } 15674 if v.AuxInt != 0 { 15675 break 15676 } 15677 x := v.Args[0] 15678 yes := b.Succs[0] 15679 no := b.Succs[1] 15680 b.Kind = BlockARM64Z 15681 b.SetControl(x) 15682 _ = yes 15683 _ = no 15684 return true 15685 } 15686 // match: (EQ (CMPWconst [0] x) yes no) 15687 // cond: 15688 // result: (ZW x yes no) 15689 for { 15690 v := b.Control 15691 if v.Op != OpARM64CMPWconst { 15692 break 15693 } 15694 if v.AuxInt != 0 { 15695 break 15696 } 15697 x := v.Args[0] 15698 yes := b.Succs[0] 15699 no := b.Succs[1] 15700 b.Kind = BlockARM64ZW 15701 b.SetControl(x) 15702 _ = yes 15703 _ = no 15704 return true 15705 } 15706 // match: (EQ (FlagEQ) yes no) 15707 // cond: 15708 // result: (First nil yes no) 15709 for { 15710 v := b.Control 15711 if v.Op != OpARM64FlagEQ { 15712 break 15713 } 15714 yes := b.Succs[0] 15715 no := b.Succs[1] 15716 b.Kind = BlockFirst 15717 b.SetControl(nil) 15718 _ = yes 15719 _ = no 15720 return true 15721 } 15722 // match: (EQ (FlagLT_ULT) yes no) 15723 // cond: 15724 // result: (First nil no yes) 15725 for { 15726 v := b.Control 15727 if v.Op != OpARM64FlagLT_ULT { 15728 break 15729 } 15730 yes := b.Succs[0] 15731 no := b.Succs[1] 15732 b.Kind = BlockFirst 15733 b.SetControl(nil) 15734 b.swapSuccessors() 15735 _ = no 15736 _ = yes 15737 return true 15738 } 15739 // match: (EQ (FlagLT_UGT) yes no) 15740 // cond: 15741 // result: (First nil no yes) 15742 for { 15743 v := b.Control 15744 if v.Op != OpARM64FlagLT_UGT { 15745 break 15746 } 15747 yes := b.Succs[0] 15748 no := b.Succs[1] 15749 b.Kind = BlockFirst 15750 b.SetControl(nil) 15751 b.swapSuccessors() 15752 _ = no 15753 _ = yes 15754 return true 15755 } 15756 // match: (EQ (FlagGT_ULT) yes no) 15757 // cond: 15758 // result: (First nil no yes) 15759 for { 15760 v := b.Control 15761 if v.Op != OpARM64FlagGT_ULT { 15762 break 15763 } 15764 yes := b.Succs[0] 15765 no := b.Succs[1] 15766 b.Kind = BlockFirst 15767 b.SetControl(nil) 15768 b.swapSuccessors() 15769 _ = no 15770 _ = yes 15771 return true 15772 } 15773 // match: (EQ (FlagGT_UGT) yes no) 15774 // cond: 15775 // result: (First nil no yes) 15776 for { 15777 v := b.Control 15778 if v.Op != OpARM64FlagGT_UGT { 15779 break 15780 } 15781 yes := b.Succs[0] 15782 no := b.Succs[1] 15783 b.Kind = BlockFirst 15784 b.SetControl(nil) 15785 b.swapSuccessors() 15786 _ = no 15787 _ = yes 15788 return true 15789 } 15790 // match: (EQ (InvertFlags cmp) yes no) 15791 // cond: 15792 // result: (EQ cmp yes no) 15793 for { 15794 v := b.Control 15795 if v.Op != OpARM64InvertFlags { 15796 break 15797 } 15798 cmp := v.Args[0] 15799 yes := b.Succs[0] 15800 no := b.Succs[1] 15801 b.Kind = BlockARM64EQ 15802 b.SetControl(cmp) 15803 _ = yes 15804 _ = no 15805 return true 15806 } 15807 case BlockARM64GE: 15808 // match: (GE (FlagEQ) yes no) 15809 // cond: 15810 // result: (First nil yes no) 15811 for { 15812 v := b.Control 15813 if v.Op != OpARM64FlagEQ { 15814 break 15815 } 15816 yes := b.Succs[0] 15817 no := b.Succs[1] 15818 b.Kind = BlockFirst 15819 b.SetControl(nil) 15820 _ = yes 15821 _ = no 15822 return true 15823 } 15824 // match: (GE (FlagLT_ULT) yes no) 15825 // cond: 15826 // result: (First nil no yes) 15827 for { 15828 v := b.Control 15829 if v.Op != OpARM64FlagLT_ULT { 15830 break 15831 } 15832 yes := b.Succs[0] 15833 no := b.Succs[1] 15834 b.Kind = BlockFirst 15835 b.SetControl(nil) 15836 b.swapSuccessors() 15837 _ = no 15838 _ = yes 15839 return true 15840 } 15841 // match: (GE (FlagLT_UGT) yes no) 15842 // cond: 15843 // result: (First nil no yes) 15844 for { 15845 v := b.Control 15846 if v.Op != OpARM64FlagLT_UGT { 15847 break 15848 } 15849 yes := b.Succs[0] 15850 no := b.Succs[1] 15851 b.Kind = BlockFirst 15852 b.SetControl(nil) 15853 b.swapSuccessors() 15854 _ = no 15855 _ = yes 15856 return true 15857 } 15858 // match: (GE (FlagGT_ULT) yes no) 15859 // cond: 15860 // result: (First nil yes no) 15861 for { 15862 v := b.Control 15863 if v.Op != OpARM64FlagGT_ULT { 15864 break 15865 } 15866 yes := b.Succs[0] 15867 no := b.Succs[1] 15868 b.Kind = BlockFirst 15869 b.SetControl(nil) 15870 _ = yes 15871 _ = no 15872 return true 15873 } 15874 // match: (GE (FlagGT_UGT) yes no) 15875 // cond: 15876 // result: (First nil yes no) 15877 for { 15878 v := b.Control 15879 if v.Op != OpARM64FlagGT_UGT { 15880 break 15881 } 15882 yes := b.Succs[0] 15883 no := b.Succs[1] 15884 b.Kind = BlockFirst 15885 b.SetControl(nil) 15886 _ = yes 15887 _ = no 15888 return true 15889 } 15890 // match: (GE (InvertFlags cmp) yes no) 15891 // cond: 15892 // result: (LE cmp yes no) 15893 for { 15894 v := b.Control 15895 if v.Op != OpARM64InvertFlags { 15896 break 15897 } 15898 cmp := v.Args[0] 15899 yes := b.Succs[0] 15900 no := b.Succs[1] 15901 b.Kind = BlockARM64LE 15902 b.SetControl(cmp) 15903 _ = yes 15904 _ = no 15905 return true 15906 } 15907 case BlockARM64GT: 15908 // match: (GT (FlagEQ) yes no) 15909 // cond: 15910 // result: (First nil no yes) 15911 for { 15912 v := b.Control 15913 if v.Op != OpARM64FlagEQ { 15914 break 15915 } 15916 yes := b.Succs[0] 15917 no := b.Succs[1] 15918 b.Kind = BlockFirst 15919 b.SetControl(nil) 15920 b.swapSuccessors() 15921 _ = no 15922 _ = yes 15923 return true 15924 } 15925 // match: (GT (FlagLT_ULT) yes no) 15926 // cond: 15927 // result: (First nil no yes) 15928 for { 15929 v := b.Control 15930 if v.Op != OpARM64FlagLT_ULT { 15931 break 15932 } 15933 yes := b.Succs[0] 15934 no := b.Succs[1] 15935 b.Kind = BlockFirst 15936 b.SetControl(nil) 15937 b.swapSuccessors() 15938 _ = no 15939 _ = yes 15940 return true 15941 } 15942 // match: (GT (FlagLT_UGT) yes no) 15943 // cond: 15944 // result: (First nil no yes) 15945 for { 15946 v := b.Control 15947 if v.Op != OpARM64FlagLT_UGT { 15948 break 15949 } 15950 yes := b.Succs[0] 15951 no := b.Succs[1] 15952 b.Kind = BlockFirst 15953 b.SetControl(nil) 15954 b.swapSuccessors() 15955 _ = no 15956 _ = yes 15957 return true 15958 } 15959 // match: (GT (FlagGT_ULT) yes no) 15960 // cond: 15961 // result: (First nil yes no) 15962 for { 15963 v := b.Control 15964 if v.Op != OpARM64FlagGT_ULT { 15965 break 15966 } 15967 yes := b.Succs[0] 15968 no := b.Succs[1] 15969 b.Kind = BlockFirst 15970 b.SetControl(nil) 15971 _ = yes 15972 _ = no 15973 return true 15974 } 15975 // match: (GT (FlagGT_UGT) yes no) 15976 // cond: 15977 // result: (First nil yes no) 15978 for { 15979 v := b.Control 15980 if v.Op != OpARM64FlagGT_UGT { 15981 break 15982 } 15983 yes := b.Succs[0] 15984 no := b.Succs[1] 15985 b.Kind = BlockFirst 15986 b.SetControl(nil) 15987 _ = yes 15988 _ = no 15989 return true 15990 } 15991 // match: (GT (InvertFlags cmp) yes no) 15992 // cond: 15993 // result: (LT cmp yes no) 15994 for { 15995 v := b.Control 15996 if v.Op != OpARM64InvertFlags { 15997 break 15998 } 15999 cmp := v.Args[0] 16000 yes := b.Succs[0] 16001 no := b.Succs[1] 16002 b.Kind = BlockARM64LT 16003 b.SetControl(cmp) 16004 _ = yes 16005 _ = no 16006 return true 16007 } 16008 case BlockIf: 16009 // match: (If (Equal cc) yes no) 16010 // cond: 16011 // result: (EQ cc yes no) 16012 for { 16013 v := b.Control 16014 if v.Op != OpARM64Equal { 16015 break 16016 } 16017 cc := v.Args[0] 16018 yes := b.Succs[0] 16019 no := b.Succs[1] 16020 b.Kind = BlockARM64EQ 16021 b.SetControl(cc) 16022 _ = yes 16023 _ = no 16024 return true 16025 } 16026 // match: (If (NotEqual cc) yes no) 16027 // cond: 16028 // result: (NE cc yes no) 16029 for { 16030 v := b.Control 16031 if v.Op != OpARM64NotEqual { 16032 break 16033 } 16034 cc := v.Args[0] 16035 yes := b.Succs[0] 16036 no := b.Succs[1] 16037 b.Kind = BlockARM64NE 16038 b.SetControl(cc) 16039 _ = yes 16040 _ = no 16041 return true 16042 } 16043 // match: (If (LessThan cc) yes no) 16044 // cond: 16045 // result: (LT cc yes no) 16046 for { 16047 v := b.Control 16048 if v.Op != OpARM64LessThan { 16049 break 16050 } 16051 cc := v.Args[0] 16052 yes := b.Succs[0] 16053 no := b.Succs[1] 16054 b.Kind = BlockARM64LT 16055 b.SetControl(cc) 16056 _ = yes 16057 _ = no 16058 return true 16059 } 16060 // match: (If (LessThanU cc) yes no) 16061 // cond: 16062 // result: (ULT cc yes no) 16063 for { 16064 v := b.Control 16065 if v.Op != OpARM64LessThanU { 16066 break 16067 } 16068 cc := v.Args[0] 16069 yes := b.Succs[0] 16070 no := b.Succs[1] 16071 b.Kind = BlockARM64ULT 16072 b.SetControl(cc) 16073 _ = yes 16074 _ = no 16075 return true 16076 } 16077 // match: (If (LessEqual cc) yes no) 16078 // cond: 16079 // result: (LE cc yes no) 16080 for { 16081 v := b.Control 16082 if v.Op != OpARM64LessEqual { 16083 break 16084 } 16085 cc := v.Args[0] 16086 yes := b.Succs[0] 16087 no := b.Succs[1] 16088 b.Kind = BlockARM64LE 16089 b.SetControl(cc) 16090 _ = yes 16091 _ = no 16092 return true 16093 } 16094 // match: (If (LessEqualU cc) yes no) 16095 // cond: 16096 // result: (ULE cc yes no) 16097 for { 16098 v := b.Control 16099 if v.Op != OpARM64LessEqualU { 16100 break 16101 } 16102 cc := v.Args[0] 16103 yes := b.Succs[0] 16104 no := b.Succs[1] 16105 b.Kind = BlockARM64ULE 16106 b.SetControl(cc) 16107 _ = yes 16108 _ = no 16109 return true 16110 } 16111 // match: (If (GreaterThan cc) yes no) 16112 // cond: 16113 // result: (GT cc yes no) 16114 for { 16115 v := b.Control 16116 if v.Op != OpARM64GreaterThan { 16117 break 16118 } 16119 cc := v.Args[0] 16120 yes := b.Succs[0] 16121 no := b.Succs[1] 16122 b.Kind = BlockARM64GT 16123 b.SetControl(cc) 16124 _ = yes 16125 _ = no 16126 return true 16127 } 16128 // match: (If (GreaterThanU cc) yes no) 16129 // cond: 16130 // result: (UGT cc yes no) 16131 for { 16132 v := b.Control 16133 if v.Op != OpARM64GreaterThanU { 16134 break 16135 } 16136 cc := v.Args[0] 16137 yes := b.Succs[0] 16138 no := b.Succs[1] 16139 b.Kind = BlockARM64UGT 16140 b.SetControl(cc) 16141 _ = yes 16142 _ = no 16143 return true 16144 } 16145 // match: (If (GreaterEqual cc) yes no) 16146 // cond: 16147 // result: (GE cc yes no) 16148 for { 16149 v := b.Control 16150 if v.Op != OpARM64GreaterEqual { 16151 break 16152 } 16153 cc := v.Args[0] 16154 yes := b.Succs[0] 16155 no := b.Succs[1] 16156 b.Kind = BlockARM64GE 16157 b.SetControl(cc) 16158 _ = yes 16159 _ = no 16160 return true 16161 } 16162 // match: (If (GreaterEqualU cc) yes no) 16163 // cond: 16164 // result: (UGE cc yes no) 16165 for { 16166 v := b.Control 16167 if v.Op != OpARM64GreaterEqualU { 16168 break 16169 } 16170 cc := v.Args[0] 16171 yes := b.Succs[0] 16172 no := b.Succs[1] 16173 b.Kind = BlockARM64UGE 16174 b.SetControl(cc) 16175 _ = yes 16176 _ = no 16177 return true 16178 } 16179 // match: (If cond yes no) 16180 // cond: 16181 // result: (NZ cond yes no) 16182 for { 16183 v := b.Control 16184 _ = v 16185 cond := b.Control 16186 yes := b.Succs[0] 16187 no := b.Succs[1] 16188 b.Kind = BlockARM64NZ 16189 b.SetControl(cond) 16190 _ = yes 16191 _ = no 16192 return true 16193 } 16194 case BlockARM64LE: 16195 // match: (LE (FlagEQ) yes no) 16196 // cond: 16197 // result: (First nil yes no) 16198 for { 16199 v := b.Control 16200 if v.Op != OpARM64FlagEQ { 16201 break 16202 } 16203 yes := b.Succs[0] 16204 no := b.Succs[1] 16205 b.Kind = BlockFirst 16206 b.SetControl(nil) 16207 _ = yes 16208 _ = no 16209 return true 16210 } 16211 // match: (LE (FlagLT_ULT) yes no) 16212 // cond: 16213 // result: (First nil yes no) 16214 for { 16215 v := b.Control 16216 if v.Op != OpARM64FlagLT_ULT { 16217 break 16218 } 16219 yes := b.Succs[0] 16220 no := b.Succs[1] 16221 b.Kind = BlockFirst 16222 b.SetControl(nil) 16223 _ = yes 16224 _ = no 16225 return true 16226 } 16227 // match: (LE (FlagLT_UGT) yes no) 16228 // cond: 16229 // result: (First nil yes no) 16230 for { 16231 v := b.Control 16232 if v.Op != OpARM64FlagLT_UGT { 16233 break 16234 } 16235 yes := b.Succs[0] 16236 no := b.Succs[1] 16237 b.Kind = BlockFirst 16238 b.SetControl(nil) 16239 _ = yes 16240 _ = no 16241 return true 16242 } 16243 // match: (LE (FlagGT_ULT) yes no) 16244 // cond: 16245 // result: (First nil no yes) 16246 for { 16247 v := b.Control 16248 if v.Op != OpARM64FlagGT_ULT { 16249 break 16250 } 16251 yes := b.Succs[0] 16252 no := b.Succs[1] 16253 b.Kind = BlockFirst 16254 b.SetControl(nil) 16255 b.swapSuccessors() 16256 _ = no 16257 _ = yes 16258 return true 16259 } 16260 // match: (LE (FlagGT_UGT) yes no) 16261 // cond: 16262 // result: (First nil no yes) 16263 for { 16264 v := b.Control 16265 if v.Op != OpARM64FlagGT_UGT { 16266 break 16267 } 16268 yes := b.Succs[0] 16269 no := b.Succs[1] 16270 b.Kind = BlockFirst 16271 b.SetControl(nil) 16272 b.swapSuccessors() 16273 _ = no 16274 _ = yes 16275 return true 16276 } 16277 // match: (LE (InvertFlags cmp) yes no) 16278 // cond: 16279 // result: (GE cmp yes no) 16280 for { 16281 v := b.Control 16282 if v.Op != OpARM64InvertFlags { 16283 break 16284 } 16285 cmp := v.Args[0] 16286 yes := b.Succs[0] 16287 no := b.Succs[1] 16288 b.Kind = BlockARM64GE 16289 b.SetControl(cmp) 16290 _ = yes 16291 _ = no 16292 return true 16293 } 16294 case BlockARM64LT: 16295 // match: (LT (FlagEQ) yes no) 16296 // cond: 16297 // result: (First nil no yes) 16298 for { 16299 v := b.Control 16300 if v.Op != OpARM64FlagEQ { 16301 break 16302 } 16303 yes := b.Succs[0] 16304 no := b.Succs[1] 16305 b.Kind = BlockFirst 16306 b.SetControl(nil) 16307 b.swapSuccessors() 16308 _ = no 16309 _ = yes 16310 return true 16311 } 16312 // match: (LT (FlagLT_ULT) yes no) 16313 // cond: 16314 // result: (First nil yes no) 16315 for { 16316 v := b.Control 16317 if v.Op != OpARM64FlagLT_ULT { 16318 break 16319 } 16320 yes := b.Succs[0] 16321 no := b.Succs[1] 16322 b.Kind = BlockFirst 16323 b.SetControl(nil) 16324 _ = yes 16325 _ = no 16326 return true 16327 } 16328 // match: (LT (FlagLT_UGT) yes no) 16329 // cond: 16330 // result: (First nil yes no) 16331 for { 16332 v := b.Control 16333 if v.Op != OpARM64FlagLT_UGT { 16334 break 16335 } 16336 yes := b.Succs[0] 16337 no := b.Succs[1] 16338 b.Kind = BlockFirst 16339 b.SetControl(nil) 16340 _ = yes 16341 _ = no 16342 return true 16343 } 16344 // match: (LT (FlagGT_ULT) yes no) 16345 // cond: 16346 // result: (First nil no yes) 16347 for { 16348 v := b.Control 16349 if v.Op != OpARM64FlagGT_ULT { 16350 break 16351 } 16352 yes := b.Succs[0] 16353 no := b.Succs[1] 16354 b.Kind = BlockFirst 16355 b.SetControl(nil) 16356 b.swapSuccessors() 16357 _ = no 16358 _ = yes 16359 return true 16360 } 16361 // match: (LT (FlagGT_UGT) yes no) 16362 // cond: 16363 // result: (First nil no yes) 16364 for { 16365 v := b.Control 16366 if v.Op != OpARM64FlagGT_UGT { 16367 break 16368 } 16369 yes := b.Succs[0] 16370 no := b.Succs[1] 16371 b.Kind = BlockFirst 16372 b.SetControl(nil) 16373 b.swapSuccessors() 16374 _ = no 16375 _ = yes 16376 return true 16377 } 16378 // match: (LT (InvertFlags cmp) yes no) 16379 // cond: 16380 // result: (GT cmp yes no) 16381 for { 16382 v := b.Control 16383 if v.Op != OpARM64InvertFlags { 16384 break 16385 } 16386 cmp := v.Args[0] 16387 yes := b.Succs[0] 16388 no := b.Succs[1] 16389 b.Kind = BlockARM64GT 16390 b.SetControl(cmp) 16391 _ = yes 16392 _ = no 16393 return true 16394 } 16395 case BlockARM64NE: 16396 // match: (NE (CMPconst [0] x) yes no) 16397 // cond: 16398 // result: (NZ x yes no) 16399 for { 16400 v := b.Control 16401 if v.Op != OpARM64CMPconst { 16402 break 16403 } 16404 if v.AuxInt != 0 { 16405 break 16406 } 16407 x := v.Args[0] 16408 yes := b.Succs[0] 16409 no := b.Succs[1] 16410 b.Kind = BlockARM64NZ 16411 b.SetControl(x) 16412 _ = yes 16413 _ = no 16414 return true 16415 } 16416 // match: (NE (CMPWconst [0] x) yes no) 16417 // cond: 16418 // result: (NZW x yes no) 16419 for { 16420 v := b.Control 16421 if v.Op != OpARM64CMPWconst { 16422 break 16423 } 16424 if v.AuxInt != 0 { 16425 break 16426 } 16427 x := v.Args[0] 16428 yes := b.Succs[0] 16429 no := b.Succs[1] 16430 b.Kind = BlockARM64NZW 16431 b.SetControl(x) 16432 _ = yes 16433 _ = no 16434 return true 16435 } 16436 // match: (NE (FlagEQ) yes no) 16437 // cond: 16438 // result: (First nil no yes) 16439 for { 16440 v := b.Control 16441 if v.Op != OpARM64FlagEQ { 16442 break 16443 } 16444 yes := b.Succs[0] 16445 no := b.Succs[1] 16446 b.Kind = BlockFirst 16447 b.SetControl(nil) 16448 b.swapSuccessors() 16449 _ = no 16450 _ = yes 16451 return true 16452 } 16453 // match: (NE (FlagLT_ULT) yes no) 16454 // cond: 16455 // result: (First nil yes no) 16456 for { 16457 v := b.Control 16458 if v.Op != OpARM64FlagLT_ULT { 16459 break 16460 } 16461 yes := b.Succs[0] 16462 no := b.Succs[1] 16463 b.Kind = BlockFirst 16464 b.SetControl(nil) 16465 _ = yes 16466 _ = no 16467 return true 16468 } 16469 // match: (NE (FlagLT_UGT) yes no) 16470 // cond: 16471 // result: (First nil yes no) 16472 for { 16473 v := b.Control 16474 if v.Op != OpARM64FlagLT_UGT { 16475 break 16476 } 16477 yes := b.Succs[0] 16478 no := b.Succs[1] 16479 b.Kind = BlockFirst 16480 b.SetControl(nil) 16481 _ = yes 16482 _ = no 16483 return true 16484 } 16485 // match: (NE (FlagGT_ULT) yes no) 16486 // cond: 16487 // result: (First nil yes no) 16488 for { 16489 v := b.Control 16490 if v.Op != OpARM64FlagGT_ULT { 16491 break 16492 } 16493 yes := b.Succs[0] 16494 no := b.Succs[1] 16495 b.Kind = BlockFirst 16496 b.SetControl(nil) 16497 _ = yes 16498 _ = no 16499 return true 16500 } 16501 // match: (NE (FlagGT_UGT) yes no) 16502 // cond: 16503 // result: (First nil yes no) 16504 for { 16505 v := b.Control 16506 if v.Op != OpARM64FlagGT_UGT { 16507 break 16508 } 16509 yes := b.Succs[0] 16510 no := b.Succs[1] 16511 b.Kind = BlockFirst 16512 b.SetControl(nil) 16513 _ = yes 16514 _ = no 16515 return true 16516 } 16517 // match: (NE (InvertFlags cmp) yes no) 16518 // cond: 16519 // result: (NE cmp yes no) 16520 for { 16521 v := b.Control 16522 if v.Op != OpARM64InvertFlags { 16523 break 16524 } 16525 cmp := v.Args[0] 16526 yes := b.Succs[0] 16527 no := b.Succs[1] 16528 b.Kind = BlockARM64NE 16529 b.SetControl(cmp) 16530 _ = yes 16531 _ = no 16532 return true 16533 } 16534 case BlockARM64NZ: 16535 // match: (NZ (Equal cc) yes no) 16536 // cond: 16537 // result: (EQ cc yes no) 16538 for { 16539 v := b.Control 16540 if v.Op != OpARM64Equal { 16541 break 16542 } 16543 cc := v.Args[0] 16544 yes := b.Succs[0] 16545 no := b.Succs[1] 16546 b.Kind = BlockARM64EQ 16547 b.SetControl(cc) 16548 _ = yes 16549 _ = no 16550 return true 16551 } 16552 // match: (NZ (NotEqual cc) yes no) 16553 // cond: 16554 // result: (NE cc yes no) 16555 for { 16556 v := b.Control 16557 if v.Op != OpARM64NotEqual { 16558 break 16559 } 16560 cc := v.Args[0] 16561 yes := b.Succs[0] 16562 no := b.Succs[1] 16563 b.Kind = BlockARM64NE 16564 b.SetControl(cc) 16565 _ = yes 16566 _ = no 16567 return true 16568 } 16569 // match: (NZ (LessThan cc) yes no) 16570 // cond: 16571 // result: (LT cc yes no) 16572 for { 16573 v := b.Control 16574 if v.Op != OpARM64LessThan { 16575 break 16576 } 16577 cc := v.Args[0] 16578 yes := b.Succs[0] 16579 no := b.Succs[1] 16580 b.Kind = BlockARM64LT 16581 b.SetControl(cc) 16582 _ = yes 16583 _ = no 16584 return true 16585 } 16586 // match: (NZ (LessThanU cc) yes no) 16587 // cond: 16588 // result: (ULT cc yes no) 16589 for { 16590 v := b.Control 16591 if v.Op != OpARM64LessThanU { 16592 break 16593 } 16594 cc := v.Args[0] 16595 yes := b.Succs[0] 16596 no := b.Succs[1] 16597 b.Kind = BlockARM64ULT 16598 b.SetControl(cc) 16599 _ = yes 16600 _ = no 16601 return true 16602 } 16603 // match: (NZ (LessEqual cc) yes no) 16604 // cond: 16605 // result: (LE cc yes no) 16606 for { 16607 v := b.Control 16608 if v.Op != OpARM64LessEqual { 16609 break 16610 } 16611 cc := v.Args[0] 16612 yes := b.Succs[0] 16613 no := b.Succs[1] 16614 b.Kind = BlockARM64LE 16615 b.SetControl(cc) 16616 _ = yes 16617 _ = no 16618 return true 16619 } 16620 // match: (NZ (LessEqualU cc) yes no) 16621 // cond: 16622 // result: (ULE cc yes no) 16623 for { 16624 v := b.Control 16625 if v.Op != OpARM64LessEqualU { 16626 break 16627 } 16628 cc := v.Args[0] 16629 yes := b.Succs[0] 16630 no := b.Succs[1] 16631 b.Kind = BlockARM64ULE 16632 b.SetControl(cc) 16633 _ = yes 16634 _ = no 16635 return true 16636 } 16637 // match: (NZ (GreaterThan cc) yes no) 16638 // cond: 16639 // result: (GT cc yes no) 16640 for { 16641 v := b.Control 16642 if v.Op != OpARM64GreaterThan { 16643 break 16644 } 16645 cc := v.Args[0] 16646 yes := b.Succs[0] 16647 no := b.Succs[1] 16648 b.Kind = BlockARM64GT 16649 b.SetControl(cc) 16650 _ = yes 16651 _ = no 16652 return true 16653 } 16654 // match: (NZ (GreaterThanU cc) yes no) 16655 // cond: 16656 // result: (UGT cc yes no) 16657 for { 16658 v := b.Control 16659 if v.Op != OpARM64GreaterThanU { 16660 break 16661 } 16662 cc := v.Args[0] 16663 yes := b.Succs[0] 16664 no := b.Succs[1] 16665 b.Kind = BlockARM64UGT 16666 b.SetControl(cc) 16667 _ = yes 16668 _ = no 16669 return true 16670 } 16671 // match: (NZ (GreaterEqual cc) yes no) 16672 // cond: 16673 // result: (GE cc yes no) 16674 for { 16675 v := b.Control 16676 if v.Op != OpARM64GreaterEqual { 16677 break 16678 } 16679 cc := v.Args[0] 16680 yes := b.Succs[0] 16681 no := b.Succs[1] 16682 b.Kind = BlockARM64GE 16683 b.SetControl(cc) 16684 _ = yes 16685 _ = no 16686 return true 16687 } 16688 // match: (NZ (GreaterEqualU cc) yes no) 16689 // cond: 16690 // result: (UGE cc yes no) 16691 for { 16692 v := b.Control 16693 if v.Op != OpARM64GreaterEqualU { 16694 break 16695 } 16696 cc := v.Args[0] 16697 yes := b.Succs[0] 16698 no := b.Succs[1] 16699 b.Kind = BlockARM64UGE 16700 b.SetControl(cc) 16701 _ = yes 16702 _ = no 16703 return true 16704 } 16705 // match: (NZ (MOVDconst [0]) yes no) 16706 // cond: 16707 // result: (First nil no yes) 16708 for { 16709 v := b.Control 16710 if v.Op != OpARM64MOVDconst { 16711 break 16712 } 16713 if v.AuxInt != 0 { 16714 break 16715 } 16716 yes := b.Succs[0] 16717 no := b.Succs[1] 16718 b.Kind = BlockFirst 16719 b.SetControl(nil) 16720 b.swapSuccessors() 16721 _ = no 16722 _ = yes 16723 return true 16724 } 16725 // match: (NZ (MOVDconst [c]) yes no) 16726 // cond: c != 0 16727 // result: (First nil yes no) 16728 for { 16729 v := b.Control 16730 if v.Op != OpARM64MOVDconst { 16731 break 16732 } 16733 c := v.AuxInt 16734 yes := b.Succs[0] 16735 no := b.Succs[1] 16736 if !(c != 0) { 16737 break 16738 } 16739 b.Kind = BlockFirst 16740 b.SetControl(nil) 16741 _ = yes 16742 _ = no 16743 return true 16744 } 16745 case BlockARM64NZW: 16746 // match: (NZW (MOVDconst [c]) yes no) 16747 // cond: int32(c) == 0 16748 // result: (First nil no yes) 16749 for { 16750 v := b.Control 16751 if v.Op != OpARM64MOVDconst { 16752 break 16753 } 16754 c := v.AuxInt 16755 yes := b.Succs[0] 16756 no := b.Succs[1] 16757 if !(int32(c) == 0) { 16758 break 16759 } 16760 b.Kind = BlockFirst 16761 b.SetControl(nil) 16762 b.swapSuccessors() 16763 _ = no 16764 _ = yes 16765 return true 16766 } 16767 // match: (NZW (MOVDconst [c]) yes no) 16768 // cond: int32(c) != 0 16769 // result: (First nil yes no) 16770 for { 16771 v := b.Control 16772 if v.Op != OpARM64MOVDconst { 16773 break 16774 } 16775 c := v.AuxInt 16776 yes := b.Succs[0] 16777 no := b.Succs[1] 16778 if !(int32(c) != 0) { 16779 break 16780 } 16781 b.Kind = BlockFirst 16782 b.SetControl(nil) 16783 _ = yes 16784 _ = no 16785 return true 16786 } 16787 case BlockARM64UGE: 16788 // match: (UGE (FlagEQ) yes no) 16789 // cond: 16790 // result: (First nil yes no) 16791 for { 16792 v := b.Control 16793 if v.Op != OpARM64FlagEQ { 16794 break 16795 } 16796 yes := b.Succs[0] 16797 no := b.Succs[1] 16798 b.Kind = BlockFirst 16799 b.SetControl(nil) 16800 _ = yes 16801 _ = no 16802 return true 16803 } 16804 // match: (UGE (FlagLT_ULT) yes no) 16805 // cond: 16806 // result: (First nil no yes) 16807 for { 16808 v := b.Control 16809 if v.Op != OpARM64FlagLT_ULT { 16810 break 16811 } 16812 yes := b.Succs[0] 16813 no := b.Succs[1] 16814 b.Kind = BlockFirst 16815 b.SetControl(nil) 16816 b.swapSuccessors() 16817 _ = no 16818 _ = yes 16819 return true 16820 } 16821 // match: (UGE (FlagLT_UGT) yes no) 16822 // cond: 16823 // result: (First nil yes no) 16824 for { 16825 v := b.Control 16826 if v.Op != OpARM64FlagLT_UGT { 16827 break 16828 } 16829 yes := b.Succs[0] 16830 no := b.Succs[1] 16831 b.Kind = BlockFirst 16832 b.SetControl(nil) 16833 _ = yes 16834 _ = no 16835 return true 16836 } 16837 // match: (UGE (FlagGT_ULT) yes no) 16838 // cond: 16839 // result: (First nil no yes) 16840 for { 16841 v := b.Control 16842 if v.Op != OpARM64FlagGT_ULT { 16843 break 16844 } 16845 yes := b.Succs[0] 16846 no := b.Succs[1] 16847 b.Kind = BlockFirst 16848 b.SetControl(nil) 16849 b.swapSuccessors() 16850 _ = no 16851 _ = yes 16852 return true 16853 } 16854 // match: (UGE (FlagGT_UGT) yes no) 16855 // cond: 16856 // result: (First nil yes no) 16857 for { 16858 v := b.Control 16859 if v.Op != OpARM64FlagGT_UGT { 16860 break 16861 } 16862 yes := b.Succs[0] 16863 no := b.Succs[1] 16864 b.Kind = BlockFirst 16865 b.SetControl(nil) 16866 _ = yes 16867 _ = no 16868 return true 16869 } 16870 // match: (UGE (InvertFlags cmp) yes no) 16871 // cond: 16872 // result: (ULE cmp yes no) 16873 for { 16874 v := b.Control 16875 if v.Op != OpARM64InvertFlags { 16876 break 16877 } 16878 cmp := v.Args[0] 16879 yes := b.Succs[0] 16880 no := b.Succs[1] 16881 b.Kind = BlockARM64ULE 16882 b.SetControl(cmp) 16883 _ = yes 16884 _ = no 16885 return true 16886 } 16887 case BlockARM64UGT: 16888 // match: (UGT (FlagEQ) yes no) 16889 // cond: 16890 // result: (First nil no yes) 16891 for { 16892 v := b.Control 16893 if v.Op != OpARM64FlagEQ { 16894 break 16895 } 16896 yes := b.Succs[0] 16897 no := b.Succs[1] 16898 b.Kind = BlockFirst 16899 b.SetControl(nil) 16900 b.swapSuccessors() 16901 _ = no 16902 _ = yes 16903 return true 16904 } 16905 // match: (UGT (FlagLT_ULT) yes no) 16906 // cond: 16907 // result: (First nil no yes) 16908 for { 16909 v := b.Control 16910 if v.Op != OpARM64FlagLT_ULT { 16911 break 16912 } 16913 yes := b.Succs[0] 16914 no := b.Succs[1] 16915 b.Kind = BlockFirst 16916 b.SetControl(nil) 16917 b.swapSuccessors() 16918 _ = no 16919 _ = yes 16920 return true 16921 } 16922 // match: (UGT (FlagLT_UGT) yes no) 16923 // cond: 16924 // result: (First nil yes no) 16925 for { 16926 v := b.Control 16927 if v.Op != OpARM64FlagLT_UGT { 16928 break 16929 } 16930 yes := b.Succs[0] 16931 no := b.Succs[1] 16932 b.Kind = BlockFirst 16933 b.SetControl(nil) 16934 _ = yes 16935 _ = no 16936 return true 16937 } 16938 // match: (UGT (FlagGT_ULT) yes no) 16939 // cond: 16940 // result: (First nil no yes) 16941 for { 16942 v := b.Control 16943 if v.Op != OpARM64FlagGT_ULT { 16944 break 16945 } 16946 yes := b.Succs[0] 16947 no := b.Succs[1] 16948 b.Kind = BlockFirst 16949 b.SetControl(nil) 16950 b.swapSuccessors() 16951 _ = no 16952 _ = yes 16953 return true 16954 } 16955 // match: (UGT (FlagGT_UGT) yes no) 16956 // cond: 16957 // result: (First nil yes no) 16958 for { 16959 v := b.Control 16960 if v.Op != OpARM64FlagGT_UGT { 16961 break 16962 } 16963 yes := b.Succs[0] 16964 no := b.Succs[1] 16965 b.Kind = BlockFirst 16966 b.SetControl(nil) 16967 _ = yes 16968 _ = no 16969 return true 16970 } 16971 // match: (UGT (InvertFlags cmp) yes no) 16972 // cond: 16973 // result: (ULT cmp yes no) 16974 for { 16975 v := b.Control 16976 if v.Op != OpARM64InvertFlags { 16977 break 16978 } 16979 cmp := v.Args[0] 16980 yes := b.Succs[0] 16981 no := b.Succs[1] 16982 b.Kind = BlockARM64ULT 16983 b.SetControl(cmp) 16984 _ = yes 16985 _ = no 16986 return true 16987 } 16988 case BlockARM64ULE: 16989 // match: (ULE (FlagEQ) yes no) 16990 // cond: 16991 // result: (First nil yes no) 16992 for { 16993 v := b.Control 16994 if v.Op != OpARM64FlagEQ { 16995 break 16996 } 16997 yes := b.Succs[0] 16998 no := b.Succs[1] 16999 b.Kind = BlockFirst 17000 b.SetControl(nil) 17001 _ = yes 17002 _ = no 17003 return true 17004 } 17005 // match: (ULE (FlagLT_ULT) yes no) 17006 // cond: 17007 // result: (First nil yes no) 17008 for { 17009 v := b.Control 17010 if v.Op != OpARM64FlagLT_ULT { 17011 break 17012 } 17013 yes := b.Succs[0] 17014 no := b.Succs[1] 17015 b.Kind = BlockFirst 17016 b.SetControl(nil) 17017 _ = yes 17018 _ = no 17019 return true 17020 } 17021 // match: (ULE (FlagLT_UGT) yes no) 17022 // cond: 17023 // result: (First nil no yes) 17024 for { 17025 v := b.Control 17026 if v.Op != OpARM64FlagLT_UGT { 17027 break 17028 } 17029 yes := b.Succs[0] 17030 no := b.Succs[1] 17031 b.Kind = BlockFirst 17032 b.SetControl(nil) 17033 b.swapSuccessors() 17034 _ = no 17035 _ = yes 17036 return true 17037 } 17038 // match: (ULE (FlagGT_ULT) yes no) 17039 // cond: 17040 // result: (First nil yes no) 17041 for { 17042 v := b.Control 17043 if v.Op != OpARM64FlagGT_ULT { 17044 break 17045 } 17046 yes := b.Succs[0] 17047 no := b.Succs[1] 17048 b.Kind = BlockFirst 17049 b.SetControl(nil) 17050 _ = yes 17051 _ = no 17052 return true 17053 } 17054 // match: (ULE (FlagGT_UGT) yes no) 17055 // cond: 17056 // result: (First nil no yes) 17057 for { 17058 v := b.Control 17059 if v.Op != OpARM64FlagGT_UGT { 17060 break 17061 } 17062 yes := b.Succs[0] 17063 no := b.Succs[1] 17064 b.Kind = BlockFirst 17065 b.SetControl(nil) 17066 b.swapSuccessors() 17067 _ = no 17068 _ = yes 17069 return true 17070 } 17071 // match: (ULE (InvertFlags cmp) yes no) 17072 // cond: 17073 // result: (UGE cmp yes no) 17074 for { 17075 v := b.Control 17076 if v.Op != OpARM64InvertFlags { 17077 break 17078 } 17079 cmp := v.Args[0] 17080 yes := b.Succs[0] 17081 no := b.Succs[1] 17082 b.Kind = BlockARM64UGE 17083 b.SetControl(cmp) 17084 _ = yes 17085 _ = no 17086 return true 17087 } 17088 case BlockARM64ULT: 17089 // match: (ULT (FlagEQ) yes no) 17090 // cond: 17091 // result: (First nil no yes) 17092 for { 17093 v := b.Control 17094 if v.Op != OpARM64FlagEQ { 17095 break 17096 } 17097 yes := b.Succs[0] 17098 no := b.Succs[1] 17099 b.Kind = BlockFirst 17100 b.SetControl(nil) 17101 b.swapSuccessors() 17102 _ = no 17103 _ = yes 17104 return true 17105 } 17106 // match: (ULT (FlagLT_ULT) yes no) 17107 // cond: 17108 // result: (First nil yes no) 17109 for { 17110 v := b.Control 17111 if v.Op != OpARM64FlagLT_ULT { 17112 break 17113 } 17114 yes := b.Succs[0] 17115 no := b.Succs[1] 17116 b.Kind = BlockFirst 17117 b.SetControl(nil) 17118 _ = yes 17119 _ = no 17120 return true 17121 } 17122 // match: (ULT (FlagLT_UGT) yes no) 17123 // cond: 17124 // result: (First nil no yes) 17125 for { 17126 v := b.Control 17127 if v.Op != OpARM64FlagLT_UGT { 17128 break 17129 } 17130 yes := b.Succs[0] 17131 no := b.Succs[1] 17132 b.Kind = BlockFirst 17133 b.SetControl(nil) 17134 b.swapSuccessors() 17135 _ = no 17136 _ = yes 17137 return true 17138 } 17139 // match: (ULT (FlagGT_ULT) yes no) 17140 // cond: 17141 // result: (First nil yes no) 17142 for { 17143 v := b.Control 17144 if v.Op != OpARM64FlagGT_ULT { 17145 break 17146 } 17147 yes := b.Succs[0] 17148 no := b.Succs[1] 17149 b.Kind = BlockFirst 17150 b.SetControl(nil) 17151 _ = yes 17152 _ = no 17153 return true 17154 } 17155 // match: (ULT (FlagGT_UGT) yes no) 17156 // cond: 17157 // result: (First nil no yes) 17158 for { 17159 v := b.Control 17160 if v.Op != OpARM64FlagGT_UGT { 17161 break 17162 } 17163 yes := b.Succs[0] 17164 no := b.Succs[1] 17165 b.Kind = BlockFirst 17166 b.SetControl(nil) 17167 b.swapSuccessors() 17168 _ = no 17169 _ = yes 17170 return true 17171 } 17172 // match: (ULT (InvertFlags cmp) yes no) 17173 // cond: 17174 // result: (UGT cmp yes no) 17175 for { 17176 v := b.Control 17177 if v.Op != OpARM64InvertFlags { 17178 break 17179 } 17180 cmp := v.Args[0] 17181 yes := b.Succs[0] 17182 no := b.Succs[1] 17183 b.Kind = BlockARM64UGT 17184 b.SetControl(cmp) 17185 _ = yes 17186 _ = no 17187 return true 17188 } 17189 case BlockARM64Z: 17190 // match: (Z (MOVDconst [0]) yes no) 17191 // cond: 17192 // result: (First nil yes no) 17193 for { 17194 v := b.Control 17195 if v.Op != OpARM64MOVDconst { 17196 break 17197 } 17198 if v.AuxInt != 0 { 17199 break 17200 } 17201 yes := b.Succs[0] 17202 no := b.Succs[1] 17203 b.Kind = BlockFirst 17204 b.SetControl(nil) 17205 _ = yes 17206 _ = no 17207 return true 17208 } 17209 // match: (Z (MOVDconst [c]) yes no) 17210 // cond: c != 0 17211 // result: (First nil no yes) 17212 for { 17213 v := b.Control 17214 if v.Op != OpARM64MOVDconst { 17215 break 17216 } 17217 c := v.AuxInt 17218 yes := b.Succs[0] 17219 no := b.Succs[1] 17220 if !(c != 0) { 17221 break 17222 } 17223 b.Kind = BlockFirst 17224 b.SetControl(nil) 17225 b.swapSuccessors() 17226 _ = no 17227 _ = yes 17228 return true 17229 } 17230 case BlockARM64ZW: 17231 // match: (ZW (MOVDconst [c]) yes no) 17232 // cond: int32(c) == 0 17233 // result: (First nil yes no) 17234 for { 17235 v := b.Control 17236 if v.Op != OpARM64MOVDconst { 17237 break 17238 } 17239 c := v.AuxInt 17240 yes := b.Succs[0] 17241 no := b.Succs[1] 17242 if !(int32(c) == 0) { 17243 break 17244 } 17245 b.Kind = BlockFirst 17246 b.SetControl(nil) 17247 _ = yes 17248 _ = no 17249 return true 17250 } 17251 // match: (ZW (MOVDconst [c]) yes no) 17252 // cond: int32(c) != 0 17253 // result: (First nil no yes) 17254 for { 17255 v := b.Control 17256 if v.Op != OpARM64MOVDconst { 17257 break 17258 } 17259 c := v.AuxInt 17260 yes := b.Succs[0] 17261 no := b.Succs[1] 17262 if !(int32(c) != 0) { 17263 break 17264 } 17265 b.Kind = BlockFirst 17266 b.SetControl(nil) 17267 b.swapSuccessors() 17268 _ = no 17269 _ = yes 17270 return true 17271 } 17272 } 17273 return false 17274 }