github.com/bir3/gocompiler@v0.3.205/src/cmd/compile/internal/ssa/rewriteARM.go (about) 1 // Code generated from _gen/ARM.rules; DO NOT EDIT. 2 // generated with: cd _gen; go run . 3 4 package ssa 5 6 import "github.com/bir3/gocompiler/src/internal/buildcfg" 7 import "github.com/bir3/gocompiler/src/cmd/compile/internal/types" 8 9 func rewriteValueARM(v *Value) bool { 10 switch v.Op { 11 case OpARMADC: 12 return rewriteValueARM_OpARMADC(v) 13 case OpARMADCconst: 14 return rewriteValueARM_OpARMADCconst(v) 15 case OpARMADCshiftLL: 16 return rewriteValueARM_OpARMADCshiftLL(v) 17 case OpARMADCshiftLLreg: 18 return rewriteValueARM_OpARMADCshiftLLreg(v) 19 case OpARMADCshiftRA: 20 return rewriteValueARM_OpARMADCshiftRA(v) 21 case OpARMADCshiftRAreg: 22 return rewriteValueARM_OpARMADCshiftRAreg(v) 23 case OpARMADCshiftRL: 24 return rewriteValueARM_OpARMADCshiftRL(v) 25 case OpARMADCshiftRLreg: 26 return rewriteValueARM_OpARMADCshiftRLreg(v) 27 case OpARMADD: 28 return rewriteValueARM_OpARMADD(v) 29 case OpARMADDD: 30 return rewriteValueARM_OpARMADDD(v) 31 case OpARMADDF: 32 return rewriteValueARM_OpARMADDF(v) 33 case OpARMADDS: 34 return rewriteValueARM_OpARMADDS(v) 35 case OpARMADDSshiftLL: 36 return rewriteValueARM_OpARMADDSshiftLL(v) 37 case OpARMADDSshiftLLreg: 38 return rewriteValueARM_OpARMADDSshiftLLreg(v) 39 case OpARMADDSshiftRA: 40 return rewriteValueARM_OpARMADDSshiftRA(v) 41 case OpARMADDSshiftRAreg: 42 return rewriteValueARM_OpARMADDSshiftRAreg(v) 43 case OpARMADDSshiftRL: 44 return rewriteValueARM_OpARMADDSshiftRL(v) 45 case OpARMADDSshiftRLreg: 46 return rewriteValueARM_OpARMADDSshiftRLreg(v) 47 case OpARMADDconst: 48 return rewriteValueARM_OpARMADDconst(v) 49 case OpARMADDshiftLL: 50 return rewriteValueARM_OpARMADDshiftLL(v) 51 case OpARMADDshiftLLreg: 52 return rewriteValueARM_OpARMADDshiftLLreg(v) 53 case OpARMADDshiftRA: 54 return rewriteValueARM_OpARMADDshiftRA(v) 55 case OpARMADDshiftRAreg: 56 return rewriteValueARM_OpARMADDshiftRAreg(v) 57 case OpARMADDshiftRL: 58 return rewriteValueARM_OpARMADDshiftRL(v) 59 case OpARMADDshiftRLreg: 60 return rewriteValueARM_OpARMADDshiftRLreg(v) 61 case OpARMAND: 62 return rewriteValueARM_OpARMAND(v) 63 case OpARMANDconst: 64 return rewriteValueARM_OpARMANDconst(v) 65 case OpARMANDshiftLL: 66 return rewriteValueARM_OpARMANDshiftLL(v) 67 case OpARMANDshiftLLreg: 68 return rewriteValueARM_OpARMANDshiftLLreg(v) 69 case OpARMANDshiftRA: 70 return rewriteValueARM_OpARMANDshiftRA(v) 71 case OpARMANDshiftRAreg: 72 return rewriteValueARM_OpARMANDshiftRAreg(v) 73 case OpARMANDshiftRL: 74 return rewriteValueARM_OpARMANDshiftRL(v) 75 case OpARMANDshiftRLreg: 76 return rewriteValueARM_OpARMANDshiftRLreg(v) 77 case OpARMBFX: 78 return rewriteValueARM_OpARMBFX(v) 79 case OpARMBFXU: 80 return rewriteValueARM_OpARMBFXU(v) 81 case OpARMBIC: 82 return rewriteValueARM_OpARMBIC(v) 83 case OpARMBICconst: 84 return rewriteValueARM_OpARMBICconst(v) 85 case OpARMBICshiftLL: 86 return rewriteValueARM_OpARMBICshiftLL(v) 87 case OpARMBICshiftLLreg: 88 return rewriteValueARM_OpARMBICshiftLLreg(v) 89 case OpARMBICshiftRA: 90 return rewriteValueARM_OpARMBICshiftRA(v) 91 case OpARMBICshiftRAreg: 92 return rewriteValueARM_OpARMBICshiftRAreg(v) 93 case OpARMBICshiftRL: 94 return rewriteValueARM_OpARMBICshiftRL(v) 95 case OpARMBICshiftRLreg: 96 return rewriteValueARM_OpARMBICshiftRLreg(v) 97 case OpARMCMN: 98 return rewriteValueARM_OpARMCMN(v) 99 case OpARMCMNconst: 100 return rewriteValueARM_OpARMCMNconst(v) 101 case OpARMCMNshiftLL: 102 return rewriteValueARM_OpARMCMNshiftLL(v) 103 case OpARMCMNshiftLLreg: 104 return rewriteValueARM_OpARMCMNshiftLLreg(v) 105 case OpARMCMNshiftRA: 106 return rewriteValueARM_OpARMCMNshiftRA(v) 107 case OpARMCMNshiftRAreg: 108 return rewriteValueARM_OpARMCMNshiftRAreg(v) 109 case OpARMCMNshiftRL: 110 return rewriteValueARM_OpARMCMNshiftRL(v) 111 case OpARMCMNshiftRLreg: 112 return rewriteValueARM_OpARMCMNshiftRLreg(v) 113 case OpARMCMOVWHSconst: 114 return rewriteValueARM_OpARMCMOVWHSconst(v) 115 case OpARMCMOVWLSconst: 116 return rewriteValueARM_OpARMCMOVWLSconst(v) 117 case OpARMCMP: 118 return rewriteValueARM_OpARMCMP(v) 119 case OpARMCMPD: 120 return rewriteValueARM_OpARMCMPD(v) 121 case OpARMCMPF: 122 return rewriteValueARM_OpARMCMPF(v) 123 case OpARMCMPconst: 124 return rewriteValueARM_OpARMCMPconst(v) 125 case OpARMCMPshiftLL: 126 return rewriteValueARM_OpARMCMPshiftLL(v) 127 case OpARMCMPshiftLLreg: 128 return rewriteValueARM_OpARMCMPshiftLLreg(v) 129 case OpARMCMPshiftRA: 130 return rewriteValueARM_OpARMCMPshiftRA(v) 131 case OpARMCMPshiftRAreg: 132 return rewriteValueARM_OpARMCMPshiftRAreg(v) 133 case OpARMCMPshiftRL: 134 return rewriteValueARM_OpARMCMPshiftRL(v) 135 case OpARMCMPshiftRLreg: 136 return rewriteValueARM_OpARMCMPshiftRLreg(v) 137 case OpARMEqual: 138 return rewriteValueARM_OpARMEqual(v) 139 case OpARMGreaterEqual: 140 return rewriteValueARM_OpARMGreaterEqual(v) 141 case OpARMGreaterEqualU: 142 return rewriteValueARM_OpARMGreaterEqualU(v) 143 case OpARMGreaterThan: 144 return rewriteValueARM_OpARMGreaterThan(v) 145 case OpARMGreaterThanU: 146 return rewriteValueARM_OpARMGreaterThanU(v) 147 case OpARMLessEqual: 148 return rewriteValueARM_OpARMLessEqual(v) 149 case OpARMLessEqualU: 150 return rewriteValueARM_OpARMLessEqualU(v) 151 case OpARMLessThan: 152 return rewriteValueARM_OpARMLessThan(v) 153 case OpARMLessThanU: 154 return rewriteValueARM_OpARMLessThanU(v) 155 case OpARMMOVBUload: 156 return rewriteValueARM_OpARMMOVBUload(v) 157 case OpARMMOVBUloadidx: 158 return rewriteValueARM_OpARMMOVBUloadidx(v) 159 case OpARMMOVBUreg: 160 return rewriteValueARM_OpARMMOVBUreg(v) 161 case OpARMMOVBload: 162 return rewriteValueARM_OpARMMOVBload(v) 163 case OpARMMOVBloadidx: 164 return rewriteValueARM_OpARMMOVBloadidx(v) 165 case OpARMMOVBreg: 166 return rewriteValueARM_OpARMMOVBreg(v) 167 case OpARMMOVBstore: 168 return rewriteValueARM_OpARMMOVBstore(v) 169 case OpARMMOVBstoreidx: 170 return rewriteValueARM_OpARMMOVBstoreidx(v) 171 case OpARMMOVDload: 172 return rewriteValueARM_OpARMMOVDload(v) 173 case OpARMMOVDstore: 174 return rewriteValueARM_OpARMMOVDstore(v) 175 case OpARMMOVFload: 176 return rewriteValueARM_OpARMMOVFload(v) 177 case OpARMMOVFstore: 178 return rewriteValueARM_OpARMMOVFstore(v) 179 case OpARMMOVHUload: 180 return rewriteValueARM_OpARMMOVHUload(v) 181 case OpARMMOVHUloadidx: 182 return rewriteValueARM_OpARMMOVHUloadidx(v) 183 case OpARMMOVHUreg: 184 return rewriteValueARM_OpARMMOVHUreg(v) 185 case OpARMMOVHload: 186 return rewriteValueARM_OpARMMOVHload(v) 187 case OpARMMOVHloadidx: 188 return rewriteValueARM_OpARMMOVHloadidx(v) 189 case OpARMMOVHreg: 190 return rewriteValueARM_OpARMMOVHreg(v) 191 case OpARMMOVHstore: 192 return rewriteValueARM_OpARMMOVHstore(v) 193 case OpARMMOVHstoreidx: 194 return rewriteValueARM_OpARMMOVHstoreidx(v) 195 case OpARMMOVWload: 196 return rewriteValueARM_OpARMMOVWload(v) 197 case OpARMMOVWloadidx: 198 return rewriteValueARM_OpARMMOVWloadidx(v) 199 case OpARMMOVWloadshiftLL: 200 return rewriteValueARM_OpARMMOVWloadshiftLL(v) 201 case OpARMMOVWloadshiftRA: 202 return rewriteValueARM_OpARMMOVWloadshiftRA(v) 203 case OpARMMOVWloadshiftRL: 204 return rewriteValueARM_OpARMMOVWloadshiftRL(v) 205 case OpARMMOVWnop: 206 return rewriteValueARM_OpARMMOVWnop(v) 207 case OpARMMOVWreg: 208 return rewriteValueARM_OpARMMOVWreg(v) 209 case OpARMMOVWstore: 210 return rewriteValueARM_OpARMMOVWstore(v) 211 case OpARMMOVWstoreidx: 212 return rewriteValueARM_OpARMMOVWstoreidx(v) 213 case OpARMMOVWstoreshiftLL: 214 return rewriteValueARM_OpARMMOVWstoreshiftLL(v) 215 case OpARMMOVWstoreshiftRA: 216 return rewriteValueARM_OpARMMOVWstoreshiftRA(v) 217 case OpARMMOVWstoreshiftRL: 218 return rewriteValueARM_OpARMMOVWstoreshiftRL(v) 219 case OpARMMUL: 220 return rewriteValueARM_OpARMMUL(v) 221 case OpARMMULA: 222 return rewriteValueARM_OpARMMULA(v) 223 case OpARMMULD: 224 return rewriteValueARM_OpARMMULD(v) 225 case OpARMMULF: 226 return rewriteValueARM_OpARMMULF(v) 227 case OpARMMULS: 228 return rewriteValueARM_OpARMMULS(v) 229 case OpARMMVN: 230 return rewriteValueARM_OpARMMVN(v) 231 case OpARMMVNshiftLL: 232 return rewriteValueARM_OpARMMVNshiftLL(v) 233 case OpARMMVNshiftLLreg: 234 return rewriteValueARM_OpARMMVNshiftLLreg(v) 235 case OpARMMVNshiftRA: 236 return rewriteValueARM_OpARMMVNshiftRA(v) 237 case OpARMMVNshiftRAreg: 238 return rewriteValueARM_OpARMMVNshiftRAreg(v) 239 case OpARMMVNshiftRL: 240 return rewriteValueARM_OpARMMVNshiftRL(v) 241 case OpARMMVNshiftRLreg: 242 return rewriteValueARM_OpARMMVNshiftRLreg(v) 243 case OpARMNEGD: 244 return rewriteValueARM_OpARMNEGD(v) 245 case OpARMNEGF: 246 return rewriteValueARM_OpARMNEGF(v) 247 case OpARMNMULD: 248 return rewriteValueARM_OpARMNMULD(v) 249 case OpARMNMULF: 250 return rewriteValueARM_OpARMNMULF(v) 251 case OpARMNotEqual: 252 return rewriteValueARM_OpARMNotEqual(v) 253 case OpARMOR: 254 return rewriteValueARM_OpARMOR(v) 255 case OpARMORconst: 256 return rewriteValueARM_OpARMORconst(v) 257 case OpARMORshiftLL: 258 return rewriteValueARM_OpARMORshiftLL(v) 259 case OpARMORshiftLLreg: 260 return rewriteValueARM_OpARMORshiftLLreg(v) 261 case OpARMORshiftRA: 262 return rewriteValueARM_OpARMORshiftRA(v) 263 case OpARMORshiftRAreg: 264 return rewriteValueARM_OpARMORshiftRAreg(v) 265 case OpARMORshiftRL: 266 return rewriteValueARM_OpARMORshiftRL(v) 267 case OpARMORshiftRLreg: 268 return rewriteValueARM_OpARMORshiftRLreg(v) 269 case OpARMRSB: 270 return rewriteValueARM_OpARMRSB(v) 271 case OpARMRSBSshiftLL: 272 return rewriteValueARM_OpARMRSBSshiftLL(v) 273 case OpARMRSBSshiftLLreg: 274 return rewriteValueARM_OpARMRSBSshiftLLreg(v) 275 case OpARMRSBSshiftRA: 276 return rewriteValueARM_OpARMRSBSshiftRA(v) 277 case OpARMRSBSshiftRAreg: 278 return rewriteValueARM_OpARMRSBSshiftRAreg(v) 279 case OpARMRSBSshiftRL: 280 return rewriteValueARM_OpARMRSBSshiftRL(v) 281 case OpARMRSBSshiftRLreg: 282 return rewriteValueARM_OpARMRSBSshiftRLreg(v) 283 case OpARMRSBconst: 284 return rewriteValueARM_OpARMRSBconst(v) 285 case OpARMRSBshiftLL: 286 return rewriteValueARM_OpARMRSBshiftLL(v) 287 case OpARMRSBshiftLLreg: 288 return rewriteValueARM_OpARMRSBshiftLLreg(v) 289 case OpARMRSBshiftRA: 290 return rewriteValueARM_OpARMRSBshiftRA(v) 291 case OpARMRSBshiftRAreg: 292 return rewriteValueARM_OpARMRSBshiftRAreg(v) 293 case OpARMRSBshiftRL: 294 return rewriteValueARM_OpARMRSBshiftRL(v) 295 case OpARMRSBshiftRLreg: 296 return rewriteValueARM_OpARMRSBshiftRLreg(v) 297 case OpARMRSCconst: 298 return rewriteValueARM_OpARMRSCconst(v) 299 case OpARMRSCshiftLL: 300 return rewriteValueARM_OpARMRSCshiftLL(v) 301 case OpARMRSCshiftLLreg: 302 return rewriteValueARM_OpARMRSCshiftLLreg(v) 303 case OpARMRSCshiftRA: 304 return rewriteValueARM_OpARMRSCshiftRA(v) 305 case OpARMRSCshiftRAreg: 306 return rewriteValueARM_OpARMRSCshiftRAreg(v) 307 case OpARMRSCshiftRL: 308 return rewriteValueARM_OpARMRSCshiftRL(v) 309 case OpARMRSCshiftRLreg: 310 return rewriteValueARM_OpARMRSCshiftRLreg(v) 311 case OpARMSBC: 312 return rewriteValueARM_OpARMSBC(v) 313 case OpARMSBCconst: 314 return rewriteValueARM_OpARMSBCconst(v) 315 case OpARMSBCshiftLL: 316 return rewriteValueARM_OpARMSBCshiftLL(v) 317 case OpARMSBCshiftLLreg: 318 return rewriteValueARM_OpARMSBCshiftLLreg(v) 319 case OpARMSBCshiftRA: 320 return rewriteValueARM_OpARMSBCshiftRA(v) 321 case OpARMSBCshiftRAreg: 322 return rewriteValueARM_OpARMSBCshiftRAreg(v) 323 case OpARMSBCshiftRL: 324 return rewriteValueARM_OpARMSBCshiftRL(v) 325 case OpARMSBCshiftRLreg: 326 return rewriteValueARM_OpARMSBCshiftRLreg(v) 327 case OpARMSLL: 328 return rewriteValueARM_OpARMSLL(v) 329 case OpARMSLLconst: 330 return rewriteValueARM_OpARMSLLconst(v) 331 case OpARMSRA: 332 return rewriteValueARM_OpARMSRA(v) 333 case OpARMSRAcond: 334 return rewriteValueARM_OpARMSRAcond(v) 335 case OpARMSRAconst: 336 return rewriteValueARM_OpARMSRAconst(v) 337 case OpARMSRL: 338 return rewriteValueARM_OpARMSRL(v) 339 case OpARMSRLconst: 340 return rewriteValueARM_OpARMSRLconst(v) 341 case OpARMSRR: 342 return rewriteValueARM_OpARMSRR(v) 343 case OpARMSUB: 344 return rewriteValueARM_OpARMSUB(v) 345 case OpARMSUBD: 346 return rewriteValueARM_OpARMSUBD(v) 347 case OpARMSUBF: 348 return rewriteValueARM_OpARMSUBF(v) 349 case OpARMSUBS: 350 return rewriteValueARM_OpARMSUBS(v) 351 case OpARMSUBSshiftLL: 352 return rewriteValueARM_OpARMSUBSshiftLL(v) 353 case OpARMSUBSshiftLLreg: 354 return rewriteValueARM_OpARMSUBSshiftLLreg(v) 355 case OpARMSUBSshiftRA: 356 return rewriteValueARM_OpARMSUBSshiftRA(v) 357 case OpARMSUBSshiftRAreg: 358 return rewriteValueARM_OpARMSUBSshiftRAreg(v) 359 case OpARMSUBSshiftRL: 360 return rewriteValueARM_OpARMSUBSshiftRL(v) 361 case OpARMSUBSshiftRLreg: 362 return rewriteValueARM_OpARMSUBSshiftRLreg(v) 363 case OpARMSUBconst: 364 return rewriteValueARM_OpARMSUBconst(v) 365 case OpARMSUBshiftLL: 366 return rewriteValueARM_OpARMSUBshiftLL(v) 367 case OpARMSUBshiftLLreg: 368 return rewriteValueARM_OpARMSUBshiftLLreg(v) 369 case OpARMSUBshiftRA: 370 return rewriteValueARM_OpARMSUBshiftRA(v) 371 case OpARMSUBshiftRAreg: 372 return rewriteValueARM_OpARMSUBshiftRAreg(v) 373 case OpARMSUBshiftRL: 374 return rewriteValueARM_OpARMSUBshiftRL(v) 375 case OpARMSUBshiftRLreg: 376 return rewriteValueARM_OpARMSUBshiftRLreg(v) 377 case OpARMTEQ: 378 return rewriteValueARM_OpARMTEQ(v) 379 case OpARMTEQconst: 380 return rewriteValueARM_OpARMTEQconst(v) 381 case OpARMTEQshiftLL: 382 return rewriteValueARM_OpARMTEQshiftLL(v) 383 case OpARMTEQshiftLLreg: 384 return rewriteValueARM_OpARMTEQshiftLLreg(v) 385 case OpARMTEQshiftRA: 386 return rewriteValueARM_OpARMTEQshiftRA(v) 387 case OpARMTEQshiftRAreg: 388 return rewriteValueARM_OpARMTEQshiftRAreg(v) 389 case OpARMTEQshiftRL: 390 return rewriteValueARM_OpARMTEQshiftRL(v) 391 case OpARMTEQshiftRLreg: 392 return rewriteValueARM_OpARMTEQshiftRLreg(v) 393 case OpARMTST: 394 return rewriteValueARM_OpARMTST(v) 395 case OpARMTSTconst: 396 return rewriteValueARM_OpARMTSTconst(v) 397 case OpARMTSTshiftLL: 398 return rewriteValueARM_OpARMTSTshiftLL(v) 399 case OpARMTSTshiftLLreg: 400 return rewriteValueARM_OpARMTSTshiftLLreg(v) 401 case OpARMTSTshiftRA: 402 return rewriteValueARM_OpARMTSTshiftRA(v) 403 case OpARMTSTshiftRAreg: 404 return rewriteValueARM_OpARMTSTshiftRAreg(v) 405 case OpARMTSTshiftRL: 406 return rewriteValueARM_OpARMTSTshiftRL(v) 407 case OpARMTSTshiftRLreg: 408 return rewriteValueARM_OpARMTSTshiftRLreg(v) 409 case OpARMXOR: 410 return rewriteValueARM_OpARMXOR(v) 411 case OpARMXORconst: 412 return rewriteValueARM_OpARMXORconst(v) 413 case OpARMXORshiftLL: 414 return rewriteValueARM_OpARMXORshiftLL(v) 415 case OpARMXORshiftLLreg: 416 return rewriteValueARM_OpARMXORshiftLLreg(v) 417 case OpARMXORshiftRA: 418 return rewriteValueARM_OpARMXORshiftRA(v) 419 case OpARMXORshiftRAreg: 420 return rewriteValueARM_OpARMXORshiftRAreg(v) 421 case OpARMXORshiftRL: 422 return rewriteValueARM_OpARMXORshiftRL(v) 423 case OpARMXORshiftRLreg: 424 return rewriteValueARM_OpARMXORshiftRLreg(v) 425 case OpARMXORshiftRR: 426 return rewriteValueARM_OpARMXORshiftRR(v) 427 case OpAbs: 428 v.Op = OpARMABSD 429 return true 430 case OpAdd16: 431 v.Op = OpARMADD 432 return true 433 case OpAdd32: 434 v.Op = OpARMADD 435 return true 436 case OpAdd32F: 437 v.Op = OpARMADDF 438 return true 439 case OpAdd32carry: 440 v.Op = OpARMADDS 441 return true 442 case OpAdd32withcarry: 443 v.Op = OpARMADC 444 return true 445 case OpAdd64F: 446 v.Op = OpARMADDD 447 return true 448 case OpAdd8: 449 v.Op = OpARMADD 450 return true 451 case OpAddPtr: 452 v.Op = OpARMADD 453 return true 454 case OpAddr: 455 return rewriteValueARM_OpAddr(v) 456 case OpAnd16: 457 v.Op = OpARMAND 458 return true 459 case OpAnd32: 460 v.Op = OpARMAND 461 return true 462 case OpAnd8: 463 v.Op = OpARMAND 464 return true 465 case OpAndB: 466 v.Op = OpARMAND 467 return true 468 case OpAvg32u: 469 return rewriteValueARM_OpAvg32u(v) 470 case OpBitLen32: 471 return rewriteValueARM_OpBitLen32(v) 472 case OpBswap32: 473 return rewriteValueARM_OpBswap32(v) 474 case OpClosureCall: 475 v.Op = OpARMCALLclosure 476 return true 477 case OpCom16: 478 v.Op = OpARMMVN 479 return true 480 case OpCom32: 481 v.Op = OpARMMVN 482 return true 483 case OpCom8: 484 v.Op = OpARMMVN 485 return true 486 case OpConst16: 487 return rewriteValueARM_OpConst16(v) 488 case OpConst32: 489 return rewriteValueARM_OpConst32(v) 490 case OpConst32F: 491 return rewriteValueARM_OpConst32F(v) 492 case OpConst64F: 493 return rewriteValueARM_OpConst64F(v) 494 case OpConst8: 495 return rewriteValueARM_OpConst8(v) 496 case OpConstBool: 497 return rewriteValueARM_OpConstBool(v) 498 case OpConstNil: 499 return rewriteValueARM_OpConstNil(v) 500 case OpCtz16: 501 return rewriteValueARM_OpCtz16(v) 502 case OpCtz16NonZero: 503 v.Op = OpCtz32 504 return true 505 case OpCtz32: 506 return rewriteValueARM_OpCtz32(v) 507 case OpCtz32NonZero: 508 v.Op = OpCtz32 509 return true 510 case OpCtz8: 511 return rewriteValueARM_OpCtz8(v) 512 case OpCtz8NonZero: 513 v.Op = OpCtz32 514 return true 515 case OpCvt32Fto32: 516 v.Op = OpARMMOVFW 517 return true 518 case OpCvt32Fto32U: 519 v.Op = OpARMMOVFWU 520 return true 521 case OpCvt32Fto64F: 522 v.Op = OpARMMOVFD 523 return true 524 case OpCvt32Uto32F: 525 v.Op = OpARMMOVWUF 526 return true 527 case OpCvt32Uto64F: 528 v.Op = OpARMMOVWUD 529 return true 530 case OpCvt32to32F: 531 v.Op = OpARMMOVWF 532 return true 533 case OpCvt32to64F: 534 v.Op = OpARMMOVWD 535 return true 536 case OpCvt64Fto32: 537 v.Op = OpARMMOVDW 538 return true 539 case OpCvt64Fto32F: 540 v.Op = OpARMMOVDF 541 return true 542 case OpCvt64Fto32U: 543 v.Op = OpARMMOVDWU 544 return true 545 case OpCvtBoolToUint8: 546 v.Op = OpCopy 547 return true 548 case OpDiv16: 549 return rewriteValueARM_OpDiv16(v) 550 case OpDiv16u: 551 return rewriteValueARM_OpDiv16u(v) 552 case OpDiv32: 553 return rewriteValueARM_OpDiv32(v) 554 case OpDiv32F: 555 v.Op = OpARMDIVF 556 return true 557 case OpDiv32u: 558 return rewriteValueARM_OpDiv32u(v) 559 case OpDiv64F: 560 v.Op = OpARMDIVD 561 return true 562 case OpDiv8: 563 return rewriteValueARM_OpDiv8(v) 564 case OpDiv8u: 565 return rewriteValueARM_OpDiv8u(v) 566 case OpEq16: 567 return rewriteValueARM_OpEq16(v) 568 case OpEq32: 569 return rewriteValueARM_OpEq32(v) 570 case OpEq32F: 571 return rewriteValueARM_OpEq32F(v) 572 case OpEq64F: 573 return rewriteValueARM_OpEq64F(v) 574 case OpEq8: 575 return rewriteValueARM_OpEq8(v) 576 case OpEqB: 577 return rewriteValueARM_OpEqB(v) 578 case OpEqPtr: 579 return rewriteValueARM_OpEqPtr(v) 580 case OpFMA: 581 return rewriteValueARM_OpFMA(v) 582 case OpGetCallerPC: 583 v.Op = OpARMLoweredGetCallerPC 584 return true 585 case OpGetCallerSP: 586 v.Op = OpARMLoweredGetCallerSP 587 return true 588 case OpGetClosurePtr: 589 v.Op = OpARMLoweredGetClosurePtr 590 return true 591 case OpHmul32: 592 v.Op = OpARMHMUL 593 return true 594 case OpHmul32u: 595 v.Op = OpARMHMULU 596 return true 597 case OpInterCall: 598 v.Op = OpARMCALLinter 599 return true 600 case OpIsInBounds: 601 return rewriteValueARM_OpIsInBounds(v) 602 case OpIsNonNil: 603 return rewriteValueARM_OpIsNonNil(v) 604 case OpIsSliceInBounds: 605 return rewriteValueARM_OpIsSliceInBounds(v) 606 case OpLeq16: 607 return rewriteValueARM_OpLeq16(v) 608 case OpLeq16U: 609 return rewriteValueARM_OpLeq16U(v) 610 case OpLeq32: 611 return rewriteValueARM_OpLeq32(v) 612 case OpLeq32F: 613 return rewriteValueARM_OpLeq32F(v) 614 case OpLeq32U: 615 return rewriteValueARM_OpLeq32U(v) 616 case OpLeq64F: 617 return rewriteValueARM_OpLeq64F(v) 618 case OpLeq8: 619 return rewriteValueARM_OpLeq8(v) 620 case OpLeq8U: 621 return rewriteValueARM_OpLeq8U(v) 622 case OpLess16: 623 return rewriteValueARM_OpLess16(v) 624 case OpLess16U: 625 return rewriteValueARM_OpLess16U(v) 626 case OpLess32: 627 return rewriteValueARM_OpLess32(v) 628 case OpLess32F: 629 return rewriteValueARM_OpLess32F(v) 630 case OpLess32U: 631 return rewriteValueARM_OpLess32U(v) 632 case OpLess64F: 633 return rewriteValueARM_OpLess64F(v) 634 case OpLess8: 635 return rewriteValueARM_OpLess8(v) 636 case OpLess8U: 637 return rewriteValueARM_OpLess8U(v) 638 case OpLoad: 639 return rewriteValueARM_OpLoad(v) 640 case OpLocalAddr: 641 return rewriteValueARM_OpLocalAddr(v) 642 case OpLsh16x16: 643 return rewriteValueARM_OpLsh16x16(v) 644 case OpLsh16x32: 645 return rewriteValueARM_OpLsh16x32(v) 646 case OpLsh16x64: 647 return rewriteValueARM_OpLsh16x64(v) 648 case OpLsh16x8: 649 return rewriteValueARM_OpLsh16x8(v) 650 case OpLsh32x16: 651 return rewriteValueARM_OpLsh32x16(v) 652 case OpLsh32x32: 653 return rewriteValueARM_OpLsh32x32(v) 654 case OpLsh32x64: 655 return rewriteValueARM_OpLsh32x64(v) 656 case OpLsh32x8: 657 return rewriteValueARM_OpLsh32x8(v) 658 case OpLsh8x16: 659 return rewriteValueARM_OpLsh8x16(v) 660 case OpLsh8x32: 661 return rewriteValueARM_OpLsh8x32(v) 662 case OpLsh8x64: 663 return rewriteValueARM_OpLsh8x64(v) 664 case OpLsh8x8: 665 return rewriteValueARM_OpLsh8x8(v) 666 case OpMod16: 667 return rewriteValueARM_OpMod16(v) 668 case OpMod16u: 669 return rewriteValueARM_OpMod16u(v) 670 case OpMod32: 671 return rewriteValueARM_OpMod32(v) 672 case OpMod32u: 673 return rewriteValueARM_OpMod32u(v) 674 case OpMod8: 675 return rewriteValueARM_OpMod8(v) 676 case OpMod8u: 677 return rewriteValueARM_OpMod8u(v) 678 case OpMove: 679 return rewriteValueARM_OpMove(v) 680 case OpMul16: 681 v.Op = OpARMMUL 682 return true 683 case OpMul32: 684 v.Op = OpARMMUL 685 return true 686 case OpMul32F: 687 v.Op = OpARMMULF 688 return true 689 case OpMul32uhilo: 690 v.Op = OpARMMULLU 691 return true 692 case OpMul64F: 693 v.Op = OpARMMULD 694 return true 695 case OpMul8: 696 v.Op = OpARMMUL 697 return true 698 case OpNeg16: 699 return rewriteValueARM_OpNeg16(v) 700 case OpNeg32: 701 return rewriteValueARM_OpNeg32(v) 702 case OpNeg32F: 703 v.Op = OpARMNEGF 704 return true 705 case OpNeg64F: 706 v.Op = OpARMNEGD 707 return true 708 case OpNeg8: 709 return rewriteValueARM_OpNeg8(v) 710 case OpNeq16: 711 return rewriteValueARM_OpNeq16(v) 712 case OpNeq32: 713 return rewriteValueARM_OpNeq32(v) 714 case OpNeq32F: 715 return rewriteValueARM_OpNeq32F(v) 716 case OpNeq64F: 717 return rewriteValueARM_OpNeq64F(v) 718 case OpNeq8: 719 return rewriteValueARM_OpNeq8(v) 720 case OpNeqB: 721 v.Op = OpARMXOR 722 return true 723 case OpNeqPtr: 724 return rewriteValueARM_OpNeqPtr(v) 725 case OpNilCheck: 726 v.Op = OpARMLoweredNilCheck 727 return true 728 case OpNot: 729 return rewriteValueARM_OpNot(v) 730 case OpOffPtr: 731 return rewriteValueARM_OpOffPtr(v) 732 case OpOr16: 733 v.Op = OpARMOR 734 return true 735 case OpOr32: 736 v.Op = OpARMOR 737 return true 738 case OpOr8: 739 v.Op = OpARMOR 740 return true 741 case OpOrB: 742 v.Op = OpARMOR 743 return true 744 case OpPanicBounds: 745 return rewriteValueARM_OpPanicBounds(v) 746 case OpPanicExtend: 747 return rewriteValueARM_OpPanicExtend(v) 748 case OpRotateLeft16: 749 return rewriteValueARM_OpRotateLeft16(v) 750 case OpRotateLeft32: 751 return rewriteValueARM_OpRotateLeft32(v) 752 case OpRotateLeft8: 753 return rewriteValueARM_OpRotateLeft8(v) 754 case OpRound32F: 755 v.Op = OpCopy 756 return true 757 case OpRound64F: 758 v.Op = OpCopy 759 return true 760 case OpRsh16Ux16: 761 return rewriteValueARM_OpRsh16Ux16(v) 762 case OpRsh16Ux32: 763 return rewriteValueARM_OpRsh16Ux32(v) 764 case OpRsh16Ux64: 765 return rewriteValueARM_OpRsh16Ux64(v) 766 case OpRsh16Ux8: 767 return rewriteValueARM_OpRsh16Ux8(v) 768 case OpRsh16x16: 769 return rewriteValueARM_OpRsh16x16(v) 770 case OpRsh16x32: 771 return rewriteValueARM_OpRsh16x32(v) 772 case OpRsh16x64: 773 return rewriteValueARM_OpRsh16x64(v) 774 case OpRsh16x8: 775 return rewriteValueARM_OpRsh16x8(v) 776 case OpRsh32Ux16: 777 return rewriteValueARM_OpRsh32Ux16(v) 778 case OpRsh32Ux32: 779 return rewriteValueARM_OpRsh32Ux32(v) 780 case OpRsh32Ux64: 781 return rewriteValueARM_OpRsh32Ux64(v) 782 case OpRsh32Ux8: 783 return rewriteValueARM_OpRsh32Ux8(v) 784 case OpRsh32x16: 785 return rewriteValueARM_OpRsh32x16(v) 786 case OpRsh32x32: 787 return rewriteValueARM_OpRsh32x32(v) 788 case OpRsh32x64: 789 return rewriteValueARM_OpRsh32x64(v) 790 case OpRsh32x8: 791 return rewriteValueARM_OpRsh32x8(v) 792 case OpRsh8Ux16: 793 return rewriteValueARM_OpRsh8Ux16(v) 794 case OpRsh8Ux32: 795 return rewriteValueARM_OpRsh8Ux32(v) 796 case OpRsh8Ux64: 797 return rewriteValueARM_OpRsh8Ux64(v) 798 case OpRsh8Ux8: 799 return rewriteValueARM_OpRsh8Ux8(v) 800 case OpRsh8x16: 801 return rewriteValueARM_OpRsh8x16(v) 802 case OpRsh8x32: 803 return rewriteValueARM_OpRsh8x32(v) 804 case OpRsh8x64: 805 return rewriteValueARM_OpRsh8x64(v) 806 case OpRsh8x8: 807 return rewriteValueARM_OpRsh8x8(v) 808 case OpSelect0: 809 return rewriteValueARM_OpSelect0(v) 810 case OpSelect1: 811 return rewriteValueARM_OpSelect1(v) 812 case OpSignExt16to32: 813 v.Op = OpARMMOVHreg 814 return true 815 case OpSignExt8to16: 816 v.Op = OpARMMOVBreg 817 return true 818 case OpSignExt8to32: 819 v.Op = OpARMMOVBreg 820 return true 821 case OpSignmask: 822 return rewriteValueARM_OpSignmask(v) 823 case OpSlicemask: 824 return rewriteValueARM_OpSlicemask(v) 825 case OpSqrt: 826 v.Op = OpARMSQRTD 827 return true 828 case OpSqrt32: 829 v.Op = OpARMSQRTF 830 return true 831 case OpStaticCall: 832 v.Op = OpARMCALLstatic 833 return true 834 case OpStore: 835 return rewriteValueARM_OpStore(v) 836 case OpSub16: 837 v.Op = OpARMSUB 838 return true 839 case OpSub32: 840 v.Op = OpARMSUB 841 return true 842 case OpSub32F: 843 v.Op = OpARMSUBF 844 return true 845 case OpSub32carry: 846 v.Op = OpARMSUBS 847 return true 848 case OpSub32withcarry: 849 v.Op = OpARMSBC 850 return true 851 case OpSub64F: 852 v.Op = OpARMSUBD 853 return true 854 case OpSub8: 855 v.Op = OpARMSUB 856 return true 857 case OpSubPtr: 858 v.Op = OpARMSUB 859 return true 860 case OpTailCall: 861 v.Op = OpARMCALLtail 862 return true 863 case OpTrunc16to8: 864 v.Op = OpCopy 865 return true 866 case OpTrunc32to16: 867 v.Op = OpCopy 868 return true 869 case OpTrunc32to8: 870 v.Op = OpCopy 871 return true 872 case OpWB: 873 v.Op = OpARMLoweredWB 874 return true 875 case OpXor16: 876 v.Op = OpARMXOR 877 return true 878 case OpXor32: 879 v.Op = OpARMXOR 880 return true 881 case OpXor8: 882 v.Op = OpARMXOR 883 return true 884 case OpZero: 885 return rewriteValueARM_OpZero(v) 886 case OpZeroExt16to32: 887 v.Op = OpARMMOVHUreg 888 return true 889 case OpZeroExt8to16: 890 v.Op = OpARMMOVBUreg 891 return true 892 case OpZeroExt8to32: 893 v.Op = OpARMMOVBUreg 894 return true 895 case OpZeromask: 896 return rewriteValueARM_OpZeromask(v) 897 } 898 return false 899 } 900 func rewriteValueARM_OpARMADC(v *Value) bool { 901 v_2 := v.Args[2] 902 v_1 := v.Args[1] 903 v_0 := v.Args[0] 904 // match: (ADC (MOVWconst [c]) x flags) 905 // result: (ADCconst [c] x flags) 906 for { 907 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 908 if v_0.Op != OpARMMOVWconst { 909 continue 910 } 911 c := auxIntToInt32(v_0.AuxInt) 912 x := v_1 913 flags := v_2 914 v.reset(OpARMADCconst) 915 v.AuxInt = int32ToAuxInt(c) 916 v.AddArg2(x, flags) 917 return true 918 } 919 break 920 } 921 // match: (ADC x (SLLconst [c] y) flags) 922 // result: (ADCshiftLL x y [c] flags) 923 for { 924 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 925 x := v_0 926 if v_1.Op != OpARMSLLconst { 927 continue 928 } 929 c := auxIntToInt32(v_1.AuxInt) 930 y := v_1.Args[0] 931 flags := v_2 932 v.reset(OpARMADCshiftLL) 933 v.AuxInt = int32ToAuxInt(c) 934 v.AddArg3(x, y, flags) 935 return true 936 } 937 break 938 } 939 // match: (ADC x (SRLconst [c] y) flags) 940 // result: (ADCshiftRL x y [c] flags) 941 for { 942 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 943 x := v_0 944 if v_1.Op != OpARMSRLconst { 945 continue 946 } 947 c := auxIntToInt32(v_1.AuxInt) 948 y := v_1.Args[0] 949 flags := v_2 950 v.reset(OpARMADCshiftRL) 951 v.AuxInt = int32ToAuxInt(c) 952 v.AddArg3(x, y, flags) 953 return true 954 } 955 break 956 } 957 // match: (ADC x (SRAconst [c] y) flags) 958 // result: (ADCshiftRA x y [c] flags) 959 for { 960 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 961 x := v_0 962 if v_1.Op != OpARMSRAconst { 963 continue 964 } 965 c := auxIntToInt32(v_1.AuxInt) 966 y := v_1.Args[0] 967 flags := v_2 968 v.reset(OpARMADCshiftRA) 969 v.AuxInt = int32ToAuxInt(c) 970 v.AddArg3(x, y, flags) 971 return true 972 } 973 break 974 } 975 // match: (ADC x (SLL y z) flags) 976 // result: (ADCshiftLLreg x y z flags) 977 for { 978 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 979 x := v_0 980 if v_1.Op != OpARMSLL { 981 continue 982 } 983 z := v_1.Args[1] 984 y := v_1.Args[0] 985 flags := v_2 986 v.reset(OpARMADCshiftLLreg) 987 v.AddArg4(x, y, z, flags) 988 return true 989 } 990 break 991 } 992 // match: (ADC x (SRL y z) flags) 993 // result: (ADCshiftRLreg x y z flags) 994 for { 995 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 996 x := v_0 997 if v_1.Op != OpARMSRL { 998 continue 999 } 1000 z := v_1.Args[1] 1001 y := v_1.Args[0] 1002 flags := v_2 1003 v.reset(OpARMADCshiftRLreg) 1004 v.AddArg4(x, y, z, flags) 1005 return true 1006 } 1007 break 1008 } 1009 // match: (ADC x (SRA y z) flags) 1010 // result: (ADCshiftRAreg x y z flags) 1011 for { 1012 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1013 x := v_0 1014 if v_1.Op != OpARMSRA { 1015 continue 1016 } 1017 z := v_1.Args[1] 1018 y := v_1.Args[0] 1019 flags := v_2 1020 v.reset(OpARMADCshiftRAreg) 1021 v.AddArg4(x, y, z, flags) 1022 return true 1023 } 1024 break 1025 } 1026 return false 1027 } 1028 func rewriteValueARM_OpARMADCconst(v *Value) bool { 1029 v_1 := v.Args[1] 1030 v_0 := v.Args[0] 1031 // match: (ADCconst [c] (ADDconst [d] x) flags) 1032 // result: (ADCconst [c+d] x flags) 1033 for { 1034 c := auxIntToInt32(v.AuxInt) 1035 if v_0.Op != OpARMADDconst { 1036 break 1037 } 1038 d := auxIntToInt32(v_0.AuxInt) 1039 x := v_0.Args[0] 1040 flags := v_1 1041 v.reset(OpARMADCconst) 1042 v.AuxInt = int32ToAuxInt(c + d) 1043 v.AddArg2(x, flags) 1044 return true 1045 } 1046 // match: (ADCconst [c] (SUBconst [d] x) flags) 1047 // result: (ADCconst [c-d] x flags) 1048 for { 1049 c := auxIntToInt32(v.AuxInt) 1050 if v_0.Op != OpARMSUBconst { 1051 break 1052 } 1053 d := auxIntToInt32(v_0.AuxInt) 1054 x := v_0.Args[0] 1055 flags := v_1 1056 v.reset(OpARMADCconst) 1057 v.AuxInt = int32ToAuxInt(c - d) 1058 v.AddArg2(x, flags) 1059 return true 1060 } 1061 return false 1062 } 1063 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool { 1064 v_2 := v.Args[2] 1065 v_1 := v.Args[1] 1066 v_0 := v.Args[0] 1067 b := v.Block 1068 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1069 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1070 for { 1071 d := auxIntToInt32(v.AuxInt) 1072 if v_0.Op != OpARMMOVWconst { 1073 break 1074 } 1075 c := auxIntToInt32(v_0.AuxInt) 1076 x := v_1 1077 flags := v_2 1078 v.reset(OpARMADCconst) 1079 v.AuxInt = int32ToAuxInt(c) 1080 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1081 v0.AuxInt = int32ToAuxInt(d) 1082 v0.AddArg(x) 1083 v.AddArg2(v0, flags) 1084 return true 1085 } 1086 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1087 // result: (ADCconst x [c<<uint64(d)] flags) 1088 for { 1089 d := auxIntToInt32(v.AuxInt) 1090 x := v_0 1091 if v_1.Op != OpARMMOVWconst { 1092 break 1093 } 1094 c := auxIntToInt32(v_1.AuxInt) 1095 flags := v_2 1096 v.reset(OpARMADCconst) 1097 v.AuxInt = int32ToAuxInt(c << uint64(d)) 1098 v.AddArg2(x, flags) 1099 return true 1100 } 1101 return false 1102 } 1103 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool { 1104 v_3 := v.Args[3] 1105 v_2 := v.Args[2] 1106 v_1 := v.Args[1] 1107 v_0 := v.Args[0] 1108 b := v.Block 1109 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1110 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1111 for { 1112 if v_0.Op != OpARMMOVWconst { 1113 break 1114 } 1115 c := auxIntToInt32(v_0.AuxInt) 1116 x := v_1 1117 y := v_2 1118 flags := v_3 1119 v.reset(OpARMADCconst) 1120 v.AuxInt = int32ToAuxInt(c) 1121 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1122 v0.AddArg2(x, y) 1123 v.AddArg2(v0, flags) 1124 return true 1125 } 1126 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1127 // cond: 0 <= c && c < 32 1128 // result: (ADCshiftLL x y [c] flags) 1129 for { 1130 x := v_0 1131 y := v_1 1132 if v_2.Op != OpARMMOVWconst { 1133 break 1134 } 1135 c := auxIntToInt32(v_2.AuxInt) 1136 flags := v_3 1137 if !(0 <= c && c < 32) { 1138 break 1139 } 1140 v.reset(OpARMADCshiftLL) 1141 v.AuxInt = int32ToAuxInt(c) 1142 v.AddArg3(x, y, flags) 1143 return true 1144 } 1145 return false 1146 } 1147 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool { 1148 v_2 := v.Args[2] 1149 v_1 := v.Args[1] 1150 v_0 := v.Args[0] 1151 b := v.Block 1152 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1153 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1154 for { 1155 d := auxIntToInt32(v.AuxInt) 1156 if v_0.Op != OpARMMOVWconst { 1157 break 1158 } 1159 c := auxIntToInt32(v_0.AuxInt) 1160 x := v_1 1161 flags := v_2 1162 v.reset(OpARMADCconst) 1163 v.AuxInt = int32ToAuxInt(c) 1164 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1165 v0.AuxInt = int32ToAuxInt(d) 1166 v0.AddArg(x) 1167 v.AddArg2(v0, flags) 1168 return true 1169 } 1170 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1171 // result: (ADCconst x [c>>uint64(d)] flags) 1172 for { 1173 d := auxIntToInt32(v.AuxInt) 1174 x := v_0 1175 if v_1.Op != OpARMMOVWconst { 1176 break 1177 } 1178 c := auxIntToInt32(v_1.AuxInt) 1179 flags := v_2 1180 v.reset(OpARMADCconst) 1181 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 1182 v.AddArg2(x, flags) 1183 return true 1184 } 1185 return false 1186 } 1187 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool { 1188 v_3 := v.Args[3] 1189 v_2 := v.Args[2] 1190 v_1 := v.Args[1] 1191 v_0 := v.Args[0] 1192 b := v.Block 1193 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1194 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1195 for { 1196 if v_0.Op != OpARMMOVWconst { 1197 break 1198 } 1199 c := auxIntToInt32(v_0.AuxInt) 1200 x := v_1 1201 y := v_2 1202 flags := v_3 1203 v.reset(OpARMADCconst) 1204 v.AuxInt = int32ToAuxInt(c) 1205 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1206 v0.AddArg2(x, y) 1207 v.AddArg2(v0, flags) 1208 return true 1209 } 1210 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1211 // cond: 0 <= c && c < 32 1212 // result: (ADCshiftRA x y [c] flags) 1213 for { 1214 x := v_0 1215 y := v_1 1216 if v_2.Op != OpARMMOVWconst { 1217 break 1218 } 1219 c := auxIntToInt32(v_2.AuxInt) 1220 flags := v_3 1221 if !(0 <= c && c < 32) { 1222 break 1223 } 1224 v.reset(OpARMADCshiftRA) 1225 v.AuxInt = int32ToAuxInt(c) 1226 v.AddArg3(x, y, flags) 1227 return true 1228 } 1229 return false 1230 } 1231 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool { 1232 v_2 := v.Args[2] 1233 v_1 := v.Args[1] 1234 v_0 := v.Args[0] 1235 b := v.Block 1236 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1237 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1238 for { 1239 d := auxIntToInt32(v.AuxInt) 1240 if v_0.Op != OpARMMOVWconst { 1241 break 1242 } 1243 c := auxIntToInt32(v_0.AuxInt) 1244 x := v_1 1245 flags := v_2 1246 v.reset(OpARMADCconst) 1247 v.AuxInt = int32ToAuxInt(c) 1248 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1249 v0.AuxInt = int32ToAuxInt(d) 1250 v0.AddArg(x) 1251 v.AddArg2(v0, flags) 1252 return true 1253 } 1254 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1255 // result: (ADCconst x [int32(uint32(c)>>uint64(d))] flags) 1256 for { 1257 d := auxIntToInt32(v.AuxInt) 1258 x := v_0 1259 if v_1.Op != OpARMMOVWconst { 1260 break 1261 } 1262 c := auxIntToInt32(v_1.AuxInt) 1263 flags := v_2 1264 v.reset(OpARMADCconst) 1265 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 1266 v.AddArg2(x, flags) 1267 return true 1268 } 1269 return false 1270 } 1271 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool { 1272 v_3 := v.Args[3] 1273 v_2 := v.Args[2] 1274 v_1 := v.Args[1] 1275 v_0 := v.Args[0] 1276 b := v.Block 1277 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1278 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1279 for { 1280 if v_0.Op != OpARMMOVWconst { 1281 break 1282 } 1283 c := auxIntToInt32(v_0.AuxInt) 1284 x := v_1 1285 y := v_2 1286 flags := v_3 1287 v.reset(OpARMADCconst) 1288 v.AuxInt = int32ToAuxInt(c) 1289 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1290 v0.AddArg2(x, y) 1291 v.AddArg2(v0, flags) 1292 return true 1293 } 1294 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1295 // cond: 0 <= c && c < 32 1296 // result: (ADCshiftRL x y [c] flags) 1297 for { 1298 x := v_0 1299 y := v_1 1300 if v_2.Op != OpARMMOVWconst { 1301 break 1302 } 1303 c := auxIntToInt32(v_2.AuxInt) 1304 flags := v_3 1305 if !(0 <= c && c < 32) { 1306 break 1307 } 1308 v.reset(OpARMADCshiftRL) 1309 v.AuxInt = int32ToAuxInt(c) 1310 v.AddArg3(x, y, flags) 1311 return true 1312 } 1313 return false 1314 } 1315 func rewriteValueARM_OpARMADD(v *Value) bool { 1316 v_1 := v.Args[1] 1317 v_0 := v.Args[0] 1318 b := v.Block 1319 // match: (ADD x (MOVWconst [c])) 1320 // result: (ADDconst [c] x) 1321 for { 1322 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1323 x := v_0 1324 if v_1.Op != OpARMMOVWconst { 1325 continue 1326 } 1327 c := auxIntToInt32(v_1.AuxInt) 1328 v.reset(OpARMADDconst) 1329 v.AuxInt = int32ToAuxInt(c) 1330 v.AddArg(x) 1331 return true 1332 } 1333 break 1334 } 1335 // match: (ADD x (SLLconst [c] y)) 1336 // result: (ADDshiftLL x y [c]) 1337 for { 1338 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1339 x := v_0 1340 if v_1.Op != OpARMSLLconst { 1341 continue 1342 } 1343 c := auxIntToInt32(v_1.AuxInt) 1344 y := v_1.Args[0] 1345 v.reset(OpARMADDshiftLL) 1346 v.AuxInt = int32ToAuxInt(c) 1347 v.AddArg2(x, y) 1348 return true 1349 } 1350 break 1351 } 1352 // match: (ADD x (SRLconst [c] y)) 1353 // result: (ADDshiftRL x y [c]) 1354 for { 1355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1356 x := v_0 1357 if v_1.Op != OpARMSRLconst { 1358 continue 1359 } 1360 c := auxIntToInt32(v_1.AuxInt) 1361 y := v_1.Args[0] 1362 v.reset(OpARMADDshiftRL) 1363 v.AuxInt = int32ToAuxInt(c) 1364 v.AddArg2(x, y) 1365 return true 1366 } 1367 break 1368 } 1369 // match: (ADD x (SRAconst [c] y)) 1370 // result: (ADDshiftRA x y [c]) 1371 for { 1372 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1373 x := v_0 1374 if v_1.Op != OpARMSRAconst { 1375 continue 1376 } 1377 c := auxIntToInt32(v_1.AuxInt) 1378 y := v_1.Args[0] 1379 v.reset(OpARMADDshiftRA) 1380 v.AuxInt = int32ToAuxInt(c) 1381 v.AddArg2(x, y) 1382 return true 1383 } 1384 break 1385 } 1386 // match: (ADD x (SLL y z)) 1387 // result: (ADDshiftLLreg x y z) 1388 for { 1389 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1390 x := v_0 1391 if v_1.Op != OpARMSLL { 1392 continue 1393 } 1394 z := v_1.Args[1] 1395 y := v_1.Args[0] 1396 v.reset(OpARMADDshiftLLreg) 1397 v.AddArg3(x, y, z) 1398 return true 1399 } 1400 break 1401 } 1402 // match: (ADD x (SRL y z)) 1403 // result: (ADDshiftRLreg x y z) 1404 for { 1405 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1406 x := v_0 1407 if v_1.Op != OpARMSRL { 1408 continue 1409 } 1410 z := v_1.Args[1] 1411 y := v_1.Args[0] 1412 v.reset(OpARMADDshiftRLreg) 1413 v.AddArg3(x, y, z) 1414 return true 1415 } 1416 break 1417 } 1418 // match: (ADD x (SRA y z)) 1419 // result: (ADDshiftRAreg x y z) 1420 for { 1421 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1422 x := v_0 1423 if v_1.Op != OpARMSRA { 1424 continue 1425 } 1426 z := v_1.Args[1] 1427 y := v_1.Args[0] 1428 v.reset(OpARMADDshiftRAreg) 1429 v.AddArg3(x, y, z) 1430 return true 1431 } 1432 break 1433 } 1434 // match: (ADD x (RSBconst [0] y)) 1435 // result: (SUB x y) 1436 for { 1437 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1438 x := v_0 1439 if v_1.Op != OpARMRSBconst || auxIntToInt32(v_1.AuxInt) != 0 { 1440 continue 1441 } 1442 y := v_1.Args[0] 1443 v.reset(OpARMSUB) 1444 v.AddArg2(x, y) 1445 return true 1446 } 1447 break 1448 } 1449 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1450 // result: (RSBconst [c+d] (ADD <t> x y)) 1451 for { 1452 t := v.Type 1453 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1454 if v_0.Op != OpARMRSBconst { 1455 continue 1456 } 1457 c := auxIntToInt32(v_0.AuxInt) 1458 x := v_0.Args[0] 1459 if v_1.Op != OpARMRSBconst { 1460 continue 1461 } 1462 d := auxIntToInt32(v_1.AuxInt) 1463 y := v_1.Args[0] 1464 v.reset(OpARMRSBconst) 1465 v.AuxInt = int32ToAuxInt(c + d) 1466 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1467 v0.AddArg2(x, y) 1468 v.AddArg(v0) 1469 return true 1470 } 1471 break 1472 } 1473 // match: (ADD (MUL x y) a) 1474 // result: (MULA x y a) 1475 for { 1476 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1477 if v_0.Op != OpARMMUL { 1478 continue 1479 } 1480 y := v_0.Args[1] 1481 x := v_0.Args[0] 1482 a := v_1 1483 v.reset(OpARMMULA) 1484 v.AddArg3(x, y, a) 1485 return true 1486 } 1487 break 1488 } 1489 return false 1490 } 1491 func rewriteValueARM_OpARMADDD(v *Value) bool { 1492 v_1 := v.Args[1] 1493 v_0 := v.Args[0] 1494 // match: (ADDD a (MULD x y)) 1495 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 1496 // result: (MULAD a x y) 1497 for { 1498 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1499 a := v_0 1500 if v_1.Op != OpARMMULD { 1501 continue 1502 } 1503 y := v_1.Args[1] 1504 x := v_1.Args[0] 1505 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 1506 continue 1507 } 1508 v.reset(OpARMMULAD) 1509 v.AddArg3(a, x, y) 1510 return true 1511 } 1512 break 1513 } 1514 // match: (ADDD a (NMULD x y)) 1515 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 1516 // result: (MULSD a x y) 1517 for { 1518 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1519 a := v_0 1520 if v_1.Op != OpARMNMULD { 1521 continue 1522 } 1523 y := v_1.Args[1] 1524 x := v_1.Args[0] 1525 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 1526 continue 1527 } 1528 v.reset(OpARMMULSD) 1529 v.AddArg3(a, x, y) 1530 return true 1531 } 1532 break 1533 } 1534 return false 1535 } 1536 func rewriteValueARM_OpARMADDF(v *Value) bool { 1537 v_1 := v.Args[1] 1538 v_0 := v.Args[0] 1539 // match: (ADDF a (MULF x y)) 1540 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 1541 // result: (MULAF a x y) 1542 for { 1543 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1544 a := v_0 1545 if v_1.Op != OpARMMULF { 1546 continue 1547 } 1548 y := v_1.Args[1] 1549 x := v_1.Args[0] 1550 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 1551 continue 1552 } 1553 v.reset(OpARMMULAF) 1554 v.AddArg3(a, x, y) 1555 return true 1556 } 1557 break 1558 } 1559 // match: (ADDF a (NMULF x y)) 1560 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 1561 // result: (MULSF a x y) 1562 for { 1563 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1564 a := v_0 1565 if v_1.Op != OpARMNMULF { 1566 continue 1567 } 1568 y := v_1.Args[1] 1569 x := v_1.Args[0] 1570 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 1571 continue 1572 } 1573 v.reset(OpARMMULSF) 1574 v.AddArg3(a, x, y) 1575 return true 1576 } 1577 break 1578 } 1579 return false 1580 } 1581 func rewriteValueARM_OpARMADDS(v *Value) bool { 1582 v_1 := v.Args[1] 1583 v_0 := v.Args[0] 1584 // match: (ADDS x (MOVWconst [c])) 1585 // result: (ADDSconst [c] x) 1586 for { 1587 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1588 x := v_0 1589 if v_1.Op != OpARMMOVWconst { 1590 continue 1591 } 1592 c := auxIntToInt32(v_1.AuxInt) 1593 v.reset(OpARMADDSconst) 1594 v.AuxInt = int32ToAuxInt(c) 1595 v.AddArg(x) 1596 return true 1597 } 1598 break 1599 } 1600 // match: (ADDS x (SLLconst [c] y)) 1601 // result: (ADDSshiftLL x y [c]) 1602 for { 1603 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1604 x := v_0 1605 if v_1.Op != OpARMSLLconst { 1606 continue 1607 } 1608 c := auxIntToInt32(v_1.AuxInt) 1609 y := v_1.Args[0] 1610 v.reset(OpARMADDSshiftLL) 1611 v.AuxInt = int32ToAuxInt(c) 1612 v.AddArg2(x, y) 1613 return true 1614 } 1615 break 1616 } 1617 // match: (ADDS x (SRLconst [c] y)) 1618 // result: (ADDSshiftRL x y [c]) 1619 for { 1620 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1621 x := v_0 1622 if v_1.Op != OpARMSRLconst { 1623 continue 1624 } 1625 c := auxIntToInt32(v_1.AuxInt) 1626 y := v_1.Args[0] 1627 v.reset(OpARMADDSshiftRL) 1628 v.AuxInt = int32ToAuxInt(c) 1629 v.AddArg2(x, y) 1630 return true 1631 } 1632 break 1633 } 1634 // match: (ADDS x (SRAconst [c] y)) 1635 // result: (ADDSshiftRA x y [c]) 1636 for { 1637 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1638 x := v_0 1639 if v_1.Op != OpARMSRAconst { 1640 continue 1641 } 1642 c := auxIntToInt32(v_1.AuxInt) 1643 y := v_1.Args[0] 1644 v.reset(OpARMADDSshiftRA) 1645 v.AuxInt = int32ToAuxInt(c) 1646 v.AddArg2(x, y) 1647 return true 1648 } 1649 break 1650 } 1651 // match: (ADDS x (SLL y z)) 1652 // result: (ADDSshiftLLreg x y z) 1653 for { 1654 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1655 x := v_0 1656 if v_1.Op != OpARMSLL { 1657 continue 1658 } 1659 z := v_1.Args[1] 1660 y := v_1.Args[0] 1661 v.reset(OpARMADDSshiftLLreg) 1662 v.AddArg3(x, y, z) 1663 return true 1664 } 1665 break 1666 } 1667 // match: (ADDS x (SRL y z)) 1668 // result: (ADDSshiftRLreg x y z) 1669 for { 1670 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1671 x := v_0 1672 if v_1.Op != OpARMSRL { 1673 continue 1674 } 1675 z := v_1.Args[1] 1676 y := v_1.Args[0] 1677 v.reset(OpARMADDSshiftRLreg) 1678 v.AddArg3(x, y, z) 1679 return true 1680 } 1681 break 1682 } 1683 // match: (ADDS x (SRA y z)) 1684 // result: (ADDSshiftRAreg x y z) 1685 for { 1686 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1687 x := v_0 1688 if v_1.Op != OpARMSRA { 1689 continue 1690 } 1691 z := v_1.Args[1] 1692 y := v_1.Args[0] 1693 v.reset(OpARMADDSshiftRAreg) 1694 v.AddArg3(x, y, z) 1695 return true 1696 } 1697 break 1698 } 1699 return false 1700 } 1701 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool { 1702 v_1 := v.Args[1] 1703 v_0 := v.Args[0] 1704 b := v.Block 1705 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 1706 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 1707 for { 1708 d := auxIntToInt32(v.AuxInt) 1709 if v_0.Op != OpARMMOVWconst { 1710 break 1711 } 1712 c := auxIntToInt32(v_0.AuxInt) 1713 x := v_1 1714 v.reset(OpARMADDSconst) 1715 v.AuxInt = int32ToAuxInt(c) 1716 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1717 v0.AuxInt = int32ToAuxInt(d) 1718 v0.AddArg(x) 1719 v.AddArg(v0) 1720 return true 1721 } 1722 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 1723 // result: (ADDSconst x [c<<uint64(d)]) 1724 for { 1725 d := auxIntToInt32(v.AuxInt) 1726 x := v_0 1727 if v_1.Op != OpARMMOVWconst { 1728 break 1729 } 1730 c := auxIntToInt32(v_1.AuxInt) 1731 v.reset(OpARMADDSconst) 1732 v.AuxInt = int32ToAuxInt(c << uint64(d)) 1733 v.AddArg(x) 1734 return true 1735 } 1736 return false 1737 } 1738 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool { 1739 v_2 := v.Args[2] 1740 v_1 := v.Args[1] 1741 v_0 := v.Args[0] 1742 b := v.Block 1743 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 1744 // result: (ADDSconst [c] (SLL <x.Type> x y)) 1745 for { 1746 if v_0.Op != OpARMMOVWconst { 1747 break 1748 } 1749 c := auxIntToInt32(v_0.AuxInt) 1750 x := v_1 1751 y := v_2 1752 v.reset(OpARMADDSconst) 1753 v.AuxInt = int32ToAuxInt(c) 1754 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1755 v0.AddArg2(x, y) 1756 v.AddArg(v0) 1757 return true 1758 } 1759 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 1760 // cond: 0 <= c && c < 32 1761 // result: (ADDSshiftLL x y [c]) 1762 for { 1763 x := v_0 1764 y := v_1 1765 if v_2.Op != OpARMMOVWconst { 1766 break 1767 } 1768 c := auxIntToInt32(v_2.AuxInt) 1769 if !(0 <= c && c < 32) { 1770 break 1771 } 1772 v.reset(OpARMADDSshiftLL) 1773 v.AuxInt = int32ToAuxInt(c) 1774 v.AddArg2(x, y) 1775 return true 1776 } 1777 return false 1778 } 1779 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool { 1780 v_1 := v.Args[1] 1781 v_0 := v.Args[0] 1782 b := v.Block 1783 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 1784 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 1785 for { 1786 d := auxIntToInt32(v.AuxInt) 1787 if v_0.Op != OpARMMOVWconst { 1788 break 1789 } 1790 c := auxIntToInt32(v_0.AuxInt) 1791 x := v_1 1792 v.reset(OpARMADDSconst) 1793 v.AuxInt = int32ToAuxInt(c) 1794 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1795 v0.AuxInt = int32ToAuxInt(d) 1796 v0.AddArg(x) 1797 v.AddArg(v0) 1798 return true 1799 } 1800 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 1801 // result: (ADDSconst x [c>>uint64(d)]) 1802 for { 1803 d := auxIntToInt32(v.AuxInt) 1804 x := v_0 1805 if v_1.Op != OpARMMOVWconst { 1806 break 1807 } 1808 c := auxIntToInt32(v_1.AuxInt) 1809 v.reset(OpARMADDSconst) 1810 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 1811 v.AddArg(x) 1812 return true 1813 } 1814 return false 1815 } 1816 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool { 1817 v_2 := v.Args[2] 1818 v_1 := v.Args[1] 1819 v_0 := v.Args[0] 1820 b := v.Block 1821 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 1822 // result: (ADDSconst [c] (SRA <x.Type> x y)) 1823 for { 1824 if v_0.Op != OpARMMOVWconst { 1825 break 1826 } 1827 c := auxIntToInt32(v_0.AuxInt) 1828 x := v_1 1829 y := v_2 1830 v.reset(OpARMADDSconst) 1831 v.AuxInt = int32ToAuxInt(c) 1832 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1833 v0.AddArg2(x, y) 1834 v.AddArg(v0) 1835 return true 1836 } 1837 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 1838 // cond: 0 <= c && c < 32 1839 // result: (ADDSshiftRA x y [c]) 1840 for { 1841 x := v_0 1842 y := v_1 1843 if v_2.Op != OpARMMOVWconst { 1844 break 1845 } 1846 c := auxIntToInt32(v_2.AuxInt) 1847 if !(0 <= c && c < 32) { 1848 break 1849 } 1850 v.reset(OpARMADDSshiftRA) 1851 v.AuxInt = int32ToAuxInt(c) 1852 v.AddArg2(x, y) 1853 return true 1854 } 1855 return false 1856 } 1857 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool { 1858 v_1 := v.Args[1] 1859 v_0 := v.Args[0] 1860 b := v.Block 1861 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 1862 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 1863 for { 1864 d := auxIntToInt32(v.AuxInt) 1865 if v_0.Op != OpARMMOVWconst { 1866 break 1867 } 1868 c := auxIntToInt32(v_0.AuxInt) 1869 x := v_1 1870 v.reset(OpARMADDSconst) 1871 v.AuxInt = int32ToAuxInt(c) 1872 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1873 v0.AuxInt = int32ToAuxInt(d) 1874 v0.AddArg(x) 1875 v.AddArg(v0) 1876 return true 1877 } 1878 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 1879 // result: (ADDSconst x [int32(uint32(c)>>uint64(d))]) 1880 for { 1881 d := auxIntToInt32(v.AuxInt) 1882 x := v_0 1883 if v_1.Op != OpARMMOVWconst { 1884 break 1885 } 1886 c := auxIntToInt32(v_1.AuxInt) 1887 v.reset(OpARMADDSconst) 1888 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 1889 v.AddArg(x) 1890 return true 1891 } 1892 return false 1893 } 1894 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool { 1895 v_2 := v.Args[2] 1896 v_1 := v.Args[1] 1897 v_0 := v.Args[0] 1898 b := v.Block 1899 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 1900 // result: (ADDSconst [c] (SRL <x.Type> x y)) 1901 for { 1902 if v_0.Op != OpARMMOVWconst { 1903 break 1904 } 1905 c := auxIntToInt32(v_0.AuxInt) 1906 x := v_1 1907 y := v_2 1908 v.reset(OpARMADDSconst) 1909 v.AuxInt = int32ToAuxInt(c) 1910 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1911 v0.AddArg2(x, y) 1912 v.AddArg(v0) 1913 return true 1914 } 1915 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 1916 // cond: 0 <= c && c < 32 1917 // result: (ADDSshiftRL x y [c]) 1918 for { 1919 x := v_0 1920 y := v_1 1921 if v_2.Op != OpARMMOVWconst { 1922 break 1923 } 1924 c := auxIntToInt32(v_2.AuxInt) 1925 if !(0 <= c && c < 32) { 1926 break 1927 } 1928 v.reset(OpARMADDSshiftRL) 1929 v.AuxInt = int32ToAuxInt(c) 1930 v.AddArg2(x, y) 1931 return true 1932 } 1933 return false 1934 } 1935 func rewriteValueARM_OpARMADDconst(v *Value) bool { 1936 v_0 := v.Args[0] 1937 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 1938 // result: (MOVWaddr [off1+off2] {sym} ptr) 1939 for { 1940 off1 := auxIntToInt32(v.AuxInt) 1941 if v_0.Op != OpARMMOVWaddr { 1942 break 1943 } 1944 off2 := auxIntToInt32(v_0.AuxInt) 1945 sym := auxToSym(v_0.Aux) 1946 ptr := v_0.Args[0] 1947 v.reset(OpARMMOVWaddr) 1948 v.AuxInt = int32ToAuxInt(off1 + off2) 1949 v.Aux = symToAux(sym) 1950 v.AddArg(ptr) 1951 return true 1952 } 1953 // match: (ADDconst [0] x) 1954 // result: x 1955 for { 1956 if auxIntToInt32(v.AuxInt) != 0 { 1957 break 1958 } 1959 x := v_0 1960 v.copyOf(x) 1961 return true 1962 } 1963 // match: (ADDconst [c] x) 1964 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 1965 // result: (SUBconst [-c] x) 1966 for { 1967 c := auxIntToInt32(v.AuxInt) 1968 x := v_0 1969 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 1970 break 1971 } 1972 v.reset(OpARMSUBconst) 1973 v.AuxInt = int32ToAuxInt(-c) 1974 v.AddArg(x) 1975 return true 1976 } 1977 // match: (ADDconst [c] x) 1978 // cond: buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 1979 // result: (SUBconst [-c] x) 1980 for { 1981 c := auxIntToInt32(v.AuxInt) 1982 x := v_0 1983 if !(buildcfg.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 1984 break 1985 } 1986 v.reset(OpARMSUBconst) 1987 v.AuxInt = int32ToAuxInt(-c) 1988 v.AddArg(x) 1989 return true 1990 } 1991 // match: (ADDconst [c] (MOVWconst [d])) 1992 // result: (MOVWconst [c+d]) 1993 for { 1994 c := auxIntToInt32(v.AuxInt) 1995 if v_0.Op != OpARMMOVWconst { 1996 break 1997 } 1998 d := auxIntToInt32(v_0.AuxInt) 1999 v.reset(OpARMMOVWconst) 2000 v.AuxInt = int32ToAuxInt(c + d) 2001 return true 2002 } 2003 // match: (ADDconst [c] (ADDconst [d] x)) 2004 // result: (ADDconst [c+d] x) 2005 for { 2006 c := auxIntToInt32(v.AuxInt) 2007 if v_0.Op != OpARMADDconst { 2008 break 2009 } 2010 d := auxIntToInt32(v_0.AuxInt) 2011 x := v_0.Args[0] 2012 v.reset(OpARMADDconst) 2013 v.AuxInt = int32ToAuxInt(c + d) 2014 v.AddArg(x) 2015 return true 2016 } 2017 // match: (ADDconst [c] (SUBconst [d] x)) 2018 // result: (ADDconst [c-d] x) 2019 for { 2020 c := auxIntToInt32(v.AuxInt) 2021 if v_0.Op != OpARMSUBconst { 2022 break 2023 } 2024 d := auxIntToInt32(v_0.AuxInt) 2025 x := v_0.Args[0] 2026 v.reset(OpARMADDconst) 2027 v.AuxInt = int32ToAuxInt(c - d) 2028 v.AddArg(x) 2029 return true 2030 } 2031 // match: (ADDconst [c] (RSBconst [d] x)) 2032 // result: (RSBconst [c+d] x) 2033 for { 2034 c := auxIntToInt32(v.AuxInt) 2035 if v_0.Op != OpARMRSBconst { 2036 break 2037 } 2038 d := auxIntToInt32(v_0.AuxInt) 2039 x := v_0.Args[0] 2040 v.reset(OpARMRSBconst) 2041 v.AuxInt = int32ToAuxInt(c + d) 2042 v.AddArg(x) 2043 return true 2044 } 2045 return false 2046 } 2047 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool { 2048 v_1 := v.Args[1] 2049 v_0 := v.Args[0] 2050 b := v.Block 2051 typ := &b.Func.Config.Types 2052 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2053 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2054 for { 2055 d := auxIntToInt32(v.AuxInt) 2056 if v_0.Op != OpARMMOVWconst { 2057 break 2058 } 2059 c := auxIntToInt32(v_0.AuxInt) 2060 x := v_1 2061 v.reset(OpARMADDconst) 2062 v.AuxInt = int32ToAuxInt(c) 2063 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2064 v0.AuxInt = int32ToAuxInt(d) 2065 v0.AddArg(x) 2066 v.AddArg(v0) 2067 return true 2068 } 2069 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2070 // result: (ADDconst x [c<<uint64(d)]) 2071 for { 2072 d := auxIntToInt32(v.AuxInt) 2073 x := v_0 2074 if v_1.Op != OpARMMOVWconst { 2075 break 2076 } 2077 c := auxIntToInt32(v_1.AuxInt) 2078 v.reset(OpARMADDconst) 2079 v.AuxInt = int32ToAuxInt(c << uint64(d)) 2080 v.AddArg(x) 2081 return true 2082 } 2083 // match: (ADDshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 2084 // result: (REV16 x) 2085 for { 2086 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { 2087 break 2088 } 2089 x := v_0.Args[0] 2090 if x != v_1 { 2091 break 2092 } 2093 v.reset(OpARMREV16) 2094 v.AddArg(x) 2095 return true 2096 } 2097 // match: (ADDshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 2098 // cond: buildcfg.GOARM>=6 2099 // result: (REV16 x) 2100 for { 2101 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 2102 break 2103 } 2104 v_0_0 := v_0.Args[0] 2105 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 2106 break 2107 } 2108 x := v_0_0.Args[0] 2109 if x != v_1 || !(buildcfg.GOARM >= 6) { 2110 break 2111 } 2112 v.reset(OpARMREV16) 2113 v.AddArg(x) 2114 return true 2115 } 2116 return false 2117 } 2118 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool { 2119 v_2 := v.Args[2] 2120 v_1 := v.Args[1] 2121 v_0 := v.Args[0] 2122 b := v.Block 2123 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2124 // result: (ADDconst [c] (SLL <x.Type> x y)) 2125 for { 2126 if v_0.Op != OpARMMOVWconst { 2127 break 2128 } 2129 c := auxIntToInt32(v_0.AuxInt) 2130 x := v_1 2131 y := v_2 2132 v.reset(OpARMADDconst) 2133 v.AuxInt = int32ToAuxInt(c) 2134 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2135 v0.AddArg2(x, y) 2136 v.AddArg(v0) 2137 return true 2138 } 2139 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2140 // cond: 0 <= c && c < 32 2141 // result: (ADDshiftLL x y [c]) 2142 for { 2143 x := v_0 2144 y := v_1 2145 if v_2.Op != OpARMMOVWconst { 2146 break 2147 } 2148 c := auxIntToInt32(v_2.AuxInt) 2149 if !(0 <= c && c < 32) { 2150 break 2151 } 2152 v.reset(OpARMADDshiftLL) 2153 v.AuxInt = int32ToAuxInt(c) 2154 v.AddArg2(x, y) 2155 return true 2156 } 2157 return false 2158 } 2159 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool { 2160 v_1 := v.Args[1] 2161 v_0 := v.Args[0] 2162 b := v.Block 2163 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2164 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2165 for { 2166 d := auxIntToInt32(v.AuxInt) 2167 if v_0.Op != OpARMMOVWconst { 2168 break 2169 } 2170 c := auxIntToInt32(v_0.AuxInt) 2171 x := v_1 2172 v.reset(OpARMADDconst) 2173 v.AuxInt = int32ToAuxInt(c) 2174 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2175 v0.AuxInt = int32ToAuxInt(d) 2176 v0.AddArg(x) 2177 v.AddArg(v0) 2178 return true 2179 } 2180 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2181 // result: (ADDconst x [c>>uint64(d)]) 2182 for { 2183 d := auxIntToInt32(v.AuxInt) 2184 x := v_0 2185 if v_1.Op != OpARMMOVWconst { 2186 break 2187 } 2188 c := auxIntToInt32(v_1.AuxInt) 2189 v.reset(OpARMADDconst) 2190 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 2191 v.AddArg(x) 2192 return true 2193 } 2194 return false 2195 } 2196 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool { 2197 v_2 := v.Args[2] 2198 v_1 := v.Args[1] 2199 v_0 := v.Args[0] 2200 b := v.Block 2201 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2202 // result: (ADDconst [c] (SRA <x.Type> x y)) 2203 for { 2204 if v_0.Op != OpARMMOVWconst { 2205 break 2206 } 2207 c := auxIntToInt32(v_0.AuxInt) 2208 x := v_1 2209 y := v_2 2210 v.reset(OpARMADDconst) 2211 v.AuxInt = int32ToAuxInt(c) 2212 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2213 v0.AddArg2(x, y) 2214 v.AddArg(v0) 2215 return true 2216 } 2217 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2218 // cond: 0 <= c && c < 32 2219 // result: (ADDshiftRA x y [c]) 2220 for { 2221 x := v_0 2222 y := v_1 2223 if v_2.Op != OpARMMOVWconst { 2224 break 2225 } 2226 c := auxIntToInt32(v_2.AuxInt) 2227 if !(0 <= c && c < 32) { 2228 break 2229 } 2230 v.reset(OpARMADDshiftRA) 2231 v.AuxInt = int32ToAuxInt(c) 2232 v.AddArg2(x, y) 2233 return true 2234 } 2235 return false 2236 } 2237 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool { 2238 v_1 := v.Args[1] 2239 v_0 := v.Args[0] 2240 b := v.Block 2241 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2242 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2243 for { 2244 d := auxIntToInt32(v.AuxInt) 2245 if v_0.Op != OpARMMOVWconst { 2246 break 2247 } 2248 c := auxIntToInt32(v_0.AuxInt) 2249 x := v_1 2250 v.reset(OpARMADDconst) 2251 v.AuxInt = int32ToAuxInt(c) 2252 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2253 v0.AuxInt = int32ToAuxInt(d) 2254 v0.AddArg(x) 2255 v.AddArg(v0) 2256 return true 2257 } 2258 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2259 // result: (ADDconst x [int32(uint32(c)>>uint64(d))]) 2260 for { 2261 d := auxIntToInt32(v.AuxInt) 2262 x := v_0 2263 if v_1.Op != OpARMMOVWconst { 2264 break 2265 } 2266 c := auxIntToInt32(v_1.AuxInt) 2267 v.reset(OpARMADDconst) 2268 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 2269 v.AddArg(x) 2270 return true 2271 } 2272 return false 2273 } 2274 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool { 2275 v_2 := v.Args[2] 2276 v_1 := v.Args[1] 2277 v_0 := v.Args[0] 2278 b := v.Block 2279 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2280 // result: (ADDconst [c] (SRL <x.Type> x y)) 2281 for { 2282 if v_0.Op != OpARMMOVWconst { 2283 break 2284 } 2285 c := auxIntToInt32(v_0.AuxInt) 2286 x := v_1 2287 y := v_2 2288 v.reset(OpARMADDconst) 2289 v.AuxInt = int32ToAuxInt(c) 2290 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2291 v0.AddArg2(x, y) 2292 v.AddArg(v0) 2293 return true 2294 } 2295 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2296 // cond: 0 <= c && c < 32 2297 // result: (ADDshiftRL x y [c]) 2298 for { 2299 x := v_0 2300 y := v_1 2301 if v_2.Op != OpARMMOVWconst { 2302 break 2303 } 2304 c := auxIntToInt32(v_2.AuxInt) 2305 if !(0 <= c && c < 32) { 2306 break 2307 } 2308 v.reset(OpARMADDshiftRL) 2309 v.AuxInt = int32ToAuxInt(c) 2310 v.AddArg2(x, y) 2311 return true 2312 } 2313 return false 2314 } 2315 func rewriteValueARM_OpARMAND(v *Value) bool { 2316 v_1 := v.Args[1] 2317 v_0 := v.Args[0] 2318 // match: (AND x (MOVWconst [c])) 2319 // result: (ANDconst [c] x) 2320 for { 2321 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2322 x := v_0 2323 if v_1.Op != OpARMMOVWconst { 2324 continue 2325 } 2326 c := auxIntToInt32(v_1.AuxInt) 2327 v.reset(OpARMANDconst) 2328 v.AuxInt = int32ToAuxInt(c) 2329 v.AddArg(x) 2330 return true 2331 } 2332 break 2333 } 2334 // match: (AND x (SLLconst [c] y)) 2335 // result: (ANDshiftLL x y [c]) 2336 for { 2337 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2338 x := v_0 2339 if v_1.Op != OpARMSLLconst { 2340 continue 2341 } 2342 c := auxIntToInt32(v_1.AuxInt) 2343 y := v_1.Args[0] 2344 v.reset(OpARMANDshiftLL) 2345 v.AuxInt = int32ToAuxInt(c) 2346 v.AddArg2(x, y) 2347 return true 2348 } 2349 break 2350 } 2351 // match: (AND x (SRLconst [c] y)) 2352 // result: (ANDshiftRL x y [c]) 2353 for { 2354 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2355 x := v_0 2356 if v_1.Op != OpARMSRLconst { 2357 continue 2358 } 2359 c := auxIntToInt32(v_1.AuxInt) 2360 y := v_1.Args[0] 2361 v.reset(OpARMANDshiftRL) 2362 v.AuxInt = int32ToAuxInt(c) 2363 v.AddArg2(x, y) 2364 return true 2365 } 2366 break 2367 } 2368 // match: (AND x (SRAconst [c] y)) 2369 // result: (ANDshiftRA x y [c]) 2370 for { 2371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2372 x := v_0 2373 if v_1.Op != OpARMSRAconst { 2374 continue 2375 } 2376 c := auxIntToInt32(v_1.AuxInt) 2377 y := v_1.Args[0] 2378 v.reset(OpARMANDshiftRA) 2379 v.AuxInt = int32ToAuxInt(c) 2380 v.AddArg2(x, y) 2381 return true 2382 } 2383 break 2384 } 2385 // match: (AND x (SLL y z)) 2386 // result: (ANDshiftLLreg x y z) 2387 for { 2388 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2389 x := v_0 2390 if v_1.Op != OpARMSLL { 2391 continue 2392 } 2393 z := v_1.Args[1] 2394 y := v_1.Args[0] 2395 v.reset(OpARMANDshiftLLreg) 2396 v.AddArg3(x, y, z) 2397 return true 2398 } 2399 break 2400 } 2401 // match: (AND x (SRL y z)) 2402 // result: (ANDshiftRLreg x y z) 2403 for { 2404 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2405 x := v_0 2406 if v_1.Op != OpARMSRL { 2407 continue 2408 } 2409 z := v_1.Args[1] 2410 y := v_1.Args[0] 2411 v.reset(OpARMANDshiftRLreg) 2412 v.AddArg3(x, y, z) 2413 return true 2414 } 2415 break 2416 } 2417 // match: (AND x (SRA y z)) 2418 // result: (ANDshiftRAreg x y z) 2419 for { 2420 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2421 x := v_0 2422 if v_1.Op != OpARMSRA { 2423 continue 2424 } 2425 z := v_1.Args[1] 2426 y := v_1.Args[0] 2427 v.reset(OpARMANDshiftRAreg) 2428 v.AddArg3(x, y, z) 2429 return true 2430 } 2431 break 2432 } 2433 // match: (AND x x) 2434 // result: x 2435 for { 2436 x := v_0 2437 if x != v_1 { 2438 break 2439 } 2440 v.copyOf(x) 2441 return true 2442 } 2443 // match: (AND x (MVN y)) 2444 // result: (BIC x y) 2445 for { 2446 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2447 x := v_0 2448 if v_1.Op != OpARMMVN { 2449 continue 2450 } 2451 y := v_1.Args[0] 2452 v.reset(OpARMBIC) 2453 v.AddArg2(x, y) 2454 return true 2455 } 2456 break 2457 } 2458 // match: (AND x (MVNshiftLL y [c])) 2459 // result: (BICshiftLL x y [c]) 2460 for { 2461 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2462 x := v_0 2463 if v_1.Op != OpARMMVNshiftLL { 2464 continue 2465 } 2466 c := auxIntToInt32(v_1.AuxInt) 2467 y := v_1.Args[0] 2468 v.reset(OpARMBICshiftLL) 2469 v.AuxInt = int32ToAuxInt(c) 2470 v.AddArg2(x, y) 2471 return true 2472 } 2473 break 2474 } 2475 // match: (AND x (MVNshiftRL y [c])) 2476 // result: (BICshiftRL x y [c]) 2477 for { 2478 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2479 x := v_0 2480 if v_1.Op != OpARMMVNshiftRL { 2481 continue 2482 } 2483 c := auxIntToInt32(v_1.AuxInt) 2484 y := v_1.Args[0] 2485 v.reset(OpARMBICshiftRL) 2486 v.AuxInt = int32ToAuxInt(c) 2487 v.AddArg2(x, y) 2488 return true 2489 } 2490 break 2491 } 2492 // match: (AND x (MVNshiftRA y [c])) 2493 // result: (BICshiftRA x y [c]) 2494 for { 2495 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2496 x := v_0 2497 if v_1.Op != OpARMMVNshiftRA { 2498 continue 2499 } 2500 c := auxIntToInt32(v_1.AuxInt) 2501 y := v_1.Args[0] 2502 v.reset(OpARMBICshiftRA) 2503 v.AuxInt = int32ToAuxInt(c) 2504 v.AddArg2(x, y) 2505 return true 2506 } 2507 break 2508 } 2509 return false 2510 } 2511 func rewriteValueARM_OpARMANDconst(v *Value) bool { 2512 v_0 := v.Args[0] 2513 // match: (ANDconst [0] _) 2514 // result: (MOVWconst [0]) 2515 for { 2516 if auxIntToInt32(v.AuxInt) != 0 { 2517 break 2518 } 2519 v.reset(OpARMMOVWconst) 2520 v.AuxInt = int32ToAuxInt(0) 2521 return true 2522 } 2523 // match: (ANDconst [c] x) 2524 // cond: int32(c)==-1 2525 // result: x 2526 for { 2527 c := auxIntToInt32(v.AuxInt) 2528 x := v_0 2529 if !(int32(c) == -1) { 2530 break 2531 } 2532 v.copyOf(x) 2533 return true 2534 } 2535 // match: (ANDconst [c] x) 2536 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 2537 // result: (BICconst [int32(^uint32(c))] x) 2538 for { 2539 c := auxIntToInt32(v.AuxInt) 2540 x := v_0 2541 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 2542 break 2543 } 2544 v.reset(OpARMBICconst) 2545 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 2546 v.AddArg(x) 2547 return true 2548 } 2549 // match: (ANDconst [c] x) 2550 // cond: buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 2551 // result: (BICconst [int32(^uint32(c))] x) 2552 for { 2553 c := auxIntToInt32(v.AuxInt) 2554 x := v_0 2555 if !(buildcfg.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 2556 break 2557 } 2558 v.reset(OpARMBICconst) 2559 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 2560 v.AddArg(x) 2561 return true 2562 } 2563 // match: (ANDconst [c] (MOVWconst [d])) 2564 // result: (MOVWconst [c&d]) 2565 for { 2566 c := auxIntToInt32(v.AuxInt) 2567 if v_0.Op != OpARMMOVWconst { 2568 break 2569 } 2570 d := auxIntToInt32(v_0.AuxInt) 2571 v.reset(OpARMMOVWconst) 2572 v.AuxInt = int32ToAuxInt(c & d) 2573 return true 2574 } 2575 // match: (ANDconst [c] (ANDconst [d] x)) 2576 // result: (ANDconst [c&d] x) 2577 for { 2578 c := auxIntToInt32(v.AuxInt) 2579 if v_0.Op != OpARMANDconst { 2580 break 2581 } 2582 d := auxIntToInt32(v_0.AuxInt) 2583 x := v_0.Args[0] 2584 v.reset(OpARMANDconst) 2585 v.AuxInt = int32ToAuxInt(c & d) 2586 v.AddArg(x) 2587 return true 2588 } 2589 return false 2590 } 2591 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool { 2592 v_1 := v.Args[1] 2593 v_0 := v.Args[0] 2594 b := v.Block 2595 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 2596 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 2597 for { 2598 d := auxIntToInt32(v.AuxInt) 2599 if v_0.Op != OpARMMOVWconst { 2600 break 2601 } 2602 c := auxIntToInt32(v_0.AuxInt) 2603 x := v_1 2604 v.reset(OpARMANDconst) 2605 v.AuxInt = int32ToAuxInt(c) 2606 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2607 v0.AuxInt = int32ToAuxInt(d) 2608 v0.AddArg(x) 2609 v.AddArg(v0) 2610 return true 2611 } 2612 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 2613 // result: (ANDconst x [c<<uint64(d)]) 2614 for { 2615 d := auxIntToInt32(v.AuxInt) 2616 x := v_0 2617 if v_1.Op != OpARMMOVWconst { 2618 break 2619 } 2620 c := auxIntToInt32(v_1.AuxInt) 2621 v.reset(OpARMANDconst) 2622 v.AuxInt = int32ToAuxInt(c << uint64(d)) 2623 v.AddArg(x) 2624 return true 2625 } 2626 // match: (ANDshiftLL y:(SLLconst x [c]) x [c]) 2627 // result: y 2628 for { 2629 c := auxIntToInt32(v.AuxInt) 2630 y := v_0 2631 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c { 2632 break 2633 } 2634 x := y.Args[0] 2635 if x != v_1 { 2636 break 2637 } 2638 v.copyOf(y) 2639 return true 2640 } 2641 return false 2642 } 2643 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool { 2644 v_2 := v.Args[2] 2645 v_1 := v.Args[1] 2646 v_0 := v.Args[0] 2647 b := v.Block 2648 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 2649 // result: (ANDconst [c] (SLL <x.Type> x y)) 2650 for { 2651 if v_0.Op != OpARMMOVWconst { 2652 break 2653 } 2654 c := auxIntToInt32(v_0.AuxInt) 2655 x := v_1 2656 y := v_2 2657 v.reset(OpARMANDconst) 2658 v.AuxInt = int32ToAuxInt(c) 2659 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2660 v0.AddArg2(x, y) 2661 v.AddArg(v0) 2662 return true 2663 } 2664 // match: (ANDshiftLLreg x y (MOVWconst [c])) 2665 // cond: 0 <= c && c < 32 2666 // result: (ANDshiftLL x y [c]) 2667 for { 2668 x := v_0 2669 y := v_1 2670 if v_2.Op != OpARMMOVWconst { 2671 break 2672 } 2673 c := auxIntToInt32(v_2.AuxInt) 2674 if !(0 <= c && c < 32) { 2675 break 2676 } 2677 v.reset(OpARMANDshiftLL) 2678 v.AuxInt = int32ToAuxInt(c) 2679 v.AddArg2(x, y) 2680 return true 2681 } 2682 return false 2683 } 2684 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool { 2685 v_1 := v.Args[1] 2686 v_0 := v.Args[0] 2687 b := v.Block 2688 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 2689 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 2690 for { 2691 d := auxIntToInt32(v.AuxInt) 2692 if v_0.Op != OpARMMOVWconst { 2693 break 2694 } 2695 c := auxIntToInt32(v_0.AuxInt) 2696 x := v_1 2697 v.reset(OpARMANDconst) 2698 v.AuxInt = int32ToAuxInt(c) 2699 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2700 v0.AuxInt = int32ToAuxInt(d) 2701 v0.AddArg(x) 2702 v.AddArg(v0) 2703 return true 2704 } 2705 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 2706 // result: (ANDconst x [c>>uint64(d)]) 2707 for { 2708 d := auxIntToInt32(v.AuxInt) 2709 x := v_0 2710 if v_1.Op != OpARMMOVWconst { 2711 break 2712 } 2713 c := auxIntToInt32(v_1.AuxInt) 2714 v.reset(OpARMANDconst) 2715 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 2716 v.AddArg(x) 2717 return true 2718 } 2719 // match: (ANDshiftRA y:(SRAconst x [c]) x [c]) 2720 // result: y 2721 for { 2722 c := auxIntToInt32(v.AuxInt) 2723 y := v_0 2724 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c { 2725 break 2726 } 2727 x := y.Args[0] 2728 if x != v_1 { 2729 break 2730 } 2731 v.copyOf(y) 2732 return true 2733 } 2734 return false 2735 } 2736 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool { 2737 v_2 := v.Args[2] 2738 v_1 := v.Args[1] 2739 v_0 := v.Args[0] 2740 b := v.Block 2741 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 2742 // result: (ANDconst [c] (SRA <x.Type> x y)) 2743 for { 2744 if v_0.Op != OpARMMOVWconst { 2745 break 2746 } 2747 c := auxIntToInt32(v_0.AuxInt) 2748 x := v_1 2749 y := v_2 2750 v.reset(OpARMANDconst) 2751 v.AuxInt = int32ToAuxInt(c) 2752 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2753 v0.AddArg2(x, y) 2754 v.AddArg(v0) 2755 return true 2756 } 2757 // match: (ANDshiftRAreg x y (MOVWconst [c])) 2758 // cond: 0 <= c && c < 32 2759 // result: (ANDshiftRA x y [c]) 2760 for { 2761 x := v_0 2762 y := v_1 2763 if v_2.Op != OpARMMOVWconst { 2764 break 2765 } 2766 c := auxIntToInt32(v_2.AuxInt) 2767 if !(0 <= c && c < 32) { 2768 break 2769 } 2770 v.reset(OpARMANDshiftRA) 2771 v.AuxInt = int32ToAuxInt(c) 2772 v.AddArg2(x, y) 2773 return true 2774 } 2775 return false 2776 } 2777 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool { 2778 v_1 := v.Args[1] 2779 v_0 := v.Args[0] 2780 b := v.Block 2781 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 2782 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 2783 for { 2784 d := auxIntToInt32(v.AuxInt) 2785 if v_0.Op != OpARMMOVWconst { 2786 break 2787 } 2788 c := auxIntToInt32(v_0.AuxInt) 2789 x := v_1 2790 v.reset(OpARMANDconst) 2791 v.AuxInt = int32ToAuxInt(c) 2792 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2793 v0.AuxInt = int32ToAuxInt(d) 2794 v0.AddArg(x) 2795 v.AddArg(v0) 2796 return true 2797 } 2798 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 2799 // result: (ANDconst x [int32(uint32(c)>>uint64(d))]) 2800 for { 2801 d := auxIntToInt32(v.AuxInt) 2802 x := v_0 2803 if v_1.Op != OpARMMOVWconst { 2804 break 2805 } 2806 c := auxIntToInt32(v_1.AuxInt) 2807 v.reset(OpARMANDconst) 2808 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 2809 v.AddArg(x) 2810 return true 2811 } 2812 // match: (ANDshiftRL y:(SRLconst x [c]) x [c]) 2813 // result: y 2814 for { 2815 c := auxIntToInt32(v.AuxInt) 2816 y := v_0 2817 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c { 2818 break 2819 } 2820 x := y.Args[0] 2821 if x != v_1 { 2822 break 2823 } 2824 v.copyOf(y) 2825 return true 2826 } 2827 return false 2828 } 2829 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool { 2830 v_2 := v.Args[2] 2831 v_1 := v.Args[1] 2832 v_0 := v.Args[0] 2833 b := v.Block 2834 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 2835 // result: (ANDconst [c] (SRL <x.Type> x y)) 2836 for { 2837 if v_0.Op != OpARMMOVWconst { 2838 break 2839 } 2840 c := auxIntToInt32(v_0.AuxInt) 2841 x := v_1 2842 y := v_2 2843 v.reset(OpARMANDconst) 2844 v.AuxInt = int32ToAuxInt(c) 2845 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2846 v0.AddArg2(x, y) 2847 v.AddArg(v0) 2848 return true 2849 } 2850 // match: (ANDshiftRLreg x y (MOVWconst [c])) 2851 // cond: 0 <= c && c < 32 2852 // result: (ANDshiftRL x y [c]) 2853 for { 2854 x := v_0 2855 y := v_1 2856 if v_2.Op != OpARMMOVWconst { 2857 break 2858 } 2859 c := auxIntToInt32(v_2.AuxInt) 2860 if !(0 <= c && c < 32) { 2861 break 2862 } 2863 v.reset(OpARMANDshiftRL) 2864 v.AuxInt = int32ToAuxInt(c) 2865 v.AddArg2(x, y) 2866 return true 2867 } 2868 return false 2869 } 2870 func rewriteValueARM_OpARMBFX(v *Value) bool { 2871 v_0 := v.Args[0] 2872 // match: (BFX [c] (MOVWconst [d])) 2873 // result: (MOVWconst [d<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8))]) 2874 for { 2875 c := auxIntToInt32(v.AuxInt) 2876 if v_0.Op != OpARMMOVWconst { 2877 break 2878 } 2879 d := auxIntToInt32(v_0.AuxInt) 2880 v.reset(OpARMMOVWconst) 2881 v.AuxInt = int32ToAuxInt(d << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 2882 return true 2883 } 2884 return false 2885 } 2886 func rewriteValueARM_OpARMBFXU(v *Value) bool { 2887 v_0 := v.Args[0] 2888 // match: (BFXU [c] (MOVWconst [d])) 2889 // result: (MOVWconst [int32(uint32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 2890 for { 2891 c := auxIntToInt32(v.AuxInt) 2892 if v_0.Op != OpARMMOVWconst { 2893 break 2894 } 2895 d := auxIntToInt32(v_0.AuxInt) 2896 v.reset(OpARMMOVWconst) 2897 v.AuxInt = int32ToAuxInt(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))) 2898 return true 2899 } 2900 return false 2901 } 2902 func rewriteValueARM_OpARMBIC(v *Value) bool { 2903 v_1 := v.Args[1] 2904 v_0 := v.Args[0] 2905 // match: (BIC x (MOVWconst [c])) 2906 // result: (BICconst [c] x) 2907 for { 2908 x := v_0 2909 if v_1.Op != OpARMMOVWconst { 2910 break 2911 } 2912 c := auxIntToInt32(v_1.AuxInt) 2913 v.reset(OpARMBICconst) 2914 v.AuxInt = int32ToAuxInt(c) 2915 v.AddArg(x) 2916 return true 2917 } 2918 // match: (BIC x (SLLconst [c] y)) 2919 // result: (BICshiftLL x y [c]) 2920 for { 2921 x := v_0 2922 if v_1.Op != OpARMSLLconst { 2923 break 2924 } 2925 c := auxIntToInt32(v_1.AuxInt) 2926 y := v_1.Args[0] 2927 v.reset(OpARMBICshiftLL) 2928 v.AuxInt = int32ToAuxInt(c) 2929 v.AddArg2(x, y) 2930 return true 2931 } 2932 // match: (BIC x (SRLconst [c] y)) 2933 // result: (BICshiftRL x y [c]) 2934 for { 2935 x := v_0 2936 if v_1.Op != OpARMSRLconst { 2937 break 2938 } 2939 c := auxIntToInt32(v_1.AuxInt) 2940 y := v_1.Args[0] 2941 v.reset(OpARMBICshiftRL) 2942 v.AuxInt = int32ToAuxInt(c) 2943 v.AddArg2(x, y) 2944 return true 2945 } 2946 // match: (BIC x (SRAconst [c] y)) 2947 // result: (BICshiftRA x y [c]) 2948 for { 2949 x := v_0 2950 if v_1.Op != OpARMSRAconst { 2951 break 2952 } 2953 c := auxIntToInt32(v_1.AuxInt) 2954 y := v_1.Args[0] 2955 v.reset(OpARMBICshiftRA) 2956 v.AuxInt = int32ToAuxInt(c) 2957 v.AddArg2(x, y) 2958 return true 2959 } 2960 // match: (BIC x (SLL y z)) 2961 // result: (BICshiftLLreg x y z) 2962 for { 2963 x := v_0 2964 if v_1.Op != OpARMSLL { 2965 break 2966 } 2967 z := v_1.Args[1] 2968 y := v_1.Args[0] 2969 v.reset(OpARMBICshiftLLreg) 2970 v.AddArg3(x, y, z) 2971 return true 2972 } 2973 // match: (BIC x (SRL y z)) 2974 // result: (BICshiftRLreg x y z) 2975 for { 2976 x := v_0 2977 if v_1.Op != OpARMSRL { 2978 break 2979 } 2980 z := v_1.Args[1] 2981 y := v_1.Args[0] 2982 v.reset(OpARMBICshiftRLreg) 2983 v.AddArg3(x, y, z) 2984 return true 2985 } 2986 // match: (BIC x (SRA y z)) 2987 // result: (BICshiftRAreg x y z) 2988 for { 2989 x := v_0 2990 if v_1.Op != OpARMSRA { 2991 break 2992 } 2993 z := v_1.Args[1] 2994 y := v_1.Args[0] 2995 v.reset(OpARMBICshiftRAreg) 2996 v.AddArg3(x, y, z) 2997 return true 2998 } 2999 // match: (BIC x x) 3000 // result: (MOVWconst [0]) 3001 for { 3002 x := v_0 3003 if x != v_1 { 3004 break 3005 } 3006 v.reset(OpARMMOVWconst) 3007 v.AuxInt = int32ToAuxInt(0) 3008 return true 3009 } 3010 return false 3011 } 3012 func rewriteValueARM_OpARMBICconst(v *Value) bool { 3013 v_0 := v.Args[0] 3014 // match: (BICconst [0] x) 3015 // result: x 3016 for { 3017 if auxIntToInt32(v.AuxInt) != 0 { 3018 break 3019 } 3020 x := v_0 3021 v.copyOf(x) 3022 return true 3023 } 3024 // match: (BICconst [c] _) 3025 // cond: int32(c)==-1 3026 // result: (MOVWconst [0]) 3027 for { 3028 c := auxIntToInt32(v.AuxInt) 3029 if !(int32(c) == -1) { 3030 break 3031 } 3032 v.reset(OpARMMOVWconst) 3033 v.AuxInt = int32ToAuxInt(0) 3034 return true 3035 } 3036 // match: (BICconst [c] x) 3037 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3038 // result: (ANDconst [int32(^uint32(c))] x) 3039 for { 3040 c := auxIntToInt32(v.AuxInt) 3041 x := v_0 3042 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3043 break 3044 } 3045 v.reset(OpARMANDconst) 3046 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 3047 v.AddArg(x) 3048 return true 3049 } 3050 // match: (BICconst [c] x) 3051 // cond: buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 3052 // result: (ANDconst [int32(^uint32(c))] x) 3053 for { 3054 c := auxIntToInt32(v.AuxInt) 3055 x := v_0 3056 if !(buildcfg.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 3057 break 3058 } 3059 v.reset(OpARMANDconst) 3060 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 3061 v.AddArg(x) 3062 return true 3063 } 3064 // match: (BICconst [c] (MOVWconst [d])) 3065 // result: (MOVWconst [d&^c]) 3066 for { 3067 c := auxIntToInt32(v.AuxInt) 3068 if v_0.Op != OpARMMOVWconst { 3069 break 3070 } 3071 d := auxIntToInt32(v_0.AuxInt) 3072 v.reset(OpARMMOVWconst) 3073 v.AuxInt = int32ToAuxInt(d &^ c) 3074 return true 3075 } 3076 // match: (BICconst [c] (BICconst [d] x)) 3077 // result: (BICconst [c|d] x) 3078 for { 3079 c := auxIntToInt32(v.AuxInt) 3080 if v_0.Op != OpARMBICconst { 3081 break 3082 } 3083 d := auxIntToInt32(v_0.AuxInt) 3084 x := v_0.Args[0] 3085 v.reset(OpARMBICconst) 3086 v.AuxInt = int32ToAuxInt(c | d) 3087 v.AddArg(x) 3088 return true 3089 } 3090 return false 3091 } 3092 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool { 3093 v_1 := v.Args[1] 3094 v_0 := v.Args[0] 3095 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3096 // result: (BICconst x [c<<uint64(d)]) 3097 for { 3098 d := auxIntToInt32(v.AuxInt) 3099 x := v_0 3100 if v_1.Op != OpARMMOVWconst { 3101 break 3102 } 3103 c := auxIntToInt32(v_1.AuxInt) 3104 v.reset(OpARMBICconst) 3105 v.AuxInt = int32ToAuxInt(c << uint64(d)) 3106 v.AddArg(x) 3107 return true 3108 } 3109 // match: (BICshiftLL (SLLconst x [c]) x [c]) 3110 // result: (MOVWconst [0]) 3111 for { 3112 c := auxIntToInt32(v.AuxInt) 3113 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 3114 break 3115 } 3116 x := v_0.Args[0] 3117 if x != v_1 { 3118 break 3119 } 3120 v.reset(OpARMMOVWconst) 3121 v.AuxInt = int32ToAuxInt(0) 3122 return true 3123 } 3124 return false 3125 } 3126 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool { 3127 v_2 := v.Args[2] 3128 v_1 := v.Args[1] 3129 v_0 := v.Args[0] 3130 // match: (BICshiftLLreg x y (MOVWconst [c])) 3131 // cond: 0 <= c && c < 32 3132 // result: (BICshiftLL x y [c]) 3133 for { 3134 x := v_0 3135 y := v_1 3136 if v_2.Op != OpARMMOVWconst { 3137 break 3138 } 3139 c := auxIntToInt32(v_2.AuxInt) 3140 if !(0 <= c && c < 32) { 3141 break 3142 } 3143 v.reset(OpARMBICshiftLL) 3144 v.AuxInt = int32ToAuxInt(c) 3145 v.AddArg2(x, y) 3146 return true 3147 } 3148 return false 3149 } 3150 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool { 3151 v_1 := v.Args[1] 3152 v_0 := v.Args[0] 3153 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3154 // result: (BICconst x [c>>uint64(d)]) 3155 for { 3156 d := auxIntToInt32(v.AuxInt) 3157 x := v_0 3158 if v_1.Op != OpARMMOVWconst { 3159 break 3160 } 3161 c := auxIntToInt32(v_1.AuxInt) 3162 v.reset(OpARMBICconst) 3163 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 3164 v.AddArg(x) 3165 return true 3166 } 3167 // match: (BICshiftRA (SRAconst x [c]) x [c]) 3168 // result: (MOVWconst [0]) 3169 for { 3170 c := auxIntToInt32(v.AuxInt) 3171 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 3172 break 3173 } 3174 x := v_0.Args[0] 3175 if x != v_1 { 3176 break 3177 } 3178 v.reset(OpARMMOVWconst) 3179 v.AuxInt = int32ToAuxInt(0) 3180 return true 3181 } 3182 return false 3183 } 3184 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool { 3185 v_2 := v.Args[2] 3186 v_1 := v.Args[1] 3187 v_0 := v.Args[0] 3188 // match: (BICshiftRAreg x y (MOVWconst [c])) 3189 // cond: 0 <= c && c < 32 3190 // result: (BICshiftRA x y [c]) 3191 for { 3192 x := v_0 3193 y := v_1 3194 if v_2.Op != OpARMMOVWconst { 3195 break 3196 } 3197 c := auxIntToInt32(v_2.AuxInt) 3198 if !(0 <= c && c < 32) { 3199 break 3200 } 3201 v.reset(OpARMBICshiftRA) 3202 v.AuxInt = int32ToAuxInt(c) 3203 v.AddArg2(x, y) 3204 return true 3205 } 3206 return false 3207 } 3208 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool { 3209 v_1 := v.Args[1] 3210 v_0 := v.Args[0] 3211 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3212 // result: (BICconst x [int32(uint32(c)>>uint64(d))]) 3213 for { 3214 d := auxIntToInt32(v.AuxInt) 3215 x := v_0 3216 if v_1.Op != OpARMMOVWconst { 3217 break 3218 } 3219 c := auxIntToInt32(v_1.AuxInt) 3220 v.reset(OpARMBICconst) 3221 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 3222 v.AddArg(x) 3223 return true 3224 } 3225 // match: (BICshiftRL (SRLconst x [c]) x [c]) 3226 // result: (MOVWconst [0]) 3227 for { 3228 c := auxIntToInt32(v.AuxInt) 3229 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 3230 break 3231 } 3232 x := v_0.Args[0] 3233 if x != v_1 { 3234 break 3235 } 3236 v.reset(OpARMMOVWconst) 3237 v.AuxInt = int32ToAuxInt(0) 3238 return true 3239 } 3240 return false 3241 } 3242 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool { 3243 v_2 := v.Args[2] 3244 v_1 := v.Args[1] 3245 v_0 := v.Args[0] 3246 // match: (BICshiftRLreg x y (MOVWconst [c])) 3247 // cond: 0 <= c && c < 32 3248 // result: (BICshiftRL x y [c]) 3249 for { 3250 x := v_0 3251 y := v_1 3252 if v_2.Op != OpARMMOVWconst { 3253 break 3254 } 3255 c := auxIntToInt32(v_2.AuxInt) 3256 if !(0 <= c && c < 32) { 3257 break 3258 } 3259 v.reset(OpARMBICshiftRL) 3260 v.AuxInt = int32ToAuxInt(c) 3261 v.AddArg2(x, y) 3262 return true 3263 } 3264 return false 3265 } 3266 func rewriteValueARM_OpARMCMN(v *Value) bool { 3267 v_1 := v.Args[1] 3268 v_0 := v.Args[0] 3269 // match: (CMN x (MOVWconst [c])) 3270 // result: (CMNconst [c] x) 3271 for { 3272 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3273 x := v_0 3274 if v_1.Op != OpARMMOVWconst { 3275 continue 3276 } 3277 c := auxIntToInt32(v_1.AuxInt) 3278 v.reset(OpARMCMNconst) 3279 v.AuxInt = int32ToAuxInt(c) 3280 v.AddArg(x) 3281 return true 3282 } 3283 break 3284 } 3285 // match: (CMN x (SLLconst [c] y)) 3286 // result: (CMNshiftLL x y [c]) 3287 for { 3288 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3289 x := v_0 3290 if v_1.Op != OpARMSLLconst { 3291 continue 3292 } 3293 c := auxIntToInt32(v_1.AuxInt) 3294 y := v_1.Args[0] 3295 v.reset(OpARMCMNshiftLL) 3296 v.AuxInt = int32ToAuxInt(c) 3297 v.AddArg2(x, y) 3298 return true 3299 } 3300 break 3301 } 3302 // match: (CMN x (SRLconst [c] y)) 3303 // result: (CMNshiftRL x y [c]) 3304 for { 3305 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3306 x := v_0 3307 if v_1.Op != OpARMSRLconst { 3308 continue 3309 } 3310 c := auxIntToInt32(v_1.AuxInt) 3311 y := v_1.Args[0] 3312 v.reset(OpARMCMNshiftRL) 3313 v.AuxInt = int32ToAuxInt(c) 3314 v.AddArg2(x, y) 3315 return true 3316 } 3317 break 3318 } 3319 // match: (CMN x (SRAconst [c] y)) 3320 // result: (CMNshiftRA x y [c]) 3321 for { 3322 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3323 x := v_0 3324 if v_1.Op != OpARMSRAconst { 3325 continue 3326 } 3327 c := auxIntToInt32(v_1.AuxInt) 3328 y := v_1.Args[0] 3329 v.reset(OpARMCMNshiftRA) 3330 v.AuxInt = int32ToAuxInt(c) 3331 v.AddArg2(x, y) 3332 return true 3333 } 3334 break 3335 } 3336 // match: (CMN x (SLL y z)) 3337 // result: (CMNshiftLLreg x y z) 3338 for { 3339 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3340 x := v_0 3341 if v_1.Op != OpARMSLL { 3342 continue 3343 } 3344 z := v_1.Args[1] 3345 y := v_1.Args[0] 3346 v.reset(OpARMCMNshiftLLreg) 3347 v.AddArg3(x, y, z) 3348 return true 3349 } 3350 break 3351 } 3352 // match: (CMN x (SRL y z)) 3353 // result: (CMNshiftRLreg x y z) 3354 for { 3355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3356 x := v_0 3357 if v_1.Op != OpARMSRL { 3358 continue 3359 } 3360 z := v_1.Args[1] 3361 y := v_1.Args[0] 3362 v.reset(OpARMCMNshiftRLreg) 3363 v.AddArg3(x, y, z) 3364 return true 3365 } 3366 break 3367 } 3368 // match: (CMN x (SRA y z)) 3369 // result: (CMNshiftRAreg x y z) 3370 for { 3371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3372 x := v_0 3373 if v_1.Op != OpARMSRA { 3374 continue 3375 } 3376 z := v_1.Args[1] 3377 y := v_1.Args[0] 3378 v.reset(OpARMCMNshiftRAreg) 3379 v.AddArg3(x, y, z) 3380 return true 3381 } 3382 break 3383 } 3384 return false 3385 } 3386 func rewriteValueARM_OpARMCMNconst(v *Value) bool { 3387 v_0 := v.Args[0] 3388 // match: (CMNconst (MOVWconst [x]) [y]) 3389 // result: (FlagConstant [addFlags32(x,y)]) 3390 for { 3391 y := auxIntToInt32(v.AuxInt) 3392 if v_0.Op != OpARMMOVWconst { 3393 break 3394 } 3395 x := auxIntToInt32(v_0.AuxInt) 3396 v.reset(OpARMFlagConstant) 3397 v.AuxInt = flagConstantToAuxInt(addFlags32(x, y)) 3398 return true 3399 } 3400 return false 3401 } 3402 func rewriteValueARM_OpARMCMNshiftLL(v *Value) bool { 3403 v_1 := v.Args[1] 3404 v_0 := v.Args[0] 3405 b := v.Block 3406 // match: (CMNshiftLL (MOVWconst [c]) x [d]) 3407 // result: (CMNconst [c] (SLLconst <x.Type> x [d])) 3408 for { 3409 d := auxIntToInt32(v.AuxInt) 3410 if v_0.Op != OpARMMOVWconst { 3411 break 3412 } 3413 c := auxIntToInt32(v_0.AuxInt) 3414 x := v_1 3415 v.reset(OpARMCMNconst) 3416 v.AuxInt = int32ToAuxInt(c) 3417 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3418 v0.AuxInt = int32ToAuxInt(d) 3419 v0.AddArg(x) 3420 v.AddArg(v0) 3421 return true 3422 } 3423 // match: (CMNshiftLL x (MOVWconst [c]) [d]) 3424 // result: (CMNconst x [c<<uint64(d)]) 3425 for { 3426 d := auxIntToInt32(v.AuxInt) 3427 x := v_0 3428 if v_1.Op != OpARMMOVWconst { 3429 break 3430 } 3431 c := auxIntToInt32(v_1.AuxInt) 3432 v.reset(OpARMCMNconst) 3433 v.AuxInt = int32ToAuxInt(c << uint64(d)) 3434 v.AddArg(x) 3435 return true 3436 } 3437 return false 3438 } 3439 func rewriteValueARM_OpARMCMNshiftLLreg(v *Value) bool { 3440 v_2 := v.Args[2] 3441 v_1 := v.Args[1] 3442 v_0 := v.Args[0] 3443 b := v.Block 3444 // match: (CMNshiftLLreg (MOVWconst [c]) x y) 3445 // result: (CMNconst [c] (SLL <x.Type> x y)) 3446 for { 3447 if v_0.Op != OpARMMOVWconst { 3448 break 3449 } 3450 c := auxIntToInt32(v_0.AuxInt) 3451 x := v_1 3452 y := v_2 3453 v.reset(OpARMCMNconst) 3454 v.AuxInt = int32ToAuxInt(c) 3455 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3456 v0.AddArg2(x, y) 3457 v.AddArg(v0) 3458 return true 3459 } 3460 // match: (CMNshiftLLreg x y (MOVWconst [c])) 3461 // cond: 0 <= c && c < 32 3462 // result: (CMNshiftLL x y [c]) 3463 for { 3464 x := v_0 3465 y := v_1 3466 if v_2.Op != OpARMMOVWconst { 3467 break 3468 } 3469 c := auxIntToInt32(v_2.AuxInt) 3470 if !(0 <= c && c < 32) { 3471 break 3472 } 3473 v.reset(OpARMCMNshiftLL) 3474 v.AuxInt = int32ToAuxInt(c) 3475 v.AddArg2(x, y) 3476 return true 3477 } 3478 return false 3479 } 3480 func rewriteValueARM_OpARMCMNshiftRA(v *Value) bool { 3481 v_1 := v.Args[1] 3482 v_0 := v.Args[0] 3483 b := v.Block 3484 // match: (CMNshiftRA (MOVWconst [c]) x [d]) 3485 // result: (CMNconst [c] (SRAconst <x.Type> x [d])) 3486 for { 3487 d := auxIntToInt32(v.AuxInt) 3488 if v_0.Op != OpARMMOVWconst { 3489 break 3490 } 3491 c := auxIntToInt32(v_0.AuxInt) 3492 x := v_1 3493 v.reset(OpARMCMNconst) 3494 v.AuxInt = int32ToAuxInt(c) 3495 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3496 v0.AuxInt = int32ToAuxInt(d) 3497 v0.AddArg(x) 3498 v.AddArg(v0) 3499 return true 3500 } 3501 // match: (CMNshiftRA x (MOVWconst [c]) [d]) 3502 // result: (CMNconst x [c>>uint64(d)]) 3503 for { 3504 d := auxIntToInt32(v.AuxInt) 3505 x := v_0 3506 if v_1.Op != OpARMMOVWconst { 3507 break 3508 } 3509 c := auxIntToInt32(v_1.AuxInt) 3510 v.reset(OpARMCMNconst) 3511 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 3512 v.AddArg(x) 3513 return true 3514 } 3515 return false 3516 } 3517 func rewriteValueARM_OpARMCMNshiftRAreg(v *Value) bool { 3518 v_2 := v.Args[2] 3519 v_1 := v.Args[1] 3520 v_0 := v.Args[0] 3521 b := v.Block 3522 // match: (CMNshiftRAreg (MOVWconst [c]) x y) 3523 // result: (CMNconst [c] (SRA <x.Type> x y)) 3524 for { 3525 if v_0.Op != OpARMMOVWconst { 3526 break 3527 } 3528 c := auxIntToInt32(v_0.AuxInt) 3529 x := v_1 3530 y := v_2 3531 v.reset(OpARMCMNconst) 3532 v.AuxInt = int32ToAuxInt(c) 3533 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3534 v0.AddArg2(x, y) 3535 v.AddArg(v0) 3536 return true 3537 } 3538 // match: (CMNshiftRAreg x y (MOVWconst [c])) 3539 // cond: 0 <= c && c < 32 3540 // result: (CMNshiftRA x y [c]) 3541 for { 3542 x := v_0 3543 y := v_1 3544 if v_2.Op != OpARMMOVWconst { 3545 break 3546 } 3547 c := auxIntToInt32(v_2.AuxInt) 3548 if !(0 <= c && c < 32) { 3549 break 3550 } 3551 v.reset(OpARMCMNshiftRA) 3552 v.AuxInt = int32ToAuxInt(c) 3553 v.AddArg2(x, y) 3554 return true 3555 } 3556 return false 3557 } 3558 func rewriteValueARM_OpARMCMNshiftRL(v *Value) bool { 3559 v_1 := v.Args[1] 3560 v_0 := v.Args[0] 3561 b := v.Block 3562 // match: (CMNshiftRL (MOVWconst [c]) x [d]) 3563 // result: (CMNconst [c] (SRLconst <x.Type> x [d])) 3564 for { 3565 d := auxIntToInt32(v.AuxInt) 3566 if v_0.Op != OpARMMOVWconst { 3567 break 3568 } 3569 c := auxIntToInt32(v_0.AuxInt) 3570 x := v_1 3571 v.reset(OpARMCMNconst) 3572 v.AuxInt = int32ToAuxInt(c) 3573 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3574 v0.AuxInt = int32ToAuxInt(d) 3575 v0.AddArg(x) 3576 v.AddArg(v0) 3577 return true 3578 } 3579 // match: (CMNshiftRL x (MOVWconst [c]) [d]) 3580 // result: (CMNconst x [int32(uint32(c)>>uint64(d))]) 3581 for { 3582 d := auxIntToInt32(v.AuxInt) 3583 x := v_0 3584 if v_1.Op != OpARMMOVWconst { 3585 break 3586 } 3587 c := auxIntToInt32(v_1.AuxInt) 3588 v.reset(OpARMCMNconst) 3589 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 3590 v.AddArg(x) 3591 return true 3592 } 3593 return false 3594 } 3595 func rewriteValueARM_OpARMCMNshiftRLreg(v *Value) bool { 3596 v_2 := v.Args[2] 3597 v_1 := v.Args[1] 3598 v_0 := v.Args[0] 3599 b := v.Block 3600 // match: (CMNshiftRLreg (MOVWconst [c]) x y) 3601 // result: (CMNconst [c] (SRL <x.Type> x y)) 3602 for { 3603 if v_0.Op != OpARMMOVWconst { 3604 break 3605 } 3606 c := auxIntToInt32(v_0.AuxInt) 3607 x := v_1 3608 y := v_2 3609 v.reset(OpARMCMNconst) 3610 v.AuxInt = int32ToAuxInt(c) 3611 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3612 v0.AddArg2(x, y) 3613 v.AddArg(v0) 3614 return true 3615 } 3616 // match: (CMNshiftRLreg x y (MOVWconst [c])) 3617 // cond: 0 <= c && c < 32 3618 // result: (CMNshiftRL x y [c]) 3619 for { 3620 x := v_0 3621 y := v_1 3622 if v_2.Op != OpARMMOVWconst { 3623 break 3624 } 3625 c := auxIntToInt32(v_2.AuxInt) 3626 if !(0 <= c && c < 32) { 3627 break 3628 } 3629 v.reset(OpARMCMNshiftRL) 3630 v.AuxInt = int32ToAuxInt(c) 3631 v.AddArg2(x, y) 3632 return true 3633 } 3634 return false 3635 } 3636 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool { 3637 v_1 := v.Args[1] 3638 v_0 := v.Args[0] 3639 // match: (CMOVWHSconst _ (FlagConstant [fc]) [c]) 3640 // cond: fc.uge() 3641 // result: (MOVWconst [c]) 3642 for { 3643 c := auxIntToInt32(v.AuxInt) 3644 if v_1.Op != OpARMFlagConstant { 3645 break 3646 } 3647 fc := auxIntToFlagConstant(v_1.AuxInt) 3648 if !(fc.uge()) { 3649 break 3650 } 3651 v.reset(OpARMMOVWconst) 3652 v.AuxInt = int32ToAuxInt(c) 3653 return true 3654 } 3655 // match: (CMOVWHSconst x (FlagConstant [fc]) [c]) 3656 // cond: fc.ult() 3657 // result: x 3658 for { 3659 x := v_0 3660 if v_1.Op != OpARMFlagConstant { 3661 break 3662 } 3663 fc := auxIntToFlagConstant(v_1.AuxInt) 3664 if !(fc.ult()) { 3665 break 3666 } 3667 v.copyOf(x) 3668 return true 3669 } 3670 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3671 // result: (CMOVWLSconst x flags [c]) 3672 for { 3673 c := auxIntToInt32(v.AuxInt) 3674 x := v_0 3675 if v_1.Op != OpARMInvertFlags { 3676 break 3677 } 3678 flags := v_1.Args[0] 3679 v.reset(OpARMCMOVWLSconst) 3680 v.AuxInt = int32ToAuxInt(c) 3681 v.AddArg2(x, flags) 3682 return true 3683 } 3684 return false 3685 } 3686 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool { 3687 v_1 := v.Args[1] 3688 v_0 := v.Args[0] 3689 // match: (CMOVWLSconst _ (FlagConstant [fc]) [c]) 3690 // cond: fc.ule() 3691 // result: (MOVWconst [c]) 3692 for { 3693 c := auxIntToInt32(v.AuxInt) 3694 if v_1.Op != OpARMFlagConstant { 3695 break 3696 } 3697 fc := auxIntToFlagConstant(v_1.AuxInt) 3698 if !(fc.ule()) { 3699 break 3700 } 3701 v.reset(OpARMMOVWconst) 3702 v.AuxInt = int32ToAuxInt(c) 3703 return true 3704 } 3705 // match: (CMOVWLSconst x (FlagConstant [fc]) [c]) 3706 // cond: fc.ugt() 3707 // result: x 3708 for { 3709 x := v_0 3710 if v_1.Op != OpARMFlagConstant { 3711 break 3712 } 3713 fc := auxIntToFlagConstant(v_1.AuxInt) 3714 if !(fc.ugt()) { 3715 break 3716 } 3717 v.copyOf(x) 3718 return true 3719 } 3720 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 3721 // result: (CMOVWHSconst x flags [c]) 3722 for { 3723 c := auxIntToInt32(v.AuxInt) 3724 x := v_0 3725 if v_1.Op != OpARMInvertFlags { 3726 break 3727 } 3728 flags := v_1.Args[0] 3729 v.reset(OpARMCMOVWHSconst) 3730 v.AuxInt = int32ToAuxInt(c) 3731 v.AddArg2(x, flags) 3732 return true 3733 } 3734 return false 3735 } 3736 func rewriteValueARM_OpARMCMP(v *Value) bool { 3737 v_1 := v.Args[1] 3738 v_0 := v.Args[0] 3739 b := v.Block 3740 // match: (CMP x (MOVWconst [c])) 3741 // result: (CMPconst [c] x) 3742 for { 3743 x := v_0 3744 if v_1.Op != OpARMMOVWconst { 3745 break 3746 } 3747 c := auxIntToInt32(v_1.AuxInt) 3748 v.reset(OpARMCMPconst) 3749 v.AuxInt = int32ToAuxInt(c) 3750 v.AddArg(x) 3751 return true 3752 } 3753 // match: (CMP (MOVWconst [c]) x) 3754 // result: (InvertFlags (CMPconst [c] x)) 3755 for { 3756 if v_0.Op != OpARMMOVWconst { 3757 break 3758 } 3759 c := auxIntToInt32(v_0.AuxInt) 3760 x := v_1 3761 v.reset(OpARMInvertFlags) 3762 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 3763 v0.AuxInt = int32ToAuxInt(c) 3764 v0.AddArg(x) 3765 v.AddArg(v0) 3766 return true 3767 } 3768 // match: (CMP x y) 3769 // cond: canonLessThan(x,y) 3770 // result: (InvertFlags (CMP y x)) 3771 for { 3772 x := v_0 3773 y := v_1 3774 if !(canonLessThan(x, y)) { 3775 break 3776 } 3777 v.reset(OpARMInvertFlags) 3778 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 3779 v0.AddArg2(y, x) 3780 v.AddArg(v0) 3781 return true 3782 } 3783 // match: (CMP x (SLLconst [c] y)) 3784 // result: (CMPshiftLL x y [c]) 3785 for { 3786 x := v_0 3787 if v_1.Op != OpARMSLLconst { 3788 break 3789 } 3790 c := auxIntToInt32(v_1.AuxInt) 3791 y := v_1.Args[0] 3792 v.reset(OpARMCMPshiftLL) 3793 v.AuxInt = int32ToAuxInt(c) 3794 v.AddArg2(x, y) 3795 return true 3796 } 3797 // match: (CMP (SLLconst [c] y) x) 3798 // result: (InvertFlags (CMPshiftLL x y [c])) 3799 for { 3800 if v_0.Op != OpARMSLLconst { 3801 break 3802 } 3803 c := auxIntToInt32(v_0.AuxInt) 3804 y := v_0.Args[0] 3805 x := v_1 3806 v.reset(OpARMInvertFlags) 3807 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 3808 v0.AuxInt = int32ToAuxInt(c) 3809 v0.AddArg2(x, y) 3810 v.AddArg(v0) 3811 return true 3812 } 3813 // match: (CMP x (SRLconst [c] y)) 3814 // result: (CMPshiftRL x y [c]) 3815 for { 3816 x := v_0 3817 if v_1.Op != OpARMSRLconst { 3818 break 3819 } 3820 c := auxIntToInt32(v_1.AuxInt) 3821 y := v_1.Args[0] 3822 v.reset(OpARMCMPshiftRL) 3823 v.AuxInt = int32ToAuxInt(c) 3824 v.AddArg2(x, y) 3825 return true 3826 } 3827 // match: (CMP (SRLconst [c] y) x) 3828 // result: (InvertFlags (CMPshiftRL x y [c])) 3829 for { 3830 if v_0.Op != OpARMSRLconst { 3831 break 3832 } 3833 c := auxIntToInt32(v_0.AuxInt) 3834 y := v_0.Args[0] 3835 x := v_1 3836 v.reset(OpARMInvertFlags) 3837 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 3838 v0.AuxInt = int32ToAuxInt(c) 3839 v0.AddArg2(x, y) 3840 v.AddArg(v0) 3841 return true 3842 } 3843 // match: (CMP x (SRAconst [c] y)) 3844 // result: (CMPshiftRA x y [c]) 3845 for { 3846 x := v_0 3847 if v_1.Op != OpARMSRAconst { 3848 break 3849 } 3850 c := auxIntToInt32(v_1.AuxInt) 3851 y := v_1.Args[0] 3852 v.reset(OpARMCMPshiftRA) 3853 v.AuxInt = int32ToAuxInt(c) 3854 v.AddArg2(x, y) 3855 return true 3856 } 3857 // match: (CMP (SRAconst [c] y) x) 3858 // result: (InvertFlags (CMPshiftRA x y [c])) 3859 for { 3860 if v_0.Op != OpARMSRAconst { 3861 break 3862 } 3863 c := auxIntToInt32(v_0.AuxInt) 3864 y := v_0.Args[0] 3865 x := v_1 3866 v.reset(OpARMInvertFlags) 3867 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 3868 v0.AuxInt = int32ToAuxInt(c) 3869 v0.AddArg2(x, y) 3870 v.AddArg(v0) 3871 return true 3872 } 3873 // match: (CMP x (SLL y z)) 3874 // result: (CMPshiftLLreg x y z) 3875 for { 3876 x := v_0 3877 if v_1.Op != OpARMSLL { 3878 break 3879 } 3880 z := v_1.Args[1] 3881 y := v_1.Args[0] 3882 v.reset(OpARMCMPshiftLLreg) 3883 v.AddArg3(x, y, z) 3884 return true 3885 } 3886 // match: (CMP (SLL y z) x) 3887 // result: (InvertFlags (CMPshiftLLreg x y z)) 3888 for { 3889 if v_0.Op != OpARMSLL { 3890 break 3891 } 3892 z := v_0.Args[1] 3893 y := v_0.Args[0] 3894 x := v_1 3895 v.reset(OpARMInvertFlags) 3896 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 3897 v0.AddArg3(x, y, z) 3898 v.AddArg(v0) 3899 return true 3900 } 3901 // match: (CMP x (SRL y z)) 3902 // result: (CMPshiftRLreg x y z) 3903 for { 3904 x := v_0 3905 if v_1.Op != OpARMSRL { 3906 break 3907 } 3908 z := v_1.Args[1] 3909 y := v_1.Args[0] 3910 v.reset(OpARMCMPshiftRLreg) 3911 v.AddArg3(x, y, z) 3912 return true 3913 } 3914 // match: (CMP (SRL y z) x) 3915 // result: (InvertFlags (CMPshiftRLreg x y z)) 3916 for { 3917 if v_0.Op != OpARMSRL { 3918 break 3919 } 3920 z := v_0.Args[1] 3921 y := v_0.Args[0] 3922 x := v_1 3923 v.reset(OpARMInvertFlags) 3924 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 3925 v0.AddArg3(x, y, z) 3926 v.AddArg(v0) 3927 return true 3928 } 3929 // match: (CMP x (SRA y z)) 3930 // result: (CMPshiftRAreg x y z) 3931 for { 3932 x := v_0 3933 if v_1.Op != OpARMSRA { 3934 break 3935 } 3936 z := v_1.Args[1] 3937 y := v_1.Args[0] 3938 v.reset(OpARMCMPshiftRAreg) 3939 v.AddArg3(x, y, z) 3940 return true 3941 } 3942 // match: (CMP (SRA y z) x) 3943 // result: (InvertFlags (CMPshiftRAreg x y z)) 3944 for { 3945 if v_0.Op != OpARMSRA { 3946 break 3947 } 3948 z := v_0.Args[1] 3949 y := v_0.Args[0] 3950 x := v_1 3951 v.reset(OpARMInvertFlags) 3952 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 3953 v0.AddArg3(x, y, z) 3954 v.AddArg(v0) 3955 return true 3956 } 3957 return false 3958 } 3959 func rewriteValueARM_OpARMCMPD(v *Value) bool { 3960 v_1 := v.Args[1] 3961 v_0 := v.Args[0] 3962 // match: (CMPD x (MOVDconst [0])) 3963 // result: (CMPD0 x) 3964 for { 3965 x := v_0 3966 if v_1.Op != OpARMMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0 { 3967 break 3968 } 3969 v.reset(OpARMCMPD0) 3970 v.AddArg(x) 3971 return true 3972 } 3973 return false 3974 } 3975 func rewriteValueARM_OpARMCMPF(v *Value) bool { 3976 v_1 := v.Args[1] 3977 v_0 := v.Args[0] 3978 // match: (CMPF x (MOVFconst [0])) 3979 // result: (CMPF0 x) 3980 for { 3981 x := v_0 3982 if v_1.Op != OpARMMOVFconst || auxIntToFloat64(v_1.AuxInt) != 0 { 3983 break 3984 } 3985 v.reset(OpARMCMPF0) 3986 v.AddArg(x) 3987 return true 3988 } 3989 return false 3990 } 3991 func rewriteValueARM_OpARMCMPconst(v *Value) bool { 3992 v_0 := v.Args[0] 3993 // match: (CMPconst (MOVWconst [x]) [y]) 3994 // result: (FlagConstant [subFlags32(x,y)]) 3995 for { 3996 y := auxIntToInt32(v.AuxInt) 3997 if v_0.Op != OpARMMOVWconst { 3998 break 3999 } 4000 x := auxIntToInt32(v_0.AuxInt) 4001 v.reset(OpARMFlagConstant) 4002 v.AuxInt = flagConstantToAuxInt(subFlags32(x, y)) 4003 return true 4004 } 4005 // match: (CMPconst (MOVBUreg _) [c]) 4006 // cond: 0xff < c 4007 // result: (FlagConstant [subFlags32(0, 1)]) 4008 for { 4009 c := auxIntToInt32(v.AuxInt) 4010 if v_0.Op != OpARMMOVBUreg || !(0xff < c) { 4011 break 4012 } 4013 v.reset(OpARMFlagConstant) 4014 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4015 return true 4016 } 4017 // match: (CMPconst (MOVHUreg _) [c]) 4018 // cond: 0xffff < c 4019 // result: (FlagConstant [subFlags32(0, 1)]) 4020 for { 4021 c := auxIntToInt32(v.AuxInt) 4022 if v_0.Op != OpARMMOVHUreg || !(0xffff < c) { 4023 break 4024 } 4025 v.reset(OpARMFlagConstant) 4026 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4027 return true 4028 } 4029 // match: (CMPconst (ANDconst _ [m]) [n]) 4030 // cond: 0 <= m && m < n 4031 // result: (FlagConstant [subFlags32(0, 1)]) 4032 for { 4033 n := auxIntToInt32(v.AuxInt) 4034 if v_0.Op != OpARMANDconst { 4035 break 4036 } 4037 m := auxIntToInt32(v_0.AuxInt) 4038 if !(0 <= m && m < n) { 4039 break 4040 } 4041 v.reset(OpARMFlagConstant) 4042 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4043 return true 4044 } 4045 // match: (CMPconst (SRLconst _ [c]) [n]) 4046 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4047 // result: (FlagConstant [subFlags32(0, 1)]) 4048 for { 4049 n := auxIntToInt32(v.AuxInt) 4050 if v_0.Op != OpARMSRLconst { 4051 break 4052 } 4053 c := auxIntToInt32(v_0.AuxInt) 4054 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4055 break 4056 } 4057 v.reset(OpARMFlagConstant) 4058 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4059 return true 4060 } 4061 return false 4062 } 4063 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool { 4064 v_1 := v.Args[1] 4065 v_0 := v.Args[0] 4066 b := v.Block 4067 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4068 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4069 for { 4070 d := auxIntToInt32(v.AuxInt) 4071 if v_0.Op != OpARMMOVWconst { 4072 break 4073 } 4074 c := auxIntToInt32(v_0.AuxInt) 4075 x := v_1 4076 v.reset(OpARMInvertFlags) 4077 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4078 v0.AuxInt = int32ToAuxInt(c) 4079 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4080 v1.AuxInt = int32ToAuxInt(d) 4081 v1.AddArg(x) 4082 v0.AddArg(v1) 4083 v.AddArg(v0) 4084 return true 4085 } 4086 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4087 // result: (CMPconst x [c<<uint64(d)]) 4088 for { 4089 d := auxIntToInt32(v.AuxInt) 4090 x := v_0 4091 if v_1.Op != OpARMMOVWconst { 4092 break 4093 } 4094 c := auxIntToInt32(v_1.AuxInt) 4095 v.reset(OpARMCMPconst) 4096 v.AuxInt = int32ToAuxInt(c << uint64(d)) 4097 v.AddArg(x) 4098 return true 4099 } 4100 return false 4101 } 4102 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool { 4103 v_2 := v.Args[2] 4104 v_1 := v.Args[1] 4105 v_0 := v.Args[0] 4106 b := v.Block 4107 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4108 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4109 for { 4110 if v_0.Op != OpARMMOVWconst { 4111 break 4112 } 4113 c := auxIntToInt32(v_0.AuxInt) 4114 x := v_1 4115 y := v_2 4116 v.reset(OpARMInvertFlags) 4117 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4118 v0.AuxInt = int32ToAuxInt(c) 4119 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4120 v1.AddArg2(x, y) 4121 v0.AddArg(v1) 4122 v.AddArg(v0) 4123 return true 4124 } 4125 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4126 // cond: 0 <= c && c < 32 4127 // result: (CMPshiftLL x y [c]) 4128 for { 4129 x := v_0 4130 y := v_1 4131 if v_2.Op != OpARMMOVWconst { 4132 break 4133 } 4134 c := auxIntToInt32(v_2.AuxInt) 4135 if !(0 <= c && c < 32) { 4136 break 4137 } 4138 v.reset(OpARMCMPshiftLL) 4139 v.AuxInt = int32ToAuxInt(c) 4140 v.AddArg2(x, y) 4141 return true 4142 } 4143 return false 4144 } 4145 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool { 4146 v_1 := v.Args[1] 4147 v_0 := v.Args[0] 4148 b := v.Block 4149 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4150 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4151 for { 4152 d := auxIntToInt32(v.AuxInt) 4153 if v_0.Op != OpARMMOVWconst { 4154 break 4155 } 4156 c := auxIntToInt32(v_0.AuxInt) 4157 x := v_1 4158 v.reset(OpARMInvertFlags) 4159 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4160 v0.AuxInt = int32ToAuxInt(c) 4161 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4162 v1.AuxInt = int32ToAuxInt(d) 4163 v1.AddArg(x) 4164 v0.AddArg(v1) 4165 v.AddArg(v0) 4166 return true 4167 } 4168 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4169 // result: (CMPconst x [c>>uint64(d)]) 4170 for { 4171 d := auxIntToInt32(v.AuxInt) 4172 x := v_0 4173 if v_1.Op != OpARMMOVWconst { 4174 break 4175 } 4176 c := auxIntToInt32(v_1.AuxInt) 4177 v.reset(OpARMCMPconst) 4178 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 4179 v.AddArg(x) 4180 return true 4181 } 4182 return false 4183 } 4184 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool { 4185 v_2 := v.Args[2] 4186 v_1 := v.Args[1] 4187 v_0 := v.Args[0] 4188 b := v.Block 4189 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4190 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4191 for { 4192 if v_0.Op != OpARMMOVWconst { 4193 break 4194 } 4195 c := auxIntToInt32(v_0.AuxInt) 4196 x := v_1 4197 y := v_2 4198 v.reset(OpARMInvertFlags) 4199 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4200 v0.AuxInt = int32ToAuxInt(c) 4201 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4202 v1.AddArg2(x, y) 4203 v0.AddArg(v1) 4204 v.AddArg(v0) 4205 return true 4206 } 4207 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4208 // cond: 0 <= c && c < 32 4209 // result: (CMPshiftRA x y [c]) 4210 for { 4211 x := v_0 4212 y := v_1 4213 if v_2.Op != OpARMMOVWconst { 4214 break 4215 } 4216 c := auxIntToInt32(v_2.AuxInt) 4217 if !(0 <= c && c < 32) { 4218 break 4219 } 4220 v.reset(OpARMCMPshiftRA) 4221 v.AuxInt = int32ToAuxInt(c) 4222 v.AddArg2(x, y) 4223 return true 4224 } 4225 return false 4226 } 4227 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool { 4228 v_1 := v.Args[1] 4229 v_0 := v.Args[0] 4230 b := v.Block 4231 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4232 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4233 for { 4234 d := auxIntToInt32(v.AuxInt) 4235 if v_0.Op != OpARMMOVWconst { 4236 break 4237 } 4238 c := auxIntToInt32(v_0.AuxInt) 4239 x := v_1 4240 v.reset(OpARMInvertFlags) 4241 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4242 v0.AuxInt = int32ToAuxInt(c) 4243 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 4244 v1.AuxInt = int32ToAuxInt(d) 4245 v1.AddArg(x) 4246 v0.AddArg(v1) 4247 v.AddArg(v0) 4248 return true 4249 } 4250 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4251 // result: (CMPconst x [int32(uint32(c)>>uint64(d))]) 4252 for { 4253 d := auxIntToInt32(v.AuxInt) 4254 x := v_0 4255 if v_1.Op != OpARMMOVWconst { 4256 break 4257 } 4258 c := auxIntToInt32(v_1.AuxInt) 4259 v.reset(OpARMCMPconst) 4260 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 4261 v.AddArg(x) 4262 return true 4263 } 4264 return false 4265 } 4266 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool { 4267 v_2 := v.Args[2] 4268 v_1 := v.Args[1] 4269 v_0 := v.Args[0] 4270 b := v.Block 4271 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4272 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4273 for { 4274 if v_0.Op != OpARMMOVWconst { 4275 break 4276 } 4277 c := auxIntToInt32(v_0.AuxInt) 4278 x := v_1 4279 y := v_2 4280 v.reset(OpARMInvertFlags) 4281 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4282 v0.AuxInt = int32ToAuxInt(c) 4283 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4284 v1.AddArg2(x, y) 4285 v0.AddArg(v1) 4286 v.AddArg(v0) 4287 return true 4288 } 4289 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4290 // cond: 0 <= c && c < 32 4291 // result: (CMPshiftRL x y [c]) 4292 for { 4293 x := v_0 4294 y := v_1 4295 if v_2.Op != OpARMMOVWconst { 4296 break 4297 } 4298 c := auxIntToInt32(v_2.AuxInt) 4299 if !(0 <= c && c < 32) { 4300 break 4301 } 4302 v.reset(OpARMCMPshiftRL) 4303 v.AuxInt = int32ToAuxInt(c) 4304 v.AddArg2(x, y) 4305 return true 4306 } 4307 return false 4308 } 4309 func rewriteValueARM_OpARMEqual(v *Value) bool { 4310 v_0 := v.Args[0] 4311 // match: (Equal (FlagConstant [fc])) 4312 // result: (MOVWconst [b2i32(fc.eq())]) 4313 for { 4314 if v_0.Op != OpARMFlagConstant { 4315 break 4316 } 4317 fc := auxIntToFlagConstant(v_0.AuxInt) 4318 v.reset(OpARMMOVWconst) 4319 v.AuxInt = int32ToAuxInt(b2i32(fc.eq())) 4320 return true 4321 } 4322 // match: (Equal (InvertFlags x)) 4323 // result: (Equal x) 4324 for { 4325 if v_0.Op != OpARMInvertFlags { 4326 break 4327 } 4328 x := v_0.Args[0] 4329 v.reset(OpARMEqual) 4330 v.AddArg(x) 4331 return true 4332 } 4333 return false 4334 } 4335 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool { 4336 v_0 := v.Args[0] 4337 // match: (GreaterEqual (FlagConstant [fc])) 4338 // result: (MOVWconst [b2i32(fc.ge())]) 4339 for { 4340 if v_0.Op != OpARMFlagConstant { 4341 break 4342 } 4343 fc := auxIntToFlagConstant(v_0.AuxInt) 4344 v.reset(OpARMMOVWconst) 4345 v.AuxInt = int32ToAuxInt(b2i32(fc.ge())) 4346 return true 4347 } 4348 // match: (GreaterEqual (InvertFlags x)) 4349 // result: (LessEqual x) 4350 for { 4351 if v_0.Op != OpARMInvertFlags { 4352 break 4353 } 4354 x := v_0.Args[0] 4355 v.reset(OpARMLessEqual) 4356 v.AddArg(x) 4357 return true 4358 } 4359 return false 4360 } 4361 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool { 4362 v_0 := v.Args[0] 4363 // match: (GreaterEqualU (FlagConstant [fc])) 4364 // result: (MOVWconst [b2i32(fc.uge())]) 4365 for { 4366 if v_0.Op != OpARMFlagConstant { 4367 break 4368 } 4369 fc := auxIntToFlagConstant(v_0.AuxInt) 4370 v.reset(OpARMMOVWconst) 4371 v.AuxInt = int32ToAuxInt(b2i32(fc.uge())) 4372 return true 4373 } 4374 // match: (GreaterEqualU (InvertFlags x)) 4375 // result: (LessEqualU x) 4376 for { 4377 if v_0.Op != OpARMInvertFlags { 4378 break 4379 } 4380 x := v_0.Args[0] 4381 v.reset(OpARMLessEqualU) 4382 v.AddArg(x) 4383 return true 4384 } 4385 return false 4386 } 4387 func rewriteValueARM_OpARMGreaterThan(v *Value) bool { 4388 v_0 := v.Args[0] 4389 // match: (GreaterThan (FlagConstant [fc])) 4390 // result: (MOVWconst [b2i32(fc.gt())]) 4391 for { 4392 if v_0.Op != OpARMFlagConstant { 4393 break 4394 } 4395 fc := auxIntToFlagConstant(v_0.AuxInt) 4396 v.reset(OpARMMOVWconst) 4397 v.AuxInt = int32ToAuxInt(b2i32(fc.gt())) 4398 return true 4399 } 4400 // match: (GreaterThan (InvertFlags x)) 4401 // result: (LessThan x) 4402 for { 4403 if v_0.Op != OpARMInvertFlags { 4404 break 4405 } 4406 x := v_0.Args[0] 4407 v.reset(OpARMLessThan) 4408 v.AddArg(x) 4409 return true 4410 } 4411 return false 4412 } 4413 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool { 4414 v_0 := v.Args[0] 4415 // match: (GreaterThanU (FlagConstant [fc])) 4416 // result: (MOVWconst [b2i32(fc.ugt())]) 4417 for { 4418 if v_0.Op != OpARMFlagConstant { 4419 break 4420 } 4421 fc := auxIntToFlagConstant(v_0.AuxInt) 4422 v.reset(OpARMMOVWconst) 4423 v.AuxInt = int32ToAuxInt(b2i32(fc.ugt())) 4424 return true 4425 } 4426 // match: (GreaterThanU (InvertFlags x)) 4427 // result: (LessThanU x) 4428 for { 4429 if v_0.Op != OpARMInvertFlags { 4430 break 4431 } 4432 x := v_0.Args[0] 4433 v.reset(OpARMLessThanU) 4434 v.AddArg(x) 4435 return true 4436 } 4437 return false 4438 } 4439 func rewriteValueARM_OpARMLessEqual(v *Value) bool { 4440 v_0 := v.Args[0] 4441 // match: (LessEqual (FlagConstant [fc])) 4442 // result: (MOVWconst [b2i32(fc.le())]) 4443 for { 4444 if v_0.Op != OpARMFlagConstant { 4445 break 4446 } 4447 fc := auxIntToFlagConstant(v_0.AuxInt) 4448 v.reset(OpARMMOVWconst) 4449 v.AuxInt = int32ToAuxInt(b2i32(fc.le())) 4450 return true 4451 } 4452 // match: (LessEqual (InvertFlags x)) 4453 // result: (GreaterEqual x) 4454 for { 4455 if v_0.Op != OpARMInvertFlags { 4456 break 4457 } 4458 x := v_0.Args[0] 4459 v.reset(OpARMGreaterEqual) 4460 v.AddArg(x) 4461 return true 4462 } 4463 return false 4464 } 4465 func rewriteValueARM_OpARMLessEqualU(v *Value) bool { 4466 v_0 := v.Args[0] 4467 // match: (LessEqualU (FlagConstant [fc])) 4468 // result: (MOVWconst [b2i32(fc.ule())]) 4469 for { 4470 if v_0.Op != OpARMFlagConstant { 4471 break 4472 } 4473 fc := auxIntToFlagConstant(v_0.AuxInt) 4474 v.reset(OpARMMOVWconst) 4475 v.AuxInt = int32ToAuxInt(b2i32(fc.ule())) 4476 return true 4477 } 4478 // match: (LessEqualU (InvertFlags x)) 4479 // result: (GreaterEqualU x) 4480 for { 4481 if v_0.Op != OpARMInvertFlags { 4482 break 4483 } 4484 x := v_0.Args[0] 4485 v.reset(OpARMGreaterEqualU) 4486 v.AddArg(x) 4487 return true 4488 } 4489 return false 4490 } 4491 func rewriteValueARM_OpARMLessThan(v *Value) bool { 4492 v_0 := v.Args[0] 4493 // match: (LessThan (FlagConstant [fc])) 4494 // result: (MOVWconst [b2i32(fc.lt())]) 4495 for { 4496 if v_0.Op != OpARMFlagConstant { 4497 break 4498 } 4499 fc := auxIntToFlagConstant(v_0.AuxInt) 4500 v.reset(OpARMMOVWconst) 4501 v.AuxInt = int32ToAuxInt(b2i32(fc.lt())) 4502 return true 4503 } 4504 // match: (LessThan (InvertFlags x)) 4505 // result: (GreaterThan x) 4506 for { 4507 if v_0.Op != OpARMInvertFlags { 4508 break 4509 } 4510 x := v_0.Args[0] 4511 v.reset(OpARMGreaterThan) 4512 v.AddArg(x) 4513 return true 4514 } 4515 return false 4516 } 4517 func rewriteValueARM_OpARMLessThanU(v *Value) bool { 4518 v_0 := v.Args[0] 4519 // match: (LessThanU (FlagConstant [fc])) 4520 // result: (MOVWconst [b2i32(fc.ult())]) 4521 for { 4522 if v_0.Op != OpARMFlagConstant { 4523 break 4524 } 4525 fc := auxIntToFlagConstant(v_0.AuxInt) 4526 v.reset(OpARMMOVWconst) 4527 v.AuxInt = int32ToAuxInt(b2i32(fc.ult())) 4528 return true 4529 } 4530 // match: (LessThanU (InvertFlags x)) 4531 // result: (GreaterThanU x) 4532 for { 4533 if v_0.Op != OpARMInvertFlags { 4534 break 4535 } 4536 x := v_0.Args[0] 4537 v.reset(OpARMGreaterThanU) 4538 v.AddArg(x) 4539 return true 4540 } 4541 return false 4542 } 4543 func rewriteValueARM_OpARMMOVBUload(v *Value) bool { 4544 v_1 := v.Args[1] 4545 v_0 := v.Args[0] 4546 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 4547 // result: (MOVBUload [off1+off2] {sym} ptr mem) 4548 for { 4549 off1 := auxIntToInt32(v.AuxInt) 4550 sym := auxToSym(v.Aux) 4551 if v_0.Op != OpARMADDconst { 4552 break 4553 } 4554 off2 := auxIntToInt32(v_0.AuxInt) 4555 ptr := v_0.Args[0] 4556 mem := v_1 4557 v.reset(OpARMMOVBUload) 4558 v.AuxInt = int32ToAuxInt(off1 + off2) 4559 v.Aux = symToAux(sym) 4560 v.AddArg2(ptr, mem) 4561 return true 4562 } 4563 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 4564 // result: (MOVBUload [off1-off2] {sym} ptr mem) 4565 for { 4566 off1 := auxIntToInt32(v.AuxInt) 4567 sym := auxToSym(v.Aux) 4568 if v_0.Op != OpARMSUBconst { 4569 break 4570 } 4571 off2 := auxIntToInt32(v_0.AuxInt) 4572 ptr := v_0.Args[0] 4573 mem := v_1 4574 v.reset(OpARMMOVBUload) 4575 v.AuxInt = int32ToAuxInt(off1 - off2) 4576 v.Aux = symToAux(sym) 4577 v.AddArg2(ptr, mem) 4578 return true 4579 } 4580 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 4581 // cond: canMergeSym(sym1,sym2) 4582 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4583 for { 4584 off1 := auxIntToInt32(v.AuxInt) 4585 sym1 := auxToSym(v.Aux) 4586 if v_0.Op != OpARMMOVWaddr { 4587 break 4588 } 4589 off2 := auxIntToInt32(v_0.AuxInt) 4590 sym2 := auxToSym(v_0.Aux) 4591 ptr := v_0.Args[0] 4592 mem := v_1 4593 if !(canMergeSym(sym1, sym2)) { 4594 break 4595 } 4596 v.reset(OpARMMOVBUload) 4597 v.AuxInt = int32ToAuxInt(off1 + off2) 4598 v.Aux = symToAux(mergeSym(sym1, sym2)) 4599 v.AddArg2(ptr, mem) 4600 return true 4601 } 4602 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 4603 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4604 // result: (MOVBUreg x) 4605 for { 4606 off := auxIntToInt32(v.AuxInt) 4607 sym := auxToSym(v.Aux) 4608 ptr := v_0 4609 if v_1.Op != OpARMMOVBstore { 4610 break 4611 } 4612 off2 := auxIntToInt32(v_1.AuxInt) 4613 sym2 := auxToSym(v_1.Aux) 4614 x := v_1.Args[1] 4615 ptr2 := v_1.Args[0] 4616 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4617 break 4618 } 4619 v.reset(OpARMMOVBUreg) 4620 v.AddArg(x) 4621 return true 4622 } 4623 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 4624 // cond: sym == nil 4625 // result: (MOVBUloadidx ptr idx mem) 4626 for { 4627 if auxIntToInt32(v.AuxInt) != 0 { 4628 break 4629 } 4630 sym := auxToSym(v.Aux) 4631 if v_0.Op != OpARMADD { 4632 break 4633 } 4634 idx := v_0.Args[1] 4635 ptr := v_0.Args[0] 4636 mem := v_1 4637 if !(sym == nil) { 4638 break 4639 } 4640 v.reset(OpARMMOVBUloadidx) 4641 v.AddArg3(ptr, idx, mem) 4642 return true 4643 } 4644 // match: (MOVBUload [off] {sym} (SB) _) 4645 // cond: symIsRO(sym) 4646 // result: (MOVWconst [int32(read8(sym, int64(off)))]) 4647 for { 4648 off := auxIntToInt32(v.AuxInt) 4649 sym := auxToSym(v.Aux) 4650 if v_0.Op != OpSB || !(symIsRO(sym)) { 4651 break 4652 } 4653 v.reset(OpARMMOVWconst) 4654 v.AuxInt = int32ToAuxInt(int32(read8(sym, int64(off)))) 4655 return true 4656 } 4657 return false 4658 } 4659 func rewriteValueARM_OpARMMOVBUloadidx(v *Value) bool { 4660 v_2 := v.Args[2] 4661 v_1 := v.Args[1] 4662 v_0 := v.Args[0] 4663 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 4664 // cond: isSamePtr(ptr, ptr2) 4665 // result: (MOVBUreg x) 4666 for { 4667 ptr := v_0 4668 idx := v_1 4669 if v_2.Op != OpARMMOVBstoreidx { 4670 break 4671 } 4672 x := v_2.Args[2] 4673 ptr2 := v_2.Args[0] 4674 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 4675 break 4676 } 4677 v.reset(OpARMMOVBUreg) 4678 v.AddArg(x) 4679 return true 4680 } 4681 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 4682 // result: (MOVBUload [c] ptr mem) 4683 for { 4684 ptr := v_0 4685 if v_1.Op != OpARMMOVWconst { 4686 break 4687 } 4688 c := auxIntToInt32(v_1.AuxInt) 4689 mem := v_2 4690 v.reset(OpARMMOVBUload) 4691 v.AuxInt = int32ToAuxInt(c) 4692 v.AddArg2(ptr, mem) 4693 return true 4694 } 4695 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 4696 // result: (MOVBUload [c] ptr mem) 4697 for { 4698 if v_0.Op != OpARMMOVWconst { 4699 break 4700 } 4701 c := auxIntToInt32(v_0.AuxInt) 4702 ptr := v_1 4703 mem := v_2 4704 v.reset(OpARMMOVBUload) 4705 v.AuxInt = int32ToAuxInt(c) 4706 v.AddArg2(ptr, mem) 4707 return true 4708 } 4709 return false 4710 } 4711 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool { 4712 v_0 := v.Args[0] 4713 // match: (MOVBUreg x:(MOVBUload _ _)) 4714 // result: (MOVWreg x) 4715 for { 4716 x := v_0 4717 if x.Op != OpARMMOVBUload { 4718 break 4719 } 4720 v.reset(OpARMMOVWreg) 4721 v.AddArg(x) 4722 return true 4723 } 4724 // match: (MOVBUreg (ANDconst [c] x)) 4725 // result: (ANDconst [c&0xff] x) 4726 for { 4727 if v_0.Op != OpARMANDconst { 4728 break 4729 } 4730 c := auxIntToInt32(v_0.AuxInt) 4731 x := v_0.Args[0] 4732 v.reset(OpARMANDconst) 4733 v.AuxInt = int32ToAuxInt(c & 0xff) 4734 v.AddArg(x) 4735 return true 4736 } 4737 // match: (MOVBUreg x:(MOVBUreg _)) 4738 // result: (MOVWreg x) 4739 for { 4740 x := v_0 4741 if x.Op != OpARMMOVBUreg { 4742 break 4743 } 4744 v.reset(OpARMMOVWreg) 4745 v.AddArg(x) 4746 return true 4747 } 4748 // match: (MOVBUreg (MOVWconst [c])) 4749 // result: (MOVWconst [int32(uint8(c))]) 4750 for { 4751 if v_0.Op != OpARMMOVWconst { 4752 break 4753 } 4754 c := auxIntToInt32(v_0.AuxInt) 4755 v.reset(OpARMMOVWconst) 4756 v.AuxInt = int32ToAuxInt(int32(uint8(c))) 4757 return true 4758 } 4759 return false 4760 } 4761 func rewriteValueARM_OpARMMOVBload(v *Value) bool { 4762 v_1 := v.Args[1] 4763 v_0 := v.Args[0] 4764 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 4765 // result: (MOVBload [off1+off2] {sym} ptr mem) 4766 for { 4767 off1 := auxIntToInt32(v.AuxInt) 4768 sym := auxToSym(v.Aux) 4769 if v_0.Op != OpARMADDconst { 4770 break 4771 } 4772 off2 := auxIntToInt32(v_0.AuxInt) 4773 ptr := v_0.Args[0] 4774 mem := v_1 4775 v.reset(OpARMMOVBload) 4776 v.AuxInt = int32ToAuxInt(off1 + off2) 4777 v.Aux = symToAux(sym) 4778 v.AddArg2(ptr, mem) 4779 return true 4780 } 4781 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 4782 // result: (MOVBload [off1-off2] {sym} ptr mem) 4783 for { 4784 off1 := auxIntToInt32(v.AuxInt) 4785 sym := auxToSym(v.Aux) 4786 if v_0.Op != OpARMSUBconst { 4787 break 4788 } 4789 off2 := auxIntToInt32(v_0.AuxInt) 4790 ptr := v_0.Args[0] 4791 mem := v_1 4792 v.reset(OpARMMOVBload) 4793 v.AuxInt = int32ToAuxInt(off1 - off2) 4794 v.Aux = symToAux(sym) 4795 v.AddArg2(ptr, mem) 4796 return true 4797 } 4798 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 4799 // cond: canMergeSym(sym1,sym2) 4800 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4801 for { 4802 off1 := auxIntToInt32(v.AuxInt) 4803 sym1 := auxToSym(v.Aux) 4804 if v_0.Op != OpARMMOVWaddr { 4805 break 4806 } 4807 off2 := auxIntToInt32(v_0.AuxInt) 4808 sym2 := auxToSym(v_0.Aux) 4809 ptr := v_0.Args[0] 4810 mem := v_1 4811 if !(canMergeSym(sym1, sym2)) { 4812 break 4813 } 4814 v.reset(OpARMMOVBload) 4815 v.AuxInt = int32ToAuxInt(off1 + off2) 4816 v.Aux = symToAux(mergeSym(sym1, sym2)) 4817 v.AddArg2(ptr, mem) 4818 return true 4819 } 4820 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 4821 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4822 // result: (MOVBreg x) 4823 for { 4824 off := auxIntToInt32(v.AuxInt) 4825 sym := auxToSym(v.Aux) 4826 ptr := v_0 4827 if v_1.Op != OpARMMOVBstore { 4828 break 4829 } 4830 off2 := auxIntToInt32(v_1.AuxInt) 4831 sym2 := auxToSym(v_1.Aux) 4832 x := v_1.Args[1] 4833 ptr2 := v_1.Args[0] 4834 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4835 break 4836 } 4837 v.reset(OpARMMOVBreg) 4838 v.AddArg(x) 4839 return true 4840 } 4841 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 4842 // cond: sym == nil 4843 // result: (MOVBloadidx ptr idx mem) 4844 for { 4845 if auxIntToInt32(v.AuxInt) != 0 { 4846 break 4847 } 4848 sym := auxToSym(v.Aux) 4849 if v_0.Op != OpARMADD { 4850 break 4851 } 4852 idx := v_0.Args[1] 4853 ptr := v_0.Args[0] 4854 mem := v_1 4855 if !(sym == nil) { 4856 break 4857 } 4858 v.reset(OpARMMOVBloadidx) 4859 v.AddArg3(ptr, idx, mem) 4860 return true 4861 } 4862 return false 4863 } 4864 func rewriteValueARM_OpARMMOVBloadidx(v *Value) bool { 4865 v_2 := v.Args[2] 4866 v_1 := v.Args[1] 4867 v_0 := v.Args[0] 4868 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 4869 // cond: isSamePtr(ptr, ptr2) 4870 // result: (MOVBreg x) 4871 for { 4872 ptr := v_0 4873 idx := v_1 4874 if v_2.Op != OpARMMOVBstoreidx { 4875 break 4876 } 4877 x := v_2.Args[2] 4878 ptr2 := v_2.Args[0] 4879 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 4880 break 4881 } 4882 v.reset(OpARMMOVBreg) 4883 v.AddArg(x) 4884 return true 4885 } 4886 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 4887 // result: (MOVBload [c] ptr mem) 4888 for { 4889 ptr := v_0 4890 if v_1.Op != OpARMMOVWconst { 4891 break 4892 } 4893 c := auxIntToInt32(v_1.AuxInt) 4894 mem := v_2 4895 v.reset(OpARMMOVBload) 4896 v.AuxInt = int32ToAuxInt(c) 4897 v.AddArg2(ptr, mem) 4898 return true 4899 } 4900 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 4901 // result: (MOVBload [c] ptr mem) 4902 for { 4903 if v_0.Op != OpARMMOVWconst { 4904 break 4905 } 4906 c := auxIntToInt32(v_0.AuxInt) 4907 ptr := v_1 4908 mem := v_2 4909 v.reset(OpARMMOVBload) 4910 v.AuxInt = int32ToAuxInt(c) 4911 v.AddArg2(ptr, mem) 4912 return true 4913 } 4914 return false 4915 } 4916 func rewriteValueARM_OpARMMOVBreg(v *Value) bool { 4917 v_0 := v.Args[0] 4918 // match: (MOVBreg x:(MOVBload _ _)) 4919 // result: (MOVWreg x) 4920 for { 4921 x := v_0 4922 if x.Op != OpARMMOVBload { 4923 break 4924 } 4925 v.reset(OpARMMOVWreg) 4926 v.AddArg(x) 4927 return true 4928 } 4929 // match: (MOVBreg (ANDconst [c] x)) 4930 // cond: c & 0x80 == 0 4931 // result: (ANDconst [c&0x7f] x) 4932 for { 4933 if v_0.Op != OpARMANDconst { 4934 break 4935 } 4936 c := auxIntToInt32(v_0.AuxInt) 4937 x := v_0.Args[0] 4938 if !(c&0x80 == 0) { 4939 break 4940 } 4941 v.reset(OpARMANDconst) 4942 v.AuxInt = int32ToAuxInt(c & 0x7f) 4943 v.AddArg(x) 4944 return true 4945 } 4946 // match: (MOVBreg x:(MOVBreg _)) 4947 // result: (MOVWreg x) 4948 for { 4949 x := v_0 4950 if x.Op != OpARMMOVBreg { 4951 break 4952 } 4953 v.reset(OpARMMOVWreg) 4954 v.AddArg(x) 4955 return true 4956 } 4957 // match: (MOVBreg (MOVWconst [c])) 4958 // result: (MOVWconst [int32(int8(c))]) 4959 for { 4960 if v_0.Op != OpARMMOVWconst { 4961 break 4962 } 4963 c := auxIntToInt32(v_0.AuxInt) 4964 v.reset(OpARMMOVWconst) 4965 v.AuxInt = int32ToAuxInt(int32(int8(c))) 4966 return true 4967 } 4968 return false 4969 } 4970 func rewriteValueARM_OpARMMOVBstore(v *Value) bool { 4971 v_2 := v.Args[2] 4972 v_1 := v.Args[1] 4973 v_0 := v.Args[0] 4974 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4975 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 4976 for { 4977 off1 := auxIntToInt32(v.AuxInt) 4978 sym := auxToSym(v.Aux) 4979 if v_0.Op != OpARMADDconst { 4980 break 4981 } 4982 off2 := auxIntToInt32(v_0.AuxInt) 4983 ptr := v_0.Args[0] 4984 val := v_1 4985 mem := v_2 4986 v.reset(OpARMMOVBstore) 4987 v.AuxInt = int32ToAuxInt(off1 + off2) 4988 v.Aux = symToAux(sym) 4989 v.AddArg3(ptr, val, mem) 4990 return true 4991 } 4992 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 4993 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 4994 for { 4995 off1 := auxIntToInt32(v.AuxInt) 4996 sym := auxToSym(v.Aux) 4997 if v_0.Op != OpARMSUBconst { 4998 break 4999 } 5000 off2 := auxIntToInt32(v_0.AuxInt) 5001 ptr := v_0.Args[0] 5002 val := v_1 5003 mem := v_2 5004 v.reset(OpARMMOVBstore) 5005 v.AuxInt = int32ToAuxInt(off1 - off2) 5006 v.Aux = symToAux(sym) 5007 v.AddArg3(ptr, val, mem) 5008 return true 5009 } 5010 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5011 // cond: canMergeSym(sym1,sym2) 5012 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5013 for { 5014 off1 := auxIntToInt32(v.AuxInt) 5015 sym1 := auxToSym(v.Aux) 5016 if v_0.Op != OpARMMOVWaddr { 5017 break 5018 } 5019 off2 := auxIntToInt32(v_0.AuxInt) 5020 sym2 := auxToSym(v_0.Aux) 5021 ptr := v_0.Args[0] 5022 val := v_1 5023 mem := v_2 5024 if !(canMergeSym(sym1, sym2)) { 5025 break 5026 } 5027 v.reset(OpARMMOVBstore) 5028 v.AuxInt = int32ToAuxInt(off1 + off2) 5029 v.Aux = symToAux(mergeSym(sym1, sym2)) 5030 v.AddArg3(ptr, val, mem) 5031 return true 5032 } 5033 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5034 // result: (MOVBstore [off] {sym} ptr x mem) 5035 for { 5036 off := auxIntToInt32(v.AuxInt) 5037 sym := auxToSym(v.Aux) 5038 ptr := v_0 5039 if v_1.Op != OpARMMOVBreg { 5040 break 5041 } 5042 x := v_1.Args[0] 5043 mem := v_2 5044 v.reset(OpARMMOVBstore) 5045 v.AuxInt = int32ToAuxInt(off) 5046 v.Aux = symToAux(sym) 5047 v.AddArg3(ptr, x, mem) 5048 return true 5049 } 5050 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5051 // result: (MOVBstore [off] {sym} ptr x mem) 5052 for { 5053 off := auxIntToInt32(v.AuxInt) 5054 sym := auxToSym(v.Aux) 5055 ptr := v_0 5056 if v_1.Op != OpARMMOVBUreg { 5057 break 5058 } 5059 x := v_1.Args[0] 5060 mem := v_2 5061 v.reset(OpARMMOVBstore) 5062 v.AuxInt = int32ToAuxInt(off) 5063 v.Aux = symToAux(sym) 5064 v.AddArg3(ptr, x, mem) 5065 return true 5066 } 5067 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5068 // result: (MOVBstore [off] {sym} ptr x mem) 5069 for { 5070 off := auxIntToInt32(v.AuxInt) 5071 sym := auxToSym(v.Aux) 5072 ptr := v_0 5073 if v_1.Op != OpARMMOVHreg { 5074 break 5075 } 5076 x := v_1.Args[0] 5077 mem := v_2 5078 v.reset(OpARMMOVBstore) 5079 v.AuxInt = int32ToAuxInt(off) 5080 v.Aux = symToAux(sym) 5081 v.AddArg3(ptr, x, mem) 5082 return true 5083 } 5084 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5085 // result: (MOVBstore [off] {sym} ptr x mem) 5086 for { 5087 off := auxIntToInt32(v.AuxInt) 5088 sym := auxToSym(v.Aux) 5089 ptr := v_0 5090 if v_1.Op != OpARMMOVHUreg { 5091 break 5092 } 5093 x := v_1.Args[0] 5094 mem := v_2 5095 v.reset(OpARMMOVBstore) 5096 v.AuxInt = int32ToAuxInt(off) 5097 v.Aux = symToAux(sym) 5098 v.AddArg3(ptr, x, mem) 5099 return true 5100 } 5101 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 5102 // cond: sym == nil 5103 // result: (MOVBstoreidx ptr idx val mem) 5104 for { 5105 if auxIntToInt32(v.AuxInt) != 0 { 5106 break 5107 } 5108 sym := auxToSym(v.Aux) 5109 if v_0.Op != OpARMADD { 5110 break 5111 } 5112 idx := v_0.Args[1] 5113 ptr := v_0.Args[0] 5114 val := v_1 5115 mem := v_2 5116 if !(sym == nil) { 5117 break 5118 } 5119 v.reset(OpARMMOVBstoreidx) 5120 v.AddArg4(ptr, idx, val, mem) 5121 return true 5122 } 5123 return false 5124 } 5125 func rewriteValueARM_OpARMMOVBstoreidx(v *Value) bool { 5126 v_3 := v.Args[3] 5127 v_2 := v.Args[2] 5128 v_1 := v.Args[1] 5129 v_0 := v.Args[0] 5130 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 5131 // result: (MOVBstore [c] ptr val mem) 5132 for { 5133 ptr := v_0 5134 if v_1.Op != OpARMMOVWconst { 5135 break 5136 } 5137 c := auxIntToInt32(v_1.AuxInt) 5138 val := v_2 5139 mem := v_3 5140 v.reset(OpARMMOVBstore) 5141 v.AuxInt = int32ToAuxInt(c) 5142 v.AddArg3(ptr, val, mem) 5143 return true 5144 } 5145 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 5146 // result: (MOVBstore [c] ptr val mem) 5147 for { 5148 if v_0.Op != OpARMMOVWconst { 5149 break 5150 } 5151 c := auxIntToInt32(v_0.AuxInt) 5152 ptr := v_1 5153 val := v_2 5154 mem := v_3 5155 v.reset(OpARMMOVBstore) 5156 v.AuxInt = int32ToAuxInt(c) 5157 v.AddArg3(ptr, val, mem) 5158 return true 5159 } 5160 return false 5161 } 5162 func rewriteValueARM_OpARMMOVDload(v *Value) bool { 5163 v_1 := v.Args[1] 5164 v_0 := v.Args[0] 5165 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5166 // result: (MOVDload [off1+off2] {sym} ptr mem) 5167 for { 5168 off1 := auxIntToInt32(v.AuxInt) 5169 sym := auxToSym(v.Aux) 5170 if v_0.Op != OpARMADDconst { 5171 break 5172 } 5173 off2 := auxIntToInt32(v_0.AuxInt) 5174 ptr := v_0.Args[0] 5175 mem := v_1 5176 v.reset(OpARMMOVDload) 5177 v.AuxInt = int32ToAuxInt(off1 + off2) 5178 v.Aux = symToAux(sym) 5179 v.AddArg2(ptr, mem) 5180 return true 5181 } 5182 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 5183 // result: (MOVDload [off1-off2] {sym} ptr mem) 5184 for { 5185 off1 := auxIntToInt32(v.AuxInt) 5186 sym := auxToSym(v.Aux) 5187 if v_0.Op != OpARMSUBconst { 5188 break 5189 } 5190 off2 := auxIntToInt32(v_0.AuxInt) 5191 ptr := v_0.Args[0] 5192 mem := v_1 5193 v.reset(OpARMMOVDload) 5194 v.AuxInt = int32ToAuxInt(off1 - off2) 5195 v.Aux = symToAux(sym) 5196 v.AddArg2(ptr, mem) 5197 return true 5198 } 5199 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5200 // cond: canMergeSym(sym1,sym2) 5201 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5202 for { 5203 off1 := auxIntToInt32(v.AuxInt) 5204 sym1 := auxToSym(v.Aux) 5205 if v_0.Op != OpARMMOVWaddr { 5206 break 5207 } 5208 off2 := auxIntToInt32(v_0.AuxInt) 5209 sym2 := auxToSym(v_0.Aux) 5210 ptr := v_0.Args[0] 5211 mem := v_1 5212 if !(canMergeSym(sym1, sym2)) { 5213 break 5214 } 5215 v.reset(OpARMMOVDload) 5216 v.AuxInt = int32ToAuxInt(off1 + off2) 5217 v.Aux = symToAux(mergeSym(sym1, sym2)) 5218 v.AddArg2(ptr, mem) 5219 return true 5220 } 5221 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5222 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5223 // result: x 5224 for { 5225 off := auxIntToInt32(v.AuxInt) 5226 sym := auxToSym(v.Aux) 5227 ptr := v_0 5228 if v_1.Op != OpARMMOVDstore { 5229 break 5230 } 5231 off2 := auxIntToInt32(v_1.AuxInt) 5232 sym2 := auxToSym(v_1.Aux) 5233 x := v_1.Args[1] 5234 ptr2 := v_1.Args[0] 5235 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5236 break 5237 } 5238 v.copyOf(x) 5239 return true 5240 } 5241 return false 5242 } 5243 func rewriteValueARM_OpARMMOVDstore(v *Value) bool { 5244 v_2 := v.Args[2] 5245 v_1 := v.Args[1] 5246 v_0 := v.Args[0] 5247 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5248 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5249 for { 5250 off1 := auxIntToInt32(v.AuxInt) 5251 sym := auxToSym(v.Aux) 5252 if v_0.Op != OpARMADDconst { 5253 break 5254 } 5255 off2 := auxIntToInt32(v_0.AuxInt) 5256 ptr := v_0.Args[0] 5257 val := v_1 5258 mem := v_2 5259 v.reset(OpARMMOVDstore) 5260 v.AuxInt = int32ToAuxInt(off1 + off2) 5261 v.Aux = symToAux(sym) 5262 v.AddArg3(ptr, val, mem) 5263 return true 5264 } 5265 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5266 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 5267 for { 5268 off1 := auxIntToInt32(v.AuxInt) 5269 sym := auxToSym(v.Aux) 5270 if v_0.Op != OpARMSUBconst { 5271 break 5272 } 5273 off2 := auxIntToInt32(v_0.AuxInt) 5274 ptr := v_0.Args[0] 5275 val := v_1 5276 mem := v_2 5277 v.reset(OpARMMOVDstore) 5278 v.AuxInt = int32ToAuxInt(off1 - off2) 5279 v.Aux = symToAux(sym) 5280 v.AddArg3(ptr, val, mem) 5281 return true 5282 } 5283 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5284 // cond: canMergeSym(sym1,sym2) 5285 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5286 for { 5287 off1 := auxIntToInt32(v.AuxInt) 5288 sym1 := auxToSym(v.Aux) 5289 if v_0.Op != OpARMMOVWaddr { 5290 break 5291 } 5292 off2 := auxIntToInt32(v_0.AuxInt) 5293 sym2 := auxToSym(v_0.Aux) 5294 ptr := v_0.Args[0] 5295 val := v_1 5296 mem := v_2 5297 if !(canMergeSym(sym1, sym2)) { 5298 break 5299 } 5300 v.reset(OpARMMOVDstore) 5301 v.AuxInt = int32ToAuxInt(off1 + off2) 5302 v.Aux = symToAux(mergeSym(sym1, sym2)) 5303 v.AddArg3(ptr, val, mem) 5304 return true 5305 } 5306 return false 5307 } 5308 func rewriteValueARM_OpARMMOVFload(v *Value) bool { 5309 v_1 := v.Args[1] 5310 v_0 := v.Args[0] 5311 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5312 // result: (MOVFload [off1+off2] {sym} ptr mem) 5313 for { 5314 off1 := auxIntToInt32(v.AuxInt) 5315 sym := auxToSym(v.Aux) 5316 if v_0.Op != OpARMADDconst { 5317 break 5318 } 5319 off2 := auxIntToInt32(v_0.AuxInt) 5320 ptr := v_0.Args[0] 5321 mem := v_1 5322 v.reset(OpARMMOVFload) 5323 v.AuxInt = int32ToAuxInt(off1 + off2) 5324 v.Aux = symToAux(sym) 5325 v.AddArg2(ptr, mem) 5326 return true 5327 } 5328 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 5329 // result: (MOVFload [off1-off2] {sym} ptr mem) 5330 for { 5331 off1 := auxIntToInt32(v.AuxInt) 5332 sym := auxToSym(v.Aux) 5333 if v_0.Op != OpARMSUBconst { 5334 break 5335 } 5336 off2 := auxIntToInt32(v_0.AuxInt) 5337 ptr := v_0.Args[0] 5338 mem := v_1 5339 v.reset(OpARMMOVFload) 5340 v.AuxInt = int32ToAuxInt(off1 - off2) 5341 v.Aux = symToAux(sym) 5342 v.AddArg2(ptr, mem) 5343 return true 5344 } 5345 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5346 // cond: canMergeSym(sym1,sym2) 5347 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5348 for { 5349 off1 := auxIntToInt32(v.AuxInt) 5350 sym1 := auxToSym(v.Aux) 5351 if v_0.Op != OpARMMOVWaddr { 5352 break 5353 } 5354 off2 := auxIntToInt32(v_0.AuxInt) 5355 sym2 := auxToSym(v_0.Aux) 5356 ptr := v_0.Args[0] 5357 mem := v_1 5358 if !(canMergeSym(sym1, sym2)) { 5359 break 5360 } 5361 v.reset(OpARMMOVFload) 5362 v.AuxInt = int32ToAuxInt(off1 + off2) 5363 v.Aux = symToAux(mergeSym(sym1, sym2)) 5364 v.AddArg2(ptr, mem) 5365 return true 5366 } 5367 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5368 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5369 // result: x 5370 for { 5371 off := auxIntToInt32(v.AuxInt) 5372 sym := auxToSym(v.Aux) 5373 ptr := v_0 5374 if v_1.Op != OpARMMOVFstore { 5375 break 5376 } 5377 off2 := auxIntToInt32(v_1.AuxInt) 5378 sym2 := auxToSym(v_1.Aux) 5379 x := v_1.Args[1] 5380 ptr2 := v_1.Args[0] 5381 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5382 break 5383 } 5384 v.copyOf(x) 5385 return true 5386 } 5387 return false 5388 } 5389 func rewriteValueARM_OpARMMOVFstore(v *Value) bool { 5390 v_2 := v.Args[2] 5391 v_1 := v.Args[1] 5392 v_0 := v.Args[0] 5393 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5394 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 5395 for { 5396 off1 := auxIntToInt32(v.AuxInt) 5397 sym := auxToSym(v.Aux) 5398 if v_0.Op != OpARMADDconst { 5399 break 5400 } 5401 off2 := auxIntToInt32(v_0.AuxInt) 5402 ptr := v_0.Args[0] 5403 val := v_1 5404 mem := v_2 5405 v.reset(OpARMMOVFstore) 5406 v.AuxInt = int32ToAuxInt(off1 + off2) 5407 v.Aux = symToAux(sym) 5408 v.AddArg3(ptr, val, mem) 5409 return true 5410 } 5411 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5412 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 5413 for { 5414 off1 := auxIntToInt32(v.AuxInt) 5415 sym := auxToSym(v.Aux) 5416 if v_0.Op != OpARMSUBconst { 5417 break 5418 } 5419 off2 := auxIntToInt32(v_0.AuxInt) 5420 ptr := v_0.Args[0] 5421 val := v_1 5422 mem := v_2 5423 v.reset(OpARMMOVFstore) 5424 v.AuxInt = int32ToAuxInt(off1 - off2) 5425 v.Aux = symToAux(sym) 5426 v.AddArg3(ptr, val, mem) 5427 return true 5428 } 5429 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5430 // cond: canMergeSym(sym1,sym2) 5431 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5432 for { 5433 off1 := auxIntToInt32(v.AuxInt) 5434 sym1 := auxToSym(v.Aux) 5435 if v_0.Op != OpARMMOVWaddr { 5436 break 5437 } 5438 off2 := auxIntToInt32(v_0.AuxInt) 5439 sym2 := auxToSym(v_0.Aux) 5440 ptr := v_0.Args[0] 5441 val := v_1 5442 mem := v_2 5443 if !(canMergeSym(sym1, sym2)) { 5444 break 5445 } 5446 v.reset(OpARMMOVFstore) 5447 v.AuxInt = int32ToAuxInt(off1 + off2) 5448 v.Aux = symToAux(mergeSym(sym1, sym2)) 5449 v.AddArg3(ptr, val, mem) 5450 return true 5451 } 5452 return false 5453 } 5454 func rewriteValueARM_OpARMMOVHUload(v *Value) bool { 5455 v_1 := v.Args[1] 5456 v_0 := v.Args[0] 5457 b := v.Block 5458 config := b.Func.Config 5459 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 5460 // result: (MOVHUload [off1+off2] {sym} ptr mem) 5461 for { 5462 off1 := auxIntToInt32(v.AuxInt) 5463 sym := auxToSym(v.Aux) 5464 if v_0.Op != OpARMADDconst { 5465 break 5466 } 5467 off2 := auxIntToInt32(v_0.AuxInt) 5468 ptr := v_0.Args[0] 5469 mem := v_1 5470 v.reset(OpARMMOVHUload) 5471 v.AuxInt = int32ToAuxInt(off1 + off2) 5472 v.Aux = symToAux(sym) 5473 v.AddArg2(ptr, mem) 5474 return true 5475 } 5476 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 5477 // result: (MOVHUload [off1-off2] {sym} ptr mem) 5478 for { 5479 off1 := auxIntToInt32(v.AuxInt) 5480 sym := auxToSym(v.Aux) 5481 if v_0.Op != OpARMSUBconst { 5482 break 5483 } 5484 off2 := auxIntToInt32(v_0.AuxInt) 5485 ptr := v_0.Args[0] 5486 mem := v_1 5487 v.reset(OpARMMOVHUload) 5488 v.AuxInt = int32ToAuxInt(off1 - off2) 5489 v.Aux = symToAux(sym) 5490 v.AddArg2(ptr, mem) 5491 return true 5492 } 5493 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5494 // cond: canMergeSym(sym1,sym2) 5495 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5496 for { 5497 off1 := auxIntToInt32(v.AuxInt) 5498 sym1 := auxToSym(v.Aux) 5499 if v_0.Op != OpARMMOVWaddr { 5500 break 5501 } 5502 off2 := auxIntToInt32(v_0.AuxInt) 5503 sym2 := auxToSym(v_0.Aux) 5504 ptr := v_0.Args[0] 5505 mem := v_1 5506 if !(canMergeSym(sym1, sym2)) { 5507 break 5508 } 5509 v.reset(OpARMMOVHUload) 5510 v.AuxInt = int32ToAuxInt(off1 + off2) 5511 v.Aux = symToAux(mergeSym(sym1, sym2)) 5512 v.AddArg2(ptr, mem) 5513 return true 5514 } 5515 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5516 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5517 // result: (MOVHUreg x) 5518 for { 5519 off := auxIntToInt32(v.AuxInt) 5520 sym := auxToSym(v.Aux) 5521 ptr := v_0 5522 if v_1.Op != OpARMMOVHstore { 5523 break 5524 } 5525 off2 := auxIntToInt32(v_1.AuxInt) 5526 sym2 := auxToSym(v_1.Aux) 5527 x := v_1.Args[1] 5528 ptr2 := v_1.Args[0] 5529 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5530 break 5531 } 5532 v.reset(OpARMMOVHUreg) 5533 v.AddArg(x) 5534 return true 5535 } 5536 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 5537 // cond: sym == nil 5538 // result: (MOVHUloadidx ptr idx mem) 5539 for { 5540 if auxIntToInt32(v.AuxInt) != 0 { 5541 break 5542 } 5543 sym := auxToSym(v.Aux) 5544 if v_0.Op != OpARMADD { 5545 break 5546 } 5547 idx := v_0.Args[1] 5548 ptr := v_0.Args[0] 5549 mem := v_1 5550 if !(sym == nil) { 5551 break 5552 } 5553 v.reset(OpARMMOVHUloadidx) 5554 v.AddArg3(ptr, idx, mem) 5555 return true 5556 } 5557 // match: (MOVHUload [off] {sym} (SB) _) 5558 // cond: symIsRO(sym) 5559 // result: (MOVWconst [int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))]) 5560 for { 5561 off := auxIntToInt32(v.AuxInt) 5562 sym := auxToSym(v.Aux) 5563 if v_0.Op != OpSB || !(symIsRO(sym)) { 5564 break 5565 } 5566 v.reset(OpARMMOVWconst) 5567 v.AuxInt = int32ToAuxInt(int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))) 5568 return true 5569 } 5570 return false 5571 } 5572 func rewriteValueARM_OpARMMOVHUloadidx(v *Value) bool { 5573 v_2 := v.Args[2] 5574 v_1 := v.Args[1] 5575 v_0 := v.Args[0] 5576 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 5577 // cond: isSamePtr(ptr, ptr2) 5578 // result: (MOVHUreg x) 5579 for { 5580 ptr := v_0 5581 idx := v_1 5582 if v_2.Op != OpARMMOVHstoreidx { 5583 break 5584 } 5585 x := v_2.Args[2] 5586 ptr2 := v_2.Args[0] 5587 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 5588 break 5589 } 5590 v.reset(OpARMMOVHUreg) 5591 v.AddArg(x) 5592 return true 5593 } 5594 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 5595 // result: (MOVHUload [c] ptr mem) 5596 for { 5597 ptr := v_0 5598 if v_1.Op != OpARMMOVWconst { 5599 break 5600 } 5601 c := auxIntToInt32(v_1.AuxInt) 5602 mem := v_2 5603 v.reset(OpARMMOVHUload) 5604 v.AuxInt = int32ToAuxInt(c) 5605 v.AddArg2(ptr, mem) 5606 return true 5607 } 5608 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 5609 // result: (MOVHUload [c] ptr mem) 5610 for { 5611 if v_0.Op != OpARMMOVWconst { 5612 break 5613 } 5614 c := auxIntToInt32(v_0.AuxInt) 5615 ptr := v_1 5616 mem := v_2 5617 v.reset(OpARMMOVHUload) 5618 v.AuxInt = int32ToAuxInt(c) 5619 v.AddArg2(ptr, mem) 5620 return true 5621 } 5622 return false 5623 } 5624 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool { 5625 v_0 := v.Args[0] 5626 // match: (MOVHUreg x:(MOVBUload _ _)) 5627 // result: (MOVWreg x) 5628 for { 5629 x := v_0 5630 if x.Op != OpARMMOVBUload { 5631 break 5632 } 5633 v.reset(OpARMMOVWreg) 5634 v.AddArg(x) 5635 return true 5636 } 5637 // match: (MOVHUreg x:(MOVHUload _ _)) 5638 // result: (MOVWreg x) 5639 for { 5640 x := v_0 5641 if x.Op != OpARMMOVHUload { 5642 break 5643 } 5644 v.reset(OpARMMOVWreg) 5645 v.AddArg(x) 5646 return true 5647 } 5648 // match: (MOVHUreg (ANDconst [c] x)) 5649 // result: (ANDconst [c&0xffff] x) 5650 for { 5651 if v_0.Op != OpARMANDconst { 5652 break 5653 } 5654 c := auxIntToInt32(v_0.AuxInt) 5655 x := v_0.Args[0] 5656 v.reset(OpARMANDconst) 5657 v.AuxInt = int32ToAuxInt(c & 0xffff) 5658 v.AddArg(x) 5659 return true 5660 } 5661 // match: (MOVHUreg x:(MOVBUreg _)) 5662 // result: (MOVWreg x) 5663 for { 5664 x := v_0 5665 if x.Op != OpARMMOVBUreg { 5666 break 5667 } 5668 v.reset(OpARMMOVWreg) 5669 v.AddArg(x) 5670 return true 5671 } 5672 // match: (MOVHUreg x:(MOVHUreg _)) 5673 // result: (MOVWreg x) 5674 for { 5675 x := v_0 5676 if x.Op != OpARMMOVHUreg { 5677 break 5678 } 5679 v.reset(OpARMMOVWreg) 5680 v.AddArg(x) 5681 return true 5682 } 5683 // match: (MOVHUreg (MOVWconst [c])) 5684 // result: (MOVWconst [int32(uint16(c))]) 5685 for { 5686 if v_0.Op != OpARMMOVWconst { 5687 break 5688 } 5689 c := auxIntToInt32(v_0.AuxInt) 5690 v.reset(OpARMMOVWconst) 5691 v.AuxInt = int32ToAuxInt(int32(uint16(c))) 5692 return true 5693 } 5694 return false 5695 } 5696 func rewriteValueARM_OpARMMOVHload(v *Value) bool { 5697 v_1 := v.Args[1] 5698 v_0 := v.Args[0] 5699 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 5700 // result: (MOVHload [off1+off2] {sym} ptr mem) 5701 for { 5702 off1 := auxIntToInt32(v.AuxInt) 5703 sym := auxToSym(v.Aux) 5704 if v_0.Op != OpARMADDconst { 5705 break 5706 } 5707 off2 := auxIntToInt32(v_0.AuxInt) 5708 ptr := v_0.Args[0] 5709 mem := v_1 5710 v.reset(OpARMMOVHload) 5711 v.AuxInt = int32ToAuxInt(off1 + off2) 5712 v.Aux = symToAux(sym) 5713 v.AddArg2(ptr, mem) 5714 return true 5715 } 5716 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 5717 // result: (MOVHload [off1-off2] {sym} ptr mem) 5718 for { 5719 off1 := auxIntToInt32(v.AuxInt) 5720 sym := auxToSym(v.Aux) 5721 if v_0.Op != OpARMSUBconst { 5722 break 5723 } 5724 off2 := auxIntToInt32(v_0.AuxInt) 5725 ptr := v_0.Args[0] 5726 mem := v_1 5727 v.reset(OpARMMOVHload) 5728 v.AuxInt = int32ToAuxInt(off1 - off2) 5729 v.Aux = symToAux(sym) 5730 v.AddArg2(ptr, mem) 5731 return true 5732 } 5733 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5734 // cond: canMergeSym(sym1,sym2) 5735 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5736 for { 5737 off1 := auxIntToInt32(v.AuxInt) 5738 sym1 := auxToSym(v.Aux) 5739 if v_0.Op != OpARMMOVWaddr { 5740 break 5741 } 5742 off2 := auxIntToInt32(v_0.AuxInt) 5743 sym2 := auxToSym(v_0.Aux) 5744 ptr := v_0.Args[0] 5745 mem := v_1 5746 if !(canMergeSym(sym1, sym2)) { 5747 break 5748 } 5749 v.reset(OpARMMOVHload) 5750 v.AuxInt = int32ToAuxInt(off1 + off2) 5751 v.Aux = symToAux(mergeSym(sym1, sym2)) 5752 v.AddArg2(ptr, mem) 5753 return true 5754 } 5755 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5756 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5757 // result: (MOVHreg x) 5758 for { 5759 off := auxIntToInt32(v.AuxInt) 5760 sym := auxToSym(v.Aux) 5761 ptr := v_0 5762 if v_1.Op != OpARMMOVHstore { 5763 break 5764 } 5765 off2 := auxIntToInt32(v_1.AuxInt) 5766 sym2 := auxToSym(v_1.Aux) 5767 x := v_1.Args[1] 5768 ptr2 := v_1.Args[0] 5769 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5770 break 5771 } 5772 v.reset(OpARMMOVHreg) 5773 v.AddArg(x) 5774 return true 5775 } 5776 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 5777 // cond: sym == nil 5778 // result: (MOVHloadidx ptr idx mem) 5779 for { 5780 if auxIntToInt32(v.AuxInt) != 0 { 5781 break 5782 } 5783 sym := auxToSym(v.Aux) 5784 if v_0.Op != OpARMADD { 5785 break 5786 } 5787 idx := v_0.Args[1] 5788 ptr := v_0.Args[0] 5789 mem := v_1 5790 if !(sym == nil) { 5791 break 5792 } 5793 v.reset(OpARMMOVHloadidx) 5794 v.AddArg3(ptr, idx, mem) 5795 return true 5796 } 5797 return false 5798 } 5799 func rewriteValueARM_OpARMMOVHloadidx(v *Value) bool { 5800 v_2 := v.Args[2] 5801 v_1 := v.Args[1] 5802 v_0 := v.Args[0] 5803 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 5804 // cond: isSamePtr(ptr, ptr2) 5805 // result: (MOVHreg x) 5806 for { 5807 ptr := v_0 5808 idx := v_1 5809 if v_2.Op != OpARMMOVHstoreidx { 5810 break 5811 } 5812 x := v_2.Args[2] 5813 ptr2 := v_2.Args[0] 5814 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 5815 break 5816 } 5817 v.reset(OpARMMOVHreg) 5818 v.AddArg(x) 5819 return true 5820 } 5821 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 5822 // result: (MOVHload [c] ptr mem) 5823 for { 5824 ptr := v_0 5825 if v_1.Op != OpARMMOVWconst { 5826 break 5827 } 5828 c := auxIntToInt32(v_1.AuxInt) 5829 mem := v_2 5830 v.reset(OpARMMOVHload) 5831 v.AuxInt = int32ToAuxInt(c) 5832 v.AddArg2(ptr, mem) 5833 return true 5834 } 5835 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 5836 // result: (MOVHload [c] ptr mem) 5837 for { 5838 if v_0.Op != OpARMMOVWconst { 5839 break 5840 } 5841 c := auxIntToInt32(v_0.AuxInt) 5842 ptr := v_1 5843 mem := v_2 5844 v.reset(OpARMMOVHload) 5845 v.AuxInt = int32ToAuxInt(c) 5846 v.AddArg2(ptr, mem) 5847 return true 5848 } 5849 return false 5850 } 5851 func rewriteValueARM_OpARMMOVHreg(v *Value) bool { 5852 v_0 := v.Args[0] 5853 // match: (MOVHreg x:(MOVBload _ _)) 5854 // result: (MOVWreg x) 5855 for { 5856 x := v_0 5857 if x.Op != OpARMMOVBload { 5858 break 5859 } 5860 v.reset(OpARMMOVWreg) 5861 v.AddArg(x) 5862 return true 5863 } 5864 // match: (MOVHreg x:(MOVBUload _ _)) 5865 // result: (MOVWreg x) 5866 for { 5867 x := v_0 5868 if x.Op != OpARMMOVBUload { 5869 break 5870 } 5871 v.reset(OpARMMOVWreg) 5872 v.AddArg(x) 5873 return true 5874 } 5875 // match: (MOVHreg x:(MOVHload _ _)) 5876 // result: (MOVWreg x) 5877 for { 5878 x := v_0 5879 if x.Op != OpARMMOVHload { 5880 break 5881 } 5882 v.reset(OpARMMOVWreg) 5883 v.AddArg(x) 5884 return true 5885 } 5886 // match: (MOVHreg (ANDconst [c] x)) 5887 // cond: c & 0x8000 == 0 5888 // result: (ANDconst [c&0x7fff] x) 5889 for { 5890 if v_0.Op != OpARMANDconst { 5891 break 5892 } 5893 c := auxIntToInt32(v_0.AuxInt) 5894 x := v_0.Args[0] 5895 if !(c&0x8000 == 0) { 5896 break 5897 } 5898 v.reset(OpARMANDconst) 5899 v.AuxInt = int32ToAuxInt(c & 0x7fff) 5900 v.AddArg(x) 5901 return true 5902 } 5903 // match: (MOVHreg x:(MOVBreg _)) 5904 // result: (MOVWreg x) 5905 for { 5906 x := v_0 5907 if x.Op != OpARMMOVBreg { 5908 break 5909 } 5910 v.reset(OpARMMOVWreg) 5911 v.AddArg(x) 5912 return true 5913 } 5914 // match: (MOVHreg x:(MOVBUreg _)) 5915 // result: (MOVWreg x) 5916 for { 5917 x := v_0 5918 if x.Op != OpARMMOVBUreg { 5919 break 5920 } 5921 v.reset(OpARMMOVWreg) 5922 v.AddArg(x) 5923 return true 5924 } 5925 // match: (MOVHreg x:(MOVHreg _)) 5926 // result: (MOVWreg x) 5927 for { 5928 x := v_0 5929 if x.Op != OpARMMOVHreg { 5930 break 5931 } 5932 v.reset(OpARMMOVWreg) 5933 v.AddArg(x) 5934 return true 5935 } 5936 // match: (MOVHreg (MOVWconst [c])) 5937 // result: (MOVWconst [int32(int16(c))]) 5938 for { 5939 if v_0.Op != OpARMMOVWconst { 5940 break 5941 } 5942 c := auxIntToInt32(v_0.AuxInt) 5943 v.reset(OpARMMOVWconst) 5944 v.AuxInt = int32ToAuxInt(int32(int16(c))) 5945 return true 5946 } 5947 return false 5948 } 5949 func rewriteValueARM_OpARMMOVHstore(v *Value) bool { 5950 v_2 := v.Args[2] 5951 v_1 := v.Args[1] 5952 v_0 := v.Args[0] 5953 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5954 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 5955 for { 5956 off1 := auxIntToInt32(v.AuxInt) 5957 sym := auxToSym(v.Aux) 5958 if v_0.Op != OpARMADDconst { 5959 break 5960 } 5961 off2 := auxIntToInt32(v_0.AuxInt) 5962 ptr := v_0.Args[0] 5963 val := v_1 5964 mem := v_2 5965 v.reset(OpARMMOVHstore) 5966 v.AuxInt = int32ToAuxInt(off1 + off2) 5967 v.Aux = symToAux(sym) 5968 v.AddArg3(ptr, val, mem) 5969 return true 5970 } 5971 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5972 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 5973 for { 5974 off1 := auxIntToInt32(v.AuxInt) 5975 sym := auxToSym(v.Aux) 5976 if v_0.Op != OpARMSUBconst { 5977 break 5978 } 5979 off2 := auxIntToInt32(v_0.AuxInt) 5980 ptr := v_0.Args[0] 5981 val := v_1 5982 mem := v_2 5983 v.reset(OpARMMOVHstore) 5984 v.AuxInt = int32ToAuxInt(off1 - off2) 5985 v.Aux = symToAux(sym) 5986 v.AddArg3(ptr, val, mem) 5987 return true 5988 } 5989 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5990 // cond: canMergeSym(sym1,sym2) 5991 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5992 for { 5993 off1 := auxIntToInt32(v.AuxInt) 5994 sym1 := auxToSym(v.Aux) 5995 if v_0.Op != OpARMMOVWaddr { 5996 break 5997 } 5998 off2 := auxIntToInt32(v_0.AuxInt) 5999 sym2 := auxToSym(v_0.Aux) 6000 ptr := v_0.Args[0] 6001 val := v_1 6002 mem := v_2 6003 if !(canMergeSym(sym1, sym2)) { 6004 break 6005 } 6006 v.reset(OpARMMOVHstore) 6007 v.AuxInt = int32ToAuxInt(off1 + off2) 6008 v.Aux = symToAux(mergeSym(sym1, sym2)) 6009 v.AddArg3(ptr, val, mem) 6010 return true 6011 } 6012 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6013 // result: (MOVHstore [off] {sym} ptr x mem) 6014 for { 6015 off := auxIntToInt32(v.AuxInt) 6016 sym := auxToSym(v.Aux) 6017 ptr := v_0 6018 if v_1.Op != OpARMMOVHreg { 6019 break 6020 } 6021 x := v_1.Args[0] 6022 mem := v_2 6023 v.reset(OpARMMOVHstore) 6024 v.AuxInt = int32ToAuxInt(off) 6025 v.Aux = symToAux(sym) 6026 v.AddArg3(ptr, x, mem) 6027 return true 6028 } 6029 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6030 // result: (MOVHstore [off] {sym} ptr x mem) 6031 for { 6032 off := auxIntToInt32(v.AuxInt) 6033 sym := auxToSym(v.Aux) 6034 ptr := v_0 6035 if v_1.Op != OpARMMOVHUreg { 6036 break 6037 } 6038 x := v_1.Args[0] 6039 mem := v_2 6040 v.reset(OpARMMOVHstore) 6041 v.AuxInt = int32ToAuxInt(off) 6042 v.Aux = symToAux(sym) 6043 v.AddArg3(ptr, x, mem) 6044 return true 6045 } 6046 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 6047 // cond: sym == nil 6048 // result: (MOVHstoreidx ptr idx val mem) 6049 for { 6050 if auxIntToInt32(v.AuxInt) != 0 { 6051 break 6052 } 6053 sym := auxToSym(v.Aux) 6054 if v_0.Op != OpARMADD { 6055 break 6056 } 6057 idx := v_0.Args[1] 6058 ptr := v_0.Args[0] 6059 val := v_1 6060 mem := v_2 6061 if !(sym == nil) { 6062 break 6063 } 6064 v.reset(OpARMMOVHstoreidx) 6065 v.AddArg4(ptr, idx, val, mem) 6066 return true 6067 } 6068 return false 6069 } 6070 func rewriteValueARM_OpARMMOVHstoreidx(v *Value) bool { 6071 v_3 := v.Args[3] 6072 v_2 := v.Args[2] 6073 v_1 := v.Args[1] 6074 v_0 := v.Args[0] 6075 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 6076 // result: (MOVHstore [c] ptr val mem) 6077 for { 6078 ptr := v_0 6079 if v_1.Op != OpARMMOVWconst { 6080 break 6081 } 6082 c := auxIntToInt32(v_1.AuxInt) 6083 val := v_2 6084 mem := v_3 6085 v.reset(OpARMMOVHstore) 6086 v.AuxInt = int32ToAuxInt(c) 6087 v.AddArg3(ptr, val, mem) 6088 return true 6089 } 6090 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 6091 // result: (MOVHstore [c] ptr val mem) 6092 for { 6093 if v_0.Op != OpARMMOVWconst { 6094 break 6095 } 6096 c := auxIntToInt32(v_0.AuxInt) 6097 ptr := v_1 6098 val := v_2 6099 mem := v_3 6100 v.reset(OpARMMOVHstore) 6101 v.AuxInt = int32ToAuxInt(c) 6102 v.AddArg3(ptr, val, mem) 6103 return true 6104 } 6105 return false 6106 } 6107 func rewriteValueARM_OpARMMOVWload(v *Value) bool { 6108 v_1 := v.Args[1] 6109 v_0 := v.Args[0] 6110 b := v.Block 6111 config := b.Func.Config 6112 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6113 // result: (MOVWload [off1+off2] {sym} ptr mem) 6114 for { 6115 off1 := auxIntToInt32(v.AuxInt) 6116 sym := auxToSym(v.Aux) 6117 if v_0.Op != OpARMADDconst { 6118 break 6119 } 6120 off2 := auxIntToInt32(v_0.AuxInt) 6121 ptr := v_0.Args[0] 6122 mem := v_1 6123 v.reset(OpARMMOVWload) 6124 v.AuxInt = int32ToAuxInt(off1 + off2) 6125 v.Aux = symToAux(sym) 6126 v.AddArg2(ptr, mem) 6127 return true 6128 } 6129 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 6130 // result: (MOVWload [off1-off2] {sym} ptr mem) 6131 for { 6132 off1 := auxIntToInt32(v.AuxInt) 6133 sym := auxToSym(v.Aux) 6134 if v_0.Op != OpARMSUBconst { 6135 break 6136 } 6137 off2 := auxIntToInt32(v_0.AuxInt) 6138 ptr := v_0.Args[0] 6139 mem := v_1 6140 v.reset(OpARMMOVWload) 6141 v.AuxInt = int32ToAuxInt(off1 - off2) 6142 v.Aux = symToAux(sym) 6143 v.AddArg2(ptr, mem) 6144 return true 6145 } 6146 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6147 // cond: canMergeSym(sym1,sym2) 6148 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6149 for { 6150 off1 := auxIntToInt32(v.AuxInt) 6151 sym1 := auxToSym(v.Aux) 6152 if v_0.Op != OpARMMOVWaddr { 6153 break 6154 } 6155 off2 := auxIntToInt32(v_0.AuxInt) 6156 sym2 := auxToSym(v_0.Aux) 6157 ptr := v_0.Args[0] 6158 mem := v_1 6159 if !(canMergeSym(sym1, sym2)) { 6160 break 6161 } 6162 v.reset(OpARMMOVWload) 6163 v.AuxInt = int32ToAuxInt(off1 + off2) 6164 v.Aux = symToAux(mergeSym(sym1, sym2)) 6165 v.AddArg2(ptr, mem) 6166 return true 6167 } 6168 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6169 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6170 // result: x 6171 for { 6172 off := auxIntToInt32(v.AuxInt) 6173 sym := auxToSym(v.Aux) 6174 ptr := v_0 6175 if v_1.Op != OpARMMOVWstore { 6176 break 6177 } 6178 off2 := auxIntToInt32(v_1.AuxInt) 6179 sym2 := auxToSym(v_1.Aux) 6180 x := v_1.Args[1] 6181 ptr2 := v_1.Args[0] 6182 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6183 break 6184 } 6185 v.copyOf(x) 6186 return true 6187 } 6188 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6189 // cond: sym == nil 6190 // result: (MOVWloadidx ptr idx mem) 6191 for { 6192 if auxIntToInt32(v.AuxInt) != 0 { 6193 break 6194 } 6195 sym := auxToSym(v.Aux) 6196 if v_0.Op != OpARMADD { 6197 break 6198 } 6199 idx := v_0.Args[1] 6200 ptr := v_0.Args[0] 6201 mem := v_1 6202 if !(sym == nil) { 6203 break 6204 } 6205 v.reset(OpARMMOVWloadidx) 6206 v.AddArg3(ptr, idx, mem) 6207 return true 6208 } 6209 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6210 // cond: sym == nil 6211 // result: (MOVWloadshiftLL ptr idx [c] mem) 6212 for { 6213 if auxIntToInt32(v.AuxInt) != 0 { 6214 break 6215 } 6216 sym := auxToSym(v.Aux) 6217 if v_0.Op != OpARMADDshiftLL { 6218 break 6219 } 6220 c := auxIntToInt32(v_0.AuxInt) 6221 idx := v_0.Args[1] 6222 ptr := v_0.Args[0] 6223 mem := v_1 6224 if !(sym == nil) { 6225 break 6226 } 6227 v.reset(OpARMMOVWloadshiftLL) 6228 v.AuxInt = int32ToAuxInt(c) 6229 v.AddArg3(ptr, idx, mem) 6230 return true 6231 } 6232 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6233 // cond: sym == nil 6234 // result: (MOVWloadshiftRL ptr idx [c] mem) 6235 for { 6236 if auxIntToInt32(v.AuxInt) != 0 { 6237 break 6238 } 6239 sym := auxToSym(v.Aux) 6240 if v_0.Op != OpARMADDshiftRL { 6241 break 6242 } 6243 c := auxIntToInt32(v_0.AuxInt) 6244 idx := v_0.Args[1] 6245 ptr := v_0.Args[0] 6246 mem := v_1 6247 if !(sym == nil) { 6248 break 6249 } 6250 v.reset(OpARMMOVWloadshiftRL) 6251 v.AuxInt = int32ToAuxInt(c) 6252 v.AddArg3(ptr, idx, mem) 6253 return true 6254 } 6255 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6256 // cond: sym == nil 6257 // result: (MOVWloadshiftRA ptr idx [c] mem) 6258 for { 6259 if auxIntToInt32(v.AuxInt) != 0 { 6260 break 6261 } 6262 sym := auxToSym(v.Aux) 6263 if v_0.Op != OpARMADDshiftRA { 6264 break 6265 } 6266 c := auxIntToInt32(v_0.AuxInt) 6267 idx := v_0.Args[1] 6268 ptr := v_0.Args[0] 6269 mem := v_1 6270 if !(sym == nil) { 6271 break 6272 } 6273 v.reset(OpARMMOVWloadshiftRA) 6274 v.AuxInt = int32ToAuxInt(c) 6275 v.AddArg3(ptr, idx, mem) 6276 return true 6277 } 6278 // match: (MOVWload [off] {sym} (SB) _) 6279 // cond: symIsRO(sym) 6280 // result: (MOVWconst [int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))]) 6281 for { 6282 off := auxIntToInt32(v.AuxInt) 6283 sym := auxToSym(v.Aux) 6284 if v_0.Op != OpSB || !(symIsRO(sym)) { 6285 break 6286 } 6287 v.reset(OpARMMOVWconst) 6288 v.AuxInt = int32ToAuxInt(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))) 6289 return true 6290 } 6291 return false 6292 } 6293 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool { 6294 v_2 := v.Args[2] 6295 v_1 := v.Args[1] 6296 v_0 := v.Args[0] 6297 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6298 // cond: isSamePtr(ptr, ptr2) 6299 // result: x 6300 for { 6301 ptr := v_0 6302 idx := v_1 6303 if v_2.Op != OpARMMOVWstoreidx { 6304 break 6305 } 6306 x := v_2.Args[2] 6307 ptr2 := v_2.Args[0] 6308 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 6309 break 6310 } 6311 v.copyOf(x) 6312 return true 6313 } 6314 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6315 // result: (MOVWload [c] ptr mem) 6316 for { 6317 ptr := v_0 6318 if v_1.Op != OpARMMOVWconst { 6319 break 6320 } 6321 c := auxIntToInt32(v_1.AuxInt) 6322 mem := v_2 6323 v.reset(OpARMMOVWload) 6324 v.AuxInt = int32ToAuxInt(c) 6325 v.AddArg2(ptr, mem) 6326 return true 6327 } 6328 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6329 // result: (MOVWload [c] ptr mem) 6330 for { 6331 if v_0.Op != OpARMMOVWconst { 6332 break 6333 } 6334 c := auxIntToInt32(v_0.AuxInt) 6335 ptr := v_1 6336 mem := v_2 6337 v.reset(OpARMMOVWload) 6338 v.AuxInt = int32ToAuxInt(c) 6339 v.AddArg2(ptr, mem) 6340 return true 6341 } 6342 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6343 // result: (MOVWloadshiftLL ptr idx [c] mem) 6344 for { 6345 ptr := v_0 6346 if v_1.Op != OpARMSLLconst { 6347 break 6348 } 6349 c := auxIntToInt32(v_1.AuxInt) 6350 idx := v_1.Args[0] 6351 mem := v_2 6352 v.reset(OpARMMOVWloadshiftLL) 6353 v.AuxInt = int32ToAuxInt(c) 6354 v.AddArg3(ptr, idx, mem) 6355 return true 6356 } 6357 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6358 // result: (MOVWloadshiftLL ptr idx [c] mem) 6359 for { 6360 if v_0.Op != OpARMSLLconst { 6361 break 6362 } 6363 c := auxIntToInt32(v_0.AuxInt) 6364 idx := v_0.Args[0] 6365 ptr := v_1 6366 mem := v_2 6367 v.reset(OpARMMOVWloadshiftLL) 6368 v.AuxInt = int32ToAuxInt(c) 6369 v.AddArg3(ptr, idx, mem) 6370 return true 6371 } 6372 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6373 // result: (MOVWloadshiftRL ptr idx [c] mem) 6374 for { 6375 ptr := v_0 6376 if v_1.Op != OpARMSRLconst { 6377 break 6378 } 6379 c := auxIntToInt32(v_1.AuxInt) 6380 idx := v_1.Args[0] 6381 mem := v_2 6382 v.reset(OpARMMOVWloadshiftRL) 6383 v.AuxInt = int32ToAuxInt(c) 6384 v.AddArg3(ptr, idx, mem) 6385 return true 6386 } 6387 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6388 // result: (MOVWloadshiftRL ptr idx [c] mem) 6389 for { 6390 if v_0.Op != OpARMSRLconst { 6391 break 6392 } 6393 c := auxIntToInt32(v_0.AuxInt) 6394 idx := v_0.Args[0] 6395 ptr := v_1 6396 mem := v_2 6397 v.reset(OpARMMOVWloadshiftRL) 6398 v.AuxInt = int32ToAuxInt(c) 6399 v.AddArg3(ptr, idx, mem) 6400 return true 6401 } 6402 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6403 // result: (MOVWloadshiftRA ptr idx [c] mem) 6404 for { 6405 ptr := v_0 6406 if v_1.Op != OpARMSRAconst { 6407 break 6408 } 6409 c := auxIntToInt32(v_1.AuxInt) 6410 idx := v_1.Args[0] 6411 mem := v_2 6412 v.reset(OpARMMOVWloadshiftRA) 6413 v.AuxInt = int32ToAuxInt(c) 6414 v.AddArg3(ptr, idx, mem) 6415 return true 6416 } 6417 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6418 // result: (MOVWloadshiftRA ptr idx [c] mem) 6419 for { 6420 if v_0.Op != OpARMSRAconst { 6421 break 6422 } 6423 c := auxIntToInt32(v_0.AuxInt) 6424 idx := v_0.Args[0] 6425 ptr := v_1 6426 mem := v_2 6427 v.reset(OpARMMOVWloadshiftRA) 6428 v.AuxInt = int32ToAuxInt(c) 6429 v.AddArg3(ptr, idx, mem) 6430 return true 6431 } 6432 return false 6433 } 6434 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool { 6435 v_2 := v.Args[2] 6436 v_1 := v.Args[1] 6437 v_0 := v.Args[0] 6438 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6439 // cond: c==d && isSamePtr(ptr, ptr2) 6440 // result: x 6441 for { 6442 c := auxIntToInt32(v.AuxInt) 6443 ptr := v_0 6444 idx := v_1 6445 if v_2.Op != OpARMMOVWstoreshiftLL { 6446 break 6447 } 6448 d := auxIntToInt32(v_2.AuxInt) 6449 x := v_2.Args[2] 6450 ptr2 := v_2.Args[0] 6451 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6452 break 6453 } 6454 v.copyOf(x) 6455 return true 6456 } 6457 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6458 // result: (MOVWload [int32(uint32(c)<<uint64(d))] ptr mem) 6459 for { 6460 d := auxIntToInt32(v.AuxInt) 6461 ptr := v_0 6462 if v_1.Op != OpARMMOVWconst { 6463 break 6464 } 6465 c := auxIntToInt32(v_1.AuxInt) 6466 mem := v_2 6467 v.reset(OpARMMOVWload) 6468 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d))) 6469 v.AddArg2(ptr, mem) 6470 return true 6471 } 6472 return false 6473 } 6474 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool { 6475 v_2 := v.Args[2] 6476 v_1 := v.Args[1] 6477 v_0 := v.Args[0] 6478 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6479 // cond: c==d && isSamePtr(ptr, ptr2) 6480 // result: x 6481 for { 6482 c := auxIntToInt32(v.AuxInt) 6483 ptr := v_0 6484 idx := v_1 6485 if v_2.Op != OpARMMOVWstoreshiftRA { 6486 break 6487 } 6488 d := auxIntToInt32(v_2.AuxInt) 6489 x := v_2.Args[2] 6490 ptr2 := v_2.Args[0] 6491 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6492 break 6493 } 6494 v.copyOf(x) 6495 return true 6496 } 6497 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6498 // result: (MOVWload [c>>uint64(d)] ptr mem) 6499 for { 6500 d := auxIntToInt32(v.AuxInt) 6501 ptr := v_0 6502 if v_1.Op != OpARMMOVWconst { 6503 break 6504 } 6505 c := auxIntToInt32(v_1.AuxInt) 6506 mem := v_2 6507 v.reset(OpARMMOVWload) 6508 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 6509 v.AddArg2(ptr, mem) 6510 return true 6511 } 6512 return false 6513 } 6514 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool { 6515 v_2 := v.Args[2] 6516 v_1 := v.Args[1] 6517 v_0 := v.Args[0] 6518 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6519 // cond: c==d && isSamePtr(ptr, ptr2) 6520 // result: x 6521 for { 6522 c := auxIntToInt32(v.AuxInt) 6523 ptr := v_0 6524 idx := v_1 6525 if v_2.Op != OpARMMOVWstoreshiftRL { 6526 break 6527 } 6528 d := auxIntToInt32(v_2.AuxInt) 6529 x := v_2.Args[2] 6530 ptr2 := v_2.Args[0] 6531 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6532 break 6533 } 6534 v.copyOf(x) 6535 return true 6536 } 6537 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6538 // result: (MOVWload [int32(uint32(c)>>uint64(d))] ptr mem) 6539 for { 6540 d := auxIntToInt32(v.AuxInt) 6541 ptr := v_0 6542 if v_1.Op != OpARMMOVWconst { 6543 break 6544 } 6545 c := auxIntToInt32(v_1.AuxInt) 6546 mem := v_2 6547 v.reset(OpARMMOVWload) 6548 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 6549 v.AddArg2(ptr, mem) 6550 return true 6551 } 6552 return false 6553 } 6554 func rewriteValueARM_OpARMMOVWnop(v *Value) bool { 6555 v_0 := v.Args[0] 6556 // match: (MOVWnop (MOVWconst [c])) 6557 // result: (MOVWconst [c]) 6558 for { 6559 if v_0.Op != OpARMMOVWconst { 6560 break 6561 } 6562 c := auxIntToInt32(v_0.AuxInt) 6563 v.reset(OpARMMOVWconst) 6564 v.AuxInt = int32ToAuxInt(c) 6565 return true 6566 } 6567 return false 6568 } 6569 func rewriteValueARM_OpARMMOVWreg(v *Value) bool { 6570 v_0 := v.Args[0] 6571 // match: (MOVWreg x) 6572 // cond: x.Uses == 1 6573 // result: (MOVWnop x) 6574 for { 6575 x := v_0 6576 if !(x.Uses == 1) { 6577 break 6578 } 6579 v.reset(OpARMMOVWnop) 6580 v.AddArg(x) 6581 return true 6582 } 6583 // match: (MOVWreg (MOVWconst [c])) 6584 // result: (MOVWconst [c]) 6585 for { 6586 if v_0.Op != OpARMMOVWconst { 6587 break 6588 } 6589 c := auxIntToInt32(v_0.AuxInt) 6590 v.reset(OpARMMOVWconst) 6591 v.AuxInt = int32ToAuxInt(c) 6592 return true 6593 } 6594 return false 6595 } 6596 func rewriteValueARM_OpARMMOVWstore(v *Value) bool { 6597 v_2 := v.Args[2] 6598 v_1 := v.Args[1] 6599 v_0 := v.Args[0] 6600 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6601 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6602 for { 6603 off1 := auxIntToInt32(v.AuxInt) 6604 sym := auxToSym(v.Aux) 6605 if v_0.Op != OpARMADDconst { 6606 break 6607 } 6608 off2 := auxIntToInt32(v_0.AuxInt) 6609 ptr := v_0.Args[0] 6610 val := v_1 6611 mem := v_2 6612 v.reset(OpARMMOVWstore) 6613 v.AuxInt = int32ToAuxInt(off1 + off2) 6614 v.Aux = symToAux(sym) 6615 v.AddArg3(ptr, val, mem) 6616 return true 6617 } 6618 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6619 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 6620 for { 6621 off1 := auxIntToInt32(v.AuxInt) 6622 sym := auxToSym(v.Aux) 6623 if v_0.Op != OpARMSUBconst { 6624 break 6625 } 6626 off2 := auxIntToInt32(v_0.AuxInt) 6627 ptr := v_0.Args[0] 6628 val := v_1 6629 mem := v_2 6630 v.reset(OpARMMOVWstore) 6631 v.AuxInt = int32ToAuxInt(off1 - off2) 6632 v.Aux = symToAux(sym) 6633 v.AddArg3(ptr, val, mem) 6634 return true 6635 } 6636 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6637 // cond: canMergeSym(sym1,sym2) 6638 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6639 for { 6640 off1 := auxIntToInt32(v.AuxInt) 6641 sym1 := auxToSym(v.Aux) 6642 if v_0.Op != OpARMMOVWaddr { 6643 break 6644 } 6645 off2 := auxIntToInt32(v_0.AuxInt) 6646 sym2 := auxToSym(v_0.Aux) 6647 ptr := v_0.Args[0] 6648 val := v_1 6649 mem := v_2 6650 if !(canMergeSym(sym1, sym2)) { 6651 break 6652 } 6653 v.reset(OpARMMOVWstore) 6654 v.AuxInt = int32ToAuxInt(off1 + off2) 6655 v.Aux = symToAux(mergeSym(sym1, sym2)) 6656 v.AddArg3(ptr, val, mem) 6657 return true 6658 } 6659 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 6660 // cond: sym == nil 6661 // result: (MOVWstoreidx ptr idx val mem) 6662 for { 6663 if auxIntToInt32(v.AuxInt) != 0 { 6664 break 6665 } 6666 sym := auxToSym(v.Aux) 6667 if v_0.Op != OpARMADD { 6668 break 6669 } 6670 idx := v_0.Args[1] 6671 ptr := v_0.Args[0] 6672 val := v_1 6673 mem := v_2 6674 if !(sym == nil) { 6675 break 6676 } 6677 v.reset(OpARMMOVWstoreidx) 6678 v.AddArg4(ptr, idx, val, mem) 6679 return true 6680 } 6681 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 6682 // cond: sym == nil 6683 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6684 for { 6685 if auxIntToInt32(v.AuxInt) != 0 { 6686 break 6687 } 6688 sym := auxToSym(v.Aux) 6689 if v_0.Op != OpARMADDshiftLL { 6690 break 6691 } 6692 c := auxIntToInt32(v_0.AuxInt) 6693 idx := v_0.Args[1] 6694 ptr := v_0.Args[0] 6695 val := v_1 6696 mem := v_2 6697 if !(sym == nil) { 6698 break 6699 } 6700 v.reset(OpARMMOVWstoreshiftLL) 6701 v.AuxInt = int32ToAuxInt(c) 6702 v.AddArg4(ptr, idx, val, mem) 6703 return true 6704 } 6705 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 6706 // cond: sym == nil 6707 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6708 for { 6709 if auxIntToInt32(v.AuxInt) != 0 { 6710 break 6711 } 6712 sym := auxToSym(v.Aux) 6713 if v_0.Op != OpARMADDshiftRL { 6714 break 6715 } 6716 c := auxIntToInt32(v_0.AuxInt) 6717 idx := v_0.Args[1] 6718 ptr := v_0.Args[0] 6719 val := v_1 6720 mem := v_2 6721 if !(sym == nil) { 6722 break 6723 } 6724 v.reset(OpARMMOVWstoreshiftRL) 6725 v.AuxInt = int32ToAuxInt(c) 6726 v.AddArg4(ptr, idx, val, mem) 6727 return true 6728 } 6729 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 6730 // cond: sym == nil 6731 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6732 for { 6733 if auxIntToInt32(v.AuxInt) != 0 { 6734 break 6735 } 6736 sym := auxToSym(v.Aux) 6737 if v_0.Op != OpARMADDshiftRA { 6738 break 6739 } 6740 c := auxIntToInt32(v_0.AuxInt) 6741 idx := v_0.Args[1] 6742 ptr := v_0.Args[0] 6743 val := v_1 6744 mem := v_2 6745 if !(sym == nil) { 6746 break 6747 } 6748 v.reset(OpARMMOVWstoreshiftRA) 6749 v.AuxInt = int32ToAuxInt(c) 6750 v.AddArg4(ptr, idx, val, mem) 6751 return true 6752 } 6753 return false 6754 } 6755 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool { 6756 v_3 := v.Args[3] 6757 v_2 := v.Args[2] 6758 v_1 := v.Args[1] 6759 v_0 := v.Args[0] 6760 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 6761 // result: (MOVWstore [c] ptr val mem) 6762 for { 6763 ptr := v_0 6764 if v_1.Op != OpARMMOVWconst { 6765 break 6766 } 6767 c := auxIntToInt32(v_1.AuxInt) 6768 val := v_2 6769 mem := v_3 6770 v.reset(OpARMMOVWstore) 6771 v.AuxInt = int32ToAuxInt(c) 6772 v.AddArg3(ptr, val, mem) 6773 return true 6774 } 6775 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 6776 // result: (MOVWstore [c] ptr val mem) 6777 for { 6778 if v_0.Op != OpARMMOVWconst { 6779 break 6780 } 6781 c := auxIntToInt32(v_0.AuxInt) 6782 ptr := v_1 6783 val := v_2 6784 mem := v_3 6785 v.reset(OpARMMOVWstore) 6786 v.AuxInt = int32ToAuxInt(c) 6787 v.AddArg3(ptr, val, mem) 6788 return true 6789 } 6790 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 6791 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6792 for { 6793 ptr := v_0 6794 if v_1.Op != OpARMSLLconst { 6795 break 6796 } 6797 c := auxIntToInt32(v_1.AuxInt) 6798 idx := v_1.Args[0] 6799 val := v_2 6800 mem := v_3 6801 v.reset(OpARMMOVWstoreshiftLL) 6802 v.AuxInt = int32ToAuxInt(c) 6803 v.AddArg4(ptr, idx, val, mem) 6804 return true 6805 } 6806 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 6807 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6808 for { 6809 if v_0.Op != OpARMSLLconst { 6810 break 6811 } 6812 c := auxIntToInt32(v_0.AuxInt) 6813 idx := v_0.Args[0] 6814 ptr := v_1 6815 val := v_2 6816 mem := v_3 6817 v.reset(OpARMMOVWstoreshiftLL) 6818 v.AuxInt = int32ToAuxInt(c) 6819 v.AddArg4(ptr, idx, val, mem) 6820 return true 6821 } 6822 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 6823 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6824 for { 6825 ptr := v_0 6826 if v_1.Op != OpARMSRLconst { 6827 break 6828 } 6829 c := auxIntToInt32(v_1.AuxInt) 6830 idx := v_1.Args[0] 6831 val := v_2 6832 mem := v_3 6833 v.reset(OpARMMOVWstoreshiftRL) 6834 v.AuxInt = int32ToAuxInt(c) 6835 v.AddArg4(ptr, idx, val, mem) 6836 return true 6837 } 6838 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 6839 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6840 for { 6841 if v_0.Op != OpARMSRLconst { 6842 break 6843 } 6844 c := auxIntToInt32(v_0.AuxInt) 6845 idx := v_0.Args[0] 6846 ptr := v_1 6847 val := v_2 6848 mem := v_3 6849 v.reset(OpARMMOVWstoreshiftRL) 6850 v.AuxInt = int32ToAuxInt(c) 6851 v.AddArg4(ptr, idx, val, mem) 6852 return true 6853 } 6854 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 6855 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6856 for { 6857 ptr := v_0 6858 if v_1.Op != OpARMSRAconst { 6859 break 6860 } 6861 c := auxIntToInt32(v_1.AuxInt) 6862 idx := v_1.Args[0] 6863 val := v_2 6864 mem := v_3 6865 v.reset(OpARMMOVWstoreshiftRA) 6866 v.AuxInt = int32ToAuxInt(c) 6867 v.AddArg4(ptr, idx, val, mem) 6868 return true 6869 } 6870 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 6871 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6872 for { 6873 if v_0.Op != OpARMSRAconst { 6874 break 6875 } 6876 c := auxIntToInt32(v_0.AuxInt) 6877 idx := v_0.Args[0] 6878 ptr := v_1 6879 val := v_2 6880 mem := v_3 6881 v.reset(OpARMMOVWstoreshiftRA) 6882 v.AuxInt = int32ToAuxInt(c) 6883 v.AddArg4(ptr, idx, val, mem) 6884 return true 6885 } 6886 return false 6887 } 6888 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool { 6889 v_3 := v.Args[3] 6890 v_2 := v.Args[2] 6891 v_1 := v.Args[1] 6892 v_0 := v.Args[0] 6893 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 6894 // result: (MOVWstore [int32(uint32(c)<<uint64(d))] ptr val mem) 6895 for { 6896 d := auxIntToInt32(v.AuxInt) 6897 ptr := v_0 6898 if v_1.Op != OpARMMOVWconst { 6899 break 6900 } 6901 c := auxIntToInt32(v_1.AuxInt) 6902 val := v_2 6903 mem := v_3 6904 v.reset(OpARMMOVWstore) 6905 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d))) 6906 v.AddArg3(ptr, val, mem) 6907 return true 6908 } 6909 return false 6910 } 6911 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool { 6912 v_3 := v.Args[3] 6913 v_2 := v.Args[2] 6914 v_1 := v.Args[1] 6915 v_0 := v.Args[0] 6916 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 6917 // result: (MOVWstore [c>>uint64(d)] ptr val mem) 6918 for { 6919 d := auxIntToInt32(v.AuxInt) 6920 ptr := v_0 6921 if v_1.Op != OpARMMOVWconst { 6922 break 6923 } 6924 c := auxIntToInt32(v_1.AuxInt) 6925 val := v_2 6926 mem := v_3 6927 v.reset(OpARMMOVWstore) 6928 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 6929 v.AddArg3(ptr, val, mem) 6930 return true 6931 } 6932 return false 6933 } 6934 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool { 6935 v_3 := v.Args[3] 6936 v_2 := v.Args[2] 6937 v_1 := v.Args[1] 6938 v_0 := v.Args[0] 6939 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 6940 // result: (MOVWstore [int32(uint32(c)>>uint64(d))] ptr val mem) 6941 for { 6942 d := auxIntToInt32(v.AuxInt) 6943 ptr := v_0 6944 if v_1.Op != OpARMMOVWconst { 6945 break 6946 } 6947 c := auxIntToInt32(v_1.AuxInt) 6948 val := v_2 6949 mem := v_3 6950 v.reset(OpARMMOVWstore) 6951 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 6952 v.AddArg3(ptr, val, mem) 6953 return true 6954 } 6955 return false 6956 } 6957 func rewriteValueARM_OpARMMUL(v *Value) bool { 6958 v_1 := v.Args[1] 6959 v_0 := v.Args[0] 6960 b := v.Block 6961 // match: (MUL x (MOVWconst [c])) 6962 // cond: int32(c) == -1 6963 // result: (RSBconst [0] x) 6964 for { 6965 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 6966 x := v_0 6967 if v_1.Op != OpARMMOVWconst { 6968 continue 6969 } 6970 c := auxIntToInt32(v_1.AuxInt) 6971 if !(int32(c) == -1) { 6972 continue 6973 } 6974 v.reset(OpARMRSBconst) 6975 v.AuxInt = int32ToAuxInt(0) 6976 v.AddArg(x) 6977 return true 6978 } 6979 break 6980 } 6981 // match: (MUL _ (MOVWconst [0])) 6982 // result: (MOVWconst [0]) 6983 for { 6984 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 6985 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 6986 continue 6987 } 6988 v.reset(OpARMMOVWconst) 6989 v.AuxInt = int32ToAuxInt(0) 6990 return true 6991 } 6992 break 6993 } 6994 // match: (MUL x (MOVWconst [1])) 6995 // result: x 6996 for { 6997 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 6998 x := v_0 6999 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7000 continue 7001 } 7002 v.copyOf(x) 7003 return true 7004 } 7005 break 7006 } 7007 // match: (MUL x (MOVWconst [c])) 7008 // cond: isPowerOfTwo32(c) 7009 // result: (SLLconst [int32(log32(c))] x) 7010 for { 7011 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7012 x := v_0 7013 if v_1.Op != OpARMMOVWconst { 7014 continue 7015 } 7016 c := auxIntToInt32(v_1.AuxInt) 7017 if !(isPowerOfTwo32(c)) { 7018 continue 7019 } 7020 v.reset(OpARMSLLconst) 7021 v.AuxInt = int32ToAuxInt(int32(log32(c))) 7022 v.AddArg(x) 7023 return true 7024 } 7025 break 7026 } 7027 // match: (MUL x (MOVWconst [c])) 7028 // cond: isPowerOfTwo32(c-1) && c >= 3 7029 // result: (ADDshiftLL x x [int32(log32(c-1))]) 7030 for { 7031 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7032 x := v_0 7033 if v_1.Op != OpARMMOVWconst { 7034 continue 7035 } 7036 c := auxIntToInt32(v_1.AuxInt) 7037 if !(isPowerOfTwo32(c-1) && c >= 3) { 7038 continue 7039 } 7040 v.reset(OpARMADDshiftLL) 7041 v.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7042 v.AddArg2(x, x) 7043 return true 7044 } 7045 break 7046 } 7047 // match: (MUL x (MOVWconst [c])) 7048 // cond: isPowerOfTwo32(c+1) && c >= 7 7049 // result: (RSBshiftLL x x [int32(log32(c+1))]) 7050 for { 7051 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7052 x := v_0 7053 if v_1.Op != OpARMMOVWconst { 7054 continue 7055 } 7056 c := auxIntToInt32(v_1.AuxInt) 7057 if !(isPowerOfTwo32(c+1) && c >= 7) { 7058 continue 7059 } 7060 v.reset(OpARMRSBshiftLL) 7061 v.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7062 v.AddArg2(x, x) 7063 return true 7064 } 7065 break 7066 } 7067 // match: (MUL x (MOVWconst [c])) 7068 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7069 // result: (SLLconst [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) 7070 for { 7071 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7072 x := v_0 7073 if v_1.Op != OpARMMOVWconst { 7074 continue 7075 } 7076 c := auxIntToInt32(v_1.AuxInt) 7077 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7078 continue 7079 } 7080 v.reset(OpARMSLLconst) 7081 v.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7082 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7083 v0.AuxInt = int32ToAuxInt(1) 7084 v0.AddArg2(x, x) 7085 v.AddArg(v0) 7086 return true 7087 } 7088 break 7089 } 7090 // match: (MUL x (MOVWconst [c])) 7091 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7092 // result: (SLLconst [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) 7093 for { 7094 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7095 x := v_0 7096 if v_1.Op != OpARMMOVWconst { 7097 continue 7098 } 7099 c := auxIntToInt32(v_1.AuxInt) 7100 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7101 continue 7102 } 7103 v.reset(OpARMSLLconst) 7104 v.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7105 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7106 v0.AuxInt = int32ToAuxInt(2) 7107 v0.AddArg2(x, x) 7108 v.AddArg(v0) 7109 return true 7110 } 7111 break 7112 } 7113 // match: (MUL x (MOVWconst [c])) 7114 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7115 // result: (SLLconst [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) 7116 for { 7117 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7118 x := v_0 7119 if v_1.Op != OpARMMOVWconst { 7120 continue 7121 } 7122 c := auxIntToInt32(v_1.AuxInt) 7123 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7124 continue 7125 } 7126 v.reset(OpARMSLLconst) 7127 v.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7128 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7129 v0.AuxInt = int32ToAuxInt(3) 7130 v0.AddArg2(x, x) 7131 v.AddArg(v0) 7132 return true 7133 } 7134 break 7135 } 7136 // match: (MUL x (MOVWconst [c])) 7137 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7138 // result: (SLLconst [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) 7139 for { 7140 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7141 x := v_0 7142 if v_1.Op != OpARMMOVWconst { 7143 continue 7144 } 7145 c := auxIntToInt32(v_1.AuxInt) 7146 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7147 continue 7148 } 7149 v.reset(OpARMSLLconst) 7150 v.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7151 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7152 v0.AuxInt = int32ToAuxInt(3) 7153 v0.AddArg2(x, x) 7154 v.AddArg(v0) 7155 return true 7156 } 7157 break 7158 } 7159 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7160 // result: (MOVWconst [c*d]) 7161 for { 7162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7163 if v_0.Op != OpARMMOVWconst { 7164 continue 7165 } 7166 c := auxIntToInt32(v_0.AuxInt) 7167 if v_1.Op != OpARMMOVWconst { 7168 continue 7169 } 7170 d := auxIntToInt32(v_1.AuxInt) 7171 v.reset(OpARMMOVWconst) 7172 v.AuxInt = int32ToAuxInt(c * d) 7173 return true 7174 } 7175 break 7176 } 7177 return false 7178 } 7179 func rewriteValueARM_OpARMMULA(v *Value) bool { 7180 v_2 := v.Args[2] 7181 v_1 := v.Args[1] 7182 v_0 := v.Args[0] 7183 b := v.Block 7184 // match: (MULA x (MOVWconst [c]) a) 7185 // cond: c == -1 7186 // result: (SUB a x) 7187 for { 7188 x := v_0 7189 if v_1.Op != OpARMMOVWconst { 7190 break 7191 } 7192 c := auxIntToInt32(v_1.AuxInt) 7193 a := v_2 7194 if !(c == -1) { 7195 break 7196 } 7197 v.reset(OpARMSUB) 7198 v.AddArg2(a, x) 7199 return true 7200 } 7201 // match: (MULA _ (MOVWconst [0]) a) 7202 // result: a 7203 for { 7204 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 7205 break 7206 } 7207 a := v_2 7208 v.copyOf(a) 7209 return true 7210 } 7211 // match: (MULA x (MOVWconst [1]) a) 7212 // result: (ADD x a) 7213 for { 7214 x := v_0 7215 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7216 break 7217 } 7218 a := v_2 7219 v.reset(OpARMADD) 7220 v.AddArg2(x, a) 7221 return true 7222 } 7223 // match: (MULA x (MOVWconst [c]) a) 7224 // cond: isPowerOfTwo32(c) 7225 // result: (ADD (SLLconst <x.Type> [int32(log32(c))] x) a) 7226 for { 7227 x := v_0 7228 if v_1.Op != OpARMMOVWconst { 7229 break 7230 } 7231 c := auxIntToInt32(v_1.AuxInt) 7232 a := v_2 7233 if !(isPowerOfTwo32(c)) { 7234 break 7235 } 7236 v.reset(OpARMADD) 7237 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7238 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7239 v0.AddArg(x) 7240 v.AddArg2(v0, a) 7241 return true 7242 } 7243 // match: (MULA x (MOVWconst [c]) a) 7244 // cond: isPowerOfTwo32(c-1) && c >= 3 7245 // result: (ADD (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7246 for { 7247 x := v_0 7248 if v_1.Op != OpARMMOVWconst { 7249 break 7250 } 7251 c := auxIntToInt32(v_1.AuxInt) 7252 a := v_2 7253 if !(isPowerOfTwo32(c-1) && c >= 3) { 7254 break 7255 } 7256 v.reset(OpARMADD) 7257 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7258 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7259 v0.AddArg2(x, x) 7260 v.AddArg2(v0, a) 7261 return true 7262 } 7263 // match: (MULA x (MOVWconst [c]) a) 7264 // cond: isPowerOfTwo32(c+1) && c >= 7 7265 // result: (ADD (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7266 for { 7267 x := v_0 7268 if v_1.Op != OpARMMOVWconst { 7269 break 7270 } 7271 c := auxIntToInt32(v_1.AuxInt) 7272 a := v_2 7273 if !(isPowerOfTwo32(c+1) && c >= 7) { 7274 break 7275 } 7276 v.reset(OpARMADD) 7277 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7278 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7279 v0.AddArg2(x, x) 7280 v.AddArg2(v0, a) 7281 return true 7282 } 7283 // match: (MULA x (MOVWconst [c]) a) 7284 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7285 // result: (ADD (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7286 for { 7287 x := v_0 7288 if v_1.Op != OpARMMOVWconst { 7289 break 7290 } 7291 c := auxIntToInt32(v_1.AuxInt) 7292 a := v_2 7293 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7294 break 7295 } 7296 v.reset(OpARMADD) 7297 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7298 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7299 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7300 v1.AuxInt = int32ToAuxInt(1) 7301 v1.AddArg2(x, x) 7302 v0.AddArg(v1) 7303 v.AddArg2(v0, a) 7304 return true 7305 } 7306 // match: (MULA x (MOVWconst [c]) a) 7307 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7308 // result: (ADD (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7309 for { 7310 x := v_0 7311 if v_1.Op != OpARMMOVWconst { 7312 break 7313 } 7314 c := auxIntToInt32(v_1.AuxInt) 7315 a := v_2 7316 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7317 break 7318 } 7319 v.reset(OpARMADD) 7320 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7321 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7322 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7323 v1.AuxInt = int32ToAuxInt(2) 7324 v1.AddArg2(x, x) 7325 v0.AddArg(v1) 7326 v.AddArg2(v0, a) 7327 return true 7328 } 7329 // match: (MULA x (MOVWconst [c]) a) 7330 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7331 // result: (ADD (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7332 for { 7333 x := v_0 7334 if v_1.Op != OpARMMOVWconst { 7335 break 7336 } 7337 c := auxIntToInt32(v_1.AuxInt) 7338 a := v_2 7339 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7340 break 7341 } 7342 v.reset(OpARMADD) 7343 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7344 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7345 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7346 v1.AuxInt = int32ToAuxInt(3) 7347 v1.AddArg2(x, x) 7348 v0.AddArg(v1) 7349 v.AddArg2(v0, a) 7350 return true 7351 } 7352 // match: (MULA x (MOVWconst [c]) a) 7353 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7354 // result: (ADD (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7355 for { 7356 x := v_0 7357 if v_1.Op != OpARMMOVWconst { 7358 break 7359 } 7360 c := auxIntToInt32(v_1.AuxInt) 7361 a := v_2 7362 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7363 break 7364 } 7365 v.reset(OpARMADD) 7366 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7367 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7368 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7369 v1.AuxInt = int32ToAuxInt(3) 7370 v1.AddArg2(x, x) 7371 v0.AddArg(v1) 7372 v.AddArg2(v0, a) 7373 return true 7374 } 7375 // match: (MULA (MOVWconst [c]) x a) 7376 // cond: c == -1 7377 // result: (SUB a x) 7378 for { 7379 if v_0.Op != OpARMMOVWconst { 7380 break 7381 } 7382 c := auxIntToInt32(v_0.AuxInt) 7383 x := v_1 7384 a := v_2 7385 if !(c == -1) { 7386 break 7387 } 7388 v.reset(OpARMSUB) 7389 v.AddArg2(a, x) 7390 return true 7391 } 7392 // match: (MULA (MOVWconst [0]) _ a) 7393 // result: a 7394 for { 7395 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 { 7396 break 7397 } 7398 a := v_2 7399 v.copyOf(a) 7400 return true 7401 } 7402 // match: (MULA (MOVWconst [1]) x a) 7403 // result: (ADD x a) 7404 for { 7405 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 { 7406 break 7407 } 7408 x := v_1 7409 a := v_2 7410 v.reset(OpARMADD) 7411 v.AddArg2(x, a) 7412 return true 7413 } 7414 // match: (MULA (MOVWconst [c]) x a) 7415 // cond: isPowerOfTwo32(c) 7416 // result: (ADD (SLLconst <x.Type> [int32(log32(c))] x) a) 7417 for { 7418 if v_0.Op != OpARMMOVWconst { 7419 break 7420 } 7421 c := auxIntToInt32(v_0.AuxInt) 7422 x := v_1 7423 a := v_2 7424 if !(isPowerOfTwo32(c)) { 7425 break 7426 } 7427 v.reset(OpARMADD) 7428 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7429 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7430 v0.AddArg(x) 7431 v.AddArg2(v0, a) 7432 return true 7433 } 7434 // match: (MULA (MOVWconst [c]) x a) 7435 // cond: isPowerOfTwo32(c-1) && c >= 3 7436 // result: (ADD (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7437 for { 7438 if v_0.Op != OpARMMOVWconst { 7439 break 7440 } 7441 c := auxIntToInt32(v_0.AuxInt) 7442 x := v_1 7443 a := v_2 7444 if !(isPowerOfTwo32(c-1) && c >= 3) { 7445 break 7446 } 7447 v.reset(OpARMADD) 7448 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7449 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7450 v0.AddArg2(x, x) 7451 v.AddArg2(v0, a) 7452 return true 7453 } 7454 // match: (MULA (MOVWconst [c]) x a) 7455 // cond: isPowerOfTwo32(c+1) && c >= 7 7456 // result: (ADD (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7457 for { 7458 if v_0.Op != OpARMMOVWconst { 7459 break 7460 } 7461 c := auxIntToInt32(v_0.AuxInt) 7462 x := v_1 7463 a := v_2 7464 if !(isPowerOfTwo32(c+1) && c >= 7) { 7465 break 7466 } 7467 v.reset(OpARMADD) 7468 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7469 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7470 v0.AddArg2(x, x) 7471 v.AddArg2(v0, a) 7472 return true 7473 } 7474 // match: (MULA (MOVWconst [c]) x a) 7475 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7476 // result: (ADD (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7477 for { 7478 if v_0.Op != OpARMMOVWconst { 7479 break 7480 } 7481 c := auxIntToInt32(v_0.AuxInt) 7482 x := v_1 7483 a := v_2 7484 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7485 break 7486 } 7487 v.reset(OpARMADD) 7488 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7489 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7490 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7491 v1.AuxInt = int32ToAuxInt(1) 7492 v1.AddArg2(x, x) 7493 v0.AddArg(v1) 7494 v.AddArg2(v0, a) 7495 return true 7496 } 7497 // match: (MULA (MOVWconst [c]) x a) 7498 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7499 // result: (ADD (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7500 for { 7501 if v_0.Op != OpARMMOVWconst { 7502 break 7503 } 7504 c := auxIntToInt32(v_0.AuxInt) 7505 x := v_1 7506 a := v_2 7507 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7508 break 7509 } 7510 v.reset(OpARMADD) 7511 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7512 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7513 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7514 v1.AuxInt = int32ToAuxInt(2) 7515 v1.AddArg2(x, x) 7516 v0.AddArg(v1) 7517 v.AddArg2(v0, a) 7518 return true 7519 } 7520 // match: (MULA (MOVWconst [c]) x a) 7521 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7522 // result: (ADD (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7523 for { 7524 if v_0.Op != OpARMMOVWconst { 7525 break 7526 } 7527 c := auxIntToInt32(v_0.AuxInt) 7528 x := v_1 7529 a := v_2 7530 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7531 break 7532 } 7533 v.reset(OpARMADD) 7534 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7535 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7536 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7537 v1.AuxInt = int32ToAuxInt(3) 7538 v1.AddArg2(x, x) 7539 v0.AddArg(v1) 7540 v.AddArg2(v0, a) 7541 return true 7542 } 7543 // match: (MULA (MOVWconst [c]) x a) 7544 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7545 // result: (ADD (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7546 for { 7547 if v_0.Op != OpARMMOVWconst { 7548 break 7549 } 7550 c := auxIntToInt32(v_0.AuxInt) 7551 x := v_1 7552 a := v_2 7553 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7554 break 7555 } 7556 v.reset(OpARMADD) 7557 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7558 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7559 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7560 v1.AuxInt = int32ToAuxInt(3) 7561 v1.AddArg2(x, x) 7562 v0.AddArg(v1) 7563 v.AddArg2(v0, a) 7564 return true 7565 } 7566 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 7567 // result: (ADDconst [c*d] a) 7568 for { 7569 if v_0.Op != OpARMMOVWconst { 7570 break 7571 } 7572 c := auxIntToInt32(v_0.AuxInt) 7573 if v_1.Op != OpARMMOVWconst { 7574 break 7575 } 7576 d := auxIntToInt32(v_1.AuxInt) 7577 a := v_2 7578 v.reset(OpARMADDconst) 7579 v.AuxInt = int32ToAuxInt(c * d) 7580 v.AddArg(a) 7581 return true 7582 } 7583 return false 7584 } 7585 func rewriteValueARM_OpARMMULD(v *Value) bool { 7586 v_1 := v.Args[1] 7587 v_0 := v.Args[0] 7588 // match: (MULD (NEGD x) y) 7589 // cond: buildcfg.GOARM >= 6 7590 // result: (NMULD x y) 7591 for { 7592 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7593 if v_0.Op != OpARMNEGD { 7594 continue 7595 } 7596 x := v_0.Args[0] 7597 y := v_1 7598 if !(buildcfg.GOARM >= 6) { 7599 continue 7600 } 7601 v.reset(OpARMNMULD) 7602 v.AddArg2(x, y) 7603 return true 7604 } 7605 break 7606 } 7607 return false 7608 } 7609 func rewriteValueARM_OpARMMULF(v *Value) bool { 7610 v_1 := v.Args[1] 7611 v_0 := v.Args[0] 7612 // match: (MULF (NEGF x) y) 7613 // cond: buildcfg.GOARM >= 6 7614 // result: (NMULF x y) 7615 for { 7616 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7617 if v_0.Op != OpARMNEGF { 7618 continue 7619 } 7620 x := v_0.Args[0] 7621 y := v_1 7622 if !(buildcfg.GOARM >= 6) { 7623 continue 7624 } 7625 v.reset(OpARMNMULF) 7626 v.AddArg2(x, y) 7627 return true 7628 } 7629 break 7630 } 7631 return false 7632 } 7633 func rewriteValueARM_OpARMMULS(v *Value) bool { 7634 v_2 := v.Args[2] 7635 v_1 := v.Args[1] 7636 v_0 := v.Args[0] 7637 b := v.Block 7638 // match: (MULS x (MOVWconst [c]) a) 7639 // cond: c == -1 7640 // result: (ADD a x) 7641 for { 7642 x := v_0 7643 if v_1.Op != OpARMMOVWconst { 7644 break 7645 } 7646 c := auxIntToInt32(v_1.AuxInt) 7647 a := v_2 7648 if !(c == -1) { 7649 break 7650 } 7651 v.reset(OpARMADD) 7652 v.AddArg2(a, x) 7653 return true 7654 } 7655 // match: (MULS _ (MOVWconst [0]) a) 7656 // result: a 7657 for { 7658 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 7659 break 7660 } 7661 a := v_2 7662 v.copyOf(a) 7663 return true 7664 } 7665 // match: (MULS x (MOVWconst [1]) a) 7666 // result: (RSB x a) 7667 for { 7668 x := v_0 7669 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7670 break 7671 } 7672 a := v_2 7673 v.reset(OpARMRSB) 7674 v.AddArg2(x, a) 7675 return true 7676 } 7677 // match: (MULS x (MOVWconst [c]) a) 7678 // cond: isPowerOfTwo32(c) 7679 // result: (RSB (SLLconst <x.Type> [int32(log32(c))] x) a) 7680 for { 7681 x := v_0 7682 if v_1.Op != OpARMMOVWconst { 7683 break 7684 } 7685 c := auxIntToInt32(v_1.AuxInt) 7686 a := v_2 7687 if !(isPowerOfTwo32(c)) { 7688 break 7689 } 7690 v.reset(OpARMRSB) 7691 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7692 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7693 v0.AddArg(x) 7694 v.AddArg2(v0, a) 7695 return true 7696 } 7697 // match: (MULS x (MOVWconst [c]) a) 7698 // cond: isPowerOfTwo32(c-1) && c >= 3 7699 // result: (RSB (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7700 for { 7701 x := v_0 7702 if v_1.Op != OpARMMOVWconst { 7703 break 7704 } 7705 c := auxIntToInt32(v_1.AuxInt) 7706 a := v_2 7707 if !(isPowerOfTwo32(c-1) && c >= 3) { 7708 break 7709 } 7710 v.reset(OpARMRSB) 7711 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7712 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7713 v0.AddArg2(x, x) 7714 v.AddArg2(v0, a) 7715 return true 7716 } 7717 // match: (MULS x (MOVWconst [c]) a) 7718 // cond: isPowerOfTwo32(c+1) && c >= 7 7719 // result: (RSB (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7720 for { 7721 x := v_0 7722 if v_1.Op != OpARMMOVWconst { 7723 break 7724 } 7725 c := auxIntToInt32(v_1.AuxInt) 7726 a := v_2 7727 if !(isPowerOfTwo32(c+1) && c >= 7) { 7728 break 7729 } 7730 v.reset(OpARMRSB) 7731 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7732 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7733 v0.AddArg2(x, x) 7734 v.AddArg2(v0, a) 7735 return true 7736 } 7737 // match: (MULS x (MOVWconst [c]) a) 7738 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7739 // result: (RSB (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7740 for { 7741 x := v_0 7742 if v_1.Op != OpARMMOVWconst { 7743 break 7744 } 7745 c := auxIntToInt32(v_1.AuxInt) 7746 a := v_2 7747 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7748 break 7749 } 7750 v.reset(OpARMRSB) 7751 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7752 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7753 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7754 v1.AuxInt = int32ToAuxInt(1) 7755 v1.AddArg2(x, x) 7756 v0.AddArg(v1) 7757 v.AddArg2(v0, a) 7758 return true 7759 } 7760 // match: (MULS x (MOVWconst [c]) a) 7761 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7762 // result: (RSB (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7763 for { 7764 x := v_0 7765 if v_1.Op != OpARMMOVWconst { 7766 break 7767 } 7768 c := auxIntToInt32(v_1.AuxInt) 7769 a := v_2 7770 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7771 break 7772 } 7773 v.reset(OpARMRSB) 7774 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7775 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7776 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7777 v1.AuxInt = int32ToAuxInt(2) 7778 v1.AddArg2(x, x) 7779 v0.AddArg(v1) 7780 v.AddArg2(v0, a) 7781 return true 7782 } 7783 // match: (MULS x (MOVWconst [c]) a) 7784 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7785 // result: (RSB (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7786 for { 7787 x := v_0 7788 if v_1.Op != OpARMMOVWconst { 7789 break 7790 } 7791 c := auxIntToInt32(v_1.AuxInt) 7792 a := v_2 7793 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7794 break 7795 } 7796 v.reset(OpARMRSB) 7797 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7798 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7799 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7800 v1.AuxInt = int32ToAuxInt(3) 7801 v1.AddArg2(x, x) 7802 v0.AddArg(v1) 7803 v.AddArg2(v0, a) 7804 return true 7805 } 7806 // match: (MULS x (MOVWconst [c]) a) 7807 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7808 // result: (RSB (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7809 for { 7810 x := v_0 7811 if v_1.Op != OpARMMOVWconst { 7812 break 7813 } 7814 c := auxIntToInt32(v_1.AuxInt) 7815 a := v_2 7816 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7817 break 7818 } 7819 v.reset(OpARMRSB) 7820 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7821 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7822 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7823 v1.AuxInt = int32ToAuxInt(3) 7824 v1.AddArg2(x, x) 7825 v0.AddArg(v1) 7826 v.AddArg2(v0, a) 7827 return true 7828 } 7829 // match: (MULS (MOVWconst [c]) x a) 7830 // cond: c == -1 7831 // result: (ADD a x) 7832 for { 7833 if v_0.Op != OpARMMOVWconst { 7834 break 7835 } 7836 c := auxIntToInt32(v_0.AuxInt) 7837 x := v_1 7838 a := v_2 7839 if !(c == -1) { 7840 break 7841 } 7842 v.reset(OpARMADD) 7843 v.AddArg2(a, x) 7844 return true 7845 } 7846 // match: (MULS (MOVWconst [0]) _ a) 7847 // result: a 7848 for { 7849 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 { 7850 break 7851 } 7852 a := v_2 7853 v.copyOf(a) 7854 return true 7855 } 7856 // match: (MULS (MOVWconst [1]) x a) 7857 // result: (RSB x a) 7858 for { 7859 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 { 7860 break 7861 } 7862 x := v_1 7863 a := v_2 7864 v.reset(OpARMRSB) 7865 v.AddArg2(x, a) 7866 return true 7867 } 7868 // match: (MULS (MOVWconst [c]) x a) 7869 // cond: isPowerOfTwo32(c) 7870 // result: (RSB (SLLconst <x.Type> [int32(log32(c))] x) a) 7871 for { 7872 if v_0.Op != OpARMMOVWconst { 7873 break 7874 } 7875 c := auxIntToInt32(v_0.AuxInt) 7876 x := v_1 7877 a := v_2 7878 if !(isPowerOfTwo32(c)) { 7879 break 7880 } 7881 v.reset(OpARMRSB) 7882 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7883 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7884 v0.AddArg(x) 7885 v.AddArg2(v0, a) 7886 return true 7887 } 7888 // match: (MULS (MOVWconst [c]) x a) 7889 // cond: isPowerOfTwo32(c-1) && c >= 3 7890 // result: (RSB (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7891 for { 7892 if v_0.Op != OpARMMOVWconst { 7893 break 7894 } 7895 c := auxIntToInt32(v_0.AuxInt) 7896 x := v_1 7897 a := v_2 7898 if !(isPowerOfTwo32(c-1) && c >= 3) { 7899 break 7900 } 7901 v.reset(OpARMRSB) 7902 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7903 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7904 v0.AddArg2(x, x) 7905 v.AddArg2(v0, a) 7906 return true 7907 } 7908 // match: (MULS (MOVWconst [c]) x a) 7909 // cond: isPowerOfTwo32(c+1) && c >= 7 7910 // result: (RSB (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7911 for { 7912 if v_0.Op != OpARMMOVWconst { 7913 break 7914 } 7915 c := auxIntToInt32(v_0.AuxInt) 7916 x := v_1 7917 a := v_2 7918 if !(isPowerOfTwo32(c+1) && c >= 7) { 7919 break 7920 } 7921 v.reset(OpARMRSB) 7922 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7923 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7924 v0.AddArg2(x, x) 7925 v.AddArg2(v0, a) 7926 return true 7927 } 7928 // match: (MULS (MOVWconst [c]) x a) 7929 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7930 // result: (RSB (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7931 for { 7932 if v_0.Op != OpARMMOVWconst { 7933 break 7934 } 7935 c := auxIntToInt32(v_0.AuxInt) 7936 x := v_1 7937 a := v_2 7938 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7939 break 7940 } 7941 v.reset(OpARMRSB) 7942 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7943 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7944 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7945 v1.AuxInt = int32ToAuxInt(1) 7946 v1.AddArg2(x, x) 7947 v0.AddArg(v1) 7948 v.AddArg2(v0, a) 7949 return true 7950 } 7951 // match: (MULS (MOVWconst [c]) x a) 7952 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7953 // result: (RSB (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7954 for { 7955 if v_0.Op != OpARMMOVWconst { 7956 break 7957 } 7958 c := auxIntToInt32(v_0.AuxInt) 7959 x := v_1 7960 a := v_2 7961 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7962 break 7963 } 7964 v.reset(OpARMRSB) 7965 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7966 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7967 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7968 v1.AuxInt = int32ToAuxInt(2) 7969 v1.AddArg2(x, x) 7970 v0.AddArg(v1) 7971 v.AddArg2(v0, a) 7972 return true 7973 } 7974 // match: (MULS (MOVWconst [c]) x a) 7975 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7976 // result: (RSB (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7977 for { 7978 if v_0.Op != OpARMMOVWconst { 7979 break 7980 } 7981 c := auxIntToInt32(v_0.AuxInt) 7982 x := v_1 7983 a := v_2 7984 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7985 break 7986 } 7987 v.reset(OpARMRSB) 7988 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7989 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7990 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7991 v1.AuxInt = int32ToAuxInt(3) 7992 v1.AddArg2(x, x) 7993 v0.AddArg(v1) 7994 v.AddArg2(v0, a) 7995 return true 7996 } 7997 // match: (MULS (MOVWconst [c]) x a) 7998 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7999 // result: (RSB (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 8000 for { 8001 if v_0.Op != OpARMMOVWconst { 8002 break 8003 } 8004 c := auxIntToInt32(v_0.AuxInt) 8005 x := v_1 8006 a := v_2 8007 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 8008 break 8009 } 8010 v.reset(OpARMRSB) 8011 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8012 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 8013 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8014 v1.AuxInt = int32ToAuxInt(3) 8015 v1.AddArg2(x, x) 8016 v0.AddArg(v1) 8017 v.AddArg2(v0, a) 8018 return true 8019 } 8020 // match: (MULS (MOVWconst [c]) (MOVWconst [d]) a) 8021 // result: (SUBconst [c*d] a) 8022 for { 8023 if v_0.Op != OpARMMOVWconst { 8024 break 8025 } 8026 c := auxIntToInt32(v_0.AuxInt) 8027 if v_1.Op != OpARMMOVWconst { 8028 break 8029 } 8030 d := auxIntToInt32(v_1.AuxInt) 8031 a := v_2 8032 v.reset(OpARMSUBconst) 8033 v.AuxInt = int32ToAuxInt(c * d) 8034 v.AddArg(a) 8035 return true 8036 } 8037 return false 8038 } 8039 func rewriteValueARM_OpARMMVN(v *Value) bool { 8040 v_0 := v.Args[0] 8041 // match: (MVN (MOVWconst [c])) 8042 // result: (MOVWconst [^c]) 8043 for { 8044 if v_0.Op != OpARMMOVWconst { 8045 break 8046 } 8047 c := auxIntToInt32(v_0.AuxInt) 8048 v.reset(OpARMMOVWconst) 8049 v.AuxInt = int32ToAuxInt(^c) 8050 return true 8051 } 8052 // match: (MVN (SLLconst [c] x)) 8053 // result: (MVNshiftLL x [c]) 8054 for { 8055 if v_0.Op != OpARMSLLconst { 8056 break 8057 } 8058 c := auxIntToInt32(v_0.AuxInt) 8059 x := v_0.Args[0] 8060 v.reset(OpARMMVNshiftLL) 8061 v.AuxInt = int32ToAuxInt(c) 8062 v.AddArg(x) 8063 return true 8064 } 8065 // match: (MVN (SRLconst [c] x)) 8066 // result: (MVNshiftRL x [c]) 8067 for { 8068 if v_0.Op != OpARMSRLconst { 8069 break 8070 } 8071 c := auxIntToInt32(v_0.AuxInt) 8072 x := v_0.Args[0] 8073 v.reset(OpARMMVNshiftRL) 8074 v.AuxInt = int32ToAuxInt(c) 8075 v.AddArg(x) 8076 return true 8077 } 8078 // match: (MVN (SRAconst [c] x)) 8079 // result: (MVNshiftRA x [c]) 8080 for { 8081 if v_0.Op != OpARMSRAconst { 8082 break 8083 } 8084 c := auxIntToInt32(v_0.AuxInt) 8085 x := v_0.Args[0] 8086 v.reset(OpARMMVNshiftRA) 8087 v.AuxInt = int32ToAuxInt(c) 8088 v.AddArg(x) 8089 return true 8090 } 8091 // match: (MVN (SLL x y)) 8092 // result: (MVNshiftLLreg x y) 8093 for { 8094 if v_0.Op != OpARMSLL { 8095 break 8096 } 8097 y := v_0.Args[1] 8098 x := v_0.Args[0] 8099 v.reset(OpARMMVNshiftLLreg) 8100 v.AddArg2(x, y) 8101 return true 8102 } 8103 // match: (MVN (SRL x y)) 8104 // result: (MVNshiftRLreg x y) 8105 for { 8106 if v_0.Op != OpARMSRL { 8107 break 8108 } 8109 y := v_0.Args[1] 8110 x := v_0.Args[0] 8111 v.reset(OpARMMVNshiftRLreg) 8112 v.AddArg2(x, y) 8113 return true 8114 } 8115 // match: (MVN (SRA x y)) 8116 // result: (MVNshiftRAreg x y) 8117 for { 8118 if v_0.Op != OpARMSRA { 8119 break 8120 } 8121 y := v_0.Args[1] 8122 x := v_0.Args[0] 8123 v.reset(OpARMMVNshiftRAreg) 8124 v.AddArg2(x, y) 8125 return true 8126 } 8127 return false 8128 } 8129 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool { 8130 v_0 := v.Args[0] 8131 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8132 // result: (MOVWconst [^(c<<uint64(d))]) 8133 for { 8134 d := auxIntToInt32(v.AuxInt) 8135 if v_0.Op != OpARMMOVWconst { 8136 break 8137 } 8138 c := auxIntToInt32(v_0.AuxInt) 8139 v.reset(OpARMMOVWconst) 8140 v.AuxInt = int32ToAuxInt(^(c << uint64(d))) 8141 return true 8142 } 8143 return false 8144 } 8145 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool { 8146 v_1 := v.Args[1] 8147 v_0 := v.Args[0] 8148 // match: (MVNshiftLLreg x (MOVWconst [c])) 8149 // cond: 0 <= c && c < 32 8150 // result: (MVNshiftLL x [c]) 8151 for { 8152 x := v_0 8153 if v_1.Op != OpARMMOVWconst { 8154 break 8155 } 8156 c := auxIntToInt32(v_1.AuxInt) 8157 if !(0 <= c && c < 32) { 8158 break 8159 } 8160 v.reset(OpARMMVNshiftLL) 8161 v.AuxInt = int32ToAuxInt(c) 8162 v.AddArg(x) 8163 return true 8164 } 8165 return false 8166 } 8167 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool { 8168 v_0 := v.Args[0] 8169 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8170 // result: (MOVWconst [int32(c)>>uint64(d)]) 8171 for { 8172 d := auxIntToInt32(v.AuxInt) 8173 if v_0.Op != OpARMMOVWconst { 8174 break 8175 } 8176 c := auxIntToInt32(v_0.AuxInt) 8177 v.reset(OpARMMOVWconst) 8178 v.AuxInt = int32ToAuxInt(int32(c) >> uint64(d)) 8179 return true 8180 } 8181 return false 8182 } 8183 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool { 8184 v_1 := v.Args[1] 8185 v_0 := v.Args[0] 8186 // match: (MVNshiftRAreg x (MOVWconst [c])) 8187 // cond: 0 <= c && c < 32 8188 // result: (MVNshiftRA x [c]) 8189 for { 8190 x := v_0 8191 if v_1.Op != OpARMMOVWconst { 8192 break 8193 } 8194 c := auxIntToInt32(v_1.AuxInt) 8195 if !(0 <= c && c < 32) { 8196 break 8197 } 8198 v.reset(OpARMMVNshiftRA) 8199 v.AuxInt = int32ToAuxInt(c) 8200 v.AddArg(x) 8201 return true 8202 } 8203 return false 8204 } 8205 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool { 8206 v_0 := v.Args[0] 8207 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8208 // result: (MOVWconst [^int32(uint32(c)>>uint64(d))]) 8209 for { 8210 d := auxIntToInt32(v.AuxInt) 8211 if v_0.Op != OpARMMOVWconst { 8212 break 8213 } 8214 c := auxIntToInt32(v_0.AuxInt) 8215 v.reset(OpARMMOVWconst) 8216 v.AuxInt = int32ToAuxInt(^int32(uint32(c) >> uint64(d))) 8217 return true 8218 } 8219 return false 8220 } 8221 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool { 8222 v_1 := v.Args[1] 8223 v_0 := v.Args[0] 8224 // match: (MVNshiftRLreg x (MOVWconst [c])) 8225 // cond: 0 <= c && c < 32 8226 // result: (MVNshiftRL x [c]) 8227 for { 8228 x := v_0 8229 if v_1.Op != OpARMMOVWconst { 8230 break 8231 } 8232 c := auxIntToInt32(v_1.AuxInt) 8233 if !(0 <= c && c < 32) { 8234 break 8235 } 8236 v.reset(OpARMMVNshiftRL) 8237 v.AuxInt = int32ToAuxInt(c) 8238 v.AddArg(x) 8239 return true 8240 } 8241 return false 8242 } 8243 func rewriteValueARM_OpARMNEGD(v *Value) bool { 8244 v_0 := v.Args[0] 8245 // match: (NEGD (MULD x y)) 8246 // cond: buildcfg.GOARM >= 6 8247 // result: (NMULD x y) 8248 for { 8249 if v_0.Op != OpARMMULD { 8250 break 8251 } 8252 y := v_0.Args[1] 8253 x := v_0.Args[0] 8254 if !(buildcfg.GOARM >= 6) { 8255 break 8256 } 8257 v.reset(OpARMNMULD) 8258 v.AddArg2(x, y) 8259 return true 8260 } 8261 return false 8262 } 8263 func rewriteValueARM_OpARMNEGF(v *Value) bool { 8264 v_0 := v.Args[0] 8265 // match: (NEGF (MULF x y)) 8266 // cond: buildcfg.GOARM >= 6 8267 // result: (NMULF x y) 8268 for { 8269 if v_0.Op != OpARMMULF { 8270 break 8271 } 8272 y := v_0.Args[1] 8273 x := v_0.Args[0] 8274 if !(buildcfg.GOARM >= 6) { 8275 break 8276 } 8277 v.reset(OpARMNMULF) 8278 v.AddArg2(x, y) 8279 return true 8280 } 8281 return false 8282 } 8283 func rewriteValueARM_OpARMNMULD(v *Value) bool { 8284 v_1 := v.Args[1] 8285 v_0 := v.Args[0] 8286 // match: (NMULD (NEGD x) y) 8287 // result: (MULD x y) 8288 for { 8289 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8290 if v_0.Op != OpARMNEGD { 8291 continue 8292 } 8293 x := v_0.Args[0] 8294 y := v_1 8295 v.reset(OpARMMULD) 8296 v.AddArg2(x, y) 8297 return true 8298 } 8299 break 8300 } 8301 return false 8302 } 8303 func rewriteValueARM_OpARMNMULF(v *Value) bool { 8304 v_1 := v.Args[1] 8305 v_0 := v.Args[0] 8306 // match: (NMULF (NEGF x) y) 8307 // result: (MULF x y) 8308 for { 8309 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8310 if v_0.Op != OpARMNEGF { 8311 continue 8312 } 8313 x := v_0.Args[0] 8314 y := v_1 8315 v.reset(OpARMMULF) 8316 v.AddArg2(x, y) 8317 return true 8318 } 8319 break 8320 } 8321 return false 8322 } 8323 func rewriteValueARM_OpARMNotEqual(v *Value) bool { 8324 v_0 := v.Args[0] 8325 // match: (NotEqual (FlagConstant [fc])) 8326 // result: (MOVWconst [b2i32(fc.ne())]) 8327 for { 8328 if v_0.Op != OpARMFlagConstant { 8329 break 8330 } 8331 fc := auxIntToFlagConstant(v_0.AuxInt) 8332 v.reset(OpARMMOVWconst) 8333 v.AuxInt = int32ToAuxInt(b2i32(fc.ne())) 8334 return true 8335 } 8336 // match: (NotEqual (InvertFlags x)) 8337 // result: (NotEqual x) 8338 for { 8339 if v_0.Op != OpARMInvertFlags { 8340 break 8341 } 8342 x := v_0.Args[0] 8343 v.reset(OpARMNotEqual) 8344 v.AddArg(x) 8345 return true 8346 } 8347 return false 8348 } 8349 func rewriteValueARM_OpARMOR(v *Value) bool { 8350 v_1 := v.Args[1] 8351 v_0 := v.Args[0] 8352 // match: (OR x (MOVWconst [c])) 8353 // result: (ORconst [c] x) 8354 for { 8355 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8356 x := v_0 8357 if v_1.Op != OpARMMOVWconst { 8358 continue 8359 } 8360 c := auxIntToInt32(v_1.AuxInt) 8361 v.reset(OpARMORconst) 8362 v.AuxInt = int32ToAuxInt(c) 8363 v.AddArg(x) 8364 return true 8365 } 8366 break 8367 } 8368 // match: (OR x (SLLconst [c] y)) 8369 // result: (ORshiftLL x y [c]) 8370 for { 8371 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8372 x := v_0 8373 if v_1.Op != OpARMSLLconst { 8374 continue 8375 } 8376 c := auxIntToInt32(v_1.AuxInt) 8377 y := v_1.Args[0] 8378 v.reset(OpARMORshiftLL) 8379 v.AuxInt = int32ToAuxInt(c) 8380 v.AddArg2(x, y) 8381 return true 8382 } 8383 break 8384 } 8385 // match: (OR x (SRLconst [c] y)) 8386 // result: (ORshiftRL x y [c]) 8387 for { 8388 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8389 x := v_0 8390 if v_1.Op != OpARMSRLconst { 8391 continue 8392 } 8393 c := auxIntToInt32(v_1.AuxInt) 8394 y := v_1.Args[0] 8395 v.reset(OpARMORshiftRL) 8396 v.AuxInt = int32ToAuxInt(c) 8397 v.AddArg2(x, y) 8398 return true 8399 } 8400 break 8401 } 8402 // match: (OR x (SRAconst [c] y)) 8403 // result: (ORshiftRA x y [c]) 8404 for { 8405 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8406 x := v_0 8407 if v_1.Op != OpARMSRAconst { 8408 continue 8409 } 8410 c := auxIntToInt32(v_1.AuxInt) 8411 y := v_1.Args[0] 8412 v.reset(OpARMORshiftRA) 8413 v.AuxInt = int32ToAuxInt(c) 8414 v.AddArg2(x, y) 8415 return true 8416 } 8417 break 8418 } 8419 // match: (OR x (SLL y z)) 8420 // result: (ORshiftLLreg x y z) 8421 for { 8422 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8423 x := v_0 8424 if v_1.Op != OpARMSLL { 8425 continue 8426 } 8427 z := v_1.Args[1] 8428 y := v_1.Args[0] 8429 v.reset(OpARMORshiftLLreg) 8430 v.AddArg3(x, y, z) 8431 return true 8432 } 8433 break 8434 } 8435 // match: (OR x (SRL y z)) 8436 // result: (ORshiftRLreg x y z) 8437 for { 8438 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8439 x := v_0 8440 if v_1.Op != OpARMSRL { 8441 continue 8442 } 8443 z := v_1.Args[1] 8444 y := v_1.Args[0] 8445 v.reset(OpARMORshiftRLreg) 8446 v.AddArg3(x, y, z) 8447 return true 8448 } 8449 break 8450 } 8451 // match: (OR x (SRA y z)) 8452 // result: (ORshiftRAreg x y z) 8453 for { 8454 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8455 x := v_0 8456 if v_1.Op != OpARMSRA { 8457 continue 8458 } 8459 z := v_1.Args[1] 8460 y := v_1.Args[0] 8461 v.reset(OpARMORshiftRAreg) 8462 v.AddArg3(x, y, z) 8463 return true 8464 } 8465 break 8466 } 8467 // match: (OR x x) 8468 // result: x 8469 for { 8470 x := v_0 8471 if x != v_1 { 8472 break 8473 } 8474 v.copyOf(x) 8475 return true 8476 } 8477 return false 8478 } 8479 func rewriteValueARM_OpARMORconst(v *Value) bool { 8480 v_0 := v.Args[0] 8481 // match: (ORconst [0] x) 8482 // result: x 8483 for { 8484 if auxIntToInt32(v.AuxInt) != 0 { 8485 break 8486 } 8487 x := v_0 8488 v.copyOf(x) 8489 return true 8490 } 8491 // match: (ORconst [c] _) 8492 // cond: int32(c)==-1 8493 // result: (MOVWconst [-1]) 8494 for { 8495 c := auxIntToInt32(v.AuxInt) 8496 if !(int32(c) == -1) { 8497 break 8498 } 8499 v.reset(OpARMMOVWconst) 8500 v.AuxInt = int32ToAuxInt(-1) 8501 return true 8502 } 8503 // match: (ORconst [c] (MOVWconst [d])) 8504 // result: (MOVWconst [c|d]) 8505 for { 8506 c := auxIntToInt32(v.AuxInt) 8507 if v_0.Op != OpARMMOVWconst { 8508 break 8509 } 8510 d := auxIntToInt32(v_0.AuxInt) 8511 v.reset(OpARMMOVWconst) 8512 v.AuxInt = int32ToAuxInt(c | d) 8513 return true 8514 } 8515 // match: (ORconst [c] (ORconst [d] x)) 8516 // result: (ORconst [c|d] x) 8517 for { 8518 c := auxIntToInt32(v.AuxInt) 8519 if v_0.Op != OpARMORconst { 8520 break 8521 } 8522 d := auxIntToInt32(v_0.AuxInt) 8523 x := v_0.Args[0] 8524 v.reset(OpARMORconst) 8525 v.AuxInt = int32ToAuxInt(c | d) 8526 v.AddArg(x) 8527 return true 8528 } 8529 return false 8530 } 8531 func rewriteValueARM_OpARMORshiftLL(v *Value) bool { 8532 v_1 := v.Args[1] 8533 v_0 := v.Args[0] 8534 b := v.Block 8535 typ := &b.Func.Config.Types 8536 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8537 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8538 for { 8539 d := auxIntToInt32(v.AuxInt) 8540 if v_0.Op != OpARMMOVWconst { 8541 break 8542 } 8543 c := auxIntToInt32(v_0.AuxInt) 8544 x := v_1 8545 v.reset(OpARMORconst) 8546 v.AuxInt = int32ToAuxInt(c) 8547 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8548 v0.AuxInt = int32ToAuxInt(d) 8549 v0.AddArg(x) 8550 v.AddArg(v0) 8551 return true 8552 } 8553 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8554 // result: (ORconst x [c<<uint64(d)]) 8555 for { 8556 d := auxIntToInt32(v.AuxInt) 8557 x := v_0 8558 if v_1.Op != OpARMMOVWconst { 8559 break 8560 } 8561 c := auxIntToInt32(v_1.AuxInt) 8562 v.reset(OpARMORconst) 8563 v.AuxInt = int32ToAuxInt(c << uint64(d)) 8564 v.AddArg(x) 8565 return true 8566 } 8567 // match: (ORshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 8568 // result: (REV16 x) 8569 for { 8570 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { 8571 break 8572 } 8573 x := v_0.Args[0] 8574 if x != v_1 { 8575 break 8576 } 8577 v.reset(OpARMREV16) 8578 v.AddArg(x) 8579 return true 8580 } 8581 // match: (ORshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 8582 // cond: buildcfg.GOARM>=6 8583 // result: (REV16 x) 8584 for { 8585 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 8586 break 8587 } 8588 v_0_0 := v_0.Args[0] 8589 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 8590 break 8591 } 8592 x := v_0_0.Args[0] 8593 if x != v_1 || !(buildcfg.GOARM >= 6) { 8594 break 8595 } 8596 v.reset(OpARMREV16) 8597 v.AddArg(x) 8598 return true 8599 } 8600 // match: (ORshiftLL y:(SLLconst x [c]) x [c]) 8601 // result: y 8602 for { 8603 c := auxIntToInt32(v.AuxInt) 8604 y := v_0 8605 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c { 8606 break 8607 } 8608 x := y.Args[0] 8609 if x != v_1 { 8610 break 8611 } 8612 v.copyOf(y) 8613 return true 8614 } 8615 return false 8616 } 8617 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool { 8618 v_2 := v.Args[2] 8619 v_1 := v.Args[1] 8620 v_0 := v.Args[0] 8621 b := v.Block 8622 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8623 // result: (ORconst [c] (SLL <x.Type> x y)) 8624 for { 8625 if v_0.Op != OpARMMOVWconst { 8626 break 8627 } 8628 c := auxIntToInt32(v_0.AuxInt) 8629 x := v_1 8630 y := v_2 8631 v.reset(OpARMORconst) 8632 v.AuxInt = int32ToAuxInt(c) 8633 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 8634 v0.AddArg2(x, y) 8635 v.AddArg(v0) 8636 return true 8637 } 8638 // match: (ORshiftLLreg x y (MOVWconst [c])) 8639 // cond: 0 <= c && c < 32 8640 // result: (ORshiftLL x y [c]) 8641 for { 8642 x := v_0 8643 y := v_1 8644 if v_2.Op != OpARMMOVWconst { 8645 break 8646 } 8647 c := auxIntToInt32(v_2.AuxInt) 8648 if !(0 <= c && c < 32) { 8649 break 8650 } 8651 v.reset(OpARMORshiftLL) 8652 v.AuxInt = int32ToAuxInt(c) 8653 v.AddArg2(x, y) 8654 return true 8655 } 8656 return false 8657 } 8658 func rewriteValueARM_OpARMORshiftRA(v *Value) bool { 8659 v_1 := v.Args[1] 8660 v_0 := v.Args[0] 8661 b := v.Block 8662 // match: (ORshiftRA (MOVWconst [c]) x [d]) 8663 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8664 for { 8665 d := auxIntToInt32(v.AuxInt) 8666 if v_0.Op != OpARMMOVWconst { 8667 break 8668 } 8669 c := auxIntToInt32(v_0.AuxInt) 8670 x := v_1 8671 v.reset(OpARMORconst) 8672 v.AuxInt = int32ToAuxInt(c) 8673 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 8674 v0.AuxInt = int32ToAuxInt(d) 8675 v0.AddArg(x) 8676 v.AddArg(v0) 8677 return true 8678 } 8679 // match: (ORshiftRA x (MOVWconst [c]) [d]) 8680 // result: (ORconst x [c>>uint64(d)]) 8681 for { 8682 d := auxIntToInt32(v.AuxInt) 8683 x := v_0 8684 if v_1.Op != OpARMMOVWconst { 8685 break 8686 } 8687 c := auxIntToInt32(v_1.AuxInt) 8688 v.reset(OpARMORconst) 8689 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 8690 v.AddArg(x) 8691 return true 8692 } 8693 // match: (ORshiftRA y:(SRAconst x [c]) x [c]) 8694 // result: y 8695 for { 8696 c := auxIntToInt32(v.AuxInt) 8697 y := v_0 8698 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c { 8699 break 8700 } 8701 x := y.Args[0] 8702 if x != v_1 { 8703 break 8704 } 8705 v.copyOf(y) 8706 return true 8707 } 8708 return false 8709 } 8710 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool { 8711 v_2 := v.Args[2] 8712 v_1 := v.Args[1] 8713 v_0 := v.Args[0] 8714 b := v.Block 8715 // match: (ORshiftRAreg (MOVWconst [c]) x y) 8716 // result: (ORconst [c] (SRA <x.Type> x y)) 8717 for { 8718 if v_0.Op != OpARMMOVWconst { 8719 break 8720 } 8721 c := auxIntToInt32(v_0.AuxInt) 8722 x := v_1 8723 y := v_2 8724 v.reset(OpARMORconst) 8725 v.AuxInt = int32ToAuxInt(c) 8726 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 8727 v0.AddArg2(x, y) 8728 v.AddArg(v0) 8729 return true 8730 } 8731 // match: (ORshiftRAreg x y (MOVWconst [c])) 8732 // cond: 0 <= c && c < 32 8733 // result: (ORshiftRA x y [c]) 8734 for { 8735 x := v_0 8736 y := v_1 8737 if v_2.Op != OpARMMOVWconst { 8738 break 8739 } 8740 c := auxIntToInt32(v_2.AuxInt) 8741 if !(0 <= c && c < 32) { 8742 break 8743 } 8744 v.reset(OpARMORshiftRA) 8745 v.AuxInt = int32ToAuxInt(c) 8746 v.AddArg2(x, y) 8747 return true 8748 } 8749 return false 8750 } 8751 func rewriteValueARM_OpARMORshiftRL(v *Value) bool { 8752 v_1 := v.Args[1] 8753 v_0 := v.Args[0] 8754 b := v.Block 8755 // match: (ORshiftRL (MOVWconst [c]) x [d]) 8756 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8757 for { 8758 d := auxIntToInt32(v.AuxInt) 8759 if v_0.Op != OpARMMOVWconst { 8760 break 8761 } 8762 c := auxIntToInt32(v_0.AuxInt) 8763 x := v_1 8764 v.reset(OpARMORconst) 8765 v.AuxInt = int32ToAuxInt(c) 8766 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 8767 v0.AuxInt = int32ToAuxInt(d) 8768 v0.AddArg(x) 8769 v.AddArg(v0) 8770 return true 8771 } 8772 // match: (ORshiftRL x (MOVWconst [c]) [d]) 8773 // result: (ORconst x [int32(uint32(c)>>uint64(d))]) 8774 for { 8775 d := auxIntToInt32(v.AuxInt) 8776 x := v_0 8777 if v_1.Op != OpARMMOVWconst { 8778 break 8779 } 8780 c := auxIntToInt32(v_1.AuxInt) 8781 v.reset(OpARMORconst) 8782 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 8783 v.AddArg(x) 8784 return true 8785 } 8786 // match: (ORshiftRL y:(SRLconst x [c]) x [c]) 8787 // result: y 8788 for { 8789 c := auxIntToInt32(v.AuxInt) 8790 y := v_0 8791 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c { 8792 break 8793 } 8794 x := y.Args[0] 8795 if x != v_1 { 8796 break 8797 } 8798 v.copyOf(y) 8799 return true 8800 } 8801 return false 8802 } 8803 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool { 8804 v_2 := v.Args[2] 8805 v_1 := v.Args[1] 8806 v_0 := v.Args[0] 8807 b := v.Block 8808 // match: (ORshiftRLreg (MOVWconst [c]) x y) 8809 // result: (ORconst [c] (SRL <x.Type> x y)) 8810 for { 8811 if v_0.Op != OpARMMOVWconst { 8812 break 8813 } 8814 c := auxIntToInt32(v_0.AuxInt) 8815 x := v_1 8816 y := v_2 8817 v.reset(OpARMORconst) 8818 v.AuxInt = int32ToAuxInt(c) 8819 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 8820 v0.AddArg2(x, y) 8821 v.AddArg(v0) 8822 return true 8823 } 8824 // match: (ORshiftRLreg x y (MOVWconst [c])) 8825 // cond: 0 <= c && c < 32 8826 // result: (ORshiftRL x y [c]) 8827 for { 8828 x := v_0 8829 y := v_1 8830 if v_2.Op != OpARMMOVWconst { 8831 break 8832 } 8833 c := auxIntToInt32(v_2.AuxInt) 8834 if !(0 <= c && c < 32) { 8835 break 8836 } 8837 v.reset(OpARMORshiftRL) 8838 v.AuxInt = int32ToAuxInt(c) 8839 v.AddArg2(x, y) 8840 return true 8841 } 8842 return false 8843 } 8844 func rewriteValueARM_OpARMRSB(v *Value) bool { 8845 v_1 := v.Args[1] 8846 v_0 := v.Args[0] 8847 // match: (RSB (MOVWconst [c]) x) 8848 // result: (SUBconst [c] x) 8849 for { 8850 if v_0.Op != OpARMMOVWconst { 8851 break 8852 } 8853 c := auxIntToInt32(v_0.AuxInt) 8854 x := v_1 8855 v.reset(OpARMSUBconst) 8856 v.AuxInt = int32ToAuxInt(c) 8857 v.AddArg(x) 8858 return true 8859 } 8860 // match: (RSB x (MOVWconst [c])) 8861 // result: (RSBconst [c] x) 8862 for { 8863 x := v_0 8864 if v_1.Op != OpARMMOVWconst { 8865 break 8866 } 8867 c := auxIntToInt32(v_1.AuxInt) 8868 v.reset(OpARMRSBconst) 8869 v.AuxInt = int32ToAuxInt(c) 8870 v.AddArg(x) 8871 return true 8872 } 8873 // match: (RSB x (SLLconst [c] y)) 8874 // result: (RSBshiftLL x y [c]) 8875 for { 8876 x := v_0 8877 if v_1.Op != OpARMSLLconst { 8878 break 8879 } 8880 c := auxIntToInt32(v_1.AuxInt) 8881 y := v_1.Args[0] 8882 v.reset(OpARMRSBshiftLL) 8883 v.AuxInt = int32ToAuxInt(c) 8884 v.AddArg2(x, y) 8885 return true 8886 } 8887 // match: (RSB (SLLconst [c] y) x) 8888 // result: (SUBshiftLL x y [c]) 8889 for { 8890 if v_0.Op != OpARMSLLconst { 8891 break 8892 } 8893 c := auxIntToInt32(v_0.AuxInt) 8894 y := v_0.Args[0] 8895 x := v_1 8896 v.reset(OpARMSUBshiftLL) 8897 v.AuxInt = int32ToAuxInt(c) 8898 v.AddArg2(x, y) 8899 return true 8900 } 8901 // match: (RSB x (SRLconst [c] y)) 8902 // result: (RSBshiftRL x y [c]) 8903 for { 8904 x := v_0 8905 if v_1.Op != OpARMSRLconst { 8906 break 8907 } 8908 c := auxIntToInt32(v_1.AuxInt) 8909 y := v_1.Args[0] 8910 v.reset(OpARMRSBshiftRL) 8911 v.AuxInt = int32ToAuxInt(c) 8912 v.AddArg2(x, y) 8913 return true 8914 } 8915 // match: (RSB (SRLconst [c] y) x) 8916 // result: (SUBshiftRL x y [c]) 8917 for { 8918 if v_0.Op != OpARMSRLconst { 8919 break 8920 } 8921 c := auxIntToInt32(v_0.AuxInt) 8922 y := v_0.Args[0] 8923 x := v_1 8924 v.reset(OpARMSUBshiftRL) 8925 v.AuxInt = int32ToAuxInt(c) 8926 v.AddArg2(x, y) 8927 return true 8928 } 8929 // match: (RSB x (SRAconst [c] y)) 8930 // result: (RSBshiftRA x y [c]) 8931 for { 8932 x := v_0 8933 if v_1.Op != OpARMSRAconst { 8934 break 8935 } 8936 c := auxIntToInt32(v_1.AuxInt) 8937 y := v_1.Args[0] 8938 v.reset(OpARMRSBshiftRA) 8939 v.AuxInt = int32ToAuxInt(c) 8940 v.AddArg2(x, y) 8941 return true 8942 } 8943 // match: (RSB (SRAconst [c] y) x) 8944 // result: (SUBshiftRA x y [c]) 8945 for { 8946 if v_0.Op != OpARMSRAconst { 8947 break 8948 } 8949 c := auxIntToInt32(v_0.AuxInt) 8950 y := v_0.Args[0] 8951 x := v_1 8952 v.reset(OpARMSUBshiftRA) 8953 v.AuxInt = int32ToAuxInt(c) 8954 v.AddArg2(x, y) 8955 return true 8956 } 8957 // match: (RSB x (SLL y z)) 8958 // result: (RSBshiftLLreg x y z) 8959 for { 8960 x := v_0 8961 if v_1.Op != OpARMSLL { 8962 break 8963 } 8964 z := v_1.Args[1] 8965 y := v_1.Args[0] 8966 v.reset(OpARMRSBshiftLLreg) 8967 v.AddArg3(x, y, z) 8968 return true 8969 } 8970 // match: (RSB (SLL y z) x) 8971 // result: (SUBshiftLLreg x y z) 8972 for { 8973 if v_0.Op != OpARMSLL { 8974 break 8975 } 8976 z := v_0.Args[1] 8977 y := v_0.Args[0] 8978 x := v_1 8979 v.reset(OpARMSUBshiftLLreg) 8980 v.AddArg3(x, y, z) 8981 return true 8982 } 8983 // match: (RSB x (SRL y z)) 8984 // result: (RSBshiftRLreg x y z) 8985 for { 8986 x := v_0 8987 if v_1.Op != OpARMSRL { 8988 break 8989 } 8990 z := v_1.Args[1] 8991 y := v_1.Args[0] 8992 v.reset(OpARMRSBshiftRLreg) 8993 v.AddArg3(x, y, z) 8994 return true 8995 } 8996 // match: (RSB (SRL y z) x) 8997 // result: (SUBshiftRLreg x y z) 8998 for { 8999 if v_0.Op != OpARMSRL { 9000 break 9001 } 9002 z := v_0.Args[1] 9003 y := v_0.Args[0] 9004 x := v_1 9005 v.reset(OpARMSUBshiftRLreg) 9006 v.AddArg3(x, y, z) 9007 return true 9008 } 9009 // match: (RSB x (SRA y z)) 9010 // result: (RSBshiftRAreg x y z) 9011 for { 9012 x := v_0 9013 if v_1.Op != OpARMSRA { 9014 break 9015 } 9016 z := v_1.Args[1] 9017 y := v_1.Args[0] 9018 v.reset(OpARMRSBshiftRAreg) 9019 v.AddArg3(x, y, z) 9020 return true 9021 } 9022 // match: (RSB (SRA y z) x) 9023 // result: (SUBshiftRAreg x y z) 9024 for { 9025 if v_0.Op != OpARMSRA { 9026 break 9027 } 9028 z := v_0.Args[1] 9029 y := v_0.Args[0] 9030 x := v_1 9031 v.reset(OpARMSUBshiftRAreg) 9032 v.AddArg3(x, y, z) 9033 return true 9034 } 9035 // match: (RSB x x) 9036 // result: (MOVWconst [0]) 9037 for { 9038 x := v_0 9039 if x != v_1 { 9040 break 9041 } 9042 v.reset(OpARMMOVWconst) 9043 v.AuxInt = int32ToAuxInt(0) 9044 return true 9045 } 9046 // match: (RSB (MUL x y) a) 9047 // cond: buildcfg.GOARM == 7 9048 // result: (MULS x y a) 9049 for { 9050 if v_0.Op != OpARMMUL { 9051 break 9052 } 9053 y := v_0.Args[1] 9054 x := v_0.Args[0] 9055 a := v_1 9056 if !(buildcfg.GOARM == 7) { 9057 break 9058 } 9059 v.reset(OpARMMULS) 9060 v.AddArg3(x, y, a) 9061 return true 9062 } 9063 return false 9064 } 9065 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool { 9066 v_1 := v.Args[1] 9067 v_0 := v.Args[0] 9068 b := v.Block 9069 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9070 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9071 for { 9072 d := auxIntToInt32(v.AuxInt) 9073 if v_0.Op != OpARMMOVWconst { 9074 break 9075 } 9076 c := auxIntToInt32(v_0.AuxInt) 9077 x := v_1 9078 v.reset(OpARMSUBSconst) 9079 v.AuxInt = int32ToAuxInt(c) 9080 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9081 v0.AuxInt = int32ToAuxInt(d) 9082 v0.AddArg(x) 9083 v.AddArg(v0) 9084 return true 9085 } 9086 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9087 // result: (RSBSconst x [c<<uint64(d)]) 9088 for { 9089 d := auxIntToInt32(v.AuxInt) 9090 x := v_0 9091 if v_1.Op != OpARMMOVWconst { 9092 break 9093 } 9094 c := auxIntToInt32(v_1.AuxInt) 9095 v.reset(OpARMRSBSconst) 9096 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9097 v.AddArg(x) 9098 return true 9099 } 9100 return false 9101 } 9102 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool { 9103 v_2 := v.Args[2] 9104 v_1 := v.Args[1] 9105 v_0 := v.Args[0] 9106 b := v.Block 9107 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9108 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9109 for { 9110 if v_0.Op != OpARMMOVWconst { 9111 break 9112 } 9113 c := auxIntToInt32(v_0.AuxInt) 9114 x := v_1 9115 y := v_2 9116 v.reset(OpARMSUBSconst) 9117 v.AuxInt = int32ToAuxInt(c) 9118 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9119 v0.AddArg2(x, y) 9120 v.AddArg(v0) 9121 return true 9122 } 9123 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9124 // cond: 0 <= c && c < 32 9125 // result: (RSBSshiftLL x y [c]) 9126 for { 9127 x := v_0 9128 y := v_1 9129 if v_2.Op != OpARMMOVWconst { 9130 break 9131 } 9132 c := auxIntToInt32(v_2.AuxInt) 9133 if !(0 <= c && c < 32) { 9134 break 9135 } 9136 v.reset(OpARMRSBSshiftLL) 9137 v.AuxInt = int32ToAuxInt(c) 9138 v.AddArg2(x, y) 9139 return true 9140 } 9141 return false 9142 } 9143 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool { 9144 v_1 := v.Args[1] 9145 v_0 := v.Args[0] 9146 b := v.Block 9147 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9148 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9149 for { 9150 d := auxIntToInt32(v.AuxInt) 9151 if v_0.Op != OpARMMOVWconst { 9152 break 9153 } 9154 c := auxIntToInt32(v_0.AuxInt) 9155 x := v_1 9156 v.reset(OpARMSUBSconst) 9157 v.AuxInt = int32ToAuxInt(c) 9158 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9159 v0.AuxInt = int32ToAuxInt(d) 9160 v0.AddArg(x) 9161 v.AddArg(v0) 9162 return true 9163 } 9164 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9165 // result: (RSBSconst x [c>>uint64(d)]) 9166 for { 9167 d := auxIntToInt32(v.AuxInt) 9168 x := v_0 9169 if v_1.Op != OpARMMOVWconst { 9170 break 9171 } 9172 c := auxIntToInt32(v_1.AuxInt) 9173 v.reset(OpARMRSBSconst) 9174 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9175 v.AddArg(x) 9176 return true 9177 } 9178 return false 9179 } 9180 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool { 9181 v_2 := v.Args[2] 9182 v_1 := v.Args[1] 9183 v_0 := v.Args[0] 9184 b := v.Block 9185 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9186 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9187 for { 9188 if v_0.Op != OpARMMOVWconst { 9189 break 9190 } 9191 c := auxIntToInt32(v_0.AuxInt) 9192 x := v_1 9193 y := v_2 9194 v.reset(OpARMSUBSconst) 9195 v.AuxInt = int32ToAuxInt(c) 9196 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9197 v0.AddArg2(x, y) 9198 v.AddArg(v0) 9199 return true 9200 } 9201 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9202 // cond: 0 <= c && c < 32 9203 // result: (RSBSshiftRA x y [c]) 9204 for { 9205 x := v_0 9206 y := v_1 9207 if v_2.Op != OpARMMOVWconst { 9208 break 9209 } 9210 c := auxIntToInt32(v_2.AuxInt) 9211 if !(0 <= c && c < 32) { 9212 break 9213 } 9214 v.reset(OpARMRSBSshiftRA) 9215 v.AuxInt = int32ToAuxInt(c) 9216 v.AddArg2(x, y) 9217 return true 9218 } 9219 return false 9220 } 9221 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool { 9222 v_1 := v.Args[1] 9223 v_0 := v.Args[0] 9224 b := v.Block 9225 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9226 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9227 for { 9228 d := auxIntToInt32(v.AuxInt) 9229 if v_0.Op != OpARMMOVWconst { 9230 break 9231 } 9232 c := auxIntToInt32(v_0.AuxInt) 9233 x := v_1 9234 v.reset(OpARMSUBSconst) 9235 v.AuxInt = int32ToAuxInt(c) 9236 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9237 v0.AuxInt = int32ToAuxInt(d) 9238 v0.AddArg(x) 9239 v.AddArg(v0) 9240 return true 9241 } 9242 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9243 // result: (RSBSconst x [int32(uint32(c)>>uint64(d))]) 9244 for { 9245 d := auxIntToInt32(v.AuxInt) 9246 x := v_0 9247 if v_1.Op != OpARMMOVWconst { 9248 break 9249 } 9250 c := auxIntToInt32(v_1.AuxInt) 9251 v.reset(OpARMRSBSconst) 9252 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9253 v.AddArg(x) 9254 return true 9255 } 9256 return false 9257 } 9258 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool { 9259 v_2 := v.Args[2] 9260 v_1 := v.Args[1] 9261 v_0 := v.Args[0] 9262 b := v.Block 9263 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9264 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9265 for { 9266 if v_0.Op != OpARMMOVWconst { 9267 break 9268 } 9269 c := auxIntToInt32(v_0.AuxInt) 9270 x := v_1 9271 y := v_2 9272 v.reset(OpARMSUBSconst) 9273 v.AuxInt = int32ToAuxInt(c) 9274 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9275 v0.AddArg2(x, y) 9276 v.AddArg(v0) 9277 return true 9278 } 9279 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9280 // cond: 0 <= c && c < 32 9281 // result: (RSBSshiftRL x y [c]) 9282 for { 9283 x := v_0 9284 y := v_1 9285 if v_2.Op != OpARMMOVWconst { 9286 break 9287 } 9288 c := auxIntToInt32(v_2.AuxInt) 9289 if !(0 <= c && c < 32) { 9290 break 9291 } 9292 v.reset(OpARMRSBSshiftRL) 9293 v.AuxInt = int32ToAuxInt(c) 9294 v.AddArg2(x, y) 9295 return true 9296 } 9297 return false 9298 } 9299 func rewriteValueARM_OpARMRSBconst(v *Value) bool { 9300 v_0 := v.Args[0] 9301 // match: (RSBconst [c] (MOVWconst [d])) 9302 // result: (MOVWconst [c-d]) 9303 for { 9304 c := auxIntToInt32(v.AuxInt) 9305 if v_0.Op != OpARMMOVWconst { 9306 break 9307 } 9308 d := auxIntToInt32(v_0.AuxInt) 9309 v.reset(OpARMMOVWconst) 9310 v.AuxInt = int32ToAuxInt(c - d) 9311 return true 9312 } 9313 // match: (RSBconst [c] (RSBconst [d] x)) 9314 // result: (ADDconst [c-d] x) 9315 for { 9316 c := auxIntToInt32(v.AuxInt) 9317 if v_0.Op != OpARMRSBconst { 9318 break 9319 } 9320 d := auxIntToInt32(v_0.AuxInt) 9321 x := v_0.Args[0] 9322 v.reset(OpARMADDconst) 9323 v.AuxInt = int32ToAuxInt(c - d) 9324 v.AddArg(x) 9325 return true 9326 } 9327 // match: (RSBconst [c] (ADDconst [d] x)) 9328 // result: (RSBconst [c-d] x) 9329 for { 9330 c := auxIntToInt32(v.AuxInt) 9331 if v_0.Op != OpARMADDconst { 9332 break 9333 } 9334 d := auxIntToInt32(v_0.AuxInt) 9335 x := v_0.Args[0] 9336 v.reset(OpARMRSBconst) 9337 v.AuxInt = int32ToAuxInt(c - d) 9338 v.AddArg(x) 9339 return true 9340 } 9341 // match: (RSBconst [c] (SUBconst [d] x)) 9342 // result: (RSBconst [c+d] x) 9343 for { 9344 c := auxIntToInt32(v.AuxInt) 9345 if v_0.Op != OpARMSUBconst { 9346 break 9347 } 9348 d := auxIntToInt32(v_0.AuxInt) 9349 x := v_0.Args[0] 9350 v.reset(OpARMRSBconst) 9351 v.AuxInt = int32ToAuxInt(c + d) 9352 v.AddArg(x) 9353 return true 9354 } 9355 return false 9356 } 9357 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool { 9358 v_1 := v.Args[1] 9359 v_0 := v.Args[0] 9360 b := v.Block 9361 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9362 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9363 for { 9364 d := auxIntToInt32(v.AuxInt) 9365 if v_0.Op != OpARMMOVWconst { 9366 break 9367 } 9368 c := auxIntToInt32(v_0.AuxInt) 9369 x := v_1 9370 v.reset(OpARMSUBconst) 9371 v.AuxInt = int32ToAuxInt(c) 9372 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9373 v0.AuxInt = int32ToAuxInt(d) 9374 v0.AddArg(x) 9375 v.AddArg(v0) 9376 return true 9377 } 9378 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9379 // result: (RSBconst x [c<<uint64(d)]) 9380 for { 9381 d := auxIntToInt32(v.AuxInt) 9382 x := v_0 9383 if v_1.Op != OpARMMOVWconst { 9384 break 9385 } 9386 c := auxIntToInt32(v_1.AuxInt) 9387 v.reset(OpARMRSBconst) 9388 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9389 v.AddArg(x) 9390 return true 9391 } 9392 // match: (RSBshiftLL (SLLconst x [c]) x [c]) 9393 // result: (MOVWconst [0]) 9394 for { 9395 c := auxIntToInt32(v.AuxInt) 9396 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 9397 break 9398 } 9399 x := v_0.Args[0] 9400 if x != v_1 { 9401 break 9402 } 9403 v.reset(OpARMMOVWconst) 9404 v.AuxInt = int32ToAuxInt(0) 9405 return true 9406 } 9407 return false 9408 } 9409 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool { 9410 v_2 := v.Args[2] 9411 v_1 := v.Args[1] 9412 v_0 := v.Args[0] 9413 b := v.Block 9414 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9415 // result: (SUBconst [c] (SLL <x.Type> x y)) 9416 for { 9417 if v_0.Op != OpARMMOVWconst { 9418 break 9419 } 9420 c := auxIntToInt32(v_0.AuxInt) 9421 x := v_1 9422 y := v_2 9423 v.reset(OpARMSUBconst) 9424 v.AuxInt = int32ToAuxInt(c) 9425 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9426 v0.AddArg2(x, y) 9427 v.AddArg(v0) 9428 return true 9429 } 9430 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9431 // cond: 0 <= c && c < 32 9432 // result: (RSBshiftLL x y [c]) 9433 for { 9434 x := v_0 9435 y := v_1 9436 if v_2.Op != OpARMMOVWconst { 9437 break 9438 } 9439 c := auxIntToInt32(v_2.AuxInt) 9440 if !(0 <= c && c < 32) { 9441 break 9442 } 9443 v.reset(OpARMRSBshiftLL) 9444 v.AuxInt = int32ToAuxInt(c) 9445 v.AddArg2(x, y) 9446 return true 9447 } 9448 return false 9449 } 9450 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool { 9451 v_1 := v.Args[1] 9452 v_0 := v.Args[0] 9453 b := v.Block 9454 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9455 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9456 for { 9457 d := auxIntToInt32(v.AuxInt) 9458 if v_0.Op != OpARMMOVWconst { 9459 break 9460 } 9461 c := auxIntToInt32(v_0.AuxInt) 9462 x := v_1 9463 v.reset(OpARMSUBconst) 9464 v.AuxInt = int32ToAuxInt(c) 9465 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9466 v0.AuxInt = int32ToAuxInt(d) 9467 v0.AddArg(x) 9468 v.AddArg(v0) 9469 return true 9470 } 9471 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9472 // result: (RSBconst x [c>>uint64(d)]) 9473 for { 9474 d := auxIntToInt32(v.AuxInt) 9475 x := v_0 9476 if v_1.Op != OpARMMOVWconst { 9477 break 9478 } 9479 c := auxIntToInt32(v_1.AuxInt) 9480 v.reset(OpARMRSBconst) 9481 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9482 v.AddArg(x) 9483 return true 9484 } 9485 // match: (RSBshiftRA (SRAconst x [c]) x [c]) 9486 // result: (MOVWconst [0]) 9487 for { 9488 c := auxIntToInt32(v.AuxInt) 9489 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 9490 break 9491 } 9492 x := v_0.Args[0] 9493 if x != v_1 { 9494 break 9495 } 9496 v.reset(OpARMMOVWconst) 9497 v.AuxInt = int32ToAuxInt(0) 9498 return true 9499 } 9500 return false 9501 } 9502 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool { 9503 v_2 := v.Args[2] 9504 v_1 := v.Args[1] 9505 v_0 := v.Args[0] 9506 b := v.Block 9507 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9508 // result: (SUBconst [c] (SRA <x.Type> x y)) 9509 for { 9510 if v_0.Op != OpARMMOVWconst { 9511 break 9512 } 9513 c := auxIntToInt32(v_0.AuxInt) 9514 x := v_1 9515 y := v_2 9516 v.reset(OpARMSUBconst) 9517 v.AuxInt = int32ToAuxInt(c) 9518 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9519 v0.AddArg2(x, y) 9520 v.AddArg(v0) 9521 return true 9522 } 9523 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9524 // cond: 0 <= c && c < 32 9525 // result: (RSBshiftRA x y [c]) 9526 for { 9527 x := v_0 9528 y := v_1 9529 if v_2.Op != OpARMMOVWconst { 9530 break 9531 } 9532 c := auxIntToInt32(v_2.AuxInt) 9533 if !(0 <= c && c < 32) { 9534 break 9535 } 9536 v.reset(OpARMRSBshiftRA) 9537 v.AuxInt = int32ToAuxInt(c) 9538 v.AddArg2(x, y) 9539 return true 9540 } 9541 return false 9542 } 9543 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool { 9544 v_1 := v.Args[1] 9545 v_0 := v.Args[0] 9546 b := v.Block 9547 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 9548 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 9549 for { 9550 d := auxIntToInt32(v.AuxInt) 9551 if v_0.Op != OpARMMOVWconst { 9552 break 9553 } 9554 c := auxIntToInt32(v_0.AuxInt) 9555 x := v_1 9556 v.reset(OpARMSUBconst) 9557 v.AuxInt = int32ToAuxInt(c) 9558 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9559 v0.AuxInt = int32ToAuxInt(d) 9560 v0.AddArg(x) 9561 v.AddArg(v0) 9562 return true 9563 } 9564 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 9565 // result: (RSBconst x [int32(uint32(c)>>uint64(d))]) 9566 for { 9567 d := auxIntToInt32(v.AuxInt) 9568 x := v_0 9569 if v_1.Op != OpARMMOVWconst { 9570 break 9571 } 9572 c := auxIntToInt32(v_1.AuxInt) 9573 v.reset(OpARMRSBconst) 9574 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9575 v.AddArg(x) 9576 return true 9577 } 9578 // match: (RSBshiftRL (SRLconst x [c]) x [c]) 9579 // result: (MOVWconst [0]) 9580 for { 9581 c := auxIntToInt32(v.AuxInt) 9582 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 9583 break 9584 } 9585 x := v_0.Args[0] 9586 if x != v_1 { 9587 break 9588 } 9589 v.reset(OpARMMOVWconst) 9590 v.AuxInt = int32ToAuxInt(0) 9591 return true 9592 } 9593 return false 9594 } 9595 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool { 9596 v_2 := v.Args[2] 9597 v_1 := v.Args[1] 9598 v_0 := v.Args[0] 9599 b := v.Block 9600 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 9601 // result: (SUBconst [c] (SRL <x.Type> x y)) 9602 for { 9603 if v_0.Op != OpARMMOVWconst { 9604 break 9605 } 9606 c := auxIntToInt32(v_0.AuxInt) 9607 x := v_1 9608 y := v_2 9609 v.reset(OpARMSUBconst) 9610 v.AuxInt = int32ToAuxInt(c) 9611 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9612 v0.AddArg2(x, y) 9613 v.AddArg(v0) 9614 return true 9615 } 9616 // match: (RSBshiftRLreg x y (MOVWconst [c])) 9617 // cond: 0 <= c && c < 32 9618 // result: (RSBshiftRL x y [c]) 9619 for { 9620 x := v_0 9621 y := v_1 9622 if v_2.Op != OpARMMOVWconst { 9623 break 9624 } 9625 c := auxIntToInt32(v_2.AuxInt) 9626 if !(0 <= c && c < 32) { 9627 break 9628 } 9629 v.reset(OpARMRSBshiftRL) 9630 v.AuxInt = int32ToAuxInt(c) 9631 v.AddArg2(x, y) 9632 return true 9633 } 9634 return false 9635 } 9636 func rewriteValueARM_OpARMRSCconst(v *Value) bool { 9637 v_1 := v.Args[1] 9638 v_0 := v.Args[0] 9639 // match: (RSCconst [c] (ADDconst [d] x) flags) 9640 // result: (RSCconst [c-d] x flags) 9641 for { 9642 c := auxIntToInt32(v.AuxInt) 9643 if v_0.Op != OpARMADDconst { 9644 break 9645 } 9646 d := auxIntToInt32(v_0.AuxInt) 9647 x := v_0.Args[0] 9648 flags := v_1 9649 v.reset(OpARMRSCconst) 9650 v.AuxInt = int32ToAuxInt(c - d) 9651 v.AddArg2(x, flags) 9652 return true 9653 } 9654 // match: (RSCconst [c] (SUBconst [d] x) flags) 9655 // result: (RSCconst [c+d] x flags) 9656 for { 9657 c := auxIntToInt32(v.AuxInt) 9658 if v_0.Op != OpARMSUBconst { 9659 break 9660 } 9661 d := auxIntToInt32(v_0.AuxInt) 9662 x := v_0.Args[0] 9663 flags := v_1 9664 v.reset(OpARMRSCconst) 9665 v.AuxInt = int32ToAuxInt(c + d) 9666 v.AddArg2(x, flags) 9667 return true 9668 } 9669 return false 9670 } 9671 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool { 9672 v_2 := v.Args[2] 9673 v_1 := v.Args[1] 9674 v_0 := v.Args[0] 9675 b := v.Block 9676 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 9677 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 9678 for { 9679 d := auxIntToInt32(v.AuxInt) 9680 if v_0.Op != OpARMMOVWconst { 9681 break 9682 } 9683 c := auxIntToInt32(v_0.AuxInt) 9684 x := v_1 9685 flags := v_2 9686 v.reset(OpARMSBCconst) 9687 v.AuxInt = int32ToAuxInt(c) 9688 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9689 v0.AuxInt = int32ToAuxInt(d) 9690 v0.AddArg(x) 9691 v.AddArg2(v0, flags) 9692 return true 9693 } 9694 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 9695 // result: (RSCconst x [c<<uint64(d)] flags) 9696 for { 9697 d := auxIntToInt32(v.AuxInt) 9698 x := v_0 9699 if v_1.Op != OpARMMOVWconst { 9700 break 9701 } 9702 c := auxIntToInt32(v_1.AuxInt) 9703 flags := v_2 9704 v.reset(OpARMRSCconst) 9705 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9706 v.AddArg2(x, flags) 9707 return true 9708 } 9709 return false 9710 } 9711 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool { 9712 v_3 := v.Args[3] 9713 v_2 := v.Args[2] 9714 v_1 := v.Args[1] 9715 v_0 := v.Args[0] 9716 b := v.Block 9717 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 9718 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 9719 for { 9720 if v_0.Op != OpARMMOVWconst { 9721 break 9722 } 9723 c := auxIntToInt32(v_0.AuxInt) 9724 x := v_1 9725 y := v_2 9726 flags := v_3 9727 v.reset(OpARMSBCconst) 9728 v.AuxInt = int32ToAuxInt(c) 9729 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9730 v0.AddArg2(x, y) 9731 v.AddArg2(v0, flags) 9732 return true 9733 } 9734 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 9735 // cond: 0 <= c && c < 32 9736 // result: (RSCshiftLL x y [c] flags) 9737 for { 9738 x := v_0 9739 y := v_1 9740 if v_2.Op != OpARMMOVWconst { 9741 break 9742 } 9743 c := auxIntToInt32(v_2.AuxInt) 9744 flags := v_3 9745 if !(0 <= c && c < 32) { 9746 break 9747 } 9748 v.reset(OpARMRSCshiftLL) 9749 v.AuxInt = int32ToAuxInt(c) 9750 v.AddArg3(x, y, flags) 9751 return true 9752 } 9753 return false 9754 } 9755 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool { 9756 v_2 := v.Args[2] 9757 v_1 := v.Args[1] 9758 v_0 := v.Args[0] 9759 b := v.Block 9760 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 9761 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 9762 for { 9763 d := auxIntToInt32(v.AuxInt) 9764 if v_0.Op != OpARMMOVWconst { 9765 break 9766 } 9767 c := auxIntToInt32(v_0.AuxInt) 9768 x := v_1 9769 flags := v_2 9770 v.reset(OpARMSBCconst) 9771 v.AuxInt = int32ToAuxInt(c) 9772 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9773 v0.AuxInt = int32ToAuxInt(d) 9774 v0.AddArg(x) 9775 v.AddArg2(v0, flags) 9776 return true 9777 } 9778 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 9779 // result: (RSCconst x [c>>uint64(d)] flags) 9780 for { 9781 d := auxIntToInt32(v.AuxInt) 9782 x := v_0 9783 if v_1.Op != OpARMMOVWconst { 9784 break 9785 } 9786 c := auxIntToInt32(v_1.AuxInt) 9787 flags := v_2 9788 v.reset(OpARMRSCconst) 9789 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9790 v.AddArg2(x, flags) 9791 return true 9792 } 9793 return false 9794 } 9795 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool { 9796 v_3 := v.Args[3] 9797 v_2 := v.Args[2] 9798 v_1 := v.Args[1] 9799 v_0 := v.Args[0] 9800 b := v.Block 9801 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 9802 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 9803 for { 9804 if v_0.Op != OpARMMOVWconst { 9805 break 9806 } 9807 c := auxIntToInt32(v_0.AuxInt) 9808 x := v_1 9809 y := v_2 9810 flags := v_3 9811 v.reset(OpARMSBCconst) 9812 v.AuxInt = int32ToAuxInt(c) 9813 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9814 v0.AddArg2(x, y) 9815 v.AddArg2(v0, flags) 9816 return true 9817 } 9818 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 9819 // cond: 0 <= c && c < 32 9820 // result: (RSCshiftRA x y [c] flags) 9821 for { 9822 x := v_0 9823 y := v_1 9824 if v_2.Op != OpARMMOVWconst { 9825 break 9826 } 9827 c := auxIntToInt32(v_2.AuxInt) 9828 flags := v_3 9829 if !(0 <= c && c < 32) { 9830 break 9831 } 9832 v.reset(OpARMRSCshiftRA) 9833 v.AuxInt = int32ToAuxInt(c) 9834 v.AddArg3(x, y, flags) 9835 return true 9836 } 9837 return false 9838 } 9839 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool { 9840 v_2 := v.Args[2] 9841 v_1 := v.Args[1] 9842 v_0 := v.Args[0] 9843 b := v.Block 9844 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 9845 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 9846 for { 9847 d := auxIntToInt32(v.AuxInt) 9848 if v_0.Op != OpARMMOVWconst { 9849 break 9850 } 9851 c := auxIntToInt32(v_0.AuxInt) 9852 x := v_1 9853 flags := v_2 9854 v.reset(OpARMSBCconst) 9855 v.AuxInt = int32ToAuxInt(c) 9856 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9857 v0.AuxInt = int32ToAuxInt(d) 9858 v0.AddArg(x) 9859 v.AddArg2(v0, flags) 9860 return true 9861 } 9862 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 9863 // result: (RSCconst x [int32(uint32(c)>>uint64(d))] flags) 9864 for { 9865 d := auxIntToInt32(v.AuxInt) 9866 x := v_0 9867 if v_1.Op != OpARMMOVWconst { 9868 break 9869 } 9870 c := auxIntToInt32(v_1.AuxInt) 9871 flags := v_2 9872 v.reset(OpARMRSCconst) 9873 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9874 v.AddArg2(x, flags) 9875 return true 9876 } 9877 return false 9878 } 9879 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool { 9880 v_3 := v.Args[3] 9881 v_2 := v.Args[2] 9882 v_1 := v.Args[1] 9883 v_0 := v.Args[0] 9884 b := v.Block 9885 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 9886 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 9887 for { 9888 if v_0.Op != OpARMMOVWconst { 9889 break 9890 } 9891 c := auxIntToInt32(v_0.AuxInt) 9892 x := v_1 9893 y := v_2 9894 flags := v_3 9895 v.reset(OpARMSBCconst) 9896 v.AuxInt = int32ToAuxInt(c) 9897 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9898 v0.AddArg2(x, y) 9899 v.AddArg2(v0, flags) 9900 return true 9901 } 9902 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 9903 // cond: 0 <= c && c < 32 9904 // result: (RSCshiftRL x y [c] flags) 9905 for { 9906 x := v_0 9907 y := v_1 9908 if v_2.Op != OpARMMOVWconst { 9909 break 9910 } 9911 c := auxIntToInt32(v_2.AuxInt) 9912 flags := v_3 9913 if !(0 <= c && c < 32) { 9914 break 9915 } 9916 v.reset(OpARMRSCshiftRL) 9917 v.AuxInt = int32ToAuxInt(c) 9918 v.AddArg3(x, y, flags) 9919 return true 9920 } 9921 return false 9922 } 9923 func rewriteValueARM_OpARMSBC(v *Value) bool { 9924 v_2 := v.Args[2] 9925 v_1 := v.Args[1] 9926 v_0 := v.Args[0] 9927 // match: (SBC (MOVWconst [c]) x flags) 9928 // result: (RSCconst [c] x flags) 9929 for { 9930 if v_0.Op != OpARMMOVWconst { 9931 break 9932 } 9933 c := auxIntToInt32(v_0.AuxInt) 9934 x := v_1 9935 flags := v_2 9936 v.reset(OpARMRSCconst) 9937 v.AuxInt = int32ToAuxInt(c) 9938 v.AddArg2(x, flags) 9939 return true 9940 } 9941 // match: (SBC x (MOVWconst [c]) flags) 9942 // result: (SBCconst [c] x flags) 9943 for { 9944 x := v_0 9945 if v_1.Op != OpARMMOVWconst { 9946 break 9947 } 9948 c := auxIntToInt32(v_1.AuxInt) 9949 flags := v_2 9950 v.reset(OpARMSBCconst) 9951 v.AuxInt = int32ToAuxInt(c) 9952 v.AddArg2(x, flags) 9953 return true 9954 } 9955 // match: (SBC x (SLLconst [c] y) flags) 9956 // result: (SBCshiftLL x y [c] flags) 9957 for { 9958 x := v_0 9959 if v_1.Op != OpARMSLLconst { 9960 break 9961 } 9962 c := auxIntToInt32(v_1.AuxInt) 9963 y := v_1.Args[0] 9964 flags := v_2 9965 v.reset(OpARMSBCshiftLL) 9966 v.AuxInt = int32ToAuxInt(c) 9967 v.AddArg3(x, y, flags) 9968 return true 9969 } 9970 // match: (SBC (SLLconst [c] y) x flags) 9971 // result: (RSCshiftLL x y [c] flags) 9972 for { 9973 if v_0.Op != OpARMSLLconst { 9974 break 9975 } 9976 c := auxIntToInt32(v_0.AuxInt) 9977 y := v_0.Args[0] 9978 x := v_1 9979 flags := v_2 9980 v.reset(OpARMRSCshiftLL) 9981 v.AuxInt = int32ToAuxInt(c) 9982 v.AddArg3(x, y, flags) 9983 return true 9984 } 9985 // match: (SBC x (SRLconst [c] y) flags) 9986 // result: (SBCshiftRL x y [c] flags) 9987 for { 9988 x := v_0 9989 if v_1.Op != OpARMSRLconst { 9990 break 9991 } 9992 c := auxIntToInt32(v_1.AuxInt) 9993 y := v_1.Args[0] 9994 flags := v_2 9995 v.reset(OpARMSBCshiftRL) 9996 v.AuxInt = int32ToAuxInt(c) 9997 v.AddArg3(x, y, flags) 9998 return true 9999 } 10000 // match: (SBC (SRLconst [c] y) x flags) 10001 // result: (RSCshiftRL x y [c] flags) 10002 for { 10003 if v_0.Op != OpARMSRLconst { 10004 break 10005 } 10006 c := auxIntToInt32(v_0.AuxInt) 10007 y := v_0.Args[0] 10008 x := v_1 10009 flags := v_2 10010 v.reset(OpARMRSCshiftRL) 10011 v.AuxInt = int32ToAuxInt(c) 10012 v.AddArg3(x, y, flags) 10013 return true 10014 } 10015 // match: (SBC x (SRAconst [c] y) flags) 10016 // result: (SBCshiftRA x y [c] flags) 10017 for { 10018 x := v_0 10019 if v_1.Op != OpARMSRAconst { 10020 break 10021 } 10022 c := auxIntToInt32(v_1.AuxInt) 10023 y := v_1.Args[0] 10024 flags := v_2 10025 v.reset(OpARMSBCshiftRA) 10026 v.AuxInt = int32ToAuxInt(c) 10027 v.AddArg3(x, y, flags) 10028 return true 10029 } 10030 // match: (SBC (SRAconst [c] y) x flags) 10031 // result: (RSCshiftRA x y [c] flags) 10032 for { 10033 if v_0.Op != OpARMSRAconst { 10034 break 10035 } 10036 c := auxIntToInt32(v_0.AuxInt) 10037 y := v_0.Args[0] 10038 x := v_1 10039 flags := v_2 10040 v.reset(OpARMRSCshiftRA) 10041 v.AuxInt = int32ToAuxInt(c) 10042 v.AddArg3(x, y, flags) 10043 return true 10044 } 10045 // match: (SBC x (SLL y z) flags) 10046 // result: (SBCshiftLLreg x y z flags) 10047 for { 10048 x := v_0 10049 if v_1.Op != OpARMSLL { 10050 break 10051 } 10052 z := v_1.Args[1] 10053 y := v_1.Args[0] 10054 flags := v_2 10055 v.reset(OpARMSBCshiftLLreg) 10056 v.AddArg4(x, y, z, flags) 10057 return true 10058 } 10059 // match: (SBC (SLL y z) x flags) 10060 // result: (RSCshiftLLreg x y z flags) 10061 for { 10062 if v_0.Op != OpARMSLL { 10063 break 10064 } 10065 z := v_0.Args[1] 10066 y := v_0.Args[0] 10067 x := v_1 10068 flags := v_2 10069 v.reset(OpARMRSCshiftLLreg) 10070 v.AddArg4(x, y, z, flags) 10071 return true 10072 } 10073 // match: (SBC x (SRL y z) flags) 10074 // result: (SBCshiftRLreg x y z flags) 10075 for { 10076 x := v_0 10077 if v_1.Op != OpARMSRL { 10078 break 10079 } 10080 z := v_1.Args[1] 10081 y := v_1.Args[0] 10082 flags := v_2 10083 v.reset(OpARMSBCshiftRLreg) 10084 v.AddArg4(x, y, z, flags) 10085 return true 10086 } 10087 // match: (SBC (SRL y z) x flags) 10088 // result: (RSCshiftRLreg x y z flags) 10089 for { 10090 if v_0.Op != OpARMSRL { 10091 break 10092 } 10093 z := v_0.Args[1] 10094 y := v_0.Args[0] 10095 x := v_1 10096 flags := v_2 10097 v.reset(OpARMRSCshiftRLreg) 10098 v.AddArg4(x, y, z, flags) 10099 return true 10100 } 10101 // match: (SBC x (SRA y z) flags) 10102 // result: (SBCshiftRAreg x y z flags) 10103 for { 10104 x := v_0 10105 if v_1.Op != OpARMSRA { 10106 break 10107 } 10108 z := v_1.Args[1] 10109 y := v_1.Args[0] 10110 flags := v_2 10111 v.reset(OpARMSBCshiftRAreg) 10112 v.AddArg4(x, y, z, flags) 10113 return true 10114 } 10115 // match: (SBC (SRA y z) x flags) 10116 // result: (RSCshiftRAreg x y z flags) 10117 for { 10118 if v_0.Op != OpARMSRA { 10119 break 10120 } 10121 z := v_0.Args[1] 10122 y := v_0.Args[0] 10123 x := v_1 10124 flags := v_2 10125 v.reset(OpARMRSCshiftRAreg) 10126 v.AddArg4(x, y, z, flags) 10127 return true 10128 } 10129 return false 10130 } 10131 func rewriteValueARM_OpARMSBCconst(v *Value) bool { 10132 v_1 := v.Args[1] 10133 v_0 := v.Args[0] 10134 // match: (SBCconst [c] (ADDconst [d] x) flags) 10135 // result: (SBCconst [c-d] x flags) 10136 for { 10137 c := auxIntToInt32(v.AuxInt) 10138 if v_0.Op != OpARMADDconst { 10139 break 10140 } 10141 d := auxIntToInt32(v_0.AuxInt) 10142 x := v_0.Args[0] 10143 flags := v_1 10144 v.reset(OpARMSBCconst) 10145 v.AuxInt = int32ToAuxInt(c - d) 10146 v.AddArg2(x, flags) 10147 return true 10148 } 10149 // match: (SBCconst [c] (SUBconst [d] x) flags) 10150 // result: (SBCconst [c+d] x flags) 10151 for { 10152 c := auxIntToInt32(v.AuxInt) 10153 if v_0.Op != OpARMSUBconst { 10154 break 10155 } 10156 d := auxIntToInt32(v_0.AuxInt) 10157 x := v_0.Args[0] 10158 flags := v_1 10159 v.reset(OpARMSBCconst) 10160 v.AuxInt = int32ToAuxInt(c + d) 10161 v.AddArg2(x, flags) 10162 return true 10163 } 10164 return false 10165 } 10166 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool { 10167 v_2 := v.Args[2] 10168 v_1 := v.Args[1] 10169 v_0 := v.Args[0] 10170 b := v.Block 10171 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10172 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10173 for { 10174 d := auxIntToInt32(v.AuxInt) 10175 if v_0.Op != OpARMMOVWconst { 10176 break 10177 } 10178 c := auxIntToInt32(v_0.AuxInt) 10179 x := v_1 10180 flags := v_2 10181 v.reset(OpARMRSCconst) 10182 v.AuxInt = int32ToAuxInt(c) 10183 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10184 v0.AuxInt = int32ToAuxInt(d) 10185 v0.AddArg(x) 10186 v.AddArg2(v0, flags) 10187 return true 10188 } 10189 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10190 // result: (SBCconst x [c<<uint64(d)] flags) 10191 for { 10192 d := auxIntToInt32(v.AuxInt) 10193 x := v_0 10194 if v_1.Op != OpARMMOVWconst { 10195 break 10196 } 10197 c := auxIntToInt32(v_1.AuxInt) 10198 flags := v_2 10199 v.reset(OpARMSBCconst) 10200 v.AuxInt = int32ToAuxInt(c << uint64(d)) 10201 v.AddArg2(x, flags) 10202 return true 10203 } 10204 return false 10205 } 10206 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool { 10207 v_3 := v.Args[3] 10208 v_2 := v.Args[2] 10209 v_1 := v.Args[1] 10210 v_0 := v.Args[0] 10211 b := v.Block 10212 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10213 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10214 for { 10215 if v_0.Op != OpARMMOVWconst { 10216 break 10217 } 10218 c := auxIntToInt32(v_0.AuxInt) 10219 x := v_1 10220 y := v_2 10221 flags := v_3 10222 v.reset(OpARMRSCconst) 10223 v.AuxInt = int32ToAuxInt(c) 10224 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10225 v0.AddArg2(x, y) 10226 v.AddArg2(v0, flags) 10227 return true 10228 } 10229 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10230 // cond: 0 <= c && c < 32 10231 // result: (SBCshiftLL x y [c] flags) 10232 for { 10233 x := v_0 10234 y := v_1 10235 if v_2.Op != OpARMMOVWconst { 10236 break 10237 } 10238 c := auxIntToInt32(v_2.AuxInt) 10239 flags := v_3 10240 if !(0 <= c && c < 32) { 10241 break 10242 } 10243 v.reset(OpARMSBCshiftLL) 10244 v.AuxInt = int32ToAuxInt(c) 10245 v.AddArg3(x, y, flags) 10246 return true 10247 } 10248 return false 10249 } 10250 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool { 10251 v_2 := v.Args[2] 10252 v_1 := v.Args[1] 10253 v_0 := v.Args[0] 10254 b := v.Block 10255 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10256 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10257 for { 10258 d := auxIntToInt32(v.AuxInt) 10259 if v_0.Op != OpARMMOVWconst { 10260 break 10261 } 10262 c := auxIntToInt32(v_0.AuxInt) 10263 x := v_1 10264 flags := v_2 10265 v.reset(OpARMRSCconst) 10266 v.AuxInt = int32ToAuxInt(c) 10267 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10268 v0.AuxInt = int32ToAuxInt(d) 10269 v0.AddArg(x) 10270 v.AddArg2(v0, flags) 10271 return true 10272 } 10273 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10274 // result: (SBCconst x [c>>uint64(d)] flags) 10275 for { 10276 d := auxIntToInt32(v.AuxInt) 10277 x := v_0 10278 if v_1.Op != OpARMMOVWconst { 10279 break 10280 } 10281 c := auxIntToInt32(v_1.AuxInt) 10282 flags := v_2 10283 v.reset(OpARMSBCconst) 10284 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 10285 v.AddArg2(x, flags) 10286 return true 10287 } 10288 return false 10289 } 10290 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool { 10291 v_3 := v.Args[3] 10292 v_2 := v.Args[2] 10293 v_1 := v.Args[1] 10294 v_0 := v.Args[0] 10295 b := v.Block 10296 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10297 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10298 for { 10299 if v_0.Op != OpARMMOVWconst { 10300 break 10301 } 10302 c := auxIntToInt32(v_0.AuxInt) 10303 x := v_1 10304 y := v_2 10305 flags := v_3 10306 v.reset(OpARMRSCconst) 10307 v.AuxInt = int32ToAuxInt(c) 10308 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10309 v0.AddArg2(x, y) 10310 v.AddArg2(v0, flags) 10311 return true 10312 } 10313 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10314 // cond: 0 <= c && c < 32 10315 // result: (SBCshiftRA x y [c] flags) 10316 for { 10317 x := v_0 10318 y := v_1 10319 if v_2.Op != OpARMMOVWconst { 10320 break 10321 } 10322 c := auxIntToInt32(v_2.AuxInt) 10323 flags := v_3 10324 if !(0 <= c && c < 32) { 10325 break 10326 } 10327 v.reset(OpARMSBCshiftRA) 10328 v.AuxInt = int32ToAuxInt(c) 10329 v.AddArg3(x, y, flags) 10330 return true 10331 } 10332 return false 10333 } 10334 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool { 10335 v_2 := v.Args[2] 10336 v_1 := v.Args[1] 10337 v_0 := v.Args[0] 10338 b := v.Block 10339 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10340 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10341 for { 10342 d := auxIntToInt32(v.AuxInt) 10343 if v_0.Op != OpARMMOVWconst { 10344 break 10345 } 10346 c := auxIntToInt32(v_0.AuxInt) 10347 x := v_1 10348 flags := v_2 10349 v.reset(OpARMRSCconst) 10350 v.AuxInt = int32ToAuxInt(c) 10351 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10352 v0.AuxInt = int32ToAuxInt(d) 10353 v0.AddArg(x) 10354 v.AddArg2(v0, flags) 10355 return true 10356 } 10357 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10358 // result: (SBCconst x [int32(uint32(c)>>uint64(d))] flags) 10359 for { 10360 d := auxIntToInt32(v.AuxInt) 10361 x := v_0 10362 if v_1.Op != OpARMMOVWconst { 10363 break 10364 } 10365 c := auxIntToInt32(v_1.AuxInt) 10366 flags := v_2 10367 v.reset(OpARMSBCconst) 10368 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 10369 v.AddArg2(x, flags) 10370 return true 10371 } 10372 return false 10373 } 10374 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool { 10375 v_3 := v.Args[3] 10376 v_2 := v.Args[2] 10377 v_1 := v.Args[1] 10378 v_0 := v.Args[0] 10379 b := v.Block 10380 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10381 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10382 for { 10383 if v_0.Op != OpARMMOVWconst { 10384 break 10385 } 10386 c := auxIntToInt32(v_0.AuxInt) 10387 x := v_1 10388 y := v_2 10389 flags := v_3 10390 v.reset(OpARMRSCconst) 10391 v.AuxInt = int32ToAuxInt(c) 10392 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10393 v0.AddArg2(x, y) 10394 v.AddArg2(v0, flags) 10395 return true 10396 } 10397 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10398 // cond: 0 <= c && c < 32 10399 // result: (SBCshiftRL x y [c] flags) 10400 for { 10401 x := v_0 10402 y := v_1 10403 if v_2.Op != OpARMMOVWconst { 10404 break 10405 } 10406 c := auxIntToInt32(v_2.AuxInt) 10407 flags := v_3 10408 if !(0 <= c && c < 32) { 10409 break 10410 } 10411 v.reset(OpARMSBCshiftRL) 10412 v.AuxInt = int32ToAuxInt(c) 10413 v.AddArg3(x, y, flags) 10414 return true 10415 } 10416 return false 10417 } 10418 func rewriteValueARM_OpARMSLL(v *Value) bool { 10419 v_1 := v.Args[1] 10420 v_0 := v.Args[0] 10421 // match: (SLL x (MOVWconst [c])) 10422 // cond: 0 <= c && c < 32 10423 // result: (SLLconst x [c]) 10424 for { 10425 x := v_0 10426 if v_1.Op != OpARMMOVWconst { 10427 break 10428 } 10429 c := auxIntToInt32(v_1.AuxInt) 10430 if !(0 <= c && c < 32) { 10431 break 10432 } 10433 v.reset(OpARMSLLconst) 10434 v.AuxInt = int32ToAuxInt(c) 10435 v.AddArg(x) 10436 return true 10437 } 10438 return false 10439 } 10440 func rewriteValueARM_OpARMSLLconst(v *Value) bool { 10441 v_0 := v.Args[0] 10442 // match: (SLLconst [c] (MOVWconst [d])) 10443 // result: (MOVWconst [d<<uint64(c)]) 10444 for { 10445 c := auxIntToInt32(v.AuxInt) 10446 if v_0.Op != OpARMMOVWconst { 10447 break 10448 } 10449 d := auxIntToInt32(v_0.AuxInt) 10450 v.reset(OpARMMOVWconst) 10451 v.AuxInt = int32ToAuxInt(d << uint64(c)) 10452 return true 10453 } 10454 return false 10455 } 10456 func rewriteValueARM_OpARMSRA(v *Value) bool { 10457 v_1 := v.Args[1] 10458 v_0 := v.Args[0] 10459 // match: (SRA x (MOVWconst [c])) 10460 // cond: 0 <= c && c < 32 10461 // result: (SRAconst x [c]) 10462 for { 10463 x := v_0 10464 if v_1.Op != OpARMMOVWconst { 10465 break 10466 } 10467 c := auxIntToInt32(v_1.AuxInt) 10468 if !(0 <= c && c < 32) { 10469 break 10470 } 10471 v.reset(OpARMSRAconst) 10472 v.AuxInt = int32ToAuxInt(c) 10473 v.AddArg(x) 10474 return true 10475 } 10476 return false 10477 } 10478 func rewriteValueARM_OpARMSRAcond(v *Value) bool { 10479 v_2 := v.Args[2] 10480 v_1 := v.Args[1] 10481 v_0 := v.Args[0] 10482 // match: (SRAcond x _ (FlagConstant [fc])) 10483 // cond: fc.uge() 10484 // result: (SRAconst x [31]) 10485 for { 10486 x := v_0 10487 if v_2.Op != OpARMFlagConstant { 10488 break 10489 } 10490 fc := auxIntToFlagConstant(v_2.AuxInt) 10491 if !(fc.uge()) { 10492 break 10493 } 10494 v.reset(OpARMSRAconst) 10495 v.AuxInt = int32ToAuxInt(31) 10496 v.AddArg(x) 10497 return true 10498 } 10499 // match: (SRAcond x y (FlagConstant [fc])) 10500 // cond: fc.ult() 10501 // result: (SRA x y) 10502 for { 10503 x := v_0 10504 y := v_1 10505 if v_2.Op != OpARMFlagConstant { 10506 break 10507 } 10508 fc := auxIntToFlagConstant(v_2.AuxInt) 10509 if !(fc.ult()) { 10510 break 10511 } 10512 v.reset(OpARMSRA) 10513 v.AddArg2(x, y) 10514 return true 10515 } 10516 return false 10517 } 10518 func rewriteValueARM_OpARMSRAconst(v *Value) bool { 10519 v_0 := v.Args[0] 10520 // match: (SRAconst [c] (MOVWconst [d])) 10521 // result: (MOVWconst [d>>uint64(c)]) 10522 for { 10523 c := auxIntToInt32(v.AuxInt) 10524 if v_0.Op != OpARMMOVWconst { 10525 break 10526 } 10527 d := auxIntToInt32(v_0.AuxInt) 10528 v.reset(OpARMMOVWconst) 10529 v.AuxInt = int32ToAuxInt(d >> uint64(c)) 10530 return true 10531 } 10532 // match: (SRAconst (SLLconst x [c]) [d]) 10533 // cond: buildcfg.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 10534 // result: (BFX [(d-c)|(32-d)<<8] x) 10535 for { 10536 d := auxIntToInt32(v.AuxInt) 10537 if v_0.Op != OpARMSLLconst { 10538 break 10539 } 10540 c := auxIntToInt32(v_0.AuxInt) 10541 x := v_0.Args[0] 10542 if !(buildcfg.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 10543 break 10544 } 10545 v.reset(OpARMBFX) 10546 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8) 10547 v.AddArg(x) 10548 return true 10549 } 10550 return false 10551 } 10552 func rewriteValueARM_OpARMSRL(v *Value) bool { 10553 v_1 := v.Args[1] 10554 v_0 := v.Args[0] 10555 // match: (SRL x (MOVWconst [c])) 10556 // cond: 0 <= c && c < 32 10557 // result: (SRLconst x [c]) 10558 for { 10559 x := v_0 10560 if v_1.Op != OpARMMOVWconst { 10561 break 10562 } 10563 c := auxIntToInt32(v_1.AuxInt) 10564 if !(0 <= c && c < 32) { 10565 break 10566 } 10567 v.reset(OpARMSRLconst) 10568 v.AuxInt = int32ToAuxInt(c) 10569 v.AddArg(x) 10570 return true 10571 } 10572 return false 10573 } 10574 func rewriteValueARM_OpARMSRLconst(v *Value) bool { 10575 v_0 := v.Args[0] 10576 // match: (SRLconst [c] (MOVWconst [d])) 10577 // result: (MOVWconst [int32(uint32(d)>>uint64(c))]) 10578 for { 10579 c := auxIntToInt32(v.AuxInt) 10580 if v_0.Op != OpARMMOVWconst { 10581 break 10582 } 10583 d := auxIntToInt32(v_0.AuxInt) 10584 v.reset(OpARMMOVWconst) 10585 v.AuxInt = int32ToAuxInt(int32(uint32(d) >> uint64(c))) 10586 return true 10587 } 10588 // match: (SRLconst (SLLconst x [c]) [d]) 10589 // cond: buildcfg.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 10590 // result: (BFXU [(d-c)|(32-d)<<8] x) 10591 for { 10592 d := auxIntToInt32(v.AuxInt) 10593 if v_0.Op != OpARMSLLconst { 10594 break 10595 } 10596 c := auxIntToInt32(v_0.AuxInt) 10597 x := v_0.Args[0] 10598 if !(buildcfg.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 10599 break 10600 } 10601 v.reset(OpARMBFXU) 10602 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8) 10603 v.AddArg(x) 10604 return true 10605 } 10606 return false 10607 } 10608 func rewriteValueARM_OpARMSRR(v *Value) bool { 10609 v_1 := v.Args[1] 10610 v_0 := v.Args[0] 10611 // match: (SRR x (MOVWconst [c])) 10612 // result: (SRRconst x [c&31]) 10613 for { 10614 x := v_0 10615 if v_1.Op != OpARMMOVWconst { 10616 break 10617 } 10618 c := auxIntToInt32(v_1.AuxInt) 10619 v.reset(OpARMSRRconst) 10620 v.AuxInt = int32ToAuxInt(c & 31) 10621 v.AddArg(x) 10622 return true 10623 } 10624 return false 10625 } 10626 func rewriteValueARM_OpARMSUB(v *Value) bool { 10627 v_1 := v.Args[1] 10628 v_0 := v.Args[0] 10629 // match: (SUB (MOVWconst [c]) x) 10630 // result: (RSBconst [c] x) 10631 for { 10632 if v_0.Op != OpARMMOVWconst { 10633 break 10634 } 10635 c := auxIntToInt32(v_0.AuxInt) 10636 x := v_1 10637 v.reset(OpARMRSBconst) 10638 v.AuxInt = int32ToAuxInt(c) 10639 v.AddArg(x) 10640 return true 10641 } 10642 // match: (SUB x (MOVWconst [c])) 10643 // result: (SUBconst [c] x) 10644 for { 10645 x := v_0 10646 if v_1.Op != OpARMMOVWconst { 10647 break 10648 } 10649 c := auxIntToInt32(v_1.AuxInt) 10650 v.reset(OpARMSUBconst) 10651 v.AuxInt = int32ToAuxInt(c) 10652 v.AddArg(x) 10653 return true 10654 } 10655 // match: (SUB x (SLLconst [c] y)) 10656 // result: (SUBshiftLL x y [c]) 10657 for { 10658 x := v_0 10659 if v_1.Op != OpARMSLLconst { 10660 break 10661 } 10662 c := auxIntToInt32(v_1.AuxInt) 10663 y := v_1.Args[0] 10664 v.reset(OpARMSUBshiftLL) 10665 v.AuxInt = int32ToAuxInt(c) 10666 v.AddArg2(x, y) 10667 return true 10668 } 10669 // match: (SUB (SLLconst [c] y) x) 10670 // result: (RSBshiftLL x y [c]) 10671 for { 10672 if v_0.Op != OpARMSLLconst { 10673 break 10674 } 10675 c := auxIntToInt32(v_0.AuxInt) 10676 y := v_0.Args[0] 10677 x := v_1 10678 v.reset(OpARMRSBshiftLL) 10679 v.AuxInt = int32ToAuxInt(c) 10680 v.AddArg2(x, y) 10681 return true 10682 } 10683 // match: (SUB x (SRLconst [c] y)) 10684 // result: (SUBshiftRL x y [c]) 10685 for { 10686 x := v_0 10687 if v_1.Op != OpARMSRLconst { 10688 break 10689 } 10690 c := auxIntToInt32(v_1.AuxInt) 10691 y := v_1.Args[0] 10692 v.reset(OpARMSUBshiftRL) 10693 v.AuxInt = int32ToAuxInt(c) 10694 v.AddArg2(x, y) 10695 return true 10696 } 10697 // match: (SUB (SRLconst [c] y) x) 10698 // result: (RSBshiftRL x y [c]) 10699 for { 10700 if v_0.Op != OpARMSRLconst { 10701 break 10702 } 10703 c := auxIntToInt32(v_0.AuxInt) 10704 y := v_0.Args[0] 10705 x := v_1 10706 v.reset(OpARMRSBshiftRL) 10707 v.AuxInt = int32ToAuxInt(c) 10708 v.AddArg2(x, y) 10709 return true 10710 } 10711 // match: (SUB x (SRAconst [c] y)) 10712 // result: (SUBshiftRA x y [c]) 10713 for { 10714 x := v_0 10715 if v_1.Op != OpARMSRAconst { 10716 break 10717 } 10718 c := auxIntToInt32(v_1.AuxInt) 10719 y := v_1.Args[0] 10720 v.reset(OpARMSUBshiftRA) 10721 v.AuxInt = int32ToAuxInt(c) 10722 v.AddArg2(x, y) 10723 return true 10724 } 10725 // match: (SUB (SRAconst [c] y) x) 10726 // result: (RSBshiftRA x y [c]) 10727 for { 10728 if v_0.Op != OpARMSRAconst { 10729 break 10730 } 10731 c := auxIntToInt32(v_0.AuxInt) 10732 y := v_0.Args[0] 10733 x := v_1 10734 v.reset(OpARMRSBshiftRA) 10735 v.AuxInt = int32ToAuxInt(c) 10736 v.AddArg2(x, y) 10737 return true 10738 } 10739 // match: (SUB x (SLL y z)) 10740 // result: (SUBshiftLLreg x y z) 10741 for { 10742 x := v_0 10743 if v_1.Op != OpARMSLL { 10744 break 10745 } 10746 z := v_1.Args[1] 10747 y := v_1.Args[0] 10748 v.reset(OpARMSUBshiftLLreg) 10749 v.AddArg3(x, y, z) 10750 return true 10751 } 10752 // match: (SUB (SLL y z) x) 10753 // result: (RSBshiftLLreg x y z) 10754 for { 10755 if v_0.Op != OpARMSLL { 10756 break 10757 } 10758 z := v_0.Args[1] 10759 y := v_0.Args[0] 10760 x := v_1 10761 v.reset(OpARMRSBshiftLLreg) 10762 v.AddArg3(x, y, z) 10763 return true 10764 } 10765 // match: (SUB x (SRL y z)) 10766 // result: (SUBshiftRLreg x y z) 10767 for { 10768 x := v_0 10769 if v_1.Op != OpARMSRL { 10770 break 10771 } 10772 z := v_1.Args[1] 10773 y := v_1.Args[0] 10774 v.reset(OpARMSUBshiftRLreg) 10775 v.AddArg3(x, y, z) 10776 return true 10777 } 10778 // match: (SUB (SRL y z) x) 10779 // result: (RSBshiftRLreg x y z) 10780 for { 10781 if v_0.Op != OpARMSRL { 10782 break 10783 } 10784 z := v_0.Args[1] 10785 y := v_0.Args[0] 10786 x := v_1 10787 v.reset(OpARMRSBshiftRLreg) 10788 v.AddArg3(x, y, z) 10789 return true 10790 } 10791 // match: (SUB x (SRA y z)) 10792 // result: (SUBshiftRAreg x y z) 10793 for { 10794 x := v_0 10795 if v_1.Op != OpARMSRA { 10796 break 10797 } 10798 z := v_1.Args[1] 10799 y := v_1.Args[0] 10800 v.reset(OpARMSUBshiftRAreg) 10801 v.AddArg3(x, y, z) 10802 return true 10803 } 10804 // match: (SUB (SRA y z) x) 10805 // result: (RSBshiftRAreg x y z) 10806 for { 10807 if v_0.Op != OpARMSRA { 10808 break 10809 } 10810 z := v_0.Args[1] 10811 y := v_0.Args[0] 10812 x := v_1 10813 v.reset(OpARMRSBshiftRAreg) 10814 v.AddArg3(x, y, z) 10815 return true 10816 } 10817 // match: (SUB x x) 10818 // result: (MOVWconst [0]) 10819 for { 10820 x := v_0 10821 if x != v_1 { 10822 break 10823 } 10824 v.reset(OpARMMOVWconst) 10825 v.AuxInt = int32ToAuxInt(0) 10826 return true 10827 } 10828 // match: (SUB a (MUL x y)) 10829 // cond: buildcfg.GOARM == 7 10830 // result: (MULS x y a) 10831 for { 10832 a := v_0 10833 if v_1.Op != OpARMMUL { 10834 break 10835 } 10836 y := v_1.Args[1] 10837 x := v_1.Args[0] 10838 if !(buildcfg.GOARM == 7) { 10839 break 10840 } 10841 v.reset(OpARMMULS) 10842 v.AddArg3(x, y, a) 10843 return true 10844 } 10845 return false 10846 } 10847 func rewriteValueARM_OpARMSUBD(v *Value) bool { 10848 v_1 := v.Args[1] 10849 v_0 := v.Args[0] 10850 // match: (SUBD a (MULD x y)) 10851 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 10852 // result: (MULSD a x y) 10853 for { 10854 a := v_0 10855 if v_1.Op != OpARMMULD { 10856 break 10857 } 10858 y := v_1.Args[1] 10859 x := v_1.Args[0] 10860 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 10861 break 10862 } 10863 v.reset(OpARMMULSD) 10864 v.AddArg3(a, x, y) 10865 return true 10866 } 10867 // match: (SUBD a (NMULD x y)) 10868 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 10869 // result: (MULAD a x y) 10870 for { 10871 a := v_0 10872 if v_1.Op != OpARMNMULD { 10873 break 10874 } 10875 y := v_1.Args[1] 10876 x := v_1.Args[0] 10877 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 10878 break 10879 } 10880 v.reset(OpARMMULAD) 10881 v.AddArg3(a, x, y) 10882 return true 10883 } 10884 return false 10885 } 10886 func rewriteValueARM_OpARMSUBF(v *Value) bool { 10887 v_1 := v.Args[1] 10888 v_0 := v.Args[0] 10889 // match: (SUBF a (MULF x y)) 10890 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 10891 // result: (MULSF a x y) 10892 for { 10893 a := v_0 10894 if v_1.Op != OpARMMULF { 10895 break 10896 } 10897 y := v_1.Args[1] 10898 x := v_1.Args[0] 10899 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 10900 break 10901 } 10902 v.reset(OpARMMULSF) 10903 v.AddArg3(a, x, y) 10904 return true 10905 } 10906 // match: (SUBF a (NMULF x y)) 10907 // cond: a.Uses == 1 && buildcfg.GOARM >= 6 10908 // result: (MULAF a x y) 10909 for { 10910 a := v_0 10911 if v_1.Op != OpARMNMULF { 10912 break 10913 } 10914 y := v_1.Args[1] 10915 x := v_1.Args[0] 10916 if !(a.Uses == 1 && buildcfg.GOARM >= 6) { 10917 break 10918 } 10919 v.reset(OpARMMULAF) 10920 v.AddArg3(a, x, y) 10921 return true 10922 } 10923 return false 10924 } 10925 func rewriteValueARM_OpARMSUBS(v *Value) bool { 10926 v_1 := v.Args[1] 10927 v_0 := v.Args[0] 10928 // match: (SUBS x (MOVWconst [c])) 10929 // result: (SUBSconst [c] x) 10930 for { 10931 x := v_0 10932 if v_1.Op != OpARMMOVWconst { 10933 break 10934 } 10935 c := auxIntToInt32(v_1.AuxInt) 10936 v.reset(OpARMSUBSconst) 10937 v.AuxInt = int32ToAuxInt(c) 10938 v.AddArg(x) 10939 return true 10940 } 10941 // match: (SUBS x (SLLconst [c] y)) 10942 // result: (SUBSshiftLL x y [c]) 10943 for { 10944 x := v_0 10945 if v_1.Op != OpARMSLLconst { 10946 break 10947 } 10948 c := auxIntToInt32(v_1.AuxInt) 10949 y := v_1.Args[0] 10950 v.reset(OpARMSUBSshiftLL) 10951 v.AuxInt = int32ToAuxInt(c) 10952 v.AddArg2(x, y) 10953 return true 10954 } 10955 // match: (SUBS (SLLconst [c] y) x) 10956 // result: (RSBSshiftLL x y [c]) 10957 for { 10958 if v_0.Op != OpARMSLLconst { 10959 break 10960 } 10961 c := auxIntToInt32(v_0.AuxInt) 10962 y := v_0.Args[0] 10963 x := v_1 10964 v.reset(OpARMRSBSshiftLL) 10965 v.AuxInt = int32ToAuxInt(c) 10966 v.AddArg2(x, y) 10967 return true 10968 } 10969 // match: (SUBS x (SRLconst [c] y)) 10970 // result: (SUBSshiftRL x y [c]) 10971 for { 10972 x := v_0 10973 if v_1.Op != OpARMSRLconst { 10974 break 10975 } 10976 c := auxIntToInt32(v_1.AuxInt) 10977 y := v_1.Args[0] 10978 v.reset(OpARMSUBSshiftRL) 10979 v.AuxInt = int32ToAuxInt(c) 10980 v.AddArg2(x, y) 10981 return true 10982 } 10983 // match: (SUBS (SRLconst [c] y) x) 10984 // result: (RSBSshiftRL x y [c]) 10985 for { 10986 if v_0.Op != OpARMSRLconst { 10987 break 10988 } 10989 c := auxIntToInt32(v_0.AuxInt) 10990 y := v_0.Args[0] 10991 x := v_1 10992 v.reset(OpARMRSBSshiftRL) 10993 v.AuxInt = int32ToAuxInt(c) 10994 v.AddArg2(x, y) 10995 return true 10996 } 10997 // match: (SUBS x (SRAconst [c] y)) 10998 // result: (SUBSshiftRA x y [c]) 10999 for { 11000 x := v_0 11001 if v_1.Op != OpARMSRAconst { 11002 break 11003 } 11004 c := auxIntToInt32(v_1.AuxInt) 11005 y := v_1.Args[0] 11006 v.reset(OpARMSUBSshiftRA) 11007 v.AuxInt = int32ToAuxInt(c) 11008 v.AddArg2(x, y) 11009 return true 11010 } 11011 // match: (SUBS (SRAconst [c] y) x) 11012 // result: (RSBSshiftRA x y [c]) 11013 for { 11014 if v_0.Op != OpARMSRAconst { 11015 break 11016 } 11017 c := auxIntToInt32(v_0.AuxInt) 11018 y := v_0.Args[0] 11019 x := v_1 11020 v.reset(OpARMRSBSshiftRA) 11021 v.AuxInt = int32ToAuxInt(c) 11022 v.AddArg2(x, y) 11023 return true 11024 } 11025 // match: (SUBS x (SLL y z)) 11026 // result: (SUBSshiftLLreg x y z) 11027 for { 11028 x := v_0 11029 if v_1.Op != OpARMSLL { 11030 break 11031 } 11032 z := v_1.Args[1] 11033 y := v_1.Args[0] 11034 v.reset(OpARMSUBSshiftLLreg) 11035 v.AddArg3(x, y, z) 11036 return true 11037 } 11038 // match: (SUBS (SLL y z) x) 11039 // result: (RSBSshiftLLreg x y z) 11040 for { 11041 if v_0.Op != OpARMSLL { 11042 break 11043 } 11044 z := v_0.Args[1] 11045 y := v_0.Args[0] 11046 x := v_1 11047 v.reset(OpARMRSBSshiftLLreg) 11048 v.AddArg3(x, y, z) 11049 return true 11050 } 11051 // match: (SUBS x (SRL y z)) 11052 // result: (SUBSshiftRLreg x y z) 11053 for { 11054 x := v_0 11055 if v_1.Op != OpARMSRL { 11056 break 11057 } 11058 z := v_1.Args[1] 11059 y := v_1.Args[0] 11060 v.reset(OpARMSUBSshiftRLreg) 11061 v.AddArg3(x, y, z) 11062 return true 11063 } 11064 // match: (SUBS (SRL y z) x) 11065 // result: (RSBSshiftRLreg x y z) 11066 for { 11067 if v_0.Op != OpARMSRL { 11068 break 11069 } 11070 z := v_0.Args[1] 11071 y := v_0.Args[0] 11072 x := v_1 11073 v.reset(OpARMRSBSshiftRLreg) 11074 v.AddArg3(x, y, z) 11075 return true 11076 } 11077 // match: (SUBS x (SRA y z)) 11078 // result: (SUBSshiftRAreg x y z) 11079 for { 11080 x := v_0 11081 if v_1.Op != OpARMSRA { 11082 break 11083 } 11084 z := v_1.Args[1] 11085 y := v_1.Args[0] 11086 v.reset(OpARMSUBSshiftRAreg) 11087 v.AddArg3(x, y, z) 11088 return true 11089 } 11090 // match: (SUBS (SRA y z) x) 11091 // result: (RSBSshiftRAreg x y z) 11092 for { 11093 if v_0.Op != OpARMSRA { 11094 break 11095 } 11096 z := v_0.Args[1] 11097 y := v_0.Args[0] 11098 x := v_1 11099 v.reset(OpARMRSBSshiftRAreg) 11100 v.AddArg3(x, y, z) 11101 return true 11102 } 11103 return false 11104 } 11105 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool { 11106 v_1 := v.Args[1] 11107 v_0 := v.Args[0] 11108 b := v.Block 11109 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11110 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11111 for { 11112 d := auxIntToInt32(v.AuxInt) 11113 if v_0.Op != OpARMMOVWconst { 11114 break 11115 } 11116 c := auxIntToInt32(v_0.AuxInt) 11117 x := v_1 11118 v.reset(OpARMRSBSconst) 11119 v.AuxInt = int32ToAuxInt(c) 11120 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11121 v0.AuxInt = int32ToAuxInt(d) 11122 v0.AddArg(x) 11123 v.AddArg(v0) 11124 return true 11125 } 11126 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11127 // result: (SUBSconst x [c<<uint64(d)]) 11128 for { 11129 d := auxIntToInt32(v.AuxInt) 11130 x := v_0 11131 if v_1.Op != OpARMMOVWconst { 11132 break 11133 } 11134 c := auxIntToInt32(v_1.AuxInt) 11135 v.reset(OpARMSUBSconst) 11136 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11137 v.AddArg(x) 11138 return true 11139 } 11140 return false 11141 } 11142 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool { 11143 v_2 := v.Args[2] 11144 v_1 := v.Args[1] 11145 v_0 := v.Args[0] 11146 b := v.Block 11147 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11148 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11149 for { 11150 if v_0.Op != OpARMMOVWconst { 11151 break 11152 } 11153 c := auxIntToInt32(v_0.AuxInt) 11154 x := v_1 11155 y := v_2 11156 v.reset(OpARMRSBSconst) 11157 v.AuxInt = int32ToAuxInt(c) 11158 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11159 v0.AddArg2(x, y) 11160 v.AddArg(v0) 11161 return true 11162 } 11163 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11164 // cond: 0 <= c && c < 32 11165 // result: (SUBSshiftLL x y [c]) 11166 for { 11167 x := v_0 11168 y := v_1 11169 if v_2.Op != OpARMMOVWconst { 11170 break 11171 } 11172 c := auxIntToInt32(v_2.AuxInt) 11173 if !(0 <= c && c < 32) { 11174 break 11175 } 11176 v.reset(OpARMSUBSshiftLL) 11177 v.AuxInt = int32ToAuxInt(c) 11178 v.AddArg2(x, y) 11179 return true 11180 } 11181 return false 11182 } 11183 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool { 11184 v_1 := v.Args[1] 11185 v_0 := v.Args[0] 11186 b := v.Block 11187 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11188 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11189 for { 11190 d := auxIntToInt32(v.AuxInt) 11191 if v_0.Op != OpARMMOVWconst { 11192 break 11193 } 11194 c := auxIntToInt32(v_0.AuxInt) 11195 x := v_1 11196 v.reset(OpARMRSBSconst) 11197 v.AuxInt = int32ToAuxInt(c) 11198 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11199 v0.AuxInt = int32ToAuxInt(d) 11200 v0.AddArg(x) 11201 v.AddArg(v0) 11202 return true 11203 } 11204 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11205 // result: (SUBSconst x [c>>uint64(d)]) 11206 for { 11207 d := auxIntToInt32(v.AuxInt) 11208 x := v_0 11209 if v_1.Op != OpARMMOVWconst { 11210 break 11211 } 11212 c := auxIntToInt32(v_1.AuxInt) 11213 v.reset(OpARMSUBSconst) 11214 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11215 v.AddArg(x) 11216 return true 11217 } 11218 return false 11219 } 11220 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool { 11221 v_2 := v.Args[2] 11222 v_1 := v.Args[1] 11223 v_0 := v.Args[0] 11224 b := v.Block 11225 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11226 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11227 for { 11228 if v_0.Op != OpARMMOVWconst { 11229 break 11230 } 11231 c := auxIntToInt32(v_0.AuxInt) 11232 x := v_1 11233 y := v_2 11234 v.reset(OpARMRSBSconst) 11235 v.AuxInt = int32ToAuxInt(c) 11236 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11237 v0.AddArg2(x, y) 11238 v.AddArg(v0) 11239 return true 11240 } 11241 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11242 // cond: 0 <= c && c < 32 11243 // result: (SUBSshiftRA x y [c]) 11244 for { 11245 x := v_0 11246 y := v_1 11247 if v_2.Op != OpARMMOVWconst { 11248 break 11249 } 11250 c := auxIntToInt32(v_2.AuxInt) 11251 if !(0 <= c && c < 32) { 11252 break 11253 } 11254 v.reset(OpARMSUBSshiftRA) 11255 v.AuxInt = int32ToAuxInt(c) 11256 v.AddArg2(x, y) 11257 return true 11258 } 11259 return false 11260 } 11261 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool { 11262 v_1 := v.Args[1] 11263 v_0 := v.Args[0] 11264 b := v.Block 11265 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11266 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11267 for { 11268 d := auxIntToInt32(v.AuxInt) 11269 if v_0.Op != OpARMMOVWconst { 11270 break 11271 } 11272 c := auxIntToInt32(v_0.AuxInt) 11273 x := v_1 11274 v.reset(OpARMRSBSconst) 11275 v.AuxInt = int32ToAuxInt(c) 11276 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11277 v0.AuxInt = int32ToAuxInt(d) 11278 v0.AddArg(x) 11279 v.AddArg(v0) 11280 return true 11281 } 11282 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11283 // result: (SUBSconst x [int32(uint32(c)>>uint64(d))]) 11284 for { 11285 d := auxIntToInt32(v.AuxInt) 11286 x := v_0 11287 if v_1.Op != OpARMMOVWconst { 11288 break 11289 } 11290 c := auxIntToInt32(v_1.AuxInt) 11291 v.reset(OpARMSUBSconst) 11292 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 11293 v.AddArg(x) 11294 return true 11295 } 11296 return false 11297 } 11298 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool { 11299 v_2 := v.Args[2] 11300 v_1 := v.Args[1] 11301 v_0 := v.Args[0] 11302 b := v.Block 11303 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11304 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11305 for { 11306 if v_0.Op != OpARMMOVWconst { 11307 break 11308 } 11309 c := auxIntToInt32(v_0.AuxInt) 11310 x := v_1 11311 y := v_2 11312 v.reset(OpARMRSBSconst) 11313 v.AuxInt = int32ToAuxInt(c) 11314 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11315 v0.AddArg2(x, y) 11316 v.AddArg(v0) 11317 return true 11318 } 11319 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11320 // cond: 0 <= c && c < 32 11321 // result: (SUBSshiftRL x y [c]) 11322 for { 11323 x := v_0 11324 y := v_1 11325 if v_2.Op != OpARMMOVWconst { 11326 break 11327 } 11328 c := auxIntToInt32(v_2.AuxInt) 11329 if !(0 <= c && c < 32) { 11330 break 11331 } 11332 v.reset(OpARMSUBSshiftRL) 11333 v.AuxInt = int32ToAuxInt(c) 11334 v.AddArg2(x, y) 11335 return true 11336 } 11337 return false 11338 } 11339 func rewriteValueARM_OpARMSUBconst(v *Value) bool { 11340 v_0 := v.Args[0] 11341 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 11342 // result: (MOVWaddr [off2-off1] {sym} ptr) 11343 for { 11344 off1 := auxIntToInt32(v.AuxInt) 11345 if v_0.Op != OpARMMOVWaddr { 11346 break 11347 } 11348 off2 := auxIntToInt32(v_0.AuxInt) 11349 sym := auxToSym(v_0.Aux) 11350 ptr := v_0.Args[0] 11351 v.reset(OpARMMOVWaddr) 11352 v.AuxInt = int32ToAuxInt(off2 - off1) 11353 v.Aux = symToAux(sym) 11354 v.AddArg(ptr) 11355 return true 11356 } 11357 // match: (SUBconst [0] x) 11358 // result: x 11359 for { 11360 if auxIntToInt32(v.AuxInt) != 0 { 11361 break 11362 } 11363 x := v_0 11364 v.copyOf(x) 11365 return true 11366 } 11367 // match: (SUBconst [c] x) 11368 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 11369 // result: (ADDconst [-c] x) 11370 for { 11371 c := auxIntToInt32(v.AuxInt) 11372 x := v_0 11373 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 11374 break 11375 } 11376 v.reset(OpARMADDconst) 11377 v.AuxInt = int32ToAuxInt(-c) 11378 v.AddArg(x) 11379 return true 11380 } 11381 // match: (SUBconst [c] x) 11382 // cond: buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 11383 // result: (ADDconst [-c] x) 11384 for { 11385 c := auxIntToInt32(v.AuxInt) 11386 x := v_0 11387 if !(buildcfg.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 11388 break 11389 } 11390 v.reset(OpARMADDconst) 11391 v.AuxInt = int32ToAuxInt(-c) 11392 v.AddArg(x) 11393 return true 11394 } 11395 // match: (SUBconst [c] (MOVWconst [d])) 11396 // result: (MOVWconst [d-c]) 11397 for { 11398 c := auxIntToInt32(v.AuxInt) 11399 if v_0.Op != OpARMMOVWconst { 11400 break 11401 } 11402 d := auxIntToInt32(v_0.AuxInt) 11403 v.reset(OpARMMOVWconst) 11404 v.AuxInt = int32ToAuxInt(d - c) 11405 return true 11406 } 11407 // match: (SUBconst [c] (SUBconst [d] x)) 11408 // result: (ADDconst [-c-d] x) 11409 for { 11410 c := auxIntToInt32(v.AuxInt) 11411 if v_0.Op != OpARMSUBconst { 11412 break 11413 } 11414 d := auxIntToInt32(v_0.AuxInt) 11415 x := v_0.Args[0] 11416 v.reset(OpARMADDconst) 11417 v.AuxInt = int32ToAuxInt(-c - d) 11418 v.AddArg(x) 11419 return true 11420 } 11421 // match: (SUBconst [c] (ADDconst [d] x)) 11422 // result: (ADDconst [-c+d] x) 11423 for { 11424 c := auxIntToInt32(v.AuxInt) 11425 if v_0.Op != OpARMADDconst { 11426 break 11427 } 11428 d := auxIntToInt32(v_0.AuxInt) 11429 x := v_0.Args[0] 11430 v.reset(OpARMADDconst) 11431 v.AuxInt = int32ToAuxInt(-c + d) 11432 v.AddArg(x) 11433 return true 11434 } 11435 // match: (SUBconst [c] (RSBconst [d] x)) 11436 // result: (RSBconst [-c+d] x) 11437 for { 11438 c := auxIntToInt32(v.AuxInt) 11439 if v_0.Op != OpARMRSBconst { 11440 break 11441 } 11442 d := auxIntToInt32(v_0.AuxInt) 11443 x := v_0.Args[0] 11444 v.reset(OpARMRSBconst) 11445 v.AuxInt = int32ToAuxInt(-c + d) 11446 v.AddArg(x) 11447 return true 11448 } 11449 return false 11450 } 11451 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool { 11452 v_1 := v.Args[1] 11453 v_0 := v.Args[0] 11454 b := v.Block 11455 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11456 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11457 for { 11458 d := auxIntToInt32(v.AuxInt) 11459 if v_0.Op != OpARMMOVWconst { 11460 break 11461 } 11462 c := auxIntToInt32(v_0.AuxInt) 11463 x := v_1 11464 v.reset(OpARMRSBconst) 11465 v.AuxInt = int32ToAuxInt(c) 11466 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11467 v0.AuxInt = int32ToAuxInt(d) 11468 v0.AddArg(x) 11469 v.AddArg(v0) 11470 return true 11471 } 11472 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11473 // result: (SUBconst x [c<<uint64(d)]) 11474 for { 11475 d := auxIntToInt32(v.AuxInt) 11476 x := v_0 11477 if v_1.Op != OpARMMOVWconst { 11478 break 11479 } 11480 c := auxIntToInt32(v_1.AuxInt) 11481 v.reset(OpARMSUBconst) 11482 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11483 v.AddArg(x) 11484 return true 11485 } 11486 // match: (SUBshiftLL (SLLconst x [c]) x [c]) 11487 // result: (MOVWconst [0]) 11488 for { 11489 c := auxIntToInt32(v.AuxInt) 11490 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 11491 break 11492 } 11493 x := v_0.Args[0] 11494 if x != v_1 { 11495 break 11496 } 11497 v.reset(OpARMMOVWconst) 11498 v.AuxInt = int32ToAuxInt(0) 11499 return true 11500 } 11501 return false 11502 } 11503 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool { 11504 v_2 := v.Args[2] 11505 v_1 := v.Args[1] 11506 v_0 := v.Args[0] 11507 b := v.Block 11508 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 11509 // result: (RSBconst [c] (SLL <x.Type> x y)) 11510 for { 11511 if v_0.Op != OpARMMOVWconst { 11512 break 11513 } 11514 c := auxIntToInt32(v_0.AuxInt) 11515 x := v_1 11516 y := v_2 11517 v.reset(OpARMRSBconst) 11518 v.AuxInt = int32ToAuxInt(c) 11519 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11520 v0.AddArg2(x, y) 11521 v.AddArg(v0) 11522 return true 11523 } 11524 // match: (SUBshiftLLreg x y (MOVWconst [c])) 11525 // cond: 0 <= c && c < 32 11526 // result: (SUBshiftLL x y [c]) 11527 for { 11528 x := v_0 11529 y := v_1 11530 if v_2.Op != OpARMMOVWconst { 11531 break 11532 } 11533 c := auxIntToInt32(v_2.AuxInt) 11534 if !(0 <= c && c < 32) { 11535 break 11536 } 11537 v.reset(OpARMSUBshiftLL) 11538 v.AuxInt = int32ToAuxInt(c) 11539 v.AddArg2(x, y) 11540 return true 11541 } 11542 return false 11543 } 11544 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool { 11545 v_1 := v.Args[1] 11546 v_0 := v.Args[0] 11547 b := v.Block 11548 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 11549 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 11550 for { 11551 d := auxIntToInt32(v.AuxInt) 11552 if v_0.Op != OpARMMOVWconst { 11553 break 11554 } 11555 c := auxIntToInt32(v_0.AuxInt) 11556 x := v_1 11557 v.reset(OpARMRSBconst) 11558 v.AuxInt = int32ToAuxInt(c) 11559 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11560 v0.AuxInt = int32ToAuxInt(d) 11561 v0.AddArg(x) 11562 v.AddArg(v0) 11563 return true 11564 } 11565 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 11566 // result: (SUBconst x [c>>uint64(d)]) 11567 for { 11568 d := auxIntToInt32(v.AuxInt) 11569 x := v_0 11570 if v_1.Op != OpARMMOVWconst { 11571 break 11572 } 11573 c := auxIntToInt32(v_1.AuxInt) 11574 v.reset(OpARMSUBconst) 11575 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11576 v.AddArg(x) 11577 return true 11578 } 11579 // match: (SUBshiftRA (SRAconst x [c]) x [c]) 11580 // result: (MOVWconst [0]) 11581 for { 11582 c := auxIntToInt32(v.AuxInt) 11583 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 11584 break 11585 } 11586 x := v_0.Args[0] 11587 if x != v_1 { 11588 break 11589 } 11590 v.reset(OpARMMOVWconst) 11591 v.AuxInt = int32ToAuxInt(0) 11592 return true 11593 } 11594 return false 11595 } 11596 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool { 11597 v_2 := v.Args[2] 11598 v_1 := v.Args[1] 11599 v_0 := v.Args[0] 11600 b := v.Block 11601 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 11602 // result: (RSBconst [c] (SRA <x.Type> x y)) 11603 for { 11604 if v_0.Op != OpARMMOVWconst { 11605 break 11606 } 11607 c := auxIntToInt32(v_0.AuxInt) 11608 x := v_1 11609 y := v_2 11610 v.reset(OpARMRSBconst) 11611 v.AuxInt = int32ToAuxInt(c) 11612 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11613 v0.AddArg2(x, y) 11614 v.AddArg(v0) 11615 return true 11616 } 11617 // match: (SUBshiftRAreg x y (MOVWconst [c])) 11618 // cond: 0 <= c && c < 32 11619 // result: (SUBshiftRA x y [c]) 11620 for { 11621 x := v_0 11622 y := v_1 11623 if v_2.Op != OpARMMOVWconst { 11624 break 11625 } 11626 c := auxIntToInt32(v_2.AuxInt) 11627 if !(0 <= c && c < 32) { 11628 break 11629 } 11630 v.reset(OpARMSUBshiftRA) 11631 v.AuxInt = int32ToAuxInt(c) 11632 v.AddArg2(x, y) 11633 return true 11634 } 11635 return false 11636 } 11637 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool { 11638 v_1 := v.Args[1] 11639 v_0 := v.Args[0] 11640 b := v.Block 11641 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 11642 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 11643 for { 11644 d := auxIntToInt32(v.AuxInt) 11645 if v_0.Op != OpARMMOVWconst { 11646 break 11647 } 11648 c := auxIntToInt32(v_0.AuxInt) 11649 x := v_1 11650 v.reset(OpARMRSBconst) 11651 v.AuxInt = int32ToAuxInt(c) 11652 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11653 v0.AuxInt = int32ToAuxInt(d) 11654 v0.AddArg(x) 11655 v.AddArg(v0) 11656 return true 11657 } 11658 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 11659 // result: (SUBconst x [int32(uint32(c)>>uint64(d))]) 11660 for { 11661 d := auxIntToInt32(v.AuxInt) 11662 x := v_0 11663 if v_1.Op != OpARMMOVWconst { 11664 break 11665 } 11666 c := auxIntToInt32(v_1.AuxInt) 11667 v.reset(OpARMSUBconst) 11668 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 11669 v.AddArg(x) 11670 return true 11671 } 11672 // match: (SUBshiftRL (SRLconst x [c]) x [c]) 11673 // result: (MOVWconst [0]) 11674 for { 11675 c := auxIntToInt32(v.AuxInt) 11676 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 11677 break 11678 } 11679 x := v_0.Args[0] 11680 if x != v_1 { 11681 break 11682 } 11683 v.reset(OpARMMOVWconst) 11684 v.AuxInt = int32ToAuxInt(0) 11685 return true 11686 } 11687 return false 11688 } 11689 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool { 11690 v_2 := v.Args[2] 11691 v_1 := v.Args[1] 11692 v_0 := v.Args[0] 11693 b := v.Block 11694 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 11695 // result: (RSBconst [c] (SRL <x.Type> x y)) 11696 for { 11697 if v_0.Op != OpARMMOVWconst { 11698 break 11699 } 11700 c := auxIntToInt32(v_0.AuxInt) 11701 x := v_1 11702 y := v_2 11703 v.reset(OpARMRSBconst) 11704 v.AuxInt = int32ToAuxInt(c) 11705 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11706 v0.AddArg2(x, y) 11707 v.AddArg(v0) 11708 return true 11709 } 11710 // match: (SUBshiftRLreg x y (MOVWconst [c])) 11711 // cond: 0 <= c && c < 32 11712 // result: (SUBshiftRL x y [c]) 11713 for { 11714 x := v_0 11715 y := v_1 11716 if v_2.Op != OpARMMOVWconst { 11717 break 11718 } 11719 c := auxIntToInt32(v_2.AuxInt) 11720 if !(0 <= c && c < 32) { 11721 break 11722 } 11723 v.reset(OpARMSUBshiftRL) 11724 v.AuxInt = int32ToAuxInt(c) 11725 v.AddArg2(x, y) 11726 return true 11727 } 11728 return false 11729 } 11730 func rewriteValueARM_OpARMTEQ(v *Value) bool { 11731 v_1 := v.Args[1] 11732 v_0 := v.Args[0] 11733 // match: (TEQ x (MOVWconst [c])) 11734 // result: (TEQconst [c] x) 11735 for { 11736 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11737 x := v_0 11738 if v_1.Op != OpARMMOVWconst { 11739 continue 11740 } 11741 c := auxIntToInt32(v_1.AuxInt) 11742 v.reset(OpARMTEQconst) 11743 v.AuxInt = int32ToAuxInt(c) 11744 v.AddArg(x) 11745 return true 11746 } 11747 break 11748 } 11749 // match: (TEQ x (SLLconst [c] y)) 11750 // result: (TEQshiftLL x y [c]) 11751 for { 11752 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11753 x := v_0 11754 if v_1.Op != OpARMSLLconst { 11755 continue 11756 } 11757 c := auxIntToInt32(v_1.AuxInt) 11758 y := v_1.Args[0] 11759 v.reset(OpARMTEQshiftLL) 11760 v.AuxInt = int32ToAuxInt(c) 11761 v.AddArg2(x, y) 11762 return true 11763 } 11764 break 11765 } 11766 // match: (TEQ x (SRLconst [c] y)) 11767 // result: (TEQshiftRL x y [c]) 11768 for { 11769 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11770 x := v_0 11771 if v_1.Op != OpARMSRLconst { 11772 continue 11773 } 11774 c := auxIntToInt32(v_1.AuxInt) 11775 y := v_1.Args[0] 11776 v.reset(OpARMTEQshiftRL) 11777 v.AuxInt = int32ToAuxInt(c) 11778 v.AddArg2(x, y) 11779 return true 11780 } 11781 break 11782 } 11783 // match: (TEQ x (SRAconst [c] y)) 11784 // result: (TEQshiftRA x y [c]) 11785 for { 11786 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11787 x := v_0 11788 if v_1.Op != OpARMSRAconst { 11789 continue 11790 } 11791 c := auxIntToInt32(v_1.AuxInt) 11792 y := v_1.Args[0] 11793 v.reset(OpARMTEQshiftRA) 11794 v.AuxInt = int32ToAuxInt(c) 11795 v.AddArg2(x, y) 11796 return true 11797 } 11798 break 11799 } 11800 // match: (TEQ x (SLL y z)) 11801 // result: (TEQshiftLLreg x y z) 11802 for { 11803 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11804 x := v_0 11805 if v_1.Op != OpARMSLL { 11806 continue 11807 } 11808 z := v_1.Args[1] 11809 y := v_1.Args[0] 11810 v.reset(OpARMTEQshiftLLreg) 11811 v.AddArg3(x, y, z) 11812 return true 11813 } 11814 break 11815 } 11816 // match: (TEQ x (SRL y z)) 11817 // result: (TEQshiftRLreg x y z) 11818 for { 11819 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11820 x := v_0 11821 if v_1.Op != OpARMSRL { 11822 continue 11823 } 11824 z := v_1.Args[1] 11825 y := v_1.Args[0] 11826 v.reset(OpARMTEQshiftRLreg) 11827 v.AddArg3(x, y, z) 11828 return true 11829 } 11830 break 11831 } 11832 // match: (TEQ x (SRA y z)) 11833 // result: (TEQshiftRAreg x y z) 11834 for { 11835 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11836 x := v_0 11837 if v_1.Op != OpARMSRA { 11838 continue 11839 } 11840 z := v_1.Args[1] 11841 y := v_1.Args[0] 11842 v.reset(OpARMTEQshiftRAreg) 11843 v.AddArg3(x, y, z) 11844 return true 11845 } 11846 break 11847 } 11848 return false 11849 } 11850 func rewriteValueARM_OpARMTEQconst(v *Value) bool { 11851 v_0 := v.Args[0] 11852 // match: (TEQconst (MOVWconst [x]) [y]) 11853 // result: (FlagConstant [logicFlags32(x^y)]) 11854 for { 11855 y := auxIntToInt32(v.AuxInt) 11856 if v_0.Op != OpARMMOVWconst { 11857 break 11858 } 11859 x := auxIntToInt32(v_0.AuxInt) 11860 v.reset(OpARMFlagConstant) 11861 v.AuxInt = flagConstantToAuxInt(logicFlags32(x ^ y)) 11862 return true 11863 } 11864 return false 11865 } 11866 func rewriteValueARM_OpARMTEQshiftLL(v *Value) bool { 11867 v_1 := v.Args[1] 11868 v_0 := v.Args[0] 11869 b := v.Block 11870 // match: (TEQshiftLL (MOVWconst [c]) x [d]) 11871 // result: (TEQconst [c] (SLLconst <x.Type> x [d])) 11872 for { 11873 d := auxIntToInt32(v.AuxInt) 11874 if v_0.Op != OpARMMOVWconst { 11875 break 11876 } 11877 c := auxIntToInt32(v_0.AuxInt) 11878 x := v_1 11879 v.reset(OpARMTEQconst) 11880 v.AuxInt = int32ToAuxInt(c) 11881 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11882 v0.AuxInt = int32ToAuxInt(d) 11883 v0.AddArg(x) 11884 v.AddArg(v0) 11885 return true 11886 } 11887 // match: (TEQshiftLL x (MOVWconst [c]) [d]) 11888 // result: (TEQconst x [c<<uint64(d)]) 11889 for { 11890 d := auxIntToInt32(v.AuxInt) 11891 x := v_0 11892 if v_1.Op != OpARMMOVWconst { 11893 break 11894 } 11895 c := auxIntToInt32(v_1.AuxInt) 11896 v.reset(OpARMTEQconst) 11897 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11898 v.AddArg(x) 11899 return true 11900 } 11901 return false 11902 } 11903 func rewriteValueARM_OpARMTEQshiftLLreg(v *Value) bool { 11904 v_2 := v.Args[2] 11905 v_1 := v.Args[1] 11906 v_0 := v.Args[0] 11907 b := v.Block 11908 // match: (TEQshiftLLreg (MOVWconst [c]) x y) 11909 // result: (TEQconst [c] (SLL <x.Type> x y)) 11910 for { 11911 if v_0.Op != OpARMMOVWconst { 11912 break 11913 } 11914 c := auxIntToInt32(v_0.AuxInt) 11915 x := v_1 11916 y := v_2 11917 v.reset(OpARMTEQconst) 11918 v.AuxInt = int32ToAuxInt(c) 11919 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11920 v0.AddArg2(x, y) 11921 v.AddArg(v0) 11922 return true 11923 } 11924 // match: (TEQshiftLLreg x y (MOVWconst [c])) 11925 // cond: 0 <= c && c < 32 11926 // result: (TEQshiftLL x y [c]) 11927 for { 11928 x := v_0 11929 y := v_1 11930 if v_2.Op != OpARMMOVWconst { 11931 break 11932 } 11933 c := auxIntToInt32(v_2.AuxInt) 11934 if !(0 <= c && c < 32) { 11935 break 11936 } 11937 v.reset(OpARMTEQshiftLL) 11938 v.AuxInt = int32ToAuxInt(c) 11939 v.AddArg2(x, y) 11940 return true 11941 } 11942 return false 11943 } 11944 func rewriteValueARM_OpARMTEQshiftRA(v *Value) bool { 11945 v_1 := v.Args[1] 11946 v_0 := v.Args[0] 11947 b := v.Block 11948 // match: (TEQshiftRA (MOVWconst [c]) x [d]) 11949 // result: (TEQconst [c] (SRAconst <x.Type> x [d])) 11950 for { 11951 d := auxIntToInt32(v.AuxInt) 11952 if v_0.Op != OpARMMOVWconst { 11953 break 11954 } 11955 c := auxIntToInt32(v_0.AuxInt) 11956 x := v_1 11957 v.reset(OpARMTEQconst) 11958 v.AuxInt = int32ToAuxInt(c) 11959 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11960 v0.AuxInt = int32ToAuxInt(d) 11961 v0.AddArg(x) 11962 v.AddArg(v0) 11963 return true 11964 } 11965 // match: (TEQshiftRA x (MOVWconst [c]) [d]) 11966 // result: (TEQconst x [c>>uint64(d)]) 11967 for { 11968 d := auxIntToInt32(v.AuxInt) 11969 x := v_0 11970 if v_1.Op != OpARMMOVWconst { 11971 break 11972 } 11973 c := auxIntToInt32(v_1.AuxInt) 11974 v.reset(OpARMTEQconst) 11975 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11976 v.AddArg(x) 11977 return true 11978 } 11979 return false 11980 } 11981 func rewriteValueARM_OpARMTEQshiftRAreg(v *Value) bool { 11982 v_2 := v.Args[2] 11983 v_1 := v.Args[1] 11984 v_0 := v.Args[0] 11985 b := v.Block 11986 // match: (TEQshiftRAreg (MOVWconst [c]) x y) 11987 // result: (TEQconst [c] (SRA <x.Type> x y)) 11988 for { 11989 if v_0.Op != OpARMMOVWconst { 11990 break 11991 } 11992 c := auxIntToInt32(v_0.AuxInt) 11993 x := v_1 11994 y := v_2 11995 v.reset(OpARMTEQconst) 11996 v.AuxInt = int32ToAuxInt(c) 11997 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11998 v0.AddArg2(x, y) 11999 v.AddArg(v0) 12000 return true 12001 } 12002 // match: (TEQshiftRAreg x y (MOVWconst [c])) 12003 // cond: 0 <= c && c < 32 12004 // result: (TEQshiftRA x y [c]) 12005 for { 12006 x := v_0 12007 y := v_1 12008 if v_2.Op != OpARMMOVWconst { 12009 break 12010 } 12011 c := auxIntToInt32(v_2.AuxInt) 12012 if !(0 <= c && c < 32) { 12013 break 12014 } 12015 v.reset(OpARMTEQshiftRA) 12016 v.AuxInt = int32ToAuxInt(c) 12017 v.AddArg2(x, y) 12018 return true 12019 } 12020 return false 12021 } 12022 func rewriteValueARM_OpARMTEQshiftRL(v *Value) bool { 12023 v_1 := v.Args[1] 12024 v_0 := v.Args[0] 12025 b := v.Block 12026 // match: (TEQshiftRL (MOVWconst [c]) x [d]) 12027 // result: (TEQconst [c] (SRLconst <x.Type> x [d])) 12028 for { 12029 d := auxIntToInt32(v.AuxInt) 12030 if v_0.Op != OpARMMOVWconst { 12031 break 12032 } 12033 c := auxIntToInt32(v_0.AuxInt) 12034 x := v_1 12035 v.reset(OpARMTEQconst) 12036 v.AuxInt = int32ToAuxInt(c) 12037 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12038 v0.AuxInt = int32ToAuxInt(d) 12039 v0.AddArg(x) 12040 v.AddArg(v0) 12041 return true 12042 } 12043 // match: (TEQshiftRL x (MOVWconst [c]) [d]) 12044 // result: (TEQconst x [int32(uint32(c)>>uint64(d))]) 12045 for { 12046 d := auxIntToInt32(v.AuxInt) 12047 x := v_0 12048 if v_1.Op != OpARMMOVWconst { 12049 break 12050 } 12051 c := auxIntToInt32(v_1.AuxInt) 12052 v.reset(OpARMTEQconst) 12053 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12054 v.AddArg(x) 12055 return true 12056 } 12057 return false 12058 } 12059 func rewriteValueARM_OpARMTEQshiftRLreg(v *Value) bool { 12060 v_2 := v.Args[2] 12061 v_1 := v.Args[1] 12062 v_0 := v.Args[0] 12063 b := v.Block 12064 // match: (TEQshiftRLreg (MOVWconst [c]) x y) 12065 // result: (TEQconst [c] (SRL <x.Type> x y)) 12066 for { 12067 if v_0.Op != OpARMMOVWconst { 12068 break 12069 } 12070 c := auxIntToInt32(v_0.AuxInt) 12071 x := v_1 12072 y := v_2 12073 v.reset(OpARMTEQconst) 12074 v.AuxInt = int32ToAuxInt(c) 12075 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12076 v0.AddArg2(x, y) 12077 v.AddArg(v0) 12078 return true 12079 } 12080 // match: (TEQshiftRLreg x y (MOVWconst [c])) 12081 // cond: 0 <= c && c < 32 12082 // result: (TEQshiftRL x y [c]) 12083 for { 12084 x := v_0 12085 y := v_1 12086 if v_2.Op != OpARMMOVWconst { 12087 break 12088 } 12089 c := auxIntToInt32(v_2.AuxInt) 12090 if !(0 <= c && c < 32) { 12091 break 12092 } 12093 v.reset(OpARMTEQshiftRL) 12094 v.AuxInt = int32ToAuxInt(c) 12095 v.AddArg2(x, y) 12096 return true 12097 } 12098 return false 12099 } 12100 func rewriteValueARM_OpARMTST(v *Value) bool { 12101 v_1 := v.Args[1] 12102 v_0 := v.Args[0] 12103 // match: (TST x (MOVWconst [c])) 12104 // result: (TSTconst [c] x) 12105 for { 12106 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12107 x := v_0 12108 if v_1.Op != OpARMMOVWconst { 12109 continue 12110 } 12111 c := auxIntToInt32(v_1.AuxInt) 12112 v.reset(OpARMTSTconst) 12113 v.AuxInt = int32ToAuxInt(c) 12114 v.AddArg(x) 12115 return true 12116 } 12117 break 12118 } 12119 // match: (TST x (SLLconst [c] y)) 12120 // result: (TSTshiftLL x y [c]) 12121 for { 12122 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12123 x := v_0 12124 if v_1.Op != OpARMSLLconst { 12125 continue 12126 } 12127 c := auxIntToInt32(v_1.AuxInt) 12128 y := v_1.Args[0] 12129 v.reset(OpARMTSTshiftLL) 12130 v.AuxInt = int32ToAuxInt(c) 12131 v.AddArg2(x, y) 12132 return true 12133 } 12134 break 12135 } 12136 // match: (TST x (SRLconst [c] y)) 12137 // result: (TSTshiftRL x y [c]) 12138 for { 12139 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12140 x := v_0 12141 if v_1.Op != OpARMSRLconst { 12142 continue 12143 } 12144 c := auxIntToInt32(v_1.AuxInt) 12145 y := v_1.Args[0] 12146 v.reset(OpARMTSTshiftRL) 12147 v.AuxInt = int32ToAuxInt(c) 12148 v.AddArg2(x, y) 12149 return true 12150 } 12151 break 12152 } 12153 // match: (TST x (SRAconst [c] y)) 12154 // result: (TSTshiftRA x y [c]) 12155 for { 12156 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12157 x := v_0 12158 if v_1.Op != OpARMSRAconst { 12159 continue 12160 } 12161 c := auxIntToInt32(v_1.AuxInt) 12162 y := v_1.Args[0] 12163 v.reset(OpARMTSTshiftRA) 12164 v.AuxInt = int32ToAuxInt(c) 12165 v.AddArg2(x, y) 12166 return true 12167 } 12168 break 12169 } 12170 // match: (TST x (SLL y z)) 12171 // result: (TSTshiftLLreg x y z) 12172 for { 12173 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12174 x := v_0 12175 if v_1.Op != OpARMSLL { 12176 continue 12177 } 12178 z := v_1.Args[1] 12179 y := v_1.Args[0] 12180 v.reset(OpARMTSTshiftLLreg) 12181 v.AddArg3(x, y, z) 12182 return true 12183 } 12184 break 12185 } 12186 // match: (TST x (SRL y z)) 12187 // result: (TSTshiftRLreg x y z) 12188 for { 12189 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12190 x := v_0 12191 if v_1.Op != OpARMSRL { 12192 continue 12193 } 12194 z := v_1.Args[1] 12195 y := v_1.Args[0] 12196 v.reset(OpARMTSTshiftRLreg) 12197 v.AddArg3(x, y, z) 12198 return true 12199 } 12200 break 12201 } 12202 // match: (TST x (SRA y z)) 12203 // result: (TSTshiftRAreg x y z) 12204 for { 12205 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12206 x := v_0 12207 if v_1.Op != OpARMSRA { 12208 continue 12209 } 12210 z := v_1.Args[1] 12211 y := v_1.Args[0] 12212 v.reset(OpARMTSTshiftRAreg) 12213 v.AddArg3(x, y, z) 12214 return true 12215 } 12216 break 12217 } 12218 return false 12219 } 12220 func rewriteValueARM_OpARMTSTconst(v *Value) bool { 12221 v_0 := v.Args[0] 12222 // match: (TSTconst (MOVWconst [x]) [y]) 12223 // result: (FlagConstant [logicFlags32(x&y)]) 12224 for { 12225 y := auxIntToInt32(v.AuxInt) 12226 if v_0.Op != OpARMMOVWconst { 12227 break 12228 } 12229 x := auxIntToInt32(v_0.AuxInt) 12230 v.reset(OpARMFlagConstant) 12231 v.AuxInt = flagConstantToAuxInt(logicFlags32(x & y)) 12232 return true 12233 } 12234 return false 12235 } 12236 func rewriteValueARM_OpARMTSTshiftLL(v *Value) bool { 12237 v_1 := v.Args[1] 12238 v_0 := v.Args[0] 12239 b := v.Block 12240 // match: (TSTshiftLL (MOVWconst [c]) x [d]) 12241 // result: (TSTconst [c] (SLLconst <x.Type> x [d])) 12242 for { 12243 d := auxIntToInt32(v.AuxInt) 12244 if v_0.Op != OpARMMOVWconst { 12245 break 12246 } 12247 c := auxIntToInt32(v_0.AuxInt) 12248 x := v_1 12249 v.reset(OpARMTSTconst) 12250 v.AuxInt = int32ToAuxInt(c) 12251 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12252 v0.AuxInt = int32ToAuxInt(d) 12253 v0.AddArg(x) 12254 v.AddArg(v0) 12255 return true 12256 } 12257 // match: (TSTshiftLL x (MOVWconst [c]) [d]) 12258 // result: (TSTconst x [c<<uint64(d)]) 12259 for { 12260 d := auxIntToInt32(v.AuxInt) 12261 x := v_0 12262 if v_1.Op != OpARMMOVWconst { 12263 break 12264 } 12265 c := auxIntToInt32(v_1.AuxInt) 12266 v.reset(OpARMTSTconst) 12267 v.AuxInt = int32ToAuxInt(c << uint64(d)) 12268 v.AddArg(x) 12269 return true 12270 } 12271 return false 12272 } 12273 func rewriteValueARM_OpARMTSTshiftLLreg(v *Value) bool { 12274 v_2 := v.Args[2] 12275 v_1 := v.Args[1] 12276 v_0 := v.Args[0] 12277 b := v.Block 12278 // match: (TSTshiftLLreg (MOVWconst [c]) x y) 12279 // result: (TSTconst [c] (SLL <x.Type> x y)) 12280 for { 12281 if v_0.Op != OpARMMOVWconst { 12282 break 12283 } 12284 c := auxIntToInt32(v_0.AuxInt) 12285 x := v_1 12286 y := v_2 12287 v.reset(OpARMTSTconst) 12288 v.AuxInt = int32ToAuxInt(c) 12289 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12290 v0.AddArg2(x, y) 12291 v.AddArg(v0) 12292 return true 12293 } 12294 // match: (TSTshiftLLreg x y (MOVWconst [c])) 12295 // cond: 0 <= c && c < 32 12296 // result: (TSTshiftLL x y [c]) 12297 for { 12298 x := v_0 12299 y := v_1 12300 if v_2.Op != OpARMMOVWconst { 12301 break 12302 } 12303 c := auxIntToInt32(v_2.AuxInt) 12304 if !(0 <= c && c < 32) { 12305 break 12306 } 12307 v.reset(OpARMTSTshiftLL) 12308 v.AuxInt = int32ToAuxInt(c) 12309 v.AddArg2(x, y) 12310 return true 12311 } 12312 return false 12313 } 12314 func rewriteValueARM_OpARMTSTshiftRA(v *Value) bool { 12315 v_1 := v.Args[1] 12316 v_0 := v.Args[0] 12317 b := v.Block 12318 // match: (TSTshiftRA (MOVWconst [c]) x [d]) 12319 // result: (TSTconst [c] (SRAconst <x.Type> x [d])) 12320 for { 12321 d := auxIntToInt32(v.AuxInt) 12322 if v_0.Op != OpARMMOVWconst { 12323 break 12324 } 12325 c := auxIntToInt32(v_0.AuxInt) 12326 x := v_1 12327 v.reset(OpARMTSTconst) 12328 v.AuxInt = int32ToAuxInt(c) 12329 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12330 v0.AuxInt = int32ToAuxInt(d) 12331 v0.AddArg(x) 12332 v.AddArg(v0) 12333 return true 12334 } 12335 // match: (TSTshiftRA x (MOVWconst [c]) [d]) 12336 // result: (TSTconst x [c>>uint64(d)]) 12337 for { 12338 d := auxIntToInt32(v.AuxInt) 12339 x := v_0 12340 if v_1.Op != OpARMMOVWconst { 12341 break 12342 } 12343 c := auxIntToInt32(v_1.AuxInt) 12344 v.reset(OpARMTSTconst) 12345 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 12346 v.AddArg(x) 12347 return true 12348 } 12349 return false 12350 } 12351 func rewriteValueARM_OpARMTSTshiftRAreg(v *Value) bool { 12352 v_2 := v.Args[2] 12353 v_1 := v.Args[1] 12354 v_0 := v.Args[0] 12355 b := v.Block 12356 // match: (TSTshiftRAreg (MOVWconst [c]) x y) 12357 // result: (TSTconst [c] (SRA <x.Type> x y)) 12358 for { 12359 if v_0.Op != OpARMMOVWconst { 12360 break 12361 } 12362 c := auxIntToInt32(v_0.AuxInt) 12363 x := v_1 12364 y := v_2 12365 v.reset(OpARMTSTconst) 12366 v.AuxInt = int32ToAuxInt(c) 12367 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12368 v0.AddArg2(x, y) 12369 v.AddArg(v0) 12370 return true 12371 } 12372 // match: (TSTshiftRAreg x y (MOVWconst [c])) 12373 // cond: 0 <= c && c < 32 12374 // result: (TSTshiftRA x y [c]) 12375 for { 12376 x := v_0 12377 y := v_1 12378 if v_2.Op != OpARMMOVWconst { 12379 break 12380 } 12381 c := auxIntToInt32(v_2.AuxInt) 12382 if !(0 <= c && c < 32) { 12383 break 12384 } 12385 v.reset(OpARMTSTshiftRA) 12386 v.AuxInt = int32ToAuxInt(c) 12387 v.AddArg2(x, y) 12388 return true 12389 } 12390 return false 12391 } 12392 func rewriteValueARM_OpARMTSTshiftRL(v *Value) bool { 12393 v_1 := v.Args[1] 12394 v_0 := v.Args[0] 12395 b := v.Block 12396 // match: (TSTshiftRL (MOVWconst [c]) x [d]) 12397 // result: (TSTconst [c] (SRLconst <x.Type> x [d])) 12398 for { 12399 d := auxIntToInt32(v.AuxInt) 12400 if v_0.Op != OpARMMOVWconst { 12401 break 12402 } 12403 c := auxIntToInt32(v_0.AuxInt) 12404 x := v_1 12405 v.reset(OpARMTSTconst) 12406 v.AuxInt = int32ToAuxInt(c) 12407 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12408 v0.AuxInt = int32ToAuxInt(d) 12409 v0.AddArg(x) 12410 v.AddArg(v0) 12411 return true 12412 } 12413 // match: (TSTshiftRL x (MOVWconst [c]) [d]) 12414 // result: (TSTconst x [int32(uint32(c)>>uint64(d))]) 12415 for { 12416 d := auxIntToInt32(v.AuxInt) 12417 x := v_0 12418 if v_1.Op != OpARMMOVWconst { 12419 break 12420 } 12421 c := auxIntToInt32(v_1.AuxInt) 12422 v.reset(OpARMTSTconst) 12423 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12424 v.AddArg(x) 12425 return true 12426 } 12427 return false 12428 } 12429 func rewriteValueARM_OpARMTSTshiftRLreg(v *Value) bool { 12430 v_2 := v.Args[2] 12431 v_1 := v.Args[1] 12432 v_0 := v.Args[0] 12433 b := v.Block 12434 // match: (TSTshiftRLreg (MOVWconst [c]) x y) 12435 // result: (TSTconst [c] (SRL <x.Type> x y)) 12436 for { 12437 if v_0.Op != OpARMMOVWconst { 12438 break 12439 } 12440 c := auxIntToInt32(v_0.AuxInt) 12441 x := v_1 12442 y := v_2 12443 v.reset(OpARMTSTconst) 12444 v.AuxInt = int32ToAuxInt(c) 12445 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12446 v0.AddArg2(x, y) 12447 v.AddArg(v0) 12448 return true 12449 } 12450 // match: (TSTshiftRLreg x y (MOVWconst [c])) 12451 // cond: 0 <= c && c < 32 12452 // result: (TSTshiftRL x y [c]) 12453 for { 12454 x := v_0 12455 y := v_1 12456 if v_2.Op != OpARMMOVWconst { 12457 break 12458 } 12459 c := auxIntToInt32(v_2.AuxInt) 12460 if !(0 <= c && c < 32) { 12461 break 12462 } 12463 v.reset(OpARMTSTshiftRL) 12464 v.AuxInt = int32ToAuxInt(c) 12465 v.AddArg2(x, y) 12466 return true 12467 } 12468 return false 12469 } 12470 func rewriteValueARM_OpARMXOR(v *Value) bool { 12471 v_1 := v.Args[1] 12472 v_0 := v.Args[0] 12473 // match: (XOR x (MOVWconst [c])) 12474 // result: (XORconst [c] x) 12475 for { 12476 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12477 x := v_0 12478 if v_1.Op != OpARMMOVWconst { 12479 continue 12480 } 12481 c := auxIntToInt32(v_1.AuxInt) 12482 v.reset(OpARMXORconst) 12483 v.AuxInt = int32ToAuxInt(c) 12484 v.AddArg(x) 12485 return true 12486 } 12487 break 12488 } 12489 // match: (XOR x (SLLconst [c] y)) 12490 // result: (XORshiftLL x y [c]) 12491 for { 12492 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12493 x := v_0 12494 if v_1.Op != OpARMSLLconst { 12495 continue 12496 } 12497 c := auxIntToInt32(v_1.AuxInt) 12498 y := v_1.Args[0] 12499 v.reset(OpARMXORshiftLL) 12500 v.AuxInt = int32ToAuxInt(c) 12501 v.AddArg2(x, y) 12502 return true 12503 } 12504 break 12505 } 12506 // match: (XOR x (SRLconst [c] y)) 12507 // result: (XORshiftRL x y [c]) 12508 for { 12509 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12510 x := v_0 12511 if v_1.Op != OpARMSRLconst { 12512 continue 12513 } 12514 c := auxIntToInt32(v_1.AuxInt) 12515 y := v_1.Args[0] 12516 v.reset(OpARMXORshiftRL) 12517 v.AuxInt = int32ToAuxInt(c) 12518 v.AddArg2(x, y) 12519 return true 12520 } 12521 break 12522 } 12523 // match: (XOR x (SRAconst [c] y)) 12524 // result: (XORshiftRA x y [c]) 12525 for { 12526 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12527 x := v_0 12528 if v_1.Op != OpARMSRAconst { 12529 continue 12530 } 12531 c := auxIntToInt32(v_1.AuxInt) 12532 y := v_1.Args[0] 12533 v.reset(OpARMXORshiftRA) 12534 v.AuxInt = int32ToAuxInt(c) 12535 v.AddArg2(x, y) 12536 return true 12537 } 12538 break 12539 } 12540 // match: (XOR x (SRRconst [c] y)) 12541 // result: (XORshiftRR x y [c]) 12542 for { 12543 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12544 x := v_0 12545 if v_1.Op != OpARMSRRconst { 12546 continue 12547 } 12548 c := auxIntToInt32(v_1.AuxInt) 12549 y := v_1.Args[0] 12550 v.reset(OpARMXORshiftRR) 12551 v.AuxInt = int32ToAuxInt(c) 12552 v.AddArg2(x, y) 12553 return true 12554 } 12555 break 12556 } 12557 // match: (XOR x (SLL y z)) 12558 // result: (XORshiftLLreg x y z) 12559 for { 12560 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12561 x := v_0 12562 if v_1.Op != OpARMSLL { 12563 continue 12564 } 12565 z := v_1.Args[1] 12566 y := v_1.Args[0] 12567 v.reset(OpARMXORshiftLLreg) 12568 v.AddArg3(x, y, z) 12569 return true 12570 } 12571 break 12572 } 12573 // match: (XOR x (SRL y z)) 12574 // result: (XORshiftRLreg x y z) 12575 for { 12576 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12577 x := v_0 12578 if v_1.Op != OpARMSRL { 12579 continue 12580 } 12581 z := v_1.Args[1] 12582 y := v_1.Args[0] 12583 v.reset(OpARMXORshiftRLreg) 12584 v.AddArg3(x, y, z) 12585 return true 12586 } 12587 break 12588 } 12589 // match: (XOR x (SRA y z)) 12590 // result: (XORshiftRAreg x y z) 12591 for { 12592 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12593 x := v_0 12594 if v_1.Op != OpARMSRA { 12595 continue 12596 } 12597 z := v_1.Args[1] 12598 y := v_1.Args[0] 12599 v.reset(OpARMXORshiftRAreg) 12600 v.AddArg3(x, y, z) 12601 return true 12602 } 12603 break 12604 } 12605 // match: (XOR x x) 12606 // result: (MOVWconst [0]) 12607 for { 12608 x := v_0 12609 if x != v_1 { 12610 break 12611 } 12612 v.reset(OpARMMOVWconst) 12613 v.AuxInt = int32ToAuxInt(0) 12614 return true 12615 } 12616 return false 12617 } 12618 func rewriteValueARM_OpARMXORconst(v *Value) bool { 12619 v_0 := v.Args[0] 12620 // match: (XORconst [0] x) 12621 // result: x 12622 for { 12623 if auxIntToInt32(v.AuxInt) != 0 { 12624 break 12625 } 12626 x := v_0 12627 v.copyOf(x) 12628 return true 12629 } 12630 // match: (XORconst [c] (MOVWconst [d])) 12631 // result: (MOVWconst [c^d]) 12632 for { 12633 c := auxIntToInt32(v.AuxInt) 12634 if v_0.Op != OpARMMOVWconst { 12635 break 12636 } 12637 d := auxIntToInt32(v_0.AuxInt) 12638 v.reset(OpARMMOVWconst) 12639 v.AuxInt = int32ToAuxInt(c ^ d) 12640 return true 12641 } 12642 // match: (XORconst [c] (XORconst [d] x)) 12643 // result: (XORconst [c^d] x) 12644 for { 12645 c := auxIntToInt32(v.AuxInt) 12646 if v_0.Op != OpARMXORconst { 12647 break 12648 } 12649 d := auxIntToInt32(v_0.AuxInt) 12650 x := v_0.Args[0] 12651 v.reset(OpARMXORconst) 12652 v.AuxInt = int32ToAuxInt(c ^ d) 12653 v.AddArg(x) 12654 return true 12655 } 12656 return false 12657 } 12658 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool { 12659 v_1 := v.Args[1] 12660 v_0 := v.Args[0] 12661 b := v.Block 12662 typ := &b.Func.Config.Types 12663 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12664 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12665 for { 12666 d := auxIntToInt32(v.AuxInt) 12667 if v_0.Op != OpARMMOVWconst { 12668 break 12669 } 12670 c := auxIntToInt32(v_0.AuxInt) 12671 x := v_1 12672 v.reset(OpARMXORconst) 12673 v.AuxInt = int32ToAuxInt(c) 12674 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12675 v0.AuxInt = int32ToAuxInt(d) 12676 v0.AddArg(x) 12677 v.AddArg(v0) 12678 return true 12679 } 12680 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12681 // result: (XORconst x [c<<uint64(d)]) 12682 for { 12683 d := auxIntToInt32(v.AuxInt) 12684 x := v_0 12685 if v_1.Op != OpARMMOVWconst { 12686 break 12687 } 12688 c := auxIntToInt32(v_1.AuxInt) 12689 v.reset(OpARMXORconst) 12690 v.AuxInt = int32ToAuxInt(c << uint64(d)) 12691 v.AddArg(x) 12692 return true 12693 } 12694 // match: (XORshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 12695 // result: (REV16 x) 12696 for { 12697 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { 12698 break 12699 } 12700 x := v_0.Args[0] 12701 if x != v_1 { 12702 break 12703 } 12704 v.reset(OpARMREV16) 12705 v.AddArg(x) 12706 return true 12707 } 12708 // match: (XORshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 12709 // cond: buildcfg.GOARM>=6 12710 // result: (REV16 x) 12711 for { 12712 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 12713 break 12714 } 12715 v_0_0 := v_0.Args[0] 12716 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 12717 break 12718 } 12719 x := v_0_0.Args[0] 12720 if x != v_1 || !(buildcfg.GOARM >= 6) { 12721 break 12722 } 12723 v.reset(OpARMREV16) 12724 v.AddArg(x) 12725 return true 12726 } 12727 // match: (XORshiftLL (SLLconst x [c]) x [c]) 12728 // result: (MOVWconst [0]) 12729 for { 12730 c := auxIntToInt32(v.AuxInt) 12731 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 12732 break 12733 } 12734 x := v_0.Args[0] 12735 if x != v_1 { 12736 break 12737 } 12738 v.reset(OpARMMOVWconst) 12739 v.AuxInt = int32ToAuxInt(0) 12740 return true 12741 } 12742 return false 12743 } 12744 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool { 12745 v_2 := v.Args[2] 12746 v_1 := v.Args[1] 12747 v_0 := v.Args[0] 12748 b := v.Block 12749 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12750 // result: (XORconst [c] (SLL <x.Type> x y)) 12751 for { 12752 if v_0.Op != OpARMMOVWconst { 12753 break 12754 } 12755 c := auxIntToInt32(v_0.AuxInt) 12756 x := v_1 12757 y := v_2 12758 v.reset(OpARMXORconst) 12759 v.AuxInt = int32ToAuxInt(c) 12760 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12761 v0.AddArg2(x, y) 12762 v.AddArg(v0) 12763 return true 12764 } 12765 // match: (XORshiftLLreg x y (MOVWconst [c])) 12766 // cond: 0 <= c && c < 32 12767 // result: (XORshiftLL x y [c]) 12768 for { 12769 x := v_0 12770 y := v_1 12771 if v_2.Op != OpARMMOVWconst { 12772 break 12773 } 12774 c := auxIntToInt32(v_2.AuxInt) 12775 if !(0 <= c && c < 32) { 12776 break 12777 } 12778 v.reset(OpARMXORshiftLL) 12779 v.AuxInt = int32ToAuxInt(c) 12780 v.AddArg2(x, y) 12781 return true 12782 } 12783 return false 12784 } 12785 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool { 12786 v_1 := v.Args[1] 12787 v_0 := v.Args[0] 12788 b := v.Block 12789 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12790 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12791 for { 12792 d := auxIntToInt32(v.AuxInt) 12793 if v_0.Op != OpARMMOVWconst { 12794 break 12795 } 12796 c := auxIntToInt32(v_0.AuxInt) 12797 x := v_1 12798 v.reset(OpARMXORconst) 12799 v.AuxInt = int32ToAuxInt(c) 12800 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12801 v0.AuxInt = int32ToAuxInt(d) 12802 v0.AddArg(x) 12803 v.AddArg(v0) 12804 return true 12805 } 12806 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12807 // result: (XORconst x [c>>uint64(d)]) 12808 for { 12809 d := auxIntToInt32(v.AuxInt) 12810 x := v_0 12811 if v_1.Op != OpARMMOVWconst { 12812 break 12813 } 12814 c := auxIntToInt32(v_1.AuxInt) 12815 v.reset(OpARMXORconst) 12816 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 12817 v.AddArg(x) 12818 return true 12819 } 12820 // match: (XORshiftRA (SRAconst x [c]) x [c]) 12821 // result: (MOVWconst [0]) 12822 for { 12823 c := auxIntToInt32(v.AuxInt) 12824 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 12825 break 12826 } 12827 x := v_0.Args[0] 12828 if x != v_1 { 12829 break 12830 } 12831 v.reset(OpARMMOVWconst) 12832 v.AuxInt = int32ToAuxInt(0) 12833 return true 12834 } 12835 return false 12836 } 12837 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool { 12838 v_2 := v.Args[2] 12839 v_1 := v.Args[1] 12840 v_0 := v.Args[0] 12841 b := v.Block 12842 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12843 // result: (XORconst [c] (SRA <x.Type> x y)) 12844 for { 12845 if v_0.Op != OpARMMOVWconst { 12846 break 12847 } 12848 c := auxIntToInt32(v_0.AuxInt) 12849 x := v_1 12850 y := v_2 12851 v.reset(OpARMXORconst) 12852 v.AuxInt = int32ToAuxInt(c) 12853 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12854 v0.AddArg2(x, y) 12855 v.AddArg(v0) 12856 return true 12857 } 12858 // match: (XORshiftRAreg x y (MOVWconst [c])) 12859 // cond: 0 <= c && c < 32 12860 // result: (XORshiftRA x y [c]) 12861 for { 12862 x := v_0 12863 y := v_1 12864 if v_2.Op != OpARMMOVWconst { 12865 break 12866 } 12867 c := auxIntToInt32(v_2.AuxInt) 12868 if !(0 <= c && c < 32) { 12869 break 12870 } 12871 v.reset(OpARMXORshiftRA) 12872 v.AuxInt = int32ToAuxInt(c) 12873 v.AddArg2(x, y) 12874 return true 12875 } 12876 return false 12877 } 12878 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool { 12879 v_1 := v.Args[1] 12880 v_0 := v.Args[0] 12881 b := v.Block 12882 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12883 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12884 for { 12885 d := auxIntToInt32(v.AuxInt) 12886 if v_0.Op != OpARMMOVWconst { 12887 break 12888 } 12889 c := auxIntToInt32(v_0.AuxInt) 12890 x := v_1 12891 v.reset(OpARMXORconst) 12892 v.AuxInt = int32ToAuxInt(c) 12893 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12894 v0.AuxInt = int32ToAuxInt(d) 12895 v0.AddArg(x) 12896 v.AddArg(v0) 12897 return true 12898 } 12899 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12900 // result: (XORconst x [int32(uint32(c)>>uint64(d))]) 12901 for { 12902 d := auxIntToInt32(v.AuxInt) 12903 x := v_0 12904 if v_1.Op != OpARMMOVWconst { 12905 break 12906 } 12907 c := auxIntToInt32(v_1.AuxInt) 12908 v.reset(OpARMXORconst) 12909 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12910 v.AddArg(x) 12911 return true 12912 } 12913 // match: (XORshiftRL (SRLconst x [c]) x [c]) 12914 // result: (MOVWconst [0]) 12915 for { 12916 c := auxIntToInt32(v.AuxInt) 12917 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 12918 break 12919 } 12920 x := v_0.Args[0] 12921 if x != v_1 { 12922 break 12923 } 12924 v.reset(OpARMMOVWconst) 12925 v.AuxInt = int32ToAuxInt(0) 12926 return true 12927 } 12928 return false 12929 } 12930 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool { 12931 v_2 := v.Args[2] 12932 v_1 := v.Args[1] 12933 v_0 := v.Args[0] 12934 b := v.Block 12935 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12936 // result: (XORconst [c] (SRL <x.Type> x y)) 12937 for { 12938 if v_0.Op != OpARMMOVWconst { 12939 break 12940 } 12941 c := auxIntToInt32(v_0.AuxInt) 12942 x := v_1 12943 y := v_2 12944 v.reset(OpARMXORconst) 12945 v.AuxInt = int32ToAuxInt(c) 12946 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12947 v0.AddArg2(x, y) 12948 v.AddArg(v0) 12949 return true 12950 } 12951 // match: (XORshiftRLreg x y (MOVWconst [c])) 12952 // cond: 0 <= c && c < 32 12953 // result: (XORshiftRL x y [c]) 12954 for { 12955 x := v_0 12956 y := v_1 12957 if v_2.Op != OpARMMOVWconst { 12958 break 12959 } 12960 c := auxIntToInt32(v_2.AuxInt) 12961 if !(0 <= c && c < 32) { 12962 break 12963 } 12964 v.reset(OpARMXORshiftRL) 12965 v.AuxInt = int32ToAuxInt(c) 12966 v.AddArg2(x, y) 12967 return true 12968 } 12969 return false 12970 } 12971 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool { 12972 v_1 := v.Args[1] 12973 v_0 := v.Args[0] 12974 b := v.Block 12975 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12976 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12977 for { 12978 d := auxIntToInt32(v.AuxInt) 12979 if v_0.Op != OpARMMOVWconst { 12980 break 12981 } 12982 c := auxIntToInt32(v_0.AuxInt) 12983 x := v_1 12984 v.reset(OpARMXORconst) 12985 v.AuxInt = int32ToAuxInt(c) 12986 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 12987 v0.AuxInt = int32ToAuxInt(d) 12988 v0.AddArg(x) 12989 v.AddArg(v0) 12990 return true 12991 } 12992 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12993 // result: (XORconst x [int32(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 12994 for { 12995 d := auxIntToInt32(v.AuxInt) 12996 x := v_0 12997 if v_1.Op != OpARMMOVWconst { 12998 break 12999 } 13000 c := auxIntToInt32(v_1.AuxInt) 13001 v.reset(OpARMXORconst) 13002 v.AuxInt = int32ToAuxInt(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d))) 13003 v.AddArg(x) 13004 return true 13005 } 13006 return false 13007 } 13008 func rewriteValueARM_OpAddr(v *Value) bool { 13009 v_0 := v.Args[0] 13010 // match: (Addr {sym} base) 13011 // result: (MOVWaddr {sym} base) 13012 for { 13013 sym := auxToSym(v.Aux) 13014 base := v_0 13015 v.reset(OpARMMOVWaddr) 13016 v.Aux = symToAux(sym) 13017 v.AddArg(base) 13018 return true 13019 } 13020 } 13021 func rewriteValueARM_OpAvg32u(v *Value) bool { 13022 v_1 := v.Args[1] 13023 v_0 := v.Args[0] 13024 b := v.Block 13025 // match: (Avg32u <t> x y) 13026 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 13027 for { 13028 t := v.Type 13029 x := v_0 13030 y := v_1 13031 v.reset(OpARMADD) 13032 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13033 v0.AuxInt = int32ToAuxInt(1) 13034 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 13035 v1.AddArg2(x, y) 13036 v0.AddArg(v1) 13037 v.AddArg2(v0, y) 13038 return true 13039 } 13040 } 13041 func rewriteValueARM_OpBitLen32(v *Value) bool { 13042 v_0 := v.Args[0] 13043 b := v.Block 13044 // match: (BitLen32 <t> x) 13045 // result: (RSBconst [32] (CLZ <t> x)) 13046 for { 13047 t := v.Type 13048 x := v_0 13049 v.reset(OpARMRSBconst) 13050 v.AuxInt = int32ToAuxInt(32) 13051 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13052 v0.AddArg(x) 13053 v.AddArg(v0) 13054 return true 13055 } 13056 } 13057 func rewriteValueARM_OpBswap32(v *Value) bool { 13058 v_0 := v.Args[0] 13059 b := v.Block 13060 // match: (Bswap32 <t> x) 13061 // cond: buildcfg.GOARM==5 13062 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 13063 for { 13064 t := v.Type 13065 x := v_0 13066 if !(buildcfg.GOARM == 5) { 13067 break 13068 } 13069 v.reset(OpARMXOR) 13070 v.Type = t 13071 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13072 v0.AuxInt = int32ToAuxInt(8) 13073 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 13074 v1.AuxInt = int32ToAuxInt(0xff0000) 13075 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 13076 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13077 v3.AuxInt = int32ToAuxInt(16) 13078 v3.AddArg(x) 13079 v2.AddArg2(x, v3) 13080 v1.AddArg(v2) 13081 v0.AddArg(v1) 13082 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13083 v4.AuxInt = int32ToAuxInt(8) 13084 v4.AddArg(x) 13085 v.AddArg2(v0, v4) 13086 return true 13087 } 13088 // match: (Bswap32 x) 13089 // cond: buildcfg.GOARM>=6 13090 // result: (REV x) 13091 for { 13092 x := v_0 13093 if !(buildcfg.GOARM >= 6) { 13094 break 13095 } 13096 v.reset(OpARMREV) 13097 v.AddArg(x) 13098 return true 13099 } 13100 return false 13101 } 13102 func rewriteValueARM_OpConst16(v *Value) bool { 13103 // match: (Const16 [val]) 13104 // result: (MOVWconst [int32(val)]) 13105 for { 13106 val := auxIntToInt16(v.AuxInt) 13107 v.reset(OpARMMOVWconst) 13108 v.AuxInt = int32ToAuxInt(int32(val)) 13109 return true 13110 } 13111 } 13112 func rewriteValueARM_OpConst32(v *Value) bool { 13113 // match: (Const32 [val]) 13114 // result: (MOVWconst [int32(val)]) 13115 for { 13116 val := auxIntToInt32(v.AuxInt) 13117 v.reset(OpARMMOVWconst) 13118 v.AuxInt = int32ToAuxInt(int32(val)) 13119 return true 13120 } 13121 } 13122 func rewriteValueARM_OpConst32F(v *Value) bool { 13123 // match: (Const32F [val]) 13124 // result: (MOVFconst [float64(val)]) 13125 for { 13126 val := auxIntToFloat32(v.AuxInt) 13127 v.reset(OpARMMOVFconst) 13128 v.AuxInt = float64ToAuxInt(float64(val)) 13129 return true 13130 } 13131 } 13132 func rewriteValueARM_OpConst64F(v *Value) bool { 13133 // match: (Const64F [val]) 13134 // result: (MOVDconst [float64(val)]) 13135 for { 13136 val := auxIntToFloat64(v.AuxInt) 13137 v.reset(OpARMMOVDconst) 13138 v.AuxInt = float64ToAuxInt(float64(val)) 13139 return true 13140 } 13141 } 13142 func rewriteValueARM_OpConst8(v *Value) bool { 13143 // match: (Const8 [val]) 13144 // result: (MOVWconst [int32(val)]) 13145 for { 13146 val := auxIntToInt8(v.AuxInt) 13147 v.reset(OpARMMOVWconst) 13148 v.AuxInt = int32ToAuxInt(int32(val)) 13149 return true 13150 } 13151 } 13152 func rewriteValueARM_OpConstBool(v *Value) bool { 13153 // match: (ConstBool [t]) 13154 // result: (MOVWconst [b2i32(t)]) 13155 for { 13156 t := auxIntToBool(v.AuxInt) 13157 v.reset(OpARMMOVWconst) 13158 v.AuxInt = int32ToAuxInt(b2i32(t)) 13159 return true 13160 } 13161 } 13162 func rewriteValueARM_OpConstNil(v *Value) bool { 13163 // match: (ConstNil) 13164 // result: (MOVWconst [0]) 13165 for { 13166 v.reset(OpARMMOVWconst) 13167 v.AuxInt = int32ToAuxInt(0) 13168 return true 13169 } 13170 } 13171 func rewriteValueARM_OpCtz16(v *Value) bool { 13172 v_0 := v.Args[0] 13173 b := v.Block 13174 typ := &b.Func.Config.Types 13175 // match: (Ctz16 <t> x) 13176 // cond: buildcfg.GOARM<=6 13177 // result: (RSBconst [32] (CLZ <t> (SUBconst <typ.UInt32> (AND <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x) (RSBconst <typ.UInt32> [0] (ORconst <typ.UInt32> [0x10000] x))) [1]))) 13178 for { 13179 t := v.Type 13180 x := v_0 13181 if !(buildcfg.GOARM <= 6) { 13182 break 13183 } 13184 v.reset(OpARMRSBconst) 13185 v.AuxInt = int32ToAuxInt(32) 13186 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13187 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) 13188 v1.AuxInt = int32ToAuxInt(1) 13189 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) 13190 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13191 v3.AuxInt = int32ToAuxInt(0x10000) 13192 v3.AddArg(x) 13193 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) 13194 v4.AuxInt = int32ToAuxInt(0) 13195 v4.AddArg(v3) 13196 v2.AddArg2(v3, v4) 13197 v1.AddArg(v2) 13198 v0.AddArg(v1) 13199 v.AddArg(v0) 13200 return true 13201 } 13202 // match: (Ctz16 <t> x) 13203 // cond: buildcfg.GOARM==7 13204 // result: (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x))) 13205 for { 13206 t := v.Type 13207 x := v_0 13208 if !(buildcfg.GOARM == 7) { 13209 break 13210 } 13211 v.reset(OpARMCLZ) 13212 v.Type = t 13213 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) 13214 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13215 v1.AuxInt = int32ToAuxInt(0x10000) 13216 v1.AddArg(x) 13217 v0.AddArg(v1) 13218 v.AddArg(v0) 13219 return true 13220 } 13221 return false 13222 } 13223 func rewriteValueARM_OpCtz32(v *Value) bool { 13224 v_0 := v.Args[0] 13225 b := v.Block 13226 // match: (Ctz32 <t> x) 13227 // cond: buildcfg.GOARM<=6 13228 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13229 for { 13230 t := v.Type 13231 x := v_0 13232 if !(buildcfg.GOARM <= 6) { 13233 break 13234 } 13235 v.reset(OpARMRSBconst) 13236 v.AuxInt = int32ToAuxInt(32) 13237 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13238 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 13239 v1.AuxInt = int32ToAuxInt(1) 13240 v2 := b.NewValue0(v.Pos, OpARMAND, t) 13241 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 13242 v3.AuxInt = int32ToAuxInt(0) 13243 v3.AddArg(x) 13244 v2.AddArg2(x, v3) 13245 v1.AddArg(v2) 13246 v0.AddArg(v1) 13247 v.AddArg(v0) 13248 return true 13249 } 13250 // match: (Ctz32 <t> x) 13251 // cond: buildcfg.GOARM==7 13252 // result: (CLZ <t> (RBIT <t> x)) 13253 for { 13254 t := v.Type 13255 x := v_0 13256 if !(buildcfg.GOARM == 7) { 13257 break 13258 } 13259 v.reset(OpARMCLZ) 13260 v.Type = t 13261 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 13262 v0.AddArg(x) 13263 v.AddArg(v0) 13264 return true 13265 } 13266 return false 13267 } 13268 func rewriteValueARM_OpCtz8(v *Value) bool { 13269 v_0 := v.Args[0] 13270 b := v.Block 13271 typ := &b.Func.Config.Types 13272 // match: (Ctz8 <t> x) 13273 // cond: buildcfg.GOARM<=6 13274 // result: (RSBconst [32] (CLZ <t> (SUBconst <typ.UInt32> (AND <typ.UInt32> (ORconst <typ.UInt32> [0x100] x) (RSBconst <typ.UInt32> [0] (ORconst <typ.UInt32> [0x100] x))) [1]))) 13275 for { 13276 t := v.Type 13277 x := v_0 13278 if !(buildcfg.GOARM <= 6) { 13279 break 13280 } 13281 v.reset(OpARMRSBconst) 13282 v.AuxInt = int32ToAuxInt(32) 13283 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13284 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) 13285 v1.AuxInt = int32ToAuxInt(1) 13286 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) 13287 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13288 v3.AuxInt = int32ToAuxInt(0x100) 13289 v3.AddArg(x) 13290 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) 13291 v4.AuxInt = int32ToAuxInt(0) 13292 v4.AddArg(v3) 13293 v2.AddArg2(v3, v4) 13294 v1.AddArg(v2) 13295 v0.AddArg(v1) 13296 v.AddArg(v0) 13297 return true 13298 } 13299 // match: (Ctz8 <t> x) 13300 // cond: buildcfg.GOARM==7 13301 // result: (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x100] x))) 13302 for { 13303 t := v.Type 13304 x := v_0 13305 if !(buildcfg.GOARM == 7) { 13306 break 13307 } 13308 v.reset(OpARMCLZ) 13309 v.Type = t 13310 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) 13311 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13312 v1.AuxInt = int32ToAuxInt(0x100) 13313 v1.AddArg(x) 13314 v0.AddArg(v1) 13315 v.AddArg(v0) 13316 return true 13317 } 13318 return false 13319 } 13320 func rewriteValueARM_OpDiv16(v *Value) bool { 13321 v_1 := v.Args[1] 13322 v_0 := v.Args[0] 13323 b := v.Block 13324 typ := &b.Func.Config.Types 13325 // match: (Div16 x y) 13326 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13327 for { 13328 x := v_0 13329 y := v_1 13330 v.reset(OpDiv32) 13331 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13332 v0.AddArg(x) 13333 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13334 v1.AddArg(y) 13335 v.AddArg2(v0, v1) 13336 return true 13337 } 13338 } 13339 func rewriteValueARM_OpDiv16u(v *Value) bool { 13340 v_1 := v.Args[1] 13341 v_0 := v.Args[0] 13342 b := v.Block 13343 typ := &b.Func.Config.Types 13344 // match: (Div16u x y) 13345 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13346 for { 13347 x := v_0 13348 y := v_1 13349 v.reset(OpDiv32u) 13350 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13351 v0.AddArg(x) 13352 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13353 v1.AddArg(y) 13354 v.AddArg2(v0, v1) 13355 return true 13356 } 13357 } 13358 func rewriteValueARM_OpDiv32(v *Value) bool { 13359 v_1 := v.Args[1] 13360 v_0 := v.Args[0] 13361 b := v.Block 13362 typ := &b.Func.Config.Types 13363 // match: (Div32 x y) 13364 // result: (SUB (XOR <typ.UInt32> (Select0 <typ.UInt32> (CALLudiv (SUB <typ.UInt32> (XOR x <typ.UInt32> (Signmask x)) (Signmask x)) (SUB <typ.UInt32> (XOR y <typ.UInt32> (Signmask y)) (Signmask y)))) (Signmask (XOR <typ.UInt32> x y))) (Signmask (XOR <typ.UInt32> x y))) 13365 for { 13366 x := v_0 13367 y := v_1 13368 v.reset(OpARMSUB) 13369 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13370 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 13371 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 13372 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 13373 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13374 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13375 v5.AddArg(x) 13376 v4.AddArg2(x, v5) 13377 v3.AddArg2(v4, v5) 13378 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 13379 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13380 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13381 v8.AddArg(y) 13382 v7.AddArg2(y, v8) 13383 v6.AddArg2(v7, v8) 13384 v2.AddArg2(v3, v6) 13385 v1.AddArg(v2) 13386 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13387 v10 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13388 v10.AddArg2(x, y) 13389 v9.AddArg(v10) 13390 v0.AddArg2(v1, v9) 13391 v.AddArg2(v0, v9) 13392 return true 13393 } 13394 } 13395 func rewriteValueARM_OpDiv32u(v *Value) bool { 13396 v_1 := v.Args[1] 13397 v_0 := v.Args[0] 13398 b := v.Block 13399 typ := &b.Func.Config.Types 13400 // match: (Div32u x y) 13401 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 13402 for { 13403 x := v_0 13404 y := v_1 13405 v.reset(OpSelect0) 13406 v.Type = typ.UInt32 13407 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 13408 v0.AddArg2(x, y) 13409 v.AddArg(v0) 13410 return true 13411 } 13412 } 13413 func rewriteValueARM_OpDiv8(v *Value) bool { 13414 v_1 := v.Args[1] 13415 v_0 := v.Args[0] 13416 b := v.Block 13417 typ := &b.Func.Config.Types 13418 // match: (Div8 x y) 13419 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13420 for { 13421 x := v_0 13422 y := v_1 13423 v.reset(OpDiv32) 13424 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13425 v0.AddArg(x) 13426 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13427 v1.AddArg(y) 13428 v.AddArg2(v0, v1) 13429 return true 13430 } 13431 } 13432 func rewriteValueARM_OpDiv8u(v *Value) bool { 13433 v_1 := v.Args[1] 13434 v_0 := v.Args[0] 13435 b := v.Block 13436 typ := &b.Func.Config.Types 13437 // match: (Div8u x y) 13438 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13439 for { 13440 x := v_0 13441 y := v_1 13442 v.reset(OpDiv32u) 13443 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13444 v0.AddArg(x) 13445 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13446 v1.AddArg(y) 13447 v.AddArg2(v0, v1) 13448 return true 13449 } 13450 } 13451 func rewriteValueARM_OpEq16(v *Value) bool { 13452 v_1 := v.Args[1] 13453 v_0 := v.Args[0] 13454 b := v.Block 13455 typ := &b.Func.Config.Types 13456 // match: (Eq16 x y) 13457 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13458 for { 13459 x := v_0 13460 y := v_1 13461 v.reset(OpARMEqual) 13462 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13463 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13464 v1.AddArg(x) 13465 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13466 v2.AddArg(y) 13467 v0.AddArg2(v1, v2) 13468 v.AddArg(v0) 13469 return true 13470 } 13471 } 13472 func rewriteValueARM_OpEq32(v *Value) bool { 13473 v_1 := v.Args[1] 13474 v_0 := v.Args[0] 13475 b := v.Block 13476 // match: (Eq32 x y) 13477 // result: (Equal (CMP x y)) 13478 for { 13479 x := v_0 13480 y := v_1 13481 v.reset(OpARMEqual) 13482 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13483 v0.AddArg2(x, y) 13484 v.AddArg(v0) 13485 return true 13486 } 13487 } 13488 func rewriteValueARM_OpEq32F(v *Value) bool { 13489 v_1 := v.Args[1] 13490 v_0 := v.Args[0] 13491 b := v.Block 13492 // match: (Eq32F x y) 13493 // result: (Equal (CMPF x y)) 13494 for { 13495 x := v_0 13496 y := v_1 13497 v.reset(OpARMEqual) 13498 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13499 v0.AddArg2(x, y) 13500 v.AddArg(v0) 13501 return true 13502 } 13503 } 13504 func rewriteValueARM_OpEq64F(v *Value) bool { 13505 v_1 := v.Args[1] 13506 v_0 := v.Args[0] 13507 b := v.Block 13508 // match: (Eq64F x y) 13509 // result: (Equal (CMPD x y)) 13510 for { 13511 x := v_0 13512 y := v_1 13513 v.reset(OpARMEqual) 13514 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13515 v0.AddArg2(x, y) 13516 v.AddArg(v0) 13517 return true 13518 } 13519 } 13520 func rewriteValueARM_OpEq8(v *Value) bool { 13521 v_1 := v.Args[1] 13522 v_0 := v.Args[0] 13523 b := v.Block 13524 typ := &b.Func.Config.Types 13525 // match: (Eq8 x y) 13526 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13527 for { 13528 x := v_0 13529 y := v_1 13530 v.reset(OpARMEqual) 13531 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13532 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13533 v1.AddArg(x) 13534 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13535 v2.AddArg(y) 13536 v0.AddArg2(v1, v2) 13537 v.AddArg(v0) 13538 return true 13539 } 13540 } 13541 func rewriteValueARM_OpEqB(v *Value) bool { 13542 v_1 := v.Args[1] 13543 v_0 := v.Args[0] 13544 b := v.Block 13545 typ := &b.Func.Config.Types 13546 // match: (EqB x y) 13547 // result: (XORconst [1] (XOR <typ.Bool> x y)) 13548 for { 13549 x := v_0 13550 y := v_1 13551 v.reset(OpARMXORconst) 13552 v.AuxInt = int32ToAuxInt(1) 13553 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 13554 v0.AddArg2(x, y) 13555 v.AddArg(v0) 13556 return true 13557 } 13558 } 13559 func rewriteValueARM_OpEqPtr(v *Value) bool { 13560 v_1 := v.Args[1] 13561 v_0 := v.Args[0] 13562 b := v.Block 13563 // match: (EqPtr x y) 13564 // result: (Equal (CMP x y)) 13565 for { 13566 x := v_0 13567 y := v_1 13568 v.reset(OpARMEqual) 13569 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13570 v0.AddArg2(x, y) 13571 v.AddArg(v0) 13572 return true 13573 } 13574 } 13575 func rewriteValueARM_OpFMA(v *Value) bool { 13576 v_2 := v.Args[2] 13577 v_1 := v.Args[1] 13578 v_0 := v.Args[0] 13579 // match: (FMA x y z) 13580 // result: (FMULAD z x y) 13581 for { 13582 x := v_0 13583 y := v_1 13584 z := v_2 13585 v.reset(OpARMFMULAD) 13586 v.AddArg3(z, x, y) 13587 return true 13588 } 13589 } 13590 func rewriteValueARM_OpIsInBounds(v *Value) bool { 13591 v_1 := v.Args[1] 13592 v_0 := v.Args[0] 13593 b := v.Block 13594 // match: (IsInBounds idx len) 13595 // result: (LessThanU (CMP idx len)) 13596 for { 13597 idx := v_0 13598 len := v_1 13599 v.reset(OpARMLessThanU) 13600 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13601 v0.AddArg2(idx, len) 13602 v.AddArg(v0) 13603 return true 13604 } 13605 } 13606 func rewriteValueARM_OpIsNonNil(v *Value) bool { 13607 v_0 := v.Args[0] 13608 b := v.Block 13609 // match: (IsNonNil ptr) 13610 // result: (NotEqual (CMPconst [0] ptr)) 13611 for { 13612 ptr := v_0 13613 v.reset(OpARMNotEqual) 13614 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 13615 v0.AuxInt = int32ToAuxInt(0) 13616 v0.AddArg(ptr) 13617 v.AddArg(v0) 13618 return true 13619 } 13620 } 13621 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool { 13622 v_1 := v.Args[1] 13623 v_0 := v.Args[0] 13624 b := v.Block 13625 // match: (IsSliceInBounds idx len) 13626 // result: (LessEqualU (CMP idx len)) 13627 for { 13628 idx := v_0 13629 len := v_1 13630 v.reset(OpARMLessEqualU) 13631 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13632 v0.AddArg2(idx, len) 13633 v.AddArg(v0) 13634 return true 13635 } 13636 } 13637 func rewriteValueARM_OpLeq16(v *Value) bool { 13638 v_1 := v.Args[1] 13639 v_0 := v.Args[0] 13640 b := v.Block 13641 typ := &b.Func.Config.Types 13642 // match: (Leq16 x y) 13643 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13644 for { 13645 x := v_0 13646 y := v_1 13647 v.reset(OpARMLessEqual) 13648 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13649 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13650 v1.AddArg(x) 13651 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13652 v2.AddArg(y) 13653 v0.AddArg2(v1, v2) 13654 v.AddArg(v0) 13655 return true 13656 } 13657 } 13658 func rewriteValueARM_OpLeq16U(v *Value) bool { 13659 v_1 := v.Args[1] 13660 v_0 := v.Args[0] 13661 b := v.Block 13662 typ := &b.Func.Config.Types 13663 // match: (Leq16U x y) 13664 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13665 for { 13666 x := v_0 13667 y := v_1 13668 v.reset(OpARMLessEqualU) 13669 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13670 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13671 v1.AddArg(x) 13672 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13673 v2.AddArg(y) 13674 v0.AddArg2(v1, v2) 13675 v.AddArg(v0) 13676 return true 13677 } 13678 } 13679 func rewriteValueARM_OpLeq32(v *Value) bool { 13680 v_1 := v.Args[1] 13681 v_0 := v.Args[0] 13682 b := v.Block 13683 // match: (Leq32 x y) 13684 // result: (LessEqual (CMP x y)) 13685 for { 13686 x := v_0 13687 y := v_1 13688 v.reset(OpARMLessEqual) 13689 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13690 v0.AddArg2(x, y) 13691 v.AddArg(v0) 13692 return true 13693 } 13694 } 13695 func rewriteValueARM_OpLeq32F(v *Value) bool { 13696 v_1 := v.Args[1] 13697 v_0 := v.Args[0] 13698 b := v.Block 13699 // match: (Leq32F x y) 13700 // result: (GreaterEqual (CMPF y x)) 13701 for { 13702 x := v_0 13703 y := v_1 13704 v.reset(OpARMGreaterEqual) 13705 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13706 v0.AddArg2(y, x) 13707 v.AddArg(v0) 13708 return true 13709 } 13710 } 13711 func rewriteValueARM_OpLeq32U(v *Value) bool { 13712 v_1 := v.Args[1] 13713 v_0 := v.Args[0] 13714 b := v.Block 13715 // match: (Leq32U x y) 13716 // result: (LessEqualU (CMP x y)) 13717 for { 13718 x := v_0 13719 y := v_1 13720 v.reset(OpARMLessEqualU) 13721 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13722 v0.AddArg2(x, y) 13723 v.AddArg(v0) 13724 return true 13725 } 13726 } 13727 func rewriteValueARM_OpLeq64F(v *Value) bool { 13728 v_1 := v.Args[1] 13729 v_0 := v.Args[0] 13730 b := v.Block 13731 // match: (Leq64F x y) 13732 // result: (GreaterEqual (CMPD y x)) 13733 for { 13734 x := v_0 13735 y := v_1 13736 v.reset(OpARMGreaterEqual) 13737 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13738 v0.AddArg2(y, x) 13739 v.AddArg(v0) 13740 return true 13741 } 13742 } 13743 func rewriteValueARM_OpLeq8(v *Value) bool { 13744 v_1 := v.Args[1] 13745 v_0 := v.Args[0] 13746 b := v.Block 13747 typ := &b.Func.Config.Types 13748 // match: (Leq8 x y) 13749 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13750 for { 13751 x := v_0 13752 y := v_1 13753 v.reset(OpARMLessEqual) 13754 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13755 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13756 v1.AddArg(x) 13757 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13758 v2.AddArg(y) 13759 v0.AddArg2(v1, v2) 13760 v.AddArg(v0) 13761 return true 13762 } 13763 } 13764 func rewriteValueARM_OpLeq8U(v *Value) bool { 13765 v_1 := v.Args[1] 13766 v_0 := v.Args[0] 13767 b := v.Block 13768 typ := &b.Func.Config.Types 13769 // match: (Leq8U x y) 13770 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13771 for { 13772 x := v_0 13773 y := v_1 13774 v.reset(OpARMLessEqualU) 13775 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13776 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13777 v1.AddArg(x) 13778 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13779 v2.AddArg(y) 13780 v0.AddArg2(v1, v2) 13781 v.AddArg(v0) 13782 return true 13783 } 13784 } 13785 func rewriteValueARM_OpLess16(v *Value) bool { 13786 v_1 := v.Args[1] 13787 v_0 := v.Args[0] 13788 b := v.Block 13789 typ := &b.Func.Config.Types 13790 // match: (Less16 x y) 13791 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 13792 for { 13793 x := v_0 13794 y := v_1 13795 v.reset(OpARMLessThan) 13796 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13797 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13798 v1.AddArg(x) 13799 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13800 v2.AddArg(y) 13801 v0.AddArg2(v1, v2) 13802 v.AddArg(v0) 13803 return true 13804 } 13805 } 13806 func rewriteValueARM_OpLess16U(v *Value) bool { 13807 v_1 := v.Args[1] 13808 v_0 := v.Args[0] 13809 b := v.Block 13810 typ := &b.Func.Config.Types 13811 // match: (Less16U x y) 13812 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13813 for { 13814 x := v_0 13815 y := v_1 13816 v.reset(OpARMLessThanU) 13817 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13818 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13819 v1.AddArg(x) 13820 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13821 v2.AddArg(y) 13822 v0.AddArg2(v1, v2) 13823 v.AddArg(v0) 13824 return true 13825 } 13826 } 13827 func rewriteValueARM_OpLess32(v *Value) bool { 13828 v_1 := v.Args[1] 13829 v_0 := v.Args[0] 13830 b := v.Block 13831 // match: (Less32 x y) 13832 // result: (LessThan (CMP x y)) 13833 for { 13834 x := v_0 13835 y := v_1 13836 v.reset(OpARMLessThan) 13837 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13838 v0.AddArg2(x, y) 13839 v.AddArg(v0) 13840 return true 13841 } 13842 } 13843 func rewriteValueARM_OpLess32F(v *Value) bool { 13844 v_1 := v.Args[1] 13845 v_0 := v.Args[0] 13846 b := v.Block 13847 // match: (Less32F x y) 13848 // result: (GreaterThan (CMPF y x)) 13849 for { 13850 x := v_0 13851 y := v_1 13852 v.reset(OpARMGreaterThan) 13853 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13854 v0.AddArg2(y, x) 13855 v.AddArg(v0) 13856 return true 13857 } 13858 } 13859 func rewriteValueARM_OpLess32U(v *Value) bool { 13860 v_1 := v.Args[1] 13861 v_0 := v.Args[0] 13862 b := v.Block 13863 // match: (Less32U x y) 13864 // result: (LessThanU (CMP x y)) 13865 for { 13866 x := v_0 13867 y := v_1 13868 v.reset(OpARMLessThanU) 13869 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13870 v0.AddArg2(x, y) 13871 v.AddArg(v0) 13872 return true 13873 } 13874 } 13875 func rewriteValueARM_OpLess64F(v *Value) bool { 13876 v_1 := v.Args[1] 13877 v_0 := v.Args[0] 13878 b := v.Block 13879 // match: (Less64F x y) 13880 // result: (GreaterThan (CMPD y x)) 13881 for { 13882 x := v_0 13883 y := v_1 13884 v.reset(OpARMGreaterThan) 13885 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13886 v0.AddArg2(y, x) 13887 v.AddArg(v0) 13888 return true 13889 } 13890 } 13891 func rewriteValueARM_OpLess8(v *Value) bool { 13892 v_1 := v.Args[1] 13893 v_0 := v.Args[0] 13894 b := v.Block 13895 typ := &b.Func.Config.Types 13896 // match: (Less8 x y) 13897 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 13898 for { 13899 x := v_0 13900 y := v_1 13901 v.reset(OpARMLessThan) 13902 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13903 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13904 v1.AddArg(x) 13905 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13906 v2.AddArg(y) 13907 v0.AddArg2(v1, v2) 13908 v.AddArg(v0) 13909 return true 13910 } 13911 } 13912 func rewriteValueARM_OpLess8U(v *Value) bool { 13913 v_1 := v.Args[1] 13914 v_0 := v.Args[0] 13915 b := v.Block 13916 typ := &b.Func.Config.Types 13917 // match: (Less8U x y) 13918 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13919 for { 13920 x := v_0 13921 y := v_1 13922 v.reset(OpARMLessThanU) 13923 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13924 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13925 v1.AddArg(x) 13926 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13927 v2.AddArg(y) 13928 v0.AddArg2(v1, v2) 13929 v.AddArg(v0) 13930 return true 13931 } 13932 } 13933 func rewriteValueARM_OpLoad(v *Value) bool { 13934 v_1 := v.Args[1] 13935 v_0 := v.Args[0] 13936 // match: (Load <t> ptr mem) 13937 // cond: t.IsBoolean() 13938 // result: (MOVBUload ptr mem) 13939 for { 13940 t := v.Type 13941 ptr := v_0 13942 mem := v_1 13943 if !(t.IsBoolean()) { 13944 break 13945 } 13946 v.reset(OpARMMOVBUload) 13947 v.AddArg2(ptr, mem) 13948 return true 13949 } 13950 // match: (Load <t> ptr mem) 13951 // cond: (is8BitInt(t) && isSigned(t)) 13952 // result: (MOVBload ptr mem) 13953 for { 13954 t := v.Type 13955 ptr := v_0 13956 mem := v_1 13957 if !(is8BitInt(t) && isSigned(t)) { 13958 break 13959 } 13960 v.reset(OpARMMOVBload) 13961 v.AddArg2(ptr, mem) 13962 return true 13963 } 13964 // match: (Load <t> ptr mem) 13965 // cond: (is8BitInt(t) && !isSigned(t)) 13966 // result: (MOVBUload ptr mem) 13967 for { 13968 t := v.Type 13969 ptr := v_0 13970 mem := v_1 13971 if !(is8BitInt(t) && !isSigned(t)) { 13972 break 13973 } 13974 v.reset(OpARMMOVBUload) 13975 v.AddArg2(ptr, mem) 13976 return true 13977 } 13978 // match: (Load <t> ptr mem) 13979 // cond: (is16BitInt(t) && isSigned(t)) 13980 // result: (MOVHload ptr mem) 13981 for { 13982 t := v.Type 13983 ptr := v_0 13984 mem := v_1 13985 if !(is16BitInt(t) && isSigned(t)) { 13986 break 13987 } 13988 v.reset(OpARMMOVHload) 13989 v.AddArg2(ptr, mem) 13990 return true 13991 } 13992 // match: (Load <t> ptr mem) 13993 // cond: (is16BitInt(t) && !isSigned(t)) 13994 // result: (MOVHUload ptr mem) 13995 for { 13996 t := v.Type 13997 ptr := v_0 13998 mem := v_1 13999 if !(is16BitInt(t) && !isSigned(t)) { 14000 break 14001 } 14002 v.reset(OpARMMOVHUload) 14003 v.AddArg2(ptr, mem) 14004 return true 14005 } 14006 // match: (Load <t> ptr mem) 14007 // cond: (is32BitInt(t) || isPtr(t)) 14008 // result: (MOVWload ptr mem) 14009 for { 14010 t := v.Type 14011 ptr := v_0 14012 mem := v_1 14013 if !(is32BitInt(t) || isPtr(t)) { 14014 break 14015 } 14016 v.reset(OpARMMOVWload) 14017 v.AddArg2(ptr, mem) 14018 return true 14019 } 14020 // match: (Load <t> ptr mem) 14021 // cond: is32BitFloat(t) 14022 // result: (MOVFload ptr mem) 14023 for { 14024 t := v.Type 14025 ptr := v_0 14026 mem := v_1 14027 if !(is32BitFloat(t)) { 14028 break 14029 } 14030 v.reset(OpARMMOVFload) 14031 v.AddArg2(ptr, mem) 14032 return true 14033 } 14034 // match: (Load <t> ptr mem) 14035 // cond: is64BitFloat(t) 14036 // result: (MOVDload ptr mem) 14037 for { 14038 t := v.Type 14039 ptr := v_0 14040 mem := v_1 14041 if !(is64BitFloat(t)) { 14042 break 14043 } 14044 v.reset(OpARMMOVDload) 14045 v.AddArg2(ptr, mem) 14046 return true 14047 } 14048 return false 14049 } 14050 func rewriteValueARM_OpLocalAddr(v *Value) bool { 14051 v_0 := v.Args[0] 14052 // match: (LocalAddr {sym} base _) 14053 // result: (MOVWaddr {sym} base) 14054 for { 14055 sym := auxToSym(v.Aux) 14056 base := v_0 14057 v.reset(OpARMMOVWaddr) 14058 v.Aux = symToAux(sym) 14059 v.AddArg(base) 14060 return true 14061 } 14062 } 14063 func rewriteValueARM_OpLsh16x16(v *Value) bool { 14064 v_1 := v.Args[1] 14065 v_0 := v.Args[0] 14066 b := v.Block 14067 typ := &b.Func.Config.Types 14068 // match: (Lsh16x16 x y) 14069 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14070 for { 14071 x := v_0 14072 y := v_1 14073 v.reset(OpARMCMOVWHSconst) 14074 v.AuxInt = int32ToAuxInt(0) 14075 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14076 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14077 v1.AddArg(y) 14078 v0.AddArg2(x, v1) 14079 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14080 v2.AuxInt = int32ToAuxInt(256) 14081 v2.AddArg(v1) 14082 v.AddArg2(v0, v2) 14083 return true 14084 } 14085 } 14086 func rewriteValueARM_OpLsh16x32(v *Value) bool { 14087 v_1 := v.Args[1] 14088 v_0 := v.Args[0] 14089 b := v.Block 14090 // match: (Lsh16x32 x y) 14091 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14092 for { 14093 x := v_0 14094 y := v_1 14095 v.reset(OpARMCMOVWHSconst) 14096 v.AuxInt = int32ToAuxInt(0) 14097 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14098 v0.AddArg2(x, y) 14099 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14100 v1.AuxInt = int32ToAuxInt(256) 14101 v1.AddArg(y) 14102 v.AddArg2(v0, v1) 14103 return true 14104 } 14105 } 14106 func rewriteValueARM_OpLsh16x64(v *Value) bool { 14107 v_1 := v.Args[1] 14108 v_0 := v.Args[0] 14109 // match: (Lsh16x64 x (Const64 [c])) 14110 // cond: uint64(c) < 16 14111 // result: (SLLconst x [int32(c)]) 14112 for { 14113 x := v_0 14114 if v_1.Op != OpConst64 { 14115 break 14116 } 14117 c := auxIntToInt64(v_1.AuxInt) 14118 if !(uint64(c) < 16) { 14119 break 14120 } 14121 v.reset(OpARMSLLconst) 14122 v.AuxInt = int32ToAuxInt(int32(c)) 14123 v.AddArg(x) 14124 return true 14125 } 14126 // match: (Lsh16x64 _ (Const64 [c])) 14127 // cond: uint64(c) >= 16 14128 // result: (Const16 [0]) 14129 for { 14130 if v_1.Op != OpConst64 { 14131 break 14132 } 14133 c := auxIntToInt64(v_1.AuxInt) 14134 if !(uint64(c) >= 16) { 14135 break 14136 } 14137 v.reset(OpConst16) 14138 v.AuxInt = int16ToAuxInt(0) 14139 return true 14140 } 14141 return false 14142 } 14143 func rewriteValueARM_OpLsh16x8(v *Value) bool { 14144 v_1 := v.Args[1] 14145 v_0 := v.Args[0] 14146 b := v.Block 14147 typ := &b.Func.Config.Types 14148 // match: (Lsh16x8 x y) 14149 // result: (SLL x (ZeroExt8to32 y)) 14150 for { 14151 x := v_0 14152 y := v_1 14153 v.reset(OpARMSLL) 14154 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14155 v0.AddArg(y) 14156 v.AddArg2(x, v0) 14157 return true 14158 } 14159 } 14160 func rewriteValueARM_OpLsh32x16(v *Value) bool { 14161 v_1 := v.Args[1] 14162 v_0 := v.Args[0] 14163 b := v.Block 14164 typ := &b.Func.Config.Types 14165 // match: (Lsh32x16 x y) 14166 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14167 for { 14168 x := v_0 14169 y := v_1 14170 v.reset(OpARMCMOVWHSconst) 14171 v.AuxInt = int32ToAuxInt(0) 14172 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14173 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14174 v1.AddArg(y) 14175 v0.AddArg2(x, v1) 14176 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14177 v2.AuxInt = int32ToAuxInt(256) 14178 v2.AddArg(v1) 14179 v.AddArg2(v0, v2) 14180 return true 14181 } 14182 } 14183 func rewriteValueARM_OpLsh32x32(v *Value) bool { 14184 v_1 := v.Args[1] 14185 v_0 := v.Args[0] 14186 b := v.Block 14187 // match: (Lsh32x32 x y) 14188 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14189 for { 14190 x := v_0 14191 y := v_1 14192 v.reset(OpARMCMOVWHSconst) 14193 v.AuxInt = int32ToAuxInt(0) 14194 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14195 v0.AddArg2(x, y) 14196 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14197 v1.AuxInt = int32ToAuxInt(256) 14198 v1.AddArg(y) 14199 v.AddArg2(v0, v1) 14200 return true 14201 } 14202 } 14203 func rewriteValueARM_OpLsh32x64(v *Value) bool { 14204 v_1 := v.Args[1] 14205 v_0 := v.Args[0] 14206 // match: (Lsh32x64 x (Const64 [c])) 14207 // cond: uint64(c) < 32 14208 // result: (SLLconst x [int32(c)]) 14209 for { 14210 x := v_0 14211 if v_1.Op != OpConst64 { 14212 break 14213 } 14214 c := auxIntToInt64(v_1.AuxInt) 14215 if !(uint64(c) < 32) { 14216 break 14217 } 14218 v.reset(OpARMSLLconst) 14219 v.AuxInt = int32ToAuxInt(int32(c)) 14220 v.AddArg(x) 14221 return true 14222 } 14223 // match: (Lsh32x64 _ (Const64 [c])) 14224 // cond: uint64(c) >= 32 14225 // result: (Const32 [0]) 14226 for { 14227 if v_1.Op != OpConst64 { 14228 break 14229 } 14230 c := auxIntToInt64(v_1.AuxInt) 14231 if !(uint64(c) >= 32) { 14232 break 14233 } 14234 v.reset(OpConst32) 14235 v.AuxInt = int32ToAuxInt(0) 14236 return true 14237 } 14238 return false 14239 } 14240 func rewriteValueARM_OpLsh32x8(v *Value) bool { 14241 v_1 := v.Args[1] 14242 v_0 := v.Args[0] 14243 b := v.Block 14244 typ := &b.Func.Config.Types 14245 // match: (Lsh32x8 x y) 14246 // result: (SLL x (ZeroExt8to32 y)) 14247 for { 14248 x := v_0 14249 y := v_1 14250 v.reset(OpARMSLL) 14251 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14252 v0.AddArg(y) 14253 v.AddArg2(x, v0) 14254 return true 14255 } 14256 } 14257 func rewriteValueARM_OpLsh8x16(v *Value) bool { 14258 v_1 := v.Args[1] 14259 v_0 := v.Args[0] 14260 b := v.Block 14261 typ := &b.Func.Config.Types 14262 // match: (Lsh8x16 x y) 14263 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14264 for { 14265 x := v_0 14266 y := v_1 14267 v.reset(OpARMCMOVWHSconst) 14268 v.AuxInt = int32ToAuxInt(0) 14269 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14270 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14271 v1.AddArg(y) 14272 v0.AddArg2(x, v1) 14273 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14274 v2.AuxInt = int32ToAuxInt(256) 14275 v2.AddArg(v1) 14276 v.AddArg2(v0, v2) 14277 return true 14278 } 14279 } 14280 func rewriteValueARM_OpLsh8x32(v *Value) bool { 14281 v_1 := v.Args[1] 14282 v_0 := v.Args[0] 14283 b := v.Block 14284 // match: (Lsh8x32 x y) 14285 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14286 for { 14287 x := v_0 14288 y := v_1 14289 v.reset(OpARMCMOVWHSconst) 14290 v.AuxInt = int32ToAuxInt(0) 14291 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14292 v0.AddArg2(x, y) 14293 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14294 v1.AuxInt = int32ToAuxInt(256) 14295 v1.AddArg(y) 14296 v.AddArg2(v0, v1) 14297 return true 14298 } 14299 } 14300 func rewriteValueARM_OpLsh8x64(v *Value) bool { 14301 v_1 := v.Args[1] 14302 v_0 := v.Args[0] 14303 // match: (Lsh8x64 x (Const64 [c])) 14304 // cond: uint64(c) < 8 14305 // result: (SLLconst x [int32(c)]) 14306 for { 14307 x := v_0 14308 if v_1.Op != OpConst64 { 14309 break 14310 } 14311 c := auxIntToInt64(v_1.AuxInt) 14312 if !(uint64(c) < 8) { 14313 break 14314 } 14315 v.reset(OpARMSLLconst) 14316 v.AuxInt = int32ToAuxInt(int32(c)) 14317 v.AddArg(x) 14318 return true 14319 } 14320 // match: (Lsh8x64 _ (Const64 [c])) 14321 // cond: uint64(c) >= 8 14322 // result: (Const8 [0]) 14323 for { 14324 if v_1.Op != OpConst64 { 14325 break 14326 } 14327 c := auxIntToInt64(v_1.AuxInt) 14328 if !(uint64(c) >= 8) { 14329 break 14330 } 14331 v.reset(OpConst8) 14332 v.AuxInt = int8ToAuxInt(0) 14333 return true 14334 } 14335 return false 14336 } 14337 func rewriteValueARM_OpLsh8x8(v *Value) bool { 14338 v_1 := v.Args[1] 14339 v_0 := v.Args[0] 14340 b := v.Block 14341 typ := &b.Func.Config.Types 14342 // match: (Lsh8x8 x y) 14343 // result: (SLL x (ZeroExt8to32 y)) 14344 for { 14345 x := v_0 14346 y := v_1 14347 v.reset(OpARMSLL) 14348 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14349 v0.AddArg(y) 14350 v.AddArg2(x, v0) 14351 return true 14352 } 14353 } 14354 func rewriteValueARM_OpMod16(v *Value) bool { 14355 v_1 := v.Args[1] 14356 v_0 := v.Args[0] 14357 b := v.Block 14358 typ := &b.Func.Config.Types 14359 // match: (Mod16 x y) 14360 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 14361 for { 14362 x := v_0 14363 y := v_1 14364 v.reset(OpMod32) 14365 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14366 v0.AddArg(x) 14367 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14368 v1.AddArg(y) 14369 v.AddArg2(v0, v1) 14370 return true 14371 } 14372 } 14373 func rewriteValueARM_OpMod16u(v *Value) bool { 14374 v_1 := v.Args[1] 14375 v_0 := v.Args[0] 14376 b := v.Block 14377 typ := &b.Func.Config.Types 14378 // match: (Mod16u x y) 14379 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 14380 for { 14381 x := v_0 14382 y := v_1 14383 v.reset(OpMod32u) 14384 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14385 v0.AddArg(x) 14386 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14387 v1.AddArg(y) 14388 v.AddArg2(v0, v1) 14389 return true 14390 } 14391 } 14392 func rewriteValueARM_OpMod32(v *Value) bool { 14393 v_1 := v.Args[1] 14394 v_0 := v.Args[0] 14395 b := v.Block 14396 typ := &b.Func.Config.Types 14397 // match: (Mod32 x y) 14398 // result: (SUB (XOR <typ.UInt32> (Select1 <typ.UInt32> (CALLudiv (SUB <typ.UInt32> (XOR <typ.UInt32> x (Signmask x)) (Signmask x)) (SUB <typ.UInt32> (XOR <typ.UInt32> y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) 14399 for { 14400 x := v_0 14401 y := v_1 14402 v.reset(OpARMSUB) 14403 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14404 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 14405 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14406 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14407 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14408 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14409 v5.AddArg(x) 14410 v4.AddArg2(x, v5) 14411 v3.AddArg2(v4, v5) 14412 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14413 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14414 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14415 v8.AddArg(y) 14416 v7.AddArg2(y, v8) 14417 v6.AddArg2(v7, v8) 14418 v2.AddArg2(v3, v6) 14419 v1.AddArg(v2) 14420 v0.AddArg2(v1, v5) 14421 v.AddArg2(v0, v5) 14422 return true 14423 } 14424 } 14425 func rewriteValueARM_OpMod32u(v *Value) bool { 14426 v_1 := v.Args[1] 14427 v_0 := v.Args[0] 14428 b := v.Block 14429 typ := &b.Func.Config.Types 14430 // match: (Mod32u x y) 14431 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 14432 for { 14433 x := v_0 14434 y := v_1 14435 v.reset(OpSelect1) 14436 v.Type = typ.UInt32 14437 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14438 v0.AddArg2(x, y) 14439 v.AddArg(v0) 14440 return true 14441 } 14442 } 14443 func rewriteValueARM_OpMod8(v *Value) bool { 14444 v_1 := v.Args[1] 14445 v_0 := v.Args[0] 14446 b := v.Block 14447 typ := &b.Func.Config.Types 14448 // match: (Mod8 x y) 14449 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 14450 for { 14451 x := v_0 14452 y := v_1 14453 v.reset(OpMod32) 14454 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14455 v0.AddArg(x) 14456 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14457 v1.AddArg(y) 14458 v.AddArg2(v0, v1) 14459 return true 14460 } 14461 } 14462 func rewriteValueARM_OpMod8u(v *Value) bool { 14463 v_1 := v.Args[1] 14464 v_0 := v.Args[0] 14465 b := v.Block 14466 typ := &b.Func.Config.Types 14467 // match: (Mod8u x y) 14468 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 14469 for { 14470 x := v_0 14471 y := v_1 14472 v.reset(OpMod32u) 14473 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14474 v0.AddArg(x) 14475 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14476 v1.AddArg(y) 14477 v.AddArg2(v0, v1) 14478 return true 14479 } 14480 } 14481 func rewriteValueARM_OpMove(v *Value) bool { 14482 v_2 := v.Args[2] 14483 v_1 := v.Args[1] 14484 v_0 := v.Args[0] 14485 b := v.Block 14486 config := b.Func.Config 14487 typ := &b.Func.Config.Types 14488 // match: (Move [0] _ _ mem) 14489 // result: mem 14490 for { 14491 if auxIntToInt64(v.AuxInt) != 0 { 14492 break 14493 } 14494 mem := v_2 14495 v.copyOf(mem) 14496 return true 14497 } 14498 // match: (Move [1] dst src mem) 14499 // result: (MOVBstore dst (MOVBUload src mem) mem) 14500 for { 14501 if auxIntToInt64(v.AuxInt) != 1 { 14502 break 14503 } 14504 dst := v_0 14505 src := v_1 14506 mem := v_2 14507 v.reset(OpARMMOVBstore) 14508 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14509 v0.AddArg2(src, mem) 14510 v.AddArg3(dst, v0, mem) 14511 return true 14512 } 14513 // match: (Move [2] {t} dst src mem) 14514 // cond: t.Alignment()%2 == 0 14515 // result: (MOVHstore dst (MOVHUload src mem) mem) 14516 for { 14517 if auxIntToInt64(v.AuxInt) != 2 { 14518 break 14519 } 14520 t := auxToType(v.Aux) 14521 dst := v_0 14522 src := v_1 14523 mem := v_2 14524 if !(t.Alignment()%2 == 0) { 14525 break 14526 } 14527 v.reset(OpARMMOVHstore) 14528 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14529 v0.AddArg2(src, mem) 14530 v.AddArg3(dst, v0, mem) 14531 return true 14532 } 14533 // match: (Move [2] dst src mem) 14534 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 14535 for { 14536 if auxIntToInt64(v.AuxInt) != 2 { 14537 break 14538 } 14539 dst := v_0 14540 src := v_1 14541 mem := v_2 14542 v.reset(OpARMMOVBstore) 14543 v.AuxInt = int32ToAuxInt(1) 14544 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14545 v0.AuxInt = int32ToAuxInt(1) 14546 v0.AddArg2(src, mem) 14547 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14548 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14549 v2.AddArg2(src, mem) 14550 v1.AddArg3(dst, v2, mem) 14551 v.AddArg3(dst, v0, v1) 14552 return true 14553 } 14554 // match: (Move [4] {t} dst src mem) 14555 // cond: t.Alignment()%4 == 0 14556 // result: (MOVWstore dst (MOVWload src mem) mem) 14557 for { 14558 if auxIntToInt64(v.AuxInt) != 4 { 14559 break 14560 } 14561 t := auxToType(v.Aux) 14562 dst := v_0 14563 src := v_1 14564 mem := v_2 14565 if !(t.Alignment()%4 == 0) { 14566 break 14567 } 14568 v.reset(OpARMMOVWstore) 14569 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 14570 v0.AddArg2(src, mem) 14571 v.AddArg3(dst, v0, mem) 14572 return true 14573 } 14574 // match: (Move [4] {t} dst src mem) 14575 // cond: t.Alignment()%2 == 0 14576 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 14577 for { 14578 if auxIntToInt64(v.AuxInt) != 4 { 14579 break 14580 } 14581 t := auxToType(v.Aux) 14582 dst := v_0 14583 src := v_1 14584 mem := v_2 14585 if !(t.Alignment()%2 == 0) { 14586 break 14587 } 14588 v.reset(OpARMMOVHstore) 14589 v.AuxInt = int32ToAuxInt(2) 14590 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14591 v0.AuxInt = int32ToAuxInt(2) 14592 v0.AddArg2(src, mem) 14593 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 14594 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14595 v2.AddArg2(src, mem) 14596 v1.AddArg3(dst, v2, mem) 14597 v.AddArg3(dst, v0, v1) 14598 return true 14599 } 14600 // match: (Move [4] dst src mem) 14601 // result: (MOVBstore [3] dst (MOVBUload [3] src mem) (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)))) 14602 for { 14603 if auxIntToInt64(v.AuxInt) != 4 { 14604 break 14605 } 14606 dst := v_0 14607 src := v_1 14608 mem := v_2 14609 v.reset(OpARMMOVBstore) 14610 v.AuxInt = int32ToAuxInt(3) 14611 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14612 v0.AuxInt = int32ToAuxInt(3) 14613 v0.AddArg2(src, mem) 14614 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14615 v1.AuxInt = int32ToAuxInt(2) 14616 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14617 v2.AuxInt = int32ToAuxInt(2) 14618 v2.AddArg2(src, mem) 14619 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14620 v3.AuxInt = int32ToAuxInt(1) 14621 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14622 v4.AuxInt = int32ToAuxInt(1) 14623 v4.AddArg2(src, mem) 14624 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14625 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14626 v6.AddArg2(src, mem) 14627 v5.AddArg3(dst, v6, mem) 14628 v3.AddArg3(dst, v4, v5) 14629 v1.AddArg3(dst, v2, v3) 14630 v.AddArg3(dst, v0, v1) 14631 return true 14632 } 14633 // match: (Move [3] dst src mem) 14634 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 14635 for { 14636 if auxIntToInt64(v.AuxInt) != 3 { 14637 break 14638 } 14639 dst := v_0 14640 src := v_1 14641 mem := v_2 14642 v.reset(OpARMMOVBstore) 14643 v.AuxInt = int32ToAuxInt(2) 14644 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14645 v0.AuxInt = int32ToAuxInt(2) 14646 v0.AddArg2(src, mem) 14647 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14648 v1.AuxInt = int32ToAuxInt(1) 14649 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14650 v2.AuxInt = int32ToAuxInt(1) 14651 v2.AddArg2(src, mem) 14652 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14653 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14654 v4.AddArg2(src, mem) 14655 v3.AddArg3(dst, v4, mem) 14656 v1.AddArg3(dst, v2, v3) 14657 v.AddArg3(dst, v0, v1) 14658 return true 14659 } 14660 // match: (Move [s] {t} dst src mem) 14661 // cond: s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice && logLargeCopy(v, s) 14662 // result: (DUFFCOPY [8 * (128 - s/4)] dst src mem) 14663 for { 14664 s := auxIntToInt64(v.AuxInt) 14665 t := auxToType(v.Aux) 14666 dst := v_0 14667 src := v_1 14668 mem := v_2 14669 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice && logLargeCopy(v, s)) { 14670 break 14671 } 14672 v.reset(OpARMDUFFCOPY) 14673 v.AuxInt = int64ToAuxInt(8 * (128 - s/4)) 14674 v.AddArg3(dst, src, mem) 14675 return true 14676 } 14677 // match: (Move [s] {t} dst src mem) 14678 // cond: ((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) && logLargeCopy(v, s) 14679 // result: (LoweredMove [t.Alignment()] dst src (ADDconst <src.Type> src [int32(s-moveSize(t.Alignment(), config))]) mem) 14680 for { 14681 s := auxIntToInt64(v.AuxInt) 14682 t := auxToType(v.Aux) 14683 dst := v_0 14684 src := v_1 14685 mem := v_2 14686 if !(((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) && logLargeCopy(v, s)) { 14687 break 14688 } 14689 v.reset(OpARMLoweredMove) 14690 v.AuxInt = int64ToAuxInt(t.Alignment()) 14691 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 14692 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config))) 14693 v0.AddArg(src) 14694 v.AddArg4(dst, src, v0, mem) 14695 return true 14696 } 14697 return false 14698 } 14699 func rewriteValueARM_OpNeg16(v *Value) bool { 14700 v_0 := v.Args[0] 14701 // match: (Neg16 x) 14702 // result: (RSBconst [0] x) 14703 for { 14704 x := v_0 14705 v.reset(OpARMRSBconst) 14706 v.AuxInt = int32ToAuxInt(0) 14707 v.AddArg(x) 14708 return true 14709 } 14710 } 14711 func rewriteValueARM_OpNeg32(v *Value) bool { 14712 v_0 := v.Args[0] 14713 // match: (Neg32 x) 14714 // result: (RSBconst [0] x) 14715 for { 14716 x := v_0 14717 v.reset(OpARMRSBconst) 14718 v.AuxInt = int32ToAuxInt(0) 14719 v.AddArg(x) 14720 return true 14721 } 14722 } 14723 func rewriteValueARM_OpNeg8(v *Value) bool { 14724 v_0 := v.Args[0] 14725 // match: (Neg8 x) 14726 // result: (RSBconst [0] x) 14727 for { 14728 x := v_0 14729 v.reset(OpARMRSBconst) 14730 v.AuxInt = int32ToAuxInt(0) 14731 v.AddArg(x) 14732 return true 14733 } 14734 } 14735 func rewriteValueARM_OpNeq16(v *Value) bool { 14736 v_1 := v.Args[1] 14737 v_0 := v.Args[0] 14738 b := v.Block 14739 typ := &b.Func.Config.Types 14740 // match: (Neq16 x y) 14741 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14742 for { 14743 x := v_0 14744 y := v_1 14745 v.reset(OpARMNotEqual) 14746 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14747 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14748 v1.AddArg(x) 14749 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14750 v2.AddArg(y) 14751 v0.AddArg2(v1, v2) 14752 v.AddArg(v0) 14753 return true 14754 } 14755 } 14756 func rewriteValueARM_OpNeq32(v *Value) bool { 14757 v_1 := v.Args[1] 14758 v_0 := v.Args[0] 14759 b := v.Block 14760 // match: (Neq32 x y) 14761 // result: (NotEqual (CMP x y)) 14762 for { 14763 x := v_0 14764 y := v_1 14765 v.reset(OpARMNotEqual) 14766 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14767 v0.AddArg2(x, y) 14768 v.AddArg(v0) 14769 return true 14770 } 14771 } 14772 func rewriteValueARM_OpNeq32F(v *Value) bool { 14773 v_1 := v.Args[1] 14774 v_0 := v.Args[0] 14775 b := v.Block 14776 // match: (Neq32F x y) 14777 // result: (NotEqual (CMPF x y)) 14778 for { 14779 x := v_0 14780 y := v_1 14781 v.reset(OpARMNotEqual) 14782 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 14783 v0.AddArg2(x, y) 14784 v.AddArg(v0) 14785 return true 14786 } 14787 } 14788 func rewriteValueARM_OpNeq64F(v *Value) bool { 14789 v_1 := v.Args[1] 14790 v_0 := v.Args[0] 14791 b := v.Block 14792 // match: (Neq64F x y) 14793 // result: (NotEqual (CMPD x y)) 14794 for { 14795 x := v_0 14796 y := v_1 14797 v.reset(OpARMNotEqual) 14798 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 14799 v0.AddArg2(x, y) 14800 v.AddArg(v0) 14801 return true 14802 } 14803 } 14804 func rewriteValueARM_OpNeq8(v *Value) bool { 14805 v_1 := v.Args[1] 14806 v_0 := v.Args[0] 14807 b := v.Block 14808 typ := &b.Func.Config.Types 14809 // match: (Neq8 x y) 14810 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14811 for { 14812 x := v_0 14813 y := v_1 14814 v.reset(OpARMNotEqual) 14815 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14816 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14817 v1.AddArg(x) 14818 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14819 v2.AddArg(y) 14820 v0.AddArg2(v1, v2) 14821 v.AddArg(v0) 14822 return true 14823 } 14824 } 14825 func rewriteValueARM_OpNeqPtr(v *Value) bool { 14826 v_1 := v.Args[1] 14827 v_0 := v.Args[0] 14828 b := v.Block 14829 // match: (NeqPtr x y) 14830 // result: (NotEqual (CMP x y)) 14831 for { 14832 x := v_0 14833 y := v_1 14834 v.reset(OpARMNotEqual) 14835 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14836 v0.AddArg2(x, y) 14837 v.AddArg(v0) 14838 return true 14839 } 14840 } 14841 func rewriteValueARM_OpNot(v *Value) bool { 14842 v_0 := v.Args[0] 14843 // match: (Not x) 14844 // result: (XORconst [1] x) 14845 for { 14846 x := v_0 14847 v.reset(OpARMXORconst) 14848 v.AuxInt = int32ToAuxInt(1) 14849 v.AddArg(x) 14850 return true 14851 } 14852 } 14853 func rewriteValueARM_OpOffPtr(v *Value) bool { 14854 v_0 := v.Args[0] 14855 // match: (OffPtr [off] ptr:(SP)) 14856 // result: (MOVWaddr [int32(off)] ptr) 14857 for { 14858 off := auxIntToInt64(v.AuxInt) 14859 ptr := v_0 14860 if ptr.Op != OpSP { 14861 break 14862 } 14863 v.reset(OpARMMOVWaddr) 14864 v.AuxInt = int32ToAuxInt(int32(off)) 14865 v.AddArg(ptr) 14866 return true 14867 } 14868 // match: (OffPtr [off] ptr) 14869 // result: (ADDconst [int32(off)] ptr) 14870 for { 14871 off := auxIntToInt64(v.AuxInt) 14872 ptr := v_0 14873 v.reset(OpARMADDconst) 14874 v.AuxInt = int32ToAuxInt(int32(off)) 14875 v.AddArg(ptr) 14876 return true 14877 } 14878 } 14879 func rewriteValueARM_OpPanicBounds(v *Value) bool { 14880 v_2 := v.Args[2] 14881 v_1 := v.Args[1] 14882 v_0 := v.Args[0] 14883 // match: (PanicBounds [kind] x y mem) 14884 // cond: boundsABI(kind) == 0 14885 // result: (LoweredPanicBoundsA [kind] x y mem) 14886 for { 14887 kind := auxIntToInt64(v.AuxInt) 14888 x := v_0 14889 y := v_1 14890 mem := v_2 14891 if !(boundsABI(kind) == 0) { 14892 break 14893 } 14894 v.reset(OpARMLoweredPanicBoundsA) 14895 v.AuxInt = int64ToAuxInt(kind) 14896 v.AddArg3(x, y, mem) 14897 return true 14898 } 14899 // match: (PanicBounds [kind] x y mem) 14900 // cond: boundsABI(kind) == 1 14901 // result: (LoweredPanicBoundsB [kind] x y mem) 14902 for { 14903 kind := auxIntToInt64(v.AuxInt) 14904 x := v_0 14905 y := v_1 14906 mem := v_2 14907 if !(boundsABI(kind) == 1) { 14908 break 14909 } 14910 v.reset(OpARMLoweredPanicBoundsB) 14911 v.AuxInt = int64ToAuxInt(kind) 14912 v.AddArg3(x, y, mem) 14913 return true 14914 } 14915 // match: (PanicBounds [kind] x y mem) 14916 // cond: boundsABI(kind) == 2 14917 // result: (LoweredPanicBoundsC [kind] x y mem) 14918 for { 14919 kind := auxIntToInt64(v.AuxInt) 14920 x := v_0 14921 y := v_1 14922 mem := v_2 14923 if !(boundsABI(kind) == 2) { 14924 break 14925 } 14926 v.reset(OpARMLoweredPanicBoundsC) 14927 v.AuxInt = int64ToAuxInt(kind) 14928 v.AddArg3(x, y, mem) 14929 return true 14930 } 14931 return false 14932 } 14933 func rewriteValueARM_OpPanicExtend(v *Value) bool { 14934 v_3 := v.Args[3] 14935 v_2 := v.Args[2] 14936 v_1 := v.Args[1] 14937 v_0 := v.Args[0] 14938 // match: (PanicExtend [kind] hi lo y mem) 14939 // cond: boundsABI(kind) == 0 14940 // result: (LoweredPanicExtendA [kind] hi lo y mem) 14941 for { 14942 kind := auxIntToInt64(v.AuxInt) 14943 hi := v_0 14944 lo := v_1 14945 y := v_2 14946 mem := v_3 14947 if !(boundsABI(kind) == 0) { 14948 break 14949 } 14950 v.reset(OpARMLoweredPanicExtendA) 14951 v.AuxInt = int64ToAuxInt(kind) 14952 v.AddArg4(hi, lo, y, mem) 14953 return true 14954 } 14955 // match: (PanicExtend [kind] hi lo y mem) 14956 // cond: boundsABI(kind) == 1 14957 // result: (LoweredPanicExtendB [kind] hi lo y mem) 14958 for { 14959 kind := auxIntToInt64(v.AuxInt) 14960 hi := v_0 14961 lo := v_1 14962 y := v_2 14963 mem := v_3 14964 if !(boundsABI(kind) == 1) { 14965 break 14966 } 14967 v.reset(OpARMLoweredPanicExtendB) 14968 v.AuxInt = int64ToAuxInt(kind) 14969 v.AddArg4(hi, lo, y, mem) 14970 return true 14971 } 14972 // match: (PanicExtend [kind] hi lo y mem) 14973 // cond: boundsABI(kind) == 2 14974 // result: (LoweredPanicExtendC [kind] hi lo y mem) 14975 for { 14976 kind := auxIntToInt64(v.AuxInt) 14977 hi := v_0 14978 lo := v_1 14979 y := v_2 14980 mem := v_3 14981 if !(boundsABI(kind) == 2) { 14982 break 14983 } 14984 v.reset(OpARMLoweredPanicExtendC) 14985 v.AuxInt = int64ToAuxInt(kind) 14986 v.AddArg4(hi, lo, y, mem) 14987 return true 14988 } 14989 return false 14990 } 14991 func rewriteValueARM_OpRotateLeft16(v *Value) bool { 14992 v_1 := v.Args[1] 14993 v_0 := v.Args[0] 14994 b := v.Block 14995 typ := &b.Func.Config.Types 14996 // match: (RotateLeft16 <t> x (MOVWconst [c])) 14997 // result: (Or16 (Lsh16x32 <t> x (MOVWconst [c&15])) (Rsh16Ux32 <t> x (MOVWconst [-c&15]))) 14998 for { 14999 t := v.Type 15000 x := v_0 15001 if v_1.Op != OpARMMOVWconst { 15002 break 15003 } 15004 c := auxIntToInt32(v_1.AuxInt) 15005 v.reset(OpOr16) 15006 v0 := b.NewValue0(v.Pos, OpLsh16x32, t) 15007 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15008 v1.AuxInt = int32ToAuxInt(c & 15) 15009 v0.AddArg2(x, v1) 15010 v2 := b.NewValue0(v.Pos, OpRsh16Ux32, t) 15011 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15012 v3.AuxInt = int32ToAuxInt(-c & 15) 15013 v2.AddArg2(x, v3) 15014 v.AddArg2(v0, v2) 15015 return true 15016 } 15017 return false 15018 } 15019 func rewriteValueARM_OpRotateLeft32(v *Value) bool { 15020 v_1 := v.Args[1] 15021 v_0 := v.Args[0] 15022 b := v.Block 15023 // match: (RotateLeft32 x y) 15024 // result: (SRR x (RSBconst [0] <y.Type> y)) 15025 for { 15026 x := v_0 15027 y := v_1 15028 v.reset(OpARMSRR) 15029 v0 := b.NewValue0(v.Pos, OpARMRSBconst, y.Type) 15030 v0.AuxInt = int32ToAuxInt(0) 15031 v0.AddArg(y) 15032 v.AddArg2(x, v0) 15033 return true 15034 } 15035 } 15036 func rewriteValueARM_OpRotateLeft8(v *Value) bool { 15037 v_1 := v.Args[1] 15038 v_0 := v.Args[0] 15039 b := v.Block 15040 typ := &b.Func.Config.Types 15041 // match: (RotateLeft8 <t> x (MOVWconst [c])) 15042 // result: (Or8 (Lsh8x32 <t> x (MOVWconst [c&7])) (Rsh8Ux32 <t> x (MOVWconst [-c&7]))) 15043 for { 15044 t := v.Type 15045 x := v_0 15046 if v_1.Op != OpARMMOVWconst { 15047 break 15048 } 15049 c := auxIntToInt32(v_1.AuxInt) 15050 v.reset(OpOr8) 15051 v0 := b.NewValue0(v.Pos, OpLsh8x32, t) 15052 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15053 v1.AuxInt = int32ToAuxInt(c & 7) 15054 v0.AddArg2(x, v1) 15055 v2 := b.NewValue0(v.Pos, OpRsh8Ux32, t) 15056 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15057 v3.AuxInt = int32ToAuxInt(-c & 7) 15058 v2.AddArg2(x, v3) 15059 v.AddArg2(v0, v2) 15060 return true 15061 } 15062 return false 15063 } 15064 func rewriteValueARM_OpRsh16Ux16(v *Value) bool { 15065 v_1 := v.Args[1] 15066 v_0 := v.Args[0] 15067 b := v.Block 15068 typ := &b.Func.Config.Types 15069 // match: (Rsh16Ux16 x y) 15070 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15071 for { 15072 x := v_0 15073 y := v_1 15074 v.reset(OpARMCMOVWHSconst) 15075 v.AuxInt = int32ToAuxInt(0) 15076 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15077 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15078 v1.AddArg(x) 15079 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15080 v2.AddArg(y) 15081 v0.AddArg2(v1, v2) 15082 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15083 v3.AuxInt = int32ToAuxInt(256) 15084 v3.AddArg(v2) 15085 v.AddArg2(v0, v3) 15086 return true 15087 } 15088 } 15089 func rewriteValueARM_OpRsh16Ux32(v *Value) bool { 15090 v_1 := v.Args[1] 15091 v_0 := v.Args[0] 15092 b := v.Block 15093 typ := &b.Func.Config.Types 15094 // match: (Rsh16Ux32 x y) 15095 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15096 for { 15097 x := v_0 15098 y := v_1 15099 v.reset(OpARMCMOVWHSconst) 15100 v.AuxInt = int32ToAuxInt(0) 15101 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15102 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15103 v1.AddArg(x) 15104 v0.AddArg2(v1, y) 15105 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15106 v2.AuxInt = int32ToAuxInt(256) 15107 v2.AddArg(y) 15108 v.AddArg2(v0, v2) 15109 return true 15110 } 15111 } 15112 func rewriteValueARM_OpRsh16Ux64(v *Value) bool { 15113 v_1 := v.Args[1] 15114 v_0 := v.Args[0] 15115 b := v.Block 15116 typ := &b.Func.Config.Types 15117 // match: (Rsh16Ux64 x (Const64 [c])) 15118 // cond: uint64(c) < 16 15119 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [int32(c+16)]) 15120 for { 15121 x := v_0 15122 if v_1.Op != OpConst64 { 15123 break 15124 } 15125 c := auxIntToInt64(v_1.AuxInt) 15126 if !(uint64(c) < 16) { 15127 break 15128 } 15129 v.reset(OpARMSRLconst) 15130 v.AuxInt = int32ToAuxInt(int32(c + 16)) 15131 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15132 v0.AuxInt = int32ToAuxInt(16) 15133 v0.AddArg(x) 15134 v.AddArg(v0) 15135 return true 15136 } 15137 // match: (Rsh16Ux64 _ (Const64 [c])) 15138 // cond: uint64(c) >= 16 15139 // result: (Const16 [0]) 15140 for { 15141 if v_1.Op != OpConst64 { 15142 break 15143 } 15144 c := auxIntToInt64(v_1.AuxInt) 15145 if !(uint64(c) >= 16) { 15146 break 15147 } 15148 v.reset(OpConst16) 15149 v.AuxInt = int16ToAuxInt(0) 15150 return true 15151 } 15152 return false 15153 } 15154 func rewriteValueARM_OpRsh16Ux8(v *Value) bool { 15155 v_1 := v.Args[1] 15156 v_0 := v.Args[0] 15157 b := v.Block 15158 typ := &b.Func.Config.Types 15159 // match: (Rsh16Ux8 x y) 15160 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 15161 for { 15162 x := v_0 15163 y := v_1 15164 v.reset(OpARMSRL) 15165 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15166 v0.AddArg(x) 15167 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15168 v1.AddArg(y) 15169 v.AddArg2(v0, v1) 15170 return true 15171 } 15172 } 15173 func rewriteValueARM_OpRsh16x16(v *Value) bool { 15174 v_1 := v.Args[1] 15175 v_0 := v.Args[0] 15176 b := v.Block 15177 typ := &b.Func.Config.Types 15178 // match: (Rsh16x16 x y) 15179 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15180 for { 15181 x := v_0 15182 y := v_1 15183 v.reset(OpARMSRAcond) 15184 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15185 v0.AddArg(x) 15186 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15187 v1.AddArg(y) 15188 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15189 v2.AuxInt = int32ToAuxInt(256) 15190 v2.AddArg(v1) 15191 v.AddArg3(v0, v1, v2) 15192 return true 15193 } 15194 } 15195 func rewriteValueARM_OpRsh16x32(v *Value) bool { 15196 v_1 := v.Args[1] 15197 v_0 := v.Args[0] 15198 b := v.Block 15199 typ := &b.Func.Config.Types 15200 // match: (Rsh16x32 x y) 15201 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 15202 for { 15203 x := v_0 15204 y := v_1 15205 v.reset(OpARMSRAcond) 15206 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15207 v0.AddArg(x) 15208 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15209 v1.AuxInt = int32ToAuxInt(256) 15210 v1.AddArg(y) 15211 v.AddArg3(v0, y, v1) 15212 return true 15213 } 15214 } 15215 func rewriteValueARM_OpRsh16x64(v *Value) bool { 15216 v_1 := v.Args[1] 15217 v_0 := v.Args[0] 15218 b := v.Block 15219 typ := &b.Func.Config.Types 15220 // match: (Rsh16x64 x (Const64 [c])) 15221 // cond: uint64(c) < 16 15222 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [int32(c+16)]) 15223 for { 15224 x := v_0 15225 if v_1.Op != OpConst64 { 15226 break 15227 } 15228 c := auxIntToInt64(v_1.AuxInt) 15229 if !(uint64(c) < 16) { 15230 break 15231 } 15232 v.reset(OpARMSRAconst) 15233 v.AuxInt = int32ToAuxInt(int32(c + 16)) 15234 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15235 v0.AuxInt = int32ToAuxInt(16) 15236 v0.AddArg(x) 15237 v.AddArg(v0) 15238 return true 15239 } 15240 // match: (Rsh16x64 x (Const64 [c])) 15241 // cond: uint64(c) >= 16 15242 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 15243 for { 15244 x := v_0 15245 if v_1.Op != OpConst64 { 15246 break 15247 } 15248 c := auxIntToInt64(v_1.AuxInt) 15249 if !(uint64(c) >= 16) { 15250 break 15251 } 15252 v.reset(OpARMSRAconst) 15253 v.AuxInt = int32ToAuxInt(31) 15254 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15255 v0.AuxInt = int32ToAuxInt(16) 15256 v0.AddArg(x) 15257 v.AddArg(v0) 15258 return true 15259 } 15260 return false 15261 } 15262 func rewriteValueARM_OpRsh16x8(v *Value) bool { 15263 v_1 := v.Args[1] 15264 v_0 := v.Args[0] 15265 b := v.Block 15266 typ := &b.Func.Config.Types 15267 // match: (Rsh16x8 x y) 15268 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 15269 for { 15270 x := v_0 15271 y := v_1 15272 v.reset(OpARMSRA) 15273 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15274 v0.AddArg(x) 15275 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15276 v1.AddArg(y) 15277 v.AddArg2(v0, v1) 15278 return true 15279 } 15280 } 15281 func rewriteValueARM_OpRsh32Ux16(v *Value) bool { 15282 v_1 := v.Args[1] 15283 v_0 := v.Args[0] 15284 b := v.Block 15285 typ := &b.Func.Config.Types 15286 // match: (Rsh32Ux16 x y) 15287 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15288 for { 15289 x := v_0 15290 y := v_1 15291 v.reset(OpARMCMOVWHSconst) 15292 v.AuxInt = int32ToAuxInt(0) 15293 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15294 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15295 v1.AddArg(y) 15296 v0.AddArg2(x, v1) 15297 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15298 v2.AuxInt = int32ToAuxInt(256) 15299 v2.AddArg(v1) 15300 v.AddArg2(v0, v2) 15301 return true 15302 } 15303 } 15304 func rewriteValueARM_OpRsh32Ux32(v *Value) bool { 15305 v_1 := v.Args[1] 15306 v_0 := v.Args[0] 15307 b := v.Block 15308 // match: (Rsh32Ux32 x y) 15309 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 15310 for { 15311 x := v_0 15312 y := v_1 15313 v.reset(OpARMCMOVWHSconst) 15314 v.AuxInt = int32ToAuxInt(0) 15315 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15316 v0.AddArg2(x, y) 15317 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15318 v1.AuxInt = int32ToAuxInt(256) 15319 v1.AddArg(y) 15320 v.AddArg2(v0, v1) 15321 return true 15322 } 15323 } 15324 func rewriteValueARM_OpRsh32Ux64(v *Value) bool { 15325 v_1 := v.Args[1] 15326 v_0 := v.Args[0] 15327 // match: (Rsh32Ux64 x (Const64 [c])) 15328 // cond: uint64(c) < 32 15329 // result: (SRLconst x [int32(c)]) 15330 for { 15331 x := v_0 15332 if v_1.Op != OpConst64 { 15333 break 15334 } 15335 c := auxIntToInt64(v_1.AuxInt) 15336 if !(uint64(c) < 32) { 15337 break 15338 } 15339 v.reset(OpARMSRLconst) 15340 v.AuxInt = int32ToAuxInt(int32(c)) 15341 v.AddArg(x) 15342 return true 15343 } 15344 // match: (Rsh32Ux64 _ (Const64 [c])) 15345 // cond: uint64(c) >= 32 15346 // result: (Const32 [0]) 15347 for { 15348 if v_1.Op != OpConst64 { 15349 break 15350 } 15351 c := auxIntToInt64(v_1.AuxInt) 15352 if !(uint64(c) >= 32) { 15353 break 15354 } 15355 v.reset(OpConst32) 15356 v.AuxInt = int32ToAuxInt(0) 15357 return true 15358 } 15359 return false 15360 } 15361 func rewriteValueARM_OpRsh32Ux8(v *Value) bool { 15362 v_1 := v.Args[1] 15363 v_0 := v.Args[0] 15364 b := v.Block 15365 typ := &b.Func.Config.Types 15366 // match: (Rsh32Ux8 x y) 15367 // result: (SRL x (ZeroExt8to32 y)) 15368 for { 15369 x := v_0 15370 y := v_1 15371 v.reset(OpARMSRL) 15372 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15373 v0.AddArg(y) 15374 v.AddArg2(x, v0) 15375 return true 15376 } 15377 } 15378 func rewriteValueARM_OpRsh32x16(v *Value) bool { 15379 v_1 := v.Args[1] 15380 v_0 := v.Args[0] 15381 b := v.Block 15382 typ := &b.Func.Config.Types 15383 // match: (Rsh32x16 x y) 15384 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15385 for { 15386 x := v_0 15387 y := v_1 15388 v.reset(OpARMSRAcond) 15389 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15390 v0.AddArg(y) 15391 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15392 v1.AuxInt = int32ToAuxInt(256) 15393 v1.AddArg(v0) 15394 v.AddArg3(x, v0, v1) 15395 return true 15396 } 15397 } 15398 func rewriteValueARM_OpRsh32x32(v *Value) bool { 15399 v_1 := v.Args[1] 15400 v_0 := v.Args[0] 15401 b := v.Block 15402 // match: (Rsh32x32 x y) 15403 // result: (SRAcond x y (CMPconst [256] y)) 15404 for { 15405 x := v_0 15406 y := v_1 15407 v.reset(OpARMSRAcond) 15408 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15409 v0.AuxInt = int32ToAuxInt(256) 15410 v0.AddArg(y) 15411 v.AddArg3(x, y, v0) 15412 return true 15413 } 15414 } 15415 func rewriteValueARM_OpRsh32x64(v *Value) bool { 15416 v_1 := v.Args[1] 15417 v_0 := v.Args[0] 15418 // match: (Rsh32x64 x (Const64 [c])) 15419 // cond: uint64(c) < 32 15420 // result: (SRAconst x [int32(c)]) 15421 for { 15422 x := v_0 15423 if v_1.Op != OpConst64 { 15424 break 15425 } 15426 c := auxIntToInt64(v_1.AuxInt) 15427 if !(uint64(c) < 32) { 15428 break 15429 } 15430 v.reset(OpARMSRAconst) 15431 v.AuxInt = int32ToAuxInt(int32(c)) 15432 v.AddArg(x) 15433 return true 15434 } 15435 // match: (Rsh32x64 x (Const64 [c])) 15436 // cond: uint64(c) >= 32 15437 // result: (SRAconst x [31]) 15438 for { 15439 x := v_0 15440 if v_1.Op != OpConst64 { 15441 break 15442 } 15443 c := auxIntToInt64(v_1.AuxInt) 15444 if !(uint64(c) >= 32) { 15445 break 15446 } 15447 v.reset(OpARMSRAconst) 15448 v.AuxInt = int32ToAuxInt(31) 15449 v.AddArg(x) 15450 return true 15451 } 15452 return false 15453 } 15454 func rewriteValueARM_OpRsh32x8(v *Value) bool { 15455 v_1 := v.Args[1] 15456 v_0 := v.Args[0] 15457 b := v.Block 15458 typ := &b.Func.Config.Types 15459 // match: (Rsh32x8 x y) 15460 // result: (SRA x (ZeroExt8to32 y)) 15461 for { 15462 x := v_0 15463 y := v_1 15464 v.reset(OpARMSRA) 15465 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15466 v0.AddArg(y) 15467 v.AddArg2(x, v0) 15468 return true 15469 } 15470 } 15471 func rewriteValueARM_OpRsh8Ux16(v *Value) bool { 15472 v_1 := v.Args[1] 15473 v_0 := v.Args[0] 15474 b := v.Block 15475 typ := &b.Func.Config.Types 15476 // match: (Rsh8Ux16 x y) 15477 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15478 for { 15479 x := v_0 15480 y := v_1 15481 v.reset(OpARMCMOVWHSconst) 15482 v.AuxInt = int32ToAuxInt(0) 15483 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15484 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15485 v1.AddArg(x) 15486 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15487 v2.AddArg(y) 15488 v0.AddArg2(v1, v2) 15489 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15490 v3.AuxInt = int32ToAuxInt(256) 15491 v3.AddArg(v2) 15492 v.AddArg2(v0, v3) 15493 return true 15494 } 15495 } 15496 func rewriteValueARM_OpRsh8Ux32(v *Value) bool { 15497 v_1 := v.Args[1] 15498 v_0 := v.Args[0] 15499 b := v.Block 15500 typ := &b.Func.Config.Types 15501 // match: (Rsh8Ux32 x y) 15502 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 15503 for { 15504 x := v_0 15505 y := v_1 15506 v.reset(OpARMCMOVWHSconst) 15507 v.AuxInt = int32ToAuxInt(0) 15508 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15509 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15510 v1.AddArg(x) 15511 v0.AddArg2(v1, y) 15512 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15513 v2.AuxInt = int32ToAuxInt(256) 15514 v2.AddArg(y) 15515 v.AddArg2(v0, v2) 15516 return true 15517 } 15518 } 15519 func rewriteValueARM_OpRsh8Ux64(v *Value) bool { 15520 v_1 := v.Args[1] 15521 v_0 := v.Args[0] 15522 b := v.Block 15523 typ := &b.Func.Config.Types 15524 // match: (Rsh8Ux64 x (Const64 [c])) 15525 // cond: uint64(c) < 8 15526 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [int32(c+24)]) 15527 for { 15528 x := v_0 15529 if v_1.Op != OpConst64 { 15530 break 15531 } 15532 c := auxIntToInt64(v_1.AuxInt) 15533 if !(uint64(c) < 8) { 15534 break 15535 } 15536 v.reset(OpARMSRLconst) 15537 v.AuxInt = int32ToAuxInt(int32(c + 24)) 15538 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15539 v0.AuxInt = int32ToAuxInt(24) 15540 v0.AddArg(x) 15541 v.AddArg(v0) 15542 return true 15543 } 15544 // match: (Rsh8Ux64 _ (Const64 [c])) 15545 // cond: uint64(c) >= 8 15546 // result: (Const8 [0]) 15547 for { 15548 if v_1.Op != OpConst64 { 15549 break 15550 } 15551 c := auxIntToInt64(v_1.AuxInt) 15552 if !(uint64(c) >= 8) { 15553 break 15554 } 15555 v.reset(OpConst8) 15556 v.AuxInt = int8ToAuxInt(0) 15557 return true 15558 } 15559 return false 15560 } 15561 func rewriteValueARM_OpRsh8Ux8(v *Value) bool { 15562 v_1 := v.Args[1] 15563 v_0 := v.Args[0] 15564 b := v.Block 15565 typ := &b.Func.Config.Types 15566 // match: (Rsh8Ux8 x y) 15567 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 15568 for { 15569 x := v_0 15570 y := v_1 15571 v.reset(OpARMSRL) 15572 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15573 v0.AddArg(x) 15574 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15575 v1.AddArg(y) 15576 v.AddArg2(v0, v1) 15577 return true 15578 } 15579 } 15580 func rewriteValueARM_OpRsh8x16(v *Value) bool { 15581 v_1 := v.Args[1] 15582 v_0 := v.Args[0] 15583 b := v.Block 15584 typ := &b.Func.Config.Types 15585 // match: (Rsh8x16 x y) 15586 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15587 for { 15588 x := v_0 15589 y := v_1 15590 v.reset(OpARMSRAcond) 15591 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15592 v0.AddArg(x) 15593 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15594 v1.AddArg(y) 15595 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15596 v2.AuxInt = int32ToAuxInt(256) 15597 v2.AddArg(v1) 15598 v.AddArg3(v0, v1, v2) 15599 return true 15600 } 15601 } 15602 func rewriteValueARM_OpRsh8x32(v *Value) bool { 15603 v_1 := v.Args[1] 15604 v_0 := v.Args[0] 15605 b := v.Block 15606 typ := &b.Func.Config.Types 15607 // match: (Rsh8x32 x y) 15608 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 15609 for { 15610 x := v_0 15611 y := v_1 15612 v.reset(OpARMSRAcond) 15613 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15614 v0.AddArg(x) 15615 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15616 v1.AuxInt = int32ToAuxInt(256) 15617 v1.AddArg(y) 15618 v.AddArg3(v0, y, v1) 15619 return true 15620 } 15621 } 15622 func rewriteValueARM_OpRsh8x64(v *Value) bool { 15623 v_1 := v.Args[1] 15624 v_0 := v.Args[0] 15625 b := v.Block 15626 typ := &b.Func.Config.Types 15627 // match: (Rsh8x64 x (Const64 [c])) 15628 // cond: uint64(c) < 8 15629 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [int32(c+24)]) 15630 for { 15631 x := v_0 15632 if v_1.Op != OpConst64 { 15633 break 15634 } 15635 c := auxIntToInt64(v_1.AuxInt) 15636 if !(uint64(c) < 8) { 15637 break 15638 } 15639 v.reset(OpARMSRAconst) 15640 v.AuxInt = int32ToAuxInt(int32(c + 24)) 15641 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15642 v0.AuxInt = int32ToAuxInt(24) 15643 v0.AddArg(x) 15644 v.AddArg(v0) 15645 return true 15646 } 15647 // match: (Rsh8x64 x (Const64 [c])) 15648 // cond: uint64(c) >= 8 15649 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 15650 for { 15651 x := v_0 15652 if v_1.Op != OpConst64 { 15653 break 15654 } 15655 c := auxIntToInt64(v_1.AuxInt) 15656 if !(uint64(c) >= 8) { 15657 break 15658 } 15659 v.reset(OpARMSRAconst) 15660 v.AuxInt = int32ToAuxInt(31) 15661 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15662 v0.AuxInt = int32ToAuxInt(24) 15663 v0.AddArg(x) 15664 v.AddArg(v0) 15665 return true 15666 } 15667 return false 15668 } 15669 func rewriteValueARM_OpRsh8x8(v *Value) bool { 15670 v_1 := v.Args[1] 15671 v_0 := v.Args[0] 15672 b := v.Block 15673 typ := &b.Func.Config.Types 15674 // match: (Rsh8x8 x y) 15675 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 15676 for { 15677 x := v_0 15678 y := v_1 15679 v.reset(OpARMSRA) 15680 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15681 v0.AddArg(x) 15682 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15683 v1.AddArg(y) 15684 v.AddArg2(v0, v1) 15685 return true 15686 } 15687 } 15688 func rewriteValueARM_OpSelect0(v *Value) bool { 15689 v_0 := v.Args[0] 15690 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 15691 // result: x 15692 for { 15693 if v_0.Op != OpARMCALLudiv { 15694 break 15695 } 15696 _ = v_0.Args[1] 15697 x := v_0.Args[0] 15698 v_0_1 := v_0.Args[1] 15699 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 { 15700 break 15701 } 15702 v.copyOf(x) 15703 return true 15704 } 15705 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 15706 // cond: isPowerOfTwo32(c) 15707 // result: (SRLconst [int32(log32(c))] x) 15708 for { 15709 if v_0.Op != OpARMCALLudiv { 15710 break 15711 } 15712 _ = v_0.Args[1] 15713 x := v_0.Args[0] 15714 v_0_1 := v_0.Args[1] 15715 if v_0_1.Op != OpARMMOVWconst { 15716 break 15717 } 15718 c := auxIntToInt32(v_0_1.AuxInt) 15719 if !(isPowerOfTwo32(c)) { 15720 break 15721 } 15722 v.reset(OpARMSRLconst) 15723 v.AuxInt = int32ToAuxInt(int32(log32(c))) 15724 v.AddArg(x) 15725 return true 15726 } 15727 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 15728 // cond: d != 0 15729 // result: (MOVWconst [int32(uint32(c)/uint32(d))]) 15730 for { 15731 if v_0.Op != OpARMCALLudiv { 15732 break 15733 } 15734 _ = v_0.Args[1] 15735 v_0_0 := v_0.Args[0] 15736 if v_0_0.Op != OpARMMOVWconst { 15737 break 15738 } 15739 c := auxIntToInt32(v_0_0.AuxInt) 15740 v_0_1 := v_0.Args[1] 15741 if v_0_1.Op != OpARMMOVWconst { 15742 break 15743 } 15744 d := auxIntToInt32(v_0_1.AuxInt) 15745 if !(d != 0) { 15746 break 15747 } 15748 v.reset(OpARMMOVWconst) 15749 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d))) 15750 return true 15751 } 15752 return false 15753 } 15754 func rewriteValueARM_OpSelect1(v *Value) bool { 15755 v_0 := v.Args[0] 15756 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 15757 // result: (MOVWconst [0]) 15758 for { 15759 if v_0.Op != OpARMCALLudiv { 15760 break 15761 } 15762 _ = v_0.Args[1] 15763 v_0_1 := v_0.Args[1] 15764 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 { 15765 break 15766 } 15767 v.reset(OpARMMOVWconst) 15768 v.AuxInt = int32ToAuxInt(0) 15769 return true 15770 } 15771 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 15772 // cond: isPowerOfTwo32(c) 15773 // result: (ANDconst [c-1] x) 15774 for { 15775 if v_0.Op != OpARMCALLudiv { 15776 break 15777 } 15778 _ = v_0.Args[1] 15779 x := v_0.Args[0] 15780 v_0_1 := v_0.Args[1] 15781 if v_0_1.Op != OpARMMOVWconst { 15782 break 15783 } 15784 c := auxIntToInt32(v_0_1.AuxInt) 15785 if !(isPowerOfTwo32(c)) { 15786 break 15787 } 15788 v.reset(OpARMANDconst) 15789 v.AuxInt = int32ToAuxInt(c - 1) 15790 v.AddArg(x) 15791 return true 15792 } 15793 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 15794 // cond: d != 0 15795 // result: (MOVWconst [int32(uint32(c)%uint32(d))]) 15796 for { 15797 if v_0.Op != OpARMCALLudiv { 15798 break 15799 } 15800 _ = v_0.Args[1] 15801 v_0_0 := v_0.Args[0] 15802 if v_0_0.Op != OpARMMOVWconst { 15803 break 15804 } 15805 c := auxIntToInt32(v_0_0.AuxInt) 15806 v_0_1 := v_0.Args[1] 15807 if v_0_1.Op != OpARMMOVWconst { 15808 break 15809 } 15810 d := auxIntToInt32(v_0_1.AuxInt) 15811 if !(d != 0) { 15812 break 15813 } 15814 v.reset(OpARMMOVWconst) 15815 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d))) 15816 return true 15817 } 15818 return false 15819 } 15820 func rewriteValueARM_OpSignmask(v *Value) bool { 15821 v_0 := v.Args[0] 15822 // match: (Signmask x) 15823 // result: (SRAconst x [31]) 15824 for { 15825 x := v_0 15826 v.reset(OpARMSRAconst) 15827 v.AuxInt = int32ToAuxInt(31) 15828 v.AddArg(x) 15829 return true 15830 } 15831 } 15832 func rewriteValueARM_OpSlicemask(v *Value) bool { 15833 v_0 := v.Args[0] 15834 b := v.Block 15835 // match: (Slicemask <t> x) 15836 // result: (SRAconst (RSBconst <t> [0] x) [31]) 15837 for { 15838 t := v.Type 15839 x := v_0 15840 v.reset(OpARMSRAconst) 15841 v.AuxInt = int32ToAuxInt(31) 15842 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 15843 v0.AuxInt = int32ToAuxInt(0) 15844 v0.AddArg(x) 15845 v.AddArg(v0) 15846 return true 15847 } 15848 } 15849 func rewriteValueARM_OpStore(v *Value) bool { 15850 v_2 := v.Args[2] 15851 v_1 := v.Args[1] 15852 v_0 := v.Args[0] 15853 // match: (Store {t} ptr val mem) 15854 // cond: t.Size() == 1 15855 // result: (MOVBstore ptr val mem) 15856 for { 15857 t := auxToType(v.Aux) 15858 ptr := v_0 15859 val := v_1 15860 mem := v_2 15861 if !(t.Size() == 1) { 15862 break 15863 } 15864 v.reset(OpARMMOVBstore) 15865 v.AddArg3(ptr, val, mem) 15866 return true 15867 } 15868 // match: (Store {t} ptr val mem) 15869 // cond: t.Size() == 2 15870 // result: (MOVHstore ptr val mem) 15871 for { 15872 t := auxToType(v.Aux) 15873 ptr := v_0 15874 val := v_1 15875 mem := v_2 15876 if !(t.Size() == 2) { 15877 break 15878 } 15879 v.reset(OpARMMOVHstore) 15880 v.AddArg3(ptr, val, mem) 15881 return true 15882 } 15883 // match: (Store {t} ptr val mem) 15884 // cond: t.Size() == 4 && !is32BitFloat(val.Type) 15885 // result: (MOVWstore ptr val mem) 15886 for { 15887 t := auxToType(v.Aux) 15888 ptr := v_0 15889 val := v_1 15890 mem := v_2 15891 if !(t.Size() == 4 && !is32BitFloat(val.Type)) { 15892 break 15893 } 15894 v.reset(OpARMMOVWstore) 15895 v.AddArg3(ptr, val, mem) 15896 return true 15897 } 15898 // match: (Store {t} ptr val mem) 15899 // cond: t.Size() == 4 && is32BitFloat(val.Type) 15900 // result: (MOVFstore ptr val mem) 15901 for { 15902 t := auxToType(v.Aux) 15903 ptr := v_0 15904 val := v_1 15905 mem := v_2 15906 if !(t.Size() == 4 && is32BitFloat(val.Type)) { 15907 break 15908 } 15909 v.reset(OpARMMOVFstore) 15910 v.AddArg3(ptr, val, mem) 15911 return true 15912 } 15913 // match: (Store {t} ptr val mem) 15914 // cond: t.Size() == 8 && is64BitFloat(val.Type) 15915 // result: (MOVDstore ptr val mem) 15916 for { 15917 t := auxToType(v.Aux) 15918 ptr := v_0 15919 val := v_1 15920 mem := v_2 15921 if !(t.Size() == 8 && is64BitFloat(val.Type)) { 15922 break 15923 } 15924 v.reset(OpARMMOVDstore) 15925 v.AddArg3(ptr, val, mem) 15926 return true 15927 } 15928 return false 15929 } 15930 func rewriteValueARM_OpZero(v *Value) bool { 15931 v_1 := v.Args[1] 15932 v_0 := v.Args[0] 15933 b := v.Block 15934 config := b.Func.Config 15935 typ := &b.Func.Config.Types 15936 // match: (Zero [0] _ mem) 15937 // result: mem 15938 for { 15939 if auxIntToInt64(v.AuxInt) != 0 { 15940 break 15941 } 15942 mem := v_1 15943 v.copyOf(mem) 15944 return true 15945 } 15946 // match: (Zero [1] ptr mem) 15947 // result: (MOVBstore ptr (MOVWconst [0]) mem) 15948 for { 15949 if auxIntToInt64(v.AuxInt) != 1 { 15950 break 15951 } 15952 ptr := v_0 15953 mem := v_1 15954 v.reset(OpARMMOVBstore) 15955 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15956 v0.AuxInt = int32ToAuxInt(0) 15957 v.AddArg3(ptr, v0, mem) 15958 return true 15959 } 15960 // match: (Zero [2] {t} ptr mem) 15961 // cond: t.Alignment()%2 == 0 15962 // result: (MOVHstore ptr (MOVWconst [0]) mem) 15963 for { 15964 if auxIntToInt64(v.AuxInt) != 2 { 15965 break 15966 } 15967 t := auxToType(v.Aux) 15968 ptr := v_0 15969 mem := v_1 15970 if !(t.Alignment()%2 == 0) { 15971 break 15972 } 15973 v.reset(OpARMMOVHstore) 15974 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15975 v0.AuxInt = int32ToAuxInt(0) 15976 v.AddArg3(ptr, v0, mem) 15977 return true 15978 } 15979 // match: (Zero [2] ptr mem) 15980 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 15981 for { 15982 if auxIntToInt64(v.AuxInt) != 2 { 15983 break 15984 } 15985 ptr := v_0 15986 mem := v_1 15987 v.reset(OpARMMOVBstore) 15988 v.AuxInt = int32ToAuxInt(1) 15989 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15990 v0.AuxInt = int32ToAuxInt(0) 15991 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 15992 v1.AuxInt = int32ToAuxInt(0) 15993 v1.AddArg3(ptr, v0, mem) 15994 v.AddArg3(ptr, v0, v1) 15995 return true 15996 } 15997 // match: (Zero [4] {t} ptr mem) 15998 // cond: t.Alignment()%4 == 0 15999 // result: (MOVWstore ptr (MOVWconst [0]) mem) 16000 for { 16001 if auxIntToInt64(v.AuxInt) != 4 { 16002 break 16003 } 16004 t := auxToType(v.Aux) 16005 ptr := v_0 16006 mem := v_1 16007 if !(t.Alignment()%4 == 0) { 16008 break 16009 } 16010 v.reset(OpARMMOVWstore) 16011 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16012 v0.AuxInt = int32ToAuxInt(0) 16013 v.AddArg3(ptr, v0, mem) 16014 return true 16015 } 16016 // match: (Zero [4] {t} ptr mem) 16017 // cond: t.Alignment()%2 == 0 16018 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 16019 for { 16020 if auxIntToInt64(v.AuxInt) != 4 { 16021 break 16022 } 16023 t := auxToType(v.Aux) 16024 ptr := v_0 16025 mem := v_1 16026 if !(t.Alignment()%2 == 0) { 16027 break 16028 } 16029 v.reset(OpARMMOVHstore) 16030 v.AuxInt = int32ToAuxInt(2) 16031 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16032 v0.AuxInt = int32ToAuxInt(0) 16033 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 16034 v1.AuxInt = int32ToAuxInt(0) 16035 v1.AddArg3(ptr, v0, mem) 16036 v.AddArg3(ptr, v0, v1) 16037 return true 16038 } 16039 // match: (Zero [4] ptr mem) 16040 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 16041 for { 16042 if auxIntToInt64(v.AuxInt) != 4 { 16043 break 16044 } 16045 ptr := v_0 16046 mem := v_1 16047 v.reset(OpARMMOVBstore) 16048 v.AuxInt = int32ToAuxInt(3) 16049 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16050 v0.AuxInt = int32ToAuxInt(0) 16051 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16052 v1.AuxInt = int32ToAuxInt(2) 16053 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16054 v2.AuxInt = int32ToAuxInt(1) 16055 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16056 v3.AuxInt = int32ToAuxInt(0) 16057 v3.AddArg3(ptr, v0, mem) 16058 v2.AddArg3(ptr, v0, v3) 16059 v1.AddArg3(ptr, v0, v2) 16060 v.AddArg3(ptr, v0, v1) 16061 return true 16062 } 16063 // match: (Zero [3] ptr mem) 16064 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 16065 for { 16066 if auxIntToInt64(v.AuxInt) != 3 { 16067 break 16068 } 16069 ptr := v_0 16070 mem := v_1 16071 v.reset(OpARMMOVBstore) 16072 v.AuxInt = int32ToAuxInt(2) 16073 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16074 v0.AuxInt = int32ToAuxInt(0) 16075 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16076 v1.AuxInt = int32ToAuxInt(1) 16077 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16078 v2.AuxInt = int32ToAuxInt(0) 16079 v2.AddArg3(ptr, v0, mem) 16080 v1.AddArg3(ptr, v0, v2) 16081 v.AddArg3(ptr, v0, v1) 16082 return true 16083 } 16084 // match: (Zero [s] {t} ptr mem) 16085 // cond: s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice 16086 // result: (DUFFZERO [4 * (128 - s/4)] ptr (MOVWconst [0]) mem) 16087 for { 16088 s := auxIntToInt64(v.AuxInt) 16089 t := auxToType(v.Aux) 16090 ptr := v_0 16091 mem := v_1 16092 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice) { 16093 break 16094 } 16095 v.reset(OpARMDUFFZERO) 16096 v.AuxInt = int64ToAuxInt(4 * (128 - s/4)) 16097 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16098 v0.AuxInt = int32ToAuxInt(0) 16099 v.AddArg3(ptr, v0, mem) 16100 return true 16101 } 16102 // match: (Zero [s] {t} ptr mem) 16103 // cond: (s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0 16104 // result: (LoweredZero [t.Alignment()] ptr (ADDconst <ptr.Type> ptr [int32(s-moveSize(t.Alignment(), config))]) (MOVWconst [0]) mem) 16105 for { 16106 s := auxIntToInt64(v.AuxInt) 16107 t := auxToType(v.Aux) 16108 ptr := v_0 16109 mem := v_1 16110 if !((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) { 16111 break 16112 } 16113 v.reset(OpARMLoweredZero) 16114 v.AuxInt = int64ToAuxInt(t.Alignment()) 16115 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 16116 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config))) 16117 v0.AddArg(ptr) 16118 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16119 v1.AuxInt = int32ToAuxInt(0) 16120 v.AddArg4(ptr, v0, v1, mem) 16121 return true 16122 } 16123 return false 16124 } 16125 func rewriteValueARM_OpZeromask(v *Value) bool { 16126 v_0 := v.Args[0] 16127 b := v.Block 16128 typ := &b.Func.Config.Types 16129 // match: (Zeromask x) 16130 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 16131 for { 16132 x := v_0 16133 v.reset(OpARMSRAconst) 16134 v.AuxInt = int32ToAuxInt(31) 16135 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 16136 v0.AuxInt = int32ToAuxInt(1) 16137 v0.AddArg2(x, x) 16138 v.AddArg(v0) 16139 return true 16140 } 16141 } 16142 func rewriteBlockARM(b *Block) bool { 16143 switch b.Kind { 16144 case BlockARMEQ: 16145 // match: (EQ (FlagConstant [fc]) yes no) 16146 // cond: fc.eq() 16147 // result: (First yes no) 16148 for b.Controls[0].Op == OpARMFlagConstant { 16149 v_0 := b.Controls[0] 16150 fc := auxIntToFlagConstant(v_0.AuxInt) 16151 if !(fc.eq()) { 16152 break 16153 } 16154 b.Reset(BlockFirst) 16155 return true 16156 } 16157 // match: (EQ (FlagConstant [fc]) yes no) 16158 // cond: !fc.eq() 16159 // result: (First no yes) 16160 for b.Controls[0].Op == OpARMFlagConstant { 16161 v_0 := b.Controls[0] 16162 fc := auxIntToFlagConstant(v_0.AuxInt) 16163 if !(!fc.eq()) { 16164 break 16165 } 16166 b.Reset(BlockFirst) 16167 b.swapSuccessors() 16168 return true 16169 } 16170 // match: (EQ (InvertFlags cmp) yes no) 16171 // result: (EQ cmp yes no) 16172 for b.Controls[0].Op == OpARMInvertFlags { 16173 v_0 := b.Controls[0] 16174 cmp := v_0.Args[0] 16175 b.resetWithControl(BlockARMEQ, cmp) 16176 return true 16177 } 16178 // match: (EQ (CMP x (RSBconst [0] y))) 16179 // result: (EQ (CMN x y)) 16180 for b.Controls[0].Op == OpARMCMP { 16181 v_0 := b.Controls[0] 16182 _ = v_0.Args[1] 16183 x := v_0.Args[0] 16184 v_0_1 := v_0.Args[1] 16185 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 16186 break 16187 } 16188 y := v_0_1.Args[0] 16189 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16190 v0.AddArg2(x, y) 16191 b.resetWithControl(BlockARMEQ, v0) 16192 return true 16193 } 16194 // match: (EQ (CMN x (RSBconst [0] y))) 16195 // result: (EQ (CMP x y)) 16196 for b.Controls[0].Op == OpARMCMN { 16197 v_0 := b.Controls[0] 16198 _ = v_0.Args[1] 16199 v_0_0 := v_0.Args[0] 16200 v_0_1 := v_0.Args[1] 16201 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { 16202 x := v_0_0 16203 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 16204 continue 16205 } 16206 y := v_0_1.Args[0] 16207 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16208 v0.AddArg2(x, y) 16209 b.resetWithControl(BlockARMEQ, v0) 16210 return true 16211 } 16212 break 16213 } 16214 // match: (EQ (CMPconst [0] l:(SUB x y)) yes no) 16215 // cond: l.Uses==1 16216 // result: (EQ (CMP x y) yes no) 16217 for b.Controls[0].Op == OpARMCMPconst { 16218 v_0 := b.Controls[0] 16219 if auxIntToInt32(v_0.AuxInt) != 0 { 16220 break 16221 } 16222 l := v_0.Args[0] 16223 if l.Op != OpARMSUB { 16224 break 16225 } 16226 y := l.Args[1] 16227 x := l.Args[0] 16228 if !(l.Uses == 1) { 16229 break 16230 } 16231 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16232 v0.AddArg2(x, y) 16233 b.resetWithControl(BlockARMEQ, v0) 16234 return true 16235 } 16236 // match: (EQ (CMPconst [0] l:(MULS x y a)) yes no) 16237 // cond: l.Uses==1 16238 // result: (EQ (CMP a (MUL <x.Type> x y)) yes no) 16239 for b.Controls[0].Op == OpARMCMPconst { 16240 v_0 := b.Controls[0] 16241 if auxIntToInt32(v_0.AuxInt) != 0 { 16242 break 16243 } 16244 l := v_0.Args[0] 16245 if l.Op != OpARMMULS { 16246 break 16247 } 16248 a := l.Args[2] 16249 x := l.Args[0] 16250 y := l.Args[1] 16251 if !(l.Uses == 1) { 16252 break 16253 } 16254 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16255 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 16256 v1.AddArg2(x, y) 16257 v0.AddArg2(a, v1) 16258 b.resetWithControl(BlockARMEQ, v0) 16259 return true 16260 } 16261 // match: (EQ (CMPconst [0] l:(SUBconst [c] x)) yes no) 16262 // cond: l.Uses==1 16263 // result: (EQ (CMPconst [c] x) yes no) 16264 for b.Controls[0].Op == OpARMCMPconst { 16265 v_0 := b.Controls[0] 16266 if auxIntToInt32(v_0.AuxInt) != 0 { 16267 break 16268 } 16269 l := v_0.Args[0] 16270 if l.Op != OpARMSUBconst { 16271 break 16272 } 16273 c := auxIntToInt32(l.AuxInt) 16274 x := l.Args[0] 16275 if !(l.Uses == 1) { 16276 break 16277 } 16278 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 16279 v0.AuxInt = int32ToAuxInt(c) 16280 v0.AddArg(x) 16281 b.resetWithControl(BlockARMEQ, v0) 16282 return true 16283 } 16284 // match: (EQ (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 16285 // cond: l.Uses==1 16286 // result: (EQ (CMPshiftLL x y [c]) yes no) 16287 for b.Controls[0].Op == OpARMCMPconst { 16288 v_0 := b.Controls[0] 16289 if auxIntToInt32(v_0.AuxInt) != 0 { 16290 break 16291 } 16292 l := v_0.Args[0] 16293 if l.Op != OpARMSUBshiftLL { 16294 break 16295 } 16296 c := auxIntToInt32(l.AuxInt) 16297 y := l.Args[1] 16298 x := l.Args[0] 16299 if !(l.Uses == 1) { 16300 break 16301 } 16302 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 16303 v0.AuxInt = int32ToAuxInt(c) 16304 v0.AddArg2(x, y) 16305 b.resetWithControl(BlockARMEQ, v0) 16306 return true 16307 } 16308 // match: (EQ (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 16309 // cond: l.Uses==1 16310 // result: (EQ (CMPshiftRL x y [c]) yes no) 16311 for b.Controls[0].Op == OpARMCMPconst { 16312 v_0 := b.Controls[0] 16313 if auxIntToInt32(v_0.AuxInt) != 0 { 16314 break 16315 } 16316 l := v_0.Args[0] 16317 if l.Op != OpARMSUBshiftRL { 16318 break 16319 } 16320 c := auxIntToInt32(l.AuxInt) 16321 y := l.Args[1] 16322 x := l.Args[0] 16323 if !(l.Uses == 1) { 16324 break 16325 } 16326 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 16327 v0.AuxInt = int32ToAuxInt(c) 16328 v0.AddArg2(x, y) 16329 b.resetWithControl(BlockARMEQ, v0) 16330 return true 16331 } 16332 // match: (EQ (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 16333 // cond: l.Uses==1 16334 // result: (EQ (CMPshiftRA x y [c]) yes no) 16335 for b.Controls[0].Op == OpARMCMPconst { 16336 v_0 := b.Controls[0] 16337 if auxIntToInt32(v_0.AuxInt) != 0 { 16338 break 16339 } 16340 l := v_0.Args[0] 16341 if l.Op != OpARMSUBshiftRA { 16342 break 16343 } 16344 c := auxIntToInt32(l.AuxInt) 16345 y := l.Args[1] 16346 x := l.Args[0] 16347 if !(l.Uses == 1) { 16348 break 16349 } 16350 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 16351 v0.AuxInt = int32ToAuxInt(c) 16352 v0.AddArg2(x, y) 16353 b.resetWithControl(BlockARMEQ, v0) 16354 return true 16355 } 16356 // match: (EQ (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 16357 // cond: l.Uses==1 16358 // result: (EQ (CMPshiftLLreg x y z) yes no) 16359 for b.Controls[0].Op == OpARMCMPconst { 16360 v_0 := b.Controls[0] 16361 if auxIntToInt32(v_0.AuxInt) != 0 { 16362 break 16363 } 16364 l := v_0.Args[0] 16365 if l.Op != OpARMSUBshiftLLreg { 16366 break 16367 } 16368 z := l.Args[2] 16369 x := l.Args[0] 16370 y := l.Args[1] 16371 if !(l.Uses == 1) { 16372 break 16373 } 16374 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 16375 v0.AddArg3(x, y, z) 16376 b.resetWithControl(BlockARMEQ, v0) 16377 return true 16378 } 16379 // match: (EQ (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 16380 // cond: l.Uses==1 16381 // result: (EQ (CMPshiftRLreg x y z) yes no) 16382 for b.Controls[0].Op == OpARMCMPconst { 16383 v_0 := b.Controls[0] 16384 if auxIntToInt32(v_0.AuxInt) != 0 { 16385 break 16386 } 16387 l := v_0.Args[0] 16388 if l.Op != OpARMSUBshiftRLreg { 16389 break 16390 } 16391 z := l.Args[2] 16392 x := l.Args[0] 16393 y := l.Args[1] 16394 if !(l.Uses == 1) { 16395 break 16396 } 16397 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 16398 v0.AddArg3(x, y, z) 16399 b.resetWithControl(BlockARMEQ, v0) 16400 return true 16401 } 16402 // match: (EQ (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 16403 // cond: l.Uses==1 16404 // result: (EQ (CMPshiftRAreg x y z) yes no) 16405 for b.Controls[0].Op == OpARMCMPconst { 16406 v_0 := b.Controls[0] 16407 if auxIntToInt32(v_0.AuxInt) != 0 { 16408 break 16409 } 16410 l := v_0.Args[0] 16411 if l.Op != OpARMSUBshiftRAreg { 16412 break 16413 } 16414 z := l.Args[2] 16415 x := l.Args[0] 16416 y := l.Args[1] 16417 if !(l.Uses == 1) { 16418 break 16419 } 16420 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 16421 v0.AddArg3(x, y, z) 16422 b.resetWithControl(BlockARMEQ, v0) 16423 return true 16424 } 16425 // match: (EQ (CMPconst [0] l:(ADD x y)) yes no) 16426 // cond: l.Uses==1 16427 // result: (EQ (CMN x y) yes no) 16428 for b.Controls[0].Op == OpARMCMPconst { 16429 v_0 := b.Controls[0] 16430 if auxIntToInt32(v_0.AuxInt) != 0 { 16431 break 16432 } 16433 l := v_0.Args[0] 16434 if l.Op != OpARMADD { 16435 break 16436 } 16437 _ = l.Args[1] 16438 l_0 := l.Args[0] 16439 l_1 := l.Args[1] 16440 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16441 x := l_0 16442 y := l_1 16443 if !(l.Uses == 1) { 16444 continue 16445 } 16446 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16447 v0.AddArg2(x, y) 16448 b.resetWithControl(BlockARMEQ, v0) 16449 return true 16450 } 16451 break 16452 } 16453 // match: (EQ (CMPconst [0] l:(MULA x y a)) yes no) 16454 // cond: l.Uses==1 16455 // result: (EQ (CMN a (MUL <x.Type> x y)) yes no) 16456 for b.Controls[0].Op == OpARMCMPconst { 16457 v_0 := b.Controls[0] 16458 if auxIntToInt32(v_0.AuxInt) != 0 { 16459 break 16460 } 16461 l := v_0.Args[0] 16462 if l.Op != OpARMMULA { 16463 break 16464 } 16465 a := l.Args[2] 16466 x := l.Args[0] 16467 y := l.Args[1] 16468 if !(l.Uses == 1) { 16469 break 16470 } 16471 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16472 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 16473 v1.AddArg2(x, y) 16474 v0.AddArg2(a, v1) 16475 b.resetWithControl(BlockARMEQ, v0) 16476 return true 16477 } 16478 // match: (EQ (CMPconst [0] l:(ADDconst [c] x)) yes no) 16479 // cond: l.Uses==1 16480 // result: (EQ (CMNconst [c] x) yes no) 16481 for b.Controls[0].Op == OpARMCMPconst { 16482 v_0 := b.Controls[0] 16483 if auxIntToInt32(v_0.AuxInt) != 0 { 16484 break 16485 } 16486 l := v_0.Args[0] 16487 if l.Op != OpARMADDconst { 16488 break 16489 } 16490 c := auxIntToInt32(l.AuxInt) 16491 x := l.Args[0] 16492 if !(l.Uses == 1) { 16493 break 16494 } 16495 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 16496 v0.AuxInt = int32ToAuxInt(c) 16497 v0.AddArg(x) 16498 b.resetWithControl(BlockARMEQ, v0) 16499 return true 16500 } 16501 // match: (EQ (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 16502 // cond: l.Uses==1 16503 // result: (EQ (CMNshiftLL x y [c]) yes no) 16504 for b.Controls[0].Op == OpARMCMPconst { 16505 v_0 := b.Controls[0] 16506 if auxIntToInt32(v_0.AuxInt) != 0 { 16507 break 16508 } 16509 l := v_0.Args[0] 16510 if l.Op != OpARMADDshiftLL { 16511 break 16512 } 16513 c := auxIntToInt32(l.AuxInt) 16514 y := l.Args[1] 16515 x := l.Args[0] 16516 if !(l.Uses == 1) { 16517 break 16518 } 16519 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 16520 v0.AuxInt = int32ToAuxInt(c) 16521 v0.AddArg2(x, y) 16522 b.resetWithControl(BlockARMEQ, v0) 16523 return true 16524 } 16525 // match: (EQ (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 16526 // cond: l.Uses==1 16527 // result: (EQ (CMNshiftRL x y [c]) yes no) 16528 for b.Controls[0].Op == OpARMCMPconst { 16529 v_0 := b.Controls[0] 16530 if auxIntToInt32(v_0.AuxInt) != 0 { 16531 break 16532 } 16533 l := v_0.Args[0] 16534 if l.Op != OpARMADDshiftRL { 16535 break 16536 } 16537 c := auxIntToInt32(l.AuxInt) 16538 y := l.Args[1] 16539 x := l.Args[0] 16540 if !(l.Uses == 1) { 16541 break 16542 } 16543 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 16544 v0.AuxInt = int32ToAuxInt(c) 16545 v0.AddArg2(x, y) 16546 b.resetWithControl(BlockARMEQ, v0) 16547 return true 16548 } 16549 // match: (EQ (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 16550 // cond: l.Uses==1 16551 // result: (EQ (CMNshiftRA x y [c]) yes no) 16552 for b.Controls[0].Op == OpARMCMPconst { 16553 v_0 := b.Controls[0] 16554 if auxIntToInt32(v_0.AuxInt) != 0 { 16555 break 16556 } 16557 l := v_0.Args[0] 16558 if l.Op != OpARMADDshiftRA { 16559 break 16560 } 16561 c := auxIntToInt32(l.AuxInt) 16562 y := l.Args[1] 16563 x := l.Args[0] 16564 if !(l.Uses == 1) { 16565 break 16566 } 16567 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 16568 v0.AuxInt = int32ToAuxInt(c) 16569 v0.AddArg2(x, y) 16570 b.resetWithControl(BlockARMEQ, v0) 16571 return true 16572 } 16573 // match: (EQ (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 16574 // cond: l.Uses==1 16575 // result: (EQ (CMNshiftLLreg x y z) yes no) 16576 for b.Controls[0].Op == OpARMCMPconst { 16577 v_0 := b.Controls[0] 16578 if auxIntToInt32(v_0.AuxInt) != 0 { 16579 break 16580 } 16581 l := v_0.Args[0] 16582 if l.Op != OpARMADDshiftLLreg { 16583 break 16584 } 16585 z := l.Args[2] 16586 x := l.Args[0] 16587 y := l.Args[1] 16588 if !(l.Uses == 1) { 16589 break 16590 } 16591 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 16592 v0.AddArg3(x, y, z) 16593 b.resetWithControl(BlockARMEQ, v0) 16594 return true 16595 } 16596 // match: (EQ (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 16597 // cond: l.Uses==1 16598 // result: (EQ (CMNshiftRLreg x y z) yes no) 16599 for b.Controls[0].Op == OpARMCMPconst { 16600 v_0 := b.Controls[0] 16601 if auxIntToInt32(v_0.AuxInt) != 0 { 16602 break 16603 } 16604 l := v_0.Args[0] 16605 if l.Op != OpARMADDshiftRLreg { 16606 break 16607 } 16608 z := l.Args[2] 16609 x := l.Args[0] 16610 y := l.Args[1] 16611 if !(l.Uses == 1) { 16612 break 16613 } 16614 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 16615 v0.AddArg3(x, y, z) 16616 b.resetWithControl(BlockARMEQ, v0) 16617 return true 16618 } 16619 // match: (EQ (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 16620 // cond: l.Uses==1 16621 // result: (EQ (CMNshiftRAreg x y z) yes no) 16622 for b.Controls[0].Op == OpARMCMPconst { 16623 v_0 := b.Controls[0] 16624 if auxIntToInt32(v_0.AuxInt) != 0 { 16625 break 16626 } 16627 l := v_0.Args[0] 16628 if l.Op != OpARMADDshiftRAreg { 16629 break 16630 } 16631 z := l.Args[2] 16632 x := l.Args[0] 16633 y := l.Args[1] 16634 if !(l.Uses == 1) { 16635 break 16636 } 16637 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 16638 v0.AddArg3(x, y, z) 16639 b.resetWithControl(BlockARMEQ, v0) 16640 return true 16641 } 16642 // match: (EQ (CMPconst [0] l:(AND x y)) yes no) 16643 // cond: l.Uses==1 16644 // result: (EQ (TST x y) yes no) 16645 for b.Controls[0].Op == OpARMCMPconst { 16646 v_0 := b.Controls[0] 16647 if auxIntToInt32(v_0.AuxInt) != 0 { 16648 break 16649 } 16650 l := v_0.Args[0] 16651 if l.Op != OpARMAND { 16652 break 16653 } 16654 _ = l.Args[1] 16655 l_0 := l.Args[0] 16656 l_1 := l.Args[1] 16657 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16658 x := l_0 16659 y := l_1 16660 if !(l.Uses == 1) { 16661 continue 16662 } 16663 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 16664 v0.AddArg2(x, y) 16665 b.resetWithControl(BlockARMEQ, v0) 16666 return true 16667 } 16668 break 16669 } 16670 // match: (EQ (CMPconst [0] l:(ANDconst [c] x)) yes no) 16671 // cond: l.Uses==1 16672 // result: (EQ (TSTconst [c] x) yes no) 16673 for b.Controls[0].Op == OpARMCMPconst { 16674 v_0 := b.Controls[0] 16675 if auxIntToInt32(v_0.AuxInt) != 0 { 16676 break 16677 } 16678 l := v_0.Args[0] 16679 if l.Op != OpARMANDconst { 16680 break 16681 } 16682 c := auxIntToInt32(l.AuxInt) 16683 x := l.Args[0] 16684 if !(l.Uses == 1) { 16685 break 16686 } 16687 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 16688 v0.AuxInt = int32ToAuxInt(c) 16689 v0.AddArg(x) 16690 b.resetWithControl(BlockARMEQ, v0) 16691 return true 16692 } 16693 // match: (EQ (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 16694 // cond: l.Uses==1 16695 // result: (EQ (TSTshiftLL x y [c]) yes no) 16696 for b.Controls[0].Op == OpARMCMPconst { 16697 v_0 := b.Controls[0] 16698 if auxIntToInt32(v_0.AuxInt) != 0 { 16699 break 16700 } 16701 l := v_0.Args[0] 16702 if l.Op != OpARMANDshiftLL { 16703 break 16704 } 16705 c := auxIntToInt32(l.AuxInt) 16706 y := l.Args[1] 16707 x := l.Args[0] 16708 if !(l.Uses == 1) { 16709 break 16710 } 16711 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 16712 v0.AuxInt = int32ToAuxInt(c) 16713 v0.AddArg2(x, y) 16714 b.resetWithControl(BlockARMEQ, v0) 16715 return true 16716 } 16717 // match: (EQ (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 16718 // cond: l.Uses==1 16719 // result: (EQ (TSTshiftRL x y [c]) yes no) 16720 for b.Controls[0].Op == OpARMCMPconst { 16721 v_0 := b.Controls[0] 16722 if auxIntToInt32(v_0.AuxInt) != 0 { 16723 break 16724 } 16725 l := v_0.Args[0] 16726 if l.Op != OpARMANDshiftRL { 16727 break 16728 } 16729 c := auxIntToInt32(l.AuxInt) 16730 y := l.Args[1] 16731 x := l.Args[0] 16732 if !(l.Uses == 1) { 16733 break 16734 } 16735 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 16736 v0.AuxInt = int32ToAuxInt(c) 16737 v0.AddArg2(x, y) 16738 b.resetWithControl(BlockARMEQ, v0) 16739 return true 16740 } 16741 // match: (EQ (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 16742 // cond: l.Uses==1 16743 // result: (EQ (TSTshiftRA x y [c]) yes no) 16744 for b.Controls[0].Op == OpARMCMPconst { 16745 v_0 := b.Controls[0] 16746 if auxIntToInt32(v_0.AuxInt) != 0 { 16747 break 16748 } 16749 l := v_0.Args[0] 16750 if l.Op != OpARMANDshiftRA { 16751 break 16752 } 16753 c := auxIntToInt32(l.AuxInt) 16754 y := l.Args[1] 16755 x := l.Args[0] 16756 if !(l.Uses == 1) { 16757 break 16758 } 16759 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 16760 v0.AuxInt = int32ToAuxInt(c) 16761 v0.AddArg2(x, y) 16762 b.resetWithControl(BlockARMEQ, v0) 16763 return true 16764 } 16765 // match: (EQ (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 16766 // cond: l.Uses==1 16767 // result: (EQ (TSTshiftLLreg x y z) yes no) 16768 for b.Controls[0].Op == OpARMCMPconst { 16769 v_0 := b.Controls[0] 16770 if auxIntToInt32(v_0.AuxInt) != 0 { 16771 break 16772 } 16773 l := v_0.Args[0] 16774 if l.Op != OpARMANDshiftLLreg { 16775 break 16776 } 16777 z := l.Args[2] 16778 x := l.Args[0] 16779 y := l.Args[1] 16780 if !(l.Uses == 1) { 16781 break 16782 } 16783 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 16784 v0.AddArg3(x, y, z) 16785 b.resetWithControl(BlockARMEQ, v0) 16786 return true 16787 } 16788 // match: (EQ (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 16789 // cond: l.Uses==1 16790 // result: (EQ (TSTshiftRLreg x y z) yes no) 16791 for b.Controls[0].Op == OpARMCMPconst { 16792 v_0 := b.Controls[0] 16793 if auxIntToInt32(v_0.AuxInt) != 0 { 16794 break 16795 } 16796 l := v_0.Args[0] 16797 if l.Op != OpARMANDshiftRLreg { 16798 break 16799 } 16800 z := l.Args[2] 16801 x := l.Args[0] 16802 y := l.Args[1] 16803 if !(l.Uses == 1) { 16804 break 16805 } 16806 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 16807 v0.AddArg3(x, y, z) 16808 b.resetWithControl(BlockARMEQ, v0) 16809 return true 16810 } 16811 // match: (EQ (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 16812 // cond: l.Uses==1 16813 // result: (EQ (TSTshiftRAreg x y z) yes no) 16814 for b.Controls[0].Op == OpARMCMPconst { 16815 v_0 := b.Controls[0] 16816 if auxIntToInt32(v_0.AuxInt) != 0 { 16817 break 16818 } 16819 l := v_0.Args[0] 16820 if l.Op != OpARMANDshiftRAreg { 16821 break 16822 } 16823 z := l.Args[2] 16824 x := l.Args[0] 16825 y := l.Args[1] 16826 if !(l.Uses == 1) { 16827 break 16828 } 16829 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 16830 v0.AddArg3(x, y, z) 16831 b.resetWithControl(BlockARMEQ, v0) 16832 return true 16833 } 16834 // match: (EQ (CMPconst [0] l:(XOR x y)) yes no) 16835 // cond: l.Uses==1 16836 // result: (EQ (TEQ x y) yes no) 16837 for b.Controls[0].Op == OpARMCMPconst { 16838 v_0 := b.Controls[0] 16839 if auxIntToInt32(v_0.AuxInt) != 0 { 16840 break 16841 } 16842 l := v_0.Args[0] 16843 if l.Op != OpARMXOR { 16844 break 16845 } 16846 _ = l.Args[1] 16847 l_0 := l.Args[0] 16848 l_1 := l.Args[1] 16849 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16850 x := l_0 16851 y := l_1 16852 if !(l.Uses == 1) { 16853 continue 16854 } 16855 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 16856 v0.AddArg2(x, y) 16857 b.resetWithControl(BlockARMEQ, v0) 16858 return true 16859 } 16860 break 16861 } 16862 // match: (EQ (CMPconst [0] l:(XORconst [c] x)) yes no) 16863 // cond: l.Uses==1 16864 // result: (EQ (TEQconst [c] x) yes no) 16865 for b.Controls[0].Op == OpARMCMPconst { 16866 v_0 := b.Controls[0] 16867 if auxIntToInt32(v_0.AuxInt) != 0 { 16868 break 16869 } 16870 l := v_0.Args[0] 16871 if l.Op != OpARMXORconst { 16872 break 16873 } 16874 c := auxIntToInt32(l.AuxInt) 16875 x := l.Args[0] 16876 if !(l.Uses == 1) { 16877 break 16878 } 16879 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 16880 v0.AuxInt = int32ToAuxInt(c) 16881 v0.AddArg(x) 16882 b.resetWithControl(BlockARMEQ, v0) 16883 return true 16884 } 16885 // match: (EQ (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 16886 // cond: l.Uses==1 16887 // result: (EQ (TEQshiftLL x y [c]) yes no) 16888 for b.Controls[0].Op == OpARMCMPconst { 16889 v_0 := b.Controls[0] 16890 if auxIntToInt32(v_0.AuxInt) != 0 { 16891 break 16892 } 16893 l := v_0.Args[0] 16894 if l.Op != OpARMXORshiftLL { 16895 break 16896 } 16897 c := auxIntToInt32(l.AuxInt) 16898 y := l.Args[1] 16899 x := l.Args[0] 16900 if !(l.Uses == 1) { 16901 break 16902 } 16903 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 16904 v0.AuxInt = int32ToAuxInt(c) 16905 v0.AddArg2(x, y) 16906 b.resetWithControl(BlockARMEQ, v0) 16907 return true 16908 } 16909 // match: (EQ (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 16910 // cond: l.Uses==1 16911 // result: (EQ (TEQshiftRL x y [c]) yes no) 16912 for b.Controls[0].Op == OpARMCMPconst { 16913 v_0 := b.Controls[0] 16914 if auxIntToInt32(v_0.AuxInt) != 0 { 16915 break 16916 } 16917 l := v_0.Args[0] 16918 if l.Op != OpARMXORshiftRL { 16919 break 16920 } 16921 c := auxIntToInt32(l.AuxInt) 16922 y := l.Args[1] 16923 x := l.Args[0] 16924 if !(l.Uses == 1) { 16925 break 16926 } 16927 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 16928 v0.AuxInt = int32ToAuxInt(c) 16929 v0.AddArg2(x, y) 16930 b.resetWithControl(BlockARMEQ, v0) 16931 return true 16932 } 16933 // match: (EQ (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 16934 // cond: l.Uses==1 16935 // result: (EQ (TEQshiftRA x y [c]) yes no) 16936 for b.Controls[0].Op == OpARMCMPconst { 16937 v_0 := b.Controls[0] 16938 if auxIntToInt32(v_0.AuxInt) != 0 { 16939 break 16940 } 16941 l := v_0.Args[0] 16942 if l.Op != OpARMXORshiftRA { 16943 break 16944 } 16945 c := auxIntToInt32(l.AuxInt) 16946 y := l.Args[1] 16947 x := l.Args[0] 16948 if !(l.Uses == 1) { 16949 break 16950 } 16951 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 16952 v0.AuxInt = int32ToAuxInt(c) 16953 v0.AddArg2(x, y) 16954 b.resetWithControl(BlockARMEQ, v0) 16955 return true 16956 } 16957 // match: (EQ (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 16958 // cond: l.Uses==1 16959 // result: (EQ (TEQshiftLLreg x y z) yes no) 16960 for b.Controls[0].Op == OpARMCMPconst { 16961 v_0 := b.Controls[0] 16962 if auxIntToInt32(v_0.AuxInt) != 0 { 16963 break 16964 } 16965 l := v_0.Args[0] 16966 if l.Op != OpARMXORshiftLLreg { 16967 break 16968 } 16969 z := l.Args[2] 16970 x := l.Args[0] 16971 y := l.Args[1] 16972 if !(l.Uses == 1) { 16973 break 16974 } 16975 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 16976 v0.AddArg3(x, y, z) 16977 b.resetWithControl(BlockARMEQ, v0) 16978 return true 16979 } 16980 // match: (EQ (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 16981 // cond: l.Uses==1 16982 // result: (EQ (TEQshiftRLreg x y z) yes no) 16983 for b.Controls[0].Op == OpARMCMPconst { 16984 v_0 := b.Controls[0] 16985 if auxIntToInt32(v_0.AuxInt) != 0 { 16986 break 16987 } 16988 l := v_0.Args[0] 16989 if l.Op != OpARMXORshiftRLreg { 16990 break 16991 } 16992 z := l.Args[2] 16993 x := l.Args[0] 16994 y := l.Args[1] 16995 if !(l.Uses == 1) { 16996 break 16997 } 16998 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 16999 v0.AddArg3(x, y, z) 17000 b.resetWithControl(BlockARMEQ, v0) 17001 return true 17002 } 17003 // match: (EQ (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 17004 // cond: l.Uses==1 17005 // result: (EQ (TEQshiftRAreg x y z) yes no) 17006 for b.Controls[0].Op == OpARMCMPconst { 17007 v_0 := b.Controls[0] 17008 if auxIntToInt32(v_0.AuxInt) != 0 { 17009 break 17010 } 17011 l := v_0.Args[0] 17012 if l.Op != OpARMXORshiftRAreg { 17013 break 17014 } 17015 z := l.Args[2] 17016 x := l.Args[0] 17017 y := l.Args[1] 17018 if !(l.Uses == 1) { 17019 break 17020 } 17021 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 17022 v0.AddArg3(x, y, z) 17023 b.resetWithControl(BlockARMEQ, v0) 17024 return true 17025 } 17026 case BlockARMGE: 17027 // match: (GE (FlagConstant [fc]) yes no) 17028 // cond: fc.ge() 17029 // result: (First yes no) 17030 for b.Controls[0].Op == OpARMFlagConstant { 17031 v_0 := b.Controls[0] 17032 fc := auxIntToFlagConstant(v_0.AuxInt) 17033 if !(fc.ge()) { 17034 break 17035 } 17036 b.Reset(BlockFirst) 17037 return true 17038 } 17039 // match: (GE (FlagConstant [fc]) yes no) 17040 // cond: !fc.ge() 17041 // result: (First no yes) 17042 for b.Controls[0].Op == OpARMFlagConstant { 17043 v_0 := b.Controls[0] 17044 fc := auxIntToFlagConstant(v_0.AuxInt) 17045 if !(!fc.ge()) { 17046 break 17047 } 17048 b.Reset(BlockFirst) 17049 b.swapSuccessors() 17050 return true 17051 } 17052 // match: (GE (InvertFlags cmp) yes no) 17053 // result: (LE cmp yes no) 17054 for b.Controls[0].Op == OpARMInvertFlags { 17055 v_0 := b.Controls[0] 17056 cmp := v_0.Args[0] 17057 b.resetWithControl(BlockARMLE, cmp) 17058 return true 17059 } 17060 // match: (GE (CMPconst [0] l:(SUB x y)) yes no) 17061 // cond: l.Uses==1 17062 // result: (GEnoov (CMP x y) yes no) 17063 for b.Controls[0].Op == OpARMCMPconst { 17064 v_0 := b.Controls[0] 17065 if auxIntToInt32(v_0.AuxInt) != 0 { 17066 break 17067 } 17068 l := v_0.Args[0] 17069 if l.Op != OpARMSUB { 17070 break 17071 } 17072 y := l.Args[1] 17073 x := l.Args[0] 17074 if !(l.Uses == 1) { 17075 break 17076 } 17077 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17078 v0.AddArg2(x, y) 17079 b.resetWithControl(BlockARMGEnoov, v0) 17080 return true 17081 } 17082 // match: (GE (CMPconst [0] l:(MULS x y a)) yes no) 17083 // cond: l.Uses==1 17084 // result: (GEnoov (CMP a (MUL <x.Type> x y)) yes no) 17085 for b.Controls[0].Op == OpARMCMPconst { 17086 v_0 := b.Controls[0] 17087 if auxIntToInt32(v_0.AuxInt) != 0 { 17088 break 17089 } 17090 l := v_0.Args[0] 17091 if l.Op != OpARMMULS { 17092 break 17093 } 17094 a := l.Args[2] 17095 x := l.Args[0] 17096 y := l.Args[1] 17097 if !(l.Uses == 1) { 17098 break 17099 } 17100 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17101 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 17102 v1.AddArg2(x, y) 17103 v0.AddArg2(a, v1) 17104 b.resetWithControl(BlockARMGEnoov, v0) 17105 return true 17106 } 17107 // match: (GE (CMPconst [0] l:(SUBconst [c] x)) yes no) 17108 // cond: l.Uses==1 17109 // result: (GEnoov (CMPconst [c] x) yes no) 17110 for b.Controls[0].Op == OpARMCMPconst { 17111 v_0 := b.Controls[0] 17112 if auxIntToInt32(v_0.AuxInt) != 0 { 17113 break 17114 } 17115 l := v_0.Args[0] 17116 if l.Op != OpARMSUBconst { 17117 break 17118 } 17119 c := auxIntToInt32(l.AuxInt) 17120 x := l.Args[0] 17121 if !(l.Uses == 1) { 17122 break 17123 } 17124 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 17125 v0.AuxInt = int32ToAuxInt(c) 17126 v0.AddArg(x) 17127 b.resetWithControl(BlockARMGEnoov, v0) 17128 return true 17129 } 17130 // match: (GE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 17131 // cond: l.Uses==1 17132 // result: (GEnoov (CMPshiftLL x y [c]) yes no) 17133 for b.Controls[0].Op == OpARMCMPconst { 17134 v_0 := b.Controls[0] 17135 if auxIntToInt32(v_0.AuxInt) != 0 { 17136 break 17137 } 17138 l := v_0.Args[0] 17139 if l.Op != OpARMSUBshiftLL { 17140 break 17141 } 17142 c := auxIntToInt32(l.AuxInt) 17143 y := l.Args[1] 17144 x := l.Args[0] 17145 if !(l.Uses == 1) { 17146 break 17147 } 17148 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 17149 v0.AuxInt = int32ToAuxInt(c) 17150 v0.AddArg2(x, y) 17151 b.resetWithControl(BlockARMGEnoov, v0) 17152 return true 17153 } 17154 // match: (GE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 17155 // cond: l.Uses==1 17156 // result: (GEnoov (CMPshiftRL x y [c]) yes no) 17157 for b.Controls[0].Op == OpARMCMPconst { 17158 v_0 := b.Controls[0] 17159 if auxIntToInt32(v_0.AuxInt) != 0 { 17160 break 17161 } 17162 l := v_0.Args[0] 17163 if l.Op != OpARMSUBshiftRL { 17164 break 17165 } 17166 c := auxIntToInt32(l.AuxInt) 17167 y := l.Args[1] 17168 x := l.Args[0] 17169 if !(l.Uses == 1) { 17170 break 17171 } 17172 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 17173 v0.AuxInt = int32ToAuxInt(c) 17174 v0.AddArg2(x, y) 17175 b.resetWithControl(BlockARMGEnoov, v0) 17176 return true 17177 } 17178 // match: (GE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 17179 // cond: l.Uses==1 17180 // result: (GEnoov (CMPshiftRA x y [c]) yes no) 17181 for b.Controls[0].Op == OpARMCMPconst { 17182 v_0 := b.Controls[0] 17183 if auxIntToInt32(v_0.AuxInt) != 0 { 17184 break 17185 } 17186 l := v_0.Args[0] 17187 if l.Op != OpARMSUBshiftRA { 17188 break 17189 } 17190 c := auxIntToInt32(l.AuxInt) 17191 y := l.Args[1] 17192 x := l.Args[0] 17193 if !(l.Uses == 1) { 17194 break 17195 } 17196 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 17197 v0.AuxInt = int32ToAuxInt(c) 17198 v0.AddArg2(x, y) 17199 b.resetWithControl(BlockARMGEnoov, v0) 17200 return true 17201 } 17202 // match: (GE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 17203 // cond: l.Uses==1 17204 // result: (GEnoov (CMPshiftLLreg x y z) yes no) 17205 for b.Controls[0].Op == OpARMCMPconst { 17206 v_0 := b.Controls[0] 17207 if auxIntToInt32(v_0.AuxInt) != 0 { 17208 break 17209 } 17210 l := v_0.Args[0] 17211 if l.Op != OpARMSUBshiftLLreg { 17212 break 17213 } 17214 z := l.Args[2] 17215 x := l.Args[0] 17216 y := l.Args[1] 17217 if !(l.Uses == 1) { 17218 break 17219 } 17220 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 17221 v0.AddArg3(x, y, z) 17222 b.resetWithControl(BlockARMGEnoov, v0) 17223 return true 17224 } 17225 // match: (GE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 17226 // cond: l.Uses==1 17227 // result: (GEnoov (CMPshiftRLreg x y z) yes no) 17228 for b.Controls[0].Op == OpARMCMPconst { 17229 v_0 := b.Controls[0] 17230 if auxIntToInt32(v_0.AuxInt) != 0 { 17231 break 17232 } 17233 l := v_0.Args[0] 17234 if l.Op != OpARMSUBshiftRLreg { 17235 break 17236 } 17237 z := l.Args[2] 17238 x := l.Args[0] 17239 y := l.Args[1] 17240 if !(l.Uses == 1) { 17241 break 17242 } 17243 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 17244 v0.AddArg3(x, y, z) 17245 b.resetWithControl(BlockARMGEnoov, v0) 17246 return true 17247 } 17248 // match: (GE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 17249 // cond: l.Uses==1 17250 // result: (GEnoov (CMPshiftRAreg x y z) yes no) 17251 for b.Controls[0].Op == OpARMCMPconst { 17252 v_0 := b.Controls[0] 17253 if auxIntToInt32(v_0.AuxInt) != 0 { 17254 break 17255 } 17256 l := v_0.Args[0] 17257 if l.Op != OpARMSUBshiftRAreg { 17258 break 17259 } 17260 z := l.Args[2] 17261 x := l.Args[0] 17262 y := l.Args[1] 17263 if !(l.Uses == 1) { 17264 break 17265 } 17266 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 17267 v0.AddArg3(x, y, z) 17268 b.resetWithControl(BlockARMGEnoov, v0) 17269 return true 17270 } 17271 // match: (GE (CMPconst [0] l:(ADD x y)) yes no) 17272 // cond: l.Uses==1 17273 // result: (GEnoov (CMN x y) yes no) 17274 for b.Controls[0].Op == OpARMCMPconst { 17275 v_0 := b.Controls[0] 17276 if auxIntToInt32(v_0.AuxInt) != 0 { 17277 break 17278 } 17279 l := v_0.Args[0] 17280 if l.Op != OpARMADD { 17281 break 17282 } 17283 _ = l.Args[1] 17284 l_0 := l.Args[0] 17285 l_1 := l.Args[1] 17286 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17287 x := l_0 17288 y := l_1 17289 if !(l.Uses == 1) { 17290 continue 17291 } 17292 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 17293 v0.AddArg2(x, y) 17294 b.resetWithControl(BlockARMGEnoov, v0) 17295 return true 17296 } 17297 break 17298 } 17299 // match: (GE (CMPconst [0] l:(MULA x y a)) yes no) 17300 // cond: l.Uses==1 17301 // result: (GEnoov (CMN a (MUL <x.Type> x y)) yes no) 17302 for b.Controls[0].Op == OpARMCMPconst { 17303 v_0 := b.Controls[0] 17304 if auxIntToInt32(v_0.AuxInt) != 0 { 17305 break 17306 } 17307 l := v_0.Args[0] 17308 if l.Op != OpARMMULA { 17309 break 17310 } 17311 a := l.Args[2] 17312 x := l.Args[0] 17313 y := l.Args[1] 17314 if !(l.Uses == 1) { 17315 break 17316 } 17317 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 17318 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 17319 v1.AddArg2(x, y) 17320 v0.AddArg2(a, v1) 17321 b.resetWithControl(BlockARMGEnoov, v0) 17322 return true 17323 } 17324 // match: (GE (CMPconst [0] l:(ADDconst [c] x)) yes no) 17325 // cond: l.Uses==1 17326 // result: (GEnoov (CMNconst [c] x) yes no) 17327 for b.Controls[0].Op == OpARMCMPconst { 17328 v_0 := b.Controls[0] 17329 if auxIntToInt32(v_0.AuxInt) != 0 { 17330 break 17331 } 17332 l := v_0.Args[0] 17333 if l.Op != OpARMADDconst { 17334 break 17335 } 17336 c := auxIntToInt32(l.AuxInt) 17337 x := l.Args[0] 17338 if !(l.Uses == 1) { 17339 break 17340 } 17341 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 17342 v0.AuxInt = int32ToAuxInt(c) 17343 v0.AddArg(x) 17344 b.resetWithControl(BlockARMGEnoov, v0) 17345 return true 17346 } 17347 // match: (GE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 17348 // cond: l.Uses==1 17349 // result: (GEnoov (CMNshiftLL x y [c]) yes no) 17350 for b.Controls[0].Op == OpARMCMPconst { 17351 v_0 := b.Controls[0] 17352 if auxIntToInt32(v_0.AuxInt) != 0 { 17353 break 17354 } 17355 l := v_0.Args[0] 17356 if l.Op != OpARMADDshiftLL { 17357 break 17358 } 17359 c := auxIntToInt32(l.AuxInt) 17360 y := l.Args[1] 17361 x := l.Args[0] 17362 if !(l.Uses == 1) { 17363 break 17364 } 17365 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 17366 v0.AuxInt = int32ToAuxInt(c) 17367 v0.AddArg2(x, y) 17368 b.resetWithControl(BlockARMGEnoov, v0) 17369 return true 17370 } 17371 // match: (GE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 17372 // cond: l.Uses==1 17373 // result: (GEnoov (CMNshiftRL x y [c]) yes no) 17374 for b.Controls[0].Op == OpARMCMPconst { 17375 v_0 := b.Controls[0] 17376 if auxIntToInt32(v_0.AuxInt) != 0 { 17377 break 17378 } 17379 l := v_0.Args[0] 17380 if l.Op != OpARMADDshiftRL { 17381 break 17382 } 17383 c := auxIntToInt32(l.AuxInt) 17384 y := l.Args[1] 17385 x := l.Args[0] 17386 if !(l.Uses == 1) { 17387 break 17388 } 17389 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 17390 v0.AuxInt = int32ToAuxInt(c) 17391 v0.AddArg2(x, y) 17392 b.resetWithControl(BlockARMGEnoov, v0) 17393 return true 17394 } 17395 // match: (GE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 17396 // cond: l.Uses==1 17397 // result: (GEnoov (CMNshiftRA x y [c]) yes no) 17398 for b.Controls[0].Op == OpARMCMPconst { 17399 v_0 := b.Controls[0] 17400 if auxIntToInt32(v_0.AuxInt) != 0 { 17401 break 17402 } 17403 l := v_0.Args[0] 17404 if l.Op != OpARMADDshiftRA { 17405 break 17406 } 17407 c := auxIntToInt32(l.AuxInt) 17408 y := l.Args[1] 17409 x := l.Args[0] 17410 if !(l.Uses == 1) { 17411 break 17412 } 17413 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 17414 v0.AuxInt = int32ToAuxInt(c) 17415 v0.AddArg2(x, y) 17416 b.resetWithControl(BlockARMGEnoov, v0) 17417 return true 17418 } 17419 // match: (GE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 17420 // cond: l.Uses==1 17421 // result: (GEnoov (CMNshiftLLreg x y z) yes no) 17422 for b.Controls[0].Op == OpARMCMPconst { 17423 v_0 := b.Controls[0] 17424 if auxIntToInt32(v_0.AuxInt) != 0 { 17425 break 17426 } 17427 l := v_0.Args[0] 17428 if l.Op != OpARMADDshiftLLreg { 17429 break 17430 } 17431 z := l.Args[2] 17432 x := l.Args[0] 17433 y := l.Args[1] 17434 if !(l.Uses == 1) { 17435 break 17436 } 17437 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 17438 v0.AddArg3(x, y, z) 17439 b.resetWithControl(BlockARMGEnoov, v0) 17440 return true 17441 } 17442 // match: (GE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 17443 // cond: l.Uses==1 17444 // result: (GEnoov (CMNshiftRLreg x y z) yes no) 17445 for b.Controls[0].Op == OpARMCMPconst { 17446 v_0 := b.Controls[0] 17447 if auxIntToInt32(v_0.AuxInt) != 0 { 17448 break 17449 } 17450 l := v_0.Args[0] 17451 if l.Op != OpARMADDshiftRLreg { 17452 break 17453 } 17454 z := l.Args[2] 17455 x := l.Args[0] 17456 y := l.Args[1] 17457 if !(l.Uses == 1) { 17458 break 17459 } 17460 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 17461 v0.AddArg3(x, y, z) 17462 b.resetWithControl(BlockARMGEnoov, v0) 17463 return true 17464 } 17465 // match: (GE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 17466 // cond: l.Uses==1 17467 // result: (GEnoov (CMNshiftRAreg x y z) yes no) 17468 for b.Controls[0].Op == OpARMCMPconst { 17469 v_0 := b.Controls[0] 17470 if auxIntToInt32(v_0.AuxInt) != 0 { 17471 break 17472 } 17473 l := v_0.Args[0] 17474 if l.Op != OpARMADDshiftRAreg { 17475 break 17476 } 17477 z := l.Args[2] 17478 x := l.Args[0] 17479 y := l.Args[1] 17480 if !(l.Uses == 1) { 17481 break 17482 } 17483 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 17484 v0.AddArg3(x, y, z) 17485 b.resetWithControl(BlockARMGEnoov, v0) 17486 return true 17487 } 17488 // match: (GE (CMPconst [0] l:(AND x y)) yes no) 17489 // cond: l.Uses==1 17490 // result: (GEnoov (TST x y) yes no) 17491 for b.Controls[0].Op == OpARMCMPconst { 17492 v_0 := b.Controls[0] 17493 if auxIntToInt32(v_0.AuxInt) != 0 { 17494 break 17495 } 17496 l := v_0.Args[0] 17497 if l.Op != OpARMAND { 17498 break 17499 } 17500 _ = l.Args[1] 17501 l_0 := l.Args[0] 17502 l_1 := l.Args[1] 17503 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17504 x := l_0 17505 y := l_1 17506 if !(l.Uses == 1) { 17507 continue 17508 } 17509 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 17510 v0.AddArg2(x, y) 17511 b.resetWithControl(BlockARMGEnoov, v0) 17512 return true 17513 } 17514 break 17515 } 17516 // match: (GE (CMPconst [0] l:(ANDconst [c] x)) yes no) 17517 // cond: l.Uses==1 17518 // result: (GEnoov (TSTconst [c] x) yes no) 17519 for b.Controls[0].Op == OpARMCMPconst { 17520 v_0 := b.Controls[0] 17521 if auxIntToInt32(v_0.AuxInt) != 0 { 17522 break 17523 } 17524 l := v_0.Args[0] 17525 if l.Op != OpARMANDconst { 17526 break 17527 } 17528 c := auxIntToInt32(l.AuxInt) 17529 x := l.Args[0] 17530 if !(l.Uses == 1) { 17531 break 17532 } 17533 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 17534 v0.AuxInt = int32ToAuxInt(c) 17535 v0.AddArg(x) 17536 b.resetWithControl(BlockARMGEnoov, v0) 17537 return true 17538 } 17539 // match: (GE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 17540 // cond: l.Uses==1 17541 // result: (GEnoov (TSTshiftLL x y [c]) yes no) 17542 for b.Controls[0].Op == OpARMCMPconst { 17543 v_0 := b.Controls[0] 17544 if auxIntToInt32(v_0.AuxInt) != 0 { 17545 break 17546 } 17547 l := v_0.Args[0] 17548 if l.Op != OpARMANDshiftLL { 17549 break 17550 } 17551 c := auxIntToInt32(l.AuxInt) 17552 y := l.Args[1] 17553 x := l.Args[0] 17554 if !(l.Uses == 1) { 17555 break 17556 } 17557 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 17558 v0.AuxInt = int32ToAuxInt(c) 17559 v0.AddArg2(x, y) 17560 b.resetWithControl(BlockARMGEnoov, v0) 17561 return true 17562 } 17563 // match: (GE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 17564 // cond: l.Uses==1 17565 // result: (GEnoov (TSTshiftRL x y [c]) yes no) 17566 for b.Controls[0].Op == OpARMCMPconst { 17567 v_0 := b.Controls[0] 17568 if auxIntToInt32(v_0.AuxInt) != 0 { 17569 break 17570 } 17571 l := v_0.Args[0] 17572 if l.Op != OpARMANDshiftRL { 17573 break 17574 } 17575 c := auxIntToInt32(l.AuxInt) 17576 y := l.Args[1] 17577 x := l.Args[0] 17578 if !(l.Uses == 1) { 17579 break 17580 } 17581 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 17582 v0.AuxInt = int32ToAuxInt(c) 17583 v0.AddArg2(x, y) 17584 b.resetWithControl(BlockARMGEnoov, v0) 17585 return true 17586 } 17587 // match: (GE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 17588 // cond: l.Uses==1 17589 // result: (GEnoov (TSTshiftRA x y [c]) yes no) 17590 for b.Controls[0].Op == OpARMCMPconst { 17591 v_0 := b.Controls[0] 17592 if auxIntToInt32(v_0.AuxInt) != 0 { 17593 break 17594 } 17595 l := v_0.Args[0] 17596 if l.Op != OpARMANDshiftRA { 17597 break 17598 } 17599 c := auxIntToInt32(l.AuxInt) 17600 y := l.Args[1] 17601 x := l.Args[0] 17602 if !(l.Uses == 1) { 17603 break 17604 } 17605 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 17606 v0.AuxInt = int32ToAuxInt(c) 17607 v0.AddArg2(x, y) 17608 b.resetWithControl(BlockARMGEnoov, v0) 17609 return true 17610 } 17611 // match: (GE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 17612 // cond: l.Uses==1 17613 // result: (GEnoov (TSTshiftLLreg x y z) yes no) 17614 for b.Controls[0].Op == OpARMCMPconst { 17615 v_0 := b.Controls[0] 17616 if auxIntToInt32(v_0.AuxInt) != 0 { 17617 break 17618 } 17619 l := v_0.Args[0] 17620 if l.Op != OpARMANDshiftLLreg { 17621 break 17622 } 17623 z := l.Args[2] 17624 x := l.Args[0] 17625 y := l.Args[1] 17626 if !(l.Uses == 1) { 17627 break 17628 } 17629 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 17630 v0.AddArg3(x, y, z) 17631 b.resetWithControl(BlockARMGEnoov, v0) 17632 return true 17633 } 17634 // match: (GE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 17635 // cond: l.Uses==1 17636 // result: (GEnoov (TSTshiftRLreg x y z) yes no) 17637 for b.Controls[0].Op == OpARMCMPconst { 17638 v_0 := b.Controls[0] 17639 if auxIntToInt32(v_0.AuxInt) != 0 { 17640 break 17641 } 17642 l := v_0.Args[0] 17643 if l.Op != OpARMANDshiftRLreg { 17644 break 17645 } 17646 z := l.Args[2] 17647 x := l.Args[0] 17648 y := l.Args[1] 17649 if !(l.Uses == 1) { 17650 break 17651 } 17652 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 17653 v0.AddArg3(x, y, z) 17654 b.resetWithControl(BlockARMGEnoov, v0) 17655 return true 17656 } 17657 // match: (GE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 17658 // cond: l.Uses==1 17659 // result: (GEnoov (TSTshiftRAreg x y z) yes no) 17660 for b.Controls[0].Op == OpARMCMPconst { 17661 v_0 := b.Controls[0] 17662 if auxIntToInt32(v_0.AuxInt) != 0 { 17663 break 17664 } 17665 l := v_0.Args[0] 17666 if l.Op != OpARMANDshiftRAreg { 17667 break 17668 } 17669 z := l.Args[2] 17670 x := l.Args[0] 17671 y := l.Args[1] 17672 if !(l.Uses == 1) { 17673 break 17674 } 17675 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 17676 v0.AddArg3(x, y, z) 17677 b.resetWithControl(BlockARMGEnoov, v0) 17678 return true 17679 } 17680 // match: (GE (CMPconst [0] l:(XOR x y)) yes no) 17681 // cond: l.Uses==1 17682 // result: (GEnoov (TEQ x y) yes no) 17683 for b.Controls[0].Op == OpARMCMPconst { 17684 v_0 := b.Controls[0] 17685 if auxIntToInt32(v_0.AuxInt) != 0 { 17686 break 17687 } 17688 l := v_0.Args[0] 17689 if l.Op != OpARMXOR { 17690 break 17691 } 17692 _ = l.Args[1] 17693 l_0 := l.Args[0] 17694 l_1 := l.Args[1] 17695 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17696 x := l_0 17697 y := l_1 17698 if !(l.Uses == 1) { 17699 continue 17700 } 17701 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 17702 v0.AddArg2(x, y) 17703 b.resetWithControl(BlockARMGEnoov, v0) 17704 return true 17705 } 17706 break 17707 } 17708 // match: (GE (CMPconst [0] l:(XORconst [c] x)) yes no) 17709 // cond: l.Uses==1 17710 // result: (GEnoov (TEQconst [c] x) yes no) 17711 for b.Controls[0].Op == OpARMCMPconst { 17712 v_0 := b.Controls[0] 17713 if auxIntToInt32(v_0.AuxInt) != 0 { 17714 break 17715 } 17716 l := v_0.Args[0] 17717 if l.Op != OpARMXORconst { 17718 break 17719 } 17720 c := auxIntToInt32(l.AuxInt) 17721 x := l.Args[0] 17722 if !(l.Uses == 1) { 17723 break 17724 } 17725 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 17726 v0.AuxInt = int32ToAuxInt(c) 17727 v0.AddArg(x) 17728 b.resetWithControl(BlockARMGEnoov, v0) 17729 return true 17730 } 17731 // match: (GE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 17732 // cond: l.Uses==1 17733 // result: (GEnoov (TEQshiftLL x y [c]) yes no) 17734 for b.Controls[0].Op == OpARMCMPconst { 17735 v_0 := b.Controls[0] 17736 if auxIntToInt32(v_0.AuxInt) != 0 { 17737 break 17738 } 17739 l := v_0.Args[0] 17740 if l.Op != OpARMXORshiftLL { 17741 break 17742 } 17743 c := auxIntToInt32(l.AuxInt) 17744 y := l.Args[1] 17745 x := l.Args[0] 17746 if !(l.Uses == 1) { 17747 break 17748 } 17749 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 17750 v0.AuxInt = int32ToAuxInt(c) 17751 v0.AddArg2(x, y) 17752 b.resetWithControl(BlockARMGEnoov, v0) 17753 return true 17754 } 17755 // match: (GE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 17756 // cond: l.Uses==1 17757 // result: (GEnoov (TEQshiftRL x y [c]) yes no) 17758 for b.Controls[0].Op == OpARMCMPconst { 17759 v_0 := b.Controls[0] 17760 if auxIntToInt32(v_0.AuxInt) != 0 { 17761 break 17762 } 17763 l := v_0.Args[0] 17764 if l.Op != OpARMXORshiftRL { 17765 break 17766 } 17767 c := auxIntToInt32(l.AuxInt) 17768 y := l.Args[1] 17769 x := l.Args[0] 17770 if !(l.Uses == 1) { 17771 break 17772 } 17773 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 17774 v0.AuxInt = int32ToAuxInt(c) 17775 v0.AddArg2(x, y) 17776 b.resetWithControl(BlockARMGEnoov, v0) 17777 return true 17778 } 17779 // match: (GE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 17780 // cond: l.Uses==1 17781 // result: (GEnoov (TEQshiftRA x y [c]) yes no) 17782 for b.Controls[0].Op == OpARMCMPconst { 17783 v_0 := b.Controls[0] 17784 if auxIntToInt32(v_0.AuxInt) != 0 { 17785 break 17786 } 17787 l := v_0.Args[0] 17788 if l.Op != OpARMXORshiftRA { 17789 break 17790 } 17791 c := auxIntToInt32(l.AuxInt) 17792 y := l.Args[1] 17793 x := l.Args[0] 17794 if !(l.Uses == 1) { 17795 break 17796 } 17797 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 17798 v0.AuxInt = int32ToAuxInt(c) 17799 v0.AddArg2(x, y) 17800 b.resetWithControl(BlockARMGEnoov, v0) 17801 return true 17802 } 17803 // match: (GE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 17804 // cond: l.Uses==1 17805 // result: (GEnoov (TEQshiftLLreg x y z) yes no) 17806 for b.Controls[0].Op == OpARMCMPconst { 17807 v_0 := b.Controls[0] 17808 if auxIntToInt32(v_0.AuxInt) != 0 { 17809 break 17810 } 17811 l := v_0.Args[0] 17812 if l.Op != OpARMXORshiftLLreg { 17813 break 17814 } 17815 z := l.Args[2] 17816 x := l.Args[0] 17817 y := l.Args[1] 17818 if !(l.Uses == 1) { 17819 break 17820 } 17821 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 17822 v0.AddArg3(x, y, z) 17823 b.resetWithControl(BlockARMGEnoov, v0) 17824 return true 17825 } 17826 // match: (GE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 17827 // cond: l.Uses==1 17828 // result: (GEnoov (TEQshiftRLreg x y z) yes no) 17829 for b.Controls[0].Op == OpARMCMPconst { 17830 v_0 := b.Controls[0] 17831 if auxIntToInt32(v_0.AuxInt) != 0 { 17832 break 17833 } 17834 l := v_0.Args[0] 17835 if l.Op != OpARMXORshiftRLreg { 17836 break 17837 } 17838 z := l.Args[2] 17839 x := l.Args[0] 17840 y := l.Args[1] 17841 if !(l.Uses == 1) { 17842 break 17843 } 17844 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 17845 v0.AddArg3(x, y, z) 17846 b.resetWithControl(BlockARMGEnoov, v0) 17847 return true 17848 } 17849 // match: (GE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 17850 // cond: l.Uses==1 17851 // result: (GEnoov (TEQshiftRAreg x y z) yes no) 17852 for b.Controls[0].Op == OpARMCMPconst { 17853 v_0 := b.Controls[0] 17854 if auxIntToInt32(v_0.AuxInt) != 0 { 17855 break 17856 } 17857 l := v_0.Args[0] 17858 if l.Op != OpARMXORshiftRAreg { 17859 break 17860 } 17861 z := l.Args[2] 17862 x := l.Args[0] 17863 y := l.Args[1] 17864 if !(l.Uses == 1) { 17865 break 17866 } 17867 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 17868 v0.AddArg3(x, y, z) 17869 b.resetWithControl(BlockARMGEnoov, v0) 17870 return true 17871 } 17872 case BlockARMGEnoov: 17873 // match: (GEnoov (FlagConstant [fc]) yes no) 17874 // cond: fc.geNoov() 17875 // result: (First yes no) 17876 for b.Controls[0].Op == OpARMFlagConstant { 17877 v_0 := b.Controls[0] 17878 fc := auxIntToFlagConstant(v_0.AuxInt) 17879 if !(fc.geNoov()) { 17880 break 17881 } 17882 b.Reset(BlockFirst) 17883 return true 17884 } 17885 // match: (GEnoov (FlagConstant [fc]) yes no) 17886 // cond: !fc.geNoov() 17887 // result: (First no yes) 17888 for b.Controls[0].Op == OpARMFlagConstant { 17889 v_0 := b.Controls[0] 17890 fc := auxIntToFlagConstant(v_0.AuxInt) 17891 if !(!fc.geNoov()) { 17892 break 17893 } 17894 b.Reset(BlockFirst) 17895 b.swapSuccessors() 17896 return true 17897 } 17898 // match: (GEnoov (InvertFlags cmp) yes no) 17899 // result: (LEnoov cmp yes no) 17900 for b.Controls[0].Op == OpARMInvertFlags { 17901 v_0 := b.Controls[0] 17902 cmp := v_0.Args[0] 17903 b.resetWithControl(BlockARMLEnoov, cmp) 17904 return true 17905 } 17906 case BlockARMGT: 17907 // match: (GT (FlagConstant [fc]) yes no) 17908 // cond: fc.gt() 17909 // result: (First yes no) 17910 for b.Controls[0].Op == OpARMFlagConstant { 17911 v_0 := b.Controls[0] 17912 fc := auxIntToFlagConstant(v_0.AuxInt) 17913 if !(fc.gt()) { 17914 break 17915 } 17916 b.Reset(BlockFirst) 17917 return true 17918 } 17919 // match: (GT (FlagConstant [fc]) yes no) 17920 // cond: !fc.gt() 17921 // result: (First no yes) 17922 for b.Controls[0].Op == OpARMFlagConstant { 17923 v_0 := b.Controls[0] 17924 fc := auxIntToFlagConstant(v_0.AuxInt) 17925 if !(!fc.gt()) { 17926 break 17927 } 17928 b.Reset(BlockFirst) 17929 b.swapSuccessors() 17930 return true 17931 } 17932 // match: (GT (InvertFlags cmp) yes no) 17933 // result: (LT cmp yes no) 17934 for b.Controls[0].Op == OpARMInvertFlags { 17935 v_0 := b.Controls[0] 17936 cmp := v_0.Args[0] 17937 b.resetWithControl(BlockARMLT, cmp) 17938 return true 17939 } 17940 // match: (GT (CMPconst [0] l:(SUB x y)) yes no) 17941 // cond: l.Uses==1 17942 // result: (GTnoov (CMP x y) yes no) 17943 for b.Controls[0].Op == OpARMCMPconst { 17944 v_0 := b.Controls[0] 17945 if auxIntToInt32(v_0.AuxInt) != 0 { 17946 break 17947 } 17948 l := v_0.Args[0] 17949 if l.Op != OpARMSUB { 17950 break 17951 } 17952 y := l.Args[1] 17953 x := l.Args[0] 17954 if !(l.Uses == 1) { 17955 break 17956 } 17957 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17958 v0.AddArg2(x, y) 17959 b.resetWithControl(BlockARMGTnoov, v0) 17960 return true 17961 } 17962 // match: (GT (CMPconst [0] l:(MULS x y a)) yes no) 17963 // cond: l.Uses==1 17964 // result: (GTnoov (CMP a (MUL <x.Type> x y)) yes no) 17965 for b.Controls[0].Op == OpARMCMPconst { 17966 v_0 := b.Controls[0] 17967 if auxIntToInt32(v_0.AuxInt) != 0 { 17968 break 17969 } 17970 l := v_0.Args[0] 17971 if l.Op != OpARMMULS { 17972 break 17973 } 17974 a := l.Args[2] 17975 x := l.Args[0] 17976 y := l.Args[1] 17977 if !(l.Uses == 1) { 17978 break 17979 } 17980 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17981 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 17982 v1.AddArg2(x, y) 17983 v0.AddArg2(a, v1) 17984 b.resetWithControl(BlockARMGTnoov, v0) 17985 return true 17986 } 17987 // match: (GT (CMPconst [0] l:(SUBconst [c] x)) yes no) 17988 // cond: l.Uses==1 17989 // result: (GTnoov (CMPconst [c] x) yes no) 17990 for b.Controls[0].Op == OpARMCMPconst { 17991 v_0 := b.Controls[0] 17992 if auxIntToInt32(v_0.AuxInt) != 0 { 17993 break 17994 } 17995 l := v_0.Args[0] 17996 if l.Op != OpARMSUBconst { 17997 break 17998 } 17999 c := auxIntToInt32(l.AuxInt) 18000 x := l.Args[0] 18001 if !(l.Uses == 1) { 18002 break 18003 } 18004 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 18005 v0.AuxInt = int32ToAuxInt(c) 18006 v0.AddArg(x) 18007 b.resetWithControl(BlockARMGTnoov, v0) 18008 return true 18009 } 18010 // match: (GT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 18011 // cond: l.Uses==1 18012 // result: (GTnoov (CMPshiftLL x y [c]) yes no) 18013 for b.Controls[0].Op == OpARMCMPconst { 18014 v_0 := b.Controls[0] 18015 if auxIntToInt32(v_0.AuxInt) != 0 { 18016 break 18017 } 18018 l := v_0.Args[0] 18019 if l.Op != OpARMSUBshiftLL { 18020 break 18021 } 18022 c := auxIntToInt32(l.AuxInt) 18023 y := l.Args[1] 18024 x := l.Args[0] 18025 if !(l.Uses == 1) { 18026 break 18027 } 18028 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 18029 v0.AuxInt = int32ToAuxInt(c) 18030 v0.AddArg2(x, y) 18031 b.resetWithControl(BlockARMGTnoov, v0) 18032 return true 18033 } 18034 // match: (GT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 18035 // cond: l.Uses==1 18036 // result: (GTnoov (CMPshiftRL x y [c]) yes no) 18037 for b.Controls[0].Op == OpARMCMPconst { 18038 v_0 := b.Controls[0] 18039 if auxIntToInt32(v_0.AuxInt) != 0 { 18040 break 18041 } 18042 l := v_0.Args[0] 18043 if l.Op != OpARMSUBshiftRL { 18044 break 18045 } 18046 c := auxIntToInt32(l.AuxInt) 18047 y := l.Args[1] 18048 x := l.Args[0] 18049 if !(l.Uses == 1) { 18050 break 18051 } 18052 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 18053 v0.AuxInt = int32ToAuxInt(c) 18054 v0.AddArg2(x, y) 18055 b.resetWithControl(BlockARMGTnoov, v0) 18056 return true 18057 } 18058 // match: (GT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 18059 // cond: l.Uses==1 18060 // result: (GTnoov (CMPshiftRA x y [c]) yes no) 18061 for b.Controls[0].Op == OpARMCMPconst { 18062 v_0 := b.Controls[0] 18063 if auxIntToInt32(v_0.AuxInt) != 0 { 18064 break 18065 } 18066 l := v_0.Args[0] 18067 if l.Op != OpARMSUBshiftRA { 18068 break 18069 } 18070 c := auxIntToInt32(l.AuxInt) 18071 y := l.Args[1] 18072 x := l.Args[0] 18073 if !(l.Uses == 1) { 18074 break 18075 } 18076 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 18077 v0.AuxInt = int32ToAuxInt(c) 18078 v0.AddArg2(x, y) 18079 b.resetWithControl(BlockARMGTnoov, v0) 18080 return true 18081 } 18082 // match: (GT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 18083 // cond: l.Uses==1 18084 // result: (GTnoov (CMPshiftLLreg x y z) yes no) 18085 for b.Controls[0].Op == OpARMCMPconst { 18086 v_0 := b.Controls[0] 18087 if auxIntToInt32(v_0.AuxInt) != 0 { 18088 break 18089 } 18090 l := v_0.Args[0] 18091 if l.Op != OpARMSUBshiftLLreg { 18092 break 18093 } 18094 z := l.Args[2] 18095 x := l.Args[0] 18096 y := l.Args[1] 18097 if !(l.Uses == 1) { 18098 break 18099 } 18100 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 18101 v0.AddArg3(x, y, z) 18102 b.resetWithControl(BlockARMGTnoov, v0) 18103 return true 18104 } 18105 // match: (GT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 18106 // cond: l.Uses==1 18107 // result: (GTnoov (CMPshiftRLreg x y z) yes no) 18108 for b.Controls[0].Op == OpARMCMPconst { 18109 v_0 := b.Controls[0] 18110 if auxIntToInt32(v_0.AuxInt) != 0 { 18111 break 18112 } 18113 l := v_0.Args[0] 18114 if l.Op != OpARMSUBshiftRLreg { 18115 break 18116 } 18117 z := l.Args[2] 18118 x := l.Args[0] 18119 y := l.Args[1] 18120 if !(l.Uses == 1) { 18121 break 18122 } 18123 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 18124 v0.AddArg3(x, y, z) 18125 b.resetWithControl(BlockARMGTnoov, v0) 18126 return true 18127 } 18128 // match: (GT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 18129 // cond: l.Uses==1 18130 // result: (GTnoov (CMPshiftRAreg x y z) yes no) 18131 for b.Controls[0].Op == OpARMCMPconst { 18132 v_0 := b.Controls[0] 18133 if auxIntToInt32(v_0.AuxInt) != 0 { 18134 break 18135 } 18136 l := v_0.Args[0] 18137 if l.Op != OpARMSUBshiftRAreg { 18138 break 18139 } 18140 z := l.Args[2] 18141 x := l.Args[0] 18142 y := l.Args[1] 18143 if !(l.Uses == 1) { 18144 break 18145 } 18146 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 18147 v0.AddArg3(x, y, z) 18148 b.resetWithControl(BlockARMGTnoov, v0) 18149 return true 18150 } 18151 // match: (GT (CMPconst [0] l:(ADD x y)) yes no) 18152 // cond: l.Uses==1 18153 // result: (GTnoov (CMN x y) yes no) 18154 for b.Controls[0].Op == OpARMCMPconst { 18155 v_0 := b.Controls[0] 18156 if auxIntToInt32(v_0.AuxInt) != 0 { 18157 break 18158 } 18159 l := v_0.Args[0] 18160 if l.Op != OpARMADD { 18161 break 18162 } 18163 _ = l.Args[1] 18164 l_0 := l.Args[0] 18165 l_1 := l.Args[1] 18166 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18167 x := l_0 18168 y := l_1 18169 if !(l.Uses == 1) { 18170 continue 18171 } 18172 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 18173 v0.AddArg2(x, y) 18174 b.resetWithControl(BlockARMGTnoov, v0) 18175 return true 18176 } 18177 break 18178 } 18179 // match: (GT (CMPconst [0] l:(ADDconst [c] x)) yes no) 18180 // cond: l.Uses==1 18181 // result: (GTnoov (CMNconst [c] x) yes no) 18182 for b.Controls[0].Op == OpARMCMPconst { 18183 v_0 := b.Controls[0] 18184 if auxIntToInt32(v_0.AuxInt) != 0 { 18185 break 18186 } 18187 l := v_0.Args[0] 18188 if l.Op != OpARMADDconst { 18189 break 18190 } 18191 c := auxIntToInt32(l.AuxInt) 18192 x := l.Args[0] 18193 if !(l.Uses == 1) { 18194 break 18195 } 18196 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 18197 v0.AuxInt = int32ToAuxInt(c) 18198 v0.AddArg(x) 18199 b.resetWithControl(BlockARMGTnoov, v0) 18200 return true 18201 } 18202 // match: (GT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 18203 // cond: l.Uses==1 18204 // result: (GTnoov (CMNshiftLL x y [c]) yes no) 18205 for b.Controls[0].Op == OpARMCMPconst { 18206 v_0 := b.Controls[0] 18207 if auxIntToInt32(v_0.AuxInt) != 0 { 18208 break 18209 } 18210 l := v_0.Args[0] 18211 if l.Op != OpARMADDshiftLL { 18212 break 18213 } 18214 c := auxIntToInt32(l.AuxInt) 18215 y := l.Args[1] 18216 x := l.Args[0] 18217 if !(l.Uses == 1) { 18218 break 18219 } 18220 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 18221 v0.AuxInt = int32ToAuxInt(c) 18222 v0.AddArg2(x, y) 18223 b.resetWithControl(BlockARMGTnoov, v0) 18224 return true 18225 } 18226 // match: (GT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 18227 // cond: l.Uses==1 18228 // result: (GTnoov (CMNshiftRL x y [c]) yes no) 18229 for b.Controls[0].Op == OpARMCMPconst { 18230 v_0 := b.Controls[0] 18231 if auxIntToInt32(v_0.AuxInt) != 0 { 18232 break 18233 } 18234 l := v_0.Args[0] 18235 if l.Op != OpARMADDshiftRL { 18236 break 18237 } 18238 c := auxIntToInt32(l.AuxInt) 18239 y := l.Args[1] 18240 x := l.Args[0] 18241 if !(l.Uses == 1) { 18242 break 18243 } 18244 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 18245 v0.AuxInt = int32ToAuxInt(c) 18246 v0.AddArg2(x, y) 18247 b.resetWithControl(BlockARMGTnoov, v0) 18248 return true 18249 } 18250 // match: (GT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 18251 // cond: l.Uses==1 18252 // result: (GTnoov (CMNshiftRA x y [c]) yes no) 18253 for b.Controls[0].Op == OpARMCMPconst { 18254 v_0 := b.Controls[0] 18255 if auxIntToInt32(v_0.AuxInt) != 0 { 18256 break 18257 } 18258 l := v_0.Args[0] 18259 if l.Op != OpARMADDshiftRA { 18260 break 18261 } 18262 c := auxIntToInt32(l.AuxInt) 18263 y := l.Args[1] 18264 x := l.Args[0] 18265 if !(l.Uses == 1) { 18266 break 18267 } 18268 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 18269 v0.AuxInt = int32ToAuxInt(c) 18270 v0.AddArg2(x, y) 18271 b.resetWithControl(BlockARMGTnoov, v0) 18272 return true 18273 } 18274 // match: (GT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 18275 // cond: l.Uses==1 18276 // result: (GTnoov (CMNshiftLLreg x y z) yes no) 18277 for b.Controls[0].Op == OpARMCMPconst { 18278 v_0 := b.Controls[0] 18279 if auxIntToInt32(v_0.AuxInt) != 0 { 18280 break 18281 } 18282 l := v_0.Args[0] 18283 if l.Op != OpARMADDshiftLLreg { 18284 break 18285 } 18286 z := l.Args[2] 18287 x := l.Args[0] 18288 y := l.Args[1] 18289 if !(l.Uses == 1) { 18290 break 18291 } 18292 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 18293 v0.AddArg3(x, y, z) 18294 b.resetWithControl(BlockARMGTnoov, v0) 18295 return true 18296 } 18297 // match: (GT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 18298 // cond: l.Uses==1 18299 // result: (GTnoov (CMNshiftRLreg x y z) yes no) 18300 for b.Controls[0].Op == OpARMCMPconst { 18301 v_0 := b.Controls[0] 18302 if auxIntToInt32(v_0.AuxInt) != 0 { 18303 break 18304 } 18305 l := v_0.Args[0] 18306 if l.Op != OpARMADDshiftRLreg { 18307 break 18308 } 18309 z := l.Args[2] 18310 x := l.Args[0] 18311 y := l.Args[1] 18312 if !(l.Uses == 1) { 18313 break 18314 } 18315 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 18316 v0.AddArg3(x, y, z) 18317 b.resetWithControl(BlockARMGTnoov, v0) 18318 return true 18319 } 18320 // match: (GT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 18321 // cond: l.Uses==1 18322 // result: (GTnoov (CMNshiftRAreg x y z) yes no) 18323 for b.Controls[0].Op == OpARMCMPconst { 18324 v_0 := b.Controls[0] 18325 if auxIntToInt32(v_0.AuxInt) != 0 { 18326 break 18327 } 18328 l := v_0.Args[0] 18329 if l.Op != OpARMADDshiftRAreg { 18330 break 18331 } 18332 z := l.Args[2] 18333 x := l.Args[0] 18334 y := l.Args[1] 18335 if !(l.Uses == 1) { 18336 break 18337 } 18338 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 18339 v0.AddArg3(x, y, z) 18340 b.resetWithControl(BlockARMGTnoov, v0) 18341 return true 18342 } 18343 // match: (GT (CMPconst [0] l:(MULA x y a)) yes no) 18344 // cond: l.Uses==1 18345 // result: (GTnoov (CMN a (MUL <x.Type> x y)) yes no) 18346 for b.Controls[0].Op == OpARMCMPconst { 18347 v_0 := b.Controls[0] 18348 if auxIntToInt32(v_0.AuxInt) != 0 { 18349 break 18350 } 18351 l := v_0.Args[0] 18352 if l.Op != OpARMMULA { 18353 break 18354 } 18355 a := l.Args[2] 18356 x := l.Args[0] 18357 y := l.Args[1] 18358 if !(l.Uses == 1) { 18359 break 18360 } 18361 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 18362 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 18363 v1.AddArg2(x, y) 18364 v0.AddArg2(a, v1) 18365 b.resetWithControl(BlockARMGTnoov, v0) 18366 return true 18367 } 18368 // match: (GT (CMPconst [0] l:(AND x y)) yes no) 18369 // cond: l.Uses==1 18370 // result: (GTnoov (TST x y) yes no) 18371 for b.Controls[0].Op == OpARMCMPconst { 18372 v_0 := b.Controls[0] 18373 if auxIntToInt32(v_0.AuxInt) != 0 { 18374 break 18375 } 18376 l := v_0.Args[0] 18377 if l.Op != OpARMAND { 18378 break 18379 } 18380 _ = l.Args[1] 18381 l_0 := l.Args[0] 18382 l_1 := l.Args[1] 18383 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18384 x := l_0 18385 y := l_1 18386 if !(l.Uses == 1) { 18387 continue 18388 } 18389 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 18390 v0.AddArg2(x, y) 18391 b.resetWithControl(BlockARMGTnoov, v0) 18392 return true 18393 } 18394 break 18395 } 18396 // match: (GT (CMPconst [0] l:(ANDconst [c] x)) yes no) 18397 // cond: l.Uses==1 18398 // result: (GTnoov (TSTconst [c] x) yes no) 18399 for b.Controls[0].Op == OpARMCMPconst { 18400 v_0 := b.Controls[0] 18401 if auxIntToInt32(v_0.AuxInt) != 0 { 18402 break 18403 } 18404 l := v_0.Args[0] 18405 if l.Op != OpARMANDconst { 18406 break 18407 } 18408 c := auxIntToInt32(l.AuxInt) 18409 x := l.Args[0] 18410 if !(l.Uses == 1) { 18411 break 18412 } 18413 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 18414 v0.AuxInt = int32ToAuxInt(c) 18415 v0.AddArg(x) 18416 b.resetWithControl(BlockARMGTnoov, v0) 18417 return true 18418 } 18419 // match: (GT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 18420 // cond: l.Uses==1 18421 // result: (GTnoov (TSTshiftLL x y [c]) yes no) 18422 for b.Controls[0].Op == OpARMCMPconst { 18423 v_0 := b.Controls[0] 18424 if auxIntToInt32(v_0.AuxInt) != 0 { 18425 break 18426 } 18427 l := v_0.Args[0] 18428 if l.Op != OpARMANDshiftLL { 18429 break 18430 } 18431 c := auxIntToInt32(l.AuxInt) 18432 y := l.Args[1] 18433 x := l.Args[0] 18434 if !(l.Uses == 1) { 18435 break 18436 } 18437 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 18438 v0.AuxInt = int32ToAuxInt(c) 18439 v0.AddArg2(x, y) 18440 b.resetWithControl(BlockARMGTnoov, v0) 18441 return true 18442 } 18443 // match: (GT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 18444 // cond: l.Uses==1 18445 // result: (GTnoov (TSTshiftRL x y [c]) yes no) 18446 for b.Controls[0].Op == OpARMCMPconst { 18447 v_0 := b.Controls[0] 18448 if auxIntToInt32(v_0.AuxInt) != 0 { 18449 break 18450 } 18451 l := v_0.Args[0] 18452 if l.Op != OpARMANDshiftRL { 18453 break 18454 } 18455 c := auxIntToInt32(l.AuxInt) 18456 y := l.Args[1] 18457 x := l.Args[0] 18458 if !(l.Uses == 1) { 18459 break 18460 } 18461 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 18462 v0.AuxInt = int32ToAuxInt(c) 18463 v0.AddArg2(x, y) 18464 b.resetWithControl(BlockARMGTnoov, v0) 18465 return true 18466 } 18467 // match: (GT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 18468 // cond: l.Uses==1 18469 // result: (GTnoov (TSTshiftRA x y [c]) yes no) 18470 for b.Controls[0].Op == OpARMCMPconst { 18471 v_0 := b.Controls[0] 18472 if auxIntToInt32(v_0.AuxInt) != 0 { 18473 break 18474 } 18475 l := v_0.Args[0] 18476 if l.Op != OpARMANDshiftRA { 18477 break 18478 } 18479 c := auxIntToInt32(l.AuxInt) 18480 y := l.Args[1] 18481 x := l.Args[0] 18482 if !(l.Uses == 1) { 18483 break 18484 } 18485 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 18486 v0.AuxInt = int32ToAuxInt(c) 18487 v0.AddArg2(x, y) 18488 b.resetWithControl(BlockARMGTnoov, v0) 18489 return true 18490 } 18491 // match: (GT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 18492 // cond: l.Uses==1 18493 // result: (GTnoov (TSTshiftLLreg x y z) yes no) 18494 for b.Controls[0].Op == OpARMCMPconst { 18495 v_0 := b.Controls[0] 18496 if auxIntToInt32(v_0.AuxInt) != 0 { 18497 break 18498 } 18499 l := v_0.Args[0] 18500 if l.Op != OpARMANDshiftLLreg { 18501 break 18502 } 18503 z := l.Args[2] 18504 x := l.Args[0] 18505 y := l.Args[1] 18506 if !(l.Uses == 1) { 18507 break 18508 } 18509 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 18510 v0.AddArg3(x, y, z) 18511 b.resetWithControl(BlockARMGTnoov, v0) 18512 return true 18513 } 18514 // match: (GT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 18515 // cond: l.Uses==1 18516 // result: (GTnoov (TSTshiftRLreg x y z) yes no) 18517 for b.Controls[0].Op == OpARMCMPconst { 18518 v_0 := b.Controls[0] 18519 if auxIntToInt32(v_0.AuxInt) != 0 { 18520 break 18521 } 18522 l := v_0.Args[0] 18523 if l.Op != OpARMANDshiftRLreg { 18524 break 18525 } 18526 z := l.Args[2] 18527 x := l.Args[0] 18528 y := l.Args[1] 18529 if !(l.Uses == 1) { 18530 break 18531 } 18532 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 18533 v0.AddArg3(x, y, z) 18534 b.resetWithControl(BlockARMGTnoov, v0) 18535 return true 18536 } 18537 // match: (GT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 18538 // cond: l.Uses==1 18539 // result: (GTnoov (TSTshiftRAreg x y z) yes no) 18540 for b.Controls[0].Op == OpARMCMPconst { 18541 v_0 := b.Controls[0] 18542 if auxIntToInt32(v_0.AuxInt) != 0 { 18543 break 18544 } 18545 l := v_0.Args[0] 18546 if l.Op != OpARMANDshiftRAreg { 18547 break 18548 } 18549 z := l.Args[2] 18550 x := l.Args[0] 18551 y := l.Args[1] 18552 if !(l.Uses == 1) { 18553 break 18554 } 18555 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 18556 v0.AddArg3(x, y, z) 18557 b.resetWithControl(BlockARMGTnoov, v0) 18558 return true 18559 } 18560 // match: (GT (CMPconst [0] l:(XOR x y)) yes no) 18561 // cond: l.Uses==1 18562 // result: (GTnoov (TEQ x y) yes no) 18563 for b.Controls[0].Op == OpARMCMPconst { 18564 v_0 := b.Controls[0] 18565 if auxIntToInt32(v_0.AuxInt) != 0 { 18566 break 18567 } 18568 l := v_0.Args[0] 18569 if l.Op != OpARMXOR { 18570 break 18571 } 18572 _ = l.Args[1] 18573 l_0 := l.Args[0] 18574 l_1 := l.Args[1] 18575 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18576 x := l_0 18577 y := l_1 18578 if !(l.Uses == 1) { 18579 continue 18580 } 18581 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 18582 v0.AddArg2(x, y) 18583 b.resetWithControl(BlockARMGTnoov, v0) 18584 return true 18585 } 18586 break 18587 } 18588 // match: (GT (CMPconst [0] l:(XORconst [c] x)) yes no) 18589 // cond: l.Uses==1 18590 // result: (GTnoov (TEQconst [c] x) yes no) 18591 for b.Controls[0].Op == OpARMCMPconst { 18592 v_0 := b.Controls[0] 18593 if auxIntToInt32(v_0.AuxInt) != 0 { 18594 break 18595 } 18596 l := v_0.Args[0] 18597 if l.Op != OpARMXORconst { 18598 break 18599 } 18600 c := auxIntToInt32(l.AuxInt) 18601 x := l.Args[0] 18602 if !(l.Uses == 1) { 18603 break 18604 } 18605 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 18606 v0.AuxInt = int32ToAuxInt(c) 18607 v0.AddArg(x) 18608 b.resetWithControl(BlockARMGTnoov, v0) 18609 return true 18610 } 18611 // match: (GT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 18612 // cond: l.Uses==1 18613 // result: (GTnoov (TEQshiftLL x y [c]) yes no) 18614 for b.Controls[0].Op == OpARMCMPconst { 18615 v_0 := b.Controls[0] 18616 if auxIntToInt32(v_0.AuxInt) != 0 { 18617 break 18618 } 18619 l := v_0.Args[0] 18620 if l.Op != OpARMXORshiftLL { 18621 break 18622 } 18623 c := auxIntToInt32(l.AuxInt) 18624 y := l.Args[1] 18625 x := l.Args[0] 18626 if !(l.Uses == 1) { 18627 break 18628 } 18629 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 18630 v0.AuxInt = int32ToAuxInt(c) 18631 v0.AddArg2(x, y) 18632 b.resetWithControl(BlockARMGTnoov, v0) 18633 return true 18634 } 18635 // match: (GT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 18636 // cond: l.Uses==1 18637 // result: (GTnoov (TEQshiftRL x y [c]) yes no) 18638 for b.Controls[0].Op == OpARMCMPconst { 18639 v_0 := b.Controls[0] 18640 if auxIntToInt32(v_0.AuxInt) != 0 { 18641 break 18642 } 18643 l := v_0.Args[0] 18644 if l.Op != OpARMXORshiftRL { 18645 break 18646 } 18647 c := auxIntToInt32(l.AuxInt) 18648 y := l.Args[1] 18649 x := l.Args[0] 18650 if !(l.Uses == 1) { 18651 break 18652 } 18653 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 18654 v0.AuxInt = int32ToAuxInt(c) 18655 v0.AddArg2(x, y) 18656 b.resetWithControl(BlockARMGTnoov, v0) 18657 return true 18658 } 18659 // match: (GT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 18660 // cond: l.Uses==1 18661 // result: (GTnoov (TEQshiftRA x y [c]) yes no) 18662 for b.Controls[0].Op == OpARMCMPconst { 18663 v_0 := b.Controls[0] 18664 if auxIntToInt32(v_0.AuxInt) != 0 { 18665 break 18666 } 18667 l := v_0.Args[0] 18668 if l.Op != OpARMXORshiftRA { 18669 break 18670 } 18671 c := auxIntToInt32(l.AuxInt) 18672 y := l.Args[1] 18673 x := l.Args[0] 18674 if !(l.Uses == 1) { 18675 break 18676 } 18677 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 18678 v0.AuxInt = int32ToAuxInt(c) 18679 v0.AddArg2(x, y) 18680 b.resetWithControl(BlockARMGTnoov, v0) 18681 return true 18682 } 18683 // match: (GT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 18684 // cond: l.Uses==1 18685 // result: (GTnoov (TEQshiftLLreg x y z) yes no) 18686 for b.Controls[0].Op == OpARMCMPconst { 18687 v_0 := b.Controls[0] 18688 if auxIntToInt32(v_0.AuxInt) != 0 { 18689 break 18690 } 18691 l := v_0.Args[0] 18692 if l.Op != OpARMXORshiftLLreg { 18693 break 18694 } 18695 z := l.Args[2] 18696 x := l.Args[0] 18697 y := l.Args[1] 18698 if !(l.Uses == 1) { 18699 break 18700 } 18701 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 18702 v0.AddArg3(x, y, z) 18703 b.resetWithControl(BlockARMGTnoov, v0) 18704 return true 18705 } 18706 // match: (GT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 18707 // cond: l.Uses==1 18708 // result: (GTnoov (TEQshiftRLreg x y z) yes no) 18709 for b.Controls[0].Op == OpARMCMPconst { 18710 v_0 := b.Controls[0] 18711 if auxIntToInt32(v_0.AuxInt) != 0 { 18712 break 18713 } 18714 l := v_0.Args[0] 18715 if l.Op != OpARMXORshiftRLreg { 18716 break 18717 } 18718 z := l.Args[2] 18719 x := l.Args[0] 18720 y := l.Args[1] 18721 if !(l.Uses == 1) { 18722 break 18723 } 18724 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 18725 v0.AddArg3(x, y, z) 18726 b.resetWithControl(BlockARMGTnoov, v0) 18727 return true 18728 } 18729 // match: (GT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 18730 // cond: l.Uses==1 18731 // result: (GTnoov (TEQshiftRAreg x y z) yes no) 18732 for b.Controls[0].Op == OpARMCMPconst { 18733 v_0 := b.Controls[0] 18734 if auxIntToInt32(v_0.AuxInt) != 0 { 18735 break 18736 } 18737 l := v_0.Args[0] 18738 if l.Op != OpARMXORshiftRAreg { 18739 break 18740 } 18741 z := l.Args[2] 18742 x := l.Args[0] 18743 y := l.Args[1] 18744 if !(l.Uses == 1) { 18745 break 18746 } 18747 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 18748 v0.AddArg3(x, y, z) 18749 b.resetWithControl(BlockARMGTnoov, v0) 18750 return true 18751 } 18752 case BlockARMGTnoov: 18753 // match: (GTnoov (FlagConstant [fc]) yes no) 18754 // cond: fc.gtNoov() 18755 // result: (First yes no) 18756 for b.Controls[0].Op == OpARMFlagConstant { 18757 v_0 := b.Controls[0] 18758 fc := auxIntToFlagConstant(v_0.AuxInt) 18759 if !(fc.gtNoov()) { 18760 break 18761 } 18762 b.Reset(BlockFirst) 18763 return true 18764 } 18765 // match: (GTnoov (FlagConstant [fc]) yes no) 18766 // cond: !fc.gtNoov() 18767 // result: (First no yes) 18768 for b.Controls[0].Op == OpARMFlagConstant { 18769 v_0 := b.Controls[0] 18770 fc := auxIntToFlagConstant(v_0.AuxInt) 18771 if !(!fc.gtNoov()) { 18772 break 18773 } 18774 b.Reset(BlockFirst) 18775 b.swapSuccessors() 18776 return true 18777 } 18778 // match: (GTnoov (InvertFlags cmp) yes no) 18779 // result: (LTnoov cmp yes no) 18780 for b.Controls[0].Op == OpARMInvertFlags { 18781 v_0 := b.Controls[0] 18782 cmp := v_0.Args[0] 18783 b.resetWithControl(BlockARMLTnoov, cmp) 18784 return true 18785 } 18786 case BlockIf: 18787 // match: (If (Equal cc) yes no) 18788 // result: (EQ cc yes no) 18789 for b.Controls[0].Op == OpARMEqual { 18790 v_0 := b.Controls[0] 18791 cc := v_0.Args[0] 18792 b.resetWithControl(BlockARMEQ, cc) 18793 return true 18794 } 18795 // match: (If (NotEqual cc) yes no) 18796 // result: (NE cc yes no) 18797 for b.Controls[0].Op == OpARMNotEqual { 18798 v_0 := b.Controls[0] 18799 cc := v_0.Args[0] 18800 b.resetWithControl(BlockARMNE, cc) 18801 return true 18802 } 18803 // match: (If (LessThan cc) yes no) 18804 // result: (LT cc yes no) 18805 for b.Controls[0].Op == OpARMLessThan { 18806 v_0 := b.Controls[0] 18807 cc := v_0.Args[0] 18808 b.resetWithControl(BlockARMLT, cc) 18809 return true 18810 } 18811 // match: (If (LessThanU cc) yes no) 18812 // result: (ULT cc yes no) 18813 for b.Controls[0].Op == OpARMLessThanU { 18814 v_0 := b.Controls[0] 18815 cc := v_0.Args[0] 18816 b.resetWithControl(BlockARMULT, cc) 18817 return true 18818 } 18819 // match: (If (LessEqual cc) yes no) 18820 // result: (LE cc yes no) 18821 for b.Controls[0].Op == OpARMLessEqual { 18822 v_0 := b.Controls[0] 18823 cc := v_0.Args[0] 18824 b.resetWithControl(BlockARMLE, cc) 18825 return true 18826 } 18827 // match: (If (LessEqualU cc) yes no) 18828 // result: (ULE cc yes no) 18829 for b.Controls[0].Op == OpARMLessEqualU { 18830 v_0 := b.Controls[0] 18831 cc := v_0.Args[0] 18832 b.resetWithControl(BlockARMULE, cc) 18833 return true 18834 } 18835 // match: (If (GreaterThan cc) yes no) 18836 // result: (GT cc yes no) 18837 for b.Controls[0].Op == OpARMGreaterThan { 18838 v_0 := b.Controls[0] 18839 cc := v_0.Args[0] 18840 b.resetWithControl(BlockARMGT, cc) 18841 return true 18842 } 18843 // match: (If (GreaterThanU cc) yes no) 18844 // result: (UGT cc yes no) 18845 for b.Controls[0].Op == OpARMGreaterThanU { 18846 v_0 := b.Controls[0] 18847 cc := v_0.Args[0] 18848 b.resetWithControl(BlockARMUGT, cc) 18849 return true 18850 } 18851 // match: (If (GreaterEqual cc) yes no) 18852 // result: (GE cc yes no) 18853 for b.Controls[0].Op == OpARMGreaterEqual { 18854 v_0 := b.Controls[0] 18855 cc := v_0.Args[0] 18856 b.resetWithControl(BlockARMGE, cc) 18857 return true 18858 } 18859 // match: (If (GreaterEqualU cc) yes no) 18860 // result: (UGE cc yes no) 18861 for b.Controls[0].Op == OpARMGreaterEqualU { 18862 v_0 := b.Controls[0] 18863 cc := v_0.Args[0] 18864 b.resetWithControl(BlockARMUGE, cc) 18865 return true 18866 } 18867 // match: (If cond yes no) 18868 // result: (NE (CMPconst [0] cond) yes no) 18869 for { 18870 cond := b.Controls[0] 18871 v0 := b.NewValue0(cond.Pos, OpARMCMPconst, types.TypeFlags) 18872 v0.AuxInt = int32ToAuxInt(0) 18873 v0.AddArg(cond) 18874 b.resetWithControl(BlockARMNE, v0) 18875 return true 18876 } 18877 case BlockARMLE: 18878 // match: (LE (FlagConstant [fc]) yes no) 18879 // cond: fc.le() 18880 // result: (First yes no) 18881 for b.Controls[0].Op == OpARMFlagConstant { 18882 v_0 := b.Controls[0] 18883 fc := auxIntToFlagConstant(v_0.AuxInt) 18884 if !(fc.le()) { 18885 break 18886 } 18887 b.Reset(BlockFirst) 18888 return true 18889 } 18890 // match: (LE (FlagConstant [fc]) yes no) 18891 // cond: !fc.le() 18892 // result: (First no yes) 18893 for b.Controls[0].Op == OpARMFlagConstant { 18894 v_0 := b.Controls[0] 18895 fc := auxIntToFlagConstant(v_0.AuxInt) 18896 if !(!fc.le()) { 18897 break 18898 } 18899 b.Reset(BlockFirst) 18900 b.swapSuccessors() 18901 return true 18902 } 18903 // match: (LE (InvertFlags cmp) yes no) 18904 // result: (GE cmp yes no) 18905 for b.Controls[0].Op == OpARMInvertFlags { 18906 v_0 := b.Controls[0] 18907 cmp := v_0.Args[0] 18908 b.resetWithControl(BlockARMGE, cmp) 18909 return true 18910 } 18911 // match: (LE (CMPconst [0] l:(SUB x y)) yes no) 18912 // cond: l.Uses==1 18913 // result: (LEnoov (CMP x y) yes no) 18914 for b.Controls[0].Op == OpARMCMPconst { 18915 v_0 := b.Controls[0] 18916 if auxIntToInt32(v_0.AuxInt) != 0 { 18917 break 18918 } 18919 l := v_0.Args[0] 18920 if l.Op != OpARMSUB { 18921 break 18922 } 18923 y := l.Args[1] 18924 x := l.Args[0] 18925 if !(l.Uses == 1) { 18926 break 18927 } 18928 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 18929 v0.AddArg2(x, y) 18930 b.resetWithControl(BlockARMLEnoov, v0) 18931 return true 18932 } 18933 // match: (LE (CMPconst [0] l:(MULS x y a)) yes no) 18934 // cond: l.Uses==1 18935 // result: (LEnoov (CMP a (MUL <x.Type> x y)) yes no) 18936 for b.Controls[0].Op == OpARMCMPconst { 18937 v_0 := b.Controls[0] 18938 if auxIntToInt32(v_0.AuxInt) != 0 { 18939 break 18940 } 18941 l := v_0.Args[0] 18942 if l.Op != OpARMMULS { 18943 break 18944 } 18945 a := l.Args[2] 18946 x := l.Args[0] 18947 y := l.Args[1] 18948 if !(l.Uses == 1) { 18949 break 18950 } 18951 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 18952 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 18953 v1.AddArg2(x, y) 18954 v0.AddArg2(a, v1) 18955 b.resetWithControl(BlockARMLEnoov, v0) 18956 return true 18957 } 18958 // match: (LE (CMPconst [0] l:(SUBconst [c] x)) yes no) 18959 // cond: l.Uses==1 18960 // result: (LEnoov (CMPconst [c] x) yes no) 18961 for b.Controls[0].Op == OpARMCMPconst { 18962 v_0 := b.Controls[0] 18963 if auxIntToInt32(v_0.AuxInt) != 0 { 18964 break 18965 } 18966 l := v_0.Args[0] 18967 if l.Op != OpARMSUBconst { 18968 break 18969 } 18970 c := auxIntToInt32(l.AuxInt) 18971 x := l.Args[0] 18972 if !(l.Uses == 1) { 18973 break 18974 } 18975 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 18976 v0.AuxInt = int32ToAuxInt(c) 18977 v0.AddArg(x) 18978 b.resetWithControl(BlockARMLEnoov, v0) 18979 return true 18980 } 18981 // match: (LE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 18982 // cond: l.Uses==1 18983 // result: (LEnoov (CMPshiftLL x y [c]) yes no) 18984 for b.Controls[0].Op == OpARMCMPconst { 18985 v_0 := b.Controls[0] 18986 if auxIntToInt32(v_0.AuxInt) != 0 { 18987 break 18988 } 18989 l := v_0.Args[0] 18990 if l.Op != OpARMSUBshiftLL { 18991 break 18992 } 18993 c := auxIntToInt32(l.AuxInt) 18994 y := l.Args[1] 18995 x := l.Args[0] 18996 if !(l.Uses == 1) { 18997 break 18998 } 18999 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 19000 v0.AuxInt = int32ToAuxInt(c) 19001 v0.AddArg2(x, y) 19002 b.resetWithControl(BlockARMLEnoov, v0) 19003 return true 19004 } 19005 // match: (LE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 19006 // cond: l.Uses==1 19007 // result: (LEnoov (CMPshiftRL x y [c]) yes no) 19008 for b.Controls[0].Op == OpARMCMPconst { 19009 v_0 := b.Controls[0] 19010 if auxIntToInt32(v_0.AuxInt) != 0 { 19011 break 19012 } 19013 l := v_0.Args[0] 19014 if l.Op != OpARMSUBshiftRL { 19015 break 19016 } 19017 c := auxIntToInt32(l.AuxInt) 19018 y := l.Args[1] 19019 x := l.Args[0] 19020 if !(l.Uses == 1) { 19021 break 19022 } 19023 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 19024 v0.AuxInt = int32ToAuxInt(c) 19025 v0.AddArg2(x, y) 19026 b.resetWithControl(BlockARMLEnoov, v0) 19027 return true 19028 } 19029 // match: (LE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 19030 // cond: l.Uses==1 19031 // result: (LEnoov (CMPshiftRA x y [c]) yes no) 19032 for b.Controls[0].Op == OpARMCMPconst { 19033 v_0 := b.Controls[0] 19034 if auxIntToInt32(v_0.AuxInt) != 0 { 19035 break 19036 } 19037 l := v_0.Args[0] 19038 if l.Op != OpARMSUBshiftRA { 19039 break 19040 } 19041 c := auxIntToInt32(l.AuxInt) 19042 y := l.Args[1] 19043 x := l.Args[0] 19044 if !(l.Uses == 1) { 19045 break 19046 } 19047 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 19048 v0.AuxInt = int32ToAuxInt(c) 19049 v0.AddArg2(x, y) 19050 b.resetWithControl(BlockARMLEnoov, v0) 19051 return true 19052 } 19053 // match: (LE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 19054 // cond: l.Uses==1 19055 // result: (LEnoov (CMPshiftLLreg x y z) yes no) 19056 for b.Controls[0].Op == OpARMCMPconst { 19057 v_0 := b.Controls[0] 19058 if auxIntToInt32(v_0.AuxInt) != 0 { 19059 break 19060 } 19061 l := v_0.Args[0] 19062 if l.Op != OpARMSUBshiftLLreg { 19063 break 19064 } 19065 z := l.Args[2] 19066 x := l.Args[0] 19067 y := l.Args[1] 19068 if !(l.Uses == 1) { 19069 break 19070 } 19071 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 19072 v0.AddArg3(x, y, z) 19073 b.resetWithControl(BlockARMLEnoov, v0) 19074 return true 19075 } 19076 // match: (LE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 19077 // cond: l.Uses==1 19078 // result: (LEnoov (CMPshiftRLreg x y z) yes no) 19079 for b.Controls[0].Op == OpARMCMPconst { 19080 v_0 := b.Controls[0] 19081 if auxIntToInt32(v_0.AuxInt) != 0 { 19082 break 19083 } 19084 l := v_0.Args[0] 19085 if l.Op != OpARMSUBshiftRLreg { 19086 break 19087 } 19088 z := l.Args[2] 19089 x := l.Args[0] 19090 y := l.Args[1] 19091 if !(l.Uses == 1) { 19092 break 19093 } 19094 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 19095 v0.AddArg3(x, y, z) 19096 b.resetWithControl(BlockARMLEnoov, v0) 19097 return true 19098 } 19099 // match: (LE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 19100 // cond: l.Uses==1 19101 // result: (LEnoov (CMPshiftRAreg x y z) yes no) 19102 for b.Controls[0].Op == OpARMCMPconst { 19103 v_0 := b.Controls[0] 19104 if auxIntToInt32(v_0.AuxInt) != 0 { 19105 break 19106 } 19107 l := v_0.Args[0] 19108 if l.Op != OpARMSUBshiftRAreg { 19109 break 19110 } 19111 z := l.Args[2] 19112 x := l.Args[0] 19113 y := l.Args[1] 19114 if !(l.Uses == 1) { 19115 break 19116 } 19117 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 19118 v0.AddArg3(x, y, z) 19119 b.resetWithControl(BlockARMLEnoov, v0) 19120 return true 19121 } 19122 // match: (LE (CMPconst [0] l:(ADD x y)) yes no) 19123 // cond: l.Uses==1 19124 // result: (LEnoov (CMN x y) yes no) 19125 for b.Controls[0].Op == OpARMCMPconst { 19126 v_0 := b.Controls[0] 19127 if auxIntToInt32(v_0.AuxInt) != 0 { 19128 break 19129 } 19130 l := v_0.Args[0] 19131 if l.Op != OpARMADD { 19132 break 19133 } 19134 _ = l.Args[1] 19135 l_0 := l.Args[0] 19136 l_1 := l.Args[1] 19137 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19138 x := l_0 19139 y := l_1 19140 if !(l.Uses == 1) { 19141 continue 19142 } 19143 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 19144 v0.AddArg2(x, y) 19145 b.resetWithControl(BlockARMLEnoov, v0) 19146 return true 19147 } 19148 break 19149 } 19150 // match: (LE (CMPconst [0] l:(MULA x y a)) yes no) 19151 // cond: l.Uses==1 19152 // result: (LEnoov (CMN a (MUL <x.Type> x y)) yes no) 19153 for b.Controls[0].Op == OpARMCMPconst { 19154 v_0 := b.Controls[0] 19155 if auxIntToInt32(v_0.AuxInt) != 0 { 19156 break 19157 } 19158 l := v_0.Args[0] 19159 if l.Op != OpARMMULA { 19160 break 19161 } 19162 a := l.Args[2] 19163 x := l.Args[0] 19164 y := l.Args[1] 19165 if !(l.Uses == 1) { 19166 break 19167 } 19168 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 19169 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 19170 v1.AddArg2(x, y) 19171 v0.AddArg2(a, v1) 19172 b.resetWithControl(BlockARMLEnoov, v0) 19173 return true 19174 } 19175 // match: (LE (CMPconst [0] l:(ADDconst [c] x)) yes no) 19176 // cond: l.Uses==1 19177 // result: (LEnoov (CMNconst [c] x) yes no) 19178 for b.Controls[0].Op == OpARMCMPconst { 19179 v_0 := b.Controls[0] 19180 if auxIntToInt32(v_0.AuxInt) != 0 { 19181 break 19182 } 19183 l := v_0.Args[0] 19184 if l.Op != OpARMADDconst { 19185 break 19186 } 19187 c := auxIntToInt32(l.AuxInt) 19188 x := l.Args[0] 19189 if !(l.Uses == 1) { 19190 break 19191 } 19192 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 19193 v0.AuxInt = int32ToAuxInt(c) 19194 v0.AddArg(x) 19195 b.resetWithControl(BlockARMLEnoov, v0) 19196 return true 19197 } 19198 // match: (LE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 19199 // cond: l.Uses==1 19200 // result: (LEnoov (CMNshiftLL x y [c]) yes no) 19201 for b.Controls[0].Op == OpARMCMPconst { 19202 v_0 := b.Controls[0] 19203 if auxIntToInt32(v_0.AuxInt) != 0 { 19204 break 19205 } 19206 l := v_0.Args[0] 19207 if l.Op != OpARMADDshiftLL { 19208 break 19209 } 19210 c := auxIntToInt32(l.AuxInt) 19211 y := l.Args[1] 19212 x := l.Args[0] 19213 if !(l.Uses == 1) { 19214 break 19215 } 19216 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 19217 v0.AuxInt = int32ToAuxInt(c) 19218 v0.AddArg2(x, y) 19219 b.resetWithControl(BlockARMLEnoov, v0) 19220 return true 19221 } 19222 // match: (LE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 19223 // cond: l.Uses==1 19224 // result: (LEnoov (CMNshiftRL x y [c]) yes no) 19225 for b.Controls[0].Op == OpARMCMPconst { 19226 v_0 := b.Controls[0] 19227 if auxIntToInt32(v_0.AuxInt) != 0 { 19228 break 19229 } 19230 l := v_0.Args[0] 19231 if l.Op != OpARMADDshiftRL { 19232 break 19233 } 19234 c := auxIntToInt32(l.AuxInt) 19235 y := l.Args[1] 19236 x := l.Args[0] 19237 if !(l.Uses == 1) { 19238 break 19239 } 19240 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 19241 v0.AuxInt = int32ToAuxInt(c) 19242 v0.AddArg2(x, y) 19243 b.resetWithControl(BlockARMLEnoov, v0) 19244 return true 19245 } 19246 // match: (LE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 19247 // cond: l.Uses==1 19248 // result: (LEnoov (CMNshiftRA x y [c]) yes no) 19249 for b.Controls[0].Op == OpARMCMPconst { 19250 v_0 := b.Controls[0] 19251 if auxIntToInt32(v_0.AuxInt) != 0 { 19252 break 19253 } 19254 l := v_0.Args[0] 19255 if l.Op != OpARMADDshiftRA { 19256 break 19257 } 19258 c := auxIntToInt32(l.AuxInt) 19259 y := l.Args[1] 19260 x := l.Args[0] 19261 if !(l.Uses == 1) { 19262 break 19263 } 19264 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 19265 v0.AuxInt = int32ToAuxInt(c) 19266 v0.AddArg2(x, y) 19267 b.resetWithControl(BlockARMLEnoov, v0) 19268 return true 19269 } 19270 // match: (LE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 19271 // cond: l.Uses==1 19272 // result: (LEnoov (CMNshiftLLreg x y z) yes no) 19273 for b.Controls[0].Op == OpARMCMPconst { 19274 v_0 := b.Controls[0] 19275 if auxIntToInt32(v_0.AuxInt) != 0 { 19276 break 19277 } 19278 l := v_0.Args[0] 19279 if l.Op != OpARMADDshiftLLreg { 19280 break 19281 } 19282 z := l.Args[2] 19283 x := l.Args[0] 19284 y := l.Args[1] 19285 if !(l.Uses == 1) { 19286 break 19287 } 19288 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 19289 v0.AddArg3(x, y, z) 19290 b.resetWithControl(BlockARMLEnoov, v0) 19291 return true 19292 } 19293 // match: (LE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 19294 // cond: l.Uses==1 19295 // result: (LEnoov (CMNshiftRLreg x y z) yes no) 19296 for b.Controls[0].Op == OpARMCMPconst { 19297 v_0 := b.Controls[0] 19298 if auxIntToInt32(v_0.AuxInt) != 0 { 19299 break 19300 } 19301 l := v_0.Args[0] 19302 if l.Op != OpARMADDshiftRLreg { 19303 break 19304 } 19305 z := l.Args[2] 19306 x := l.Args[0] 19307 y := l.Args[1] 19308 if !(l.Uses == 1) { 19309 break 19310 } 19311 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 19312 v0.AddArg3(x, y, z) 19313 b.resetWithControl(BlockARMLEnoov, v0) 19314 return true 19315 } 19316 // match: (LE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 19317 // cond: l.Uses==1 19318 // result: (LEnoov (CMNshiftRAreg x y z) yes no) 19319 for b.Controls[0].Op == OpARMCMPconst { 19320 v_0 := b.Controls[0] 19321 if auxIntToInt32(v_0.AuxInt) != 0 { 19322 break 19323 } 19324 l := v_0.Args[0] 19325 if l.Op != OpARMADDshiftRAreg { 19326 break 19327 } 19328 z := l.Args[2] 19329 x := l.Args[0] 19330 y := l.Args[1] 19331 if !(l.Uses == 1) { 19332 break 19333 } 19334 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 19335 v0.AddArg3(x, y, z) 19336 b.resetWithControl(BlockARMLEnoov, v0) 19337 return true 19338 } 19339 // match: (LE (CMPconst [0] l:(AND x y)) yes no) 19340 // cond: l.Uses==1 19341 // result: (LEnoov (TST x y) yes no) 19342 for b.Controls[0].Op == OpARMCMPconst { 19343 v_0 := b.Controls[0] 19344 if auxIntToInt32(v_0.AuxInt) != 0 { 19345 break 19346 } 19347 l := v_0.Args[0] 19348 if l.Op != OpARMAND { 19349 break 19350 } 19351 _ = l.Args[1] 19352 l_0 := l.Args[0] 19353 l_1 := l.Args[1] 19354 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19355 x := l_0 19356 y := l_1 19357 if !(l.Uses == 1) { 19358 continue 19359 } 19360 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 19361 v0.AddArg2(x, y) 19362 b.resetWithControl(BlockARMLEnoov, v0) 19363 return true 19364 } 19365 break 19366 } 19367 // match: (LE (CMPconst [0] l:(ANDconst [c] x)) yes no) 19368 // cond: l.Uses==1 19369 // result: (LEnoov (TSTconst [c] x) yes no) 19370 for b.Controls[0].Op == OpARMCMPconst { 19371 v_0 := b.Controls[0] 19372 if auxIntToInt32(v_0.AuxInt) != 0 { 19373 break 19374 } 19375 l := v_0.Args[0] 19376 if l.Op != OpARMANDconst { 19377 break 19378 } 19379 c := auxIntToInt32(l.AuxInt) 19380 x := l.Args[0] 19381 if !(l.Uses == 1) { 19382 break 19383 } 19384 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 19385 v0.AuxInt = int32ToAuxInt(c) 19386 v0.AddArg(x) 19387 b.resetWithControl(BlockARMLEnoov, v0) 19388 return true 19389 } 19390 // match: (LE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 19391 // cond: l.Uses==1 19392 // result: (LEnoov (TSTshiftLL x y [c]) yes no) 19393 for b.Controls[0].Op == OpARMCMPconst { 19394 v_0 := b.Controls[0] 19395 if auxIntToInt32(v_0.AuxInt) != 0 { 19396 break 19397 } 19398 l := v_0.Args[0] 19399 if l.Op != OpARMANDshiftLL { 19400 break 19401 } 19402 c := auxIntToInt32(l.AuxInt) 19403 y := l.Args[1] 19404 x := l.Args[0] 19405 if !(l.Uses == 1) { 19406 break 19407 } 19408 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 19409 v0.AuxInt = int32ToAuxInt(c) 19410 v0.AddArg2(x, y) 19411 b.resetWithControl(BlockARMLEnoov, v0) 19412 return true 19413 } 19414 // match: (LE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 19415 // cond: l.Uses==1 19416 // result: (LEnoov (TSTshiftRL x y [c]) yes no) 19417 for b.Controls[0].Op == OpARMCMPconst { 19418 v_0 := b.Controls[0] 19419 if auxIntToInt32(v_0.AuxInt) != 0 { 19420 break 19421 } 19422 l := v_0.Args[0] 19423 if l.Op != OpARMANDshiftRL { 19424 break 19425 } 19426 c := auxIntToInt32(l.AuxInt) 19427 y := l.Args[1] 19428 x := l.Args[0] 19429 if !(l.Uses == 1) { 19430 break 19431 } 19432 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 19433 v0.AuxInt = int32ToAuxInt(c) 19434 v0.AddArg2(x, y) 19435 b.resetWithControl(BlockARMLEnoov, v0) 19436 return true 19437 } 19438 // match: (LE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 19439 // cond: l.Uses==1 19440 // result: (LEnoov (TSTshiftRA x y [c]) yes no) 19441 for b.Controls[0].Op == OpARMCMPconst { 19442 v_0 := b.Controls[0] 19443 if auxIntToInt32(v_0.AuxInt) != 0 { 19444 break 19445 } 19446 l := v_0.Args[0] 19447 if l.Op != OpARMANDshiftRA { 19448 break 19449 } 19450 c := auxIntToInt32(l.AuxInt) 19451 y := l.Args[1] 19452 x := l.Args[0] 19453 if !(l.Uses == 1) { 19454 break 19455 } 19456 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 19457 v0.AuxInt = int32ToAuxInt(c) 19458 v0.AddArg2(x, y) 19459 b.resetWithControl(BlockARMLEnoov, v0) 19460 return true 19461 } 19462 // match: (LE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 19463 // cond: l.Uses==1 19464 // result: (LEnoov (TSTshiftLLreg x y z) yes no) 19465 for b.Controls[0].Op == OpARMCMPconst { 19466 v_0 := b.Controls[0] 19467 if auxIntToInt32(v_0.AuxInt) != 0 { 19468 break 19469 } 19470 l := v_0.Args[0] 19471 if l.Op != OpARMANDshiftLLreg { 19472 break 19473 } 19474 z := l.Args[2] 19475 x := l.Args[0] 19476 y := l.Args[1] 19477 if !(l.Uses == 1) { 19478 break 19479 } 19480 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 19481 v0.AddArg3(x, y, z) 19482 b.resetWithControl(BlockARMLEnoov, v0) 19483 return true 19484 } 19485 // match: (LE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 19486 // cond: l.Uses==1 19487 // result: (LEnoov (TSTshiftRLreg x y z) yes no) 19488 for b.Controls[0].Op == OpARMCMPconst { 19489 v_0 := b.Controls[0] 19490 if auxIntToInt32(v_0.AuxInt) != 0 { 19491 break 19492 } 19493 l := v_0.Args[0] 19494 if l.Op != OpARMANDshiftRLreg { 19495 break 19496 } 19497 z := l.Args[2] 19498 x := l.Args[0] 19499 y := l.Args[1] 19500 if !(l.Uses == 1) { 19501 break 19502 } 19503 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 19504 v0.AddArg3(x, y, z) 19505 b.resetWithControl(BlockARMLEnoov, v0) 19506 return true 19507 } 19508 // match: (LE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 19509 // cond: l.Uses==1 19510 // result: (LEnoov (TSTshiftRAreg x y z) yes no) 19511 for b.Controls[0].Op == OpARMCMPconst { 19512 v_0 := b.Controls[0] 19513 if auxIntToInt32(v_0.AuxInt) != 0 { 19514 break 19515 } 19516 l := v_0.Args[0] 19517 if l.Op != OpARMANDshiftRAreg { 19518 break 19519 } 19520 z := l.Args[2] 19521 x := l.Args[0] 19522 y := l.Args[1] 19523 if !(l.Uses == 1) { 19524 break 19525 } 19526 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 19527 v0.AddArg3(x, y, z) 19528 b.resetWithControl(BlockARMLEnoov, v0) 19529 return true 19530 } 19531 // match: (LE (CMPconst [0] l:(XOR x y)) yes no) 19532 // cond: l.Uses==1 19533 // result: (LEnoov (TEQ x y) yes no) 19534 for b.Controls[0].Op == OpARMCMPconst { 19535 v_0 := b.Controls[0] 19536 if auxIntToInt32(v_0.AuxInt) != 0 { 19537 break 19538 } 19539 l := v_0.Args[0] 19540 if l.Op != OpARMXOR { 19541 break 19542 } 19543 _ = l.Args[1] 19544 l_0 := l.Args[0] 19545 l_1 := l.Args[1] 19546 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19547 x := l_0 19548 y := l_1 19549 if !(l.Uses == 1) { 19550 continue 19551 } 19552 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 19553 v0.AddArg2(x, y) 19554 b.resetWithControl(BlockARMLEnoov, v0) 19555 return true 19556 } 19557 break 19558 } 19559 // match: (LE (CMPconst [0] l:(XORconst [c] x)) yes no) 19560 // cond: l.Uses==1 19561 // result: (LEnoov (TEQconst [c] x) yes no) 19562 for b.Controls[0].Op == OpARMCMPconst { 19563 v_0 := b.Controls[0] 19564 if auxIntToInt32(v_0.AuxInt) != 0 { 19565 break 19566 } 19567 l := v_0.Args[0] 19568 if l.Op != OpARMXORconst { 19569 break 19570 } 19571 c := auxIntToInt32(l.AuxInt) 19572 x := l.Args[0] 19573 if !(l.Uses == 1) { 19574 break 19575 } 19576 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 19577 v0.AuxInt = int32ToAuxInt(c) 19578 v0.AddArg(x) 19579 b.resetWithControl(BlockARMLEnoov, v0) 19580 return true 19581 } 19582 // match: (LE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 19583 // cond: l.Uses==1 19584 // result: (LEnoov (TEQshiftLL x y [c]) yes no) 19585 for b.Controls[0].Op == OpARMCMPconst { 19586 v_0 := b.Controls[0] 19587 if auxIntToInt32(v_0.AuxInt) != 0 { 19588 break 19589 } 19590 l := v_0.Args[0] 19591 if l.Op != OpARMXORshiftLL { 19592 break 19593 } 19594 c := auxIntToInt32(l.AuxInt) 19595 y := l.Args[1] 19596 x := l.Args[0] 19597 if !(l.Uses == 1) { 19598 break 19599 } 19600 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 19601 v0.AuxInt = int32ToAuxInt(c) 19602 v0.AddArg2(x, y) 19603 b.resetWithControl(BlockARMLEnoov, v0) 19604 return true 19605 } 19606 // match: (LE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 19607 // cond: l.Uses==1 19608 // result: (LEnoov (TEQshiftRL x y [c]) yes no) 19609 for b.Controls[0].Op == OpARMCMPconst { 19610 v_0 := b.Controls[0] 19611 if auxIntToInt32(v_0.AuxInt) != 0 { 19612 break 19613 } 19614 l := v_0.Args[0] 19615 if l.Op != OpARMXORshiftRL { 19616 break 19617 } 19618 c := auxIntToInt32(l.AuxInt) 19619 y := l.Args[1] 19620 x := l.Args[0] 19621 if !(l.Uses == 1) { 19622 break 19623 } 19624 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 19625 v0.AuxInt = int32ToAuxInt(c) 19626 v0.AddArg2(x, y) 19627 b.resetWithControl(BlockARMLEnoov, v0) 19628 return true 19629 } 19630 // match: (LE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 19631 // cond: l.Uses==1 19632 // result: (LEnoov (TEQshiftRA x y [c]) yes no) 19633 for b.Controls[0].Op == OpARMCMPconst { 19634 v_0 := b.Controls[0] 19635 if auxIntToInt32(v_0.AuxInt) != 0 { 19636 break 19637 } 19638 l := v_0.Args[0] 19639 if l.Op != OpARMXORshiftRA { 19640 break 19641 } 19642 c := auxIntToInt32(l.AuxInt) 19643 y := l.Args[1] 19644 x := l.Args[0] 19645 if !(l.Uses == 1) { 19646 break 19647 } 19648 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 19649 v0.AuxInt = int32ToAuxInt(c) 19650 v0.AddArg2(x, y) 19651 b.resetWithControl(BlockARMLEnoov, v0) 19652 return true 19653 } 19654 // match: (LE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 19655 // cond: l.Uses==1 19656 // result: (LEnoov (TEQshiftLLreg x y z) yes no) 19657 for b.Controls[0].Op == OpARMCMPconst { 19658 v_0 := b.Controls[0] 19659 if auxIntToInt32(v_0.AuxInt) != 0 { 19660 break 19661 } 19662 l := v_0.Args[0] 19663 if l.Op != OpARMXORshiftLLreg { 19664 break 19665 } 19666 z := l.Args[2] 19667 x := l.Args[0] 19668 y := l.Args[1] 19669 if !(l.Uses == 1) { 19670 break 19671 } 19672 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 19673 v0.AddArg3(x, y, z) 19674 b.resetWithControl(BlockARMLEnoov, v0) 19675 return true 19676 } 19677 // match: (LE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 19678 // cond: l.Uses==1 19679 // result: (LEnoov (TEQshiftRLreg x y z) yes no) 19680 for b.Controls[0].Op == OpARMCMPconst { 19681 v_0 := b.Controls[0] 19682 if auxIntToInt32(v_0.AuxInt) != 0 { 19683 break 19684 } 19685 l := v_0.Args[0] 19686 if l.Op != OpARMXORshiftRLreg { 19687 break 19688 } 19689 z := l.Args[2] 19690 x := l.Args[0] 19691 y := l.Args[1] 19692 if !(l.Uses == 1) { 19693 break 19694 } 19695 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 19696 v0.AddArg3(x, y, z) 19697 b.resetWithControl(BlockARMLEnoov, v0) 19698 return true 19699 } 19700 // match: (LE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 19701 // cond: l.Uses==1 19702 // result: (LEnoov (TEQshiftRAreg x y z) yes no) 19703 for b.Controls[0].Op == OpARMCMPconst { 19704 v_0 := b.Controls[0] 19705 if auxIntToInt32(v_0.AuxInt) != 0 { 19706 break 19707 } 19708 l := v_0.Args[0] 19709 if l.Op != OpARMXORshiftRAreg { 19710 break 19711 } 19712 z := l.Args[2] 19713 x := l.Args[0] 19714 y := l.Args[1] 19715 if !(l.Uses == 1) { 19716 break 19717 } 19718 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 19719 v0.AddArg3(x, y, z) 19720 b.resetWithControl(BlockARMLEnoov, v0) 19721 return true 19722 } 19723 case BlockARMLEnoov: 19724 // match: (LEnoov (FlagConstant [fc]) yes no) 19725 // cond: fc.leNoov() 19726 // result: (First yes no) 19727 for b.Controls[0].Op == OpARMFlagConstant { 19728 v_0 := b.Controls[0] 19729 fc := auxIntToFlagConstant(v_0.AuxInt) 19730 if !(fc.leNoov()) { 19731 break 19732 } 19733 b.Reset(BlockFirst) 19734 return true 19735 } 19736 // match: (LEnoov (FlagConstant [fc]) yes no) 19737 // cond: !fc.leNoov() 19738 // result: (First no yes) 19739 for b.Controls[0].Op == OpARMFlagConstant { 19740 v_0 := b.Controls[0] 19741 fc := auxIntToFlagConstant(v_0.AuxInt) 19742 if !(!fc.leNoov()) { 19743 break 19744 } 19745 b.Reset(BlockFirst) 19746 b.swapSuccessors() 19747 return true 19748 } 19749 // match: (LEnoov (InvertFlags cmp) yes no) 19750 // result: (GEnoov cmp yes no) 19751 for b.Controls[0].Op == OpARMInvertFlags { 19752 v_0 := b.Controls[0] 19753 cmp := v_0.Args[0] 19754 b.resetWithControl(BlockARMGEnoov, cmp) 19755 return true 19756 } 19757 case BlockARMLT: 19758 // match: (LT (FlagConstant [fc]) yes no) 19759 // cond: fc.lt() 19760 // result: (First yes no) 19761 for b.Controls[0].Op == OpARMFlagConstant { 19762 v_0 := b.Controls[0] 19763 fc := auxIntToFlagConstant(v_0.AuxInt) 19764 if !(fc.lt()) { 19765 break 19766 } 19767 b.Reset(BlockFirst) 19768 return true 19769 } 19770 // match: (LT (FlagConstant [fc]) yes no) 19771 // cond: !fc.lt() 19772 // result: (First no yes) 19773 for b.Controls[0].Op == OpARMFlagConstant { 19774 v_0 := b.Controls[0] 19775 fc := auxIntToFlagConstant(v_0.AuxInt) 19776 if !(!fc.lt()) { 19777 break 19778 } 19779 b.Reset(BlockFirst) 19780 b.swapSuccessors() 19781 return true 19782 } 19783 // match: (LT (InvertFlags cmp) yes no) 19784 // result: (GT cmp yes no) 19785 for b.Controls[0].Op == OpARMInvertFlags { 19786 v_0 := b.Controls[0] 19787 cmp := v_0.Args[0] 19788 b.resetWithControl(BlockARMGT, cmp) 19789 return true 19790 } 19791 // match: (LT (CMPconst [0] l:(SUB x y)) yes no) 19792 // cond: l.Uses==1 19793 // result: (LTnoov (CMP x y) yes no) 19794 for b.Controls[0].Op == OpARMCMPconst { 19795 v_0 := b.Controls[0] 19796 if auxIntToInt32(v_0.AuxInt) != 0 { 19797 break 19798 } 19799 l := v_0.Args[0] 19800 if l.Op != OpARMSUB { 19801 break 19802 } 19803 y := l.Args[1] 19804 x := l.Args[0] 19805 if !(l.Uses == 1) { 19806 break 19807 } 19808 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 19809 v0.AddArg2(x, y) 19810 b.resetWithControl(BlockARMLTnoov, v0) 19811 return true 19812 } 19813 // match: (LT (CMPconst [0] l:(MULS x y a)) yes no) 19814 // cond: l.Uses==1 19815 // result: (LTnoov (CMP a (MUL <x.Type> x y)) yes no) 19816 for b.Controls[0].Op == OpARMCMPconst { 19817 v_0 := b.Controls[0] 19818 if auxIntToInt32(v_0.AuxInt) != 0 { 19819 break 19820 } 19821 l := v_0.Args[0] 19822 if l.Op != OpARMMULS { 19823 break 19824 } 19825 a := l.Args[2] 19826 x := l.Args[0] 19827 y := l.Args[1] 19828 if !(l.Uses == 1) { 19829 break 19830 } 19831 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 19832 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 19833 v1.AddArg2(x, y) 19834 v0.AddArg2(a, v1) 19835 b.resetWithControl(BlockARMLTnoov, v0) 19836 return true 19837 } 19838 // match: (LT (CMPconst [0] l:(SUBconst [c] x)) yes no) 19839 // cond: l.Uses==1 19840 // result: (LTnoov (CMPconst [c] x) yes no) 19841 for b.Controls[0].Op == OpARMCMPconst { 19842 v_0 := b.Controls[0] 19843 if auxIntToInt32(v_0.AuxInt) != 0 { 19844 break 19845 } 19846 l := v_0.Args[0] 19847 if l.Op != OpARMSUBconst { 19848 break 19849 } 19850 c := auxIntToInt32(l.AuxInt) 19851 x := l.Args[0] 19852 if !(l.Uses == 1) { 19853 break 19854 } 19855 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 19856 v0.AuxInt = int32ToAuxInt(c) 19857 v0.AddArg(x) 19858 b.resetWithControl(BlockARMLTnoov, v0) 19859 return true 19860 } 19861 // match: (LT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 19862 // cond: l.Uses==1 19863 // result: (LTnoov (CMPshiftLL x y [c]) yes no) 19864 for b.Controls[0].Op == OpARMCMPconst { 19865 v_0 := b.Controls[0] 19866 if auxIntToInt32(v_0.AuxInt) != 0 { 19867 break 19868 } 19869 l := v_0.Args[0] 19870 if l.Op != OpARMSUBshiftLL { 19871 break 19872 } 19873 c := auxIntToInt32(l.AuxInt) 19874 y := l.Args[1] 19875 x := l.Args[0] 19876 if !(l.Uses == 1) { 19877 break 19878 } 19879 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 19880 v0.AuxInt = int32ToAuxInt(c) 19881 v0.AddArg2(x, y) 19882 b.resetWithControl(BlockARMLTnoov, v0) 19883 return true 19884 } 19885 // match: (LT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 19886 // cond: l.Uses==1 19887 // result: (LTnoov (CMPshiftRL x y [c]) yes no) 19888 for b.Controls[0].Op == OpARMCMPconst { 19889 v_0 := b.Controls[0] 19890 if auxIntToInt32(v_0.AuxInt) != 0 { 19891 break 19892 } 19893 l := v_0.Args[0] 19894 if l.Op != OpARMSUBshiftRL { 19895 break 19896 } 19897 c := auxIntToInt32(l.AuxInt) 19898 y := l.Args[1] 19899 x := l.Args[0] 19900 if !(l.Uses == 1) { 19901 break 19902 } 19903 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 19904 v0.AuxInt = int32ToAuxInt(c) 19905 v0.AddArg2(x, y) 19906 b.resetWithControl(BlockARMLTnoov, v0) 19907 return true 19908 } 19909 // match: (LT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 19910 // cond: l.Uses==1 19911 // result: (LTnoov (CMPshiftRA x y [c]) yes no) 19912 for b.Controls[0].Op == OpARMCMPconst { 19913 v_0 := b.Controls[0] 19914 if auxIntToInt32(v_0.AuxInt) != 0 { 19915 break 19916 } 19917 l := v_0.Args[0] 19918 if l.Op != OpARMSUBshiftRA { 19919 break 19920 } 19921 c := auxIntToInt32(l.AuxInt) 19922 y := l.Args[1] 19923 x := l.Args[0] 19924 if !(l.Uses == 1) { 19925 break 19926 } 19927 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 19928 v0.AuxInt = int32ToAuxInt(c) 19929 v0.AddArg2(x, y) 19930 b.resetWithControl(BlockARMLTnoov, v0) 19931 return true 19932 } 19933 // match: (LT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 19934 // cond: l.Uses==1 19935 // result: (LTnoov (CMPshiftLLreg x y z) yes no) 19936 for b.Controls[0].Op == OpARMCMPconst { 19937 v_0 := b.Controls[0] 19938 if auxIntToInt32(v_0.AuxInt) != 0 { 19939 break 19940 } 19941 l := v_0.Args[0] 19942 if l.Op != OpARMSUBshiftLLreg { 19943 break 19944 } 19945 z := l.Args[2] 19946 x := l.Args[0] 19947 y := l.Args[1] 19948 if !(l.Uses == 1) { 19949 break 19950 } 19951 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 19952 v0.AddArg3(x, y, z) 19953 b.resetWithControl(BlockARMLTnoov, v0) 19954 return true 19955 } 19956 // match: (LT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 19957 // cond: l.Uses==1 19958 // result: (LTnoov (CMPshiftRLreg x y z) yes no) 19959 for b.Controls[0].Op == OpARMCMPconst { 19960 v_0 := b.Controls[0] 19961 if auxIntToInt32(v_0.AuxInt) != 0 { 19962 break 19963 } 19964 l := v_0.Args[0] 19965 if l.Op != OpARMSUBshiftRLreg { 19966 break 19967 } 19968 z := l.Args[2] 19969 x := l.Args[0] 19970 y := l.Args[1] 19971 if !(l.Uses == 1) { 19972 break 19973 } 19974 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 19975 v0.AddArg3(x, y, z) 19976 b.resetWithControl(BlockARMLTnoov, v0) 19977 return true 19978 } 19979 // match: (LT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 19980 // cond: l.Uses==1 19981 // result: (LTnoov (CMPshiftRAreg x y z) yes no) 19982 for b.Controls[0].Op == OpARMCMPconst { 19983 v_0 := b.Controls[0] 19984 if auxIntToInt32(v_0.AuxInt) != 0 { 19985 break 19986 } 19987 l := v_0.Args[0] 19988 if l.Op != OpARMSUBshiftRAreg { 19989 break 19990 } 19991 z := l.Args[2] 19992 x := l.Args[0] 19993 y := l.Args[1] 19994 if !(l.Uses == 1) { 19995 break 19996 } 19997 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 19998 v0.AddArg3(x, y, z) 19999 b.resetWithControl(BlockARMLTnoov, v0) 20000 return true 20001 } 20002 // match: (LT (CMPconst [0] l:(ADD x y)) yes no) 20003 // cond: l.Uses==1 20004 // result: (LTnoov (CMN x y) yes no) 20005 for b.Controls[0].Op == OpARMCMPconst { 20006 v_0 := b.Controls[0] 20007 if auxIntToInt32(v_0.AuxInt) != 0 { 20008 break 20009 } 20010 l := v_0.Args[0] 20011 if l.Op != OpARMADD { 20012 break 20013 } 20014 _ = l.Args[1] 20015 l_0 := l.Args[0] 20016 l_1 := l.Args[1] 20017 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20018 x := l_0 20019 y := l_1 20020 if !(l.Uses == 1) { 20021 continue 20022 } 20023 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20024 v0.AddArg2(x, y) 20025 b.resetWithControl(BlockARMLTnoov, v0) 20026 return true 20027 } 20028 break 20029 } 20030 // match: (LT (CMPconst [0] l:(MULA x y a)) yes no) 20031 // cond: l.Uses==1 20032 // result: (LTnoov (CMN a (MUL <x.Type> x y)) yes no) 20033 for b.Controls[0].Op == OpARMCMPconst { 20034 v_0 := b.Controls[0] 20035 if auxIntToInt32(v_0.AuxInt) != 0 { 20036 break 20037 } 20038 l := v_0.Args[0] 20039 if l.Op != OpARMMULA { 20040 break 20041 } 20042 a := l.Args[2] 20043 x := l.Args[0] 20044 y := l.Args[1] 20045 if !(l.Uses == 1) { 20046 break 20047 } 20048 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20049 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 20050 v1.AddArg2(x, y) 20051 v0.AddArg2(a, v1) 20052 b.resetWithControl(BlockARMLTnoov, v0) 20053 return true 20054 } 20055 // match: (LT (CMPconst [0] l:(ADDconst [c] x)) yes no) 20056 // cond: l.Uses==1 20057 // result: (LTnoov (CMNconst [c] x) yes no) 20058 for b.Controls[0].Op == OpARMCMPconst { 20059 v_0 := b.Controls[0] 20060 if auxIntToInt32(v_0.AuxInt) != 0 { 20061 break 20062 } 20063 l := v_0.Args[0] 20064 if l.Op != OpARMADDconst { 20065 break 20066 } 20067 c := auxIntToInt32(l.AuxInt) 20068 x := l.Args[0] 20069 if !(l.Uses == 1) { 20070 break 20071 } 20072 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 20073 v0.AuxInt = int32ToAuxInt(c) 20074 v0.AddArg(x) 20075 b.resetWithControl(BlockARMLTnoov, v0) 20076 return true 20077 } 20078 // match: (LT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 20079 // cond: l.Uses==1 20080 // result: (LTnoov (CMNshiftLL x y [c]) yes no) 20081 for b.Controls[0].Op == OpARMCMPconst { 20082 v_0 := b.Controls[0] 20083 if auxIntToInt32(v_0.AuxInt) != 0 { 20084 break 20085 } 20086 l := v_0.Args[0] 20087 if l.Op != OpARMADDshiftLL { 20088 break 20089 } 20090 c := auxIntToInt32(l.AuxInt) 20091 y := l.Args[1] 20092 x := l.Args[0] 20093 if !(l.Uses == 1) { 20094 break 20095 } 20096 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 20097 v0.AuxInt = int32ToAuxInt(c) 20098 v0.AddArg2(x, y) 20099 b.resetWithControl(BlockARMLTnoov, v0) 20100 return true 20101 } 20102 // match: (LT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 20103 // cond: l.Uses==1 20104 // result: (LTnoov (CMNshiftRL x y [c]) yes no) 20105 for b.Controls[0].Op == OpARMCMPconst { 20106 v_0 := b.Controls[0] 20107 if auxIntToInt32(v_0.AuxInt) != 0 { 20108 break 20109 } 20110 l := v_0.Args[0] 20111 if l.Op != OpARMADDshiftRL { 20112 break 20113 } 20114 c := auxIntToInt32(l.AuxInt) 20115 y := l.Args[1] 20116 x := l.Args[0] 20117 if !(l.Uses == 1) { 20118 break 20119 } 20120 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 20121 v0.AuxInt = int32ToAuxInt(c) 20122 v0.AddArg2(x, y) 20123 b.resetWithControl(BlockARMLTnoov, v0) 20124 return true 20125 } 20126 // match: (LT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 20127 // cond: l.Uses==1 20128 // result: (LTnoov (CMNshiftRA x y [c]) yes no) 20129 for b.Controls[0].Op == OpARMCMPconst { 20130 v_0 := b.Controls[0] 20131 if auxIntToInt32(v_0.AuxInt) != 0 { 20132 break 20133 } 20134 l := v_0.Args[0] 20135 if l.Op != OpARMADDshiftRA { 20136 break 20137 } 20138 c := auxIntToInt32(l.AuxInt) 20139 y := l.Args[1] 20140 x := l.Args[0] 20141 if !(l.Uses == 1) { 20142 break 20143 } 20144 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 20145 v0.AuxInt = int32ToAuxInt(c) 20146 v0.AddArg2(x, y) 20147 b.resetWithControl(BlockARMLTnoov, v0) 20148 return true 20149 } 20150 // match: (LT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 20151 // cond: l.Uses==1 20152 // result: (LTnoov (CMNshiftLLreg x y z) yes no) 20153 for b.Controls[0].Op == OpARMCMPconst { 20154 v_0 := b.Controls[0] 20155 if auxIntToInt32(v_0.AuxInt) != 0 { 20156 break 20157 } 20158 l := v_0.Args[0] 20159 if l.Op != OpARMADDshiftLLreg { 20160 break 20161 } 20162 z := l.Args[2] 20163 x := l.Args[0] 20164 y := l.Args[1] 20165 if !(l.Uses == 1) { 20166 break 20167 } 20168 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 20169 v0.AddArg3(x, y, z) 20170 b.resetWithControl(BlockARMLTnoov, v0) 20171 return true 20172 } 20173 // match: (LT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 20174 // cond: l.Uses==1 20175 // result: (LTnoov (CMNshiftRLreg x y z) yes no) 20176 for b.Controls[0].Op == OpARMCMPconst { 20177 v_0 := b.Controls[0] 20178 if auxIntToInt32(v_0.AuxInt) != 0 { 20179 break 20180 } 20181 l := v_0.Args[0] 20182 if l.Op != OpARMADDshiftRLreg { 20183 break 20184 } 20185 z := l.Args[2] 20186 x := l.Args[0] 20187 y := l.Args[1] 20188 if !(l.Uses == 1) { 20189 break 20190 } 20191 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 20192 v0.AddArg3(x, y, z) 20193 b.resetWithControl(BlockARMLTnoov, v0) 20194 return true 20195 } 20196 // match: (LT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 20197 // cond: l.Uses==1 20198 // result: (LTnoov (CMNshiftRAreg x y z) yes no) 20199 for b.Controls[0].Op == OpARMCMPconst { 20200 v_0 := b.Controls[0] 20201 if auxIntToInt32(v_0.AuxInt) != 0 { 20202 break 20203 } 20204 l := v_0.Args[0] 20205 if l.Op != OpARMADDshiftRAreg { 20206 break 20207 } 20208 z := l.Args[2] 20209 x := l.Args[0] 20210 y := l.Args[1] 20211 if !(l.Uses == 1) { 20212 break 20213 } 20214 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 20215 v0.AddArg3(x, y, z) 20216 b.resetWithControl(BlockARMLTnoov, v0) 20217 return true 20218 } 20219 // match: (LT (CMPconst [0] l:(AND x y)) yes no) 20220 // cond: l.Uses==1 20221 // result: (LTnoov (TST x y) yes no) 20222 for b.Controls[0].Op == OpARMCMPconst { 20223 v_0 := b.Controls[0] 20224 if auxIntToInt32(v_0.AuxInt) != 0 { 20225 break 20226 } 20227 l := v_0.Args[0] 20228 if l.Op != OpARMAND { 20229 break 20230 } 20231 _ = l.Args[1] 20232 l_0 := l.Args[0] 20233 l_1 := l.Args[1] 20234 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20235 x := l_0 20236 y := l_1 20237 if !(l.Uses == 1) { 20238 continue 20239 } 20240 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 20241 v0.AddArg2(x, y) 20242 b.resetWithControl(BlockARMLTnoov, v0) 20243 return true 20244 } 20245 break 20246 } 20247 // match: (LT (CMPconst [0] l:(ANDconst [c] x)) yes no) 20248 // cond: l.Uses==1 20249 // result: (LTnoov (TSTconst [c] x) yes no) 20250 for b.Controls[0].Op == OpARMCMPconst { 20251 v_0 := b.Controls[0] 20252 if auxIntToInt32(v_0.AuxInt) != 0 { 20253 break 20254 } 20255 l := v_0.Args[0] 20256 if l.Op != OpARMANDconst { 20257 break 20258 } 20259 c := auxIntToInt32(l.AuxInt) 20260 x := l.Args[0] 20261 if !(l.Uses == 1) { 20262 break 20263 } 20264 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 20265 v0.AuxInt = int32ToAuxInt(c) 20266 v0.AddArg(x) 20267 b.resetWithControl(BlockARMLTnoov, v0) 20268 return true 20269 } 20270 // match: (LT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 20271 // cond: l.Uses==1 20272 // result: (LTnoov (TSTshiftLL x y [c]) yes no) 20273 for b.Controls[0].Op == OpARMCMPconst { 20274 v_0 := b.Controls[0] 20275 if auxIntToInt32(v_0.AuxInt) != 0 { 20276 break 20277 } 20278 l := v_0.Args[0] 20279 if l.Op != OpARMANDshiftLL { 20280 break 20281 } 20282 c := auxIntToInt32(l.AuxInt) 20283 y := l.Args[1] 20284 x := l.Args[0] 20285 if !(l.Uses == 1) { 20286 break 20287 } 20288 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 20289 v0.AuxInt = int32ToAuxInt(c) 20290 v0.AddArg2(x, y) 20291 b.resetWithControl(BlockARMLTnoov, v0) 20292 return true 20293 } 20294 // match: (LT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 20295 // cond: l.Uses==1 20296 // result: (LTnoov (TSTshiftRL x y [c]) yes no) 20297 for b.Controls[0].Op == OpARMCMPconst { 20298 v_0 := b.Controls[0] 20299 if auxIntToInt32(v_0.AuxInt) != 0 { 20300 break 20301 } 20302 l := v_0.Args[0] 20303 if l.Op != OpARMANDshiftRL { 20304 break 20305 } 20306 c := auxIntToInt32(l.AuxInt) 20307 y := l.Args[1] 20308 x := l.Args[0] 20309 if !(l.Uses == 1) { 20310 break 20311 } 20312 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 20313 v0.AuxInt = int32ToAuxInt(c) 20314 v0.AddArg2(x, y) 20315 b.resetWithControl(BlockARMLTnoov, v0) 20316 return true 20317 } 20318 // match: (LT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 20319 // cond: l.Uses==1 20320 // result: (LTnoov (TSTshiftRA x y [c]) yes no) 20321 for b.Controls[0].Op == OpARMCMPconst { 20322 v_0 := b.Controls[0] 20323 if auxIntToInt32(v_0.AuxInt) != 0 { 20324 break 20325 } 20326 l := v_0.Args[0] 20327 if l.Op != OpARMANDshiftRA { 20328 break 20329 } 20330 c := auxIntToInt32(l.AuxInt) 20331 y := l.Args[1] 20332 x := l.Args[0] 20333 if !(l.Uses == 1) { 20334 break 20335 } 20336 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 20337 v0.AuxInt = int32ToAuxInt(c) 20338 v0.AddArg2(x, y) 20339 b.resetWithControl(BlockARMLTnoov, v0) 20340 return true 20341 } 20342 // match: (LT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 20343 // cond: l.Uses==1 20344 // result: (LTnoov (TSTshiftLLreg x y z) yes no) 20345 for b.Controls[0].Op == OpARMCMPconst { 20346 v_0 := b.Controls[0] 20347 if auxIntToInt32(v_0.AuxInt) != 0 { 20348 break 20349 } 20350 l := v_0.Args[0] 20351 if l.Op != OpARMANDshiftLLreg { 20352 break 20353 } 20354 z := l.Args[2] 20355 x := l.Args[0] 20356 y := l.Args[1] 20357 if !(l.Uses == 1) { 20358 break 20359 } 20360 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 20361 v0.AddArg3(x, y, z) 20362 b.resetWithControl(BlockARMLTnoov, v0) 20363 return true 20364 } 20365 // match: (LT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 20366 // cond: l.Uses==1 20367 // result: (LTnoov (TSTshiftRLreg x y z) yes no) 20368 for b.Controls[0].Op == OpARMCMPconst { 20369 v_0 := b.Controls[0] 20370 if auxIntToInt32(v_0.AuxInt) != 0 { 20371 break 20372 } 20373 l := v_0.Args[0] 20374 if l.Op != OpARMANDshiftRLreg { 20375 break 20376 } 20377 z := l.Args[2] 20378 x := l.Args[0] 20379 y := l.Args[1] 20380 if !(l.Uses == 1) { 20381 break 20382 } 20383 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 20384 v0.AddArg3(x, y, z) 20385 b.resetWithControl(BlockARMLTnoov, v0) 20386 return true 20387 } 20388 // match: (LT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 20389 // cond: l.Uses==1 20390 // result: (LTnoov (TSTshiftRAreg x y z) yes no) 20391 for b.Controls[0].Op == OpARMCMPconst { 20392 v_0 := b.Controls[0] 20393 if auxIntToInt32(v_0.AuxInt) != 0 { 20394 break 20395 } 20396 l := v_0.Args[0] 20397 if l.Op != OpARMANDshiftRAreg { 20398 break 20399 } 20400 z := l.Args[2] 20401 x := l.Args[0] 20402 y := l.Args[1] 20403 if !(l.Uses == 1) { 20404 break 20405 } 20406 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 20407 v0.AddArg3(x, y, z) 20408 b.resetWithControl(BlockARMLTnoov, v0) 20409 return true 20410 } 20411 // match: (LT (CMPconst [0] l:(XOR x y)) yes no) 20412 // cond: l.Uses==1 20413 // result: (LTnoov (TEQ x y) yes no) 20414 for b.Controls[0].Op == OpARMCMPconst { 20415 v_0 := b.Controls[0] 20416 if auxIntToInt32(v_0.AuxInt) != 0 { 20417 break 20418 } 20419 l := v_0.Args[0] 20420 if l.Op != OpARMXOR { 20421 break 20422 } 20423 _ = l.Args[1] 20424 l_0 := l.Args[0] 20425 l_1 := l.Args[1] 20426 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20427 x := l_0 20428 y := l_1 20429 if !(l.Uses == 1) { 20430 continue 20431 } 20432 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 20433 v0.AddArg2(x, y) 20434 b.resetWithControl(BlockARMLTnoov, v0) 20435 return true 20436 } 20437 break 20438 } 20439 // match: (LT (CMPconst [0] l:(XORconst [c] x)) yes no) 20440 // cond: l.Uses==1 20441 // result: (LTnoov (TEQconst [c] x) yes no) 20442 for b.Controls[0].Op == OpARMCMPconst { 20443 v_0 := b.Controls[0] 20444 if auxIntToInt32(v_0.AuxInt) != 0 { 20445 break 20446 } 20447 l := v_0.Args[0] 20448 if l.Op != OpARMXORconst { 20449 break 20450 } 20451 c := auxIntToInt32(l.AuxInt) 20452 x := l.Args[0] 20453 if !(l.Uses == 1) { 20454 break 20455 } 20456 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 20457 v0.AuxInt = int32ToAuxInt(c) 20458 v0.AddArg(x) 20459 b.resetWithControl(BlockARMLTnoov, v0) 20460 return true 20461 } 20462 // match: (LT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 20463 // cond: l.Uses==1 20464 // result: (LTnoov (TEQshiftLL x y [c]) yes no) 20465 for b.Controls[0].Op == OpARMCMPconst { 20466 v_0 := b.Controls[0] 20467 if auxIntToInt32(v_0.AuxInt) != 0 { 20468 break 20469 } 20470 l := v_0.Args[0] 20471 if l.Op != OpARMXORshiftLL { 20472 break 20473 } 20474 c := auxIntToInt32(l.AuxInt) 20475 y := l.Args[1] 20476 x := l.Args[0] 20477 if !(l.Uses == 1) { 20478 break 20479 } 20480 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 20481 v0.AuxInt = int32ToAuxInt(c) 20482 v0.AddArg2(x, y) 20483 b.resetWithControl(BlockARMLTnoov, v0) 20484 return true 20485 } 20486 // match: (LT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 20487 // cond: l.Uses==1 20488 // result: (LTnoov (TEQshiftRL x y [c]) yes no) 20489 for b.Controls[0].Op == OpARMCMPconst { 20490 v_0 := b.Controls[0] 20491 if auxIntToInt32(v_0.AuxInt) != 0 { 20492 break 20493 } 20494 l := v_0.Args[0] 20495 if l.Op != OpARMXORshiftRL { 20496 break 20497 } 20498 c := auxIntToInt32(l.AuxInt) 20499 y := l.Args[1] 20500 x := l.Args[0] 20501 if !(l.Uses == 1) { 20502 break 20503 } 20504 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 20505 v0.AuxInt = int32ToAuxInt(c) 20506 v0.AddArg2(x, y) 20507 b.resetWithControl(BlockARMLTnoov, v0) 20508 return true 20509 } 20510 // match: (LT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 20511 // cond: l.Uses==1 20512 // result: (LTnoov (TEQshiftRA x y [c]) yes no) 20513 for b.Controls[0].Op == OpARMCMPconst { 20514 v_0 := b.Controls[0] 20515 if auxIntToInt32(v_0.AuxInt) != 0 { 20516 break 20517 } 20518 l := v_0.Args[0] 20519 if l.Op != OpARMXORshiftRA { 20520 break 20521 } 20522 c := auxIntToInt32(l.AuxInt) 20523 y := l.Args[1] 20524 x := l.Args[0] 20525 if !(l.Uses == 1) { 20526 break 20527 } 20528 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 20529 v0.AuxInt = int32ToAuxInt(c) 20530 v0.AddArg2(x, y) 20531 b.resetWithControl(BlockARMLTnoov, v0) 20532 return true 20533 } 20534 // match: (LT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 20535 // cond: l.Uses==1 20536 // result: (LTnoov (TEQshiftLLreg x y z) yes no) 20537 for b.Controls[0].Op == OpARMCMPconst { 20538 v_0 := b.Controls[0] 20539 if auxIntToInt32(v_0.AuxInt) != 0 { 20540 break 20541 } 20542 l := v_0.Args[0] 20543 if l.Op != OpARMXORshiftLLreg { 20544 break 20545 } 20546 z := l.Args[2] 20547 x := l.Args[0] 20548 y := l.Args[1] 20549 if !(l.Uses == 1) { 20550 break 20551 } 20552 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 20553 v0.AddArg3(x, y, z) 20554 b.resetWithControl(BlockARMLTnoov, v0) 20555 return true 20556 } 20557 // match: (LT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 20558 // cond: l.Uses==1 20559 // result: (LTnoov (TEQshiftRLreg x y z) yes no) 20560 for b.Controls[0].Op == OpARMCMPconst { 20561 v_0 := b.Controls[0] 20562 if auxIntToInt32(v_0.AuxInt) != 0 { 20563 break 20564 } 20565 l := v_0.Args[0] 20566 if l.Op != OpARMXORshiftRLreg { 20567 break 20568 } 20569 z := l.Args[2] 20570 x := l.Args[0] 20571 y := l.Args[1] 20572 if !(l.Uses == 1) { 20573 break 20574 } 20575 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 20576 v0.AddArg3(x, y, z) 20577 b.resetWithControl(BlockARMLTnoov, v0) 20578 return true 20579 } 20580 // match: (LT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 20581 // cond: l.Uses==1 20582 // result: (LTnoov (TEQshiftRAreg x y z) yes no) 20583 for b.Controls[0].Op == OpARMCMPconst { 20584 v_0 := b.Controls[0] 20585 if auxIntToInt32(v_0.AuxInt) != 0 { 20586 break 20587 } 20588 l := v_0.Args[0] 20589 if l.Op != OpARMXORshiftRAreg { 20590 break 20591 } 20592 z := l.Args[2] 20593 x := l.Args[0] 20594 y := l.Args[1] 20595 if !(l.Uses == 1) { 20596 break 20597 } 20598 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 20599 v0.AddArg3(x, y, z) 20600 b.resetWithControl(BlockARMLTnoov, v0) 20601 return true 20602 } 20603 case BlockARMLTnoov: 20604 // match: (LTnoov (FlagConstant [fc]) yes no) 20605 // cond: fc.ltNoov() 20606 // result: (First yes no) 20607 for b.Controls[0].Op == OpARMFlagConstant { 20608 v_0 := b.Controls[0] 20609 fc := auxIntToFlagConstant(v_0.AuxInt) 20610 if !(fc.ltNoov()) { 20611 break 20612 } 20613 b.Reset(BlockFirst) 20614 return true 20615 } 20616 // match: (LTnoov (FlagConstant [fc]) yes no) 20617 // cond: !fc.ltNoov() 20618 // result: (First no yes) 20619 for b.Controls[0].Op == OpARMFlagConstant { 20620 v_0 := b.Controls[0] 20621 fc := auxIntToFlagConstant(v_0.AuxInt) 20622 if !(!fc.ltNoov()) { 20623 break 20624 } 20625 b.Reset(BlockFirst) 20626 b.swapSuccessors() 20627 return true 20628 } 20629 // match: (LTnoov (InvertFlags cmp) yes no) 20630 // result: (GTnoov cmp yes no) 20631 for b.Controls[0].Op == OpARMInvertFlags { 20632 v_0 := b.Controls[0] 20633 cmp := v_0.Args[0] 20634 b.resetWithControl(BlockARMGTnoov, cmp) 20635 return true 20636 } 20637 case BlockARMNE: 20638 // match: (NE (CMPconst [0] (Equal cc)) yes no) 20639 // result: (EQ cc yes no) 20640 for b.Controls[0].Op == OpARMCMPconst { 20641 v_0 := b.Controls[0] 20642 if auxIntToInt32(v_0.AuxInt) != 0 { 20643 break 20644 } 20645 v_0_0 := v_0.Args[0] 20646 if v_0_0.Op != OpARMEqual { 20647 break 20648 } 20649 cc := v_0_0.Args[0] 20650 b.resetWithControl(BlockARMEQ, cc) 20651 return true 20652 } 20653 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 20654 // result: (NE cc yes no) 20655 for b.Controls[0].Op == OpARMCMPconst { 20656 v_0 := b.Controls[0] 20657 if auxIntToInt32(v_0.AuxInt) != 0 { 20658 break 20659 } 20660 v_0_0 := v_0.Args[0] 20661 if v_0_0.Op != OpARMNotEqual { 20662 break 20663 } 20664 cc := v_0_0.Args[0] 20665 b.resetWithControl(BlockARMNE, cc) 20666 return true 20667 } 20668 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 20669 // result: (LT cc yes no) 20670 for b.Controls[0].Op == OpARMCMPconst { 20671 v_0 := b.Controls[0] 20672 if auxIntToInt32(v_0.AuxInt) != 0 { 20673 break 20674 } 20675 v_0_0 := v_0.Args[0] 20676 if v_0_0.Op != OpARMLessThan { 20677 break 20678 } 20679 cc := v_0_0.Args[0] 20680 b.resetWithControl(BlockARMLT, cc) 20681 return true 20682 } 20683 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 20684 // result: (ULT cc yes no) 20685 for b.Controls[0].Op == OpARMCMPconst { 20686 v_0 := b.Controls[0] 20687 if auxIntToInt32(v_0.AuxInt) != 0 { 20688 break 20689 } 20690 v_0_0 := v_0.Args[0] 20691 if v_0_0.Op != OpARMLessThanU { 20692 break 20693 } 20694 cc := v_0_0.Args[0] 20695 b.resetWithControl(BlockARMULT, cc) 20696 return true 20697 } 20698 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 20699 // result: (LE cc yes no) 20700 for b.Controls[0].Op == OpARMCMPconst { 20701 v_0 := b.Controls[0] 20702 if auxIntToInt32(v_0.AuxInt) != 0 { 20703 break 20704 } 20705 v_0_0 := v_0.Args[0] 20706 if v_0_0.Op != OpARMLessEqual { 20707 break 20708 } 20709 cc := v_0_0.Args[0] 20710 b.resetWithControl(BlockARMLE, cc) 20711 return true 20712 } 20713 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 20714 // result: (ULE cc yes no) 20715 for b.Controls[0].Op == OpARMCMPconst { 20716 v_0 := b.Controls[0] 20717 if auxIntToInt32(v_0.AuxInt) != 0 { 20718 break 20719 } 20720 v_0_0 := v_0.Args[0] 20721 if v_0_0.Op != OpARMLessEqualU { 20722 break 20723 } 20724 cc := v_0_0.Args[0] 20725 b.resetWithControl(BlockARMULE, cc) 20726 return true 20727 } 20728 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 20729 // result: (GT cc yes no) 20730 for b.Controls[0].Op == OpARMCMPconst { 20731 v_0 := b.Controls[0] 20732 if auxIntToInt32(v_0.AuxInt) != 0 { 20733 break 20734 } 20735 v_0_0 := v_0.Args[0] 20736 if v_0_0.Op != OpARMGreaterThan { 20737 break 20738 } 20739 cc := v_0_0.Args[0] 20740 b.resetWithControl(BlockARMGT, cc) 20741 return true 20742 } 20743 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 20744 // result: (UGT cc yes no) 20745 for b.Controls[0].Op == OpARMCMPconst { 20746 v_0 := b.Controls[0] 20747 if auxIntToInt32(v_0.AuxInt) != 0 { 20748 break 20749 } 20750 v_0_0 := v_0.Args[0] 20751 if v_0_0.Op != OpARMGreaterThanU { 20752 break 20753 } 20754 cc := v_0_0.Args[0] 20755 b.resetWithControl(BlockARMUGT, cc) 20756 return true 20757 } 20758 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 20759 // result: (GE cc yes no) 20760 for b.Controls[0].Op == OpARMCMPconst { 20761 v_0 := b.Controls[0] 20762 if auxIntToInt32(v_0.AuxInt) != 0 { 20763 break 20764 } 20765 v_0_0 := v_0.Args[0] 20766 if v_0_0.Op != OpARMGreaterEqual { 20767 break 20768 } 20769 cc := v_0_0.Args[0] 20770 b.resetWithControl(BlockARMGE, cc) 20771 return true 20772 } 20773 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 20774 // result: (UGE cc yes no) 20775 for b.Controls[0].Op == OpARMCMPconst { 20776 v_0 := b.Controls[0] 20777 if auxIntToInt32(v_0.AuxInt) != 0 { 20778 break 20779 } 20780 v_0_0 := v_0.Args[0] 20781 if v_0_0.Op != OpARMGreaterEqualU { 20782 break 20783 } 20784 cc := v_0_0.Args[0] 20785 b.resetWithControl(BlockARMUGE, cc) 20786 return true 20787 } 20788 // match: (NE (FlagConstant [fc]) yes no) 20789 // cond: fc.ne() 20790 // result: (First yes no) 20791 for b.Controls[0].Op == OpARMFlagConstant { 20792 v_0 := b.Controls[0] 20793 fc := auxIntToFlagConstant(v_0.AuxInt) 20794 if !(fc.ne()) { 20795 break 20796 } 20797 b.Reset(BlockFirst) 20798 return true 20799 } 20800 // match: (NE (FlagConstant [fc]) yes no) 20801 // cond: !fc.ne() 20802 // result: (First no yes) 20803 for b.Controls[0].Op == OpARMFlagConstant { 20804 v_0 := b.Controls[0] 20805 fc := auxIntToFlagConstant(v_0.AuxInt) 20806 if !(!fc.ne()) { 20807 break 20808 } 20809 b.Reset(BlockFirst) 20810 b.swapSuccessors() 20811 return true 20812 } 20813 // match: (NE (InvertFlags cmp) yes no) 20814 // result: (NE cmp yes no) 20815 for b.Controls[0].Op == OpARMInvertFlags { 20816 v_0 := b.Controls[0] 20817 cmp := v_0.Args[0] 20818 b.resetWithControl(BlockARMNE, cmp) 20819 return true 20820 } 20821 // match: (NE (CMP x (RSBconst [0] y))) 20822 // result: (NE (CMN x y)) 20823 for b.Controls[0].Op == OpARMCMP { 20824 v_0 := b.Controls[0] 20825 _ = v_0.Args[1] 20826 x := v_0.Args[0] 20827 v_0_1 := v_0.Args[1] 20828 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 20829 break 20830 } 20831 y := v_0_1.Args[0] 20832 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20833 v0.AddArg2(x, y) 20834 b.resetWithControl(BlockARMNE, v0) 20835 return true 20836 } 20837 // match: (NE (CMN x (RSBconst [0] y))) 20838 // result: (NE (CMP x y)) 20839 for b.Controls[0].Op == OpARMCMN { 20840 v_0 := b.Controls[0] 20841 _ = v_0.Args[1] 20842 v_0_0 := v_0.Args[0] 20843 v_0_1 := v_0.Args[1] 20844 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { 20845 x := v_0_0 20846 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 20847 continue 20848 } 20849 y := v_0_1.Args[0] 20850 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20851 v0.AddArg2(x, y) 20852 b.resetWithControl(BlockARMNE, v0) 20853 return true 20854 } 20855 break 20856 } 20857 // match: (NE (CMPconst [0] l:(SUB x y)) yes no) 20858 // cond: l.Uses==1 20859 // result: (NE (CMP x y) yes no) 20860 for b.Controls[0].Op == OpARMCMPconst { 20861 v_0 := b.Controls[0] 20862 if auxIntToInt32(v_0.AuxInt) != 0 { 20863 break 20864 } 20865 l := v_0.Args[0] 20866 if l.Op != OpARMSUB { 20867 break 20868 } 20869 y := l.Args[1] 20870 x := l.Args[0] 20871 if !(l.Uses == 1) { 20872 break 20873 } 20874 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20875 v0.AddArg2(x, y) 20876 b.resetWithControl(BlockARMNE, v0) 20877 return true 20878 } 20879 // match: (NE (CMPconst [0] l:(MULS x y a)) yes no) 20880 // cond: l.Uses==1 20881 // result: (NE (CMP a (MUL <x.Type> x y)) yes no) 20882 for b.Controls[0].Op == OpARMCMPconst { 20883 v_0 := b.Controls[0] 20884 if auxIntToInt32(v_0.AuxInt) != 0 { 20885 break 20886 } 20887 l := v_0.Args[0] 20888 if l.Op != OpARMMULS { 20889 break 20890 } 20891 a := l.Args[2] 20892 x := l.Args[0] 20893 y := l.Args[1] 20894 if !(l.Uses == 1) { 20895 break 20896 } 20897 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20898 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 20899 v1.AddArg2(x, y) 20900 v0.AddArg2(a, v1) 20901 b.resetWithControl(BlockARMNE, v0) 20902 return true 20903 } 20904 // match: (NE (CMPconst [0] l:(SUBconst [c] x)) yes no) 20905 // cond: l.Uses==1 20906 // result: (NE (CMPconst [c] x) yes no) 20907 for b.Controls[0].Op == OpARMCMPconst { 20908 v_0 := b.Controls[0] 20909 if auxIntToInt32(v_0.AuxInt) != 0 { 20910 break 20911 } 20912 l := v_0.Args[0] 20913 if l.Op != OpARMSUBconst { 20914 break 20915 } 20916 c := auxIntToInt32(l.AuxInt) 20917 x := l.Args[0] 20918 if !(l.Uses == 1) { 20919 break 20920 } 20921 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 20922 v0.AuxInt = int32ToAuxInt(c) 20923 v0.AddArg(x) 20924 b.resetWithControl(BlockARMNE, v0) 20925 return true 20926 } 20927 // match: (NE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 20928 // cond: l.Uses==1 20929 // result: (NE (CMPshiftLL x y [c]) yes no) 20930 for b.Controls[0].Op == OpARMCMPconst { 20931 v_0 := b.Controls[0] 20932 if auxIntToInt32(v_0.AuxInt) != 0 { 20933 break 20934 } 20935 l := v_0.Args[0] 20936 if l.Op != OpARMSUBshiftLL { 20937 break 20938 } 20939 c := auxIntToInt32(l.AuxInt) 20940 y := l.Args[1] 20941 x := l.Args[0] 20942 if !(l.Uses == 1) { 20943 break 20944 } 20945 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 20946 v0.AuxInt = int32ToAuxInt(c) 20947 v0.AddArg2(x, y) 20948 b.resetWithControl(BlockARMNE, v0) 20949 return true 20950 } 20951 // match: (NE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 20952 // cond: l.Uses==1 20953 // result: (NE (CMPshiftRL x y [c]) yes no) 20954 for b.Controls[0].Op == OpARMCMPconst { 20955 v_0 := b.Controls[0] 20956 if auxIntToInt32(v_0.AuxInt) != 0 { 20957 break 20958 } 20959 l := v_0.Args[0] 20960 if l.Op != OpARMSUBshiftRL { 20961 break 20962 } 20963 c := auxIntToInt32(l.AuxInt) 20964 y := l.Args[1] 20965 x := l.Args[0] 20966 if !(l.Uses == 1) { 20967 break 20968 } 20969 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 20970 v0.AuxInt = int32ToAuxInt(c) 20971 v0.AddArg2(x, y) 20972 b.resetWithControl(BlockARMNE, v0) 20973 return true 20974 } 20975 // match: (NE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 20976 // cond: l.Uses==1 20977 // result: (NE (CMPshiftRA x y [c]) yes no) 20978 for b.Controls[0].Op == OpARMCMPconst { 20979 v_0 := b.Controls[0] 20980 if auxIntToInt32(v_0.AuxInt) != 0 { 20981 break 20982 } 20983 l := v_0.Args[0] 20984 if l.Op != OpARMSUBshiftRA { 20985 break 20986 } 20987 c := auxIntToInt32(l.AuxInt) 20988 y := l.Args[1] 20989 x := l.Args[0] 20990 if !(l.Uses == 1) { 20991 break 20992 } 20993 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 20994 v0.AuxInt = int32ToAuxInt(c) 20995 v0.AddArg2(x, y) 20996 b.resetWithControl(BlockARMNE, v0) 20997 return true 20998 } 20999 // match: (NE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 21000 // cond: l.Uses==1 21001 // result: (NE (CMPshiftLLreg x y z) yes no) 21002 for b.Controls[0].Op == OpARMCMPconst { 21003 v_0 := b.Controls[0] 21004 if auxIntToInt32(v_0.AuxInt) != 0 { 21005 break 21006 } 21007 l := v_0.Args[0] 21008 if l.Op != OpARMSUBshiftLLreg { 21009 break 21010 } 21011 z := l.Args[2] 21012 x := l.Args[0] 21013 y := l.Args[1] 21014 if !(l.Uses == 1) { 21015 break 21016 } 21017 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 21018 v0.AddArg3(x, y, z) 21019 b.resetWithControl(BlockARMNE, v0) 21020 return true 21021 } 21022 // match: (NE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 21023 // cond: l.Uses==1 21024 // result: (NE (CMPshiftRLreg x y z) yes no) 21025 for b.Controls[0].Op == OpARMCMPconst { 21026 v_0 := b.Controls[0] 21027 if auxIntToInt32(v_0.AuxInt) != 0 { 21028 break 21029 } 21030 l := v_0.Args[0] 21031 if l.Op != OpARMSUBshiftRLreg { 21032 break 21033 } 21034 z := l.Args[2] 21035 x := l.Args[0] 21036 y := l.Args[1] 21037 if !(l.Uses == 1) { 21038 break 21039 } 21040 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 21041 v0.AddArg3(x, y, z) 21042 b.resetWithControl(BlockARMNE, v0) 21043 return true 21044 } 21045 // match: (NE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 21046 // cond: l.Uses==1 21047 // result: (NE (CMPshiftRAreg x y z) yes no) 21048 for b.Controls[0].Op == OpARMCMPconst { 21049 v_0 := b.Controls[0] 21050 if auxIntToInt32(v_0.AuxInt) != 0 { 21051 break 21052 } 21053 l := v_0.Args[0] 21054 if l.Op != OpARMSUBshiftRAreg { 21055 break 21056 } 21057 z := l.Args[2] 21058 x := l.Args[0] 21059 y := l.Args[1] 21060 if !(l.Uses == 1) { 21061 break 21062 } 21063 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 21064 v0.AddArg3(x, y, z) 21065 b.resetWithControl(BlockARMNE, v0) 21066 return true 21067 } 21068 // match: (NE (CMPconst [0] l:(ADD x y)) yes no) 21069 // cond: l.Uses==1 21070 // result: (NE (CMN x y) yes no) 21071 for b.Controls[0].Op == OpARMCMPconst { 21072 v_0 := b.Controls[0] 21073 if auxIntToInt32(v_0.AuxInt) != 0 { 21074 break 21075 } 21076 l := v_0.Args[0] 21077 if l.Op != OpARMADD { 21078 break 21079 } 21080 _ = l.Args[1] 21081 l_0 := l.Args[0] 21082 l_1 := l.Args[1] 21083 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21084 x := l_0 21085 y := l_1 21086 if !(l.Uses == 1) { 21087 continue 21088 } 21089 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 21090 v0.AddArg2(x, y) 21091 b.resetWithControl(BlockARMNE, v0) 21092 return true 21093 } 21094 break 21095 } 21096 // match: (NE (CMPconst [0] l:(MULA x y a)) yes no) 21097 // cond: l.Uses==1 21098 // result: (NE (CMN a (MUL <x.Type> x y)) yes no) 21099 for b.Controls[0].Op == OpARMCMPconst { 21100 v_0 := b.Controls[0] 21101 if auxIntToInt32(v_0.AuxInt) != 0 { 21102 break 21103 } 21104 l := v_0.Args[0] 21105 if l.Op != OpARMMULA { 21106 break 21107 } 21108 a := l.Args[2] 21109 x := l.Args[0] 21110 y := l.Args[1] 21111 if !(l.Uses == 1) { 21112 break 21113 } 21114 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 21115 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 21116 v1.AddArg2(x, y) 21117 v0.AddArg2(a, v1) 21118 b.resetWithControl(BlockARMNE, v0) 21119 return true 21120 } 21121 // match: (NE (CMPconst [0] l:(ADDconst [c] x)) yes no) 21122 // cond: l.Uses==1 21123 // result: (NE (CMNconst [c] x) yes no) 21124 for b.Controls[0].Op == OpARMCMPconst { 21125 v_0 := b.Controls[0] 21126 if auxIntToInt32(v_0.AuxInt) != 0 { 21127 break 21128 } 21129 l := v_0.Args[0] 21130 if l.Op != OpARMADDconst { 21131 break 21132 } 21133 c := auxIntToInt32(l.AuxInt) 21134 x := l.Args[0] 21135 if !(l.Uses == 1) { 21136 break 21137 } 21138 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 21139 v0.AuxInt = int32ToAuxInt(c) 21140 v0.AddArg(x) 21141 b.resetWithControl(BlockARMNE, v0) 21142 return true 21143 } 21144 // match: (NE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 21145 // cond: l.Uses==1 21146 // result: (NE (CMNshiftLL x y [c]) yes no) 21147 for b.Controls[0].Op == OpARMCMPconst { 21148 v_0 := b.Controls[0] 21149 if auxIntToInt32(v_0.AuxInt) != 0 { 21150 break 21151 } 21152 l := v_0.Args[0] 21153 if l.Op != OpARMADDshiftLL { 21154 break 21155 } 21156 c := auxIntToInt32(l.AuxInt) 21157 y := l.Args[1] 21158 x := l.Args[0] 21159 if !(l.Uses == 1) { 21160 break 21161 } 21162 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 21163 v0.AuxInt = int32ToAuxInt(c) 21164 v0.AddArg2(x, y) 21165 b.resetWithControl(BlockARMNE, v0) 21166 return true 21167 } 21168 // match: (NE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 21169 // cond: l.Uses==1 21170 // result: (NE (CMNshiftRL x y [c]) yes no) 21171 for b.Controls[0].Op == OpARMCMPconst { 21172 v_0 := b.Controls[0] 21173 if auxIntToInt32(v_0.AuxInt) != 0 { 21174 break 21175 } 21176 l := v_0.Args[0] 21177 if l.Op != OpARMADDshiftRL { 21178 break 21179 } 21180 c := auxIntToInt32(l.AuxInt) 21181 y := l.Args[1] 21182 x := l.Args[0] 21183 if !(l.Uses == 1) { 21184 break 21185 } 21186 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 21187 v0.AuxInt = int32ToAuxInt(c) 21188 v0.AddArg2(x, y) 21189 b.resetWithControl(BlockARMNE, v0) 21190 return true 21191 } 21192 // match: (NE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 21193 // cond: l.Uses==1 21194 // result: (NE (CMNshiftRA x y [c]) yes no) 21195 for b.Controls[0].Op == OpARMCMPconst { 21196 v_0 := b.Controls[0] 21197 if auxIntToInt32(v_0.AuxInt) != 0 { 21198 break 21199 } 21200 l := v_0.Args[0] 21201 if l.Op != OpARMADDshiftRA { 21202 break 21203 } 21204 c := auxIntToInt32(l.AuxInt) 21205 y := l.Args[1] 21206 x := l.Args[0] 21207 if !(l.Uses == 1) { 21208 break 21209 } 21210 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 21211 v0.AuxInt = int32ToAuxInt(c) 21212 v0.AddArg2(x, y) 21213 b.resetWithControl(BlockARMNE, v0) 21214 return true 21215 } 21216 // match: (NE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 21217 // cond: l.Uses==1 21218 // result: (NE (CMNshiftLLreg x y z) yes no) 21219 for b.Controls[0].Op == OpARMCMPconst { 21220 v_0 := b.Controls[0] 21221 if auxIntToInt32(v_0.AuxInt) != 0 { 21222 break 21223 } 21224 l := v_0.Args[0] 21225 if l.Op != OpARMADDshiftLLreg { 21226 break 21227 } 21228 z := l.Args[2] 21229 x := l.Args[0] 21230 y := l.Args[1] 21231 if !(l.Uses == 1) { 21232 break 21233 } 21234 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 21235 v0.AddArg3(x, y, z) 21236 b.resetWithControl(BlockARMNE, v0) 21237 return true 21238 } 21239 // match: (NE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 21240 // cond: l.Uses==1 21241 // result: (NE (CMNshiftRLreg x y z) yes no) 21242 for b.Controls[0].Op == OpARMCMPconst { 21243 v_0 := b.Controls[0] 21244 if auxIntToInt32(v_0.AuxInt) != 0 { 21245 break 21246 } 21247 l := v_0.Args[0] 21248 if l.Op != OpARMADDshiftRLreg { 21249 break 21250 } 21251 z := l.Args[2] 21252 x := l.Args[0] 21253 y := l.Args[1] 21254 if !(l.Uses == 1) { 21255 break 21256 } 21257 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 21258 v0.AddArg3(x, y, z) 21259 b.resetWithControl(BlockARMNE, v0) 21260 return true 21261 } 21262 // match: (NE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 21263 // cond: l.Uses==1 21264 // result: (NE (CMNshiftRAreg x y z) yes no) 21265 for b.Controls[0].Op == OpARMCMPconst { 21266 v_0 := b.Controls[0] 21267 if auxIntToInt32(v_0.AuxInt) != 0 { 21268 break 21269 } 21270 l := v_0.Args[0] 21271 if l.Op != OpARMADDshiftRAreg { 21272 break 21273 } 21274 z := l.Args[2] 21275 x := l.Args[0] 21276 y := l.Args[1] 21277 if !(l.Uses == 1) { 21278 break 21279 } 21280 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 21281 v0.AddArg3(x, y, z) 21282 b.resetWithControl(BlockARMNE, v0) 21283 return true 21284 } 21285 // match: (NE (CMPconst [0] l:(AND x y)) yes no) 21286 // cond: l.Uses==1 21287 // result: (NE (TST x y) yes no) 21288 for b.Controls[0].Op == OpARMCMPconst { 21289 v_0 := b.Controls[0] 21290 if auxIntToInt32(v_0.AuxInt) != 0 { 21291 break 21292 } 21293 l := v_0.Args[0] 21294 if l.Op != OpARMAND { 21295 break 21296 } 21297 _ = l.Args[1] 21298 l_0 := l.Args[0] 21299 l_1 := l.Args[1] 21300 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21301 x := l_0 21302 y := l_1 21303 if !(l.Uses == 1) { 21304 continue 21305 } 21306 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 21307 v0.AddArg2(x, y) 21308 b.resetWithControl(BlockARMNE, v0) 21309 return true 21310 } 21311 break 21312 } 21313 // match: (NE (CMPconst [0] l:(ANDconst [c] x)) yes no) 21314 // cond: l.Uses==1 21315 // result: (NE (TSTconst [c] x) yes no) 21316 for b.Controls[0].Op == OpARMCMPconst { 21317 v_0 := b.Controls[0] 21318 if auxIntToInt32(v_0.AuxInt) != 0 { 21319 break 21320 } 21321 l := v_0.Args[0] 21322 if l.Op != OpARMANDconst { 21323 break 21324 } 21325 c := auxIntToInt32(l.AuxInt) 21326 x := l.Args[0] 21327 if !(l.Uses == 1) { 21328 break 21329 } 21330 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 21331 v0.AuxInt = int32ToAuxInt(c) 21332 v0.AddArg(x) 21333 b.resetWithControl(BlockARMNE, v0) 21334 return true 21335 } 21336 // match: (NE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 21337 // cond: l.Uses==1 21338 // result: (NE (TSTshiftLL x y [c]) yes no) 21339 for b.Controls[0].Op == OpARMCMPconst { 21340 v_0 := b.Controls[0] 21341 if auxIntToInt32(v_0.AuxInt) != 0 { 21342 break 21343 } 21344 l := v_0.Args[0] 21345 if l.Op != OpARMANDshiftLL { 21346 break 21347 } 21348 c := auxIntToInt32(l.AuxInt) 21349 y := l.Args[1] 21350 x := l.Args[0] 21351 if !(l.Uses == 1) { 21352 break 21353 } 21354 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 21355 v0.AuxInt = int32ToAuxInt(c) 21356 v0.AddArg2(x, y) 21357 b.resetWithControl(BlockARMNE, v0) 21358 return true 21359 } 21360 // match: (NE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 21361 // cond: l.Uses==1 21362 // result: (NE (TSTshiftRL x y [c]) yes no) 21363 for b.Controls[0].Op == OpARMCMPconst { 21364 v_0 := b.Controls[0] 21365 if auxIntToInt32(v_0.AuxInt) != 0 { 21366 break 21367 } 21368 l := v_0.Args[0] 21369 if l.Op != OpARMANDshiftRL { 21370 break 21371 } 21372 c := auxIntToInt32(l.AuxInt) 21373 y := l.Args[1] 21374 x := l.Args[0] 21375 if !(l.Uses == 1) { 21376 break 21377 } 21378 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 21379 v0.AuxInt = int32ToAuxInt(c) 21380 v0.AddArg2(x, y) 21381 b.resetWithControl(BlockARMNE, v0) 21382 return true 21383 } 21384 // match: (NE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 21385 // cond: l.Uses==1 21386 // result: (NE (TSTshiftRA x y [c]) yes no) 21387 for b.Controls[0].Op == OpARMCMPconst { 21388 v_0 := b.Controls[0] 21389 if auxIntToInt32(v_0.AuxInt) != 0 { 21390 break 21391 } 21392 l := v_0.Args[0] 21393 if l.Op != OpARMANDshiftRA { 21394 break 21395 } 21396 c := auxIntToInt32(l.AuxInt) 21397 y := l.Args[1] 21398 x := l.Args[0] 21399 if !(l.Uses == 1) { 21400 break 21401 } 21402 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 21403 v0.AuxInt = int32ToAuxInt(c) 21404 v0.AddArg2(x, y) 21405 b.resetWithControl(BlockARMNE, v0) 21406 return true 21407 } 21408 // match: (NE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 21409 // cond: l.Uses==1 21410 // result: (NE (TSTshiftLLreg x y z) yes no) 21411 for b.Controls[0].Op == OpARMCMPconst { 21412 v_0 := b.Controls[0] 21413 if auxIntToInt32(v_0.AuxInt) != 0 { 21414 break 21415 } 21416 l := v_0.Args[0] 21417 if l.Op != OpARMANDshiftLLreg { 21418 break 21419 } 21420 z := l.Args[2] 21421 x := l.Args[0] 21422 y := l.Args[1] 21423 if !(l.Uses == 1) { 21424 break 21425 } 21426 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 21427 v0.AddArg3(x, y, z) 21428 b.resetWithControl(BlockARMNE, v0) 21429 return true 21430 } 21431 // match: (NE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 21432 // cond: l.Uses==1 21433 // result: (NE (TSTshiftRLreg x y z) yes no) 21434 for b.Controls[0].Op == OpARMCMPconst { 21435 v_0 := b.Controls[0] 21436 if auxIntToInt32(v_0.AuxInt) != 0 { 21437 break 21438 } 21439 l := v_0.Args[0] 21440 if l.Op != OpARMANDshiftRLreg { 21441 break 21442 } 21443 z := l.Args[2] 21444 x := l.Args[0] 21445 y := l.Args[1] 21446 if !(l.Uses == 1) { 21447 break 21448 } 21449 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 21450 v0.AddArg3(x, y, z) 21451 b.resetWithControl(BlockARMNE, v0) 21452 return true 21453 } 21454 // match: (NE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 21455 // cond: l.Uses==1 21456 // result: (NE (TSTshiftRAreg x y z) yes no) 21457 for b.Controls[0].Op == OpARMCMPconst { 21458 v_0 := b.Controls[0] 21459 if auxIntToInt32(v_0.AuxInt) != 0 { 21460 break 21461 } 21462 l := v_0.Args[0] 21463 if l.Op != OpARMANDshiftRAreg { 21464 break 21465 } 21466 z := l.Args[2] 21467 x := l.Args[0] 21468 y := l.Args[1] 21469 if !(l.Uses == 1) { 21470 break 21471 } 21472 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 21473 v0.AddArg3(x, y, z) 21474 b.resetWithControl(BlockARMNE, v0) 21475 return true 21476 } 21477 // match: (NE (CMPconst [0] l:(XOR x y)) yes no) 21478 // cond: l.Uses==1 21479 // result: (NE (TEQ x y) yes no) 21480 for b.Controls[0].Op == OpARMCMPconst { 21481 v_0 := b.Controls[0] 21482 if auxIntToInt32(v_0.AuxInt) != 0 { 21483 break 21484 } 21485 l := v_0.Args[0] 21486 if l.Op != OpARMXOR { 21487 break 21488 } 21489 _ = l.Args[1] 21490 l_0 := l.Args[0] 21491 l_1 := l.Args[1] 21492 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21493 x := l_0 21494 y := l_1 21495 if !(l.Uses == 1) { 21496 continue 21497 } 21498 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 21499 v0.AddArg2(x, y) 21500 b.resetWithControl(BlockARMNE, v0) 21501 return true 21502 } 21503 break 21504 } 21505 // match: (NE (CMPconst [0] l:(XORconst [c] x)) yes no) 21506 // cond: l.Uses==1 21507 // result: (NE (TEQconst [c] x) yes no) 21508 for b.Controls[0].Op == OpARMCMPconst { 21509 v_0 := b.Controls[0] 21510 if auxIntToInt32(v_0.AuxInt) != 0 { 21511 break 21512 } 21513 l := v_0.Args[0] 21514 if l.Op != OpARMXORconst { 21515 break 21516 } 21517 c := auxIntToInt32(l.AuxInt) 21518 x := l.Args[0] 21519 if !(l.Uses == 1) { 21520 break 21521 } 21522 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 21523 v0.AuxInt = int32ToAuxInt(c) 21524 v0.AddArg(x) 21525 b.resetWithControl(BlockARMNE, v0) 21526 return true 21527 } 21528 // match: (NE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 21529 // cond: l.Uses==1 21530 // result: (NE (TEQshiftLL x y [c]) yes no) 21531 for b.Controls[0].Op == OpARMCMPconst { 21532 v_0 := b.Controls[0] 21533 if auxIntToInt32(v_0.AuxInt) != 0 { 21534 break 21535 } 21536 l := v_0.Args[0] 21537 if l.Op != OpARMXORshiftLL { 21538 break 21539 } 21540 c := auxIntToInt32(l.AuxInt) 21541 y := l.Args[1] 21542 x := l.Args[0] 21543 if !(l.Uses == 1) { 21544 break 21545 } 21546 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 21547 v0.AuxInt = int32ToAuxInt(c) 21548 v0.AddArg2(x, y) 21549 b.resetWithControl(BlockARMNE, v0) 21550 return true 21551 } 21552 // match: (NE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 21553 // cond: l.Uses==1 21554 // result: (NE (TEQshiftRL x y [c]) yes no) 21555 for b.Controls[0].Op == OpARMCMPconst { 21556 v_0 := b.Controls[0] 21557 if auxIntToInt32(v_0.AuxInt) != 0 { 21558 break 21559 } 21560 l := v_0.Args[0] 21561 if l.Op != OpARMXORshiftRL { 21562 break 21563 } 21564 c := auxIntToInt32(l.AuxInt) 21565 y := l.Args[1] 21566 x := l.Args[0] 21567 if !(l.Uses == 1) { 21568 break 21569 } 21570 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 21571 v0.AuxInt = int32ToAuxInt(c) 21572 v0.AddArg2(x, y) 21573 b.resetWithControl(BlockARMNE, v0) 21574 return true 21575 } 21576 // match: (NE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 21577 // cond: l.Uses==1 21578 // result: (NE (TEQshiftRA x y [c]) yes no) 21579 for b.Controls[0].Op == OpARMCMPconst { 21580 v_0 := b.Controls[0] 21581 if auxIntToInt32(v_0.AuxInt) != 0 { 21582 break 21583 } 21584 l := v_0.Args[0] 21585 if l.Op != OpARMXORshiftRA { 21586 break 21587 } 21588 c := auxIntToInt32(l.AuxInt) 21589 y := l.Args[1] 21590 x := l.Args[0] 21591 if !(l.Uses == 1) { 21592 break 21593 } 21594 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 21595 v0.AuxInt = int32ToAuxInt(c) 21596 v0.AddArg2(x, y) 21597 b.resetWithControl(BlockARMNE, v0) 21598 return true 21599 } 21600 // match: (NE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 21601 // cond: l.Uses==1 21602 // result: (NE (TEQshiftLLreg x y z) yes no) 21603 for b.Controls[0].Op == OpARMCMPconst { 21604 v_0 := b.Controls[0] 21605 if auxIntToInt32(v_0.AuxInt) != 0 { 21606 break 21607 } 21608 l := v_0.Args[0] 21609 if l.Op != OpARMXORshiftLLreg { 21610 break 21611 } 21612 z := l.Args[2] 21613 x := l.Args[0] 21614 y := l.Args[1] 21615 if !(l.Uses == 1) { 21616 break 21617 } 21618 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 21619 v0.AddArg3(x, y, z) 21620 b.resetWithControl(BlockARMNE, v0) 21621 return true 21622 } 21623 // match: (NE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 21624 // cond: l.Uses==1 21625 // result: (NE (TEQshiftRLreg x y z) yes no) 21626 for b.Controls[0].Op == OpARMCMPconst { 21627 v_0 := b.Controls[0] 21628 if auxIntToInt32(v_0.AuxInt) != 0 { 21629 break 21630 } 21631 l := v_0.Args[0] 21632 if l.Op != OpARMXORshiftRLreg { 21633 break 21634 } 21635 z := l.Args[2] 21636 x := l.Args[0] 21637 y := l.Args[1] 21638 if !(l.Uses == 1) { 21639 break 21640 } 21641 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 21642 v0.AddArg3(x, y, z) 21643 b.resetWithControl(BlockARMNE, v0) 21644 return true 21645 } 21646 // match: (NE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 21647 // cond: l.Uses==1 21648 // result: (NE (TEQshiftRAreg x y z) yes no) 21649 for b.Controls[0].Op == OpARMCMPconst { 21650 v_0 := b.Controls[0] 21651 if auxIntToInt32(v_0.AuxInt) != 0 { 21652 break 21653 } 21654 l := v_0.Args[0] 21655 if l.Op != OpARMXORshiftRAreg { 21656 break 21657 } 21658 z := l.Args[2] 21659 x := l.Args[0] 21660 y := l.Args[1] 21661 if !(l.Uses == 1) { 21662 break 21663 } 21664 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 21665 v0.AddArg3(x, y, z) 21666 b.resetWithControl(BlockARMNE, v0) 21667 return true 21668 } 21669 case BlockARMUGE: 21670 // match: (UGE (FlagConstant [fc]) yes no) 21671 // cond: fc.uge() 21672 // result: (First yes no) 21673 for b.Controls[0].Op == OpARMFlagConstant { 21674 v_0 := b.Controls[0] 21675 fc := auxIntToFlagConstant(v_0.AuxInt) 21676 if !(fc.uge()) { 21677 break 21678 } 21679 b.Reset(BlockFirst) 21680 return true 21681 } 21682 // match: (UGE (FlagConstant [fc]) yes no) 21683 // cond: !fc.uge() 21684 // result: (First no yes) 21685 for b.Controls[0].Op == OpARMFlagConstant { 21686 v_0 := b.Controls[0] 21687 fc := auxIntToFlagConstant(v_0.AuxInt) 21688 if !(!fc.uge()) { 21689 break 21690 } 21691 b.Reset(BlockFirst) 21692 b.swapSuccessors() 21693 return true 21694 } 21695 // match: (UGE (InvertFlags cmp) yes no) 21696 // result: (ULE cmp yes no) 21697 for b.Controls[0].Op == OpARMInvertFlags { 21698 v_0 := b.Controls[0] 21699 cmp := v_0.Args[0] 21700 b.resetWithControl(BlockARMULE, cmp) 21701 return true 21702 } 21703 case BlockARMUGT: 21704 // match: (UGT (FlagConstant [fc]) yes no) 21705 // cond: fc.ugt() 21706 // result: (First yes no) 21707 for b.Controls[0].Op == OpARMFlagConstant { 21708 v_0 := b.Controls[0] 21709 fc := auxIntToFlagConstant(v_0.AuxInt) 21710 if !(fc.ugt()) { 21711 break 21712 } 21713 b.Reset(BlockFirst) 21714 return true 21715 } 21716 // match: (UGT (FlagConstant [fc]) yes no) 21717 // cond: !fc.ugt() 21718 // result: (First no yes) 21719 for b.Controls[0].Op == OpARMFlagConstant { 21720 v_0 := b.Controls[0] 21721 fc := auxIntToFlagConstant(v_0.AuxInt) 21722 if !(!fc.ugt()) { 21723 break 21724 } 21725 b.Reset(BlockFirst) 21726 b.swapSuccessors() 21727 return true 21728 } 21729 // match: (UGT (InvertFlags cmp) yes no) 21730 // result: (ULT cmp yes no) 21731 for b.Controls[0].Op == OpARMInvertFlags { 21732 v_0 := b.Controls[0] 21733 cmp := v_0.Args[0] 21734 b.resetWithControl(BlockARMULT, cmp) 21735 return true 21736 } 21737 case BlockARMULE: 21738 // match: (ULE (FlagConstant [fc]) yes no) 21739 // cond: fc.ule() 21740 // result: (First yes no) 21741 for b.Controls[0].Op == OpARMFlagConstant { 21742 v_0 := b.Controls[0] 21743 fc := auxIntToFlagConstant(v_0.AuxInt) 21744 if !(fc.ule()) { 21745 break 21746 } 21747 b.Reset(BlockFirst) 21748 return true 21749 } 21750 // match: (ULE (FlagConstant [fc]) yes no) 21751 // cond: !fc.ule() 21752 // result: (First no yes) 21753 for b.Controls[0].Op == OpARMFlagConstant { 21754 v_0 := b.Controls[0] 21755 fc := auxIntToFlagConstant(v_0.AuxInt) 21756 if !(!fc.ule()) { 21757 break 21758 } 21759 b.Reset(BlockFirst) 21760 b.swapSuccessors() 21761 return true 21762 } 21763 // match: (ULE (InvertFlags cmp) yes no) 21764 // result: (UGE cmp yes no) 21765 for b.Controls[0].Op == OpARMInvertFlags { 21766 v_0 := b.Controls[0] 21767 cmp := v_0.Args[0] 21768 b.resetWithControl(BlockARMUGE, cmp) 21769 return true 21770 } 21771 case BlockARMULT: 21772 // match: (ULT (FlagConstant [fc]) yes no) 21773 // cond: fc.ult() 21774 // result: (First yes no) 21775 for b.Controls[0].Op == OpARMFlagConstant { 21776 v_0 := b.Controls[0] 21777 fc := auxIntToFlagConstant(v_0.AuxInt) 21778 if !(fc.ult()) { 21779 break 21780 } 21781 b.Reset(BlockFirst) 21782 return true 21783 } 21784 // match: (ULT (FlagConstant [fc]) yes no) 21785 // cond: !fc.ult() 21786 // result: (First no yes) 21787 for b.Controls[0].Op == OpARMFlagConstant { 21788 v_0 := b.Controls[0] 21789 fc := auxIntToFlagConstant(v_0.AuxInt) 21790 if !(!fc.ult()) { 21791 break 21792 } 21793 b.Reset(BlockFirst) 21794 b.swapSuccessors() 21795 return true 21796 } 21797 // match: (ULT (InvertFlags cmp) yes no) 21798 // result: (UGT cmp yes no) 21799 for b.Controls[0].Op == OpARMInvertFlags { 21800 v_0 := b.Controls[0] 21801 cmp := v_0.Args[0] 21802 b.resetWithControl(BlockARMUGT, cmp) 21803 return true 21804 } 21805 } 21806 return false 21807 }