github.com/freddyisaac/sicortex-golang@v0.0.0-20231019035217-e03519e66f60/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: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !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 !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 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: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !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 !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 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: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !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 !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 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: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !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 !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 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) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 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: is32Bit(off1+off2) 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 if !(is32Bit(off1 + off2)) { 3527 break 3528 } 3529 v.reset(OpARM64MOVBUload) 3530 v.AuxInt = off1 + off2 3531 v.Aux = sym 3532 v.AddArg(ptr) 3533 v.AddArg(mem) 3534 return true 3535 } 3536 // match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3537 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) 3538 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3539 for { 3540 off1 := v.AuxInt 3541 sym1 := v.Aux 3542 v_0 := v.Args[0] 3543 if v_0.Op != OpARM64MOVDaddr { 3544 break 3545 } 3546 off2 := v_0.AuxInt 3547 sym2 := v_0.Aux 3548 ptr := v_0.Args[0] 3549 mem := v.Args[1] 3550 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { 3551 break 3552 } 3553 v.reset(OpARM64MOVBUload) 3554 v.AuxInt = off1 + off2 3555 v.Aux = mergeSym(sym1, sym2) 3556 v.AddArg(ptr) 3557 v.AddArg(mem) 3558 return true 3559 } 3560 // match: (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3561 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3562 // result: (MOVDconst [0]) 3563 for { 3564 off := v.AuxInt 3565 sym := v.Aux 3566 ptr := v.Args[0] 3567 v_1 := v.Args[1] 3568 if v_1.Op != OpARM64MOVBstorezero { 3569 break 3570 } 3571 off2 := v_1.AuxInt 3572 sym2 := v_1.Aux 3573 ptr2 := v_1.Args[0] 3574 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3575 break 3576 } 3577 v.reset(OpARM64MOVDconst) 3578 v.AuxInt = 0 3579 return true 3580 } 3581 return false 3582 } 3583 func rewriteValueARM64_OpARM64MOVBUreg(v *Value, config *Config) bool { 3584 b := v.Block 3585 _ = b 3586 // match: (MOVBUreg x:(MOVBUload _ _)) 3587 // cond: 3588 // result: (MOVDreg x) 3589 for { 3590 x := v.Args[0] 3591 if x.Op != OpARM64MOVBUload { 3592 break 3593 } 3594 v.reset(OpARM64MOVDreg) 3595 v.AddArg(x) 3596 return true 3597 } 3598 // match: (MOVBUreg x:(MOVBUreg _)) 3599 // cond: 3600 // result: (MOVDreg x) 3601 for { 3602 x := v.Args[0] 3603 if x.Op != OpARM64MOVBUreg { 3604 break 3605 } 3606 v.reset(OpARM64MOVDreg) 3607 v.AddArg(x) 3608 return true 3609 } 3610 // match: (MOVBUreg (MOVDconst [c])) 3611 // cond: 3612 // result: (MOVDconst [int64(uint8(c))]) 3613 for { 3614 v_0 := v.Args[0] 3615 if v_0.Op != OpARM64MOVDconst { 3616 break 3617 } 3618 c := v_0.AuxInt 3619 v.reset(OpARM64MOVDconst) 3620 v.AuxInt = int64(uint8(c)) 3621 return true 3622 } 3623 return false 3624 } 3625 func rewriteValueARM64_OpARM64MOVBload(v *Value, config *Config) bool { 3626 b := v.Block 3627 _ = b 3628 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 3629 // cond: is32Bit(off1+off2) 3630 // result: (MOVBload [off1+off2] {sym} ptr mem) 3631 for { 3632 off1 := v.AuxInt 3633 sym := v.Aux 3634 v_0 := v.Args[0] 3635 if v_0.Op != OpARM64ADDconst { 3636 break 3637 } 3638 off2 := v_0.AuxInt 3639 ptr := v_0.Args[0] 3640 mem := v.Args[1] 3641 if !(is32Bit(off1 + off2)) { 3642 break 3643 } 3644 v.reset(OpARM64MOVBload) 3645 v.AuxInt = off1 + off2 3646 v.Aux = sym 3647 v.AddArg(ptr) 3648 v.AddArg(mem) 3649 return true 3650 } 3651 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3652 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) 3653 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3654 for { 3655 off1 := v.AuxInt 3656 sym1 := v.Aux 3657 v_0 := v.Args[0] 3658 if v_0.Op != OpARM64MOVDaddr { 3659 break 3660 } 3661 off2 := v_0.AuxInt 3662 sym2 := v_0.Aux 3663 ptr := v_0.Args[0] 3664 mem := v.Args[1] 3665 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { 3666 break 3667 } 3668 v.reset(OpARM64MOVBload) 3669 v.AuxInt = off1 + off2 3670 v.Aux = mergeSym(sym1, sym2) 3671 v.AddArg(ptr) 3672 v.AddArg(mem) 3673 return true 3674 } 3675 // match: (MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) 3676 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 3677 // result: (MOVDconst [0]) 3678 for { 3679 off := v.AuxInt 3680 sym := v.Aux 3681 ptr := v.Args[0] 3682 v_1 := v.Args[1] 3683 if v_1.Op != OpARM64MOVBstorezero { 3684 break 3685 } 3686 off2 := v_1.AuxInt 3687 sym2 := v_1.Aux 3688 ptr2 := v_1.Args[0] 3689 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 3690 break 3691 } 3692 v.reset(OpARM64MOVDconst) 3693 v.AuxInt = 0 3694 return true 3695 } 3696 return false 3697 } 3698 func rewriteValueARM64_OpARM64MOVBreg(v *Value, config *Config) bool { 3699 b := v.Block 3700 _ = b 3701 // match: (MOVBreg x:(MOVBload _ _)) 3702 // cond: 3703 // result: (MOVDreg x) 3704 for { 3705 x := v.Args[0] 3706 if x.Op != OpARM64MOVBload { 3707 break 3708 } 3709 v.reset(OpARM64MOVDreg) 3710 v.AddArg(x) 3711 return true 3712 } 3713 // match: (MOVBreg x:(MOVBreg _)) 3714 // cond: 3715 // result: (MOVDreg x) 3716 for { 3717 x := v.Args[0] 3718 if x.Op != OpARM64MOVBreg { 3719 break 3720 } 3721 v.reset(OpARM64MOVDreg) 3722 v.AddArg(x) 3723 return true 3724 } 3725 // match: (MOVBreg (MOVDconst [c])) 3726 // cond: 3727 // result: (MOVDconst [int64(int8(c))]) 3728 for { 3729 v_0 := v.Args[0] 3730 if v_0.Op != OpARM64MOVDconst { 3731 break 3732 } 3733 c := v_0.AuxInt 3734 v.reset(OpARM64MOVDconst) 3735 v.AuxInt = int64(int8(c)) 3736 return true 3737 } 3738 return false 3739 } 3740 func rewriteValueARM64_OpARM64MOVBstore(v *Value, config *Config) bool { 3741 b := v.Block 3742 _ = b 3743 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 3744 // cond: is32Bit(off1+off2) 3745 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 3746 for { 3747 off1 := v.AuxInt 3748 sym := v.Aux 3749 v_0 := v.Args[0] 3750 if v_0.Op != OpARM64ADDconst { 3751 break 3752 } 3753 off2 := v_0.AuxInt 3754 ptr := v_0.Args[0] 3755 val := v.Args[1] 3756 mem := v.Args[2] 3757 if !(is32Bit(off1 + off2)) { 3758 break 3759 } 3760 v.reset(OpARM64MOVBstore) 3761 v.AuxInt = off1 + off2 3762 v.Aux = sym 3763 v.AddArg(ptr) 3764 v.AddArg(val) 3765 v.AddArg(mem) 3766 return true 3767 } 3768 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 3769 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) 3770 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 3771 for { 3772 off1 := v.AuxInt 3773 sym1 := v.Aux 3774 v_0 := v.Args[0] 3775 if v_0.Op != OpARM64MOVDaddr { 3776 break 3777 } 3778 off2 := v_0.AuxInt 3779 sym2 := v_0.Aux 3780 ptr := v_0.Args[0] 3781 val := v.Args[1] 3782 mem := v.Args[2] 3783 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { 3784 break 3785 } 3786 v.reset(OpARM64MOVBstore) 3787 v.AuxInt = off1 + off2 3788 v.Aux = mergeSym(sym1, sym2) 3789 v.AddArg(ptr) 3790 v.AddArg(val) 3791 v.AddArg(mem) 3792 return true 3793 } 3794 // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) 3795 // cond: 3796 // result: (MOVBstorezero [off] {sym} ptr mem) 3797 for { 3798 off := v.AuxInt 3799 sym := v.Aux 3800 ptr := v.Args[0] 3801 v_1 := v.Args[1] 3802 if v_1.Op != OpARM64MOVDconst { 3803 break 3804 } 3805 if v_1.AuxInt != 0 { 3806 break 3807 } 3808 mem := v.Args[2] 3809 v.reset(OpARM64MOVBstorezero) 3810 v.AuxInt = off 3811 v.Aux = sym 3812 v.AddArg(ptr) 3813 v.AddArg(mem) 3814 return true 3815 } 3816 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 3817 // cond: 3818 // result: (MOVBstore [off] {sym} ptr x mem) 3819 for { 3820 off := v.AuxInt 3821 sym := v.Aux 3822 ptr := v.Args[0] 3823 v_1 := v.Args[1] 3824 if v_1.Op != OpARM64MOVBreg { 3825 break 3826 } 3827 x := v_1.Args[0] 3828 mem := v.Args[2] 3829 v.reset(OpARM64MOVBstore) 3830 v.AuxInt = off 3831 v.Aux = sym 3832 v.AddArg(ptr) 3833 v.AddArg(x) 3834 v.AddArg(mem) 3835 return true 3836 } 3837 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 3838 // cond: 3839 // result: (MOVBstore [off] {sym} ptr x mem) 3840 for { 3841 off := v.AuxInt 3842 sym := v.Aux 3843 ptr := v.Args[0] 3844 v_1 := v.Args[1] 3845 if v_1.Op != OpARM64MOVBUreg { 3846 break 3847 } 3848 x := v_1.Args[0] 3849 mem := v.Args[2] 3850 v.reset(OpARM64MOVBstore) 3851 v.AuxInt = off 3852 v.Aux = sym 3853 v.AddArg(ptr) 3854 v.AddArg(x) 3855 v.AddArg(mem) 3856 return true 3857 } 3858 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 3859 // cond: 3860 // result: (MOVBstore [off] {sym} ptr x mem) 3861 for { 3862 off := v.AuxInt 3863 sym := v.Aux 3864 ptr := v.Args[0] 3865 v_1 := v.Args[1] 3866 if v_1.Op != OpARM64MOVHreg { 3867 break 3868 } 3869 x := v_1.Args[0] 3870 mem := v.Args[2] 3871 v.reset(OpARM64MOVBstore) 3872 v.AuxInt = off 3873 v.Aux = sym 3874 v.AddArg(ptr) 3875 v.AddArg(x) 3876 v.AddArg(mem) 3877 return true 3878 } 3879 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 3880 // cond: 3881 // result: (MOVBstore [off] {sym} ptr x mem) 3882 for { 3883 off := v.AuxInt 3884 sym := v.Aux 3885 ptr := v.Args[0] 3886 v_1 := v.Args[1] 3887 if v_1.Op != OpARM64MOVHUreg { 3888 break 3889 } 3890 x := v_1.Args[0] 3891 mem := v.Args[2] 3892 v.reset(OpARM64MOVBstore) 3893 v.AuxInt = off 3894 v.Aux = sym 3895 v.AddArg(ptr) 3896 v.AddArg(x) 3897 v.AddArg(mem) 3898 return true 3899 } 3900 // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) 3901 // cond: 3902 // result: (MOVBstore [off] {sym} ptr x mem) 3903 for { 3904 off := v.AuxInt 3905 sym := v.Aux 3906 ptr := v.Args[0] 3907 v_1 := v.Args[1] 3908 if v_1.Op != OpARM64MOVWreg { 3909 break 3910 } 3911 x := v_1.Args[0] 3912 mem := v.Args[2] 3913 v.reset(OpARM64MOVBstore) 3914 v.AuxInt = off 3915 v.Aux = sym 3916 v.AddArg(ptr) 3917 v.AddArg(x) 3918 v.AddArg(mem) 3919 return true 3920 } 3921 // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) 3922 // cond: 3923 // result: (MOVBstore [off] {sym} ptr x mem) 3924 for { 3925 off := v.AuxInt 3926 sym := v.Aux 3927 ptr := v.Args[0] 3928 v_1 := v.Args[1] 3929 if v_1.Op != OpARM64MOVWUreg { 3930 break 3931 } 3932 x := v_1.Args[0] 3933 mem := v.Args[2] 3934 v.reset(OpARM64MOVBstore) 3935 v.AuxInt = off 3936 v.Aux = sym 3937 v.AddArg(ptr) 3938 v.AddArg(x) 3939 v.AddArg(mem) 3940 return true 3941 } 3942 return false 3943 } 3944 func rewriteValueARM64_OpARM64MOVBstorezero(v *Value, config *Config) bool { 3945 b := v.Block 3946 _ = b 3947 // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 3948 // cond: is32Bit(off1+off2) 3949 // result: (MOVBstorezero [off1+off2] {sym} ptr mem) 3950 for { 3951 off1 := v.AuxInt 3952 sym := v.Aux 3953 v_0 := v.Args[0] 3954 if v_0.Op != OpARM64ADDconst { 3955 break 3956 } 3957 off2 := v_0.AuxInt 3958 ptr := v_0.Args[0] 3959 mem := v.Args[1] 3960 if !(is32Bit(off1 + off2)) { 3961 break 3962 } 3963 v.reset(OpARM64MOVBstorezero) 3964 v.AuxInt = off1 + off2 3965 v.Aux = sym 3966 v.AddArg(ptr) 3967 v.AddArg(mem) 3968 return true 3969 } 3970 // match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 3971 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) 3972 // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 3973 for { 3974 off1 := v.AuxInt 3975 sym1 := v.Aux 3976 v_0 := v.Args[0] 3977 if v_0.Op != OpARM64MOVDaddr { 3978 break 3979 } 3980 off2 := v_0.AuxInt 3981 sym2 := v_0.Aux 3982 ptr := v_0.Args[0] 3983 mem := v.Args[1] 3984 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { 3985 break 3986 } 3987 v.reset(OpARM64MOVBstorezero) 3988 v.AuxInt = off1 + off2 3989 v.Aux = mergeSym(sym1, sym2) 3990 v.AddArg(ptr) 3991 v.AddArg(mem) 3992 return true 3993 } 3994 return false 3995 } 3996 func rewriteValueARM64_OpARM64MOVDload(v *Value, config *Config) bool { 3997 b := v.Block 3998 _ = b 3999 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 4000 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4001 // result: (MOVDload [off1+off2] {sym} ptr mem) 4002 for { 4003 off1 := v.AuxInt 4004 sym := v.Aux 4005 v_0 := v.Args[0] 4006 if v_0.Op != OpARM64ADDconst { 4007 break 4008 } 4009 off2 := v_0.AuxInt 4010 ptr := v_0.Args[0] 4011 mem := v.Args[1] 4012 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4013 break 4014 } 4015 v.reset(OpARM64MOVDload) 4016 v.AuxInt = off1 + off2 4017 v.Aux = sym 4018 v.AddArg(ptr) 4019 v.AddArg(mem) 4020 return true 4021 } 4022 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4023 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4024 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4025 for { 4026 off1 := v.AuxInt 4027 sym1 := v.Aux 4028 v_0 := v.Args[0] 4029 if v_0.Op != OpARM64MOVDaddr { 4030 break 4031 } 4032 off2 := v_0.AuxInt 4033 sym2 := v_0.Aux 4034 ptr := v_0.Args[0] 4035 mem := v.Args[1] 4036 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4037 break 4038 } 4039 v.reset(OpARM64MOVDload) 4040 v.AuxInt = off1 + off2 4041 v.Aux = mergeSym(sym1, sym2) 4042 v.AddArg(ptr) 4043 v.AddArg(mem) 4044 return true 4045 } 4046 // match: (MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) 4047 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4048 // result: (MOVDconst [0]) 4049 for { 4050 off := v.AuxInt 4051 sym := v.Aux 4052 ptr := v.Args[0] 4053 v_1 := v.Args[1] 4054 if v_1.Op != OpARM64MOVDstorezero { 4055 break 4056 } 4057 off2 := v_1.AuxInt 4058 sym2 := v_1.Aux 4059 ptr2 := v_1.Args[0] 4060 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4061 break 4062 } 4063 v.reset(OpARM64MOVDconst) 4064 v.AuxInt = 0 4065 return true 4066 } 4067 return false 4068 } 4069 func rewriteValueARM64_OpARM64MOVDreg(v *Value, config *Config) bool { 4070 b := v.Block 4071 _ = b 4072 // match: (MOVDreg x) 4073 // cond: x.Uses == 1 4074 // result: (MOVDnop x) 4075 for { 4076 x := v.Args[0] 4077 if !(x.Uses == 1) { 4078 break 4079 } 4080 v.reset(OpARM64MOVDnop) 4081 v.AddArg(x) 4082 return true 4083 } 4084 // match: (MOVDreg (MOVDconst [c])) 4085 // cond: 4086 // result: (MOVDconst [c]) 4087 for { 4088 v_0 := v.Args[0] 4089 if v_0.Op != OpARM64MOVDconst { 4090 break 4091 } 4092 c := v_0.AuxInt 4093 v.reset(OpARM64MOVDconst) 4094 v.AuxInt = c 4095 return true 4096 } 4097 return false 4098 } 4099 func rewriteValueARM64_OpARM64MOVDstore(v *Value, config *Config) bool { 4100 b := v.Block 4101 _ = b 4102 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4103 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4104 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 4105 for { 4106 off1 := v.AuxInt 4107 sym := v.Aux 4108 v_0 := v.Args[0] 4109 if v_0.Op != OpARM64ADDconst { 4110 break 4111 } 4112 off2 := v_0.AuxInt 4113 ptr := v_0.Args[0] 4114 val := v.Args[1] 4115 mem := v.Args[2] 4116 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4117 break 4118 } 4119 v.reset(OpARM64MOVDstore) 4120 v.AuxInt = off1 + off2 4121 v.Aux = sym 4122 v.AddArg(ptr) 4123 v.AddArg(val) 4124 v.AddArg(mem) 4125 return true 4126 } 4127 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4128 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4129 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4130 for { 4131 off1 := v.AuxInt 4132 sym1 := v.Aux 4133 v_0 := v.Args[0] 4134 if v_0.Op != OpARM64MOVDaddr { 4135 break 4136 } 4137 off2 := v_0.AuxInt 4138 sym2 := v_0.Aux 4139 ptr := v_0.Args[0] 4140 val := v.Args[1] 4141 mem := v.Args[2] 4142 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4143 break 4144 } 4145 v.reset(OpARM64MOVDstore) 4146 v.AuxInt = off1 + off2 4147 v.Aux = mergeSym(sym1, sym2) 4148 v.AddArg(ptr) 4149 v.AddArg(val) 4150 v.AddArg(mem) 4151 return true 4152 } 4153 // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) 4154 // cond: 4155 // result: (MOVDstorezero [off] {sym} ptr mem) 4156 for { 4157 off := v.AuxInt 4158 sym := v.Aux 4159 ptr := v.Args[0] 4160 v_1 := v.Args[1] 4161 if v_1.Op != OpARM64MOVDconst { 4162 break 4163 } 4164 if v_1.AuxInt != 0 { 4165 break 4166 } 4167 mem := v.Args[2] 4168 v.reset(OpARM64MOVDstorezero) 4169 v.AuxInt = off 4170 v.Aux = sym 4171 v.AddArg(ptr) 4172 v.AddArg(mem) 4173 return true 4174 } 4175 return false 4176 } 4177 func rewriteValueARM64_OpARM64MOVDstorezero(v *Value, config *Config) bool { 4178 b := v.Block 4179 _ = b 4180 // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4181 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2==8 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4182 // result: (MOVDstorezero [off1+off2] {sym} ptr mem) 4183 for { 4184 off1 := v.AuxInt 4185 sym := v.Aux 4186 v_0 := v.Args[0] 4187 if v_0.Op != OpARM64ADDconst { 4188 break 4189 } 4190 off2 := v_0.AuxInt 4191 ptr := v_0.Args[0] 4192 mem := v.Args[1] 4193 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2 == 8 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4194 break 4195 } 4196 v.reset(OpARM64MOVDstorezero) 4197 v.AuxInt = off1 + off2 4198 v.Aux = sym 4199 v.AddArg(ptr) 4200 v.AddArg(mem) 4201 return true 4202 } 4203 // match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4204 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%8==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4205 // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4206 for { 4207 off1 := v.AuxInt 4208 sym1 := v.Aux 4209 v_0 := v.Args[0] 4210 if v_0.Op != OpARM64MOVDaddr { 4211 break 4212 } 4213 off2 := v_0.AuxInt 4214 sym2 := v_0.Aux 4215 ptr := v_0.Args[0] 4216 mem := v.Args[1] 4217 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%8 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4218 break 4219 } 4220 v.reset(OpARM64MOVDstorezero) 4221 v.AuxInt = off1 + off2 4222 v.Aux = mergeSym(sym1, sym2) 4223 v.AddArg(ptr) 4224 v.AddArg(mem) 4225 return true 4226 } 4227 return false 4228 } 4229 func rewriteValueARM64_OpARM64MOVHUload(v *Value, config *Config) bool { 4230 b := v.Block 4231 _ = b 4232 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 4233 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4234 // result: (MOVHUload [off1+off2] {sym} ptr mem) 4235 for { 4236 off1 := v.AuxInt 4237 sym := v.Aux 4238 v_0 := v.Args[0] 4239 if v_0.Op != OpARM64ADDconst { 4240 break 4241 } 4242 off2 := v_0.AuxInt 4243 ptr := v_0.Args[0] 4244 mem := v.Args[1] 4245 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4246 break 4247 } 4248 v.reset(OpARM64MOVHUload) 4249 v.AuxInt = off1 + off2 4250 v.Aux = sym 4251 v.AddArg(ptr) 4252 v.AddArg(mem) 4253 return true 4254 } 4255 // match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4256 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4257 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4258 for { 4259 off1 := v.AuxInt 4260 sym1 := v.Aux 4261 v_0 := v.Args[0] 4262 if v_0.Op != OpARM64MOVDaddr { 4263 break 4264 } 4265 off2 := v_0.AuxInt 4266 sym2 := v_0.Aux 4267 ptr := v_0.Args[0] 4268 mem := v.Args[1] 4269 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4270 break 4271 } 4272 v.reset(OpARM64MOVHUload) 4273 v.AuxInt = off1 + off2 4274 v.Aux = mergeSym(sym1, sym2) 4275 v.AddArg(ptr) 4276 v.AddArg(mem) 4277 return true 4278 } 4279 // match: (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4280 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4281 // result: (MOVDconst [0]) 4282 for { 4283 off := v.AuxInt 4284 sym := v.Aux 4285 ptr := v.Args[0] 4286 v_1 := v.Args[1] 4287 if v_1.Op != OpARM64MOVHstorezero { 4288 break 4289 } 4290 off2 := v_1.AuxInt 4291 sym2 := v_1.Aux 4292 ptr2 := v_1.Args[0] 4293 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4294 break 4295 } 4296 v.reset(OpARM64MOVDconst) 4297 v.AuxInt = 0 4298 return true 4299 } 4300 return false 4301 } 4302 func rewriteValueARM64_OpARM64MOVHUreg(v *Value, config *Config) bool { 4303 b := v.Block 4304 _ = b 4305 // match: (MOVHUreg x:(MOVBUload _ _)) 4306 // cond: 4307 // result: (MOVDreg x) 4308 for { 4309 x := v.Args[0] 4310 if x.Op != OpARM64MOVBUload { 4311 break 4312 } 4313 v.reset(OpARM64MOVDreg) 4314 v.AddArg(x) 4315 return true 4316 } 4317 // match: (MOVHUreg x:(MOVHUload _ _)) 4318 // cond: 4319 // result: (MOVDreg x) 4320 for { 4321 x := v.Args[0] 4322 if x.Op != OpARM64MOVHUload { 4323 break 4324 } 4325 v.reset(OpARM64MOVDreg) 4326 v.AddArg(x) 4327 return true 4328 } 4329 // match: (MOVHUreg x:(MOVBUreg _)) 4330 // cond: 4331 // result: (MOVDreg x) 4332 for { 4333 x := v.Args[0] 4334 if x.Op != OpARM64MOVBUreg { 4335 break 4336 } 4337 v.reset(OpARM64MOVDreg) 4338 v.AddArg(x) 4339 return true 4340 } 4341 // match: (MOVHUreg x:(MOVHUreg _)) 4342 // cond: 4343 // result: (MOVDreg x) 4344 for { 4345 x := v.Args[0] 4346 if x.Op != OpARM64MOVHUreg { 4347 break 4348 } 4349 v.reset(OpARM64MOVDreg) 4350 v.AddArg(x) 4351 return true 4352 } 4353 // match: (MOVHUreg (MOVDconst [c])) 4354 // cond: 4355 // result: (MOVDconst [int64(uint16(c))]) 4356 for { 4357 v_0 := v.Args[0] 4358 if v_0.Op != OpARM64MOVDconst { 4359 break 4360 } 4361 c := v_0.AuxInt 4362 v.reset(OpARM64MOVDconst) 4363 v.AuxInt = int64(uint16(c)) 4364 return true 4365 } 4366 return false 4367 } 4368 func rewriteValueARM64_OpARM64MOVHload(v *Value, config *Config) bool { 4369 b := v.Block 4370 _ = b 4371 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 4372 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4373 // result: (MOVHload [off1+off2] {sym} ptr mem) 4374 for { 4375 off1 := v.AuxInt 4376 sym := v.Aux 4377 v_0 := v.Args[0] 4378 if v_0.Op != OpARM64ADDconst { 4379 break 4380 } 4381 off2 := v_0.AuxInt 4382 ptr := v_0.Args[0] 4383 mem := v.Args[1] 4384 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4385 break 4386 } 4387 v.reset(OpARM64MOVHload) 4388 v.AuxInt = off1 + off2 4389 v.Aux = sym 4390 v.AddArg(ptr) 4391 v.AddArg(mem) 4392 return true 4393 } 4394 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4395 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4396 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4397 for { 4398 off1 := v.AuxInt 4399 sym1 := v.Aux 4400 v_0 := v.Args[0] 4401 if v_0.Op != OpARM64MOVDaddr { 4402 break 4403 } 4404 off2 := v_0.AuxInt 4405 sym2 := v_0.Aux 4406 ptr := v_0.Args[0] 4407 mem := v.Args[1] 4408 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4409 break 4410 } 4411 v.reset(OpARM64MOVHload) 4412 v.AuxInt = off1 + off2 4413 v.Aux = mergeSym(sym1, sym2) 4414 v.AddArg(ptr) 4415 v.AddArg(mem) 4416 return true 4417 } 4418 // match: (MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) 4419 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4420 // result: (MOVDconst [0]) 4421 for { 4422 off := v.AuxInt 4423 sym := v.Aux 4424 ptr := v.Args[0] 4425 v_1 := v.Args[1] 4426 if v_1.Op != OpARM64MOVHstorezero { 4427 break 4428 } 4429 off2 := v_1.AuxInt 4430 sym2 := v_1.Aux 4431 ptr2 := v_1.Args[0] 4432 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4433 break 4434 } 4435 v.reset(OpARM64MOVDconst) 4436 v.AuxInt = 0 4437 return true 4438 } 4439 return false 4440 } 4441 func rewriteValueARM64_OpARM64MOVHreg(v *Value, config *Config) bool { 4442 b := v.Block 4443 _ = b 4444 // match: (MOVHreg x:(MOVBload _ _)) 4445 // cond: 4446 // result: (MOVDreg x) 4447 for { 4448 x := v.Args[0] 4449 if x.Op != OpARM64MOVBload { 4450 break 4451 } 4452 v.reset(OpARM64MOVDreg) 4453 v.AddArg(x) 4454 return true 4455 } 4456 // match: (MOVHreg x:(MOVBUload _ _)) 4457 // cond: 4458 // result: (MOVDreg x) 4459 for { 4460 x := v.Args[0] 4461 if x.Op != OpARM64MOVBUload { 4462 break 4463 } 4464 v.reset(OpARM64MOVDreg) 4465 v.AddArg(x) 4466 return true 4467 } 4468 // match: (MOVHreg x:(MOVHload _ _)) 4469 // cond: 4470 // result: (MOVDreg x) 4471 for { 4472 x := v.Args[0] 4473 if x.Op != OpARM64MOVHload { 4474 break 4475 } 4476 v.reset(OpARM64MOVDreg) 4477 v.AddArg(x) 4478 return true 4479 } 4480 // match: (MOVHreg x:(MOVBreg _)) 4481 // cond: 4482 // result: (MOVDreg x) 4483 for { 4484 x := v.Args[0] 4485 if x.Op != OpARM64MOVBreg { 4486 break 4487 } 4488 v.reset(OpARM64MOVDreg) 4489 v.AddArg(x) 4490 return true 4491 } 4492 // match: (MOVHreg x:(MOVBUreg _)) 4493 // cond: 4494 // result: (MOVDreg x) 4495 for { 4496 x := v.Args[0] 4497 if x.Op != OpARM64MOVBUreg { 4498 break 4499 } 4500 v.reset(OpARM64MOVDreg) 4501 v.AddArg(x) 4502 return true 4503 } 4504 // match: (MOVHreg x:(MOVHreg _)) 4505 // cond: 4506 // result: (MOVDreg x) 4507 for { 4508 x := v.Args[0] 4509 if x.Op != OpARM64MOVHreg { 4510 break 4511 } 4512 v.reset(OpARM64MOVDreg) 4513 v.AddArg(x) 4514 return true 4515 } 4516 // match: (MOVHreg (MOVDconst [c])) 4517 // cond: 4518 // result: (MOVDconst [int64(int16(c))]) 4519 for { 4520 v_0 := v.Args[0] 4521 if v_0.Op != OpARM64MOVDconst { 4522 break 4523 } 4524 c := v_0.AuxInt 4525 v.reset(OpARM64MOVDconst) 4526 v.AuxInt = int64(int16(c)) 4527 return true 4528 } 4529 return false 4530 } 4531 func rewriteValueARM64_OpARM64MOVHstore(v *Value, config *Config) bool { 4532 b := v.Block 4533 _ = b 4534 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4535 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4536 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 4537 for { 4538 off1 := v.AuxInt 4539 sym := v.Aux 4540 v_0 := v.Args[0] 4541 if v_0.Op != OpARM64ADDconst { 4542 break 4543 } 4544 off2 := v_0.AuxInt 4545 ptr := v_0.Args[0] 4546 val := v.Args[1] 4547 mem := v.Args[2] 4548 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4549 break 4550 } 4551 v.reset(OpARM64MOVHstore) 4552 v.AuxInt = off1 + off2 4553 v.Aux = sym 4554 v.AddArg(ptr) 4555 v.AddArg(val) 4556 v.AddArg(mem) 4557 return true 4558 } 4559 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 4560 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4561 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 4562 for { 4563 off1 := v.AuxInt 4564 sym1 := v.Aux 4565 v_0 := v.Args[0] 4566 if v_0.Op != OpARM64MOVDaddr { 4567 break 4568 } 4569 off2 := v_0.AuxInt 4570 sym2 := v_0.Aux 4571 ptr := v_0.Args[0] 4572 val := v.Args[1] 4573 mem := v.Args[2] 4574 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4575 break 4576 } 4577 v.reset(OpARM64MOVHstore) 4578 v.AuxInt = off1 + off2 4579 v.Aux = mergeSym(sym1, sym2) 4580 v.AddArg(ptr) 4581 v.AddArg(val) 4582 v.AddArg(mem) 4583 return true 4584 } 4585 // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) 4586 // cond: 4587 // result: (MOVHstorezero [off] {sym} ptr mem) 4588 for { 4589 off := v.AuxInt 4590 sym := v.Aux 4591 ptr := v.Args[0] 4592 v_1 := v.Args[1] 4593 if v_1.Op != OpARM64MOVDconst { 4594 break 4595 } 4596 if v_1.AuxInt != 0 { 4597 break 4598 } 4599 mem := v.Args[2] 4600 v.reset(OpARM64MOVHstorezero) 4601 v.AuxInt = off 4602 v.Aux = sym 4603 v.AddArg(ptr) 4604 v.AddArg(mem) 4605 return true 4606 } 4607 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 4608 // cond: 4609 // result: (MOVHstore [off] {sym} ptr x mem) 4610 for { 4611 off := v.AuxInt 4612 sym := v.Aux 4613 ptr := v.Args[0] 4614 v_1 := v.Args[1] 4615 if v_1.Op != OpARM64MOVHreg { 4616 break 4617 } 4618 x := v_1.Args[0] 4619 mem := v.Args[2] 4620 v.reset(OpARM64MOVHstore) 4621 v.AuxInt = off 4622 v.Aux = sym 4623 v.AddArg(ptr) 4624 v.AddArg(x) 4625 v.AddArg(mem) 4626 return true 4627 } 4628 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 4629 // cond: 4630 // result: (MOVHstore [off] {sym} ptr x mem) 4631 for { 4632 off := v.AuxInt 4633 sym := v.Aux 4634 ptr := v.Args[0] 4635 v_1 := v.Args[1] 4636 if v_1.Op != OpARM64MOVHUreg { 4637 break 4638 } 4639 x := v_1.Args[0] 4640 mem := v.Args[2] 4641 v.reset(OpARM64MOVHstore) 4642 v.AuxInt = off 4643 v.Aux = sym 4644 v.AddArg(ptr) 4645 v.AddArg(x) 4646 v.AddArg(mem) 4647 return true 4648 } 4649 // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) 4650 // cond: 4651 // result: (MOVHstore [off] {sym} ptr x mem) 4652 for { 4653 off := v.AuxInt 4654 sym := v.Aux 4655 ptr := v.Args[0] 4656 v_1 := v.Args[1] 4657 if v_1.Op != OpARM64MOVWreg { 4658 break 4659 } 4660 x := v_1.Args[0] 4661 mem := v.Args[2] 4662 v.reset(OpARM64MOVHstore) 4663 v.AuxInt = off 4664 v.Aux = sym 4665 v.AddArg(ptr) 4666 v.AddArg(x) 4667 v.AddArg(mem) 4668 return true 4669 } 4670 // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) 4671 // cond: 4672 // result: (MOVHstore [off] {sym} ptr x mem) 4673 for { 4674 off := v.AuxInt 4675 sym := v.Aux 4676 ptr := v.Args[0] 4677 v_1 := v.Args[1] 4678 if v_1.Op != OpARM64MOVWUreg { 4679 break 4680 } 4681 x := v_1.Args[0] 4682 mem := v.Args[2] 4683 v.reset(OpARM64MOVHstore) 4684 v.AuxInt = off 4685 v.Aux = sym 4686 v.AddArg(ptr) 4687 v.AddArg(x) 4688 v.AddArg(mem) 4689 return true 4690 } 4691 return false 4692 } 4693 func rewriteValueARM64_OpARM64MOVHstorezero(v *Value, config *Config) bool { 4694 b := v.Block 4695 _ = b 4696 // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 4697 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4698 // result: (MOVHstorezero [off1+off2] {sym} ptr mem) 4699 for { 4700 off1 := v.AuxInt 4701 sym := v.Aux 4702 v_0 := v.Args[0] 4703 if v_0.Op != OpARM64ADDconst { 4704 break 4705 } 4706 off2 := v_0.AuxInt 4707 ptr := v_0.Args[0] 4708 mem := v.Args[1] 4709 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4710 break 4711 } 4712 v.reset(OpARM64MOVHstorezero) 4713 v.AuxInt = off1 + off2 4714 v.Aux = sym 4715 v.AddArg(ptr) 4716 v.AddArg(mem) 4717 return true 4718 } 4719 // match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4720 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%2==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4721 // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4722 for { 4723 off1 := v.AuxInt 4724 sym1 := v.Aux 4725 v_0 := v.Args[0] 4726 if v_0.Op != OpARM64MOVDaddr { 4727 break 4728 } 4729 off2 := v_0.AuxInt 4730 sym2 := v_0.Aux 4731 ptr := v_0.Args[0] 4732 mem := v.Args[1] 4733 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%2 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4734 break 4735 } 4736 v.reset(OpARM64MOVHstorezero) 4737 v.AuxInt = off1 + off2 4738 v.Aux = mergeSym(sym1, sym2) 4739 v.AddArg(ptr) 4740 v.AddArg(mem) 4741 return true 4742 } 4743 return false 4744 } 4745 func rewriteValueARM64_OpARM64MOVWUload(v *Value, config *Config) bool { 4746 b := v.Block 4747 _ = b 4748 // match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) 4749 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4750 // result: (MOVWUload [off1+off2] {sym} ptr mem) 4751 for { 4752 off1 := v.AuxInt 4753 sym := v.Aux 4754 v_0 := v.Args[0] 4755 if v_0.Op != OpARM64ADDconst { 4756 break 4757 } 4758 off2 := v_0.AuxInt 4759 ptr := v_0.Args[0] 4760 mem := v.Args[1] 4761 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4762 break 4763 } 4764 v.reset(OpARM64MOVWUload) 4765 v.AuxInt = off1 + off2 4766 v.Aux = sym 4767 v.AddArg(ptr) 4768 v.AddArg(mem) 4769 return true 4770 } 4771 // match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4772 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4773 // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4774 for { 4775 off1 := v.AuxInt 4776 sym1 := v.Aux 4777 v_0 := v.Args[0] 4778 if v_0.Op != OpARM64MOVDaddr { 4779 break 4780 } 4781 off2 := v_0.AuxInt 4782 sym2 := v_0.Aux 4783 ptr := v_0.Args[0] 4784 mem := v.Args[1] 4785 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4786 break 4787 } 4788 v.reset(OpARM64MOVWUload) 4789 v.AuxInt = off1 + off2 4790 v.Aux = mergeSym(sym1, sym2) 4791 v.AddArg(ptr) 4792 v.AddArg(mem) 4793 return true 4794 } 4795 // match: (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4796 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4797 // result: (MOVDconst [0]) 4798 for { 4799 off := v.AuxInt 4800 sym := v.Aux 4801 ptr := v.Args[0] 4802 v_1 := v.Args[1] 4803 if v_1.Op != OpARM64MOVWstorezero { 4804 break 4805 } 4806 off2 := v_1.AuxInt 4807 sym2 := v_1.Aux 4808 ptr2 := v_1.Args[0] 4809 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4810 break 4811 } 4812 v.reset(OpARM64MOVDconst) 4813 v.AuxInt = 0 4814 return true 4815 } 4816 return false 4817 } 4818 func rewriteValueARM64_OpARM64MOVWUreg(v *Value, config *Config) bool { 4819 b := v.Block 4820 _ = b 4821 // match: (MOVWUreg x:(MOVBUload _ _)) 4822 // cond: 4823 // result: (MOVDreg x) 4824 for { 4825 x := v.Args[0] 4826 if x.Op != OpARM64MOVBUload { 4827 break 4828 } 4829 v.reset(OpARM64MOVDreg) 4830 v.AddArg(x) 4831 return true 4832 } 4833 // match: (MOVWUreg x:(MOVHUload _ _)) 4834 // cond: 4835 // result: (MOVDreg x) 4836 for { 4837 x := v.Args[0] 4838 if x.Op != OpARM64MOVHUload { 4839 break 4840 } 4841 v.reset(OpARM64MOVDreg) 4842 v.AddArg(x) 4843 return true 4844 } 4845 // match: (MOVWUreg x:(MOVWUload _ _)) 4846 // cond: 4847 // result: (MOVDreg x) 4848 for { 4849 x := v.Args[0] 4850 if x.Op != OpARM64MOVWUload { 4851 break 4852 } 4853 v.reset(OpARM64MOVDreg) 4854 v.AddArg(x) 4855 return true 4856 } 4857 // match: (MOVWUreg x:(MOVBUreg _)) 4858 // cond: 4859 // result: (MOVDreg x) 4860 for { 4861 x := v.Args[0] 4862 if x.Op != OpARM64MOVBUreg { 4863 break 4864 } 4865 v.reset(OpARM64MOVDreg) 4866 v.AddArg(x) 4867 return true 4868 } 4869 // match: (MOVWUreg x:(MOVHUreg _)) 4870 // cond: 4871 // result: (MOVDreg x) 4872 for { 4873 x := v.Args[0] 4874 if x.Op != OpARM64MOVHUreg { 4875 break 4876 } 4877 v.reset(OpARM64MOVDreg) 4878 v.AddArg(x) 4879 return true 4880 } 4881 // match: (MOVWUreg x:(MOVWUreg _)) 4882 // cond: 4883 // result: (MOVDreg x) 4884 for { 4885 x := v.Args[0] 4886 if x.Op != OpARM64MOVWUreg { 4887 break 4888 } 4889 v.reset(OpARM64MOVDreg) 4890 v.AddArg(x) 4891 return true 4892 } 4893 // match: (MOVWUreg (MOVDconst [c])) 4894 // cond: 4895 // result: (MOVDconst [int64(uint32(c))]) 4896 for { 4897 v_0 := v.Args[0] 4898 if v_0.Op != OpARM64MOVDconst { 4899 break 4900 } 4901 c := v_0.AuxInt 4902 v.reset(OpARM64MOVDconst) 4903 v.AuxInt = int64(uint32(c)) 4904 return true 4905 } 4906 return false 4907 } 4908 func rewriteValueARM64_OpARM64MOVWload(v *Value, config *Config) bool { 4909 b := v.Block 4910 _ = b 4911 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 4912 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 4913 // result: (MOVWload [off1+off2] {sym} ptr mem) 4914 for { 4915 off1 := v.AuxInt 4916 sym := v.Aux 4917 v_0 := v.Args[0] 4918 if v_0.Op != OpARM64ADDconst { 4919 break 4920 } 4921 off2 := v_0.AuxInt 4922 ptr := v_0.Args[0] 4923 mem := v.Args[1] 4924 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 4925 break 4926 } 4927 v.reset(OpARM64MOVWload) 4928 v.AuxInt = off1 + off2 4929 v.Aux = sym 4930 v.AddArg(ptr) 4931 v.AddArg(mem) 4932 return true 4933 } 4934 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 4935 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 4936 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4937 for { 4938 off1 := v.AuxInt 4939 sym1 := v.Aux 4940 v_0 := v.Args[0] 4941 if v_0.Op != OpARM64MOVDaddr { 4942 break 4943 } 4944 off2 := v_0.AuxInt 4945 sym2 := v_0.Aux 4946 ptr := v_0.Args[0] 4947 mem := v.Args[1] 4948 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 4949 break 4950 } 4951 v.reset(OpARM64MOVWload) 4952 v.AuxInt = off1 + off2 4953 v.Aux = mergeSym(sym1, sym2) 4954 v.AddArg(ptr) 4955 v.AddArg(mem) 4956 return true 4957 } 4958 // match: (MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) 4959 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4960 // result: (MOVDconst [0]) 4961 for { 4962 off := v.AuxInt 4963 sym := v.Aux 4964 ptr := v.Args[0] 4965 v_1 := v.Args[1] 4966 if v_1.Op != OpARM64MOVWstorezero { 4967 break 4968 } 4969 off2 := v_1.AuxInt 4970 sym2 := v_1.Aux 4971 ptr2 := v_1.Args[0] 4972 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4973 break 4974 } 4975 v.reset(OpARM64MOVDconst) 4976 v.AuxInt = 0 4977 return true 4978 } 4979 return false 4980 } 4981 func rewriteValueARM64_OpARM64MOVWreg(v *Value, config *Config) bool { 4982 b := v.Block 4983 _ = b 4984 // match: (MOVWreg x:(MOVBload _ _)) 4985 // cond: 4986 // result: (MOVDreg x) 4987 for { 4988 x := v.Args[0] 4989 if x.Op != OpARM64MOVBload { 4990 break 4991 } 4992 v.reset(OpARM64MOVDreg) 4993 v.AddArg(x) 4994 return true 4995 } 4996 // match: (MOVWreg x:(MOVBUload _ _)) 4997 // cond: 4998 // result: (MOVDreg x) 4999 for { 5000 x := v.Args[0] 5001 if x.Op != OpARM64MOVBUload { 5002 break 5003 } 5004 v.reset(OpARM64MOVDreg) 5005 v.AddArg(x) 5006 return true 5007 } 5008 // match: (MOVWreg x:(MOVHload _ _)) 5009 // cond: 5010 // result: (MOVDreg x) 5011 for { 5012 x := v.Args[0] 5013 if x.Op != OpARM64MOVHload { 5014 break 5015 } 5016 v.reset(OpARM64MOVDreg) 5017 v.AddArg(x) 5018 return true 5019 } 5020 // match: (MOVWreg x:(MOVHUload _ _)) 5021 // cond: 5022 // result: (MOVDreg x) 5023 for { 5024 x := v.Args[0] 5025 if x.Op != OpARM64MOVHUload { 5026 break 5027 } 5028 v.reset(OpARM64MOVDreg) 5029 v.AddArg(x) 5030 return true 5031 } 5032 // match: (MOVWreg x:(MOVWload _ _)) 5033 // cond: 5034 // result: (MOVDreg x) 5035 for { 5036 x := v.Args[0] 5037 if x.Op != OpARM64MOVWload { 5038 break 5039 } 5040 v.reset(OpARM64MOVDreg) 5041 v.AddArg(x) 5042 return true 5043 } 5044 // match: (MOVWreg x:(MOVBreg _)) 5045 // cond: 5046 // result: (MOVDreg x) 5047 for { 5048 x := v.Args[0] 5049 if x.Op != OpARM64MOVBreg { 5050 break 5051 } 5052 v.reset(OpARM64MOVDreg) 5053 v.AddArg(x) 5054 return true 5055 } 5056 // match: (MOVWreg x:(MOVBUreg _)) 5057 // cond: 5058 // result: (MOVDreg x) 5059 for { 5060 x := v.Args[0] 5061 if x.Op != OpARM64MOVBUreg { 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:(MOVHreg _)) 5081 // cond: 5082 // result: (MOVDreg x) 5083 for { 5084 x := v.Args[0] 5085 if x.Op != OpARM64MOVHreg { 5086 break 5087 } 5088 v.reset(OpARM64MOVDreg) 5089 v.AddArg(x) 5090 return true 5091 } 5092 // match: (MOVWreg x:(MOVWreg _)) 5093 // cond: 5094 // result: (MOVDreg x) 5095 for { 5096 x := v.Args[0] 5097 if x.Op != OpARM64MOVWreg { 5098 break 5099 } 5100 v.reset(OpARM64MOVDreg) 5101 v.AddArg(x) 5102 return true 5103 } 5104 // match: (MOVWreg (MOVDconst [c])) 5105 // cond: 5106 // result: (MOVDconst [int64(int32(c))]) 5107 for { 5108 v_0 := v.Args[0] 5109 if v_0.Op != OpARM64MOVDconst { 5110 break 5111 } 5112 c := v_0.AuxInt 5113 v.reset(OpARM64MOVDconst) 5114 v.AuxInt = int64(int32(c)) 5115 return true 5116 } 5117 return false 5118 } 5119 func rewriteValueARM64_OpARM64MOVWstore(v *Value, config *Config) bool { 5120 b := v.Block 5121 _ = b 5122 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5123 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 5124 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 5125 for { 5126 off1 := v.AuxInt 5127 sym := v.Aux 5128 v_0 := v.Args[0] 5129 if v_0.Op != OpARM64ADDconst { 5130 break 5131 } 5132 off2 := v_0.AuxInt 5133 ptr := v_0.Args[0] 5134 val := v.Args[1] 5135 mem := v.Args[2] 5136 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 5137 break 5138 } 5139 v.reset(OpARM64MOVWstore) 5140 v.AuxInt = off1 + off2 5141 v.Aux = sym 5142 v.AddArg(ptr) 5143 v.AddArg(val) 5144 v.AddArg(mem) 5145 return true 5146 } 5147 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) 5148 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 5149 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5150 for { 5151 off1 := v.AuxInt 5152 sym1 := v.Aux 5153 v_0 := v.Args[0] 5154 if v_0.Op != OpARM64MOVDaddr { 5155 break 5156 } 5157 off2 := v_0.AuxInt 5158 sym2 := v_0.Aux 5159 ptr := v_0.Args[0] 5160 val := v.Args[1] 5161 mem := v.Args[2] 5162 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 5163 break 5164 } 5165 v.reset(OpARM64MOVWstore) 5166 v.AuxInt = off1 + off2 5167 v.Aux = mergeSym(sym1, sym2) 5168 v.AddArg(ptr) 5169 v.AddArg(val) 5170 v.AddArg(mem) 5171 return true 5172 } 5173 // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) 5174 // cond: 5175 // result: (MOVWstorezero [off] {sym} ptr mem) 5176 for { 5177 off := v.AuxInt 5178 sym := v.Aux 5179 ptr := v.Args[0] 5180 v_1 := v.Args[1] 5181 if v_1.Op != OpARM64MOVDconst { 5182 break 5183 } 5184 if v_1.AuxInt != 0 { 5185 break 5186 } 5187 mem := v.Args[2] 5188 v.reset(OpARM64MOVWstorezero) 5189 v.AuxInt = off 5190 v.Aux = sym 5191 v.AddArg(ptr) 5192 v.AddArg(mem) 5193 return true 5194 } 5195 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 5196 // cond: 5197 // result: (MOVWstore [off] {sym} ptr x mem) 5198 for { 5199 off := v.AuxInt 5200 sym := v.Aux 5201 ptr := v.Args[0] 5202 v_1 := v.Args[1] 5203 if v_1.Op != OpARM64MOVWreg { 5204 break 5205 } 5206 x := v_1.Args[0] 5207 mem := v.Args[2] 5208 v.reset(OpARM64MOVWstore) 5209 v.AuxInt = off 5210 v.Aux = sym 5211 v.AddArg(ptr) 5212 v.AddArg(x) 5213 v.AddArg(mem) 5214 return true 5215 } 5216 // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) 5217 // cond: 5218 // result: (MOVWstore [off] {sym} ptr x mem) 5219 for { 5220 off := v.AuxInt 5221 sym := v.Aux 5222 ptr := v.Args[0] 5223 v_1 := v.Args[1] 5224 if v_1.Op != OpARM64MOVWUreg { 5225 break 5226 } 5227 x := v_1.Args[0] 5228 mem := v.Args[2] 5229 v.reset(OpARM64MOVWstore) 5230 v.AuxInt = off 5231 v.Aux = sym 5232 v.AddArg(ptr) 5233 v.AddArg(x) 5234 v.AddArg(mem) 5235 return true 5236 } 5237 return false 5238 } 5239 func rewriteValueARM64_OpARM64MOVWstorezero(v *Value, config *Config) bool { 5240 b := v.Block 5241 _ = b 5242 // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) 5243 // cond: is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(sym)) 5244 // result: (MOVWstorezero [off1+off2] {sym} ptr mem) 5245 for { 5246 off1 := v.AuxInt 5247 sym := v.Aux 5248 v_0 := v.Args[0] 5249 if v_0.Op != OpARM64ADDconst { 5250 break 5251 } 5252 off2 := v_0.AuxInt 5253 ptr := v_0.Args[0] 5254 mem := v.Args[1] 5255 if !(is32Bit(off1+off2) && !isArg(sym) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(sym))) { 5256 break 5257 } 5258 v.reset(OpARM64MOVWstorezero) 5259 v.AuxInt = off1 + off2 5260 v.Aux = sym 5261 v.AddArg(ptr) 5262 v.AddArg(mem) 5263 return true 5264 } 5265 // match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) 5266 // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1,sym2)) && ((off1+off2)%4==0 || off1+off2<256 && off1+off2>-256 && !isAuto(mergeSym(sym1,sym2))) 5267 // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5268 for { 5269 off1 := v.AuxInt 5270 sym1 := v.Aux 5271 v_0 := v.Args[0] 5272 if v_0.Op != OpARM64MOVDaddr { 5273 break 5274 } 5275 off2 := v_0.AuxInt 5276 sym2 := v_0.Aux 5277 ptr := v_0.Args[0] 5278 mem := v.Args[1] 5279 if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && !isArg(mergeSym(sym1, sym2)) && ((off1+off2)%4 == 0 || off1+off2 < 256 && off1+off2 > -256 && !isAuto(mergeSym(sym1, sym2)))) { 5280 break 5281 } 5282 v.reset(OpARM64MOVWstorezero) 5283 v.AuxInt = off1 + off2 5284 v.Aux = mergeSym(sym1, sym2) 5285 v.AddArg(ptr) 5286 v.AddArg(mem) 5287 return true 5288 } 5289 return false 5290 } 5291 func rewriteValueARM64_OpARM64MUL(v *Value, config *Config) bool { 5292 b := v.Block 5293 _ = b 5294 // match: (MUL x (MOVDconst [-1])) 5295 // cond: 5296 // result: (NEG x) 5297 for { 5298 x := v.Args[0] 5299 v_1 := v.Args[1] 5300 if v_1.Op != OpARM64MOVDconst { 5301 break 5302 } 5303 if v_1.AuxInt != -1 { 5304 break 5305 } 5306 v.reset(OpARM64NEG) 5307 v.AddArg(x) 5308 return true 5309 } 5310 // match: (MUL _ (MOVDconst [0])) 5311 // cond: 5312 // result: (MOVDconst [0]) 5313 for { 5314 v_1 := v.Args[1] 5315 if v_1.Op != OpARM64MOVDconst { 5316 break 5317 } 5318 if v_1.AuxInt != 0 { 5319 break 5320 } 5321 v.reset(OpARM64MOVDconst) 5322 v.AuxInt = 0 5323 return true 5324 } 5325 // match: (MUL x (MOVDconst [1])) 5326 // cond: 5327 // result: x 5328 for { 5329 x := v.Args[0] 5330 v_1 := v.Args[1] 5331 if v_1.Op != OpARM64MOVDconst { 5332 break 5333 } 5334 if v_1.AuxInt != 1 { 5335 break 5336 } 5337 v.reset(OpCopy) 5338 v.Type = x.Type 5339 v.AddArg(x) 5340 return true 5341 } 5342 // match: (MUL x (MOVDconst [c])) 5343 // cond: isPowerOfTwo(c) 5344 // result: (SLLconst [log2(c)] x) 5345 for { 5346 x := v.Args[0] 5347 v_1 := v.Args[1] 5348 if v_1.Op != OpARM64MOVDconst { 5349 break 5350 } 5351 c := v_1.AuxInt 5352 if !(isPowerOfTwo(c)) { 5353 break 5354 } 5355 v.reset(OpARM64SLLconst) 5356 v.AuxInt = log2(c) 5357 v.AddArg(x) 5358 return true 5359 } 5360 // match: (MUL x (MOVDconst [c])) 5361 // cond: isPowerOfTwo(c-1) && c >= 3 5362 // result: (ADDshiftLL x x [log2(c-1)]) 5363 for { 5364 x := v.Args[0] 5365 v_1 := v.Args[1] 5366 if v_1.Op != OpARM64MOVDconst { 5367 break 5368 } 5369 c := v_1.AuxInt 5370 if !(isPowerOfTwo(c-1) && c >= 3) { 5371 break 5372 } 5373 v.reset(OpARM64ADDshiftLL) 5374 v.AuxInt = log2(c - 1) 5375 v.AddArg(x) 5376 v.AddArg(x) 5377 return true 5378 } 5379 // match: (MUL x (MOVDconst [c])) 5380 // cond: isPowerOfTwo(c+1) && c >= 7 5381 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5382 for { 5383 x := v.Args[0] 5384 v_1 := v.Args[1] 5385 if v_1.Op != OpARM64MOVDconst { 5386 break 5387 } 5388 c := v_1.AuxInt 5389 if !(isPowerOfTwo(c+1) && c >= 7) { 5390 break 5391 } 5392 v.reset(OpARM64ADDshiftLL) 5393 v.AuxInt = log2(c + 1) 5394 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5395 v0.AddArg(x) 5396 v.AddArg(v0) 5397 v.AddArg(x) 5398 return true 5399 } 5400 // match: (MUL x (MOVDconst [c])) 5401 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5402 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5403 for { 5404 x := v.Args[0] 5405 v_1 := v.Args[1] 5406 if v_1.Op != OpARM64MOVDconst { 5407 break 5408 } 5409 c := v_1.AuxInt 5410 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5411 break 5412 } 5413 v.reset(OpARM64SLLconst) 5414 v.AuxInt = log2(c / 3) 5415 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5416 v0.AuxInt = 1 5417 v0.AddArg(x) 5418 v0.AddArg(x) 5419 v.AddArg(v0) 5420 return true 5421 } 5422 // match: (MUL x (MOVDconst [c])) 5423 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5424 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5425 for { 5426 x := v.Args[0] 5427 v_1 := v.Args[1] 5428 if v_1.Op != OpARM64MOVDconst { 5429 break 5430 } 5431 c := v_1.AuxInt 5432 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5433 break 5434 } 5435 v.reset(OpARM64SLLconst) 5436 v.AuxInt = log2(c / 5) 5437 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5438 v0.AuxInt = 2 5439 v0.AddArg(x) 5440 v0.AddArg(x) 5441 v.AddArg(v0) 5442 return true 5443 } 5444 // match: (MUL x (MOVDconst [c])) 5445 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5446 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5447 for { 5448 x := v.Args[0] 5449 v_1 := v.Args[1] 5450 if v_1.Op != OpARM64MOVDconst { 5451 break 5452 } 5453 c := v_1.AuxInt 5454 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5455 break 5456 } 5457 v.reset(OpARM64SLLconst) 5458 v.AuxInt = log2(c / 7) 5459 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5460 v0.AuxInt = 3 5461 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5462 v1.AddArg(x) 5463 v0.AddArg(v1) 5464 v0.AddArg(x) 5465 v.AddArg(v0) 5466 return true 5467 } 5468 // match: (MUL x (MOVDconst [c])) 5469 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5470 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5471 for { 5472 x := v.Args[0] 5473 v_1 := v.Args[1] 5474 if v_1.Op != OpARM64MOVDconst { 5475 break 5476 } 5477 c := v_1.AuxInt 5478 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5479 break 5480 } 5481 v.reset(OpARM64SLLconst) 5482 v.AuxInt = log2(c / 9) 5483 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5484 v0.AuxInt = 3 5485 v0.AddArg(x) 5486 v0.AddArg(x) 5487 v.AddArg(v0) 5488 return true 5489 } 5490 // match: (MUL (MOVDconst [-1]) x) 5491 // cond: 5492 // result: (NEG x) 5493 for { 5494 v_0 := v.Args[0] 5495 if v_0.Op != OpARM64MOVDconst { 5496 break 5497 } 5498 if v_0.AuxInt != -1 { 5499 break 5500 } 5501 x := v.Args[1] 5502 v.reset(OpARM64NEG) 5503 v.AddArg(x) 5504 return true 5505 } 5506 // match: (MUL (MOVDconst [0]) _) 5507 // cond: 5508 // result: (MOVDconst [0]) 5509 for { 5510 v_0 := v.Args[0] 5511 if v_0.Op != OpARM64MOVDconst { 5512 break 5513 } 5514 if v_0.AuxInt != 0 { 5515 break 5516 } 5517 v.reset(OpARM64MOVDconst) 5518 v.AuxInt = 0 5519 return true 5520 } 5521 // match: (MUL (MOVDconst [1]) x) 5522 // cond: 5523 // result: x 5524 for { 5525 v_0 := v.Args[0] 5526 if v_0.Op != OpARM64MOVDconst { 5527 break 5528 } 5529 if v_0.AuxInt != 1 { 5530 break 5531 } 5532 x := v.Args[1] 5533 v.reset(OpCopy) 5534 v.Type = x.Type 5535 v.AddArg(x) 5536 return true 5537 } 5538 // match: (MUL (MOVDconst [c]) x) 5539 // cond: isPowerOfTwo(c) 5540 // result: (SLLconst [log2(c)] x) 5541 for { 5542 v_0 := v.Args[0] 5543 if v_0.Op != OpARM64MOVDconst { 5544 break 5545 } 5546 c := v_0.AuxInt 5547 x := v.Args[1] 5548 if !(isPowerOfTwo(c)) { 5549 break 5550 } 5551 v.reset(OpARM64SLLconst) 5552 v.AuxInt = log2(c) 5553 v.AddArg(x) 5554 return true 5555 } 5556 // match: (MUL (MOVDconst [c]) x) 5557 // cond: isPowerOfTwo(c) 5558 // result: (SLLconst [log2(c)] x) 5559 for { 5560 v_0 := v.Args[0] 5561 if v_0.Op != OpARM64MOVDconst { 5562 break 5563 } 5564 c := v_0.AuxInt 5565 x := v.Args[1] 5566 if !(isPowerOfTwo(c)) { 5567 break 5568 } 5569 v.reset(OpARM64SLLconst) 5570 v.AuxInt = log2(c) 5571 v.AddArg(x) 5572 return true 5573 } 5574 // match: (MUL (MOVDconst [c]) x) 5575 // cond: isPowerOfTwo(c-1) && c >= 3 5576 // result: (ADDshiftLL x x [log2(c-1)]) 5577 for { 5578 v_0 := v.Args[0] 5579 if v_0.Op != OpARM64MOVDconst { 5580 break 5581 } 5582 c := v_0.AuxInt 5583 x := v.Args[1] 5584 if !(isPowerOfTwo(c-1) && c >= 3) { 5585 break 5586 } 5587 v.reset(OpARM64ADDshiftLL) 5588 v.AuxInt = log2(c - 1) 5589 v.AddArg(x) 5590 v.AddArg(x) 5591 return true 5592 } 5593 // match: (MUL (MOVDconst [c]) x) 5594 // cond: isPowerOfTwo(c+1) && c >= 7 5595 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5596 for { 5597 v_0 := v.Args[0] 5598 if v_0.Op != OpARM64MOVDconst { 5599 break 5600 } 5601 c := v_0.AuxInt 5602 x := v.Args[1] 5603 if !(isPowerOfTwo(c+1) && c >= 7) { 5604 break 5605 } 5606 v.reset(OpARM64ADDshiftLL) 5607 v.AuxInt = log2(c + 1) 5608 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5609 v0.AddArg(x) 5610 v.AddArg(v0) 5611 v.AddArg(x) 5612 return true 5613 } 5614 // match: (MUL (MOVDconst [c]) x) 5615 // cond: c%3 == 0 && isPowerOfTwo(c/3) 5616 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5617 for { 5618 v_0 := v.Args[0] 5619 if v_0.Op != OpARM64MOVDconst { 5620 break 5621 } 5622 c := v_0.AuxInt 5623 x := v.Args[1] 5624 if !(c%3 == 0 && isPowerOfTwo(c/3)) { 5625 break 5626 } 5627 v.reset(OpARM64SLLconst) 5628 v.AuxInt = log2(c / 3) 5629 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5630 v0.AuxInt = 1 5631 v0.AddArg(x) 5632 v0.AddArg(x) 5633 v.AddArg(v0) 5634 return true 5635 } 5636 // match: (MUL (MOVDconst [c]) x) 5637 // cond: c%5 == 0 && isPowerOfTwo(c/5) 5638 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5639 for { 5640 v_0 := v.Args[0] 5641 if v_0.Op != OpARM64MOVDconst { 5642 break 5643 } 5644 c := v_0.AuxInt 5645 x := v.Args[1] 5646 if !(c%5 == 0 && isPowerOfTwo(c/5)) { 5647 break 5648 } 5649 v.reset(OpARM64SLLconst) 5650 v.AuxInt = log2(c / 5) 5651 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5652 v0.AuxInt = 2 5653 v0.AddArg(x) 5654 v0.AddArg(x) 5655 v.AddArg(v0) 5656 return true 5657 } 5658 // match: (MUL (MOVDconst [c]) x) 5659 // cond: c%7 == 0 && isPowerOfTwo(c/7) 5660 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5661 for { 5662 v_0 := v.Args[0] 5663 if v_0.Op != OpARM64MOVDconst { 5664 break 5665 } 5666 c := v_0.AuxInt 5667 x := v.Args[1] 5668 if !(c%7 == 0 && isPowerOfTwo(c/7)) { 5669 break 5670 } 5671 v.reset(OpARM64SLLconst) 5672 v.AuxInt = log2(c / 7) 5673 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5674 v0.AuxInt = 3 5675 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5676 v1.AddArg(x) 5677 v0.AddArg(v1) 5678 v0.AddArg(x) 5679 v.AddArg(v0) 5680 return true 5681 } 5682 // match: (MUL (MOVDconst [c]) x) 5683 // cond: c%9 == 0 && isPowerOfTwo(c/9) 5684 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5685 for { 5686 v_0 := v.Args[0] 5687 if v_0.Op != OpARM64MOVDconst { 5688 break 5689 } 5690 c := v_0.AuxInt 5691 x := v.Args[1] 5692 if !(c%9 == 0 && isPowerOfTwo(c/9)) { 5693 break 5694 } 5695 v.reset(OpARM64SLLconst) 5696 v.AuxInt = log2(c / 9) 5697 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5698 v0.AuxInt = 3 5699 v0.AddArg(x) 5700 v0.AddArg(x) 5701 v.AddArg(v0) 5702 return true 5703 } 5704 // match: (MUL (MOVDconst [c]) (MOVDconst [d])) 5705 // cond: 5706 // result: (MOVDconst [c*d]) 5707 for { 5708 v_0 := v.Args[0] 5709 if v_0.Op != OpARM64MOVDconst { 5710 break 5711 } 5712 c := v_0.AuxInt 5713 v_1 := v.Args[1] 5714 if v_1.Op != OpARM64MOVDconst { 5715 break 5716 } 5717 d := v_1.AuxInt 5718 v.reset(OpARM64MOVDconst) 5719 v.AuxInt = c * d 5720 return true 5721 } 5722 return false 5723 } 5724 func rewriteValueARM64_OpARM64MULW(v *Value, config *Config) bool { 5725 b := v.Block 5726 _ = b 5727 // match: (MULW x (MOVDconst [c])) 5728 // cond: int32(c)==-1 5729 // result: (NEG x) 5730 for { 5731 x := v.Args[0] 5732 v_1 := v.Args[1] 5733 if v_1.Op != OpARM64MOVDconst { 5734 break 5735 } 5736 c := v_1.AuxInt 5737 if !(int32(c) == -1) { 5738 break 5739 } 5740 v.reset(OpARM64NEG) 5741 v.AddArg(x) 5742 return true 5743 } 5744 // match: (MULW _ (MOVDconst [c])) 5745 // cond: int32(c)==0 5746 // result: (MOVDconst [0]) 5747 for { 5748 v_1 := v.Args[1] 5749 if v_1.Op != OpARM64MOVDconst { 5750 break 5751 } 5752 c := v_1.AuxInt 5753 if !(int32(c) == 0) { 5754 break 5755 } 5756 v.reset(OpARM64MOVDconst) 5757 v.AuxInt = 0 5758 return true 5759 } 5760 // match: (MULW x (MOVDconst [c])) 5761 // cond: int32(c)==1 5762 // result: x 5763 for { 5764 x := v.Args[0] 5765 v_1 := v.Args[1] 5766 if v_1.Op != OpARM64MOVDconst { 5767 break 5768 } 5769 c := v_1.AuxInt 5770 if !(int32(c) == 1) { 5771 break 5772 } 5773 v.reset(OpCopy) 5774 v.Type = x.Type 5775 v.AddArg(x) 5776 return true 5777 } 5778 // match: (MULW x (MOVDconst [c])) 5779 // cond: isPowerOfTwo(c) 5780 // result: (SLLconst [log2(c)] x) 5781 for { 5782 x := v.Args[0] 5783 v_1 := v.Args[1] 5784 if v_1.Op != OpARM64MOVDconst { 5785 break 5786 } 5787 c := v_1.AuxInt 5788 if !(isPowerOfTwo(c)) { 5789 break 5790 } 5791 v.reset(OpARM64SLLconst) 5792 v.AuxInt = log2(c) 5793 v.AddArg(x) 5794 return true 5795 } 5796 // match: (MULW x (MOVDconst [c])) 5797 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5798 // result: (ADDshiftLL x x [log2(c-1)]) 5799 for { 5800 x := v.Args[0] 5801 v_1 := v.Args[1] 5802 if v_1.Op != OpARM64MOVDconst { 5803 break 5804 } 5805 c := v_1.AuxInt 5806 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 5807 break 5808 } 5809 v.reset(OpARM64ADDshiftLL) 5810 v.AuxInt = log2(c - 1) 5811 v.AddArg(x) 5812 v.AddArg(x) 5813 return true 5814 } 5815 // match: (MULW x (MOVDconst [c])) 5816 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 5817 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 5818 for { 5819 x := v.Args[0] 5820 v_1 := v.Args[1] 5821 if v_1.Op != OpARM64MOVDconst { 5822 break 5823 } 5824 c := v_1.AuxInt 5825 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 5826 break 5827 } 5828 v.reset(OpARM64ADDshiftLL) 5829 v.AuxInt = log2(c + 1) 5830 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5831 v0.AddArg(x) 5832 v.AddArg(v0) 5833 v.AddArg(x) 5834 return true 5835 } 5836 // match: (MULW x (MOVDconst [c])) 5837 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 5838 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 5839 for { 5840 x := v.Args[0] 5841 v_1 := v.Args[1] 5842 if v_1.Op != OpARM64MOVDconst { 5843 break 5844 } 5845 c := v_1.AuxInt 5846 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 5847 break 5848 } 5849 v.reset(OpARM64SLLconst) 5850 v.AuxInt = log2(c / 3) 5851 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5852 v0.AuxInt = 1 5853 v0.AddArg(x) 5854 v0.AddArg(x) 5855 v.AddArg(v0) 5856 return true 5857 } 5858 // match: (MULW x (MOVDconst [c])) 5859 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 5860 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 5861 for { 5862 x := v.Args[0] 5863 v_1 := v.Args[1] 5864 if v_1.Op != OpARM64MOVDconst { 5865 break 5866 } 5867 c := v_1.AuxInt 5868 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 5869 break 5870 } 5871 v.reset(OpARM64SLLconst) 5872 v.AuxInt = log2(c / 5) 5873 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5874 v0.AuxInt = 2 5875 v0.AddArg(x) 5876 v0.AddArg(x) 5877 v.AddArg(v0) 5878 return true 5879 } 5880 // match: (MULW x (MOVDconst [c])) 5881 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 5882 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 5883 for { 5884 x := v.Args[0] 5885 v_1 := v.Args[1] 5886 if v_1.Op != OpARM64MOVDconst { 5887 break 5888 } 5889 c := v_1.AuxInt 5890 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 5891 break 5892 } 5893 v.reset(OpARM64SLLconst) 5894 v.AuxInt = log2(c / 7) 5895 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5896 v0.AuxInt = 3 5897 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 5898 v1.AddArg(x) 5899 v0.AddArg(v1) 5900 v0.AddArg(x) 5901 v.AddArg(v0) 5902 return true 5903 } 5904 // match: (MULW x (MOVDconst [c])) 5905 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 5906 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 5907 for { 5908 x := v.Args[0] 5909 v_1 := v.Args[1] 5910 if v_1.Op != OpARM64MOVDconst { 5911 break 5912 } 5913 c := v_1.AuxInt 5914 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 5915 break 5916 } 5917 v.reset(OpARM64SLLconst) 5918 v.AuxInt = log2(c / 9) 5919 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 5920 v0.AuxInt = 3 5921 v0.AddArg(x) 5922 v0.AddArg(x) 5923 v.AddArg(v0) 5924 return true 5925 } 5926 // match: (MULW (MOVDconst [c]) x) 5927 // cond: int32(c)==-1 5928 // result: (NEG x) 5929 for { 5930 v_0 := v.Args[0] 5931 if v_0.Op != OpARM64MOVDconst { 5932 break 5933 } 5934 c := v_0.AuxInt 5935 x := v.Args[1] 5936 if !(int32(c) == -1) { 5937 break 5938 } 5939 v.reset(OpARM64NEG) 5940 v.AddArg(x) 5941 return true 5942 } 5943 // match: (MULW (MOVDconst [c]) _) 5944 // cond: int32(c)==0 5945 // result: (MOVDconst [0]) 5946 for { 5947 v_0 := v.Args[0] 5948 if v_0.Op != OpARM64MOVDconst { 5949 break 5950 } 5951 c := v_0.AuxInt 5952 if !(int32(c) == 0) { 5953 break 5954 } 5955 v.reset(OpARM64MOVDconst) 5956 v.AuxInt = 0 5957 return true 5958 } 5959 // match: (MULW (MOVDconst [c]) x) 5960 // cond: int32(c)==1 5961 // result: x 5962 for { 5963 v_0 := v.Args[0] 5964 if v_0.Op != OpARM64MOVDconst { 5965 break 5966 } 5967 c := v_0.AuxInt 5968 x := v.Args[1] 5969 if !(int32(c) == 1) { 5970 break 5971 } 5972 v.reset(OpCopy) 5973 v.Type = x.Type 5974 v.AddArg(x) 5975 return true 5976 } 5977 // match: (MULW (MOVDconst [c]) x) 5978 // cond: isPowerOfTwo(c) 5979 // result: (SLLconst [log2(c)] x) 5980 for { 5981 v_0 := v.Args[0] 5982 if v_0.Op != OpARM64MOVDconst { 5983 break 5984 } 5985 c := v_0.AuxInt 5986 x := v.Args[1] 5987 if !(isPowerOfTwo(c)) { 5988 break 5989 } 5990 v.reset(OpARM64SLLconst) 5991 v.AuxInt = log2(c) 5992 v.AddArg(x) 5993 return true 5994 } 5995 // match: (MULW (MOVDconst [c]) x) 5996 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 5997 // result: (ADDshiftLL x x [log2(c-1)]) 5998 for { 5999 v_0 := v.Args[0] 6000 if v_0.Op != OpARM64MOVDconst { 6001 break 6002 } 6003 c := v_0.AuxInt 6004 x := v.Args[1] 6005 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 6006 break 6007 } 6008 v.reset(OpARM64ADDshiftLL) 6009 v.AuxInt = log2(c - 1) 6010 v.AddArg(x) 6011 v.AddArg(x) 6012 return true 6013 } 6014 // match: (MULW (MOVDconst [c]) x) 6015 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 6016 // result: (ADDshiftLL (NEG <x.Type> x) x [log2(c+1)]) 6017 for { 6018 v_0 := v.Args[0] 6019 if v_0.Op != OpARM64MOVDconst { 6020 break 6021 } 6022 c := v_0.AuxInt 6023 x := v.Args[1] 6024 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 6025 break 6026 } 6027 v.reset(OpARM64ADDshiftLL) 6028 v.AuxInt = log2(c + 1) 6029 v0 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 6030 v0.AddArg(x) 6031 v.AddArg(v0) 6032 v.AddArg(x) 6033 return true 6034 } 6035 // match: (MULW (MOVDconst [c]) x) 6036 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 6037 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 6038 for { 6039 v_0 := v.Args[0] 6040 if v_0.Op != OpARM64MOVDconst { 6041 break 6042 } 6043 c := v_0.AuxInt 6044 x := v.Args[1] 6045 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 6046 break 6047 } 6048 v.reset(OpARM64SLLconst) 6049 v.AuxInt = log2(c / 3) 6050 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6051 v0.AuxInt = 1 6052 v0.AddArg(x) 6053 v0.AddArg(x) 6054 v.AddArg(v0) 6055 return true 6056 } 6057 // match: (MULW (MOVDconst [c]) x) 6058 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 6059 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 6060 for { 6061 v_0 := v.Args[0] 6062 if v_0.Op != OpARM64MOVDconst { 6063 break 6064 } 6065 c := v_0.AuxInt 6066 x := v.Args[1] 6067 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 6068 break 6069 } 6070 v.reset(OpARM64SLLconst) 6071 v.AuxInt = log2(c / 5) 6072 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6073 v0.AuxInt = 2 6074 v0.AddArg(x) 6075 v0.AddArg(x) 6076 v.AddArg(v0) 6077 return true 6078 } 6079 // match: (MULW (MOVDconst [c]) x) 6080 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 6081 // result: (SLLconst [log2(c/7)] (ADDshiftLL <x.Type> (NEG <x.Type> x) x [3])) 6082 for { 6083 v_0 := v.Args[0] 6084 if v_0.Op != OpARM64MOVDconst { 6085 break 6086 } 6087 c := v_0.AuxInt 6088 x := v.Args[1] 6089 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 6090 break 6091 } 6092 v.reset(OpARM64SLLconst) 6093 v.AuxInt = log2(c / 7) 6094 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6095 v0.AuxInt = 3 6096 v1 := b.NewValue0(v.Line, OpARM64NEG, x.Type) 6097 v1.AddArg(x) 6098 v0.AddArg(v1) 6099 v0.AddArg(x) 6100 v.AddArg(v0) 6101 return true 6102 } 6103 // match: (MULW (MOVDconst [c]) x) 6104 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 6105 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 6106 for { 6107 v_0 := v.Args[0] 6108 if v_0.Op != OpARM64MOVDconst { 6109 break 6110 } 6111 c := v_0.AuxInt 6112 x := v.Args[1] 6113 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 6114 break 6115 } 6116 v.reset(OpARM64SLLconst) 6117 v.AuxInt = log2(c / 9) 6118 v0 := b.NewValue0(v.Line, OpARM64ADDshiftLL, x.Type) 6119 v0.AuxInt = 3 6120 v0.AddArg(x) 6121 v0.AddArg(x) 6122 v.AddArg(v0) 6123 return true 6124 } 6125 // match: (MULW (MOVDconst [c]) (MOVDconst [d])) 6126 // cond: 6127 // result: (MOVDconst [int64(int32(c)*int32(d))]) 6128 for { 6129 v_0 := v.Args[0] 6130 if v_0.Op != OpARM64MOVDconst { 6131 break 6132 } 6133 c := v_0.AuxInt 6134 v_1 := v.Args[1] 6135 if v_1.Op != OpARM64MOVDconst { 6136 break 6137 } 6138 d := v_1.AuxInt 6139 v.reset(OpARM64MOVDconst) 6140 v.AuxInt = int64(int32(c) * int32(d)) 6141 return true 6142 } 6143 return false 6144 } 6145 func rewriteValueARM64_OpARM64MVN(v *Value, config *Config) bool { 6146 b := v.Block 6147 _ = b 6148 // match: (MVN (MOVDconst [c])) 6149 // cond: 6150 // result: (MOVDconst [^c]) 6151 for { 6152 v_0 := v.Args[0] 6153 if v_0.Op != OpARM64MOVDconst { 6154 break 6155 } 6156 c := v_0.AuxInt 6157 v.reset(OpARM64MOVDconst) 6158 v.AuxInt = ^c 6159 return true 6160 } 6161 return false 6162 } 6163 func rewriteValueARM64_OpARM64NEG(v *Value, config *Config) bool { 6164 b := v.Block 6165 _ = b 6166 // match: (NEG (MOVDconst [c])) 6167 // cond: 6168 // result: (MOVDconst [-c]) 6169 for { 6170 v_0 := v.Args[0] 6171 if v_0.Op != OpARM64MOVDconst { 6172 break 6173 } 6174 c := v_0.AuxInt 6175 v.reset(OpARM64MOVDconst) 6176 v.AuxInt = -c 6177 return true 6178 } 6179 return false 6180 } 6181 func rewriteValueARM64_OpARM64NotEqual(v *Value, config *Config) bool { 6182 b := v.Block 6183 _ = b 6184 // match: (NotEqual (FlagEQ)) 6185 // cond: 6186 // result: (MOVDconst [0]) 6187 for { 6188 v_0 := v.Args[0] 6189 if v_0.Op != OpARM64FlagEQ { 6190 break 6191 } 6192 v.reset(OpARM64MOVDconst) 6193 v.AuxInt = 0 6194 return true 6195 } 6196 // match: (NotEqual (FlagLT_ULT)) 6197 // cond: 6198 // result: (MOVDconst [1]) 6199 for { 6200 v_0 := v.Args[0] 6201 if v_0.Op != OpARM64FlagLT_ULT { 6202 break 6203 } 6204 v.reset(OpARM64MOVDconst) 6205 v.AuxInt = 1 6206 return true 6207 } 6208 // match: (NotEqual (FlagLT_UGT)) 6209 // cond: 6210 // result: (MOVDconst [1]) 6211 for { 6212 v_0 := v.Args[0] 6213 if v_0.Op != OpARM64FlagLT_UGT { 6214 break 6215 } 6216 v.reset(OpARM64MOVDconst) 6217 v.AuxInt = 1 6218 return true 6219 } 6220 // match: (NotEqual (FlagGT_ULT)) 6221 // cond: 6222 // result: (MOVDconst [1]) 6223 for { 6224 v_0 := v.Args[0] 6225 if v_0.Op != OpARM64FlagGT_ULT { 6226 break 6227 } 6228 v.reset(OpARM64MOVDconst) 6229 v.AuxInt = 1 6230 return true 6231 } 6232 // match: (NotEqual (FlagGT_UGT)) 6233 // cond: 6234 // result: (MOVDconst [1]) 6235 for { 6236 v_0 := v.Args[0] 6237 if v_0.Op != OpARM64FlagGT_UGT { 6238 break 6239 } 6240 v.reset(OpARM64MOVDconst) 6241 v.AuxInt = 1 6242 return true 6243 } 6244 // match: (NotEqual (InvertFlags x)) 6245 // cond: 6246 // result: (NotEqual x) 6247 for { 6248 v_0 := v.Args[0] 6249 if v_0.Op != OpARM64InvertFlags { 6250 break 6251 } 6252 x := v_0.Args[0] 6253 v.reset(OpARM64NotEqual) 6254 v.AddArg(x) 6255 return true 6256 } 6257 return false 6258 } 6259 func rewriteValueARM64_OpARM64OR(v *Value, config *Config) bool { 6260 b := v.Block 6261 _ = b 6262 // match: (OR (MOVDconst [c]) x) 6263 // cond: 6264 // result: (ORconst [c] x) 6265 for { 6266 v_0 := v.Args[0] 6267 if v_0.Op != OpARM64MOVDconst { 6268 break 6269 } 6270 c := v_0.AuxInt 6271 x := v.Args[1] 6272 v.reset(OpARM64ORconst) 6273 v.AuxInt = c 6274 v.AddArg(x) 6275 return true 6276 } 6277 // match: (OR x (MOVDconst [c])) 6278 // cond: 6279 // result: (ORconst [c] x) 6280 for { 6281 x := v.Args[0] 6282 v_1 := v.Args[1] 6283 if v_1.Op != OpARM64MOVDconst { 6284 break 6285 } 6286 c := v_1.AuxInt 6287 v.reset(OpARM64ORconst) 6288 v.AuxInt = c 6289 v.AddArg(x) 6290 return true 6291 } 6292 // match: (OR x x) 6293 // cond: 6294 // result: x 6295 for { 6296 x := v.Args[0] 6297 if x != v.Args[1] { 6298 break 6299 } 6300 v.reset(OpCopy) 6301 v.Type = x.Type 6302 v.AddArg(x) 6303 return true 6304 } 6305 // match: (OR x s:(SLLconst [c] y)) 6306 // cond: s.Uses == 1 && clobber(s) 6307 // result: (ORshiftLL x y [c]) 6308 for { 6309 x := v.Args[0] 6310 s := v.Args[1] 6311 if s.Op != OpARM64SLLconst { 6312 break 6313 } 6314 c := s.AuxInt 6315 y := s.Args[0] 6316 if !(s.Uses == 1 && clobber(s)) { 6317 break 6318 } 6319 v.reset(OpARM64ORshiftLL) 6320 v.AuxInt = c 6321 v.AddArg(x) 6322 v.AddArg(y) 6323 return true 6324 } 6325 // match: (OR s:(SLLconst [c] y) x) 6326 // cond: s.Uses == 1 && clobber(s) 6327 // result: (ORshiftLL x y [c]) 6328 for { 6329 s := v.Args[0] 6330 if s.Op != OpARM64SLLconst { 6331 break 6332 } 6333 c := s.AuxInt 6334 y := s.Args[0] 6335 x := v.Args[1] 6336 if !(s.Uses == 1 && clobber(s)) { 6337 break 6338 } 6339 v.reset(OpARM64ORshiftLL) 6340 v.AuxInt = c 6341 v.AddArg(x) 6342 v.AddArg(y) 6343 return true 6344 } 6345 // match: (OR x (SLLconst [c] y)) 6346 // cond: 6347 // result: (ORshiftLL x y [c]) 6348 for { 6349 x := v.Args[0] 6350 v_1 := v.Args[1] 6351 if v_1.Op != OpARM64SLLconst { 6352 break 6353 } 6354 c := v_1.AuxInt 6355 y := v_1.Args[0] 6356 v.reset(OpARM64ORshiftLL) 6357 v.AuxInt = c 6358 v.AddArg(x) 6359 v.AddArg(y) 6360 return true 6361 } 6362 // match: (OR (SLLconst [c] y) x) 6363 // cond: 6364 // result: (ORshiftLL x y [c]) 6365 for { 6366 v_0 := v.Args[0] 6367 if v_0.Op != OpARM64SLLconst { 6368 break 6369 } 6370 c := v_0.AuxInt 6371 y := v_0.Args[0] 6372 x := v.Args[1] 6373 v.reset(OpARM64ORshiftLL) 6374 v.AuxInt = c 6375 v.AddArg(x) 6376 v.AddArg(y) 6377 return true 6378 } 6379 // match: (OR x (SRLconst [c] y)) 6380 // cond: 6381 // result: (ORshiftRL x y [c]) 6382 for { 6383 x := v.Args[0] 6384 v_1 := v.Args[1] 6385 if v_1.Op != OpARM64SRLconst { 6386 break 6387 } 6388 c := v_1.AuxInt 6389 y := v_1.Args[0] 6390 v.reset(OpARM64ORshiftRL) 6391 v.AuxInt = c 6392 v.AddArg(x) 6393 v.AddArg(y) 6394 return true 6395 } 6396 // match: (OR (SRLconst [c] y) x) 6397 // cond: 6398 // result: (ORshiftRL x y [c]) 6399 for { 6400 v_0 := v.Args[0] 6401 if v_0.Op != OpARM64SRLconst { 6402 break 6403 } 6404 c := v_0.AuxInt 6405 y := v_0.Args[0] 6406 x := v.Args[1] 6407 v.reset(OpARM64ORshiftRL) 6408 v.AuxInt = c 6409 v.AddArg(x) 6410 v.AddArg(y) 6411 return true 6412 } 6413 // match: (OR x (SRAconst [c] y)) 6414 // cond: 6415 // result: (ORshiftRA x y [c]) 6416 for { 6417 x := v.Args[0] 6418 v_1 := v.Args[1] 6419 if v_1.Op != OpARM64SRAconst { 6420 break 6421 } 6422 c := v_1.AuxInt 6423 y := v_1.Args[0] 6424 v.reset(OpARM64ORshiftRA) 6425 v.AuxInt = c 6426 v.AddArg(x) 6427 v.AddArg(y) 6428 return true 6429 } 6430 // match: (OR (SRAconst [c] y) x) 6431 // cond: 6432 // result: (ORshiftRA x y [c]) 6433 for { 6434 v_0 := v.Args[0] 6435 if v_0.Op != OpARM64SRAconst { 6436 break 6437 } 6438 c := v_0.AuxInt 6439 y := v_0.Args[0] 6440 x := v.Args[1] 6441 v.reset(OpARM64ORshiftRA) 6442 v.AuxInt = c 6443 v.AddArg(x) 6444 v.AddArg(y) 6445 return true 6446 } 6447 // 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))) 6448 // 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) 6449 // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [i-3] p) mem) 6450 for { 6451 t := v.Type 6452 o0 := v.Args[0] 6453 if o0.Op != OpARM64ORshiftLL { 6454 break 6455 } 6456 if o0.AuxInt != 8 { 6457 break 6458 } 6459 o1 := o0.Args[0] 6460 if o1.Op != OpARM64ORshiftLL { 6461 break 6462 } 6463 if o1.AuxInt != 16 { 6464 break 6465 } 6466 s0 := o1.Args[0] 6467 if s0.Op != OpARM64SLLconst { 6468 break 6469 } 6470 if s0.AuxInt != 24 { 6471 break 6472 } 6473 y0 := s0.Args[0] 6474 if y0.Op != OpARM64MOVDnop { 6475 break 6476 } 6477 x0 := y0.Args[0] 6478 if x0.Op != OpARM64MOVBUload { 6479 break 6480 } 6481 i := x0.AuxInt 6482 s := x0.Aux 6483 p := x0.Args[0] 6484 mem := x0.Args[1] 6485 y1 := o1.Args[1] 6486 if y1.Op != OpARM64MOVDnop { 6487 break 6488 } 6489 x1 := y1.Args[0] 6490 if x1.Op != OpARM64MOVBUload { 6491 break 6492 } 6493 if x1.AuxInt != i-1 { 6494 break 6495 } 6496 if x1.Aux != s { 6497 break 6498 } 6499 if p != x1.Args[0] { 6500 break 6501 } 6502 if mem != x1.Args[1] { 6503 break 6504 } 6505 y2 := o0.Args[1] 6506 if y2.Op != OpARM64MOVDnop { 6507 break 6508 } 6509 x2 := y2.Args[0] 6510 if x2.Op != OpARM64MOVBUload { 6511 break 6512 } 6513 if x2.AuxInt != i-2 { 6514 break 6515 } 6516 if x2.Aux != s { 6517 break 6518 } 6519 if p != x2.Args[0] { 6520 break 6521 } 6522 if mem != x2.Args[1] { 6523 break 6524 } 6525 y3 := v.Args[1] 6526 if y3.Op != OpARM64MOVDnop { 6527 break 6528 } 6529 x3 := y3.Args[0] 6530 if x3.Op != OpARM64MOVBUload { 6531 break 6532 } 6533 if x3.AuxInt != i-3 { 6534 break 6535 } 6536 if x3.Aux != s { 6537 break 6538 } 6539 if p != x3.Args[0] { 6540 break 6541 } 6542 if mem != x3.Args[1] { 6543 break 6544 } 6545 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)) { 6546 break 6547 } 6548 b = mergePoint(b, x0, x1, x2, x3) 6549 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 6550 v.reset(OpCopy) 6551 v.AddArg(v0) 6552 v0.Aux = s 6553 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6554 v1.AuxInt = i - 3 6555 v1.AddArg(p) 6556 v0.AddArg(v1) 6557 v0.AddArg(mem) 6558 return true 6559 } 6560 // 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))) 6561 // 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) 6562 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i-7] p) mem)) 6563 for { 6564 t := v.Type 6565 o0 := v.Args[0] 6566 if o0.Op != OpARM64ORshiftLL { 6567 break 6568 } 6569 if o0.AuxInt != 8 { 6570 break 6571 } 6572 o1 := o0.Args[0] 6573 if o1.Op != OpARM64ORshiftLL { 6574 break 6575 } 6576 if o1.AuxInt != 16 { 6577 break 6578 } 6579 o2 := o1.Args[0] 6580 if o2.Op != OpARM64ORshiftLL { 6581 break 6582 } 6583 if o2.AuxInt != 24 { 6584 break 6585 } 6586 o3 := o2.Args[0] 6587 if o3.Op != OpARM64ORshiftLL { 6588 break 6589 } 6590 if o3.AuxInt != 32 { 6591 break 6592 } 6593 o4 := o3.Args[0] 6594 if o4.Op != OpARM64ORshiftLL { 6595 break 6596 } 6597 if o4.AuxInt != 40 { 6598 break 6599 } 6600 o5 := o4.Args[0] 6601 if o5.Op != OpARM64ORshiftLL { 6602 break 6603 } 6604 if o5.AuxInt != 48 { 6605 break 6606 } 6607 s0 := o5.Args[0] 6608 if s0.Op != OpARM64SLLconst { 6609 break 6610 } 6611 if s0.AuxInt != 56 { 6612 break 6613 } 6614 y0 := s0.Args[0] 6615 if y0.Op != OpARM64MOVDnop { 6616 break 6617 } 6618 x0 := y0.Args[0] 6619 if x0.Op != OpARM64MOVBUload { 6620 break 6621 } 6622 i := x0.AuxInt 6623 s := x0.Aux 6624 p := x0.Args[0] 6625 mem := x0.Args[1] 6626 y1 := o5.Args[1] 6627 if y1.Op != OpARM64MOVDnop { 6628 break 6629 } 6630 x1 := y1.Args[0] 6631 if x1.Op != OpARM64MOVBUload { 6632 break 6633 } 6634 if x1.AuxInt != i-1 { 6635 break 6636 } 6637 if x1.Aux != s { 6638 break 6639 } 6640 if p != x1.Args[0] { 6641 break 6642 } 6643 if mem != x1.Args[1] { 6644 break 6645 } 6646 y2 := o4.Args[1] 6647 if y2.Op != OpARM64MOVDnop { 6648 break 6649 } 6650 x2 := y2.Args[0] 6651 if x2.Op != OpARM64MOVBUload { 6652 break 6653 } 6654 if x2.AuxInt != i-2 { 6655 break 6656 } 6657 if x2.Aux != s { 6658 break 6659 } 6660 if p != x2.Args[0] { 6661 break 6662 } 6663 if mem != x2.Args[1] { 6664 break 6665 } 6666 y3 := o3.Args[1] 6667 if y3.Op != OpARM64MOVDnop { 6668 break 6669 } 6670 x3 := y3.Args[0] 6671 if x3.Op != OpARM64MOVBUload { 6672 break 6673 } 6674 if x3.AuxInt != i-3 { 6675 break 6676 } 6677 if x3.Aux != s { 6678 break 6679 } 6680 if p != x3.Args[0] { 6681 break 6682 } 6683 if mem != x3.Args[1] { 6684 break 6685 } 6686 y4 := o2.Args[1] 6687 if y4.Op != OpARM64MOVDnop { 6688 break 6689 } 6690 x4 := y4.Args[0] 6691 if x4.Op != OpARM64MOVBUload { 6692 break 6693 } 6694 if x4.AuxInt != i-4 { 6695 break 6696 } 6697 if x4.Aux != s { 6698 break 6699 } 6700 if p != x4.Args[0] { 6701 break 6702 } 6703 if mem != x4.Args[1] { 6704 break 6705 } 6706 y5 := o1.Args[1] 6707 if y5.Op != OpARM64MOVDnop { 6708 break 6709 } 6710 x5 := y5.Args[0] 6711 if x5.Op != OpARM64MOVBUload { 6712 break 6713 } 6714 if x5.AuxInt != i-5 { 6715 break 6716 } 6717 if x5.Aux != s { 6718 break 6719 } 6720 if p != x5.Args[0] { 6721 break 6722 } 6723 if mem != x5.Args[1] { 6724 break 6725 } 6726 y6 := o0.Args[1] 6727 if y6.Op != OpARM64MOVDnop { 6728 break 6729 } 6730 x6 := y6.Args[0] 6731 if x6.Op != OpARM64MOVBUload { 6732 break 6733 } 6734 if x6.AuxInt != i-6 { 6735 break 6736 } 6737 if x6.Aux != s { 6738 break 6739 } 6740 if p != x6.Args[0] { 6741 break 6742 } 6743 if mem != x6.Args[1] { 6744 break 6745 } 6746 y7 := v.Args[1] 6747 if y7.Op != OpARM64MOVDnop { 6748 break 6749 } 6750 x7 := y7.Args[0] 6751 if x7.Op != OpARM64MOVBUload { 6752 break 6753 } 6754 if x7.AuxInt != i-7 { 6755 break 6756 } 6757 if x7.Aux != s { 6758 break 6759 } 6760 if p != x7.Args[0] { 6761 break 6762 } 6763 if mem != x7.Args[1] { 6764 break 6765 } 6766 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)) { 6767 break 6768 } 6769 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 6770 v0 := b.NewValue0(v.Line, OpARM64REV, t) 6771 v.reset(OpCopy) 6772 v.AddArg(v0) 6773 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 6774 v1.Aux = s 6775 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6776 v2.AuxInt = i - 7 6777 v2.AddArg(p) 6778 v1.AddArg(v2) 6779 v1.AddArg(mem) 6780 v0.AddArg(v1) 6781 return true 6782 } 6783 // 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))) 6784 // 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) 6785 // result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i] p) mem)) 6786 for { 6787 t := v.Type 6788 o0 := v.Args[0] 6789 if o0.Op != OpARM64ORshiftLL { 6790 break 6791 } 6792 if o0.AuxInt != 8 { 6793 break 6794 } 6795 o1 := o0.Args[0] 6796 if o1.Op != OpARM64ORshiftLL { 6797 break 6798 } 6799 if o1.AuxInt != 16 { 6800 break 6801 } 6802 s0 := o1.Args[0] 6803 if s0.Op != OpARM64SLLconst { 6804 break 6805 } 6806 if s0.AuxInt != 24 { 6807 break 6808 } 6809 y0 := s0.Args[0] 6810 if y0.Op != OpARM64MOVDnop { 6811 break 6812 } 6813 x0 := y0.Args[0] 6814 if x0.Op != OpARM64MOVBUload { 6815 break 6816 } 6817 i := x0.AuxInt 6818 s := x0.Aux 6819 p := x0.Args[0] 6820 mem := x0.Args[1] 6821 y1 := o1.Args[1] 6822 if y1.Op != OpARM64MOVDnop { 6823 break 6824 } 6825 x1 := y1.Args[0] 6826 if x1.Op != OpARM64MOVBUload { 6827 break 6828 } 6829 if x1.AuxInt != i+1 { 6830 break 6831 } 6832 if x1.Aux != s { 6833 break 6834 } 6835 if p != x1.Args[0] { 6836 break 6837 } 6838 if mem != x1.Args[1] { 6839 break 6840 } 6841 y2 := o0.Args[1] 6842 if y2.Op != OpARM64MOVDnop { 6843 break 6844 } 6845 x2 := y2.Args[0] 6846 if x2.Op != OpARM64MOVBUload { 6847 break 6848 } 6849 if x2.AuxInt != i+2 { 6850 break 6851 } 6852 if x2.Aux != s { 6853 break 6854 } 6855 if p != x2.Args[0] { 6856 break 6857 } 6858 if mem != x2.Args[1] { 6859 break 6860 } 6861 y3 := v.Args[1] 6862 if y3.Op != OpARM64MOVDnop { 6863 break 6864 } 6865 x3 := y3.Args[0] 6866 if x3.Op != OpARM64MOVBUload { 6867 break 6868 } 6869 if x3.AuxInt != i+3 { 6870 break 6871 } 6872 if x3.Aux != s { 6873 break 6874 } 6875 if p != x3.Args[0] { 6876 break 6877 } 6878 if mem != x3.Args[1] { 6879 break 6880 } 6881 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)) { 6882 break 6883 } 6884 b = mergePoint(b, x0, x1, x2, x3) 6885 v0 := b.NewValue0(v.Line, OpARM64REVW, t) 6886 v.reset(OpCopy) 6887 v.AddArg(v0) 6888 v1 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 6889 v1.Aux = s 6890 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 6891 v2.AuxInt = i 6892 v2.AddArg(p) 6893 v1.AddArg(v2) 6894 v1.AddArg(mem) 6895 v0.AddArg(v1) 6896 return true 6897 } 6898 // 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))) 6899 // 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) 6900 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i] p) mem)) 6901 for { 6902 t := v.Type 6903 o0 := v.Args[0] 6904 if o0.Op != OpARM64ORshiftLL { 6905 break 6906 } 6907 if o0.AuxInt != 8 { 6908 break 6909 } 6910 o1 := o0.Args[0] 6911 if o1.Op != OpARM64ORshiftLL { 6912 break 6913 } 6914 if o1.AuxInt != 16 { 6915 break 6916 } 6917 o2 := o1.Args[0] 6918 if o2.Op != OpARM64ORshiftLL { 6919 break 6920 } 6921 if o2.AuxInt != 24 { 6922 break 6923 } 6924 o3 := o2.Args[0] 6925 if o3.Op != OpARM64ORshiftLL { 6926 break 6927 } 6928 if o3.AuxInt != 32 { 6929 break 6930 } 6931 o4 := o3.Args[0] 6932 if o4.Op != OpARM64ORshiftLL { 6933 break 6934 } 6935 if o4.AuxInt != 40 { 6936 break 6937 } 6938 o5 := o4.Args[0] 6939 if o5.Op != OpARM64ORshiftLL { 6940 break 6941 } 6942 if o5.AuxInt != 48 { 6943 break 6944 } 6945 s0 := o5.Args[0] 6946 if s0.Op != OpARM64SLLconst { 6947 break 6948 } 6949 if s0.AuxInt != 56 { 6950 break 6951 } 6952 y0 := s0.Args[0] 6953 if y0.Op != OpARM64MOVDnop { 6954 break 6955 } 6956 x0 := y0.Args[0] 6957 if x0.Op != OpARM64MOVBUload { 6958 break 6959 } 6960 i := x0.AuxInt 6961 s := x0.Aux 6962 p := x0.Args[0] 6963 mem := x0.Args[1] 6964 y1 := o5.Args[1] 6965 if y1.Op != OpARM64MOVDnop { 6966 break 6967 } 6968 x1 := y1.Args[0] 6969 if x1.Op != OpARM64MOVBUload { 6970 break 6971 } 6972 if x1.AuxInt != i+1 { 6973 break 6974 } 6975 if x1.Aux != s { 6976 break 6977 } 6978 if p != x1.Args[0] { 6979 break 6980 } 6981 if mem != x1.Args[1] { 6982 break 6983 } 6984 y2 := o4.Args[1] 6985 if y2.Op != OpARM64MOVDnop { 6986 break 6987 } 6988 x2 := y2.Args[0] 6989 if x2.Op != OpARM64MOVBUload { 6990 break 6991 } 6992 if x2.AuxInt != i+2 { 6993 break 6994 } 6995 if x2.Aux != s { 6996 break 6997 } 6998 if p != x2.Args[0] { 6999 break 7000 } 7001 if mem != x2.Args[1] { 7002 break 7003 } 7004 y3 := o3.Args[1] 7005 if y3.Op != OpARM64MOVDnop { 7006 break 7007 } 7008 x3 := y3.Args[0] 7009 if x3.Op != OpARM64MOVBUload { 7010 break 7011 } 7012 if x3.AuxInt != i+3 { 7013 break 7014 } 7015 if x3.Aux != s { 7016 break 7017 } 7018 if p != x3.Args[0] { 7019 break 7020 } 7021 if mem != x3.Args[1] { 7022 break 7023 } 7024 y4 := o2.Args[1] 7025 if y4.Op != OpARM64MOVDnop { 7026 break 7027 } 7028 x4 := y4.Args[0] 7029 if x4.Op != OpARM64MOVBUload { 7030 break 7031 } 7032 if x4.AuxInt != i+4 { 7033 break 7034 } 7035 if x4.Aux != s { 7036 break 7037 } 7038 if p != x4.Args[0] { 7039 break 7040 } 7041 if mem != x4.Args[1] { 7042 break 7043 } 7044 y5 := o1.Args[1] 7045 if y5.Op != OpARM64MOVDnop { 7046 break 7047 } 7048 x5 := y5.Args[0] 7049 if x5.Op != OpARM64MOVBUload { 7050 break 7051 } 7052 if x5.AuxInt != i+5 { 7053 break 7054 } 7055 if x5.Aux != s { 7056 break 7057 } 7058 if p != x5.Args[0] { 7059 break 7060 } 7061 if mem != x5.Args[1] { 7062 break 7063 } 7064 y6 := o0.Args[1] 7065 if y6.Op != OpARM64MOVDnop { 7066 break 7067 } 7068 x6 := y6.Args[0] 7069 if x6.Op != OpARM64MOVBUload { 7070 break 7071 } 7072 if x6.AuxInt != i+6 { 7073 break 7074 } 7075 if x6.Aux != s { 7076 break 7077 } 7078 if p != x6.Args[0] { 7079 break 7080 } 7081 if mem != x6.Args[1] { 7082 break 7083 } 7084 y7 := v.Args[1] 7085 if y7.Op != OpARM64MOVDnop { 7086 break 7087 } 7088 x7 := y7.Args[0] 7089 if x7.Op != OpARM64MOVBUload { 7090 break 7091 } 7092 if x7.AuxInt != i+7 { 7093 break 7094 } 7095 if x7.Aux != s { 7096 break 7097 } 7098 if p != x7.Args[0] { 7099 break 7100 } 7101 if mem != x7.Args[1] { 7102 break 7103 } 7104 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)) { 7105 break 7106 } 7107 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 7108 v0 := b.NewValue0(v.Line, OpARM64REV, t) 7109 v.reset(OpCopy) 7110 v.AddArg(v0) 7111 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7112 v1.Aux = s 7113 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7114 v2.AuxInt = i 7115 v2.AddArg(p) 7116 v1.AddArg(v2) 7117 v1.AddArg(mem) 7118 v0.AddArg(v1) 7119 return true 7120 } 7121 return false 7122 } 7123 func rewriteValueARM64_OpARM64ORconst(v *Value, config *Config) bool { 7124 b := v.Block 7125 _ = b 7126 // match: (ORconst [0] x) 7127 // cond: 7128 // result: x 7129 for { 7130 if v.AuxInt != 0 { 7131 break 7132 } 7133 x := v.Args[0] 7134 v.reset(OpCopy) 7135 v.Type = x.Type 7136 v.AddArg(x) 7137 return true 7138 } 7139 // match: (ORconst [-1] _) 7140 // cond: 7141 // result: (MOVDconst [-1]) 7142 for { 7143 if v.AuxInt != -1 { 7144 break 7145 } 7146 v.reset(OpARM64MOVDconst) 7147 v.AuxInt = -1 7148 return true 7149 } 7150 // match: (ORconst [c] (MOVDconst [d])) 7151 // cond: 7152 // result: (MOVDconst [c|d]) 7153 for { 7154 c := v.AuxInt 7155 v_0 := v.Args[0] 7156 if v_0.Op != OpARM64MOVDconst { 7157 break 7158 } 7159 d := v_0.AuxInt 7160 v.reset(OpARM64MOVDconst) 7161 v.AuxInt = c | d 7162 return true 7163 } 7164 // match: (ORconst [c] (ORconst [d] x)) 7165 // cond: 7166 // result: (ORconst [c|d] x) 7167 for { 7168 c := v.AuxInt 7169 v_0 := v.Args[0] 7170 if v_0.Op != OpARM64ORconst { 7171 break 7172 } 7173 d := v_0.AuxInt 7174 x := v_0.Args[0] 7175 v.reset(OpARM64ORconst) 7176 v.AuxInt = c | d 7177 v.AddArg(x) 7178 return true 7179 } 7180 return false 7181 } 7182 func rewriteValueARM64_OpARM64ORshiftLL(v *Value, config *Config) bool { 7183 b := v.Block 7184 _ = b 7185 // match: (ORshiftLL (MOVDconst [c]) x [d]) 7186 // cond: 7187 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 7188 for { 7189 d := v.AuxInt 7190 v_0 := v.Args[0] 7191 if v_0.Op != OpARM64MOVDconst { 7192 break 7193 } 7194 c := v_0.AuxInt 7195 x := v.Args[1] 7196 v.reset(OpARM64ORconst) 7197 v.AuxInt = c 7198 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 7199 v0.AuxInt = d 7200 v0.AddArg(x) 7201 v.AddArg(v0) 7202 return true 7203 } 7204 // match: (ORshiftLL x (MOVDconst [c]) [d]) 7205 // cond: 7206 // result: (ORconst x [int64(uint64(c)<<uint64(d))]) 7207 for { 7208 d := v.AuxInt 7209 x := v.Args[0] 7210 v_1 := v.Args[1] 7211 if v_1.Op != OpARM64MOVDconst { 7212 break 7213 } 7214 c := v_1.AuxInt 7215 v.reset(OpARM64ORconst) 7216 v.AuxInt = int64(uint64(c) << uint64(d)) 7217 v.AddArg(x) 7218 return true 7219 } 7220 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 7221 // cond: c==d 7222 // result: y 7223 for { 7224 d := v.AuxInt 7225 x := v.Args[0] 7226 y := v.Args[1] 7227 if y.Op != OpARM64SLLconst { 7228 break 7229 } 7230 c := y.AuxInt 7231 if x != y.Args[0] { 7232 break 7233 } 7234 if !(c == d) { 7235 break 7236 } 7237 v.reset(OpCopy) 7238 v.Type = y.Type 7239 v.AddArg(y) 7240 return true 7241 } 7242 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i+1] {s} p mem))) 7243 // 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) 7244 // result: @mergePoint(b,x0,x1) (MOVHUload <t> {s} (OffPtr <p.Type> [i] p) mem) 7245 for { 7246 t := v.Type 7247 if v.AuxInt != 8 { 7248 break 7249 } 7250 y0 := v.Args[0] 7251 if y0.Op != OpARM64MOVDnop { 7252 break 7253 } 7254 x0 := y0.Args[0] 7255 if x0.Op != OpARM64MOVBUload { 7256 break 7257 } 7258 i := x0.AuxInt 7259 s := x0.Aux 7260 p := x0.Args[0] 7261 mem := x0.Args[1] 7262 y1 := v.Args[1] 7263 if y1.Op != OpARM64MOVDnop { 7264 break 7265 } 7266 x1 := y1.Args[0] 7267 if x1.Op != OpARM64MOVBUload { 7268 break 7269 } 7270 if x1.AuxInt != i+1 { 7271 break 7272 } 7273 if x1.Aux != s { 7274 break 7275 } 7276 if p != x1.Args[0] { 7277 break 7278 } 7279 if mem != x1.Args[1] { 7280 break 7281 } 7282 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)) { 7283 break 7284 } 7285 b = mergePoint(b, x0, x1) 7286 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, t) 7287 v.reset(OpCopy) 7288 v.AddArg(v0) 7289 v0.Aux = s 7290 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7291 v1.AuxInt = i 7292 v1.AddArg(p) 7293 v0.AddArg(v1) 7294 v0.AddArg(mem) 7295 return true 7296 } 7297 // 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))) 7298 // 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) 7299 // result: @mergePoint(b,x0,x1,x2) (MOVWUload <t> {s} (OffPtr <p.Type> [i] p) mem) 7300 for { 7301 t := v.Type 7302 if v.AuxInt != 24 { 7303 break 7304 } 7305 o0 := v.Args[0] 7306 if o0.Op != OpARM64ORshiftLL { 7307 break 7308 } 7309 if o0.AuxInt != 16 { 7310 break 7311 } 7312 x0 := o0.Args[0] 7313 if x0.Op != OpARM64MOVHUload { 7314 break 7315 } 7316 i := x0.AuxInt 7317 s := x0.Aux 7318 p := x0.Args[0] 7319 mem := x0.Args[1] 7320 y1 := o0.Args[1] 7321 if y1.Op != OpARM64MOVDnop { 7322 break 7323 } 7324 x1 := y1.Args[0] 7325 if x1.Op != OpARM64MOVBUload { 7326 break 7327 } 7328 if x1.AuxInt != i+2 { 7329 break 7330 } 7331 if x1.Aux != s { 7332 break 7333 } 7334 if p != x1.Args[0] { 7335 break 7336 } 7337 if mem != x1.Args[1] { 7338 break 7339 } 7340 y2 := v.Args[1] 7341 if y2.Op != OpARM64MOVDnop { 7342 break 7343 } 7344 x2 := y2.Args[0] 7345 if x2.Op != OpARM64MOVBUload { 7346 break 7347 } 7348 if x2.AuxInt != i+3 { 7349 break 7350 } 7351 if x2.Aux != s { 7352 break 7353 } 7354 if p != x2.Args[0] { 7355 break 7356 } 7357 if mem != x2.Args[1] { 7358 break 7359 } 7360 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)) { 7361 break 7362 } 7363 b = mergePoint(b, x0, x1, x2) 7364 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 7365 v.reset(OpCopy) 7366 v.AddArg(v0) 7367 v0.Aux = s 7368 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7369 v1.AuxInt = i 7370 v1.AddArg(p) 7371 v0.AddArg(v1) 7372 v0.AddArg(mem) 7373 return true 7374 } 7375 // 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))) 7376 // 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) 7377 // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload <t> {s} (OffPtr <p.Type> [i] p) mem) 7378 for { 7379 t := v.Type 7380 if v.AuxInt != 56 { 7381 break 7382 } 7383 o0 := v.Args[0] 7384 if o0.Op != OpARM64ORshiftLL { 7385 break 7386 } 7387 if o0.AuxInt != 48 { 7388 break 7389 } 7390 o1 := o0.Args[0] 7391 if o1.Op != OpARM64ORshiftLL { 7392 break 7393 } 7394 if o1.AuxInt != 40 { 7395 break 7396 } 7397 o2 := o1.Args[0] 7398 if o2.Op != OpARM64ORshiftLL { 7399 break 7400 } 7401 if o2.AuxInt != 32 { 7402 break 7403 } 7404 x0 := o2.Args[0] 7405 if x0.Op != OpARM64MOVWUload { 7406 break 7407 } 7408 i := x0.AuxInt 7409 s := x0.Aux 7410 p := x0.Args[0] 7411 mem := x0.Args[1] 7412 y1 := o2.Args[1] 7413 if y1.Op != OpARM64MOVDnop { 7414 break 7415 } 7416 x1 := y1.Args[0] 7417 if x1.Op != OpARM64MOVBUload { 7418 break 7419 } 7420 if x1.AuxInt != i+4 { 7421 break 7422 } 7423 if x1.Aux != s { 7424 break 7425 } 7426 if p != x1.Args[0] { 7427 break 7428 } 7429 if mem != x1.Args[1] { 7430 break 7431 } 7432 y2 := o1.Args[1] 7433 if y2.Op != OpARM64MOVDnop { 7434 break 7435 } 7436 x2 := y2.Args[0] 7437 if x2.Op != OpARM64MOVBUload { 7438 break 7439 } 7440 if x2.AuxInt != i+5 { 7441 break 7442 } 7443 if x2.Aux != s { 7444 break 7445 } 7446 if p != x2.Args[0] { 7447 break 7448 } 7449 if mem != x2.Args[1] { 7450 break 7451 } 7452 y3 := o0.Args[1] 7453 if y3.Op != OpARM64MOVDnop { 7454 break 7455 } 7456 x3 := y3.Args[0] 7457 if x3.Op != OpARM64MOVBUload { 7458 break 7459 } 7460 if x3.AuxInt != i+6 { 7461 break 7462 } 7463 if x3.Aux != s { 7464 break 7465 } 7466 if p != x3.Args[0] { 7467 break 7468 } 7469 if mem != x3.Args[1] { 7470 break 7471 } 7472 y4 := v.Args[1] 7473 if y4.Op != OpARM64MOVDnop { 7474 break 7475 } 7476 x4 := y4.Args[0] 7477 if x4.Op != OpARM64MOVBUload { 7478 break 7479 } 7480 if x4.AuxInt != i+7 { 7481 break 7482 } 7483 if x4.Aux != s { 7484 break 7485 } 7486 if p != x4.Args[0] { 7487 break 7488 } 7489 if mem != x4.Args[1] { 7490 break 7491 } 7492 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)) { 7493 break 7494 } 7495 b = mergePoint(b, x0, x1, x2, x3, x4) 7496 v0 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7497 v.reset(OpCopy) 7498 v.AddArg(v0) 7499 v0.Aux = s 7500 v1 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7501 v1.AuxInt = i 7502 v1.AddArg(p) 7503 v0.AddArg(v1) 7504 v0.AddArg(mem) 7505 return true 7506 } 7507 // match: (ORshiftLL <t> [8] y0:(MOVDnop x0:(MOVBUload [i] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i-1] {s} p mem))) 7508 // 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) 7509 // result: @mergePoint(b,x0,x1) (REV16W <t> (MOVHUload <t> [i-1] {s} p mem)) 7510 for { 7511 t := v.Type 7512 if v.AuxInt != 8 { 7513 break 7514 } 7515 y0 := v.Args[0] 7516 if y0.Op != OpARM64MOVDnop { 7517 break 7518 } 7519 x0 := y0.Args[0] 7520 if x0.Op != OpARM64MOVBUload { 7521 break 7522 } 7523 i := x0.AuxInt 7524 s := x0.Aux 7525 p := x0.Args[0] 7526 mem := x0.Args[1] 7527 y1 := v.Args[1] 7528 if y1.Op != OpARM64MOVDnop { 7529 break 7530 } 7531 x1 := y1.Args[0] 7532 if x1.Op != OpARM64MOVBUload { 7533 break 7534 } 7535 if x1.AuxInt != i-1 { 7536 break 7537 } 7538 if x1.Aux != s { 7539 break 7540 } 7541 if p != x1.Args[0] { 7542 break 7543 } 7544 if mem != x1.Args[1] { 7545 break 7546 } 7547 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)) { 7548 break 7549 } 7550 b = mergePoint(b, x0, x1) 7551 v0 := b.NewValue0(v.Line, OpARM64REV16W, t) 7552 v.reset(OpCopy) 7553 v.AddArg(v0) 7554 v1 := b.NewValue0(v.Line, OpARM64MOVHUload, t) 7555 v1.AuxInt = i - 1 7556 v1.Aux = s 7557 v1.AddArg(p) 7558 v1.AddArg(mem) 7559 v0.AddArg(v1) 7560 return true 7561 } 7562 // 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))) 7563 // 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) 7564 // result: @mergePoint(b,x0,x1,x2) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [i-2] p) mem)) 7565 for { 7566 t := v.Type 7567 if v.AuxInt != 24 { 7568 break 7569 } 7570 o0 := v.Args[0] 7571 if o0.Op != OpARM64ORshiftLL { 7572 break 7573 } 7574 if o0.AuxInt != 16 { 7575 break 7576 } 7577 y0 := o0.Args[0] 7578 if y0.Op != OpARM64REV16W { 7579 break 7580 } 7581 x0 := y0.Args[0] 7582 if x0.Op != OpARM64MOVHUload { 7583 break 7584 } 7585 i := x0.AuxInt 7586 s := x0.Aux 7587 p := x0.Args[0] 7588 mem := x0.Args[1] 7589 y1 := o0.Args[1] 7590 if y1.Op != OpARM64MOVDnop { 7591 break 7592 } 7593 x1 := y1.Args[0] 7594 if x1.Op != OpARM64MOVBUload { 7595 break 7596 } 7597 if x1.AuxInt != i-1 { 7598 break 7599 } 7600 if x1.Aux != s { 7601 break 7602 } 7603 if p != x1.Args[0] { 7604 break 7605 } 7606 if mem != x1.Args[1] { 7607 break 7608 } 7609 y2 := v.Args[1] 7610 if y2.Op != OpARM64MOVDnop { 7611 break 7612 } 7613 x2 := y2.Args[0] 7614 if x2.Op != OpARM64MOVBUload { 7615 break 7616 } 7617 if x2.AuxInt != i-2 { 7618 break 7619 } 7620 if x2.Aux != s { 7621 break 7622 } 7623 if p != x2.Args[0] { 7624 break 7625 } 7626 if mem != x2.Args[1] { 7627 break 7628 } 7629 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)) { 7630 break 7631 } 7632 b = mergePoint(b, x0, x1, x2) 7633 v0 := b.NewValue0(v.Line, OpARM64REVW, t) 7634 v.reset(OpCopy) 7635 v.AddArg(v0) 7636 v1 := b.NewValue0(v.Line, OpARM64MOVWUload, t) 7637 v1.Aux = s 7638 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7639 v2.AuxInt = i - 2 7640 v2.AddArg(p) 7641 v1.AddArg(v2) 7642 v1.AddArg(mem) 7643 v0.AddArg(v1) 7644 return true 7645 } 7646 // 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))) 7647 // 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) 7648 // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [i-4] p) mem)) 7649 for { 7650 t := v.Type 7651 if v.AuxInt != 56 { 7652 break 7653 } 7654 o0 := v.Args[0] 7655 if o0.Op != OpARM64ORshiftLL { 7656 break 7657 } 7658 if o0.AuxInt != 48 { 7659 break 7660 } 7661 o1 := o0.Args[0] 7662 if o1.Op != OpARM64ORshiftLL { 7663 break 7664 } 7665 if o1.AuxInt != 40 { 7666 break 7667 } 7668 o2 := o1.Args[0] 7669 if o2.Op != OpARM64ORshiftLL { 7670 break 7671 } 7672 if o2.AuxInt != 32 { 7673 break 7674 } 7675 y0 := o2.Args[0] 7676 if y0.Op != OpARM64REVW { 7677 break 7678 } 7679 x0 := y0.Args[0] 7680 if x0.Op != OpARM64MOVWUload { 7681 break 7682 } 7683 i := x0.AuxInt 7684 s := x0.Aux 7685 p := x0.Args[0] 7686 mem := x0.Args[1] 7687 y1 := o2.Args[1] 7688 if y1.Op != OpARM64MOVDnop { 7689 break 7690 } 7691 x1 := y1.Args[0] 7692 if x1.Op != OpARM64MOVBUload { 7693 break 7694 } 7695 if x1.AuxInt != i-1 { 7696 break 7697 } 7698 if x1.Aux != s { 7699 break 7700 } 7701 if p != x1.Args[0] { 7702 break 7703 } 7704 if mem != x1.Args[1] { 7705 break 7706 } 7707 y2 := o1.Args[1] 7708 if y2.Op != OpARM64MOVDnop { 7709 break 7710 } 7711 x2 := y2.Args[0] 7712 if x2.Op != OpARM64MOVBUload { 7713 break 7714 } 7715 if x2.AuxInt != i-2 { 7716 break 7717 } 7718 if x2.Aux != s { 7719 break 7720 } 7721 if p != x2.Args[0] { 7722 break 7723 } 7724 if mem != x2.Args[1] { 7725 break 7726 } 7727 y3 := o0.Args[1] 7728 if y3.Op != OpARM64MOVDnop { 7729 break 7730 } 7731 x3 := y3.Args[0] 7732 if x3.Op != OpARM64MOVBUload { 7733 break 7734 } 7735 if x3.AuxInt != i-3 { 7736 break 7737 } 7738 if x3.Aux != s { 7739 break 7740 } 7741 if p != x3.Args[0] { 7742 break 7743 } 7744 if mem != x3.Args[1] { 7745 break 7746 } 7747 y4 := v.Args[1] 7748 if y4.Op != OpARM64MOVDnop { 7749 break 7750 } 7751 x4 := y4.Args[0] 7752 if x4.Op != OpARM64MOVBUload { 7753 break 7754 } 7755 if x4.AuxInt != i-4 { 7756 break 7757 } 7758 if x4.Aux != s { 7759 break 7760 } 7761 if p != x4.Args[0] { 7762 break 7763 } 7764 if mem != x4.Args[1] { 7765 break 7766 } 7767 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)) { 7768 break 7769 } 7770 b = mergePoint(b, x0, x1, x2, x3, x4) 7771 v0 := b.NewValue0(v.Line, OpARM64REV, t) 7772 v.reset(OpCopy) 7773 v.AddArg(v0) 7774 v1 := b.NewValue0(v.Line, OpARM64MOVDload, t) 7775 v1.Aux = s 7776 v2 := b.NewValue0(v.Line, OpOffPtr, p.Type) 7777 v2.AuxInt = i - 4 7778 v2.AddArg(p) 7779 v1.AddArg(v2) 7780 v1.AddArg(mem) 7781 v0.AddArg(v1) 7782 return true 7783 } 7784 return false 7785 } 7786 func rewriteValueARM64_OpARM64ORshiftRA(v *Value, config *Config) bool { 7787 b := v.Block 7788 _ = b 7789 // match: (ORshiftRA (MOVDconst [c]) x [d]) 7790 // cond: 7791 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 7792 for { 7793 d := v.AuxInt 7794 v_0 := v.Args[0] 7795 if v_0.Op != OpARM64MOVDconst { 7796 break 7797 } 7798 c := v_0.AuxInt 7799 x := v.Args[1] 7800 v.reset(OpARM64ORconst) 7801 v.AuxInt = c 7802 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 7803 v0.AuxInt = d 7804 v0.AddArg(x) 7805 v.AddArg(v0) 7806 return true 7807 } 7808 // match: (ORshiftRA x (MOVDconst [c]) [d]) 7809 // cond: 7810 // result: (ORconst x [int64(int64(c)>>uint64(d))]) 7811 for { 7812 d := v.AuxInt 7813 x := v.Args[0] 7814 v_1 := v.Args[1] 7815 if v_1.Op != OpARM64MOVDconst { 7816 break 7817 } 7818 c := v_1.AuxInt 7819 v.reset(OpARM64ORconst) 7820 v.AuxInt = int64(int64(c) >> uint64(d)) 7821 v.AddArg(x) 7822 return true 7823 } 7824 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 7825 // cond: c==d 7826 // result: y 7827 for { 7828 d := v.AuxInt 7829 x := v.Args[0] 7830 y := v.Args[1] 7831 if y.Op != OpARM64SRAconst { 7832 break 7833 } 7834 c := y.AuxInt 7835 if x != y.Args[0] { 7836 break 7837 } 7838 if !(c == d) { 7839 break 7840 } 7841 v.reset(OpCopy) 7842 v.Type = y.Type 7843 v.AddArg(y) 7844 return true 7845 } 7846 return false 7847 } 7848 func rewriteValueARM64_OpARM64ORshiftRL(v *Value, config *Config) bool { 7849 b := v.Block 7850 _ = b 7851 // match: (ORshiftRL (MOVDconst [c]) x [d]) 7852 // cond: 7853 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 7854 for { 7855 d := v.AuxInt 7856 v_0 := v.Args[0] 7857 if v_0.Op != OpARM64MOVDconst { 7858 break 7859 } 7860 c := v_0.AuxInt 7861 x := v.Args[1] 7862 v.reset(OpARM64ORconst) 7863 v.AuxInt = c 7864 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 7865 v0.AuxInt = d 7866 v0.AddArg(x) 7867 v.AddArg(v0) 7868 return true 7869 } 7870 // match: (ORshiftRL x (MOVDconst [c]) [d]) 7871 // cond: 7872 // result: (ORconst x [int64(uint64(c)>>uint64(d))]) 7873 for { 7874 d := v.AuxInt 7875 x := v.Args[0] 7876 v_1 := v.Args[1] 7877 if v_1.Op != OpARM64MOVDconst { 7878 break 7879 } 7880 c := v_1.AuxInt 7881 v.reset(OpARM64ORconst) 7882 v.AuxInt = int64(uint64(c) >> uint64(d)) 7883 v.AddArg(x) 7884 return true 7885 } 7886 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 7887 // cond: c==d 7888 // result: y 7889 for { 7890 d := v.AuxInt 7891 x := v.Args[0] 7892 y := v.Args[1] 7893 if y.Op != OpARM64SRLconst { 7894 break 7895 } 7896 c := y.AuxInt 7897 if x != y.Args[0] { 7898 break 7899 } 7900 if !(c == d) { 7901 break 7902 } 7903 v.reset(OpCopy) 7904 v.Type = y.Type 7905 v.AddArg(y) 7906 return true 7907 } 7908 return false 7909 } 7910 func rewriteValueARM64_OpARM64SLL(v *Value, config *Config) bool { 7911 b := v.Block 7912 _ = b 7913 // match: (SLL x (MOVDconst [c])) 7914 // cond: 7915 // result: (SLLconst x [c&63]) 7916 for { 7917 x := v.Args[0] 7918 v_1 := v.Args[1] 7919 if v_1.Op != OpARM64MOVDconst { 7920 break 7921 } 7922 c := v_1.AuxInt 7923 v.reset(OpARM64SLLconst) 7924 v.AuxInt = c & 63 7925 v.AddArg(x) 7926 return true 7927 } 7928 return false 7929 } 7930 func rewriteValueARM64_OpARM64SLLconst(v *Value, config *Config) bool { 7931 b := v.Block 7932 _ = b 7933 // match: (SLLconst [c] (MOVDconst [d])) 7934 // cond: 7935 // result: (MOVDconst [int64(d)<<uint64(c)]) 7936 for { 7937 c := v.AuxInt 7938 v_0 := v.Args[0] 7939 if v_0.Op != OpARM64MOVDconst { 7940 break 7941 } 7942 d := v_0.AuxInt 7943 v.reset(OpARM64MOVDconst) 7944 v.AuxInt = int64(d) << uint64(c) 7945 return true 7946 } 7947 return false 7948 } 7949 func rewriteValueARM64_OpARM64SRA(v *Value, config *Config) bool { 7950 b := v.Block 7951 _ = b 7952 // match: (SRA x (MOVDconst [c])) 7953 // cond: 7954 // result: (SRAconst x [c&63]) 7955 for { 7956 x := v.Args[0] 7957 v_1 := v.Args[1] 7958 if v_1.Op != OpARM64MOVDconst { 7959 break 7960 } 7961 c := v_1.AuxInt 7962 v.reset(OpARM64SRAconst) 7963 v.AuxInt = c & 63 7964 v.AddArg(x) 7965 return true 7966 } 7967 return false 7968 } 7969 func rewriteValueARM64_OpARM64SRAconst(v *Value, config *Config) bool { 7970 b := v.Block 7971 _ = b 7972 // match: (SRAconst [c] (MOVDconst [d])) 7973 // cond: 7974 // result: (MOVDconst [int64(d)>>uint64(c)]) 7975 for { 7976 c := v.AuxInt 7977 v_0 := v.Args[0] 7978 if v_0.Op != OpARM64MOVDconst { 7979 break 7980 } 7981 d := v_0.AuxInt 7982 v.reset(OpARM64MOVDconst) 7983 v.AuxInt = int64(d) >> uint64(c) 7984 return true 7985 } 7986 return false 7987 } 7988 func rewriteValueARM64_OpARM64SRL(v *Value, config *Config) bool { 7989 b := v.Block 7990 _ = b 7991 // match: (SRL x (MOVDconst [c])) 7992 // cond: 7993 // result: (SRLconst x [c&63]) 7994 for { 7995 x := v.Args[0] 7996 v_1 := v.Args[1] 7997 if v_1.Op != OpARM64MOVDconst { 7998 break 7999 } 8000 c := v_1.AuxInt 8001 v.reset(OpARM64SRLconst) 8002 v.AuxInt = c & 63 8003 v.AddArg(x) 8004 return true 8005 } 8006 return false 8007 } 8008 func rewriteValueARM64_OpARM64SRLconst(v *Value, config *Config) bool { 8009 b := v.Block 8010 _ = b 8011 // match: (SRLconst [c] (MOVDconst [d])) 8012 // cond: 8013 // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) 8014 for { 8015 c := v.AuxInt 8016 v_0 := v.Args[0] 8017 if v_0.Op != OpARM64MOVDconst { 8018 break 8019 } 8020 d := v_0.AuxInt 8021 v.reset(OpARM64MOVDconst) 8022 v.AuxInt = int64(uint64(d) >> uint64(c)) 8023 return true 8024 } 8025 return false 8026 } 8027 func rewriteValueARM64_OpARM64SUB(v *Value, config *Config) bool { 8028 b := v.Block 8029 _ = b 8030 // match: (SUB x (MOVDconst [c])) 8031 // cond: 8032 // result: (SUBconst [c] x) 8033 for { 8034 x := v.Args[0] 8035 v_1 := v.Args[1] 8036 if v_1.Op != OpARM64MOVDconst { 8037 break 8038 } 8039 c := v_1.AuxInt 8040 v.reset(OpARM64SUBconst) 8041 v.AuxInt = c 8042 v.AddArg(x) 8043 return true 8044 } 8045 // match: (SUB x x) 8046 // cond: 8047 // result: (MOVDconst [0]) 8048 for { 8049 x := v.Args[0] 8050 if x != v.Args[1] { 8051 break 8052 } 8053 v.reset(OpARM64MOVDconst) 8054 v.AuxInt = 0 8055 return true 8056 } 8057 // match: (SUB x (SLLconst [c] y)) 8058 // cond: 8059 // result: (SUBshiftLL x y [c]) 8060 for { 8061 x := v.Args[0] 8062 v_1 := v.Args[1] 8063 if v_1.Op != OpARM64SLLconst { 8064 break 8065 } 8066 c := v_1.AuxInt 8067 y := v_1.Args[0] 8068 v.reset(OpARM64SUBshiftLL) 8069 v.AuxInt = c 8070 v.AddArg(x) 8071 v.AddArg(y) 8072 return true 8073 } 8074 // match: (SUB x (SRLconst [c] y)) 8075 // cond: 8076 // result: (SUBshiftRL x y [c]) 8077 for { 8078 x := v.Args[0] 8079 v_1 := v.Args[1] 8080 if v_1.Op != OpARM64SRLconst { 8081 break 8082 } 8083 c := v_1.AuxInt 8084 y := v_1.Args[0] 8085 v.reset(OpARM64SUBshiftRL) 8086 v.AuxInt = c 8087 v.AddArg(x) 8088 v.AddArg(y) 8089 return true 8090 } 8091 // match: (SUB x (SRAconst [c] y)) 8092 // cond: 8093 // result: (SUBshiftRA x y [c]) 8094 for { 8095 x := v.Args[0] 8096 v_1 := v.Args[1] 8097 if v_1.Op != OpARM64SRAconst { 8098 break 8099 } 8100 c := v_1.AuxInt 8101 y := v_1.Args[0] 8102 v.reset(OpARM64SUBshiftRA) 8103 v.AuxInt = c 8104 v.AddArg(x) 8105 v.AddArg(y) 8106 return true 8107 } 8108 return false 8109 } 8110 func rewriteValueARM64_OpARM64SUBconst(v *Value, config *Config) bool { 8111 b := v.Block 8112 _ = b 8113 // match: (SUBconst [0] x) 8114 // cond: 8115 // result: x 8116 for { 8117 if v.AuxInt != 0 { 8118 break 8119 } 8120 x := v.Args[0] 8121 v.reset(OpCopy) 8122 v.Type = x.Type 8123 v.AddArg(x) 8124 return true 8125 } 8126 // match: (SUBconst [c] (MOVDconst [d])) 8127 // cond: 8128 // result: (MOVDconst [d-c]) 8129 for { 8130 c := v.AuxInt 8131 v_0 := v.Args[0] 8132 if v_0.Op != OpARM64MOVDconst { 8133 break 8134 } 8135 d := v_0.AuxInt 8136 v.reset(OpARM64MOVDconst) 8137 v.AuxInt = d - c 8138 return true 8139 } 8140 // match: (SUBconst [c] (SUBconst [d] x)) 8141 // cond: 8142 // result: (ADDconst [-c-d] x) 8143 for { 8144 c := v.AuxInt 8145 v_0 := v.Args[0] 8146 if v_0.Op != OpARM64SUBconst { 8147 break 8148 } 8149 d := v_0.AuxInt 8150 x := v_0.Args[0] 8151 v.reset(OpARM64ADDconst) 8152 v.AuxInt = -c - d 8153 v.AddArg(x) 8154 return true 8155 } 8156 // match: (SUBconst [c] (ADDconst [d] x)) 8157 // cond: 8158 // result: (ADDconst [-c+d] x) 8159 for { 8160 c := v.AuxInt 8161 v_0 := v.Args[0] 8162 if v_0.Op != OpARM64ADDconst { 8163 break 8164 } 8165 d := v_0.AuxInt 8166 x := v_0.Args[0] 8167 v.reset(OpARM64ADDconst) 8168 v.AuxInt = -c + d 8169 v.AddArg(x) 8170 return true 8171 } 8172 return false 8173 } 8174 func rewriteValueARM64_OpARM64SUBshiftLL(v *Value, config *Config) bool { 8175 b := v.Block 8176 _ = b 8177 // match: (SUBshiftLL x (MOVDconst [c]) [d]) 8178 // cond: 8179 // result: (SUBconst x [int64(uint64(c)<<uint64(d))]) 8180 for { 8181 d := v.AuxInt 8182 x := v.Args[0] 8183 v_1 := v.Args[1] 8184 if v_1.Op != OpARM64MOVDconst { 8185 break 8186 } 8187 c := v_1.AuxInt 8188 v.reset(OpARM64SUBconst) 8189 v.AuxInt = int64(uint64(c) << uint64(d)) 8190 v.AddArg(x) 8191 return true 8192 } 8193 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 8194 // cond: c==d 8195 // result: (MOVDconst [0]) 8196 for { 8197 d := v.AuxInt 8198 x := v.Args[0] 8199 v_1 := v.Args[1] 8200 if v_1.Op != OpARM64SLLconst { 8201 break 8202 } 8203 c := v_1.AuxInt 8204 if x != v_1.Args[0] { 8205 break 8206 } 8207 if !(c == d) { 8208 break 8209 } 8210 v.reset(OpARM64MOVDconst) 8211 v.AuxInt = 0 8212 return true 8213 } 8214 return false 8215 } 8216 func rewriteValueARM64_OpARM64SUBshiftRA(v *Value, config *Config) bool { 8217 b := v.Block 8218 _ = b 8219 // match: (SUBshiftRA x (MOVDconst [c]) [d]) 8220 // cond: 8221 // result: (SUBconst x [int64(int64(c)>>uint64(d))]) 8222 for { 8223 d := v.AuxInt 8224 x := v.Args[0] 8225 v_1 := v.Args[1] 8226 if v_1.Op != OpARM64MOVDconst { 8227 break 8228 } 8229 c := v_1.AuxInt 8230 v.reset(OpARM64SUBconst) 8231 v.AuxInt = int64(int64(c) >> uint64(d)) 8232 v.AddArg(x) 8233 return true 8234 } 8235 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 8236 // cond: c==d 8237 // result: (MOVDconst [0]) 8238 for { 8239 d := v.AuxInt 8240 x := v.Args[0] 8241 v_1 := v.Args[1] 8242 if v_1.Op != OpARM64SRAconst { 8243 break 8244 } 8245 c := v_1.AuxInt 8246 if x != v_1.Args[0] { 8247 break 8248 } 8249 if !(c == d) { 8250 break 8251 } 8252 v.reset(OpARM64MOVDconst) 8253 v.AuxInt = 0 8254 return true 8255 } 8256 return false 8257 } 8258 func rewriteValueARM64_OpARM64SUBshiftRL(v *Value, config *Config) bool { 8259 b := v.Block 8260 _ = b 8261 // match: (SUBshiftRL x (MOVDconst [c]) [d]) 8262 // cond: 8263 // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) 8264 for { 8265 d := v.AuxInt 8266 x := v.Args[0] 8267 v_1 := v.Args[1] 8268 if v_1.Op != OpARM64MOVDconst { 8269 break 8270 } 8271 c := v_1.AuxInt 8272 v.reset(OpARM64SUBconst) 8273 v.AuxInt = int64(uint64(c) >> uint64(d)) 8274 v.AddArg(x) 8275 return true 8276 } 8277 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 8278 // cond: c==d 8279 // result: (MOVDconst [0]) 8280 for { 8281 d := v.AuxInt 8282 x := v.Args[0] 8283 v_1 := v.Args[1] 8284 if v_1.Op != OpARM64SRLconst { 8285 break 8286 } 8287 c := v_1.AuxInt 8288 if x != v_1.Args[0] { 8289 break 8290 } 8291 if !(c == d) { 8292 break 8293 } 8294 v.reset(OpARM64MOVDconst) 8295 v.AuxInt = 0 8296 return true 8297 } 8298 return false 8299 } 8300 func rewriteValueARM64_OpARM64UDIV(v *Value, config *Config) bool { 8301 b := v.Block 8302 _ = b 8303 // match: (UDIV x (MOVDconst [1])) 8304 // cond: 8305 // result: x 8306 for { 8307 x := v.Args[0] 8308 v_1 := v.Args[1] 8309 if v_1.Op != OpARM64MOVDconst { 8310 break 8311 } 8312 if v_1.AuxInt != 1 { 8313 break 8314 } 8315 v.reset(OpCopy) 8316 v.Type = x.Type 8317 v.AddArg(x) 8318 return true 8319 } 8320 // match: (UDIV x (MOVDconst [c])) 8321 // cond: isPowerOfTwo(c) 8322 // result: (SRLconst [log2(c)] x) 8323 for { 8324 x := v.Args[0] 8325 v_1 := v.Args[1] 8326 if v_1.Op != OpARM64MOVDconst { 8327 break 8328 } 8329 c := v_1.AuxInt 8330 if !(isPowerOfTwo(c)) { 8331 break 8332 } 8333 v.reset(OpARM64SRLconst) 8334 v.AuxInt = log2(c) 8335 v.AddArg(x) 8336 return true 8337 } 8338 // match: (UDIV (MOVDconst [c]) (MOVDconst [d])) 8339 // cond: 8340 // result: (MOVDconst [int64(uint64(c)/uint64(d))]) 8341 for { 8342 v_0 := v.Args[0] 8343 if v_0.Op != OpARM64MOVDconst { 8344 break 8345 } 8346 c := v_0.AuxInt 8347 v_1 := v.Args[1] 8348 if v_1.Op != OpARM64MOVDconst { 8349 break 8350 } 8351 d := v_1.AuxInt 8352 v.reset(OpARM64MOVDconst) 8353 v.AuxInt = int64(uint64(c) / uint64(d)) 8354 return true 8355 } 8356 return false 8357 } 8358 func rewriteValueARM64_OpARM64UDIVW(v *Value, config *Config) bool { 8359 b := v.Block 8360 _ = b 8361 // match: (UDIVW x (MOVDconst [c])) 8362 // cond: uint32(c)==1 8363 // result: x 8364 for { 8365 x := v.Args[0] 8366 v_1 := v.Args[1] 8367 if v_1.Op != OpARM64MOVDconst { 8368 break 8369 } 8370 c := v_1.AuxInt 8371 if !(uint32(c) == 1) { 8372 break 8373 } 8374 v.reset(OpCopy) 8375 v.Type = x.Type 8376 v.AddArg(x) 8377 return true 8378 } 8379 // match: (UDIVW x (MOVDconst [c])) 8380 // cond: isPowerOfTwo(c) && is32Bit(c) 8381 // result: (SRLconst [log2(c)] x) 8382 for { 8383 x := v.Args[0] 8384 v_1 := v.Args[1] 8385 if v_1.Op != OpARM64MOVDconst { 8386 break 8387 } 8388 c := v_1.AuxInt 8389 if !(isPowerOfTwo(c) && is32Bit(c)) { 8390 break 8391 } 8392 v.reset(OpARM64SRLconst) 8393 v.AuxInt = log2(c) 8394 v.AddArg(x) 8395 return true 8396 } 8397 // match: (UDIVW (MOVDconst [c]) (MOVDconst [d])) 8398 // cond: 8399 // result: (MOVDconst [int64(uint32(c)/uint32(d))]) 8400 for { 8401 v_0 := v.Args[0] 8402 if v_0.Op != OpARM64MOVDconst { 8403 break 8404 } 8405 c := v_0.AuxInt 8406 v_1 := v.Args[1] 8407 if v_1.Op != OpARM64MOVDconst { 8408 break 8409 } 8410 d := v_1.AuxInt 8411 v.reset(OpARM64MOVDconst) 8412 v.AuxInt = int64(uint32(c) / uint32(d)) 8413 return true 8414 } 8415 return false 8416 } 8417 func rewriteValueARM64_OpARM64UMOD(v *Value, config *Config) bool { 8418 b := v.Block 8419 _ = b 8420 // match: (UMOD _ (MOVDconst [1])) 8421 // cond: 8422 // result: (MOVDconst [0]) 8423 for { 8424 v_1 := v.Args[1] 8425 if v_1.Op != OpARM64MOVDconst { 8426 break 8427 } 8428 if v_1.AuxInt != 1 { 8429 break 8430 } 8431 v.reset(OpARM64MOVDconst) 8432 v.AuxInt = 0 8433 return true 8434 } 8435 // match: (UMOD x (MOVDconst [c])) 8436 // cond: isPowerOfTwo(c) 8437 // result: (ANDconst [c-1] x) 8438 for { 8439 x := v.Args[0] 8440 v_1 := v.Args[1] 8441 if v_1.Op != OpARM64MOVDconst { 8442 break 8443 } 8444 c := v_1.AuxInt 8445 if !(isPowerOfTwo(c)) { 8446 break 8447 } 8448 v.reset(OpARM64ANDconst) 8449 v.AuxInt = c - 1 8450 v.AddArg(x) 8451 return true 8452 } 8453 // match: (UMOD (MOVDconst [c]) (MOVDconst [d])) 8454 // cond: 8455 // result: (MOVDconst [int64(uint64(c)%uint64(d))]) 8456 for { 8457 v_0 := v.Args[0] 8458 if v_0.Op != OpARM64MOVDconst { 8459 break 8460 } 8461 c := v_0.AuxInt 8462 v_1 := v.Args[1] 8463 if v_1.Op != OpARM64MOVDconst { 8464 break 8465 } 8466 d := v_1.AuxInt 8467 v.reset(OpARM64MOVDconst) 8468 v.AuxInt = int64(uint64(c) % uint64(d)) 8469 return true 8470 } 8471 return false 8472 } 8473 func rewriteValueARM64_OpARM64UMODW(v *Value, config *Config) bool { 8474 b := v.Block 8475 _ = b 8476 // match: (UMODW _ (MOVDconst [c])) 8477 // cond: uint32(c)==1 8478 // result: (MOVDconst [0]) 8479 for { 8480 v_1 := v.Args[1] 8481 if v_1.Op != OpARM64MOVDconst { 8482 break 8483 } 8484 c := v_1.AuxInt 8485 if !(uint32(c) == 1) { 8486 break 8487 } 8488 v.reset(OpARM64MOVDconst) 8489 v.AuxInt = 0 8490 return true 8491 } 8492 // match: (UMODW x (MOVDconst [c])) 8493 // cond: isPowerOfTwo(c) && is32Bit(c) 8494 // result: (ANDconst [c-1] x) 8495 for { 8496 x := v.Args[0] 8497 v_1 := v.Args[1] 8498 if v_1.Op != OpARM64MOVDconst { 8499 break 8500 } 8501 c := v_1.AuxInt 8502 if !(isPowerOfTwo(c) && is32Bit(c)) { 8503 break 8504 } 8505 v.reset(OpARM64ANDconst) 8506 v.AuxInt = c - 1 8507 v.AddArg(x) 8508 return true 8509 } 8510 // match: (UMODW (MOVDconst [c]) (MOVDconst [d])) 8511 // cond: 8512 // result: (MOVDconst [int64(uint32(c)%uint32(d))]) 8513 for { 8514 v_0 := v.Args[0] 8515 if v_0.Op != OpARM64MOVDconst { 8516 break 8517 } 8518 c := v_0.AuxInt 8519 v_1 := v.Args[1] 8520 if v_1.Op != OpARM64MOVDconst { 8521 break 8522 } 8523 d := v_1.AuxInt 8524 v.reset(OpARM64MOVDconst) 8525 v.AuxInt = int64(uint32(c) % uint32(d)) 8526 return true 8527 } 8528 return false 8529 } 8530 func rewriteValueARM64_OpARM64XOR(v *Value, config *Config) bool { 8531 b := v.Block 8532 _ = b 8533 // match: (XOR (MOVDconst [c]) x) 8534 // cond: 8535 // result: (XORconst [c] x) 8536 for { 8537 v_0 := v.Args[0] 8538 if v_0.Op != OpARM64MOVDconst { 8539 break 8540 } 8541 c := v_0.AuxInt 8542 x := v.Args[1] 8543 v.reset(OpARM64XORconst) 8544 v.AuxInt = c 8545 v.AddArg(x) 8546 return true 8547 } 8548 // match: (XOR x (MOVDconst [c])) 8549 // cond: 8550 // result: (XORconst [c] x) 8551 for { 8552 x := v.Args[0] 8553 v_1 := v.Args[1] 8554 if v_1.Op != OpARM64MOVDconst { 8555 break 8556 } 8557 c := v_1.AuxInt 8558 v.reset(OpARM64XORconst) 8559 v.AuxInt = c 8560 v.AddArg(x) 8561 return true 8562 } 8563 // match: (XOR x x) 8564 // cond: 8565 // result: (MOVDconst [0]) 8566 for { 8567 x := v.Args[0] 8568 if x != v.Args[1] { 8569 break 8570 } 8571 v.reset(OpARM64MOVDconst) 8572 v.AuxInt = 0 8573 return true 8574 } 8575 // match: (XOR x (SLLconst [c] y)) 8576 // cond: 8577 // result: (XORshiftLL x y [c]) 8578 for { 8579 x := v.Args[0] 8580 v_1 := v.Args[1] 8581 if v_1.Op != OpARM64SLLconst { 8582 break 8583 } 8584 c := v_1.AuxInt 8585 y := v_1.Args[0] 8586 v.reset(OpARM64XORshiftLL) 8587 v.AuxInt = c 8588 v.AddArg(x) 8589 v.AddArg(y) 8590 return true 8591 } 8592 // match: (XOR (SLLconst [c] y) x) 8593 // cond: 8594 // result: (XORshiftLL x y [c]) 8595 for { 8596 v_0 := v.Args[0] 8597 if v_0.Op != OpARM64SLLconst { 8598 break 8599 } 8600 c := v_0.AuxInt 8601 y := v_0.Args[0] 8602 x := v.Args[1] 8603 v.reset(OpARM64XORshiftLL) 8604 v.AuxInt = c 8605 v.AddArg(x) 8606 v.AddArg(y) 8607 return true 8608 } 8609 // match: (XOR x (SRLconst [c] y)) 8610 // cond: 8611 // result: (XORshiftRL x y [c]) 8612 for { 8613 x := v.Args[0] 8614 v_1 := v.Args[1] 8615 if v_1.Op != OpARM64SRLconst { 8616 break 8617 } 8618 c := v_1.AuxInt 8619 y := v_1.Args[0] 8620 v.reset(OpARM64XORshiftRL) 8621 v.AuxInt = c 8622 v.AddArg(x) 8623 v.AddArg(y) 8624 return true 8625 } 8626 // match: (XOR (SRLconst [c] y) x) 8627 // cond: 8628 // result: (XORshiftRL x y [c]) 8629 for { 8630 v_0 := v.Args[0] 8631 if v_0.Op != OpARM64SRLconst { 8632 break 8633 } 8634 c := v_0.AuxInt 8635 y := v_0.Args[0] 8636 x := v.Args[1] 8637 v.reset(OpARM64XORshiftRL) 8638 v.AuxInt = c 8639 v.AddArg(x) 8640 v.AddArg(y) 8641 return true 8642 } 8643 // match: (XOR x (SRAconst [c] y)) 8644 // cond: 8645 // result: (XORshiftRA x y [c]) 8646 for { 8647 x := v.Args[0] 8648 v_1 := v.Args[1] 8649 if v_1.Op != OpARM64SRAconst { 8650 break 8651 } 8652 c := v_1.AuxInt 8653 y := v_1.Args[0] 8654 v.reset(OpARM64XORshiftRA) 8655 v.AuxInt = c 8656 v.AddArg(x) 8657 v.AddArg(y) 8658 return true 8659 } 8660 // match: (XOR (SRAconst [c] y) x) 8661 // cond: 8662 // result: (XORshiftRA x y [c]) 8663 for { 8664 v_0 := v.Args[0] 8665 if v_0.Op != OpARM64SRAconst { 8666 break 8667 } 8668 c := v_0.AuxInt 8669 y := v_0.Args[0] 8670 x := v.Args[1] 8671 v.reset(OpARM64XORshiftRA) 8672 v.AuxInt = c 8673 v.AddArg(x) 8674 v.AddArg(y) 8675 return true 8676 } 8677 return false 8678 } 8679 func rewriteValueARM64_OpARM64XORconst(v *Value, config *Config) bool { 8680 b := v.Block 8681 _ = b 8682 // match: (XORconst [0] x) 8683 // cond: 8684 // result: x 8685 for { 8686 if v.AuxInt != 0 { 8687 break 8688 } 8689 x := v.Args[0] 8690 v.reset(OpCopy) 8691 v.Type = x.Type 8692 v.AddArg(x) 8693 return true 8694 } 8695 // match: (XORconst [-1] x) 8696 // cond: 8697 // result: (MVN x) 8698 for { 8699 if v.AuxInt != -1 { 8700 break 8701 } 8702 x := v.Args[0] 8703 v.reset(OpARM64MVN) 8704 v.AddArg(x) 8705 return true 8706 } 8707 // match: (XORconst [c] (MOVDconst [d])) 8708 // cond: 8709 // result: (MOVDconst [c^d]) 8710 for { 8711 c := v.AuxInt 8712 v_0 := v.Args[0] 8713 if v_0.Op != OpARM64MOVDconst { 8714 break 8715 } 8716 d := v_0.AuxInt 8717 v.reset(OpARM64MOVDconst) 8718 v.AuxInt = c ^ d 8719 return true 8720 } 8721 // match: (XORconst [c] (XORconst [d] x)) 8722 // cond: 8723 // result: (XORconst [c^d] x) 8724 for { 8725 c := v.AuxInt 8726 v_0 := v.Args[0] 8727 if v_0.Op != OpARM64XORconst { 8728 break 8729 } 8730 d := v_0.AuxInt 8731 x := v_0.Args[0] 8732 v.reset(OpARM64XORconst) 8733 v.AuxInt = c ^ d 8734 v.AddArg(x) 8735 return true 8736 } 8737 return false 8738 } 8739 func rewriteValueARM64_OpARM64XORshiftLL(v *Value, config *Config) bool { 8740 b := v.Block 8741 _ = b 8742 // match: (XORshiftLL (MOVDconst [c]) x [d]) 8743 // cond: 8744 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 8745 for { 8746 d := v.AuxInt 8747 v_0 := v.Args[0] 8748 if v_0.Op != OpARM64MOVDconst { 8749 break 8750 } 8751 c := v_0.AuxInt 8752 x := v.Args[1] 8753 v.reset(OpARM64XORconst) 8754 v.AuxInt = c 8755 v0 := b.NewValue0(v.Line, OpARM64SLLconst, x.Type) 8756 v0.AuxInt = d 8757 v0.AddArg(x) 8758 v.AddArg(v0) 8759 return true 8760 } 8761 // match: (XORshiftLL x (MOVDconst [c]) [d]) 8762 // cond: 8763 // result: (XORconst x [int64(uint64(c)<<uint64(d))]) 8764 for { 8765 d := v.AuxInt 8766 x := v.Args[0] 8767 v_1 := v.Args[1] 8768 if v_1.Op != OpARM64MOVDconst { 8769 break 8770 } 8771 c := v_1.AuxInt 8772 v.reset(OpARM64XORconst) 8773 v.AuxInt = int64(uint64(c) << uint64(d)) 8774 v.AddArg(x) 8775 return true 8776 } 8777 // match: (XORshiftLL x (SLLconst x [c]) [d]) 8778 // cond: c==d 8779 // result: (MOVDconst [0]) 8780 for { 8781 d := v.AuxInt 8782 x := v.Args[0] 8783 v_1 := v.Args[1] 8784 if v_1.Op != OpARM64SLLconst { 8785 break 8786 } 8787 c := v_1.AuxInt 8788 if x != v_1.Args[0] { 8789 break 8790 } 8791 if !(c == d) { 8792 break 8793 } 8794 v.reset(OpARM64MOVDconst) 8795 v.AuxInt = 0 8796 return true 8797 } 8798 return false 8799 } 8800 func rewriteValueARM64_OpARM64XORshiftRA(v *Value, config *Config) bool { 8801 b := v.Block 8802 _ = b 8803 // match: (XORshiftRA (MOVDconst [c]) x [d]) 8804 // cond: 8805 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 8806 for { 8807 d := v.AuxInt 8808 v_0 := v.Args[0] 8809 if v_0.Op != OpARM64MOVDconst { 8810 break 8811 } 8812 c := v_0.AuxInt 8813 x := v.Args[1] 8814 v.reset(OpARM64XORconst) 8815 v.AuxInt = c 8816 v0 := b.NewValue0(v.Line, OpARM64SRAconst, x.Type) 8817 v0.AuxInt = d 8818 v0.AddArg(x) 8819 v.AddArg(v0) 8820 return true 8821 } 8822 // match: (XORshiftRA x (MOVDconst [c]) [d]) 8823 // cond: 8824 // result: (XORconst x [int64(int64(c)>>uint64(d))]) 8825 for { 8826 d := v.AuxInt 8827 x := v.Args[0] 8828 v_1 := v.Args[1] 8829 if v_1.Op != OpARM64MOVDconst { 8830 break 8831 } 8832 c := v_1.AuxInt 8833 v.reset(OpARM64XORconst) 8834 v.AuxInt = int64(int64(c) >> uint64(d)) 8835 v.AddArg(x) 8836 return true 8837 } 8838 // match: (XORshiftRA x (SRAconst x [c]) [d]) 8839 // cond: c==d 8840 // result: (MOVDconst [0]) 8841 for { 8842 d := v.AuxInt 8843 x := v.Args[0] 8844 v_1 := v.Args[1] 8845 if v_1.Op != OpARM64SRAconst { 8846 break 8847 } 8848 c := v_1.AuxInt 8849 if x != v_1.Args[0] { 8850 break 8851 } 8852 if !(c == d) { 8853 break 8854 } 8855 v.reset(OpARM64MOVDconst) 8856 v.AuxInt = 0 8857 return true 8858 } 8859 return false 8860 } 8861 func rewriteValueARM64_OpARM64XORshiftRL(v *Value, config *Config) bool { 8862 b := v.Block 8863 _ = b 8864 // match: (XORshiftRL (MOVDconst [c]) x [d]) 8865 // cond: 8866 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 8867 for { 8868 d := v.AuxInt 8869 v_0 := v.Args[0] 8870 if v_0.Op != OpARM64MOVDconst { 8871 break 8872 } 8873 c := v_0.AuxInt 8874 x := v.Args[1] 8875 v.reset(OpARM64XORconst) 8876 v.AuxInt = c 8877 v0 := b.NewValue0(v.Line, OpARM64SRLconst, x.Type) 8878 v0.AuxInt = d 8879 v0.AddArg(x) 8880 v.AddArg(v0) 8881 return true 8882 } 8883 // match: (XORshiftRL x (MOVDconst [c]) [d]) 8884 // cond: 8885 // result: (XORconst x [int64(uint64(c)>>uint64(d))]) 8886 for { 8887 d := v.AuxInt 8888 x := v.Args[0] 8889 v_1 := v.Args[1] 8890 if v_1.Op != OpARM64MOVDconst { 8891 break 8892 } 8893 c := v_1.AuxInt 8894 v.reset(OpARM64XORconst) 8895 v.AuxInt = int64(uint64(c) >> uint64(d)) 8896 v.AddArg(x) 8897 return true 8898 } 8899 // match: (XORshiftRL x (SRLconst x [c]) [d]) 8900 // cond: c==d 8901 // result: (MOVDconst [0]) 8902 for { 8903 d := v.AuxInt 8904 x := v.Args[0] 8905 v_1 := v.Args[1] 8906 if v_1.Op != OpARM64SRLconst { 8907 break 8908 } 8909 c := v_1.AuxInt 8910 if x != v_1.Args[0] { 8911 break 8912 } 8913 if !(c == d) { 8914 break 8915 } 8916 v.reset(OpARM64MOVDconst) 8917 v.AuxInt = 0 8918 return true 8919 } 8920 return false 8921 } 8922 func rewriteValueARM64_OpAdd16(v *Value, config *Config) bool { 8923 b := v.Block 8924 _ = b 8925 // match: (Add16 x y) 8926 // cond: 8927 // result: (ADD x y) 8928 for { 8929 x := v.Args[0] 8930 y := v.Args[1] 8931 v.reset(OpARM64ADD) 8932 v.AddArg(x) 8933 v.AddArg(y) 8934 return true 8935 } 8936 } 8937 func rewriteValueARM64_OpAdd32(v *Value, config *Config) bool { 8938 b := v.Block 8939 _ = b 8940 // match: (Add32 x y) 8941 // cond: 8942 // result: (ADD x y) 8943 for { 8944 x := v.Args[0] 8945 y := v.Args[1] 8946 v.reset(OpARM64ADD) 8947 v.AddArg(x) 8948 v.AddArg(y) 8949 return true 8950 } 8951 } 8952 func rewriteValueARM64_OpAdd32F(v *Value, config *Config) bool { 8953 b := v.Block 8954 _ = b 8955 // match: (Add32F x y) 8956 // cond: 8957 // result: (FADDS x y) 8958 for { 8959 x := v.Args[0] 8960 y := v.Args[1] 8961 v.reset(OpARM64FADDS) 8962 v.AddArg(x) 8963 v.AddArg(y) 8964 return true 8965 } 8966 } 8967 func rewriteValueARM64_OpAdd64(v *Value, config *Config) bool { 8968 b := v.Block 8969 _ = b 8970 // match: (Add64 x y) 8971 // cond: 8972 // result: (ADD x y) 8973 for { 8974 x := v.Args[0] 8975 y := v.Args[1] 8976 v.reset(OpARM64ADD) 8977 v.AddArg(x) 8978 v.AddArg(y) 8979 return true 8980 } 8981 } 8982 func rewriteValueARM64_OpAdd64F(v *Value, config *Config) bool { 8983 b := v.Block 8984 _ = b 8985 // match: (Add64F x y) 8986 // cond: 8987 // result: (FADDD x y) 8988 for { 8989 x := v.Args[0] 8990 y := v.Args[1] 8991 v.reset(OpARM64FADDD) 8992 v.AddArg(x) 8993 v.AddArg(y) 8994 return true 8995 } 8996 } 8997 func rewriteValueARM64_OpAdd8(v *Value, config *Config) bool { 8998 b := v.Block 8999 _ = b 9000 // match: (Add8 x y) 9001 // cond: 9002 // result: (ADD x y) 9003 for { 9004 x := v.Args[0] 9005 y := v.Args[1] 9006 v.reset(OpARM64ADD) 9007 v.AddArg(x) 9008 v.AddArg(y) 9009 return true 9010 } 9011 } 9012 func rewriteValueARM64_OpAddPtr(v *Value, config *Config) bool { 9013 b := v.Block 9014 _ = b 9015 // match: (AddPtr x y) 9016 // cond: 9017 // result: (ADD x y) 9018 for { 9019 x := v.Args[0] 9020 y := v.Args[1] 9021 v.reset(OpARM64ADD) 9022 v.AddArg(x) 9023 v.AddArg(y) 9024 return true 9025 } 9026 } 9027 func rewriteValueARM64_OpAddr(v *Value, config *Config) bool { 9028 b := v.Block 9029 _ = b 9030 // match: (Addr {sym} base) 9031 // cond: 9032 // result: (MOVDaddr {sym} base) 9033 for { 9034 sym := v.Aux 9035 base := v.Args[0] 9036 v.reset(OpARM64MOVDaddr) 9037 v.Aux = sym 9038 v.AddArg(base) 9039 return true 9040 } 9041 } 9042 func rewriteValueARM64_OpAnd16(v *Value, config *Config) bool { 9043 b := v.Block 9044 _ = b 9045 // match: (And16 x y) 9046 // cond: 9047 // result: (AND x y) 9048 for { 9049 x := v.Args[0] 9050 y := v.Args[1] 9051 v.reset(OpARM64AND) 9052 v.AddArg(x) 9053 v.AddArg(y) 9054 return true 9055 } 9056 } 9057 func rewriteValueARM64_OpAnd32(v *Value, config *Config) bool { 9058 b := v.Block 9059 _ = b 9060 // match: (And32 x y) 9061 // cond: 9062 // result: (AND x y) 9063 for { 9064 x := v.Args[0] 9065 y := v.Args[1] 9066 v.reset(OpARM64AND) 9067 v.AddArg(x) 9068 v.AddArg(y) 9069 return true 9070 } 9071 } 9072 func rewriteValueARM64_OpAnd64(v *Value, config *Config) bool { 9073 b := v.Block 9074 _ = b 9075 // match: (And64 x y) 9076 // cond: 9077 // result: (AND x y) 9078 for { 9079 x := v.Args[0] 9080 y := v.Args[1] 9081 v.reset(OpARM64AND) 9082 v.AddArg(x) 9083 v.AddArg(y) 9084 return true 9085 } 9086 } 9087 func rewriteValueARM64_OpAnd8(v *Value, config *Config) bool { 9088 b := v.Block 9089 _ = b 9090 // match: (And8 x y) 9091 // cond: 9092 // result: (AND x y) 9093 for { 9094 x := v.Args[0] 9095 y := v.Args[1] 9096 v.reset(OpARM64AND) 9097 v.AddArg(x) 9098 v.AddArg(y) 9099 return true 9100 } 9101 } 9102 func rewriteValueARM64_OpAndB(v *Value, config *Config) bool { 9103 b := v.Block 9104 _ = b 9105 // match: (AndB x y) 9106 // cond: 9107 // result: (AND x y) 9108 for { 9109 x := v.Args[0] 9110 y := v.Args[1] 9111 v.reset(OpARM64AND) 9112 v.AddArg(x) 9113 v.AddArg(y) 9114 return true 9115 } 9116 } 9117 func rewriteValueARM64_OpAtomicAdd32(v *Value, config *Config) bool { 9118 b := v.Block 9119 _ = b 9120 // match: (AtomicAdd32 ptr val mem) 9121 // cond: 9122 // result: (LoweredAtomicAdd32 ptr val mem) 9123 for { 9124 ptr := v.Args[0] 9125 val := v.Args[1] 9126 mem := v.Args[2] 9127 v.reset(OpARM64LoweredAtomicAdd32) 9128 v.AddArg(ptr) 9129 v.AddArg(val) 9130 v.AddArg(mem) 9131 return true 9132 } 9133 } 9134 func rewriteValueARM64_OpAtomicAdd64(v *Value, config *Config) bool { 9135 b := v.Block 9136 _ = b 9137 // match: (AtomicAdd64 ptr val mem) 9138 // cond: 9139 // result: (LoweredAtomicAdd64 ptr val mem) 9140 for { 9141 ptr := v.Args[0] 9142 val := v.Args[1] 9143 mem := v.Args[2] 9144 v.reset(OpARM64LoweredAtomicAdd64) 9145 v.AddArg(ptr) 9146 v.AddArg(val) 9147 v.AddArg(mem) 9148 return true 9149 } 9150 } 9151 func rewriteValueARM64_OpAtomicAnd8(v *Value, config *Config) bool { 9152 b := v.Block 9153 _ = b 9154 // match: (AtomicAnd8 ptr val mem) 9155 // cond: 9156 // result: (LoweredAtomicAnd8 ptr val mem) 9157 for { 9158 ptr := v.Args[0] 9159 val := v.Args[1] 9160 mem := v.Args[2] 9161 v.reset(OpARM64LoweredAtomicAnd8) 9162 v.AddArg(ptr) 9163 v.AddArg(val) 9164 v.AddArg(mem) 9165 return true 9166 } 9167 } 9168 func rewriteValueARM64_OpAtomicCompareAndSwap32(v *Value, config *Config) bool { 9169 b := v.Block 9170 _ = b 9171 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 9172 // cond: 9173 // result: (LoweredAtomicCas32 ptr old new_ mem) 9174 for { 9175 ptr := v.Args[0] 9176 old := v.Args[1] 9177 new_ := v.Args[2] 9178 mem := v.Args[3] 9179 v.reset(OpARM64LoweredAtomicCas32) 9180 v.AddArg(ptr) 9181 v.AddArg(old) 9182 v.AddArg(new_) 9183 v.AddArg(mem) 9184 return true 9185 } 9186 } 9187 func rewriteValueARM64_OpAtomicCompareAndSwap64(v *Value, config *Config) bool { 9188 b := v.Block 9189 _ = b 9190 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 9191 // cond: 9192 // result: (LoweredAtomicCas64 ptr old new_ mem) 9193 for { 9194 ptr := v.Args[0] 9195 old := v.Args[1] 9196 new_ := v.Args[2] 9197 mem := v.Args[3] 9198 v.reset(OpARM64LoweredAtomicCas64) 9199 v.AddArg(ptr) 9200 v.AddArg(old) 9201 v.AddArg(new_) 9202 v.AddArg(mem) 9203 return true 9204 } 9205 } 9206 func rewriteValueARM64_OpAtomicExchange32(v *Value, config *Config) bool { 9207 b := v.Block 9208 _ = b 9209 // match: (AtomicExchange32 ptr val mem) 9210 // cond: 9211 // result: (LoweredAtomicExchange32 ptr val mem) 9212 for { 9213 ptr := v.Args[0] 9214 val := v.Args[1] 9215 mem := v.Args[2] 9216 v.reset(OpARM64LoweredAtomicExchange32) 9217 v.AddArg(ptr) 9218 v.AddArg(val) 9219 v.AddArg(mem) 9220 return true 9221 } 9222 } 9223 func rewriteValueARM64_OpAtomicExchange64(v *Value, config *Config) bool { 9224 b := v.Block 9225 _ = b 9226 // match: (AtomicExchange64 ptr val mem) 9227 // cond: 9228 // result: (LoweredAtomicExchange64 ptr val mem) 9229 for { 9230 ptr := v.Args[0] 9231 val := v.Args[1] 9232 mem := v.Args[2] 9233 v.reset(OpARM64LoweredAtomicExchange64) 9234 v.AddArg(ptr) 9235 v.AddArg(val) 9236 v.AddArg(mem) 9237 return true 9238 } 9239 } 9240 func rewriteValueARM64_OpAtomicLoad32(v *Value, config *Config) bool { 9241 b := v.Block 9242 _ = b 9243 // match: (AtomicLoad32 ptr mem) 9244 // cond: 9245 // result: (LDARW ptr mem) 9246 for { 9247 ptr := v.Args[0] 9248 mem := v.Args[1] 9249 v.reset(OpARM64LDARW) 9250 v.AddArg(ptr) 9251 v.AddArg(mem) 9252 return true 9253 } 9254 } 9255 func rewriteValueARM64_OpAtomicLoad64(v *Value, config *Config) bool { 9256 b := v.Block 9257 _ = b 9258 // match: (AtomicLoad64 ptr mem) 9259 // cond: 9260 // result: (LDAR ptr mem) 9261 for { 9262 ptr := v.Args[0] 9263 mem := v.Args[1] 9264 v.reset(OpARM64LDAR) 9265 v.AddArg(ptr) 9266 v.AddArg(mem) 9267 return true 9268 } 9269 } 9270 func rewriteValueARM64_OpAtomicLoadPtr(v *Value, config *Config) bool { 9271 b := v.Block 9272 _ = b 9273 // match: (AtomicLoadPtr ptr mem) 9274 // cond: 9275 // result: (LDAR ptr mem) 9276 for { 9277 ptr := v.Args[0] 9278 mem := v.Args[1] 9279 v.reset(OpARM64LDAR) 9280 v.AddArg(ptr) 9281 v.AddArg(mem) 9282 return true 9283 } 9284 } 9285 func rewriteValueARM64_OpAtomicOr8(v *Value, config *Config) bool { 9286 b := v.Block 9287 _ = b 9288 // match: (AtomicOr8 ptr val mem) 9289 // cond: 9290 // result: (LoweredAtomicOr8 ptr val mem) 9291 for { 9292 ptr := v.Args[0] 9293 val := v.Args[1] 9294 mem := v.Args[2] 9295 v.reset(OpARM64LoweredAtomicOr8) 9296 v.AddArg(ptr) 9297 v.AddArg(val) 9298 v.AddArg(mem) 9299 return true 9300 } 9301 } 9302 func rewriteValueARM64_OpAtomicStore32(v *Value, config *Config) bool { 9303 b := v.Block 9304 _ = b 9305 // match: (AtomicStore32 ptr val mem) 9306 // cond: 9307 // result: (STLRW ptr val mem) 9308 for { 9309 ptr := v.Args[0] 9310 val := v.Args[1] 9311 mem := v.Args[2] 9312 v.reset(OpARM64STLRW) 9313 v.AddArg(ptr) 9314 v.AddArg(val) 9315 v.AddArg(mem) 9316 return true 9317 } 9318 } 9319 func rewriteValueARM64_OpAtomicStore64(v *Value, config *Config) bool { 9320 b := v.Block 9321 _ = b 9322 // match: (AtomicStore64 ptr val mem) 9323 // cond: 9324 // result: (STLR ptr val mem) 9325 for { 9326 ptr := v.Args[0] 9327 val := v.Args[1] 9328 mem := v.Args[2] 9329 v.reset(OpARM64STLR) 9330 v.AddArg(ptr) 9331 v.AddArg(val) 9332 v.AddArg(mem) 9333 return true 9334 } 9335 } 9336 func rewriteValueARM64_OpAtomicStorePtrNoWB(v *Value, config *Config) bool { 9337 b := v.Block 9338 _ = b 9339 // match: (AtomicStorePtrNoWB ptr val mem) 9340 // cond: 9341 // result: (STLR ptr val mem) 9342 for { 9343 ptr := v.Args[0] 9344 val := v.Args[1] 9345 mem := v.Args[2] 9346 v.reset(OpARM64STLR) 9347 v.AddArg(ptr) 9348 v.AddArg(val) 9349 v.AddArg(mem) 9350 return true 9351 } 9352 } 9353 func rewriteValueARM64_OpAvg64u(v *Value, config *Config) bool { 9354 b := v.Block 9355 _ = b 9356 // match: (Avg64u <t> x y) 9357 // cond: 9358 // result: (ADD (ADD <t> (SRLconst <t> x [1]) (SRLconst <t> y [1])) (AND <t> (AND <t> x y) (MOVDconst [1]))) 9359 for { 9360 t := v.Type 9361 x := v.Args[0] 9362 y := v.Args[1] 9363 v.reset(OpARM64ADD) 9364 v0 := b.NewValue0(v.Line, OpARM64ADD, t) 9365 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 9366 v1.AuxInt = 1 9367 v1.AddArg(x) 9368 v0.AddArg(v1) 9369 v2 := b.NewValue0(v.Line, OpARM64SRLconst, t) 9370 v2.AuxInt = 1 9371 v2.AddArg(y) 9372 v0.AddArg(v2) 9373 v.AddArg(v0) 9374 v3 := b.NewValue0(v.Line, OpARM64AND, t) 9375 v4 := b.NewValue0(v.Line, OpARM64AND, t) 9376 v4.AddArg(x) 9377 v4.AddArg(y) 9378 v3.AddArg(v4) 9379 v5 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 9380 v5.AuxInt = 1 9381 v3.AddArg(v5) 9382 v.AddArg(v3) 9383 return true 9384 } 9385 } 9386 func rewriteValueARM64_OpBswap32(v *Value, config *Config) bool { 9387 b := v.Block 9388 _ = b 9389 // match: (Bswap32 x) 9390 // cond: 9391 // result: (REVW x) 9392 for { 9393 x := v.Args[0] 9394 v.reset(OpARM64REVW) 9395 v.AddArg(x) 9396 return true 9397 } 9398 } 9399 func rewriteValueARM64_OpBswap64(v *Value, config *Config) bool { 9400 b := v.Block 9401 _ = b 9402 // match: (Bswap64 x) 9403 // cond: 9404 // result: (REV x) 9405 for { 9406 x := v.Args[0] 9407 v.reset(OpARM64REV) 9408 v.AddArg(x) 9409 return true 9410 } 9411 } 9412 func rewriteValueARM64_OpClosureCall(v *Value, config *Config) bool { 9413 b := v.Block 9414 _ = b 9415 // match: (ClosureCall [argwid] entry closure mem) 9416 // cond: 9417 // result: (CALLclosure [argwid] entry closure mem) 9418 for { 9419 argwid := v.AuxInt 9420 entry := v.Args[0] 9421 closure := v.Args[1] 9422 mem := v.Args[2] 9423 v.reset(OpARM64CALLclosure) 9424 v.AuxInt = argwid 9425 v.AddArg(entry) 9426 v.AddArg(closure) 9427 v.AddArg(mem) 9428 return true 9429 } 9430 } 9431 func rewriteValueARM64_OpCom16(v *Value, config *Config) bool { 9432 b := v.Block 9433 _ = b 9434 // match: (Com16 x) 9435 // cond: 9436 // result: (MVN x) 9437 for { 9438 x := v.Args[0] 9439 v.reset(OpARM64MVN) 9440 v.AddArg(x) 9441 return true 9442 } 9443 } 9444 func rewriteValueARM64_OpCom32(v *Value, config *Config) bool { 9445 b := v.Block 9446 _ = b 9447 // match: (Com32 x) 9448 // cond: 9449 // result: (MVN x) 9450 for { 9451 x := v.Args[0] 9452 v.reset(OpARM64MVN) 9453 v.AddArg(x) 9454 return true 9455 } 9456 } 9457 func rewriteValueARM64_OpCom64(v *Value, config *Config) bool { 9458 b := v.Block 9459 _ = b 9460 // match: (Com64 x) 9461 // cond: 9462 // result: (MVN x) 9463 for { 9464 x := v.Args[0] 9465 v.reset(OpARM64MVN) 9466 v.AddArg(x) 9467 return true 9468 } 9469 } 9470 func rewriteValueARM64_OpCom8(v *Value, config *Config) bool { 9471 b := v.Block 9472 _ = b 9473 // match: (Com8 x) 9474 // cond: 9475 // result: (MVN x) 9476 for { 9477 x := v.Args[0] 9478 v.reset(OpARM64MVN) 9479 v.AddArg(x) 9480 return true 9481 } 9482 } 9483 func rewriteValueARM64_OpConst16(v *Value, config *Config) bool { 9484 b := v.Block 9485 _ = b 9486 // match: (Const16 [val]) 9487 // cond: 9488 // result: (MOVDconst [val]) 9489 for { 9490 val := v.AuxInt 9491 v.reset(OpARM64MOVDconst) 9492 v.AuxInt = val 9493 return true 9494 } 9495 } 9496 func rewriteValueARM64_OpConst32(v *Value, config *Config) bool { 9497 b := v.Block 9498 _ = b 9499 // match: (Const32 [val]) 9500 // cond: 9501 // result: (MOVDconst [val]) 9502 for { 9503 val := v.AuxInt 9504 v.reset(OpARM64MOVDconst) 9505 v.AuxInt = val 9506 return true 9507 } 9508 } 9509 func rewriteValueARM64_OpConst32F(v *Value, config *Config) bool { 9510 b := v.Block 9511 _ = b 9512 // match: (Const32F [val]) 9513 // cond: 9514 // result: (FMOVSconst [val]) 9515 for { 9516 val := v.AuxInt 9517 v.reset(OpARM64FMOVSconst) 9518 v.AuxInt = val 9519 return true 9520 } 9521 } 9522 func rewriteValueARM64_OpConst64(v *Value, config *Config) bool { 9523 b := v.Block 9524 _ = b 9525 // match: (Const64 [val]) 9526 // cond: 9527 // result: (MOVDconst [val]) 9528 for { 9529 val := v.AuxInt 9530 v.reset(OpARM64MOVDconst) 9531 v.AuxInt = val 9532 return true 9533 } 9534 } 9535 func rewriteValueARM64_OpConst64F(v *Value, config *Config) bool { 9536 b := v.Block 9537 _ = b 9538 // match: (Const64F [val]) 9539 // cond: 9540 // result: (FMOVDconst [val]) 9541 for { 9542 val := v.AuxInt 9543 v.reset(OpARM64FMOVDconst) 9544 v.AuxInt = val 9545 return true 9546 } 9547 } 9548 func rewriteValueARM64_OpConst8(v *Value, config *Config) bool { 9549 b := v.Block 9550 _ = b 9551 // match: (Const8 [val]) 9552 // cond: 9553 // result: (MOVDconst [val]) 9554 for { 9555 val := v.AuxInt 9556 v.reset(OpARM64MOVDconst) 9557 v.AuxInt = val 9558 return true 9559 } 9560 } 9561 func rewriteValueARM64_OpConstBool(v *Value, config *Config) bool { 9562 b := v.Block 9563 _ = b 9564 // match: (ConstBool [b]) 9565 // cond: 9566 // result: (MOVDconst [b]) 9567 for { 9568 b := v.AuxInt 9569 v.reset(OpARM64MOVDconst) 9570 v.AuxInt = b 9571 return true 9572 } 9573 } 9574 func rewriteValueARM64_OpConstNil(v *Value, config *Config) bool { 9575 b := v.Block 9576 _ = b 9577 // match: (ConstNil) 9578 // cond: 9579 // result: (MOVDconst [0]) 9580 for { 9581 v.reset(OpARM64MOVDconst) 9582 v.AuxInt = 0 9583 return true 9584 } 9585 } 9586 func rewriteValueARM64_OpConvert(v *Value, config *Config) bool { 9587 b := v.Block 9588 _ = b 9589 // match: (Convert x mem) 9590 // cond: 9591 // result: (MOVDconvert x mem) 9592 for { 9593 x := v.Args[0] 9594 mem := v.Args[1] 9595 v.reset(OpARM64MOVDconvert) 9596 v.AddArg(x) 9597 v.AddArg(mem) 9598 return true 9599 } 9600 } 9601 func rewriteValueARM64_OpCtz32(v *Value, config *Config) bool { 9602 b := v.Block 9603 _ = b 9604 // match: (Ctz32 <t> x) 9605 // cond: 9606 // result: (CLZW (RBITW <t> x)) 9607 for { 9608 t := v.Type 9609 x := v.Args[0] 9610 v.reset(OpARM64CLZW) 9611 v0 := b.NewValue0(v.Line, OpARM64RBITW, t) 9612 v0.AddArg(x) 9613 v.AddArg(v0) 9614 return true 9615 } 9616 } 9617 func rewriteValueARM64_OpCtz64(v *Value, config *Config) bool { 9618 b := v.Block 9619 _ = b 9620 // match: (Ctz64 <t> x) 9621 // cond: 9622 // result: (CLZ (RBIT <t> x)) 9623 for { 9624 t := v.Type 9625 x := v.Args[0] 9626 v.reset(OpARM64CLZ) 9627 v0 := b.NewValue0(v.Line, OpARM64RBIT, t) 9628 v0.AddArg(x) 9629 v.AddArg(v0) 9630 return true 9631 } 9632 } 9633 func rewriteValueARM64_OpCvt32Fto32(v *Value, config *Config) bool { 9634 b := v.Block 9635 _ = b 9636 // match: (Cvt32Fto32 x) 9637 // cond: 9638 // result: (FCVTZSSW x) 9639 for { 9640 x := v.Args[0] 9641 v.reset(OpARM64FCVTZSSW) 9642 v.AddArg(x) 9643 return true 9644 } 9645 } 9646 func rewriteValueARM64_OpCvt32Fto32U(v *Value, config *Config) bool { 9647 b := v.Block 9648 _ = b 9649 // match: (Cvt32Fto32U x) 9650 // cond: 9651 // result: (FCVTZUSW x) 9652 for { 9653 x := v.Args[0] 9654 v.reset(OpARM64FCVTZUSW) 9655 v.AddArg(x) 9656 return true 9657 } 9658 } 9659 func rewriteValueARM64_OpCvt32Fto64(v *Value, config *Config) bool { 9660 b := v.Block 9661 _ = b 9662 // match: (Cvt32Fto64 x) 9663 // cond: 9664 // result: (FCVTZSS x) 9665 for { 9666 x := v.Args[0] 9667 v.reset(OpARM64FCVTZSS) 9668 v.AddArg(x) 9669 return true 9670 } 9671 } 9672 func rewriteValueARM64_OpCvt32Fto64F(v *Value, config *Config) bool { 9673 b := v.Block 9674 _ = b 9675 // match: (Cvt32Fto64F x) 9676 // cond: 9677 // result: (FCVTSD x) 9678 for { 9679 x := v.Args[0] 9680 v.reset(OpARM64FCVTSD) 9681 v.AddArg(x) 9682 return true 9683 } 9684 } 9685 func rewriteValueARM64_OpCvt32Fto64U(v *Value, config *Config) bool { 9686 b := v.Block 9687 _ = b 9688 // match: (Cvt32Fto64U x) 9689 // cond: 9690 // result: (FCVTZUS x) 9691 for { 9692 x := v.Args[0] 9693 v.reset(OpARM64FCVTZUS) 9694 v.AddArg(x) 9695 return true 9696 } 9697 } 9698 func rewriteValueARM64_OpCvt32Uto32F(v *Value, config *Config) bool { 9699 b := v.Block 9700 _ = b 9701 // match: (Cvt32Uto32F x) 9702 // cond: 9703 // result: (UCVTFWS x) 9704 for { 9705 x := v.Args[0] 9706 v.reset(OpARM64UCVTFWS) 9707 v.AddArg(x) 9708 return true 9709 } 9710 } 9711 func rewriteValueARM64_OpCvt32Uto64F(v *Value, config *Config) bool { 9712 b := v.Block 9713 _ = b 9714 // match: (Cvt32Uto64F x) 9715 // cond: 9716 // result: (UCVTFWD x) 9717 for { 9718 x := v.Args[0] 9719 v.reset(OpARM64UCVTFWD) 9720 v.AddArg(x) 9721 return true 9722 } 9723 } 9724 func rewriteValueARM64_OpCvt32to32F(v *Value, config *Config) bool { 9725 b := v.Block 9726 _ = b 9727 // match: (Cvt32to32F x) 9728 // cond: 9729 // result: (SCVTFWS x) 9730 for { 9731 x := v.Args[0] 9732 v.reset(OpARM64SCVTFWS) 9733 v.AddArg(x) 9734 return true 9735 } 9736 } 9737 func rewriteValueARM64_OpCvt32to64F(v *Value, config *Config) bool { 9738 b := v.Block 9739 _ = b 9740 // match: (Cvt32to64F x) 9741 // cond: 9742 // result: (SCVTFWD x) 9743 for { 9744 x := v.Args[0] 9745 v.reset(OpARM64SCVTFWD) 9746 v.AddArg(x) 9747 return true 9748 } 9749 } 9750 func rewriteValueARM64_OpCvt64Fto32(v *Value, config *Config) bool { 9751 b := v.Block 9752 _ = b 9753 // match: (Cvt64Fto32 x) 9754 // cond: 9755 // result: (FCVTZSDW x) 9756 for { 9757 x := v.Args[0] 9758 v.reset(OpARM64FCVTZSDW) 9759 v.AddArg(x) 9760 return true 9761 } 9762 } 9763 func rewriteValueARM64_OpCvt64Fto32F(v *Value, config *Config) bool { 9764 b := v.Block 9765 _ = b 9766 // match: (Cvt64Fto32F x) 9767 // cond: 9768 // result: (FCVTDS x) 9769 for { 9770 x := v.Args[0] 9771 v.reset(OpARM64FCVTDS) 9772 v.AddArg(x) 9773 return true 9774 } 9775 } 9776 func rewriteValueARM64_OpCvt64Fto32U(v *Value, config *Config) bool { 9777 b := v.Block 9778 _ = b 9779 // match: (Cvt64Fto32U x) 9780 // cond: 9781 // result: (FCVTZUDW x) 9782 for { 9783 x := v.Args[0] 9784 v.reset(OpARM64FCVTZUDW) 9785 v.AddArg(x) 9786 return true 9787 } 9788 } 9789 func rewriteValueARM64_OpCvt64Fto64(v *Value, config *Config) bool { 9790 b := v.Block 9791 _ = b 9792 // match: (Cvt64Fto64 x) 9793 // cond: 9794 // result: (FCVTZSD x) 9795 for { 9796 x := v.Args[0] 9797 v.reset(OpARM64FCVTZSD) 9798 v.AddArg(x) 9799 return true 9800 } 9801 } 9802 func rewriteValueARM64_OpCvt64Fto64U(v *Value, config *Config) bool { 9803 b := v.Block 9804 _ = b 9805 // match: (Cvt64Fto64U x) 9806 // cond: 9807 // result: (FCVTZUD x) 9808 for { 9809 x := v.Args[0] 9810 v.reset(OpARM64FCVTZUD) 9811 v.AddArg(x) 9812 return true 9813 } 9814 } 9815 func rewriteValueARM64_OpCvt64Uto32F(v *Value, config *Config) bool { 9816 b := v.Block 9817 _ = b 9818 // match: (Cvt64Uto32F x) 9819 // cond: 9820 // result: (UCVTFS x) 9821 for { 9822 x := v.Args[0] 9823 v.reset(OpARM64UCVTFS) 9824 v.AddArg(x) 9825 return true 9826 } 9827 } 9828 func rewriteValueARM64_OpCvt64Uto64F(v *Value, config *Config) bool { 9829 b := v.Block 9830 _ = b 9831 // match: (Cvt64Uto64F x) 9832 // cond: 9833 // result: (UCVTFD x) 9834 for { 9835 x := v.Args[0] 9836 v.reset(OpARM64UCVTFD) 9837 v.AddArg(x) 9838 return true 9839 } 9840 } 9841 func rewriteValueARM64_OpCvt64to32F(v *Value, config *Config) bool { 9842 b := v.Block 9843 _ = b 9844 // match: (Cvt64to32F x) 9845 // cond: 9846 // result: (SCVTFS x) 9847 for { 9848 x := v.Args[0] 9849 v.reset(OpARM64SCVTFS) 9850 v.AddArg(x) 9851 return true 9852 } 9853 } 9854 func rewriteValueARM64_OpCvt64to64F(v *Value, config *Config) bool { 9855 b := v.Block 9856 _ = b 9857 // match: (Cvt64to64F x) 9858 // cond: 9859 // result: (SCVTFD x) 9860 for { 9861 x := v.Args[0] 9862 v.reset(OpARM64SCVTFD) 9863 v.AddArg(x) 9864 return true 9865 } 9866 } 9867 func rewriteValueARM64_OpDeferCall(v *Value, config *Config) bool { 9868 b := v.Block 9869 _ = b 9870 // match: (DeferCall [argwid] mem) 9871 // cond: 9872 // result: (CALLdefer [argwid] mem) 9873 for { 9874 argwid := v.AuxInt 9875 mem := v.Args[0] 9876 v.reset(OpARM64CALLdefer) 9877 v.AuxInt = argwid 9878 v.AddArg(mem) 9879 return true 9880 } 9881 } 9882 func rewriteValueARM64_OpDiv16(v *Value, config *Config) bool { 9883 b := v.Block 9884 _ = b 9885 // match: (Div16 x y) 9886 // cond: 9887 // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) 9888 for { 9889 x := v.Args[0] 9890 y := v.Args[1] 9891 v.reset(OpARM64DIVW) 9892 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 9893 v0.AddArg(x) 9894 v.AddArg(v0) 9895 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 9896 v1.AddArg(y) 9897 v.AddArg(v1) 9898 return true 9899 } 9900 } 9901 func rewriteValueARM64_OpDiv16u(v *Value, config *Config) bool { 9902 b := v.Block 9903 _ = b 9904 // match: (Div16u x y) 9905 // cond: 9906 // result: (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y)) 9907 for { 9908 x := v.Args[0] 9909 y := v.Args[1] 9910 v.reset(OpARM64UDIVW) 9911 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 9912 v0.AddArg(x) 9913 v.AddArg(v0) 9914 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 9915 v1.AddArg(y) 9916 v.AddArg(v1) 9917 return true 9918 } 9919 } 9920 func rewriteValueARM64_OpDiv32(v *Value, config *Config) bool { 9921 b := v.Block 9922 _ = b 9923 // match: (Div32 x y) 9924 // cond: 9925 // result: (DIVW x y) 9926 for { 9927 x := v.Args[0] 9928 y := v.Args[1] 9929 v.reset(OpARM64DIVW) 9930 v.AddArg(x) 9931 v.AddArg(y) 9932 return true 9933 } 9934 } 9935 func rewriteValueARM64_OpDiv32F(v *Value, config *Config) bool { 9936 b := v.Block 9937 _ = b 9938 // match: (Div32F x y) 9939 // cond: 9940 // result: (FDIVS x y) 9941 for { 9942 x := v.Args[0] 9943 y := v.Args[1] 9944 v.reset(OpARM64FDIVS) 9945 v.AddArg(x) 9946 v.AddArg(y) 9947 return true 9948 } 9949 } 9950 func rewriteValueARM64_OpDiv32u(v *Value, config *Config) bool { 9951 b := v.Block 9952 _ = b 9953 // match: (Div32u x y) 9954 // cond: 9955 // result: (UDIVW x y) 9956 for { 9957 x := v.Args[0] 9958 y := v.Args[1] 9959 v.reset(OpARM64UDIVW) 9960 v.AddArg(x) 9961 v.AddArg(y) 9962 return true 9963 } 9964 } 9965 func rewriteValueARM64_OpDiv64(v *Value, config *Config) bool { 9966 b := v.Block 9967 _ = b 9968 // match: (Div64 x y) 9969 // cond: 9970 // result: (DIV x y) 9971 for { 9972 x := v.Args[0] 9973 y := v.Args[1] 9974 v.reset(OpARM64DIV) 9975 v.AddArg(x) 9976 v.AddArg(y) 9977 return true 9978 } 9979 } 9980 func rewriteValueARM64_OpDiv64F(v *Value, config *Config) bool { 9981 b := v.Block 9982 _ = b 9983 // match: (Div64F x y) 9984 // cond: 9985 // result: (FDIVD x y) 9986 for { 9987 x := v.Args[0] 9988 y := v.Args[1] 9989 v.reset(OpARM64FDIVD) 9990 v.AddArg(x) 9991 v.AddArg(y) 9992 return true 9993 } 9994 } 9995 func rewriteValueARM64_OpDiv64u(v *Value, config *Config) bool { 9996 b := v.Block 9997 _ = b 9998 // match: (Div64u x y) 9999 // cond: 10000 // result: (UDIV x y) 10001 for { 10002 x := v.Args[0] 10003 y := v.Args[1] 10004 v.reset(OpARM64UDIV) 10005 v.AddArg(x) 10006 v.AddArg(y) 10007 return true 10008 } 10009 } 10010 func rewriteValueARM64_OpDiv8(v *Value, config *Config) bool { 10011 b := v.Block 10012 _ = b 10013 // match: (Div8 x y) 10014 // cond: 10015 // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) 10016 for { 10017 x := v.Args[0] 10018 y := v.Args[1] 10019 v.reset(OpARM64DIVW) 10020 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10021 v0.AddArg(x) 10022 v.AddArg(v0) 10023 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10024 v1.AddArg(y) 10025 v.AddArg(v1) 10026 return true 10027 } 10028 } 10029 func rewriteValueARM64_OpDiv8u(v *Value, config *Config) bool { 10030 b := v.Block 10031 _ = b 10032 // match: (Div8u x y) 10033 // cond: 10034 // result: (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y)) 10035 for { 10036 x := v.Args[0] 10037 y := v.Args[1] 10038 v.reset(OpARM64UDIVW) 10039 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10040 v0.AddArg(x) 10041 v.AddArg(v0) 10042 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10043 v1.AddArg(y) 10044 v.AddArg(v1) 10045 return true 10046 } 10047 } 10048 func rewriteValueARM64_OpEq16(v *Value, config *Config) bool { 10049 b := v.Block 10050 _ = b 10051 // match: (Eq16 x y) 10052 // cond: 10053 // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10054 for { 10055 x := v.Args[0] 10056 y := v.Args[1] 10057 v.reset(OpARM64Equal) 10058 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10059 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10060 v1.AddArg(x) 10061 v0.AddArg(v1) 10062 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10063 v2.AddArg(y) 10064 v0.AddArg(v2) 10065 v.AddArg(v0) 10066 return true 10067 } 10068 } 10069 func rewriteValueARM64_OpEq32(v *Value, config *Config) bool { 10070 b := v.Block 10071 _ = b 10072 // match: (Eq32 x y) 10073 // cond: 10074 // result: (Equal (CMPW x y)) 10075 for { 10076 x := v.Args[0] 10077 y := v.Args[1] 10078 v.reset(OpARM64Equal) 10079 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10080 v0.AddArg(x) 10081 v0.AddArg(y) 10082 v.AddArg(v0) 10083 return true 10084 } 10085 } 10086 func rewriteValueARM64_OpEq32F(v *Value, config *Config) bool { 10087 b := v.Block 10088 _ = b 10089 // match: (Eq32F x y) 10090 // cond: 10091 // result: (Equal (FCMPS x y)) 10092 for { 10093 x := v.Args[0] 10094 y := v.Args[1] 10095 v.reset(OpARM64Equal) 10096 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10097 v0.AddArg(x) 10098 v0.AddArg(y) 10099 v.AddArg(v0) 10100 return true 10101 } 10102 } 10103 func rewriteValueARM64_OpEq64(v *Value, config *Config) bool { 10104 b := v.Block 10105 _ = b 10106 // match: (Eq64 x y) 10107 // cond: 10108 // result: (Equal (CMP x y)) 10109 for { 10110 x := v.Args[0] 10111 y := v.Args[1] 10112 v.reset(OpARM64Equal) 10113 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10114 v0.AddArg(x) 10115 v0.AddArg(y) 10116 v.AddArg(v0) 10117 return true 10118 } 10119 } 10120 func rewriteValueARM64_OpEq64F(v *Value, config *Config) bool { 10121 b := v.Block 10122 _ = b 10123 // match: (Eq64F x y) 10124 // cond: 10125 // result: (Equal (FCMPD x y)) 10126 for { 10127 x := v.Args[0] 10128 y := v.Args[1] 10129 v.reset(OpARM64Equal) 10130 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10131 v0.AddArg(x) 10132 v0.AddArg(y) 10133 v.AddArg(v0) 10134 return true 10135 } 10136 } 10137 func rewriteValueARM64_OpEq8(v *Value, config *Config) bool { 10138 b := v.Block 10139 _ = b 10140 // match: (Eq8 x y) 10141 // cond: 10142 // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10143 for { 10144 x := v.Args[0] 10145 y := v.Args[1] 10146 v.reset(OpARM64Equal) 10147 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10148 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10149 v1.AddArg(x) 10150 v0.AddArg(v1) 10151 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10152 v2.AddArg(y) 10153 v0.AddArg(v2) 10154 v.AddArg(v0) 10155 return true 10156 } 10157 } 10158 func rewriteValueARM64_OpEqB(v *Value, config *Config) bool { 10159 b := v.Block 10160 _ = b 10161 // match: (EqB x y) 10162 // cond: 10163 // result: (XOR (MOVDconst [1]) (XOR <config.fe.TypeBool()> x y)) 10164 for { 10165 x := v.Args[0] 10166 y := v.Args[1] 10167 v.reset(OpARM64XOR) 10168 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 10169 v0.AuxInt = 1 10170 v.AddArg(v0) 10171 v1 := b.NewValue0(v.Line, OpARM64XOR, config.fe.TypeBool()) 10172 v1.AddArg(x) 10173 v1.AddArg(y) 10174 v.AddArg(v1) 10175 return true 10176 } 10177 } 10178 func rewriteValueARM64_OpEqPtr(v *Value, config *Config) bool { 10179 b := v.Block 10180 _ = b 10181 // match: (EqPtr x y) 10182 // cond: 10183 // result: (Equal (CMP x y)) 10184 for { 10185 x := v.Args[0] 10186 y := v.Args[1] 10187 v.reset(OpARM64Equal) 10188 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10189 v0.AddArg(x) 10190 v0.AddArg(y) 10191 v.AddArg(v0) 10192 return true 10193 } 10194 } 10195 func rewriteValueARM64_OpGeq16(v *Value, config *Config) bool { 10196 b := v.Block 10197 _ = b 10198 // match: (Geq16 x y) 10199 // cond: 10200 // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10201 for { 10202 x := v.Args[0] 10203 y := v.Args[1] 10204 v.reset(OpARM64GreaterEqual) 10205 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10206 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10207 v1.AddArg(x) 10208 v0.AddArg(v1) 10209 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10210 v2.AddArg(y) 10211 v0.AddArg(v2) 10212 v.AddArg(v0) 10213 return true 10214 } 10215 } 10216 func rewriteValueARM64_OpGeq16U(v *Value, config *Config) bool { 10217 b := v.Block 10218 _ = b 10219 // match: (Geq16U x y) 10220 // cond: 10221 // result: (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10222 for { 10223 x := v.Args[0] 10224 y := v.Args[1] 10225 v.reset(OpARM64GreaterEqualU) 10226 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10227 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10228 v1.AddArg(x) 10229 v0.AddArg(v1) 10230 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10231 v2.AddArg(y) 10232 v0.AddArg(v2) 10233 v.AddArg(v0) 10234 return true 10235 } 10236 } 10237 func rewriteValueARM64_OpGeq32(v *Value, config *Config) bool { 10238 b := v.Block 10239 _ = b 10240 // match: (Geq32 x y) 10241 // cond: 10242 // result: (GreaterEqual (CMPW x y)) 10243 for { 10244 x := v.Args[0] 10245 y := v.Args[1] 10246 v.reset(OpARM64GreaterEqual) 10247 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10248 v0.AddArg(x) 10249 v0.AddArg(y) 10250 v.AddArg(v0) 10251 return true 10252 } 10253 } 10254 func rewriteValueARM64_OpGeq32F(v *Value, config *Config) bool { 10255 b := v.Block 10256 _ = b 10257 // match: (Geq32F x y) 10258 // cond: 10259 // result: (GreaterEqual (FCMPS x y)) 10260 for { 10261 x := v.Args[0] 10262 y := v.Args[1] 10263 v.reset(OpARM64GreaterEqual) 10264 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10265 v0.AddArg(x) 10266 v0.AddArg(y) 10267 v.AddArg(v0) 10268 return true 10269 } 10270 } 10271 func rewriteValueARM64_OpGeq32U(v *Value, config *Config) bool { 10272 b := v.Block 10273 _ = b 10274 // match: (Geq32U x y) 10275 // cond: 10276 // result: (GreaterEqualU (CMPW x y)) 10277 for { 10278 x := v.Args[0] 10279 y := v.Args[1] 10280 v.reset(OpARM64GreaterEqualU) 10281 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10282 v0.AddArg(x) 10283 v0.AddArg(y) 10284 v.AddArg(v0) 10285 return true 10286 } 10287 } 10288 func rewriteValueARM64_OpGeq64(v *Value, config *Config) bool { 10289 b := v.Block 10290 _ = b 10291 // match: (Geq64 x y) 10292 // cond: 10293 // result: (GreaterEqual (CMP x y)) 10294 for { 10295 x := v.Args[0] 10296 y := v.Args[1] 10297 v.reset(OpARM64GreaterEqual) 10298 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10299 v0.AddArg(x) 10300 v0.AddArg(y) 10301 v.AddArg(v0) 10302 return true 10303 } 10304 } 10305 func rewriteValueARM64_OpGeq64F(v *Value, config *Config) bool { 10306 b := v.Block 10307 _ = b 10308 // match: (Geq64F x y) 10309 // cond: 10310 // result: (GreaterEqual (FCMPD x y)) 10311 for { 10312 x := v.Args[0] 10313 y := v.Args[1] 10314 v.reset(OpARM64GreaterEqual) 10315 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10316 v0.AddArg(x) 10317 v0.AddArg(y) 10318 v.AddArg(v0) 10319 return true 10320 } 10321 } 10322 func rewriteValueARM64_OpGeq64U(v *Value, config *Config) bool { 10323 b := v.Block 10324 _ = b 10325 // match: (Geq64U x y) 10326 // cond: 10327 // result: (GreaterEqualU (CMP x y)) 10328 for { 10329 x := v.Args[0] 10330 y := v.Args[1] 10331 v.reset(OpARM64GreaterEqualU) 10332 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10333 v0.AddArg(x) 10334 v0.AddArg(y) 10335 v.AddArg(v0) 10336 return true 10337 } 10338 } 10339 func rewriteValueARM64_OpGeq8(v *Value, config *Config) bool { 10340 b := v.Block 10341 _ = b 10342 // match: (Geq8 x y) 10343 // cond: 10344 // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10345 for { 10346 x := v.Args[0] 10347 y := v.Args[1] 10348 v.reset(OpARM64GreaterEqual) 10349 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10350 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10351 v1.AddArg(x) 10352 v0.AddArg(v1) 10353 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10354 v2.AddArg(y) 10355 v0.AddArg(v2) 10356 v.AddArg(v0) 10357 return true 10358 } 10359 } 10360 func rewriteValueARM64_OpGeq8U(v *Value, config *Config) bool { 10361 b := v.Block 10362 _ = b 10363 // match: (Geq8U x y) 10364 // cond: 10365 // result: (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10366 for { 10367 x := v.Args[0] 10368 y := v.Args[1] 10369 v.reset(OpARM64GreaterEqualU) 10370 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10371 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10372 v1.AddArg(x) 10373 v0.AddArg(v1) 10374 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10375 v2.AddArg(y) 10376 v0.AddArg(v2) 10377 v.AddArg(v0) 10378 return true 10379 } 10380 } 10381 func rewriteValueARM64_OpGetClosurePtr(v *Value, config *Config) bool { 10382 b := v.Block 10383 _ = b 10384 // match: (GetClosurePtr) 10385 // cond: 10386 // result: (LoweredGetClosurePtr) 10387 for { 10388 v.reset(OpARM64LoweredGetClosurePtr) 10389 return true 10390 } 10391 } 10392 func rewriteValueARM64_OpGoCall(v *Value, config *Config) bool { 10393 b := v.Block 10394 _ = b 10395 // match: (GoCall [argwid] mem) 10396 // cond: 10397 // result: (CALLgo [argwid] mem) 10398 for { 10399 argwid := v.AuxInt 10400 mem := v.Args[0] 10401 v.reset(OpARM64CALLgo) 10402 v.AuxInt = argwid 10403 v.AddArg(mem) 10404 return true 10405 } 10406 } 10407 func rewriteValueARM64_OpGreater16(v *Value, config *Config) bool { 10408 b := v.Block 10409 _ = b 10410 // match: (Greater16 x y) 10411 // cond: 10412 // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10413 for { 10414 x := v.Args[0] 10415 y := v.Args[1] 10416 v.reset(OpARM64GreaterThan) 10417 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10418 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10419 v1.AddArg(x) 10420 v0.AddArg(v1) 10421 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10422 v2.AddArg(y) 10423 v0.AddArg(v2) 10424 v.AddArg(v0) 10425 return true 10426 } 10427 } 10428 func rewriteValueARM64_OpGreater16U(v *Value, config *Config) bool { 10429 b := v.Block 10430 _ = b 10431 // match: (Greater16U x y) 10432 // cond: 10433 // result: (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10434 for { 10435 x := v.Args[0] 10436 y := v.Args[1] 10437 v.reset(OpARM64GreaterThanU) 10438 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10439 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10440 v1.AddArg(x) 10441 v0.AddArg(v1) 10442 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10443 v2.AddArg(y) 10444 v0.AddArg(v2) 10445 v.AddArg(v0) 10446 return true 10447 } 10448 } 10449 func rewriteValueARM64_OpGreater32(v *Value, config *Config) bool { 10450 b := v.Block 10451 _ = b 10452 // match: (Greater32 x y) 10453 // cond: 10454 // result: (GreaterThan (CMPW x y)) 10455 for { 10456 x := v.Args[0] 10457 y := v.Args[1] 10458 v.reset(OpARM64GreaterThan) 10459 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10460 v0.AddArg(x) 10461 v0.AddArg(y) 10462 v.AddArg(v0) 10463 return true 10464 } 10465 } 10466 func rewriteValueARM64_OpGreater32F(v *Value, config *Config) bool { 10467 b := v.Block 10468 _ = b 10469 // match: (Greater32F x y) 10470 // cond: 10471 // result: (GreaterThan (FCMPS x y)) 10472 for { 10473 x := v.Args[0] 10474 y := v.Args[1] 10475 v.reset(OpARM64GreaterThan) 10476 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10477 v0.AddArg(x) 10478 v0.AddArg(y) 10479 v.AddArg(v0) 10480 return true 10481 } 10482 } 10483 func rewriteValueARM64_OpGreater32U(v *Value, config *Config) bool { 10484 b := v.Block 10485 _ = b 10486 // match: (Greater32U x y) 10487 // cond: 10488 // result: (GreaterThanU (CMPW x y)) 10489 for { 10490 x := v.Args[0] 10491 y := v.Args[1] 10492 v.reset(OpARM64GreaterThanU) 10493 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10494 v0.AddArg(x) 10495 v0.AddArg(y) 10496 v.AddArg(v0) 10497 return true 10498 } 10499 } 10500 func rewriteValueARM64_OpGreater64(v *Value, config *Config) bool { 10501 b := v.Block 10502 _ = b 10503 // match: (Greater64 x y) 10504 // cond: 10505 // result: (GreaterThan (CMP x y)) 10506 for { 10507 x := v.Args[0] 10508 y := v.Args[1] 10509 v.reset(OpARM64GreaterThan) 10510 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10511 v0.AddArg(x) 10512 v0.AddArg(y) 10513 v.AddArg(v0) 10514 return true 10515 } 10516 } 10517 func rewriteValueARM64_OpGreater64F(v *Value, config *Config) bool { 10518 b := v.Block 10519 _ = b 10520 // match: (Greater64F x y) 10521 // cond: 10522 // result: (GreaterThan (FCMPD x y)) 10523 for { 10524 x := v.Args[0] 10525 y := v.Args[1] 10526 v.reset(OpARM64GreaterThan) 10527 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10528 v0.AddArg(x) 10529 v0.AddArg(y) 10530 v.AddArg(v0) 10531 return true 10532 } 10533 } 10534 func rewriteValueARM64_OpGreater64U(v *Value, config *Config) bool { 10535 b := v.Block 10536 _ = b 10537 // match: (Greater64U x y) 10538 // cond: 10539 // result: (GreaterThanU (CMP x y)) 10540 for { 10541 x := v.Args[0] 10542 y := v.Args[1] 10543 v.reset(OpARM64GreaterThanU) 10544 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10545 v0.AddArg(x) 10546 v0.AddArg(y) 10547 v.AddArg(v0) 10548 return true 10549 } 10550 } 10551 func rewriteValueARM64_OpGreater8(v *Value, config *Config) bool { 10552 b := v.Block 10553 _ = b 10554 // match: (Greater8 x y) 10555 // cond: 10556 // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10557 for { 10558 x := v.Args[0] 10559 y := v.Args[1] 10560 v.reset(OpARM64GreaterThan) 10561 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10562 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10563 v1.AddArg(x) 10564 v0.AddArg(v1) 10565 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10566 v2.AddArg(y) 10567 v0.AddArg(v2) 10568 v.AddArg(v0) 10569 return true 10570 } 10571 } 10572 func rewriteValueARM64_OpGreater8U(v *Value, config *Config) bool { 10573 b := v.Block 10574 _ = b 10575 // match: (Greater8U x y) 10576 // cond: 10577 // result: (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10578 for { 10579 x := v.Args[0] 10580 y := v.Args[1] 10581 v.reset(OpARM64GreaterThanU) 10582 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10583 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10584 v1.AddArg(x) 10585 v0.AddArg(v1) 10586 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10587 v2.AddArg(y) 10588 v0.AddArg(v2) 10589 v.AddArg(v0) 10590 return true 10591 } 10592 } 10593 func rewriteValueARM64_OpHmul16(v *Value, config *Config) bool { 10594 b := v.Block 10595 _ = b 10596 // match: (Hmul16 x y) 10597 // cond: 10598 // result: (SRAconst (MULW <config.fe.TypeInt32()> (SignExt16to32 x) (SignExt16to32 y)) [16]) 10599 for { 10600 x := v.Args[0] 10601 y := v.Args[1] 10602 v.reset(OpARM64SRAconst) 10603 v.AuxInt = 16 10604 v0 := b.NewValue0(v.Line, OpARM64MULW, config.fe.TypeInt32()) 10605 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10606 v1.AddArg(x) 10607 v0.AddArg(v1) 10608 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10609 v2.AddArg(y) 10610 v0.AddArg(v2) 10611 v.AddArg(v0) 10612 return true 10613 } 10614 } 10615 func rewriteValueARM64_OpHmul16u(v *Value, config *Config) bool { 10616 b := v.Block 10617 _ = b 10618 // match: (Hmul16u x y) 10619 // cond: 10620 // result: (SRLconst (MUL <config.fe.TypeUInt32()> (ZeroExt16to32 x) (ZeroExt16to32 y)) [16]) 10621 for { 10622 x := v.Args[0] 10623 y := v.Args[1] 10624 v.reset(OpARM64SRLconst) 10625 v.AuxInt = 16 10626 v0 := b.NewValue0(v.Line, OpARM64MUL, config.fe.TypeUInt32()) 10627 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10628 v1.AddArg(x) 10629 v0.AddArg(v1) 10630 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10631 v2.AddArg(y) 10632 v0.AddArg(v2) 10633 v.AddArg(v0) 10634 return true 10635 } 10636 } 10637 func rewriteValueARM64_OpHmul32(v *Value, config *Config) bool { 10638 b := v.Block 10639 _ = b 10640 // match: (Hmul32 x y) 10641 // cond: 10642 // result: (SRAconst (MULL <config.fe.TypeInt64()> x y) [32]) 10643 for { 10644 x := v.Args[0] 10645 y := v.Args[1] 10646 v.reset(OpARM64SRAconst) 10647 v.AuxInt = 32 10648 v0 := b.NewValue0(v.Line, OpARM64MULL, config.fe.TypeInt64()) 10649 v0.AddArg(x) 10650 v0.AddArg(y) 10651 v.AddArg(v0) 10652 return true 10653 } 10654 } 10655 func rewriteValueARM64_OpHmul32u(v *Value, config *Config) bool { 10656 b := v.Block 10657 _ = b 10658 // match: (Hmul32u x y) 10659 // cond: 10660 // result: (SRAconst (UMULL <config.fe.TypeUInt64()> x y) [32]) 10661 for { 10662 x := v.Args[0] 10663 y := v.Args[1] 10664 v.reset(OpARM64SRAconst) 10665 v.AuxInt = 32 10666 v0 := b.NewValue0(v.Line, OpARM64UMULL, config.fe.TypeUInt64()) 10667 v0.AddArg(x) 10668 v0.AddArg(y) 10669 v.AddArg(v0) 10670 return true 10671 } 10672 } 10673 func rewriteValueARM64_OpHmul64(v *Value, config *Config) bool { 10674 b := v.Block 10675 _ = b 10676 // match: (Hmul64 x y) 10677 // cond: 10678 // result: (MULH x y) 10679 for { 10680 x := v.Args[0] 10681 y := v.Args[1] 10682 v.reset(OpARM64MULH) 10683 v.AddArg(x) 10684 v.AddArg(y) 10685 return true 10686 } 10687 } 10688 func rewriteValueARM64_OpHmul64u(v *Value, config *Config) bool { 10689 b := v.Block 10690 _ = b 10691 // match: (Hmul64u x y) 10692 // cond: 10693 // result: (UMULH x y) 10694 for { 10695 x := v.Args[0] 10696 y := v.Args[1] 10697 v.reset(OpARM64UMULH) 10698 v.AddArg(x) 10699 v.AddArg(y) 10700 return true 10701 } 10702 } 10703 func rewriteValueARM64_OpHmul8(v *Value, config *Config) bool { 10704 b := v.Block 10705 _ = b 10706 // match: (Hmul8 x y) 10707 // cond: 10708 // result: (SRAconst (MULW <config.fe.TypeInt16()> (SignExt8to32 x) (SignExt8to32 y)) [8]) 10709 for { 10710 x := v.Args[0] 10711 y := v.Args[1] 10712 v.reset(OpARM64SRAconst) 10713 v.AuxInt = 8 10714 v0 := b.NewValue0(v.Line, OpARM64MULW, config.fe.TypeInt16()) 10715 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10716 v1.AddArg(x) 10717 v0.AddArg(v1) 10718 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10719 v2.AddArg(y) 10720 v0.AddArg(v2) 10721 v.AddArg(v0) 10722 return true 10723 } 10724 } 10725 func rewriteValueARM64_OpHmul8u(v *Value, config *Config) bool { 10726 b := v.Block 10727 _ = b 10728 // match: (Hmul8u x y) 10729 // cond: 10730 // result: (SRLconst (MUL <config.fe.TypeUInt16()> (ZeroExt8to32 x) (ZeroExt8to32 y)) [8]) 10731 for { 10732 x := v.Args[0] 10733 y := v.Args[1] 10734 v.reset(OpARM64SRLconst) 10735 v.AuxInt = 8 10736 v0 := b.NewValue0(v.Line, OpARM64MUL, config.fe.TypeUInt16()) 10737 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10738 v1.AddArg(x) 10739 v0.AddArg(v1) 10740 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10741 v2.AddArg(y) 10742 v0.AddArg(v2) 10743 v.AddArg(v0) 10744 return true 10745 } 10746 } 10747 func rewriteValueARM64_OpInterCall(v *Value, config *Config) bool { 10748 b := v.Block 10749 _ = b 10750 // match: (InterCall [argwid] entry mem) 10751 // cond: 10752 // result: (CALLinter [argwid] entry mem) 10753 for { 10754 argwid := v.AuxInt 10755 entry := v.Args[0] 10756 mem := v.Args[1] 10757 v.reset(OpARM64CALLinter) 10758 v.AuxInt = argwid 10759 v.AddArg(entry) 10760 v.AddArg(mem) 10761 return true 10762 } 10763 } 10764 func rewriteValueARM64_OpIsInBounds(v *Value, config *Config) bool { 10765 b := v.Block 10766 _ = b 10767 // match: (IsInBounds idx len) 10768 // cond: 10769 // result: (LessThanU (CMP idx len)) 10770 for { 10771 idx := v.Args[0] 10772 len := v.Args[1] 10773 v.reset(OpARM64LessThanU) 10774 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10775 v0.AddArg(idx) 10776 v0.AddArg(len) 10777 v.AddArg(v0) 10778 return true 10779 } 10780 } 10781 func rewriteValueARM64_OpIsNonNil(v *Value, config *Config) bool { 10782 b := v.Block 10783 _ = b 10784 // match: (IsNonNil ptr) 10785 // cond: 10786 // result: (NotEqual (CMPconst [0] ptr)) 10787 for { 10788 ptr := v.Args[0] 10789 v.reset(OpARM64NotEqual) 10790 v0 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 10791 v0.AuxInt = 0 10792 v0.AddArg(ptr) 10793 v.AddArg(v0) 10794 return true 10795 } 10796 } 10797 func rewriteValueARM64_OpIsSliceInBounds(v *Value, config *Config) bool { 10798 b := v.Block 10799 _ = b 10800 // match: (IsSliceInBounds idx len) 10801 // cond: 10802 // result: (LessEqualU (CMP idx len)) 10803 for { 10804 idx := v.Args[0] 10805 len := v.Args[1] 10806 v.reset(OpARM64LessEqualU) 10807 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10808 v0.AddArg(idx) 10809 v0.AddArg(len) 10810 v.AddArg(v0) 10811 return true 10812 } 10813 } 10814 func rewriteValueARM64_OpLeq16(v *Value, config *Config) bool { 10815 b := v.Block 10816 _ = b 10817 // match: (Leq16 x y) 10818 // cond: 10819 // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) 10820 for { 10821 x := v.Args[0] 10822 y := v.Args[1] 10823 v.reset(OpARM64LessEqual) 10824 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10825 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10826 v1.AddArg(x) 10827 v0.AddArg(v1) 10828 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 10829 v2.AddArg(y) 10830 v0.AddArg(v2) 10831 v.AddArg(v0) 10832 return true 10833 } 10834 } 10835 func rewriteValueARM64_OpLeq16U(v *Value, config *Config) bool { 10836 b := v.Block 10837 _ = b 10838 // match: (Leq16U x y) 10839 // cond: 10840 // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 10841 for { 10842 x := v.Args[0] 10843 y := v.Args[1] 10844 v.reset(OpARM64LessEqualU) 10845 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10846 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10847 v1.AddArg(x) 10848 v0.AddArg(v1) 10849 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 10850 v2.AddArg(y) 10851 v0.AddArg(v2) 10852 v.AddArg(v0) 10853 return true 10854 } 10855 } 10856 func rewriteValueARM64_OpLeq32(v *Value, config *Config) bool { 10857 b := v.Block 10858 _ = b 10859 // match: (Leq32 x y) 10860 // cond: 10861 // result: (LessEqual (CMPW x y)) 10862 for { 10863 x := v.Args[0] 10864 y := v.Args[1] 10865 v.reset(OpARM64LessEqual) 10866 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10867 v0.AddArg(x) 10868 v0.AddArg(y) 10869 v.AddArg(v0) 10870 return true 10871 } 10872 } 10873 func rewriteValueARM64_OpLeq32F(v *Value, config *Config) bool { 10874 b := v.Block 10875 _ = b 10876 // match: (Leq32F x y) 10877 // cond: 10878 // result: (GreaterEqual (FCMPS y x)) 10879 for { 10880 x := v.Args[0] 10881 y := v.Args[1] 10882 v.reset(OpARM64GreaterEqual) 10883 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 10884 v0.AddArg(y) 10885 v0.AddArg(x) 10886 v.AddArg(v0) 10887 return true 10888 } 10889 } 10890 func rewriteValueARM64_OpLeq32U(v *Value, config *Config) bool { 10891 b := v.Block 10892 _ = b 10893 // match: (Leq32U x y) 10894 // cond: 10895 // result: (LessEqualU (CMPW x y)) 10896 for { 10897 x := v.Args[0] 10898 y := v.Args[1] 10899 v.reset(OpARM64LessEqualU) 10900 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10901 v0.AddArg(x) 10902 v0.AddArg(y) 10903 v.AddArg(v0) 10904 return true 10905 } 10906 } 10907 func rewriteValueARM64_OpLeq64(v *Value, config *Config) bool { 10908 b := v.Block 10909 _ = b 10910 // match: (Leq64 x y) 10911 // cond: 10912 // result: (LessEqual (CMP x y)) 10913 for { 10914 x := v.Args[0] 10915 y := v.Args[1] 10916 v.reset(OpARM64LessEqual) 10917 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10918 v0.AddArg(x) 10919 v0.AddArg(y) 10920 v.AddArg(v0) 10921 return true 10922 } 10923 } 10924 func rewriteValueARM64_OpLeq64F(v *Value, config *Config) bool { 10925 b := v.Block 10926 _ = b 10927 // match: (Leq64F x y) 10928 // cond: 10929 // result: (GreaterEqual (FCMPD y x)) 10930 for { 10931 x := v.Args[0] 10932 y := v.Args[1] 10933 v.reset(OpARM64GreaterEqual) 10934 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 10935 v0.AddArg(y) 10936 v0.AddArg(x) 10937 v.AddArg(v0) 10938 return true 10939 } 10940 } 10941 func rewriteValueARM64_OpLeq64U(v *Value, config *Config) bool { 10942 b := v.Block 10943 _ = b 10944 // match: (Leq64U x y) 10945 // cond: 10946 // result: (LessEqualU (CMP x y)) 10947 for { 10948 x := v.Args[0] 10949 y := v.Args[1] 10950 v.reset(OpARM64LessEqualU) 10951 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 10952 v0.AddArg(x) 10953 v0.AddArg(y) 10954 v.AddArg(v0) 10955 return true 10956 } 10957 } 10958 func rewriteValueARM64_OpLeq8(v *Value, config *Config) bool { 10959 b := v.Block 10960 _ = b 10961 // match: (Leq8 x y) 10962 // cond: 10963 // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) 10964 for { 10965 x := v.Args[0] 10966 y := v.Args[1] 10967 v.reset(OpARM64LessEqual) 10968 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10969 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10970 v1.AddArg(x) 10971 v0.AddArg(v1) 10972 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 10973 v2.AddArg(y) 10974 v0.AddArg(v2) 10975 v.AddArg(v0) 10976 return true 10977 } 10978 } 10979 func rewriteValueARM64_OpLeq8U(v *Value, config *Config) bool { 10980 b := v.Block 10981 _ = b 10982 // match: (Leq8U x y) 10983 // cond: 10984 // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 10985 for { 10986 x := v.Args[0] 10987 y := v.Args[1] 10988 v.reset(OpARM64LessEqualU) 10989 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 10990 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10991 v1.AddArg(x) 10992 v0.AddArg(v1) 10993 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 10994 v2.AddArg(y) 10995 v0.AddArg(v2) 10996 v.AddArg(v0) 10997 return true 10998 } 10999 } 11000 func rewriteValueARM64_OpLess16(v *Value, config *Config) bool { 11001 b := v.Block 11002 _ = b 11003 // match: (Less16 x y) 11004 // cond: 11005 // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) 11006 for { 11007 x := v.Args[0] 11008 y := v.Args[1] 11009 v.reset(OpARM64LessThan) 11010 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11011 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 11012 v1.AddArg(x) 11013 v0.AddArg(v1) 11014 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 11015 v2.AddArg(y) 11016 v0.AddArg(v2) 11017 v.AddArg(v0) 11018 return true 11019 } 11020 } 11021 func rewriteValueARM64_OpLess16U(v *Value, config *Config) bool { 11022 b := v.Block 11023 _ = b 11024 // match: (Less16U x y) 11025 // cond: 11026 // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 11027 for { 11028 x := v.Args[0] 11029 y := v.Args[1] 11030 v.reset(OpARM64LessThanU) 11031 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11032 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 11033 v1.AddArg(x) 11034 v0.AddArg(v1) 11035 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 11036 v2.AddArg(y) 11037 v0.AddArg(v2) 11038 v.AddArg(v0) 11039 return true 11040 } 11041 } 11042 func rewriteValueARM64_OpLess32(v *Value, config *Config) bool { 11043 b := v.Block 11044 _ = b 11045 // match: (Less32 x y) 11046 // cond: 11047 // result: (LessThan (CMPW x y)) 11048 for { 11049 x := v.Args[0] 11050 y := v.Args[1] 11051 v.reset(OpARM64LessThan) 11052 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11053 v0.AddArg(x) 11054 v0.AddArg(y) 11055 v.AddArg(v0) 11056 return true 11057 } 11058 } 11059 func rewriteValueARM64_OpLess32F(v *Value, config *Config) bool { 11060 b := v.Block 11061 _ = b 11062 // match: (Less32F x y) 11063 // cond: 11064 // result: (GreaterThan (FCMPS y x)) 11065 for { 11066 x := v.Args[0] 11067 y := v.Args[1] 11068 v.reset(OpARM64GreaterThan) 11069 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 11070 v0.AddArg(y) 11071 v0.AddArg(x) 11072 v.AddArg(v0) 11073 return true 11074 } 11075 } 11076 func rewriteValueARM64_OpLess32U(v *Value, config *Config) bool { 11077 b := v.Block 11078 _ = b 11079 // match: (Less32U x y) 11080 // cond: 11081 // result: (LessThanU (CMPW x y)) 11082 for { 11083 x := v.Args[0] 11084 y := v.Args[1] 11085 v.reset(OpARM64LessThanU) 11086 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11087 v0.AddArg(x) 11088 v0.AddArg(y) 11089 v.AddArg(v0) 11090 return true 11091 } 11092 } 11093 func rewriteValueARM64_OpLess64(v *Value, config *Config) bool { 11094 b := v.Block 11095 _ = b 11096 // match: (Less64 x y) 11097 // cond: 11098 // result: (LessThan (CMP x y)) 11099 for { 11100 x := v.Args[0] 11101 y := v.Args[1] 11102 v.reset(OpARM64LessThan) 11103 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 11104 v0.AddArg(x) 11105 v0.AddArg(y) 11106 v.AddArg(v0) 11107 return true 11108 } 11109 } 11110 func rewriteValueARM64_OpLess64F(v *Value, config *Config) bool { 11111 b := v.Block 11112 _ = b 11113 // match: (Less64F x y) 11114 // cond: 11115 // result: (GreaterThan (FCMPD y x)) 11116 for { 11117 x := v.Args[0] 11118 y := v.Args[1] 11119 v.reset(OpARM64GreaterThan) 11120 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 11121 v0.AddArg(y) 11122 v0.AddArg(x) 11123 v.AddArg(v0) 11124 return true 11125 } 11126 } 11127 func rewriteValueARM64_OpLess64U(v *Value, config *Config) bool { 11128 b := v.Block 11129 _ = b 11130 // match: (Less64U x y) 11131 // cond: 11132 // result: (LessThanU (CMP x y)) 11133 for { 11134 x := v.Args[0] 11135 y := v.Args[1] 11136 v.reset(OpARM64LessThanU) 11137 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 11138 v0.AddArg(x) 11139 v0.AddArg(y) 11140 v.AddArg(v0) 11141 return true 11142 } 11143 } 11144 func rewriteValueARM64_OpLess8(v *Value, config *Config) bool { 11145 b := v.Block 11146 _ = b 11147 // match: (Less8 x y) 11148 // cond: 11149 // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) 11150 for { 11151 x := v.Args[0] 11152 y := v.Args[1] 11153 v.reset(OpARM64LessThan) 11154 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11155 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 11156 v1.AddArg(x) 11157 v0.AddArg(v1) 11158 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 11159 v2.AddArg(y) 11160 v0.AddArg(v2) 11161 v.AddArg(v0) 11162 return true 11163 } 11164 } 11165 func rewriteValueARM64_OpLess8U(v *Value, config *Config) bool { 11166 b := v.Block 11167 _ = b 11168 // match: (Less8U x y) 11169 // cond: 11170 // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 11171 for { 11172 x := v.Args[0] 11173 y := v.Args[1] 11174 v.reset(OpARM64LessThanU) 11175 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 11176 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 11177 v1.AddArg(x) 11178 v0.AddArg(v1) 11179 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 11180 v2.AddArg(y) 11181 v0.AddArg(v2) 11182 v.AddArg(v0) 11183 return true 11184 } 11185 } 11186 func rewriteValueARM64_OpLoad(v *Value, config *Config) bool { 11187 b := v.Block 11188 _ = b 11189 // match: (Load <t> ptr mem) 11190 // cond: t.IsBoolean() 11191 // result: (MOVBUload ptr mem) 11192 for { 11193 t := v.Type 11194 ptr := v.Args[0] 11195 mem := v.Args[1] 11196 if !(t.IsBoolean()) { 11197 break 11198 } 11199 v.reset(OpARM64MOVBUload) 11200 v.AddArg(ptr) 11201 v.AddArg(mem) 11202 return true 11203 } 11204 // match: (Load <t> ptr mem) 11205 // cond: (is8BitInt(t) && isSigned(t)) 11206 // result: (MOVBload ptr mem) 11207 for { 11208 t := v.Type 11209 ptr := v.Args[0] 11210 mem := v.Args[1] 11211 if !(is8BitInt(t) && isSigned(t)) { 11212 break 11213 } 11214 v.reset(OpARM64MOVBload) 11215 v.AddArg(ptr) 11216 v.AddArg(mem) 11217 return true 11218 } 11219 // match: (Load <t> ptr mem) 11220 // cond: (is8BitInt(t) && !isSigned(t)) 11221 // result: (MOVBUload ptr mem) 11222 for { 11223 t := v.Type 11224 ptr := v.Args[0] 11225 mem := v.Args[1] 11226 if !(is8BitInt(t) && !isSigned(t)) { 11227 break 11228 } 11229 v.reset(OpARM64MOVBUload) 11230 v.AddArg(ptr) 11231 v.AddArg(mem) 11232 return true 11233 } 11234 // match: (Load <t> ptr mem) 11235 // cond: (is16BitInt(t) && isSigned(t)) 11236 // result: (MOVHload ptr mem) 11237 for { 11238 t := v.Type 11239 ptr := v.Args[0] 11240 mem := v.Args[1] 11241 if !(is16BitInt(t) && isSigned(t)) { 11242 break 11243 } 11244 v.reset(OpARM64MOVHload) 11245 v.AddArg(ptr) 11246 v.AddArg(mem) 11247 return true 11248 } 11249 // match: (Load <t> ptr mem) 11250 // cond: (is16BitInt(t) && !isSigned(t)) 11251 // result: (MOVHUload ptr mem) 11252 for { 11253 t := v.Type 11254 ptr := v.Args[0] 11255 mem := v.Args[1] 11256 if !(is16BitInt(t) && !isSigned(t)) { 11257 break 11258 } 11259 v.reset(OpARM64MOVHUload) 11260 v.AddArg(ptr) 11261 v.AddArg(mem) 11262 return true 11263 } 11264 // match: (Load <t> ptr mem) 11265 // cond: (is32BitInt(t) && isSigned(t)) 11266 // result: (MOVWload ptr mem) 11267 for { 11268 t := v.Type 11269 ptr := v.Args[0] 11270 mem := v.Args[1] 11271 if !(is32BitInt(t) && isSigned(t)) { 11272 break 11273 } 11274 v.reset(OpARM64MOVWload) 11275 v.AddArg(ptr) 11276 v.AddArg(mem) 11277 return true 11278 } 11279 // match: (Load <t> ptr mem) 11280 // cond: (is32BitInt(t) && !isSigned(t)) 11281 // result: (MOVWUload ptr mem) 11282 for { 11283 t := v.Type 11284 ptr := v.Args[0] 11285 mem := v.Args[1] 11286 if !(is32BitInt(t) && !isSigned(t)) { 11287 break 11288 } 11289 v.reset(OpARM64MOVWUload) 11290 v.AddArg(ptr) 11291 v.AddArg(mem) 11292 return true 11293 } 11294 // match: (Load <t> ptr mem) 11295 // cond: (is64BitInt(t) || isPtr(t)) 11296 // result: (MOVDload ptr mem) 11297 for { 11298 t := v.Type 11299 ptr := v.Args[0] 11300 mem := v.Args[1] 11301 if !(is64BitInt(t) || isPtr(t)) { 11302 break 11303 } 11304 v.reset(OpARM64MOVDload) 11305 v.AddArg(ptr) 11306 v.AddArg(mem) 11307 return true 11308 } 11309 // match: (Load <t> ptr mem) 11310 // cond: is32BitFloat(t) 11311 // result: (FMOVSload ptr mem) 11312 for { 11313 t := v.Type 11314 ptr := v.Args[0] 11315 mem := v.Args[1] 11316 if !(is32BitFloat(t)) { 11317 break 11318 } 11319 v.reset(OpARM64FMOVSload) 11320 v.AddArg(ptr) 11321 v.AddArg(mem) 11322 return true 11323 } 11324 // match: (Load <t> ptr mem) 11325 // cond: is64BitFloat(t) 11326 // result: (FMOVDload ptr mem) 11327 for { 11328 t := v.Type 11329 ptr := v.Args[0] 11330 mem := v.Args[1] 11331 if !(is64BitFloat(t)) { 11332 break 11333 } 11334 v.reset(OpARM64FMOVDload) 11335 v.AddArg(ptr) 11336 v.AddArg(mem) 11337 return true 11338 } 11339 return false 11340 } 11341 func rewriteValueARM64_OpLrot16(v *Value, config *Config) bool { 11342 b := v.Block 11343 _ = b 11344 // match: (Lrot16 <t> x [c]) 11345 // cond: 11346 // result: (OR (SLLconst <t> x [c&15]) (SRLconst <t> (ZeroExt16to64 x) [16-c&15])) 11347 for { 11348 t := v.Type 11349 c := v.AuxInt 11350 x := v.Args[0] 11351 v.reset(OpARM64OR) 11352 v0 := b.NewValue0(v.Line, OpARM64SLLconst, t) 11353 v0.AuxInt = c & 15 11354 v0.AddArg(x) 11355 v.AddArg(v0) 11356 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 11357 v1.AuxInt = 16 - c&15 11358 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11359 v2.AddArg(x) 11360 v1.AddArg(v2) 11361 v.AddArg(v1) 11362 return true 11363 } 11364 } 11365 func rewriteValueARM64_OpLrot32(v *Value, config *Config) bool { 11366 b := v.Block 11367 _ = b 11368 // match: (Lrot32 x [c]) 11369 // cond: 11370 // result: (RORWconst x [32-c&31]) 11371 for { 11372 c := v.AuxInt 11373 x := v.Args[0] 11374 v.reset(OpARM64RORWconst) 11375 v.AuxInt = 32 - c&31 11376 v.AddArg(x) 11377 return true 11378 } 11379 } 11380 func rewriteValueARM64_OpLrot64(v *Value, config *Config) bool { 11381 b := v.Block 11382 _ = b 11383 // match: (Lrot64 x [c]) 11384 // cond: 11385 // result: (RORconst x [64-c&63]) 11386 for { 11387 c := v.AuxInt 11388 x := v.Args[0] 11389 v.reset(OpARM64RORconst) 11390 v.AuxInt = 64 - c&63 11391 v.AddArg(x) 11392 return true 11393 } 11394 } 11395 func rewriteValueARM64_OpLrot8(v *Value, config *Config) bool { 11396 b := v.Block 11397 _ = b 11398 // match: (Lrot8 <t> x [c]) 11399 // cond: 11400 // result: (OR (SLLconst <t> x [c&7]) (SRLconst <t> (ZeroExt8to64 x) [8-c&7])) 11401 for { 11402 t := v.Type 11403 c := v.AuxInt 11404 x := v.Args[0] 11405 v.reset(OpARM64OR) 11406 v0 := b.NewValue0(v.Line, OpARM64SLLconst, t) 11407 v0.AuxInt = c & 7 11408 v0.AddArg(x) 11409 v.AddArg(v0) 11410 v1 := b.NewValue0(v.Line, OpARM64SRLconst, t) 11411 v1.AuxInt = 8 - c&7 11412 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11413 v2.AddArg(x) 11414 v1.AddArg(v2) 11415 v.AddArg(v1) 11416 return true 11417 } 11418 } 11419 func rewriteValueARM64_OpLsh16x16(v *Value, config *Config) bool { 11420 b := v.Block 11421 _ = b 11422 // match: (Lsh16x16 <t> x y) 11423 // cond: 11424 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11425 for { 11426 t := v.Type 11427 x := v.Args[0] 11428 y := v.Args[1] 11429 v.reset(OpARM64CSELULT) 11430 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11431 v0.AddArg(x) 11432 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11433 v1.AddArg(y) 11434 v0.AddArg(v1) 11435 v.AddArg(v0) 11436 v2 := b.NewValue0(v.Line, OpConst64, t) 11437 v2.AuxInt = 0 11438 v.AddArg(v2) 11439 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11440 v3.AuxInt = 64 11441 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11442 v4.AddArg(y) 11443 v3.AddArg(v4) 11444 v.AddArg(v3) 11445 return true 11446 } 11447 } 11448 func rewriteValueARM64_OpLsh16x32(v *Value, config *Config) bool { 11449 b := v.Block 11450 _ = b 11451 // match: (Lsh16x32 <t> x y) 11452 // cond: 11453 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11454 for { 11455 t := v.Type 11456 x := v.Args[0] 11457 y := v.Args[1] 11458 v.reset(OpARM64CSELULT) 11459 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11460 v0.AddArg(x) 11461 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11462 v1.AddArg(y) 11463 v0.AddArg(v1) 11464 v.AddArg(v0) 11465 v2 := b.NewValue0(v.Line, OpConst64, t) 11466 v2.AuxInt = 0 11467 v.AddArg(v2) 11468 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11469 v3.AuxInt = 64 11470 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11471 v4.AddArg(y) 11472 v3.AddArg(v4) 11473 v.AddArg(v3) 11474 return true 11475 } 11476 } 11477 func rewriteValueARM64_OpLsh16x64(v *Value, config *Config) bool { 11478 b := v.Block 11479 _ = b 11480 // match: (Lsh16x64 x (MOVDconst [c])) 11481 // cond: uint64(c) < 16 11482 // result: (SLLconst x [c]) 11483 for { 11484 x := v.Args[0] 11485 v_1 := v.Args[1] 11486 if v_1.Op != OpARM64MOVDconst { 11487 break 11488 } 11489 c := v_1.AuxInt 11490 if !(uint64(c) < 16) { 11491 break 11492 } 11493 v.reset(OpARM64SLLconst) 11494 v.AuxInt = c 11495 v.AddArg(x) 11496 return true 11497 } 11498 // match: (Lsh16x64 _ (MOVDconst [c])) 11499 // cond: uint64(c) >= 16 11500 // result: (MOVDconst [0]) 11501 for { 11502 v_1 := v.Args[1] 11503 if v_1.Op != OpARM64MOVDconst { 11504 break 11505 } 11506 c := v_1.AuxInt 11507 if !(uint64(c) >= 16) { 11508 break 11509 } 11510 v.reset(OpARM64MOVDconst) 11511 v.AuxInt = 0 11512 return true 11513 } 11514 // match: (Lsh16x64 <t> x y) 11515 // cond: 11516 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11517 for { 11518 t := v.Type 11519 x := v.Args[0] 11520 y := v.Args[1] 11521 v.reset(OpARM64CSELULT) 11522 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11523 v0.AddArg(x) 11524 v0.AddArg(y) 11525 v.AddArg(v0) 11526 v1 := b.NewValue0(v.Line, OpConst64, t) 11527 v1.AuxInt = 0 11528 v.AddArg(v1) 11529 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11530 v2.AuxInt = 64 11531 v2.AddArg(y) 11532 v.AddArg(v2) 11533 return true 11534 } 11535 } 11536 func rewriteValueARM64_OpLsh16x8(v *Value, config *Config) bool { 11537 b := v.Block 11538 _ = b 11539 // match: (Lsh16x8 <t> x y) 11540 // cond: 11541 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11542 for { 11543 t := v.Type 11544 x := v.Args[0] 11545 y := v.Args[1] 11546 v.reset(OpARM64CSELULT) 11547 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11548 v0.AddArg(x) 11549 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11550 v1.AddArg(y) 11551 v0.AddArg(v1) 11552 v.AddArg(v0) 11553 v2 := b.NewValue0(v.Line, OpConst64, t) 11554 v2.AuxInt = 0 11555 v.AddArg(v2) 11556 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11557 v3.AuxInt = 64 11558 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11559 v4.AddArg(y) 11560 v3.AddArg(v4) 11561 v.AddArg(v3) 11562 return true 11563 } 11564 } 11565 func rewriteValueARM64_OpLsh32x16(v *Value, config *Config) bool { 11566 b := v.Block 11567 _ = b 11568 // match: (Lsh32x16 <t> x y) 11569 // cond: 11570 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11571 for { 11572 t := v.Type 11573 x := v.Args[0] 11574 y := v.Args[1] 11575 v.reset(OpARM64CSELULT) 11576 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11577 v0.AddArg(x) 11578 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11579 v1.AddArg(y) 11580 v0.AddArg(v1) 11581 v.AddArg(v0) 11582 v2 := b.NewValue0(v.Line, OpConst64, t) 11583 v2.AuxInt = 0 11584 v.AddArg(v2) 11585 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11586 v3.AuxInt = 64 11587 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11588 v4.AddArg(y) 11589 v3.AddArg(v4) 11590 v.AddArg(v3) 11591 return true 11592 } 11593 } 11594 func rewriteValueARM64_OpLsh32x32(v *Value, config *Config) bool { 11595 b := v.Block 11596 _ = b 11597 // match: (Lsh32x32 <t> x y) 11598 // cond: 11599 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11600 for { 11601 t := v.Type 11602 x := v.Args[0] 11603 y := v.Args[1] 11604 v.reset(OpARM64CSELULT) 11605 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11606 v0.AddArg(x) 11607 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11608 v1.AddArg(y) 11609 v0.AddArg(v1) 11610 v.AddArg(v0) 11611 v2 := b.NewValue0(v.Line, OpConst64, t) 11612 v2.AuxInt = 0 11613 v.AddArg(v2) 11614 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11615 v3.AuxInt = 64 11616 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11617 v4.AddArg(y) 11618 v3.AddArg(v4) 11619 v.AddArg(v3) 11620 return true 11621 } 11622 } 11623 func rewriteValueARM64_OpLsh32x64(v *Value, config *Config) bool { 11624 b := v.Block 11625 _ = b 11626 // match: (Lsh32x64 x (MOVDconst [c])) 11627 // cond: uint64(c) < 32 11628 // result: (SLLconst x [c]) 11629 for { 11630 x := v.Args[0] 11631 v_1 := v.Args[1] 11632 if v_1.Op != OpARM64MOVDconst { 11633 break 11634 } 11635 c := v_1.AuxInt 11636 if !(uint64(c) < 32) { 11637 break 11638 } 11639 v.reset(OpARM64SLLconst) 11640 v.AuxInt = c 11641 v.AddArg(x) 11642 return true 11643 } 11644 // match: (Lsh32x64 _ (MOVDconst [c])) 11645 // cond: uint64(c) >= 32 11646 // result: (MOVDconst [0]) 11647 for { 11648 v_1 := v.Args[1] 11649 if v_1.Op != OpARM64MOVDconst { 11650 break 11651 } 11652 c := v_1.AuxInt 11653 if !(uint64(c) >= 32) { 11654 break 11655 } 11656 v.reset(OpARM64MOVDconst) 11657 v.AuxInt = 0 11658 return true 11659 } 11660 // match: (Lsh32x64 <t> x y) 11661 // cond: 11662 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11663 for { 11664 t := v.Type 11665 x := v.Args[0] 11666 y := v.Args[1] 11667 v.reset(OpARM64CSELULT) 11668 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11669 v0.AddArg(x) 11670 v0.AddArg(y) 11671 v.AddArg(v0) 11672 v1 := b.NewValue0(v.Line, OpConst64, t) 11673 v1.AuxInt = 0 11674 v.AddArg(v1) 11675 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11676 v2.AuxInt = 64 11677 v2.AddArg(y) 11678 v.AddArg(v2) 11679 return true 11680 } 11681 } 11682 func rewriteValueARM64_OpLsh32x8(v *Value, config *Config) bool { 11683 b := v.Block 11684 _ = b 11685 // match: (Lsh32x8 <t> x y) 11686 // cond: 11687 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11688 for { 11689 t := v.Type 11690 x := v.Args[0] 11691 y := v.Args[1] 11692 v.reset(OpARM64CSELULT) 11693 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11694 v0.AddArg(x) 11695 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11696 v1.AddArg(y) 11697 v0.AddArg(v1) 11698 v.AddArg(v0) 11699 v2 := b.NewValue0(v.Line, OpConst64, t) 11700 v2.AuxInt = 0 11701 v.AddArg(v2) 11702 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11703 v3.AuxInt = 64 11704 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11705 v4.AddArg(y) 11706 v3.AddArg(v4) 11707 v.AddArg(v3) 11708 return true 11709 } 11710 } 11711 func rewriteValueARM64_OpLsh64x16(v *Value, config *Config) bool { 11712 b := v.Block 11713 _ = b 11714 // match: (Lsh64x16 <t> x y) 11715 // cond: 11716 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11717 for { 11718 t := v.Type 11719 x := v.Args[0] 11720 y := v.Args[1] 11721 v.reset(OpARM64CSELULT) 11722 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11723 v0.AddArg(x) 11724 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11725 v1.AddArg(y) 11726 v0.AddArg(v1) 11727 v.AddArg(v0) 11728 v2 := b.NewValue0(v.Line, OpConst64, t) 11729 v2.AuxInt = 0 11730 v.AddArg(v2) 11731 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11732 v3.AuxInt = 64 11733 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11734 v4.AddArg(y) 11735 v3.AddArg(v4) 11736 v.AddArg(v3) 11737 return true 11738 } 11739 } 11740 func rewriteValueARM64_OpLsh64x32(v *Value, config *Config) bool { 11741 b := v.Block 11742 _ = b 11743 // match: (Lsh64x32 <t> x y) 11744 // cond: 11745 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11746 for { 11747 t := v.Type 11748 x := v.Args[0] 11749 y := v.Args[1] 11750 v.reset(OpARM64CSELULT) 11751 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11752 v0.AddArg(x) 11753 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11754 v1.AddArg(y) 11755 v0.AddArg(v1) 11756 v.AddArg(v0) 11757 v2 := b.NewValue0(v.Line, OpConst64, t) 11758 v2.AuxInt = 0 11759 v.AddArg(v2) 11760 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11761 v3.AuxInt = 64 11762 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11763 v4.AddArg(y) 11764 v3.AddArg(v4) 11765 v.AddArg(v3) 11766 return true 11767 } 11768 } 11769 func rewriteValueARM64_OpLsh64x64(v *Value, config *Config) bool { 11770 b := v.Block 11771 _ = b 11772 // match: (Lsh64x64 x (MOVDconst [c])) 11773 // cond: uint64(c) < 64 11774 // result: (SLLconst x [c]) 11775 for { 11776 x := v.Args[0] 11777 v_1 := v.Args[1] 11778 if v_1.Op != OpARM64MOVDconst { 11779 break 11780 } 11781 c := v_1.AuxInt 11782 if !(uint64(c) < 64) { 11783 break 11784 } 11785 v.reset(OpARM64SLLconst) 11786 v.AuxInt = c 11787 v.AddArg(x) 11788 return true 11789 } 11790 // match: (Lsh64x64 _ (MOVDconst [c])) 11791 // cond: uint64(c) >= 64 11792 // result: (MOVDconst [0]) 11793 for { 11794 v_1 := v.Args[1] 11795 if v_1.Op != OpARM64MOVDconst { 11796 break 11797 } 11798 c := v_1.AuxInt 11799 if !(uint64(c) >= 64) { 11800 break 11801 } 11802 v.reset(OpARM64MOVDconst) 11803 v.AuxInt = 0 11804 return true 11805 } 11806 // match: (Lsh64x64 <t> x y) 11807 // cond: 11808 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11809 for { 11810 t := v.Type 11811 x := v.Args[0] 11812 y := v.Args[1] 11813 v.reset(OpARM64CSELULT) 11814 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11815 v0.AddArg(x) 11816 v0.AddArg(y) 11817 v.AddArg(v0) 11818 v1 := b.NewValue0(v.Line, OpConst64, t) 11819 v1.AuxInt = 0 11820 v.AddArg(v1) 11821 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11822 v2.AuxInt = 64 11823 v2.AddArg(y) 11824 v.AddArg(v2) 11825 return true 11826 } 11827 } 11828 func rewriteValueARM64_OpLsh64x8(v *Value, config *Config) bool { 11829 b := v.Block 11830 _ = b 11831 // match: (Lsh64x8 <t> x y) 11832 // cond: 11833 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11834 for { 11835 t := v.Type 11836 x := v.Args[0] 11837 y := v.Args[1] 11838 v.reset(OpARM64CSELULT) 11839 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11840 v0.AddArg(x) 11841 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11842 v1.AddArg(y) 11843 v0.AddArg(v1) 11844 v.AddArg(v0) 11845 v2 := b.NewValue0(v.Line, OpConst64, t) 11846 v2.AuxInt = 0 11847 v.AddArg(v2) 11848 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11849 v3.AuxInt = 64 11850 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11851 v4.AddArg(y) 11852 v3.AddArg(v4) 11853 v.AddArg(v3) 11854 return true 11855 } 11856 } 11857 func rewriteValueARM64_OpLsh8x16(v *Value, config *Config) bool { 11858 b := v.Block 11859 _ = b 11860 // match: (Lsh8x16 <t> x y) 11861 // cond: 11862 // result: (CSELULT (SLL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 11863 for { 11864 t := v.Type 11865 x := v.Args[0] 11866 y := v.Args[1] 11867 v.reset(OpARM64CSELULT) 11868 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11869 v0.AddArg(x) 11870 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11871 v1.AddArg(y) 11872 v0.AddArg(v1) 11873 v.AddArg(v0) 11874 v2 := b.NewValue0(v.Line, OpConst64, t) 11875 v2.AuxInt = 0 11876 v.AddArg(v2) 11877 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11878 v3.AuxInt = 64 11879 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 11880 v4.AddArg(y) 11881 v3.AddArg(v4) 11882 v.AddArg(v3) 11883 return true 11884 } 11885 } 11886 func rewriteValueARM64_OpLsh8x32(v *Value, config *Config) bool { 11887 b := v.Block 11888 _ = b 11889 // match: (Lsh8x32 <t> x y) 11890 // cond: 11891 // result: (CSELULT (SLL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 11892 for { 11893 t := v.Type 11894 x := v.Args[0] 11895 y := v.Args[1] 11896 v.reset(OpARM64CSELULT) 11897 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11898 v0.AddArg(x) 11899 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11900 v1.AddArg(y) 11901 v0.AddArg(v1) 11902 v.AddArg(v0) 11903 v2 := b.NewValue0(v.Line, OpConst64, t) 11904 v2.AuxInt = 0 11905 v.AddArg(v2) 11906 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11907 v3.AuxInt = 64 11908 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 11909 v4.AddArg(y) 11910 v3.AddArg(v4) 11911 v.AddArg(v3) 11912 return true 11913 } 11914 } 11915 func rewriteValueARM64_OpLsh8x64(v *Value, config *Config) bool { 11916 b := v.Block 11917 _ = b 11918 // match: (Lsh8x64 x (MOVDconst [c])) 11919 // cond: uint64(c) < 8 11920 // result: (SLLconst x [c]) 11921 for { 11922 x := v.Args[0] 11923 v_1 := v.Args[1] 11924 if v_1.Op != OpARM64MOVDconst { 11925 break 11926 } 11927 c := v_1.AuxInt 11928 if !(uint64(c) < 8) { 11929 break 11930 } 11931 v.reset(OpARM64SLLconst) 11932 v.AuxInt = c 11933 v.AddArg(x) 11934 return true 11935 } 11936 // match: (Lsh8x64 _ (MOVDconst [c])) 11937 // cond: uint64(c) >= 8 11938 // result: (MOVDconst [0]) 11939 for { 11940 v_1 := v.Args[1] 11941 if v_1.Op != OpARM64MOVDconst { 11942 break 11943 } 11944 c := v_1.AuxInt 11945 if !(uint64(c) >= 8) { 11946 break 11947 } 11948 v.reset(OpARM64MOVDconst) 11949 v.AuxInt = 0 11950 return true 11951 } 11952 // match: (Lsh8x64 <t> x y) 11953 // cond: 11954 // result: (CSELULT (SLL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 11955 for { 11956 t := v.Type 11957 x := v.Args[0] 11958 y := v.Args[1] 11959 v.reset(OpARM64CSELULT) 11960 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11961 v0.AddArg(x) 11962 v0.AddArg(y) 11963 v.AddArg(v0) 11964 v1 := b.NewValue0(v.Line, OpConst64, t) 11965 v1.AuxInt = 0 11966 v.AddArg(v1) 11967 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11968 v2.AuxInt = 64 11969 v2.AddArg(y) 11970 v.AddArg(v2) 11971 return true 11972 } 11973 } 11974 func rewriteValueARM64_OpLsh8x8(v *Value, config *Config) bool { 11975 b := v.Block 11976 _ = b 11977 // match: (Lsh8x8 <t> x y) 11978 // cond: 11979 // result: (CSELULT (SLL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 11980 for { 11981 t := v.Type 11982 x := v.Args[0] 11983 y := v.Args[1] 11984 v.reset(OpARM64CSELULT) 11985 v0 := b.NewValue0(v.Line, OpARM64SLL, t) 11986 v0.AddArg(x) 11987 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11988 v1.AddArg(y) 11989 v0.AddArg(v1) 11990 v.AddArg(v0) 11991 v2 := b.NewValue0(v.Line, OpConst64, t) 11992 v2.AuxInt = 0 11993 v.AddArg(v2) 11994 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 11995 v3.AuxInt = 64 11996 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 11997 v4.AddArg(y) 11998 v3.AddArg(v4) 11999 v.AddArg(v3) 12000 return true 12001 } 12002 } 12003 func rewriteValueARM64_OpMod16(v *Value, config *Config) bool { 12004 b := v.Block 12005 _ = b 12006 // match: (Mod16 x y) 12007 // cond: 12008 // result: (MODW (SignExt16to32 x) (SignExt16to32 y)) 12009 for { 12010 x := v.Args[0] 12011 y := v.Args[1] 12012 v.reset(OpARM64MODW) 12013 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 12014 v0.AddArg(x) 12015 v.AddArg(v0) 12016 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 12017 v1.AddArg(y) 12018 v.AddArg(v1) 12019 return true 12020 } 12021 } 12022 func rewriteValueARM64_OpMod16u(v *Value, config *Config) bool { 12023 b := v.Block 12024 _ = b 12025 // match: (Mod16u x y) 12026 // cond: 12027 // result: (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y)) 12028 for { 12029 x := v.Args[0] 12030 y := v.Args[1] 12031 v.reset(OpARM64UMODW) 12032 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12033 v0.AddArg(x) 12034 v.AddArg(v0) 12035 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12036 v1.AddArg(y) 12037 v.AddArg(v1) 12038 return true 12039 } 12040 } 12041 func rewriteValueARM64_OpMod32(v *Value, config *Config) bool { 12042 b := v.Block 12043 _ = b 12044 // match: (Mod32 x y) 12045 // cond: 12046 // result: (MODW x y) 12047 for { 12048 x := v.Args[0] 12049 y := v.Args[1] 12050 v.reset(OpARM64MODW) 12051 v.AddArg(x) 12052 v.AddArg(y) 12053 return true 12054 } 12055 } 12056 func rewriteValueARM64_OpMod32u(v *Value, config *Config) bool { 12057 b := v.Block 12058 _ = b 12059 // match: (Mod32u x y) 12060 // cond: 12061 // result: (UMODW x y) 12062 for { 12063 x := v.Args[0] 12064 y := v.Args[1] 12065 v.reset(OpARM64UMODW) 12066 v.AddArg(x) 12067 v.AddArg(y) 12068 return true 12069 } 12070 } 12071 func rewriteValueARM64_OpMod64(v *Value, config *Config) bool { 12072 b := v.Block 12073 _ = b 12074 // match: (Mod64 x y) 12075 // cond: 12076 // result: (MOD x y) 12077 for { 12078 x := v.Args[0] 12079 y := v.Args[1] 12080 v.reset(OpARM64MOD) 12081 v.AddArg(x) 12082 v.AddArg(y) 12083 return true 12084 } 12085 } 12086 func rewriteValueARM64_OpMod64u(v *Value, config *Config) bool { 12087 b := v.Block 12088 _ = b 12089 // match: (Mod64u x y) 12090 // cond: 12091 // result: (UMOD x y) 12092 for { 12093 x := v.Args[0] 12094 y := v.Args[1] 12095 v.reset(OpARM64UMOD) 12096 v.AddArg(x) 12097 v.AddArg(y) 12098 return true 12099 } 12100 } 12101 func rewriteValueARM64_OpMod8(v *Value, config *Config) bool { 12102 b := v.Block 12103 _ = b 12104 // match: (Mod8 x y) 12105 // cond: 12106 // result: (MODW (SignExt8to32 x) (SignExt8to32 y)) 12107 for { 12108 x := v.Args[0] 12109 y := v.Args[1] 12110 v.reset(OpARM64MODW) 12111 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 12112 v0.AddArg(x) 12113 v.AddArg(v0) 12114 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 12115 v1.AddArg(y) 12116 v.AddArg(v1) 12117 return true 12118 } 12119 } 12120 func rewriteValueARM64_OpMod8u(v *Value, config *Config) bool { 12121 b := v.Block 12122 _ = b 12123 // match: (Mod8u x y) 12124 // cond: 12125 // result: (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y)) 12126 for { 12127 x := v.Args[0] 12128 y := v.Args[1] 12129 v.reset(OpARM64UMODW) 12130 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12131 v0.AddArg(x) 12132 v.AddArg(v0) 12133 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12134 v1.AddArg(y) 12135 v.AddArg(v1) 12136 return true 12137 } 12138 } 12139 func rewriteValueARM64_OpMove(v *Value, config *Config) bool { 12140 b := v.Block 12141 _ = b 12142 // match: (Move [s] _ _ mem) 12143 // cond: SizeAndAlign(s).Size() == 0 12144 // result: mem 12145 for { 12146 s := v.AuxInt 12147 mem := v.Args[2] 12148 if !(SizeAndAlign(s).Size() == 0) { 12149 break 12150 } 12151 v.reset(OpCopy) 12152 v.Type = mem.Type 12153 v.AddArg(mem) 12154 return true 12155 } 12156 // match: (Move [s] dst src mem) 12157 // cond: SizeAndAlign(s).Size() == 1 12158 // result: (MOVBstore dst (MOVBUload src mem) mem) 12159 for { 12160 s := v.AuxInt 12161 dst := v.Args[0] 12162 src := v.Args[1] 12163 mem := v.Args[2] 12164 if !(SizeAndAlign(s).Size() == 1) { 12165 break 12166 } 12167 v.reset(OpARM64MOVBstore) 12168 v.AddArg(dst) 12169 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12170 v0.AddArg(src) 12171 v0.AddArg(mem) 12172 v.AddArg(v0) 12173 v.AddArg(mem) 12174 return true 12175 } 12176 // match: (Move [s] dst src mem) 12177 // cond: SizeAndAlign(s).Size() == 2 12178 // result: (MOVHstore dst (MOVHUload src mem) mem) 12179 for { 12180 s := v.AuxInt 12181 dst := v.Args[0] 12182 src := v.Args[1] 12183 mem := v.Args[2] 12184 if !(SizeAndAlign(s).Size() == 2) { 12185 break 12186 } 12187 v.reset(OpARM64MOVHstore) 12188 v.AddArg(dst) 12189 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12190 v0.AddArg(src) 12191 v0.AddArg(mem) 12192 v.AddArg(v0) 12193 v.AddArg(mem) 12194 return true 12195 } 12196 // match: (Move [s] dst src mem) 12197 // cond: SizeAndAlign(s).Size() == 4 12198 // result: (MOVWstore dst (MOVWUload src mem) mem) 12199 for { 12200 s := v.AuxInt 12201 dst := v.Args[0] 12202 src := v.Args[1] 12203 mem := v.Args[2] 12204 if !(SizeAndAlign(s).Size() == 4) { 12205 break 12206 } 12207 v.reset(OpARM64MOVWstore) 12208 v.AddArg(dst) 12209 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12210 v0.AddArg(src) 12211 v0.AddArg(mem) 12212 v.AddArg(v0) 12213 v.AddArg(mem) 12214 return true 12215 } 12216 // match: (Move [s] dst src mem) 12217 // cond: SizeAndAlign(s).Size() == 8 12218 // result: (MOVDstore dst (MOVDload src mem) mem) 12219 for { 12220 s := v.AuxInt 12221 dst := v.Args[0] 12222 src := v.Args[1] 12223 mem := v.Args[2] 12224 if !(SizeAndAlign(s).Size() == 8) { 12225 break 12226 } 12227 v.reset(OpARM64MOVDstore) 12228 v.AddArg(dst) 12229 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12230 v0.AddArg(src) 12231 v0.AddArg(mem) 12232 v.AddArg(v0) 12233 v.AddArg(mem) 12234 return true 12235 } 12236 // match: (Move [s] dst src mem) 12237 // cond: SizeAndAlign(s).Size() == 3 12238 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 12239 for { 12240 s := v.AuxInt 12241 dst := v.Args[0] 12242 src := v.Args[1] 12243 mem := v.Args[2] 12244 if !(SizeAndAlign(s).Size() == 3) { 12245 break 12246 } 12247 v.reset(OpARM64MOVBstore) 12248 v.AuxInt = 2 12249 v.AddArg(dst) 12250 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12251 v0.AuxInt = 2 12252 v0.AddArg(src) 12253 v0.AddArg(mem) 12254 v.AddArg(v0) 12255 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 12256 v1.AddArg(dst) 12257 v2 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12258 v2.AddArg(src) 12259 v2.AddArg(mem) 12260 v1.AddArg(v2) 12261 v1.AddArg(mem) 12262 v.AddArg(v1) 12263 return true 12264 } 12265 // match: (Move [s] dst src mem) 12266 // cond: SizeAndAlign(s).Size() == 5 12267 // result: (MOVBstore [4] dst (MOVBUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12268 for { 12269 s := v.AuxInt 12270 dst := v.Args[0] 12271 src := v.Args[1] 12272 mem := v.Args[2] 12273 if !(SizeAndAlign(s).Size() == 5) { 12274 break 12275 } 12276 v.reset(OpARM64MOVBstore) 12277 v.AuxInt = 4 12278 v.AddArg(dst) 12279 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12280 v0.AuxInt = 4 12281 v0.AddArg(src) 12282 v0.AddArg(mem) 12283 v.AddArg(v0) 12284 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12285 v1.AddArg(dst) 12286 v2 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12287 v2.AddArg(src) 12288 v2.AddArg(mem) 12289 v1.AddArg(v2) 12290 v1.AddArg(mem) 12291 v.AddArg(v1) 12292 return true 12293 } 12294 // match: (Move [s] dst src mem) 12295 // cond: SizeAndAlign(s).Size() == 6 12296 // result: (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem)) 12297 for { 12298 s := v.AuxInt 12299 dst := v.Args[0] 12300 src := v.Args[1] 12301 mem := v.Args[2] 12302 if !(SizeAndAlign(s).Size() == 6) { 12303 break 12304 } 12305 v.reset(OpARM64MOVHstore) 12306 v.AuxInt = 4 12307 v.AddArg(dst) 12308 v0 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12309 v0.AuxInt = 4 12310 v0.AddArg(src) 12311 v0.AddArg(mem) 12312 v.AddArg(v0) 12313 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12314 v1.AddArg(dst) 12315 v2 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12316 v2.AddArg(src) 12317 v2.AddArg(mem) 12318 v1.AddArg(v2) 12319 v1.AddArg(mem) 12320 v.AddArg(v1) 12321 return true 12322 } 12323 // match: (Move [s] dst src mem) 12324 // cond: SizeAndAlign(s).Size() == 7 12325 // result: (MOVBstore [6] dst (MOVBUload [6] src mem) (MOVHstore [4] dst (MOVHUload [4] src mem) (MOVWstore dst (MOVWUload src mem) mem))) 12326 for { 12327 s := v.AuxInt 12328 dst := v.Args[0] 12329 src := v.Args[1] 12330 mem := v.Args[2] 12331 if !(SizeAndAlign(s).Size() == 7) { 12332 break 12333 } 12334 v.reset(OpARM64MOVBstore) 12335 v.AuxInt = 6 12336 v.AddArg(dst) 12337 v0 := b.NewValue0(v.Line, OpARM64MOVBUload, config.fe.TypeUInt8()) 12338 v0.AuxInt = 6 12339 v0.AddArg(src) 12340 v0.AddArg(mem) 12341 v.AddArg(v0) 12342 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 12343 v1.AuxInt = 4 12344 v1.AddArg(dst) 12345 v2 := b.NewValue0(v.Line, OpARM64MOVHUload, config.fe.TypeUInt16()) 12346 v2.AuxInt = 4 12347 v2.AddArg(src) 12348 v2.AddArg(mem) 12349 v1.AddArg(v2) 12350 v3 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 12351 v3.AddArg(dst) 12352 v4 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12353 v4.AddArg(src) 12354 v4.AddArg(mem) 12355 v3.AddArg(v4) 12356 v3.AddArg(mem) 12357 v1.AddArg(v3) 12358 v.AddArg(v1) 12359 return true 12360 } 12361 // match: (Move [s] dst src mem) 12362 // cond: SizeAndAlign(s).Size() == 12 12363 // result: (MOVWstore [8] dst (MOVWUload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12364 for { 12365 s := v.AuxInt 12366 dst := v.Args[0] 12367 src := v.Args[1] 12368 mem := v.Args[2] 12369 if !(SizeAndAlign(s).Size() == 12) { 12370 break 12371 } 12372 v.reset(OpARM64MOVWstore) 12373 v.AuxInt = 8 12374 v.AddArg(dst) 12375 v0 := b.NewValue0(v.Line, OpARM64MOVWUload, config.fe.TypeUInt32()) 12376 v0.AuxInt = 8 12377 v0.AddArg(src) 12378 v0.AddArg(mem) 12379 v.AddArg(v0) 12380 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12381 v1.AddArg(dst) 12382 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12383 v2.AddArg(src) 12384 v2.AddArg(mem) 12385 v1.AddArg(v2) 12386 v1.AddArg(mem) 12387 v.AddArg(v1) 12388 return true 12389 } 12390 // match: (Move [s] dst src mem) 12391 // cond: SizeAndAlign(s).Size() == 16 12392 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 12393 for { 12394 s := v.AuxInt 12395 dst := v.Args[0] 12396 src := v.Args[1] 12397 mem := v.Args[2] 12398 if !(SizeAndAlign(s).Size() == 16) { 12399 break 12400 } 12401 v.reset(OpARM64MOVDstore) 12402 v.AuxInt = 8 12403 v.AddArg(dst) 12404 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12405 v0.AuxInt = 8 12406 v0.AddArg(src) 12407 v0.AddArg(mem) 12408 v.AddArg(v0) 12409 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12410 v1.AddArg(dst) 12411 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12412 v2.AddArg(src) 12413 v2.AddArg(mem) 12414 v1.AddArg(v2) 12415 v1.AddArg(mem) 12416 v.AddArg(v1) 12417 return true 12418 } 12419 // match: (Move [s] dst src mem) 12420 // cond: SizeAndAlign(s).Size() == 24 12421 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 12422 for { 12423 s := v.AuxInt 12424 dst := v.Args[0] 12425 src := v.Args[1] 12426 mem := v.Args[2] 12427 if !(SizeAndAlign(s).Size() == 24) { 12428 break 12429 } 12430 v.reset(OpARM64MOVDstore) 12431 v.AuxInt = 16 12432 v.AddArg(dst) 12433 v0 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12434 v0.AuxInt = 16 12435 v0.AddArg(src) 12436 v0.AddArg(mem) 12437 v.AddArg(v0) 12438 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12439 v1.AuxInt = 8 12440 v1.AddArg(dst) 12441 v2 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12442 v2.AuxInt = 8 12443 v2.AddArg(src) 12444 v2.AddArg(mem) 12445 v1.AddArg(v2) 12446 v3 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 12447 v3.AddArg(dst) 12448 v4 := b.NewValue0(v.Line, OpARM64MOVDload, config.fe.TypeUInt64()) 12449 v4.AddArg(src) 12450 v4.AddArg(mem) 12451 v3.AddArg(v4) 12452 v3.AddArg(mem) 12453 v1.AddArg(v3) 12454 v.AddArg(v1) 12455 return true 12456 } 12457 // match: (Move [s] dst src mem) 12458 // cond: SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8 12459 // 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)) 12460 for { 12461 s := v.AuxInt 12462 dst := v.Args[0] 12463 src := v.Args[1] 12464 mem := v.Args[2] 12465 if !(SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8) { 12466 break 12467 } 12468 v.reset(OpMove) 12469 v.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64() 12470 v0 := b.NewValue0(v.Line, OpOffPtr, dst.Type) 12471 v0.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 12472 v0.AddArg(dst) 12473 v.AddArg(v0) 12474 v1 := b.NewValue0(v.Line, OpOffPtr, src.Type) 12475 v1.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 12476 v1.AddArg(src) 12477 v.AddArg(v1) 12478 v2 := b.NewValue0(v.Line, OpMove, TypeMem) 12479 v2.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64() 12480 v2.AddArg(dst) 12481 v2.AddArg(src) 12482 v2.AddArg(mem) 12483 v.AddArg(v2) 12484 return true 12485 } 12486 // match: (Move [s] dst src mem) 12487 // cond: SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice 12488 // result: (DUFFCOPY [8 * (128 - int64(SizeAndAlign(s).Size()/8))] dst src mem) 12489 for { 12490 s := v.AuxInt 12491 dst := v.Args[0] 12492 src := v.Args[1] 12493 mem := v.Args[2] 12494 if !(SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice) { 12495 break 12496 } 12497 v.reset(OpARM64DUFFCOPY) 12498 v.AuxInt = 8 * (128 - int64(SizeAndAlign(s).Size()/8)) 12499 v.AddArg(dst) 12500 v.AddArg(src) 12501 v.AddArg(mem) 12502 return true 12503 } 12504 // match: (Move [s] dst src mem) 12505 // cond: SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size()%8 == 0 12506 // result: (LoweredMove dst src (ADDconst <src.Type> src [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) mem) 12507 for { 12508 s := v.AuxInt 12509 dst := v.Args[0] 12510 src := v.Args[1] 12511 mem := v.Args[2] 12512 if !(SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size()%8 == 0) { 12513 break 12514 } 12515 v.reset(OpARM64LoweredMove) 12516 v.AddArg(dst) 12517 v.AddArg(src) 12518 v0 := b.NewValue0(v.Line, OpARM64ADDconst, src.Type) 12519 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 12520 v0.AddArg(src) 12521 v.AddArg(v0) 12522 v.AddArg(mem) 12523 return true 12524 } 12525 return false 12526 } 12527 func rewriteValueARM64_OpMul16(v *Value, config *Config) bool { 12528 b := v.Block 12529 _ = b 12530 // match: (Mul16 x y) 12531 // cond: 12532 // result: (MULW x y) 12533 for { 12534 x := v.Args[0] 12535 y := v.Args[1] 12536 v.reset(OpARM64MULW) 12537 v.AddArg(x) 12538 v.AddArg(y) 12539 return true 12540 } 12541 } 12542 func rewriteValueARM64_OpMul32(v *Value, config *Config) bool { 12543 b := v.Block 12544 _ = b 12545 // match: (Mul32 x y) 12546 // cond: 12547 // result: (MULW x y) 12548 for { 12549 x := v.Args[0] 12550 y := v.Args[1] 12551 v.reset(OpARM64MULW) 12552 v.AddArg(x) 12553 v.AddArg(y) 12554 return true 12555 } 12556 } 12557 func rewriteValueARM64_OpMul32F(v *Value, config *Config) bool { 12558 b := v.Block 12559 _ = b 12560 // match: (Mul32F x y) 12561 // cond: 12562 // result: (FMULS x y) 12563 for { 12564 x := v.Args[0] 12565 y := v.Args[1] 12566 v.reset(OpARM64FMULS) 12567 v.AddArg(x) 12568 v.AddArg(y) 12569 return true 12570 } 12571 } 12572 func rewriteValueARM64_OpMul64(v *Value, config *Config) bool { 12573 b := v.Block 12574 _ = b 12575 // match: (Mul64 x y) 12576 // cond: 12577 // result: (MUL x y) 12578 for { 12579 x := v.Args[0] 12580 y := v.Args[1] 12581 v.reset(OpARM64MUL) 12582 v.AddArg(x) 12583 v.AddArg(y) 12584 return true 12585 } 12586 } 12587 func rewriteValueARM64_OpMul64F(v *Value, config *Config) bool { 12588 b := v.Block 12589 _ = b 12590 // match: (Mul64F x y) 12591 // cond: 12592 // result: (FMULD x y) 12593 for { 12594 x := v.Args[0] 12595 y := v.Args[1] 12596 v.reset(OpARM64FMULD) 12597 v.AddArg(x) 12598 v.AddArg(y) 12599 return true 12600 } 12601 } 12602 func rewriteValueARM64_OpMul8(v *Value, config *Config) bool { 12603 b := v.Block 12604 _ = b 12605 // match: (Mul8 x y) 12606 // cond: 12607 // result: (MULW x y) 12608 for { 12609 x := v.Args[0] 12610 y := v.Args[1] 12611 v.reset(OpARM64MULW) 12612 v.AddArg(x) 12613 v.AddArg(y) 12614 return true 12615 } 12616 } 12617 func rewriteValueARM64_OpNeg16(v *Value, config *Config) bool { 12618 b := v.Block 12619 _ = b 12620 // match: (Neg16 x) 12621 // cond: 12622 // result: (NEG x) 12623 for { 12624 x := v.Args[0] 12625 v.reset(OpARM64NEG) 12626 v.AddArg(x) 12627 return true 12628 } 12629 } 12630 func rewriteValueARM64_OpNeg32(v *Value, config *Config) bool { 12631 b := v.Block 12632 _ = b 12633 // match: (Neg32 x) 12634 // cond: 12635 // result: (NEG x) 12636 for { 12637 x := v.Args[0] 12638 v.reset(OpARM64NEG) 12639 v.AddArg(x) 12640 return true 12641 } 12642 } 12643 func rewriteValueARM64_OpNeg32F(v *Value, config *Config) bool { 12644 b := v.Block 12645 _ = b 12646 // match: (Neg32F x) 12647 // cond: 12648 // result: (FNEGS x) 12649 for { 12650 x := v.Args[0] 12651 v.reset(OpARM64FNEGS) 12652 v.AddArg(x) 12653 return true 12654 } 12655 } 12656 func rewriteValueARM64_OpNeg64(v *Value, config *Config) bool { 12657 b := v.Block 12658 _ = b 12659 // match: (Neg64 x) 12660 // cond: 12661 // result: (NEG x) 12662 for { 12663 x := v.Args[0] 12664 v.reset(OpARM64NEG) 12665 v.AddArg(x) 12666 return true 12667 } 12668 } 12669 func rewriteValueARM64_OpNeg64F(v *Value, config *Config) bool { 12670 b := v.Block 12671 _ = b 12672 // match: (Neg64F x) 12673 // cond: 12674 // result: (FNEGD x) 12675 for { 12676 x := v.Args[0] 12677 v.reset(OpARM64FNEGD) 12678 v.AddArg(x) 12679 return true 12680 } 12681 } 12682 func rewriteValueARM64_OpNeg8(v *Value, config *Config) bool { 12683 b := v.Block 12684 _ = b 12685 // match: (Neg8 x) 12686 // cond: 12687 // result: (NEG x) 12688 for { 12689 x := v.Args[0] 12690 v.reset(OpARM64NEG) 12691 v.AddArg(x) 12692 return true 12693 } 12694 } 12695 func rewriteValueARM64_OpNeq16(v *Value, config *Config) bool { 12696 b := v.Block 12697 _ = b 12698 // match: (Neq16 x y) 12699 // cond: 12700 // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) 12701 for { 12702 x := v.Args[0] 12703 y := v.Args[1] 12704 v.reset(OpARM64NotEqual) 12705 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12706 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12707 v1.AddArg(x) 12708 v0.AddArg(v1) 12709 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 12710 v2.AddArg(y) 12711 v0.AddArg(v2) 12712 v.AddArg(v0) 12713 return true 12714 } 12715 } 12716 func rewriteValueARM64_OpNeq32(v *Value, config *Config) bool { 12717 b := v.Block 12718 _ = b 12719 // match: (Neq32 x y) 12720 // cond: 12721 // result: (NotEqual (CMPW x y)) 12722 for { 12723 x := v.Args[0] 12724 y := v.Args[1] 12725 v.reset(OpARM64NotEqual) 12726 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12727 v0.AddArg(x) 12728 v0.AddArg(y) 12729 v.AddArg(v0) 12730 return true 12731 } 12732 } 12733 func rewriteValueARM64_OpNeq32F(v *Value, config *Config) bool { 12734 b := v.Block 12735 _ = b 12736 // match: (Neq32F x y) 12737 // cond: 12738 // result: (NotEqual (FCMPS x y)) 12739 for { 12740 x := v.Args[0] 12741 y := v.Args[1] 12742 v.reset(OpARM64NotEqual) 12743 v0 := b.NewValue0(v.Line, OpARM64FCMPS, TypeFlags) 12744 v0.AddArg(x) 12745 v0.AddArg(y) 12746 v.AddArg(v0) 12747 return true 12748 } 12749 } 12750 func rewriteValueARM64_OpNeq64(v *Value, config *Config) bool { 12751 b := v.Block 12752 _ = b 12753 // match: (Neq64 x y) 12754 // cond: 12755 // result: (NotEqual (CMP x y)) 12756 for { 12757 x := v.Args[0] 12758 y := v.Args[1] 12759 v.reset(OpARM64NotEqual) 12760 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 12761 v0.AddArg(x) 12762 v0.AddArg(y) 12763 v.AddArg(v0) 12764 return true 12765 } 12766 } 12767 func rewriteValueARM64_OpNeq64F(v *Value, config *Config) bool { 12768 b := v.Block 12769 _ = b 12770 // match: (Neq64F x y) 12771 // cond: 12772 // result: (NotEqual (FCMPD x y)) 12773 for { 12774 x := v.Args[0] 12775 y := v.Args[1] 12776 v.reset(OpARM64NotEqual) 12777 v0 := b.NewValue0(v.Line, OpARM64FCMPD, TypeFlags) 12778 v0.AddArg(x) 12779 v0.AddArg(y) 12780 v.AddArg(v0) 12781 return true 12782 } 12783 } 12784 func rewriteValueARM64_OpNeq8(v *Value, config *Config) bool { 12785 b := v.Block 12786 _ = b 12787 // match: (Neq8 x y) 12788 // cond: 12789 // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) 12790 for { 12791 x := v.Args[0] 12792 y := v.Args[1] 12793 v.reset(OpARM64NotEqual) 12794 v0 := b.NewValue0(v.Line, OpARM64CMPW, TypeFlags) 12795 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12796 v1.AddArg(x) 12797 v0.AddArg(v1) 12798 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 12799 v2.AddArg(y) 12800 v0.AddArg(v2) 12801 v.AddArg(v0) 12802 return true 12803 } 12804 } 12805 func rewriteValueARM64_OpNeqB(v *Value, config *Config) bool { 12806 b := v.Block 12807 _ = b 12808 // match: (NeqB x y) 12809 // cond: 12810 // result: (XOR x y) 12811 for { 12812 x := v.Args[0] 12813 y := v.Args[1] 12814 v.reset(OpARM64XOR) 12815 v.AddArg(x) 12816 v.AddArg(y) 12817 return true 12818 } 12819 } 12820 func rewriteValueARM64_OpNeqPtr(v *Value, config *Config) bool { 12821 b := v.Block 12822 _ = b 12823 // match: (NeqPtr x y) 12824 // cond: 12825 // result: (NotEqual (CMP x y)) 12826 for { 12827 x := v.Args[0] 12828 y := v.Args[1] 12829 v.reset(OpARM64NotEqual) 12830 v0 := b.NewValue0(v.Line, OpARM64CMP, TypeFlags) 12831 v0.AddArg(x) 12832 v0.AddArg(y) 12833 v.AddArg(v0) 12834 return true 12835 } 12836 } 12837 func rewriteValueARM64_OpNilCheck(v *Value, config *Config) bool { 12838 b := v.Block 12839 _ = b 12840 // match: (NilCheck ptr mem) 12841 // cond: 12842 // result: (LoweredNilCheck ptr mem) 12843 for { 12844 ptr := v.Args[0] 12845 mem := v.Args[1] 12846 v.reset(OpARM64LoweredNilCheck) 12847 v.AddArg(ptr) 12848 v.AddArg(mem) 12849 return true 12850 } 12851 } 12852 func rewriteValueARM64_OpNot(v *Value, config *Config) bool { 12853 b := v.Block 12854 _ = b 12855 // match: (Not x) 12856 // cond: 12857 // result: (XOR (MOVDconst [1]) x) 12858 for { 12859 x := v.Args[0] 12860 v.reset(OpARM64XOR) 12861 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 12862 v0.AuxInt = 1 12863 v.AddArg(v0) 12864 v.AddArg(x) 12865 return true 12866 } 12867 } 12868 func rewriteValueARM64_OpOffPtr(v *Value, config *Config) bool { 12869 b := v.Block 12870 _ = b 12871 // match: (OffPtr [off] ptr:(SP)) 12872 // cond: 12873 // result: (MOVDaddr [off] ptr) 12874 for { 12875 off := v.AuxInt 12876 ptr := v.Args[0] 12877 if ptr.Op != OpSP { 12878 break 12879 } 12880 v.reset(OpARM64MOVDaddr) 12881 v.AuxInt = off 12882 v.AddArg(ptr) 12883 return true 12884 } 12885 // match: (OffPtr [off] ptr) 12886 // cond: 12887 // result: (ADDconst [off] ptr) 12888 for { 12889 off := v.AuxInt 12890 ptr := v.Args[0] 12891 v.reset(OpARM64ADDconst) 12892 v.AuxInt = off 12893 v.AddArg(ptr) 12894 return true 12895 } 12896 } 12897 func rewriteValueARM64_OpOr16(v *Value, config *Config) bool { 12898 b := v.Block 12899 _ = b 12900 // match: (Or16 x y) 12901 // cond: 12902 // result: (OR x y) 12903 for { 12904 x := v.Args[0] 12905 y := v.Args[1] 12906 v.reset(OpARM64OR) 12907 v.AddArg(x) 12908 v.AddArg(y) 12909 return true 12910 } 12911 } 12912 func rewriteValueARM64_OpOr32(v *Value, config *Config) bool { 12913 b := v.Block 12914 _ = b 12915 // match: (Or32 x y) 12916 // cond: 12917 // result: (OR x y) 12918 for { 12919 x := v.Args[0] 12920 y := v.Args[1] 12921 v.reset(OpARM64OR) 12922 v.AddArg(x) 12923 v.AddArg(y) 12924 return true 12925 } 12926 } 12927 func rewriteValueARM64_OpOr64(v *Value, config *Config) bool { 12928 b := v.Block 12929 _ = b 12930 // match: (Or64 x y) 12931 // cond: 12932 // result: (OR x y) 12933 for { 12934 x := v.Args[0] 12935 y := v.Args[1] 12936 v.reset(OpARM64OR) 12937 v.AddArg(x) 12938 v.AddArg(y) 12939 return true 12940 } 12941 } 12942 func rewriteValueARM64_OpOr8(v *Value, config *Config) bool { 12943 b := v.Block 12944 _ = b 12945 // match: (Or8 x y) 12946 // cond: 12947 // result: (OR x y) 12948 for { 12949 x := v.Args[0] 12950 y := v.Args[1] 12951 v.reset(OpARM64OR) 12952 v.AddArg(x) 12953 v.AddArg(y) 12954 return true 12955 } 12956 } 12957 func rewriteValueARM64_OpOrB(v *Value, config *Config) bool { 12958 b := v.Block 12959 _ = b 12960 // match: (OrB x y) 12961 // cond: 12962 // result: (OR x y) 12963 for { 12964 x := v.Args[0] 12965 y := v.Args[1] 12966 v.reset(OpARM64OR) 12967 v.AddArg(x) 12968 v.AddArg(y) 12969 return true 12970 } 12971 } 12972 func rewriteValueARM64_OpRsh16Ux16(v *Value, config *Config) bool { 12973 b := v.Block 12974 _ = b 12975 // match: (Rsh16Ux16 <t> x y) 12976 // cond: 12977 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 12978 for { 12979 t := v.Type 12980 x := v.Args[0] 12981 y := v.Args[1] 12982 v.reset(OpARM64CSELULT) 12983 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 12984 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12985 v1.AddArg(x) 12986 v0.AddArg(v1) 12987 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12988 v2.AddArg(y) 12989 v0.AddArg(v2) 12990 v.AddArg(v0) 12991 v3 := b.NewValue0(v.Line, OpConst64, t) 12992 v3.AuxInt = 0 12993 v.AddArg(v3) 12994 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 12995 v4.AuxInt = 64 12996 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 12997 v5.AddArg(y) 12998 v4.AddArg(v5) 12999 v.AddArg(v4) 13000 return true 13001 } 13002 } 13003 func rewriteValueARM64_OpRsh16Ux32(v *Value, config *Config) bool { 13004 b := v.Block 13005 _ = b 13006 // match: (Rsh16Ux32 <t> x y) 13007 // cond: 13008 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13009 for { 13010 t := v.Type 13011 x := v.Args[0] 13012 y := v.Args[1] 13013 v.reset(OpARM64CSELULT) 13014 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13015 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13016 v1.AddArg(x) 13017 v0.AddArg(v1) 13018 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13019 v2.AddArg(y) 13020 v0.AddArg(v2) 13021 v.AddArg(v0) 13022 v3 := b.NewValue0(v.Line, OpConst64, t) 13023 v3.AuxInt = 0 13024 v.AddArg(v3) 13025 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13026 v4.AuxInt = 64 13027 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13028 v5.AddArg(y) 13029 v4.AddArg(v5) 13030 v.AddArg(v4) 13031 return true 13032 } 13033 } 13034 func rewriteValueARM64_OpRsh16Ux64(v *Value, config *Config) bool { 13035 b := v.Block 13036 _ = b 13037 // match: (Rsh16Ux64 x (MOVDconst [c])) 13038 // cond: uint64(c) < 16 13039 // result: (SRLconst (ZeroExt16to64 x) [c]) 13040 for { 13041 x := v.Args[0] 13042 v_1 := v.Args[1] 13043 if v_1.Op != OpARM64MOVDconst { 13044 break 13045 } 13046 c := v_1.AuxInt 13047 if !(uint64(c) < 16) { 13048 break 13049 } 13050 v.reset(OpARM64SRLconst) 13051 v.AuxInt = c 13052 v0 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13053 v0.AddArg(x) 13054 v.AddArg(v0) 13055 return true 13056 } 13057 // match: (Rsh16Ux64 _ (MOVDconst [c])) 13058 // cond: uint64(c) >= 16 13059 // result: (MOVDconst [0]) 13060 for { 13061 v_1 := v.Args[1] 13062 if v_1.Op != OpARM64MOVDconst { 13063 break 13064 } 13065 c := v_1.AuxInt 13066 if !(uint64(c) >= 16) { 13067 break 13068 } 13069 v.reset(OpARM64MOVDconst) 13070 v.AuxInt = 0 13071 return true 13072 } 13073 // match: (Rsh16Ux64 <t> x y) 13074 // cond: 13075 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13076 for { 13077 t := v.Type 13078 x := v.Args[0] 13079 y := v.Args[1] 13080 v.reset(OpARM64CSELULT) 13081 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13082 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13083 v1.AddArg(x) 13084 v0.AddArg(v1) 13085 v0.AddArg(y) 13086 v.AddArg(v0) 13087 v2 := b.NewValue0(v.Line, OpConst64, t) 13088 v2.AuxInt = 0 13089 v.AddArg(v2) 13090 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13091 v3.AuxInt = 64 13092 v3.AddArg(y) 13093 v.AddArg(v3) 13094 return true 13095 } 13096 } 13097 func rewriteValueARM64_OpRsh16Ux8(v *Value, config *Config) bool { 13098 b := v.Block 13099 _ = b 13100 // match: (Rsh16Ux8 <t> x y) 13101 // cond: 13102 // result: (CSELULT (SRL <t> (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13103 for { 13104 t := v.Type 13105 x := v.Args[0] 13106 y := v.Args[1] 13107 v.reset(OpARM64CSELULT) 13108 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13109 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13110 v1.AddArg(x) 13111 v0.AddArg(v1) 13112 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13113 v2.AddArg(y) 13114 v0.AddArg(v2) 13115 v.AddArg(v0) 13116 v3 := b.NewValue0(v.Line, OpConst64, t) 13117 v3.AuxInt = 0 13118 v.AddArg(v3) 13119 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13120 v4.AuxInt = 64 13121 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13122 v5.AddArg(y) 13123 v4.AddArg(v5) 13124 v.AddArg(v4) 13125 return true 13126 } 13127 } 13128 func rewriteValueARM64_OpRsh16x16(v *Value, config *Config) bool { 13129 b := v.Block 13130 _ = b 13131 // match: (Rsh16x16 x y) 13132 // cond: 13133 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13134 for { 13135 x := v.Args[0] 13136 y := v.Args[1] 13137 v.reset(OpARM64SRA) 13138 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13139 v0.AddArg(x) 13140 v.AddArg(v0) 13141 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13142 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13143 v2.AddArg(y) 13144 v1.AddArg(v2) 13145 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13146 v3.AuxInt = 63 13147 v1.AddArg(v3) 13148 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13149 v4.AuxInt = 64 13150 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13151 v5.AddArg(y) 13152 v4.AddArg(v5) 13153 v1.AddArg(v4) 13154 v.AddArg(v1) 13155 return true 13156 } 13157 } 13158 func rewriteValueARM64_OpRsh16x32(v *Value, config *Config) bool { 13159 b := v.Block 13160 _ = b 13161 // match: (Rsh16x32 x y) 13162 // cond: 13163 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13164 for { 13165 x := v.Args[0] 13166 y := v.Args[1] 13167 v.reset(OpARM64SRA) 13168 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13169 v0.AddArg(x) 13170 v.AddArg(v0) 13171 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13172 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13173 v2.AddArg(y) 13174 v1.AddArg(v2) 13175 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13176 v3.AuxInt = 63 13177 v1.AddArg(v3) 13178 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13179 v4.AuxInt = 64 13180 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13181 v5.AddArg(y) 13182 v4.AddArg(v5) 13183 v1.AddArg(v4) 13184 v.AddArg(v1) 13185 return true 13186 } 13187 } 13188 func rewriteValueARM64_OpRsh16x64(v *Value, config *Config) bool { 13189 b := v.Block 13190 _ = b 13191 // match: (Rsh16x64 x (MOVDconst [c])) 13192 // cond: uint64(c) < 16 13193 // result: (SRAconst (SignExt16to64 x) [c]) 13194 for { 13195 x := v.Args[0] 13196 v_1 := v.Args[1] 13197 if v_1.Op != OpARM64MOVDconst { 13198 break 13199 } 13200 c := v_1.AuxInt 13201 if !(uint64(c) < 16) { 13202 break 13203 } 13204 v.reset(OpARM64SRAconst) 13205 v.AuxInt = c 13206 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13207 v0.AddArg(x) 13208 v.AddArg(v0) 13209 return true 13210 } 13211 // match: (Rsh16x64 x (MOVDconst [c])) 13212 // cond: uint64(c) >= 16 13213 // result: (SRAconst (SignExt16to64 x) [63]) 13214 for { 13215 x := v.Args[0] 13216 v_1 := v.Args[1] 13217 if v_1.Op != OpARM64MOVDconst { 13218 break 13219 } 13220 c := v_1.AuxInt 13221 if !(uint64(c) >= 16) { 13222 break 13223 } 13224 v.reset(OpARM64SRAconst) 13225 v.AuxInt = 63 13226 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13227 v0.AddArg(x) 13228 v.AddArg(v0) 13229 return true 13230 } 13231 // match: (Rsh16x64 x y) 13232 // cond: 13233 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13234 for { 13235 x := v.Args[0] 13236 y := v.Args[1] 13237 v.reset(OpARM64SRA) 13238 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13239 v0.AddArg(x) 13240 v.AddArg(v0) 13241 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13242 v1.AddArg(y) 13243 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13244 v2.AuxInt = 63 13245 v1.AddArg(v2) 13246 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13247 v3.AuxInt = 64 13248 v3.AddArg(y) 13249 v1.AddArg(v3) 13250 v.AddArg(v1) 13251 return true 13252 } 13253 } 13254 func rewriteValueARM64_OpRsh16x8(v *Value, config *Config) bool { 13255 b := v.Block 13256 _ = b 13257 // match: (Rsh16x8 x y) 13258 // cond: 13259 // result: (SRA (SignExt16to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13260 for { 13261 x := v.Args[0] 13262 y := v.Args[1] 13263 v.reset(OpARM64SRA) 13264 v0 := b.NewValue0(v.Line, OpSignExt16to64, config.fe.TypeInt64()) 13265 v0.AddArg(x) 13266 v.AddArg(v0) 13267 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13268 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13269 v2.AddArg(y) 13270 v1.AddArg(v2) 13271 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13272 v3.AuxInt = 63 13273 v1.AddArg(v3) 13274 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13275 v4.AuxInt = 64 13276 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13277 v5.AddArg(y) 13278 v4.AddArg(v5) 13279 v1.AddArg(v4) 13280 v.AddArg(v1) 13281 return true 13282 } 13283 } 13284 func rewriteValueARM64_OpRsh32Ux16(v *Value, config *Config) bool { 13285 b := v.Block 13286 _ = b 13287 // match: (Rsh32Ux16 <t> x y) 13288 // cond: 13289 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13290 for { 13291 t := v.Type 13292 x := v.Args[0] 13293 y := v.Args[1] 13294 v.reset(OpARM64CSELULT) 13295 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13296 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13297 v1.AddArg(x) 13298 v0.AddArg(v1) 13299 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13300 v2.AddArg(y) 13301 v0.AddArg(v2) 13302 v.AddArg(v0) 13303 v3 := b.NewValue0(v.Line, OpConst64, t) 13304 v3.AuxInt = 0 13305 v.AddArg(v3) 13306 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13307 v4.AuxInt = 64 13308 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13309 v5.AddArg(y) 13310 v4.AddArg(v5) 13311 v.AddArg(v4) 13312 return true 13313 } 13314 } 13315 func rewriteValueARM64_OpRsh32Ux32(v *Value, config *Config) bool { 13316 b := v.Block 13317 _ = b 13318 // match: (Rsh32Ux32 <t> x y) 13319 // cond: 13320 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13321 for { 13322 t := v.Type 13323 x := v.Args[0] 13324 y := v.Args[1] 13325 v.reset(OpARM64CSELULT) 13326 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13327 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13328 v1.AddArg(x) 13329 v0.AddArg(v1) 13330 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13331 v2.AddArg(y) 13332 v0.AddArg(v2) 13333 v.AddArg(v0) 13334 v3 := b.NewValue0(v.Line, OpConst64, t) 13335 v3.AuxInt = 0 13336 v.AddArg(v3) 13337 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13338 v4.AuxInt = 64 13339 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13340 v5.AddArg(y) 13341 v4.AddArg(v5) 13342 v.AddArg(v4) 13343 return true 13344 } 13345 } 13346 func rewriteValueARM64_OpRsh32Ux64(v *Value, config *Config) bool { 13347 b := v.Block 13348 _ = b 13349 // match: (Rsh32Ux64 x (MOVDconst [c])) 13350 // cond: uint64(c) < 32 13351 // result: (SRLconst (ZeroExt32to64 x) [c]) 13352 for { 13353 x := v.Args[0] 13354 v_1 := v.Args[1] 13355 if v_1.Op != OpARM64MOVDconst { 13356 break 13357 } 13358 c := v_1.AuxInt 13359 if !(uint64(c) < 32) { 13360 break 13361 } 13362 v.reset(OpARM64SRLconst) 13363 v.AuxInt = c 13364 v0 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13365 v0.AddArg(x) 13366 v.AddArg(v0) 13367 return true 13368 } 13369 // match: (Rsh32Ux64 _ (MOVDconst [c])) 13370 // cond: uint64(c) >= 32 13371 // result: (MOVDconst [0]) 13372 for { 13373 v_1 := v.Args[1] 13374 if v_1.Op != OpARM64MOVDconst { 13375 break 13376 } 13377 c := v_1.AuxInt 13378 if !(uint64(c) >= 32) { 13379 break 13380 } 13381 v.reset(OpARM64MOVDconst) 13382 v.AuxInt = 0 13383 return true 13384 } 13385 // match: (Rsh32Ux64 <t> x y) 13386 // cond: 13387 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13388 for { 13389 t := v.Type 13390 x := v.Args[0] 13391 y := v.Args[1] 13392 v.reset(OpARM64CSELULT) 13393 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13394 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13395 v1.AddArg(x) 13396 v0.AddArg(v1) 13397 v0.AddArg(y) 13398 v.AddArg(v0) 13399 v2 := b.NewValue0(v.Line, OpConst64, t) 13400 v2.AuxInt = 0 13401 v.AddArg(v2) 13402 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13403 v3.AuxInt = 64 13404 v3.AddArg(y) 13405 v.AddArg(v3) 13406 return true 13407 } 13408 } 13409 func rewriteValueARM64_OpRsh32Ux8(v *Value, config *Config) bool { 13410 b := v.Block 13411 _ = b 13412 // match: (Rsh32Ux8 <t> x y) 13413 // cond: 13414 // result: (CSELULT (SRL <t> (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13415 for { 13416 t := v.Type 13417 x := v.Args[0] 13418 y := v.Args[1] 13419 v.reset(OpARM64CSELULT) 13420 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13421 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13422 v1.AddArg(x) 13423 v0.AddArg(v1) 13424 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13425 v2.AddArg(y) 13426 v0.AddArg(v2) 13427 v.AddArg(v0) 13428 v3 := b.NewValue0(v.Line, OpConst64, t) 13429 v3.AuxInt = 0 13430 v.AddArg(v3) 13431 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13432 v4.AuxInt = 64 13433 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13434 v5.AddArg(y) 13435 v4.AddArg(v5) 13436 v.AddArg(v4) 13437 return true 13438 } 13439 } 13440 func rewriteValueARM64_OpRsh32x16(v *Value, config *Config) bool { 13441 b := v.Block 13442 _ = b 13443 // match: (Rsh32x16 x y) 13444 // cond: 13445 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13446 for { 13447 x := v.Args[0] 13448 y := v.Args[1] 13449 v.reset(OpARM64SRA) 13450 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13451 v0.AddArg(x) 13452 v.AddArg(v0) 13453 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13454 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13455 v2.AddArg(y) 13456 v1.AddArg(v2) 13457 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13458 v3.AuxInt = 63 13459 v1.AddArg(v3) 13460 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13461 v4.AuxInt = 64 13462 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13463 v5.AddArg(y) 13464 v4.AddArg(v5) 13465 v1.AddArg(v4) 13466 v.AddArg(v1) 13467 return true 13468 } 13469 } 13470 func rewriteValueARM64_OpRsh32x32(v *Value, config *Config) bool { 13471 b := v.Block 13472 _ = b 13473 // match: (Rsh32x32 x y) 13474 // cond: 13475 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13476 for { 13477 x := v.Args[0] 13478 y := v.Args[1] 13479 v.reset(OpARM64SRA) 13480 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13481 v0.AddArg(x) 13482 v.AddArg(v0) 13483 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13484 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13485 v2.AddArg(y) 13486 v1.AddArg(v2) 13487 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13488 v3.AuxInt = 63 13489 v1.AddArg(v3) 13490 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13491 v4.AuxInt = 64 13492 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13493 v5.AddArg(y) 13494 v4.AddArg(v5) 13495 v1.AddArg(v4) 13496 v.AddArg(v1) 13497 return true 13498 } 13499 } 13500 func rewriteValueARM64_OpRsh32x64(v *Value, config *Config) bool { 13501 b := v.Block 13502 _ = b 13503 // match: (Rsh32x64 x (MOVDconst [c])) 13504 // cond: uint64(c) < 32 13505 // result: (SRAconst (SignExt32to64 x) [c]) 13506 for { 13507 x := v.Args[0] 13508 v_1 := v.Args[1] 13509 if v_1.Op != OpARM64MOVDconst { 13510 break 13511 } 13512 c := v_1.AuxInt 13513 if !(uint64(c) < 32) { 13514 break 13515 } 13516 v.reset(OpARM64SRAconst) 13517 v.AuxInt = c 13518 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13519 v0.AddArg(x) 13520 v.AddArg(v0) 13521 return true 13522 } 13523 // match: (Rsh32x64 x (MOVDconst [c])) 13524 // cond: uint64(c) >= 32 13525 // result: (SRAconst (SignExt32to64 x) [63]) 13526 for { 13527 x := v.Args[0] 13528 v_1 := v.Args[1] 13529 if v_1.Op != OpARM64MOVDconst { 13530 break 13531 } 13532 c := v_1.AuxInt 13533 if !(uint64(c) >= 32) { 13534 break 13535 } 13536 v.reset(OpARM64SRAconst) 13537 v.AuxInt = 63 13538 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13539 v0.AddArg(x) 13540 v.AddArg(v0) 13541 return true 13542 } 13543 // match: (Rsh32x64 x y) 13544 // cond: 13545 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13546 for { 13547 x := v.Args[0] 13548 y := v.Args[1] 13549 v.reset(OpARM64SRA) 13550 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13551 v0.AddArg(x) 13552 v.AddArg(v0) 13553 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13554 v1.AddArg(y) 13555 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13556 v2.AuxInt = 63 13557 v1.AddArg(v2) 13558 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13559 v3.AuxInt = 64 13560 v3.AddArg(y) 13561 v1.AddArg(v3) 13562 v.AddArg(v1) 13563 return true 13564 } 13565 } 13566 func rewriteValueARM64_OpRsh32x8(v *Value, config *Config) bool { 13567 b := v.Block 13568 _ = b 13569 // match: (Rsh32x8 x y) 13570 // cond: 13571 // result: (SRA (SignExt32to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13572 for { 13573 x := v.Args[0] 13574 y := v.Args[1] 13575 v.reset(OpARM64SRA) 13576 v0 := b.NewValue0(v.Line, OpSignExt32to64, config.fe.TypeInt64()) 13577 v0.AddArg(x) 13578 v.AddArg(v0) 13579 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13580 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13581 v2.AddArg(y) 13582 v1.AddArg(v2) 13583 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 13584 v3.AuxInt = 63 13585 v1.AddArg(v3) 13586 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13587 v4.AuxInt = 64 13588 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13589 v5.AddArg(y) 13590 v4.AddArg(v5) 13591 v1.AddArg(v4) 13592 v.AddArg(v1) 13593 return true 13594 } 13595 } 13596 func rewriteValueARM64_OpRsh64Ux16(v *Value, config *Config) bool { 13597 b := v.Block 13598 _ = b 13599 // match: (Rsh64Ux16 <t> x y) 13600 // cond: 13601 // result: (CSELULT (SRL <t> x (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13602 for { 13603 t := v.Type 13604 x := v.Args[0] 13605 y := v.Args[1] 13606 v.reset(OpARM64CSELULT) 13607 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13608 v0.AddArg(x) 13609 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13610 v1.AddArg(y) 13611 v0.AddArg(v1) 13612 v.AddArg(v0) 13613 v2 := b.NewValue0(v.Line, OpConst64, t) 13614 v2.AuxInt = 0 13615 v.AddArg(v2) 13616 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13617 v3.AuxInt = 64 13618 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13619 v4.AddArg(y) 13620 v3.AddArg(v4) 13621 v.AddArg(v3) 13622 return true 13623 } 13624 } 13625 func rewriteValueARM64_OpRsh64Ux32(v *Value, config *Config) bool { 13626 b := v.Block 13627 _ = b 13628 // match: (Rsh64Ux32 <t> x y) 13629 // cond: 13630 // result: (CSELULT (SRL <t> x (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13631 for { 13632 t := v.Type 13633 x := v.Args[0] 13634 y := v.Args[1] 13635 v.reset(OpARM64CSELULT) 13636 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13637 v0.AddArg(x) 13638 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13639 v1.AddArg(y) 13640 v0.AddArg(v1) 13641 v.AddArg(v0) 13642 v2 := b.NewValue0(v.Line, OpConst64, t) 13643 v2.AuxInt = 0 13644 v.AddArg(v2) 13645 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13646 v3.AuxInt = 64 13647 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13648 v4.AddArg(y) 13649 v3.AddArg(v4) 13650 v.AddArg(v3) 13651 return true 13652 } 13653 } 13654 func rewriteValueARM64_OpRsh64Ux64(v *Value, config *Config) bool { 13655 b := v.Block 13656 _ = b 13657 // match: (Rsh64Ux64 x (MOVDconst [c])) 13658 // cond: uint64(c) < 64 13659 // result: (SRLconst x [c]) 13660 for { 13661 x := v.Args[0] 13662 v_1 := v.Args[1] 13663 if v_1.Op != OpARM64MOVDconst { 13664 break 13665 } 13666 c := v_1.AuxInt 13667 if !(uint64(c) < 64) { 13668 break 13669 } 13670 v.reset(OpARM64SRLconst) 13671 v.AuxInt = c 13672 v.AddArg(x) 13673 return true 13674 } 13675 // match: (Rsh64Ux64 _ (MOVDconst [c])) 13676 // cond: uint64(c) >= 64 13677 // result: (MOVDconst [0]) 13678 for { 13679 v_1 := v.Args[1] 13680 if v_1.Op != OpARM64MOVDconst { 13681 break 13682 } 13683 c := v_1.AuxInt 13684 if !(uint64(c) >= 64) { 13685 break 13686 } 13687 v.reset(OpARM64MOVDconst) 13688 v.AuxInt = 0 13689 return true 13690 } 13691 // match: (Rsh64Ux64 <t> x y) 13692 // cond: 13693 // result: (CSELULT (SRL <t> x y) (Const64 <t> [0]) (CMPconst [64] y)) 13694 for { 13695 t := v.Type 13696 x := v.Args[0] 13697 y := v.Args[1] 13698 v.reset(OpARM64CSELULT) 13699 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13700 v0.AddArg(x) 13701 v0.AddArg(y) 13702 v.AddArg(v0) 13703 v1 := b.NewValue0(v.Line, OpConst64, t) 13704 v1.AuxInt = 0 13705 v.AddArg(v1) 13706 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13707 v2.AuxInt = 64 13708 v2.AddArg(y) 13709 v.AddArg(v2) 13710 return true 13711 } 13712 } 13713 func rewriteValueARM64_OpRsh64Ux8(v *Value, config *Config) bool { 13714 b := v.Block 13715 _ = b 13716 // match: (Rsh64Ux8 <t> x y) 13717 // cond: 13718 // result: (CSELULT (SRL <t> x (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 13719 for { 13720 t := v.Type 13721 x := v.Args[0] 13722 y := v.Args[1] 13723 v.reset(OpARM64CSELULT) 13724 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13725 v0.AddArg(x) 13726 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13727 v1.AddArg(y) 13728 v0.AddArg(v1) 13729 v.AddArg(v0) 13730 v2 := b.NewValue0(v.Line, OpConst64, t) 13731 v2.AuxInt = 0 13732 v.AddArg(v2) 13733 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13734 v3.AuxInt = 64 13735 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13736 v4.AddArg(y) 13737 v3.AddArg(v4) 13738 v.AddArg(v3) 13739 return true 13740 } 13741 } 13742 func rewriteValueARM64_OpRsh64x16(v *Value, config *Config) bool { 13743 b := v.Block 13744 _ = b 13745 // match: (Rsh64x16 x y) 13746 // cond: 13747 // result: (SRA x (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 13748 for { 13749 x := v.Args[0] 13750 y := v.Args[1] 13751 v.reset(OpARM64SRA) 13752 v.AddArg(x) 13753 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13754 v1 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13755 v1.AddArg(y) 13756 v0.AddArg(v1) 13757 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13758 v2.AuxInt = 63 13759 v0.AddArg(v2) 13760 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13761 v3.AuxInt = 64 13762 v4 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13763 v4.AddArg(y) 13764 v3.AddArg(v4) 13765 v0.AddArg(v3) 13766 v.AddArg(v0) 13767 return true 13768 } 13769 } 13770 func rewriteValueARM64_OpRsh64x32(v *Value, config *Config) bool { 13771 b := v.Block 13772 _ = b 13773 // match: (Rsh64x32 x y) 13774 // cond: 13775 // result: (SRA x (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 13776 for { 13777 x := v.Args[0] 13778 y := v.Args[1] 13779 v.reset(OpARM64SRA) 13780 v.AddArg(x) 13781 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13782 v1 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13783 v1.AddArg(y) 13784 v0.AddArg(v1) 13785 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13786 v2.AuxInt = 63 13787 v0.AddArg(v2) 13788 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13789 v3.AuxInt = 64 13790 v4 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13791 v4.AddArg(y) 13792 v3.AddArg(v4) 13793 v0.AddArg(v3) 13794 v.AddArg(v0) 13795 return true 13796 } 13797 } 13798 func rewriteValueARM64_OpRsh64x64(v *Value, config *Config) bool { 13799 b := v.Block 13800 _ = b 13801 // match: (Rsh64x64 x (MOVDconst [c])) 13802 // cond: uint64(c) < 64 13803 // result: (SRAconst x [c]) 13804 for { 13805 x := v.Args[0] 13806 v_1 := v.Args[1] 13807 if v_1.Op != OpARM64MOVDconst { 13808 break 13809 } 13810 c := v_1.AuxInt 13811 if !(uint64(c) < 64) { 13812 break 13813 } 13814 v.reset(OpARM64SRAconst) 13815 v.AuxInt = c 13816 v.AddArg(x) 13817 return true 13818 } 13819 // match: (Rsh64x64 x (MOVDconst [c])) 13820 // cond: uint64(c) >= 64 13821 // result: (SRAconst x [63]) 13822 for { 13823 x := v.Args[0] 13824 v_1 := v.Args[1] 13825 if v_1.Op != OpARM64MOVDconst { 13826 break 13827 } 13828 c := v_1.AuxInt 13829 if !(uint64(c) >= 64) { 13830 break 13831 } 13832 v.reset(OpARM64SRAconst) 13833 v.AuxInt = 63 13834 v.AddArg(x) 13835 return true 13836 } 13837 // match: (Rsh64x64 x y) 13838 // cond: 13839 // result: (SRA x (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 13840 for { 13841 x := v.Args[0] 13842 y := v.Args[1] 13843 v.reset(OpARM64SRA) 13844 v.AddArg(x) 13845 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13846 v0.AddArg(y) 13847 v1 := b.NewValue0(v.Line, OpConst64, y.Type) 13848 v1.AuxInt = 63 13849 v0.AddArg(v1) 13850 v2 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13851 v2.AuxInt = 64 13852 v2.AddArg(y) 13853 v0.AddArg(v2) 13854 v.AddArg(v0) 13855 return true 13856 } 13857 } 13858 func rewriteValueARM64_OpRsh64x8(v *Value, config *Config) bool { 13859 b := v.Block 13860 _ = b 13861 // match: (Rsh64x8 x y) 13862 // cond: 13863 // result: (SRA x (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 13864 for { 13865 x := v.Args[0] 13866 y := v.Args[1] 13867 v.reset(OpARM64SRA) 13868 v.AddArg(x) 13869 v0 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 13870 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13871 v1.AddArg(y) 13872 v0.AddArg(v1) 13873 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 13874 v2.AuxInt = 63 13875 v0.AddArg(v2) 13876 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13877 v3.AuxInt = 64 13878 v4 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13879 v4.AddArg(y) 13880 v3.AddArg(v4) 13881 v0.AddArg(v3) 13882 v.AddArg(v0) 13883 return true 13884 } 13885 } 13886 func rewriteValueARM64_OpRsh8Ux16(v *Value, config *Config) bool { 13887 b := v.Block 13888 _ = b 13889 // match: (Rsh8Ux16 <t> x y) 13890 // cond: 13891 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt16to64 y))) 13892 for { 13893 t := v.Type 13894 x := v.Args[0] 13895 y := v.Args[1] 13896 v.reset(OpARM64CSELULT) 13897 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13898 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13899 v1.AddArg(x) 13900 v0.AddArg(v1) 13901 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13902 v2.AddArg(y) 13903 v0.AddArg(v2) 13904 v.AddArg(v0) 13905 v3 := b.NewValue0(v.Line, OpConst64, t) 13906 v3.AuxInt = 0 13907 v.AddArg(v3) 13908 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13909 v4.AuxInt = 64 13910 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 13911 v5.AddArg(y) 13912 v4.AddArg(v5) 13913 v.AddArg(v4) 13914 return true 13915 } 13916 } 13917 func rewriteValueARM64_OpRsh8Ux32(v *Value, config *Config) bool { 13918 b := v.Block 13919 _ = b 13920 // match: (Rsh8Ux32 <t> x y) 13921 // cond: 13922 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt32to64 y))) 13923 for { 13924 t := v.Type 13925 x := v.Args[0] 13926 y := v.Args[1] 13927 v.reset(OpARM64CSELULT) 13928 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13929 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13930 v1.AddArg(x) 13931 v0.AddArg(v1) 13932 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13933 v2.AddArg(y) 13934 v0.AddArg(v2) 13935 v.AddArg(v0) 13936 v3 := b.NewValue0(v.Line, OpConst64, t) 13937 v3.AuxInt = 0 13938 v.AddArg(v3) 13939 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 13940 v4.AuxInt = 64 13941 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 13942 v5.AddArg(y) 13943 v4.AddArg(v5) 13944 v.AddArg(v4) 13945 return true 13946 } 13947 } 13948 func rewriteValueARM64_OpRsh8Ux64(v *Value, config *Config) bool { 13949 b := v.Block 13950 _ = b 13951 // match: (Rsh8Ux64 x (MOVDconst [c])) 13952 // cond: uint64(c) < 8 13953 // result: (SRLconst (ZeroExt8to64 x) [c]) 13954 for { 13955 x := v.Args[0] 13956 v_1 := v.Args[1] 13957 if v_1.Op != OpARM64MOVDconst { 13958 break 13959 } 13960 c := v_1.AuxInt 13961 if !(uint64(c) < 8) { 13962 break 13963 } 13964 v.reset(OpARM64SRLconst) 13965 v.AuxInt = c 13966 v0 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13967 v0.AddArg(x) 13968 v.AddArg(v0) 13969 return true 13970 } 13971 // match: (Rsh8Ux64 _ (MOVDconst [c])) 13972 // cond: uint64(c) >= 8 13973 // result: (MOVDconst [0]) 13974 for { 13975 v_1 := v.Args[1] 13976 if v_1.Op != OpARM64MOVDconst { 13977 break 13978 } 13979 c := v_1.AuxInt 13980 if !(uint64(c) >= 8) { 13981 break 13982 } 13983 v.reset(OpARM64MOVDconst) 13984 v.AuxInt = 0 13985 return true 13986 } 13987 // match: (Rsh8Ux64 <t> x y) 13988 // cond: 13989 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) y) (Const64 <t> [0]) (CMPconst [64] y)) 13990 for { 13991 t := v.Type 13992 x := v.Args[0] 13993 y := v.Args[1] 13994 v.reset(OpARM64CSELULT) 13995 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 13996 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 13997 v1.AddArg(x) 13998 v0.AddArg(v1) 13999 v0.AddArg(y) 14000 v.AddArg(v0) 14001 v2 := b.NewValue0(v.Line, OpConst64, t) 14002 v2.AuxInt = 0 14003 v.AddArg(v2) 14004 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14005 v3.AuxInt = 64 14006 v3.AddArg(y) 14007 v.AddArg(v3) 14008 return true 14009 } 14010 } 14011 func rewriteValueARM64_OpRsh8Ux8(v *Value, config *Config) bool { 14012 b := v.Block 14013 _ = b 14014 // match: (Rsh8Ux8 <t> x y) 14015 // cond: 14016 // result: (CSELULT (SRL <t> (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 <t> [0]) (CMPconst [64] (ZeroExt8to64 y))) 14017 for { 14018 t := v.Type 14019 x := v.Args[0] 14020 y := v.Args[1] 14021 v.reset(OpARM64CSELULT) 14022 v0 := b.NewValue0(v.Line, OpARM64SRL, t) 14023 v1 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14024 v1.AddArg(x) 14025 v0.AddArg(v1) 14026 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14027 v2.AddArg(y) 14028 v0.AddArg(v2) 14029 v.AddArg(v0) 14030 v3 := b.NewValue0(v.Line, OpConst64, t) 14031 v3.AuxInt = 0 14032 v.AddArg(v3) 14033 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14034 v4.AuxInt = 64 14035 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14036 v5.AddArg(y) 14037 v4.AddArg(v5) 14038 v.AddArg(v4) 14039 return true 14040 } 14041 } 14042 func rewriteValueARM64_OpRsh8x16(v *Value, config *Config) bool { 14043 b := v.Block 14044 _ = b 14045 // match: (Rsh8x16 x y) 14046 // cond: 14047 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt16to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt16to64 y)))) 14048 for { 14049 x := v.Args[0] 14050 y := v.Args[1] 14051 v.reset(OpARM64SRA) 14052 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14053 v0.AddArg(x) 14054 v.AddArg(v0) 14055 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14056 v2 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 14057 v2.AddArg(y) 14058 v1.AddArg(v2) 14059 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14060 v3.AuxInt = 63 14061 v1.AddArg(v3) 14062 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14063 v4.AuxInt = 64 14064 v5 := b.NewValue0(v.Line, OpZeroExt16to64, config.fe.TypeUInt64()) 14065 v5.AddArg(y) 14066 v4.AddArg(v5) 14067 v1.AddArg(v4) 14068 v.AddArg(v1) 14069 return true 14070 } 14071 } 14072 func rewriteValueARM64_OpRsh8x32(v *Value, config *Config) bool { 14073 b := v.Block 14074 _ = b 14075 // match: (Rsh8x32 x y) 14076 // cond: 14077 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt32to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt32to64 y)))) 14078 for { 14079 x := v.Args[0] 14080 y := v.Args[1] 14081 v.reset(OpARM64SRA) 14082 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14083 v0.AddArg(x) 14084 v.AddArg(v0) 14085 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14086 v2 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 14087 v2.AddArg(y) 14088 v1.AddArg(v2) 14089 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14090 v3.AuxInt = 63 14091 v1.AddArg(v3) 14092 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14093 v4.AuxInt = 64 14094 v5 := b.NewValue0(v.Line, OpZeroExt32to64, config.fe.TypeUInt64()) 14095 v5.AddArg(y) 14096 v4.AddArg(v5) 14097 v1.AddArg(v4) 14098 v.AddArg(v1) 14099 return true 14100 } 14101 } 14102 func rewriteValueARM64_OpRsh8x64(v *Value, config *Config) bool { 14103 b := v.Block 14104 _ = b 14105 // match: (Rsh8x64 x (MOVDconst [c])) 14106 // cond: uint64(c) < 8 14107 // result: (SRAconst (SignExt8to64 x) [c]) 14108 for { 14109 x := v.Args[0] 14110 v_1 := v.Args[1] 14111 if v_1.Op != OpARM64MOVDconst { 14112 break 14113 } 14114 c := v_1.AuxInt 14115 if !(uint64(c) < 8) { 14116 break 14117 } 14118 v.reset(OpARM64SRAconst) 14119 v.AuxInt = c 14120 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14121 v0.AddArg(x) 14122 v.AddArg(v0) 14123 return true 14124 } 14125 // match: (Rsh8x64 x (MOVDconst [c])) 14126 // cond: uint64(c) >= 8 14127 // result: (SRAconst (SignExt8to64 x) [63]) 14128 for { 14129 x := v.Args[0] 14130 v_1 := v.Args[1] 14131 if v_1.Op != OpARM64MOVDconst { 14132 break 14133 } 14134 c := v_1.AuxInt 14135 if !(uint64(c) >= 8) { 14136 break 14137 } 14138 v.reset(OpARM64SRAconst) 14139 v.AuxInt = 63 14140 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14141 v0.AddArg(x) 14142 v.AddArg(v0) 14143 return true 14144 } 14145 // match: (Rsh8x64 x y) 14146 // cond: 14147 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> y (Const64 <y.Type> [63]) (CMPconst [64] y))) 14148 for { 14149 x := v.Args[0] 14150 y := v.Args[1] 14151 v.reset(OpARM64SRA) 14152 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14153 v0.AddArg(x) 14154 v.AddArg(v0) 14155 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14156 v1.AddArg(y) 14157 v2 := b.NewValue0(v.Line, OpConst64, y.Type) 14158 v2.AuxInt = 63 14159 v1.AddArg(v2) 14160 v3 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14161 v3.AuxInt = 64 14162 v3.AddArg(y) 14163 v1.AddArg(v3) 14164 v.AddArg(v1) 14165 return true 14166 } 14167 } 14168 func rewriteValueARM64_OpRsh8x8(v *Value, config *Config) bool { 14169 b := v.Block 14170 _ = b 14171 // match: (Rsh8x8 x y) 14172 // cond: 14173 // result: (SRA (SignExt8to64 x) (CSELULT <y.Type> (ZeroExt8to64 y) (Const64 <y.Type> [63]) (CMPconst [64] (ZeroExt8to64 y)))) 14174 for { 14175 x := v.Args[0] 14176 y := v.Args[1] 14177 v.reset(OpARM64SRA) 14178 v0 := b.NewValue0(v.Line, OpSignExt8to64, config.fe.TypeInt64()) 14179 v0.AddArg(x) 14180 v.AddArg(v0) 14181 v1 := b.NewValue0(v.Line, OpARM64CSELULT, y.Type) 14182 v2 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14183 v2.AddArg(y) 14184 v1.AddArg(v2) 14185 v3 := b.NewValue0(v.Line, OpConst64, y.Type) 14186 v3.AuxInt = 63 14187 v1.AddArg(v3) 14188 v4 := b.NewValue0(v.Line, OpARM64CMPconst, TypeFlags) 14189 v4.AuxInt = 64 14190 v5 := b.NewValue0(v.Line, OpZeroExt8to64, config.fe.TypeUInt64()) 14191 v5.AddArg(y) 14192 v4.AddArg(v5) 14193 v1.AddArg(v4) 14194 v.AddArg(v1) 14195 return true 14196 } 14197 } 14198 func rewriteValueARM64_OpSignExt16to32(v *Value, config *Config) bool { 14199 b := v.Block 14200 _ = b 14201 // match: (SignExt16to32 x) 14202 // cond: 14203 // result: (MOVHreg x) 14204 for { 14205 x := v.Args[0] 14206 v.reset(OpARM64MOVHreg) 14207 v.AddArg(x) 14208 return true 14209 } 14210 } 14211 func rewriteValueARM64_OpSignExt16to64(v *Value, config *Config) bool { 14212 b := v.Block 14213 _ = b 14214 // match: (SignExt16to64 x) 14215 // cond: 14216 // result: (MOVHreg x) 14217 for { 14218 x := v.Args[0] 14219 v.reset(OpARM64MOVHreg) 14220 v.AddArg(x) 14221 return true 14222 } 14223 } 14224 func rewriteValueARM64_OpSignExt32to64(v *Value, config *Config) bool { 14225 b := v.Block 14226 _ = b 14227 // match: (SignExt32to64 x) 14228 // cond: 14229 // result: (MOVWreg x) 14230 for { 14231 x := v.Args[0] 14232 v.reset(OpARM64MOVWreg) 14233 v.AddArg(x) 14234 return true 14235 } 14236 } 14237 func rewriteValueARM64_OpSignExt8to16(v *Value, config *Config) bool { 14238 b := v.Block 14239 _ = b 14240 // match: (SignExt8to16 x) 14241 // cond: 14242 // result: (MOVBreg x) 14243 for { 14244 x := v.Args[0] 14245 v.reset(OpARM64MOVBreg) 14246 v.AddArg(x) 14247 return true 14248 } 14249 } 14250 func rewriteValueARM64_OpSignExt8to32(v *Value, config *Config) bool { 14251 b := v.Block 14252 _ = b 14253 // match: (SignExt8to32 x) 14254 // cond: 14255 // result: (MOVBreg x) 14256 for { 14257 x := v.Args[0] 14258 v.reset(OpARM64MOVBreg) 14259 v.AddArg(x) 14260 return true 14261 } 14262 } 14263 func rewriteValueARM64_OpSignExt8to64(v *Value, config *Config) bool { 14264 b := v.Block 14265 _ = b 14266 // match: (SignExt8to64 x) 14267 // cond: 14268 // result: (MOVBreg x) 14269 for { 14270 x := v.Args[0] 14271 v.reset(OpARM64MOVBreg) 14272 v.AddArg(x) 14273 return true 14274 } 14275 } 14276 func rewriteValueARM64_OpSlicemask(v *Value, config *Config) bool { 14277 b := v.Block 14278 _ = b 14279 // match: (Slicemask <t> x) 14280 // cond: 14281 // result: (MVN (SRAconst <t> (SUBconst <t> x [1]) [63])) 14282 for { 14283 t := v.Type 14284 x := v.Args[0] 14285 v.reset(OpARM64MVN) 14286 v0 := b.NewValue0(v.Line, OpARM64SRAconst, t) 14287 v0.AuxInt = 63 14288 v1 := b.NewValue0(v.Line, OpARM64SUBconst, t) 14289 v1.AuxInt = 1 14290 v1.AddArg(x) 14291 v0.AddArg(v1) 14292 v.AddArg(v0) 14293 return true 14294 } 14295 } 14296 func rewriteValueARM64_OpSqrt(v *Value, config *Config) bool { 14297 b := v.Block 14298 _ = b 14299 // match: (Sqrt x) 14300 // cond: 14301 // result: (FSQRTD x) 14302 for { 14303 x := v.Args[0] 14304 v.reset(OpARM64FSQRTD) 14305 v.AddArg(x) 14306 return true 14307 } 14308 } 14309 func rewriteValueARM64_OpStaticCall(v *Value, config *Config) bool { 14310 b := v.Block 14311 _ = b 14312 // match: (StaticCall [argwid] {target} mem) 14313 // cond: 14314 // result: (CALLstatic [argwid] {target} mem) 14315 for { 14316 argwid := v.AuxInt 14317 target := v.Aux 14318 mem := v.Args[0] 14319 v.reset(OpARM64CALLstatic) 14320 v.AuxInt = argwid 14321 v.Aux = target 14322 v.AddArg(mem) 14323 return true 14324 } 14325 } 14326 func rewriteValueARM64_OpStore(v *Value, config *Config) bool { 14327 b := v.Block 14328 _ = b 14329 // match: (Store [1] ptr val mem) 14330 // cond: 14331 // result: (MOVBstore ptr val mem) 14332 for { 14333 if v.AuxInt != 1 { 14334 break 14335 } 14336 ptr := v.Args[0] 14337 val := v.Args[1] 14338 mem := v.Args[2] 14339 v.reset(OpARM64MOVBstore) 14340 v.AddArg(ptr) 14341 v.AddArg(val) 14342 v.AddArg(mem) 14343 return true 14344 } 14345 // match: (Store [2] ptr val mem) 14346 // cond: 14347 // result: (MOVHstore ptr val mem) 14348 for { 14349 if v.AuxInt != 2 { 14350 break 14351 } 14352 ptr := v.Args[0] 14353 val := v.Args[1] 14354 mem := v.Args[2] 14355 v.reset(OpARM64MOVHstore) 14356 v.AddArg(ptr) 14357 v.AddArg(val) 14358 v.AddArg(mem) 14359 return true 14360 } 14361 // match: (Store [4] ptr val mem) 14362 // cond: !is32BitFloat(val.Type) 14363 // result: (MOVWstore ptr val mem) 14364 for { 14365 if v.AuxInt != 4 { 14366 break 14367 } 14368 ptr := v.Args[0] 14369 val := v.Args[1] 14370 mem := v.Args[2] 14371 if !(!is32BitFloat(val.Type)) { 14372 break 14373 } 14374 v.reset(OpARM64MOVWstore) 14375 v.AddArg(ptr) 14376 v.AddArg(val) 14377 v.AddArg(mem) 14378 return true 14379 } 14380 // match: (Store [8] ptr val mem) 14381 // cond: !is64BitFloat(val.Type) 14382 // result: (MOVDstore ptr val mem) 14383 for { 14384 if v.AuxInt != 8 { 14385 break 14386 } 14387 ptr := v.Args[0] 14388 val := v.Args[1] 14389 mem := v.Args[2] 14390 if !(!is64BitFloat(val.Type)) { 14391 break 14392 } 14393 v.reset(OpARM64MOVDstore) 14394 v.AddArg(ptr) 14395 v.AddArg(val) 14396 v.AddArg(mem) 14397 return true 14398 } 14399 // match: (Store [4] ptr val mem) 14400 // cond: is32BitFloat(val.Type) 14401 // result: (FMOVSstore ptr val mem) 14402 for { 14403 if v.AuxInt != 4 { 14404 break 14405 } 14406 ptr := v.Args[0] 14407 val := v.Args[1] 14408 mem := v.Args[2] 14409 if !(is32BitFloat(val.Type)) { 14410 break 14411 } 14412 v.reset(OpARM64FMOVSstore) 14413 v.AddArg(ptr) 14414 v.AddArg(val) 14415 v.AddArg(mem) 14416 return true 14417 } 14418 // match: (Store [8] ptr val mem) 14419 // cond: is64BitFloat(val.Type) 14420 // result: (FMOVDstore ptr val mem) 14421 for { 14422 if v.AuxInt != 8 { 14423 break 14424 } 14425 ptr := v.Args[0] 14426 val := v.Args[1] 14427 mem := v.Args[2] 14428 if !(is64BitFloat(val.Type)) { 14429 break 14430 } 14431 v.reset(OpARM64FMOVDstore) 14432 v.AddArg(ptr) 14433 v.AddArg(val) 14434 v.AddArg(mem) 14435 return true 14436 } 14437 return false 14438 } 14439 func rewriteValueARM64_OpSub16(v *Value, config *Config) bool { 14440 b := v.Block 14441 _ = b 14442 // match: (Sub16 x y) 14443 // cond: 14444 // result: (SUB x y) 14445 for { 14446 x := v.Args[0] 14447 y := v.Args[1] 14448 v.reset(OpARM64SUB) 14449 v.AddArg(x) 14450 v.AddArg(y) 14451 return true 14452 } 14453 } 14454 func rewriteValueARM64_OpSub32(v *Value, config *Config) bool { 14455 b := v.Block 14456 _ = b 14457 // match: (Sub32 x y) 14458 // cond: 14459 // result: (SUB x y) 14460 for { 14461 x := v.Args[0] 14462 y := v.Args[1] 14463 v.reset(OpARM64SUB) 14464 v.AddArg(x) 14465 v.AddArg(y) 14466 return true 14467 } 14468 } 14469 func rewriteValueARM64_OpSub32F(v *Value, config *Config) bool { 14470 b := v.Block 14471 _ = b 14472 // match: (Sub32F x y) 14473 // cond: 14474 // result: (FSUBS x y) 14475 for { 14476 x := v.Args[0] 14477 y := v.Args[1] 14478 v.reset(OpARM64FSUBS) 14479 v.AddArg(x) 14480 v.AddArg(y) 14481 return true 14482 } 14483 } 14484 func rewriteValueARM64_OpSub64(v *Value, config *Config) bool { 14485 b := v.Block 14486 _ = b 14487 // match: (Sub64 x y) 14488 // cond: 14489 // result: (SUB x y) 14490 for { 14491 x := v.Args[0] 14492 y := v.Args[1] 14493 v.reset(OpARM64SUB) 14494 v.AddArg(x) 14495 v.AddArg(y) 14496 return true 14497 } 14498 } 14499 func rewriteValueARM64_OpSub64F(v *Value, config *Config) bool { 14500 b := v.Block 14501 _ = b 14502 // match: (Sub64F x y) 14503 // cond: 14504 // result: (FSUBD x y) 14505 for { 14506 x := v.Args[0] 14507 y := v.Args[1] 14508 v.reset(OpARM64FSUBD) 14509 v.AddArg(x) 14510 v.AddArg(y) 14511 return true 14512 } 14513 } 14514 func rewriteValueARM64_OpSub8(v *Value, config *Config) bool { 14515 b := v.Block 14516 _ = b 14517 // match: (Sub8 x y) 14518 // cond: 14519 // result: (SUB x y) 14520 for { 14521 x := v.Args[0] 14522 y := v.Args[1] 14523 v.reset(OpARM64SUB) 14524 v.AddArg(x) 14525 v.AddArg(y) 14526 return true 14527 } 14528 } 14529 func rewriteValueARM64_OpSubPtr(v *Value, config *Config) bool { 14530 b := v.Block 14531 _ = b 14532 // match: (SubPtr x y) 14533 // cond: 14534 // result: (SUB x y) 14535 for { 14536 x := v.Args[0] 14537 y := v.Args[1] 14538 v.reset(OpARM64SUB) 14539 v.AddArg(x) 14540 v.AddArg(y) 14541 return true 14542 } 14543 } 14544 func rewriteValueARM64_OpTrunc16to8(v *Value, config *Config) bool { 14545 b := v.Block 14546 _ = b 14547 // match: (Trunc16to8 x) 14548 // cond: 14549 // result: x 14550 for { 14551 x := v.Args[0] 14552 v.reset(OpCopy) 14553 v.Type = x.Type 14554 v.AddArg(x) 14555 return true 14556 } 14557 } 14558 func rewriteValueARM64_OpTrunc32to16(v *Value, config *Config) bool { 14559 b := v.Block 14560 _ = b 14561 // match: (Trunc32to16 x) 14562 // cond: 14563 // result: x 14564 for { 14565 x := v.Args[0] 14566 v.reset(OpCopy) 14567 v.Type = x.Type 14568 v.AddArg(x) 14569 return true 14570 } 14571 } 14572 func rewriteValueARM64_OpTrunc32to8(v *Value, config *Config) bool { 14573 b := v.Block 14574 _ = b 14575 // match: (Trunc32to8 x) 14576 // cond: 14577 // result: x 14578 for { 14579 x := v.Args[0] 14580 v.reset(OpCopy) 14581 v.Type = x.Type 14582 v.AddArg(x) 14583 return true 14584 } 14585 } 14586 func rewriteValueARM64_OpTrunc64to16(v *Value, config *Config) bool { 14587 b := v.Block 14588 _ = b 14589 // match: (Trunc64to16 x) 14590 // cond: 14591 // result: x 14592 for { 14593 x := v.Args[0] 14594 v.reset(OpCopy) 14595 v.Type = x.Type 14596 v.AddArg(x) 14597 return true 14598 } 14599 } 14600 func rewriteValueARM64_OpTrunc64to32(v *Value, config *Config) bool { 14601 b := v.Block 14602 _ = b 14603 // match: (Trunc64to32 x) 14604 // cond: 14605 // result: x 14606 for { 14607 x := v.Args[0] 14608 v.reset(OpCopy) 14609 v.Type = x.Type 14610 v.AddArg(x) 14611 return true 14612 } 14613 } 14614 func rewriteValueARM64_OpTrunc64to8(v *Value, config *Config) bool { 14615 b := v.Block 14616 _ = b 14617 // match: (Trunc64to8 x) 14618 // cond: 14619 // result: x 14620 for { 14621 x := v.Args[0] 14622 v.reset(OpCopy) 14623 v.Type = x.Type 14624 v.AddArg(x) 14625 return true 14626 } 14627 } 14628 func rewriteValueARM64_OpXor16(v *Value, config *Config) bool { 14629 b := v.Block 14630 _ = b 14631 // match: (Xor16 x y) 14632 // cond: 14633 // result: (XOR x y) 14634 for { 14635 x := v.Args[0] 14636 y := v.Args[1] 14637 v.reset(OpARM64XOR) 14638 v.AddArg(x) 14639 v.AddArg(y) 14640 return true 14641 } 14642 } 14643 func rewriteValueARM64_OpXor32(v *Value, config *Config) bool { 14644 b := v.Block 14645 _ = b 14646 // match: (Xor32 x y) 14647 // cond: 14648 // result: (XOR x y) 14649 for { 14650 x := v.Args[0] 14651 y := v.Args[1] 14652 v.reset(OpARM64XOR) 14653 v.AddArg(x) 14654 v.AddArg(y) 14655 return true 14656 } 14657 } 14658 func rewriteValueARM64_OpXor64(v *Value, config *Config) bool { 14659 b := v.Block 14660 _ = b 14661 // match: (Xor64 x y) 14662 // cond: 14663 // result: (XOR x y) 14664 for { 14665 x := v.Args[0] 14666 y := v.Args[1] 14667 v.reset(OpARM64XOR) 14668 v.AddArg(x) 14669 v.AddArg(y) 14670 return true 14671 } 14672 } 14673 func rewriteValueARM64_OpXor8(v *Value, config *Config) bool { 14674 b := v.Block 14675 _ = b 14676 // match: (Xor8 x y) 14677 // cond: 14678 // result: (XOR x y) 14679 for { 14680 x := v.Args[0] 14681 y := v.Args[1] 14682 v.reset(OpARM64XOR) 14683 v.AddArg(x) 14684 v.AddArg(y) 14685 return true 14686 } 14687 } 14688 func rewriteValueARM64_OpZero(v *Value, config *Config) bool { 14689 b := v.Block 14690 _ = b 14691 // match: (Zero [s] _ mem) 14692 // cond: SizeAndAlign(s).Size() == 0 14693 // result: mem 14694 for { 14695 s := v.AuxInt 14696 mem := v.Args[1] 14697 if !(SizeAndAlign(s).Size() == 0) { 14698 break 14699 } 14700 v.reset(OpCopy) 14701 v.Type = mem.Type 14702 v.AddArg(mem) 14703 return true 14704 } 14705 // match: (Zero [s] ptr mem) 14706 // cond: SizeAndAlign(s).Size() == 1 14707 // result: (MOVBstore ptr (MOVDconst [0]) mem) 14708 for { 14709 s := v.AuxInt 14710 ptr := v.Args[0] 14711 mem := v.Args[1] 14712 if !(SizeAndAlign(s).Size() == 1) { 14713 break 14714 } 14715 v.reset(OpARM64MOVBstore) 14716 v.AddArg(ptr) 14717 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14718 v0.AuxInt = 0 14719 v.AddArg(v0) 14720 v.AddArg(mem) 14721 return true 14722 } 14723 // match: (Zero [s] ptr mem) 14724 // cond: SizeAndAlign(s).Size() == 2 14725 // result: (MOVHstore ptr (MOVDconst [0]) mem) 14726 for { 14727 s := v.AuxInt 14728 ptr := v.Args[0] 14729 mem := v.Args[1] 14730 if !(SizeAndAlign(s).Size() == 2) { 14731 break 14732 } 14733 v.reset(OpARM64MOVHstore) 14734 v.AddArg(ptr) 14735 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14736 v0.AuxInt = 0 14737 v.AddArg(v0) 14738 v.AddArg(mem) 14739 return true 14740 } 14741 // match: (Zero [s] ptr mem) 14742 // cond: SizeAndAlign(s).Size() == 4 14743 // result: (MOVWstore ptr (MOVDconst [0]) mem) 14744 for { 14745 s := v.AuxInt 14746 ptr := v.Args[0] 14747 mem := v.Args[1] 14748 if !(SizeAndAlign(s).Size() == 4) { 14749 break 14750 } 14751 v.reset(OpARM64MOVWstore) 14752 v.AddArg(ptr) 14753 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14754 v0.AuxInt = 0 14755 v.AddArg(v0) 14756 v.AddArg(mem) 14757 return true 14758 } 14759 // match: (Zero [s] ptr mem) 14760 // cond: SizeAndAlign(s).Size() == 8 14761 // result: (MOVDstore ptr (MOVDconst [0]) mem) 14762 for { 14763 s := v.AuxInt 14764 ptr := v.Args[0] 14765 mem := v.Args[1] 14766 if !(SizeAndAlign(s).Size() == 8) { 14767 break 14768 } 14769 v.reset(OpARM64MOVDstore) 14770 v.AddArg(ptr) 14771 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14772 v0.AuxInt = 0 14773 v.AddArg(v0) 14774 v.AddArg(mem) 14775 return true 14776 } 14777 // match: (Zero [s] ptr mem) 14778 // cond: SizeAndAlign(s).Size() == 3 14779 // result: (MOVBstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem)) 14780 for { 14781 s := v.AuxInt 14782 ptr := v.Args[0] 14783 mem := v.Args[1] 14784 if !(SizeAndAlign(s).Size() == 3) { 14785 break 14786 } 14787 v.reset(OpARM64MOVBstore) 14788 v.AuxInt = 2 14789 v.AddArg(ptr) 14790 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14791 v0.AuxInt = 0 14792 v.AddArg(v0) 14793 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 14794 v1.AddArg(ptr) 14795 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14796 v2.AuxInt = 0 14797 v1.AddArg(v2) 14798 v1.AddArg(mem) 14799 v.AddArg(v1) 14800 return true 14801 } 14802 // match: (Zero [s] ptr mem) 14803 // cond: SizeAndAlign(s).Size() == 5 14804 // result: (MOVBstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 14805 for { 14806 s := v.AuxInt 14807 ptr := v.Args[0] 14808 mem := v.Args[1] 14809 if !(SizeAndAlign(s).Size() == 5) { 14810 break 14811 } 14812 v.reset(OpARM64MOVBstore) 14813 v.AuxInt = 4 14814 v.AddArg(ptr) 14815 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14816 v0.AuxInt = 0 14817 v.AddArg(v0) 14818 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14819 v1.AddArg(ptr) 14820 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14821 v2.AuxInt = 0 14822 v1.AddArg(v2) 14823 v1.AddArg(mem) 14824 v.AddArg(v1) 14825 return true 14826 } 14827 // match: (Zero [s] ptr mem) 14828 // cond: SizeAndAlign(s).Size() == 6 14829 // result: (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)) 14830 for { 14831 s := v.AuxInt 14832 ptr := v.Args[0] 14833 mem := v.Args[1] 14834 if !(SizeAndAlign(s).Size() == 6) { 14835 break 14836 } 14837 v.reset(OpARM64MOVHstore) 14838 v.AuxInt = 4 14839 v.AddArg(ptr) 14840 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14841 v0.AuxInt = 0 14842 v.AddArg(v0) 14843 v1 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14844 v1.AddArg(ptr) 14845 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14846 v2.AuxInt = 0 14847 v1.AddArg(v2) 14848 v1.AddArg(mem) 14849 v.AddArg(v1) 14850 return true 14851 } 14852 // match: (Zero [s] ptr mem) 14853 // cond: SizeAndAlign(s).Size() == 7 14854 // result: (MOVBstore [6] ptr (MOVDconst [0]) (MOVHstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem))) 14855 for { 14856 s := v.AuxInt 14857 ptr := v.Args[0] 14858 mem := v.Args[1] 14859 if !(SizeAndAlign(s).Size() == 7) { 14860 break 14861 } 14862 v.reset(OpARM64MOVBstore) 14863 v.AuxInt = 6 14864 v.AddArg(ptr) 14865 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14866 v0.AuxInt = 0 14867 v.AddArg(v0) 14868 v1 := b.NewValue0(v.Line, OpARM64MOVHstore, TypeMem) 14869 v1.AuxInt = 4 14870 v1.AddArg(ptr) 14871 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14872 v2.AuxInt = 0 14873 v1.AddArg(v2) 14874 v3 := b.NewValue0(v.Line, OpARM64MOVWstore, TypeMem) 14875 v3.AddArg(ptr) 14876 v4 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14877 v4.AuxInt = 0 14878 v3.AddArg(v4) 14879 v3.AddArg(mem) 14880 v1.AddArg(v3) 14881 v.AddArg(v1) 14882 return true 14883 } 14884 // match: (Zero [s] ptr mem) 14885 // cond: SizeAndAlign(s).Size() == 12 14886 // result: (MOVWstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 14887 for { 14888 s := v.AuxInt 14889 ptr := v.Args[0] 14890 mem := v.Args[1] 14891 if !(SizeAndAlign(s).Size() == 12) { 14892 break 14893 } 14894 v.reset(OpARM64MOVWstore) 14895 v.AuxInt = 8 14896 v.AddArg(ptr) 14897 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14898 v0.AuxInt = 0 14899 v.AddArg(v0) 14900 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14901 v1.AddArg(ptr) 14902 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14903 v2.AuxInt = 0 14904 v1.AddArg(v2) 14905 v1.AddArg(mem) 14906 v.AddArg(v1) 14907 return true 14908 } 14909 // match: (Zero [s] ptr mem) 14910 // cond: SizeAndAlign(s).Size() == 16 14911 // result: (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) 14912 for { 14913 s := v.AuxInt 14914 ptr := v.Args[0] 14915 mem := v.Args[1] 14916 if !(SizeAndAlign(s).Size() == 16) { 14917 break 14918 } 14919 v.reset(OpARM64MOVDstore) 14920 v.AuxInt = 8 14921 v.AddArg(ptr) 14922 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14923 v0.AuxInt = 0 14924 v.AddArg(v0) 14925 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14926 v1.AddArg(ptr) 14927 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14928 v2.AuxInt = 0 14929 v1.AddArg(v2) 14930 v1.AddArg(mem) 14931 v.AddArg(v1) 14932 return true 14933 } 14934 // match: (Zero [s] ptr mem) 14935 // cond: SizeAndAlign(s).Size() == 24 14936 // result: (MOVDstore [16] ptr (MOVDconst [0]) (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem))) 14937 for { 14938 s := v.AuxInt 14939 ptr := v.Args[0] 14940 mem := v.Args[1] 14941 if !(SizeAndAlign(s).Size() == 24) { 14942 break 14943 } 14944 v.reset(OpARM64MOVDstore) 14945 v.AuxInt = 16 14946 v.AddArg(ptr) 14947 v0 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14948 v0.AuxInt = 0 14949 v.AddArg(v0) 14950 v1 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14951 v1.AuxInt = 8 14952 v1.AddArg(ptr) 14953 v2 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14954 v2.AuxInt = 0 14955 v1.AddArg(v2) 14956 v3 := b.NewValue0(v.Line, OpARM64MOVDstore, TypeMem) 14957 v3.AddArg(ptr) 14958 v4 := b.NewValue0(v.Line, OpARM64MOVDconst, config.fe.TypeUInt64()) 14959 v4.AuxInt = 0 14960 v3.AddArg(v4) 14961 v3.AddArg(mem) 14962 v1.AddArg(v3) 14963 v.AddArg(v1) 14964 return true 14965 } 14966 // match: (Zero [s] ptr mem) 14967 // cond: SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8 14968 // 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)) 14969 for { 14970 s := v.AuxInt 14971 ptr := v.Args[0] 14972 mem := v.Args[1] 14973 if !(SizeAndAlign(s).Size()%8 != 0 && SizeAndAlign(s).Size() > 8) { 14974 break 14975 } 14976 v.reset(OpZero) 14977 v.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()%8, 1).Int64() 14978 v0 := b.NewValue0(v.Line, OpOffPtr, ptr.Type) 14979 v0.AuxInt = SizeAndAlign(s).Size() - SizeAndAlign(s).Size()%8 14980 v0.AddArg(ptr) 14981 v.AddArg(v0) 14982 v1 := b.NewValue0(v.Line, OpZero, TypeMem) 14983 v1.AuxInt = MakeSizeAndAlign(SizeAndAlign(s).Size()-SizeAndAlign(s).Size()%8, 1).Int64() 14984 v1.AddArg(ptr) 14985 v1.AddArg(mem) 14986 v.AddArg(v1) 14987 return true 14988 } 14989 // match: (Zero [s] ptr mem) 14990 // cond: SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice 14991 // result: (DUFFZERO [4 * (128 - int64(SizeAndAlign(s).Size()/8))] ptr mem) 14992 for { 14993 s := v.AuxInt 14994 ptr := v.Args[0] 14995 mem := v.Args[1] 14996 if !(SizeAndAlign(s).Size()%8 == 0 && SizeAndAlign(s).Size() > 24 && SizeAndAlign(s).Size() <= 8*128 && !config.noDuffDevice) { 14997 break 14998 } 14999 v.reset(OpARM64DUFFZERO) 15000 v.AuxInt = 4 * (128 - int64(SizeAndAlign(s).Size()/8)) 15001 v.AddArg(ptr) 15002 v.AddArg(mem) 15003 return true 15004 } 15005 // match: (Zero [s] ptr mem) 15006 // cond: SizeAndAlign(s).Size()%8 == 0 && (SizeAndAlign(s).Size() > 8*128 || config.noDuffDevice) 15007 // result: (LoweredZero ptr (ADDconst <ptr.Type> [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)] ptr) mem) 15008 for { 15009 s := v.AuxInt 15010 ptr := v.Args[0] 15011 mem := v.Args[1] 15012 if !(SizeAndAlign(s).Size()%8 == 0 && (SizeAndAlign(s).Size() > 8*128 || config.noDuffDevice)) { 15013 break 15014 } 15015 v.reset(OpARM64LoweredZero) 15016 v.AddArg(ptr) 15017 v0 := b.NewValue0(v.Line, OpARM64ADDconst, ptr.Type) 15018 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 15019 v0.AddArg(ptr) 15020 v.AddArg(v0) 15021 v.AddArg(mem) 15022 return true 15023 } 15024 return false 15025 } 15026 func rewriteValueARM64_OpZeroExt16to32(v *Value, config *Config) bool { 15027 b := v.Block 15028 _ = b 15029 // match: (ZeroExt16to32 x) 15030 // cond: 15031 // result: (MOVHUreg x) 15032 for { 15033 x := v.Args[0] 15034 v.reset(OpARM64MOVHUreg) 15035 v.AddArg(x) 15036 return true 15037 } 15038 } 15039 func rewriteValueARM64_OpZeroExt16to64(v *Value, config *Config) bool { 15040 b := v.Block 15041 _ = b 15042 // match: (ZeroExt16to64 x) 15043 // cond: 15044 // result: (MOVHUreg x) 15045 for { 15046 x := v.Args[0] 15047 v.reset(OpARM64MOVHUreg) 15048 v.AddArg(x) 15049 return true 15050 } 15051 } 15052 func rewriteValueARM64_OpZeroExt32to64(v *Value, config *Config) bool { 15053 b := v.Block 15054 _ = b 15055 // match: (ZeroExt32to64 x) 15056 // cond: 15057 // result: (MOVWUreg x) 15058 for { 15059 x := v.Args[0] 15060 v.reset(OpARM64MOVWUreg) 15061 v.AddArg(x) 15062 return true 15063 } 15064 } 15065 func rewriteValueARM64_OpZeroExt8to16(v *Value, config *Config) bool { 15066 b := v.Block 15067 _ = b 15068 // match: (ZeroExt8to16 x) 15069 // cond: 15070 // result: (MOVBUreg x) 15071 for { 15072 x := v.Args[0] 15073 v.reset(OpARM64MOVBUreg) 15074 v.AddArg(x) 15075 return true 15076 } 15077 } 15078 func rewriteValueARM64_OpZeroExt8to32(v *Value, config *Config) bool { 15079 b := v.Block 15080 _ = b 15081 // match: (ZeroExt8to32 x) 15082 // cond: 15083 // result: (MOVBUreg x) 15084 for { 15085 x := v.Args[0] 15086 v.reset(OpARM64MOVBUreg) 15087 v.AddArg(x) 15088 return true 15089 } 15090 } 15091 func rewriteValueARM64_OpZeroExt8to64(v *Value, config *Config) bool { 15092 b := v.Block 15093 _ = b 15094 // match: (ZeroExt8to64 x) 15095 // cond: 15096 // result: (MOVBUreg x) 15097 for { 15098 x := v.Args[0] 15099 v.reset(OpARM64MOVBUreg) 15100 v.AddArg(x) 15101 return true 15102 } 15103 } 15104 func rewriteBlockARM64(b *Block, config *Config) bool { 15105 switch b.Kind { 15106 case BlockARM64EQ: 15107 // match: (EQ (CMPconst [0] x) yes no) 15108 // cond: 15109 // result: (Z x yes no) 15110 for { 15111 v := b.Control 15112 if v.Op != OpARM64CMPconst { 15113 break 15114 } 15115 if v.AuxInt != 0 { 15116 break 15117 } 15118 x := v.Args[0] 15119 yes := b.Succs[0] 15120 no := b.Succs[1] 15121 b.Kind = BlockARM64Z 15122 b.SetControl(x) 15123 _ = yes 15124 _ = no 15125 return true 15126 } 15127 // match: (EQ (CMPWconst [0] x) yes no) 15128 // cond: 15129 // result: (ZW x yes no) 15130 for { 15131 v := b.Control 15132 if v.Op != OpARM64CMPWconst { 15133 break 15134 } 15135 if v.AuxInt != 0 { 15136 break 15137 } 15138 x := v.Args[0] 15139 yes := b.Succs[0] 15140 no := b.Succs[1] 15141 b.Kind = BlockARM64ZW 15142 b.SetControl(x) 15143 _ = yes 15144 _ = no 15145 return true 15146 } 15147 // match: (EQ (FlagEQ) yes no) 15148 // cond: 15149 // result: (First nil yes no) 15150 for { 15151 v := b.Control 15152 if v.Op != OpARM64FlagEQ { 15153 break 15154 } 15155 yes := b.Succs[0] 15156 no := b.Succs[1] 15157 b.Kind = BlockFirst 15158 b.SetControl(nil) 15159 _ = yes 15160 _ = no 15161 return true 15162 } 15163 // match: (EQ (FlagLT_ULT) yes no) 15164 // cond: 15165 // result: (First nil no yes) 15166 for { 15167 v := b.Control 15168 if v.Op != OpARM64FlagLT_ULT { 15169 break 15170 } 15171 yes := b.Succs[0] 15172 no := b.Succs[1] 15173 b.Kind = BlockFirst 15174 b.SetControl(nil) 15175 b.swapSuccessors() 15176 _ = no 15177 _ = yes 15178 return true 15179 } 15180 // match: (EQ (FlagLT_UGT) yes no) 15181 // cond: 15182 // result: (First nil no yes) 15183 for { 15184 v := b.Control 15185 if v.Op != OpARM64FlagLT_UGT { 15186 break 15187 } 15188 yes := b.Succs[0] 15189 no := b.Succs[1] 15190 b.Kind = BlockFirst 15191 b.SetControl(nil) 15192 b.swapSuccessors() 15193 _ = no 15194 _ = yes 15195 return true 15196 } 15197 // match: (EQ (FlagGT_ULT) yes no) 15198 // cond: 15199 // result: (First nil no yes) 15200 for { 15201 v := b.Control 15202 if v.Op != OpARM64FlagGT_ULT { 15203 break 15204 } 15205 yes := b.Succs[0] 15206 no := b.Succs[1] 15207 b.Kind = BlockFirst 15208 b.SetControl(nil) 15209 b.swapSuccessors() 15210 _ = no 15211 _ = yes 15212 return true 15213 } 15214 // match: (EQ (FlagGT_UGT) yes no) 15215 // cond: 15216 // result: (First nil no yes) 15217 for { 15218 v := b.Control 15219 if v.Op != OpARM64FlagGT_UGT { 15220 break 15221 } 15222 yes := b.Succs[0] 15223 no := b.Succs[1] 15224 b.Kind = BlockFirst 15225 b.SetControl(nil) 15226 b.swapSuccessors() 15227 _ = no 15228 _ = yes 15229 return true 15230 } 15231 // match: (EQ (InvertFlags cmp) yes no) 15232 // cond: 15233 // result: (EQ cmp yes no) 15234 for { 15235 v := b.Control 15236 if v.Op != OpARM64InvertFlags { 15237 break 15238 } 15239 cmp := v.Args[0] 15240 yes := b.Succs[0] 15241 no := b.Succs[1] 15242 b.Kind = BlockARM64EQ 15243 b.SetControl(cmp) 15244 _ = yes 15245 _ = no 15246 return true 15247 } 15248 case BlockARM64GE: 15249 // match: (GE (FlagEQ) yes no) 15250 // cond: 15251 // result: (First nil yes no) 15252 for { 15253 v := b.Control 15254 if v.Op != OpARM64FlagEQ { 15255 break 15256 } 15257 yes := b.Succs[0] 15258 no := b.Succs[1] 15259 b.Kind = BlockFirst 15260 b.SetControl(nil) 15261 _ = yes 15262 _ = no 15263 return true 15264 } 15265 // match: (GE (FlagLT_ULT) yes no) 15266 // cond: 15267 // result: (First nil no yes) 15268 for { 15269 v := b.Control 15270 if v.Op != OpARM64FlagLT_ULT { 15271 break 15272 } 15273 yes := b.Succs[0] 15274 no := b.Succs[1] 15275 b.Kind = BlockFirst 15276 b.SetControl(nil) 15277 b.swapSuccessors() 15278 _ = no 15279 _ = yes 15280 return true 15281 } 15282 // match: (GE (FlagLT_UGT) yes no) 15283 // cond: 15284 // result: (First nil no yes) 15285 for { 15286 v := b.Control 15287 if v.Op != OpARM64FlagLT_UGT { 15288 break 15289 } 15290 yes := b.Succs[0] 15291 no := b.Succs[1] 15292 b.Kind = BlockFirst 15293 b.SetControl(nil) 15294 b.swapSuccessors() 15295 _ = no 15296 _ = yes 15297 return true 15298 } 15299 // match: (GE (FlagGT_ULT) yes no) 15300 // cond: 15301 // result: (First nil yes no) 15302 for { 15303 v := b.Control 15304 if v.Op != OpARM64FlagGT_ULT { 15305 break 15306 } 15307 yes := b.Succs[0] 15308 no := b.Succs[1] 15309 b.Kind = BlockFirst 15310 b.SetControl(nil) 15311 _ = yes 15312 _ = no 15313 return true 15314 } 15315 // match: (GE (FlagGT_UGT) yes no) 15316 // cond: 15317 // result: (First nil yes no) 15318 for { 15319 v := b.Control 15320 if v.Op != OpARM64FlagGT_UGT { 15321 break 15322 } 15323 yes := b.Succs[0] 15324 no := b.Succs[1] 15325 b.Kind = BlockFirst 15326 b.SetControl(nil) 15327 _ = yes 15328 _ = no 15329 return true 15330 } 15331 // match: (GE (InvertFlags cmp) yes no) 15332 // cond: 15333 // result: (LE cmp yes no) 15334 for { 15335 v := b.Control 15336 if v.Op != OpARM64InvertFlags { 15337 break 15338 } 15339 cmp := v.Args[0] 15340 yes := b.Succs[0] 15341 no := b.Succs[1] 15342 b.Kind = BlockARM64LE 15343 b.SetControl(cmp) 15344 _ = yes 15345 _ = no 15346 return true 15347 } 15348 case BlockARM64GT: 15349 // match: (GT (FlagEQ) yes no) 15350 // cond: 15351 // result: (First nil no yes) 15352 for { 15353 v := b.Control 15354 if v.Op != OpARM64FlagEQ { 15355 break 15356 } 15357 yes := b.Succs[0] 15358 no := b.Succs[1] 15359 b.Kind = BlockFirst 15360 b.SetControl(nil) 15361 b.swapSuccessors() 15362 _ = no 15363 _ = yes 15364 return true 15365 } 15366 // match: (GT (FlagLT_ULT) yes no) 15367 // cond: 15368 // result: (First nil no yes) 15369 for { 15370 v := b.Control 15371 if v.Op != OpARM64FlagLT_ULT { 15372 break 15373 } 15374 yes := b.Succs[0] 15375 no := b.Succs[1] 15376 b.Kind = BlockFirst 15377 b.SetControl(nil) 15378 b.swapSuccessors() 15379 _ = no 15380 _ = yes 15381 return true 15382 } 15383 // match: (GT (FlagLT_UGT) yes no) 15384 // cond: 15385 // result: (First nil no yes) 15386 for { 15387 v := b.Control 15388 if v.Op != OpARM64FlagLT_UGT { 15389 break 15390 } 15391 yes := b.Succs[0] 15392 no := b.Succs[1] 15393 b.Kind = BlockFirst 15394 b.SetControl(nil) 15395 b.swapSuccessors() 15396 _ = no 15397 _ = yes 15398 return true 15399 } 15400 // match: (GT (FlagGT_ULT) yes no) 15401 // cond: 15402 // result: (First nil yes no) 15403 for { 15404 v := b.Control 15405 if v.Op != OpARM64FlagGT_ULT { 15406 break 15407 } 15408 yes := b.Succs[0] 15409 no := b.Succs[1] 15410 b.Kind = BlockFirst 15411 b.SetControl(nil) 15412 _ = yes 15413 _ = no 15414 return true 15415 } 15416 // match: (GT (FlagGT_UGT) yes no) 15417 // cond: 15418 // result: (First nil yes no) 15419 for { 15420 v := b.Control 15421 if v.Op != OpARM64FlagGT_UGT { 15422 break 15423 } 15424 yes := b.Succs[0] 15425 no := b.Succs[1] 15426 b.Kind = BlockFirst 15427 b.SetControl(nil) 15428 _ = yes 15429 _ = no 15430 return true 15431 } 15432 // match: (GT (InvertFlags cmp) yes no) 15433 // cond: 15434 // result: (LT cmp yes no) 15435 for { 15436 v := b.Control 15437 if v.Op != OpARM64InvertFlags { 15438 break 15439 } 15440 cmp := v.Args[0] 15441 yes := b.Succs[0] 15442 no := b.Succs[1] 15443 b.Kind = BlockARM64LT 15444 b.SetControl(cmp) 15445 _ = yes 15446 _ = no 15447 return true 15448 } 15449 case BlockIf: 15450 // match: (If (Equal cc) yes no) 15451 // cond: 15452 // result: (EQ cc yes no) 15453 for { 15454 v := b.Control 15455 if v.Op != OpARM64Equal { 15456 break 15457 } 15458 cc := v.Args[0] 15459 yes := b.Succs[0] 15460 no := b.Succs[1] 15461 b.Kind = BlockARM64EQ 15462 b.SetControl(cc) 15463 _ = yes 15464 _ = no 15465 return true 15466 } 15467 // match: (If (NotEqual cc) yes no) 15468 // cond: 15469 // result: (NE cc yes no) 15470 for { 15471 v := b.Control 15472 if v.Op != OpARM64NotEqual { 15473 break 15474 } 15475 cc := v.Args[0] 15476 yes := b.Succs[0] 15477 no := b.Succs[1] 15478 b.Kind = BlockARM64NE 15479 b.SetControl(cc) 15480 _ = yes 15481 _ = no 15482 return true 15483 } 15484 // match: (If (LessThan cc) yes no) 15485 // cond: 15486 // result: (LT cc yes no) 15487 for { 15488 v := b.Control 15489 if v.Op != OpARM64LessThan { 15490 break 15491 } 15492 cc := v.Args[0] 15493 yes := b.Succs[0] 15494 no := b.Succs[1] 15495 b.Kind = BlockARM64LT 15496 b.SetControl(cc) 15497 _ = yes 15498 _ = no 15499 return true 15500 } 15501 // match: (If (LessThanU cc) yes no) 15502 // cond: 15503 // result: (ULT cc yes no) 15504 for { 15505 v := b.Control 15506 if v.Op != OpARM64LessThanU { 15507 break 15508 } 15509 cc := v.Args[0] 15510 yes := b.Succs[0] 15511 no := b.Succs[1] 15512 b.Kind = BlockARM64ULT 15513 b.SetControl(cc) 15514 _ = yes 15515 _ = no 15516 return true 15517 } 15518 // match: (If (LessEqual cc) yes no) 15519 // cond: 15520 // result: (LE cc yes no) 15521 for { 15522 v := b.Control 15523 if v.Op != OpARM64LessEqual { 15524 break 15525 } 15526 cc := v.Args[0] 15527 yes := b.Succs[0] 15528 no := b.Succs[1] 15529 b.Kind = BlockARM64LE 15530 b.SetControl(cc) 15531 _ = yes 15532 _ = no 15533 return true 15534 } 15535 // match: (If (LessEqualU cc) yes no) 15536 // cond: 15537 // result: (ULE cc yes no) 15538 for { 15539 v := b.Control 15540 if v.Op != OpARM64LessEqualU { 15541 break 15542 } 15543 cc := v.Args[0] 15544 yes := b.Succs[0] 15545 no := b.Succs[1] 15546 b.Kind = BlockARM64ULE 15547 b.SetControl(cc) 15548 _ = yes 15549 _ = no 15550 return true 15551 } 15552 // match: (If (GreaterThan cc) yes no) 15553 // cond: 15554 // result: (GT cc yes no) 15555 for { 15556 v := b.Control 15557 if v.Op != OpARM64GreaterThan { 15558 break 15559 } 15560 cc := v.Args[0] 15561 yes := b.Succs[0] 15562 no := b.Succs[1] 15563 b.Kind = BlockARM64GT 15564 b.SetControl(cc) 15565 _ = yes 15566 _ = no 15567 return true 15568 } 15569 // match: (If (GreaterThanU cc) yes no) 15570 // cond: 15571 // result: (UGT cc yes no) 15572 for { 15573 v := b.Control 15574 if v.Op != OpARM64GreaterThanU { 15575 break 15576 } 15577 cc := v.Args[0] 15578 yes := b.Succs[0] 15579 no := b.Succs[1] 15580 b.Kind = BlockARM64UGT 15581 b.SetControl(cc) 15582 _ = yes 15583 _ = no 15584 return true 15585 } 15586 // match: (If (GreaterEqual cc) yes no) 15587 // cond: 15588 // result: (GE cc yes no) 15589 for { 15590 v := b.Control 15591 if v.Op != OpARM64GreaterEqual { 15592 break 15593 } 15594 cc := v.Args[0] 15595 yes := b.Succs[0] 15596 no := b.Succs[1] 15597 b.Kind = BlockARM64GE 15598 b.SetControl(cc) 15599 _ = yes 15600 _ = no 15601 return true 15602 } 15603 // match: (If (GreaterEqualU cc) yes no) 15604 // cond: 15605 // result: (UGE cc yes no) 15606 for { 15607 v := b.Control 15608 if v.Op != OpARM64GreaterEqualU { 15609 break 15610 } 15611 cc := v.Args[0] 15612 yes := b.Succs[0] 15613 no := b.Succs[1] 15614 b.Kind = BlockARM64UGE 15615 b.SetControl(cc) 15616 _ = yes 15617 _ = no 15618 return true 15619 } 15620 // match: (If cond yes no) 15621 // cond: 15622 // result: (NZ cond yes no) 15623 for { 15624 v := b.Control 15625 _ = v 15626 cond := b.Control 15627 yes := b.Succs[0] 15628 no := b.Succs[1] 15629 b.Kind = BlockARM64NZ 15630 b.SetControl(cond) 15631 _ = yes 15632 _ = no 15633 return true 15634 } 15635 case BlockARM64LE: 15636 // match: (LE (FlagEQ) yes no) 15637 // cond: 15638 // result: (First nil yes no) 15639 for { 15640 v := b.Control 15641 if v.Op != OpARM64FlagEQ { 15642 break 15643 } 15644 yes := b.Succs[0] 15645 no := b.Succs[1] 15646 b.Kind = BlockFirst 15647 b.SetControl(nil) 15648 _ = yes 15649 _ = no 15650 return true 15651 } 15652 // match: (LE (FlagLT_ULT) yes no) 15653 // cond: 15654 // result: (First nil yes no) 15655 for { 15656 v := b.Control 15657 if v.Op != OpARM64FlagLT_ULT { 15658 break 15659 } 15660 yes := b.Succs[0] 15661 no := b.Succs[1] 15662 b.Kind = BlockFirst 15663 b.SetControl(nil) 15664 _ = yes 15665 _ = no 15666 return true 15667 } 15668 // match: (LE (FlagLT_UGT) yes no) 15669 // cond: 15670 // result: (First nil yes no) 15671 for { 15672 v := b.Control 15673 if v.Op != OpARM64FlagLT_UGT { 15674 break 15675 } 15676 yes := b.Succs[0] 15677 no := b.Succs[1] 15678 b.Kind = BlockFirst 15679 b.SetControl(nil) 15680 _ = yes 15681 _ = no 15682 return true 15683 } 15684 // match: (LE (FlagGT_ULT) yes no) 15685 // cond: 15686 // result: (First nil no yes) 15687 for { 15688 v := b.Control 15689 if v.Op != OpARM64FlagGT_ULT { 15690 break 15691 } 15692 yes := b.Succs[0] 15693 no := b.Succs[1] 15694 b.Kind = BlockFirst 15695 b.SetControl(nil) 15696 b.swapSuccessors() 15697 _ = no 15698 _ = yes 15699 return true 15700 } 15701 // match: (LE (FlagGT_UGT) yes no) 15702 // cond: 15703 // result: (First nil no yes) 15704 for { 15705 v := b.Control 15706 if v.Op != OpARM64FlagGT_UGT { 15707 break 15708 } 15709 yes := b.Succs[0] 15710 no := b.Succs[1] 15711 b.Kind = BlockFirst 15712 b.SetControl(nil) 15713 b.swapSuccessors() 15714 _ = no 15715 _ = yes 15716 return true 15717 } 15718 // match: (LE (InvertFlags cmp) yes no) 15719 // cond: 15720 // result: (GE cmp yes no) 15721 for { 15722 v := b.Control 15723 if v.Op != OpARM64InvertFlags { 15724 break 15725 } 15726 cmp := v.Args[0] 15727 yes := b.Succs[0] 15728 no := b.Succs[1] 15729 b.Kind = BlockARM64GE 15730 b.SetControl(cmp) 15731 _ = yes 15732 _ = no 15733 return true 15734 } 15735 case BlockARM64LT: 15736 // match: (LT (FlagEQ) yes no) 15737 // cond: 15738 // result: (First nil no yes) 15739 for { 15740 v := b.Control 15741 if v.Op != OpARM64FlagEQ { 15742 break 15743 } 15744 yes := b.Succs[0] 15745 no := b.Succs[1] 15746 b.Kind = BlockFirst 15747 b.SetControl(nil) 15748 b.swapSuccessors() 15749 _ = no 15750 _ = yes 15751 return true 15752 } 15753 // match: (LT (FlagLT_ULT) yes no) 15754 // cond: 15755 // result: (First nil yes no) 15756 for { 15757 v := b.Control 15758 if v.Op != OpARM64FlagLT_ULT { 15759 break 15760 } 15761 yes := b.Succs[0] 15762 no := b.Succs[1] 15763 b.Kind = BlockFirst 15764 b.SetControl(nil) 15765 _ = yes 15766 _ = no 15767 return true 15768 } 15769 // match: (LT (FlagLT_UGT) yes no) 15770 // cond: 15771 // result: (First nil yes no) 15772 for { 15773 v := b.Control 15774 if v.Op != OpARM64FlagLT_UGT { 15775 break 15776 } 15777 yes := b.Succs[0] 15778 no := b.Succs[1] 15779 b.Kind = BlockFirst 15780 b.SetControl(nil) 15781 _ = yes 15782 _ = no 15783 return true 15784 } 15785 // match: (LT (FlagGT_ULT) yes no) 15786 // cond: 15787 // result: (First nil no yes) 15788 for { 15789 v := b.Control 15790 if v.Op != OpARM64FlagGT_ULT { 15791 break 15792 } 15793 yes := b.Succs[0] 15794 no := b.Succs[1] 15795 b.Kind = BlockFirst 15796 b.SetControl(nil) 15797 b.swapSuccessors() 15798 _ = no 15799 _ = yes 15800 return true 15801 } 15802 // match: (LT (FlagGT_UGT) yes no) 15803 // cond: 15804 // result: (First nil no yes) 15805 for { 15806 v := b.Control 15807 if v.Op != OpARM64FlagGT_UGT { 15808 break 15809 } 15810 yes := b.Succs[0] 15811 no := b.Succs[1] 15812 b.Kind = BlockFirst 15813 b.SetControl(nil) 15814 b.swapSuccessors() 15815 _ = no 15816 _ = yes 15817 return true 15818 } 15819 // match: (LT (InvertFlags cmp) yes no) 15820 // cond: 15821 // result: (GT cmp yes no) 15822 for { 15823 v := b.Control 15824 if v.Op != OpARM64InvertFlags { 15825 break 15826 } 15827 cmp := v.Args[0] 15828 yes := b.Succs[0] 15829 no := b.Succs[1] 15830 b.Kind = BlockARM64GT 15831 b.SetControl(cmp) 15832 _ = yes 15833 _ = no 15834 return true 15835 } 15836 case BlockARM64NE: 15837 // match: (NE (CMPconst [0] x) yes no) 15838 // cond: 15839 // result: (NZ x yes no) 15840 for { 15841 v := b.Control 15842 if v.Op != OpARM64CMPconst { 15843 break 15844 } 15845 if v.AuxInt != 0 { 15846 break 15847 } 15848 x := v.Args[0] 15849 yes := b.Succs[0] 15850 no := b.Succs[1] 15851 b.Kind = BlockARM64NZ 15852 b.SetControl(x) 15853 _ = yes 15854 _ = no 15855 return true 15856 } 15857 // match: (NE (CMPWconst [0] x) yes no) 15858 // cond: 15859 // result: (NZW x yes no) 15860 for { 15861 v := b.Control 15862 if v.Op != OpARM64CMPWconst { 15863 break 15864 } 15865 if v.AuxInt != 0 { 15866 break 15867 } 15868 x := v.Args[0] 15869 yes := b.Succs[0] 15870 no := b.Succs[1] 15871 b.Kind = BlockARM64NZW 15872 b.SetControl(x) 15873 _ = yes 15874 _ = no 15875 return true 15876 } 15877 // match: (NE (FlagEQ) yes no) 15878 // cond: 15879 // result: (First nil no yes) 15880 for { 15881 v := b.Control 15882 if v.Op != OpARM64FlagEQ { 15883 break 15884 } 15885 yes := b.Succs[0] 15886 no := b.Succs[1] 15887 b.Kind = BlockFirst 15888 b.SetControl(nil) 15889 b.swapSuccessors() 15890 _ = no 15891 _ = yes 15892 return true 15893 } 15894 // match: (NE (FlagLT_ULT) yes no) 15895 // cond: 15896 // result: (First nil yes no) 15897 for { 15898 v := b.Control 15899 if v.Op != OpARM64FlagLT_ULT { 15900 break 15901 } 15902 yes := b.Succs[0] 15903 no := b.Succs[1] 15904 b.Kind = BlockFirst 15905 b.SetControl(nil) 15906 _ = yes 15907 _ = no 15908 return true 15909 } 15910 // match: (NE (FlagLT_UGT) yes no) 15911 // cond: 15912 // result: (First nil yes no) 15913 for { 15914 v := b.Control 15915 if v.Op != OpARM64FlagLT_UGT { 15916 break 15917 } 15918 yes := b.Succs[0] 15919 no := b.Succs[1] 15920 b.Kind = BlockFirst 15921 b.SetControl(nil) 15922 _ = yes 15923 _ = no 15924 return true 15925 } 15926 // match: (NE (FlagGT_ULT) yes no) 15927 // cond: 15928 // result: (First nil yes no) 15929 for { 15930 v := b.Control 15931 if v.Op != OpARM64FlagGT_ULT { 15932 break 15933 } 15934 yes := b.Succs[0] 15935 no := b.Succs[1] 15936 b.Kind = BlockFirst 15937 b.SetControl(nil) 15938 _ = yes 15939 _ = no 15940 return true 15941 } 15942 // match: (NE (FlagGT_UGT) yes no) 15943 // cond: 15944 // result: (First nil yes no) 15945 for { 15946 v := b.Control 15947 if v.Op != OpARM64FlagGT_UGT { 15948 break 15949 } 15950 yes := b.Succs[0] 15951 no := b.Succs[1] 15952 b.Kind = BlockFirst 15953 b.SetControl(nil) 15954 _ = yes 15955 _ = no 15956 return true 15957 } 15958 // match: (NE (InvertFlags cmp) yes no) 15959 // cond: 15960 // result: (NE cmp yes no) 15961 for { 15962 v := b.Control 15963 if v.Op != OpARM64InvertFlags { 15964 break 15965 } 15966 cmp := v.Args[0] 15967 yes := b.Succs[0] 15968 no := b.Succs[1] 15969 b.Kind = BlockARM64NE 15970 b.SetControl(cmp) 15971 _ = yes 15972 _ = no 15973 return true 15974 } 15975 case BlockARM64NZ: 15976 // match: (NZ (Equal cc) yes no) 15977 // cond: 15978 // result: (EQ cc yes no) 15979 for { 15980 v := b.Control 15981 if v.Op != OpARM64Equal { 15982 break 15983 } 15984 cc := v.Args[0] 15985 yes := b.Succs[0] 15986 no := b.Succs[1] 15987 b.Kind = BlockARM64EQ 15988 b.SetControl(cc) 15989 _ = yes 15990 _ = no 15991 return true 15992 } 15993 // match: (NZ (NotEqual cc) yes no) 15994 // cond: 15995 // result: (NE cc yes no) 15996 for { 15997 v := b.Control 15998 if v.Op != OpARM64NotEqual { 15999 break 16000 } 16001 cc := v.Args[0] 16002 yes := b.Succs[0] 16003 no := b.Succs[1] 16004 b.Kind = BlockARM64NE 16005 b.SetControl(cc) 16006 _ = yes 16007 _ = no 16008 return true 16009 } 16010 // match: (NZ (LessThan cc) yes no) 16011 // cond: 16012 // result: (LT cc yes no) 16013 for { 16014 v := b.Control 16015 if v.Op != OpARM64LessThan { 16016 break 16017 } 16018 cc := v.Args[0] 16019 yes := b.Succs[0] 16020 no := b.Succs[1] 16021 b.Kind = BlockARM64LT 16022 b.SetControl(cc) 16023 _ = yes 16024 _ = no 16025 return true 16026 } 16027 // match: (NZ (LessThanU cc) yes no) 16028 // cond: 16029 // result: (ULT cc yes no) 16030 for { 16031 v := b.Control 16032 if v.Op != OpARM64LessThanU { 16033 break 16034 } 16035 cc := v.Args[0] 16036 yes := b.Succs[0] 16037 no := b.Succs[1] 16038 b.Kind = BlockARM64ULT 16039 b.SetControl(cc) 16040 _ = yes 16041 _ = no 16042 return true 16043 } 16044 // match: (NZ (LessEqual cc) yes no) 16045 // cond: 16046 // result: (LE cc yes no) 16047 for { 16048 v := b.Control 16049 if v.Op != OpARM64LessEqual { 16050 break 16051 } 16052 cc := v.Args[0] 16053 yes := b.Succs[0] 16054 no := b.Succs[1] 16055 b.Kind = BlockARM64LE 16056 b.SetControl(cc) 16057 _ = yes 16058 _ = no 16059 return true 16060 } 16061 // match: (NZ (LessEqualU cc) yes no) 16062 // cond: 16063 // result: (ULE cc yes no) 16064 for { 16065 v := b.Control 16066 if v.Op != OpARM64LessEqualU { 16067 break 16068 } 16069 cc := v.Args[0] 16070 yes := b.Succs[0] 16071 no := b.Succs[1] 16072 b.Kind = BlockARM64ULE 16073 b.SetControl(cc) 16074 _ = yes 16075 _ = no 16076 return true 16077 } 16078 // match: (NZ (GreaterThan cc) yes no) 16079 // cond: 16080 // result: (GT cc yes no) 16081 for { 16082 v := b.Control 16083 if v.Op != OpARM64GreaterThan { 16084 break 16085 } 16086 cc := v.Args[0] 16087 yes := b.Succs[0] 16088 no := b.Succs[1] 16089 b.Kind = BlockARM64GT 16090 b.SetControl(cc) 16091 _ = yes 16092 _ = no 16093 return true 16094 } 16095 // match: (NZ (GreaterThanU cc) yes no) 16096 // cond: 16097 // result: (UGT cc yes no) 16098 for { 16099 v := b.Control 16100 if v.Op != OpARM64GreaterThanU { 16101 break 16102 } 16103 cc := v.Args[0] 16104 yes := b.Succs[0] 16105 no := b.Succs[1] 16106 b.Kind = BlockARM64UGT 16107 b.SetControl(cc) 16108 _ = yes 16109 _ = no 16110 return true 16111 } 16112 // match: (NZ (GreaterEqual cc) yes no) 16113 // cond: 16114 // result: (GE cc yes no) 16115 for { 16116 v := b.Control 16117 if v.Op != OpARM64GreaterEqual { 16118 break 16119 } 16120 cc := v.Args[0] 16121 yes := b.Succs[0] 16122 no := b.Succs[1] 16123 b.Kind = BlockARM64GE 16124 b.SetControl(cc) 16125 _ = yes 16126 _ = no 16127 return true 16128 } 16129 // match: (NZ (GreaterEqualU cc) yes no) 16130 // cond: 16131 // result: (UGE cc yes no) 16132 for { 16133 v := b.Control 16134 if v.Op != OpARM64GreaterEqualU { 16135 break 16136 } 16137 cc := v.Args[0] 16138 yes := b.Succs[0] 16139 no := b.Succs[1] 16140 b.Kind = BlockARM64UGE 16141 b.SetControl(cc) 16142 _ = yes 16143 _ = no 16144 return true 16145 } 16146 // match: (NZ (MOVDconst [0]) yes no) 16147 // cond: 16148 // result: (First nil no yes) 16149 for { 16150 v := b.Control 16151 if v.Op != OpARM64MOVDconst { 16152 break 16153 } 16154 if v.AuxInt != 0 { 16155 break 16156 } 16157 yes := b.Succs[0] 16158 no := b.Succs[1] 16159 b.Kind = BlockFirst 16160 b.SetControl(nil) 16161 b.swapSuccessors() 16162 _ = no 16163 _ = yes 16164 return true 16165 } 16166 // match: (NZ (MOVDconst [c]) yes no) 16167 // cond: c != 0 16168 // result: (First nil yes no) 16169 for { 16170 v := b.Control 16171 if v.Op != OpARM64MOVDconst { 16172 break 16173 } 16174 c := v.AuxInt 16175 yes := b.Succs[0] 16176 no := b.Succs[1] 16177 if !(c != 0) { 16178 break 16179 } 16180 b.Kind = BlockFirst 16181 b.SetControl(nil) 16182 _ = yes 16183 _ = no 16184 return true 16185 } 16186 case BlockARM64NZW: 16187 // match: (NZW (MOVDconst [c]) yes no) 16188 // cond: int32(c) == 0 16189 // result: (First nil no yes) 16190 for { 16191 v := b.Control 16192 if v.Op != OpARM64MOVDconst { 16193 break 16194 } 16195 c := v.AuxInt 16196 yes := b.Succs[0] 16197 no := b.Succs[1] 16198 if !(int32(c) == 0) { 16199 break 16200 } 16201 b.Kind = BlockFirst 16202 b.SetControl(nil) 16203 b.swapSuccessors() 16204 _ = no 16205 _ = yes 16206 return true 16207 } 16208 // match: (NZW (MOVDconst [c]) yes no) 16209 // cond: int32(c) != 0 16210 // result: (First nil yes no) 16211 for { 16212 v := b.Control 16213 if v.Op != OpARM64MOVDconst { 16214 break 16215 } 16216 c := v.AuxInt 16217 yes := b.Succs[0] 16218 no := b.Succs[1] 16219 if !(int32(c) != 0) { 16220 break 16221 } 16222 b.Kind = BlockFirst 16223 b.SetControl(nil) 16224 _ = yes 16225 _ = no 16226 return true 16227 } 16228 case BlockARM64UGE: 16229 // match: (UGE (FlagEQ) yes no) 16230 // cond: 16231 // result: (First nil yes no) 16232 for { 16233 v := b.Control 16234 if v.Op != OpARM64FlagEQ { 16235 break 16236 } 16237 yes := b.Succs[0] 16238 no := b.Succs[1] 16239 b.Kind = BlockFirst 16240 b.SetControl(nil) 16241 _ = yes 16242 _ = no 16243 return true 16244 } 16245 // match: (UGE (FlagLT_ULT) yes no) 16246 // cond: 16247 // result: (First nil no yes) 16248 for { 16249 v := b.Control 16250 if v.Op != OpARM64FlagLT_ULT { 16251 break 16252 } 16253 yes := b.Succs[0] 16254 no := b.Succs[1] 16255 b.Kind = BlockFirst 16256 b.SetControl(nil) 16257 b.swapSuccessors() 16258 _ = no 16259 _ = yes 16260 return true 16261 } 16262 // match: (UGE (FlagLT_UGT) yes no) 16263 // cond: 16264 // result: (First nil yes no) 16265 for { 16266 v := b.Control 16267 if v.Op != OpARM64FlagLT_UGT { 16268 break 16269 } 16270 yes := b.Succs[0] 16271 no := b.Succs[1] 16272 b.Kind = BlockFirst 16273 b.SetControl(nil) 16274 _ = yes 16275 _ = no 16276 return true 16277 } 16278 // match: (UGE (FlagGT_ULT) yes no) 16279 // cond: 16280 // result: (First nil no yes) 16281 for { 16282 v := b.Control 16283 if v.Op != OpARM64FlagGT_ULT { 16284 break 16285 } 16286 yes := b.Succs[0] 16287 no := b.Succs[1] 16288 b.Kind = BlockFirst 16289 b.SetControl(nil) 16290 b.swapSuccessors() 16291 _ = no 16292 _ = yes 16293 return true 16294 } 16295 // match: (UGE (FlagGT_UGT) yes no) 16296 // cond: 16297 // result: (First nil yes no) 16298 for { 16299 v := b.Control 16300 if v.Op != OpARM64FlagGT_UGT { 16301 break 16302 } 16303 yes := b.Succs[0] 16304 no := b.Succs[1] 16305 b.Kind = BlockFirst 16306 b.SetControl(nil) 16307 _ = yes 16308 _ = no 16309 return true 16310 } 16311 // match: (UGE (InvertFlags cmp) yes no) 16312 // cond: 16313 // result: (ULE cmp yes no) 16314 for { 16315 v := b.Control 16316 if v.Op != OpARM64InvertFlags { 16317 break 16318 } 16319 cmp := v.Args[0] 16320 yes := b.Succs[0] 16321 no := b.Succs[1] 16322 b.Kind = BlockARM64ULE 16323 b.SetControl(cmp) 16324 _ = yes 16325 _ = no 16326 return true 16327 } 16328 case BlockARM64UGT: 16329 // match: (UGT (FlagEQ) yes no) 16330 // cond: 16331 // result: (First nil no yes) 16332 for { 16333 v := b.Control 16334 if v.Op != OpARM64FlagEQ { 16335 break 16336 } 16337 yes := b.Succs[0] 16338 no := b.Succs[1] 16339 b.Kind = BlockFirst 16340 b.SetControl(nil) 16341 b.swapSuccessors() 16342 _ = no 16343 _ = yes 16344 return true 16345 } 16346 // match: (UGT (FlagLT_ULT) yes no) 16347 // cond: 16348 // result: (First nil no yes) 16349 for { 16350 v := b.Control 16351 if v.Op != OpARM64FlagLT_ULT { 16352 break 16353 } 16354 yes := b.Succs[0] 16355 no := b.Succs[1] 16356 b.Kind = BlockFirst 16357 b.SetControl(nil) 16358 b.swapSuccessors() 16359 _ = no 16360 _ = yes 16361 return true 16362 } 16363 // match: (UGT (FlagLT_UGT) yes no) 16364 // cond: 16365 // result: (First nil yes no) 16366 for { 16367 v := b.Control 16368 if v.Op != OpARM64FlagLT_UGT { 16369 break 16370 } 16371 yes := b.Succs[0] 16372 no := b.Succs[1] 16373 b.Kind = BlockFirst 16374 b.SetControl(nil) 16375 _ = yes 16376 _ = no 16377 return true 16378 } 16379 // match: (UGT (FlagGT_ULT) yes no) 16380 // cond: 16381 // result: (First nil no yes) 16382 for { 16383 v := b.Control 16384 if v.Op != OpARM64FlagGT_ULT { 16385 break 16386 } 16387 yes := b.Succs[0] 16388 no := b.Succs[1] 16389 b.Kind = BlockFirst 16390 b.SetControl(nil) 16391 b.swapSuccessors() 16392 _ = no 16393 _ = yes 16394 return true 16395 } 16396 // match: (UGT (FlagGT_UGT) yes no) 16397 // cond: 16398 // result: (First nil yes no) 16399 for { 16400 v := b.Control 16401 if v.Op != OpARM64FlagGT_UGT { 16402 break 16403 } 16404 yes := b.Succs[0] 16405 no := b.Succs[1] 16406 b.Kind = BlockFirst 16407 b.SetControl(nil) 16408 _ = yes 16409 _ = no 16410 return true 16411 } 16412 // match: (UGT (InvertFlags cmp) yes no) 16413 // cond: 16414 // result: (ULT cmp yes no) 16415 for { 16416 v := b.Control 16417 if v.Op != OpARM64InvertFlags { 16418 break 16419 } 16420 cmp := v.Args[0] 16421 yes := b.Succs[0] 16422 no := b.Succs[1] 16423 b.Kind = BlockARM64ULT 16424 b.SetControl(cmp) 16425 _ = yes 16426 _ = no 16427 return true 16428 } 16429 case BlockARM64ULE: 16430 // match: (ULE (FlagEQ) yes no) 16431 // cond: 16432 // result: (First nil yes no) 16433 for { 16434 v := b.Control 16435 if v.Op != OpARM64FlagEQ { 16436 break 16437 } 16438 yes := b.Succs[0] 16439 no := b.Succs[1] 16440 b.Kind = BlockFirst 16441 b.SetControl(nil) 16442 _ = yes 16443 _ = no 16444 return true 16445 } 16446 // match: (ULE (FlagLT_ULT) yes no) 16447 // cond: 16448 // result: (First nil yes no) 16449 for { 16450 v := b.Control 16451 if v.Op != OpARM64FlagLT_ULT { 16452 break 16453 } 16454 yes := b.Succs[0] 16455 no := b.Succs[1] 16456 b.Kind = BlockFirst 16457 b.SetControl(nil) 16458 _ = yes 16459 _ = no 16460 return true 16461 } 16462 // match: (ULE (FlagLT_UGT) yes no) 16463 // cond: 16464 // result: (First nil no yes) 16465 for { 16466 v := b.Control 16467 if v.Op != OpARM64FlagLT_UGT { 16468 break 16469 } 16470 yes := b.Succs[0] 16471 no := b.Succs[1] 16472 b.Kind = BlockFirst 16473 b.SetControl(nil) 16474 b.swapSuccessors() 16475 _ = no 16476 _ = yes 16477 return true 16478 } 16479 // match: (ULE (FlagGT_ULT) yes no) 16480 // cond: 16481 // result: (First nil yes no) 16482 for { 16483 v := b.Control 16484 if v.Op != OpARM64FlagGT_ULT { 16485 break 16486 } 16487 yes := b.Succs[0] 16488 no := b.Succs[1] 16489 b.Kind = BlockFirst 16490 b.SetControl(nil) 16491 _ = yes 16492 _ = no 16493 return true 16494 } 16495 // match: (ULE (FlagGT_UGT) yes no) 16496 // cond: 16497 // result: (First nil no yes) 16498 for { 16499 v := b.Control 16500 if v.Op != OpARM64FlagGT_UGT { 16501 break 16502 } 16503 yes := b.Succs[0] 16504 no := b.Succs[1] 16505 b.Kind = BlockFirst 16506 b.SetControl(nil) 16507 b.swapSuccessors() 16508 _ = no 16509 _ = yes 16510 return true 16511 } 16512 // match: (ULE (InvertFlags cmp) yes no) 16513 // cond: 16514 // result: (UGE cmp yes no) 16515 for { 16516 v := b.Control 16517 if v.Op != OpARM64InvertFlags { 16518 break 16519 } 16520 cmp := v.Args[0] 16521 yes := b.Succs[0] 16522 no := b.Succs[1] 16523 b.Kind = BlockARM64UGE 16524 b.SetControl(cmp) 16525 _ = yes 16526 _ = no 16527 return true 16528 } 16529 case BlockARM64ULT: 16530 // match: (ULT (FlagEQ) yes no) 16531 // cond: 16532 // result: (First nil no yes) 16533 for { 16534 v := b.Control 16535 if v.Op != OpARM64FlagEQ { 16536 break 16537 } 16538 yes := b.Succs[0] 16539 no := b.Succs[1] 16540 b.Kind = BlockFirst 16541 b.SetControl(nil) 16542 b.swapSuccessors() 16543 _ = no 16544 _ = yes 16545 return true 16546 } 16547 // match: (ULT (FlagLT_ULT) yes no) 16548 // cond: 16549 // result: (First nil yes no) 16550 for { 16551 v := b.Control 16552 if v.Op != OpARM64FlagLT_ULT { 16553 break 16554 } 16555 yes := b.Succs[0] 16556 no := b.Succs[1] 16557 b.Kind = BlockFirst 16558 b.SetControl(nil) 16559 _ = yes 16560 _ = no 16561 return true 16562 } 16563 // match: (ULT (FlagLT_UGT) yes no) 16564 // cond: 16565 // result: (First nil no yes) 16566 for { 16567 v := b.Control 16568 if v.Op != OpARM64FlagLT_UGT { 16569 break 16570 } 16571 yes := b.Succs[0] 16572 no := b.Succs[1] 16573 b.Kind = BlockFirst 16574 b.SetControl(nil) 16575 b.swapSuccessors() 16576 _ = no 16577 _ = yes 16578 return true 16579 } 16580 // match: (ULT (FlagGT_ULT) yes no) 16581 // cond: 16582 // result: (First nil yes no) 16583 for { 16584 v := b.Control 16585 if v.Op != OpARM64FlagGT_ULT { 16586 break 16587 } 16588 yes := b.Succs[0] 16589 no := b.Succs[1] 16590 b.Kind = BlockFirst 16591 b.SetControl(nil) 16592 _ = yes 16593 _ = no 16594 return true 16595 } 16596 // match: (ULT (FlagGT_UGT) yes no) 16597 // cond: 16598 // result: (First nil no yes) 16599 for { 16600 v := b.Control 16601 if v.Op != OpARM64FlagGT_UGT { 16602 break 16603 } 16604 yes := b.Succs[0] 16605 no := b.Succs[1] 16606 b.Kind = BlockFirst 16607 b.SetControl(nil) 16608 b.swapSuccessors() 16609 _ = no 16610 _ = yes 16611 return true 16612 } 16613 // match: (ULT (InvertFlags cmp) yes no) 16614 // cond: 16615 // result: (UGT cmp yes no) 16616 for { 16617 v := b.Control 16618 if v.Op != OpARM64InvertFlags { 16619 break 16620 } 16621 cmp := v.Args[0] 16622 yes := b.Succs[0] 16623 no := b.Succs[1] 16624 b.Kind = BlockARM64UGT 16625 b.SetControl(cmp) 16626 _ = yes 16627 _ = no 16628 return true 16629 } 16630 case BlockARM64Z: 16631 // match: (Z (MOVDconst [0]) yes no) 16632 // cond: 16633 // result: (First nil yes no) 16634 for { 16635 v := b.Control 16636 if v.Op != OpARM64MOVDconst { 16637 break 16638 } 16639 if v.AuxInt != 0 { 16640 break 16641 } 16642 yes := b.Succs[0] 16643 no := b.Succs[1] 16644 b.Kind = BlockFirst 16645 b.SetControl(nil) 16646 _ = yes 16647 _ = no 16648 return true 16649 } 16650 // match: (Z (MOVDconst [c]) yes no) 16651 // cond: c != 0 16652 // result: (First nil no yes) 16653 for { 16654 v := b.Control 16655 if v.Op != OpARM64MOVDconst { 16656 break 16657 } 16658 c := v.AuxInt 16659 yes := b.Succs[0] 16660 no := b.Succs[1] 16661 if !(c != 0) { 16662 break 16663 } 16664 b.Kind = BlockFirst 16665 b.SetControl(nil) 16666 b.swapSuccessors() 16667 _ = no 16668 _ = yes 16669 return true 16670 } 16671 case BlockARM64ZW: 16672 // match: (ZW (MOVDconst [c]) yes no) 16673 // cond: int32(c) == 0 16674 // result: (First nil yes no) 16675 for { 16676 v := b.Control 16677 if v.Op != OpARM64MOVDconst { 16678 break 16679 } 16680 c := v.AuxInt 16681 yes := b.Succs[0] 16682 no := b.Succs[1] 16683 if !(int32(c) == 0) { 16684 break 16685 } 16686 b.Kind = BlockFirst 16687 b.SetControl(nil) 16688 _ = yes 16689 _ = no 16690 return true 16691 } 16692 // match: (ZW (MOVDconst [c]) yes no) 16693 // cond: int32(c) != 0 16694 // result: (First nil no yes) 16695 for { 16696 v := b.Control 16697 if v.Op != OpARM64MOVDconst { 16698 break 16699 } 16700 c := v.AuxInt 16701 yes := b.Succs[0] 16702 no := b.Succs[1] 16703 if !(int32(c) != 0) { 16704 break 16705 } 16706 b.Kind = BlockFirst 16707 b.SetControl(nil) 16708 b.swapSuccessors() 16709 _ = no 16710 _ = yes 16711 return true 16712 } 16713 } 16714 return false 16715 }