github.com/FenixAra/go@v0.0.0-20170127160404-96ea0918e670/src/cmd/compile/internal/ssa/rewriteARM64.go (about) 1 // autogenerated from gen/ARM64.rules: do not edit! 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 8 var _ = math.MinInt8 // in case not otherwise used 9 func rewriteValueARM64(v *Value, config *Config) bool { 10 switch v.Op { 11 case OpARM64ADD: 12 return rewriteValueARM64_OpARM64ADD(v, config) 13 case OpARM64ADDconst: 14 return rewriteValueARM64_OpARM64ADDconst(v, config) 15 case OpARM64ADDshiftLL: 16 return rewriteValueARM64_OpARM64ADDshiftLL(v, config) 17 case OpARM64ADDshiftRA: 18 return rewriteValueARM64_OpARM64ADDshiftRA(v, config) 19 case OpARM64ADDshiftRL: 20 return rewriteValueARM64_OpARM64ADDshiftRL(v, config) 21 case OpARM64AND: 22 return rewriteValueARM64_OpARM64AND(v, config) 23 case OpARM64ANDconst: 24 return rewriteValueARM64_OpARM64ANDconst(v, config) 25 case OpARM64ANDshiftLL: 26 return rewriteValueARM64_OpARM64ANDshiftLL(v, config) 27 case OpARM64ANDshiftRA: 28 return rewriteValueARM64_OpARM64ANDshiftRA(v, config) 29 case OpARM64ANDshiftRL: 30 return rewriteValueARM64_OpARM64ANDshiftRL(v, config) 31 case OpARM64BIC: 32 return rewriteValueARM64_OpARM64BIC(v, config) 33 case OpARM64BICconst: 34 return rewriteValueARM64_OpARM64BICconst(v, config) 35 case OpARM64BICshiftLL: 36 return rewriteValueARM64_OpARM64BICshiftLL(v, config) 37 case OpARM64BICshiftRA: 38 return rewriteValueARM64_OpARM64BICshiftRA(v, config) 39 case OpARM64BICshiftRL: 40 return rewriteValueARM64_OpARM64BICshiftRL(v, config) 41 case OpARM64CMP: 42 return rewriteValueARM64_OpARM64CMP(v, config) 43 case OpARM64CMPW: 44 return rewriteValueARM64_OpARM64CMPW(v, config) 45 case OpARM64CMPWconst: 46 return rewriteValueARM64_OpARM64CMPWconst(v, config) 47 case OpARM64CMPconst: 48 return rewriteValueARM64_OpARM64CMPconst(v, config) 49 case OpARM64CMPshiftLL: 50 return rewriteValueARM64_OpARM64CMPshiftLL(v, config) 51 case OpARM64CMPshiftRA: 52 return rewriteValueARM64_OpARM64CMPshiftRA(v, config) 53 case OpARM64CMPshiftRL: 54 return rewriteValueARM64_OpARM64CMPshiftRL(v, config) 55 case OpARM64CSELULT: 56 return rewriteValueARM64_OpARM64CSELULT(v, config) 57 case OpARM64CSELULT0: 58 return rewriteValueARM64_OpARM64CSELULT0(v, config) 59 case OpARM64DIV: 60 return rewriteValueARM64_OpARM64DIV(v, config) 61 case OpARM64DIVW: 62 return rewriteValueARM64_OpARM64DIVW(v, config) 63 case OpARM64Equal: 64 return rewriteValueARM64_OpARM64Equal(v, config) 65 case OpARM64FMOVDload: 66 return rewriteValueARM64_OpARM64FMOVDload(v, config) 67 case OpARM64FMOVDstore: 68 return rewriteValueARM64_OpARM64FMOVDstore(v, config) 69 case OpARM64FMOVSload: 70 return rewriteValueARM64_OpARM64FMOVSload(v, config) 71 case OpARM64FMOVSstore: 72 return rewriteValueARM64_OpARM64FMOVSstore(v, config) 73 case OpARM64GreaterEqual: 74 return rewriteValueARM64_OpARM64GreaterEqual(v, config) 75 case OpARM64GreaterEqualU: 76 return rewriteValueARM64_OpARM64GreaterEqualU(v, config) 77 case OpARM64GreaterThan: 78 return rewriteValueARM64_OpARM64GreaterThan(v, config) 79 case OpARM64GreaterThanU: 80 return rewriteValueARM64_OpARM64GreaterThanU(v, config) 81 case OpARM64LessEqual: 82 return rewriteValueARM64_OpARM64LessEqual(v, config) 83 case OpARM64LessEqualU: 84 return rewriteValueARM64_OpARM64LessEqualU(v, config) 85 case OpARM64LessThan: 86 return rewriteValueARM64_OpARM64LessThan(v, config) 87 case OpARM64LessThanU: 88 return rewriteValueARM64_OpARM64LessThanU(v, config) 89 case OpARM64MOD: 90 return rewriteValueARM64_OpARM64MOD(v, config) 91 case OpARM64MODW: 92 return rewriteValueARM64_OpARM64MODW(v, config) 93 case OpARM64MOVBUload: 94 return rewriteValueARM64_OpARM64MOVBUload(v, config) 95 case OpARM64MOVBUreg: 96 return rewriteValueARM64_OpARM64MOVBUreg(v, config) 97 case OpARM64MOVBload: 98 return rewriteValueARM64_OpARM64MOVBload(v, config) 99 case OpARM64MOVBreg: 100 return rewriteValueARM64_OpARM64MOVBreg(v, config) 101 case OpARM64MOVBstore: 102 return rewriteValueARM64_OpARM64MOVBstore(v, config) 103 case OpARM64MOVBstorezero: 104 return rewriteValueARM64_OpARM64MOVBstorezero(v, config) 105 case OpARM64MOVDload: 106 return rewriteValueARM64_OpARM64MOVDload(v, config) 107 case OpARM64MOVDreg: 108 return rewriteValueARM64_OpARM64MOVDreg(v, config) 109 case OpARM64MOVDstore: 110 return rewriteValueARM64_OpARM64MOVDstore(v, config) 111 case OpARM64MOVDstorezero: 112 return rewriteValueARM64_OpARM64MOVDstorezero(v, config) 113 case OpARM64MOVHUload: 114 return rewriteValueARM64_OpARM64MOVHUload(v, config) 115 case OpARM64MOVHUreg: 116 return rewriteValueARM64_OpARM64MOVHUreg(v, config) 117 case OpARM64MOVHload: 118 return rewriteValueARM64_OpARM64MOVHload(v, config) 119 case OpARM64MOVHreg: 120 return rewriteValueARM64_OpARM64MOVHreg(v, config) 121 case OpARM64MOVHstore: 122 return rewriteValueARM64_OpARM64MOVHstore(v, config) 123 case OpARM64MOVHstorezero: 124 return rewriteValueARM64_OpARM64MOVHstorezero(v, config) 125 case OpARM64MOVWUload: 126 return rewriteValueARM64_OpARM64MOVWUload(v, config) 127 case OpARM64MOVWUreg: 128 return rewriteValueARM64_OpARM64MOVWUreg(v, config) 129 case OpARM64MOVWload: 130 return rewriteValueARM64_OpARM64MOVWload(v, config) 131 case OpARM64MOVWreg: 132 return rewriteValueARM64_OpARM64MOVWreg(v, config) 133 case OpARM64MOVWstore: 134 return rewriteValueARM64_OpARM64MOVWstore(v, config) 135 case OpARM64MOVWstorezero: 136 return rewriteValueARM64_OpARM64MOVWstorezero(v, config) 137 case OpARM64MUL: 138 return rewriteValueARM64_OpARM64MUL(v, config) 139 case OpARM64MULW: 140 return rewriteValueARM64_OpARM64MULW(v, config) 141 case OpARM64MVN: 142 return rewriteValueARM64_OpARM64MVN(v, config) 143 case OpARM64NEG: 144 return rewriteValueARM64_OpARM64NEG(v, config) 145 case OpARM64NotEqual: 146 return rewriteValueARM64_OpARM64NotEqual(v, config) 147 case OpARM64OR: 148 return rewriteValueARM64_OpARM64OR(v, config) 149 case OpARM64ORconst: 150 return rewriteValueARM64_OpARM64ORconst(v, config) 151 case OpARM64ORshiftLL: 152 return rewriteValueARM64_OpARM64ORshiftLL(v, config) 153 case OpARM64ORshiftRA: 154 return rewriteValueARM64_OpARM64ORshiftRA(v, config) 155 case OpARM64ORshiftRL: 156 return rewriteValueARM64_OpARM64ORshiftRL(v, config) 157 case OpARM64SLL: 158 return rewriteValueARM64_OpARM64SLL(v, config) 159 case OpARM64SLLconst: 160 return rewriteValueARM64_OpARM64SLLconst(v, config) 161 case OpARM64SRA: 162 return rewriteValueARM64_OpARM64SRA(v, config) 163 case OpARM64SRAconst: 164 return rewriteValueARM64_OpARM64SRAconst(v, config) 165 case OpARM64SRL: 166 return rewriteValueARM64_OpARM64SRL(v, config) 167 case OpARM64SRLconst: 168 return rewriteValueARM64_OpARM64SRLconst(v, config) 169 case OpARM64SUB: 170 return rewriteValueARM64_OpARM64SUB(v, config) 171 case OpARM64SUBconst: 172 return rewriteValueARM64_OpARM64SUBconst(v, config) 173 case OpARM64SUBshiftLL: 174 return rewriteValueARM64_OpARM64SUBshiftLL(v, config) 175 case OpARM64SUBshiftRA: 176 return rewriteValueARM64_OpARM64SUBshiftRA(v, config) 177 case OpARM64SUBshiftRL: 178 return rewriteValueARM64_OpARM64SUBshiftRL(v, config) 179 case OpARM64UDIV: 180 return rewriteValueARM64_OpARM64UDIV(v, config) 181 case OpARM64UDIVW: 182 return rewriteValueARM64_OpARM64UDIVW(v, config) 183 case OpARM64UMOD: 184 return rewriteValueARM64_OpARM64UMOD(v, config) 185 case OpARM64UMODW: 186 return rewriteValueARM64_OpARM64UMODW(v, config) 187 case OpARM64XOR: 188 return rewriteValueARM64_OpARM64XOR(v, config) 189 case OpARM64XORconst: 190 return rewriteValueARM64_OpARM64XORconst(v, config) 191 case OpARM64XORshiftLL: 192 return rewriteValueARM64_OpARM64XORshiftLL(v, config) 193 case OpARM64XORshiftRA: 194 return rewriteValueARM64_OpARM64XORshiftRA(v, config) 195 case OpARM64XORshiftRL: 196 return rewriteValueARM64_OpARM64XORshiftRL(v, config) 197 case OpAdd16: 198 return rewriteValueARM64_OpAdd16(v, config) 199 case OpAdd32: 200 return rewriteValueARM64_OpAdd32(v, config) 201 case OpAdd32F: 202 return rewriteValueARM64_OpAdd32F(v, config) 203 case OpAdd64: 204 return rewriteValueARM64_OpAdd64(v, config) 205 case OpAdd64F: 206 return rewriteValueARM64_OpAdd64F(v, config) 207 case OpAdd8: 208 return rewriteValueARM64_OpAdd8(v, config) 209 case OpAddPtr: 210 return rewriteValueARM64_OpAddPtr(v, config) 211 case OpAddr: 212 return rewriteValueARM64_OpAddr(v, config) 213 case OpAnd16: 214 return rewriteValueARM64_OpAnd16(v, config) 215 case OpAnd32: 216 return rewriteValueARM64_OpAnd32(v, config) 217 case OpAnd64: 218 return rewriteValueARM64_OpAnd64(v, config) 219 case OpAnd8: 220 return rewriteValueARM64_OpAnd8(v, config) 221 case OpAndB: 222 return rewriteValueARM64_OpAndB(v, config) 223 case OpAtomicAdd32: 224 return rewriteValueARM64_OpAtomicAdd32(v, config) 225 case OpAtomicAdd64: 226 return rewriteValueARM64_OpAtomicAdd64(v, config) 227 case OpAtomicAnd8: 228 return rewriteValueARM64_OpAtomicAnd8(v, config) 229 case OpAtomicCompareAndSwap32: 230 return rewriteValueARM64_OpAtomicCompareAndSwap32(v, config) 231 case OpAtomicCompareAndSwap64: 232 return rewriteValueARM64_OpAtomicCompareAndSwap64(v, config) 233 case OpAtomicExchange32: 234 return rewriteValueARM64_OpAtomicExchange32(v, config) 235 case OpAtomicExchange64: 236 return rewriteValueARM64_OpAtomicExchange64(v, config) 237 case OpAtomicLoad32: 238 return rewriteValueARM64_OpAtomicLoad32(v, config) 239 case OpAtomicLoad64: 240 return rewriteValueARM64_OpAtomicLoad64(v, config) 241 case OpAtomicLoadPtr: 242 return rewriteValueARM64_OpAtomicLoadPtr(v, config) 243 case OpAtomicOr8: 244 return rewriteValueARM64_OpAtomicOr8(v, config) 245 case OpAtomicStore32: 246 return rewriteValueARM64_OpAtomicStore32(v, config) 247 case OpAtomicStore64: 248 return rewriteValueARM64_OpAtomicStore64(v, config) 249 case OpAtomicStorePtrNoWB: 250 return rewriteValueARM64_OpAtomicStorePtrNoWB(v, config) 251 case OpAvg64u: 252 return rewriteValueARM64_OpAvg64u(v, config) 253 case OpBswap32: 254 return rewriteValueARM64_OpBswap32(v, config) 255 case OpBswap64: 256 return rewriteValueARM64_OpBswap64(v, config) 257 case OpClosureCall: 258 return rewriteValueARM64_OpClosureCall(v, config) 259 case OpCom16: 260 return rewriteValueARM64_OpCom16(v, config) 261 case OpCom32: 262 return rewriteValueARM64_OpCom32(v, config) 263 case OpCom64: 264 return rewriteValueARM64_OpCom64(v, config) 265 case OpCom8: 266 return rewriteValueARM64_OpCom8(v, config) 267 case OpConst16: 268 return rewriteValueARM64_OpConst16(v, config) 269 case OpConst32: 270 return rewriteValueARM64_OpConst32(v, config) 271 case OpConst32F: 272 return rewriteValueARM64_OpConst32F(v, config) 273 case OpConst64: 274 return rewriteValueARM64_OpConst64(v, config) 275 case OpConst64F: 276 return rewriteValueARM64_OpConst64F(v, config) 277 case OpConst8: 278 return rewriteValueARM64_OpConst8(v, config) 279 case OpConstBool: 280 return rewriteValueARM64_OpConstBool(v, config) 281 case OpConstNil: 282 return rewriteValueARM64_OpConstNil(v, config) 283 case OpConvert: 284 return rewriteValueARM64_OpConvert(v, config) 285 case OpCtz32: 286 return rewriteValueARM64_OpCtz32(v, config) 287 case OpCtz64: 288 return rewriteValueARM64_OpCtz64(v, config) 289 case OpCvt32Fto32: 290 return rewriteValueARM64_OpCvt32Fto32(v, config) 291 case OpCvt32Fto32U: 292 return rewriteValueARM64_OpCvt32Fto32U(v, config) 293 case OpCvt32Fto64: 294 return rewriteValueARM64_OpCvt32Fto64(v, config) 295 case OpCvt32Fto64F: 296 return rewriteValueARM64_OpCvt32Fto64F(v, config) 297 case OpCvt32Fto64U: 298 return rewriteValueARM64_OpCvt32Fto64U(v, config) 299 case OpCvt32Uto32F: 300 return rewriteValueARM64_OpCvt32Uto32F(v, config) 301 case OpCvt32Uto64F: 302 return rewriteValueARM64_OpCvt32Uto64F(v, config) 303 case OpCvt32to32F: 304 return rewriteValueARM64_OpCvt32to32F(v, config) 305 case OpCvt32to64F: 306 return rewriteValueARM64_OpCvt32to64F(v, config) 307 case OpCvt64Fto32: 308 return rewriteValueARM64_OpCvt64Fto32(v, config) 309 case OpCvt64Fto32F: 310 return rewriteValueARM64_OpCvt64Fto32F(v, config) 311 case OpCvt64Fto32U: 312 return rewriteValueARM64_OpCvt64Fto32U(v, config) 313 case OpCvt64Fto64: 314 return rewriteValueARM64_OpCvt64Fto64(v, config) 315 case OpCvt64Fto64U: 316 return rewriteValueARM64_OpCvt64Fto64U(v, config) 317 case OpCvt64Uto32F: 318 return rewriteValueARM64_OpCvt64Uto32F(v, config) 319 case OpCvt64Uto64F: 320 return rewriteValueARM64_OpCvt64Uto64F(v, config) 321 case OpCvt64to32F: 322 return rewriteValueARM64_OpCvt64to32F(v, config) 323 case OpCvt64to64F: 324 return rewriteValueARM64_OpCvt64to64F(v, config) 325 case OpDeferCall: 326 return rewriteValueARM64_OpDeferCall(v, config) 327 case OpDiv16: 328 return rewriteValueARM64_OpDiv16(v, config) 329 case OpDiv16u: 330 return rewriteValueARM64_OpDiv16u(v, config) 331 case OpDiv32: 332 return rewriteValueARM64_OpDiv32(v, config) 333 case OpDiv32F: 334 return rewriteValueARM64_OpDiv32F(v, config) 335 case OpDiv32u: 336 return rewriteValueARM64_OpDiv32u(v, config) 337 case OpDiv64: 338 return rewriteValueARM64_OpDiv64(v, config) 339 case OpDiv64F: 340 return rewriteValueARM64_OpDiv64F(v, config) 341 case OpDiv64u: 342 return rewriteValueARM64_OpDiv64u(v, config) 343 case OpDiv8: 344 return rewriteValueARM64_OpDiv8(v, config) 345 case OpDiv8u: 346 return rewriteValueARM64_OpDiv8u(v, config) 347 case OpEq16: 348 return rewriteValueARM64_OpEq16(v, config) 349 case OpEq32: 350 return rewriteValueARM64_OpEq32(v, config) 351 case OpEq32F: 352 return rewriteValueARM64_OpEq32F(v, config) 353 case OpEq64: 354 return rewriteValueARM64_OpEq64(v, config) 355 case OpEq64F: 356 return rewriteValueARM64_OpEq64F(v, config) 357 case OpEq8: 358 return rewriteValueARM64_OpEq8(v, config) 359 case OpEqB: 360 return rewriteValueARM64_OpEqB(v, config) 361 case OpEqPtr: 362 return rewriteValueARM64_OpEqPtr(v, config) 363 case OpGeq16: 364 return rewriteValueARM64_OpGeq16(v, config) 365 case OpGeq16U: 366 return rewriteValueARM64_OpGeq16U(v, config) 367 case OpGeq32: 368 return rewriteValueARM64_OpGeq32(v, config) 369 case OpGeq32F: 370 return rewriteValueARM64_OpGeq32F(v, config) 371 case OpGeq32U: 372 return rewriteValueARM64_OpGeq32U(v, config) 373 case OpGeq64: 374 return rewriteValueARM64_OpGeq64(v, config) 375 case OpGeq64F: 376 return rewriteValueARM64_OpGeq64F(v, config) 377 case OpGeq64U: 378 return rewriteValueARM64_OpGeq64U(v, config) 379 case OpGeq8: 380 return rewriteValueARM64_OpGeq8(v, config) 381 case OpGeq8U: 382 return rewriteValueARM64_OpGeq8U(v, config) 383 case OpGetClosurePtr: 384 return rewriteValueARM64_OpGetClosurePtr(v, config) 385 case OpGoCall: 386 return rewriteValueARM64_OpGoCall(v, config) 387 case OpGreater16: 388 return rewriteValueARM64_OpGreater16(v, config) 389 case OpGreater16U: 390 return rewriteValueARM64_OpGreater16U(v, config) 391 case OpGreater32: 392 return rewriteValueARM64_OpGreater32(v, config) 393 case OpGreater32F: 394 return rewriteValueARM64_OpGreater32F(v, config) 395 case OpGreater32U: 396 return rewriteValueARM64_OpGreater32U(v, config) 397 case OpGreater64: 398 return rewriteValueARM64_OpGreater64(v, config) 399 case OpGreater64F: 400 return rewriteValueARM64_OpGreater64F(v, config) 401 case OpGreater64U: 402 return rewriteValueARM64_OpGreater64U(v, config) 403 case OpGreater8: 404 return rewriteValueARM64_OpGreater8(v, config) 405 case OpGreater8U: 406 return rewriteValueARM64_OpGreater8U(v, config) 407 case OpHmul16: 408 return rewriteValueARM64_OpHmul16(v, config) 409 case OpHmul16u: 410 return rewriteValueARM64_OpHmul16u(v, config) 411 case OpHmul32: 412 return rewriteValueARM64_OpHmul32(v, config) 413 case OpHmul32u: 414 return rewriteValueARM64_OpHmul32u(v, config) 415 case OpHmul64: 416 return rewriteValueARM64_OpHmul64(v, config) 417 case OpHmul64u: 418 return rewriteValueARM64_OpHmul64u(v, config) 419 case OpHmul8: 420 return rewriteValueARM64_OpHmul8(v, config) 421 case OpHmul8u: 422 return rewriteValueARM64_OpHmul8u(v, config) 423 case OpInterCall: 424 return rewriteValueARM64_OpInterCall(v, config) 425 case OpIsInBounds: 426 return rewriteValueARM64_OpIsInBounds(v, config) 427 case OpIsNonNil: 428 return rewriteValueARM64_OpIsNonNil(v, config) 429 case OpIsSliceInBounds: 430 return rewriteValueARM64_OpIsSliceInBounds(v, config) 431 case OpLeq16: 432 return rewriteValueARM64_OpLeq16(v, config) 433 case OpLeq16U: 434 return rewriteValueARM64_OpLeq16U(v, config) 435 case OpLeq32: 436 return rewriteValueARM64_OpLeq32(v, config) 437 case OpLeq32F: 438 return rewriteValueARM64_OpLeq32F(v, config) 439 case OpLeq32U: 440 return rewriteValueARM64_OpLeq32U(v, config) 441 case OpLeq64: 442 return rewriteValueARM64_OpLeq64(v, config) 443 case OpLeq64F: 444 return rewriteValueARM64_OpLeq64F(v, config) 445 case OpLeq64U: 446 return rewriteValueARM64_OpLeq64U(v, config) 447 case OpLeq8: 448 return rewriteValueARM64_OpLeq8(v, config) 449 case OpLeq8U: 450 return rewriteValueARM64_OpLeq8U(v, config) 451 case OpLess16: 452 return rewriteValueARM64_OpLess16(v, config) 453 case OpLess16U: 454 return rewriteValueARM64_OpLess16U(v, config) 455 case OpLess32: 456 return rewriteValueARM64_OpLess32(v, config) 457 case OpLess32F: 458 return rewriteValueARM64_OpLess32F(v, config) 459 case OpLess32U: 460 return rewriteValueARM64_OpLess32U(v, config) 461 case OpLess64: 462 return rewriteValueARM64_OpLess64(v, config) 463 case OpLess64F: 464 return rewriteValueARM64_OpLess64F(v, config) 465 case OpLess64U: 466 return rewriteValueARM64_OpLess64U(v, config) 467 case OpLess8: 468 return rewriteValueARM64_OpLess8(v, config) 469 case OpLess8U: 470 return rewriteValueARM64_OpLess8U(v, config) 471 case OpLoad: 472 return rewriteValueARM64_OpLoad(v, config) 473 case OpLrot16: 474 return rewriteValueARM64_OpLrot16(v, config) 475 case OpLrot32: 476 return rewriteValueARM64_OpLrot32(v, config) 477 case OpLrot64: 478 return rewriteValueARM64_OpLrot64(v, config) 479 case OpLrot8: 480 return rewriteValueARM64_OpLrot8(v, config) 481 case OpLsh16x16: 482 return rewriteValueARM64_OpLsh16x16(v, config) 483 case OpLsh16x32: 484 return rewriteValueARM64_OpLsh16x32(v, config) 485 case OpLsh16x64: 486 return rewriteValueARM64_OpLsh16x64(v, config) 487 case OpLsh16x8: 488 return rewriteValueARM64_OpLsh16x8(v, config) 489 case OpLsh32x16: 490 return rewriteValueARM64_OpLsh32x16(v, config) 491 case OpLsh32x32: 492 return rewriteValueARM64_OpLsh32x32(v, config) 493 case OpLsh32x64: 494 return rewriteValueARM64_OpLsh32x64(v, config) 495 case OpLsh32x8: 496 return rewriteValueARM64_OpLsh32x8(v, config) 497 case OpLsh64x16: 498 return rewriteValueARM64_OpLsh64x16(v, config) 499 case OpLsh64x32: 500 return rewriteValueARM64_OpLsh64x32(v, config) 501 case OpLsh64x64: 502 return rewriteValueARM64_OpLsh64x64(v, config) 503 case OpLsh64x8: 504 return rewriteValueARM64_OpLsh64x8(v, config) 505 case OpLsh8x16: 506 return rewriteValueARM64_OpLsh8x16(v, config) 507 case OpLsh8x32: 508 return rewriteValueARM64_OpLsh8x32(v, config) 509 case OpLsh8x64: 510 return rewriteValueARM64_OpLsh8x64(v, config) 511 case OpLsh8x8: 512 return rewriteValueARM64_OpLsh8x8(v, config) 513 case OpMod16: 514 return rewriteValueARM64_OpMod16(v, config) 515 case OpMod16u: 516 return rewriteValueARM64_OpMod16u(v, config) 517 case OpMod32: 518 return rewriteValueARM64_OpMod32(v, config) 519 case OpMod32u: 520 return rewriteValueARM64_OpMod32u(v, config) 521 case OpMod64: 522 return rewriteValueARM64_OpMod64(v, config) 523 case OpMod64u: 524 return rewriteValueARM64_OpMod64u(v, config) 525 case OpMod8: 526 return rewriteValueARM64_OpMod8(v, config) 527 case OpMod8u: 528 return rewriteValueARM64_OpMod8u(v, config) 529 case OpMove: 530 return rewriteValueARM64_OpMove(v, config) 531 case OpMul16: 532 return rewriteValueARM64_OpMul16(v, config) 533 case OpMul32: 534 return rewriteValueARM64_OpMul32(v, config) 535 case OpMul32F: 536 return rewriteValueARM64_OpMul32F(v, config) 537 case OpMul64: 538 return rewriteValueARM64_OpMul64(v, config) 539 case OpMul64F: 540 return rewriteValueARM64_OpMul64F(v, config) 541 case OpMul8: 542 return rewriteValueARM64_OpMul8(v, config) 543 case OpNeg16: 544 return rewriteValueARM64_OpNeg16(v, config) 545 case OpNeg32: 546 return rewriteValueARM64_OpNeg32(v, config) 547 case OpNeg32F: 548 return rewriteValueARM64_OpNeg32F(v, config) 549 case OpNeg64: 550 return rewriteValueARM64_OpNeg64(v, config) 551 case OpNeg64F: 552 return rewriteValueARM64_OpNeg64F(v, config) 553 case OpNeg8: 554 return rewriteValueARM64_OpNeg8(v, config) 555 case OpNeq16: 556 return rewriteValueARM64_OpNeq16(v, config) 557 case OpNeq32: 558 return rewriteValueARM64_OpNeq32(v, config) 559 case OpNeq32F: 560 return rewriteValueARM64_OpNeq32F(v, config) 561 case OpNeq64: 562 return rewriteValueARM64_OpNeq64(v, config) 563 case OpNeq64F: 564 return rewriteValueARM64_OpNeq64F(v, config) 565 case OpNeq8: 566 return rewriteValueARM64_OpNeq8(v, config) 567 case OpNeqB: 568 return rewriteValueARM64_OpNeqB(v, config) 569 case OpNeqPtr: 570 return rewriteValueARM64_OpNeqPtr(v, config) 571 case OpNilCheck: 572 return rewriteValueARM64_OpNilCheck(v, config) 573 case OpNot: 574 return rewriteValueARM64_OpNot(v, config) 575 case OpOffPtr: 576 return rewriteValueARM64_OpOffPtr(v, config) 577 case OpOr16: 578 return rewriteValueARM64_OpOr16(v, config) 579 case OpOr32: 580 return rewriteValueARM64_OpOr32(v, config) 581 case OpOr64: 582 return rewriteValueARM64_OpOr64(v, config) 583 case OpOr8: 584 return rewriteValueARM64_OpOr8(v, config) 585 case OpOrB: 586 return rewriteValueARM64_OpOrB(v, config) 587 case OpRsh16Ux16: 588 return rewriteValueARM64_OpRsh16Ux16(v, config) 589 case OpRsh16Ux32: 590 return rewriteValueARM64_OpRsh16Ux32(v, config) 591 case OpRsh16Ux64: 592 return rewriteValueARM64_OpRsh16Ux64(v, config) 593 case OpRsh16Ux8: 594 return rewriteValueARM64_OpRsh16Ux8(v, config) 595 case OpRsh16x16: 596 return rewriteValueARM64_OpRsh16x16(v, config) 597 case OpRsh16x32: 598 return rewriteValueARM64_OpRsh16x32(v, config) 599 case OpRsh16x64: 600 return rewriteValueARM64_OpRsh16x64(v, config) 601 case OpRsh16x8: 602 return rewriteValueARM64_OpRsh16x8(v, config) 603 case OpRsh32Ux16: 604 return rewriteValueARM64_OpRsh32Ux16(v, config) 605 case OpRsh32Ux32: 606 return rewriteValueARM64_OpRsh32Ux32(v, config) 607 case OpRsh32Ux64: 608 return rewriteValueARM64_OpRsh32Ux64(v, config) 609 case OpRsh32Ux8: 610 return rewriteValueARM64_OpRsh32Ux8(v, config) 611 case OpRsh32x16: 612 return rewriteValueARM64_OpRsh32x16(v, config) 613 case OpRsh32x32: 614 return rewriteValueARM64_OpRsh32x32(v, config) 615 case OpRsh32x64: 616 return rewriteValueARM64_OpRsh32x64(v, config) 617 case OpRsh32x8: 618 return rewriteValueARM64_OpRsh32x8(v, config) 619 case OpRsh64Ux16: 620 return rewriteValueARM64_OpRsh64Ux16(v, config) 621 case OpRsh64Ux32: 622 return rewriteValueARM64_OpRsh64Ux32(v, config) 623 case OpRsh64Ux64: 624 return rewriteValueARM64_OpRsh64Ux64(v, config) 625 case OpRsh64Ux8: 626 return rewriteValueARM64_OpRsh64Ux8(v, config) 627 case OpRsh64x16: 628 return rewriteValueARM64_OpRsh64x16(v, config) 629 case OpRsh64x32: 630 return rewriteValueARM64_OpRsh64x32(v, config) 631 case OpRsh64x64: 632 return rewriteValueARM64_OpRsh64x64(v, config) 633 case OpRsh64x8: 634 return rewriteValueARM64_OpRsh64x8(v, config) 635 case OpRsh8Ux16: 636 return rewriteValueARM64_OpRsh8Ux16(v, config) 637 case OpRsh8Ux32: 638 return rewriteValueARM64_OpRsh8Ux32(v, config) 639 case OpRsh8Ux64: 640 return rewriteValueARM64_OpRsh8Ux64(v, config) 641 case OpRsh8Ux8: 642 return rewriteValueARM64_OpRsh8Ux8(v, config) 643 case OpRsh8x16: 644 return rewriteValueARM64_OpRsh8x16(v, config) 645 case OpRsh8x32: 646 return rewriteValueARM64_OpRsh8x32(v, config) 647 case OpRsh8x64: 648 return rewriteValueARM64_OpRsh8x64(v, config) 649 case OpRsh8x8: 650 return rewriteValueARM64_OpRsh8x8(v, config) 651 case OpSignExt16to32: 652 return rewriteValueARM64_OpSignExt16to32(v, config) 653 case OpSignExt16to64: 654 return rewriteValueARM64_OpSignExt16to64(v, config) 655 case OpSignExt32to64: 656 return rewriteValueARM64_OpSignExt32to64(v, config) 657 case OpSignExt8to16: 658 return rewriteValueARM64_OpSignExt8to16(v, config) 659 case OpSignExt8to32: 660 return rewriteValueARM64_OpSignExt8to32(v, config) 661 case OpSignExt8to64: 662 return rewriteValueARM64_OpSignExt8to64(v, config) 663 case OpSlicemask: 664 return rewriteValueARM64_OpSlicemask(v, config) 665 case OpSqrt: 666 return rewriteValueARM64_OpSqrt(v, config) 667 case OpStaticCall: 668 return rewriteValueARM64_OpStaticCall(v, config) 669 case OpStore: 670 return rewriteValueARM64_OpStore(v, config) 671 case OpSub16: 672 return rewriteValueARM64_OpSub16(v, config) 673 case OpSub32: 674 return rewriteValueARM64_OpSub32(v, config) 675 case OpSub32F: 676 return rewriteValueARM64_OpSub32F(v, config) 677 case OpSub64: 678 return rewriteValueARM64_OpSub64(v, config) 679 case OpSub64F: 680 return rewriteValueARM64_OpSub64F(v, config) 681 case OpSub8: 682 return rewriteValueARM64_OpSub8(v, config) 683 case OpSubPtr: 684 return rewriteValueARM64_OpSubPtr(v, config) 685 case OpTrunc16to8: 686 return rewriteValueARM64_OpTrunc16to8(v, config) 687 case OpTrunc32to16: 688 return rewriteValueARM64_OpTrunc32to16(v, config) 689 case OpTrunc32to8: 690 return rewriteValueARM64_OpTrunc32to8(v, config) 691 case OpTrunc64to16: 692 return rewriteValueARM64_OpTrunc64to16(v, config) 693 case OpTrunc64to32: 694 return rewriteValueARM64_OpTrunc64to32(v, config) 695 case OpTrunc64to8: 696 return rewriteValueARM64_OpTrunc64to8(v, config) 697 case OpXor16: 698 return rewriteValueARM64_OpXor16(v, config) 699 case OpXor32: 700 return rewriteValueARM64_OpXor32(v, config) 701 case OpXor64: 702 return rewriteValueARM64_OpXor64(v, config) 703 case OpXor8: 704 return rewriteValueARM64_OpXor8(v, config) 705 case OpZero: 706 return rewriteValueARM64_OpZero(v, config) 707 case OpZeroExt16to32: 708 return rewriteValueARM64_OpZeroExt16to32(v, config) 709 case OpZeroExt16to64: 710 return rewriteValueARM64_OpZeroExt16to64(v, config) 711 case OpZeroExt32to64: 712 return rewriteValueARM64_OpZeroExt32to64(v, config) 713 case OpZeroExt8to16: 714 return rewriteValueARM64_OpZeroExt8to16(v, config) 715 case OpZeroExt8to32: 716 return rewriteValueARM64_OpZeroExt8to32(v, config) 717 case OpZeroExt8to64: 718 return rewriteValueARM64_OpZeroExt8to64(v, config) 719 } 720 return false 721 } 722 func rewriteValueARM64_OpARM64ADD(v *Value, config *Config) bool { 723 b := v.Block 724 _ = b 725 // match: (ADD (MOVDconst [c]) x) 726 // cond: 727 // result: (ADDconst [c] x) 728 for { 729 v_0 := v.Args[0] 730 if v_0.Op != OpARM64MOVDconst { 731 break 732 } 733 c := v_0.AuxInt 734 x := v.Args[1] 735 v.reset(OpARM64ADDconst) 736 v.AuxInt = c 737 v.AddArg(x) 738 return true 739 } 740 // match: (ADD x (MOVDconst [c])) 741 // cond: 742 // result: (ADDconst [c] x) 743 for { 744 x := v.Args[0] 745 v_1 := v.Args[1] 746 if v_1.Op != OpARM64MOVDconst { 747 break 748 } 749 c := v_1.AuxInt 750 v.reset(OpARM64ADDconst) 751 v.AuxInt = c 752 v.AddArg(x) 753 return true 754 } 755 // match: (ADD x (NEG y)) 756 // cond: 757 // result: (SUB x y) 758 for { 759 x := v.Args[0] 760 v_1 := v.Args[1] 761 if v_1.Op != OpARM64NEG { 762 break 763 } 764 y := v_1.Args[0] 765 v.reset(OpARM64SUB) 766 v.AddArg(x) 767 v.AddArg(y) 768 return true 769 } 770 // match: (ADD (NEG y) x) 771 // cond: 772 // result: (SUB x y) 773 for { 774 v_0 := v.Args[0] 775 if v_0.Op != OpARM64NEG { 776 break 777 } 778 y := v_0.Args[0] 779 x := v.Args[1] 780 v.reset(OpARM64SUB) 781 v.AddArg(x) 782 v.AddArg(y) 783 return true 784 } 785 // match: (ADD x (SLLconst [c] y)) 786 // cond: 787 // result: (ADDshiftLL x y [c]) 788 for { 789 x := v.Args[0] 790 v_1 := v.Args[1] 791 if v_1.Op != OpARM64SLLconst { 792 break 793 } 794 c := v_1.AuxInt 795 y := v_1.Args[0] 796 v.reset(OpARM64ADDshiftLL) 797 v.AuxInt = c 798 v.AddArg(x) 799 v.AddArg(y) 800 return true 801 } 802 // match: (ADD (SLLconst [c] y) x) 803 // cond: 804 // result: (ADDshiftLL x y [c]) 805 for { 806 v_0 := v.Args[0] 807 if v_0.Op != OpARM64SLLconst { 808 break 809 } 810 c := v_0.AuxInt 811 y := v_0.Args[0] 812 x := v.Args[1] 813 v.reset(OpARM64ADDshiftLL) 814 v.AuxInt = c 815 v.AddArg(x) 816 v.AddArg(y) 817 return true 818 } 819 // match: (ADD x (SRLconst [c] y)) 820 // cond: 821 // result: (ADDshiftRL x y [c]) 822 for { 823 x := v.Args[0] 824 v_1 := v.Args[1] 825 if v_1.Op != OpARM64SRLconst { 826 break 827 } 828 c := v_1.AuxInt 829 y := v_1.Args[0] 830 v.reset(OpARM64ADDshiftRL) 831 v.AuxInt = c 832 v.AddArg(x) 833 v.AddArg(y) 834 return true 835 } 836 // match: (ADD (SRLconst [c] y) x) 837 // cond: 838 // result: (ADDshiftRL x y [c]) 839 for { 840 v_0 := v.Args[0] 841 if v_0.Op != OpARM64SRLconst { 842 break 843 } 844 c := v_0.AuxInt 845 y := v_0.Args[0] 846 x := v.Args[1] 847 v.reset(OpARM64ADDshiftRL) 848 v.AuxInt = c 849 v.AddArg(x) 850 v.AddArg(y) 851 return true 852 } 853 // match: (ADD x (SRAconst [c] y)) 854 // cond: 855 // result: (ADDshiftRA x y [c]) 856 for { 857 x := v.Args[0] 858 v_1 := v.Args[1] 859 if v_1.Op != OpARM64SRAconst { 860 break 861 } 862 c := v_1.AuxInt 863 y := v_1.Args[0] 864 v.reset(OpARM64ADDshiftRA) 865 v.AuxInt = c 866 v.AddArg(x) 867 v.AddArg(y) 868 return true 869 } 870 // match: (ADD (SRAconst [c] y) x) 871 // cond: 872 // result: (ADDshiftRA x y [c]) 873 for { 874 v_0 := v.Args[0] 875 if v_0.Op != OpARM64SRAconst { 876 break 877 } 878 c := v_0.AuxInt 879 y := v_0.Args[0] 880 x := v.Args[1] 881 v.reset(OpARM64ADDshiftRA) 882 v.AuxInt = c 883 v.AddArg(x) 884 v.AddArg(y) 885 return true 886 } 887 return false 888 } 889 func rewriteValueARM64_OpARM64ADDconst(v *Value, config *Config) bool { 890 b := v.Block 891 _ = b 892 // match: (ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) 893 // cond: 894 // result: (MOVDaddr [off1+off2] {sym} ptr) 895 for { 896 off1 := v.AuxInt 897 v_0 := v.Args[0] 898 if v_0.Op != OpARM64MOVDaddr { 899 break 900 } 901 off2 := v_0.AuxInt 902 sym := v_0.Aux 903 ptr := v_0.Args[0] 904 v.reset(OpARM64MOVDaddr) 905 v.AuxInt = off1 + off2 906 v.Aux = sym 907 v.AddArg(ptr) 908 return true 909 } 910 // match: (ADDconst [0] x) 911 // cond: 912 // result: x 913 for { 914 if v.AuxInt != 0 { 915 break 916 } 917 x := v.Args[0] 918 v.reset(OpCopy) 919 v.Type = x.Type 920 v.AddArg(x) 921 return true 922 } 923 // match: (ADDconst [c] (MOVDconst [d])) 924 // cond: 925 // result: (MOVDconst [c+d]) 926 for { 927 c := v.AuxInt 928 v_0 := v.Args[0] 929 if v_0.Op != OpARM64MOVDconst { 930 break 931 } 932 d := v_0.AuxInt 933 v.reset(OpARM64MOVDconst) 934 v.AuxInt = c + d 935 return true 936 } 937 // match: (ADDconst [c] (ADDconst [d] x)) 938 // cond: 939 // result: (ADDconst [c+d] x) 940 for { 941 c := v.AuxInt 942 v_0 := v.Args[0] 943 if v_0.Op != OpARM64ADDconst { 944 break 945 } 946 d := v_0.AuxInt 947 x := v_0.Args[0] 948 v.reset(OpARM64ADDconst) 949 v.AuxInt = c + d 950 v.AddArg(x) 951 return true 952 } 953 // match: (ADDconst [c] (SUBconst [d] x)) 954 // cond: 955 // result: (ADDconst [c-d] x) 956 for { 957 c := v.AuxInt 958 v_0 := v.Args[0] 959 if v_0.Op != OpARM64SUBconst { 960 break 961 } 962 d := v_0.AuxInt 963 x := v_0.Args[0] 964 v.reset(OpARM64ADDconst) 965 v.AuxInt = c - d 966 v.AddArg(x) 967 return true 968 } 969 return false 970 } 971 func rewriteValueARM64_OpARM64ADDshiftLL(v *Value, config *Config) bool { 972 b := v.Block 973 _ = b 974 // match: (ADDshiftLL (MOVDconst [c]) x [d]) 975 // cond: 976 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 977 for { 978 d := v.AuxInt 979 v_0 := v.Args[0] 980 if v_0.Op != OpARM64MOVDconst { 981 break 982 } 983 c := v_0.AuxInt 984 x := v.Args[1] 985 v.reset(OpARM64ADDconst) 986 v.AuxInt = c 987 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 988 v0.AuxInt = d 989 v0.AddArg(x) 990 v.AddArg(v0) 991 return true 992 } 993 // match: (ADDshiftLL x (MOVDconst [c]) [d]) 994 // cond: 995 // result: (ADDconst x [int64(uint64(c)<<uint64(d))]) 996 for { 997 d := v.AuxInt 998 x := v.Args[0] 999 v_1 := v.Args[1] 1000 if v_1.Op != OpARM64MOVDconst { 1001 break 1002 } 1003 c := v_1.AuxInt 1004 v.reset(OpARM64ADDconst) 1005 v.AuxInt = int64(uint64(c) << uint64(d)) 1006 v.AddArg(x) 1007 return true 1008 } 1009 return false 1010 } 1011 func rewriteValueARM64_OpARM64ADDshiftRA(v *Value, config *Config) bool { 1012 b := v.Block 1013 _ = b 1014 // match: (ADDshiftRA (MOVDconst [c]) x [d]) 1015 // cond: 1016 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 1017 for { 1018 d := v.AuxInt 1019 v_0 := v.Args[0] 1020 if v_0.Op != OpARM64MOVDconst { 1021 break 1022 } 1023 c := v_0.AuxInt 1024 x := v.Args[1] 1025 v.reset(OpARM64ADDconst) 1026 v.AuxInt = c 1027 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 1028 v0.AuxInt = d 1029 v0.AddArg(x) 1030 v.AddArg(v0) 1031 return true 1032 } 1033 // match: (ADDshiftRA x (MOVDconst [c]) [d]) 1034 // cond: 1035 // result: (ADDconst x [int64(int64(c)>>uint64(d))]) 1036 for { 1037 d := v.AuxInt 1038 x := v.Args[0] 1039 v_1 := v.Args[1] 1040 if v_1.Op != OpARM64MOVDconst { 1041 break 1042 } 1043 c := v_1.AuxInt 1044 v.reset(OpARM64ADDconst) 1045 v.AuxInt = int64(int64(c) >> uint64(d)) 1046 v.AddArg(x) 1047 return true 1048 } 1049 return false 1050 } 1051 func rewriteValueARM64_OpARM64ADDshiftRL(v *Value, config *Config) bool { 1052 b := v.Block 1053 _ = b 1054 // match: (ADDshiftRL (MOVDconst [c]) x [d]) 1055 // cond: 1056 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 1057 for { 1058 d := v.AuxInt 1059 v_0 := v.Args[0] 1060 if v_0.Op != OpARM64MOVDconst { 1061 break 1062 } 1063 c := v_0.AuxInt 1064 x := v.Args[1] 1065 v.reset(OpARM64ADDconst) 1066 v.AuxInt = c 1067 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 1068 v0.AuxInt = d 1069 v0.AddArg(x) 1070 v.AddArg(v0) 1071 return true 1072 } 1073 // match: (ADDshiftRL x (MOVDconst [c]) [d]) 1074 // cond: 1075 // result: (ADDconst x [int64(uint64(c)>>uint64(d))]) 1076 for { 1077 d := v.AuxInt 1078 x := v.Args[0] 1079 v_1 := v.Args[1] 1080 if v_1.Op != OpARM64MOVDconst { 1081 break 1082 } 1083 c := v_1.AuxInt 1084 v.reset(OpARM64ADDconst) 1085 v.AuxInt = int64(uint64(c) >> uint64(d)) 1086 v.AddArg(x) 1087 return true 1088 } 1089 return false 1090 } 1091 func rewriteValueARM64_OpARM64AND(v *Value, config *Config) bool { 1092 b := v.Block 1093 _ = b 1094 // match: (AND (MOVDconst [c]) x) 1095 // cond: 1096 // result: (ANDconst [c] x) 1097 for { 1098 v_0 := v.Args[0] 1099 if v_0.Op != OpARM64MOVDconst { 1100 break 1101 } 1102 c := v_0.AuxInt 1103 x := v.Args[1] 1104 v.reset(OpARM64ANDconst) 1105 v.AuxInt = c 1106 v.AddArg(x) 1107 return true 1108 } 1109 // match: (AND x (MOVDconst [c])) 1110 // cond: 1111 // result: (ANDconst [c] x) 1112 for { 1113 x := v.Args[0] 1114 v_1 := v.Args[1] 1115 if v_1.Op != OpARM64MOVDconst { 1116 break 1117 } 1118 c := v_1.AuxInt 1119 v.reset(OpARM64ANDconst) 1120 v.AuxInt = c 1121 v.AddArg(x) 1122 return true 1123 } 1124 // match: (AND x x) 1125 // cond: 1126 // result: x 1127 for { 1128 x := v.Args[0] 1129 if x != v.Args[1] { 1130 break 1131 } 1132 v.reset(OpCopy) 1133 v.Type = x.Type 1134 v.AddArg(x) 1135 return true 1136 } 1137 // match: (AND x (MVN y)) 1138 // cond: 1139 // result: (BIC x y) 1140 for { 1141 x := v.Args[0] 1142 v_1 := v.Args[1] 1143 if v_1.Op != OpARM64MVN { 1144 break 1145 } 1146 y := v_1.Args[0] 1147 v.reset(OpARM64BIC) 1148 v.AddArg(x) 1149 v.AddArg(y) 1150 return true 1151 } 1152 // match: (AND x (SLLconst [c] y)) 1153 // cond: 1154 // result: (ANDshiftLL x y [c]) 1155 for { 1156 x := v.Args[0] 1157 v_1 := v.Args[1] 1158 if v_1.Op != OpARM64SLLconst { 1159 break 1160 } 1161 c := v_1.AuxInt 1162 y := v_1.Args[0] 1163 v.reset(OpARM64ANDshiftLL) 1164 v.AuxInt = c 1165 v.AddArg(x) 1166 v.AddArg(y) 1167 return true 1168 } 1169 // match: (AND (SLLconst [c] y) x) 1170 // cond: 1171 // result: (ANDshiftLL x y [c]) 1172 for { 1173 v_0 := v.Args[0] 1174 if v_0.Op != OpARM64SLLconst { 1175 break 1176 } 1177 c := v_0.AuxInt 1178 y := v_0.Args[0] 1179 x := v.Args[1] 1180 v.reset(OpARM64ANDshiftLL) 1181 v.AuxInt = c 1182 v.AddArg(x) 1183 v.AddArg(y) 1184 return true 1185 } 1186 // match: (AND x (SRLconst [c] y)) 1187 // cond: 1188 // result: (ANDshiftRL x y [c]) 1189 for { 1190 x := v.Args[0] 1191 v_1 := v.Args[1] 1192 if v_1.Op != OpARM64SRLconst { 1193 break 1194 } 1195 c := v_1.AuxInt 1196 y := v_1.Args[0] 1197 v.reset(OpARM64ANDshiftRL) 1198 v.AuxInt = c 1199 v.AddArg(x) 1200 v.AddArg(y) 1201 return true 1202 } 1203 // match: (AND (SRLconst [c] y) x) 1204 // cond: 1205 // result: (ANDshiftRL x y [c]) 1206 for { 1207 v_0 := v.Args[0] 1208 if v_0.Op != OpARM64SRLconst { 1209 break 1210 } 1211 c := v_0.AuxInt 1212 y := v_0.Args[0] 1213 x := v.Args[1] 1214 v.reset(OpARM64ANDshiftRL) 1215 v.AuxInt = c 1216 v.AddArg(x) 1217 v.AddArg(y) 1218 return true 1219 } 1220 // match: (AND x (SRAconst [c] y)) 1221 // cond: 1222 // result: (ANDshiftRA x y [c]) 1223 for { 1224 x := v.Args[0] 1225 v_1 := v.Args[1] 1226 if v_1.Op != OpARM64SRAconst { 1227 break 1228 } 1229 c := v_1.AuxInt 1230 y := v_1.Args[0] 1231 v.reset(OpARM64ANDshiftRA) 1232 v.AuxInt = c 1233 v.AddArg(x) 1234 v.AddArg(y) 1235 return true 1236 } 1237 // match: (AND (SRAconst [c] y) x) 1238 // cond: 1239 // result: (ANDshiftRA x y [c]) 1240 for { 1241 v_0 := v.Args[0] 1242 if v_0.Op != OpARM64SRAconst { 1243 break 1244 } 1245 c := v_0.AuxInt 1246 y := v_0.Args[0] 1247 x := v.Args[1] 1248 v.reset(OpARM64ANDshiftRA) 1249 v.AuxInt = c 1250 v.AddArg(x) 1251 v.AddArg(y) 1252 return true 1253 } 1254 return false 1255 } 1256 func rewriteValueARM64_OpARM64ANDconst(v *Value, config *Config) bool { 1257 b := v.Block 1258 _ = b 1259 // match: (ANDconst [0] _) 1260 // cond: 1261 // result: (MOVDconst [0]) 1262 for { 1263 if v.AuxInt != 0 { 1264 break 1265 } 1266 v.reset(OpARM64MOVDconst) 1267 v.AuxInt = 0 1268 return true 1269 } 1270 // match: (ANDconst [-1] x) 1271 // cond: 1272 // result: x 1273 for { 1274 if v.AuxInt != -1 { 1275 break 1276 } 1277 x := v.Args[0] 1278 v.reset(OpCopy) 1279 v.Type = x.Type 1280 v.AddArg(x) 1281 return true 1282 } 1283 // match: (ANDconst [c] (MOVDconst [d])) 1284 // cond: 1285 // result: (MOVDconst [c&d]) 1286 for { 1287 c := v.AuxInt 1288 v_0 := v.Args[0] 1289 if v_0.Op != OpARM64MOVDconst { 1290 break 1291 } 1292 d := v_0.AuxInt 1293 v.reset(OpARM64MOVDconst) 1294 v.AuxInt = c & d 1295 return true 1296 } 1297 // match: (ANDconst [c] (ANDconst [d] x)) 1298 // cond: 1299 // result: (ANDconst [c&d] x) 1300 for { 1301 c := v.AuxInt 1302 v_0 := v.Args[0] 1303 if v_0.Op != OpARM64ANDconst { 1304 break 1305 } 1306 d := v_0.AuxInt 1307 x := v_0.Args[0] 1308 v.reset(OpARM64ANDconst) 1309 v.AuxInt = c & d 1310 v.AddArg(x) 1311 return true 1312 } 1313 return false 1314 } 1315 func rewriteValueARM64_OpARM64ANDshiftLL(v *Value, config *Config) bool { 1316 b := v.Block 1317 _ = b 1318 // match: (ANDshiftLL (MOVDconst [c]) x [d]) 1319 // cond: 1320 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 1321 for { 1322 d := v.AuxInt 1323 v_0 := v.Args[0] 1324 if v_0.Op != OpARM64MOVDconst { 1325 break 1326 } 1327 c := v_0.AuxInt 1328 x := v.Args[1] 1329 v.reset(OpARM64ANDconst) 1330 v.AuxInt = c 1331 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 1332 v0.AuxInt = d 1333 v0.AddArg(x) 1334 v.AddArg(v0) 1335 return true 1336 } 1337 // match: (ANDshiftLL x (MOVDconst [c]) [d]) 1338 // cond: 1339 // result: (ANDconst x [int64(uint64(c)<<uint64(d))]) 1340 for { 1341 d := v.AuxInt 1342 x := v.Args[0] 1343 v_1 := v.Args[1] 1344 if v_1.Op != OpARM64MOVDconst { 1345 break 1346 } 1347 c := v_1.AuxInt 1348 v.reset(OpARM64ANDconst) 1349 v.AuxInt = int64(uint64(c) << uint64(d)) 1350 v.AddArg(x) 1351 return true 1352 } 1353 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 1354 // cond: c==d 1355 // result: y 1356 for { 1357 d := v.AuxInt 1358 x := v.Args[0] 1359 y := v.Args[1] 1360 if y.Op != OpARM64SLLconst { 1361 break 1362 } 1363 c := y.AuxInt 1364 if x != y.Args[0] { 1365 break 1366 } 1367 if !(c == d) { 1368 break 1369 } 1370 v.reset(OpCopy) 1371 v.Type = y.Type 1372 v.AddArg(y) 1373 return true 1374 } 1375 return false 1376 } 1377 func rewriteValueARM64_OpARM64ANDshiftRA(v *Value, config *Config) bool { 1378 b := v.Block 1379 _ = b 1380 // match: (ANDshiftRA (MOVDconst [c]) x [d]) 1381 // cond: 1382 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 1383 for { 1384 d := v.AuxInt 1385 v_0 := v.Args[0] 1386 if v_0.Op != OpARM64MOVDconst { 1387 break 1388 } 1389 c := v_0.AuxInt 1390 x := v.Args[1] 1391 v.reset(OpARM64ANDconst) 1392 v.AuxInt = c 1393 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 1394 v0.AuxInt = d 1395 v0.AddArg(x) 1396 v.AddArg(v0) 1397 return true 1398 } 1399 // match: (ANDshiftRA x (MOVDconst [c]) [d]) 1400 // cond: 1401 // result: (ANDconst x [int64(int64(c)>>uint64(d))]) 1402 for { 1403 d := v.AuxInt 1404 x := v.Args[0] 1405 v_1 := v.Args[1] 1406 if v_1.Op != OpARM64MOVDconst { 1407 break 1408 } 1409 c := v_1.AuxInt 1410 v.reset(OpARM64ANDconst) 1411 v.AuxInt = int64(int64(c) >> uint64(d)) 1412 v.AddArg(x) 1413 return true 1414 } 1415 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 1416 // cond: c==d 1417 // result: y 1418 for { 1419 d := v.AuxInt 1420 x := v.Args[0] 1421 y := v.Args[1] 1422 if y.Op != OpARM64SRAconst { 1423 break 1424 } 1425 c := y.AuxInt 1426 if x != y.Args[0] { 1427 break 1428 } 1429 if !(c == d) { 1430 break 1431 } 1432 v.reset(OpCopy) 1433 v.Type = y.Type 1434 v.AddArg(y) 1435 return true 1436 } 1437 return false 1438 } 1439 func rewriteValueARM64_OpARM64ANDshiftRL(v *Value, config *Config) bool { 1440 b := v.Block 1441 _ = b 1442 // match: (ANDshiftRL (MOVDconst [c]) x [d]) 1443 // cond: 1444 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 1445 for { 1446 d := v.AuxInt 1447 v_0 := v.Args[0] 1448 if v_0.Op != OpARM64MOVDconst { 1449 break 1450 } 1451 c := v_0.AuxInt 1452 x := v.Args[1] 1453 v.reset(OpARM64ANDconst) 1454 v.AuxInt = c 1455 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 1456 v0.AuxInt = d 1457 v0.AddArg(x) 1458 v.AddArg(v0) 1459 return true 1460 } 1461 // match: (ANDshiftRL x (MOVDconst [c]) [d]) 1462 // cond: 1463 // result: (ANDconst x [int64(uint64(c)>>uint64(d))]) 1464 for { 1465 d := v.AuxInt 1466 x := v.Args[0] 1467 v_1 := v.Args[1] 1468 if v_1.Op != OpARM64MOVDconst { 1469 break 1470 } 1471 c := v_1.AuxInt 1472 v.reset(OpARM64ANDconst) 1473 v.AuxInt = int64(uint64(c) >> uint64(d)) 1474 v.AddArg(x) 1475 return true 1476 } 1477 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 1478 // cond: c==d 1479 // result: y 1480 for { 1481 d := v.AuxInt 1482 x := v.Args[0] 1483 y := v.Args[1] 1484 if y.Op != OpARM64SRLconst { 1485 break 1486 } 1487 c := y.AuxInt 1488 if x != y.Args[0] { 1489 break 1490 } 1491 if !(c == d) { 1492 break 1493 } 1494 v.reset(OpCopy) 1495 v.Type = y.Type 1496 v.AddArg(y) 1497 return true 1498 } 1499 return false 1500 } 1501 func rewriteValueARM64_OpARM64BIC(v *Value, config *Config) bool { 1502 b := v.Block 1503 _ = b 1504 // match: (BIC x (MOVDconst [c])) 1505 // cond: 1506 // result: (BICconst [c] x) 1507 for { 1508 x := v.Args[0] 1509 v_1 := v.Args[1] 1510 if v_1.Op != OpARM64MOVDconst { 1511 break 1512 } 1513 c := v_1.AuxInt 1514 v.reset(OpARM64BICconst) 1515 v.AuxInt = c 1516 v.AddArg(x) 1517 return true 1518 } 1519 // match: (BIC x x) 1520 // cond: 1521 // result: (MOVDconst [0]) 1522 for { 1523 x := v.Args[0] 1524 if x != v.Args[1] { 1525 break 1526 } 1527 v.reset(OpARM64MOVDconst) 1528 v.AuxInt = 0 1529 return true 1530 } 1531 // match: (BIC x (SLLconst [c] y)) 1532 // cond: 1533 // result: (BICshiftLL x y [c]) 1534 for { 1535 x := v.Args[0] 1536 v_1 := v.Args[1] 1537 if v_1.Op != OpARM64SLLconst { 1538 break 1539 } 1540 c := v_1.AuxInt 1541 y := v_1.Args[0] 1542 v.reset(OpARM64BICshiftLL) 1543 v.AuxInt = c 1544 v.AddArg(x) 1545 v.AddArg(y) 1546 return true 1547 } 1548 // match: (BIC x (SRLconst [c] y)) 1549 // cond: 1550 // result: (BICshiftRL x y [c]) 1551 for { 1552 x := v.Args[0] 1553 v_1 := v.Args[1] 1554 if v_1.Op != OpARM64SRLconst { 1555 break 1556 } 1557 c := v_1.AuxInt 1558 y := v_1.Args[0] 1559 v.reset(OpARM64BICshiftRL) 1560 v.AuxInt = c 1561 v.AddArg(x) 1562 v.AddArg(y) 1563 return true 1564 } 1565 // match: (BIC x (SRAconst [c] y)) 1566 // cond: 1567 // result: (BICshiftRA x y [c]) 1568 for { 1569 x := v.Args[0] 1570 v_1 := v.Args[1] 1571 if v_1.Op != OpARM64SRAconst { 1572 break 1573 } 1574 c := v_1.AuxInt 1575 y := v_1.Args[0] 1576 v.reset(OpARM64BICshiftRA) 1577 v.AuxInt = c 1578 v.AddArg(x) 1579 v.AddArg(y) 1580 return true 1581 } 1582 return false 1583 } 1584 func rewriteValueARM64_OpARM64BICconst(v *Value, config *Config) bool { 1585 b := v.Block 1586 _ = b 1587 // match: (BICconst [0] x) 1588 // cond: 1589 // result: x 1590 for { 1591 if v.AuxInt != 0 { 1592 break 1593 } 1594 x := v.Args[0] 1595 v.reset(OpCopy) 1596 v.Type = x.Type 1597 v.AddArg(x) 1598 return true 1599 } 1600 // match: (BICconst [-1] _) 1601 // cond: 1602 // result: (MOVDconst [0]) 1603 for { 1604 if v.AuxInt != -1 { 1605 break 1606 } 1607 v.reset(OpARM64MOVDconst) 1608 v.AuxInt = 0 1609 return true 1610 } 1611 // match: (BICconst [c] (MOVDconst [d])) 1612 // cond: 1613 // result: (MOVDconst [d&^c]) 1614 for { 1615 c := v.AuxInt 1616 v_0 := v.Args[0] 1617 if v_0.Op != OpARM64MOVDconst { 1618 break 1619 } 1620 d := v_0.AuxInt 1621 v.reset(OpARM64MOVDconst) 1622 v.AuxInt = d &^ c 1623 return true 1624 } 1625 return false 1626 } 1627 func rewriteValueARM64_OpARM64BICshiftLL(v *Value, config *Config) bool { 1628 b := v.Block 1629 _ = b 1630 // match: (BICshiftLL x (MOVDconst [c]) [d]) 1631 // cond: 1632 // result: (BICconst x [int64(uint64(c)<<uint64(d))]) 1633 for { 1634 d := v.AuxInt 1635 x := v.Args[0] 1636 v_1 := v.Args[1] 1637 if v_1.Op != OpARM64MOVDconst { 1638 break 1639 } 1640 c := v_1.AuxInt 1641 v.reset(OpARM64BICconst) 1642 v.AuxInt = int64(uint64(c) << uint64(d)) 1643 v.AddArg(x) 1644 return true 1645 } 1646 // match: (BICshiftLL x (SLLconst x [c]) [d]) 1647 // cond: c==d 1648 // result: (MOVDconst [0]) 1649 for { 1650 d := v.AuxInt 1651 x := v.Args[0] 1652 v_1 := v.Args[1] 1653 if v_1.Op != OpARM64SLLconst { 1654 break 1655 } 1656 c := v_1.AuxInt 1657 if x != v_1.Args[0] { 1658 break 1659 } 1660 if !(c == d) { 1661 break 1662 } 1663 v.reset(OpARM64MOVDconst) 1664 v.AuxInt = 0 1665 return true 1666 } 1667 return false 1668 } 1669 func rewriteValueARM64_OpARM64BICshiftRA(v *Value, config *Config) bool { 1670 b := v.Block 1671 _ = b 1672 // match: (BICshiftRA x (MOVDconst [c]) [d]) 1673 // cond: 1674 // result: (BICconst x [int64(int64(c)>>uint64(d))]) 1675 for { 1676 d := v.AuxInt 1677 x := v.Args[0] 1678 v_1 := v.Args[1] 1679 if v_1.Op != OpARM64MOVDconst { 1680 break 1681 } 1682 c := v_1.AuxInt 1683 v.reset(OpARM64BICconst) 1684 v.AuxInt = int64(int64(c) >> uint64(d)) 1685 v.AddArg(x) 1686 return true 1687 } 1688 // match: (BICshiftRA x (SRAconst x [c]) [d]) 1689 // cond: c==d 1690 // result: (MOVDconst [0]) 1691 for { 1692 d := v.AuxInt 1693 x := v.Args[0] 1694 v_1 := v.Args[1] 1695 if v_1.Op != OpARM64SRAconst { 1696 break 1697 } 1698 c := v_1.AuxInt 1699 if x != v_1.Args[0] { 1700 break 1701 } 1702 if !(c == d) { 1703 break 1704 } 1705 v.reset(OpARM64MOVDconst) 1706 v.AuxInt = 0 1707 return true 1708 } 1709 return false 1710 } 1711 func rewriteValueARM64_OpARM64BICshiftRL(v *Value, config *Config) bool { 1712 b := v.Block 1713 _ = b 1714 // match: (BICshiftRL x (MOVDconst [c]) [d]) 1715 // cond: 1716 // result: (BICconst x [int64(uint64(c)>>uint64(d))]) 1717 for { 1718 d := v.AuxInt 1719 x := v.Args[0] 1720 v_1 := v.Args[1] 1721 if v_1.Op != OpARM64MOVDconst { 1722 break 1723 } 1724 c := v_1.AuxInt 1725 v.reset(OpARM64BICconst) 1726 v.AuxInt = int64(uint64(c) >> uint64(d)) 1727 v.AddArg(x) 1728 return true 1729 } 1730 // match: (BICshiftRL x (SRLconst x [c]) [d]) 1731 // cond: c==d 1732 // result: (MOVDconst [0]) 1733 for { 1734 d := v.AuxInt 1735 x := v.Args[0] 1736 v_1 := v.Args[1] 1737 if v_1.Op != OpARM64SRLconst { 1738 break 1739 } 1740 c := v_1.AuxInt 1741 if x != v_1.Args[0] { 1742 break 1743 } 1744 if !(c == d) { 1745 break 1746 } 1747 v.reset(OpARM64MOVDconst) 1748 v.AuxInt = 0 1749 return true 1750 } 1751 return false 1752 } 1753 func rewriteValueARM64_OpARM64CMP(v *Value, config *Config) bool { 1754 b := v.Block 1755 _ = b 1756 // match: (CMP x (MOVDconst [c])) 1757 // cond: 1758 // result: (CMPconst [c] x) 1759 for { 1760 x := v.Args[0] 1761 v_1 := v.Args[1] 1762 if v_1.Op != OpARM64MOVDconst { 1763 break 1764 } 1765 c := v_1.AuxInt 1766 v.reset(OpARM64CMPconst) 1767 v.AuxInt = c 1768 v.AddArg(x) 1769 return true 1770 } 1771 // match: (CMP (MOVDconst [c]) x) 1772 // cond: 1773 // result: (InvertFlags (CMPconst [c] x)) 1774 for { 1775 v_0 := v.Args[0] 1776 if v_0.Op != OpARM64MOVDconst { 1777 break 1778 } 1779 c := v_0.AuxInt 1780 x := v.Args[1] 1781 v.reset(OpARM64InvertFlags) 1782 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 1783 v0.AuxInt = c 1784 v0.AddArg(x) 1785 v.AddArg(v0) 1786 return true 1787 } 1788 // match: (CMP x (SLLconst [c] y)) 1789 // cond: 1790 // result: (CMPshiftLL x y [c]) 1791 for { 1792 x := v.Args[0] 1793 v_1 := v.Args[1] 1794 if v_1.Op != OpARM64SLLconst { 1795 break 1796 } 1797 c := v_1.AuxInt 1798 y := v_1.Args[0] 1799 v.reset(OpARM64CMPshiftLL) 1800 v.AuxInt = c 1801 v.AddArg(x) 1802 v.AddArg(y) 1803 return true 1804 } 1805 // match: (CMP (SLLconst [c] y) x) 1806 // cond: 1807 // result: (InvertFlags (CMPshiftLL x y [c])) 1808 for { 1809 v_0 := v.Args[0] 1810 if v_0.Op != OpARM64SLLconst { 1811 break 1812 } 1813 c := v_0.AuxInt 1814 y := v_0.Args[0] 1815 x := v.Args[1] 1816 v.reset(OpARM64InvertFlags) 1817 v0 := b.NewValue0(v.Line, OpARM64CMPshiftLL, TypeFlags) 1818 v0.AuxInt = c 1819 v0.AddArg(x) 1820 v0.AddArg(y) 1821 v.AddArg(v0) 1822 return true 1823 } 1824 // match: (CMP x (SRLconst [c] y)) 1825 // cond: 1826 // result: (CMPshiftRL x y [c]) 1827 for { 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 y := v_1.Args[0] 1835 v.reset(OpARM64CMPshiftRL) 1836 v.AuxInt = c 1837 v.AddArg(x) 1838 v.AddArg(y) 1839 return true 1840 } 1841 // match: (CMP (SRLconst [c] y) x) 1842 // cond: 1843 // result: (InvertFlags (CMPshiftRL x y [c])) 1844 for { 1845 v_0 := v.Args[0] 1846 if v_0.Op != OpARM64SRLconst { 1847 break 1848 } 1849 c := v_0.AuxInt 1850 y := v_0.Args[0] 1851 x := v.Args[1] 1852 v.reset(OpARM64InvertFlags) 1853 v0 := b.NewValue0(v.Line, OpARM64CMPshiftRL, TypeFlags) 1854 v0.AuxInt = c 1855 v0.AddArg(x) 1856 v0.AddArg(y) 1857 v.AddArg(v0) 1858 return true 1859 } 1860 // match: (CMP x (SRAconst [c] y)) 1861 // cond: 1862 // result: (CMPshiftRA x y [c]) 1863 for { 1864 x := v.Args[0] 1865 v_1 := v.Args[1] 1866 if v_1.Op != OpARM64SRAconst { 1867 break 1868 } 1869 c := v_1.AuxInt 1870 y := v_1.Args[0] 1871 v.reset(OpARM64CMPshiftRA) 1872 v.AuxInt = c 1873 v.AddArg(x) 1874 v.AddArg(y) 1875 return true 1876 } 1877 // match: (CMP (SRAconst [c] y) x) 1878 // cond: 1879 // result: (InvertFlags (CMPshiftRA x y [c])) 1880 for { 1881 v_0 := v.Args[0] 1882 if v_0.Op != OpARM64SRAconst { 1883 break 1884 } 1885 c := v_0.AuxInt 1886 y := v_0.Args[0] 1887 x := v.Args[1] 1888 v.reset(OpARM64InvertFlags) 1889 v0 := b.NewValue0(v.Line, OpARM64CMPshiftRA, TypeFlags) 1890 v0.AuxInt = c 1891 v0.AddArg(x) 1892 v0.AddArg(y) 1893 v.AddArg(v0) 1894 return true 1895 } 1896 return false 1897 } 1898 func rewriteValueARM64_OpARM64CMPW(v *Value, config *Config) bool { 1899 b := v.Block 1900 _ = b 1901 // match: (CMPW x (MOVDconst [c])) 1902 // cond: 1903 // result: (CMPWconst [int64(int32(c))] x) 1904 for { 1905 x := v.Args[0] 1906 v_1 := v.Args[1] 1907 if v_1.Op != OpARM64MOVDconst { 1908 break 1909 } 1910 c := v_1.AuxInt 1911 v.reset(OpARM64CMPWconst) 1912 v.AuxInt = int64(int32(c)) 1913 v.AddArg(x) 1914 return true 1915 } 1916 // match: (CMPW (MOVDconst [c]) x) 1917 // cond: 1918 // result: (InvertFlags (CMPWconst [int64(int32(c))] x)) 1919 for { 1920 v_0 := v.Args[0] 1921 if v_0.Op != OpARM64MOVDconst { 1922 break 1923 } 1924 c := v_0.AuxInt 1925 x := v.Args[1] 1926 v.reset(OpARM64InvertFlags) 1927 v0 := b.NewValue0(v.Line, OpARM64CMPWconst, TypeFlags) 1928 v0.AuxInt = int64(int32(c)) 1929 v0.AddArg(x) 1930 v.AddArg(v0) 1931 return true 1932 } 1933 return false 1934 } 1935 func rewriteValueARM64_OpARM64CMPWconst(v *Value, config *Config) bool { 1936 b := v.Block 1937 _ = b 1938 // match: (CMPWconst (MOVDconst [x]) [y]) 1939 // cond: int32(x)==int32(y) 1940 // result: (FlagEQ) 1941 for { 1942 y := v.AuxInt 1943 v_0 := v.Args[0] 1944 if v_0.Op != OpARM64MOVDconst { 1945 break 1946 } 1947 x := v_0.AuxInt 1948 if !(int32(x) == int32(y)) { 1949 break 1950 } 1951 v.reset(OpARM64FlagEQ) 1952 return true 1953 } 1954 // match: (CMPWconst (MOVDconst [x]) [y]) 1955 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 1956 // result: (FlagLT_ULT) 1957 for { 1958 y := v.AuxInt 1959 v_0 := v.Args[0] 1960 if v_0.Op != OpARM64MOVDconst { 1961 break 1962 } 1963 x := v_0.AuxInt 1964 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 1965 break 1966 } 1967 v.reset(OpARM64FlagLT_ULT) 1968 return true 1969 } 1970 // match: (CMPWconst (MOVDconst [x]) [y]) 1971 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 1972 // result: (FlagLT_UGT) 1973 for { 1974 y := v.AuxInt 1975 v_0 := v.Args[0] 1976 if v_0.Op != OpARM64MOVDconst { 1977 break 1978 } 1979 x := v_0.AuxInt 1980 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 1981 break 1982 } 1983 v.reset(OpARM64FlagLT_UGT) 1984 return true 1985 } 1986 // match: (CMPWconst (MOVDconst [x]) [y]) 1987 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 1988 // result: (FlagGT_ULT) 1989 for { 1990 y := v.AuxInt 1991 v_0 := v.Args[0] 1992 if v_0.Op != OpARM64MOVDconst { 1993 break 1994 } 1995 x := v_0.AuxInt 1996 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 1997 break 1998 } 1999 v.reset(OpARM64FlagGT_ULT) 2000 return true 2001 } 2002 // match: (CMPWconst (MOVDconst [x]) [y]) 2003 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 2004 // result: (FlagGT_UGT) 2005 for { 2006 y := v.AuxInt 2007 v_0 := v.Args[0] 2008 if v_0.Op != OpARM64MOVDconst { 2009 break 2010 } 2011 x := v_0.AuxInt 2012 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 2013 break 2014 } 2015 v.reset(OpARM64FlagGT_UGT) 2016 return true 2017 } 2018 // match: (CMPWconst (MOVBUreg _) [c]) 2019 // cond: 0xff < int32(c) 2020 // result: (FlagLT_ULT) 2021 for { 2022 c := v.AuxInt 2023 v_0 := v.Args[0] 2024 if v_0.Op != OpARM64MOVBUreg { 2025 break 2026 } 2027 if !(0xff < int32(c)) { 2028 break 2029 } 2030 v.reset(OpARM64FlagLT_ULT) 2031 return true 2032 } 2033 // match: (CMPWconst (MOVHUreg _) [c]) 2034 // cond: 0xffff < int32(c) 2035 // result: (FlagLT_ULT) 2036 for { 2037 c := v.AuxInt 2038 v_0 := v.Args[0] 2039 if v_0.Op != OpARM64MOVHUreg { 2040 break 2041 } 2042 if !(0xffff < int32(c)) { 2043 break 2044 } 2045 v.reset(OpARM64FlagLT_ULT) 2046 return true 2047 } 2048 return false 2049 } 2050 func rewriteValueARM64_OpARM64CMPconst(v *Value, config *Config) bool { 2051 b := v.Block 2052 _ = b 2053 // match: (CMPconst (MOVDconst [x]) [y]) 2054 // cond: x==y 2055 // result: (FlagEQ) 2056 for { 2057 y := v.AuxInt 2058 v_0 := v.Args[0] 2059 if v_0.Op != OpARM64MOVDconst { 2060 break 2061 } 2062 x := v_0.AuxInt 2063 if !(x == y) { 2064 break 2065 } 2066 v.reset(OpARM64FlagEQ) 2067 return true 2068 } 2069 // match: (CMPconst (MOVDconst [x]) [y]) 2070 // cond: int64(x)<int64(y) && uint64(x)<uint64(y) 2071 // result: (FlagLT_ULT) 2072 for { 2073 y := v.AuxInt 2074 v_0 := v.Args[0] 2075 if v_0.Op != OpARM64MOVDconst { 2076 break 2077 } 2078 x := v_0.AuxInt 2079 if !(int64(x) < int64(y) && uint64(x) < uint64(y)) { 2080 break 2081 } 2082 v.reset(OpARM64FlagLT_ULT) 2083 return true 2084 } 2085 // match: (CMPconst (MOVDconst [x]) [y]) 2086 // cond: int64(x)<int64(y) && uint64(x)>uint64(y) 2087 // result: (FlagLT_UGT) 2088 for { 2089 y := v.AuxInt 2090 v_0 := v.Args[0] 2091 if v_0.Op != OpARM64MOVDconst { 2092 break 2093 } 2094 x := v_0.AuxInt 2095 if !(int64(x) < int64(y) && uint64(x) > uint64(y)) { 2096 break 2097 } 2098 v.reset(OpARM64FlagLT_UGT) 2099 return true 2100 } 2101 // match: (CMPconst (MOVDconst [x]) [y]) 2102 // cond: int64(x)>int64(y) && uint64(x)<uint64(y) 2103 // result: (FlagGT_ULT) 2104 for { 2105 y := v.AuxInt 2106 v_0 := v.Args[0] 2107 if v_0.Op != OpARM64MOVDconst { 2108 break 2109 } 2110 x := v_0.AuxInt 2111 if !(int64(x) > int64(y) && uint64(x) < uint64(y)) { 2112 break 2113 } 2114 v.reset(OpARM64FlagGT_ULT) 2115 return true 2116 } 2117 // match: (CMPconst (MOVDconst [x]) [y]) 2118 // cond: int64(x)>int64(y) && uint64(x)>uint64(y) 2119 // result: (FlagGT_UGT) 2120 for { 2121 y := v.AuxInt 2122 v_0 := v.Args[0] 2123 if v_0.Op != OpARM64MOVDconst { 2124 break 2125 } 2126 x := v_0.AuxInt 2127 if !(int64(x) > int64(y) && uint64(x) > uint64(y)) { 2128 break 2129 } 2130 v.reset(OpARM64FlagGT_UGT) 2131 return true 2132 } 2133 // match: (CMPconst (MOVBUreg _) [c]) 2134 // cond: 0xff < c 2135 // result: (FlagLT_ULT) 2136 for { 2137 c := v.AuxInt 2138 v_0 := v.Args[0] 2139 if v_0.Op != OpARM64MOVBUreg { 2140 break 2141 } 2142 if !(0xff < c) { 2143 break 2144 } 2145 v.reset(OpARM64FlagLT_ULT) 2146 return true 2147 } 2148 // match: (CMPconst (MOVHUreg _) [c]) 2149 // cond: 0xffff < c 2150 // result: (FlagLT_ULT) 2151 for { 2152 c := v.AuxInt 2153 v_0 := v.Args[0] 2154 if v_0.Op != OpARM64MOVHUreg { 2155 break 2156 } 2157 if !(0xffff < c) { 2158 break 2159 } 2160 v.reset(OpARM64FlagLT_ULT) 2161 return true 2162 } 2163 // match: (CMPconst (MOVWUreg _) [c]) 2164 // cond: 0xffffffff < c 2165 // result: (FlagLT_ULT) 2166 for { 2167 c := v.AuxInt 2168 v_0 := v.Args[0] 2169 if v_0.Op != OpARM64MOVWUreg { 2170 break 2171 } 2172 if !(0xffffffff < c) { 2173 break 2174 } 2175 v.reset(OpARM64FlagLT_ULT) 2176 return true 2177 } 2178 // match: (CMPconst (ANDconst _ [m]) [n]) 2179 // cond: 0 <= m && m < n 2180 // result: (FlagLT_ULT) 2181 for { 2182 n := v.AuxInt 2183 v_0 := v.Args[0] 2184 if v_0.Op != OpARM64ANDconst { 2185 break 2186 } 2187 m := v_0.AuxInt 2188 if !(0 <= m && m < n) { 2189 break 2190 } 2191 v.reset(OpARM64FlagLT_ULT) 2192 return true 2193 } 2194 // match: (CMPconst (SRLconst _ [c]) [n]) 2195 // cond: 0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n) 2196 // result: (FlagLT_ULT) 2197 for { 2198 n := v.AuxInt 2199 v_0 := v.Args[0] 2200 if v_0.Op != OpARM64SRLconst { 2201 break 2202 } 2203 c := v_0.AuxInt 2204 if !(0 <= n && 0 < c && c <= 63 && (1<<uint64(64-c)) <= uint64(n)) { 2205 break 2206 } 2207 v.reset(OpARM64FlagLT_ULT) 2208 return true 2209 } 2210 return false 2211 } 2212 func rewriteValueARM64_OpARM64CMPshiftLL(v *Value, config *Config) bool { 2213 b := v.Block 2214 _ = b 2215 // match: (CMPshiftLL (MOVDconst [c]) x [d]) 2216 // cond: 2217 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 2218 for { 2219 d := v.AuxInt 2220 v_0 := v.Args[0] 2221 if v_0.Op != OpARM64MOVDconst { 2222 break 2223 } 2224 c := v_0.AuxInt 2225 x := v.Args[1] 2226 v.reset(OpARM64InvertFlags) 2227 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 2228 v0.AuxInt = c 2229 v1 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 2230 v1.AuxInt = d 2231 v1.AddArg(x) 2232 v0.AddArg(v1) 2233 v.AddArg(v0) 2234 return true 2235 } 2236 // match: (CMPshiftLL x (MOVDconst [c]) [d]) 2237 // cond: 2238 // result: (CMPconst x [int64(uint64(c)<<uint64(d))]) 2239 for { 2240 d := v.AuxInt 2241 x := v.Args[0] 2242 v_1 := v.Args[1] 2243 if v_1.Op != OpARM64MOVDconst { 2244 break 2245 } 2246 c := v_1.AuxInt 2247 v.reset(OpARM64CMPconst) 2248 v.AuxInt = int64(uint64(c) << uint64(d)) 2249 v.AddArg(x) 2250 return true 2251 } 2252 return false 2253 } 2254 func rewriteValueARM64_OpARM64CMPshiftRA(v *Value, config *Config) bool { 2255 b := v.Block 2256 _ = b 2257 // match: (CMPshiftRA (MOVDconst [c]) x [d]) 2258 // cond: 2259 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 2260 for { 2261 d := v.AuxInt 2262 v_0 := v.Args[0] 2263 if v_0.Op != OpARM64MOVDconst { 2264 break 2265 } 2266 c := v_0.AuxInt 2267 x := v.Args[1] 2268 v.reset(OpARM64InvertFlags) 2269 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 2270 v0.AuxInt = c 2271 v1 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 2272 v1.AuxInt = d 2273 v1.AddArg(x) 2274 v0.AddArg(v1) 2275 v.AddArg(v0) 2276 return true 2277 } 2278 // match: (CMPshiftRA x (MOVDconst [c]) [d]) 2279 // cond: 2280 // result: (CMPconst x [int64(int64(c)>>uint64(d))]) 2281 for { 2282 d := v.AuxInt 2283 x := v.Args[0] 2284 v_1 := v.Args[1] 2285 if v_1.Op != OpARM64MOVDconst { 2286 break 2287 } 2288 c := v_1.AuxInt 2289 v.reset(OpARM64CMPconst) 2290 v.AuxInt = int64(int64(c) >> uint64(d)) 2291 v.AddArg(x) 2292 return true 2293 } 2294 return false 2295 } 2296 func rewriteValueARM64_OpARM64CMPshiftRL(v *Value, config *Config) bool { 2297 b := v.Block 2298 _ = b 2299 // match: (CMPshiftRL (MOVDconst [c]) x [d]) 2300 // cond: 2301 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 2302 for { 2303 d := v.AuxInt 2304 v_0 := v.Args[0] 2305 if v_0.Op != OpARM64MOVDconst { 2306 break 2307 } 2308 c := v_0.AuxInt 2309 x := v.Args[1] 2310 v.reset(OpARM64InvertFlags) 2311 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 2312 v0.AuxInt = c 2313 v1 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 2314 v1.AuxInt = d 2315 v1.AddArg(x) 2316 v0.AddArg(v1) 2317 v.AddArg(v0) 2318 return true 2319 } 2320 // match: (CMPshiftRL x (MOVDconst [c]) [d]) 2321 // cond: 2322 // result: (CMPconst x [int64(uint64(c)>>uint64(d))]) 2323 for { 2324 d := v.AuxInt 2325 x := v.Args[0] 2326 v_1 := v.Args[1] 2327 if v_1.Op != OpARM64MOVDconst { 2328 break 2329 } 2330 c := v_1.AuxInt 2331 v.reset(OpARM64CMPconst) 2332 v.AuxInt = int64(uint64(c) >> uint64(d)) 2333 v.AddArg(x) 2334 return true 2335 } 2336 return false 2337 } 2338 func rewriteValueARM64_OpARM64CSELULT(v *Value, config *Config) bool { 2339 b := v.Block 2340 _ = b 2341 // match: (CSELULT x (MOVDconst [0]) flag) 2342 // cond: 2343 // result: (CSELULT0 x flag) 2344 for { 2345 x := v.Args[0] 2346 v_1 := v.Args[1] 2347 if v_1.Op != OpARM64MOVDconst { 2348 break 2349 } 2350 if v_1.AuxInt != 0 { 2351 break 2352 } 2353 flag := v.Args[2] 2354 v.reset(OpARM64CSELULT0) 2355 v.AddArg(x) 2356 v.AddArg(flag) 2357 return true 2358 } 2359 // match: (CSELULT _ y (FlagEQ)) 2360 // cond: 2361 // result: y 2362 for { 2363 y := v.Args[1] 2364 v_2 := v.Args[2] 2365 if v_2.Op != OpARM64FlagEQ { 2366 break 2367 } 2368 v.reset(OpCopy) 2369 v.Type = y.Type 2370 v.AddArg(y) 2371 return true 2372 } 2373 // match: (CSELULT x _ (FlagLT_ULT)) 2374 // cond: 2375 // result: x 2376 for { 2377 x := v.Args[0] 2378 v_2 := v.Args[2] 2379 if v_2.Op != OpARM64FlagLT_ULT { 2380 break 2381 } 2382 v.reset(OpCopy) 2383 v.Type = x.Type 2384 v.AddArg(x) 2385 return true 2386 } 2387 // match: (CSELULT _ y (FlagLT_UGT)) 2388 // cond: 2389 // result: y 2390 for { 2391 y := v.Args[1] 2392 v_2 := v.Args[2] 2393 if v_2.Op != OpARM64FlagLT_UGT { 2394 break 2395 } 2396 v.reset(OpCopy) 2397 v.Type = y.Type 2398 v.AddArg(y) 2399 return true 2400 } 2401 // match: (CSELULT x _ (FlagGT_ULT)) 2402 // cond: 2403 // result: x 2404 for { 2405 x := v.Args[0] 2406 v_2 := v.Args[2] 2407 if v_2.Op != OpARM64FlagGT_ULT { 2408 break 2409 } 2410 v.reset(OpCopy) 2411 v.Type = x.Type 2412 v.AddArg(x) 2413 return true 2414 } 2415 // match: (CSELULT _ y (FlagGT_UGT)) 2416 // cond: 2417 // result: y 2418 for { 2419 y := v.Args[1] 2420 v_2 := v.Args[2] 2421 if v_2.Op != OpARM64FlagGT_UGT { 2422 break 2423 } 2424 v.reset(OpCopy) 2425 v.Type = y.Type 2426 v.AddArg(y) 2427 return true 2428 } 2429 return false 2430 } 2431 func rewriteValueARM64_OpARM64CSELULT0(v *Value, config *Config) bool { 2432 b := v.Block 2433 _ = b 2434 // match: (CSELULT0 _ (FlagEQ)) 2435 // cond: 2436 // result: (MOVDconst [0]) 2437 for { 2438 v_1 := v.Args[1] 2439 if v_1.Op != OpARM64FlagEQ { 2440 break 2441 } 2442 v.reset(OpARM64MOVDconst) 2443 v.AuxInt = 0 2444 return true 2445 } 2446 // match: (CSELULT0 x (FlagLT_ULT)) 2447 // cond: 2448 // result: x 2449 for { 2450 x := v.Args[0] 2451 v_1 := v.Args[1] 2452 if v_1.Op != OpARM64FlagLT_ULT { 2453 break 2454 } 2455 v.reset(OpCopy) 2456 v.Type = x.Type 2457 v.AddArg(x) 2458 return true 2459 } 2460 // match: (CSELULT0 _ (FlagLT_UGT)) 2461 // cond: 2462 // result: (MOVDconst [0]) 2463 for { 2464 v_1 := v.Args[1] 2465 if v_1.Op != OpARM64FlagLT_UGT { 2466 break 2467 } 2468 v.reset(OpARM64MOVDconst) 2469 v.AuxInt = 0 2470 return true 2471 } 2472 // match: (CSELULT0 x (FlagGT_ULT)) 2473 // cond: 2474 // result: x 2475 for { 2476 x := v.Args[0] 2477 v_1 := v.Args[1] 2478 if v_1.Op != OpARM64FlagGT_ULT { 2479 break 2480 } 2481 v.reset(OpCopy) 2482 v.Type = x.Type 2483 v.AddArg(x) 2484 return true 2485 } 2486 // match: (CSELULT0 _ (FlagGT_UGT)) 2487 // cond: 2488 // result: (MOVDconst [0]) 2489 for { 2490 v_1 := v.Args[1] 2491 if v_1.Op != OpARM64FlagGT_UGT { 2492 break 2493 } 2494 v.reset(OpARM64MOVDconst) 2495 v.AuxInt = 0 2496 return true 2497 } 2498 return false 2499 } 2500 func rewriteValueARM64_OpARM64DIV(v *Value, config *Config) bool { 2501 b := v.Block 2502 _ = b 2503 // match: (DIV (MOVDconst [c]) (MOVDconst [d])) 2504 // cond: 2505 // result: (MOVDconst [int64(c)/int64(d)]) 2506 for { 2507 v_0 := v.Args[0] 2508 if v_0.Op != OpARM64MOVDconst { 2509 break 2510 } 2511 c := v_0.AuxInt 2512 v_1 := v.Args[1] 2513 if v_1.Op != OpARM64MOVDconst { 2514 break 2515 } 2516 d := v_1.AuxInt 2517 v.reset(OpARM64MOVDconst) 2518 v.AuxInt = int64(c) / int64(d) 2519 return true 2520 } 2521 return false 2522 } 2523 func rewriteValueARM64_OpARM64DIVW(v *Value, config *Config) bool { 2524 b := v.Block 2525 _ = b 2526 // match: (DIVW (MOVDconst [c]) (MOVDconst [d])) 2527 // cond: 2528 // result: (MOVDconst [int64(int32(c)/int32(d))]) 2529 for { 2530 v_0 := v.Args[0] 2531 if v_0.Op != OpARM64MOVDconst { 2532 break 2533 } 2534 c := v_0.AuxInt 2535 v_1 := v.Args[1] 2536 if v_1.Op != OpARM64MOVDconst { 2537 break 2538 } 2539 d := v_1.AuxInt 2540 v.reset(OpARM64MOVDconst) 2541 v.AuxInt = int64(int32(c) / int32(d)) 2542 return true 2543 } 2544 return false 2545 } 2546 func rewriteValueARM64_OpARM64Equal(v *Value, config *Config) bool { 2547 b := v.Block 2548 _ = b 2549 // match: (Equal (FlagEQ)) 2550 // cond: 2551 // result: (MOVDconst [1]) 2552 for { 2553 v_0 := v.Args[0] 2554 if v_0.Op != OpARM64FlagEQ { 2555 break 2556 } 2557 v.reset(OpARM64MOVDconst) 2558 v.AuxInt = 1 2559 return true 2560 } 2561 // match: (Equal (FlagLT_ULT)) 2562 // cond: 2563 // result: (MOVDconst [0]) 2564 for { 2565 v_0 := v.Args[0] 2566 if v_0.Op != OpARM64FlagLT_ULT { 2567 break 2568 } 2569 v.reset(OpARM64MOVDconst) 2570 v.AuxInt = 0 2571 return true 2572 } 2573 // match: (Equal (FlagLT_UGT)) 2574 // cond: 2575 // result: (MOVDconst [0]) 2576 for { 2577 v_0 := v.Args[0] 2578 if v_0.Op != OpARM64FlagLT_UGT { 2579 break 2580 } 2581 v.reset(OpARM64MOVDconst) 2582 v.AuxInt = 0 2583 return true 2584 } 2585 // match: (Equal (FlagGT_ULT)) 2586 // cond: 2587 // result: (MOVDconst [0]) 2588 for { 2589 v_0 := v.Args[0] 2590 if v_0.Op != OpARM64FlagGT_ULT { 2591 break 2592 } 2593 v.reset(OpARM64MOVDconst) 2594 v.AuxInt = 0 2595 return true 2596 } 2597 // match: (Equal (FlagGT_UGT)) 2598 // cond: 2599 // result: (MOVDconst [0]) 2600 for { 2601 v_0 := v.Args[0] 2602 if v_0.Op != OpARM64FlagGT_UGT { 2603 break 2604 } 2605 v.reset(OpARM64MOVDconst) 2606 v.AuxInt = 0 2607 return true 2608 } 2609 // match: (Equal (InvertFlags x)) 2610 // cond: 2611 // result: (Equal x) 2612 for { 2613 v_0 := v.Args[0] 2614 if v_0.Op != OpARM64InvertFlags { 2615 break 2616 } 2617 x := v_0.Args[0] 2618 v.reset(OpARM64Equal) 2619 v.AddArg(x) 2620 return true 2621 } 2622 return false 2623 } 2624 func rewriteValueARM64_OpARM64FMOVDload(v *Value, config *Config) bool { 2625 b := v.Block 2626 _ = b 2627 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 2628 // cond: (off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 2629 // result: (FMOVDload [off1+off2] {sym} ptr mem) 2630 for { 2631 off1 := v.AuxInt 2632 sym := v.Aux 2633 v_0 := v.Args[0] 2634 if v_0.Op != OpARM64ADDconst { 2635 break 2636 } 2637 off2 := v_0.AuxInt 2638 ptr := v_0.Args[0] 2639 mem := v.Args[1] 2640 if !((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 2641 break 2642 } 2643 v.reset(OpARM64FMOVDload) 2644 v.AuxInt = off1 + off2 2645 v.Aux = sym 2646 v.AddArg(ptr) 2647 v.AddArg(mem) 2648 return true 2649 } 2650 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 2651 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 2652 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 2653 for { 2654 off1 := v.AuxInt 2655 sym1 := v.Aux 2656 v_0 := v.Args[0] 2657 if v_0.Op != OpARM64MOVDaddr { 2658 break 2659 } 2660 off2 := v_0.AuxInt 2661 sym2 := v_0.Aux 2662 ptr := v_0.Args[0] 2663 mem := v.Args[1] 2664 if !(canMergeSym(sym1, sym2) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 2665 break 2666 } 2667 v.reset(OpARM64FMOVDload) 2668 v.AuxInt = off1 + off2 2669 v.Aux = mergeSym(sym1, sym2) 2670 v.AddArg(ptr) 2671 v.AddArg(mem) 2672 return true 2673 } 2674 return false 2675 } 2676 func rewriteValueARM64_OpARM64FMOVDstore(v *Value, config *Config) bool { 2677 b := v.Block 2678 _ = b 2679 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 2680 // cond: (off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 2681 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 2682 for { 2683 off1 := v.AuxInt 2684 sym := v.Aux 2685 v_0 := v.Args[0] 2686 if v_0.Op != OpARM64ADDconst { 2687 break 2688 } 2689 off2 := v_0.AuxInt 2690 ptr := v_0.Args[0] 2691 val := v.Args[1] 2692 mem := v.Args[2] 2693 if !((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 2694 break 2695 } 2696 v.reset(OpARM64FMOVDstore) 2697 v.AuxInt = off1 + off2 2698 v.Aux = sym 2699 v.AddArg(ptr) 2700 v.AddArg(val) 2701 v.AddArg(mem) 2702 return true 2703 } 2704 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 2705 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 2706 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 2707 for { 2708 off1 := v.AuxInt 2709 sym1 := v.Aux 2710 v_0 := v.Args[0] 2711 if v_0.Op != OpARM64MOVDaddr { 2712 break 2713 } 2714 off2 := v_0.AuxInt 2715 sym2 := v_0.Aux 2716 ptr := v_0.Args[0] 2717 val := v.Args[1] 2718 mem := v.Args[2] 2719 if !(canMergeSym(sym1, sym2) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 2720 break 2721 } 2722 v.reset(OpARM64FMOVDstore) 2723 v.AuxInt = off1 + off2 2724 v.Aux = mergeSym(sym1, sym2) 2725 v.AddArg(ptr) 2726 v.AddArg(val) 2727 v.AddArg(mem) 2728 return true 2729 } 2730 return false 2731 } 2732 func rewriteValueARM64_OpARM64FMOVSload(v *Value, config *Config) bool { 2733 b := v.Block 2734 _ = b 2735 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 2736 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 2737 // result: (FMOVSload [off1+off2] {sym} ptr mem) 2738 for { 2739 off1 := v.AuxInt 2740 sym := v.Aux 2741 v_0 := v.Args[0] 2742 if v_0.Op != OpARM64ADDconst { 2743 break 2744 } 2745 off2 := v_0.AuxInt 2746 ptr := v_0.Args[0] 2747 mem := v.Args[1] 2748 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 2749 break 2750 } 2751 v.reset(OpARM64FMOVSload) 2752 v.AuxInt = off1 + off2 2753 v.Aux = sym 2754 v.AddArg(ptr) 2755 v.AddArg(mem) 2756 return true 2757 } 2758 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 2759 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 2760 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 2761 for { 2762 off1 := v.AuxInt 2763 sym1 := v.Aux 2764 v_0 := v.Args[0] 2765 if v_0.Op != OpARM64MOVDaddr { 2766 break 2767 } 2768 off2 := v_0.AuxInt 2769 sym2 := v_0.Aux 2770 ptr := v_0.Args[0] 2771 mem := v.Args[1] 2772 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 2773 break 2774 } 2775 v.reset(OpARM64FMOVSload) 2776 v.AuxInt = off1 + off2 2777 v.Aux = mergeSym(sym1, sym2) 2778 v.AddArg(ptr) 2779 v.AddArg(mem) 2780 return true 2781 } 2782 return false 2783 } 2784 func rewriteValueARM64_OpARM64FMOVSstore(v *Value, config *Config) bool { 2785 b := v.Block 2786 _ = b 2787 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 2788 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 2789 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 2790 for { 2791 off1 := v.AuxInt 2792 sym := v.Aux 2793 v_0 := v.Args[0] 2794 if v_0.Op != OpARM64ADDconst { 2795 break 2796 } 2797 off2 := v_0.AuxInt 2798 ptr := v_0.Args[0] 2799 val := v.Args[1] 2800 mem := v.Args[2] 2801 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 2802 break 2803 } 2804 v.reset(OpARM64FMOVSstore) 2805 v.AuxInt = off1 + off2 2806 v.Aux = sym 2807 v.AddArg(ptr) 2808 v.AddArg(val) 2809 v.AddArg(mem) 2810 return true 2811 } 2812 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 2813 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 2814 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 2815 for { 2816 off1 := v.AuxInt 2817 sym1 := v.Aux 2818 v_0 := v.Args[0] 2819 if v_0.Op != OpARM64MOVDaddr { 2820 break 2821 } 2822 off2 := v_0.AuxInt 2823 sym2 := v_0.Aux 2824 ptr := v_0.Args[0] 2825 val := v.Args[1] 2826 mem := v.Args[2] 2827 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 2828 break 2829 } 2830 v.reset(OpARM64FMOVSstore) 2831 v.AuxInt = off1 + off2 2832 v.Aux = mergeSym(sym1, sym2) 2833 v.AddArg(ptr) 2834 v.AddArg(val) 2835 v.AddArg(mem) 2836 return true 2837 } 2838 return false 2839 } 2840 func rewriteValueARM64_OpARM64GreaterEqual(v *Value, config *Config) bool { 2841 b := v.Block 2842 _ = b 2843 // match: (GreaterEqual (FlagEQ)) 2844 // cond: 2845 // result: (MOVDconst [1]) 2846 for { 2847 v_0 := v.Args[0] 2848 if v_0.Op != OpARM64FlagEQ { 2849 break 2850 } 2851 v.reset(OpARM64MOVDconst) 2852 v.AuxInt = 1 2853 return true 2854 } 2855 // match: (GreaterEqual (FlagLT_ULT)) 2856 // cond: 2857 // result: (MOVDconst [0]) 2858 for { 2859 v_0 := v.Args[0] 2860 if v_0.Op != OpARM64FlagLT_ULT { 2861 break 2862 } 2863 v.reset(OpARM64MOVDconst) 2864 v.AuxInt = 0 2865 return true 2866 } 2867 // match: (GreaterEqual (FlagLT_UGT)) 2868 // cond: 2869 // result: (MOVDconst [0]) 2870 for { 2871 v_0 := v.Args[0] 2872 if v_0.Op != OpARM64FlagLT_UGT { 2873 break 2874 } 2875 v.reset(OpARM64MOVDconst) 2876 v.AuxInt = 0 2877 return true 2878 } 2879 // match: (GreaterEqual (FlagGT_ULT)) 2880 // cond: 2881 // result: (MOVDconst [1]) 2882 for { 2883 v_0 := v.Args[0] 2884 if v_0.Op != OpARM64FlagGT_ULT { 2885 break 2886 } 2887 v.reset(OpARM64MOVDconst) 2888 v.AuxInt = 1 2889 return true 2890 } 2891 // match: (GreaterEqual (FlagGT_UGT)) 2892 // cond: 2893 // result: (MOVDconst [1]) 2894 for { 2895 v_0 := v.Args[0] 2896 if v_0.Op != OpARM64FlagGT_UGT { 2897 break 2898 } 2899 v.reset(OpARM64MOVDconst) 2900 v.AuxInt = 1 2901 return true 2902 } 2903 // match: (GreaterEqual (InvertFlags x)) 2904 // cond: 2905 // result: (LessEqual x) 2906 for { 2907 v_0 := v.Args[0] 2908 if v_0.Op != OpARM64InvertFlags { 2909 break 2910 } 2911 x := v_0.Args[0] 2912 v.reset(OpARM64LessEqual) 2913 v.AddArg(x) 2914 return true 2915 } 2916 return false 2917 } 2918 func rewriteValueARM64_OpARM64GreaterEqualU(v *Value, config *Config) bool { 2919 b := v.Block 2920 _ = b 2921 // match: (GreaterEqualU (FlagEQ)) 2922 // cond: 2923 // result: (MOVDconst [1]) 2924 for { 2925 v_0 := v.Args[0] 2926 if v_0.Op != OpARM64FlagEQ { 2927 break 2928 } 2929 v.reset(OpARM64MOVDconst) 2930 v.AuxInt = 1 2931 return true 2932 } 2933 // match: (GreaterEqualU (FlagLT_ULT)) 2934 // cond: 2935 // result: (MOVDconst [0]) 2936 for { 2937 v_0 := v.Args[0] 2938 if v_0.Op != OpARM64FlagLT_ULT { 2939 break 2940 } 2941 v.reset(OpARM64MOVDconst) 2942 v.AuxInt = 0 2943 return true 2944 } 2945 // match: (GreaterEqualU (FlagLT_UGT)) 2946 // cond: 2947 // result: (MOVDconst [1]) 2948 for { 2949 v_0 := v.Args[0] 2950 if v_0.Op != OpARM64FlagLT_UGT { 2951 break 2952 } 2953 v.reset(OpARM64MOVDconst) 2954 v.AuxInt = 1 2955 return true 2956 } 2957 // match: (GreaterEqualU (FlagGT_ULT)) 2958 // cond: 2959 // result: (MOVDconst [0]) 2960 for { 2961 v_0 := v.Args[0] 2962 if v_0.Op != OpARM64FlagGT_ULT { 2963 break 2964 } 2965 v.reset(OpARM64MOVDconst) 2966 v.AuxInt = 0 2967 return true 2968 } 2969 // match: (GreaterEqualU (FlagGT_UGT)) 2970 // cond: 2971 // result: (MOVDconst [1]) 2972 for { 2973 v_0 := v.Args[0] 2974 if v_0.Op != OpARM64FlagGT_UGT { 2975 break 2976 } 2977 v.reset(OpARM64MOVDconst) 2978 v.AuxInt = 1 2979 return true 2980 } 2981 // match: (GreaterEqualU (InvertFlags x)) 2982 // cond: 2983 // result: (LessEqualU x) 2984 for { 2985 v_0 := v.Args[0] 2986 if v_0.Op != OpARM64InvertFlags { 2987 break 2988 } 2989 x := v_0.Args[0] 2990 v.reset(OpARM64LessEqualU) 2991 v.AddArg(x) 2992 return true 2993 } 2994 return false 2995 } 2996 func rewriteValueARM64_OpARM64GreaterThan(v *Value, config *Config) bool { 2997 b := v.Block 2998 _ = b 2999 // match: (GreaterThan (FlagEQ)) 3000 // cond: 3001 // result: (MOVDconst [0]) 3002 for { 3003 v_0 := v.Args[0] 3004 if v_0.Op != OpARM64FlagEQ { 3005 break 3006 } 3007 v.reset(OpARM64MOVDconst) 3008 v.AuxInt = 0 3009 return true 3010 } 3011 // match: (GreaterThan (FlagLT_ULT)) 3012 // cond: 3013 // result: (MOVDconst [0]) 3014 for { 3015 v_0 := v.Args[0] 3016 if v_0.Op != OpARM64FlagLT_ULT { 3017 break 3018 } 3019 v.reset(OpARM64MOVDconst) 3020 v.AuxInt = 0 3021 return true 3022 } 3023 // match: (GreaterThan (FlagLT_UGT)) 3024 // cond: 3025 // result: (MOVDconst [0]) 3026 for { 3027 v_0 := v.Args[0] 3028 if v_0.Op != OpARM64FlagLT_UGT { 3029 break 3030 } 3031 v.reset(OpARM64MOVDconst) 3032 v.AuxInt = 0 3033 return true 3034 } 3035 // match: (GreaterThan (FlagGT_ULT)) 3036 // cond: 3037 // result: (MOVDconst [1]) 3038 for { 3039 v_0 := v.Args[0] 3040 if v_0.Op != OpARM64FlagGT_ULT { 3041 break 3042 } 3043 v.reset(OpARM64MOVDconst) 3044 v.AuxInt = 1 3045 return true 3046 } 3047 // match: (GreaterThan (FlagGT_UGT)) 3048 // cond: 3049 // result: (MOVDconst [1]) 3050 for { 3051 v_0 := v.Args[0] 3052 if v_0.Op != OpARM64FlagGT_UGT { 3053 break 3054 } 3055 v.reset(OpARM64MOVDconst) 3056 v.AuxInt = 1 3057 return true 3058 } 3059 // match: (GreaterThan (InvertFlags x)) 3060 // cond: 3061 // result: (LessThan x) 3062 for { 3063 v_0 := v.Args[0] 3064 if v_0.Op != OpARM64InvertFlags { 3065 break 3066 } 3067 x := v_0.Args[0] 3068 v.reset(OpARM64LessThan) 3069 v.AddArg(x) 3070 return true 3071 } 3072 return false 3073 } 3074 func rewriteValueARM64_OpARM64GreaterThanU(v *Value, config *Config) bool { 3075 b := v.Block 3076 _ = b 3077 // match: (GreaterThanU (FlagEQ)) 3078 // cond: 3079 // result: (MOVDconst [0]) 3080 for { 3081 v_0 := v.Args[0] 3082 if v_0.Op != OpARM64FlagEQ { 3083 break 3084 } 3085 v.reset(OpARM64MOVDconst) 3086 v.AuxInt = 0 3087 return true 3088 } 3089 // match: (GreaterThanU (FlagLT_ULT)) 3090 // cond: 3091 // result: (MOVDconst [0]) 3092 for { 3093 v_0 := v.Args[0] 3094 if v_0.Op != OpARM64FlagLT_ULT { 3095 break 3096 } 3097 v.reset(OpARM64MOVDconst) 3098 v.AuxInt = 0 3099 return true 3100 } 3101 // match: (GreaterThanU (FlagLT_UGT)) 3102 // cond: 3103 // result: (MOVDconst [1]) 3104 for { 3105 v_0 := v.Args[0] 3106 if v_0.Op != OpARM64FlagLT_UGT { 3107 break 3108 } 3109 v.reset(OpARM64MOVDconst) 3110 v.AuxInt = 1 3111 return true 3112 } 3113 // match: (GreaterThanU (FlagGT_ULT)) 3114 // cond: 3115 // result: (MOVDconst [0]) 3116 for { 3117 v_0 := v.Args[0] 3118 if v_0.Op != OpARM64FlagGT_ULT { 3119 break 3120 } 3121 v.reset(OpARM64MOVDconst) 3122 v.AuxInt = 0 3123 return true 3124 } 3125 // match: (GreaterThanU (FlagGT_UGT)) 3126 // cond: 3127 // result: (MOVDconst [1]) 3128 for { 3129 v_0 := v.Args[0] 3130 if v_0.Op != OpARM64FlagGT_UGT { 3131 break 3132 } 3133 v.reset(OpARM64MOVDconst) 3134 v.AuxInt = 1 3135 return true 3136 } 3137 // match: (GreaterThanU (InvertFlags x)) 3138 // cond: 3139 // result: (LessThanU x) 3140 for { 3141 v_0 := v.Args[0] 3142 if v_0.Op != OpARM64InvertFlags { 3143 break 3144 } 3145 x := v_0.Args[0] 3146 v.reset(OpARM64LessThanU) 3147 v.AddArg(x) 3148 return true 3149 } 3150 return false 3151 } 3152 func rewriteValueARM64_OpARM64LessEqual(v *Value, config *Config) bool { 3153 b := v.Block 3154 _ = b 3155 // match: (LessEqual (FlagEQ)) 3156 // cond: 3157 // result: (MOVDconst [1]) 3158 for { 3159 v_0 := v.Args[0] 3160 if v_0.Op != OpARM64FlagEQ { 3161 break 3162 } 3163 v.reset(OpARM64MOVDconst) 3164 v.AuxInt = 1 3165 return true 3166 } 3167 // match: (LessEqual (FlagLT_ULT)) 3168 // cond: 3169 // result: (MOVDconst [1]) 3170 for { 3171 v_0 := v.Args[0] 3172 if v_0.Op != OpARM64FlagLT_ULT { 3173 break 3174 } 3175 v.reset(OpARM64MOVDconst) 3176 v.AuxInt = 1 3177 return true 3178 } 3179 // match: (LessEqual (FlagLT_UGT)) 3180 // cond: 3181 // result: (MOVDconst [1]) 3182 for { 3183 v_0 := v.Args[0] 3184 if v_0.Op != OpARM64FlagLT_UGT { 3185 break 3186 } 3187 v.reset(OpARM64MOVDconst) 3188 v.AuxInt = 1 3189 return true 3190 } 3191 // match: (LessEqual (FlagGT_ULT)) 3192 // cond: 3193 // result: (MOVDconst [0]) 3194 for { 3195 v_0 := v.Args[0] 3196 if v_0.Op != OpARM64FlagGT_ULT { 3197 break 3198 } 3199 v.reset(OpARM64MOVDconst) 3200 v.AuxInt = 0 3201 return true 3202 } 3203 // match: (LessEqual (FlagGT_UGT)) 3204 // cond: 3205 // result: (MOVDconst [0]) 3206 for { 3207 v_0 := v.Args[0] 3208 if v_0.Op != OpARM64FlagGT_UGT { 3209 break 3210 } 3211 v.reset(OpARM64MOVDconst) 3212 v.AuxInt = 0 3213 return true 3214 } 3215 // match: (LessEqual (InvertFlags x)) 3216 // cond: 3217 // result: (GreaterEqual x) 3218 for { 3219 v_0 := v.Args[0] 3220 if v_0.Op != OpARM64InvertFlags { 3221 break 3222 } 3223 x := v_0.Args[0] 3224 v.reset(OpARM64GreaterEqual) 3225 v.AddArg(x) 3226 return true 3227 } 3228 return false 3229 } 3230 func rewriteValueARM64_OpARM64LessEqualU(v *Value, config *Config) bool { 3231 b := v.Block 3232 _ = b 3233 // match: (LessEqualU (FlagEQ)) 3234 // cond: 3235 // result: (MOVDconst [1]) 3236 for { 3237 v_0 := v.Args[0] 3238 if v_0.Op != OpARM64FlagEQ { 3239 break 3240 } 3241 v.reset(OpARM64MOVDconst) 3242 v.AuxInt = 1 3243 return true 3244 } 3245 // match: (LessEqualU (FlagLT_ULT)) 3246 // cond: 3247 // result: (MOVDconst [1]) 3248 for { 3249 v_0 := v.Args[0] 3250 if v_0.Op != OpARM64FlagLT_ULT { 3251 break 3252 } 3253 v.reset(OpARM64MOVDconst) 3254 v.AuxInt = 1 3255 return true 3256 } 3257 // match: (LessEqualU (FlagLT_UGT)) 3258 // cond: 3259 // result: (MOVDconst [0]) 3260 for { 3261 v_0 := v.Args[0] 3262 if v_0.Op != OpARM64FlagLT_UGT { 3263 break 3264 } 3265 v.reset(OpARM64MOVDconst) 3266 v.AuxInt = 0 3267 return true 3268 } 3269 // match: (LessEqualU (FlagGT_ULT)) 3270 // cond: 3271 // result: (MOVDconst [1]) 3272 for { 3273 v_0 := v.Args[0] 3274 if v_0.Op != OpARM64FlagGT_ULT { 3275 break 3276 } 3277 v.reset(OpARM64MOVDconst) 3278 v.AuxInt = 1 3279 return true 3280 } 3281 // match: (LessEqualU (FlagGT_UGT)) 3282 // cond: 3283 // result: (MOVDconst [0]) 3284 for { 3285 v_0 := v.Args[0] 3286 if v_0.Op != OpARM64FlagGT_UGT { 3287 break 3288 } 3289 v.reset(OpARM64MOVDconst) 3290 v.AuxInt = 0 3291 return true 3292 } 3293 // match: (LessEqualU (InvertFlags x)) 3294 // cond: 3295 // result: (GreaterEqualU x) 3296 for { 3297 v_0 := v.Args[0] 3298 if v_0.Op != OpARM64InvertFlags { 3299 break 3300 } 3301 x := v_0.Args[0] 3302 v.reset(OpARM64GreaterEqualU) 3303 v.AddArg(x) 3304 return true 3305 } 3306 return false 3307 } 3308 func rewriteValueARM64_OpARM64LessThan(v *Value, config *Config) bool { 3309 b := v.Block 3310 _ = b 3311 // match: (LessThan (FlagEQ)) 3312 // cond: 3313 // result: (MOVDconst [0]) 3314 for { 3315 v_0 := v.Args[0] 3316 if v_0.Op != OpARM64FlagEQ { 3317 break 3318 } 3319 v.reset(OpARM64MOVDconst) 3320 v.AuxInt = 0 3321 return true 3322 } 3323 // match: (LessThan (FlagLT_ULT)) 3324 // cond: 3325 // result: (MOVDconst [1]) 3326 for { 3327 v_0 := v.Args[0] 3328 if v_0.Op != OpARM64FlagLT_ULT { 3329 break 3330 } 3331 v.reset(OpARM64MOVDconst) 3332 v.AuxInt = 1 3333 return true 3334 } 3335 // match: (LessThan (FlagLT_UGT)) 3336 // cond: 3337 // result: (MOVDconst [1]) 3338 for { 3339 v_0 := v.Args[0] 3340 if v_0.Op != OpARM64FlagLT_UGT { 3341 break 3342 } 3343 v.reset(OpARM64MOVDconst) 3344 v.AuxInt = 1 3345 return true 3346 } 3347 // match: (LessThan (FlagGT_ULT)) 3348 // cond: 3349 // result: (MOVDconst [0]) 3350 for { 3351 v_0 := v.Args[0] 3352 if v_0.Op != OpARM64FlagGT_ULT { 3353 break 3354 } 3355 v.reset(OpARM64MOVDconst) 3356 v.AuxInt = 0 3357 return true 3358 } 3359 // match: (LessThan (FlagGT_UGT)) 3360 // cond: 3361 // result: (MOVDconst [0]) 3362 for { 3363 v_0 := v.Args[0] 3364 if v_0.Op != OpARM64FlagGT_UGT { 3365 break 3366 } 3367 v.reset(OpARM64MOVDconst) 3368 v.AuxInt = 0 3369 return true 3370 } 3371 // match: (LessThan (InvertFlags x)) 3372 // cond: 3373 // result: (GreaterThan x) 3374 for { 3375 v_0 := v.Args[0] 3376 if v_0.Op != OpARM64InvertFlags { 3377 break 3378 } 3379 x := v_0.Args[0] 3380 v.reset(OpARM64GreaterThan) 3381 v.AddArg(x) 3382 return true 3383 } 3384 return false 3385 } 3386 func rewriteValueARM64_OpARM64LessThanU(v *Value, config *Config) bool { 3387 b := v.Block 3388 _ = b 3389 // match: (LessThanU (FlagEQ)) 3390 // cond: 3391 // result: (MOVDconst [0]) 3392 for { 3393 v_0 := v.Args[0] 3394 if v_0.Op != OpARM64FlagEQ { 3395 break 3396 } 3397 v.reset(OpARM64MOVDconst) 3398 v.AuxInt = 0 3399 return true 3400 } 3401 // match: (LessThanU (FlagLT_ULT)) 3402 // cond: 3403 // result: (MOVDconst [1]) 3404 for { 3405 v_0 := v.Args[0] 3406 if v_0.Op != OpARM64FlagLT_ULT { 3407 break 3408 } 3409 v.reset(OpARM64MOVDconst) 3410 v.AuxInt = 1 3411 return true 3412 } 3413 // match: (LessThanU (FlagLT_UGT)) 3414 // cond: 3415 // result: (MOVDconst [0]) 3416 for { 3417 v_0 := v.Args[0] 3418 if v_0.Op != OpARM64FlagLT_UGT { 3419 break 3420 } 3421 v.reset(OpARM64MOVDconst) 3422 v.AuxInt = 0 3423 return true 3424 } 3425 // match: (LessThanU (FlagGT_ULT)) 3426 // cond: 3427 // result: (MOVDconst [1]) 3428 for { 3429 v_0 := v.Args[0] 3430 if v_0.Op != OpARM64FlagGT_ULT { 3431 break 3432 } 3433 v.reset(OpARM64MOVDconst) 3434 v.AuxInt = 1 3435 return true 3436 } 3437 // match: (LessThanU (FlagGT_UGT)) 3438 // cond: 3439 // result: (MOVDconst [0]) 3440 for { 3441 v_0 := v.Args[0] 3442 if v_0.Op != OpARM64FlagGT_UGT { 3443 break 3444 } 3445 v.reset(OpARM64MOVDconst) 3446 v.AuxInt = 0 3447 return true 3448 } 3449 // match: (LessThanU (InvertFlags x)) 3450 // cond: 3451 // result: (GreaterThanU x) 3452 for { 3453 v_0 := v.Args[0] 3454 if v_0.Op != OpARM64InvertFlags { 3455 break 3456 } 3457 x := v_0.Args[0] 3458 v.reset(OpARM64GreaterThanU) 3459 v.AddArg(x) 3460 return true 3461 } 3462 return false 3463 } 3464 func rewriteValueARM64_OpARM64MOD(v *Value, config *Config) bool { 3465 b := v.Block 3466 _ = b 3467 // match: (MOD (MOVDconst [c]) (MOVDconst [d])) 3468 // cond: 3469 // result: (MOVDconst [int64(c)%int64(d)]) 3470 for { 3471 v_0 := v.Args[0] 3472 if v_0.Op != OpARM64MOVDconst { 3473 break 3474 } 3475 c := v_0.AuxInt 3476 v_1 := v.Args[1] 3477 if v_1.Op != OpARM64MOVDconst { 3478 break 3479 } 3480 d := v_1.AuxInt 3481 v.reset(OpARM64MOVDconst) 3482 v.AuxInt = int64(c) % int64(d) 3483 return true 3484 } 3485 return false 3486 } 3487 func rewriteValueARM64_OpARM64MODW(v *Value, config *Config) bool { 3488 b := v.Block 3489 _ = b 3490 // match: (MODW (MOVDconst [c]) (MOVDconst [d])) 3491 // cond: 3492 // result: (MOVDconst [int64(int32(c)%int32(d))]) 3493 for { 3494 v_0 := v.Args[0] 3495 if v_0.Op != OpARM64MOVDconst { 3496 break 3497 } 3498 c := v_0.AuxInt 3499 v_1 := v.Args[1] 3500 if v_1.Op != OpARM64MOVDconst { 3501 break 3502 } 3503 d := v_1.AuxInt 3504 v.reset(OpARM64MOVDconst) 3505 v.AuxInt = int64(int32(c) % int32(d)) 3506 return true 3507 } 3508 return false 3509 } 3510 func rewriteValueARM64_OpARM64MOVBUload(v *Value, config *Config) bool { 3511 b := v.Block 3512 _ = b 3513 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 3514 // cond: 3515 // result: (MOVBUload [off1+off2] {sym} ptr mem) 3516 for { 3517 off1 := v.AuxInt 3518 sym := v.Aux 3519 v_0 := v.Args[0] 3520 if v_0.Op != OpARM64ADDconst { 3521 break 3522 } 3523 off2 := v_0.AuxInt 3524 ptr := v_0.Args[0] 3525 mem := v.Args[1] 3526 v.reset(OpARM64MOVBUload) 3527 v.AuxInt = off1 + off2 3528 v.Aux = sym 3529 v.AddArg(ptr) 3530 v.AddArg(mem) 3531 return true 3532 } 3533 // match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3534 // cond: canMergeSym(sym1,sym2) 3535 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3536 for { 3537 off1 := v.AuxInt 3538 sym1 := v.Aux 3539 v_0 := v.Args[0] 3540 if v_0.Op != OpARM64MOVDaddr { 3541 break 3542 } 3543 off2 := v_0.AuxInt 3544 sym2 := v_0.Aux 3545 ptr := v_0.Args[0] 3546 mem := v.Args[1] 3547 if !(canMergeSym(sym1, sym2)) { 3548 break 3549 } 3550 v.reset(OpARM64MOVBUload) 3551 v.AuxInt = off1 + off2 3552 v.Aux = mergeSym(sym1, sym2) 3553 v.AddArg(ptr) 3554 v.AddArg(mem) 3555 return true 3556 } 3557 // match: (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3558 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3559 // result: (MOVDconst [0]) 3560 for { 3561 off := v.AuxInt 3562 sym := v.Aux 3563 ptr := v.Args[0] 3564 v_1 := v.Args[1] 3565 if v_1.Op != OpARM64MOVBstorezero { 3566 break 3567 } 3568 off2 := v_1.AuxInt 3569 sym2 := v_1.Aux 3570 ptr2 := v_1.Args[0] 3571 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3572 break 3573 } 3574 v.reset(OpARM64MOVDconst) 3575 v.AuxInt = 0 3576 return true 3577 } 3578 return false 3579 } 3580 func rewriteValueARM64_OpARM64MOVBUreg(v *Value, config *Config) bool { 3581 b := v.Block 3582 _ = b 3583 // match: (MOVBUreg x:(MOVBUload _ _)) 3584 // cond: 3585 // result: (MOVDreg x) 3586 for { 3587 x := v.Args[0] 3588 if x.Op != OpARM64MOVBUload { 3589 break 3590 } 3591 v.reset(OpARM64MOVDreg) 3592 v.AddArg(x) 3593 return true 3594 } 3595 // match: (MOVBUreg x:(MOVBUreg _)) 3596 // cond: 3597 // result: (MOVDreg x) 3598 for { 3599 x := v.Args[0] 3600 if x.Op != OpARM64MOVBUreg { 3601 break 3602 } 3603 v.reset(OpARM64MOVDreg) 3604 v.AddArg(x) 3605 return true 3606 } 3607 // match: (MOVBUreg (MOVDconst [c])) 3608 // cond: 3609 // result: (MOVDconst [int64(uint8(c))]) 3610 for { 3611 v_0 := v.Args[0] 3612 if v_0.Op != OpARM64MOVDconst { 3613 break 3614 } 3615 c := v_0.AuxInt 3616 v.reset(OpARM64MOVDconst) 3617 v.AuxInt = int64(uint8(c)) 3618 return true 3619 } 3620 return false 3621 } 3622 func rewriteValueARM64_OpARM64MOVBload(v *Value, config *Config) bool { 3623 b := v.Block 3624 _ = b 3625 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 3626 // cond: 3627 // result: (MOVBload [off1+off2] {sym} ptr mem) 3628 for { 3629 off1 := v.AuxInt 3630 sym := v.Aux 3631 v_0 := v.Args[0] 3632 if v_0.Op != OpARM64ADDconst { 3633 break 3634 } 3635 off2 := v_0.AuxInt 3636 ptr := v_0.Args[0] 3637 mem := v.Args[1] 3638 v.reset(OpARM64MOVBload) 3639 v.AuxInt = off1 + off2 3640 v.Aux = sym 3641 v.AddArg(ptr) 3642 v.AddArg(mem) 3643 return true 3644 } 3645 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3646 // cond: canMergeSym(sym1,sym2) 3647 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3648 for { 3649 off1 := v.AuxInt 3650 sym1 := v.Aux 3651 v_0 := v.Args[0] 3652 if v_0.Op != OpARM64MOVDaddr { 3653 break 3654 } 3655 off2 := v_0.AuxInt 3656 sym2 := v_0.Aux 3657 ptr := v_0.Args[0] 3658 mem := v.Args[1] 3659 if !(canMergeSym(sym1, sym2)) { 3660 break 3661 } 3662 v.reset(OpARM64MOVBload) 3663 v.AuxInt = off1 + off2 3664 v.Aux = mergeSym(sym1, sym2) 3665 v.AddArg(ptr) 3666 v.AddArg(mem) 3667 return true 3668 } 3669 // match: (MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3670 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3671 // result: (MOVDconst [0]) 3672 for { 3673 off := v.AuxInt 3674 sym := v.Aux 3675 ptr := v.Args[0] 3676 v_1 := v.Args[1] 3677 if v_1.Op != OpARM64MOVBstorezero { 3678 break 3679 } 3680 off2 := v_1.AuxInt 3681 sym2 := v_1.Aux 3682 ptr2 := v_1.Args[0] 3683 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3684 break 3685 } 3686 v.reset(OpARM64MOVDconst) 3687 v.AuxInt = 0 3688 return true 3689 } 3690 return false 3691 } 3692 func rewriteValueARM64_OpARM64MOVBreg(v *Value, config *Config) bool { 3693 b := v.Block 3694 _ = b 3695 // match: (MOVBreg x:(MOVBload _ _)) 3696 // cond: 3697 // result: (MOVDreg x) 3698 for { 3699 x := v.Args[0] 3700 if x.Op != OpARM64MOVBload { 3701 break 3702 } 3703 v.reset(OpARM64MOVDreg) 3704 v.AddArg(x) 3705 return true 3706 } 3707 // match: (MOVBreg x:(MOVBreg _)) 3708 // cond: 3709 // result: (MOVDreg x) 3710 for { 3711 x := v.Args[0] 3712 if x.Op != OpARM64MOVBreg { 3713 break 3714 } 3715 v.reset(OpARM64MOVDreg) 3716 v.AddArg(x) 3717 return true 3718 } 3719 // match: (MOVBreg (MOVDconst [c])) 3720 // cond: 3721 // result: (MOVDconst [int64(int8(c))]) 3722 for { 3723 v_0 := v.Args[0] 3724 if v_0.Op != OpARM64MOVDconst { 3725 break 3726 } 3727 c := v_0.AuxInt 3728 v.reset(OpARM64MOVDconst) 3729 v.AuxInt = int64(int8(c)) 3730 return true 3731 } 3732 return false 3733 } 3734 func rewriteValueARM64_OpARM64MOVBstore(v *Value, config *Config) bool { 3735 b := v.Block 3736 _ = b 3737 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 3738 // cond: 3739 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3740 for { 3741 off1 := v.AuxInt 3742 sym := v.Aux 3743 v_0 := v.Args[0] 3744 if v_0.Op != OpARM64ADDconst { 3745 break 3746 } 3747 off2 := v_0.AuxInt 3748 ptr := v_0.Args[0] 3749 val := v.Args[1] 3750 mem := v.Args[2] 3751 v.reset(OpARM64MOVBstore) 3752 v.AuxInt = off1 + off2 3753 v.Aux = sym 3754 v.AddArg(ptr) 3755 v.AddArg(val) 3756 v.AddArg(mem) 3757 return true 3758 } 3759 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 3760 // cond: canMergeSym(sym1,sym2) 3761 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 3762 for { 3763 off1 := v.AuxInt 3764 sym1 := v.Aux 3765 v_0 := v.Args[0] 3766 if v_0.Op != OpARM64MOVDaddr { 3767 break 3768 } 3769 off2 := v_0.AuxInt 3770 sym2 := v_0.Aux 3771 ptr := v_0.Args[0] 3772 val := v.Args[1] 3773 mem := v.Args[2] 3774 if !(canMergeSym(sym1, sym2)) { 3775 break 3776 } 3777 v.reset(OpARM64MOVBstore) 3778 v.AuxInt = off1 + off2 3779 v.Aux = mergeSym(sym1, sym2) 3780 v.AddArg(ptr) 3781 v.AddArg(val) 3782 v.AddArg(mem) 3783 return true 3784 } 3785 // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) 3786 // cond: 3787 // result: (MOVBstorezero [off] {sym} ptr mem) 3788 for { 3789 off := v.AuxInt 3790 sym := v.Aux 3791 ptr := v.Args[0] 3792 v_1 := v.Args[1] 3793 if v_1.Op != OpARM64MOVDconst { 3794 break 3795 } 3796 if v_1.AuxInt != 0 { 3797 break 3798 } 3799 mem := v.Args[2] 3800 v.reset(OpARM64MOVBstorezero) 3801 v.AuxInt = off 3802 v.Aux = sym 3803 v.AddArg(ptr) 3804 v.AddArg(mem) 3805 return true 3806 } 3807 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 3808 // cond: 3809 // result: (MOVBstore [off] {sym} ptr x mem) 3810 for { 3811 off := v.AuxInt 3812 sym := v.Aux 3813 ptr := v.Args[0] 3814 v_1 := v.Args[1] 3815 if v_1.Op != OpARM64MOVBreg { 3816 break 3817 } 3818 x := v_1.Args[0] 3819 mem := v.Args[2] 3820 v.reset(OpARM64MOVBstore) 3821 v.AuxInt = off 3822 v.Aux = sym 3823 v.AddArg(ptr) 3824 v.AddArg(x) 3825 v.AddArg(mem) 3826 return true 3827 } 3828 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 3829 // cond: 3830 // result: (MOVBstore [off] {sym} ptr x mem) 3831 for { 3832 off := v.AuxInt 3833 sym := v.Aux 3834 ptr := v.Args[0] 3835 v_1 := v.Args[1] 3836 if v_1.Op != OpARM64MOVBUreg { 3837 break 3838 } 3839 x := v_1.Args[0] 3840 mem := v.Args[2] 3841 v.reset(OpARM64MOVBstore) 3842 v.AuxInt = off 3843 v.Aux = sym 3844 v.AddArg(ptr) 3845 v.AddArg(x) 3846 v.AddArg(mem) 3847 return true 3848 } 3849 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 3850 // cond: 3851 // result: (MOVBstore [off] {sym} ptr x mem) 3852 for { 3853 off := v.AuxInt 3854 sym := v.Aux 3855 ptr := v.Args[0] 3856 v_1 := v.Args[1] 3857 if v_1.Op != OpARM64MOVHreg { 3858 break 3859 } 3860 x := v_1.Args[0] 3861 mem := v.Args[2] 3862 v.reset(OpARM64MOVBstore) 3863 v.AuxInt = off 3864 v.Aux = sym 3865 v.AddArg(ptr) 3866 v.AddArg(x) 3867 v.AddArg(mem) 3868 return true 3869 } 3870 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 3871 // cond: 3872 // result: (MOVBstore [off] {sym} ptr x mem) 3873 for { 3874 off := v.AuxInt 3875 sym := v.Aux 3876 ptr := v.Args[0] 3877 v_1 := v.Args[1] 3878 if v_1.Op != OpARM64MOVHUreg { 3879 break 3880 } 3881 x := v_1.Args[0] 3882 mem := v.Args[2] 3883 v.reset(OpARM64MOVBstore) 3884 v.AuxInt = off 3885 v.Aux = sym 3886 v.AddArg(ptr) 3887 v.AddArg(x) 3888 v.AddArg(mem) 3889 return true 3890 } 3891 // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) 3892 // cond: 3893 // result: (MOVBstore [off] {sym} ptr x mem) 3894 for { 3895 off := v.AuxInt 3896 sym := v.Aux 3897 ptr := v.Args[0] 3898 v_1 := v.Args[1] 3899 if v_1.Op != OpARM64MOVWreg { 3900 break 3901 } 3902 x := v_1.Args[0] 3903 mem := v.Args[2] 3904 v.reset(OpARM64MOVBstore) 3905 v.AuxInt = off 3906 v.Aux = sym 3907 v.AddArg(ptr) 3908 v.AddArg(x) 3909 v.AddArg(mem) 3910 return true 3911 } 3912 // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) 3913 // cond: 3914 // result: (MOVBstore [off] {sym} ptr x mem) 3915 for { 3916 off := v.AuxInt 3917 sym := v.Aux 3918 ptr := v.Args[0] 3919 v_1 := v.Args[1] 3920 if v_1.Op != OpARM64MOVWUreg { 3921 break 3922 } 3923 x := v_1.Args[0] 3924 mem := v.Args[2] 3925 v.reset(OpARM64MOVBstore) 3926 v.AuxInt = off 3927 v.Aux = sym 3928 v.AddArg(ptr) 3929 v.AddArg(x) 3930 v.AddArg(mem) 3931 return true 3932 } 3933 return false 3934 } 3935 func rewriteValueARM64_OpARM64MOVBstorezero(v *Value, config *Config) bool { 3936 b := v.Block 3937 _ = b 3938 // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 3939 // cond: 3940 // result: (MOVBstorezero [off1+off2] {sym} ptr mem) 3941 for { 3942 off1 := v.AuxInt 3943 sym := v.Aux 3944 v_0 := v.Args[0] 3945 if v_0.Op != OpARM64ADDconst { 3946 break 3947 } 3948 off2 := v_0.AuxInt 3949 ptr := v_0.Args[0] 3950 mem := v.Args[1] 3951 v.reset(OpARM64MOVBstorezero) 3952 v.AuxInt = off1 + off2 3953 v.Aux = sym 3954 v.AddArg(ptr) 3955 v.AddArg(mem) 3956 return true 3957 } 3958 // match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3959 // cond: canMergeSym(sym1,sym2) 3960 // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3961 for { 3962 off1 := v.AuxInt 3963 sym1 := v.Aux 3964 v_0 := v.Args[0] 3965 if v_0.Op != OpARM64MOVDaddr { 3966 break 3967 } 3968 off2 := v_0.AuxInt 3969 sym2 := v_0.Aux 3970 ptr := v_0.Args[0] 3971 mem := v.Args[1] 3972 if !(canMergeSym(sym1, sym2)) { 3973 break 3974 } 3975 v.reset(OpARM64MOVBstorezero) 3976 v.AuxInt = off1 + off2 3977 v.Aux = mergeSym(sym1, sym2) 3978 v.AddArg(ptr) 3979 v.AddArg(mem) 3980 return true 3981 } 3982 return false 3983 } 3984 func rewriteValueARM64_OpARM64MOVDload(v *Value, config *Config) bool { 3985 b := v.Block 3986 _ = b 3987 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 3988 // cond: (off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 3989 // result: (MOVDload [off1+off2] {sym} ptr mem) 3990 for { 3991 off1 := v.AuxInt 3992 sym := v.Aux 3993 v_0 := v.Args[0] 3994 if v_0.Op != OpARM64ADDconst { 3995 break 3996 } 3997 off2 := v_0.AuxInt 3998 ptr := v_0.Args[0] 3999 mem := v.Args[1] 4000 if !((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4001 break 4002 } 4003 v.reset(OpARM64MOVDload) 4004 v.AuxInt = off1 + off2 4005 v.Aux = sym 4006 v.AddArg(ptr) 4007 v.AddArg(mem) 4008 return true 4009 } 4010 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4011 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4012 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4013 for { 4014 off1 := v.AuxInt 4015 sym1 := v.Aux 4016 v_0 := v.Args[0] 4017 if v_0.Op != OpARM64MOVDaddr { 4018 break 4019 } 4020 off2 := v_0.AuxInt 4021 sym2 := v_0.Aux 4022 ptr := v_0.Args[0] 4023 mem := v.Args[1] 4024 if !(canMergeSym(sym1, sym2) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4025 break 4026 } 4027 v.reset(OpARM64MOVDload) 4028 v.AuxInt = off1 + off2 4029 v.Aux = mergeSym(sym1, sym2) 4030 v.AddArg(ptr) 4031 v.AddArg(mem) 4032 return true 4033 } 4034 // match: (MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) 4035 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4036 // result: (MOVDconst [0]) 4037 for { 4038 off := v.AuxInt 4039 sym := v.Aux 4040 ptr := v.Args[0] 4041 v_1 := v.Args[1] 4042 if v_1.Op != OpARM64MOVDstorezero { 4043 break 4044 } 4045 off2 := v_1.AuxInt 4046 sym2 := v_1.Aux 4047 ptr2 := v_1.Args[0] 4048 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4049 break 4050 } 4051 v.reset(OpARM64MOVDconst) 4052 v.AuxInt = 0 4053 return true 4054 } 4055 return false 4056 } 4057 func rewriteValueARM64_OpARM64MOVDreg(v *Value, config *Config) bool { 4058 b := v.Block 4059 _ = b 4060 // match: (MOVDreg x) 4061 // cond: x.Uses == 1 4062 // result: (MOVDnop x) 4063 for { 4064 x := v.Args[0] 4065 if !(x.Uses == 1) { 4066 break 4067 } 4068 v.reset(OpARM64MOVDnop) 4069 v.AddArg(x) 4070 return true 4071 } 4072 // match: (MOVDreg (MOVDconst [c])) 4073 // cond: 4074 // result: (MOVDconst [c]) 4075 for { 4076 v_0 := v.Args[0] 4077 if v_0.Op != OpARM64MOVDconst { 4078 break 4079 } 4080 c := v_0.AuxInt 4081 v.reset(OpARM64MOVDconst) 4082 v.AuxInt = c 4083 return true 4084 } 4085 return false 4086 } 4087 func rewriteValueARM64_OpARM64MOVDstore(v *Value, config *Config) bool { 4088 b := v.Block 4089 _ = b 4090 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4091 // cond: (off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4092 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 4093 for { 4094 off1 := v.AuxInt 4095 sym := v.Aux 4096 v_0 := v.Args[0] 4097 if v_0.Op != OpARM64ADDconst { 4098 break 4099 } 4100 off2 := v_0.AuxInt 4101 ptr := v_0.Args[0] 4102 val := v.Args[1] 4103 mem := v.Args[2] 4104 if !((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4105 break 4106 } 4107 v.reset(OpARM64MOVDstore) 4108 v.AuxInt = off1 + off2 4109 v.Aux = sym 4110 v.AddArg(ptr) 4111 v.AddArg(val) 4112 v.AddArg(mem) 4113 return true 4114 } 4115 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4116 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4117 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4118 for { 4119 off1 := v.AuxInt 4120 sym1 := v.Aux 4121 v_0 := v.Args[0] 4122 if v_0.Op != OpARM64MOVDaddr { 4123 break 4124 } 4125 off2 := v_0.AuxInt 4126 sym2 := v_0.Aux 4127 ptr := v_0.Args[0] 4128 val := v.Args[1] 4129 mem := v.Args[2] 4130 if !(canMergeSym(sym1, sym2) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4131 break 4132 } 4133 v.reset(OpARM64MOVDstore) 4134 v.AuxInt = off1 + off2 4135 v.Aux = mergeSym(sym1, sym2) 4136 v.AddArg(ptr) 4137 v.AddArg(val) 4138 v.AddArg(mem) 4139 return true 4140 } 4141 // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) 4142 // cond: 4143 // result: (MOVDstorezero [off] {sym} ptr mem) 4144 for { 4145 off := v.AuxInt 4146 sym := v.Aux 4147 ptr := v.Args[0] 4148 v_1 := v.Args[1] 4149 if v_1.Op != OpARM64MOVDconst { 4150 break 4151 } 4152 if v_1.AuxInt != 0 { 4153 break 4154 } 4155 mem := v.Args[2] 4156 v.reset(OpARM64MOVDstorezero) 4157 v.AuxInt = off 4158 v.Aux = sym 4159 v.AddArg(ptr) 4160 v.AddArg(mem) 4161 return true 4162 } 4163 return false 4164 } 4165 func rewriteValueARM64_OpARM64MOVDstorezero(v *Value, config *Config) bool { 4166 b := v.Block 4167 _ = b 4168 // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4169 // cond: (off1+off2)%2==8 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4170 // result: (MOVDstorezero [off1+off2] {sym} ptr mem) 4171 for { 4172 off1 := v.AuxInt 4173 sym := v.Aux 4174 v_0 := v.Args[0] 4175 if v_0.Op != OpARM64ADDconst { 4176 break 4177 } 4178 off2 := v_0.AuxInt 4179 ptr := v_0.Args[0] 4180 mem := v.Args[1] 4181 if !((off1+off2)%2 == 8 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4182 break 4183 } 4184 v.reset(OpARM64MOVDstorezero) 4185 v.AuxInt = off1 + off2 4186 v.Aux = sym 4187 v.AddArg(ptr) 4188 v.AddArg(mem) 4189 return true 4190 } 4191 // match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4192 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4193 // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4194 for { 4195 off1 := v.AuxInt 4196 sym1 := v.Aux 4197 v_0 := v.Args[0] 4198 if v_0.Op != OpARM64MOVDaddr { 4199 break 4200 } 4201 off2 := v_0.AuxInt 4202 sym2 := v_0.Aux 4203 ptr := v_0.Args[0] 4204 mem := v.Args[1] 4205 if !(canMergeSym(sym1, sym2) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4206 break 4207 } 4208 v.reset(OpARM64MOVDstorezero) 4209 v.AuxInt = off1 + off2 4210 v.Aux = mergeSym(sym1, sym2) 4211 v.AddArg(ptr) 4212 v.AddArg(mem) 4213 return true 4214 } 4215 return false 4216 } 4217 func rewriteValueARM64_OpARM64MOVHUload(v *Value, config *Config) bool { 4218 b := v.Block 4219 _ = b 4220 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 4221 // cond: (off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4222 // result: (MOVHUload [off1+off2] {sym} ptr mem) 4223 for { 4224 off1 := v.AuxInt 4225 sym := v.Aux 4226 v_0 := v.Args[0] 4227 if v_0.Op != OpARM64ADDconst { 4228 break 4229 } 4230 off2 := v_0.AuxInt 4231 ptr := v_0.Args[0] 4232 mem := v.Args[1] 4233 if !((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4234 break 4235 } 4236 v.reset(OpARM64MOVHUload) 4237 v.AuxInt = off1 + off2 4238 v.Aux = sym 4239 v.AddArg(ptr) 4240 v.AddArg(mem) 4241 return true 4242 } 4243 // match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4244 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4245 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4246 for { 4247 off1 := v.AuxInt 4248 sym1 := v.Aux 4249 v_0 := v.Args[0] 4250 if v_0.Op != OpARM64MOVDaddr { 4251 break 4252 } 4253 off2 := v_0.AuxInt 4254 sym2 := v_0.Aux 4255 ptr := v_0.Args[0] 4256 mem := v.Args[1] 4257 if !(canMergeSym(sym1, sym2) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4258 break 4259 } 4260 v.reset(OpARM64MOVHUload) 4261 v.AuxInt = off1 + off2 4262 v.Aux = mergeSym(sym1, sym2) 4263 v.AddArg(ptr) 4264 v.AddArg(mem) 4265 return true 4266 } 4267 // match: (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4268 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4269 // result: (MOVDconst [0]) 4270 for { 4271 off := v.AuxInt 4272 sym := v.Aux 4273 ptr := v.Args[0] 4274 v_1 := v.Args[1] 4275 if v_1.Op != OpARM64MOVHstorezero { 4276 break 4277 } 4278 off2 := v_1.AuxInt 4279 sym2 := v_1.Aux 4280 ptr2 := v_1.Args[0] 4281 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4282 break 4283 } 4284 v.reset(OpARM64MOVDconst) 4285 v.AuxInt = 0 4286 return true 4287 } 4288 return false 4289 } 4290 func rewriteValueARM64_OpARM64MOVHUreg(v *Value, config *Config) bool { 4291 b := v.Block 4292 _ = b 4293 // match: (MOVHUreg x:(MOVBUload _ _)) 4294 // cond: 4295 // result: (MOVDreg x) 4296 for { 4297 x := v.Args[0] 4298 if x.Op != OpARM64MOVBUload { 4299 break 4300 } 4301 v.reset(OpARM64MOVDreg) 4302 v.AddArg(x) 4303 return true 4304 } 4305 // match: (MOVHUreg x:(MOVHUload _ _)) 4306 // cond: 4307 // result: (MOVDreg x) 4308 for { 4309 x := v.Args[0] 4310 if x.Op != OpARM64MOVHUload { 4311 break 4312 } 4313 v.reset(OpARM64MOVDreg) 4314 v.AddArg(x) 4315 return true 4316 } 4317 // match: (MOVHUreg x:(MOVBUreg _)) 4318 // cond: 4319 // result: (MOVDreg x) 4320 for { 4321 x := v.Args[0] 4322 if x.Op != OpARM64MOVBUreg { 4323 break 4324 } 4325 v.reset(OpARM64MOVDreg) 4326 v.AddArg(x) 4327 return true 4328 } 4329 // match: (MOVHUreg x:(MOVHUreg _)) 4330 // cond: 4331 // result: (MOVDreg x) 4332 for { 4333 x := v.Args[0] 4334 if x.Op != OpARM64MOVHUreg { 4335 break 4336 } 4337 v.reset(OpARM64MOVDreg) 4338 v.AddArg(x) 4339 return true 4340 } 4341 // match: (MOVHUreg (MOVDconst [c])) 4342 // cond: 4343 // result: (MOVDconst [int64(uint16(c))]) 4344 for { 4345 v_0 := v.Args[0] 4346 if v_0.Op != OpARM64MOVDconst { 4347 break 4348 } 4349 c := v_0.AuxInt 4350 v.reset(OpARM64MOVDconst) 4351 v.AuxInt = int64(uint16(c)) 4352 return true 4353 } 4354 return false 4355 } 4356 func rewriteValueARM64_OpARM64MOVHload(v *Value, config *Config) bool { 4357 b := v.Block 4358 _ = b 4359 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 4360 // cond: (off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4361 // result: (MOVHload [off1+off2] {sym} ptr mem) 4362 for { 4363 off1 := v.AuxInt 4364 sym := v.Aux 4365 v_0 := v.Args[0] 4366 if v_0.Op != OpARM64ADDconst { 4367 break 4368 } 4369 off2 := v_0.AuxInt 4370 ptr := v_0.Args[0] 4371 mem := v.Args[1] 4372 if !((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4373 break 4374 } 4375 v.reset(OpARM64MOVHload) 4376 v.AuxInt = off1 + off2 4377 v.Aux = sym 4378 v.AddArg(ptr) 4379 v.AddArg(mem) 4380 return true 4381 } 4382 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4383 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4384 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4385 for { 4386 off1 := v.AuxInt 4387 sym1 := v.Aux 4388 v_0 := v.Args[0] 4389 if v_0.Op != OpARM64MOVDaddr { 4390 break 4391 } 4392 off2 := v_0.AuxInt 4393 sym2 := v_0.Aux 4394 ptr := v_0.Args[0] 4395 mem := v.Args[1] 4396 if !(canMergeSym(sym1, sym2) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4397 break 4398 } 4399 v.reset(OpARM64MOVHload) 4400 v.AuxInt = off1 + off2 4401 v.Aux = mergeSym(sym1, sym2) 4402 v.AddArg(ptr) 4403 v.AddArg(mem) 4404 return true 4405 } 4406 // match: (MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4407 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4408 // result: (MOVDconst [0]) 4409 for { 4410 off := v.AuxInt 4411 sym := v.Aux 4412 ptr := v.Args[0] 4413 v_1 := v.Args[1] 4414 if v_1.Op != OpARM64MOVHstorezero { 4415 break 4416 } 4417 off2 := v_1.AuxInt 4418 sym2 := v_1.Aux 4419 ptr2 := v_1.Args[0] 4420 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4421 break 4422 } 4423 v.reset(OpARM64MOVDconst) 4424 v.AuxInt = 0 4425 return true 4426 } 4427 return false 4428 } 4429 func rewriteValueARM64_OpARM64MOVHreg(v *Value, config *Config) bool { 4430 b := v.Block 4431 _ = b 4432 // match: (MOVHreg x:(MOVBload _ _)) 4433 // cond: 4434 // result: (MOVDreg x) 4435 for { 4436 x := v.Args[0] 4437 if x.Op != OpARM64MOVBload { 4438 break 4439 } 4440 v.reset(OpARM64MOVDreg) 4441 v.AddArg(x) 4442 return true 4443 } 4444 // match: (MOVHreg x:(MOVBUload _ _)) 4445 // cond: 4446 // result: (MOVDreg x) 4447 for { 4448 x := v.Args[0] 4449 if x.Op != OpARM64MOVBUload { 4450 break 4451 } 4452 v.reset(OpARM64MOVDreg) 4453 v.AddArg(x) 4454 return true 4455 } 4456 // match: (MOVHreg x:(MOVHload _ _)) 4457 // cond: 4458 // result: (MOVDreg x) 4459 for { 4460 x := v.Args[0] 4461 if x.Op != OpARM64MOVHload { 4462 break 4463 } 4464 v.reset(OpARM64MOVDreg) 4465 v.AddArg(x) 4466 return true 4467 } 4468 // match: (MOVHreg x:(MOVBreg _)) 4469 // cond: 4470 // result: (MOVDreg x) 4471 for { 4472 x := v.Args[0] 4473 if x.Op != OpARM64MOVBreg { 4474 break 4475 } 4476 v.reset(OpARM64MOVDreg) 4477 v.AddArg(x) 4478 return true 4479 } 4480 // match: (MOVHreg x:(MOVBUreg _)) 4481 // cond: 4482 // result: (MOVDreg x) 4483 for { 4484 x := v.Args[0] 4485 if x.Op != OpARM64MOVBUreg { 4486 break 4487 } 4488 v.reset(OpARM64MOVDreg) 4489 v.AddArg(x) 4490 return true 4491 } 4492 // match: (MOVHreg x:(MOVHreg _)) 4493 // cond: 4494 // result: (MOVDreg x) 4495 for { 4496 x := v.Args[0] 4497 if x.Op != OpARM64MOVHreg { 4498 break 4499 } 4500 v.reset(OpARM64MOVDreg) 4501 v.AddArg(x) 4502 return true 4503 } 4504 // match: (MOVHreg (MOVDconst [c])) 4505 // cond: 4506 // result: (MOVDconst [int64(int16(c))]) 4507 for { 4508 v_0 := v.Args[0] 4509 if v_0.Op != OpARM64MOVDconst { 4510 break 4511 } 4512 c := v_0.AuxInt 4513 v.reset(OpARM64MOVDconst) 4514 v.AuxInt = int64(int16(c)) 4515 return true 4516 } 4517 return false 4518 } 4519 func rewriteValueARM64_OpARM64MOVHstore(v *Value, config *Config) bool { 4520 b := v.Block 4521 _ = b 4522 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4523 // cond: (off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4524 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 4525 for { 4526 off1 := v.AuxInt 4527 sym := v.Aux 4528 v_0 := v.Args[0] 4529 if v_0.Op != OpARM64ADDconst { 4530 break 4531 } 4532 off2 := v_0.AuxInt 4533 ptr := v_0.Args[0] 4534 val := v.Args[1] 4535 mem := v.Args[2] 4536 if !((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4537 break 4538 } 4539 v.reset(OpARM64MOVHstore) 4540 v.AuxInt = off1 + off2 4541 v.Aux = sym 4542 v.AddArg(ptr) 4543 v.AddArg(val) 4544 v.AddArg(mem) 4545 return true 4546 } 4547 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4548 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4549 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4550 for { 4551 off1 := v.AuxInt 4552 sym1 := v.Aux 4553 v_0 := v.Args[0] 4554 if v_0.Op != OpARM64MOVDaddr { 4555 break 4556 } 4557 off2 := v_0.AuxInt 4558 sym2 := v_0.Aux 4559 ptr := v_0.Args[0] 4560 val := v.Args[1] 4561 mem := v.Args[2] 4562 if !(canMergeSym(sym1, sym2) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4563 break 4564 } 4565 v.reset(OpARM64MOVHstore) 4566 v.AuxInt = off1 + off2 4567 v.Aux = mergeSym(sym1, sym2) 4568 v.AddArg(ptr) 4569 v.AddArg(val) 4570 v.AddArg(mem) 4571 return true 4572 } 4573 // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) 4574 // cond: 4575 // result: (MOVHstorezero [off] {sym} ptr mem) 4576 for { 4577 off := v.AuxInt 4578 sym := v.Aux 4579 ptr := v.Args[0] 4580 v_1 := v.Args[1] 4581 if v_1.Op != OpARM64MOVDconst { 4582 break 4583 } 4584 if v_1.AuxInt != 0 { 4585 break 4586 } 4587 mem := v.Args[2] 4588 v.reset(OpARM64MOVHstorezero) 4589 v.AuxInt = off 4590 v.Aux = sym 4591 v.AddArg(ptr) 4592 v.AddArg(mem) 4593 return true 4594 } 4595 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 4596 // cond: 4597 // result: (MOVHstore [off] {sym} ptr x mem) 4598 for { 4599 off := v.AuxInt 4600 sym := v.Aux 4601 ptr := v.Args[0] 4602 v_1 := v.Args[1] 4603 if v_1.Op != OpARM64MOVHreg { 4604 break 4605 } 4606 x := v_1.Args[0] 4607 mem := v.Args[2] 4608 v.reset(OpARM64MOVHstore) 4609 v.AuxInt = off 4610 v.Aux = sym 4611 v.AddArg(ptr) 4612 v.AddArg(x) 4613 v.AddArg(mem) 4614 return true 4615 } 4616 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 4617 // cond: 4618 // result: (MOVHstore [off] {sym} ptr x mem) 4619 for { 4620 off := v.AuxInt 4621 sym := v.Aux 4622 ptr := v.Args[0] 4623 v_1 := v.Args[1] 4624 if v_1.Op != OpARM64MOVHUreg { 4625 break 4626 } 4627 x := v_1.Args[0] 4628 mem := v.Args[2] 4629 v.reset(OpARM64MOVHstore) 4630 v.AuxInt = off 4631 v.Aux = sym 4632 v.AddArg(ptr) 4633 v.AddArg(x) 4634 v.AddArg(mem) 4635 return true 4636 } 4637 // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) 4638 // cond: 4639 // result: (MOVHstore [off] {sym} ptr x mem) 4640 for { 4641 off := v.AuxInt 4642 sym := v.Aux 4643 ptr := v.Args[0] 4644 v_1 := v.Args[1] 4645 if v_1.Op != OpARM64MOVWreg { 4646 break 4647 } 4648 x := v_1.Args[0] 4649 mem := v.Args[2] 4650 v.reset(OpARM64MOVHstore) 4651 v.AuxInt = off 4652 v.Aux = sym 4653 v.AddArg(ptr) 4654 v.AddArg(x) 4655 v.AddArg(mem) 4656 return true 4657 } 4658 // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) 4659 // cond: 4660 // result: (MOVHstore [off] {sym} ptr x mem) 4661 for { 4662 off := v.AuxInt 4663 sym := v.Aux 4664 ptr := v.Args[0] 4665 v_1 := v.Args[1] 4666 if v_1.Op != OpARM64MOVWUreg { 4667 break 4668 } 4669 x := v_1.Args[0] 4670 mem := v.Args[2] 4671 v.reset(OpARM64MOVHstore) 4672 v.AuxInt = off 4673 v.Aux = sym 4674 v.AddArg(ptr) 4675 v.AddArg(x) 4676 v.AddArg(mem) 4677 return true 4678 } 4679 return false 4680 } 4681 func rewriteValueARM64_OpARM64MOVHstorezero(v *Value, config *Config) bool { 4682 b := v.Block 4683 _ = b 4684 // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4685 // cond: (off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4686 // result: (MOVHstorezero [off1+off2] {sym} ptr mem) 4687 for { 4688 off1 := v.AuxInt 4689 sym := v.Aux 4690 v_0 := v.Args[0] 4691 if v_0.Op != OpARM64ADDconst { 4692 break 4693 } 4694 off2 := v_0.AuxInt 4695 ptr := v_0.Args[0] 4696 mem := v.Args[1] 4697 if !((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4698 break 4699 } 4700 v.reset(OpARM64MOVHstorezero) 4701 v.AuxInt = off1 + off2 4702 v.Aux = sym 4703 v.AddArg(ptr) 4704 v.AddArg(mem) 4705 return true 4706 } 4707 // match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4708 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4709 // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4710 for { 4711 off1 := v.AuxInt 4712 sym1 := v.Aux 4713 v_0 := v.Args[0] 4714 if v_0.Op != OpARM64MOVDaddr { 4715 break 4716 } 4717 off2 := v_0.AuxInt 4718 sym2 := v_0.Aux 4719 ptr := v_0.Args[0] 4720 mem := v.Args[1] 4721 if !(canMergeSym(sym1, sym2) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4722 break 4723 } 4724 v.reset(OpARM64MOVHstorezero) 4725 v.AuxInt = off1 + off2 4726 v.Aux = mergeSym(sym1, sym2) 4727 v.AddArg(ptr) 4728 v.AddArg(mem) 4729 return true 4730 } 4731 return false 4732 } 4733 func rewriteValueARM64_OpARM64MOVWUload(v *Value, config *Config) bool { 4734 b := v.Block 4735 _ = b 4736 // match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) 4737 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4738 // result: (MOVWUload [off1+off2] {sym} ptr mem) 4739 for { 4740 off1 := v.AuxInt 4741 sym := v.Aux 4742 v_0 := v.Args[0] 4743 if v_0.Op != OpARM64ADDconst { 4744 break 4745 } 4746 off2 := v_0.AuxInt 4747 ptr := v_0.Args[0] 4748 mem := v.Args[1] 4749 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4750 break 4751 } 4752 v.reset(OpARM64MOVWUload) 4753 v.AuxInt = off1 + off2 4754 v.Aux = sym 4755 v.AddArg(ptr) 4756 v.AddArg(mem) 4757 return true 4758 } 4759 // match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4760 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4761 // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4762 for { 4763 off1 := v.AuxInt 4764 sym1 := v.Aux 4765 v_0 := v.Args[0] 4766 if v_0.Op != OpARM64MOVDaddr { 4767 break 4768 } 4769 off2 := v_0.AuxInt 4770 sym2 := v_0.Aux 4771 ptr := v_0.Args[0] 4772 mem := v.Args[1] 4773 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4774 break 4775 } 4776 v.reset(OpARM64MOVWUload) 4777 v.AuxInt = off1 + off2 4778 v.Aux = mergeSym(sym1, sym2) 4779 v.AddArg(ptr) 4780 v.AddArg(mem) 4781 return true 4782 } 4783 // match: (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4784 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4785 // result: (MOVDconst [0]) 4786 for { 4787 off := v.AuxInt 4788 sym := v.Aux 4789 ptr := v.Args[0] 4790 v_1 := v.Args[1] 4791 if v_1.Op != OpARM64MOVWstorezero { 4792 break 4793 } 4794 off2 := v_1.AuxInt 4795 sym2 := v_1.Aux 4796 ptr2 := v_1.Args[0] 4797 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4798 break 4799 } 4800 v.reset(OpARM64MOVDconst) 4801 v.AuxInt = 0 4802 return true 4803 } 4804 return false 4805 } 4806 func rewriteValueARM64_OpARM64MOVWUreg(v *Value, config *Config) bool { 4807 b := v.Block 4808 _ = b 4809 // match: (MOVWUreg x:(MOVBUload _ _)) 4810 // cond: 4811 // result: (MOVDreg x) 4812 for { 4813 x := v.Args[0] 4814 if x.Op != OpARM64MOVBUload { 4815 break 4816 } 4817 v.reset(OpARM64MOVDreg) 4818 v.AddArg(x) 4819 return true 4820 } 4821 // match: (MOVWUreg x:(MOVHUload _ _)) 4822 // cond: 4823 // result: (MOVDreg x) 4824 for { 4825 x := v.Args[0] 4826 if x.Op != OpARM64MOVHUload { 4827 break 4828 } 4829 v.reset(OpARM64MOVDreg) 4830 v.AddArg(x) 4831 return true 4832 } 4833 // match: (MOVWUreg x:(MOVWUload _ _)) 4834 // cond: 4835 // result: (MOVDreg x) 4836 for { 4837 x := v.Args[0] 4838 if x.Op != OpARM64MOVWUload { 4839 break 4840 } 4841 v.reset(OpARM64MOVDreg) 4842 v.AddArg(x) 4843 return true 4844 } 4845 // match: (MOVWUreg x:(MOVBUreg _)) 4846 // cond: 4847 // result: (MOVDreg x) 4848 for { 4849 x := v.Args[0] 4850 if x.Op != OpARM64MOVBUreg { 4851 break 4852 } 4853 v.reset(OpARM64MOVDreg) 4854 v.AddArg(x) 4855 return true 4856 } 4857 // match: (MOVWUreg x:(MOVHUreg _)) 4858 // cond: 4859 // result: (MOVDreg x) 4860 for { 4861 x := v.Args[0] 4862 if x.Op != OpARM64MOVHUreg { 4863 break 4864 } 4865 v.reset(OpARM64MOVDreg) 4866 v.AddArg(x) 4867 return true 4868 } 4869 // match: (MOVWUreg x:(MOVWUreg _)) 4870 // cond: 4871 // result: (MOVDreg x) 4872 for { 4873 x := v.Args[0] 4874 if x.Op != OpARM64MOVWUreg { 4875 break 4876 } 4877 v.reset(OpARM64MOVDreg) 4878 v.AddArg(x) 4879 return true 4880 } 4881 // match: (MOVWUreg (MOVDconst [c])) 4882 // cond: 4883 // result: (MOVDconst [int64(uint32(c))]) 4884 for { 4885 v_0 := v.Args[0] 4886 if v_0.Op != OpARM64MOVDconst { 4887 break 4888 } 4889 c := v_0.AuxInt 4890 v.reset(OpARM64MOVDconst) 4891 v.AuxInt = int64(uint32(c)) 4892 return true 4893 } 4894 return false 4895 } 4896 func rewriteValueARM64_OpARM64MOVWload(v *Value, config *Config) bool { 4897 b := v.Block 4898 _ = b 4899 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 4900 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 4901 // result: (MOVWload [off1+off2] {sym} ptr mem) 4902 for { 4903 off1 := v.AuxInt 4904 sym := v.Aux 4905 v_0 := v.Args[0] 4906 if v_0.Op != OpARM64ADDconst { 4907 break 4908 } 4909 off2 := v_0.AuxInt 4910 ptr := v_0.Args[0] 4911 mem := v.Args[1] 4912 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 4913 break 4914 } 4915 v.reset(OpARM64MOVWload) 4916 v.AuxInt = off1 + off2 4917 v.Aux = sym 4918 v.AddArg(ptr) 4919 v.AddArg(mem) 4920 return true 4921 } 4922 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4923 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 4924 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4925 for { 4926 off1 := v.AuxInt 4927 sym1 := v.Aux 4928 v_0 := v.Args[0] 4929 if v_0.Op != OpARM64MOVDaddr { 4930 break 4931 } 4932 off2 := v_0.AuxInt 4933 sym2 := v_0.Aux 4934 ptr := v_0.Args[0] 4935 mem := v.Args[1] 4936 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 4937 break 4938 } 4939 v.reset(OpARM64MOVWload) 4940 v.AuxInt = off1 + off2 4941 v.Aux = mergeSym(sym1, sym2) 4942 v.AddArg(ptr) 4943 v.AddArg(mem) 4944 return true 4945 } 4946 // match: (MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4947 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4948 // result: (MOVDconst [0]) 4949 for { 4950 off := v.AuxInt 4951 sym := v.Aux 4952 ptr := v.Args[0] 4953 v_1 := v.Args[1] 4954 if v_1.Op != OpARM64MOVWstorezero { 4955 break 4956 } 4957 off2 := v_1.AuxInt 4958 sym2 := v_1.Aux 4959 ptr2 := v_1.Args[0] 4960 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4961 break 4962 } 4963 v.reset(OpARM64MOVDconst) 4964 v.AuxInt = 0 4965 return true 4966 } 4967 return false 4968 } 4969 func rewriteValueARM64_OpARM64MOVWreg(v *Value, config *Config) bool { 4970 b := v.Block 4971 _ = b 4972 // match: (MOVWreg x:(MOVBload _ _)) 4973 // cond: 4974 // result: (MOVDreg x) 4975 for { 4976 x := v.Args[0] 4977 if x.Op != OpARM64MOVBload { 4978 break 4979 } 4980 v.reset(OpARM64MOVDreg) 4981 v.AddArg(x) 4982 return true 4983 } 4984 // match: (MOVWreg x:(MOVBUload _ _)) 4985 // cond: 4986 // result: (MOVDreg x) 4987 for { 4988 x := v.Args[0] 4989 if x.Op != OpARM64MOVBUload { 4990 break 4991 } 4992 v.reset(OpARM64MOVDreg) 4993 v.AddArg(x) 4994 return true 4995 } 4996 // match: (MOVWreg x:(MOVHload _ _)) 4997 // cond: 4998 // result: (MOVDreg x) 4999 for { 5000 x := v.Args[0] 5001 if x.Op != OpARM64MOVHload { 5002 break 5003 } 5004 v.reset(OpARM64MOVDreg) 5005 v.AddArg(x) 5006 return true 5007 } 5008 // match: (MOVWreg x:(MOVHUload _ _)) 5009 // cond: 5010 // result: (MOVDreg x) 5011 for { 5012 x := v.Args[0] 5013 if x.Op != OpARM64MOVHUload { 5014 break 5015 } 5016 v.reset(OpARM64MOVDreg) 5017 v.AddArg(x) 5018 return true 5019 } 5020 // match: (MOVWreg x:(MOVWload _ _)) 5021 // cond: 5022 // result: (MOVDreg x) 5023 for { 5024 x := v.Args[0] 5025 if x.Op != OpARM64MOVWload { 5026 break 5027 } 5028 v.reset(OpARM64MOVDreg) 5029 v.AddArg(x) 5030 return true 5031 } 5032 // match: (MOVWreg x:(MOVBreg _)) 5033 // cond: 5034 // result: (MOVDreg x) 5035 for { 5036 x := v.Args[0] 5037 if x.Op != OpARM64MOVBreg { 5038 break 5039 } 5040 v.reset(OpARM64MOVDreg) 5041 v.AddArg(x) 5042 return true 5043 } 5044 // match: (MOVWreg x:(MOVBUreg _)) 5045 // cond: 5046 // result: (MOVDreg x) 5047 for { 5048 x := v.Args[0] 5049 if x.Op != OpARM64MOVBUreg { 5050 break 5051 } 5052 v.reset(OpARM64MOVDreg) 5053 v.AddArg(x) 5054 return true 5055 } 5056 // match: (MOVWreg x:(MOVHreg _)) 5057 // cond: 5058 // result: (MOVDreg x) 5059 for { 5060 x := v.Args[0] 5061 if x.Op != OpARM64MOVHreg { 5062 break 5063 } 5064 v.reset(OpARM64MOVDreg) 5065 v.AddArg(x) 5066 return true 5067 } 5068 // match: (MOVWreg x:(MOVHreg _)) 5069 // cond: 5070 // result: (MOVDreg x) 5071 for { 5072 x := v.Args[0] 5073 if x.Op != OpARM64MOVHreg { 5074 break 5075 } 5076 v.reset(OpARM64MOVDreg) 5077 v.AddArg(x) 5078 return true 5079 } 5080 // match: (MOVWreg x:(MOVWreg _)) 5081 // cond: 5082 // result: (MOVDreg x) 5083 for { 5084 x := v.Args[0] 5085 if x.Op != OpARM64MOVWreg { 5086 break 5087 } 5088 v.reset(OpARM64MOVDreg) 5089 v.AddArg(x) 5090 return true 5091 } 5092 // match: (MOVWreg (MOVDconst [c])) 5093 // cond: 5094 // result: (MOVDconst [int64(int32(c))]) 5095 for { 5096 v_0 := v.Args[0] 5097 if v_0.Op != OpARM64MOVDconst { 5098 break 5099 } 5100 c := v_0.AuxInt 5101 v.reset(OpARM64MOVDconst) 5102 v.AuxInt = int64(int32(c)) 5103 return true 5104 } 5105 return false 5106 } 5107 func rewriteValueARM64_OpARM64MOVWstore(v *Value, config *Config) bool { 5108 b := v.Block 5109 _ = b 5110 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5111 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 5112 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 5113 for { 5114 off1 := v.AuxInt 5115 sym := v.Aux 5116 v_0 := v.Args[0] 5117 if v_0.Op != OpARM64ADDconst { 5118 break 5119 } 5120 off2 := v_0.AuxInt 5121 ptr := v_0.Args[0] 5122 val := v.Args[1] 5123 mem := v.Args[2] 5124 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 5125 break 5126 } 5127 v.reset(OpARM64MOVWstore) 5128 v.AuxInt = off1 + off2 5129 v.Aux = sym 5130 v.AddArg(ptr) 5131 v.AddArg(val) 5132 v.AddArg(mem) 5133 return true 5134 } 5135 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 5136 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 5137 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5138 for { 5139 off1 := v.AuxInt 5140 sym1 := v.Aux 5141 v_0 := v.Args[0] 5142 if v_0.Op != OpARM64MOVDaddr { 5143 break 5144 } 5145 off2 := v_0.AuxInt 5146 sym2 := v_0.Aux 5147 ptr := v_0.Args[0] 5148 val := v.Args[1] 5149 mem := v.Args[2] 5150 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 5151 break 5152 } 5153 v.reset(OpARM64MOVWstore) 5154 v.AuxInt = off1 + off2 5155 v.Aux = mergeSym(sym1, sym2) 5156 v.AddArg(ptr) 5157 v.AddArg(val) 5158 v.AddArg(mem) 5159 return true 5160 } 5161 // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) 5162 // cond: 5163 // result: (MOVWstorezero [off] {sym} ptr mem) 5164 for { 5165 off := v.AuxInt 5166 sym := v.Aux 5167 ptr := v.Args[0] 5168 v_1 := v.Args[1] 5169 if v_1.Op != OpARM64MOVDconst { 5170 break 5171 } 5172 if v_1.AuxInt != 0 { 5173 break 5174 } 5175 mem := v.Args[2] 5176 v.reset(OpARM64MOVWstorezero) 5177 v.AuxInt = off 5178 v.Aux = sym 5179 v.AddArg(ptr) 5180 v.AddArg(mem) 5181 return true 5182 } 5183 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 5184 // cond: 5185 // result: (MOVWstore [off] {sym} ptr x mem) 5186 for { 5187 off := v.AuxInt 5188 sym := v.Aux 5189 ptr := v.Args[0] 5190 v_1 := v.Args[1] 5191 if v_1.Op != OpARM64MOVWreg { 5192 break 5193 } 5194 x := v_1.Args[0] 5195 mem := v.Args[2] 5196 v.reset(OpARM64MOVWstore) 5197 v.AuxInt = off 5198 v.Aux = sym 5199 v.AddArg(ptr) 5200 v.AddArg(x) 5201 v.AddArg(mem) 5202 return true 5203 } 5204 // match: (MOVWstore [off] {sym} ptr (MOVWUreg 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 != OpARM64MOVWUreg { 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 return false 5226 } 5227 func rewriteValueARM64_OpARM64MOVWstorezero(v *Value, config *Config) bool { 5228 b := v.Block 5229 _ = b 5230 // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 5231 // cond: (off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym) && !isAuto(sym) 5232 // result: (MOVWstorezero [off1+off2] {sym} ptr mem) 5233 for { 5234 off1 := v.AuxInt 5235 sym := v.Aux 5236 v_0 := v.Args[0] 5237 if v_0.Op != OpARM64ADDconst { 5238 break 5239 } 5240 off2 := v_0.AuxInt 5241 ptr := v_0.Args[0] 5242 mem := v.Args[1] 5243 if !((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym) && !isAuto(sym)) { 5244 break 5245 } 5246 v.reset(OpARM64MOVWstorezero) 5247 v.AuxInt = off1 + off2 5248 v.Aux = sym 5249 v.AddArg(ptr) 5250 v.AddArg(mem) 5251 return true 5252 } 5253 // match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 5254 // cond: canMergeSym(sym1,sym2) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isArg(sym1) && !isAuto(sym1)) 5255 // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5256 for { 5257 off1 := v.AuxInt 5258 sym1 := v.Aux 5259 v_0 := v.Args[0] 5260 if v_0.Op != OpARM64MOVDaddr { 5261 break 5262 } 5263 off2 := v_0.AuxInt 5264 sym2 := v_0.Aux 5265 ptr := v_0.Args[0] 5266 mem := v.Args[1] 5267 if !(canMergeSym(sym1, sym2) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isArg(sym1) && !isAuto(sym1))) { 5268 break 5269 } 5270 v.reset(OpARM64MOVWstorezero) 5271 v.AuxInt = off1 + off2 5272 v.Aux = mergeSym(sym1, sym2) 5273 v.AddArg(ptr) 5274 v.AddArg(mem) 5275 return true 5276 } 5277 return false 5278 } 5279 func rewriteValueARM64_OpARM64MUL(v *Value, config *Config) bool { 5280 b := v.Block 5281 _ = b 5282 // match: (MUL x (MOVDconst [-1])) 5283 // cond: 5284 // result: (NEG x) 5285 for { 5286 x := v.Args[0] 5287 v_1 := v.Args[1] 5288 if v_1.Op != OpARM64MOVDconst { 5289 break 5290 } 5291 if v_1.AuxInt != -1 { 5292 break 5293 } 5294 v.reset(OpARM64NEG) 5295 v.AddArg(x) 5296 return true 5297 } 5298 // match: (MUL _ (MOVDconst [0])) 5299 // cond: 5300 // result: (MOVDconst [0]) 5301 for { 5302 v_1 := v.Args[1] 5303 if v_1.Op != OpARM64MOVDconst { 5304 break 5305 } 5306 if v_1.AuxInt != 0 { 5307 break 5308 } 5309 v.reset(OpARM64MOVDconst) 5310 v.AuxInt = 0 5311 return true 5312 } 5313 // match: (MUL x (MOVDconst [1])) 5314 // cond: 5315 // result: x 5316 for { 5317 x := v.Args[0] 5318 v_1 := v.Args[1] 5319 if v_1.Op != OpARM64MOVDconst { 5320 break 5321 } 5322 if v_1.AuxInt != 1 { 5323 break 5324 } 5325 v.reset(OpCopy) 5326 v.Type = x.Type 5327 v.AddArg(x) 5328 return true 5329 } 5330 // match: (MUL x (MOVDconst [c])) 5331 // cond: isPowerOfTwo(c) 5332 // result: (SLLconst [log2(c)] x) 5333 for { 5334 x := v.Args[0] 5335 v_1 := v.Args[1] 5336 if v_1.Op != OpARM64MOVDconst { 5337 break 5338 } 5339 c := v_1.AuxInt 5340 if !(isPowerOfTwo(c)) { 5341 break 5342 } 5343 v.reset(OpARM64SLLconst) 5344 v.AuxInt = log2(c) 5345 v.AddArg(x) 5346 return true 5347 } 5348 // match: (MUL x (MOVDconst [c])) 5349 // cond: isPowerOfTwo(c-1) && c >= 3 5350 // result: (ADDshiftLL x x [log2(c-1)]) 5351 for { 5352 x := v.Args[0] 5353 v_1 := v.Args[1] 5354 if v_1.Op != OpARM64MOVDconst { 5355 break 5356 } 5357 c := v_1.AuxInt 5358 if !(isPowerOfTwo(c-1) && c >= 3) { 5359 break 5360 } 5361 v.reset(OpARM64ADDshiftLL) 5362 v.AuxInt = log2(c - 1) 5363 v.AddArg(x) 5364 v.AddArg(x) 5365 return true 5366 } 5367 // match: (MUL x (MOVDconst [c])) 5368 // cond: isPowerOfTwo(c+1) && c >= 7 5369 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5370 for { 5371 x := v.Args[0] 5372 v_1 := v.Args[1] 5373 if v_1.Op != OpARM64MOVDconst { 5374 break 5375 } 5376 c := v_1.AuxInt 5377 if !(isPowerOfTwo(c+1) && c >= 7) { 5378 break 5379 } 5380 v.reset(OpARM64ADDshiftLL) 5381 v.AuxInt = log2(c + 1) 5382 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5383 v0.AddArg(x) 5384 v.AddArg(v0) 5385 v.AddArg(x) 5386 return true 5387 } 5388 // match: (MUL x (MOVDconst [c])) 5389 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5390 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5391 for { 5392 x := v.Args[0] 5393 v_1 := v.Args[1] 5394 if v_1.Op != OpARM64MOVDconst { 5395 break 5396 } 5397 c := v_1.AuxInt 5398 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5399 break 5400 } 5401 v.reset(OpARM64SLLconst) 5402 v.AuxInt = log2(c / 3) 5403 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5404 v0.AuxInt = 1 5405 v0.AddArg(x) 5406 v0.AddArg(x) 5407 v.AddArg(v0) 5408 return true 5409 } 5410 // match: (MUL x (MOVDconst [c])) 5411 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5412 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5413 for { 5414 x := v.Args[0] 5415 v_1 := v.Args[1] 5416 if v_1.Op != OpARM64MOVDconst { 5417 break 5418 } 5419 c := v_1.AuxInt 5420 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5421 break 5422 } 5423 v.reset(OpARM64SLLconst) 5424 v.AuxInt = log2(c / 5) 5425 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5426 v0.AuxInt = 2 5427 v0.AddArg(x) 5428 v0.AddArg(x) 5429 v.AddArg(v0) 5430 return true 5431 } 5432 // match: (MUL x (MOVDconst [c])) 5433 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5434 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5435 for { 5436 x := v.Args[0] 5437 v_1 := v.Args[1] 5438 if v_1.Op != OpARM64MOVDconst { 5439 break 5440 } 5441 c := v_1.AuxInt 5442 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5443 break 5444 } 5445 v.reset(OpARM64SLLconst) 5446 v.AuxInt = log2(c / 7) 5447 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5448 v0.AuxInt = 3 5449 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5450 v1.AddArg(x) 5451 v0.AddArg(v1) 5452 v0.AddArg(x) 5453 v.AddArg(v0) 5454 return true 5455 } 5456 // match: (MUL x (MOVDconst [c])) 5457 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5458 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5459 for { 5460 x := v.Args[0] 5461 v_1 := v.Args[1] 5462 if v_1.Op != OpARM64MOVDconst { 5463 break 5464 } 5465 c := v_1.AuxInt 5466 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5467 break 5468 } 5469 v.reset(OpARM64SLLconst) 5470 v.AuxInt = log2(c / 9) 5471 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5472 v0.AuxInt = 3 5473 v0.AddArg(x) 5474 v0.AddArg(x) 5475 v.AddArg(v0) 5476 return true 5477 } 5478 // match: (MUL (MOVDconst [-1]) x) 5479 // cond: 5480 // result: (NEG x) 5481 for { 5482 v_0 := v.Args[0] 5483 if v_0.Op != OpARM64MOVDconst { 5484 break 5485 } 5486 if v_0.AuxInt != -1 { 5487 break 5488 } 5489 x := v.Args[1] 5490 v.reset(OpARM64NEG) 5491 v.AddArg(x) 5492 return true 5493 } 5494 // match: (MUL (MOVDconst [0]) _) 5495 // cond: 5496 // result: (MOVDconst [0]) 5497 for { 5498 v_0 := v.Args[0] 5499 if v_0.Op != OpARM64MOVDconst { 5500 break 5501 } 5502 if v_0.AuxInt != 0 { 5503 break 5504 } 5505 v.reset(OpARM64MOVDconst) 5506 v.AuxInt = 0 5507 return true 5508 } 5509 // match: (MUL (MOVDconst [1]) x) 5510 // cond: 5511 // result: x 5512 for { 5513 v_0 := v.Args[0] 5514 if v_0.Op != OpARM64MOVDconst { 5515 break 5516 } 5517 if v_0.AuxInt != 1 { 5518 break 5519 } 5520 x := v.Args[1] 5521 v.reset(OpCopy) 5522 v.Type = x.Type 5523 v.AddArg(x) 5524 return true 5525 } 5526 // match: (MUL (MOVDconst [c]) x) 5527 // cond: isPowerOfTwo(c) 5528 // result: (SLLconst [log2(c)] x) 5529 for { 5530 v_0 := v.Args[0] 5531 if v_0.Op != OpARM64MOVDconst { 5532 break 5533 } 5534 c := v_0.AuxInt 5535 x := v.Args[1] 5536 if !(isPowerOfTwo(c)) { 5537 break 5538 } 5539 v.reset(OpARM64SLLconst) 5540 v.AuxInt = log2(c) 5541 v.AddArg(x) 5542 return true 5543 } 5544 // match: (MUL (MOVDconst [c]) x) 5545 // cond: isPowerOfTwo(c) 5546 // result: (SLLconst [log2(c)] x) 5547 for { 5548 v_0 := v.Args[0] 5549 if v_0.Op != OpARM64MOVDconst { 5550 break 5551 } 5552 c := v_0.AuxInt 5553 x := v.Args[1] 5554 if !(isPowerOfTwo(c)) { 5555 break 5556 } 5557 v.reset(OpARM64SLLconst) 5558 v.AuxInt = log2(c) 5559 v.AddArg(x) 5560 return true 5561 } 5562 // match: (MUL (MOVDconst [c]) x) 5563 // cond: isPowerOfTwo(c-1) && c >= 3 5564 // result: (ADDshiftLL x x [log2(c-1)]) 5565 for { 5566 v_0 := v.Args[0] 5567 if v_0.Op != OpARM64MOVDconst { 5568 break 5569 } 5570 c := v_0.AuxInt 5571 x := v.Args[1] 5572 if !(isPowerOfTwo(c-1) && c >= 3) { 5573 break 5574 } 5575 v.reset(OpARM64ADDshiftLL) 5576 v.AuxInt = log2(c - 1) 5577 v.AddArg(x) 5578 v.AddArg(x) 5579 return true 5580 } 5581 // match: (MUL (MOVDconst [c]) x) 5582 // cond: isPowerOfTwo(c+1) && c >= 7 5583 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5584 for { 5585 v_0 := v.Args[0] 5586 if v_0.Op != OpARM64MOVDconst { 5587 break 5588 } 5589 c := v_0.AuxInt 5590 x := v.Args[1] 5591 if !(isPowerOfTwo(c+1) && c >= 7) { 5592 break 5593 } 5594 v.reset(OpARM64ADDshiftLL) 5595 v.AuxInt = log2(c + 1) 5596 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5597 v0.AddArg(x) 5598 v.AddArg(v0) 5599 v.AddArg(x) 5600 return true 5601 } 5602 // match: (MUL (MOVDconst [c]) x) 5603 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5604 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5605 for { 5606 v_0 := v.Args[0] 5607 if v_0.Op != OpARM64MOVDconst { 5608 break 5609 } 5610 c := v_0.AuxInt 5611 x := v.Args[1] 5612 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5613 break 5614 } 5615 v.reset(OpARM64SLLconst) 5616 v.AuxInt = log2(c / 3) 5617 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5618 v0.AuxInt = 1 5619 v0.AddArg(x) 5620 v0.AddArg(x) 5621 v.AddArg(v0) 5622 return true 5623 } 5624 // match: (MUL (MOVDconst [c]) x) 5625 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5626 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5627 for { 5628 v_0 := v.Args[0] 5629 if v_0.Op != OpARM64MOVDconst { 5630 break 5631 } 5632 c := v_0.AuxInt 5633 x := v.Args[1] 5634 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5635 break 5636 } 5637 v.reset(OpARM64SLLconst) 5638 v.AuxInt = log2(c / 5) 5639 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5640 v0.AuxInt = 2 5641 v0.AddArg(x) 5642 v0.AddArg(x) 5643 v.AddArg(v0) 5644 return true 5645 } 5646 // match: (MUL (MOVDconst [c]) x) 5647 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5648 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5649 for { 5650 v_0 := v.Args[0] 5651 if v_0.Op != OpARM64MOVDconst { 5652 break 5653 } 5654 c := v_0.AuxInt 5655 x := v.Args[1] 5656 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5657 break 5658 } 5659 v.reset(OpARM64SLLconst) 5660 v.AuxInt = log2(c / 7) 5661 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5662 v0.AuxInt = 3 5663 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5664 v1.AddArg(x) 5665 v0.AddArg(v1) 5666 v0.AddArg(x) 5667 v.AddArg(v0) 5668 return true 5669 } 5670 // match: (MUL (MOVDconst [c]) x) 5671 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5672 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5673 for { 5674 v_0 := v.Args[0] 5675 if v_0.Op != OpARM64MOVDconst { 5676 break 5677 } 5678 c := v_0.AuxInt 5679 x := v.Args[1] 5680 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5681 break 5682 } 5683 v.reset(OpARM64SLLconst) 5684 v.AuxInt = log2(c / 9) 5685 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5686 v0.AuxInt = 3 5687 v0.AddArg(x) 5688 v0.AddArg(x) 5689 v.AddArg(v0) 5690 return true 5691 } 5692 // match: (MUL (MOVDconst [c]) (MOVDconst [d])) 5693 // cond: 5694 // result: (MOVDconst [c*d]) 5695 for { 5696 v_0 := v.Args[0] 5697 if v_0.Op != OpARM64MOVDconst { 5698 break 5699 } 5700 c := v_0.AuxInt 5701 v_1 := v.Args[1] 5702 if v_1.Op != OpARM64MOVDconst { 5703 break 5704 } 5705 d := v_1.AuxInt 5706 v.reset(OpARM64MOVDconst) 5707 v.AuxInt = c * d 5708 return true 5709 } 5710 return false 5711 } 5712 func rewriteValueARM64_OpARM64MULW(v *Value, config *Config) bool { 5713 b := v.Block 5714 _ = b 5715 // match: (MULW x (MOVDconst [c])) 5716 // cond: int32(c)==-1 5717 // result: (NEG x) 5718 for { 5719 x := v.Args[0] 5720 v_1 := v.Args[1] 5721 if v_1.Op != OpARM64MOVDconst { 5722 break 5723 } 5724 c := v_1.AuxInt 5725 if !(int32(c) == -1) { 5726 break 5727 } 5728 v.reset(OpARM64NEG) 5729 v.AddArg(x) 5730 return true 5731 } 5732 // match: (MULW _ (MOVDconst [c])) 5733 // cond: int32(c)==0 5734 // result: (MOVDconst [0]) 5735 for { 5736 v_1 := v.Args[1] 5737 if v_1.Op != OpARM64MOVDconst { 5738 break 5739 } 5740 c := v_1.AuxInt 5741 if !(int32(c) == 0) { 5742 break 5743 } 5744 v.reset(OpARM64MOVDconst) 5745 v.AuxInt = 0 5746 return true 5747 } 5748 // match: (MULW x (MOVDconst [c])) 5749 // cond: int32(c)==1 5750 // result: x 5751 for { 5752 x := v.Args[0] 5753 v_1 := v.Args[1] 5754 if v_1.Op != OpARM64MOVDconst { 5755 break 5756 } 5757 c := v_1.AuxInt 5758 if !(int32(c) == 1) { 5759 break 5760 } 5761 v.reset(OpCopy) 5762 v.Type = x.Type 5763 v.AddArg(x) 5764 return true 5765 } 5766 // match: (MULW x (MOVDconst [c])) 5767 // cond: isPowerOfTwo(c) 5768 // result: (SLLconst [log2(c)] x) 5769 for { 5770 x := v.Args[0] 5771 v_1 := v.Args[1] 5772 if v_1.Op != OpARM64MOVDconst { 5773 break 5774 } 5775 c := v_1.AuxInt 5776 if !(isPowerOfTwo(c)) { 5777 break 5778 } 5779 v.reset(OpARM64SLLconst) 5780 v.AuxInt = log2(c) 5781 v.AddArg(x) 5782 return true 5783 } 5784 // match: (MULW x (MOVDconst [c])) 5785 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5786 // result: (ADDshiftLL x x [log2(c-1)]) 5787 for { 5788 x := v.Args[0] 5789 v_1 := v.Args[1] 5790 if v_1.Op != OpARM64MOVDconst { 5791 break 5792 } 5793 c := v_1.AuxInt 5794 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 5795 break 5796 } 5797 v.reset(OpARM64ADDshiftLL) 5798 v.AuxInt = log2(c - 1) 5799 v.AddArg(x) 5800 v.AddArg(x) 5801 return true 5802 } 5803 // match: (MULW x (MOVDconst [c])) 5804 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 5805 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5806 for { 5807 x := v.Args[0] 5808 v_1 := v.Args[1] 5809 if v_1.Op != OpARM64MOVDconst { 5810 break 5811 } 5812 c := v_1.AuxInt 5813 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 5814 break 5815 } 5816 v.reset(OpARM64ADDshiftLL) 5817 v.AuxInt = log2(c + 1) 5818 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5819 v0.AddArg(x) 5820 v.AddArg(v0) 5821 v.AddArg(x) 5822 return true 5823 } 5824 // match: (MULW x (MOVDconst [c])) 5825 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 5826 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5827 for { 5828 x := v.Args[0] 5829 v_1 := v.Args[1] 5830 if v_1.Op != OpARM64MOVDconst { 5831 break 5832 } 5833 c := v_1.AuxInt 5834 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 5835 break 5836 } 5837 v.reset(OpARM64SLLconst) 5838 v.AuxInt = log2(c / 3) 5839 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5840 v0.AuxInt = 1 5841 v0.AddArg(x) 5842 v0.AddArg(x) 5843 v.AddArg(v0) 5844 return true 5845 } 5846 // match: (MULW x (MOVDconst [c])) 5847 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 5848 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5849 for { 5850 x := v.Args[0] 5851 v_1 := v.Args[1] 5852 if v_1.Op != OpARM64MOVDconst { 5853 break 5854 } 5855 c := v_1.AuxInt 5856 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 5857 break 5858 } 5859 v.reset(OpARM64SLLconst) 5860 v.AuxInt = log2(c / 5) 5861 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5862 v0.AuxInt = 2 5863 v0.AddArg(x) 5864 v0.AddArg(x) 5865 v.AddArg(v0) 5866 return true 5867 } 5868 // match: (MULW x (MOVDconst [c])) 5869 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 5870 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5871 for { 5872 x := v.Args[0] 5873 v_1 := v.Args[1] 5874 if v_1.Op != OpARM64MOVDconst { 5875 break 5876 } 5877 c := v_1.AuxInt 5878 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 5879 break 5880 } 5881 v.reset(OpARM64SLLconst) 5882 v.AuxInt = log2(c / 7) 5883 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5884 v0.AuxInt = 3 5885 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5886 v1.AddArg(x) 5887 v0.AddArg(v1) 5888 v0.AddArg(x) 5889 v.AddArg(v0) 5890 return true 5891 } 5892 // match: (MULW x (MOVDconst [c])) 5893 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 5894 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5895 for { 5896 x := v.Args[0] 5897 v_1 := v.Args[1] 5898 if v_1.Op != OpARM64MOVDconst { 5899 break 5900 } 5901 c := v_1.AuxInt 5902 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 5903 break 5904 } 5905 v.reset(OpARM64SLLconst) 5906 v.AuxInt = log2(c / 9) 5907 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5908 v0.AuxInt = 3 5909 v0.AddArg(x) 5910 v0.AddArg(x) 5911 v.AddArg(v0) 5912 return true 5913 } 5914 // match: (MULW (MOVDconst [c]) x) 5915 // cond: int32(c)==-1 5916 // result: (NEG x) 5917 for { 5918 v_0 := v.Args[0] 5919 if v_0.Op != OpARM64MOVDconst { 5920 break 5921 } 5922 c := v_0.AuxInt 5923 x := v.Args[1] 5924 if !(int32(c) == -1) { 5925 break 5926 } 5927 v.reset(OpARM64NEG) 5928 v.AddArg(x) 5929 return true 5930 } 5931 // match: (MULW (MOVDconst [c]) _) 5932 // cond: int32(c)==0 5933 // result: (MOVDconst [0]) 5934 for { 5935 v_0 := v.Args[0] 5936 if v_0.Op != OpARM64MOVDconst { 5937 break 5938 } 5939 c := v_0.AuxInt 5940 if !(int32(c) == 0) { 5941 break 5942 } 5943 v.reset(OpARM64MOVDconst) 5944 v.AuxInt = 0 5945 return true 5946 } 5947 // match: (MULW (MOVDconst [c]) x) 5948 // cond: int32(c)==1 5949 // result: x 5950 for { 5951 v_0 := v.Args[0] 5952 if v_0.Op != OpARM64MOVDconst { 5953 break 5954 } 5955 c := v_0.AuxInt 5956 x := v.Args[1] 5957 if !(int32(c) == 1) { 5958 break 5959 } 5960 v.reset(OpCopy) 5961 v.Type = x.Type 5962 v.AddArg(x) 5963 return true 5964 } 5965 // match: (MULW (MOVDconst [c]) x) 5966 // cond: isPowerOfTwo(c) 5967 // result: (SLLconst [log2(c)] x) 5968 for { 5969 v_0 := v.Args[0] 5970 if v_0.Op != OpARM64MOVDconst { 5971 break 5972 } 5973 c := v_0.AuxInt 5974 x := v.Args[1] 5975 if !(isPowerOfTwo(c)) { 5976 break 5977 } 5978 v.reset(OpARM64SLLconst) 5979 v.AuxInt = log2(c) 5980 v.AddArg(x) 5981 return true 5982 } 5983 // match: (MULW (MOVDconst [c]) x) 5984 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5985 // result: (ADDshiftLL x x [log2(c-1)]) 5986 for { 5987 v_0 := v.Args[0] 5988 if v_0.Op != OpARM64MOVDconst { 5989 break 5990 } 5991 c := v_0.AuxInt 5992 x := v.Args[1] 5993 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 5994 break 5995 } 5996 v.reset(OpARM64ADDshiftLL) 5997 v.AuxInt = log2(c - 1) 5998 v.AddArg(x) 5999 v.AddArg(x) 6000 return true 6001 } 6002 // match: (MULW (MOVDconst [c]) x) 6003 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 6004 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 6005 for { 6006 v_0 := v.Args[0] 6007 if v_0.Op != OpARM64MOVDconst { 6008 break 6009 } 6010 c := v_0.AuxInt 6011 x := v.Args[1] 6012 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 6013 break 6014 } 6015 v.reset(OpARM64ADDshiftLL) 6016 v.AuxInt = log2(c + 1) 6017 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 6018 v0.AddArg(x) 6019 v.AddArg(v0) 6020 v.AddArg(x) 6021 return true 6022 } 6023 // match: (MULW (MOVDconst [c]) x) 6024 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 6025 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 6026 for { 6027 v_0 := v.Args[0] 6028 if v_0.Op != OpARM64MOVDconst { 6029 break 6030 } 6031 c := v_0.AuxInt 6032 x := v.Args[1] 6033 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 6034 break 6035 } 6036 v.reset(OpARM64SLLconst) 6037 v.AuxInt = log2(c / 3) 6038 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6039 v0.AuxInt = 1 6040 v0.AddArg(x) 6041 v0.AddArg(x) 6042 v.AddArg(v0) 6043 return true 6044 } 6045 // match: (MULW (MOVDconst [c]) x) 6046 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 6047 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 6048 for { 6049 v_0 := v.Args[0] 6050 if v_0.Op != OpARM64MOVDconst { 6051 break 6052 } 6053 c := v_0.AuxInt 6054 x := v.Args[1] 6055 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 6056 break 6057 } 6058 v.reset(OpARM64SLLconst) 6059 v.AuxInt = log2(c / 5) 6060 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6061 v0.AuxInt = 2 6062 v0.AddArg(x) 6063 v0.AddArg(x) 6064 v.AddArg(v0) 6065 return true 6066 } 6067 // match: (MULW (MOVDconst [c]) x) 6068 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 6069 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 6070 for { 6071 v_0 := v.Args[0] 6072 if v_0.Op != OpARM64MOVDconst { 6073 break 6074 } 6075 c := v_0.AuxInt 6076 x := v.Args[1] 6077 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 6078 break 6079 } 6080 v.reset(OpARM64SLLconst) 6081 v.AuxInt = log2(c / 7) 6082 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6083 v0.AuxInt = 3 6084 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 6085 v1.AddArg(x) 6086 v0.AddArg(v1) 6087 v0.AddArg(x) 6088 v.AddArg(v0) 6089 return true 6090 } 6091 // match: (MULW (MOVDconst [c]) x) 6092 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 6093 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 6094 for { 6095 v_0 := v.Args[0] 6096 if v_0.Op != OpARM64MOVDconst { 6097 break 6098 } 6099 c := v_0.AuxInt 6100 x := v.Args[1] 6101 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 6102 break 6103 } 6104 v.reset(OpARM64SLLconst) 6105 v.AuxInt = log2(c / 9) 6106 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6107 v0.AuxInt = 3 6108 v0.AddArg(x) 6109 v0.AddArg(x) 6110 v.AddArg(v0) 6111 return true 6112 } 6113 // match: (MULW (MOVDconst [c]) (MOVDconst [d])) 6114 // cond: 6115 // result: (MOVDconst [int64(int32(c)*int32(d))]) 6116 for { 6117 v_0 := v.Args[0] 6118 if v_0.Op != OpARM64MOVDconst { 6119 break 6120 } 6121 c := v_0.AuxInt 6122 v_1 := v.Args[1] 6123 if v_1.Op != OpARM64MOVDconst { 6124 break 6125 } 6126 d := v_1.AuxInt 6127 v.reset(OpARM64MOVDconst) 6128 v.AuxInt = int64(int32(c) * int32(d)) 6129 return true 6130 } 6131 return false 6132 } 6133 func rewriteValueARM64_OpARM64MVN(v *Value, config *Config) bool { 6134 b := v.Block 6135 _ = b 6136 // match: (MVN (MOVDconst [c])) 6137 // cond: 6138 // result: (MOVDconst [^c]) 6139 for { 6140 v_0 := v.Args[0] 6141 if v_0.Op != OpARM64MOVDconst { 6142 break 6143 } 6144 c := v_0.AuxInt 6145 v.reset(OpARM64MOVDconst) 6146 v.AuxInt = ^c 6147 return true 6148 } 6149 return false 6150 } 6151 func rewriteValueARM64_OpARM64NEG(v *Value, config *Config) bool { 6152 b := v.Block 6153 _ = b 6154 // match: (NEG (MOVDconst [c])) 6155 // cond: 6156 // result: (MOVDconst [-c]) 6157 for { 6158 v_0 := v.Args[0] 6159 if v_0.Op != OpARM64MOVDconst { 6160 break 6161 } 6162 c := v_0.AuxInt 6163 v.reset(OpARM64MOVDconst) 6164 v.AuxInt = -c 6165 return true 6166 } 6167 return false 6168 } 6169 func rewriteValueARM64_OpARM64NotEqual(v *Value, config *Config) bool { 6170 b := v.Block 6171 _ = b 6172 // match: (NotEqual (FlagEQ)) 6173 // cond: 6174 // result: (MOVDconst [0]) 6175 for { 6176 v_0 := v.Args[0] 6177 if v_0.Op != OpARM64FlagEQ { 6178 break 6179 } 6180 v.reset(OpARM64MOVDconst) 6181 v.AuxInt = 0 6182 return true 6183 } 6184 // match: (NotEqual (FlagLT_ULT)) 6185 // cond: 6186 // result: (MOVDconst [1]) 6187 for { 6188 v_0 := v.Args[0] 6189 if v_0.Op != OpARM64FlagLT_ULT { 6190 break 6191 } 6192 v.reset(OpARM64MOVDconst) 6193 v.AuxInt = 1 6194 return true 6195 } 6196 // match: (NotEqual (FlagLT_UGT)) 6197 // cond: 6198 // result: (MOVDconst [1]) 6199 for { 6200 v_0 := v.Args[0] 6201 if v_0.Op != OpARM64FlagLT_UGT { 6202 break 6203 } 6204 v.reset(OpARM64MOVDconst) 6205 v.AuxInt = 1 6206 return true 6207 } 6208 // match: (NotEqual (FlagGT_ULT)) 6209 // cond: 6210 // result: (MOVDconst [1]) 6211 for { 6212 v_0 := v.Args[0] 6213 if v_0.Op != OpARM64FlagGT_ULT { 6214 break 6215 } 6216 v.reset(OpARM64MOVDconst) 6217 v.AuxInt = 1 6218 return true 6219 } 6220 // match: (NotEqual (FlagGT_UGT)) 6221 // cond: 6222 // result: (MOVDconst [1]) 6223 for { 6224 v_0 := v.Args[0] 6225 if v_0.Op != OpARM64FlagGT_UGT { 6226 break 6227 } 6228 v.reset(OpARM64MOVDconst) 6229 v.AuxInt = 1 6230 return true 6231 } 6232 // match: (NotEqual (InvertFlags x)) 6233 // cond: 6234 // result: (NotEqual x) 6235 for { 6236 v_0 := v.Args[0] 6237 if v_0.Op != OpARM64InvertFlags { 6238 break 6239 } 6240 x := v_0.Args[0] 6241 v.reset(OpARM64NotEqual) 6242 v.AddArg(x) 6243 return true 6244 } 6245 return false 6246 } 6247 func rewriteValueARM64_OpARM64OR(v *Value, config *Config) bool { 6248 b := v.Block 6249 _ = b 6250 // match: (OR (MOVDconst [c]) x) 6251 // cond: 6252 // result: (ORconst [c] x) 6253 for { 6254 v_0 := v.Args[0] 6255 if v_0.Op != OpARM64MOVDconst { 6256 break 6257 } 6258 c := v_0.AuxInt 6259 x := v.Args[1] 6260 v.reset(OpARM64ORconst) 6261 v.AuxInt = c 6262 v.AddArg(x) 6263 return true 6264 } 6265 // match: (OR x (MOVDconst [c])) 6266 // cond: 6267 // result: (ORconst [c] x) 6268 for { 6269 x := v.Args[0] 6270 v_1 := v.Args[1] 6271 if v_1.Op != OpARM64MOVDconst { 6272 break 6273 } 6274 c := v_1.AuxInt 6275 v.reset(OpARM64ORconst) 6276 v.AuxInt = c 6277 v.AddArg(x) 6278 return true 6279 } 6280 // match: (OR x x) 6281 // cond: 6282 // result: x 6283 for { 6284 x := v.Args[0] 6285 if x != v.Args[1] { 6286 break 6287 } 6288 v.reset(OpCopy) 6289 v.Type = x.Type 6290 v.AddArg(x) 6291 return true 6292 } 6293 // match: (OR x s:(SLLconst [c] y)) 6294 // cond: s.Uses == 1 && clobber(s) 6295 // result: (ORshiftLL x y [c]) 6296 for { 6297 x := v.Args[0] 6298 s := v.Args[1] 6299 if s.Op != OpARM64SLLconst { 6300 break 6301 } 6302 c := s.AuxInt 6303 y := s.Args[0] 6304 if !(s.Uses == 1 && clobber(s)) { 6305 break 6306 } 6307 v.reset(OpARM64ORshiftLL) 6308 v.AuxInt = c 6309 v.AddArg(x) 6310 v.AddArg(y) 6311 return true 6312 } 6313 // match: (OR s:(SLLconst [c] y) x) 6314 // cond: s.Uses == 1 && clobber(s) 6315 // result: (ORshiftLL x y [c]) 6316 for { 6317 s := v.Args[0] 6318 if s.Op != OpARM64SLLconst { 6319 break 6320 } 6321 c := s.AuxInt 6322 y := s.Args[0] 6323 x := v.Args[1] 6324 if !(s.Uses == 1 && clobber(s)) { 6325 break 6326 } 6327 v.reset(OpARM64ORshiftLL) 6328 v.AuxInt = c 6329 v.AddArg(x) 6330 v.AddArg(y) 6331 return true 6332 } 6333 // match: (OR x (SLLconst [c] y)) 6334 // cond: 6335 // result: (ORshiftLL x y [c]) 6336 for { 6337 x := v.Args[0] 6338 v_1 := v.Args[1] 6339 if v_1.Op != OpARM64SLLconst { 6340 break 6341 } 6342 c := v_1.AuxInt 6343 y := v_1.Args[0] 6344 v.reset(OpARM64ORshiftLL) 6345 v.AuxInt = c 6346 v.AddArg(x) 6347 v.AddArg(y) 6348 return true 6349 } 6350 // match: (OR (SLLconst [c] y) x) 6351 // cond: 6352 // result: (ORshiftLL x y [c]) 6353 for { 6354 v_0 := v.Args[0] 6355 if v_0.Op != OpARM64SLLconst { 6356 break 6357 } 6358 c := v_0.AuxInt 6359 y := v_0.Args[0] 6360 x := v.Args[1] 6361 v.reset(OpARM64ORshiftLL) 6362 v.AuxInt = c 6363 v.AddArg(x) 6364 v.AddArg(y) 6365 return true 6366 } 6367 // match: (OR x (SRLconst [c] y)) 6368 // cond: 6369 // result: (ORshiftRL x y [c]) 6370 for { 6371 x := v.Args[0] 6372 v_1 := v.Args[1] 6373 if v_1.Op != OpARM64SRLconst { 6374 break 6375 } 6376 c := v_1.AuxInt 6377 y := v_1.Args[0] 6378 v.reset(OpARM64ORshiftRL) 6379 v.AuxInt = c 6380 v.AddArg(x) 6381 v.AddArg(y) 6382 return true 6383 } 6384 // match: (OR (SRLconst [c] y) x) 6385 // cond: 6386 // result: (ORshiftRL x y [c]) 6387 for { 6388 v_0 := v.Args[0] 6389 if v_0.Op != OpARM64SRLconst { 6390 break 6391 } 6392 c := v_0.AuxInt 6393 y := v_0.Args[0] 6394 x := v.Args[1] 6395 v.reset(OpARM64ORshiftRL) 6396 v.AuxInt = c 6397 v.AddArg(x) 6398 v.AddArg(y) 6399 return true 6400 } 6401 // match: (OR x (SRAconst [c] y)) 6402 // cond: 6403 // result: (ORshiftRA x y [c]) 6404 for { 6405 x := v.Args[0] 6406 v_1 := v.Args[1] 6407 if v_1.Op != OpARM64SRAconst { 6408 break 6409 } 6410 c := v_1.AuxInt 6411 y := v_1.Args[0] 6412 v.reset(OpARM64ORshiftRA) 6413 v.AuxInt = c 6414 v.AddArg(x) 6415 v.AddArg(y) 6416 return true 6417 } 6418 // match: (OR (SRAconst [c] y) x) 6419 // cond: 6420 // result: (ORshiftRA x y [c]) 6421 for { 6422 v_0 := v.Args[0] 6423 if v_0.Op != OpARM64SRAconst { 6424 break 6425 } 6426 c := v_0.AuxInt 6427 y := v_0.Args[0] 6428 x := v.Args[1] 6429 v.reset(OpARM64ORshiftRA) 6430 v.AuxInt = c 6431 v.AddArg(x) 6432 v.AddArg(y) 6433 return true 6434 } 6435 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i-2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i-3] {s} p mem))) 6436 // cond: 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) 6437 // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [i-3] p) mem) 6438 for { 6439 t := v.Type 6440 o0 := v.Args[0] 6441 if o0.Op != OpARM64ORshiftLL { 6442 break 6443 } 6444 if o0.AuxInt != 8 { 6445 break 6446 } 6447 o1 := o0.Args[0] 6448 if o1.Op != OpARM64ORshiftLL { 6449 break 6450 } 6451 if o1.AuxInt != 16 { 6452 break 6453 } 6454 s0 := o1.Args[0] 6455 if s0.Op != OpARM64SLLconst { 6456 break 6457 } 6458 if s0.AuxInt != 24 { 6459 break 6460 } 6461 y0 := s0.Args[0] 6462 if y0.Op != OpARM64MOVDnop { 6463 break 6464 } 6465 x0 := y0.Args[0] 6466 if x0.Op != OpARM64MOVBUload { 6467 break 6468 } 6469 i := x0.AuxInt 6470 s := x0.Aux 6471 p := x0.Args[0] 6472 mem := x0.Args[1] 6473 y1 := o1.Args[1] 6474 if y1.Op != OpARM64MOVDnop { 6475 break 6476 } 6477 x1 := y1.Args[0] 6478 if x1.Op != OpARM64MOVBUload { 6479 break 6480 } 6481 if x1.AuxInt != i-1 { 6482 break 6483 } 6484 if x1.Aux != s { 6485 break 6486 } 6487 if p != x1.Args[0] { 6488 break 6489 } 6490 if mem != x1.Args[1] { 6491 break 6492 } 6493 y2 := o0.Args[1] 6494 if y2.Op != OpARM64MOVDnop { 6495 break 6496 } 6497 x2 := y2.Args[0] 6498 if x2.Op != OpARM64MOVBUload { 6499 break 6500 } 6501 if x2.AuxInt != i-2 { 6502 break 6503 } 6504 if x2.Aux != s { 6505 break 6506 } 6507 if p != x2.Args[0] { 6508 break 6509 } 6510 if mem != x2.Args[1] { 6511 break 6512 } 6513 y3 := v.Args[1] 6514 if y3.Op != OpARM64MOVDnop { 6515 break 6516 } 6517 x3 := y3.Args[0] 6518 if x3.Op != OpARM64MOVBUload { 6519 break 6520 } 6521 if x3.AuxInt != i-3 { 6522 break 6523 } 6524 if x3.Aux != s { 6525 break 6526 } 6527 if p != x3.Args[0] { 6528 break 6529 } 6530 if mem != x3.Args[1] { 6531 break 6532 } 6533 if !(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)) { 6534 break 6535 } 6536 b = mergePoint(b, x0, x1, x2, x3) 6537 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 6538 v.reset(OpCopy) 6539 v.AddArg(v0) 6540 v0.Aux = s 6541 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6542 v1.AuxInt = i - 3 6543 v1.AddArg(p) 6544 v0.AddArg(v1) 6545 v0.AddArg(mem) 6546 return true 6547 } 6548 // 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 [i] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i-2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i-3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i-4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i-5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i-6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i-7] {s} p mem))) 6549 // cond: 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) 6550 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i-7] p) mem)) 6551 for { 6552 t := v.Type 6553 o0 := v.Args[0] 6554 if o0.Op != OpARM64ORshiftLL { 6555 break 6556 } 6557 if o0.AuxInt != 8 { 6558 break 6559 } 6560 o1 := o0.Args[0] 6561 if o1.Op != OpARM64ORshiftLL { 6562 break 6563 } 6564 if o1.AuxInt != 16 { 6565 break 6566 } 6567 o2 := o1.Args[0] 6568 if o2.Op != OpARM64ORshiftLL { 6569 break 6570 } 6571 if o2.AuxInt != 24 { 6572 break 6573 } 6574 o3 := o2.Args[0] 6575 if o3.Op != OpARM64ORshiftLL { 6576 break 6577 } 6578 if o3.AuxInt != 32 { 6579 break 6580 } 6581 o4 := o3.Args[0] 6582 if o4.Op != OpARM64ORshiftLL { 6583 break 6584 } 6585 if o4.AuxInt != 40 { 6586 break 6587 } 6588 o5 := o4.Args[0] 6589 if o5.Op != OpARM64ORshiftLL { 6590 break 6591 } 6592 if o5.AuxInt != 48 { 6593 break 6594 } 6595 s0 := o5.Args[0] 6596 if s0.Op != OpARM64SLLconst { 6597 break 6598 } 6599 if s0.AuxInt != 56 { 6600 break 6601 } 6602 y0 := s0.Args[0] 6603 if y0.Op != OpARM64MOVDnop { 6604 break 6605 } 6606 x0 := y0.Args[0] 6607 if x0.Op != OpARM64MOVBUload { 6608 break 6609 } 6610 i := x0.AuxInt 6611 s := x0.Aux 6612 p := x0.Args[0] 6613 mem := x0.Args[1] 6614 y1 := o5.Args[1] 6615 if y1.Op != OpARM64MOVDnop { 6616 break 6617 } 6618 x1 := y1.Args[0] 6619 if x1.Op != OpARM64MOVBUload { 6620 break 6621 } 6622 if x1.AuxInt != i-1 { 6623 break 6624 } 6625 if x1.Aux != s { 6626 break 6627 } 6628 if p != x1.Args[0] { 6629 break 6630 } 6631 if mem != x1.Args[1] { 6632 break 6633 } 6634 y2 := o4.Args[1] 6635 if y2.Op != OpARM64MOVDnop { 6636 break 6637 } 6638 x2 := y2.Args[0] 6639 if x2.Op != OpARM64MOVBUload { 6640 break 6641 } 6642 if x2.AuxInt != i-2 { 6643 break 6644 } 6645 if x2.Aux != s { 6646 break 6647 } 6648 if p != x2.Args[0] { 6649 break 6650 } 6651 if mem != x2.Args[1] { 6652 break 6653 } 6654 y3 := o3.Args[1] 6655 if y3.Op != OpARM64MOVDnop { 6656 break 6657 } 6658 x3 := y3.Args[0] 6659 if x3.Op != OpARM64MOVBUload { 6660 break 6661 } 6662 if x3.AuxInt != i-3 { 6663 break 6664 } 6665 if x3.Aux != s { 6666 break 6667 } 6668 if p != x3.Args[0] { 6669 break 6670 } 6671 if mem != x3.Args[1] { 6672 break 6673 } 6674 y4 := o2.Args[1] 6675 if y4.Op != OpARM64MOVDnop { 6676 break 6677 } 6678 x4 := y4.Args[0] 6679 if x4.Op != OpARM64MOVBUload { 6680 break 6681 } 6682 if x4.AuxInt != i-4 { 6683 break 6684 } 6685 if x4.Aux != s { 6686 break 6687 } 6688 if p != x4.Args[0] { 6689 break 6690 } 6691 if mem != x4.Args[1] { 6692 break 6693 } 6694 y5 := o1.Args[1] 6695 if y5.Op != OpARM64MOVDnop { 6696 break 6697 } 6698 x5 := y5.Args[0] 6699 if x5.Op != OpARM64MOVBUload { 6700 break 6701 } 6702 if x5.AuxInt != i-5 { 6703 break 6704 } 6705 if x5.Aux != s { 6706 break 6707 } 6708 if p != x5.Args[0] { 6709 break 6710 } 6711 if mem != x5.Args[1] { 6712 break 6713 } 6714 y6 := o0.Args[1] 6715 if y6.Op != OpARM64MOVDnop { 6716 break 6717 } 6718 x6 := y6.Args[0] 6719 if x6.Op != OpARM64MOVBUload { 6720 break 6721 } 6722 if x6.AuxInt != i-6 { 6723 break 6724 } 6725 if x6.Aux != s { 6726 break 6727 } 6728 if p != x6.Args[0] { 6729 break 6730 } 6731 if mem != x6.Args[1] { 6732 break 6733 } 6734 y7 := v.Args[1] 6735 if y7.Op != OpARM64MOVDnop { 6736 break 6737 } 6738 x7 := y7.Args[0] 6739 if x7.Op != OpARM64MOVBUload { 6740 break 6741 } 6742 if x7.AuxInt != i-7 { 6743 break 6744 } 6745 if x7.Aux != s { 6746 break 6747 } 6748 if p != x7.Args[0] { 6749 break 6750 } 6751 if mem != x7.Args[1] { 6752 break 6753 } 6754 if !(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)) { 6755 break 6756 } 6757 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 6758 v0 := b.NewValue0(v.Line, OpARM64REV, t) 6759 v.reset(OpCopy) 6760 v.AddArg(v0) 6761 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 6762 v1.Aux = s 6763 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6764 v2.AuxInt = i - 7 6765 v2.AddArg(p) 6766 v1.AddArg(v2) 6767 v1.AddArg(mem) 6768 v0.AddArg(v1) 6769 return true 6770 } 6771 // match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i+1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i+2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i+3] {s} p mem))) 6772 // cond: 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) 6773 // result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i] p) mem)) 6774 for { 6775 t := v.Type 6776 o0 := v.Args[0] 6777 if o0.Op != OpARM64ORshiftLL { 6778 break 6779 } 6780 if o0.AuxInt != 8 { 6781 break 6782 } 6783 o1 := o0.Args[0] 6784 if o1.Op != OpARM64ORshiftLL { 6785 break 6786 } 6787 if o1.AuxInt != 16 { 6788 break 6789 } 6790 s0 := o1.Args[0] 6791 if s0.Op != OpARM64SLLconst { 6792 break 6793 } 6794 if s0.AuxInt != 24 { 6795 break 6796 } 6797 y0 := s0.Args[0] 6798 if y0.Op != OpARM64MOVDnop { 6799 break 6800 } 6801 x0 := y0.Args[0] 6802 if x0.Op != OpARM64MOVBUload { 6803 break 6804 } 6805 i := x0.AuxInt 6806 s := x0.Aux 6807 p := x0.Args[0] 6808 mem := x0.Args[1] 6809 y1 := o1.Args[1] 6810 if y1.Op != OpARM64MOVDnop { 6811 break 6812 } 6813 x1 := y1.Args[0] 6814 if x1.Op != OpARM64MOVBUload { 6815 break 6816 } 6817 if x1.AuxInt != i+1 { 6818 break 6819 } 6820 if x1.Aux != s { 6821 break 6822 } 6823 if p != x1.Args[0] { 6824 break 6825 } 6826 if mem != x1.Args[1] { 6827 break 6828 } 6829 y2 := o0.Args[1] 6830 if y2.Op != OpARM64MOVDnop { 6831 break 6832 } 6833 x2 := y2.Args[0] 6834 if x2.Op != OpARM64MOVBUload { 6835 break 6836 } 6837 if x2.AuxInt != i+2 { 6838 break 6839 } 6840 if x2.Aux != s { 6841 break 6842 } 6843 if p != x2.Args[0] { 6844 break 6845 } 6846 if mem != x2.Args[1] { 6847 break 6848 } 6849 y3 := v.Args[1] 6850 if y3.Op != OpARM64MOVDnop { 6851 break 6852 } 6853 x3 := y3.Args[0] 6854 if x3.Op != OpARM64MOVBUload { 6855 break 6856 } 6857 if x3.AuxInt != i+3 { 6858 break 6859 } 6860 if x3.Aux != s { 6861 break 6862 } 6863 if p != x3.Args[0] { 6864 break 6865 } 6866 if mem != x3.Args[1] { 6867 break 6868 } 6869 if !(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)) { 6870 break 6871 } 6872 b = mergePoint(b, x0, x1, x2, x3) 6873 v0 := b.NewValue0(v.Line, OpARM64REVW, t) 6874 v.reset(OpCopy) 6875 v.AddArg(v0) 6876 v1 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 6877 v1.Aux = s 6878 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6879 v2.AuxInt = i 6880 v2.AddArg(p) 6881 v1.AddArg(v2) 6882 v1.AddArg(mem) 6883 v0.AddArg(v1) 6884 return true 6885 } 6886 // 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 [i] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i+1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i+2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i+3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i+4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i+5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i+6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i+7] {s} p mem))) 6887 // cond: 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) 6888 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i] p) mem)) 6889 for { 6890 t := v.Type 6891 o0 := v.Args[0] 6892 if o0.Op != OpARM64ORshiftLL { 6893 break 6894 } 6895 if o0.AuxInt != 8 { 6896 break 6897 } 6898 o1 := o0.Args[0] 6899 if o1.Op != OpARM64ORshiftLL { 6900 break 6901 } 6902 if o1.AuxInt != 16 { 6903 break 6904 } 6905 o2 := o1.Args[0] 6906 if o2.Op != OpARM64ORshiftLL { 6907 break 6908 } 6909 if o2.AuxInt != 24 { 6910 break 6911 } 6912 o3 := o2.Args[0] 6913 if o3.Op != OpARM64ORshiftLL { 6914 break 6915 } 6916 if o3.AuxInt != 32 { 6917 break 6918 } 6919 o4 := o3.Args[0] 6920 if o4.Op != OpARM64ORshiftLL { 6921 break 6922 } 6923 if o4.AuxInt != 40 { 6924 break 6925 } 6926 o5 := o4.Args[0] 6927 if o5.Op != OpARM64ORshiftLL { 6928 break 6929 } 6930 if o5.AuxInt != 48 { 6931 break 6932 } 6933 s0 := o5.Args[0] 6934 if s0.Op != OpARM64SLLconst { 6935 break 6936 } 6937 if s0.AuxInt != 56 { 6938 break 6939 } 6940 y0 := s0.Args[0] 6941 if y0.Op != OpARM64MOVDnop { 6942 break 6943 } 6944 x0 := y0.Args[0] 6945 if x0.Op != OpARM64MOVBUload { 6946 break 6947 } 6948 i := x0.AuxInt 6949 s := x0.Aux 6950 p := x0.Args[0] 6951 mem := x0.Args[1] 6952 y1 := o5.Args[1] 6953 if y1.Op != OpARM64MOVDnop { 6954 break 6955 } 6956 x1 := y1.Args[0] 6957 if x1.Op != OpARM64MOVBUload { 6958 break 6959 } 6960 if x1.AuxInt != i+1 { 6961 break 6962 } 6963 if x1.Aux != s { 6964 break 6965 } 6966 if p != x1.Args[0] { 6967 break 6968 } 6969 if mem != x1.Args[1] { 6970 break 6971 } 6972 y2 := o4.Args[1] 6973 if y2.Op != OpARM64MOVDnop { 6974 break 6975 } 6976 x2 := y2.Args[0] 6977 if x2.Op != OpARM64MOVBUload { 6978 break 6979 } 6980 if x2.AuxInt != i+2 { 6981 break 6982 } 6983 if x2.Aux != s { 6984 break 6985 } 6986 if p != x2.Args[0] { 6987 break 6988 } 6989 if mem != x2.Args[1] { 6990 break 6991 } 6992 y3 := o3.Args[1] 6993 if y3.Op != OpARM64MOVDnop { 6994 break 6995 } 6996 x3 := y3.Args[0] 6997 if x3.Op != OpARM64MOVBUload { 6998 break 6999 } 7000 if x3.AuxInt != i+3 { 7001 break 7002 } 7003 if x3.Aux != s { 7004 break 7005 } 7006 if p != x3.Args[0] { 7007 break 7008 } 7009 if mem != x3.Args[1] { 7010 break 7011 } 7012 y4 := o2.Args[1] 7013 if y4.Op != OpARM64MOVDnop { 7014 break 7015 } 7016 x4 := y4.Args[0] 7017 if x4.Op != OpARM64MOVBUload { 7018 break 7019 } 7020 if x4.AuxInt != i+4 { 7021 break 7022 } 7023 if x4.Aux != s { 7024 break 7025 } 7026 if p != x4.Args[0] { 7027 break 7028 } 7029 if mem != x4.Args[1] { 7030 break 7031 } 7032 y5 := o1.Args[1] 7033 if y5.Op != OpARM64MOVDnop { 7034 break 7035 } 7036 x5 := y5.Args[0] 7037 if x5.Op != OpARM64MOVBUload { 7038 break 7039 } 7040 if x5.AuxInt != i+5 { 7041 break 7042 } 7043 if x5.Aux != s { 7044 break 7045 } 7046 if p != x5.Args[0] { 7047 break 7048 } 7049 if mem != x5.Args[1] { 7050 break 7051 } 7052 y6 := o0.Args[1] 7053 if y6.Op != OpARM64MOVDnop { 7054 break 7055 } 7056 x6 := y6.Args[0] 7057 if x6.Op != OpARM64MOVBUload { 7058 break 7059 } 7060 if x6.AuxInt != i+6 { 7061 break 7062 } 7063 if x6.Aux != s { 7064 break 7065 } 7066 if p != x6.Args[0] { 7067 break 7068 } 7069 if mem != x6.Args[1] { 7070 break 7071 } 7072 y7 := v.Args[1] 7073 if y7.Op != OpARM64MOVDnop { 7074 break 7075 } 7076 x7 := y7.Args[0] 7077 if x7.Op != OpARM64MOVBUload { 7078 break 7079 } 7080 if x7.AuxInt != i+7 { 7081 break 7082 } 7083 if x7.Aux != s { 7084 break 7085 } 7086 if p != x7.Args[0] { 7087 break 7088 } 7089 if mem != x7.Args[1] { 7090 break 7091 } 7092 if !(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)) { 7093 break 7094 } 7095 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 7096 v0 := b.NewValue0(v.Line, OpARM64REV, t) 7097 v.reset(OpCopy) 7098 v.AddArg(v0) 7099 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7100 v1.Aux = s 7101 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7102 v2.AuxInt = i 7103 v2.AddArg(p) 7104 v1.AddArg(v2) 7105 v1.AddArg(mem) 7106 v0.AddArg(v1) 7107 return true 7108 } 7109 return false 7110 } 7111 func rewriteValueARM64_OpARM64ORconst(v *Value, config *Config) bool { 7112 b := v.Block 7113 _ = b 7114 // match: (ORconst [0] x) 7115 // cond: 7116 // result: x 7117 for { 7118 if v.AuxInt != 0 { 7119 break 7120 } 7121 x := v.Args[0] 7122 v.reset(OpCopy) 7123 v.Type = x.Type 7124 v.AddArg(x) 7125 return true 7126 } 7127 // match: (ORconst [-1] _) 7128 // cond: 7129 // result: (MOVDconst [-1]) 7130 for { 7131 if v.AuxInt != -1 { 7132 break 7133 } 7134 v.reset(OpARM64MOVDconst) 7135 v.AuxInt = -1 7136 return true 7137 } 7138 // match: (ORconst [c] (MOVDconst [d])) 7139 // cond: 7140 // result: (MOVDconst [c|d]) 7141 for { 7142 c := v.AuxInt 7143 v_0 := v.Args[0] 7144 if v_0.Op != OpARM64MOVDconst { 7145 break 7146 } 7147 d := v_0.AuxInt 7148 v.reset(OpARM64MOVDconst) 7149 v.AuxInt = c | d 7150 return true 7151 } 7152 // match: (ORconst [c] (ORconst [d] x)) 7153 // cond: 7154 // result: (ORconst [c|d] x) 7155 for { 7156 c := v.AuxInt 7157 v_0 := v.Args[0] 7158 if v_0.Op != OpARM64ORconst { 7159 break 7160 } 7161 d := v_0.AuxInt 7162 x := v_0.Args[0] 7163 v.reset(OpARM64ORconst) 7164 v.AuxInt = c | d 7165 v.AddArg(x) 7166 return true 7167 } 7168 return false 7169 } 7170 func rewriteValueARM64_OpARM64ORshiftLL(v *Value, config *Config) bool { 7171 b := v.Block 7172 _ = b 7173 // match: (ORshiftLL (MOVDconst [c]) x [d]) 7174 // cond: 7175 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 7176 for { 7177 d := v.AuxInt 7178 v_0 := v.Args[0] 7179 if v_0.Op != OpARM64MOVDconst { 7180 break 7181 } 7182 c := v_0.AuxInt 7183 x := v.Args[1] 7184 v.reset(OpARM64ORconst) 7185 v.AuxInt = c 7186 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 7187 v0.AuxInt = d 7188 v0.AddArg(x) 7189 v.AddArg(v0) 7190 return true 7191 } 7192 // match: (ORshiftLL x (MOVDconst [c]) [d]) 7193 // cond: 7194 // result: (ORconst x [int64(uint64(c)<<uint64(d))]) 7195 for { 7196 d := v.AuxInt 7197 x := v.Args[0] 7198 v_1 := v.Args[1] 7199 if v_1.Op != OpARM64MOVDconst { 7200 break 7201 } 7202 c := v_1.AuxInt 7203 v.reset(OpARM64ORconst) 7204 v.AuxInt = int64(uint64(c) << uint64(d)) 7205 v.AddArg(x) 7206 return true 7207 } 7208 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 7209 // cond: c==d 7210 // result: y 7211 for { 7212 d := v.AuxInt 7213 x := v.Args[0] 7214 y := v.Args[1] 7215 if y.Op != OpARM64SLLconst { 7216 break 7217 } 7218 c := y.AuxInt 7219 if x != y.Args[0] { 7220 break 7221 } 7222 if !(c == d) { 7223 break 7224 } 7225 v.reset(OpCopy) 7226 v.Type = y.Type 7227 v.AddArg(y) 7228 return true 7229 } 7230 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i+1] {s} p mem))) 7231 // cond: 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) 7232 // result: @mergePoint(b,x0,x1) (MOVHUload <t> {s} (OffPtr <p.Type> [i] p) mem) 7233 for { 7234 t := v.Type 7235 if v.AuxInt != 8 { 7236 break 7237 } 7238 y0 := v.Args[0] 7239 if y0.Op != OpARM64MOVDnop { 7240 break 7241 } 7242 x0 := y0.Args[0] 7243 if x0.Op != OpARM64MOVBUload { 7244 break 7245 } 7246 i := x0.AuxInt 7247 s := x0.Aux 7248 p := x0.Args[0] 7249 mem := x0.Args[1] 7250 y1 := v.Args[1] 7251 if y1.Op != OpARM64MOVDnop { 7252 break 7253 } 7254 x1 := y1.Args[0] 7255 if x1.Op != OpARM64MOVBUload { 7256 break 7257 } 7258 if x1.AuxInt != i+1 { 7259 break 7260 } 7261 if x1.Aux != s { 7262 break 7263 } 7264 if p != x1.Args[0] { 7265 break 7266 } 7267 if mem != x1.Args[1] { 7268 break 7269 } 7270 if !(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)) { 7271 break 7272 } 7273 b = mergePoint(b, x0, x1) 7274 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, t) 7275 v.reset(OpCopy) 7276 v.AddArg(v0) 7277 v0.Aux = s 7278 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7279 v1.AuxInt = i 7280 v1.AddArg(p) 7281 v0.AddArg(v1) 7282 v0.AddArg(mem) 7283 return true 7284 } 7285 // match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] x0:(MOVHUload [i] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i+2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i+3] {s} p mem))) 7286 // cond: 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) 7287 // result: @mergePoint(b,x0,x1,x2) (MOVWUload <t> {s} (OffPtr <p.Type> [i] p) mem) 7288 for { 7289 t := v.Type 7290 if v.AuxInt != 24 { 7291 break 7292 } 7293 o0 := v.Args[0] 7294 if o0.Op != OpARM64ORshiftLL { 7295 break 7296 } 7297 if o0.AuxInt != 16 { 7298 break 7299 } 7300 x0 := o0.Args[0] 7301 if x0.Op != OpARM64MOVHUload { 7302 break 7303 } 7304 i := x0.AuxInt 7305 s := x0.Aux 7306 p := x0.Args[0] 7307 mem := x0.Args[1] 7308 y1 := o0.Args[1] 7309 if y1.Op != OpARM64MOVDnop { 7310 break 7311 } 7312 x1 := y1.Args[0] 7313 if x1.Op != OpARM64MOVBUload { 7314 break 7315 } 7316 if x1.AuxInt != i+2 { 7317 break 7318 } 7319 if x1.Aux != s { 7320 break 7321 } 7322 if p != x1.Args[0] { 7323 break 7324 } 7325 if mem != x1.Args[1] { 7326 break 7327 } 7328 y2 := v.Args[1] 7329 if y2.Op != OpARM64MOVDnop { 7330 break 7331 } 7332 x2 := y2.Args[0] 7333 if x2.Op != OpARM64MOVBUload { 7334 break 7335 } 7336 if x2.AuxInt != i+3 { 7337 break 7338 } 7339 if x2.Aux != s { 7340 break 7341 } 7342 if p != x2.Args[0] { 7343 break 7344 } 7345 if mem != x2.Args[1] { 7346 break 7347 } 7348 if !(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)) { 7349 break 7350 } 7351 b = mergePoint(b, x0, x1, x2) 7352 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 7353 v.reset(OpCopy) 7354 v.AddArg(v0) 7355 v0.Aux = s 7356 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7357 v1.AuxInt = i 7358 v1.AddArg(p) 7359 v0.AddArg(v1) 7360 v0.AddArg(mem) 7361 return true 7362 } 7363 // match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i+4] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i+5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i+6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i+7] {s} p mem))) 7364 // cond: 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) 7365 // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload <t> {s} (OffPtr <p.Type> [i] p) mem) 7366 for { 7367 t := v.Type 7368 if v.AuxInt != 56 { 7369 break 7370 } 7371 o0 := v.Args[0] 7372 if o0.Op != OpARM64ORshiftLL { 7373 break 7374 } 7375 if o0.AuxInt != 48 { 7376 break 7377 } 7378 o1 := o0.Args[0] 7379 if o1.Op != OpARM64ORshiftLL { 7380 break 7381 } 7382 if o1.AuxInt != 40 { 7383 break 7384 } 7385 o2 := o1.Args[0] 7386 if o2.Op != OpARM64ORshiftLL { 7387 break 7388 } 7389 if o2.AuxInt != 32 { 7390 break 7391 } 7392 x0 := o2.Args[0] 7393 if x0.Op != OpARM64MOVWUload { 7394 break 7395 } 7396 i := x0.AuxInt 7397 s := x0.Aux 7398 p := x0.Args[0] 7399 mem := x0.Args[1] 7400 y1 := o2.Args[1] 7401 if y1.Op != OpARM64MOVDnop { 7402 break 7403 } 7404 x1 := y1.Args[0] 7405 if x1.Op != OpARM64MOVBUload { 7406 break 7407 } 7408 if x1.AuxInt != i+4 { 7409 break 7410 } 7411 if x1.Aux != s { 7412 break 7413 } 7414 if p != x1.Args[0] { 7415 break 7416 } 7417 if mem != x1.Args[1] { 7418 break 7419 } 7420 y2 := o1.Args[1] 7421 if y2.Op != OpARM64MOVDnop { 7422 break 7423 } 7424 x2 := y2.Args[0] 7425 if x2.Op != OpARM64MOVBUload { 7426 break 7427 } 7428 if x2.AuxInt != i+5 { 7429 break 7430 } 7431 if x2.Aux != s { 7432 break 7433 } 7434 if p != x2.Args[0] { 7435 break 7436 } 7437 if mem != x2.Args[1] { 7438 break 7439 } 7440 y3 := o0.Args[1] 7441 if y3.Op != OpARM64MOVDnop { 7442 break 7443 } 7444 x3 := y3.Args[0] 7445 if x3.Op != OpARM64MOVBUload { 7446 break 7447 } 7448 if x3.AuxInt != i+6 { 7449 break 7450 } 7451 if x3.Aux != s { 7452 break 7453 } 7454 if p != x3.Args[0] { 7455 break 7456 } 7457 if mem != x3.Args[1] { 7458 break 7459 } 7460 y4 := v.Args[1] 7461 if y4.Op != OpARM64MOVDnop { 7462 break 7463 } 7464 x4 := y4.Args[0] 7465 if x4.Op != OpARM64MOVBUload { 7466 break 7467 } 7468 if x4.AuxInt != i+7 { 7469 break 7470 } 7471 if x4.Aux != s { 7472 break 7473 } 7474 if p != x4.Args[0] { 7475 break 7476 } 7477 if mem != x4.Args[1] { 7478 break 7479 } 7480 if !(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)) { 7481 break 7482 } 7483 b = mergePoint(b, x0, x1, x2, x3, x4) 7484 v0 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7485 v.reset(OpCopy) 7486 v.AddArg(v0) 7487 v0.Aux = s 7488 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7489 v1.AuxInt = i 7490 v1.AddArg(p) 7491 v0.AddArg(v1) 7492 v0.AddArg(mem) 7493 return true 7494 } 7495 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) 7496 // cond: ((i-1)%2 == 0 || i-1<256 && i-1>-256 && !isArg(s) && !isAuto(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) 7497 // result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUload <t> [i-1] {s} p mem)) 7498 for { 7499 t := v.Type 7500 if v.AuxInt != 8 { 7501 break 7502 } 7503 y0 := v.Args[0] 7504 if y0.Op != OpARM64MOVDnop { 7505 break 7506 } 7507 x0 := y0.Args[0] 7508 if x0.Op != OpARM64MOVBUload { 7509 break 7510 } 7511 i := x0.AuxInt 7512 s := x0.Aux 7513 p := x0.Args[0] 7514 mem := x0.Args[1] 7515 y1 := v.Args[1] 7516 if y1.Op != OpARM64MOVDnop { 7517 break 7518 } 7519 x1 := y1.Args[0] 7520 if x1.Op != OpARM64MOVBUload { 7521 break 7522 } 7523 if x1.AuxInt != i-1 { 7524 break 7525 } 7526 if x1.Aux != s { 7527 break 7528 } 7529 if p != x1.Args[0] { 7530 break 7531 } 7532 if mem != x1.Args[1] { 7533 break 7534 } 7535 if !(((i-1)%2 == 0 || i-1 < 256 && i-1 > -256 && !isArg(s) && !isAuto(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)) { 7536 break 7537 } 7538 b = mergePoint(b, x0, x1) 7539 v0 := b.NewValue0(v.Line, OpARM64REV16W, t) 7540 v.reset(OpCopy) 7541 v.AddArg(v0) 7542 v1 := b.NewValue0(v.Line, OpARM64MOVHUload, t) 7543 v1.AuxInt = i - 1 7544 v1.Aux = s 7545 v1.AddArg(p) 7546 v1.AddArg(mem) 7547 v0.AddArg(v1) 7548 return true 7549 } 7550 // match: (ORshiftLL <t> [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i-2] {s} p mem))) 7551 // cond: 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) 7552 // result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i-2] p) mem)) 7553 for { 7554 t := v.Type 7555 if v.AuxInt != 24 { 7556 break 7557 } 7558 o0 := v.Args[0] 7559 if o0.Op != OpARM64ORshiftLL { 7560 break 7561 } 7562 if o0.AuxInt != 16 { 7563 break 7564 } 7565 y0 := o0.Args[0] 7566 if y0.Op != OpARM64REV16W { 7567 break 7568 } 7569 x0 := y0.Args[0] 7570 if x0.Op != OpARM64MOVHUload { 7571 break 7572 } 7573 i := x0.AuxInt 7574 s := x0.Aux 7575 p := x0.Args[0] 7576 mem := x0.Args[1] 7577 y1 := o0.Args[1] 7578 if y1.Op != OpARM64MOVDnop { 7579 break 7580 } 7581 x1 := y1.Args[0] 7582 if x1.Op != OpARM64MOVBUload { 7583 break 7584 } 7585 if x1.AuxInt != i-1 { 7586 break 7587 } 7588 if x1.Aux != s { 7589 break 7590 } 7591 if p != x1.Args[0] { 7592 break 7593 } 7594 if mem != x1.Args[1] { 7595 break 7596 } 7597 y2 := v.Args[1] 7598 if y2.Op != OpARM64MOVDnop { 7599 break 7600 } 7601 x2 := y2.Args[0] 7602 if x2.Op != OpARM64MOVBUload { 7603 break 7604 } 7605 if x2.AuxInt != i-2 { 7606 break 7607 } 7608 if x2.Aux != s { 7609 break 7610 } 7611 if p != x2.Args[0] { 7612 break 7613 } 7614 if mem != x2.Args[1] { 7615 break 7616 } 7617 if !(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)) { 7618 break 7619 } 7620 b = mergePoint(b, x0, x1, x2) 7621 v0 := b.NewValue0(v.Line, OpARM64REVW, t) 7622 v.reset(OpCopy) 7623 v.AddArg(v0) 7624 v1 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 7625 v1.Aux = s 7626 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7627 v2.AuxInt = i - 2 7628 v2.AddArg(p) 7629 v1.AddArg(v2) 7630 v1.AddArg(mem) 7631 v0.AddArg(v1) 7632 return true 7633 } 7634 // match: (ORshiftLL <t> [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i-2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i-3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i-4] {s} p mem))) 7635 // cond: 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) 7636 // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i-4] p) mem)) 7637 for { 7638 t := v.Type 7639 if v.AuxInt != 56 { 7640 break 7641 } 7642 o0 := v.Args[0] 7643 if o0.Op != OpARM64ORshiftLL { 7644 break 7645 } 7646 if o0.AuxInt != 48 { 7647 break 7648 } 7649 o1 := o0.Args[0] 7650 if o1.Op != OpARM64ORshiftLL { 7651 break 7652 } 7653 if o1.AuxInt != 40 { 7654 break 7655 } 7656 o2 := o1.Args[0] 7657 if o2.Op != OpARM64ORshiftLL { 7658 break 7659 } 7660 if o2.AuxInt != 32 { 7661 break 7662 } 7663 y0 := o2.Args[0] 7664 if y0.Op != OpARM64REVW { 7665 break 7666 } 7667 x0 := y0.Args[0] 7668 if x0.Op != OpARM64MOVWUload { 7669 break 7670 } 7671 i := x0.AuxInt 7672 s := x0.Aux 7673 p := x0.Args[0] 7674 mem := x0.Args[1] 7675 y1 := o2.Args[1] 7676 if y1.Op != OpARM64MOVDnop { 7677 break 7678 } 7679 x1 := y1.Args[0] 7680 if x1.Op != OpARM64MOVBUload { 7681 break 7682 } 7683 if x1.AuxInt != i-1 { 7684 break 7685 } 7686 if x1.Aux != s { 7687 break 7688 } 7689 if p != x1.Args[0] { 7690 break 7691 } 7692 if mem != x1.Args[1] { 7693 break 7694 } 7695 y2 := o1.Args[1] 7696 if y2.Op != OpARM64MOVDnop { 7697 break 7698 } 7699 x2 := y2.Args[0] 7700 if x2.Op != OpARM64MOVBUload { 7701 break 7702 } 7703 if x2.AuxInt != i-2 { 7704 break 7705 } 7706 if x2.Aux != s { 7707 break 7708 } 7709 if p != x2.Args[0] { 7710 break 7711 } 7712 if mem != x2.Args[1] { 7713 break 7714 } 7715 y3 := o0.Args[1] 7716 if y3.Op != OpARM64MOVDnop { 7717 break 7718 } 7719 x3 := y3.Args[0] 7720 if x3.Op != OpARM64MOVBUload { 7721 break 7722 } 7723 if x3.AuxInt != i-3 { 7724 break 7725 } 7726 if x3.Aux != s { 7727 break 7728 } 7729 if p != x3.Args[0] { 7730 break 7731 } 7732 if mem != x3.Args[1] { 7733 break 7734 } 7735 y4 := v.Args[1] 7736 if y4.Op != OpARM64MOVDnop { 7737 break 7738 } 7739 x4 := y4.Args[0] 7740 if x4.Op != OpARM64MOVBUload { 7741 break 7742 } 7743 if x4.AuxInt != i-4 { 7744 break 7745 } 7746 if x4.Aux != s { 7747 break 7748 } 7749 if p != x4.Args[0] { 7750 break 7751 } 7752 if mem != x4.Args[1] { 7753 break 7754 } 7755 if !(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)) { 7756 break 7757 } 7758 b = mergePoint(b, x0, x1, x2, x3, x4) 7759 v0 := b.NewValue0(v.Line, OpARM64REV, t) 7760 v.reset(OpCopy) 7761 v.AddArg(v0) 7762 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7763 v1.Aux = s 7764 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7765 v2.AuxInt = i - 4 7766 v2.AddArg(p) 7767 v1.AddArg(v2) 7768 v1.AddArg(mem) 7769 v0.AddArg(v1) 7770 return true 7771 } 7772 return false 7773 } 7774 func rewriteValueARM64_OpARM64ORshiftRA(v *Value, config *Config) bool { 7775 b := v.Block 7776 _ = b 7777 // match: (ORshiftRA (MOVDconst [c]) x [d]) 7778 // cond: 7779 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 7780 for { 7781 d := v.AuxInt 7782 v_0 := v.Args[0] 7783 if v_0.Op != OpARM64MOVDconst { 7784 break 7785 } 7786 c := v_0.AuxInt 7787 x := v.Args[1] 7788 v.reset(OpARM64ORconst) 7789 v.AuxInt = c 7790 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 7791 v0.AuxInt = d 7792 v0.AddArg(x) 7793 v.AddArg(v0) 7794 return true 7795 } 7796 // match: (ORshiftRA x (MOVDconst [c]) [d]) 7797 // cond: 7798 // result: (ORconst x [int64(int64(c)>>uint64(d))]) 7799 for { 7800 d := v.AuxInt 7801 x := v.Args[0] 7802 v_1 := v.Args[1] 7803 if v_1.Op != OpARM64MOVDconst { 7804 break 7805 } 7806 c := v_1.AuxInt 7807 v.reset(OpARM64ORconst) 7808 v.AuxInt = int64(int64(c) >> uint64(d)) 7809 v.AddArg(x) 7810 return true 7811 } 7812 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 7813 // cond: c==d 7814 // result: y 7815 for { 7816 d := v.AuxInt 7817 x := v.Args[0] 7818 y := v.Args[1] 7819 if y.Op != OpARM64SRAconst { 7820 break 7821 } 7822 c := y.AuxInt 7823 if x != y.Args[0] { 7824 break 7825 } 7826 if !(c == d) { 7827 break 7828 } 7829 v.reset(OpCopy) 7830 v.Type = y.Type 7831 v.AddArg(y) 7832 return true 7833 } 7834 return false 7835 } 7836 func rewriteValueARM64_OpARM64ORshiftRL(v *Value, config *Config) bool { 7837 b := v.Block 7838 _ = b 7839 // match: (ORshiftRL (MOVDconst [c]) x [d]) 7840 // cond: 7841 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 7842 for { 7843 d := v.AuxInt 7844 v_0 := v.Args[0] 7845 if v_0.Op != OpARM64MOVDconst { 7846 break 7847 } 7848 c := v_0.AuxInt 7849 x := v.Args[1] 7850 v.reset(OpARM64ORconst) 7851 v.AuxInt = c 7852 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 7853 v0.AuxInt = d 7854 v0.AddArg(x) 7855 v.AddArg(v0) 7856 return true 7857 } 7858 // match: (ORshiftRL x (MOVDconst [c]) [d]) 7859 // cond: 7860 // result: (ORconst x [int64(uint64(c)>>uint64(d))]) 7861 for { 7862 d := v.AuxInt 7863 x := v.Args[0] 7864 v_1 := v.Args[1] 7865 if v_1.Op != OpARM64MOVDconst { 7866 break 7867 } 7868 c := v_1.AuxInt 7869 v.reset(OpARM64ORconst) 7870 v.AuxInt = int64(uint64(c) >> uint64(d)) 7871 v.AddArg(x) 7872 return true 7873 } 7874 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 7875 // cond: c==d 7876 // result: y 7877 for { 7878 d := v.AuxInt 7879 x := v.Args[0] 7880 y := v.Args[1] 7881 if y.Op != OpARM64SRLconst { 7882 break 7883 } 7884 c := y.AuxInt 7885 if x != y.Args[0] { 7886 break 7887 } 7888 if !(c == d) { 7889 break 7890 } 7891 v.reset(OpCopy) 7892 v.Type = y.Type 7893 v.AddArg(y) 7894 return true 7895 } 7896 return false 7897 } 7898 func rewriteValueARM64_OpARM64SLL(v *Value, config *Config) bool { 7899 b := v.Block 7900 _ = b 7901 // match: (SLL x (MOVDconst [c])) 7902 // cond: 7903 // result: (SLLconst x [c&63]) 7904 for { 7905 x := v.Args[0] 7906 v_1 := v.Args[1] 7907 if v_1.Op != OpARM64MOVDconst { 7908 break 7909 } 7910 c := v_1.AuxInt 7911 v.reset(OpARM64SLLconst) 7912 v.AuxInt = c & 63 7913 v.AddArg(x) 7914 return true 7915 } 7916 return false 7917 } 7918 func rewriteValueARM64_OpARM64SLLconst(v *Value, config *Config) bool { 7919 b := v.Block 7920 _ = b 7921 // match: (SLLconst [c] (MOVDconst [d])) 7922 // cond: 7923 // result: (MOVDconst [int64(d)<<uint64(c)]) 7924 for { 7925 c := v.AuxInt 7926 v_0 := v.Args[0] 7927 if v_0.Op != OpARM64MOVDconst { 7928 break 7929 } 7930 d := v_0.AuxInt 7931 v.reset(OpARM64MOVDconst) 7932 v.AuxInt = int64(d) << uint64(c) 7933 return true 7934 } 7935 return false 7936 } 7937 func rewriteValueARM64_OpARM64SRA(v *Value, config *Config) bool { 7938 b := v.Block 7939 _ = b 7940 // match: (SRA x (MOVDconst [c])) 7941 // cond: 7942 // result: (SRAconst x [c&63]) 7943 for { 7944 x := v.Args[0] 7945 v_1 := v.Args[1] 7946 if v_1.Op != OpARM64MOVDconst { 7947 break 7948 } 7949 c := v_1.AuxInt 7950 v.reset(OpARM64SRAconst) 7951 v.AuxInt = c & 63 7952 v.AddArg(x) 7953 return true 7954 } 7955 return false 7956 } 7957 func rewriteValueARM64_OpARM64SRAconst(v *Value, config *Config) bool { 7958 b := v.Block 7959 _ = b 7960 // match: (SRAconst [c] (MOVDconst [d])) 7961 // cond: 7962 // result: (MOVDconst [int64(d)>>uint64(c)]) 7963 for { 7964 c := v.AuxInt 7965 v_0 := v.Args[0] 7966 if v_0.Op != OpARM64MOVDconst { 7967 break 7968 } 7969 d := v_0.AuxInt 7970 v.reset(OpARM64MOVDconst) 7971 v.AuxInt = int64(d) >> uint64(c) 7972 return true 7973 } 7974 return false 7975 } 7976 func rewriteValueARM64_OpARM64SRL(v *Value, config *Config) bool { 7977 b := v.Block 7978 _ = b 7979 // match: (SRL x (MOVDconst [c])) 7980 // cond: 7981 // result: (SRLconst x [c&63]) 7982 for { 7983 x := v.Args[0] 7984 v_1 := v.Args[1] 7985 if v_1.Op != OpARM64MOVDconst { 7986 break 7987 } 7988 c := v_1.AuxInt 7989 v.reset(OpARM64SRLconst) 7990 v.AuxInt = c & 63 7991 v.AddArg(x) 7992 return true 7993 } 7994 return false 7995 } 7996 func rewriteValueARM64_OpARM64SRLconst(v *Value, config *Config) bool { 7997 b := v.Block 7998 _ = b 7999 // match: (SRLconst [c] (MOVDconst [d])) 8000 // cond: 8001 // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) 8002 for { 8003 c := v.AuxInt 8004 v_0 := v.Args[0] 8005 if v_0.Op != OpARM64MOVDconst { 8006 break 8007 } 8008 d := v_0.AuxInt 8009 v.reset(OpARM64MOVDconst) 8010 v.AuxInt = int64(uint64(d) >> uint64(c)) 8011 return true 8012 } 8013 return false 8014 } 8015 func rewriteValueARM64_OpARM64SUB(v *Value, config *Config) bool { 8016 b := v.Block 8017 _ = b 8018 // match: (SUB x (MOVDconst [c])) 8019 // cond: 8020 // result: (SUBconst [c] x) 8021 for { 8022 x := v.Args[0] 8023 v_1 := v.Args[1] 8024 if v_1.Op != OpARM64MOVDconst { 8025 break 8026 } 8027 c := v_1.AuxInt 8028 v.reset(OpARM64SUBconst) 8029 v.AuxInt = c 8030 v.AddArg(x) 8031 return true 8032 } 8033 // match: (SUB x x) 8034 // cond: 8035 // result: (MOVDconst [0]) 8036 for { 8037 x := v.Args[0] 8038 if x != v.Args[1] { 8039 break 8040 } 8041 v.reset(OpARM64MOVDconst) 8042 v.AuxInt = 0 8043 return true 8044 } 8045 // match: (SUB x (SLLconst [c] y)) 8046 // cond: 8047 // result: (SUBshiftLL x y [c]) 8048 for { 8049 x := v.Args[0] 8050 v_1 := v.Args[1] 8051 if v_1.Op != OpARM64SLLconst { 8052 break 8053 } 8054 c := v_1.AuxInt 8055 y := v_1.Args[0] 8056 v.reset(OpARM64SUBshiftLL) 8057 v.AuxInt = c 8058 v.AddArg(x) 8059 v.AddArg(y) 8060 return true 8061 } 8062 // match: (SUB x (SRLconst [c] y)) 8063 // cond: 8064 // result: (SUBshiftRL x y [c]) 8065 for { 8066 x := v.Args[0] 8067 v_1 := v.Args[1] 8068 if v_1.Op != OpARM64SRLconst { 8069 break 8070 } 8071 c := v_1.AuxInt 8072 y := v_1.Args[0] 8073 v.reset(OpARM64SUBshiftRL) 8074 v.AuxInt = c 8075 v.AddArg(x) 8076 v.AddArg(y) 8077 return true 8078 } 8079 // match: (SUB x (SRAconst [c] y)) 8080 // cond: 8081 // result: (SUBshiftRA x y [c]) 8082 for { 8083 x := v.Args[0] 8084 v_1 := v.Args[1] 8085 if v_1.Op != OpARM64SRAconst { 8086 break 8087 } 8088 c := v_1.AuxInt 8089 y := v_1.Args[0] 8090 v.reset(OpARM64SUBshiftRA) 8091 v.AuxInt = c 8092 v.AddArg(x) 8093 v.AddArg(y) 8094 return true 8095 } 8096 return false 8097 } 8098 func rewriteValueARM64_OpARM64SUBconst(v *Value, config *Config) bool { 8099 b := v.Block 8100 _ = b 8101 // match: (SUBconst [0] x) 8102 // cond: 8103 // result: x 8104 for { 8105 if v.AuxInt != 0 { 8106 break 8107 } 8108 x := v.Args[0] 8109 v.reset(OpCopy) 8110 v.Type = x.Type 8111 v.AddArg(x) 8112 return true 8113 } 8114 // match: (SUBconst [c] (MOVDconst [d])) 8115 // cond: 8116 // result: (MOVDconst [d-c]) 8117 for { 8118 c := v.AuxInt 8119 v_0 := v.Args[0] 8120 if v_0.Op != OpARM64MOVDconst { 8121 break 8122 } 8123 d := v_0.AuxInt 8124 v.reset(OpARM64MOVDconst) 8125 v.AuxInt = d - c 8126 return true 8127 } 8128 // match: (SUBconst [c] (SUBconst [d] x)) 8129 // cond: 8130 // result: (ADDconst [-c-d] x) 8131 for { 8132 c := v.AuxInt 8133 v_0 := v.Args[0] 8134 if v_0.Op != OpARM64SUBconst { 8135 break 8136 } 8137 d := v_0.AuxInt 8138 x := v_0.Args[0] 8139 v.reset(OpARM64ADDconst) 8140 v.AuxInt = -c - d 8141 v.AddArg(x) 8142 return true 8143 } 8144 // match: (SUBconst [c] (ADDconst [d] x)) 8145 // cond: 8146 // result: (ADDconst [-c+d] x) 8147 for { 8148 c := v.AuxInt 8149 v_0 := v.Args[0] 8150 if v_0.Op != OpARM64ADDconst { 8151 break 8152 } 8153 d := v_0.AuxInt 8154 x := v_0.Args[0] 8155 v.reset(OpARM64ADDconst) 8156 v.AuxInt = -c + d 8157 v.AddArg(x) 8158 return true 8159 } 8160 return false 8161 } 8162 func rewriteValueARM64_OpARM64SUBshiftLL(v *Value, config *Config) bool { 8163 b := v.Block 8164 _ = b 8165 // match: (SUBshiftLL x (MOVDconst [c]) [d]) 8166 // cond: 8167 // result: (SUBconst x [int64(uint64(c)<<uint64(d))]) 8168 for { 8169 d := v.AuxInt 8170 x := v.Args[0] 8171 v_1 := v.Args[1] 8172 if v_1.Op != OpARM64MOVDconst { 8173 break 8174 } 8175 c := v_1.AuxInt 8176 v.reset(OpARM64SUBconst) 8177 v.AuxInt = int64(uint64(c) << uint64(d)) 8178 v.AddArg(x) 8179 return true 8180 } 8181 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 8182 // cond: c==d 8183 // result: (MOVDconst [0]) 8184 for { 8185 d := v.AuxInt 8186 x := v.Args[0] 8187 v_1 := v.Args[1] 8188 if v_1.Op != OpARM64SLLconst { 8189 break 8190 } 8191 c := v_1.AuxInt 8192 if x != v_1.Args[0] { 8193 break 8194 } 8195 if !(c == d) { 8196 break 8197 } 8198 v.reset(OpARM64MOVDconst) 8199 v.AuxInt = 0 8200 return true 8201 } 8202 return false 8203 } 8204 func rewriteValueARM64_OpARM64SUBshiftRA(v *Value, config *Config) bool { 8205 b := v.Block 8206 _ = b 8207 // match: (SUBshiftRA x (MOVDconst [c]) [d]) 8208 // cond: 8209 // result: (SUBconst x [int64(int64(c)>>uint64(d))]) 8210 for { 8211 d := v.AuxInt 8212 x := v.Args[0] 8213 v_1 := v.Args[1] 8214 if v_1.Op != OpARM64MOVDconst { 8215 break 8216 } 8217 c := v_1.AuxInt 8218 v.reset(OpARM64SUBconst) 8219 v.AuxInt = int64(int64(c) >> uint64(d)) 8220 v.AddArg(x) 8221 return true 8222 } 8223 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 8224 // cond: c==d 8225 // result: (MOVDconst [0]) 8226 for { 8227 d := v.AuxInt 8228 x := v.Args[0] 8229 v_1 := v.Args[1] 8230 if v_1.Op != OpARM64SRAconst { 8231 break 8232 } 8233 c := v_1.AuxInt 8234 if x != v_1.Args[0] { 8235 break 8236 } 8237 if !(c == d) { 8238 break 8239 } 8240 v.reset(OpARM64MOVDconst) 8241 v.AuxInt = 0 8242 return true 8243 } 8244 return false 8245 } 8246 func rewriteValueARM64_OpARM64SUBshiftRL(v *Value, config *Config) bool { 8247 b := v.Block 8248 _ = b 8249 // match: (SUBshiftRL x (MOVDconst [c]) [d]) 8250 // cond: 8251 // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) 8252 for { 8253 d := v.AuxInt 8254 x := v.Args[0] 8255 v_1 := v.Args[1] 8256 if v_1.Op != OpARM64MOVDconst { 8257 break 8258 } 8259 c := v_1.AuxInt 8260 v.reset(OpARM64SUBconst) 8261 v.AuxInt = int64(uint64(c) >> uint64(d)) 8262 v.AddArg(x) 8263 return true 8264 } 8265 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 8266 // cond: c==d 8267 // result: (MOVDconst [0]) 8268 for { 8269 d := v.AuxInt 8270 x := v.Args[0] 8271 v_1 := v.Args[1] 8272 if v_1.Op != OpARM64SRLconst { 8273 break 8274 } 8275 c := v_1.AuxInt 8276 if x != v_1.Args[0] { 8277 break 8278 } 8279 if !(c == d) { 8280 break 8281 } 8282 v.reset(OpARM64MOVDconst) 8283 v.AuxInt = 0 8284 return true 8285 } 8286 return false 8287 } 8288 func rewriteValueARM64_OpARM64UDIV(v *Value, config *Config) bool { 8289 b := v.Block 8290 _ = b 8291 // match: (UDIV x (MOVDconst [1])) 8292 // cond: 8293 // result: x 8294 for { 8295 x := v.Args[0] 8296 v_1 := v.Args[1] 8297 if v_1.Op != OpARM64MOVDconst { 8298 break 8299 } 8300 if v_1.AuxInt != 1 { 8301 break 8302 } 8303 v.reset(OpCopy) 8304 v.Type = x.Type 8305 v.AddArg(x) 8306 return true 8307 } 8308 // match: (UDIV x (MOVDconst [c])) 8309 // cond: isPowerOfTwo(c) 8310 // result: (SRLconst [log2(c)] x) 8311 for { 8312 x := v.Args[0] 8313 v_1 := v.Args[1] 8314 if v_1.Op != OpARM64MOVDconst { 8315 break 8316 } 8317 c := v_1.AuxInt 8318 if !(isPowerOfTwo(c)) { 8319 break 8320 } 8321 v.reset(OpARM64SRLconst) 8322 v.AuxInt = log2(c) 8323 v.AddArg(x) 8324 return true 8325 } 8326 // match: (UDIV (MOVDconst [c]) (MOVDconst [d])) 8327 // cond: 8328 // result: (MOVDconst [int64(uint64(c)/uint64(d))]) 8329 for { 8330 v_0 := v.Args[0] 8331 if v_0.Op != OpARM64MOVDconst { 8332 break 8333 } 8334 c := v_0.AuxInt 8335 v_1 := v.Args[1] 8336 if v_1.Op != OpARM64MOVDconst { 8337 break 8338 } 8339 d := v_1.AuxInt 8340 v.reset(OpARM64MOVDconst) 8341 v.AuxInt = int64(uint64(c) / uint64(d)) 8342 return true 8343 } 8344 return false 8345 } 8346 func rewriteValueARM64_OpARM64UDIVW(v *Value, config *Config) bool { 8347 b := v.Block 8348 _ = b 8349 // match: (UDIVW x (MOVDconst [c])) 8350 // cond: uint32(c)==1 8351 // result: x 8352 for { 8353 x := v.Args[0] 8354 v_1 := v.Args[1] 8355 if v_1.Op != OpARM64MOVDconst { 8356 break 8357 } 8358 c := v_1.AuxInt 8359 if !(uint32(c) == 1) { 8360 break 8361 } 8362 v.reset(OpCopy) 8363 v.Type = x.Type 8364 v.AddArg(x) 8365 return true 8366 } 8367 // match: (UDIVW x (MOVDconst [c])) 8368 // cond: isPowerOfTwo(c) && is32Bit(c) 8369 // result: (SRLconst [log2(c)] x) 8370 for { 8371 x := v.Args[0] 8372 v_1 := v.Args[1] 8373 if v_1.Op != OpARM64MOVDconst { 8374 break 8375 } 8376 c := v_1.AuxInt 8377 if !(isPowerOfTwo(c) && is32Bit(c)) { 8378 break 8379 } 8380 v.reset(OpARM64SRLconst) 8381 v.AuxInt = log2(c) 8382 v.AddArg(x) 8383 return true 8384 } 8385 // match: (UDIVW (MOVDconst [c]) (MOVDconst [d])) 8386 // cond: 8387 // result: (MOVDconst [int64(uint32(c)/uint32(d))]) 8388 for { 8389 v_0 := v.Args[0] 8390 if v_0.Op != OpARM64MOVDconst { 8391 break 8392 } 8393 c := v_0.AuxInt 8394 v_1 := v.Args[1] 8395 if v_1.Op != OpARM64MOVDconst { 8396 break 8397 } 8398 d := v_1.AuxInt 8399 v.reset(OpARM64MOVDconst) 8400 v.AuxInt = int64(uint32(c) / uint32(d)) 8401 return true 8402 } 8403 return false 8404 } 8405 func rewriteValueARM64_OpARM64UMOD(v *Value, config *Config) bool { 8406 b := v.Block 8407 _ = b 8408 // match: (UMOD _ (MOVDconst [1])) 8409 // cond: 8410 // result: (MOVDconst [0]) 8411 for { 8412 v_1 := v.Args[1] 8413 if v_1.Op != OpARM64MOVDconst { 8414 break 8415 } 8416 if v_1.AuxInt != 1 { 8417 break 8418 } 8419 v.reset(OpARM64MOVDconst) 8420 v.AuxInt = 0 8421 return true 8422 } 8423 // match: (UMOD x (MOVDconst [c])) 8424 // cond: isPowerOfTwo(c) 8425 // result: (ANDconst [c-1] x) 8426 for { 8427 x := v.Args[0] 8428 v_1 := v.Args[1] 8429 if v_1.Op != OpARM64MOVDconst { 8430 break 8431 } 8432 c := v_1.AuxInt 8433 if !(isPowerOfTwo(c)) { 8434 break 8435 } 8436 v.reset(OpARM64ANDconst) 8437 v.AuxInt = c - 1 8438 v.AddArg(x) 8439 return true 8440 } 8441 // match: (UMOD (MOVDconst [c]) (MOVDconst [d])) 8442 // cond: 8443 // result: (MOVDconst [int64(uint64(c)%uint64(d))]) 8444 for { 8445 v_0 := v.Args[0] 8446 if v_0.Op != OpARM64MOVDconst { 8447 break 8448 } 8449 c := v_0.AuxInt 8450 v_1 := v.Args[1] 8451 if v_1.Op != OpARM64MOVDconst { 8452 break 8453 } 8454 d := v_1.AuxInt 8455 v.reset(OpARM64MOVDconst) 8456 v.AuxInt = int64(uint64(c) % uint64(d)) 8457 return true 8458 } 8459 return false 8460 } 8461 func rewriteValueARM64_OpARM64UMODW(v *Value, config *Config) bool { 8462 b := v.Block 8463 _ = b 8464 // match: (UMODW _ (MOVDconst [c])) 8465 // cond: uint32(c)==1 8466 // result: (MOVDconst [0]) 8467 for { 8468 v_1 := v.Args[1] 8469 if v_1.Op != OpARM64MOVDconst { 8470 break 8471 } 8472 c := v_1.AuxInt 8473 if !(uint32(c) == 1) { 8474 break 8475 } 8476 v.reset(OpARM64MOVDconst) 8477 v.AuxInt = 0 8478 return true 8479 } 8480 // match: (UMODW x (MOVDconst [c])) 8481 // cond: isPowerOfTwo(c) && is32Bit(c) 8482 // result: (ANDconst [c-1] x) 8483 for { 8484 x := v.Args[0] 8485 v_1 := v.Args[1] 8486 if v_1.Op != OpARM64MOVDconst { 8487 break 8488 } 8489 c := v_1.AuxInt 8490 if !(isPowerOfTwo(c) && is32Bit(c)) { 8491 break 8492 } 8493 v.reset(OpARM64ANDconst) 8494 v.AuxInt = c - 1 8495 v.AddArg(x) 8496 return true 8497 } 8498 // match: (UMODW (MOVDconst [c]) (MOVDconst [d])) 8499 // cond: 8500 // result: (MOVDconst [int64(uint32(c)%uint32(d))]) 8501 for { 8502 v_0 := v.Args[0] 8503 if v_0.Op != OpARM64MOVDconst { 8504 break 8505 } 8506 c := v_0.AuxInt 8507 v_1 := v.Args[1] 8508 if v_1.Op != OpARM64MOVDconst { 8509 break 8510 } 8511 d := v_1.AuxInt 8512 v.reset(OpARM64MOVDconst) 8513 v.AuxInt = int64(uint32(c) % uint32(d)) 8514 return true 8515 } 8516 return false 8517 } 8518 func rewriteValueARM64_OpARM64XOR(v *Value, config *Config) bool { 8519 b := v.Block 8520 _ = b 8521 // match: (XOR (MOVDconst [c]) x) 8522 // cond: 8523 // result: (XORconst [c] x) 8524 for { 8525 v_0 := v.Args[0] 8526 if v_0.Op != OpARM64MOVDconst { 8527 break 8528 } 8529 c := v_0.AuxInt 8530 x := v.Args[1] 8531 v.reset(OpARM64XORconst) 8532 v.AuxInt = c 8533 v.AddArg(x) 8534 return true 8535 } 8536 // match: (XOR x (MOVDconst [c])) 8537 // cond: 8538 // result: (XORconst [c] x) 8539 for { 8540 x := v.Args[0] 8541 v_1 := v.Args[1] 8542 if v_1.Op != OpARM64MOVDconst { 8543 break 8544 } 8545 c := v_1.AuxInt 8546 v.reset(OpARM64XORconst) 8547 v.AuxInt = c 8548 v.AddArg(x) 8549 return true 8550 } 8551 // match: (XOR x x) 8552 // cond: 8553 // result: (MOVDconst [0]) 8554 for { 8555 x := v.Args[0] 8556 if x != v.Args[1] { 8557 break 8558 } 8559 v.reset(OpARM64MOVDconst) 8560 v.AuxInt = 0 8561 return true 8562 } 8563 // match: (XOR x (SLLconst [c] y)) 8564 // cond: 8565 // result: (XORshiftLL x y [c]) 8566 for { 8567 x := v.Args[0] 8568 v_1 := v.Args[1] 8569 if v_1.Op != OpARM64SLLconst { 8570 break 8571 } 8572 c := v_1.AuxInt 8573 y := v_1.Args[0] 8574 v.reset(OpARM64XORshiftLL) 8575 v.AuxInt = c 8576 v.AddArg(x) 8577 v.AddArg(y) 8578 return true 8579 } 8580 // match: (XOR (SLLconst [c] y) x) 8581 // cond: 8582 // result: (XORshiftLL x y [c]) 8583 for { 8584 v_0 := v.Args[0] 8585 if v_0.Op != OpARM64SLLconst { 8586 break 8587 } 8588 c := v_0.AuxInt 8589 y := v_0.Args[0] 8590 x := v.Args[1] 8591 v.reset(OpARM64XORshiftLL) 8592 v.AuxInt = c 8593 v.AddArg(x) 8594 v.AddArg(y) 8595 return true 8596 } 8597 // match: (XOR x (SRLconst [c] y)) 8598 // cond: 8599 // result: (XORshiftRL x y [c]) 8600 for { 8601 x := v.Args[0] 8602 v_1 := v.Args[1] 8603 if v_1.Op != OpARM64SRLconst { 8604 break 8605 } 8606 c := v_1.AuxInt 8607 y := v_1.Args[0] 8608 v.reset(OpARM64XORshiftRL) 8609 v.AuxInt = c 8610 v.AddArg(x) 8611 v.AddArg(y) 8612 return true 8613 } 8614 // match: (XOR (SRLconst [c] y) x) 8615 // cond: 8616 // result: (XORshiftRL x y [c]) 8617 for { 8618 v_0 := v.Args[0] 8619 if v_0.Op != OpARM64SRLconst { 8620 break 8621 } 8622 c := v_0.AuxInt 8623 y := v_0.Args[0] 8624 x := v.Args[1] 8625 v.reset(OpARM64XORshiftRL) 8626 v.AuxInt = c 8627 v.AddArg(x) 8628 v.AddArg(y) 8629 return true 8630 } 8631 // match: (XOR x (SRAconst [c] y)) 8632 // cond: 8633 // result: (XORshiftRA x y [c]) 8634 for { 8635 x := v.Args[0] 8636 v_1 := v.Args[1] 8637 if v_1.Op != OpARM64SRAconst { 8638 break 8639 } 8640 c := v_1.AuxInt 8641 y := v_1.Args[0] 8642 v.reset(OpARM64XORshiftRA) 8643 v.AuxInt = c 8644 v.AddArg(x) 8645 v.AddArg(y) 8646 return true 8647 } 8648 // match: (XOR (SRAconst [c] y) x) 8649 // cond: 8650 // result: (XORshiftRA x y [c]) 8651 for { 8652 v_0 := v.Args[0] 8653 if v_0.Op != OpARM64SRAconst { 8654 break 8655 } 8656 c := v_0.AuxInt 8657 y := v_0.Args[0] 8658 x := v.Args[1] 8659 v.reset(OpARM64XORshiftRA) 8660 v.AuxInt = c 8661 v.AddArg(x) 8662 v.AddArg(y) 8663 return true 8664 } 8665 return false 8666 } 8667 func rewriteValueARM64_OpARM64XORconst(v *Value, config *Config) bool { 8668 b := v.Block 8669 _ = b 8670 // match: (XORconst [0] x) 8671 // cond: 8672 // result: x 8673 for { 8674 if v.AuxInt != 0 { 8675 break 8676 } 8677 x := v.Args[0] 8678 v.reset(OpCopy) 8679 v.Type = x.Type 8680 v.AddArg(x) 8681 return true 8682 } 8683 // match: (XORconst [-1] x) 8684 // cond: 8685 // result: (MVN x) 8686 for { 8687 if v.AuxInt != -1 { 8688 break 8689 } 8690 x := v.Args[0] 8691 v.reset(OpARM64MVN) 8692 v.AddArg(x) 8693 return true 8694 } 8695 // match: (XORconst [c] (MOVDconst [d])) 8696 // cond: 8697 // result: (MOVDconst [c^d]) 8698 for { 8699 c := v.AuxInt 8700 v_0 := v.Args[0] 8701 if v_0.Op != OpARM64MOVDconst { 8702 break 8703 } 8704 d := v_0.AuxInt 8705 v.reset(OpARM64MOVDconst) 8706 v.AuxInt = c ^ d 8707 return true 8708 } 8709 // match: (XORconst [c] (XORconst [d] x)) 8710 // cond: 8711 // result: (XORconst [c^d] x) 8712 for { 8713 c := v.AuxInt 8714 v_0 := v.Args[0] 8715 if v_0.Op != OpARM64XORconst { 8716 break 8717 } 8718 d := v_0.AuxInt 8719 x := v_0.Args[0] 8720 v.reset(OpARM64XORconst) 8721 v.AuxInt = c ^ d 8722 v.AddArg(x) 8723 return true 8724 } 8725 return false 8726 } 8727 func rewriteValueARM64_OpARM64XORshiftLL(v *Value, config *Config) bool { 8728 b := v.Block 8729 _ = b 8730 // match: (XORshiftLL (MOVDconst [c]) x [d]) 8731 // cond: 8732 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 8733 for { 8734 d := v.AuxInt 8735 v_0 := v.Args[0] 8736 if v_0.Op != OpARM64MOVDconst { 8737 break 8738 } 8739 c := v_0.AuxInt 8740 x := v.Args[1] 8741 v.reset(OpARM64XORconst) 8742 v.AuxInt = c 8743 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 8744 v0.AuxInt = d 8745 v0.AddArg(x) 8746 v.AddArg(v0) 8747 return true 8748 } 8749 // match: (XORshiftLL x (MOVDconst [c]) [d]) 8750 // cond: 8751 // result: (XORconst x [int64(uint64(c)<<uint64(d))]) 8752 for { 8753 d := v.AuxInt 8754 x := v.Args[0] 8755 v_1 := v.Args[1] 8756 if v_1.Op != OpARM64MOVDconst { 8757 break 8758 } 8759 c := v_1.AuxInt 8760 v.reset(OpARM64XORconst) 8761 v.AuxInt = int64(uint64(c) << uint64(d)) 8762 v.AddArg(x) 8763 return true 8764 } 8765 // match: (XORshiftLL x (SLLconst x [c]) [d]) 8766 // cond: c==d 8767 // result: (MOVDconst [0]) 8768 for { 8769 d := v.AuxInt 8770 x := v.Args[0] 8771 v_1 := v.Args[1] 8772 if v_1.Op != OpARM64SLLconst { 8773 break 8774 } 8775 c := v_1.AuxInt 8776 if x != v_1.Args[0] { 8777 break 8778 } 8779 if !(c == d) { 8780 break 8781 } 8782 v.reset(OpARM64MOVDconst) 8783 v.AuxInt = 0 8784 return true 8785 } 8786 return false 8787 } 8788 func rewriteValueARM64_OpARM64XORshiftRA(v *Value, config *Config) bool { 8789 b := v.Block 8790 _ = b 8791 // match: (XORshiftRA (MOVDconst [c]) x [d]) 8792 // cond: 8793 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 8794 for { 8795 d := v.AuxInt 8796 v_0 := v.Args[0] 8797 if v_0.Op != OpARM64MOVDconst { 8798 break 8799 } 8800 c := v_0.AuxInt 8801 x := v.Args[1] 8802 v.reset(OpARM64XORconst) 8803 v.AuxInt = c 8804 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 8805 v0.AuxInt = d 8806 v0.AddArg(x) 8807 v.AddArg(v0) 8808 return true 8809 } 8810 // match: (XORshiftRA x (MOVDconst [c]) [d]) 8811 // cond: 8812 // result: (XORconst x [int64(int64(c)>>uint64(d))]) 8813 for { 8814 d := v.AuxInt 8815 x := v.Args[0] 8816 v_1 := v.Args[1] 8817 if v_1.Op != OpARM64MOVDconst { 8818 break 8819 } 8820 c := v_1.AuxInt 8821 v.reset(OpARM64XORconst) 8822 v.AuxInt = int64(int64(c) >> uint64(d)) 8823 v.AddArg(x) 8824 return true 8825 } 8826 // match: (XORshiftRA x (SRAconst x [c]) [d]) 8827 // cond: c==d 8828 // result: (MOVDconst [0]) 8829 for { 8830 d := v.AuxInt 8831 x := v.Args[0] 8832 v_1 := v.Args[1] 8833 if v_1.Op != OpARM64SRAconst { 8834 break 8835 } 8836 c := v_1.AuxInt 8837 if x != v_1.Args[0] { 8838 break 8839 } 8840 if !(c == d) { 8841 break 8842 } 8843 v.reset(OpARM64MOVDconst) 8844 v.AuxInt = 0 8845 return true 8846 } 8847 return false 8848 } 8849 func rewriteValueARM64_OpARM64XORshiftRL(v *Value, config *Config) bool { 8850 b := v.Block 8851 _ = b 8852 // match: (XORshiftRL (MOVDconst [c]) x [d]) 8853 // cond: 8854 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 8855 for { 8856 d := v.AuxInt 8857 v_0 := v.Args[0] 8858 if v_0.Op != OpARM64MOVDconst { 8859 break 8860 } 8861 c := v_0.AuxInt 8862 x := v.Args[1] 8863 v.reset(OpARM64XORconst) 8864 v.AuxInt = c 8865 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 8866 v0.AuxInt = d 8867 v0.AddArg(x) 8868 v.AddArg(v0) 8869 return true 8870 } 8871 // match: (XORshiftRL x (MOVDconst [c]) [d]) 8872 // cond: 8873 // result: (XORconst x [int64(uint64(c)>>uint64(d))]) 8874 for { 8875 d := v.AuxInt 8876 x := v.Args[0] 8877 v_1 := v.Args[1] 8878 if v_1.Op != OpARM64MOVDconst { 8879 break 8880 } 8881 c := v_1.AuxInt 8882 v.reset(OpARM64XORconst) 8883 v.AuxInt = int64(uint64(c) >> uint64(d)) 8884 v.AddArg(x) 8885 return true 8886 } 8887 // match: (XORshiftRL x (SRLconst x [c]) [d]) 8888 // cond: c==d 8889 // result: (MOVDconst [0]) 8890 for { 8891 d := v.AuxInt 8892 x := v.Args[0] 8893 v_1 := v.Args[1] 8894 if v_1.Op != OpARM64SRLconst { 8895 break 8896 } 8897 c := v_1.AuxInt 8898 if x != v_1.Args[0] { 8899 break 8900 } 8901 if !(c == d) { 8902 break 8903 } 8904 v.reset(OpARM64MOVDconst) 8905 v.AuxInt = 0 8906 return true 8907 } 8908 return false 8909 } 8910 func rewriteValueARM64_OpAdd16(v *Value, config *Config) bool { 8911 b := v.Block 8912 _ = b 8913 // match: (Add16 x y) 8914 // cond: 8915 // result: (ADD x y) 8916 for { 8917 x := v.Args[0] 8918 y := v.Args[1] 8919 v.reset(OpARM64ADD) 8920 v.AddArg(x) 8921 v.AddArg(y) 8922 return true 8923 } 8924 } 8925 func rewriteValueARM64_OpAdd32(v *Value, config *Config) bool { 8926 b := v.Block 8927 _ = b 8928 // match: (Add32 x y) 8929 // cond: 8930 // result: (ADD x y) 8931 for { 8932 x := v.Args[0] 8933 y := v.Args[1] 8934 v.reset(OpARM64ADD) 8935 v.AddArg(x) 8936 v.AddArg(y) 8937 return true 8938 } 8939 } 8940 func rewriteValueARM64_OpAdd32F(v *Value, config *Config) bool { 8941 b := v.Block 8942 _ = b 8943 // match: (Add32F x y) 8944 // cond: 8945 // result: (FADDS x y) 8946 for { 8947 x := v.Args[0] 8948 y := v.Args[1] 8949 v.reset(OpARM64FADDS) 8950 v.AddArg(x) 8951 v.AddArg(y) 8952 return true 8953 } 8954 } 8955 func rewriteValueARM64_OpAdd64(v *Value, config *Config) bool { 8956 b := v.Block 8957 _ = b 8958 // match: (Add64 x y) 8959 // cond: 8960 // result: (ADD x y) 8961 for { 8962 x := v.Args[0] 8963 y := v.Args[1] 8964 v.reset(OpARM64ADD) 8965 v.AddArg(x) 8966 v.AddArg(y) 8967 return true 8968 } 8969 } 8970 func rewriteValueARM64_OpAdd64F(v *Value, config *Config) bool { 8971 b := v.Block 8972 _ = b 8973 // match: (Add64F x y) 8974 // cond: 8975 // result: (FADDD x y) 8976 for { 8977 x := v.Args[0] 8978 y := v.Args[1] 8979 v.reset(OpARM64FADDD) 8980 v.AddArg(x) 8981 v.AddArg(y) 8982 return true 8983 } 8984 } 8985 func rewriteValueARM64_OpAdd8(v *Value, config *Config) bool { 8986 b := v.Block 8987 _ = b 8988 // match: (Add8 x y) 8989 // cond: 8990 // result: (ADD x y) 8991 for { 8992 x := v.Args[0] 8993 y := v.Args[1] 8994 v.reset(OpARM64ADD) 8995 v.AddArg(x) 8996 v.AddArg(y) 8997 return true 8998 } 8999 } 9000 func rewriteValueARM64_OpAddPtr(v *Value, config *Config) bool { 9001 b := v.Block 9002 _ = b 9003 // match: (AddPtr x y) 9004 // cond: 9005 // result: (ADD x y) 9006 for { 9007 x := v.Args[0] 9008 y := v.Args[1] 9009 v.reset(OpARM64ADD) 9010 v.AddArg(x) 9011 v.AddArg(y) 9012 return true 9013 } 9014 } 9015 func rewriteValueARM64_OpAddr(v *Value, config *Config) bool { 9016 b := v.Block 9017 _ = b 9018 // match: (Addr {sym} base) 9019 // cond: 9020 // result: (MOVDaddr {sym} base) 9021 for { 9022 sym := v.Aux 9023 base := v.Args[0] 9024 v.reset(OpARM64MOVDaddr) 9025 v.Aux = sym 9026 v.AddArg(base) 9027 return true 9028 } 9029 } 9030 func rewriteValueARM64_OpAnd16(v *Value, config *Config) bool { 9031 b := v.Block 9032 _ = b 9033 // match: (And16 x y) 9034 // cond: 9035 // result: (AND x y) 9036 for { 9037 x := v.Args[0] 9038 y := v.Args[1] 9039 v.reset(OpARM64AND) 9040 v.AddArg(x) 9041 v.AddArg(y) 9042 return true 9043 } 9044 } 9045 func rewriteValueARM64_OpAnd32(v *Value, config *Config) bool { 9046 b := v.Block 9047 _ = b 9048 // match: (And32 x y) 9049 // cond: 9050 // result: (AND x y) 9051 for { 9052 x := v.Args[0] 9053 y := v.Args[1] 9054 v.reset(OpARM64AND) 9055 v.AddArg(x) 9056 v.AddArg(y) 9057 return true 9058 } 9059 } 9060 func rewriteValueARM64_OpAnd64(v *Value, config *Config) bool { 9061 b := v.Block 9062 _ = b 9063 // match: (And64 x y) 9064 // cond: 9065 // result: (AND x y) 9066 for { 9067 x := v.Args[0] 9068 y := v.Args[1] 9069 v.reset(OpARM64AND) 9070 v.AddArg(x) 9071 v.AddArg(y) 9072 return true 9073 } 9074 } 9075 func rewriteValueARM64_OpAnd8(v *Value, config *Config) bool { 9076 b := v.Block 9077 _ = b 9078 // match: (And8 x y) 9079 // cond: 9080 // result: (AND x y) 9081 for { 9082 x := v.Args[0] 9083 y := v.Args[1] 9084 v.reset(OpARM64AND) 9085 v.AddArg(x) 9086 v.AddArg(y) 9087 return true 9088 } 9089 } 9090 func rewriteValueARM64_OpAndB(v *Value, config *Config) bool { 9091 b := v.Block 9092 _ = b 9093 // match: (AndB x y) 9094 // cond: 9095 // result: (AND x y) 9096 for { 9097 x := v.Args[0] 9098 y := v.Args[1] 9099 v.reset(OpARM64AND) 9100 v.AddArg(x) 9101 v.AddArg(y) 9102 return true 9103 } 9104 } 9105 func rewriteValueARM64_OpAtomicAdd32(v *Value, config *Config) bool { 9106 b := v.Block 9107 _ = b 9108 // match: (AtomicAdd32 ptr val mem) 9109 // cond: 9110 // result: (LoweredAtomicAdd32 ptr val mem) 9111 for { 9112 ptr := v.Args[0] 9113 val := v.Args[1] 9114 mem := v.Args[2] 9115 v.reset(OpARM64LoweredAtomicAdd32) 9116 v.AddArg(ptr) 9117 v.AddArg(val) 9118 v.AddArg(mem) 9119 return true 9120 } 9121 } 9122 func rewriteValueARM64_OpAtomicAdd64(v *Value, config *Config) bool { 9123 b := v.Block 9124 _ = b 9125 // match: (AtomicAdd64 ptr val mem) 9126 // cond: 9127 // result: (LoweredAtomicAdd64 ptr val mem) 9128 for { 9129 ptr := v.Args[0] 9130 val := v.Args[1] 9131 mem := v.Args[2] 9132 v.reset(OpARM64LoweredAtomicAdd64) 9133 v.AddArg(ptr) 9134 v.AddArg(val) 9135 v.AddArg(mem) 9136 return true 9137 } 9138 } 9139 func rewriteValueARM64_OpAtomicAnd8(v *Value, config *Config) bool { 9140 b := v.Block 9141 _ = b 9142 // match: (AtomicAnd8 ptr val mem) 9143 // cond: 9144 // result: (LoweredAtomicAnd8 ptr val mem) 9145 for { 9146 ptr := v.Args[0] 9147 val := v.Args[1] 9148 mem := v.Args[2] 9149 v.reset(OpARM64LoweredAtomicAnd8) 9150 v.AddArg(ptr) 9151 v.AddArg(val) 9152 v.AddArg(mem) 9153 return true 9154 } 9155 } 9156 func rewriteValueARM64_OpAtomicCompareAndSwap32(v *Value, config *Config) bool { 9157 b := v.Block 9158 _ = b 9159 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 9160 // cond: 9161 // result: (LoweredAtomicCas32 ptr old new_ mem) 9162 for { 9163 ptr := v.Args[0] 9164 old := v.Args[1] 9165 new_ := v.Args[2] 9166 mem := v.Args[3] 9167 v.reset(OpARM64LoweredAtomicCas32) 9168 v.AddArg(ptr) 9169 v.AddArg(old) 9170 v.AddArg(new_) 9171 v.AddArg(mem) 9172 return true 9173 } 9174 } 9175 func rewriteValueARM64_OpAtomicCompareAndSwap64(v *Value, config *Config) bool { 9176 b := v.Block 9177 _ = b 9178 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 9179 // cond: 9180 // result: (LoweredAtomicCas64 ptr old new_ mem) 9181 for { 9182 ptr := v.Args[0] 9183 old := v.Args[1] 9184 new_ := v.Args[2] 9185 mem := v.Args[3] 9186 v.reset(OpARM64LoweredAtomicCas64) 9187 v.AddArg(ptr) 9188 v.AddArg(old) 9189 v.AddArg(new_) 9190 v.AddArg(mem) 9191 return true 9192 } 9193 } 9194 func rewriteValueARM64_OpAtomicExchange32(v *Value, config *Config) bool { 9195 b := v.Block 9196 _ = b 9197 // match: (AtomicExchange32 ptr val mem) 9198 // cond: 9199 // result: (LoweredAtomicExchange32 ptr val mem) 9200 for { 9201 ptr := v.Args[0] 9202 val := v.Args[1] 9203 mem := v.Args[2] 9204 v.reset(OpARM64LoweredAtomicExchange32) 9205 v.AddArg(ptr) 9206 v.AddArg(val) 9207 v.AddArg(mem) 9208 return true 9209 } 9210 } 9211 func rewriteValueARM64_OpAtomicExchange64(v *Value, config *Config) bool { 9212 b := v.Block 9213 _ = b 9214 // match: (AtomicExchange64 ptr val mem) 9215 // cond: 9216 // result: (LoweredAtomicExchange64 ptr val mem) 9217 for { 9218 ptr := v.Args[0] 9219 val := v.Args[1] 9220 mem := v.Args[2] 9221 v.reset(OpARM64LoweredAtomicExchange64) 9222 v.AddArg(ptr) 9223 v.AddArg(val) 9224 v.AddArg(mem) 9225 return true 9226 } 9227 } 9228 func rewriteValueARM64_OpAtomicLoad32(v *Value, config *Config) bool { 9229 b := v.Block 9230 _ = b 9231 // match: (AtomicLoad32 ptr mem) 9232 // cond: 9233 // result: (LDARW ptr mem) 9234 for { 9235 ptr := v.Args[0] 9236 mem := v.Args[1] 9237 v.reset(OpARM64LDARW) 9238 v.AddArg(ptr) 9239 v.AddArg(mem) 9240 return true 9241 } 9242 } 9243 func rewriteValueARM64_OpAtomicLoad64(v *Value, config *Config) bool { 9244 b := v.Block 9245 _ = b 9246 // match: (AtomicLoad64 ptr mem) 9247 // cond: 9248 // result: (LDAR ptr mem) 9249 for { 9250 ptr := v.Args[0] 9251 mem := v.Args[1] 9252 v.reset(OpARM64LDAR) 9253 v.AddArg(ptr) 9254 v.AddArg(mem) 9255 return true 9256 } 9257 } 9258 func rewriteValueARM64_OpAtomicLoadPtr(v *Value, config *Config) bool { 9259 b := v.Block 9260 _ = b 9261 // match: (AtomicLoadPtr ptr mem) 9262 // cond: 9263 // result: (LDAR ptr mem) 9264 for { 9265 ptr := v.Args[0] 9266 mem := v.Args[1] 9267 v.reset(OpARM64LDAR) 9268 v.AddArg(ptr) 9269 v.AddArg(mem) 9270 return true 9271 } 9272 } 9273 func rewriteValueARM64_OpAtomicOr8(v *Value, config *Config) bool { 9274 b := v.Block 9275 _ = b 9276 // match: (AtomicOr8 ptr val mem) 9277 // cond: 9278 // result: (LoweredAtomicOr8 ptr val mem) 9279 for { 9280 ptr := v.Args[0] 9281 val := v.Args[1] 9282 mem := v.Args[2] 9283 v.reset(OpARM64LoweredAtomicOr8) 9284 v.AddArg(ptr) 9285 v.AddArg(val) 9286 v.AddArg(mem) 9287 return true 9288 } 9289 } 9290 func rewriteValueARM64_OpAtomicStore32(v *Value, config *Config) bool { 9291 b := v.Block 9292 _ = b 9293 // match: (AtomicStore32 ptr val mem) 9294 // cond: 9295 // result: (STLRW ptr val mem) 9296 for { 9297 ptr := v.Args[0] 9298 val := v.Args[1] 9299 mem := v.Args[2] 9300 v.reset(OpARM64STLRW) 9301 v.AddArg(ptr) 9302 v.AddArg(val) 9303 v.AddArg(mem) 9304 return true 9305 } 9306 } 9307 func rewriteValueARM64_OpAtomicStore64(v *Value, config *Config) bool { 9308 b := v.Block 9309 _ = b 9310 // match: (AtomicStore64 ptr val mem) 9311 // cond: 9312 // result: (STLR ptr val mem) 9313 for { 9314 ptr := v.Args[0] 9315 val := v.Args[1] 9316 mem := v.Args[2] 9317 v.reset(OpARM64STLR) 9318 v.AddArg(ptr) 9319 v.AddArg(val) 9320 v.AddArg(mem) 9321 return true 9322 } 9323 } 9324 func rewriteValueARM64_OpAtomicStorePtrNoWB(v *Value, config *Config) bool { 9325 b := v.Block 9326 _ = b 9327 // match: (AtomicStorePtrNoWB ptr val mem) 9328 // cond: 9329 // result: (STLR ptr val mem) 9330 for { 9331 ptr := v.Args[0] 9332 val := v.Args[1] 9333 mem := v.Args[2] 9334 v.reset(OpARM64STLR) 9335 v.AddArg(ptr) 9336 v.AddArg(val) 9337 v.AddArg(mem) 9338 return true 9339 } 9340 } 9341 func rewriteValueARM64_OpAvg64u(v *Value, config *Config) bool { 9342 b := v.Block 9343 _ = b 9344 // match: (Avg64u <t> x y) 9345 // cond: 9346 // result: (ADD (ADD <t> (SRLconst <t> x [1]) (SRLconst <t> y [1])) (AND <t> (AND <t> x y) (MOVDconst [1]))) 9347 for { 9348 t := v.Type 9349 x := v.Args[0] 9350 y := v.Args[1] 9351 v.reset(OpARM64ADD) 9352 v0 := b.NewValue0(v.Line, OpARM64ADD, t) 9353 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 9354 v1.AuxInt = 1 9355 v1.AddArg(x) 9356 v0.AddArg(v1) 9357 v2 := b.NewValue0(v.Line, OpARM64SRLconst, t) 9358 v2.AuxInt = 1 9359 v2.AddArg(y) 9360 v0.AddArg(v2) 9361 v.AddArg(v0) 9362 v3 := b.NewValue0(v.Line, OpARM64AND, t) 9363 v4 := b.NewValue0(v.Line, OpARM64AND, t) 9364 v4.AddArg(x) 9365 v4.AddArg(y) 9366 v3.AddArg(v4) 9367 v5 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 9368 v5.AuxInt = 1 9369 v3.AddArg(v5) 9370 v.AddArg(v3) 9371 return true 9372 } 9373 } 9374 func rewriteValueARM64_OpBswap32(v *Value, config *Config) bool { 9375 b := v.Block 9376 _ = b 9377 // match: (Bswap32 x) 9378 // cond: 9379 // result: (REVW x) 9380 for { 9381 x := v.Args[0] 9382 v.reset(OpARM64REVW) 9383 v.AddArg(x) 9384 return true 9385 } 9386 } 9387 func rewriteValueARM64_OpBswap64(v *Value, config *Config) bool { 9388 b := v.Block 9389 _ = b 9390 // match: (Bswap64 x) 9391 // cond: 9392 // result: (REV x) 9393 for { 9394 x := v.Args[0] 9395 v.reset(OpARM64REV) 9396 v.AddArg(x) 9397 return true 9398 } 9399 } 9400 func rewriteValueARM64_OpClosureCall(v *Value, config *Config) bool { 9401 b := v.Block 9402 _ = b 9403 // match: (ClosureCall [argwid] entry closure mem) 9404 // cond: 9405 // result: (CALLclosure [argwid] entry closure mem) 9406 for { 9407 argwid := v.AuxInt 9408 entry := v.Args[0] 9409 closure := v.Args[1] 9410 mem := v.Args[2] 9411 v.reset(OpARM64CALLclosure) 9412 v.AuxInt = argwid 9413 v.AddArg(entry) 9414 v.AddArg(closure) 9415 v.AddArg(mem) 9416 return true 9417 } 9418 } 9419 func rewriteValueARM64_OpCom16(v *Value, config *Config) bool { 9420 b := v.Block 9421 _ = b 9422 // match: (Com16 x) 9423 // cond: 9424 // result: (MVN x) 9425 for { 9426 x := v.Args[0] 9427 v.reset(OpARM64MVN) 9428 v.AddArg(x) 9429 return true 9430 } 9431 } 9432 func rewriteValueARM64_OpCom32(v *Value, config *Config) bool { 9433 b := v.Block 9434 _ = b 9435 // match: (Com32 x) 9436 // cond: 9437 // result: (MVN x) 9438 for { 9439 x := v.Args[0] 9440 v.reset(OpARM64MVN) 9441 v.AddArg(x) 9442 return true 9443 } 9444 } 9445 func rewriteValueARM64_OpCom64(v *Value, config *Config) bool { 9446 b := v.Block 9447 _ = b 9448 // match: (Com64 x) 9449 // cond: 9450 // result: (MVN x) 9451 for { 9452 x := v.Args[0] 9453 v.reset(OpARM64MVN) 9454 v.AddArg(x) 9455 return true 9456 } 9457 } 9458 func rewriteValueARM64_OpCom8(v *Value, config *Config) bool { 9459 b := v.Block 9460 _ = b 9461 // match: (Com8 x) 9462 // cond: 9463 // result: (MVN x) 9464 for { 9465 x := v.Args[0] 9466 v.reset(OpARM64MVN) 9467 v.AddArg(x) 9468 return true 9469 } 9470 } 9471 func rewriteValueARM64_OpConst16(v *Value, config *Config) bool { 9472 b := v.Block 9473 _ = b 9474 // match: (Const16 [val]) 9475 // cond: 9476 // result: (MOVDconst [val]) 9477 for { 9478 val := v.AuxInt 9479 v.reset(OpARM64MOVDconst) 9480 v.AuxInt = val 9481 return true 9482 } 9483 } 9484 func rewriteValueARM64_OpConst32(v *Value, config *Config) bool { 9485 b := v.Block 9486 _ = b 9487 // match: (Const32 [val]) 9488 // cond: 9489 // result: (MOVDconst [val]) 9490 for { 9491 val := v.AuxInt 9492 v.reset(OpARM64MOVDconst) 9493 v.AuxInt = val 9494 return true 9495 } 9496 } 9497 func rewriteValueARM64_OpConst32F(v *Value, config *Config) bool { 9498 b := v.Block 9499 _ = b 9500 // match: (Const32F [val]) 9501 // cond: 9502 // result: (FMOVSconst [val]) 9503 for { 9504 val := v.AuxInt 9505 v.reset(OpARM64FMOVSconst) 9506 v.AuxInt = val 9507 return true 9508 } 9509 } 9510 func rewriteValueARM64_OpConst64(v *Value, config *Config) bool { 9511 b := v.Block 9512 _ = b 9513 // match: (Const64 [val]) 9514 // cond: 9515 // result: (MOVDconst [val]) 9516 for { 9517 val := v.AuxInt 9518 v.reset(OpARM64MOVDconst) 9519 v.AuxInt = val 9520 return true 9521 } 9522 } 9523 func rewriteValueARM64_OpConst64F(v *Value, config *Config) bool { 9524 b := v.Block 9525 _ = b 9526 // match: (Const64F [val]) 9527 // cond: 9528 // result: (FMOVDconst [val]) 9529 for { 9530 val := v.AuxInt 9531 v.reset(OpARM64FMOVDconst) 9532 v.AuxInt = val 9533 return true 9534 } 9535 } 9536 func rewriteValueARM64_OpConst8(v *Value, config *Config) bool { 9537 b := v.Block 9538 _ = b 9539 // match: (Const8 [val]) 9540 // cond: 9541 // result: (MOVDconst [val]) 9542 for { 9543 val := v.AuxInt 9544 v.reset(OpARM64MOVDconst) 9545 v.AuxInt = val 9546 return true 9547 } 9548 } 9549 func rewriteValueARM64_OpConstBool(v *Value, config *Config) bool { 9550 b := v.Block 9551 _ = b 9552 // match: (ConstBool [b]) 9553 // cond: 9554 // result: (MOVDconst [b]) 9555 for { 9556 b := v.AuxInt 9557 v.reset(OpARM64MOVDconst) 9558 v.AuxInt = b 9559 return true 9560 } 9561 } 9562 func rewriteValueARM64_OpConstNil(v *Value, config *Config) bool { 9563 b := v.Block 9564 _ = b 9565 // match: (ConstNil) 9566 // cond: 9567 // result: (MOVDconst [0]) 9568 for { 9569 v.reset(OpARM64MOVDconst) 9570 v.AuxInt = 0 9571 return true 9572 } 9573 } 9574 func rewriteValueARM64_OpConvert(v *Value, config *Config) bool { 9575 b := v.Block 9576 _ = b 9577 // match: (Convert x mem) 9578 // cond: 9579 // result: (MOVDconvert x mem) 9580 for { 9581 x := v.Args[0] 9582 mem := v.Args[1] 9583 v.reset(OpARM64MOVDconvert) 9584 v.AddArg(x) 9585 v.AddArg(mem) 9586 return true 9587 } 9588 } 9589 func rewriteValueARM64_OpCtz32(v *Value, config *Config) bool { 9590 b := v.Block 9591 _ = b 9592 // match: (Ctz32 <t> x) 9593 // cond: 9594 // result: (CLZW (RBITW <t> x)) 9595 for { 9596 t := v.Type 9597 x := v.Args[0] 9598 v.reset(OpARM64CLZW) 9599 v0 := b.NewValue0(v.Line, OpARM64RBITW, t) 9600 v0.AddArg(x) 9601 v.AddArg(v0) 9602 return true 9603 } 9604 } 9605 func rewriteValueARM64_OpCtz64(v *Value, config *Config) bool { 9606 b := v.Block 9607 _ = b 9608 // match: (Ctz64 <t> x) 9609 // cond: 9610 // result: (CLZ (RBIT <t> x)) 9611 for { 9612 t := v.Type 9613 x := v.Args[0] 9614 v.reset(OpARM64CLZ) 9615 v0 := b.NewValue0(v.Line, OpARM64RBIT, t) 9616 v0.AddArg(x) 9617 v.AddArg(v0) 9618 return true 9619 } 9620 } 9621 func rewriteValueARM64_OpCvt32Fto32(v *Value, config *Config) bool { 9622 b := v.Block 9623 _ = b 9624 // match: (Cvt32Fto32 x) 9625 // cond: 9626 // result: (FCVTZSSW x) 9627 for { 9628 x := v.Args[0] 9629 v.reset(OpARM64FCVTZSSW) 9630 v.AddArg(x) 9631 return true 9632 } 9633 } 9634 func rewriteValueARM64_OpCvt32Fto32U(v *Value, config *Config) bool { 9635 b := v.Block 9636 _ = b 9637 // match: (Cvt32Fto32U x) 9638 // cond: 9639 // result: (FCVTZUSW x) 9640 for { 9641 x := v.Args[0] 9642 v.reset(OpARM64FCVTZUSW) 9643 v.AddArg(x) 9644 return true 9645 } 9646 } 9647 func rewriteValueARM64_OpCvt32Fto64(v *Value, config *Config) bool { 9648 b := v.Block 9649 _ = b 9650 // match: (Cvt32Fto64 x) 9651 // cond: 9652 // result: (FCVTZSS x) 9653 for { 9654 x := v.Args[0] 9655 v.reset(OpARM64FCVTZSS) 9656 v.AddArg(x) 9657 return true 9658 } 9659 } 9660 func rewriteValueARM64_OpCvt32Fto64F(v *Value, config *Config) bool { 9661 b := v.Block 9662 _ = b 9663 // match: (Cvt32Fto64F x) 9664 // cond: 9665 // result: (FCVTSD x) 9666 for { 9667 x := v.Args[0] 9668 v.reset(OpARM64FCVTSD) 9669 v.AddArg(x) 9670 return true 9671 } 9672 } 9673 func rewriteValueARM64_OpCvt32Fto64U(v *Value, config *Config) bool { 9674 b := v.Block 9675 _ = b 9676 // match: (Cvt32Fto64U x) 9677 // cond: 9678 // result: (FCVTZUS x) 9679 for { 9680 x := v.Args[0] 9681 v.reset(OpARM64FCVTZUS) 9682 v.AddArg(x) 9683 return true 9684 } 9685 } 9686 func rewriteValueARM64_OpCvt32Uto32F(v *Value, config *Config) bool { 9687 b := v.Block 9688 _ = b 9689 // match: (Cvt32Uto32F x) 9690 // cond: 9691 // result: (UCVTFWS x) 9692 for { 9693 x := v.Args[0] 9694 v.reset(OpARM64UCVTFWS) 9695 v.AddArg(x) 9696 return true 9697 } 9698 } 9699 func rewriteValueARM64_OpCvt32Uto64F(v *Value, config *Config) bool { 9700 b := v.Block 9701 _ = b 9702 // match: (Cvt32Uto64F x) 9703 // cond: 9704 // result: (UCVTFWD x) 9705 for { 9706 x := v.Args[0] 9707 v.reset(OpARM64UCVTFWD) 9708 v.AddArg(x) 9709 return true 9710 } 9711 } 9712 func rewriteValueARM64_OpCvt32to32F(v *Value, config *Config) bool { 9713 b := v.Block 9714 _ = b 9715 // match: (Cvt32to32F x) 9716 // cond: 9717 // result: (SCVTFWS x) 9718 for { 9719 x := v.Args[0] 9720 v.reset(OpARM64SCVTFWS) 9721 v.AddArg(x) 9722 return true 9723 } 9724 } 9725 func rewriteValueARM64_OpCvt32to64F(v *Value, config *Config) bool { 9726 b := v.Block 9727 _ = b 9728 // match: (Cvt32to64F x) 9729 // cond: 9730 // result: (SCVTFWD x) 9731 for { 9732 x := v.Args[0] 9733 v.reset(OpARM64SCVTFWD) 9734 v.AddArg(x) 9735 return true 9736 } 9737 } 9738 func rewriteValueARM64_OpCvt64Fto32(v *Value, config *Config) bool { 9739 b := v.Block 9740 _ = b 9741 // match: (Cvt64Fto32 x) 9742 // cond: 9743 // result: (FCVTZSDW x) 9744 for { 9745 x := v.Args[0] 9746 v.reset(OpARM64FCVTZSDW) 9747 v.AddArg(x) 9748 return true 9749 } 9750 } 9751 func rewriteValueARM64_OpCvt64Fto32F(v *Value, config *Config) bool { 9752 b := v.Block 9753 _ = b 9754 // match: (Cvt64Fto32F x) 9755 // cond: 9756 // result: (FCVTDS x) 9757 for { 9758 x := v.Args[0] 9759 v.reset(OpARM64FCVTDS) 9760 v.AddArg(x) 9761 return true 9762 } 9763 } 9764 func rewriteValueARM64_OpCvt64Fto32U(v *Value, config *Config) bool { 9765 b := v.Block 9766 _ = b 9767 // match: (Cvt64Fto32U x) 9768 // cond: 9769 // result: (FCVTZUDW x) 9770 for { 9771 x := v.Args[0] 9772 v.reset(OpARM64FCVTZUDW) 9773 v.AddArg(x) 9774 return true 9775 } 9776 } 9777 func rewriteValueARM64_OpCvt64Fto64(v *Value, config *Config) bool { 9778 b := v.Block 9779 _ = b 9780 // match: (Cvt64Fto64 x) 9781 // cond: 9782 // result: (FCVTZSD x) 9783 for { 9784 x := v.Args[0] 9785 v.reset(OpARM64FCVTZSD) 9786 v.AddArg(x) 9787 return true 9788 } 9789 } 9790 func rewriteValueARM64_OpCvt64Fto64U(v *Value, config *Config) bool { 9791 b := v.Block 9792 _ = b 9793 // match: (Cvt64Fto64U x) 9794 // cond: 9795 // result: (FCVTZUD x) 9796 for { 9797 x := v.Args[0] 9798 v.reset(OpARM64FCVTZUD) 9799 v.AddArg(x) 9800 return true 9801 } 9802 } 9803 func rewriteValueARM64_OpCvt64Uto32F(v *Value, config *Config) bool { 9804 b := v.Block 9805 _ = b 9806 // match: (Cvt64Uto32F x) 9807 // cond: 9808 // result: (UCVTFS x) 9809 for { 9810 x := v.Args[0] 9811 v.reset(OpARM64UCVTFS) 9812 v.AddArg(x) 9813 return true 9814 } 9815 } 9816 func rewriteValueARM64_OpCvt64Uto64F(v *Value, config *Config) bool { 9817 b := v.Block 9818 _ = b 9819 // match: (Cvt64Uto64F x) 9820 // cond: 9821 // result: (UCVTFD x) 9822 for { 9823 x := v.Args[0] 9824 v.reset(OpARM64UCVTFD) 9825 v.AddArg(x) 9826 return true 9827 } 9828 } 9829 func rewriteValueARM64_OpCvt64to32F(v *Value, config *Config) bool { 9830 b := v.Block 9831 _ = b 9832 // match: (Cvt64to32F x) 9833 // cond: 9834 // result: (SCVTFS x) 9835 for { 9836 x := v.Args[0] 9837 v.reset(OpARM64SCVTFS) 9838 v.AddArg(x) 9839 return true 9840 } 9841 } 9842 func rewriteValueARM64_OpCvt64to64F(v *Value, config *Config) bool { 9843 b := v.Block 9844 _ = b 9845 // match: (Cvt64to64F x) 9846 // cond: 9847 // result: (SCVTFD x) 9848 for { 9849 x := v.Args[0] 9850 v.reset(OpARM64SCVTFD) 9851 v.AddArg(x) 9852 return true 9853 } 9854 } 9855 func rewriteValueARM64_OpDeferCall(v *Value, config *Config) bool { 9856 b := v.Block 9857 _ = b 9858 // match: (DeferCall [argwid] mem) 9859 // cond: 9860 // result: (CALLdefer [argwid] mem) 9861 for { 9862 argwid := v.AuxInt 9863 mem := v.Args[0] 9864 v.reset(OpARM64CALLdefer) 9865 v.AuxInt = argwid 9866 v.AddArg(mem) 9867 return true 9868 } 9869 } 9870 func rewriteValueARM64_OpDiv16(v *Value, config *Config) bool { 9871 b := v.Block 9872 _ = b 9873 // match: (Div16 x y) 9874 // cond: 9875 // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) 9876 for { 9877 x := v.Args[0] 9878 y := v.Args[1] 9879 v.reset(OpARM64DIVW) 9880 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 9881 v0.AddArg(x) 9882 v.AddArg(v0) 9883 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 9884 v1.AddArg(y) 9885 v.AddArg(v1) 9886 return true 9887 } 9888 } 9889 func rewriteValueARM64_OpDiv16u(v *Value, config *Config) bool { 9890 b := v.Block 9891 _ = b 9892 // match: (Div16u x y) 9893 // cond: 9894 // result: (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y)) 9895 for { 9896 x := v.Args[0] 9897 y := v.Args[1] 9898 v.reset(OpARM64UDIVW) 9899 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 9900 v0.AddArg(x) 9901 v.AddArg(v0) 9902 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 9903 v1.AddArg(y) 9904 v.AddArg(v1) 9905 return true 9906 } 9907 } 9908 func rewriteValueARM64_OpDiv32(v *Value, config *Config) bool { 9909 b := v.Block 9910 _ = b 9911 // match: (Div32 x y) 9912 // cond: 9913 // result: (DIVW x y) 9914 for { 9915 x := v.Args[0] 9916 y := v.Args[1] 9917 v.reset(OpARM64DIVW) 9918 v.AddArg(x) 9919 v.AddArg(y) 9920 return true 9921 } 9922 } 9923 func rewriteValueARM64_OpDiv32F(v *Value, config *Config) bool { 9924 b := v.Block 9925 _ = b 9926 // match: (Div32F x y) 9927 // cond: 9928 // result: (FDIVS x y) 9929 for { 9930 x := v.Args[0] 9931 y := v.Args[1] 9932 v.reset(OpARM64FDIVS) 9933 v.AddArg(x) 9934 v.AddArg(y) 9935 return true 9936 } 9937 } 9938 func rewriteValueARM64_OpDiv32u(v *Value, config *Config) bool { 9939 b := v.Block 9940 _ = b 9941 // match: (Div32u x y) 9942 // cond: 9943 // result: (UDIVW x y) 9944 for { 9945 x := v.Args[0] 9946 y := v.Args[1] 9947 v.reset(OpARM64UDIVW) 9948 v.AddArg(x) 9949 v.AddArg(y) 9950 return true 9951 } 9952 } 9953 func rewriteValueARM64_OpDiv64(v *Value, config *Config) bool { 9954 b := v.Block 9955 _ = b 9956 // match: (Div64 x y) 9957 // cond: 9958 // result: (DIV x y) 9959 for { 9960 x := v.Args[0] 9961 y := v.Args[1] 9962 v.reset(OpARM64DIV) 9963 v.AddArg(x) 9964 v.AddArg(y) 9965 return true 9966 } 9967 } 9968 func rewriteValueARM64_OpDiv64F(v *Value, config *Config) bool { 9969 b := v.Block 9970 _ = b 9971 // match: (Div64F x y) 9972 // cond: 9973 // result: (FDIVD x y) 9974 for { 9975 x := v.Args[0] 9976 y := v.Args[1] 9977 v.reset(OpARM64FDIVD) 9978 v.AddArg(x) 9979 v.AddArg(y) 9980 return true 9981 } 9982 } 9983 func rewriteValueARM64_OpDiv64u(v *Value, config *Config) bool { 9984 b := v.Block 9985 _ = b 9986 // match: (Div64u x y) 9987 // cond: 9988 // result: (UDIV x y) 9989 for { 9990 x := v.Args[0] 9991 y := v.Args[1] 9992 v.reset(OpARM64UDIV) 9993 v.AddArg(x) 9994 v.AddArg(y) 9995 return true 9996 } 9997 } 9998 func rewriteValueARM64_OpDiv8(v *Value, config *Config) bool { 9999 b := v.Block 10000 _ = b 10001 // match: (Div8 x y) 10002 // cond: 10003 // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) 10004 for { 10005 x := v.Args[0] 10006 y := v.Args[1] 10007 v.reset(OpARM64DIVW) 10008 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10009 v0.AddArg(x) 10010 v.AddArg(v0) 10011 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10012 v1.AddArg(y) 10013 v.AddArg(v1) 10014 return true 10015 } 10016 } 10017 func rewriteValueARM64_OpDiv8u(v *Value, config *Config) bool { 10018 b := v.Block 10019 _ = b 10020 // match: (Div8u x y) 10021 // cond: 10022 // result: (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y)) 10023 for { 10024 x := v.Args[0] 10025 y := v.Args[1] 10026 v.reset(OpARM64UDIVW) 10027 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10028 v0.AddArg(x) 10029 v.AddArg(v0) 10030 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10031 v1.AddArg(y) 10032 v.AddArg(v1) 10033 return true 10034 } 10035 } 10036 func rewriteValueARM64_OpEq16(v *Value, config *Config) bool { 10037 b := v.Block 10038 _ = b 10039 // match: (Eq16 x y) 10040 // cond: 10041 // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10042 for { 10043 x := v.Args[0] 10044 y := v.Args[1] 10045 v.reset(OpARM64Equal) 10046 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10047 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10048 v1.AddArg(x) 10049 v0.AddArg(v1) 10050 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10051 v2.AddArg(y) 10052 v0.AddArg(v2) 10053 v.AddArg(v0) 10054 return true 10055 } 10056 } 10057 func rewriteValueARM64_OpEq32(v *Value, config *Config) bool { 10058 b := v.Block 10059 _ = b 10060 // match: (Eq32 x y) 10061 // cond: 10062 // result: (Equal (CMPW x y)) 10063 for { 10064 x := v.Args[0] 10065 y := v.Args[1] 10066 v.reset(OpARM64Equal) 10067 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10068 v0.AddArg(x) 10069 v0.AddArg(y) 10070 v.AddArg(v0) 10071 return true 10072 } 10073 } 10074 func rewriteValueARM64_OpEq32F(v *Value, config *Config) bool { 10075 b := v.Block 10076 _ = b 10077 // match: (Eq32F x y) 10078 // cond: 10079 // result: (Equal (FCMPS x y)) 10080 for { 10081 x := v.Args[0] 10082 y := v.Args[1] 10083 v.reset(OpARM64Equal) 10084 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10085 v0.AddArg(x) 10086 v0.AddArg(y) 10087 v.AddArg(v0) 10088 return true 10089 } 10090 } 10091 func rewriteValueARM64_OpEq64(v *Value, config *Config) bool { 10092 b := v.Block 10093 _ = b 10094 // match: (Eq64 x y) 10095 // cond: 10096 // result: (Equal (CMP x y)) 10097 for { 10098 x := v.Args[0] 10099 y := v.Args[1] 10100 v.reset(OpARM64Equal) 10101 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10102 v0.AddArg(x) 10103 v0.AddArg(y) 10104 v.AddArg(v0) 10105 return true 10106 } 10107 } 10108 func rewriteValueARM64_OpEq64F(v *Value, config *Config) bool { 10109 b := v.Block 10110 _ = b 10111 // match: (Eq64F x y) 10112 // cond: 10113 // result: (Equal (FCMPD x y)) 10114 for { 10115 x := v.Args[0] 10116 y := v.Args[1] 10117 v.reset(OpARM64Equal) 10118 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10119 v0.AddArg(x) 10120 v0.AddArg(y) 10121 v.AddArg(v0) 10122 return true 10123 } 10124 } 10125 func rewriteValueARM64_OpEq8(v *Value, config *Config) bool { 10126 b := v.Block 10127 _ = b 10128 // match: (Eq8 x y) 10129 // cond: 10130 // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10131 for { 10132 x := v.Args[0] 10133 y := v.Args[1] 10134 v.reset(OpARM64Equal) 10135 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10136 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10137 v1.AddArg(x) 10138 v0.AddArg(v1) 10139 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10140 v2.AddArg(y) 10141 v0.AddArg(v2) 10142 v.AddArg(v0) 10143 return true 10144 } 10145 } 10146 func rewriteValueARM64_OpEqB(v *Value, config *Config) bool { 10147 b := v.Block 10148 _ = b 10149 // match: (EqB x y) 10150 // cond: 10151 // result: (XOR (MOVDconst [1]) (XOR <config.fe.TypeBool()> x y)) 10152 for { 10153 x := v.Args[0] 10154 y := v.Args[1] 10155 v.reset(OpARM64XOR) 10156 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 10157 v0.AuxInt = 1 10158 v.AddArg(v0) 10159 v1 := b.NewValue0(v.Line, OpARM64XOR, config.fe.TypeBool()) 10160 v1.AddArg(x) 10161 v1.AddArg(y) 10162 v.AddArg(v1) 10163 return true 10164 } 10165 } 10166 func rewriteValueARM64_OpEqPtr(v *Value, config *Config) bool { 10167 b := v.Block 10168 _ = b 10169 // match: (EqPtr x y) 10170 // cond: 10171 // result: (Equal (CMP x y)) 10172 for { 10173 x := v.Args[0] 10174 y := v.Args[1] 10175 v.reset(OpARM64Equal) 10176 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10177 v0.AddArg(x) 10178 v0.AddArg(y) 10179 v.AddArg(v0) 10180 return true 10181 } 10182 } 10183 func rewriteValueARM64_OpGeq16(v *Value, config *Config) bool { 10184 b := v.Block 10185 _ = b 10186 // match: (Geq16 x y) 10187 // cond: 10188 // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10189 for { 10190 x := v.Args[0] 10191 y := v.Args[1] 10192 v.reset(OpARM64GreaterEqual) 10193 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10194 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10195 v1.AddArg(x) 10196 v0.AddArg(v1) 10197 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10198 v2.AddArg(y) 10199 v0.AddArg(v2) 10200 v.AddArg(v0) 10201 return true 10202 } 10203 } 10204 func rewriteValueARM64_OpGeq16U(v *Value, config *Config) bool { 10205 b := v.Block 10206 _ = b 10207 // match: (Geq16U x y) 10208 // cond: 10209 // result: (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10210 for { 10211 x := v.Args[0] 10212 y := v.Args[1] 10213 v.reset(OpARM64GreaterEqualU) 10214 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10215 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10216 v1.AddArg(x) 10217 v0.AddArg(v1) 10218 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10219 v2.AddArg(y) 10220 v0.AddArg(v2) 10221 v.AddArg(v0) 10222 return true 10223 } 10224 } 10225 func rewriteValueARM64_OpGeq32(v *Value, config *Config) bool { 10226 b := v.Block 10227 _ = b 10228 // match: (Geq32 x y) 10229 // cond: 10230 // result: (GreaterEqual (CMPW x y)) 10231 for { 10232 x := v.Args[0] 10233 y := v.Args[1] 10234 v.reset(OpARM64GreaterEqual) 10235 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10236 v0.AddArg(x) 10237 v0.AddArg(y) 10238 v.AddArg(v0) 10239 return true 10240 } 10241 } 10242 func rewriteValueARM64_OpGeq32F(v *Value, config *Config) bool { 10243 b := v.Block 10244 _ = b 10245 // match: (Geq32F x y) 10246 // cond: 10247 // result: (GreaterEqual (FCMPS x y)) 10248 for { 10249 x := v.Args[0] 10250 y := v.Args[1] 10251 v.reset(OpARM64GreaterEqual) 10252 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10253 v0.AddArg(x) 10254 v0.AddArg(y) 10255 v.AddArg(v0) 10256 return true 10257 } 10258 } 10259 func rewriteValueARM64_OpGeq32U(v *Value, config *Config) bool { 10260 b := v.Block 10261 _ = b 10262 // match: (Geq32U x y) 10263 // cond: 10264 // result: (GreaterEqualU (CMPW x y)) 10265 for { 10266 x := v.Args[0] 10267 y := v.Args[1] 10268 v.reset(OpARM64GreaterEqualU) 10269 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10270 v0.AddArg(x) 10271 v0.AddArg(y) 10272 v.AddArg(v0) 10273 return true 10274 } 10275 } 10276 func rewriteValueARM64_OpGeq64(v *Value, config *Config) bool { 10277 b := v.Block 10278 _ = b 10279 // match: (Geq64 x y) 10280 // cond: 10281 // result: (GreaterEqual (CMP x y)) 10282 for { 10283 x := v.Args[0] 10284 y := v.Args[1] 10285 v.reset(OpARM64GreaterEqual) 10286 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10287 v0.AddArg(x) 10288 v0.AddArg(y) 10289 v.AddArg(v0) 10290 return true 10291 } 10292 } 10293 func rewriteValueARM64_OpGeq64F(v *Value, config *Config) bool { 10294 b := v.Block 10295 _ = b 10296 // match: (Geq64F x y) 10297 // cond: 10298 // result: (GreaterEqual (FCMPD x y)) 10299 for { 10300 x := v.Args[0] 10301 y := v.Args[1] 10302 v.reset(OpARM64GreaterEqual) 10303 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10304 v0.AddArg(x) 10305 v0.AddArg(y) 10306 v.AddArg(v0) 10307 return true 10308 } 10309 } 10310 func rewriteValueARM64_OpGeq64U(v *Value, config *Config) bool { 10311 b := v.Block 10312 _ = b 10313 // match: (Geq64U x y) 10314 // cond: 10315 // result: (GreaterEqualU (CMP x y)) 10316 for { 10317 x := v.Args[0] 10318 y := v.Args[1] 10319 v.reset(OpARM64GreaterEqualU) 10320 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10321 v0.AddArg(x) 10322 v0.AddArg(y) 10323 v.AddArg(v0) 10324 return true 10325 } 10326 } 10327 func rewriteValueARM64_OpGeq8(v *Value, config *Config) bool { 10328 b := v.Block 10329 _ = b 10330 // match: (Geq8 x y) 10331 // cond: 10332 // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10333 for { 10334 x := v.Args[0] 10335 y := v.Args[1] 10336 v.reset(OpARM64GreaterEqual) 10337 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10338 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10339 v1.AddArg(x) 10340 v0.AddArg(v1) 10341 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10342 v2.AddArg(y) 10343 v0.AddArg(v2) 10344 v.AddArg(v0) 10345 return true 10346 } 10347 } 10348 func rewriteValueARM64_OpGeq8U(v *Value, config *Config) bool { 10349 b := v.Block 10350 _ = b 10351 // match: (Geq8U x y) 10352 // cond: 10353 // result: (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10354 for { 10355 x := v.Args[0] 10356 y := v.Args[1] 10357 v.reset(OpARM64GreaterEqualU) 10358 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10359 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10360 v1.AddArg(x) 10361 v0.AddArg(v1) 10362 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10363 v2.AddArg(y) 10364 v0.AddArg(v2) 10365 v.AddArg(v0) 10366 return true 10367 } 10368 } 10369 func rewriteValueARM64_OpGetClosurePtr(v *Value, config *Config) bool { 10370 b := v.Block 10371 _ = b 10372 // match: (GetClosurePtr) 10373 // cond: 10374 // result: (LoweredGetClosurePtr) 10375 for { 10376 v.reset(OpARM64LoweredGetClosurePtr) 10377 return true 10378 } 10379 } 10380 func rewriteValueARM64_OpGoCall(v *Value, config *Config) bool { 10381 b := v.Block 10382 _ = b 10383 // match: (GoCall [argwid] mem) 10384 // cond: 10385 // result: (CALLgo [argwid] mem) 10386 for { 10387 argwid := v.AuxInt 10388 mem := v.Args[0] 10389 v.reset(OpARM64CALLgo) 10390 v.AuxInt = argwid 10391 v.AddArg(mem) 10392 return true 10393 } 10394 } 10395 func rewriteValueARM64_OpGreater16(v *Value, config *Config) bool { 10396 b := v.Block 10397 _ = b 10398 // match: (Greater16 x y) 10399 // cond: 10400 // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10401 for { 10402 x := v.Args[0] 10403 y := v.Args[1] 10404 v.reset(OpARM64GreaterThan) 10405 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10406 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10407 v1.AddArg(x) 10408 v0.AddArg(v1) 10409 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10410 v2.AddArg(y) 10411 v0.AddArg(v2) 10412 v.AddArg(v0) 10413 return true 10414 } 10415 } 10416 func rewriteValueARM64_OpGreater16U(v *Value, config *Config) bool { 10417 b := v.Block 10418 _ = b 10419 // match: (Greater16U x y) 10420 // cond: 10421 // result: (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10422 for { 10423 x := v.Args[0] 10424 y := v.Args[1] 10425 v.reset(OpARM64GreaterThanU) 10426 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10427 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10428 v1.AddArg(x) 10429 v0.AddArg(v1) 10430 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10431 v2.AddArg(y) 10432 v0.AddArg(v2) 10433 v.AddArg(v0) 10434 return true 10435 } 10436 } 10437 func rewriteValueARM64_OpGreater32(v *Value, config *Config) bool { 10438 b := v.Block 10439 _ = b 10440 // match: (Greater32 x y) 10441 // cond: 10442 // result: (GreaterThan (CMPW x y)) 10443 for { 10444 x := v.Args[0] 10445 y := v.Args[1] 10446 v.reset(OpARM64GreaterThan) 10447 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10448 v0.AddArg(x) 10449 v0.AddArg(y) 10450 v.AddArg(v0) 10451 return true 10452 } 10453 } 10454 func rewriteValueARM64_OpGreater32F(v *Value, config *Config) bool { 10455 b := v.Block 10456 _ = b 10457 // match: (Greater32F x y) 10458 // cond: 10459 // result: (GreaterThan (FCMPS x y)) 10460 for { 10461 x := v.Args[0] 10462 y := v.Args[1] 10463 v.reset(OpARM64GreaterThan) 10464 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10465 v0.AddArg(x) 10466 v0.AddArg(y) 10467 v.AddArg(v0) 10468 return true 10469 } 10470 } 10471 func rewriteValueARM64_OpGreater32U(v *Value, config *Config) bool { 10472 b := v.Block 10473 _ = b 10474 // match: (Greater32U x y) 10475 // cond: 10476 // result: (GreaterThanU (CMPW x y)) 10477 for { 10478 x := v.Args[0] 10479 y := v.Args[1] 10480 v.reset(OpARM64GreaterThanU) 10481 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10482 v0.AddArg(x) 10483 v0.AddArg(y) 10484 v.AddArg(v0) 10485 return true 10486 } 10487 } 10488 func rewriteValueARM64_OpGreater64(v *Value, config *Config) bool { 10489 b := v.Block 10490 _ = b 10491 // match: (Greater64 x y) 10492 // cond: 10493 // result: (GreaterThan (CMP x y)) 10494 for { 10495 x := v.Args[0] 10496 y := v.Args[1] 10497 v.reset(OpARM64GreaterThan) 10498 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10499 v0.AddArg(x) 10500 v0.AddArg(y) 10501 v.AddArg(v0) 10502 return true 10503 } 10504 } 10505 func rewriteValueARM64_OpGreater64F(v *Value, config *Config) bool { 10506 b := v.Block 10507 _ = b 10508 // match: (Greater64F x y) 10509 // cond: 10510 // result: (GreaterThan (FCMPD x y)) 10511 for { 10512 x := v.Args[0] 10513 y := v.Args[1] 10514 v.reset(OpARM64GreaterThan) 10515 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10516 v0.AddArg(x) 10517 v0.AddArg(y) 10518 v.AddArg(v0) 10519 return true 10520 } 10521 } 10522 func rewriteValueARM64_OpGreater64U(v *Value, config *Config) bool { 10523 b := v.Block 10524 _ = b 10525 // match: (Greater64U x y) 10526 // cond: 10527 // result: (GreaterThanU (CMP x y)) 10528 for { 10529 x := v.Args[0] 10530 y := v.Args[1] 10531 v.reset(OpARM64GreaterThanU) 10532 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10533 v0.AddArg(x) 10534 v0.AddArg(y) 10535 v.AddArg(v0) 10536 return true 10537 } 10538 } 10539 func rewriteValueARM64_OpGreater8(v *Value, config *Config) bool { 10540 b := v.Block 10541 _ = b 10542 // match: (Greater8 x y) 10543 // cond: 10544 // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10545 for { 10546 x := v.Args[0] 10547 y := v.Args[1] 10548 v.reset(OpARM64GreaterThan) 10549 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10550 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10551 v1.AddArg(x) 10552 v0.AddArg(v1) 10553 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10554 v2.AddArg(y) 10555 v0.AddArg(v2) 10556 v.AddArg(v0) 10557 return true 10558 } 10559 } 10560 func rewriteValueARM64_OpGreater8U(v *Value, config *Config) bool { 10561 b := v.Block 10562 _ = b 10563 // match: (Greater8U x y) 10564 // cond: 10565 // result: (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10566 for { 10567 x := v.Args[0] 10568 y := v.Args[1] 10569 v.reset(OpARM64GreaterThanU) 10570 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10571 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10572 v1.AddArg(x) 10573 v0.AddArg(v1) 10574 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10575 v2.AddArg(y) 10576 v0.AddArg(v2) 10577 v.AddArg(v0) 10578 return true 10579 } 10580 } 10581 func rewriteValueARM64_OpHmul16(v *Value, config *Config) bool { 10582 b := v.Block 10583 _ = b 10584 // match: (Hmul16 x y) 10585 // cond: 10586 // result: (SRAconst (MULW <config.fe.TypeInt32()> (SignExt16to32 x) (SignExt16to32 y)) [16]) 10587 for { 10588 x := v.Args[0] 10589 y := v.Args[1] 10590 v.reset(OpARM64SRAconst) 10591 v.AuxInt = 16 10592 v0 := b.NewValue0(v.Line, OpARM64MULW, config.fe.TypeInt32()) 10593 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10594 v1.AddArg(x) 10595 v0.AddArg(v1) 10596 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10597 v2.AddArg(y) 10598 v0.AddArg(v2) 10599 v.AddArg(v0) 10600 return true 10601 } 10602 } 10603 func rewriteValueARM64_OpHmul16u(v *Value, config *Config) bool { 10604 b := v.Block 10605 _ = b 10606 // match: (Hmul16u x y) 10607 // cond: 10608 // result: (SRLconst (MUL <config.fe.TypeUInt32()> (ZeroExt16to32 x) (ZeroExt16to32 y)) [16]) 10609 for { 10610 x := v.Args[0] 10611 y := v.Args[1] 10612 v.reset(OpARM64SRLconst) 10613 v.AuxInt = 16 10614 v0 := b.NewValue0(v.Line, OpARM64MUL, config.fe.TypeUInt32()) 10615 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10616 v1.AddArg(x) 10617 v0.AddArg(v1) 10618 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10619 v2.AddArg(y) 10620 v0.AddArg(v2) 10621 v.AddArg(v0) 10622 return true 10623 } 10624 } 10625 func rewriteValueARM64_OpHmul32(v *Value, config *Config) bool { 10626 b := v.Block 10627 _ = b 10628 // match: (Hmul32 x y) 10629 // cond: 10630 // result: (SRAconst (MULL <config.fe.TypeInt64()> x y) [32]) 10631 for { 10632 x := v.Args[0] 10633 y := v.Args[1] 10634 v.reset(OpARM64SRAconst) 10635 v.AuxInt = 32 10636 v0 := b.NewValue0(v.Line, OpARM64MULL, config.fe.TypeInt64()) 10637 v0.AddArg(x) 10638 v0.AddArg(y) 10639 v.AddArg(v0) 10640 return true 10641 } 10642 } 10643 func rewriteValueARM64_OpHmul32u(v *Value, config *Config) bool { 10644 b := v.Block 10645 _ = b 10646 // match: (Hmul32u x y) 10647 // cond: 10648 // result: (SRAconst (UMULL <config.fe.TypeUInt64()> x y) [32]) 10649 for { 10650 x := v.Args[0] 10651 y := v.Args[1] 10652 v.reset(OpARM64SRAconst) 10653 v.AuxInt = 32 10654 v0 := b.NewValue0(v.Line, OpARM64UMULL, config.fe.TypeUInt64()) 10655 v0.AddArg(x) 10656 v0.AddArg(y) 10657 v.AddArg(v0) 10658 return true 10659 } 10660 } 10661 func rewriteValueARM64_OpHmul64(v *Value, config *Config) bool { 10662 b := v.Block 10663 _ = b 10664 // match: (Hmul64 x y) 10665 // cond: 10666 // result: (MULH x y) 10667 for { 10668 x := v.Args[0] 10669 y := v.Args[1] 10670 v.reset(OpARM64MULH) 10671 v.AddArg(x) 10672 v.AddArg(y) 10673 return true 10674 } 10675 } 10676 func rewriteValueARM64_OpHmul64u(v *Value, config *Config) bool { 10677 b := v.Block 10678 _ = b 10679 // match: (Hmul64u x y) 10680 // cond: 10681 // result: (UMULH x y) 10682 for { 10683 x := v.Args[0] 10684 y := v.Args[1] 10685 v.reset(OpARM64UMULH) 10686 v.AddArg(x) 10687 v.AddArg(y) 10688 return true 10689 } 10690 } 10691 func rewriteValueARM64_OpHmul8(v *Value, config *Config) bool { 10692 b := v.Block 10693 _ = b 10694 // match: (Hmul8 x y) 10695 // cond: 10696 // result: (SRAconst (MULW <config.fe.TypeInt16()> (SignExt8to32 x) (SignExt8to32 y)) [8]) 10697 for { 10698 x := v.Args[0] 10699 y := v.Args[1] 10700 v.reset(OpARM64SRAconst) 10701 v.AuxInt = 8 10702 v0 := b.NewValue0(v.Line, OpARM64MULW, config.fe.TypeInt16()) 10703 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10704 v1.AddArg(x) 10705 v0.AddArg(v1) 10706 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10707 v2.AddArg(y) 10708 v0.AddArg(v2) 10709 v.AddArg(v0) 10710 return true 10711 } 10712 } 10713 func rewriteValueARM64_OpHmul8u(v *Value, config *Config) bool { 10714 b := v.Block 10715 _ = b 10716 // match: (Hmul8u x y) 10717 // cond: 10718 // result: (SRLconst (MUL <config.fe.TypeUInt16()> (ZeroExt8to32 x) (ZeroExt8to32 y)) [8]) 10719 for { 10720 x := v.Args[0] 10721 y := v.Args[1] 10722 v.reset(OpARM64SRLconst) 10723 v.AuxInt = 8 10724 v0 := b.NewValue0(v.Line, OpARM64MUL, config.fe.TypeUInt16()) 10725 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10726 v1.AddArg(x) 10727 v0.AddArg(v1) 10728 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10729 v2.AddArg(y) 10730 v0.AddArg(v2) 10731 v.AddArg(v0) 10732 return true 10733 } 10734 } 10735 func rewriteValueARM64_OpInterCall(v *Value, config *Config) bool { 10736 b := v.Block 10737 _ = b 10738 // match: (InterCall [argwid] entry mem) 10739 // cond: 10740 // result: (CALLinter [argwid] entry mem) 10741 for { 10742 argwid := v.AuxInt 10743 entry := v.Args[0] 10744 mem := v.Args[1] 10745 v.reset(OpARM64CALLinter) 10746 v.AuxInt = argwid 10747 v.AddArg(entry) 10748 v.AddArg(mem) 10749 return true 10750 } 10751 } 10752 func rewriteValueARM64_OpIsInBounds(v *Value, config *Config) bool { 10753 b := v.Block 10754 _ = b 10755 // match: (IsInBounds idx len) 10756 // cond: 10757 // result: (LessThanU (CMP idx len)) 10758 for { 10759 idx := v.Args[0] 10760 len := v.Args[1] 10761 v.reset(OpARM64LessThanU) 10762 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10763 v0.AddArg(idx) 10764 v0.AddArg(len) 10765 v.AddArg(v0) 10766 return true 10767 } 10768 } 10769 func rewriteValueARM64_OpIsNonNil(v *Value, config *Config) bool { 10770 b := v.Block 10771 _ = b 10772 // match: (IsNonNil ptr) 10773 // cond: 10774 // result: (NotEqual (CMPconst [0] ptr)) 10775 for { 10776 ptr := v.Args[0] 10777 v.reset(OpARM64NotEqual) 10778 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 10779 v0.AuxInt = 0 10780 v0.AddArg(ptr) 10781 v.AddArg(v0) 10782 return true 10783 } 10784 } 10785 func rewriteValueARM64_OpIsSliceInBounds(v *Value, config *Config) bool { 10786 b := v.Block 10787 _ = b 10788 // match: (IsSliceInBounds idx len) 10789 // cond: 10790 // result: (LessEqualU (CMP idx len)) 10791 for { 10792 idx := v.Args[0] 10793 len := v.Args[1] 10794 v.reset(OpARM64LessEqualU) 10795 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10796 v0.AddArg(idx) 10797 v0.AddArg(len) 10798 v.AddArg(v0) 10799 return true 10800 } 10801 } 10802 func rewriteValueARM64_OpLeq16(v *Value, config *Config) bool { 10803 b := v.Block 10804 _ = b 10805 // match: (Leq16 x y) 10806 // cond: 10807 // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10808 for { 10809 x := v.Args[0] 10810 y := v.Args[1] 10811 v.reset(OpARM64LessEqual) 10812 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10813 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10814 v1.AddArg(x) 10815 v0.AddArg(v1) 10816 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10817 v2.AddArg(y) 10818 v0.AddArg(v2) 10819 v.AddArg(v0) 10820 return true 10821 } 10822 } 10823 func rewriteValueARM64_OpLeq16U(v *Value, config *Config) bool { 10824 b := v.Block 10825 _ = b 10826 // match: (Leq16U x y) 10827 // cond: 10828 // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10829 for { 10830 x := v.Args[0] 10831 y := v.Args[1] 10832 v.reset(OpARM64LessEqualU) 10833 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10834 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10835 v1.AddArg(x) 10836 v0.AddArg(v1) 10837 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10838 v2.AddArg(y) 10839 v0.AddArg(v2) 10840 v.AddArg(v0) 10841 return true 10842 } 10843 } 10844 func rewriteValueARM64_OpLeq32(v *Value, config *Config) bool { 10845 b := v.Block 10846 _ = b 10847 // match: (Leq32 x y) 10848 // cond: 10849 // result: (LessEqual (CMPW x y)) 10850 for { 10851 x := v.Args[0] 10852 y := v.Args[1] 10853 v.reset(OpARM64LessEqual) 10854 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10855 v0.AddArg(x) 10856 v0.AddArg(y) 10857 v.AddArg(v0) 10858 return true 10859 } 10860 } 10861 func rewriteValueARM64_OpLeq32F(v *Value, config *Config) bool { 10862 b := v.Block 10863 _ = b 10864 // match: (Leq32F x y) 10865 // cond: 10866 // result: (GreaterEqual (FCMPS y x)) 10867 for { 10868 x := v.Args[0] 10869 y := v.Args[1] 10870 v.reset(OpARM64GreaterEqual) 10871 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10872 v0.AddArg(y) 10873 v0.AddArg(x) 10874 v.AddArg(v0) 10875 return true 10876 } 10877 } 10878 func rewriteValueARM64_OpLeq32U(v *Value, config *Config) bool { 10879 b := v.Block 10880 _ = b 10881 // match: (Leq32U x y) 10882 // cond: 10883 // result: (LessEqualU (CMPW x y)) 10884 for { 10885 x := v.Args[0] 10886 y := v.Args[1] 10887 v.reset(OpARM64LessEqualU) 10888 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10889 v0.AddArg(x) 10890 v0.AddArg(y) 10891 v.AddArg(v0) 10892 return true 10893 } 10894 } 10895 func rewriteValueARM64_OpLeq64(v *Value, config *Config) bool { 10896 b := v.Block 10897 _ = b 10898 // match: (Leq64 x y) 10899 // cond: 10900 // result: (LessEqual (CMP x y)) 10901 for { 10902 x := v.Args[0] 10903 y := v.Args[1] 10904 v.reset(OpARM64LessEqual) 10905 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10906 v0.AddArg(x) 10907 v0.AddArg(y) 10908 v.AddArg(v0) 10909 return true 10910 } 10911 } 10912 func rewriteValueARM64_OpLeq64F(v *Value, config *Config) bool { 10913 b := v.Block 10914 _ = b 10915 // match: (Leq64F x y) 10916 // cond: 10917 // result: (GreaterEqual (FCMPD y x)) 10918 for { 10919 x := v.Args[0] 10920 y := v.Args[1] 10921 v.reset(OpARM64GreaterEqual) 10922 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10923 v0.AddArg(y) 10924 v0.AddArg(x) 10925 v.AddArg(v0) 10926 return true 10927 } 10928 } 10929 func rewriteValueARM64_OpLeq64U(v *Value, config *Config) bool { 10930 b := v.Block 10931 _ = b 10932 // match: (Leq64U x y) 10933 // cond: 10934 // result: (LessEqualU (CMP x y)) 10935 for { 10936 x := v.Args[0] 10937 y := v.Args[1] 10938 v.reset(OpARM64LessEqualU) 10939 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10940 v0.AddArg(x) 10941 v0.AddArg(y) 10942 v.AddArg(v0) 10943 return true 10944 } 10945 } 10946 func rewriteValueARM64_OpLeq8(v *Value, config *Config) bool { 10947 b := v.Block 10948 _ = b 10949 // match: (Leq8 x y) 10950 // cond: 10951 // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10952 for { 10953 x := v.Args[0] 10954 y := v.Args[1] 10955 v.reset(OpARM64LessEqual) 10956 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10957 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10958 v1.AddArg(x) 10959 v0.AddArg(v1) 10960 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10961 v2.AddArg(y) 10962 v0.AddArg(v2) 10963 v.AddArg(v0) 10964 return true 10965 } 10966 } 10967 func rewriteValueARM64_OpLeq8U(v *Value, config *Config) bool { 10968 b := v.Block 10969 _ = b 10970 // match: (Leq8U x y) 10971 // cond: 10972 // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10973 for { 10974 x := v.Args[0] 10975 y := v.Args[1] 10976 v.reset(OpARM64LessEqualU) 10977 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10978 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10979 v1.AddArg(x) 10980 v0.AddArg(v1) 10981 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10982 v2.AddArg(y) 10983 v0.AddArg(v2) 10984 v.AddArg(v0) 10985 return true 10986 } 10987 } 10988 func rewriteValueARM64_OpLess16(v *Value, config *Config) bool { 10989 b := v.Block 10990 _ = b 10991 // match: (Less16 x y) 10992 // cond: 10993 // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10994 for { 10995 x := v.Args[0] 10996 y := v.Args[1] 10997 v.reset(OpARM64LessThan) 10998 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10999 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 11000 v1.AddArg(x) 11001 v0.AddArg(v1) 11002 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 11003 v2.AddArg(y) 11004 v0.AddArg(v2) 11005 v.AddArg(v0) 11006 return true 11007 } 11008 } 11009 func rewriteValueARM64_OpLess16U(v *Value, config *Config) bool { 11010 b := v.Block 11011 _ = b 11012 // match: (Less16U x y) 11013 // cond: 11014 // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 11015 for { 11016 x := v.Args[0] 11017 y := v.Args[1] 11018 v.reset(OpARM64LessThanU) 11019 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11020 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 11021 v1.AddArg(x) 11022 v0.AddArg(v1) 11023 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 11024 v2.AddArg(y) 11025 v0.AddArg(v2) 11026 v.AddArg(v0) 11027 return true 11028 } 11029 } 11030 func rewriteValueARM64_OpLess32(v *Value, config *Config) bool { 11031 b := v.Block 11032 _ = b 11033 // match: (Less32 x y) 11034 // cond: 11035 // result: (LessThan (CMPW x y)) 11036 for { 11037 x := v.Args[0] 11038 y := v.Args[1] 11039 v.reset(OpARM64LessThan) 11040 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11041 v0.AddArg(x) 11042 v0.AddArg(y) 11043 v.AddArg(v0) 11044 return true 11045 } 11046 } 11047 func rewriteValueARM64_OpLess32F(v *Value, config *Config) bool { 11048 b := v.Block 11049 _ = b 11050 // match: (Less32F x y) 11051 // cond: 11052 // result: (GreaterThan (FCMPS y x)) 11053 for { 11054 x := v.Args[0] 11055 y := v.Args[1] 11056 v.reset(OpARM64GreaterThan) 11057 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 11058 v0.AddArg(y) 11059 v0.AddArg(x) 11060 v.AddArg(v0) 11061 return true 11062 } 11063 } 11064 func rewriteValueARM64_OpLess32U(v *Value, config *Config) bool { 11065 b := v.Block 11066 _ = b 11067 // match: (Less32U x y) 11068 // cond: 11069 // result: (LessThanU (CMPW x y)) 11070 for { 11071 x := v.Args[0] 11072 y := v.Args[1] 11073 v.reset(OpARM64LessThanU) 11074 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11075 v0.AddArg(x) 11076 v0.AddArg(y) 11077 v.AddArg(v0) 11078 return true 11079 } 11080 } 11081 func rewriteValueARM64_OpLess64(v *Value, config *Config) bool { 11082 b := v.Block 11083 _ = b 11084 // match: (Less64 x y) 11085 // cond: 11086 // result: (LessThan (CMP x y)) 11087 for { 11088 x := v.Args[0] 11089 y := v.Args[1] 11090 v.reset(OpARM64LessThan) 11091 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 11092 v0.AddArg(x) 11093 v0.AddArg(y) 11094 v.AddArg(v0) 11095 return true 11096 } 11097 } 11098 func rewriteValueARM64_OpLess64F(v *Value, config *Config) bool { 11099 b := v.Block 11100 _ = b 11101 // match: (Less64F x y) 11102 // cond: 11103 // result: (GreaterThan (FCMPD y x)) 11104 for { 11105 x := v.Args[0] 11106 y := v.Args[1] 11107 v.reset(OpARM64GreaterThan) 11108 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 11109 v0.AddArg(y) 11110 v0.AddArg(x) 11111 v.AddArg(v0) 11112 return true 11113 } 11114 } 11115 func rewriteValueARM64_OpLess64U(v *Value, config *Config) bool { 11116 b := v.Block 11117 _ = b 11118 // match: (Less64U x y) 11119 // cond: 11120 // result: (LessThanU (CMP x y)) 11121 for { 11122 x := v.Args[0] 11123 y := v.Args[1] 11124 v.reset(OpARM64LessThanU) 11125 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 11126 v0.AddArg(x) 11127 v0.AddArg(y) 11128 v.AddArg(v0) 11129 return true 11130 } 11131 } 11132 func rewriteValueARM64_OpLess8(v *Value, config *Config) bool { 11133 b := v.Block 11134 _ = b 11135 // match: (Less8 x y) 11136 // cond: 11137 // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11138 for { 11139 x := v.Args[0] 11140 y := v.Args[1] 11141 v.reset(OpARM64LessThan) 11142 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11143 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 11144 v1.AddArg(x) 11145 v0.AddArg(v1) 11146 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 11147 v2.AddArg(y) 11148 v0.AddArg(v2) 11149 v.AddArg(v0) 11150 return true 11151 } 11152 } 11153 func rewriteValueARM64_OpLess8U(v *Value, config *Config) bool { 11154 b := v.Block 11155 _ = b 11156 // match: (Less8U x y) 11157 // cond: 11158 // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11159 for { 11160 x := v.Args[0] 11161 y := v.Args[1] 11162 v.reset(OpARM64LessThanU) 11163 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11164 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 11165 v1.AddArg(x) 11166 v0.AddArg(v1) 11167 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 11168 v2.AddArg(y) 11169 v0.AddArg(v2) 11170 v.AddArg(v0) 11171 return true 11172 } 11173 } 11174 func rewriteValueARM64_OpLoad(v *Value, config *Config) bool { 11175 b := v.Block 11176 _ = b 11177 // match: (Load <t> ptr mem) 11178 // cond: t.IsBoolean() 11179 // result: (MOVBUload ptr mem) 11180 for { 11181 t := v.Type 11182 ptr := v.Args[0] 11183 mem := v.Args[1] 11184 if !(t.IsBoolean()) { 11185 break 11186 } 11187 v.reset(OpARM64MOVBUload) 11188 v.AddArg(ptr) 11189 v.AddArg(mem) 11190 return true 11191 } 11192 // match: (Load <t> ptr mem) 11193 // cond: (is8BitInt(t) && isSigned(t)) 11194 // result: (MOVBload ptr mem) 11195 for { 11196 t := v.Type 11197 ptr := v.Args[0] 11198 mem := v.Args[1] 11199 if !(is8BitInt(t) && isSigned(t)) { 11200 break 11201 } 11202 v.reset(OpARM64MOVBload) 11203 v.AddArg(ptr) 11204 v.AddArg(mem) 11205 return true 11206 } 11207 // match: (Load <t> ptr mem) 11208 // cond: (is8BitInt(t) && !isSigned(t)) 11209 // result: (MOVBUload ptr mem) 11210 for { 11211 t := v.Type 11212 ptr := v.Args[0] 11213 mem := v.Args[1] 11214 if !(is8BitInt(t) && !isSigned(t)) { 11215 break 11216 } 11217 v.reset(OpARM64MOVBUload) 11218 v.AddArg(ptr) 11219 v.AddArg(mem) 11220 return true 11221 } 11222 // match: (Load <t> ptr mem) 11223 // cond: (is16BitInt(t) && isSigned(t)) 11224 // result: (MOVHload ptr mem) 11225 for { 11226 t := v.Type 11227 ptr := v.Args[0] 11228 mem := v.Args[1] 11229 if !(is16BitInt(t) && isSigned(t)) { 11230 break 11231 } 11232 v.reset(OpARM64MOVHload) 11233 v.AddArg(ptr) 11234 v.AddArg(mem) 11235 return true 11236 } 11237 // match: (Load <t> ptr mem) 11238 // cond: (is16BitInt(t) && !isSigned(t)) 11239 // result: (MOVHUload ptr mem) 11240 for { 11241 t := v.Type 11242 ptr := v.Args[0] 11243 mem := v.Args[1] 11244 if !(is16BitInt(t) && !isSigned(t)) { 11245 break 11246 } 11247 v.reset(OpARM64MOVHUload) 11248 v.AddArg(ptr) 11249 v.AddArg(mem) 11250 return true 11251 } 11252 // match: (Load <t> ptr mem) 11253 // cond: (is32BitInt(t) && isSigned(t)) 11254 // result: (MOVWload ptr mem) 11255 for { 11256 t := v.Type 11257 ptr := v.Args[0] 11258 mem := v.Args[1] 11259 if !(is32BitInt(t) && isSigned(t)) { 11260 break 11261 } 11262 v.reset(OpARM64MOVWload) 11263 v.AddArg(ptr) 11264 v.AddArg(mem) 11265 return true 11266 } 11267 // match: (Load <t> ptr mem) 11268 // cond: (is32BitInt(t) && !isSigned(t)) 11269 // result: (MOVWUload ptr mem) 11270 for { 11271 t := v.Type 11272 ptr := v.Args[0] 11273 mem := v.Args[1] 11274 if !(is32BitInt(t) && !isSigned(t)) { 11275 break 11276 } 11277 v.reset(OpARM64MOVWUload) 11278 v.AddArg(ptr) 11279 v.AddArg(mem) 11280 return true 11281 } 11282 // match: (Load <t> ptr mem) 11283 // cond: (is64BitInt(t) || isPtr(t)) 11284 // result: (MOVDload ptr mem) 11285 for { 11286 t := v.Type 11287 ptr := v.Args[0] 11288 mem := v.Args[1] 11289 if !(is64BitInt(t) || isPtr(t)) { 11290 break 11291 } 11292 v.reset(OpARM64MOVDload) 11293 v.AddArg(ptr) 11294 v.AddArg(mem) 11295 return true 11296 } 11297 // match: (Load <t> ptr mem) 11298 // cond: is32BitFloat(t) 11299 // result: (FMOVSload ptr mem) 11300 for { 11301 t := v.Type 11302 ptr := v.Args[0] 11303 mem := v.Args[1] 11304 if !(is32BitFloat(t)) { 11305 break 11306 } 11307 v.reset(OpARM64FMOVSload) 11308 v.AddArg(ptr) 11309 v.AddArg(mem) 11310 return true 11311 } 11312 // match: (Load <t> ptr mem) 11313 // cond: is64BitFloat(t) 11314 // result: (FMOVDload ptr mem) 11315 for { 11316 t := v.Type 11317 ptr := v.Args[0] 11318 mem := v.Args[1] 11319 if !(is64BitFloat(t)) { 11320 break 11321 } 11322 v.reset(OpARM64FMOVDload) 11323 v.AddArg(ptr) 11324 v.AddArg(mem) 11325 return true 11326 } 11327 return false 11328 } 11329 func rewriteValueARM64_OpLrot16(v *Value, config *Config) bool { 11330 b := v.Block 11331 _ = b 11332 // match: (Lrot16 <t> x [c]) 11333 // cond: 11334 // result: (OR (SLLconst <t> x [c&15]) (SRLconst <t> (ZeroExt16to64 x) [16-c&15])) 11335 for { 11336 t := v.Type 11337 c := v.AuxInt 11338 x := v.Args[0] 11339 v.reset(OpARM64OR) 11340 v0 := b.NewValue0(v.Line, OpARM64SLLconst, t) 11341 v0.AuxInt = c & 15 11342 v0.AddArg(x) 11343 v.AddArg(v0) 11344 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 11345 v1.AuxInt = 16 - c&15 11346 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11347 v2.AddArg(x) 11348 v1.AddArg(v2) 11349 v.AddArg(v1) 11350 return true 11351 } 11352 } 11353 func rewriteValueARM64_OpLrot32(v *Value, config *Config) bool { 11354 b := v.Block 11355 _ = b 11356 // match: (Lrot32 x [c]) 11357 // cond: 11358 // result: (RORWconst x [32-c&31]) 11359 for { 11360 c := v.AuxInt 11361 x := v.Args[0] 11362 v.reset(OpARM64RORWconst) 11363 v.AuxInt = 32 - c&31 11364 v.AddArg(x) 11365 return true 11366 } 11367 } 11368 func rewriteValueARM64_OpLrot64(v *Value, config *Config) bool { 11369 b := v.Block 11370 _ = b 11371 // match: (Lrot64 x [c]) 11372 // cond: 11373 // result: (RORconst x [64-c&63]) 11374 for { 11375 c := v.AuxInt 11376 x := v.Args[0] 11377 v.reset(OpARM64RORconst) 11378 v.AuxInt = 64 - c&63 11379 v.AddArg(x) 11380 return true 11381 } 11382 } 11383 func rewriteValueARM64_OpLrot8(v *Value, config *Config) bool { 11384 b := v.Block 11385 _ = b 11386 // match: (Lrot8 <t> x [c]) 11387 // cond: 11388 // result: (OR (SLLconst <t> x [c&7]) (SRLconst <t> (ZeroExt8to64 x) [8-c&7])) 11389 for { 11390 t := v.Type 11391 c := v.AuxInt 11392 x := v.Args[0] 11393 v.reset(OpARM64OR) 11394 v0 := b.NewValue0(v.Line, OpARM64SLLconst, t) 11395 v0.AuxInt = c & 7 11396 v0.AddArg(x) 11397 v.AddArg(v0) 11398 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 11399 v1.AuxInt = 8 - c&7 11400 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11401 v2.AddArg(x) 11402 v1.AddArg(v2) 11403 v.AddArg(v1) 11404 return true 11405 } 11406 } 11407 func rewriteValueARM64_OpLsh16x16(v *Value, config *Config) bool { 11408 b := v.Block 11409 _ = b 11410 // match: (Lsh16x16 <t> x y) 11411 // cond: 11412 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11413 for { 11414 t := v.Type 11415 x := v.Args[0] 11416 y := v.Args[1] 11417 v.reset(OpARM64CSELULT) 11418 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11419 v0.AddArg(x) 11420 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11421 v1.AddArg(y) 11422 v0.AddArg(v1) 11423 v.AddArg(v0) 11424 v2 := b.NewValue0(v.Line, OpConst64, t) 11425 v2.AuxInt = 0 11426 v.AddArg(v2) 11427 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11428 v3.AuxInt = 64 11429 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11430 v4.AddArg(y) 11431 v3.AddArg(v4) 11432 v.AddArg(v3) 11433 return true 11434 } 11435 } 11436 func rewriteValueARM64_OpLsh16x32(v *Value, config *Config) bool { 11437 b := v.Block 11438 _ = b 11439 // match: (Lsh16x32 <t> x y) 11440 // cond: 11441 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11442 for { 11443 t := v.Type 11444 x := v.Args[0] 11445 y := v.Args[1] 11446 v.reset(OpARM64CSELULT) 11447 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11448 v0.AddArg(x) 11449 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11450 v1.AddArg(y) 11451 v0.AddArg(v1) 11452 v.AddArg(v0) 11453 v2 := b.NewValue0(v.Line, OpConst64, t) 11454 v2.AuxInt = 0 11455 v.AddArg(v2) 11456 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11457 v3.AuxInt = 64 11458 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11459 v4.AddArg(y) 11460 v3.AddArg(v4) 11461 v.AddArg(v3) 11462 return true 11463 } 11464 } 11465 func rewriteValueARM64_OpLsh16x64(v *Value, config *Config) bool { 11466 b := v.Block 11467 _ = b 11468 // match: (Lsh16x64 x (MOVDconst [c])) 11469 // cond: uint64(c) < 16 11470 // result: (SLLconst x [c]) 11471 for { 11472 x := v.Args[0] 11473 v_1 := v.Args[1] 11474 if v_1.Op != OpARM64MOVDconst { 11475 break 11476 } 11477 c := v_1.AuxInt 11478 if !(uint64(c) < 16) { 11479 break 11480 } 11481 v.reset(OpARM64SLLconst) 11482 v.AuxInt = c 11483 v.AddArg(x) 11484 return true 11485 } 11486 // match: (Lsh16x64 _ (MOVDconst [c])) 11487 // cond: uint64(c) >= 16 11488 // result: (MOVDconst [0]) 11489 for { 11490 v_1 := v.Args[1] 11491 if v_1.Op != OpARM64MOVDconst { 11492 break 11493 } 11494 c := v_1.AuxInt 11495 if !(uint64(c) >= 16) { 11496 break 11497 } 11498 v.reset(OpARM64MOVDconst) 11499 v.AuxInt = 0 11500 return true 11501 } 11502 // match: (Lsh16x64 <t> x y) 11503 // cond: 11504 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11505 for { 11506 t := v.Type 11507 x := v.Args[0] 11508 y := v.Args[1] 11509 v.reset(OpARM64CSELULT) 11510 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11511 v0.AddArg(x) 11512 v0.AddArg(y) 11513 v.AddArg(v0) 11514 v1 := b.NewValue0(v.Line, OpConst64, t) 11515 v1.AuxInt = 0 11516 v.AddArg(v1) 11517 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11518 v2.AuxInt = 64 11519 v2.AddArg(y) 11520 v.AddArg(v2) 11521 return true 11522 } 11523 } 11524 func rewriteValueARM64_OpLsh16x8(v *Value, config *Config) bool { 11525 b := v.Block 11526 _ = b 11527 // match: (Lsh16x8 <t> x y) 11528 // cond: 11529 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11530 for { 11531 t := v.Type 11532 x := v.Args[0] 11533 y := v.Args[1] 11534 v.reset(OpARM64CSELULT) 11535 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11536 v0.AddArg(x) 11537 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11538 v1.AddArg(y) 11539 v0.AddArg(v1) 11540 v.AddArg(v0) 11541 v2 := b.NewValue0(v.Line, OpConst64, t) 11542 v2.AuxInt = 0 11543 v.AddArg(v2) 11544 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11545 v3.AuxInt = 64 11546 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11547 v4.AddArg(y) 11548 v3.AddArg(v4) 11549 v.AddArg(v3) 11550 return true 11551 } 11552 } 11553 func rewriteValueARM64_OpLsh32x16(v *Value, config *Config) bool { 11554 b := v.Block 11555 _ = b 11556 // match: (Lsh32x16 <t> x y) 11557 // cond: 11558 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11559 for { 11560 t := v.Type 11561 x := v.Args[0] 11562 y := v.Args[1] 11563 v.reset(OpARM64CSELULT) 11564 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11565 v0.AddArg(x) 11566 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11567 v1.AddArg(y) 11568 v0.AddArg(v1) 11569 v.AddArg(v0) 11570 v2 := b.NewValue0(v.Line, OpConst64, t) 11571 v2.AuxInt = 0 11572 v.AddArg(v2) 11573 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11574 v3.AuxInt = 64 11575 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11576 v4.AddArg(y) 11577 v3.AddArg(v4) 11578 v.AddArg(v3) 11579 return true 11580 } 11581 } 11582 func rewriteValueARM64_OpLsh32x32(v *Value, config *Config) bool { 11583 b := v.Block 11584 _ = b 11585 // match: (Lsh32x32 <t> x y) 11586 // cond: 11587 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11588 for { 11589 t := v.Type 11590 x := v.Args[0] 11591 y := v.Args[1] 11592 v.reset(OpARM64CSELULT) 11593 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11594 v0.AddArg(x) 11595 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11596 v1.AddArg(y) 11597 v0.AddArg(v1) 11598 v.AddArg(v0) 11599 v2 := b.NewValue0(v.Line, OpConst64, t) 11600 v2.AuxInt = 0 11601 v.AddArg(v2) 11602 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11603 v3.AuxInt = 64 11604 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11605 v4.AddArg(y) 11606 v3.AddArg(v4) 11607 v.AddArg(v3) 11608 return true 11609 } 11610 } 11611 func rewriteValueARM64_OpLsh32x64(v *Value, config *Config) bool { 11612 b := v.Block 11613 _ = b 11614 // match: (Lsh32x64 x (MOVDconst [c])) 11615 // cond: uint64(c) < 32 11616 // result: (SLLconst x [c]) 11617 for { 11618 x := v.Args[0] 11619 v_1 := v.Args[1] 11620 if v_1.Op != OpARM64MOVDconst { 11621 break 11622 } 11623 c := v_1.AuxInt 11624 if !(uint64(c) < 32) { 11625 break 11626 } 11627 v.reset(OpARM64SLLconst) 11628 v.AuxInt = c 11629 v.AddArg(x) 11630 return true 11631 } 11632 // match: (Lsh32x64 _ (MOVDconst [c])) 11633 // cond: uint64(c) >= 32 11634 // result: (MOVDconst [0]) 11635 for { 11636 v_1 := v.Args[1] 11637 if v_1.Op != OpARM64MOVDconst { 11638 break 11639 } 11640 c := v_1.AuxInt 11641 if !(uint64(c) >= 32) { 11642 break 11643 } 11644 v.reset(OpARM64MOVDconst) 11645 v.AuxInt = 0 11646 return true 11647 } 11648 // match: (Lsh32x64 <t> x y) 11649 // cond: 11650 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11651 for { 11652 t := v.Type 11653 x := v.Args[0] 11654 y := v.Args[1] 11655 v.reset(OpARM64CSELULT) 11656 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11657 v0.AddArg(x) 11658 v0.AddArg(y) 11659 v.AddArg(v0) 11660 v1 := b.NewValue0(v.Line, OpConst64, t) 11661 v1.AuxInt = 0 11662 v.AddArg(v1) 11663 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11664 v2.AuxInt = 64 11665 v2.AddArg(y) 11666 v.AddArg(v2) 11667 return true 11668 } 11669 } 11670 func rewriteValueARM64_OpLsh32x8(v *Value, config *Config) bool { 11671 b := v.Block 11672 _ = b 11673 // match: (Lsh32x8 <t> x y) 11674 // cond: 11675 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11676 for { 11677 t := v.Type 11678 x := v.Args[0] 11679 y := v.Args[1] 11680 v.reset(OpARM64CSELULT) 11681 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11682 v0.AddArg(x) 11683 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11684 v1.AddArg(y) 11685 v0.AddArg(v1) 11686 v.AddArg(v0) 11687 v2 := b.NewValue0(v.Line, OpConst64, t) 11688 v2.AuxInt = 0 11689 v.AddArg(v2) 11690 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11691 v3.AuxInt = 64 11692 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11693 v4.AddArg(y) 11694 v3.AddArg(v4) 11695 v.AddArg(v3) 11696 return true 11697 } 11698 } 11699 func rewriteValueARM64_OpLsh64x16(v *Value, config *Config) bool { 11700 b := v.Block 11701 _ = b 11702 // match: (Lsh64x16 <t> x y) 11703 // cond: 11704 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11705 for { 11706 t := v.Type 11707 x := v.Args[0] 11708 y := v.Args[1] 11709 v.reset(OpARM64CSELULT) 11710 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11711 v0.AddArg(x) 11712 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11713 v1.AddArg(y) 11714 v0.AddArg(v1) 11715 v.AddArg(v0) 11716 v2 := b.NewValue0(v.Line, OpConst64, t) 11717 v2.AuxInt = 0 11718 v.AddArg(v2) 11719 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11720 v3.AuxInt = 64 11721 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11722 v4.AddArg(y) 11723 v3.AddArg(v4) 11724 v.AddArg(v3) 11725 return true 11726 } 11727 } 11728 func rewriteValueARM64_OpLsh64x32(v *Value, config *Config) bool { 11729 b := v.Block 11730 _ = b 11731 // match: (Lsh64x32 <t> x y) 11732 // cond: 11733 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11734 for { 11735 t := v.Type 11736 x := v.Args[0] 11737 y := v.Args[1] 11738 v.reset(OpARM64CSELULT) 11739 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11740 v0.AddArg(x) 11741 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11742 v1.AddArg(y) 11743 v0.AddArg(v1) 11744 v.AddArg(v0) 11745 v2 := b.NewValue0(v.Line, OpConst64, t) 11746 v2.AuxInt = 0 11747 v.AddArg(v2) 11748 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11749 v3.AuxInt = 64 11750 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11751 v4.AddArg(y) 11752 v3.AddArg(v4) 11753 v.AddArg(v3) 11754 return true 11755 } 11756 } 11757 func rewriteValueARM64_OpLsh64x64(v *Value, config *Config) bool { 11758 b := v.Block 11759 _ = b 11760 // match: (Lsh64x64 x (MOVDconst [c])) 11761 // cond: uint64(c) < 64 11762 // result: (SLLconst x [c]) 11763 for { 11764 x := v.Args[0] 11765 v_1 := v.Args[1] 11766 if v_1.Op != OpARM64MOVDconst { 11767 break 11768 } 11769 c := v_1.AuxInt 11770 if !(uint64(c) < 64) { 11771 break 11772 } 11773 v.reset(OpARM64SLLconst) 11774 v.AuxInt = c 11775 v.AddArg(x) 11776 return true 11777 } 11778 // match: (Lsh64x64 _ (MOVDconst [c])) 11779 // cond: uint64(c) >= 64 11780 // result: (MOVDconst [0]) 11781 for { 11782 v_1 := v.Args[1] 11783 if v_1.Op != OpARM64MOVDconst { 11784 break 11785 } 11786 c := v_1.AuxInt 11787 if !(uint64(c) >= 64) { 11788 break 11789 } 11790 v.reset(OpARM64MOVDconst) 11791 v.AuxInt = 0 11792 return true 11793 } 11794 // match: (Lsh64x64 <t> x y) 11795 // cond: 11796 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11797 for { 11798 t := v.Type 11799 x := v.Args[0] 11800 y := v.Args[1] 11801 v.reset(OpARM64CSELULT) 11802 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11803 v0.AddArg(x) 11804 v0.AddArg(y) 11805 v.AddArg(v0) 11806 v1 := b.NewValue0(v.Line, OpConst64, t) 11807 v1.AuxInt = 0 11808 v.AddArg(v1) 11809 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11810 v2.AuxInt = 64 11811 v2.AddArg(y) 11812 v.AddArg(v2) 11813 return true 11814 } 11815 } 11816 func rewriteValueARM64_OpLsh64x8(v *Value, config *Config) bool { 11817 b := v.Block 11818 _ = b 11819 // match: (Lsh64x8 <t> x y) 11820 // cond: 11821 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11822 for { 11823 t := v.Type 11824 x := v.Args[0] 11825 y := v.Args[1] 11826 v.reset(OpARM64CSELULT) 11827 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11828 v0.AddArg(x) 11829 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11830 v1.AddArg(y) 11831 v0.AddArg(v1) 11832 v.AddArg(v0) 11833 v2 := b.NewValue0(v.Line, OpConst64, t) 11834 v2.AuxInt = 0 11835 v.AddArg(v2) 11836 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11837 v3.AuxInt = 64 11838 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11839 v4.AddArg(y) 11840 v3.AddArg(v4) 11841 v.AddArg(v3) 11842 return true 11843 } 11844 } 11845 func rewriteValueARM64_OpLsh8x16(v *Value, config *Config) bool { 11846 b := v.Block 11847 _ = b 11848 // match: (Lsh8x16 <t> x y) 11849 // cond: 11850 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11851 for { 11852 t := v.Type 11853 x := v.Args[0] 11854 y := v.Args[1] 11855 v.reset(OpARM64CSELULT) 11856 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11857 v0.AddArg(x) 11858 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11859 v1.AddArg(y) 11860 v0.AddArg(v1) 11861 v.AddArg(v0) 11862 v2 := b.NewValue0(v.Line, OpConst64, t) 11863 v2.AuxInt = 0 11864 v.AddArg(v2) 11865 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11866 v3.AuxInt = 64 11867 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11868 v4.AddArg(y) 11869 v3.AddArg(v4) 11870 v.AddArg(v3) 11871 return true 11872 } 11873 } 11874 func rewriteValueARM64_OpLsh8x32(v *Value, config *Config) bool { 11875 b := v.Block 11876 _ = b 11877 // match: (Lsh8x32 <t> x y) 11878 // cond: 11879 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11880 for { 11881 t := v.Type 11882 x := v.Args[0] 11883 y := v.Args[1] 11884 v.reset(OpARM64CSELULT) 11885 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11886 v0.AddArg(x) 11887 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11888 v1.AddArg(y) 11889 v0.AddArg(v1) 11890 v.AddArg(v0) 11891 v2 := b.NewValue0(v.Line, OpConst64, t) 11892 v2.AuxInt = 0 11893 v.AddArg(v2) 11894 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11895 v3.AuxInt = 64 11896 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11897 v4.AddArg(y) 11898 v3.AddArg(v4) 11899 v.AddArg(v3) 11900 return true 11901 } 11902 } 11903 func rewriteValueARM64_OpLsh8x64(v *Value, config *Config) bool { 11904 b := v.Block 11905 _ = b 11906 // match: (Lsh8x64 x (MOVDconst [c])) 11907 // cond: uint64(c) < 8 11908 // result: (SLLconst x [c]) 11909 for { 11910 x := v.Args[0] 11911 v_1 := v.Args[1] 11912 if v_1.Op != OpARM64MOVDconst { 11913 break 11914 } 11915 c := v_1.AuxInt 11916 if !(uint64(c) < 8) { 11917 break 11918 } 11919 v.reset(OpARM64SLLconst) 11920 v.AuxInt = c 11921 v.AddArg(x) 11922 return true 11923 } 11924 // match: (Lsh8x64 _ (MOVDconst [c])) 11925 // cond: uint64(c) >= 8 11926 // result: (MOVDconst [0]) 11927 for { 11928 v_1 := v.Args[1] 11929 if v_1.Op != OpARM64MOVDconst { 11930 break 11931 } 11932 c := v_1.AuxInt 11933 if !(uint64(c) >= 8) { 11934 break 11935 } 11936 v.reset(OpARM64MOVDconst) 11937 v.AuxInt = 0 11938 return true 11939 } 11940 // match: (Lsh8x64 <t> x y) 11941 // cond: 11942 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11943 for { 11944 t := v.Type 11945 x := v.Args[0] 11946 y := v.Args[1] 11947 v.reset(OpARM64CSELULT) 11948 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11949 v0.AddArg(x) 11950 v0.AddArg(y) 11951 v.AddArg(v0) 11952 v1 := b.NewValue0(v.Line, OpConst64, t) 11953 v1.AuxInt = 0 11954 v.AddArg(v1) 11955 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11956 v2.AuxInt = 64 11957 v2.AddArg(y) 11958 v.AddArg(v2) 11959 return true 11960 } 11961 } 11962 func rewriteValueARM64_OpLsh8x8(v *Value, config *Config) bool { 11963 b := v.Block 11964 _ = b 11965 // match: (Lsh8x8 <t> x y) 11966 // cond: 11967 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11968 for { 11969 t := v.Type 11970 x := v.Args[0] 11971 y := v.Args[1] 11972 v.reset(OpARM64CSELULT) 11973 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11974 v0.AddArg(x) 11975 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11976 v1.AddArg(y) 11977 v0.AddArg(v1) 11978 v.AddArg(v0) 11979 v2 := b.NewValue0(v.Line, OpConst64, t) 11980 v2.AuxInt = 0 11981 v.AddArg(v2) 11982 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11983 v3.AuxInt = 64 11984 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11985 v4.AddArg(y) 11986 v3.AddArg(v4) 11987 v.AddArg(v3) 11988 return true 11989 } 11990 } 11991 func rewriteValueARM64_OpMod16(v *Value, config *Config) bool { 11992 b := v.Block 11993 _ = b 11994 // match: (Mod16 x y) 11995 // cond: 11996 // result: (MODW (SignExt16to32 x) (SignExt16to32 y)) 11997 for { 11998 x := v.Args[0] 11999 y := v.Args[1] 12000 v.reset(OpARM64MODW) 12001 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 12002 v0.AddArg(x) 12003 v.AddArg(v0) 12004 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 12005 v1.AddArg(y) 12006 v.AddArg(v1) 12007 return true 12008 } 12009 } 12010 func rewriteValueARM64_OpMod16u(v *Value, config *Config) bool { 12011 b := v.Block 12012 _ = b 12013 // match: (Mod16u x y) 12014 // cond: 12015 // result: (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y)) 12016 for { 12017 x := v.Args[0] 12018 y := v.Args[1] 12019 v.reset(OpARM64UMODW) 12020 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12021 v0.AddArg(x) 12022 v.AddArg(v0) 12023 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12024 v1.AddArg(y) 12025 v.AddArg(v1) 12026 return true 12027 } 12028 } 12029 func rewriteValueARM64_OpMod32(v *Value, config *Config) bool { 12030 b := v.Block 12031 _ = b 12032 // match: (Mod32 x y) 12033 // cond: 12034 // result: (MODW x y) 12035 for { 12036 x := v.Args[0] 12037 y := v.Args[1] 12038 v.reset(OpARM64MODW) 12039 v.AddArg(x) 12040 v.AddArg(y) 12041 return true 12042 } 12043 } 12044 func rewriteValueARM64_OpMod32u(v *Value, config *Config) bool { 12045 b := v.Block 12046 _ = b 12047 // match: (Mod32u x y) 12048 // cond: 12049 // result: (UMODW x y) 12050 for { 12051 x := v.Args[0] 12052 y := v.Args[1] 12053 v.reset(OpARM64UMODW) 12054 v.AddArg(x) 12055 v.AddArg(y) 12056 return true 12057 } 12058 } 12059 func rewriteValueARM64_OpMod64(v *Value, config *Config) bool { 12060 b := v.Block 12061 _ = b 12062 // match: (Mod64 x y) 12063 // cond: 12064 // result: (MOD x y) 12065 for { 12066 x := v.Args[0] 12067 y := v.Args[1] 12068 v.reset(OpARM64MOD) 12069 v.AddArg(x) 12070 v.AddArg(y) 12071 return true 12072 } 12073 } 12074 func rewriteValueARM64_OpMod64u(v *Value, config *Config) bool { 12075 b := v.Block 12076 _ = b 12077 // match: (Mod64u x y) 12078 // cond: 12079 // result: (UMOD x y) 12080 for { 12081 x := v.Args[0] 12082 y := v.Args[1] 12083 v.reset(OpARM64UMOD) 12084 v.AddArg(x) 12085 v.AddArg(y) 12086 return true 12087 } 12088 } 12089 func rewriteValueARM64_OpMod8(v *Value, config *Config) bool { 12090 b := v.Block 12091 _ = b 12092 // match: (Mod8 x y) 12093 // cond: 12094 // result: (MODW (SignExt8to32 x) (SignExt8to32 y)) 12095 for { 12096 x := v.Args[0] 12097 y := v.Args[1] 12098 v.reset(OpARM64MODW) 12099 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 12100 v0.AddArg(x) 12101 v.AddArg(v0) 12102 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 12103 v1.AddArg(y) 12104 v.AddArg(v1) 12105 return true 12106 } 12107 } 12108 func rewriteValueARM64_OpMod8u(v *Value, config *Config) bool { 12109 b := v.Block 12110 _ = b 12111 // match: (Mod8u x y) 12112 // cond: 12113 // result: (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y)) 12114 for { 12115 x := v.Args[0] 12116 y := v.Args[1] 12117 v.reset(OpARM64UMODW) 12118 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12119 v0.AddArg(x) 12120 v.AddArg(v0) 12121 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12122 v1.AddArg(y) 12123 v.AddArg(v1) 12124 return true 12125 } 12126 } 12127 func rewriteValueARM64_OpMove(v *Value, config *Config) bool { 12128 b := v.Block 12129 _ = b 12130 // match: (Move [s] _ _ mem) 12131 // cond: SizeAndAlign(s).Size() == 0 12132 // result: mem 12133 for { 12134 s := v.AuxInt 12135 mem := v.Args[2] 12136 if !(SizeAndAlign(s).Size() == 0) { 12137 break 12138 } 12139 v.reset(OpCopy) 12140 v.Type = mem.Type 12141 v.AddArg(mem) 12142 return true 12143 } 12144 // match: (Move [s] dst src mem) 12145 // cond: SizeAndAlign(s).Size() == 1 12146 // result: (MOVBstore dst (MOVBUload src mem) mem) 12147 for { 12148 s := v.AuxInt 12149 dst := v.Args[0] 12150 src := v.Args[1] 12151 mem := v.Args[2] 12152 if !(SizeAndAlign(s).Size() == 1) { 12153 break 12154 } 12155 v.reset(OpARM64MOVBstore) 12156 v.AddArg(dst) 12157 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12158 v0.AddArg(src) 12159 v0.AddArg(mem) 12160 v.AddArg(v0) 12161 v.AddArg(mem) 12162 return true 12163 } 12164 // match: (Move [s] dst src mem) 12165 // cond: SizeAndAlign(s).Size() == 2 12166 // result: (MOVHstore dst (MOVHUload src mem) mem) 12167 for { 12168 s := v.AuxInt 12169 dst := v.Args[0] 12170 src := v.Args[1] 12171 mem := v.Args[2] 12172 if !(SizeAndAlign(s).Size() == 2) { 12173 break 12174 } 12175 v.reset(OpARM64MOVHstore) 12176 v.AddArg(dst) 12177 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12178 v0.AddArg(src) 12179 v0.AddArg(mem) 12180 v.AddArg(v0) 12181 v.AddArg(mem) 12182 return true 12183 } 12184 // match: (Move [s] dst src mem) 12185 // cond: SizeAndAlign(s).Size() == 4 12186 // result: (MOVWstore dst (MOVWUload src mem) mem) 12187 for { 12188 s := v.AuxInt 12189 dst := v.Args[0] 12190 src := v.Args[1] 12191 mem := v.Args[2] 12192 if !(SizeAndAlign(s).Size() == 4) { 12193 break 12194 } 12195 v.reset(OpARM64MOVWstore) 12196 v.AddArg(dst) 12197 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12198 v0.AddArg(src) 12199 v0.AddArg(mem) 12200 v.AddArg(v0) 12201 v.AddArg(mem) 12202 return true 12203 } 12204 // match: (Move [s] dst src mem) 12205 // cond: SizeAndAlign(s).Size() == 8 12206 // result: (MOVDstore dst (MOVDload src mem) mem) 12207 for { 12208 s := v.AuxInt 12209 dst := v.Args[0] 12210 src := v.Args[1] 12211 mem := v.Args[2] 12212 if !(SizeAndAlign(s).Size() == 8) { 12213 break 12214 } 12215 v.reset(OpARM64MOVDstore) 12216 v.AddArg(dst) 12217 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12218 v0.AddArg(src) 12219 v0.AddArg(mem) 12220 v.AddArg(v0) 12221 v.AddArg(mem) 12222 return true 12223 } 12224 // match: (Move [s] dst src mem) 12225 // cond: SizeAndAlign(s).Size() == 3 12226 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 12227 for { 12228 s := v.AuxInt 12229 dst := v.Args[0] 12230 src := v.Args[1] 12231 mem := v.Args[2] 12232 if !(SizeAndAlign(s).Size() == 3) { 12233 break 12234 } 12235 v.reset(OpARM64MOVBstore) 12236 v.AuxInt = 2 12237 v.AddArg(dst) 12238 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12239 v0.AuxInt = 2 12240 v0.AddArg(src) 12241 v0.AddArg(mem) 12242 v.AddArg(v0) 12243 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 12244 v1.AddArg(dst) 12245 v2 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12246 v2.AddArg(src) 12247 v2.AddArg(mem) 12248 v1.AddArg(v2) 12249 v1.AddArg(mem) 12250 v.AddArg(v1) 12251 return true 12252 } 12253 // match: (Move [s] dst src mem) 12254 // cond: SizeAndAlign(s).Size() == 5 12255 // result: (MOVBstore [4] dst (MOVBUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12256 for { 12257 s := v.AuxInt 12258 dst := v.Args[0] 12259 src := v.Args[1] 12260 mem := v.Args[2] 12261 if !(SizeAndAlign(s).Size() == 5) { 12262 break 12263 } 12264 v.reset(OpARM64MOVBstore) 12265 v.AuxInt = 4 12266 v.AddArg(dst) 12267 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12268 v0.AuxInt = 4 12269 v0.AddArg(src) 12270 v0.AddArg(mem) 12271 v.AddArg(v0) 12272 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12273 v1.AddArg(dst) 12274 v2 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12275 v2.AddArg(src) 12276 v2.AddArg(mem) 12277 v1.AddArg(v2) 12278 v1.AddArg(mem) 12279 v.AddArg(v1) 12280 return true 12281 } 12282 // match: (Move [s] dst src mem) 12283 // cond: SizeAndAlign(s).Size() == 6 12284 // result: (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12285 for { 12286 s := v.AuxInt 12287 dst := v.Args[0] 12288 src := v.Args[1] 12289 mem := v.Args[2] 12290 if !(SizeAndAlign(s).Size() == 6) { 12291 break 12292 } 12293 v.reset(OpARM64MOVHstore) 12294 v.AuxInt = 4 12295 v.AddArg(dst) 12296 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12297 v0.AuxInt = 4 12298 v0.AddArg(src) 12299 v0.AddArg(mem) 12300 v.AddArg(v0) 12301 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12302 v1.AddArg(dst) 12303 v2 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12304 v2.AddArg(src) 12305 v2.AddArg(mem) 12306 v1.AddArg(v2) 12307 v1.AddArg(mem) 12308 v.AddArg(v1) 12309 return true 12310 } 12311 // match: (Move [s] dst src mem) 12312 // cond: SizeAndAlign(s).Size() == 7 12313 // result: (MOVBstore [6] dst (MOVBUload [6] src mem) (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem))) 12314 for { 12315 s := v.AuxInt 12316 dst := v.Args[0] 12317 src := v.Args[1] 12318 mem := v.Args[2] 12319 if !(SizeAndAlign(s).Size() == 7) { 12320 break 12321 } 12322 v.reset(OpARM64MOVBstore) 12323 v.AuxInt = 6 12324 v.AddArg(dst) 12325 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12326 v0.AuxInt = 6 12327 v0.AddArg(src) 12328 v0.AddArg(mem) 12329 v.AddArg(v0) 12330 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 12331 v1.AuxInt = 4 12332 v1.AddArg(dst) 12333 v2 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12334 v2.AuxInt = 4 12335 v2.AddArg(src) 12336 v2.AddArg(mem) 12337 v1.AddArg(v2) 12338 v3 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12339 v3.AddArg(dst) 12340 v4 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12341 v4.AddArg(src) 12342 v4.AddArg(mem) 12343 v3.AddArg(v4) 12344 v3.AddArg(mem) 12345 v1.AddArg(v3) 12346 v.AddArg(v1) 12347 return true 12348 } 12349 // match: (Move [s] dst src mem) 12350 // cond: SizeAndAlign(s).Size() == 12 12351 // result: (MOVWstore [8] dst (MOVWUload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12352 for { 12353 s := v.AuxInt 12354 dst := v.Args[0] 12355 src := v.Args[1] 12356 mem := v.Args[2] 12357 if !(SizeAndAlign(s).Size() == 12) { 12358 break 12359 } 12360 v.reset(OpARM64MOVWstore) 12361 v.AuxInt = 8 12362 v.AddArg(dst) 12363 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12364 v0.AuxInt = 8 12365 v0.AddArg(src) 12366 v0.AddArg(mem) 12367 v.AddArg(v0) 12368 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12369 v1.AddArg(dst) 12370 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12371 v2.AddArg(src) 12372 v2.AddArg(mem) 12373 v1.AddArg(v2) 12374 v1.AddArg(mem) 12375 v.AddArg(v1) 12376 return true 12377 } 12378 // match: (Move [s] dst src mem) 12379 // cond: SizeAndAlign(s).Size() == 16 12380 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12381 for { 12382 s := v.AuxInt 12383 dst := v.Args[0] 12384 src := v.Args[1] 12385 mem := v.Args[2] 12386 if !(SizeAndAlign(s).Size() == 16) { 12387 break 12388 } 12389 v.reset(OpARM64MOVDstore) 12390 v.AuxInt = 8 12391 v.AddArg(dst) 12392 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12393 v0.AuxInt = 8 12394 v0.AddArg(src) 12395 v0.AddArg(mem) 12396 v.AddArg(v0) 12397 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12398 v1.AddArg(dst) 12399 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12400 v2.AddArg(src) 12401 v2.AddArg(mem) 12402 v1.AddArg(v2) 12403 v1.AddArg(mem) 12404 v.AddArg(v1) 12405 return true 12406 } 12407 // match: (Move [s] dst src mem) 12408 // cond: SizeAndAlign(s).Size() == 24 12409 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 12410 for { 12411 s := v.AuxInt 12412 dst := v.Args[0] 12413 src := v.Args[1] 12414 mem := v.Args[2] 12415 if !(SizeAndAlign(s).Size() == 24) { 12416 break 12417 } 12418 v.reset(OpARM64MOVDstore) 12419 v.AuxInt = 16 12420 v.AddArg(dst) 12421 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12422 v0.AuxInt = 16 12423 v0.AddArg(src) 12424 v0.AddArg(mem) 12425 v.AddArg(v0) 12426 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12427 v1.AuxInt = 8 12428 v1.AddArg(dst) 12429 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12430 v2.AuxInt = 8 12431 v2.AddArg(src) 12432 v2.AddArg(mem) 12433 v1.AddArg(v2) 12434 v3 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12435 v3.AddArg(dst) 12436 v4 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12437 v4.AddArg(src) 12438 v4.AddArg(mem) 12439 v3.AddArg(v4) 12440 v3.AddArg(mem) 12441 v1.AddArg(v3) 12442 v.AddArg(v1) 12443 return true 12444 } 12445 // match: (Move [s] dst src mem) 12446 // cond: SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8 12447 // result: (Move [MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64()] (OffPtr <dst.Type> dst [SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8]) (OffPtr <src.Type> src [SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8]) (Move [MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64()] dst src mem)) 12448 for { 12449 s := v.AuxInt 12450 dst := v.Args[0] 12451 src := v.Args[1] 12452 mem := v.Args[2] 12453 if !(SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8) { 12454 break 12455 } 12456 v.reset(OpMove) 12457 v.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64() 12458 v0 := b.NewValue0(v.Line, OpOffPtr, dst.Type) 12459 v0.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 12460 v0.AddArg(dst) 12461 v.AddArg(v0) 12462 v1 := b.NewValue0(v.Line, OpOffPtr, src.Type) 12463 v1.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 12464 v1.AddArg(src) 12465 v.AddArg(v1) 12466 v2 := b.NewValue0(v.Line, OpMove, TypeMem) 12467 v2.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64() 12468 v2.AddArg(dst) 12469 v2.AddArg(src) 12470 v2.AddArg(mem) 12471 v.AddArg(v2) 12472 return true 12473 } 12474 // match: (Move [s] dst src mem) 12475 // cond: SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice 12476 // result: (DUFFCOPY [8 * (128 - int64(SizeAndAlign(s).Size()/8))] dst src mem) 12477 for { 12478 s := v.AuxInt 12479 dst := v.Args[0] 12480 src := v.Args[1] 12481 mem := v.Args[2] 12482 if !(SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice) { 12483 break 12484 } 12485 v.reset(OpARM64DUFFCOPY) 12486 v.AuxInt = 8 * (128 - int64(SizeAndAlign(s).Size()/8)) 12487 v.AddArg(dst) 12488 v.AddArg(src) 12489 v.AddArg(mem) 12490 return true 12491 } 12492 // match: (Move [s] dst src mem) 12493 // cond: SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size()%8 == 0 12494 // result: (LoweredMove dst src (ADDconst <src.Type> src [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) mem) 12495 for { 12496 s := v.AuxInt 12497 dst := v.Args[0] 12498 src := v.Args[1] 12499 mem := v.Args[2] 12500 if !(SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size()%8 == 0) { 12501 break 12502 } 12503 v.reset(OpARM64LoweredMove) 12504 v.AddArg(dst) 12505 v.AddArg(src) 12506 v0 := b.NewValue0(v.Line, OpARM64ADDconst, src.Type) 12507 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 12508 v0.AddArg(src) 12509 v.AddArg(v0) 12510 v.AddArg(mem) 12511 return true 12512 } 12513 return false 12514 } 12515 func rewriteValueARM64_OpMul16(v *Value, config *Config) bool { 12516 b := v.Block 12517 _ = b 12518 // match: (Mul16 x y) 12519 // cond: 12520 // result: (MULW x y) 12521 for { 12522 x := v.Args[0] 12523 y := v.Args[1] 12524 v.reset(OpARM64MULW) 12525 v.AddArg(x) 12526 v.AddArg(y) 12527 return true 12528 } 12529 } 12530 func rewriteValueARM64_OpMul32(v *Value, config *Config) bool { 12531 b := v.Block 12532 _ = b 12533 // match: (Mul32 x y) 12534 // cond: 12535 // result: (MULW x y) 12536 for { 12537 x := v.Args[0] 12538 y := v.Args[1] 12539 v.reset(OpARM64MULW) 12540 v.AddArg(x) 12541 v.AddArg(y) 12542 return true 12543 } 12544 } 12545 func rewriteValueARM64_OpMul32F(v *Value, config *Config) bool { 12546 b := v.Block 12547 _ = b 12548 // match: (Mul32F x y) 12549 // cond: 12550 // result: (FMULS x y) 12551 for { 12552 x := v.Args[0] 12553 y := v.Args[1] 12554 v.reset(OpARM64FMULS) 12555 v.AddArg(x) 12556 v.AddArg(y) 12557 return true 12558 } 12559 } 12560 func rewriteValueARM64_OpMul64(v *Value, config *Config) bool { 12561 b := v.Block 12562 _ = b 12563 // match: (Mul64 x y) 12564 // cond: 12565 // result: (MUL x y) 12566 for { 12567 x := v.Args[0] 12568 y := v.Args[1] 12569 v.reset(OpARM64MUL) 12570 v.AddArg(x) 12571 v.AddArg(y) 12572 return true 12573 } 12574 } 12575 func rewriteValueARM64_OpMul64F(v *Value, config *Config) bool { 12576 b := v.Block 12577 _ = b 12578 // match: (Mul64F x y) 12579 // cond: 12580 // result: (FMULD x y) 12581 for { 12582 x := v.Args[0] 12583 y := v.Args[1] 12584 v.reset(OpARM64FMULD) 12585 v.AddArg(x) 12586 v.AddArg(y) 12587 return true 12588 } 12589 } 12590 func rewriteValueARM64_OpMul8(v *Value, config *Config) bool { 12591 b := v.Block 12592 _ = b 12593 // match: (Mul8 x y) 12594 // cond: 12595 // result: (MULW x y) 12596 for { 12597 x := v.Args[0] 12598 y := v.Args[1] 12599 v.reset(OpARM64MULW) 12600 v.AddArg(x) 12601 v.AddArg(y) 12602 return true 12603 } 12604 } 12605 func rewriteValueARM64_OpNeg16(v *Value, config *Config) bool { 12606 b := v.Block 12607 _ = b 12608 // match: (Neg16 x) 12609 // cond: 12610 // result: (NEG x) 12611 for { 12612 x := v.Args[0] 12613 v.reset(OpARM64NEG) 12614 v.AddArg(x) 12615 return true 12616 } 12617 } 12618 func rewriteValueARM64_OpNeg32(v *Value, config *Config) bool { 12619 b := v.Block 12620 _ = b 12621 // match: (Neg32 x) 12622 // cond: 12623 // result: (NEG x) 12624 for { 12625 x := v.Args[0] 12626 v.reset(OpARM64NEG) 12627 v.AddArg(x) 12628 return true 12629 } 12630 } 12631 func rewriteValueARM64_OpNeg32F(v *Value, config *Config) bool { 12632 b := v.Block 12633 _ = b 12634 // match: (Neg32F x) 12635 // cond: 12636 // result: (FNEGS x) 12637 for { 12638 x := v.Args[0] 12639 v.reset(OpARM64FNEGS) 12640 v.AddArg(x) 12641 return true 12642 } 12643 } 12644 func rewriteValueARM64_OpNeg64(v *Value, config *Config) bool { 12645 b := v.Block 12646 _ = b 12647 // match: (Neg64 x) 12648 // cond: 12649 // result: (NEG x) 12650 for { 12651 x := v.Args[0] 12652 v.reset(OpARM64NEG) 12653 v.AddArg(x) 12654 return true 12655 } 12656 } 12657 func rewriteValueARM64_OpNeg64F(v *Value, config *Config) bool { 12658 b := v.Block 12659 _ = b 12660 // match: (Neg64F x) 12661 // cond: 12662 // result: (FNEGD x) 12663 for { 12664 x := v.Args[0] 12665 v.reset(OpARM64FNEGD) 12666 v.AddArg(x) 12667 return true 12668 } 12669 } 12670 func rewriteValueARM64_OpNeg8(v *Value, config *Config) bool { 12671 b := v.Block 12672 _ = b 12673 // match: (Neg8 x) 12674 // cond: 12675 // result: (NEG x) 12676 for { 12677 x := v.Args[0] 12678 v.reset(OpARM64NEG) 12679 v.AddArg(x) 12680 return true 12681 } 12682 } 12683 func rewriteValueARM64_OpNeq16(v *Value, config *Config) bool { 12684 b := v.Block 12685 _ = b 12686 // match: (Neq16 x y) 12687 // cond: 12688 // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 12689 for { 12690 x := v.Args[0] 12691 y := v.Args[1] 12692 v.reset(OpARM64NotEqual) 12693 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12694 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12695 v1.AddArg(x) 12696 v0.AddArg(v1) 12697 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12698 v2.AddArg(y) 12699 v0.AddArg(v2) 12700 v.AddArg(v0) 12701 return true 12702 } 12703 } 12704 func rewriteValueARM64_OpNeq32(v *Value, config *Config) bool { 12705 b := v.Block 12706 _ = b 12707 // match: (Neq32 x y) 12708 // cond: 12709 // result: (NotEqual (CMPW x y)) 12710 for { 12711 x := v.Args[0] 12712 y := v.Args[1] 12713 v.reset(OpARM64NotEqual) 12714 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12715 v0.AddArg(x) 12716 v0.AddArg(y) 12717 v.AddArg(v0) 12718 return true 12719 } 12720 } 12721 func rewriteValueARM64_OpNeq32F(v *Value, config *Config) bool { 12722 b := v.Block 12723 _ = b 12724 // match: (Neq32F x y) 12725 // cond: 12726 // result: (NotEqual (FCMPS x y)) 12727 for { 12728 x := v.Args[0] 12729 y := v.Args[1] 12730 v.reset(OpARM64NotEqual) 12731 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 12732 v0.AddArg(x) 12733 v0.AddArg(y) 12734 v.AddArg(v0) 12735 return true 12736 } 12737 } 12738 func rewriteValueARM64_OpNeq64(v *Value, config *Config) bool { 12739 b := v.Block 12740 _ = b 12741 // match: (Neq64 x y) 12742 // cond: 12743 // result: (NotEqual (CMP x y)) 12744 for { 12745 x := v.Args[0] 12746 y := v.Args[1] 12747 v.reset(OpARM64NotEqual) 12748 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 12749 v0.AddArg(x) 12750 v0.AddArg(y) 12751 v.AddArg(v0) 12752 return true 12753 } 12754 } 12755 func rewriteValueARM64_OpNeq64F(v *Value, config *Config) bool { 12756 b := v.Block 12757 _ = b 12758 // match: (Neq64F x y) 12759 // cond: 12760 // result: (NotEqual (FCMPD x y)) 12761 for { 12762 x := v.Args[0] 12763 y := v.Args[1] 12764 v.reset(OpARM64NotEqual) 12765 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 12766 v0.AddArg(x) 12767 v0.AddArg(y) 12768 v.AddArg(v0) 12769 return true 12770 } 12771 } 12772 func rewriteValueARM64_OpNeq8(v *Value, config *Config) bool { 12773 b := v.Block 12774 _ = b 12775 // match: (Neq8 x y) 12776 // cond: 12777 // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 12778 for { 12779 x := v.Args[0] 12780 y := v.Args[1] 12781 v.reset(OpARM64NotEqual) 12782 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12783 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12784 v1.AddArg(x) 12785 v0.AddArg(v1) 12786 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12787 v2.AddArg(y) 12788 v0.AddArg(v2) 12789 v.AddArg(v0) 12790 return true 12791 } 12792 } 12793 func rewriteValueARM64_OpNeqB(v *Value, config *Config) bool { 12794 b := v.Block 12795 _ = b 12796 // match: (NeqB x y) 12797 // cond: 12798 // result: (XOR x y) 12799 for { 12800 x := v.Args[0] 12801 y := v.Args[1] 12802 v.reset(OpARM64XOR) 12803 v.AddArg(x) 12804 v.AddArg(y) 12805 return true 12806 } 12807 } 12808 func rewriteValueARM64_OpNeqPtr(v *Value, config *Config) bool { 12809 b := v.Block 12810 _ = b 12811 // match: (NeqPtr x y) 12812 // cond: 12813 // result: (NotEqual (CMP x y)) 12814 for { 12815 x := v.Args[0] 12816 y := v.Args[1] 12817 v.reset(OpARM64NotEqual) 12818 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 12819 v0.AddArg(x) 12820 v0.AddArg(y) 12821 v.AddArg(v0) 12822 return true 12823 } 12824 } 12825 func rewriteValueARM64_OpNilCheck(v *Value, config *Config) bool { 12826 b := v.Block 12827 _ = b 12828 // match: (NilCheck ptr mem) 12829 // cond: 12830 // result: (LoweredNilCheck ptr mem) 12831 for { 12832 ptr := v.Args[0] 12833 mem := v.Args[1] 12834 v.reset(OpARM64LoweredNilCheck) 12835 v.AddArg(ptr) 12836 v.AddArg(mem) 12837 return true 12838 } 12839 } 12840 func rewriteValueARM64_OpNot(v *Value, config *Config) bool { 12841 b := v.Block 12842 _ = b 12843 // match: (Not x) 12844 // cond: 12845 // result: (XOR (MOVDconst [1]) x) 12846 for { 12847 x := v.Args[0] 12848 v.reset(OpARM64XOR) 12849 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 12850 v0.AuxInt = 1 12851 v.AddArg(v0) 12852 v.AddArg(x) 12853 return true 12854 } 12855 } 12856 func rewriteValueARM64_OpOffPtr(v *Value, config *Config) bool { 12857 b := v.Block 12858 _ = b 12859 // match: (OffPtr [off] ptr:(SP)) 12860 // cond: 12861 // result: (MOVDaddr [off] ptr) 12862 for { 12863 off := v.AuxInt 12864 ptr := v.Args[0] 12865 if ptr.Op != OpSP { 12866 break 12867 } 12868 v.reset(OpARM64MOVDaddr) 12869 v.AuxInt = off 12870 v.AddArg(ptr) 12871 return true 12872 } 12873 // match: (OffPtr [off] ptr) 12874 // cond: 12875 // result: (ADDconst [off] ptr) 12876 for { 12877 off := v.AuxInt 12878 ptr := v.Args[0] 12879 v.reset(OpARM64ADDconst) 12880 v.AuxInt = off 12881 v.AddArg(ptr) 12882 return true 12883 } 12884 } 12885 func rewriteValueARM64_OpOr16(v *Value, config *Config) bool { 12886 b := v.Block 12887 _ = b 12888 // match: (Or16 x y) 12889 // cond: 12890 // result: (OR x y) 12891 for { 12892 x := v.Args[0] 12893 y := v.Args[1] 12894 v.reset(OpARM64OR) 12895 v.AddArg(x) 12896 v.AddArg(y) 12897 return true 12898 } 12899 } 12900 func rewriteValueARM64_OpOr32(v *Value, config *Config) bool { 12901 b := v.Block 12902 _ = b 12903 // match: (Or32 x y) 12904 // cond: 12905 // result: (OR x y) 12906 for { 12907 x := v.Args[0] 12908 y := v.Args[1] 12909 v.reset(OpARM64OR) 12910 v.AddArg(x) 12911 v.AddArg(y) 12912 return true 12913 } 12914 } 12915 func rewriteValueARM64_OpOr64(v *Value, config *Config) bool { 12916 b := v.Block 12917 _ = b 12918 // match: (Or64 x y) 12919 // cond: 12920 // result: (OR x y) 12921 for { 12922 x := v.Args[0] 12923 y := v.Args[1] 12924 v.reset(OpARM64OR) 12925 v.AddArg(x) 12926 v.AddArg(y) 12927 return true 12928 } 12929 } 12930 func rewriteValueARM64_OpOr8(v *Value, config *Config) bool { 12931 b := v.Block 12932 _ = b 12933 // match: (Or8 x y) 12934 // cond: 12935 // result: (OR x y) 12936 for { 12937 x := v.Args[0] 12938 y := v.Args[1] 12939 v.reset(OpARM64OR) 12940 v.AddArg(x) 12941 v.AddArg(y) 12942 return true 12943 } 12944 } 12945 func rewriteValueARM64_OpOrB(v *Value, config *Config) bool { 12946 b := v.Block 12947 _ = b 12948 // match: (OrB x y) 12949 // cond: 12950 // result: (OR x y) 12951 for { 12952 x := v.Args[0] 12953 y := v.Args[1] 12954 v.reset(OpARM64OR) 12955 v.AddArg(x) 12956 v.AddArg(y) 12957 return true 12958 } 12959 } 12960 func rewriteValueARM64_OpRsh16Ux16(v *Value, config *Config) bool { 12961 b := v.Block 12962 _ = b 12963 // match: (Rsh16Ux16 <t> x y) 12964 // cond: 12965 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 12966 for { 12967 t := v.Type 12968 x := v.Args[0] 12969 y := v.Args[1] 12970 v.reset(OpARM64CSELULT) 12971 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 12972 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12973 v1.AddArg(x) 12974 v0.AddArg(v1) 12975 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12976 v2.AddArg(y) 12977 v0.AddArg(v2) 12978 v.AddArg(v0) 12979 v3 := b.NewValue0(v.Line, OpConst64, t) 12980 v3.AuxInt = 0 12981 v.AddArg(v3) 12982 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 12983 v4.AuxInt = 64 12984 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12985 v5.AddArg(y) 12986 v4.AddArg(v5) 12987 v.AddArg(v4) 12988 return true 12989 } 12990 } 12991 func rewriteValueARM64_OpRsh16Ux32(v *Value, config *Config) bool { 12992 b := v.Block 12993 _ = b 12994 // match: (Rsh16Ux32 <t> x y) 12995 // cond: 12996 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 12997 for { 12998 t := v.Type 12999 x := v.Args[0] 13000 y := v.Args[1] 13001 v.reset(OpARM64CSELULT) 13002 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13003 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13004 v1.AddArg(x) 13005 v0.AddArg(v1) 13006 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13007 v2.AddArg(y) 13008 v0.AddArg(v2) 13009 v.AddArg(v0) 13010 v3 := b.NewValue0(v.Line, OpConst64, t) 13011 v3.AuxInt = 0 13012 v.AddArg(v3) 13013 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13014 v4.AuxInt = 64 13015 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13016 v5.AddArg(y) 13017 v4.AddArg(v5) 13018 v.AddArg(v4) 13019 return true 13020 } 13021 } 13022 func rewriteValueARM64_OpRsh16Ux64(v *Value, config *Config) bool { 13023 b := v.Block 13024 _ = b 13025 // match: (Rsh16Ux64 x (MOVDconst [c])) 13026 // cond: uint64(c) < 16 13027 // result: (SRLconst (ZeroExt16to64 x) [c]) 13028 for { 13029 x := v.Args[0] 13030 v_1 := v.Args[1] 13031 if v_1.Op != OpARM64MOVDconst { 13032 break 13033 } 13034 c := v_1.AuxInt 13035 if !(uint64(c) < 16) { 13036 break 13037 } 13038 v.reset(OpARM64SRLconst) 13039 v.AuxInt = c 13040 v0 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13041 v0.AddArg(x) 13042 v.AddArg(v0) 13043 return true 13044 } 13045 // match: (Rsh16Ux64 _ (MOVDconst [c])) 13046 // cond: uint64(c) >= 16 13047 // result: (MOVDconst [0]) 13048 for { 13049 v_1 := v.Args[1] 13050 if v_1.Op != OpARM64MOVDconst { 13051 break 13052 } 13053 c := v_1.AuxInt 13054 if !(uint64(c) >= 16) { 13055 break 13056 } 13057 v.reset(OpARM64MOVDconst) 13058 v.AuxInt = 0 13059 return true 13060 } 13061 // match: (Rsh16Ux64 <t> x y) 13062 // cond: 13063 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13064 for { 13065 t := v.Type 13066 x := v.Args[0] 13067 y := v.Args[1] 13068 v.reset(OpARM64CSELULT) 13069 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13070 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13071 v1.AddArg(x) 13072 v0.AddArg(v1) 13073 v0.AddArg(y) 13074 v.AddArg(v0) 13075 v2 := b.NewValue0(v.Line, OpConst64, t) 13076 v2.AuxInt = 0 13077 v.AddArg(v2) 13078 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13079 v3.AuxInt = 64 13080 v3.AddArg(y) 13081 v.AddArg(v3) 13082 return true 13083 } 13084 } 13085 func rewriteValueARM64_OpRsh16Ux8(v *Value, config *Config) bool { 13086 b := v.Block 13087 _ = b 13088 // match: (Rsh16Ux8 <t> x y) 13089 // cond: 13090 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13091 for { 13092 t := v.Type 13093 x := v.Args[0] 13094 y := v.Args[1] 13095 v.reset(OpARM64CSELULT) 13096 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13097 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13098 v1.AddArg(x) 13099 v0.AddArg(v1) 13100 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13101 v2.AddArg(y) 13102 v0.AddArg(v2) 13103 v.AddArg(v0) 13104 v3 := b.NewValue0(v.Line, OpConst64, t) 13105 v3.AuxInt = 0 13106 v.AddArg(v3) 13107 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13108 v4.AuxInt = 64 13109 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13110 v5.AddArg(y) 13111 v4.AddArg(v5) 13112 v.AddArg(v4) 13113 return true 13114 } 13115 } 13116 func rewriteValueARM64_OpRsh16x16(v *Value, config *Config) bool { 13117 b := v.Block 13118 _ = b 13119 // match: (Rsh16x16 x y) 13120 // cond: 13121 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13122 for { 13123 x := v.Args[0] 13124 y := v.Args[1] 13125 v.reset(OpARM64SRA) 13126 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13127 v0.AddArg(x) 13128 v.AddArg(v0) 13129 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13130 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13131 v2.AddArg(y) 13132 v1.AddArg(v2) 13133 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13134 v3.AuxInt = 63 13135 v1.AddArg(v3) 13136 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13137 v4.AuxInt = 64 13138 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13139 v5.AddArg(y) 13140 v4.AddArg(v5) 13141 v1.AddArg(v4) 13142 v.AddArg(v1) 13143 return true 13144 } 13145 } 13146 func rewriteValueARM64_OpRsh16x32(v *Value, config *Config) bool { 13147 b := v.Block 13148 _ = b 13149 // match: (Rsh16x32 x y) 13150 // cond: 13151 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13152 for { 13153 x := v.Args[0] 13154 y := v.Args[1] 13155 v.reset(OpARM64SRA) 13156 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13157 v0.AddArg(x) 13158 v.AddArg(v0) 13159 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13160 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13161 v2.AddArg(y) 13162 v1.AddArg(v2) 13163 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13164 v3.AuxInt = 63 13165 v1.AddArg(v3) 13166 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13167 v4.AuxInt = 64 13168 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13169 v5.AddArg(y) 13170 v4.AddArg(v5) 13171 v1.AddArg(v4) 13172 v.AddArg(v1) 13173 return true 13174 } 13175 } 13176 func rewriteValueARM64_OpRsh16x64(v *Value, config *Config) bool { 13177 b := v.Block 13178 _ = b 13179 // match: (Rsh16x64 x (MOVDconst [c])) 13180 // cond: uint64(c) < 16 13181 // result: (SRAconst (SignExt16to64 x) [c]) 13182 for { 13183 x := v.Args[0] 13184 v_1 := v.Args[1] 13185 if v_1.Op != OpARM64MOVDconst { 13186 break 13187 } 13188 c := v_1.AuxInt 13189 if !(uint64(c) < 16) { 13190 break 13191 } 13192 v.reset(OpARM64SRAconst) 13193 v.AuxInt = c 13194 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13195 v0.AddArg(x) 13196 v.AddArg(v0) 13197 return true 13198 } 13199 // match: (Rsh16x64 x (MOVDconst [c])) 13200 // cond: uint64(c) >= 16 13201 // result: (SRAconst (SignExt16to64 x) [63]) 13202 for { 13203 x := v.Args[0] 13204 v_1 := v.Args[1] 13205 if v_1.Op != OpARM64MOVDconst { 13206 break 13207 } 13208 c := v_1.AuxInt 13209 if !(uint64(c) >= 16) { 13210 break 13211 } 13212 v.reset(OpARM64SRAconst) 13213 v.AuxInt = 63 13214 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13215 v0.AddArg(x) 13216 v.AddArg(v0) 13217 return true 13218 } 13219 // match: (Rsh16x64 x y) 13220 // cond: 13221 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13222 for { 13223 x := v.Args[0] 13224 y := v.Args[1] 13225 v.reset(OpARM64SRA) 13226 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13227 v0.AddArg(x) 13228 v.AddArg(v0) 13229 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13230 v1.AddArg(y) 13231 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13232 v2.AuxInt = 63 13233 v1.AddArg(v2) 13234 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13235 v3.AuxInt = 64 13236 v3.AddArg(y) 13237 v1.AddArg(v3) 13238 v.AddArg(v1) 13239 return true 13240 } 13241 } 13242 func rewriteValueARM64_OpRsh16x8(v *Value, config *Config) bool { 13243 b := v.Block 13244 _ = b 13245 // match: (Rsh16x8 x y) 13246 // cond: 13247 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13248 for { 13249 x := v.Args[0] 13250 y := v.Args[1] 13251 v.reset(OpARM64SRA) 13252 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13253 v0.AddArg(x) 13254 v.AddArg(v0) 13255 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13256 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13257 v2.AddArg(y) 13258 v1.AddArg(v2) 13259 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13260 v3.AuxInt = 63 13261 v1.AddArg(v3) 13262 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13263 v4.AuxInt = 64 13264 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13265 v5.AddArg(y) 13266 v4.AddArg(v5) 13267 v1.AddArg(v4) 13268 v.AddArg(v1) 13269 return true 13270 } 13271 } 13272 func rewriteValueARM64_OpRsh32Ux16(v *Value, config *Config) bool { 13273 b := v.Block 13274 _ = b 13275 // match: (Rsh32Ux16 <t> x y) 13276 // cond: 13277 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13278 for { 13279 t := v.Type 13280 x := v.Args[0] 13281 y := v.Args[1] 13282 v.reset(OpARM64CSELULT) 13283 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13284 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13285 v1.AddArg(x) 13286 v0.AddArg(v1) 13287 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13288 v2.AddArg(y) 13289 v0.AddArg(v2) 13290 v.AddArg(v0) 13291 v3 := b.NewValue0(v.Line, OpConst64, t) 13292 v3.AuxInt = 0 13293 v.AddArg(v3) 13294 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13295 v4.AuxInt = 64 13296 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13297 v5.AddArg(y) 13298 v4.AddArg(v5) 13299 v.AddArg(v4) 13300 return true 13301 } 13302 } 13303 func rewriteValueARM64_OpRsh32Ux32(v *Value, config *Config) bool { 13304 b := v.Block 13305 _ = b 13306 // match: (Rsh32Ux32 <t> x y) 13307 // cond: 13308 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13309 for { 13310 t := v.Type 13311 x := v.Args[0] 13312 y := v.Args[1] 13313 v.reset(OpARM64CSELULT) 13314 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13315 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13316 v1.AddArg(x) 13317 v0.AddArg(v1) 13318 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13319 v2.AddArg(y) 13320 v0.AddArg(v2) 13321 v.AddArg(v0) 13322 v3 := b.NewValue0(v.Line, OpConst64, t) 13323 v3.AuxInt = 0 13324 v.AddArg(v3) 13325 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13326 v4.AuxInt = 64 13327 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13328 v5.AddArg(y) 13329 v4.AddArg(v5) 13330 v.AddArg(v4) 13331 return true 13332 } 13333 } 13334 func rewriteValueARM64_OpRsh32Ux64(v *Value, config *Config) bool { 13335 b := v.Block 13336 _ = b 13337 // match: (Rsh32Ux64 x (MOVDconst [c])) 13338 // cond: uint64(c) < 32 13339 // result: (SRLconst (ZeroExt32to64 x) [c]) 13340 for { 13341 x := v.Args[0] 13342 v_1 := v.Args[1] 13343 if v_1.Op != OpARM64MOVDconst { 13344 break 13345 } 13346 c := v_1.AuxInt 13347 if !(uint64(c) < 32) { 13348 break 13349 } 13350 v.reset(OpARM64SRLconst) 13351 v.AuxInt = c 13352 v0 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13353 v0.AddArg(x) 13354 v.AddArg(v0) 13355 return true 13356 } 13357 // match: (Rsh32Ux64 _ (MOVDconst [c])) 13358 // cond: uint64(c) >= 32 13359 // result: (MOVDconst [0]) 13360 for { 13361 v_1 := v.Args[1] 13362 if v_1.Op != OpARM64MOVDconst { 13363 break 13364 } 13365 c := v_1.AuxInt 13366 if !(uint64(c) >= 32) { 13367 break 13368 } 13369 v.reset(OpARM64MOVDconst) 13370 v.AuxInt = 0 13371 return true 13372 } 13373 // match: (Rsh32Ux64 <t> x y) 13374 // cond: 13375 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13376 for { 13377 t := v.Type 13378 x := v.Args[0] 13379 y := v.Args[1] 13380 v.reset(OpARM64CSELULT) 13381 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13382 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13383 v1.AddArg(x) 13384 v0.AddArg(v1) 13385 v0.AddArg(y) 13386 v.AddArg(v0) 13387 v2 := b.NewValue0(v.Line, OpConst64, t) 13388 v2.AuxInt = 0 13389 v.AddArg(v2) 13390 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13391 v3.AuxInt = 64 13392 v3.AddArg(y) 13393 v.AddArg(v3) 13394 return true 13395 } 13396 } 13397 func rewriteValueARM64_OpRsh32Ux8(v *Value, config *Config) bool { 13398 b := v.Block 13399 _ = b 13400 // match: (Rsh32Ux8 <t> x y) 13401 // cond: 13402 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13403 for { 13404 t := v.Type 13405 x := v.Args[0] 13406 y := v.Args[1] 13407 v.reset(OpARM64CSELULT) 13408 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13409 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13410 v1.AddArg(x) 13411 v0.AddArg(v1) 13412 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13413 v2.AddArg(y) 13414 v0.AddArg(v2) 13415 v.AddArg(v0) 13416 v3 := b.NewValue0(v.Line, OpConst64, t) 13417 v3.AuxInt = 0 13418 v.AddArg(v3) 13419 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13420 v4.AuxInt = 64 13421 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13422 v5.AddArg(y) 13423 v4.AddArg(v5) 13424 v.AddArg(v4) 13425 return true 13426 } 13427 } 13428 func rewriteValueARM64_OpRsh32x16(v *Value, config *Config) bool { 13429 b := v.Block 13430 _ = b 13431 // match: (Rsh32x16 x y) 13432 // cond: 13433 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13434 for { 13435 x := v.Args[0] 13436 y := v.Args[1] 13437 v.reset(OpARM64SRA) 13438 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13439 v0.AddArg(x) 13440 v.AddArg(v0) 13441 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13442 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13443 v2.AddArg(y) 13444 v1.AddArg(v2) 13445 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13446 v3.AuxInt = 63 13447 v1.AddArg(v3) 13448 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13449 v4.AuxInt = 64 13450 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13451 v5.AddArg(y) 13452 v4.AddArg(v5) 13453 v1.AddArg(v4) 13454 v.AddArg(v1) 13455 return true 13456 } 13457 } 13458 func rewriteValueARM64_OpRsh32x32(v *Value, config *Config) bool { 13459 b := v.Block 13460 _ = b 13461 // match: (Rsh32x32 x y) 13462 // cond: 13463 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13464 for { 13465 x := v.Args[0] 13466 y := v.Args[1] 13467 v.reset(OpARM64SRA) 13468 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13469 v0.AddArg(x) 13470 v.AddArg(v0) 13471 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13472 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13473 v2.AddArg(y) 13474 v1.AddArg(v2) 13475 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13476 v3.AuxInt = 63 13477 v1.AddArg(v3) 13478 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13479 v4.AuxInt = 64 13480 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13481 v5.AddArg(y) 13482 v4.AddArg(v5) 13483 v1.AddArg(v4) 13484 v.AddArg(v1) 13485 return true 13486 } 13487 } 13488 func rewriteValueARM64_OpRsh32x64(v *Value, config *Config) bool { 13489 b := v.Block 13490 _ = b 13491 // match: (Rsh32x64 x (MOVDconst [c])) 13492 // cond: uint64(c) < 32 13493 // result: (SRAconst (SignExt32to64 x) [c]) 13494 for { 13495 x := v.Args[0] 13496 v_1 := v.Args[1] 13497 if v_1.Op != OpARM64MOVDconst { 13498 break 13499 } 13500 c := v_1.AuxInt 13501 if !(uint64(c) < 32) { 13502 break 13503 } 13504 v.reset(OpARM64SRAconst) 13505 v.AuxInt = c 13506 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13507 v0.AddArg(x) 13508 v.AddArg(v0) 13509 return true 13510 } 13511 // match: (Rsh32x64 x (MOVDconst [c])) 13512 // cond: uint64(c) >= 32 13513 // result: (SRAconst (SignExt32to64 x) [63]) 13514 for { 13515 x := v.Args[0] 13516 v_1 := v.Args[1] 13517 if v_1.Op != OpARM64MOVDconst { 13518 break 13519 } 13520 c := v_1.AuxInt 13521 if !(uint64(c) >= 32) { 13522 break 13523 } 13524 v.reset(OpARM64SRAconst) 13525 v.AuxInt = 63 13526 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13527 v0.AddArg(x) 13528 v.AddArg(v0) 13529 return true 13530 } 13531 // match: (Rsh32x64 x y) 13532 // cond: 13533 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13534 for { 13535 x := v.Args[0] 13536 y := v.Args[1] 13537 v.reset(OpARM64SRA) 13538 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13539 v0.AddArg(x) 13540 v.AddArg(v0) 13541 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13542 v1.AddArg(y) 13543 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13544 v2.AuxInt = 63 13545 v1.AddArg(v2) 13546 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13547 v3.AuxInt = 64 13548 v3.AddArg(y) 13549 v1.AddArg(v3) 13550 v.AddArg(v1) 13551 return true 13552 } 13553 } 13554 func rewriteValueARM64_OpRsh32x8(v *Value, config *Config) bool { 13555 b := v.Block 13556 _ = b 13557 // match: (Rsh32x8 x y) 13558 // cond: 13559 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13560 for { 13561 x := v.Args[0] 13562 y := v.Args[1] 13563 v.reset(OpARM64SRA) 13564 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13565 v0.AddArg(x) 13566 v.AddArg(v0) 13567 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13568 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13569 v2.AddArg(y) 13570 v1.AddArg(v2) 13571 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13572 v3.AuxInt = 63 13573 v1.AddArg(v3) 13574 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13575 v4.AuxInt = 64 13576 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13577 v5.AddArg(y) 13578 v4.AddArg(v5) 13579 v1.AddArg(v4) 13580 v.AddArg(v1) 13581 return true 13582 } 13583 } 13584 func rewriteValueARM64_OpRsh64Ux16(v *Value, config *Config) bool { 13585 b := v.Block 13586 _ = b 13587 // match: (Rsh64Ux16 <t> x y) 13588 // cond: 13589 // result: (CSELULT (SRL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13590 for { 13591 t := v.Type 13592 x := v.Args[0] 13593 y := v.Args[1] 13594 v.reset(OpARM64CSELULT) 13595 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13596 v0.AddArg(x) 13597 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13598 v1.AddArg(y) 13599 v0.AddArg(v1) 13600 v.AddArg(v0) 13601 v2 := b.NewValue0(v.Line, OpConst64, t) 13602 v2.AuxInt = 0 13603 v.AddArg(v2) 13604 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13605 v3.AuxInt = 64 13606 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13607 v4.AddArg(y) 13608 v3.AddArg(v4) 13609 v.AddArg(v3) 13610 return true 13611 } 13612 } 13613 func rewriteValueARM64_OpRsh64Ux32(v *Value, config *Config) bool { 13614 b := v.Block 13615 _ = b 13616 // match: (Rsh64Ux32 <t> x y) 13617 // cond: 13618 // result: (CSELULT (SRL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13619 for { 13620 t := v.Type 13621 x := v.Args[0] 13622 y := v.Args[1] 13623 v.reset(OpARM64CSELULT) 13624 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13625 v0.AddArg(x) 13626 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13627 v1.AddArg(y) 13628 v0.AddArg(v1) 13629 v.AddArg(v0) 13630 v2 := b.NewValue0(v.Line, OpConst64, t) 13631 v2.AuxInt = 0 13632 v.AddArg(v2) 13633 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13634 v3.AuxInt = 64 13635 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13636 v4.AddArg(y) 13637 v3.AddArg(v4) 13638 v.AddArg(v3) 13639 return true 13640 } 13641 } 13642 func rewriteValueARM64_OpRsh64Ux64(v *Value, config *Config) bool { 13643 b := v.Block 13644 _ = b 13645 // match: (Rsh64Ux64 x (MOVDconst [c])) 13646 // cond: uint64(c) < 64 13647 // result: (SRLconst x [c]) 13648 for { 13649 x := v.Args[0] 13650 v_1 := v.Args[1] 13651 if v_1.Op != OpARM64MOVDconst { 13652 break 13653 } 13654 c := v_1.AuxInt 13655 if !(uint64(c) < 64) { 13656 break 13657 } 13658 v.reset(OpARM64SRLconst) 13659 v.AuxInt = c 13660 v.AddArg(x) 13661 return true 13662 } 13663 // match: (Rsh64Ux64 _ (MOVDconst [c])) 13664 // cond: uint64(c) >= 64 13665 // result: (MOVDconst [0]) 13666 for { 13667 v_1 := v.Args[1] 13668 if v_1.Op != OpARM64MOVDconst { 13669 break 13670 } 13671 c := v_1.AuxInt 13672 if !(uint64(c) >= 64) { 13673 break 13674 } 13675 v.reset(OpARM64MOVDconst) 13676 v.AuxInt = 0 13677 return true 13678 } 13679 // match: (Rsh64Ux64 <t> x y) 13680 // cond: 13681 // result: (CSELULT (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 13682 for { 13683 t := v.Type 13684 x := v.Args[0] 13685 y := v.Args[1] 13686 v.reset(OpARM64CSELULT) 13687 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13688 v0.AddArg(x) 13689 v0.AddArg(y) 13690 v.AddArg(v0) 13691 v1 := b.NewValue0(v.Line, OpConst64, t) 13692 v1.AuxInt = 0 13693 v.AddArg(v1) 13694 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13695 v2.AuxInt = 64 13696 v2.AddArg(y) 13697 v.AddArg(v2) 13698 return true 13699 } 13700 } 13701 func rewriteValueARM64_OpRsh64Ux8(v *Value, config *Config) bool { 13702 b := v.Block 13703 _ = b 13704 // match: (Rsh64Ux8 <t> x y) 13705 // cond: 13706 // result: (CSELULT (SRL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13707 for { 13708 t := v.Type 13709 x := v.Args[0] 13710 y := v.Args[1] 13711 v.reset(OpARM64CSELULT) 13712 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13713 v0.AddArg(x) 13714 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13715 v1.AddArg(y) 13716 v0.AddArg(v1) 13717 v.AddArg(v0) 13718 v2 := b.NewValue0(v.Line, OpConst64, t) 13719 v2.AuxInt = 0 13720 v.AddArg(v2) 13721 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13722 v3.AuxInt = 64 13723 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13724 v4.AddArg(y) 13725 v3.AddArg(v4) 13726 v.AddArg(v3) 13727 return true 13728 } 13729 } 13730 func rewriteValueARM64_OpRsh64x16(v *Value, config *Config) bool { 13731 b := v.Block 13732 _ = b 13733 // match: (Rsh64x16 x y) 13734 // cond: 13735 // result: (SRA x (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13736 for { 13737 x := v.Args[0] 13738 y := v.Args[1] 13739 v.reset(OpARM64SRA) 13740 v.AddArg(x) 13741 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13742 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13743 v1.AddArg(y) 13744 v0.AddArg(v1) 13745 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13746 v2.AuxInt = 63 13747 v0.AddArg(v2) 13748 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13749 v3.AuxInt = 64 13750 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13751 v4.AddArg(y) 13752 v3.AddArg(v4) 13753 v0.AddArg(v3) 13754 v.AddArg(v0) 13755 return true 13756 } 13757 } 13758 func rewriteValueARM64_OpRsh64x32(v *Value, config *Config) bool { 13759 b := v.Block 13760 _ = b 13761 // match: (Rsh64x32 x y) 13762 // cond: 13763 // result: (SRA x (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13764 for { 13765 x := v.Args[0] 13766 y := v.Args[1] 13767 v.reset(OpARM64SRA) 13768 v.AddArg(x) 13769 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13770 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13771 v1.AddArg(y) 13772 v0.AddArg(v1) 13773 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13774 v2.AuxInt = 63 13775 v0.AddArg(v2) 13776 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13777 v3.AuxInt = 64 13778 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13779 v4.AddArg(y) 13780 v3.AddArg(v4) 13781 v0.AddArg(v3) 13782 v.AddArg(v0) 13783 return true 13784 } 13785 } 13786 func rewriteValueARM64_OpRsh64x64(v *Value, config *Config) bool { 13787 b := v.Block 13788 _ = b 13789 // match: (Rsh64x64 x (MOVDconst [c])) 13790 // cond: uint64(c) < 64 13791 // result: (SRAconst x [c]) 13792 for { 13793 x := v.Args[0] 13794 v_1 := v.Args[1] 13795 if v_1.Op != OpARM64MOVDconst { 13796 break 13797 } 13798 c := v_1.AuxInt 13799 if !(uint64(c) < 64) { 13800 break 13801 } 13802 v.reset(OpARM64SRAconst) 13803 v.AuxInt = c 13804 v.AddArg(x) 13805 return true 13806 } 13807 // match: (Rsh64x64 x (MOVDconst [c])) 13808 // cond: uint64(c) >= 64 13809 // result: (SRAconst x [63]) 13810 for { 13811 x := v.Args[0] 13812 v_1 := v.Args[1] 13813 if v_1.Op != OpARM64MOVDconst { 13814 break 13815 } 13816 c := v_1.AuxInt 13817 if !(uint64(c) >= 64) { 13818 break 13819 } 13820 v.reset(OpARM64SRAconst) 13821 v.AuxInt = 63 13822 v.AddArg(x) 13823 return true 13824 } 13825 // match: (Rsh64x64 x y) 13826 // cond: 13827 // result: (SRA x (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13828 for { 13829 x := v.Args[0] 13830 y := v.Args[1] 13831 v.reset(OpARM64SRA) 13832 v.AddArg(x) 13833 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13834 v0.AddArg(y) 13835 v1 := b.NewValue0(v.Line, OpConst64, y.Type) 13836 v1.AuxInt = 63 13837 v0.AddArg(v1) 13838 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13839 v2.AuxInt = 64 13840 v2.AddArg(y) 13841 v0.AddArg(v2) 13842 v.AddArg(v0) 13843 return true 13844 } 13845 } 13846 func rewriteValueARM64_OpRsh64x8(v *Value, config *Config) bool { 13847 b := v.Block 13848 _ = b 13849 // match: (Rsh64x8 x y) 13850 // cond: 13851 // result: (SRA x (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13852 for { 13853 x := v.Args[0] 13854 y := v.Args[1] 13855 v.reset(OpARM64SRA) 13856 v.AddArg(x) 13857 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13858 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13859 v1.AddArg(y) 13860 v0.AddArg(v1) 13861 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13862 v2.AuxInt = 63 13863 v0.AddArg(v2) 13864 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13865 v3.AuxInt = 64 13866 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13867 v4.AddArg(y) 13868 v3.AddArg(v4) 13869 v0.AddArg(v3) 13870 v.AddArg(v0) 13871 return true 13872 } 13873 } 13874 func rewriteValueARM64_OpRsh8Ux16(v *Value, config *Config) bool { 13875 b := v.Block 13876 _ = b 13877 // match: (Rsh8Ux16 <t> x y) 13878 // cond: 13879 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13880 for { 13881 t := v.Type 13882 x := v.Args[0] 13883 y := v.Args[1] 13884 v.reset(OpARM64CSELULT) 13885 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13886 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13887 v1.AddArg(x) 13888 v0.AddArg(v1) 13889 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13890 v2.AddArg(y) 13891 v0.AddArg(v2) 13892 v.AddArg(v0) 13893 v3 := b.NewValue0(v.Line, OpConst64, t) 13894 v3.AuxInt = 0 13895 v.AddArg(v3) 13896 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13897 v4.AuxInt = 64 13898 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13899 v5.AddArg(y) 13900 v4.AddArg(v5) 13901 v.AddArg(v4) 13902 return true 13903 } 13904 } 13905 func rewriteValueARM64_OpRsh8Ux32(v *Value, config *Config) bool { 13906 b := v.Block 13907 _ = b 13908 // match: (Rsh8Ux32 <t> x y) 13909 // cond: 13910 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13911 for { 13912 t := v.Type 13913 x := v.Args[0] 13914 y := v.Args[1] 13915 v.reset(OpARM64CSELULT) 13916 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13917 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13918 v1.AddArg(x) 13919 v0.AddArg(v1) 13920 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13921 v2.AddArg(y) 13922 v0.AddArg(v2) 13923 v.AddArg(v0) 13924 v3 := b.NewValue0(v.Line, OpConst64, t) 13925 v3.AuxInt = 0 13926 v.AddArg(v3) 13927 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13928 v4.AuxInt = 64 13929 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13930 v5.AddArg(y) 13931 v4.AddArg(v5) 13932 v.AddArg(v4) 13933 return true 13934 } 13935 } 13936 func rewriteValueARM64_OpRsh8Ux64(v *Value, config *Config) bool { 13937 b := v.Block 13938 _ = b 13939 // match: (Rsh8Ux64 x (MOVDconst [c])) 13940 // cond: uint64(c) < 8 13941 // result: (SRLconst (ZeroExt8to64 x) [c]) 13942 for { 13943 x := v.Args[0] 13944 v_1 := v.Args[1] 13945 if v_1.Op != OpARM64MOVDconst { 13946 break 13947 } 13948 c := v_1.AuxInt 13949 if !(uint64(c) < 8) { 13950 break 13951 } 13952 v.reset(OpARM64SRLconst) 13953 v.AuxInt = c 13954 v0 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13955 v0.AddArg(x) 13956 v.AddArg(v0) 13957 return true 13958 } 13959 // match: (Rsh8Ux64 _ (MOVDconst [c])) 13960 // cond: uint64(c) >= 8 13961 // result: (MOVDconst [0]) 13962 for { 13963 v_1 := v.Args[1] 13964 if v_1.Op != OpARM64MOVDconst { 13965 break 13966 } 13967 c := v_1.AuxInt 13968 if !(uint64(c) >= 8) { 13969 break 13970 } 13971 v.reset(OpARM64MOVDconst) 13972 v.AuxInt = 0 13973 return true 13974 } 13975 // match: (Rsh8Ux64 <t> x y) 13976 // cond: 13977 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13978 for { 13979 t := v.Type 13980 x := v.Args[0] 13981 y := v.Args[1] 13982 v.reset(OpARM64CSELULT) 13983 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13984 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13985 v1.AddArg(x) 13986 v0.AddArg(v1) 13987 v0.AddArg(y) 13988 v.AddArg(v0) 13989 v2 := b.NewValue0(v.Line, OpConst64, t) 13990 v2.AuxInt = 0 13991 v.AddArg(v2) 13992 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13993 v3.AuxInt = 64 13994 v3.AddArg(y) 13995 v.AddArg(v3) 13996 return true 13997 } 13998 } 13999 func rewriteValueARM64_OpRsh8Ux8(v *Value, config *Config) bool { 14000 b := v.Block 14001 _ = b 14002 // match: (Rsh8Ux8 <t> x y) 14003 // cond: 14004 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 14005 for { 14006 t := v.Type 14007 x := v.Args[0] 14008 y := v.Args[1] 14009 v.reset(OpARM64CSELULT) 14010 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 14011 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14012 v1.AddArg(x) 14013 v0.AddArg(v1) 14014 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14015 v2.AddArg(y) 14016 v0.AddArg(v2) 14017 v.AddArg(v0) 14018 v3 := b.NewValue0(v.Line, OpConst64, t) 14019 v3.AuxInt = 0 14020 v.AddArg(v3) 14021 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14022 v4.AuxInt = 64 14023 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14024 v5.AddArg(y) 14025 v4.AddArg(v5) 14026 v.AddArg(v4) 14027 return true 14028 } 14029 } 14030 func rewriteValueARM64_OpRsh8x16(v *Value, config *Config) bool { 14031 b := v.Block 14032 _ = b 14033 // match: (Rsh8x16 x y) 14034 // cond: 14035 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 14036 for { 14037 x := v.Args[0] 14038 y := v.Args[1] 14039 v.reset(OpARM64SRA) 14040 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14041 v0.AddArg(x) 14042 v.AddArg(v0) 14043 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14044 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 14045 v2.AddArg(y) 14046 v1.AddArg(v2) 14047 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14048 v3.AuxInt = 63 14049 v1.AddArg(v3) 14050 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14051 v4.AuxInt = 64 14052 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 14053 v5.AddArg(y) 14054 v4.AddArg(v5) 14055 v1.AddArg(v4) 14056 v.AddArg(v1) 14057 return true 14058 } 14059 } 14060 func rewriteValueARM64_OpRsh8x32(v *Value, config *Config) bool { 14061 b := v.Block 14062 _ = b 14063 // match: (Rsh8x32 x y) 14064 // cond: 14065 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 14066 for { 14067 x := v.Args[0] 14068 y := v.Args[1] 14069 v.reset(OpARM64SRA) 14070 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14071 v0.AddArg(x) 14072 v.AddArg(v0) 14073 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14074 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 14075 v2.AddArg(y) 14076 v1.AddArg(v2) 14077 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14078 v3.AuxInt = 63 14079 v1.AddArg(v3) 14080 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14081 v4.AuxInt = 64 14082 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 14083 v5.AddArg(y) 14084 v4.AddArg(v5) 14085 v1.AddArg(v4) 14086 v.AddArg(v1) 14087 return true 14088 } 14089 } 14090 func rewriteValueARM64_OpRsh8x64(v *Value, config *Config) bool { 14091 b := v.Block 14092 _ = b 14093 // match: (Rsh8x64 x (MOVDconst [c])) 14094 // cond: uint64(c) < 8 14095 // result: (SRAconst (SignExt8to64 x) [c]) 14096 for { 14097 x := v.Args[0] 14098 v_1 := v.Args[1] 14099 if v_1.Op != OpARM64MOVDconst { 14100 break 14101 } 14102 c := v_1.AuxInt 14103 if !(uint64(c) < 8) { 14104 break 14105 } 14106 v.reset(OpARM64SRAconst) 14107 v.AuxInt = c 14108 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14109 v0.AddArg(x) 14110 v.AddArg(v0) 14111 return true 14112 } 14113 // match: (Rsh8x64 x (MOVDconst [c])) 14114 // cond: uint64(c) >= 8 14115 // result: (SRAconst (SignExt8to64 x) [63]) 14116 for { 14117 x := v.Args[0] 14118 v_1 := v.Args[1] 14119 if v_1.Op != OpARM64MOVDconst { 14120 break 14121 } 14122 c := v_1.AuxInt 14123 if !(uint64(c) >= 8) { 14124 break 14125 } 14126 v.reset(OpARM64SRAconst) 14127 v.AuxInt = 63 14128 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14129 v0.AddArg(x) 14130 v.AddArg(v0) 14131 return true 14132 } 14133 // match: (Rsh8x64 x y) 14134 // cond: 14135 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 14136 for { 14137 x := v.Args[0] 14138 y := v.Args[1] 14139 v.reset(OpARM64SRA) 14140 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14141 v0.AddArg(x) 14142 v.AddArg(v0) 14143 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14144 v1.AddArg(y) 14145 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 14146 v2.AuxInt = 63 14147 v1.AddArg(v2) 14148 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14149 v3.AuxInt = 64 14150 v3.AddArg(y) 14151 v1.AddArg(v3) 14152 v.AddArg(v1) 14153 return true 14154 } 14155 } 14156 func rewriteValueARM64_OpRsh8x8(v *Value, config *Config) bool { 14157 b := v.Block 14158 _ = b 14159 // match: (Rsh8x8 x y) 14160 // cond: 14161 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 14162 for { 14163 x := v.Args[0] 14164 y := v.Args[1] 14165 v.reset(OpARM64SRA) 14166 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14167 v0.AddArg(x) 14168 v.AddArg(v0) 14169 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14170 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14171 v2.AddArg(y) 14172 v1.AddArg(v2) 14173 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14174 v3.AuxInt = 63 14175 v1.AddArg(v3) 14176 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14177 v4.AuxInt = 64 14178 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14179 v5.AddArg(y) 14180 v4.AddArg(v5) 14181 v1.AddArg(v4) 14182 v.AddArg(v1) 14183 return true 14184 } 14185 } 14186 func rewriteValueARM64_OpSignExt16to32(v *Value, config *Config) bool { 14187 b := v.Block 14188 _ = b 14189 // match: (SignExt16to32 x) 14190 // cond: 14191 // result: (MOVHreg x) 14192 for { 14193 x := v.Args[0] 14194 v.reset(OpARM64MOVHreg) 14195 v.AddArg(x) 14196 return true 14197 } 14198 } 14199 func rewriteValueARM64_OpSignExt16to64(v *Value, config *Config) bool { 14200 b := v.Block 14201 _ = b 14202 // match: (SignExt16to64 x) 14203 // cond: 14204 // result: (MOVHreg x) 14205 for { 14206 x := v.Args[0] 14207 v.reset(OpARM64MOVHreg) 14208 v.AddArg(x) 14209 return true 14210 } 14211 } 14212 func rewriteValueARM64_OpSignExt32to64(v *Value, config *Config) bool { 14213 b := v.Block 14214 _ = b 14215 // match: (SignExt32to64 x) 14216 // cond: 14217 // result: (MOVWreg x) 14218 for { 14219 x := v.Args[0] 14220 v.reset(OpARM64MOVWreg) 14221 v.AddArg(x) 14222 return true 14223 } 14224 } 14225 func rewriteValueARM64_OpSignExt8to16(v *Value, config *Config) bool { 14226 b := v.Block 14227 _ = b 14228 // match: (SignExt8to16 x) 14229 // cond: 14230 // result: (MOVBreg x) 14231 for { 14232 x := v.Args[0] 14233 v.reset(OpARM64MOVBreg) 14234 v.AddArg(x) 14235 return true 14236 } 14237 } 14238 func rewriteValueARM64_OpSignExt8to32(v *Value, config *Config) bool { 14239 b := v.Block 14240 _ = b 14241 // match: (SignExt8to32 x) 14242 // cond: 14243 // result: (MOVBreg x) 14244 for { 14245 x := v.Args[0] 14246 v.reset(OpARM64MOVBreg) 14247 v.AddArg(x) 14248 return true 14249 } 14250 } 14251 func rewriteValueARM64_OpSignExt8to64(v *Value, config *Config) bool { 14252 b := v.Block 14253 _ = b 14254 // match: (SignExt8to64 x) 14255 // cond: 14256 // result: (MOVBreg x) 14257 for { 14258 x := v.Args[0] 14259 v.reset(OpARM64MOVBreg) 14260 v.AddArg(x) 14261 return true 14262 } 14263 } 14264 func rewriteValueARM64_OpSlicemask(v *Value, config *Config) bool { 14265 b := v.Block 14266 _ = b 14267 // match: (Slicemask <t> x) 14268 // cond: 14269 // result: (MVN (SRAconst <t> (SUBconst <t> x [1]) [63])) 14270 for { 14271 t := v.Type 14272 x := v.Args[0] 14273 v.reset(OpARM64MVN) 14274 v0 := b.NewValue0(v.Line, OpARM64SRAconst, t) 14275 v0.AuxInt = 63 14276 v1 := b.NewValue0(v.Line, OpARM64SUBconst, t) 14277 v1.AuxInt = 1 14278 v1.AddArg(x) 14279 v0.AddArg(v1) 14280 v.AddArg(v0) 14281 return true 14282 } 14283 } 14284 func rewriteValueARM64_OpSqrt(v *Value, config *Config) bool { 14285 b := v.Block 14286 _ = b 14287 // match: (Sqrt x) 14288 // cond: 14289 // result: (FSQRTD x) 14290 for { 14291 x := v.Args[0] 14292 v.reset(OpARM64FSQRTD) 14293 v.AddArg(x) 14294 return true 14295 } 14296 } 14297 func rewriteValueARM64_OpStaticCall(v *Value, config *Config) bool { 14298 b := v.Block 14299 _ = b 14300 // match: (StaticCall [argwid] {target} mem) 14301 // cond: 14302 // result: (CALLstatic [argwid] {target} mem) 14303 for { 14304 argwid := v.AuxInt 14305 target := v.Aux 14306 mem := v.Args[0] 14307 v.reset(OpARM64CALLstatic) 14308 v.AuxInt = argwid 14309 v.Aux = target 14310 v.AddArg(mem) 14311 return true 14312 } 14313 } 14314 func rewriteValueARM64_OpStore(v *Value, config *Config) bool { 14315 b := v.Block 14316 _ = b 14317 // match: (Store [1] ptr val mem) 14318 // cond: 14319 // result: (MOVBstore ptr val mem) 14320 for { 14321 if v.AuxInt != 1 { 14322 break 14323 } 14324 ptr := v.Args[0] 14325 val := v.Args[1] 14326 mem := v.Args[2] 14327 v.reset(OpARM64MOVBstore) 14328 v.AddArg(ptr) 14329 v.AddArg(val) 14330 v.AddArg(mem) 14331 return true 14332 } 14333 // match: (Store [2] ptr val mem) 14334 // cond: 14335 // result: (MOVHstore ptr val mem) 14336 for { 14337 if v.AuxInt != 2 { 14338 break 14339 } 14340 ptr := v.Args[0] 14341 val := v.Args[1] 14342 mem := v.Args[2] 14343 v.reset(OpARM64MOVHstore) 14344 v.AddArg(ptr) 14345 v.AddArg(val) 14346 v.AddArg(mem) 14347 return true 14348 } 14349 // match: (Store [4] ptr val mem) 14350 // cond: !is32BitFloat(val.Type) 14351 // result: (MOVWstore ptr val mem) 14352 for { 14353 if v.AuxInt != 4 { 14354 break 14355 } 14356 ptr := v.Args[0] 14357 val := v.Args[1] 14358 mem := v.Args[2] 14359 if !(!is32BitFloat(val.Type)) { 14360 break 14361 } 14362 v.reset(OpARM64MOVWstore) 14363 v.AddArg(ptr) 14364 v.AddArg(val) 14365 v.AddArg(mem) 14366 return true 14367 } 14368 // match: (Store [8] ptr val mem) 14369 // cond: !is64BitFloat(val.Type) 14370 // result: (MOVDstore ptr val mem) 14371 for { 14372 if v.AuxInt != 8 { 14373 break 14374 } 14375 ptr := v.Args[0] 14376 val := v.Args[1] 14377 mem := v.Args[2] 14378 if !(!is64BitFloat(val.Type)) { 14379 break 14380 } 14381 v.reset(OpARM64MOVDstore) 14382 v.AddArg(ptr) 14383 v.AddArg(val) 14384 v.AddArg(mem) 14385 return true 14386 } 14387 // match: (Store [4] ptr val mem) 14388 // cond: is32BitFloat(val.Type) 14389 // result: (FMOVSstore ptr val mem) 14390 for { 14391 if v.AuxInt != 4 { 14392 break 14393 } 14394 ptr := v.Args[0] 14395 val := v.Args[1] 14396 mem := v.Args[2] 14397 if !(is32BitFloat(val.Type)) { 14398 break 14399 } 14400 v.reset(OpARM64FMOVSstore) 14401 v.AddArg(ptr) 14402 v.AddArg(val) 14403 v.AddArg(mem) 14404 return true 14405 } 14406 // match: (Store [8] ptr val mem) 14407 // cond: is64BitFloat(val.Type) 14408 // result: (FMOVDstore ptr val mem) 14409 for { 14410 if v.AuxInt != 8 { 14411 break 14412 } 14413 ptr := v.Args[0] 14414 val := v.Args[1] 14415 mem := v.Args[2] 14416 if !(is64BitFloat(val.Type)) { 14417 break 14418 } 14419 v.reset(OpARM64FMOVDstore) 14420 v.AddArg(ptr) 14421 v.AddArg(val) 14422 v.AddArg(mem) 14423 return true 14424 } 14425 return false 14426 } 14427 func rewriteValueARM64_OpSub16(v *Value, config *Config) bool { 14428 b := v.Block 14429 _ = b 14430 // match: (Sub16 x y) 14431 // cond: 14432 // result: (SUB x y) 14433 for { 14434 x := v.Args[0] 14435 y := v.Args[1] 14436 v.reset(OpARM64SUB) 14437 v.AddArg(x) 14438 v.AddArg(y) 14439 return true 14440 } 14441 } 14442 func rewriteValueARM64_OpSub32(v *Value, config *Config) bool { 14443 b := v.Block 14444 _ = b 14445 // match: (Sub32 x y) 14446 // cond: 14447 // result: (SUB x y) 14448 for { 14449 x := v.Args[0] 14450 y := v.Args[1] 14451 v.reset(OpARM64SUB) 14452 v.AddArg(x) 14453 v.AddArg(y) 14454 return true 14455 } 14456 } 14457 func rewriteValueARM64_OpSub32F(v *Value, config *Config) bool { 14458 b := v.Block 14459 _ = b 14460 // match: (Sub32F x y) 14461 // cond: 14462 // result: (FSUBS x y) 14463 for { 14464 x := v.Args[0] 14465 y := v.Args[1] 14466 v.reset(OpARM64FSUBS) 14467 v.AddArg(x) 14468 v.AddArg(y) 14469 return true 14470 } 14471 } 14472 func rewriteValueARM64_OpSub64(v *Value, config *Config) bool { 14473 b := v.Block 14474 _ = b 14475 // match: (Sub64 x y) 14476 // cond: 14477 // result: (SUB x y) 14478 for { 14479 x := v.Args[0] 14480 y := v.Args[1] 14481 v.reset(OpARM64SUB) 14482 v.AddArg(x) 14483 v.AddArg(y) 14484 return true 14485 } 14486 } 14487 func rewriteValueARM64_OpSub64F(v *Value, config *Config) bool { 14488 b := v.Block 14489 _ = b 14490 // match: (Sub64F x y) 14491 // cond: 14492 // result: (FSUBD x y) 14493 for { 14494 x := v.Args[0] 14495 y := v.Args[1] 14496 v.reset(OpARM64FSUBD) 14497 v.AddArg(x) 14498 v.AddArg(y) 14499 return true 14500 } 14501 } 14502 func rewriteValueARM64_OpSub8(v *Value, config *Config) bool { 14503 b := v.Block 14504 _ = b 14505 // match: (Sub8 x y) 14506 // cond: 14507 // result: (SUB x y) 14508 for { 14509 x := v.Args[0] 14510 y := v.Args[1] 14511 v.reset(OpARM64SUB) 14512 v.AddArg(x) 14513 v.AddArg(y) 14514 return true 14515 } 14516 } 14517 func rewriteValueARM64_OpSubPtr(v *Value, config *Config) bool { 14518 b := v.Block 14519 _ = b 14520 // match: (SubPtr x y) 14521 // cond: 14522 // result: (SUB x y) 14523 for { 14524 x := v.Args[0] 14525 y := v.Args[1] 14526 v.reset(OpARM64SUB) 14527 v.AddArg(x) 14528 v.AddArg(y) 14529 return true 14530 } 14531 } 14532 func rewriteValueARM64_OpTrunc16to8(v *Value, config *Config) bool { 14533 b := v.Block 14534 _ = b 14535 // match: (Trunc16to8 x) 14536 // cond: 14537 // result: x 14538 for { 14539 x := v.Args[0] 14540 v.reset(OpCopy) 14541 v.Type = x.Type 14542 v.AddArg(x) 14543 return true 14544 } 14545 } 14546 func rewriteValueARM64_OpTrunc32to16(v *Value, config *Config) bool { 14547 b := v.Block 14548 _ = b 14549 // match: (Trunc32to16 x) 14550 // cond: 14551 // result: x 14552 for { 14553 x := v.Args[0] 14554 v.reset(OpCopy) 14555 v.Type = x.Type 14556 v.AddArg(x) 14557 return true 14558 } 14559 } 14560 func rewriteValueARM64_OpTrunc32to8(v *Value, config *Config) bool { 14561 b := v.Block 14562 _ = b 14563 // match: (Trunc32to8 x) 14564 // cond: 14565 // result: x 14566 for { 14567 x := v.Args[0] 14568 v.reset(OpCopy) 14569 v.Type = x.Type 14570 v.AddArg(x) 14571 return true 14572 } 14573 } 14574 func rewriteValueARM64_OpTrunc64to16(v *Value, config *Config) bool { 14575 b := v.Block 14576 _ = b 14577 // match: (Trunc64to16 x) 14578 // cond: 14579 // result: x 14580 for { 14581 x := v.Args[0] 14582 v.reset(OpCopy) 14583 v.Type = x.Type 14584 v.AddArg(x) 14585 return true 14586 } 14587 } 14588 func rewriteValueARM64_OpTrunc64to32(v *Value, config *Config) bool { 14589 b := v.Block 14590 _ = b 14591 // match: (Trunc64to32 x) 14592 // cond: 14593 // result: x 14594 for { 14595 x := v.Args[0] 14596 v.reset(OpCopy) 14597 v.Type = x.Type 14598 v.AddArg(x) 14599 return true 14600 } 14601 } 14602 func rewriteValueARM64_OpTrunc64to8(v *Value, config *Config) bool { 14603 b := v.Block 14604 _ = b 14605 // match: (Trunc64to8 x) 14606 // cond: 14607 // result: x 14608 for { 14609 x := v.Args[0] 14610 v.reset(OpCopy) 14611 v.Type = x.Type 14612 v.AddArg(x) 14613 return true 14614 } 14615 } 14616 func rewriteValueARM64_OpXor16(v *Value, config *Config) bool { 14617 b := v.Block 14618 _ = b 14619 // match: (Xor16 x y) 14620 // cond: 14621 // result: (XOR x y) 14622 for { 14623 x := v.Args[0] 14624 y := v.Args[1] 14625 v.reset(OpARM64XOR) 14626 v.AddArg(x) 14627 v.AddArg(y) 14628 return true 14629 } 14630 } 14631 func rewriteValueARM64_OpXor32(v *Value, config *Config) bool { 14632 b := v.Block 14633 _ = b 14634 // match: (Xor32 x y) 14635 // cond: 14636 // result: (XOR x y) 14637 for { 14638 x := v.Args[0] 14639 y := v.Args[1] 14640 v.reset(OpARM64XOR) 14641 v.AddArg(x) 14642 v.AddArg(y) 14643 return true 14644 } 14645 } 14646 func rewriteValueARM64_OpXor64(v *Value, config *Config) bool { 14647 b := v.Block 14648 _ = b 14649 // match: (Xor64 x y) 14650 // cond: 14651 // result: (XOR x y) 14652 for { 14653 x := v.Args[0] 14654 y := v.Args[1] 14655 v.reset(OpARM64XOR) 14656 v.AddArg(x) 14657 v.AddArg(y) 14658 return true 14659 } 14660 } 14661 func rewriteValueARM64_OpXor8(v *Value, config *Config) bool { 14662 b := v.Block 14663 _ = b 14664 // match: (Xor8 x y) 14665 // cond: 14666 // result: (XOR x y) 14667 for { 14668 x := v.Args[0] 14669 y := v.Args[1] 14670 v.reset(OpARM64XOR) 14671 v.AddArg(x) 14672 v.AddArg(y) 14673 return true 14674 } 14675 } 14676 func rewriteValueARM64_OpZero(v *Value, config *Config) bool { 14677 b := v.Block 14678 _ = b 14679 // match: (Zero [s] _ mem) 14680 // cond: SizeAndAlign(s).Size() == 0 14681 // result: mem 14682 for { 14683 s := v.AuxInt 14684 mem := v.Args[1] 14685 if !(SizeAndAlign(s).Size() == 0) { 14686 break 14687 } 14688 v.reset(OpCopy) 14689 v.Type = mem.Type 14690 v.AddArg(mem) 14691 return true 14692 } 14693 // match: (Zero [s] ptr mem) 14694 // cond: SizeAndAlign(s).Size() == 1 14695 // result: (MOVBstore ptr (MOVDconst [0]) mem) 14696 for { 14697 s := v.AuxInt 14698 ptr := v.Args[0] 14699 mem := v.Args[1] 14700 if !(SizeAndAlign(s).Size() == 1) { 14701 break 14702 } 14703 v.reset(OpARM64MOVBstore) 14704 v.AddArg(ptr) 14705 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14706 v0.AuxInt = 0 14707 v.AddArg(v0) 14708 v.AddArg(mem) 14709 return true 14710 } 14711 // match: (Zero [s] ptr mem) 14712 // cond: SizeAndAlign(s).Size() == 2 14713 // result: (MOVHstore ptr (MOVDconst [0]) mem) 14714 for { 14715 s := v.AuxInt 14716 ptr := v.Args[0] 14717 mem := v.Args[1] 14718 if !(SizeAndAlign(s).Size() == 2) { 14719 break 14720 } 14721 v.reset(OpARM64MOVHstore) 14722 v.AddArg(ptr) 14723 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14724 v0.AuxInt = 0 14725 v.AddArg(v0) 14726 v.AddArg(mem) 14727 return true 14728 } 14729 // match: (Zero [s] ptr mem) 14730 // cond: SizeAndAlign(s).Size() == 4 14731 // result: (MOVWstore ptr (MOVDconst [0]) mem) 14732 for { 14733 s := v.AuxInt 14734 ptr := v.Args[0] 14735 mem := v.Args[1] 14736 if !(SizeAndAlign(s).Size() == 4) { 14737 break 14738 } 14739 v.reset(OpARM64MOVWstore) 14740 v.AddArg(ptr) 14741 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14742 v0.AuxInt = 0 14743 v.AddArg(v0) 14744 v.AddArg(mem) 14745 return true 14746 } 14747 // match: (Zero [s] ptr mem) 14748 // cond: SizeAndAlign(s).Size() == 8 14749 // result: (MOVDstore ptr (MOVDconst [0]) mem) 14750 for { 14751 s := v.AuxInt 14752 ptr := v.Args[0] 14753 mem := v.Args[1] 14754 if !(SizeAndAlign(s).Size() == 8) { 14755 break 14756 } 14757 v.reset(OpARM64MOVDstore) 14758 v.AddArg(ptr) 14759 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14760 v0.AuxInt = 0 14761 v.AddArg(v0) 14762 v.AddArg(mem) 14763 return true 14764 } 14765 // match: (Zero [s] ptr mem) 14766 // cond: SizeAndAlign(s).Size() == 3 14767 // result: (MOVBstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem)) 14768 for { 14769 s := v.AuxInt 14770 ptr := v.Args[0] 14771 mem := v.Args[1] 14772 if !(SizeAndAlign(s).Size() == 3) { 14773 break 14774 } 14775 v.reset(OpARM64MOVBstore) 14776 v.AuxInt = 2 14777 v.AddArg(ptr) 14778 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14779 v0.AuxInt = 0 14780 v.AddArg(v0) 14781 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 14782 v1.AddArg(ptr) 14783 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14784 v2.AuxInt = 0 14785 v1.AddArg(v2) 14786 v1.AddArg(mem) 14787 v.AddArg(v1) 14788 return true 14789 } 14790 // match: (Zero [s] ptr mem) 14791 // cond: SizeAndAlign(s).Size() == 5 14792 // result: (MOVBstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 14793 for { 14794 s := v.AuxInt 14795 ptr := v.Args[0] 14796 mem := v.Args[1] 14797 if !(SizeAndAlign(s).Size() == 5) { 14798 break 14799 } 14800 v.reset(OpARM64MOVBstore) 14801 v.AuxInt = 4 14802 v.AddArg(ptr) 14803 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14804 v0.AuxInt = 0 14805 v.AddArg(v0) 14806 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14807 v1.AddArg(ptr) 14808 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14809 v2.AuxInt = 0 14810 v1.AddArg(v2) 14811 v1.AddArg(mem) 14812 v.AddArg(v1) 14813 return true 14814 } 14815 // match: (Zero [s] ptr mem) 14816 // cond: SizeAndAlign(s).Size() == 6 14817 // result: (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 14818 for { 14819 s := v.AuxInt 14820 ptr := v.Args[0] 14821 mem := v.Args[1] 14822 if !(SizeAndAlign(s).Size() == 6) { 14823 break 14824 } 14825 v.reset(OpARM64MOVHstore) 14826 v.AuxInt = 4 14827 v.AddArg(ptr) 14828 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14829 v0.AuxInt = 0 14830 v.AddArg(v0) 14831 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14832 v1.AddArg(ptr) 14833 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14834 v2.AuxInt = 0 14835 v1.AddArg(v2) 14836 v1.AddArg(mem) 14837 v.AddArg(v1) 14838 return true 14839 } 14840 // match: (Zero [s] ptr mem) 14841 // cond: SizeAndAlign(s).Size() == 7 14842 // result: (MOVBstore [6] ptr (MOVDconst [0]) (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem))) 14843 for { 14844 s := v.AuxInt 14845 ptr := v.Args[0] 14846 mem := v.Args[1] 14847 if !(SizeAndAlign(s).Size() == 7) { 14848 break 14849 } 14850 v.reset(OpARM64MOVBstore) 14851 v.AuxInt = 6 14852 v.AddArg(ptr) 14853 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14854 v0.AuxInt = 0 14855 v.AddArg(v0) 14856 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 14857 v1.AuxInt = 4 14858 v1.AddArg(ptr) 14859 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14860 v2.AuxInt = 0 14861 v1.AddArg(v2) 14862 v3 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14863 v3.AddArg(ptr) 14864 v4 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14865 v4.AuxInt = 0 14866 v3.AddArg(v4) 14867 v3.AddArg(mem) 14868 v1.AddArg(v3) 14869 v.AddArg(v1) 14870 return true 14871 } 14872 // match: (Zero [s] ptr mem) 14873 // cond: SizeAndAlign(s).Size() == 12 14874 // result: (MOVWstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 14875 for { 14876 s := v.AuxInt 14877 ptr := v.Args[0] 14878 mem := v.Args[1] 14879 if !(SizeAndAlign(s).Size() == 12) { 14880 break 14881 } 14882 v.reset(OpARM64MOVWstore) 14883 v.AuxInt = 8 14884 v.AddArg(ptr) 14885 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14886 v0.AuxInt = 0 14887 v.AddArg(v0) 14888 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14889 v1.AddArg(ptr) 14890 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14891 v2.AuxInt = 0 14892 v1.AddArg(v2) 14893 v1.AddArg(mem) 14894 v.AddArg(v1) 14895 return true 14896 } 14897 // match: (Zero [s] ptr mem) 14898 // cond: SizeAndAlign(s).Size() == 16 14899 // result: (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 14900 for { 14901 s := v.AuxInt 14902 ptr := v.Args[0] 14903 mem := v.Args[1] 14904 if !(SizeAndAlign(s).Size() == 16) { 14905 break 14906 } 14907 v.reset(OpARM64MOVDstore) 14908 v.AuxInt = 8 14909 v.AddArg(ptr) 14910 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14911 v0.AuxInt = 0 14912 v.AddArg(v0) 14913 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14914 v1.AddArg(ptr) 14915 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14916 v2.AuxInt = 0 14917 v1.AddArg(v2) 14918 v1.AddArg(mem) 14919 v.AddArg(v1) 14920 return true 14921 } 14922 // match: (Zero [s] ptr mem) 14923 // cond: SizeAndAlign(s).Size() == 24 14924 // result: (MOVDstore [16] ptr (MOVDconst [0]) (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem))) 14925 for { 14926 s := v.AuxInt 14927 ptr := v.Args[0] 14928 mem := v.Args[1] 14929 if !(SizeAndAlign(s).Size() == 24) { 14930 break 14931 } 14932 v.reset(OpARM64MOVDstore) 14933 v.AuxInt = 16 14934 v.AddArg(ptr) 14935 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14936 v0.AuxInt = 0 14937 v.AddArg(v0) 14938 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14939 v1.AuxInt = 8 14940 v1.AddArg(ptr) 14941 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14942 v2.AuxInt = 0 14943 v1.AddArg(v2) 14944 v3 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14945 v3.AddArg(ptr) 14946 v4 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14947 v4.AuxInt = 0 14948 v3.AddArg(v4) 14949 v3.AddArg(mem) 14950 v1.AddArg(v3) 14951 v.AddArg(v1) 14952 return true 14953 } 14954 // match: (Zero [s] ptr mem) 14955 // cond: SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8 14956 // result: (Zero [MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64()] (OffPtr <ptr.Type> ptr [SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8]) (Zero [MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64()] ptr mem)) 14957 for { 14958 s := v.AuxInt 14959 ptr := v.Args[0] 14960 mem := v.Args[1] 14961 if !(SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8) { 14962 break 14963 } 14964 v.reset(OpZero) 14965 v.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64() 14966 v0 := b.NewValue0(v.Line, OpOffPtr, ptr.Type) 14967 v0.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 14968 v0.AddArg(ptr) 14969 v.AddArg(v0) 14970 v1 := b.NewValue0(v.Line, OpZero, TypeMem) 14971 v1.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64() 14972 v1.AddArg(ptr) 14973 v1.AddArg(mem) 14974 v.AddArg(v1) 14975 return true 14976 } 14977 // match: (Zero [s] ptr mem) 14978 // cond: SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice 14979 // result: (DUFFZERO [4 * (128 - int64(SizeAndAlign(s).Size()/8))] ptr mem) 14980 for { 14981 s := v.AuxInt 14982 ptr := v.Args[0] 14983 mem := v.Args[1] 14984 if !(SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice) { 14985 break 14986 } 14987 v.reset(OpARM64DUFFZERO) 14988 v.AuxInt = 4 * (128 - int64(SizeAndAlign(s).Size()/8)) 14989 v.AddArg(ptr) 14990 v.AddArg(mem) 14991 return true 14992 } 14993 // match: (Zero [s] ptr mem) 14994 // cond: SizeAndAlign(s).Size()%8 == 0 && (SizeAndAlign(s).Size() > 8*128 || config.noDuffDevice) 14995 // result: (LoweredZero ptr (ADDconst <ptr.Type> [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)] ptr) mem) 14996 for { 14997 s := v.AuxInt 14998 ptr := v.Args[0] 14999 mem := v.Args[1] 15000 if !(SizeAndAlign(s).Size()%8 == 0 && (SizeAndAlign(s).Size() > 8*128 || config.noDuffDevice)) { 15001 break 15002 } 15003 v.reset(OpARM64LoweredZero) 15004 v.AddArg(ptr) 15005 v0 := b.NewValue0(v.Line, OpARM64ADDconst, ptr.Type) 15006 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 15007 v0.AddArg(ptr) 15008 v.AddArg(v0) 15009 v.AddArg(mem) 15010 return true 15011 } 15012 return false 15013 } 15014 func rewriteValueARM64_OpZeroExt16to32(v *Value, config *Config) bool { 15015 b := v.Block 15016 _ = b 15017 // match: (ZeroExt16to32 x) 15018 // cond: 15019 // result: (MOVHUreg x) 15020 for { 15021 x := v.Args[0] 15022 v.reset(OpARM64MOVHUreg) 15023 v.AddArg(x) 15024 return true 15025 } 15026 } 15027 func rewriteValueARM64_OpZeroExt16to64(v *Value, config *Config) bool { 15028 b := v.Block 15029 _ = b 15030 // match: (ZeroExt16to64 x) 15031 // cond: 15032 // result: (MOVHUreg x) 15033 for { 15034 x := v.Args[0] 15035 v.reset(OpARM64MOVHUreg) 15036 v.AddArg(x) 15037 return true 15038 } 15039 } 15040 func rewriteValueARM64_OpZeroExt32to64(v *Value, config *Config) bool { 15041 b := v.Block 15042 _ = b 15043 // match: (ZeroExt32to64 x) 15044 // cond: 15045 // result: (MOVWUreg x) 15046 for { 15047 x := v.Args[0] 15048 v.reset(OpARM64MOVWUreg) 15049 v.AddArg(x) 15050 return true 15051 } 15052 } 15053 func rewriteValueARM64_OpZeroExt8to16(v *Value, config *Config) bool { 15054 b := v.Block 15055 _ = b 15056 // match: (ZeroExt8to16 x) 15057 // cond: 15058 // result: (MOVBUreg x) 15059 for { 15060 x := v.Args[0] 15061 v.reset(OpARM64MOVBUreg) 15062 v.AddArg(x) 15063 return true 15064 } 15065 } 15066 func rewriteValueARM64_OpZeroExt8to32(v *Value, config *Config) bool { 15067 b := v.Block 15068 _ = b 15069 // match: (ZeroExt8to32 x) 15070 // cond: 15071 // result: (MOVBUreg x) 15072 for { 15073 x := v.Args[0] 15074 v.reset(OpARM64MOVBUreg) 15075 v.AddArg(x) 15076 return true 15077 } 15078 } 15079 func rewriteValueARM64_OpZeroExt8to64(v *Value, config *Config) bool { 15080 b := v.Block 15081 _ = b 15082 // match: (ZeroExt8to64 x) 15083 // cond: 15084 // result: (MOVBUreg x) 15085 for { 15086 x := v.Args[0] 15087 v.reset(OpARM64MOVBUreg) 15088 v.AddArg(x) 15089 return true 15090 } 15091 } 15092 func rewriteBlockARM64(b *Block, config *Config) bool { 15093 switch b.Kind { 15094 case BlockARM64EQ: 15095 // match: (EQ (CMPconst [0] x) yes no) 15096 // cond: 15097 // result: (Z x yes no) 15098 for { 15099 v := b.Control 15100 if v.Op != OpARM64CMPconst { 15101 break 15102 } 15103 if v.AuxInt != 0 { 15104 break 15105 } 15106 x := v.Args[0] 15107 yes := b.Succs[0] 15108 no := b.Succs[1] 15109 b.Kind = BlockARM64Z 15110 b.SetControl(x) 15111 _ = yes 15112 _ = no 15113 return true 15114 } 15115 // match: (EQ (CMPWconst [0] x) yes no) 15116 // cond: 15117 // result: (ZW x yes no) 15118 for { 15119 v := b.Control 15120 if v.Op != OpARM64CMPWconst { 15121 break 15122 } 15123 if v.AuxInt != 0 { 15124 break 15125 } 15126 x := v.Args[0] 15127 yes := b.Succs[0] 15128 no := b.Succs[1] 15129 b.Kind = BlockARM64ZW 15130 b.SetControl(x) 15131 _ = yes 15132 _ = no 15133 return true 15134 } 15135 // match: (EQ (FlagEQ) yes no) 15136 // cond: 15137 // result: (First nil yes no) 15138 for { 15139 v := b.Control 15140 if v.Op != OpARM64FlagEQ { 15141 break 15142 } 15143 yes := b.Succs[0] 15144 no := b.Succs[1] 15145 b.Kind = BlockFirst 15146 b.SetControl(nil) 15147 _ = yes 15148 _ = no 15149 return true 15150 } 15151 // match: (EQ (FlagLT_ULT) yes no) 15152 // cond: 15153 // result: (First nil no yes) 15154 for { 15155 v := b.Control 15156 if v.Op != OpARM64FlagLT_ULT { 15157 break 15158 } 15159 yes := b.Succs[0] 15160 no := b.Succs[1] 15161 b.Kind = BlockFirst 15162 b.SetControl(nil) 15163 b.swapSuccessors() 15164 _ = no 15165 _ = yes 15166 return true 15167 } 15168 // match: (EQ (FlagLT_UGT) yes no) 15169 // cond: 15170 // result: (First nil no yes) 15171 for { 15172 v := b.Control 15173 if v.Op != OpARM64FlagLT_UGT { 15174 break 15175 } 15176 yes := b.Succs[0] 15177 no := b.Succs[1] 15178 b.Kind = BlockFirst 15179 b.SetControl(nil) 15180 b.swapSuccessors() 15181 _ = no 15182 _ = yes 15183 return true 15184 } 15185 // match: (EQ (FlagGT_ULT) yes no) 15186 // cond: 15187 // result: (First nil no yes) 15188 for { 15189 v := b.Control 15190 if v.Op != OpARM64FlagGT_ULT { 15191 break 15192 } 15193 yes := b.Succs[0] 15194 no := b.Succs[1] 15195 b.Kind = BlockFirst 15196 b.SetControl(nil) 15197 b.swapSuccessors() 15198 _ = no 15199 _ = yes 15200 return true 15201 } 15202 // match: (EQ (FlagGT_UGT) yes no) 15203 // cond: 15204 // result: (First nil no yes) 15205 for { 15206 v := b.Control 15207 if v.Op != OpARM64FlagGT_UGT { 15208 break 15209 } 15210 yes := b.Succs[0] 15211 no := b.Succs[1] 15212 b.Kind = BlockFirst 15213 b.SetControl(nil) 15214 b.swapSuccessors() 15215 _ = no 15216 _ = yes 15217 return true 15218 } 15219 // match: (EQ (InvertFlags cmp) yes no) 15220 // cond: 15221 // result: (EQ cmp yes no) 15222 for { 15223 v := b.Control 15224 if v.Op != OpARM64InvertFlags { 15225 break 15226 } 15227 cmp := v.Args[0] 15228 yes := b.Succs[0] 15229 no := b.Succs[1] 15230 b.Kind = BlockARM64EQ 15231 b.SetControl(cmp) 15232 _ = yes 15233 _ = no 15234 return true 15235 } 15236 case BlockARM64GE: 15237 // match: (GE (FlagEQ) yes no) 15238 // cond: 15239 // result: (First nil yes no) 15240 for { 15241 v := b.Control 15242 if v.Op != OpARM64FlagEQ { 15243 break 15244 } 15245 yes := b.Succs[0] 15246 no := b.Succs[1] 15247 b.Kind = BlockFirst 15248 b.SetControl(nil) 15249 _ = yes 15250 _ = no 15251 return true 15252 } 15253 // match: (GE (FlagLT_ULT) yes no) 15254 // cond: 15255 // result: (First nil no yes) 15256 for { 15257 v := b.Control 15258 if v.Op != OpARM64FlagLT_ULT { 15259 break 15260 } 15261 yes := b.Succs[0] 15262 no := b.Succs[1] 15263 b.Kind = BlockFirst 15264 b.SetControl(nil) 15265 b.swapSuccessors() 15266 _ = no 15267 _ = yes 15268 return true 15269 } 15270 // match: (GE (FlagLT_UGT) yes no) 15271 // cond: 15272 // result: (First nil no yes) 15273 for { 15274 v := b.Control 15275 if v.Op != OpARM64FlagLT_UGT { 15276 break 15277 } 15278 yes := b.Succs[0] 15279 no := b.Succs[1] 15280 b.Kind = BlockFirst 15281 b.SetControl(nil) 15282 b.swapSuccessors() 15283 _ = no 15284 _ = yes 15285 return true 15286 } 15287 // match: (GE (FlagGT_ULT) yes no) 15288 // cond: 15289 // result: (First nil yes no) 15290 for { 15291 v := b.Control 15292 if v.Op != OpARM64FlagGT_ULT { 15293 break 15294 } 15295 yes := b.Succs[0] 15296 no := b.Succs[1] 15297 b.Kind = BlockFirst 15298 b.SetControl(nil) 15299 _ = yes 15300 _ = no 15301 return true 15302 } 15303 // match: (GE (FlagGT_UGT) yes no) 15304 // cond: 15305 // result: (First nil yes no) 15306 for { 15307 v := b.Control 15308 if v.Op != OpARM64FlagGT_UGT { 15309 break 15310 } 15311 yes := b.Succs[0] 15312 no := b.Succs[1] 15313 b.Kind = BlockFirst 15314 b.SetControl(nil) 15315 _ = yes 15316 _ = no 15317 return true 15318 } 15319 // match: (GE (InvertFlags cmp) yes no) 15320 // cond: 15321 // result: (LE cmp yes no) 15322 for { 15323 v := b.Control 15324 if v.Op != OpARM64InvertFlags { 15325 break 15326 } 15327 cmp := v.Args[0] 15328 yes := b.Succs[0] 15329 no := b.Succs[1] 15330 b.Kind = BlockARM64LE 15331 b.SetControl(cmp) 15332 _ = yes 15333 _ = no 15334 return true 15335 } 15336 case BlockARM64GT: 15337 // match: (GT (FlagEQ) yes no) 15338 // cond: 15339 // result: (First nil no yes) 15340 for { 15341 v := b.Control 15342 if v.Op != OpARM64FlagEQ { 15343 break 15344 } 15345 yes := b.Succs[0] 15346 no := b.Succs[1] 15347 b.Kind = BlockFirst 15348 b.SetControl(nil) 15349 b.swapSuccessors() 15350 _ = no 15351 _ = yes 15352 return true 15353 } 15354 // match: (GT (FlagLT_ULT) yes no) 15355 // cond: 15356 // result: (First nil no yes) 15357 for { 15358 v := b.Control 15359 if v.Op != OpARM64FlagLT_ULT { 15360 break 15361 } 15362 yes := b.Succs[0] 15363 no := b.Succs[1] 15364 b.Kind = BlockFirst 15365 b.SetControl(nil) 15366 b.swapSuccessors() 15367 _ = no 15368 _ = yes 15369 return true 15370 } 15371 // match: (GT (FlagLT_UGT) yes no) 15372 // cond: 15373 // result: (First nil no yes) 15374 for { 15375 v := b.Control 15376 if v.Op != OpARM64FlagLT_UGT { 15377 break 15378 } 15379 yes := b.Succs[0] 15380 no := b.Succs[1] 15381 b.Kind = BlockFirst 15382 b.SetControl(nil) 15383 b.swapSuccessors() 15384 _ = no 15385 _ = yes 15386 return true 15387 } 15388 // match: (GT (FlagGT_ULT) yes no) 15389 // cond: 15390 // result: (First nil yes no) 15391 for { 15392 v := b.Control 15393 if v.Op != OpARM64FlagGT_ULT { 15394 break 15395 } 15396 yes := b.Succs[0] 15397 no := b.Succs[1] 15398 b.Kind = BlockFirst 15399 b.SetControl(nil) 15400 _ = yes 15401 _ = no 15402 return true 15403 } 15404 // match: (GT (FlagGT_UGT) yes no) 15405 // cond: 15406 // result: (First nil yes no) 15407 for { 15408 v := b.Control 15409 if v.Op != OpARM64FlagGT_UGT { 15410 break 15411 } 15412 yes := b.Succs[0] 15413 no := b.Succs[1] 15414 b.Kind = BlockFirst 15415 b.SetControl(nil) 15416 _ = yes 15417 _ = no 15418 return true 15419 } 15420 // match: (GT (InvertFlags cmp) yes no) 15421 // cond: 15422 // result: (LT cmp yes no) 15423 for { 15424 v := b.Control 15425 if v.Op != OpARM64InvertFlags { 15426 break 15427 } 15428 cmp := v.Args[0] 15429 yes := b.Succs[0] 15430 no := b.Succs[1] 15431 b.Kind = BlockARM64LT 15432 b.SetControl(cmp) 15433 _ = yes 15434 _ = no 15435 return true 15436 } 15437 case BlockIf: 15438 // match: (If (Equal cc) yes no) 15439 // cond: 15440 // result: (EQ cc yes no) 15441 for { 15442 v := b.Control 15443 if v.Op != OpARM64Equal { 15444 break 15445 } 15446 cc := v.Args[0] 15447 yes := b.Succs[0] 15448 no := b.Succs[1] 15449 b.Kind = BlockARM64EQ 15450 b.SetControl(cc) 15451 _ = yes 15452 _ = no 15453 return true 15454 } 15455 // match: (If (NotEqual cc) yes no) 15456 // cond: 15457 // result: (NE cc yes no) 15458 for { 15459 v := b.Control 15460 if v.Op != OpARM64NotEqual { 15461 break 15462 } 15463 cc := v.Args[0] 15464 yes := b.Succs[0] 15465 no := b.Succs[1] 15466 b.Kind = BlockARM64NE 15467 b.SetControl(cc) 15468 _ = yes 15469 _ = no 15470 return true 15471 } 15472 // match: (If (LessThan cc) yes no) 15473 // cond: 15474 // result: (LT cc yes no) 15475 for { 15476 v := b.Control 15477 if v.Op != OpARM64LessThan { 15478 break 15479 } 15480 cc := v.Args[0] 15481 yes := b.Succs[0] 15482 no := b.Succs[1] 15483 b.Kind = BlockARM64LT 15484 b.SetControl(cc) 15485 _ = yes 15486 _ = no 15487 return true 15488 } 15489 // match: (If (LessThanU cc) yes no) 15490 // cond: 15491 // result: (ULT cc yes no) 15492 for { 15493 v := b.Control 15494 if v.Op != OpARM64LessThanU { 15495 break 15496 } 15497 cc := v.Args[0] 15498 yes := b.Succs[0] 15499 no := b.Succs[1] 15500 b.Kind = BlockARM64ULT 15501 b.SetControl(cc) 15502 _ = yes 15503 _ = no 15504 return true 15505 } 15506 // match: (If (LessEqual cc) yes no) 15507 // cond: 15508 // result: (LE cc yes no) 15509 for { 15510 v := b.Control 15511 if v.Op != OpARM64LessEqual { 15512 break 15513 } 15514 cc := v.Args[0] 15515 yes := b.Succs[0] 15516 no := b.Succs[1] 15517 b.Kind = BlockARM64LE 15518 b.SetControl(cc) 15519 _ = yes 15520 _ = no 15521 return true 15522 } 15523 // match: (If (LessEqualU cc) yes no) 15524 // cond: 15525 // result: (ULE cc yes no) 15526 for { 15527 v := b.Control 15528 if v.Op != OpARM64LessEqualU { 15529 break 15530 } 15531 cc := v.Args[0] 15532 yes := b.Succs[0] 15533 no := b.Succs[1] 15534 b.Kind = BlockARM64ULE 15535 b.SetControl(cc) 15536 _ = yes 15537 _ = no 15538 return true 15539 } 15540 // match: (If (GreaterThan cc) yes no) 15541 // cond: 15542 // result: (GT cc yes no) 15543 for { 15544 v := b.Control 15545 if v.Op != OpARM64GreaterThan { 15546 break 15547 } 15548 cc := v.Args[0] 15549 yes := b.Succs[0] 15550 no := b.Succs[1] 15551 b.Kind = BlockARM64GT 15552 b.SetControl(cc) 15553 _ = yes 15554 _ = no 15555 return true 15556 } 15557 // match: (If (GreaterThanU cc) yes no) 15558 // cond: 15559 // result: (UGT cc yes no) 15560 for { 15561 v := b.Control 15562 if v.Op != OpARM64GreaterThanU { 15563 break 15564 } 15565 cc := v.Args[0] 15566 yes := b.Succs[0] 15567 no := b.Succs[1] 15568 b.Kind = BlockARM64UGT 15569 b.SetControl(cc) 15570 _ = yes 15571 _ = no 15572 return true 15573 } 15574 // match: (If (GreaterEqual cc) yes no) 15575 // cond: 15576 // result: (GE cc yes no) 15577 for { 15578 v := b.Control 15579 if v.Op != OpARM64GreaterEqual { 15580 break 15581 } 15582 cc := v.Args[0] 15583 yes := b.Succs[0] 15584 no := b.Succs[1] 15585 b.Kind = BlockARM64GE 15586 b.SetControl(cc) 15587 _ = yes 15588 _ = no 15589 return true 15590 } 15591 // match: (If (GreaterEqualU cc) yes no) 15592 // cond: 15593 // result: (UGE cc yes no) 15594 for { 15595 v := b.Control 15596 if v.Op != OpARM64GreaterEqualU { 15597 break 15598 } 15599 cc := v.Args[0] 15600 yes := b.Succs[0] 15601 no := b.Succs[1] 15602 b.Kind = BlockARM64UGE 15603 b.SetControl(cc) 15604 _ = yes 15605 _ = no 15606 return true 15607 } 15608 // match: (If cond yes no) 15609 // cond: 15610 // result: (NZ cond yes no) 15611 for { 15612 v := b.Control 15613 _ = v 15614 cond := b.Control 15615 yes := b.Succs[0] 15616 no := b.Succs[1] 15617 b.Kind = BlockARM64NZ 15618 b.SetControl(cond) 15619 _ = yes 15620 _ = no 15621 return true 15622 } 15623 case BlockARM64LE: 15624 // match: (LE (FlagEQ) yes no) 15625 // cond: 15626 // result: (First nil yes no) 15627 for { 15628 v := b.Control 15629 if v.Op != OpARM64FlagEQ { 15630 break 15631 } 15632 yes := b.Succs[0] 15633 no := b.Succs[1] 15634 b.Kind = BlockFirst 15635 b.SetControl(nil) 15636 _ = yes 15637 _ = no 15638 return true 15639 } 15640 // match: (LE (FlagLT_ULT) yes no) 15641 // cond: 15642 // result: (First nil yes no) 15643 for { 15644 v := b.Control 15645 if v.Op != OpARM64FlagLT_ULT { 15646 break 15647 } 15648 yes := b.Succs[0] 15649 no := b.Succs[1] 15650 b.Kind = BlockFirst 15651 b.SetControl(nil) 15652 _ = yes 15653 _ = no 15654 return true 15655 } 15656 // match: (LE (FlagLT_UGT) yes no) 15657 // cond: 15658 // result: (First nil yes no) 15659 for { 15660 v := b.Control 15661 if v.Op != OpARM64FlagLT_UGT { 15662 break 15663 } 15664 yes := b.Succs[0] 15665 no := b.Succs[1] 15666 b.Kind = BlockFirst 15667 b.SetControl(nil) 15668 _ = yes 15669 _ = no 15670 return true 15671 } 15672 // match: (LE (FlagGT_ULT) yes no) 15673 // cond: 15674 // result: (First nil no yes) 15675 for { 15676 v := b.Control 15677 if v.Op != OpARM64FlagGT_ULT { 15678 break 15679 } 15680 yes := b.Succs[0] 15681 no := b.Succs[1] 15682 b.Kind = BlockFirst 15683 b.SetControl(nil) 15684 b.swapSuccessors() 15685 _ = no 15686 _ = yes 15687 return true 15688 } 15689 // match: (LE (FlagGT_UGT) yes no) 15690 // cond: 15691 // result: (First nil no yes) 15692 for { 15693 v := b.Control 15694 if v.Op != OpARM64FlagGT_UGT { 15695 break 15696 } 15697 yes := b.Succs[0] 15698 no := b.Succs[1] 15699 b.Kind = BlockFirst 15700 b.SetControl(nil) 15701 b.swapSuccessors() 15702 _ = no 15703 _ = yes 15704 return true 15705 } 15706 // match: (LE (InvertFlags cmp) yes no) 15707 // cond: 15708 // result: (GE cmp yes no) 15709 for { 15710 v := b.Control 15711 if v.Op != OpARM64InvertFlags { 15712 break 15713 } 15714 cmp := v.Args[0] 15715 yes := b.Succs[0] 15716 no := b.Succs[1] 15717 b.Kind = BlockARM64GE 15718 b.SetControl(cmp) 15719 _ = yes 15720 _ = no 15721 return true 15722 } 15723 case BlockARM64LT: 15724 // match: (LT (FlagEQ) yes no) 15725 // cond: 15726 // result: (First nil no yes) 15727 for { 15728 v := b.Control 15729 if v.Op != OpARM64FlagEQ { 15730 break 15731 } 15732 yes := b.Succs[0] 15733 no := b.Succs[1] 15734 b.Kind = BlockFirst 15735 b.SetControl(nil) 15736 b.swapSuccessors() 15737 _ = no 15738 _ = yes 15739 return true 15740 } 15741 // match: (LT (FlagLT_ULT) yes no) 15742 // cond: 15743 // result: (First nil yes no) 15744 for { 15745 v := b.Control 15746 if v.Op != OpARM64FlagLT_ULT { 15747 break 15748 } 15749 yes := b.Succs[0] 15750 no := b.Succs[1] 15751 b.Kind = BlockFirst 15752 b.SetControl(nil) 15753 _ = yes 15754 _ = no 15755 return true 15756 } 15757 // match: (LT (FlagLT_UGT) yes no) 15758 // cond: 15759 // result: (First nil yes no) 15760 for { 15761 v := b.Control 15762 if v.Op != OpARM64FlagLT_UGT { 15763 break 15764 } 15765 yes := b.Succs[0] 15766 no := b.Succs[1] 15767 b.Kind = BlockFirst 15768 b.SetControl(nil) 15769 _ = yes 15770 _ = no 15771 return true 15772 } 15773 // match: (LT (FlagGT_ULT) yes no) 15774 // cond: 15775 // result: (First nil no yes) 15776 for { 15777 v := b.Control 15778 if v.Op != OpARM64FlagGT_ULT { 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: (LT (FlagGT_UGT) yes no) 15791 // cond: 15792 // result: (First nil no yes) 15793 for { 15794 v := b.Control 15795 if v.Op != OpARM64FlagGT_UGT { 15796 break 15797 } 15798 yes := b.Succs[0] 15799 no := b.Succs[1] 15800 b.Kind = BlockFirst 15801 b.SetControl(nil) 15802 b.swapSuccessors() 15803 _ = no 15804 _ = yes 15805 return true 15806 } 15807 // match: (LT (InvertFlags cmp) yes no) 15808 // cond: 15809 // result: (GT cmp yes no) 15810 for { 15811 v := b.Control 15812 if v.Op != OpARM64InvertFlags { 15813 break 15814 } 15815 cmp := v.Args[0] 15816 yes := b.Succs[0] 15817 no := b.Succs[1] 15818 b.Kind = BlockARM64GT 15819 b.SetControl(cmp) 15820 _ = yes 15821 _ = no 15822 return true 15823 } 15824 case BlockARM64NE: 15825 // match: (NE (CMPconst [0] x) yes no) 15826 // cond: 15827 // result: (NZ x yes no) 15828 for { 15829 v := b.Control 15830 if v.Op != OpARM64CMPconst { 15831 break 15832 } 15833 if v.AuxInt != 0 { 15834 break 15835 } 15836 x := v.Args[0] 15837 yes := b.Succs[0] 15838 no := b.Succs[1] 15839 b.Kind = BlockARM64NZ 15840 b.SetControl(x) 15841 _ = yes 15842 _ = no 15843 return true 15844 } 15845 // match: (NE (CMPWconst [0] x) yes no) 15846 // cond: 15847 // result: (NZW x yes no) 15848 for { 15849 v := b.Control 15850 if v.Op != OpARM64CMPWconst { 15851 break 15852 } 15853 if v.AuxInt != 0 { 15854 break 15855 } 15856 x := v.Args[0] 15857 yes := b.Succs[0] 15858 no := b.Succs[1] 15859 b.Kind = BlockARM64NZW 15860 b.SetControl(x) 15861 _ = yes 15862 _ = no 15863 return true 15864 } 15865 // match: (NE (FlagEQ) yes no) 15866 // cond: 15867 // result: (First nil no yes) 15868 for { 15869 v := b.Control 15870 if v.Op != OpARM64FlagEQ { 15871 break 15872 } 15873 yes := b.Succs[0] 15874 no := b.Succs[1] 15875 b.Kind = BlockFirst 15876 b.SetControl(nil) 15877 b.swapSuccessors() 15878 _ = no 15879 _ = yes 15880 return true 15881 } 15882 // match: (NE (FlagLT_ULT) yes no) 15883 // cond: 15884 // result: (First nil yes no) 15885 for { 15886 v := b.Control 15887 if v.Op != OpARM64FlagLT_ULT { 15888 break 15889 } 15890 yes := b.Succs[0] 15891 no := b.Succs[1] 15892 b.Kind = BlockFirst 15893 b.SetControl(nil) 15894 _ = yes 15895 _ = no 15896 return true 15897 } 15898 // match: (NE (FlagLT_UGT) yes no) 15899 // cond: 15900 // result: (First nil yes no) 15901 for { 15902 v := b.Control 15903 if v.Op != OpARM64FlagLT_UGT { 15904 break 15905 } 15906 yes := b.Succs[0] 15907 no := b.Succs[1] 15908 b.Kind = BlockFirst 15909 b.SetControl(nil) 15910 _ = yes 15911 _ = no 15912 return true 15913 } 15914 // match: (NE (FlagGT_ULT) yes no) 15915 // cond: 15916 // result: (First nil yes no) 15917 for { 15918 v := b.Control 15919 if v.Op != OpARM64FlagGT_ULT { 15920 break 15921 } 15922 yes := b.Succs[0] 15923 no := b.Succs[1] 15924 b.Kind = BlockFirst 15925 b.SetControl(nil) 15926 _ = yes 15927 _ = no 15928 return true 15929 } 15930 // match: (NE (FlagGT_UGT) yes no) 15931 // cond: 15932 // result: (First nil yes no) 15933 for { 15934 v := b.Control 15935 if v.Op != OpARM64FlagGT_UGT { 15936 break 15937 } 15938 yes := b.Succs[0] 15939 no := b.Succs[1] 15940 b.Kind = BlockFirst 15941 b.SetControl(nil) 15942 _ = yes 15943 _ = no 15944 return true 15945 } 15946 // match: (NE (InvertFlags cmp) yes no) 15947 // cond: 15948 // result: (NE cmp yes no) 15949 for { 15950 v := b.Control 15951 if v.Op != OpARM64InvertFlags { 15952 break 15953 } 15954 cmp := v.Args[0] 15955 yes := b.Succs[0] 15956 no := b.Succs[1] 15957 b.Kind = BlockARM64NE 15958 b.SetControl(cmp) 15959 _ = yes 15960 _ = no 15961 return true 15962 } 15963 case BlockARM64NZ: 15964 // match: (NZ (Equal cc) yes no) 15965 // cond: 15966 // result: (EQ cc yes no) 15967 for { 15968 v := b.Control 15969 if v.Op != OpARM64Equal { 15970 break 15971 } 15972 cc := v.Args[0] 15973 yes := b.Succs[0] 15974 no := b.Succs[1] 15975 b.Kind = BlockARM64EQ 15976 b.SetControl(cc) 15977 _ = yes 15978 _ = no 15979 return true 15980 } 15981 // match: (NZ (NotEqual cc) yes no) 15982 // cond: 15983 // result: (NE cc yes no) 15984 for { 15985 v := b.Control 15986 if v.Op != OpARM64NotEqual { 15987 break 15988 } 15989 cc := v.Args[0] 15990 yes := b.Succs[0] 15991 no := b.Succs[1] 15992 b.Kind = BlockARM64NE 15993 b.SetControl(cc) 15994 _ = yes 15995 _ = no 15996 return true 15997 } 15998 // match: (NZ (LessThan cc) yes no) 15999 // cond: 16000 // result: (LT cc yes no) 16001 for { 16002 v := b.Control 16003 if v.Op != OpARM64LessThan { 16004 break 16005 } 16006 cc := v.Args[0] 16007 yes := b.Succs[0] 16008 no := b.Succs[1] 16009 b.Kind = BlockARM64LT 16010 b.SetControl(cc) 16011 _ = yes 16012 _ = no 16013 return true 16014 } 16015 // match: (NZ (LessThanU cc) yes no) 16016 // cond: 16017 // result: (ULT cc yes no) 16018 for { 16019 v := b.Control 16020 if v.Op != OpARM64LessThanU { 16021 break 16022 } 16023 cc := v.Args[0] 16024 yes := b.Succs[0] 16025 no := b.Succs[1] 16026 b.Kind = BlockARM64ULT 16027 b.SetControl(cc) 16028 _ = yes 16029 _ = no 16030 return true 16031 } 16032 // match: (NZ (LessEqual cc) yes no) 16033 // cond: 16034 // result: (LE cc yes no) 16035 for { 16036 v := b.Control 16037 if v.Op != OpARM64LessEqual { 16038 break 16039 } 16040 cc := v.Args[0] 16041 yes := b.Succs[0] 16042 no := b.Succs[1] 16043 b.Kind = BlockARM64LE 16044 b.SetControl(cc) 16045 _ = yes 16046 _ = no 16047 return true 16048 } 16049 // match: (NZ (LessEqualU cc) yes no) 16050 // cond: 16051 // result: (ULE cc yes no) 16052 for { 16053 v := b.Control 16054 if v.Op != OpARM64LessEqualU { 16055 break 16056 } 16057 cc := v.Args[0] 16058 yes := b.Succs[0] 16059 no := b.Succs[1] 16060 b.Kind = BlockARM64ULE 16061 b.SetControl(cc) 16062 _ = yes 16063 _ = no 16064 return true 16065 } 16066 // match: (NZ (GreaterThan cc) yes no) 16067 // cond: 16068 // result: (GT cc yes no) 16069 for { 16070 v := b.Control 16071 if v.Op != OpARM64GreaterThan { 16072 break 16073 } 16074 cc := v.Args[0] 16075 yes := b.Succs[0] 16076 no := b.Succs[1] 16077 b.Kind = BlockARM64GT 16078 b.SetControl(cc) 16079 _ = yes 16080 _ = no 16081 return true 16082 } 16083 // match: (NZ (GreaterThanU cc) yes no) 16084 // cond: 16085 // result: (UGT cc yes no) 16086 for { 16087 v := b.Control 16088 if v.Op != OpARM64GreaterThanU { 16089 break 16090 } 16091 cc := v.Args[0] 16092 yes := b.Succs[0] 16093 no := b.Succs[1] 16094 b.Kind = BlockARM64UGT 16095 b.SetControl(cc) 16096 _ = yes 16097 _ = no 16098 return true 16099 } 16100 // match: (NZ (GreaterEqual cc) yes no) 16101 // cond: 16102 // result: (GE cc yes no) 16103 for { 16104 v := b.Control 16105 if v.Op != OpARM64GreaterEqual { 16106 break 16107 } 16108 cc := v.Args[0] 16109 yes := b.Succs[0] 16110 no := b.Succs[1] 16111 b.Kind = BlockARM64GE 16112 b.SetControl(cc) 16113 _ = yes 16114 _ = no 16115 return true 16116 } 16117 // match: (NZ (GreaterEqualU cc) yes no) 16118 // cond: 16119 // result: (UGE cc yes no) 16120 for { 16121 v := b.Control 16122 if v.Op != OpARM64GreaterEqualU { 16123 break 16124 } 16125 cc := v.Args[0] 16126 yes := b.Succs[0] 16127 no := b.Succs[1] 16128 b.Kind = BlockARM64UGE 16129 b.SetControl(cc) 16130 _ = yes 16131 _ = no 16132 return true 16133 } 16134 // match: (NZ (MOVDconst [0]) yes no) 16135 // cond: 16136 // result: (First nil no yes) 16137 for { 16138 v := b.Control 16139 if v.Op != OpARM64MOVDconst { 16140 break 16141 } 16142 if v.AuxInt != 0 { 16143 break 16144 } 16145 yes := b.Succs[0] 16146 no := b.Succs[1] 16147 b.Kind = BlockFirst 16148 b.SetControl(nil) 16149 b.swapSuccessors() 16150 _ = no 16151 _ = yes 16152 return true 16153 } 16154 // match: (NZ (MOVDconst [c]) yes no) 16155 // cond: c != 0 16156 // result: (First nil yes no) 16157 for { 16158 v := b.Control 16159 if v.Op != OpARM64MOVDconst { 16160 break 16161 } 16162 c := v.AuxInt 16163 yes := b.Succs[0] 16164 no := b.Succs[1] 16165 if !(c != 0) { 16166 break 16167 } 16168 b.Kind = BlockFirst 16169 b.SetControl(nil) 16170 _ = yes 16171 _ = no 16172 return true 16173 } 16174 case BlockARM64NZW: 16175 // match: (NZW (MOVDconst [c]) yes no) 16176 // cond: int32(c) == 0 16177 // result: (First nil no yes) 16178 for { 16179 v := b.Control 16180 if v.Op != OpARM64MOVDconst { 16181 break 16182 } 16183 c := v.AuxInt 16184 yes := b.Succs[0] 16185 no := b.Succs[1] 16186 if !(int32(c) == 0) { 16187 break 16188 } 16189 b.Kind = BlockFirst 16190 b.SetControl(nil) 16191 b.swapSuccessors() 16192 _ = no 16193 _ = yes 16194 return true 16195 } 16196 // match: (NZW (MOVDconst [c]) yes no) 16197 // cond: int32(c) != 0 16198 // result: (First nil yes no) 16199 for { 16200 v := b.Control 16201 if v.Op != OpARM64MOVDconst { 16202 break 16203 } 16204 c := v.AuxInt 16205 yes := b.Succs[0] 16206 no := b.Succs[1] 16207 if !(int32(c) != 0) { 16208 break 16209 } 16210 b.Kind = BlockFirst 16211 b.SetControl(nil) 16212 _ = yes 16213 _ = no 16214 return true 16215 } 16216 case BlockARM64UGE: 16217 // match: (UGE (FlagEQ) yes no) 16218 // cond: 16219 // result: (First nil yes no) 16220 for { 16221 v := b.Control 16222 if v.Op != OpARM64FlagEQ { 16223 break 16224 } 16225 yes := b.Succs[0] 16226 no := b.Succs[1] 16227 b.Kind = BlockFirst 16228 b.SetControl(nil) 16229 _ = yes 16230 _ = no 16231 return true 16232 } 16233 // match: (UGE (FlagLT_ULT) yes no) 16234 // cond: 16235 // result: (First nil no yes) 16236 for { 16237 v := b.Control 16238 if v.Op != OpARM64FlagLT_ULT { 16239 break 16240 } 16241 yes := b.Succs[0] 16242 no := b.Succs[1] 16243 b.Kind = BlockFirst 16244 b.SetControl(nil) 16245 b.swapSuccessors() 16246 _ = no 16247 _ = yes 16248 return true 16249 } 16250 // match: (UGE (FlagLT_UGT) yes no) 16251 // cond: 16252 // result: (First nil yes no) 16253 for { 16254 v := b.Control 16255 if v.Op != OpARM64FlagLT_UGT { 16256 break 16257 } 16258 yes := b.Succs[0] 16259 no := b.Succs[1] 16260 b.Kind = BlockFirst 16261 b.SetControl(nil) 16262 _ = yes 16263 _ = no 16264 return true 16265 } 16266 // match: (UGE (FlagGT_ULT) yes no) 16267 // cond: 16268 // result: (First nil no yes) 16269 for { 16270 v := b.Control 16271 if v.Op != OpARM64FlagGT_ULT { 16272 break 16273 } 16274 yes := b.Succs[0] 16275 no := b.Succs[1] 16276 b.Kind = BlockFirst 16277 b.SetControl(nil) 16278 b.swapSuccessors() 16279 _ = no 16280 _ = yes 16281 return true 16282 } 16283 // match: (UGE (FlagGT_UGT) yes no) 16284 // cond: 16285 // result: (First nil yes no) 16286 for { 16287 v := b.Control 16288 if v.Op != OpARM64FlagGT_UGT { 16289 break 16290 } 16291 yes := b.Succs[0] 16292 no := b.Succs[1] 16293 b.Kind = BlockFirst 16294 b.SetControl(nil) 16295 _ = yes 16296 _ = no 16297 return true 16298 } 16299 // match: (UGE (InvertFlags cmp) yes no) 16300 // cond: 16301 // result: (ULE cmp yes no) 16302 for { 16303 v := b.Control 16304 if v.Op != OpARM64InvertFlags { 16305 break 16306 } 16307 cmp := v.Args[0] 16308 yes := b.Succs[0] 16309 no := b.Succs[1] 16310 b.Kind = BlockARM64ULE 16311 b.SetControl(cmp) 16312 _ = yes 16313 _ = no 16314 return true 16315 } 16316 case BlockARM64UGT: 16317 // match: (UGT (FlagEQ) yes no) 16318 // cond: 16319 // result: (First nil no yes) 16320 for { 16321 v := b.Control 16322 if v.Op != OpARM64FlagEQ { 16323 break 16324 } 16325 yes := b.Succs[0] 16326 no := b.Succs[1] 16327 b.Kind = BlockFirst 16328 b.SetControl(nil) 16329 b.swapSuccessors() 16330 _ = no 16331 _ = yes 16332 return true 16333 } 16334 // match: (UGT (FlagLT_ULT) yes no) 16335 // cond: 16336 // result: (First nil no yes) 16337 for { 16338 v := b.Control 16339 if v.Op != OpARM64FlagLT_ULT { 16340 break 16341 } 16342 yes := b.Succs[0] 16343 no := b.Succs[1] 16344 b.Kind = BlockFirst 16345 b.SetControl(nil) 16346 b.swapSuccessors() 16347 _ = no 16348 _ = yes 16349 return true 16350 } 16351 // match: (UGT (FlagLT_UGT) yes no) 16352 // cond: 16353 // result: (First nil yes no) 16354 for { 16355 v := b.Control 16356 if v.Op != OpARM64FlagLT_UGT { 16357 break 16358 } 16359 yes := b.Succs[0] 16360 no := b.Succs[1] 16361 b.Kind = BlockFirst 16362 b.SetControl(nil) 16363 _ = yes 16364 _ = no 16365 return true 16366 } 16367 // match: (UGT (FlagGT_ULT) yes no) 16368 // cond: 16369 // result: (First nil no yes) 16370 for { 16371 v := b.Control 16372 if v.Op != OpARM64FlagGT_ULT { 16373 break 16374 } 16375 yes := b.Succs[0] 16376 no := b.Succs[1] 16377 b.Kind = BlockFirst 16378 b.SetControl(nil) 16379 b.swapSuccessors() 16380 _ = no 16381 _ = yes 16382 return true 16383 } 16384 // match: (UGT (FlagGT_UGT) yes no) 16385 // cond: 16386 // result: (First nil yes no) 16387 for { 16388 v := b.Control 16389 if v.Op != OpARM64FlagGT_UGT { 16390 break 16391 } 16392 yes := b.Succs[0] 16393 no := b.Succs[1] 16394 b.Kind = BlockFirst 16395 b.SetControl(nil) 16396 _ = yes 16397 _ = no 16398 return true 16399 } 16400 // match: (UGT (InvertFlags cmp) yes no) 16401 // cond: 16402 // result: (ULT cmp yes no) 16403 for { 16404 v := b.Control 16405 if v.Op != OpARM64InvertFlags { 16406 break 16407 } 16408 cmp := v.Args[0] 16409 yes := b.Succs[0] 16410 no := b.Succs[1] 16411 b.Kind = BlockARM64ULT 16412 b.SetControl(cmp) 16413 _ = yes 16414 _ = no 16415 return true 16416 } 16417 case BlockARM64ULE: 16418 // match: (ULE (FlagEQ) yes no) 16419 // cond: 16420 // result: (First nil yes no) 16421 for { 16422 v := b.Control 16423 if v.Op != OpARM64FlagEQ { 16424 break 16425 } 16426 yes := b.Succs[0] 16427 no := b.Succs[1] 16428 b.Kind = BlockFirst 16429 b.SetControl(nil) 16430 _ = yes 16431 _ = no 16432 return true 16433 } 16434 // match: (ULE (FlagLT_ULT) yes no) 16435 // cond: 16436 // result: (First nil yes no) 16437 for { 16438 v := b.Control 16439 if v.Op != OpARM64FlagLT_ULT { 16440 break 16441 } 16442 yes := b.Succs[0] 16443 no := b.Succs[1] 16444 b.Kind = BlockFirst 16445 b.SetControl(nil) 16446 _ = yes 16447 _ = no 16448 return true 16449 } 16450 // match: (ULE (FlagLT_UGT) yes no) 16451 // cond: 16452 // result: (First nil no yes) 16453 for { 16454 v := b.Control 16455 if v.Op != OpARM64FlagLT_UGT { 16456 break 16457 } 16458 yes := b.Succs[0] 16459 no := b.Succs[1] 16460 b.Kind = BlockFirst 16461 b.SetControl(nil) 16462 b.swapSuccessors() 16463 _ = no 16464 _ = yes 16465 return true 16466 } 16467 // match: (ULE (FlagGT_ULT) yes no) 16468 // cond: 16469 // result: (First nil yes no) 16470 for { 16471 v := b.Control 16472 if v.Op != OpARM64FlagGT_ULT { 16473 break 16474 } 16475 yes := b.Succs[0] 16476 no := b.Succs[1] 16477 b.Kind = BlockFirst 16478 b.SetControl(nil) 16479 _ = yes 16480 _ = no 16481 return true 16482 } 16483 // match: (ULE (FlagGT_UGT) yes no) 16484 // cond: 16485 // result: (First nil no yes) 16486 for { 16487 v := b.Control 16488 if v.Op != OpARM64FlagGT_UGT { 16489 break 16490 } 16491 yes := b.Succs[0] 16492 no := b.Succs[1] 16493 b.Kind = BlockFirst 16494 b.SetControl(nil) 16495 b.swapSuccessors() 16496 _ = no 16497 _ = yes 16498 return true 16499 } 16500 // match: (ULE (InvertFlags cmp) yes no) 16501 // cond: 16502 // result: (UGE cmp yes no) 16503 for { 16504 v := b.Control 16505 if v.Op != OpARM64InvertFlags { 16506 break 16507 } 16508 cmp := v.Args[0] 16509 yes := b.Succs[0] 16510 no := b.Succs[1] 16511 b.Kind = BlockARM64UGE 16512 b.SetControl(cmp) 16513 _ = yes 16514 _ = no 16515 return true 16516 } 16517 case BlockARM64ULT: 16518 // match: (ULT (FlagEQ) yes no) 16519 // cond: 16520 // result: (First nil no yes) 16521 for { 16522 v := b.Control 16523 if v.Op != OpARM64FlagEQ { 16524 break 16525 } 16526 yes := b.Succs[0] 16527 no := b.Succs[1] 16528 b.Kind = BlockFirst 16529 b.SetControl(nil) 16530 b.swapSuccessors() 16531 _ = no 16532 _ = yes 16533 return true 16534 } 16535 // match: (ULT (FlagLT_ULT) yes no) 16536 // cond: 16537 // result: (First nil yes no) 16538 for { 16539 v := b.Control 16540 if v.Op != OpARM64FlagLT_ULT { 16541 break 16542 } 16543 yes := b.Succs[0] 16544 no := b.Succs[1] 16545 b.Kind = BlockFirst 16546 b.SetControl(nil) 16547 _ = yes 16548 _ = no 16549 return true 16550 } 16551 // match: (ULT (FlagLT_UGT) yes no) 16552 // cond: 16553 // result: (First nil no yes) 16554 for { 16555 v := b.Control 16556 if v.Op != OpARM64FlagLT_UGT { 16557 break 16558 } 16559 yes := b.Succs[0] 16560 no := b.Succs[1] 16561 b.Kind = BlockFirst 16562 b.SetControl(nil) 16563 b.swapSuccessors() 16564 _ = no 16565 _ = yes 16566 return true 16567 } 16568 // match: (ULT (FlagGT_ULT) yes no) 16569 // cond: 16570 // result: (First nil yes no) 16571 for { 16572 v := b.Control 16573 if v.Op != OpARM64FlagGT_ULT { 16574 break 16575 } 16576 yes := b.Succs[0] 16577 no := b.Succs[1] 16578 b.Kind = BlockFirst 16579 b.SetControl(nil) 16580 _ = yes 16581 _ = no 16582 return true 16583 } 16584 // match: (ULT (FlagGT_UGT) yes no) 16585 // cond: 16586 // result: (First nil no yes) 16587 for { 16588 v := b.Control 16589 if v.Op != OpARM64FlagGT_UGT { 16590 break 16591 } 16592 yes := b.Succs[0] 16593 no := b.Succs[1] 16594 b.Kind = BlockFirst 16595 b.SetControl(nil) 16596 b.swapSuccessors() 16597 _ = no 16598 _ = yes 16599 return true 16600 } 16601 // match: (ULT (InvertFlags cmp) yes no) 16602 // cond: 16603 // result: (UGT cmp yes no) 16604 for { 16605 v := b.Control 16606 if v.Op != OpARM64InvertFlags { 16607 break 16608 } 16609 cmp := v.Args[0] 16610 yes := b.Succs[0] 16611 no := b.Succs[1] 16612 b.Kind = BlockARM64UGT 16613 b.SetControl(cmp) 16614 _ = yes 16615 _ = no 16616 return true 16617 } 16618 case BlockARM64Z: 16619 // match: (Z (MOVDconst [0]) yes no) 16620 // cond: 16621 // result: (First nil yes no) 16622 for { 16623 v := b.Control 16624 if v.Op != OpARM64MOVDconst { 16625 break 16626 } 16627 if v.AuxInt != 0 { 16628 break 16629 } 16630 yes := b.Succs[0] 16631 no := b.Succs[1] 16632 b.Kind = BlockFirst 16633 b.SetControl(nil) 16634 _ = yes 16635 _ = no 16636 return true 16637 } 16638 // match: (Z (MOVDconst [c]) yes no) 16639 // cond: c != 0 16640 // result: (First nil no yes) 16641 for { 16642 v := b.Control 16643 if v.Op != OpARM64MOVDconst { 16644 break 16645 } 16646 c := v.AuxInt 16647 yes := b.Succs[0] 16648 no := b.Succs[1] 16649 if !(c != 0) { 16650 break 16651 } 16652 b.Kind = BlockFirst 16653 b.SetControl(nil) 16654 b.swapSuccessors() 16655 _ = no 16656 _ = yes 16657 return true 16658 } 16659 case BlockARM64ZW: 16660 // match: (ZW (MOVDconst [c]) yes no) 16661 // cond: int32(c) == 0 16662 // result: (First nil yes no) 16663 for { 16664 v := b.Control 16665 if v.Op != OpARM64MOVDconst { 16666 break 16667 } 16668 c := v.AuxInt 16669 yes := b.Succs[0] 16670 no := b.Succs[1] 16671 if !(int32(c) == 0) { 16672 break 16673 } 16674 b.Kind = BlockFirst 16675 b.SetControl(nil) 16676 _ = yes 16677 _ = no 16678 return true 16679 } 16680 // match: (ZW (MOVDconst [c]) yes no) 16681 // cond: int32(c) != 0 16682 // result: (First nil no yes) 16683 for { 16684 v := b.Control 16685 if v.Op != OpARM64MOVDconst { 16686 break 16687 } 16688 c := v.AuxInt 16689 yes := b.Succs[0] 16690 no := b.Succs[1] 16691 if !(int32(c) != 0) { 16692 break 16693 } 16694 b.Kind = BlockFirst 16695 b.SetControl(nil) 16696 b.swapSuccessors() 16697 _ = no 16698 _ = yes 16699 return true 16700 } 16701 } 16702 return false 16703 }